From dna-commits at lists.jboss.org  Tue Jun  2 15:30:41 2009
From: dna-commits at lists.jboss.org (dna-commits at lists.jboss.org)
Date: Tue, 02 Jun 2009 15:30:41 -0400
Subject: [dna-commits] DNA SVN: r955 - in trunk:
	dna-graph/src/main/java/org/jboss/dna/graph/connector/federation
	and 11 other directories.
Message-ID: <E1MBZh3-0001vN-Nh@committer01.frg.pub.inap.atl.jboss.com>

Author: bcarothers
Date: 2009-06-02 15:30:41 -0400 (Tue, 02 Jun 2009)
New Revision: 955

Modified:
   trunk/dna-graph/src/main/java/org/jboss/dna/graph/Graph.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/inmemory/InMemoryRepository.java
   trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/inmemory/InMemoryRequestProcessor.java
   trunk/dna-graph/src/main/java/org/jboss/dna/graph/request/BatchRequestBuilder.java
   trunk/dna-graph/src/main/java/org/jboss/dna/graph/request/MoveBranchRequest.java
   trunk/dna-graph/src/main/java/org/jboss/dna/graph/request/RequestBuilder.java
   trunk/dna-graph/src/test/java/org/jboss/dna/graph/connector/inmemory/InMemoryRepositoryWorkspaceTest.java
   trunk/dna-graph/src/test/java/org/jboss/dna/graph/connector/test/WritableConnectorTest.java
   trunk/dna-graph/src/test/java/org/jboss/dna/graph/request/MoveBranchRequestTest.java
   trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/AbstractJcrNode.java
   trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/SessionCache.java
   trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/cache/ChangedChildren.java
   trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/cache/ChangedNodeInfo.java
   trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/cache/ImmutableChildren.java
   trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/cache/ImmutableNodeInfo.java
   trunk/dna-jcr/src/test/java/org/jboss/dna/jcr/JcrTckTest.java
   trunk/extensions/dna-connector-federation/src/main/java/org/jboss/dna/connector/federation/FederatingRequestProcessor.java
   trunk/extensions/dna-connector-jbosscache/src/main/java/org/jboss/dna/connector/jbosscache/JBossCacheRequestProcessor.java
   trunk/extensions/dna-connector-store-jpa/src/main/java/org/jboss/dna/connector/store/jpa/model/basic/BasicRequestProcessor.java
Log:
DNA-376 Add request to change the order of a child node (or nodes) relative to the other children

Applied DNA-376_final.patch which:

- Adds "before" property to MoveBranchRequest which can be used in lieu of the "into" property.  If the before is populated, the node should moved into the parent of the "before" location and located immediately before the child node with the "before" location.  Added test case to WriteableConnectorTest to test this behavior.
- Modified writable connectors to support "before" property on MoveBranchRequest and no longer require that "into" property is not null.
- Added support for "before" preposition on Graph and Graph.Batch for move operation.
- Modified JCR layer to support ordering of child nodes with AbstractJcrNode.orderBefore by adding a method to SessionCache.NodeEditor and adding comparable operations to ImmutableChildren and ChangedChildren
- Uncommented relevant tests in JcrTckTest


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	2009-05-29 21:22:01 UTC (rev 954)
+++ trunk/dna-graph/src/main/java/org/jboss/dna/graph/Graph.java	2009-06-02 19:30:41 UTC (rev 955)
@@ -437,10 +437,11 @@
             @Override
             protected Conjunction<Graph> submit( Locations from,
                                                  Location into,
+                                                 Location before,
                                                  Name newName ) {
                 String workspaceName = getCurrentWorkspaceName();
                 do {
-                    requests.moveBranch(from.getLocation(), into, workspaceName, newName);
+                    requests.moveBranch(from.getLocation(), into, before, workspaceName, newName);
                 } while ((from = from.next()) != null);
                 return and();
             }
@@ -2204,10 +2205,11 @@
                 @Override
                 protected BatchConjunction submit( Locations from,
                                                    Location into,
+                                                   Location before,
                                                    Name newName ) {
                     String workspaceName = getCurrentWorkspaceName();
                     do {
-                        requestQueue.moveBranch(from.getLocation(), into, workspaceName, newName);
+                        requestQueue.moveBranch(from.getLocation(), into, before, workspaceName, newName);
                     } while ((from = from.next()) != null);
                     return and();
                 }
@@ -3712,6 +3714,86 @@
     }
 
     /**
+     * A component that defines the location before which a node should be copied or moved.  This is similar to an
+     * {@link Into}, but it allows for placing a node at a particular location within the new destination, rather than
+     * always placing the moved or copied node as the last child of the new parent.
+     * 
+     * @param <Next> The interface that is to be returned when this request is completed
+     * @author Randall Hauch
+     */
+    public interface Before<Next> {
+        /**
+         * Finish the request by specifying the location of the node before which the node should be copied/moved. This operation
+         * will result in the copied/moved node having the same name as the original (but with the appropriately-determined
+         * same-name-sibling index). If you want to control the name of the node for the newly copied/moved node, use
+         * {@link To#to(Location)} instead.
+         * 
+         * @param parentLocation the location of the new parent
+         * @return the interface for additional requests or actions
+         * @see To#to(Location)
+         */
+        Next before( Location parentLocation );
+
+        /**
+         * Finish the request by specifying the location of the node before which the node should be copied/moved. This operation
+         * will result in the copied/moved node having the same name as the original (but with the appropriately-determined
+         * same-name-sibling index). If you want to control the name of the node for the newly copied/moved node, use
+         * {@link To#to(String)} instead.
+         * 
+         * @param parentPath the path of the new parent
+         * @return the interface for additional requests or actions
+         * @see To#to(String)
+         */
+        Next before( String parentPath );
+
+        /**
+         * Finish the request by specifying the location of the node before which the node should be copied/moved. This operation
+         * will result in the copied/moved node having the same name as the original (but with the appropriately-determined
+         * same-name-sibling index). If you want to control the name of the node for the newly copied/moved node, use
+         * {@link To#to(Path)} instead.
+         * 
+         * @param parentPath the path of the new parent
+         * @return the interface for additional requests or actions
+         * @see To#to(Path)
+         */
+        Next before( Path parentPath );
+
+        /**
+         * Finish the request by specifying the location of the node before which the node should be copied/moved. This operation
+         * will result in the copied/moved node having the same name as the original (but with the appropriately-determined
+         * same-name-sibling index).
+         * 
+         * @param parentUuid the UUID of the new parent
+         * @return the interface for additional requests or actions
+         */
+        Next before( UUID parentUuid );
+
+        /**
+         * Finish the request by specifying the location of the node before which the node should be copied/moved. This operation
+         * will result in the copied/moved node having the same name as the original (but with the appropriately-determined
+         * same-name-sibling index).
+         * 
+         * @param parentIdProperty the property that uniquely identifies the new parent
+         * @return the interface for additional requests or actions
+         */
+        Next before( Property parentIdProperty );
+
+        /**
+         * Finish the request by specifying the location of the node before which the node should be copied/moved. This operation
+         * will result in the copied/moved node having the same name as the original (but with the appropriately-determined
+         * same-name-sibling index).
+         * 
+         * @param firstParentIdProperty the first property that, with the <code>additionalIdProperties</code>, uniquely identifies
+         *        the new parent
+         * @param additionalParentIdProperties the additional properties that, with the <code>additionalIdProperties</code>,
+         *        uniquely identifies the new parent
+         * @return the interface for additional requests or actions
+         */
+        Next before( Property firstParentIdProperty,
+                   Property... additionalParentIdProperties );
+    }
+
+    /**
      * A component that defines the location to which a node should be copied or moved.
      * 
      * @param <Next> The interface that is to be returned when this request is completed
@@ -3850,7 +3932,7 @@
      * @param <Next> The interface that is to be returned when this request is completed
      * @author Randall Hauch
      */
-    public interface Move<Next> extends AsName<Into<Next>>, Into<Next>, And<Move<Next>> {
+    public interface Move<Next> extends AsName<Into<Next>>, Into<Next>, Before<Next>, And<Move<Next>> {
     }
 
     /**
@@ -5508,15 +5590,31 @@
          * 
          * @param from the location(s) that are being moved; never null
          * @param into the parent location
+         * @param before the location of the child of the parent before which this node should be placed
          * @param newName the new name for the node being moved; may be null
          * @return this object, for method chaining
          */
         protected abstract T submit( Locations from,
                                      Location into,
+                                     Location before,
                                      Name newName );
 
+        /**
+         * Submit any requests to move the targets into the supplied parent location
+         * 
+         * @param from the location(s) that are being moved; never null
+         * @param into the parent location
+         * @param newName the new name for the node being moved; may be null
+         * @return this object, for method chaining
+         */
+        protected T submit( Locations from,
+                                     Location into,
+                                     Name newName ) {
+            return submit(from, into, null, newName);
+        }
+
         public T into( Location into ) {
-            return submit(from, into, newName);
+            return submit(from, into, null, newName);
         }
 
         public T into( Path into ) {
@@ -5539,6 +5637,31 @@
         public T into( String into ) {
             return submit(from, Location.create(createPath(into)), newName);
         }
+        
+        public T before( Location before ) {
+            return submit(from, null, before, newName);
+        }
+
+        public T before( Path before ) {
+            return submit(from, null, Location.create(before), newName);
+        }
+
+        public T before( UUID before ) {
+            return submit(from, null, Location.create(before), newName);
+        }
+
+        public T before( Property firstIdProperty,
+                       Property... additionalIdProperties ) {
+            return submit(from, null, Location.create(firstIdProperty, additionalIdProperties), newName);
+        }
+
+        public T before( Property before ) {
+            return submit(from, null, Location.create(before), newName);
+        }
+
+        public T before( String before ) {
+            return submit(from, null, Location.create(createPath(before)), newName);
+        }        
     }
 
     @NotThreadSafe

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	2009-05-29 21:22:01 UTC (rev 954)
+++ trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/federation/ForkRequestProcessor.java	2009-06-02 19:30:41 UTC (rev 955)
@@ -1129,6 +1129,7 @@
         if (projectedFromNode == null) return;
         ProjectedNode projectedIntoNode = project(request.into(), request.inWorkspace(), request, true);
         if (projectedIntoNode == null) return;
+        ProjectedNode projectedBeforeNode = request.before() != null ? project(request.before(), request.inWorkspace(), request, true) : null;
 
         // Limitation: only able to project the move if the 'from' and 'into' are in the same source & projection ...
         while (projectedFromNode != null) {
@@ -1160,11 +1161,12 @@
 
         ProxyNode fromProxy = projectedFromNode.asProxy();
         ProxyNode intoProxy = projectedIntoNode.asProxy();
+        ProxyNode beforeProxy = request.before() != null ? projectedBeforeNode.asProxy() : null;
         assert fromProxy.projection().getSourceName().equals(intoProxy.projection().getSourceName());
         boolean sameLocation = fromProxy.isSameLocationAsOriginal() && intoProxy.isSameLocationAsOriginal();
 
         // Create the pushed-down request ...
-        MoveBranchRequest pushDown = new MoveBranchRequest(fromProxy.location(), intoProxy.location(), intoProxy.workspaceName(),
+        MoveBranchRequest pushDown = new MoveBranchRequest(fromProxy.location(), intoProxy.location(), beforeProxy.location(), intoProxy.workspaceName(),
                                                            request.desiredName(), request.conflictBehavior());
         // Create the federated request ...
         FederatedRequest federatedRequest = new FederatedRequest(request);

Modified: trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/inmemory/InMemoryRepository.java
===================================================================
--- trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/inmemory/InMemoryRepository.java	2009-05-29 21:22:01 UTC (rev 954)
+++ trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/inmemory/InMemoryRepository.java	2009-06-02 19:30:41 UTC (rev 955)
@@ -351,21 +351,23 @@
          * @param desiredNewName the new name for the node, if it is to be changed; may be null
          * @param newWorkspace the workspace containing the new parent node
          * @param newParent the new parent; may not be the {@link Workspace#getRoot() root}
+         * @param beforeNode the node before which this new node should be placed
          */
         public void moveNode( ExecutionContext context,
                               InMemoryNode node,
                               Name desiredNewName,
                               Workspace newWorkspace,
-                              InMemoryNode newParent ) {
+                              InMemoryNode newParent,
+                              InMemoryNode beforeNode) {
             assert context != null;
             assert newParent != null;
             assert node != null;
-            assert newWorkspace.getRoot().equals(newParent) != true;
+// Why was this restriction here? -- BRC            
+//            assert newWorkspace.getRoot().equals(newParent) != true;
             assert this.getRoot().equals(node) != true;
             InMemoryNode oldParent = node.getParent();
             Name oldName = node.getName().getName();
             if (oldParent != null) {
-                if (oldParent.equals(newParent)) return;
                 boolean removed = oldParent.getChildren().remove(node);
                 assert removed == true;
                 node.setParent(null);
@@ -377,9 +379,16 @@
                 newName = desiredNewName;
                 node.setName(context.getValueFactories().getPathFactory().createSegment(desiredNewName, 1));
             }
-            newParent.getChildren().add(node);
+            
+            if (beforeNode == null) {
+                newParent.getChildren().add(node);
+            }
+            else {
+                int index = newParent.getChildren().indexOf(beforeNode);
+                newParent.getChildren().add(index, node);
+            }
             correctSameNameSiblingIndexes(context, newParent, newName);
-
+            
             // If the node was moved to a new workspace...
             if (!this.equals(newWorkspace)) {
                 // We need to remove the node from this workspace's map of nodes ...

Modified: trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/inmemory/InMemoryRequestProcessor.java
===================================================================
--- trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/inmemory/InMemoryRequestProcessor.java	2009-05-29 21:22:01 UTC (rev 954)
+++ trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/inmemory/InMemoryRequestProcessor.java	2009-06-02 19:30:41 UTC (rev 955)
@@ -217,16 +217,35 @@
         InMemoryRepository.Workspace workspace = getWorkspace(request, request.inWorkspace());
         if (workspace == null) return;
 
+        InMemoryNode beforeNode = request.before() != null ? getTargetNode(workspace, request, request.before()) : null;
         InMemoryNode node = getTargetNode(workspace, request, request.from());
         if (node == null) return;
         // Look up the new parent, which must exist ...
-        Path newParentPath = request.into().getPath();
+        Path newParentPath;
+        
+        if (request.into() != null) {
+            newParentPath = request.into().getPath();
+        }
+        else {
+            // into or before cannot both be null
+            assert beforeNode != null;
+            
+            // Build the path from the before node to the root.
+            LinkedList<Path.Segment> segments = new LinkedList<Path.Segment>();
+            InMemoryNode current = beforeNode.getParent();
+            while (current != workspace.getRoot()) {
+                segments.addFirst(current.getName());
+                current = current.getParent();
+            } 
+            newParentPath = getExecutionContext().getValueFactories().getPathFactory().createAbsolutePath(segments);
+        }
+        
         InMemoryNode newParent = workspace.getNode(newParentPath);
-        workspace.moveNode(getExecutionContext(), node, request.desiredName(), workspace, newParent);
+        workspace.moveNode(getExecutionContext(), node, request.desiredName(), workspace, newParent, beforeNode);
         assert node.getParent() == newParent;
         Path newPath = getExecutionContext().getValueFactories().getPathFactory().create(newParentPath, node.getName());
         Location oldLocation = getActualLocation(request.from().getPath(), node);
-        Location newLocation = Location.create(newPath, newParent.getUuid());
+        Location newLocation = Location.create(newPath, node.getUuid());
         request.setActualLocations(oldLocation, newLocation);
         recordChange(request);
     }

Modified: trunk/dna-graph/src/main/java/org/jboss/dna/graph/request/BatchRequestBuilder.java
===================================================================
--- trunk/dna-graph/src/main/java/org/jboss/dna/graph/request/BatchRequestBuilder.java	2009-05-29 21:22:01 UTC (rev 954)
+++ trunk/dna-graph/src/main/java/org/jboss/dna/graph/request/BatchRequestBuilder.java	2009-06-02 19:30:41 UTC (rev 955)
@@ -627,7 +627,7 @@
                                            Location into,
                                            String workspaceName,
                                            Name newNameForNode ) {
-        return add(new MoveBranchRequest(from, into, workspaceName, newNameForNode, MoveBranchRequest.DEFAULT_CONFLICT_BEHAVIOR));
+        return add(new MoveBranchRequest(from, into, null, workspaceName, newNameForNode, MoveBranchRequest.DEFAULT_CONFLICT_BEHAVIOR));
     }
 
     /**
@@ -635,7 +635,26 @@
      * 
      * @param from the location of the top node in the existing branch that is to be moved
      * @param into the location of the existing node into which the branch should be moved
+     * @param before the location of the node before which the branch should be moved; may be null
      * @param workspaceName the name of the workspace
+     * @param newNameForNode the new name for the node being moved, or null if the name of the original should be used
+     * @return this builder for method chaining; never null
+     * @throws IllegalArgumentException if any of the parameters are null
+     */
+    public BatchRequestBuilder moveBranch( Location from,
+                                           Location into,
+                                           Location before,
+                                           String workspaceName,
+                                           Name newNameForNode ) {
+        return add(new MoveBranchRequest(from, into, before, workspaceName, newNameForNode, MoveBranchRequest.DEFAULT_CONFLICT_BEHAVIOR));
+    }
+
+    /**
+     * Create a request to move a branch from one location into another.
+     * 
+     * @param from the location of the top node in the existing branch that is to be moved
+     * @param into the location of the existing node into which the branch should be moved
+     * @param workspaceName the name of the workspace
      * @param conflictBehavior the expected behavior if an equivalently-named child already exists at the <code>into</code>
      *        location
      * @return this builder for method chaining; never null

Modified: trunk/dna-graph/src/main/java/org/jboss/dna/graph/request/MoveBranchRequest.java
===================================================================
--- trunk/dna-graph/src/main/java/org/jboss/dna/graph/request/MoveBranchRequest.java	2009-05-29 21:22:01 UTC (rev 954)
+++ trunk/dna-graph/src/main/java/org/jboss/dna/graph/request/MoveBranchRequest.java	2009-06-02 19:30:41 UTC (rev 955)
@@ -44,6 +44,7 @@
 
     private final Location from;
     private final Location into;
+    private final Location before;
     private final String workspaceName;
     private final Name desiredNameForNode;
     private final NodeConflictBehavior conflictBehavior;
@@ -61,7 +62,7 @@
     public MoveBranchRequest( Location from,
                               Location into,
                               String workspaceName ) {
-        this(from, into, workspaceName, null, DEFAULT_CONFLICT_BEHAVIOR);
+        this(from, into, null, workspaceName, null, DEFAULT_CONFLICT_BEHAVIOR);
     }
 
     /**
@@ -77,7 +78,7 @@
                               Location into,
                               String workspaceName,
                               Name newNameForMovedNode ) {
-        this(from, into, workspaceName, newNameForMovedNode, DEFAULT_CONFLICT_BEHAVIOR);
+        this(from, into, null, workspaceName, newNameForMovedNode, DEFAULT_CONFLICT_BEHAVIOR);
     }
 
     /**
@@ -94,7 +95,7 @@
                               Location into,
                               String workspaceName,
                               NodeConflictBehavior conflictBehavior ) {
-        this(from, into, workspaceName, null, conflictBehavior);
+        this(from, into, null, workspaceName, null, conflictBehavior);
     }
 
     /**
@@ -102,6 +103,8 @@
      * 
      * @param from the location of the top node in the existing branch that is to be moved
      * @param into the location of the existing node into which the branch should be moved
+     * @param before the location of the child of the {@code into} node that the branch should be placed before; null indicates
+     *        that the branch should be the last child of its new parent
      * @param workspaceName the name of the workspace
      * @param newNameForMovedNode the new name for the node being moved, or null if the name of the original should be used
      * @param conflictBehavior the expected behavior if an equivalently-named child already exists at the <code>into</code>
@@ -110,15 +113,17 @@
      */
     public MoveBranchRequest( Location from,
                               Location into,
+                              Location before,
                               String workspaceName,
                               Name newNameForMovedNode,
                               NodeConflictBehavior conflictBehavior ) {
         CheckArg.isNotNull(from, "from");
-        CheckArg.isNotNull(into, "into");
+        // CheckArg.isNotNull(into, "into");
         CheckArg.isNotNull(workspaceName, "workspaceName");
         CheckArg.isNotNull(conflictBehavior, "conflictBehavior");
         this.from = from;
         this.into = into;
+        this.before = before;
         this.workspaceName = workspaceName;
         this.desiredNameForNode = newNameForMovedNode;
         this.conflictBehavior = conflictBehavior;
@@ -143,6 +148,15 @@
     }
 
     /**
+     * Get the location defining the node before which the branch is to be placed
+     * 
+     * @return the to location; null indicates that the branch should be the last child node of its new parent
+     */
+    public Location before() {
+        return before;
+    }
+
+    /**
      * Get the name of the workspace in which the branch exists.
      * 
      * @return the name of the workspace containing the branch; never null
@@ -197,9 +211,10 @@
      * @return true if this move request really doesn't change the parent of the node, or false if it cannot be determined
      */
     public boolean hasNoEffect() {
-        if (into.hasPath() && into.hasIdProperties() == false && from.hasPath()) {
+        if (into != null && into.hasPath() && into.hasIdProperties() == false && from.hasPath()) {
             if (!from.getPath().getParent().equals(into.getPath())) return false;
             if (desiredName() != null && !desiredName().equals(from.getPath().getLastSegment().getName())) return false;
+            if (before != null) return false;
             return true;
         }
         // Can't be determined for certain
@@ -232,7 +247,7 @@
         if (!newLocation.hasPath()) {
             throw new IllegalArgumentException(GraphI18n.actualNewLocationMustHavePath.text(newLocation));
         }
-        if (into().hasPath() && !newLocation.getPath().getParent().isSameAs(into.getPath())) {
+        if (into() != null && into().hasPath() && !newLocation.getPath().getParent().isSameAs(into.getPath())) {
             throw new IllegalArgumentException(GraphI18n.actualLocationIsNotSameAsInputLocation.text(newLocation, into));
         }
         Name actualNewName = newLocation.getPath().getLastSegment().getName();
@@ -270,8 +285,16 @@
     @Override
     public boolean changes( String workspace,
                             Path path ) {
+        if (this.into() != null) {
+            return this.workspaceName.equals(workspace)
+                   && (into.hasPath() && into.getPath().isAtOrBelow(path) || from.hasPath() && from.getPath().isAtOrBelow(path));
+        }
+        // into or before must be non-null
+        assert before() != null;
         return this.workspaceName.equals(workspace)
-               && (into.hasPath() && into.getPath().isAtOrBelow(path) || from.hasPath() && from.getPath().isAtOrBelow(path));
+               && (before.hasPath() && before.getPath().getParent().isAtOrBelow(path) || from.hasPath()
+                                                                                         && from.getPath().isAtOrBelow(path));
+
     }
 
     /**
@@ -281,7 +304,7 @@
      */
     @Override
     public Location changedLocation() {
-        return into;
+        return into != null ? into : before;
     }
 
     /**
@@ -343,9 +366,10 @@
     @Override
     public String toString() {
         if (desiredName() != null) {
-            return "move branch " + from() + " in the \"" + inWorkspace() + "\" workspace into " + into() + " with name "
-                   + desiredName();
+            return "move branch " + from() + " in the \"" + inWorkspace() + "\" workspace "
+                   + (into() == null ? "before " + before() : "into " + into()) + " with name " + desiredName();
         }
-        return "move branch " + from() + " in the \"" + inWorkspace() + "\" workspace into " + into();
+        return "move branch " + from() + " in the \"" + inWorkspace() + "\" workspace into "
+               + (into() == null ? "before " + before() : "into " + into());
     }
 }

Modified: trunk/dna-graph/src/main/java/org/jboss/dna/graph/request/RequestBuilder.java
===================================================================
--- trunk/dna-graph/src/main/java/org/jboss/dna/graph/request/RequestBuilder.java	2009-05-29 21:22:01 UTC (rev 954)
+++ trunk/dna-graph/src/main/java/org/jboss/dna/graph/request/RequestBuilder.java	2009-06-02 19:30:41 UTC (rev 955)
@@ -474,9 +474,28 @@
                                          Location into,
                                          String workspaceName,
                                          Name newNameForNode ) {
-        return process(new MoveBranchRequest(from, into, workspaceName, newNameForNode, MoveBranchRequest.DEFAULT_CONFLICT_BEHAVIOR));
+        return process(new MoveBranchRequest(from, into, null, workspaceName, newNameForNode, MoveBranchRequest.DEFAULT_CONFLICT_BEHAVIOR));
     }
+    
     /**
+     * Create a request to move a branch from one location into another before the given child node of the new location.
+     * 
+     * @param from the location of the top node in the existing branch that is to be moved
+     * @param into the location of the existing node into which the branch should be moved
+     * @param before the location of the node before which the branch should be moved; may be null
+     * @param workspaceName the name of the workspace
+     * @param newNameForNode the new name for the node being moved, or null if the name of the original should be used
+     * @return the request; never null
+     * @throws IllegalArgumentException if any of the parameters are null
+     */
+    public MoveBranchRequest moveBranch( Location from,
+                                         Location into,
+                                         Location before, 
+                                         String workspaceName,
+                                         Name newNameForNode ) {
+        return process(new MoveBranchRequest(from, into, before, workspaceName, newNameForNode, MoveBranchRequest.DEFAULT_CONFLICT_BEHAVIOR));
+    }    
+    /**
      * Create a request to move a branch from one location into another.
      * 
      * @param from the location of the top node in the existing branch that is to be moved
@@ -494,7 +513,7 @@
                                          Name newNameForNode,
                                          NodeConflictBehavior conflictBehavior ) {
         if (conflictBehavior == null) conflictBehavior = MoveBranchRequest.DEFAULT_CONFLICT_BEHAVIOR;
-        return process(new MoveBranchRequest(from, into, workspaceName, newNameForNode, conflictBehavior));
+        return process(new MoveBranchRequest(from, into, null, workspaceName, newNameForNode, conflictBehavior));
     }
 
     /**

Modified: trunk/dna-graph/src/test/java/org/jboss/dna/graph/connector/inmemory/InMemoryRepositoryWorkspaceTest.java
===================================================================
--- trunk/dna-graph/src/test/java/org/jboss/dna/graph/connector/inmemory/InMemoryRepositoryWorkspaceTest.java	2009-05-29 21:22:01 UTC (rev 954)
+++ trunk/dna-graph/src/test/java/org/jboss/dna/graph/connector/inmemory/InMemoryRepositoryWorkspaceTest.java	2009-06-02 19:30:41 UTC (rev 955)
@@ -241,7 +241,7 @@
         assertThat(workspace.getNode(pathFactory.create("/d/e")), is(sameInstance(node_e)));
         assertThat(workspace.getNode(pathFactory.create("/d/b")), is(sameInstance(node_b2)));
 
-        workspace.moveNode(context, node_b, null, workspace, node_d);
+        workspace.moveNode(context, node_b, null, workspace, node_d, null);
 
         assertThat(workspace.getNode(pathFactory.create("/")), is(sameInstance(workspace.getRoot())));
         assertThat(workspace.getNode(pathFactory.create("/a")), is(sameInstance(node_a)));
@@ -251,7 +251,7 @@
         assertThat(workspace.getNode(pathFactory.create("/d/b[2]")), is(sameInstance(node_b)));
         assertThat(workspace.getNode(pathFactory.create("/d/b[2]/c")), is(sameInstance(node_c)));
 
-        workspace.moveNode(context, node_b, null, workspace, node_e);
+        workspace.moveNode(context, node_b, null, workspace, node_e, null);
 
         assertThat(workspace.getNode(pathFactory.create("/")), is(sameInstance(workspace.getRoot())));
         assertThat(workspace.getNode(pathFactory.create("/a")), is(sameInstance(node_a)));
@@ -263,6 +263,55 @@
     }
 
     @Test
+    public void shouldMoveNodeBeforeAnother() {
+        InMemoryNode root = workspace.getRoot();
+        InMemoryNode node_a = workspace.createNode(context, root, nameFactory.create("a"), null);
+        InMemoryNode node_b = workspace.createNode(context, node_a, nameFactory.create("b"), null);
+        InMemoryNode node_c = workspace.createNode(context, node_b, nameFactory.create("c"), null);
+        InMemoryNode node_d = workspace.createNode(context, root, nameFactory.create("d"), null);
+        InMemoryNode node_e = workspace.createNode(context, node_d, nameFactory.create("e"), null);
+        InMemoryNode node_b2 = workspace.createNode(context, node_d, nameFactory.create("b"), null);
+        Name propName = nameFactory.create("prop");
+        node_b.setProperty(propertyFactory.create(propName, "node_b"));
+        node_b2.setProperty(propertyFactory.create(propName, "node_b2"));
+        
+        assertThat(workspace.getNodesByUuid().size(), is(7));
+        assertThat(workspace.getNode(pathFactory.create("/")), is(sameInstance(workspace.getRoot())));
+        assertThat(workspace.getNode(pathFactory.create("/a")), is(sameInstance(node_a)));
+        assertThat(workspace.getNode(pathFactory.create("/a/b")), is(sameInstance(node_b)));
+        assertThat(workspace.getNode(pathFactory.create("/a/b/c")), is(sameInstance(node_c)));
+        assertThat(workspace.getNode(pathFactory.create("/d")), is(sameInstance(node_d)));
+        assertThat(workspace.getNode(pathFactory.create("/d/e")), is(sameInstance(node_e)));
+        assertThat(workspace.getNode(pathFactory.create("/d/b")), is(sameInstance(node_b2)));
+        assertThat(workspace.getNode(pathFactory.create("/a/b")).getProperty(propName).getFirstValue().toString(), is("node_b"));
+        assertThat(workspace.getNode(pathFactory.create("/d/b")).getProperty(propName).getFirstValue().toString(), is("node_b2"));
+
+        // Move before a node with the same name
+        workspace.moveNode(context, node_b, null, workspace, node_d, node_b2);
+
+        assertThat(workspace.getNode(pathFactory.create("/")), is(sameInstance(workspace.getRoot())));
+        assertThat(workspace.getNode(pathFactory.create("/a")), is(sameInstance(node_a)));
+        assertThat(workspace.getNode(pathFactory.create("/d")), is(sameInstance(node_d)));
+        assertThat(workspace.getNode(pathFactory.create("/d/e")), is(sameInstance(node_e)));
+        assertThat(workspace.getNode(pathFactory.create("/d/b[2]")), is(sameInstance(node_b2)));
+        assertThat(workspace.getNode(pathFactory.create("/d/b[1]")), is(sameInstance(node_b)));
+        assertThat(workspace.getNode(pathFactory.create("/d/b[1]/c")), is(sameInstance(node_c)));
+        assertThat(workspace.getNode(pathFactory.create("/d/b[1]")).getProperty(propName).getFirstValue().toString(), is("node_b"));
+        assertThat(workspace.getNode(pathFactory.create("/d/b[2]")).getProperty(propName).getFirstValue().toString(), is("node_b2"));
+
+        // Move after the last node
+        workspace.moveNode(context, node_b, null, workspace, root, null);
+
+        assertThat(workspace.getNode(pathFactory.create("/")), is(sameInstance(workspace.getRoot())));
+        assertThat(workspace.getNode(pathFactory.create("/a")), is(sameInstance(node_a)));
+        assertThat(workspace.getNode(pathFactory.create("/d")), is(sameInstance(node_d)));
+        assertThat(workspace.getNode(pathFactory.create("/d/e")), is(sameInstance(node_e)));
+        assertThat(workspace.getNode(pathFactory.create("/b")), is(sameInstance(node_b)));
+        assertThat(workspace.getNode(pathFactory.create("/b/c")), is(sameInstance(node_c)));
+        assertThat(workspace.getNode(pathFactory.create("/d/b")), is(sameInstance(node_b2)));
+    }
+
+    @Test
     public void shouldMoveNodesFromOneWorkspaceToAnother() {
         // Populate the workspace with some content ...
         InMemoryNode root = workspace.getRoot();
@@ -304,7 +353,7 @@
         assertThat(new_workspace.getNode(pathFactory.create("/d/b")), is(sameInstance(new_node_b2)));
 
         // Move 'workspace::/a/b' into 'newWorkspace::/d'
-        workspace.moveNode(context, node_b, null, new_workspace, new_node_d);
+        workspace.moveNode(context, node_b, null, new_workspace, new_node_d, null);
 
         assertThat(workspace.getNodesByUuid().size(), is(5));
         assertThat(workspace.getNode(pathFactory.create("/")), is(sameInstance(workspace.getRoot())));

Modified: trunk/dna-graph/src/test/java/org/jboss/dna/graph/connector/test/WritableConnectorTest.java
===================================================================
--- trunk/dna-graph/src/test/java/org/jboss/dna/graph/connector/test/WritableConnectorTest.java	2009-05-29 21:22:01 UTC (rev 954)
+++ trunk/dna-graph/src/test/java/org/jboss/dna/graph/connector/test/WritableConnectorTest.java	2009-06-02 19:30:41 UTC (rev 955)
@@ -1386,4 +1386,184 @@
                                                                       "The quick brown fox jumped over the moon. What? "));
     }
 
+    @Test
+    public void shouldMoveAndRenameNodesToNameWithSameNameSibling() {
+        // Create the tree (at total of 40 nodes, plus the extra 6 added later)...
+        // /
+        // /node1
+        // /node1/node1
+        // /node1/node1/node1
+        // /node1/node1/node2
+        // /node1/node1/node3
+        // /node1/node2
+        // /node1/node2/node1
+        // /node1/node2/node2
+        // /node1/node2/node3
+        // /node1/node3
+        // /node1/node3/node1
+        // /node1/node3/node2
+        // /node1/node3/node3
+        // /node2
+        // /node2/node1
+        // /node2/node1/node1
+        // /node2/node1/node2
+        // /node2/node1/node3
+        // /node2/node2
+        // /node2/node2/node1
+        // /node2/node2/node2
+        // /node2/node2/node3
+        // /node2/node3
+        // /node2/node3/node1
+        // /node2/node3/node2
+        // /node2/node3/node3
+        // /node3
+        // /node3/node1
+        // /node3/node1/node1
+        // /node3/node1/node2
+        // /node3/node1/node3
+        // /node3/node2
+        // /node3/node2/node1
+        // /node3/node2/node2
+        // /node3/node2/node3
+        // /node3/node3
+        // /node3/node3/node1
+        // /node3/node3/node2
+        // /node3/node3/node3
+        // /secondBranch1
+        // /secondBranch1/secondBranch1
+        // /secondBranch1/secondBranch2
+        // /secondBranch2
+        // /secondBranch2/secondBranch1
+        // /secondBranch2/secondBranch2
+
+        String initialPath = "";
+        int depth = 3;
+        int numChildrenPerNode = 3;
+        int numPropertiesPerNode = 3;
+        Stopwatch sw = new Stopwatch();
+        boolean batch = true;
+        createSubgraph(graph, initialPath, depth, numChildrenPerNode, numPropertiesPerNode, batch, sw, System.out, null);
+
+        // Delete two branches ...
+        graph.move("/node2").before("/node3/node2");
+
+        // Now assert the structure ...
+        assertThat(graph.getChildren().of("/"), hasChildren(segment("node1"), segment("node3")));
+        assertThat(graph.getChildren().of("/node1"), hasChildren(segment("node1"), segment("node2"), segment("node3")));
+        assertThat(graph.getChildren().of("/node1/node1"), hasChildren(segment("node1"), segment("node2"), segment("node3")));
+        assertThat(graph.getChildren().of("/node1/node2"), hasChildren(segment("node1"), segment("node2"), segment("node3")));
+        assertThat(graph.getChildren().of("/node1/node3"), hasChildren(segment("node1"), segment("node2"), segment("node3")));
+        assertThat(graph.getChildren().of("/node1/node3/node1"), hasChildren());
+
+        assertThat(graph.getChildren().of("/node3"), hasChildren(segment("node1"),
+                                                                 segment("node2[1]"),
+                                                                 segment("node3"),
+                                                                 segment("node2[2]")));
+        assertThat(graph.getChildren().of("/node3/node2[1]"), hasChildren(segment("node1"), segment("node2"), segment("node3")));
+        assertThat(graph.getChildren().of("/node3/node3"), hasChildren(segment("node1"), segment("node2"), segment("node3")));
+        assertThat(graph.getChildren().of("/node3/node3/node1"), hasChildren());
+        assertThat(graph.getChildren().of("/node3/node2[1]"), hasChildren(segment("node1"), segment("node2"), segment("node3")));
+        assertThat(graph.getChildren().of("/node3/node2[1]/node1"),
+                   hasChildren(segment("node1"), segment("node2"), segment("node3")));
+        assertThat(graph.getChildren().of("/node3/node2[1]/node2"),
+                   hasChildren(segment("node1"), segment("node2"), segment("node3")));
+        assertThat(graph.getChildren().of("/node3/node2[1]/node3"),
+                   hasChildren(segment("node1"), segment("node2"), segment("node3")));
+        assertThat(graph.getChildren().of("/node3/node2[1]/node1/node1"), hasChildren());
+
+        Subgraph subgraph = graph.getSubgraphOfDepth(4).at("/node3");
+        assertThat(subgraph, is(notNullValue()));
+        assertThat(subgraph.getNode(".").getChildren(), hasChildren(segment("node2"), segment("node3")));
+        assertThat(subgraph.getNode("."), hasProperty("property1", "The quick brown fox jumped over the moon. What? "));
+        assertThat(subgraph.getNode("."), hasProperty("property2", "The quick brown fox jumped over the moon. What? "));
+        assertThat(subgraph.getNode("."), hasProperty("property3", "The quick brown fox jumped over the moon. What? "));
+        assertThat(subgraph.getNode("node2[2]").getChildren(), hasChildren(segment("node1"), segment("node2"), segment("node3")));
+        assertThat(subgraph.getNode("node2[2]"), hasProperty("property1", "The quick brown fox jumped over the moon. What? "));
+        assertThat(subgraph.getNode("node2[2]"), hasProperty("property2", "The quick brown fox jumped over the moon. What? "));
+        assertThat(subgraph.getNode("node2[2]"), hasProperty("property3", "The quick brown fox jumped over the moon. What? "));
+        assertThat(subgraph.getNode("node3").getChildren(), isEmpty());
+        assertThat(subgraph.getNode("node3"), hasProperty("property1", "The quick brown fox jumped over the moon. What? "));
+        assertThat(subgraph.getNode("node3"), hasProperty("property2", "The quick brown fox jumped over the moon. What? "));
+        assertThat(subgraph.getNode("node3"), hasProperty("property3", "The quick brown fox jumped over the moon. What? "));
+        assertThat(subgraph.getNode("node2[1]").getChildren(), hasChildren(segment("node1"), segment("node2"), segment("node3")));
+        assertThat(subgraph.getNode("node2[1]"), hasProperty("property1", "The quick brown fox jumped over the moon. What? "));
+        assertThat(subgraph.getNode("node2[1]"), hasProperty("property2", "The quick brown fox jumped over the moon. What? "));
+        assertThat(subgraph.getNode("node2[1]"), hasProperty("property3", "The quick brown fox jumped over the moon. What? "));
+        assertThat(subgraph.getNode("node2[1]/node1").getChildren(), hasChildren(segment("node1"),
+                                                                              segment("node2"),
+                                                                              segment("node3")));
+        assertThat(subgraph.getNode("node2[1]/node1"), hasProperty("property1", "The quick brown fox jumped over the moon. What? "));
+        assertThat(subgraph.getNode("node2[1]/node1"), hasProperty("property2", "The quick brown fox jumped over the moon. What? "));
+        assertThat(subgraph.getNode("node2[1]/node1"), hasProperty("property3", "The quick brown fox jumped over the moon. What? "));
+        assertThat(subgraph.getNode("node2[1]/node1/node1").getChildren(), isEmpty());
+        assertThat(subgraph.getNode("node2[1]/node1/node1"), hasProperty("property1",
+                                                                      "The quick brown fox jumped over the moon. What? "));
+        assertThat(subgraph.getNode("node2[1]/node1/node1"), hasProperty("property2",
+                                                                      "The quick brown fox jumped over the moon. What? "));
+        assertThat(subgraph.getNode("node2[1]/node1/node1"), hasProperty("property3",
+                                                                      "The quick brown fox jumped over the moon. What? "));
+        assertThat(subgraph.getNode("node2[1]/node1/node2").getChildren(), isEmpty());
+        assertThat(subgraph.getNode("node2[1]/node1/node2"), hasProperty("property1",
+                                                                      "The quick brown fox jumped over the moon. What? "));
+        assertThat(subgraph.getNode("node2[1]/node1/node2"), hasProperty("property2",
+                                                                      "The quick brown fox jumped over the moon. What? "));
+        assertThat(subgraph.getNode("node2[1]/node1/node2"), hasProperty("property3",
+                                                                      "The quick brown fox jumped over the moon. What? "));
+        assertThat(subgraph.getNode("node2[1]/node1/node3").getChildren(), isEmpty());
+        assertThat(subgraph.getNode("node2[1]/node1/node3"), hasProperty("property1",
+                                                                      "The quick brown fox jumped over the moon. What? "));
+        assertThat(subgraph.getNode("node2[1]/node1/node3"), hasProperty("property2",
+                                                                      "The quick brown fox jumped over the moon. What? "));
+        assertThat(subgraph.getNode("node2[1]/node1/node3"), hasProperty("property3",
+                                                                      "The quick brown fox jumped over the moon. What? "));
+        assertThat(subgraph.getNode("node2[1]/node2"), hasProperty("property1", "The quick brown fox jumped over the moon. What? "));
+        assertThat(subgraph.getNode("node2[1]/node2"), hasProperty("property2", "The quick brown fox jumped over the moon. What? "));
+        assertThat(subgraph.getNode("node2[1]/node2"), hasProperty("property3", "The quick brown fox jumped over the moon. What? "));
+        assertThat(subgraph.getNode("node2[1]/node2/node1").getChildren(), isEmpty());
+        assertThat(subgraph.getNode("node2[1]/node2/node1"), hasProperty("property1",
+                                                                      "The quick brown fox jumped over the moon. What? "));
+        assertThat(subgraph.getNode("node2[1]/node2/node1"), hasProperty("property2",
+                                                                      "The quick brown fox jumped over the moon. What? "));
+        assertThat(subgraph.getNode("node2[1]/node2/node1"), hasProperty("property3",
+                                                                      "The quick brown fox jumped over the moon. What? "));
+        assertThat(subgraph.getNode("node2[1]/node2/node2").getChildren(), isEmpty());
+        assertThat(subgraph.getNode("node2[1]/node2/node2"), hasProperty("property1",
+                                                                      "The quick brown fox jumped over the moon. What? "));
+        assertThat(subgraph.getNode("node2[1]/node2/node2"), hasProperty("property2",
+                                                                      "The quick brown fox jumped over the moon. What? "));
+        assertThat(subgraph.getNode("node2[1]/node2/node2"), hasProperty("property3",
+                                                                      "The quick brown fox jumped over the moon. What? "));
+        assertThat(subgraph.getNode("node2[1]/node2/node3").getChildren(), isEmpty());
+        assertThat(subgraph.getNode("node2[1]/node2/node3"), hasProperty("property1",
+                                                                      "The quick brown fox jumped over the moon. What? "));
+        assertThat(subgraph.getNode("node2[1]/node2/node3"), hasProperty("property2",
+                                                                      "The quick brown fox jumped over the moon. What? "));
+        assertThat(subgraph.getNode("node2[1]/node2/node3"), hasProperty("property3",
+                                                                      "The quick brown fox jumped over the moon. What? "));
+        assertThat(subgraph.getNode("node2[1]/node3"), hasProperty("property1", "The quick brown fox jumped over the moon. What? "));
+        assertThat(subgraph.getNode("node2[1]/node3"), hasProperty("property2", "The quick brown fox jumped over the moon. What? "));
+        assertThat(subgraph.getNode("node2[1]/node3"), hasProperty("property3", "The quick brown fox jumped over the moon. What? "));
+        assertThat(subgraph.getNode("node2[1]/node3/node1").getChildren(), isEmpty());
+        assertThat(subgraph.getNode("node2[1]/node3/node1"), hasProperty("property1",
+                                                                      "The quick brown fox jumped over the moon. What? "));
+        assertThat(subgraph.getNode("node2[1]/node3/node1"), hasProperty("property2",
+                                                                      "The quick brown fox jumped over the moon. What? "));
+        assertThat(subgraph.getNode("node2[1]/node3/node1"), hasProperty("property3",
+                                                                      "The quick brown fox jumped over the moon. What? "));
+        assertThat(subgraph.getNode("node2[1]/node3/node2").getChildren(), isEmpty());
+        assertThat(subgraph.getNode("node2[1]/node3/node2"), hasProperty("property1",
+                                                                      "The quick brown fox jumped over the moon. What? "));
+        assertThat(subgraph.getNode("node2[1]/node3/node2"), hasProperty("property2",
+                                                                      "The quick brown fox jumped over the moon. What? "));
+        assertThat(subgraph.getNode("node2[1]/node3/node2"), hasProperty("property3",
+                                                                      "The quick brown fox jumped over the moon. What? "));
+        assertThat(subgraph.getNode("node2[1]/node3/node3").getChildren(), isEmpty());
+        assertThat(subgraph.getNode("node2[1]/node3/node3"), hasProperty("property1",
+                                                                      "The quick brown fox jumped over the moon. What? "));
+        assertThat(subgraph.getNode("node2[1]/node3/node3"), hasProperty("property2",
+                                                                      "The quick brown fox jumped over the moon. What? "));
+        assertThat(subgraph.getNode("node2[1]/node3/node3"), hasProperty("property3",
+                                                                      "The quick brown fox jumped over the moon. What? "));
+    }
+
 }

Modified: trunk/dna-graph/src/test/java/org/jboss/dna/graph/request/MoveBranchRequestTest.java
===================================================================
--- trunk/dna-graph/src/test/java/org/jboss/dna/graph/request/MoveBranchRequestTest.java	2009-05-29 21:22:01 UTC (rev 954)
+++ trunk/dna-graph/src/test/java/org/jboss/dna/graph/request/MoveBranchRequestTest.java	2009-06-02 19:30:41 UTC (rev 955)
@@ -27,6 +27,9 @@
 import static org.hamcrest.core.IsNull.nullValue;
 import static org.hamcrest.core.IsSame.sameInstance;
 import static org.junit.Assert.assertThat;
+import org.jboss.dna.graph.NodeConflictBehavior;
+import org.jboss.dna.graph.property.Name;
+import org.jboss.dna.graph.property.basic.BasicName;
 import org.junit.Before;
 import org.junit.Test;
 
@@ -53,8 +56,8 @@
         new MoveBranchRequest(null, validPathLocation2, workspace2);
     }
 
-    @Test( expected = IllegalArgumentException.class )
-    public void shouldNotAllowCreatingRequestWithNullToLocation() {
+    @Test
+    public void shouldAllowCreatingRequestWithNullToLocation() {
         new MoveBranchRequest(validPathLocation1, null, workspace2);
     }
 
@@ -74,6 +77,18 @@
     }
 
     @Test
+    public void shouldCreateValidRequestWithValidFromLocationAndValidToLocationAndValidBeforeLocation() {
+        Name newName = new BasicName("", "newName");
+        request = new MoveBranchRequest(validPathLocation1, validPathLocation2, validPathLocation, workspace1, newName, NodeConflictBehavior.DO_NOT_REPLACE);
+        assertThat(request.from(), is(sameInstance(validPathLocation1)));
+        assertThat(request.into(), is(sameInstance(validPathLocation2)));
+        assertThat(request.before(), is(sameInstance(validPathLocation)));
+        assertThat(request.inWorkspace(), is(sameInstance(workspace1)));
+        assertThat(request.hasError(), is(false));
+        assertThat(request.getError(), is(nullValue()));
+    }
+
+    @Test
     public void shouldConsiderEqualTwoRequestsWithSameLocations() {
         request = new MoveBranchRequest(validPathLocation1, validPathLocation2, workspace2);
         MoveBranchRequest request2 = new MoveBranchRequest(validPathLocation1, validPathLocation2, workspace2);

Modified: trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/AbstractJcrNode.java
===================================================================
--- trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/AbstractJcrNode.java	2009-05-29 21:22:01 UTC (rev 954)
+++ trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/AbstractJcrNode.java	2009-06-02 19:30:41 UTC (rev 955)
@@ -1457,12 +1457,15 @@
             throw new ItemNotFoundException();
         }
         // getLastSegment should return the only segment, since we verified that size() == 1
-        source = nodeInfo().getChildren().getChild(srcPath.getLastSegment());
+        Path.Segment sourceSegment = srcPath.getLastSegment();
+        source = nodeInfo().getChildren().getChild(sourceSegment);
         if (source == null) {
-            throw new ItemNotFoundException();
+            String workspaceName = this.cache.session().getWorkspace().getName();
+            throw new ItemNotFoundException(JcrI18n.pathNotFound.text(srcPath, workspaceName));
         }
 
         Path destPath = null;
+        Path.Segment destSegment = null;
         ChildNode destination = null;
 
         if (destChildRelPath != null) {
@@ -1470,13 +1473,18 @@
             if (destPath.isAbsolute() || destPath.size() != 1) {
                 throw new ItemNotFoundException();
             }
+            
+            destSegment = destPath.getLastSegment();
 
             // getLastSegment should return the only segment, since we verified that size() == 1
-            destination = nodeInfo().getChildren().getChild(destPath.getLastSegment());
+            destination = nodeInfo().getChildren().getChild(destSegment);
             if (destination == null) {
-                throw new ItemNotFoundException();
+                String workspaceName = this.cache.session().getWorkspace().getName();
+                throw new ItemNotFoundException(JcrI18n.pathNotFound.text(destPath, workspaceName));
             }
         }
+        
+        this.editor().orderChildBefore(sourceSegment, destSegment);
 
     }
 

Modified: trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/SessionCache.java
===================================================================
--- trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/SessionCache.java	2009-05-29 21:22:01 UTC (rev 954)
+++ trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/SessionCache.java	2009-06-02 19:30:41 UTC (rev 955)
@@ -1343,6 +1343,32 @@
             }
         }
 
+        public void orderChildBefore(Path.Segment childToBeMoved, Path.Segment before) throws RepositoryException {
+            PathFactory pathFactory = SessionCache.this.pathFactory;
+            Path thisPath = this.currentLocation.getPath();
+            UUID fromUuid = this.node.getChildren().getChild(childToBeMoved).getUuid();
+            Location fromLocation = Location.create(pathFactory.create(thisPath, childToBeMoved), fromUuid);
+            
+            Children children = this.node.getChildren();
+            ChildNode nodeToBeMoved = children.getChild(childToBeMoved);
+            this.node.removeChild(nodeToBeMoved.getUuid(), pathFactory);
+
+            if (before == null) {
+                this.node.addChild(nodeToBeMoved.getName(), nodeToBeMoved.getUuid(), pathFactory);
+                // Moving the node into its parent will remove it from its current spot in the child list and re-add it to the end
+                operations.move(fromLocation).into(this.currentLocation);
+
+            }
+            else {
+                Path beforePath = pathFactory.create(thisPath, before);
+                UUID beforeUuid = this.node.getChildren().getChild(before).getUuid();
+                Location beforeLocation = Location.create(beforePath, beforeUuid);
+                
+                this.node.addChild(nodeToBeMoved.getName(), before, nodeToBeMoved.getUuid(), pathFactory);
+                operations.move(fromLocation).before(beforeLocation);
+            }
+        }
+        
         /**
          * Move the child specified by the supplied UUID to be a child of this node, appending the child to the end of the current
          * list of children. This method automatically disconnects the node from its current parent.

Modified: trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/cache/ChangedChildren.java
===================================================================
--- trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/cache/ChangedChildren.java	2009-05-29 21:22:01 UTC (rev 954)
+++ trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/cache/ChangedChildren.java	2009-06-02 19:30:41 UTC (rev 955)
@@ -28,6 +28,7 @@
 import java.util.UUID;
 import net.jcip.annotations.NotThreadSafe;
 import org.jboss.dna.graph.property.Name;
+import org.jboss.dna.graph.property.Path;
 import org.jboss.dna.graph.property.PathFactory;
 
 /**
@@ -50,6 +51,13 @@
         super(parentUuid);
     }
 
+    protected ChangedChildren( ImmutableChildren original,
+                                 Name additionalChildName,
+                                 Path.Segment beforeChild,
+                                 UUID childUuid,
+                                 PathFactory pathFactory ) {
+        super(original, additionalChildName, beforeChild, childUuid, pathFactory);
+    }
     /**
      * {@inheritDoc}
      * 
@@ -66,6 +74,22 @@
     }
 
     /**
+     * Create another Children object that is equivalent to this node but with the supplied child added before the named node.
+     * 
+     * @param newChildName the name of the new child; may not be null
+     * @param beforeChild the path segment of the child before which this node should be added; may not be null
+     * @param newChildUuid the UUID of the new child; may not be null
+     * @param pathFactory the factory that can be used to create Path and/or Path.Segment instances.
+     * @return the new Children object; never null
+     */
+    public ChangedChildren with( Name newChildName,
+                                 Path.Segment beforeChild,
+                                 UUID newChildUuid,
+                                 PathFactory pathFactory ) {
+        return new ChangedChildren(this, newChildName, beforeChild, newChildUuid, pathFactory);
+    }
+
+    /**
      * {@inheritDoc}
      * 
      * @see org.jboss.dna.jcr.cache.ImmutableChildren#without(java.util.UUID, org.jboss.dna.graph.property.PathFactory)

Modified: trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/cache/ChangedNodeInfo.java
===================================================================
--- trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/cache/ChangedNodeInfo.java	2009-05-29 21:22:01 UTC (rev 954)
+++ trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/cache/ChangedNodeInfo.java	2009-06-02 19:30:41 UTC (rev 955)
@@ -37,6 +37,7 @@
 import org.jboss.dna.graph.Location;
 import org.jboss.dna.graph.property.Name;
 import org.jboss.dna.graph.property.NameFactory;
+import org.jboss.dna.graph.property.Path;
 import org.jboss.dna.graph.property.PathFactory;
 import org.jboss.dna.graph.property.ValueFactories;
 import org.jboss.dna.graph.property.ValueFactory;
@@ -287,6 +288,25 @@
         }
         return changedChildren.add(childName, childUuid, factory);
     }
+    
+    /**
+     * Add a child to the children. This method does nothing if the child is already in the children.
+     * 
+     * @param childName the name of the child that is to be added; may not be null
+     * @param childUuid the UUID of the child that is to be added; may not be null
+     * @param beforeChild the segment for the child that the new child should be added before; may not be null 
+     * @param factory the path factory that should be used to create a {@link Segment} for the new {@link ChildNode} object
+     */
+    public void addChild( Name childName,
+                               Path.Segment beforeChild,
+                               UUID childUuid,
+                               PathFactory factory ) {
+        if (changedChildren == null) {
+            // We need to capture the original children as a changed contained ...
+            changedChildren = new ChangedChildren(original.getChildren());
+        }
+        changedChildren = changedChildren.with(childName, beforeChild, childUuid, factory);
+    }    
 
     /**
      * Remove a child from the children. This method only uses the child's UUID to identify the contained ChildNode instance that

Modified: trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/cache/ImmutableChildren.java
===================================================================
--- trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/cache/ImmutableChildren.java	2009-05-29 21:22:01 UTC (rev 954)
+++ trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/cache/ImmutableChildren.java	2009-06-02 19:30:41 UTC (rev 955)
@@ -78,12 +78,40 @@
         }
     }
 
-    protected ImmutableChildren( Children original,
+    protected ImmutableChildren( ImmutableChildren original,
                                  Name additionalChildName,
+                                 Path.Segment beforeChild,
                                  UUID childUuid,
                                  PathFactory pathFactory ) {
-        this(original);
-        add(additionalChildName, childUuid, pathFactory);
+            assert beforeChild != null;
+
+            this.parentUuid = original.getParentUuid();
+            this.childrenByUuid = new HashMap<UUID, ChildNode>();
+            this.childrenByName = new LinkedListMultimap<Name, ChildNode>();
+
+            int snsIndex = 1;
+            boolean found = false;
+            ChildNode additionalChild = null;
+            for (ChildNode child : original.childrenByName.values()) {
+                this.childrenByUuid.put(child.getUuid(), child);
+                if (beforeChild.equals(child.getSegment())) {
+                    Path.Segment segment = pathFactory.createSegment(additionalChildName, snsIndex++);
+                    additionalChild = new ChildNode(childUuid, segment);
+                    childrenByName.put(child.getName(), additionalChild);
+                    found = true;
+                }
+                
+                if (found &&(child.getName().equals(additionalChildName))) {
+                    Path.Segment newSegment = pathFactory.createSegment(additionalChildName, snsIndex++);
+                    childrenByName.put(child.getName(), child.with(newSegment));
+                }
+                else {
+                    childrenByName.put(child.getName(), child);
+                }
+            }
+            
+            assert additionalChild != null;
+            this.childrenByUuid.put(childUuid, additionalChild);
     }
 
     /**

Modified: trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/cache/ImmutableNodeInfo.java
===================================================================
--- trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/cache/ImmutableNodeInfo.java	2009-05-29 21:22:01 UTC (rev 954)
+++ trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/cache/ImmutableNodeInfo.java	2009-06-02 19:30:41 UTC (rev 955)
@@ -199,4 +199,8 @@
     public boolean isModified() {
         return false;
     }
+
+    public String toString() {
+        return this.uuid + " (" + primaryTypeName + ") {" + properties + "}"; 
+    }
 }

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	2009-05-29 21:22:01 UTC (rev 954)
+++ trunk/dna-jcr/src/test/java/org/jboss/dna/jcr/JcrTckTest.java	2009-06-02 19:30:41 UTC (rev 955)
@@ -35,6 +35,7 @@
 import org.apache.jackrabbit.test.api.NodeCanAddMixinTest;
 import org.apache.jackrabbit.test.api.NodeItemIsModifiedTest;
 import org.apache.jackrabbit.test.api.NodeItemIsNewTest;
+import org.apache.jackrabbit.test.api.NodeOrderableChildNodesTest;
 import org.apache.jackrabbit.test.api.NodeRemoveMixinTest;
 import org.apache.jackrabbit.test.api.PropertyItemIsModifiedTest;
 import org.apache.jackrabbit.test.api.PropertyItemIsNewTest;
@@ -181,7 +182,7 @@
             addTestSuite(SessionUUIDTest.class);
             // addTestSuite(NodeTest.class);
             // addTestSuite(NodeUUIDTest.class);
-            // addTestSuite(NodeOrderableChildNodesTest.class);
+            addTestSuite(NodeOrderableChildNodesTest.class);
             addTestSuite(PropertyTest.class);
 
             addTestSuite(SetValueBinaryTest.class);

Modified: trunk/extensions/dna-connector-federation/src/main/java/org/jboss/dna/connector/federation/FederatingRequestProcessor.java
===================================================================
--- trunk/extensions/dna-connector-federation/src/main/java/org/jboss/dna/connector/federation/FederatingRequestProcessor.java	2009-05-29 21:22:01 UTC (rev 954)
+++ trunk/extensions/dna-connector-federation/src/main/java/org/jboss/dna/connector/federation/FederatingRequestProcessor.java	2009-06-02 19:30:41 UTC (rev 955)
@@ -408,12 +408,15 @@
                                                                                                             intoProjection.projection.getRules());
             request.setError(new UnsupportedRequestException(msg));
         }
+        SingleProjection beforeProjection = request.before() != null ? asSingleProjection(workspace, request.before(), request) : null;
 
+        
         // Push down the request ...
         Location fromLocation = Location.create(fromProjection.pathInSource);
         Location intoLocation = Location.create(intoProjection.pathInSource);
+        Location beforeLocation = beforeProjection != null ? Location.create(beforeProjection.pathInSource) : null;
         String workspaceName = fromProjection.projection.getWorkspaceName();
-        MoveBranchRequest sourceRequest = new MoveBranchRequest(fromLocation, intoLocation, workspaceName, request.desiredName(),
+        MoveBranchRequest sourceRequest = new MoveBranchRequest(fromLocation, intoLocation, beforeLocation, workspaceName, request.desiredName(),
                                                                 request.conflictBehavior());
         execute(sourceRequest, fromProjection.projection);
 

Modified: trunk/extensions/dna-connector-jbosscache/src/main/java/org/jboss/dna/connector/jbosscache/JBossCacheRequestProcessor.java
===================================================================
--- trunk/extensions/dna-connector-jbosscache/src/main/java/org/jboss/dna/connector/jbosscache/JBossCacheRequestProcessor.java	2009-05-29 21:22:01 UTC (rev 954)
+++ trunk/extensions/dna-connector-jbosscache/src/main/java/org/jboss/dna/connector/jbosscache/JBossCacheRequestProcessor.java	2009-06-02 19:30:41 UTC (rev 955)
@@ -163,7 +163,7 @@
         // Update the children to account for same-name siblings.
         // This not only updates the FQN of the child nodes, but it also sets the property that stores the
         // the array of Path.Segment for the children (since the cache doesn't maintain order).
-        Path.Segment newSegment = updateChildList(cache, parentNode, request.named(), getExecutionContext(), true);
+        Path.Segment newSegment = updateChildList(cache, parentNode, request.named(), null, getExecutionContext(), true);
         Node<Name, Object> node = parentNode.addChild(Fqn.fromElements(newSegment));
         assert checkChildren(parentNode);
 
@@ -244,6 +244,7 @@
                                            node,
                                            newParent,
                                            desiredName,
+                                           null,
                                            true,
                                            useSameUuids,
                                            newNodeUuid,
@@ -286,13 +287,32 @@
         Path nodePath = request.from().getPath();
         Node<Name, Object> node = getNode(request, cache, nodePath);
         if (node == null) return;
-        Path newParentPath = request.into().getPath();
+        Path newParentPath;
+
+        if (request.into() != null) {
+            newParentPath = request.into().getPath();
+        } else {
+            // into() and before() can't both be null
+            assert request.before() != null;
+            newParentPath = request.before().getPath().getParent();
+        }
+
+        Path.Segment beforeNodeName = request.before() != null ? request.before().getPath().getLastSegment() : null;
         Node<Name, Object> newParent = getNode(request, cache, newParentPath);
         if (newParent == null) return;
 
         // Copy the branch and use the same UUIDs ...
         Name desiredName = request.desiredName();
-        Path.Segment newSegment = copyNode(cache, node, newParent, desiredName, true, true, null, null, getExecutionContext());
+        Path.Segment newSegment = copyNode(cache,
+                                           node,
+                                           newParent,
+                                           desiredName,
+                                           beforeNodeName,
+                                           true,
+                                           true,
+                                           null,
+                                           null,
+                                           getExecutionContext());
 
         // Now delete the old node ...
         Node<Name, Object> oldParent = node.getParent();
@@ -415,7 +435,7 @@
 
         // Loop over each child and copy it ...
         for (Node<Name, Object> child : fromRoot.getChildren()) {
-            copyNode(intoCache, child, intoRoot, null, true, true, null, null, context);
+            copyNode(intoCache, child, intoRoot, null, null, true, true, null, null, context);
         }
 
         // Copy the list of child segments in the root (this maintains the order of the children) ...
@@ -518,10 +538,24 @@
 
     }
 
+    /**
+     * @param newCache the cache into which the node is to be copied
+     * @param original the node to be copied
+     * @param newParent the new parent of the node to be copied
+     * @param desiredName the desired name of the node in the new location
+     * @param beforeNodeName the node before which the new node should be placed
+     * @param recursive if this is a deep copy
+     * @param reuseOriginalUuids indicates whether the original UUIDs should be used for the copies or new UUIDs should be used
+     * @param uuidForCopyOfOriginal pre-determined UUID for copy of node; ignored if reuseOriginalUuids is true
+     * @param count the count of nodes affected by the operation
+     * @param context the execution context that provides the path factory to be used to create the new path name
+     * @return the path segment that identifies the new node under its new parent
+     */
     protected Path.Segment copyNode( Cache<Name, Object> newCache,
                                      Node<Name, Object> original,
                                      Node<Name, Object> newParent,
                                      Name desiredName,
+                                     Path.Segment beforeNodeName,
                                      boolean recursive,
                                      boolean reuseOriginalUuids,
                                      UUID uuidForCopyOfOriginal,
@@ -530,13 +564,12 @@
         assert original != null;
         assert newParent != null;
         // Get or create the new node ...
-        Path.Segment name = desiredName != null ? context.getValueFactories().getPathFactory().createSegment(desiredName) : (Path.Segment)original.getFqn()
-                                                                                                                                                  .getLastElement();
+        Path.Segment name = desiredName != null ? context.getValueFactories().getPathFactory().createSegment(desiredName) : (Path.Segment)original.getFqn().getLastElement();
 
         // Update the children to account for same-name siblings.
         // This not only updates the FQN of the child nodes, but it also sets the property that stores the
         // the array of Path.Segment for the children (since the cache doesn't maintain order).
-        Path.Segment newSegment = updateChildList(newCache, newParent, name.getName(), context, true);
+        Path.Segment newSegment = updateChildList(newCache, newParent, name.getName(), beforeNodeName, context, true);
         Node<Name, Object> copy = newParent.addChild(getFullyQualifiedName(newSegment));
         assert checkChildren(newParent);
         // Copy the properties ...
@@ -553,7 +586,7 @@
         if (recursive) {
             // Loop over each child and call this method ...
             for (Node<Name, Object> child : original.getChildren()) {
-                copyNode(newCache, child, copy, null, true, reuseOriginalUuids, null, count, context);
+                copyNode(newCache, child, copy, null, null, true, reuseOriginalUuids, null, count, context);
             }
         }
         return newSegment;
@@ -569,6 +602,8 @@
      * @param parent the parent node; may not be null
      * @param changedName the name that should be compared to the existing node siblings to determine whether the same-name
      *        sibling indexes should be updated; may not be null
+     * @param beforeNodeName the name of the node before which this node should be placed; null indicates that this node should be
+     *        added as the last child under the node
      * @param context the execution context; may not be null
      * @param addChildWithName true if a new child with the supplied name is to be added to the children (but which does not yet
      *        exist in the node's children)
@@ -577,6 +612,7 @@
     protected Path.Segment updateChildList( Cache<Name, Object> cache,
                                             Node<Name, Object> parent,
                                             Name changedName,
+                                            Path.Segment beforeNodeName,
                                             ExecutionContext context,
                                             boolean addChildWithName ) {
         assert parent != null;
@@ -589,14 +625,25 @@
         List<ChildInfo> childrenWithChangedName = new LinkedList<ChildInfo>();
         Path.Segment[] childNames = (Path.Segment[])parent.get(JBossCacheLexicon.CHILD_PATH_SEGMENT_LIST);
         int index = 0;
+        int snsIndex = 0;
+        boolean foundBeforeNode = false;
         if (childNames != null) {
             for (Path.Segment childName : childNames) {
+                if (childName.equals(beforeNodeName)) {
+                    foundBeforeNode = true;
+                    // And add a child info for the new node ...
+                    ChildInfo info = new ChildInfo(null, snsIndex++);
+                    childrenWithChangedName.add(info);
+                }
                 if (childName.getName().equals(changedName)) {
-                    ChildInfo info = new ChildInfo(childName, index);
+                    ChildInfo info = new ChildInfo(childName, snsIndex);
                     childrenWithChangedName.add(info);
                 }
-                index++;
+                
+                snsIndex++;
+                if (!foundBeforeNode) index++;
             }
+            
         }
         if (addChildWithName) {
             // Make room for the new child at the end of the array ...
@@ -605,15 +652,22 @@
             } else {
                 int numExisting = childNames.length;
                 Path.Segment[] newChildNames = new Path.Segment[numExisting + 1];
-                System.arraycopy(childNames, 0, newChildNames, 0, numExisting);
+                System.arraycopy(childNames, 0, newChildNames, 0, index);
+
+                if (index != numExisting) {
+                    System.arraycopy(childNames, index, newChildNames, index + 1, numExisting - index);
+                }
                 childNames = newChildNames;
             }
 
-            // And add a child info for the new node ...
-            ChildInfo info = new ChildInfo(null, index);
-            childrenWithChangedName.add(info);
+            if (!foundBeforeNode) {
+                // Make sure that we add a record for the new node if it hasn't previously been added
+                ChildInfo info = new ChildInfo(null, index);
+                childrenWithChangedName.add(info);
+                
+            }
             Path.Segment newSegment = context.getValueFactories().getPathFactory().createSegment(changedName);
-            childNames[index++] = newSegment;
+            childNames[index] = newSegment;
         }
         assert childNames != null;
 
@@ -657,7 +711,7 @@
 
         if (addChildWithName) {
             // Return the segment for the new node ...
-            return childNames[childNames.length - 1];
+            return childNames[index];
         }
         return null;
     }
@@ -706,9 +760,8 @@
                     // don't copy ...
                 } else {
                     // Append an updated segment ...
-                    Path.Segment newSegment = context.getValueFactories()
-                                                     .getPathFactory()
-                                                     .createSegment(childName.getName(), childName.getIndex() - 1);
+                    Path.Segment newSegment = context.getValueFactories().getPathFactory().createSegment(childName.getName(),
+                                                                                                         childName.getIndex() - 1);
                     newChildNames[index] = newSegment;
                     // Replace the child with the correct FQN ...
                     changeNodeName(cache, parent, childName, newSegment, context);
@@ -753,6 +806,10 @@
             this.segment = childSegment;
             this.childIndex = childIndex;
         }
+        
+        public String toString() {
+            return (segment != null ? segment.getString() : "null") + "@" + childIndex; 
+        }
 
     }
 

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	2009-05-29 21:22:01 UTC (rev 954)
+++ trunk/extensions/dna-connector-store-jpa/src/main/java/org/jboss/dna/connector/store/jpa/model/basic/BasicRequestProcessor.java	2009-06-02 19:30:41 UTC (rev 955)
@@ -1360,6 +1360,7 @@
      * 
      * @see org.jboss.dna.graph.request.processor.RequestProcessor#process(org.jboss.dna.graph.request.MoveBranchRequest)
      */
+    @SuppressWarnings( "unchecked" )
     @Override
     public void process( MoveBranchRequest request ) {
         logger.trace(request.toString());
@@ -1390,6 +1391,20 @@
 
             // Find the actual new location ...
             Location toLocation = request.into();
+            Location beforeLocation = request.before();
+
+            if (beforeLocation != null) {
+                if (beforeLocation.hasPath()) {
+                    toLocation = Location.create(beforeLocation.getPath().getParent());
+                } else {
+                    ActualLocation actualBeforeLocation = getActualLocation(workspaceId, beforeLocation);
+
+                    // Ensure that the beforeLocation has a path - actualBeforeLocation has a path
+                    beforeLocation = actualBeforeLocation.location;
+                    toLocation = Location.create(actualBeforeLocation.location.getPath().getParent());
+                }
+            }
+
             String toUuidString = null;
             if (request.hasNoEffect()) {
                 actualNewLocation = actualOldLocation;
@@ -1416,28 +1431,69 @@
                         ns = fromEntity.getChildNamespace();
                     }
 
-                    // Find the largest SNS index in the existing ChildEntity objects with the same name ...
-                    Query query = entities.createNamedQuery("ChildEntity.findMaximumSnsIndex");
-                    query.setParameter("workspaceId", workspaceId);
-                    query.setParameter("parentUuid", toUuidString);
-                    query.setParameter("ns", ns.getId());
-                    query.setParameter("childName", childLocalName);
                     int nextSnsIndex = 1;
-                    try {
-                        Integer index = (Integer)query.getSingleResult();
-                        if (index != null) nextSnsIndex = index.intValue() + 1;
-                    } catch (NoResultException e) {
-                    }
+                    int nextIndexInParent = 1;
+                    if (beforeLocation == null) {
+                        // Find the largest SNS index in the existing ChildEntity objects with the same name ...
+                        Query query = entities.createNamedQuery("ChildEntity.findMaximumSnsIndex");
+                        query.setParameter("workspaceId", workspaceId);
+                        query.setParameter("parentUuid", toUuidString);
+                        query.setParameter("ns", ns.getId());
+                        query.setParameter("childName", childLocalName);
+                        try {
+                            Integer index = (Integer)query.getSingleResult();
+                            if (index != null) nextSnsIndex = index.intValue() + 1;
+                        } catch (NoResultException e) {
+                        }
 
-                    // Find the largest child index in the existing ChildEntity objects ...
-                    query = entities.createNamedQuery("ChildEntity.findMaximumChildIndex");
-                    query.setParameter("workspaceId", workspaceId);
-                    query.setParameter("parentUuid", toUuidString);
-                    int nextIndexInParent = 1;
-                    try {
-                        Integer index = (Integer)query.getSingleResult();
-                        if (index != null) nextIndexInParent = index + 1;
-                    } catch (NoResultException e) {
+                        // Find the largest child index in the existing ChildEntity objects ...
+                        query = entities.createNamedQuery("ChildEntity.findMaximumChildIndex");
+                        query.setParameter("workspaceId", workspaceId);
+                        query.setParameter("parentUuid", toUuidString);
+                        try {
+                            Integer index = (Integer)query.getSingleResult();
+                            if (index != null) nextIndexInParent = index + 1;
+                        } catch (NoResultException e) {
+                        }
+                    } else {
+                        /*
+                         * This is a sub-optimal approach, particularly for inserts to the front
+                         * of a long list of child nodes, but it guarantees that we won't have
+                         * the JPA-cached entities and the database out of sync.
+                         */
+
+                        Query query = entities.createNamedQuery("ChildEntity.findAllUnderParent");
+                        query.setParameter("workspaceId", workspaceId);
+                        query.setParameter("parentUuidString", toUuidString);
+                        try {
+                            List<ChildEntity> children = query.getResultList();
+                            Path beforePath = beforeLocation.getPath();
+                            Path.Segment beforeSegment = beforePath.getLastSegment();
+
+                            boolean foundBefore = false;
+                            for (ChildEntity child : children) {
+                                NamespaceEntity namespace = child.getChildNamespace();
+                                if (namespace.getUri().equals(ns.getUri())
+                                    && child.getChildName().equals(childLocalName)
+                                    && child.getSameNameSiblingIndex() == beforeSegment.getIndex()) {
+                                    foundBefore = true;
+                                    nextIndexInParent = child.getIndexInParent();
+                                    nextSnsIndex = beforeSegment.getIndex();                                    
+                                }
+
+                                if (foundBefore) {
+                                    child.setIndexInParent(child.getIndexInParent() + 1);
+                                    if (child.getChildName().equals(childLocalName)
+                                        && namespace.getUri().equals(ns.getUri())) {
+                                        child.setSameNameSiblingIndex(child.getSameNameSiblingIndex() + 1);
+                                    }
+                                    entities.persist(child);
+                                }
+                            }
+
+                        } catch (NoResultException e) {
+                        }
+
                     }
 
                     ChildId movedId = new ChildId(workspaceId, toUuidString, fromUuidString);



From dna-commits at lists.jboss.org  Tue Jun  2 15:52:50 2009
From: dna-commits at lists.jboss.org (dna-commits at lists.jboss.org)
Date: Tue, 02 Jun 2009 15:52:50 -0400
Subject: [dna-commits] DNA SVN: r956 - in trunk/dna-jcr/src/main:
	resources/org/jboss/dna/jcr and 1 other directory.
Message-ID: <E1MBa2U-0002tP-Gm@committer01.frg.pub.inap.atl.jboss.com>

Author: bcarothers
Date: 2009-06-02 15:52:50 -0400 (Tue, 02 Jun 2009)
New Revision: 956

Modified:
   trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/AbstractJcrNode.java
   trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/JcrI18n.java
   trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/JcrRepository.java
   trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/JcrSession.java
   trunk/dna-jcr/src/main/resources/org/jboss/dna/jcr/JcrI18n.properties
Log:
DNA-370 JcrWorkspace.clone Is Not Implemented

Committed changes to AbstractJcrNode.getCorrespondingNodePath(String) and .update(String) to handle error checking as per spec.


Modified: trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/AbstractJcrNode.java
===================================================================
--- trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/AbstractJcrNode.java	2009-06-02 19:30:41 UTC (rev 955)
+++ trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/AbstractJcrNode.java	2009-06-02 19:52:50 UTC (rev 956)
@@ -25,6 +25,7 @@
 
 import java.io.InputStream;
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.Calendar;
 import java.util.Collection;
 import java.util.Collections;
@@ -40,6 +41,7 @@
 import javax.jcr.ItemExistsException;
 import javax.jcr.ItemNotFoundException;
 import javax.jcr.ItemVisitor;
+import javax.jcr.NoSuchWorkspaceException;
 import javax.jcr.Node;
 import javax.jcr.NodeIterator;
 import javax.jcr.PathNotFoundException;
@@ -99,7 +101,7 @@
     final UUID internalUuid() {
         return nodeUuid;
     }
-    
+
     final Name name() throws RepositoryException {
         return cache.getNameOf(nodeUuid);
     }
@@ -711,8 +713,7 @@
                 JcrNodeDefinition match = this.cache.nodeTypes().findChildNodeDefinition(mixinCandidateType.getInternalName(),
                                                                                          Collections.<Name>emptyList(),
                                                                                          nodeName,
-                                                                                         childNode.getPrimaryNodeType()
-                                                                                                  .getInternalName(),
+                                                                                         childNode.getPrimaryNodeType().getInternalName(),
                                                                                          snsCount,
                                                                                          false);
 
@@ -996,11 +997,21 @@
     /**
      * {@inheritDoc}
      * 
-     * @throws UnsupportedOperationException always
      * @see javax.jcr.Node#update(java.lang.String)
      */
-    public final void update( String srcWorkspaceName ) {
-        throw new UnsupportedOperationException();
+    public final void update( String srcWorkspaceName ) throws NoSuchWorkspaceException, RepositoryException {
+        String[] workspaces = this.session().workspace().getAccessibleWorkspaceNames();
+
+        if (!Arrays.asList(workspaces).contains(srcWorkspaceName)) {
+            JcrRepository repo = session().repository();
+            throw new NoSuchWorkspaceException(JcrI18n.workspaceNameIsInvalid.text(srcWorkspaceName, repo.getName()));
+        }
+
+        if (session().hasPendingChanges()) {
+            throw new InvalidItemStateException(JcrI18n.noPendingChangesAllowed.text());
+        }
+        
+        if (true) throw new UnsupportedOperationException();
     }
 
     protected final Property removeExistingValuedProperty( String name ) throws ConstraintViolationException, RepositoryException {
@@ -1363,10 +1374,19 @@
     /**
      * {@inheritDoc}
      * 
-     * @throws UnsupportedOperationException always
      * @see javax.jcr.Node#getCorrespondingNodePath(java.lang.String)
      */
-    public final String getCorrespondingNodePath( String workspaceName ) {
+    public final String getCorrespondingNodePath( String workspaceName ) throws NoSuchWorkspaceException, RepositoryException {
+        
+        String[] workspaces = this.session().workspace().getAccessibleWorkspaceNames();
+
+        if (!Arrays.asList(workspaces).contains(workspaceName)) {
+            JcrRepository repo = session().repository();
+            throw new NoSuchWorkspaceException(JcrI18n.workspaceNameIsInvalid.text(workspaceName, repo.getName()));
+        }
+
+        // TODO:Check permissions on workspace
+        
         throw new UnsupportedOperationException();
     }
 
@@ -1473,7 +1493,7 @@
             if (destPath.isAbsolute() || destPath.size() != 1) {
                 throw new ItemNotFoundException();
             }
-            
+
             destSegment = destPath.getLastSegment();
 
             // getLastSegment should return the only segment, since we verified that size() == 1
@@ -1483,7 +1503,7 @@
                 throw new ItemNotFoundException(JcrI18n.pathNotFound.text(destPath, workspaceName));
             }
         }
-        
+
         this.editor().orderChildBefore(sourceSegment, destSegment);
 
     }
@@ -1565,17 +1585,16 @@
 
     @Override
     public String toString() {
-        
+
         try {
             PropertyIterator iter = this.getProperties();
             StringBuffer propertyBuff = new StringBuffer();
             while (iter.hasNext()) {
-                AbstractJcrProperty prop = (AbstractJcrProperty) iter.nextProperty();
+                AbstractJcrProperty prop = (AbstractJcrProperty)iter.nextProperty();
                 propertyBuff.append(prop.toString()).append(", ");
             }
             return this.getPath() + " {" + propertyBuff.toString() + "}";
-        }
-        catch (RepositoryException re) {
+        } catch (RepositoryException re) {
             return re.getMessage();
         }
     }

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	2009-06-02 19:30:41 UTC (rev 955)
+++ trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/JcrI18n.java	2009-06-02 19:52:50 UTC (rev 956)
@@ -136,6 +136,7 @@
     public static I18n allNodeTypeTemplatesMustComeFromSameSession;
 
     public static I18n nodeNotReferenceable;
+    public static I18n noPendingChangesAllowed;
 
     static {
         try {

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	2009-06-02 19:30:41 UTC (rev 955)
+++ trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/JcrRepository.java	2009-06-02 19:52:50 UTC (rev 956)
@@ -415,4 +415,13 @@
         JcrWorkspace workspace = new JcrWorkspace(this, workspaceName, execContext, sessionAttributes);
         return workspace.getSession();
     }
+
+    /**
+     * Returns the name of this repository
+     * @return the name of this repository
+     * @see #sourceName
+     */
+    String getName() {
+        return this.sourceName;
+    }
 }

Modified: trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/JcrSession.java
===================================================================
--- trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/JcrSession.java	2009-06-02 19:30:41 UTC (rev 955)
+++ trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/JcrSession.java	2009-06-02 19:52:50 UTC (rev 956)
@@ -210,6 +210,10 @@
         return this.workspace;
     }
 
+    JcrRepository repository() {
+        return this.repository;
+    }
+
     Graph.Batch createBatch() {
         return graph.batch();
     }

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	2009-06-02 19:30:41 UTC (rev 955)
+++ trunk/dna-jcr/src/main/resources/org/jboss/dna/jcr/JcrI18n.properties	2009-06-02 19:52:50 UTC (rev 956)
@@ -120,4 +120,5 @@
 
 allNodeTypeTemplatesMustComeFromSameSession=All node type templates must be created from the same javax.jcr.Session
 
-nodeNotReferenceable=Only referenceable nodes may be the value of reference properties.
\ No newline at end of file
+nodeNotReferenceable=Only referenceable nodes may be the value of reference properties
+noPendingChangesAllowed=This operation cannot be performed when the session has pending changes
\ No newline at end of file



From dna-commits at lists.jboss.org  Tue Jun  2 16:15:57 2009
From: dna-commits at lists.jboss.org (dna-commits at lists.jboss.org)
Date: Tue, 02 Jun 2009 16:15:57 -0400
Subject: [dna-commits] DNA SVN: r957 -
	trunk/dna-jcr/src/test/java/org/jboss/dna/jcr.
Message-ID: <E1MBaOr-00045B-EW@committer01.frg.pub.inap.atl.jboss.com>

Author: bcarothers
Date: 2009-06-02 16:15:57 -0400 (Tue, 02 Jun 2009)
New Revision: 957

Modified:
   trunk/dna-jcr/src/test/java/org/jboss/dna/jcr/AbstractJcrNodeTest.java
Log:
DNA-370 JcrWorkspace.clone Is Not Implemented

Removed two test cases from AbstractJcrNodeTest that can no longer be readily executed without setting up a session (and are duplicative of testing functionality in JcrTckTest).

Modified: trunk/dna-jcr/src/test/java/org/jboss/dna/jcr/AbstractJcrNodeTest.java
===================================================================
--- trunk/dna-jcr/src/test/java/org/jboss/dna/jcr/AbstractJcrNodeTest.java	2009-06-02 19:52:50 UTC (rev 956)
+++ trunk/dna-jcr/src/test/java/org/jboss/dna/jcr/AbstractJcrNodeTest.java	2009-06-02 20:15:57 UTC (rev 957)
@@ -32,6 +32,7 @@
 import javax.jcr.Item;
 import javax.jcr.ItemNotFoundException;
 import javax.jcr.ItemVisitor;
+import javax.jcr.NoSuchWorkspaceException;
 import javax.jcr.Node;
 import javax.jcr.NodeIterator;
 import javax.jcr.PathNotFoundException;
@@ -255,11 +256,6 @@
         node.getBaseVersion();
     }
 
-    @Test( expected = UnsupportedOperationException.class )
-    public void shouldNotAllowGetCorrespondingNodePath() throws Exception {
-        node.getCorrespondingNodePath(null);
-    }
-
     @Test( expected = UnsupportedRepositoryOperationException.class )
     public void shoudNotAllowGetLock() throws Exception {
         node.getLock();
@@ -718,8 +714,4 @@
         node.unlock();
     }
 
-    @Test( expected = UnsupportedOperationException.class )
-    public void shouldNotAllowUpdate() throws Exception {
-        node.update(null);
-    }
 }



From dna-commits at lists.jboss.org  Tue Jun  2 20:30:50 2009
From: dna-commits at lists.jboss.org (dna-commits at lists.jboss.org)
Date: Tue, 02 Jun 2009 20:30:50 -0400
Subject: [dna-commits] DNA SVN:  r958 - trunk.
Message-ID: <E1MBeNW-0007IH-E9@committer01.frg.pub.inap.atl.jboss.com>

Author: bcarothers
Date: 2009-06-02 20:30:50 -0400 (Tue, 02 Jun 2009)
New Revision: 958

Modified:
   trunk/pom.xml
Log:
Added REST subprojects to build

Modified: trunk/pom.xml
===================================================================
--- trunk/pom.xml	2009-06-02 20:15:57 UTC (rev 957)
+++ trunk/pom.xml	2009-06-03 00:30:50 UTC (rev 958)
@@ -143,6 +143,8 @@
 		<module>extensions/dna-mimetype-detector-aperture</module>
 		<module>extensions/dna-common-jdbc</module> 
 		<module>extensions/dna-connector-jdbc-metadata</module> 
+		<module>extensions/dna-web-jcr-rest</module> 
+		<module>extensions/dna-web-jcr-rest-war</module> 
 		<module>dna-integration-tests</module>
 		<!--module>docs/examples/gettingstarted</module-->
 	</modules>



From dna-commits at lists.jboss.org  Tue Jun  2 21:41:22 2009
From: dna-commits at lists.jboss.org (dna-commits at lists.jboss.org)
Date: Tue, 02 Jun 2009 21:41:22 -0400
Subject: [dna-commits] DNA SVN:  r959 - trunk/extensions/dna-web-jcr-rest.
Message-ID: <E1MBfTm-0001tJ-Bf@committer01.frg.pub.inap.atl.jboss.com>

Author: bcarothers
Date: 2009-06-02 21:41:22 -0400 (Tue, 02 Jun 2009)
New Revision: 959

Modified:
   trunk/extensions/dna-web-jcr-rest/pom.xml
Log:
Renamed POM to avoid duplication of name with -war subproject

Modified: trunk/extensions/dna-web-jcr-rest/pom.xml
===================================================================
--- trunk/extensions/dna-web-jcr-rest/pom.xml	2009-06-03 00:30:50 UTC (rev 958)
+++ trunk/extensions/dna-web-jcr-rest/pom.xml	2009-06-03 01:41:22 UTC (rev 959)
@@ -9,8 +9,8 @@
 	</parent>
 	<artifactId>dna-web-jcr-rest</artifactId>
 	<packaging>jar</packaging>
-	<name>JBoss DNA JCR REST Servlet</name>
-	<description>JBoss DNA servlet that provides RESTful access to JCR items</description>
+	<name>JBoss DNA JCR REST Library</name>
+	<description>JBoss DNA REST support library</description>
 	<url>http://labs.jboss.org/dna</url>
 	<dependencies>
 		<dependency>



From dna-commits at lists.jboss.org  Wed Jun  3 05:58:15 2009
From: dna-commits at lists.jboss.org (dna-commits at lists.jboss.org)
Date: Wed, 03 Jun 2009 05:58:15 -0400
Subject: [dna-commits] DNA SVN: r960 -
	trunk/extensions/dna-web-jcr-rest-war/src/test/resources.
Message-ID: <E1MBnEd-0006pX-Ji@committer01.frg.pub.inap.atl.jboss.com>

Author: bcarothers
Date: 2009-06-03 05:58:15 -0400 (Wed, 03 Jun 2009)
New Revision: 960

Modified:
   trunk/extensions/dna-web-jcr-rest-war/src/test/resources/log4j.properties
Log:
Added verbosity to log4j.properties to help determine why nightly build failed

Modified: trunk/extensions/dna-web-jcr-rest-war/src/test/resources/log4j.properties
===================================================================
--- trunk/extensions/dna-web-jcr-rest-war/src/test/resources/log4j.properties	2009-06-03 01:41:22 UTC (rev 959)
+++ trunk/extensions/dna-web-jcr-rest-war/src/test/resources/log4j.properties	2009-06-03 09:58:15 UTC (rev 960)
@@ -10,4 +10,4 @@
 log4j.appender.stdout.Threshold = DEBUG
 log4j.appender.stdout.Target   = System.out
 log4j.appender.stdout.layout = org.apache.log4j.PatternLayout
-log4j.appender.stdout.layout.ConversionPattern = [%-5p] [%C{1}] : %m%n
+log4j.appender.stdout.layout.ConversionPattern = [%-5p] [%C] : %m%n



From dna-commits at lists.jboss.org  Wed Jun  3 06:01:29 2009
From: dna-commits at lists.jboss.org (dna-commits at lists.jboss.org)
Date: Wed, 03 Jun 2009 06:01:29 -0400
Subject: [dna-commits] DNA SVN: r961 -
	trunk/extensions/dna-web-jcr-rest-war/src/test/resources.
Message-ID: <E1MBnHl-0006vk-Un@committer01.frg.pub.inap.atl.jboss.com>

Author: bcarothers
Date: 2009-06-03 06:01:29 -0400 (Wed, 03 Jun 2009)
New Revision: 961

Modified:
   trunk/extensions/dna-web-jcr-rest-war/src/test/resources/log4j.properties
Log:
Added more verbosity

Modified: trunk/extensions/dna-web-jcr-rest-war/src/test/resources/log4j.properties
===================================================================
--- trunk/extensions/dna-web-jcr-rest-war/src/test/resources/log4j.properties	2009-06-03 09:58:15 UTC (rev 960)
+++ trunk/extensions/dna-web-jcr-rest-war/src/test/resources/log4j.properties	2009-06-03 10:01:29 UTC (rev 961)
@@ -10,4 +10,4 @@
 log4j.appender.stdout.Threshold = DEBUG
 log4j.appender.stdout.Target   = System.out
 log4j.appender.stdout.layout = org.apache.log4j.PatternLayout
-log4j.appender.stdout.layout.ConversionPattern = [%-5p] [%C] : %m%n
+log4j.appender.stdout.layout.ConversionPattern = [%-5p] [%C] : %m%n [%F:%L]



From dna-commits at lists.jboss.org  Wed Jun  3 09:38:10 2009
From: dna-commits at lists.jboss.org (dna-commits at lists.jboss.org)
Date: Wed, 03 Jun 2009 09:38:10 -0400
Subject: [dna-commits] DNA SVN: r962 -
	trunk/extensions/dna-web-jcr-rest-war/src/main/webapp/WEB-INF.
Message-ID: <E1MBqfS-0007mO-I7@committer01.frg.pub.inap.atl.jboss.com>

Author: bcarothers
Date: 2009-06-03 09:38:10 -0400 (Wed, 03 Jun 2009)
New Revision: 962

Modified:
   trunk/extensions/dna-web-jcr-rest-war/src/main/webapp/WEB-INF/web.xml
Log:
Changed context parameter to avoid deprecation warning

Modified: trunk/extensions/dna-web-jcr-rest-war/src/main/webapp/WEB-INF/web.xml
===================================================================
--- trunk/extensions/dna-web-jcr-rest-war/src/main/webapp/WEB-INF/web.xml	2009-06-03 10:01:29 UTC (rev 961)
+++ trunk/extensions/dna-web-jcr-rest-war/src/main/webapp/WEB-INF/web.xml	2009-06-03 13:38:10 UTC (rev 962)
@@ -36,7 +36,7 @@
 	</context-param>
 
 	<context-param>
-		<param-name>javax.ws.rs.core.Application</param-name>
+		<param-name>javax.ws.rs.Application</param-name>
 		<param-value>org.jboss.dna.web.jcr.rest.JcrApplication</param-value>
 	</context-param>
 



From dna-commits at lists.jboss.org  Wed Jun  3 10:19:41 2009
From: dna-commits at lists.jboss.org (dna-commits at lists.jboss.org)
Date: Wed, 03 Jun 2009 10:19:41 -0400
Subject: [dna-commits] DNA SVN:  r963 - trunk/extensions/dna-web-jcr-rest.
Message-ID: <E1MBrJd-0001K1-Cs@committer01.frg.pub.inap.atl.jboss.com>

Author: bcarothers
Date: 2009-06-03 10:19:41 -0400 (Wed, 03 Jun 2009)
New Revision: 963

Modified:
   trunk/extensions/dna-web-jcr-rest/pom.xml
Log:
Overrode RESTEasy JAXB Provider default dependency to use jaxb-impl 2.1.9 since 2.1.8 is no longer in the JBoss Maven repository.

Modified: trunk/extensions/dna-web-jcr-rest/pom.xml
===================================================================
--- trunk/extensions/dna-web-jcr-rest/pom.xml	2009-06-03 13:38:10 UTC (rev 962)
+++ trunk/extensions/dna-web-jcr-rest/pom.xml	2009-06-03 14:19:41 UTC (rev 963)
@@ -22,12 +22,23 @@
 			<groupId>org.jboss.resteasy</groupId>
 			<artifactId>resteasy-jaxb-provider</artifactId>
 			<version>1.1-RC2</version>
-			<!-- 
-			<scope>runtime, integration-test</scope>
- -->
+			<exclusions>
+				<exclusion>
+					<groupId>com.sun.xml.bind</groupId>
+					<artifactId>jaxb-impl</artifactId>
+				</exclusion>
+			</exclusions>
 		</dependency>
 
+		<!-- This is only included as a temp. workaround.  Current release of RESTEasy depends on 2.1.8, which is not in our repo at this time 
+			This should be removed after RESTEasy 1.1GA is released and added to this pom.
+		-->
 		<dependency>
+			<groupId>com.sun.xml.bind</groupId>
+			<artifactId>jaxb-impl</artifactId>
+			<version>2.1.9</version>
+		</dependency>
+		<dependency>
 			<groupId>org.jboss.dna</groupId>
 			<artifactId>dna-jcr</artifactId>
 		</dependency>
@@ -65,5 +76,6 @@
 			<artifactId>jaxb-api</artifactId>
 			<version>2.1</version>
 		</dependency>
+
 	</dependencies>
 </project>



From dna-commits at lists.jboss.org  Wed Jun  3 13:29:22 2009
From: dna-commits at lists.jboss.org (dna-commits at lists.jboss.org)
Date: Wed, 03 Jun 2009 13:29:22 -0400
Subject: [dna-commits] DNA SVN:  r964 - trunk.
Message-ID: <E1MBuHC-0002sK-LY@committer01.frg.pub.inap.atl.jboss.com>

Author: bcarothers
Date: 2009-06-03 13:29:22 -0400 (Wed, 03 Jun 2009)
New Revision: 964

Modified:
   trunk/pom.xml
Log:
Removing REST subprojects until they pass integration tests on non-Windows platforms

Modified: trunk/pom.xml
===================================================================
--- trunk/pom.xml	2009-06-03 14:19:41 UTC (rev 963)
+++ trunk/pom.xml	2009-06-03 17:29:22 UTC (rev 964)
@@ -143,8 +143,8 @@
 		<module>extensions/dna-mimetype-detector-aperture</module>
 		<module>extensions/dna-common-jdbc</module> 
 		<module>extensions/dna-connector-jdbc-metadata</module> 
-		<module>extensions/dna-web-jcr-rest</module> 
-		<module>extensions/dna-web-jcr-rest-war</module> 
+		<!-- module>extensions/dna-web-jcr-rest</module --> 
+		<!-- module>extensions/dna-web-jcr-rest-war</module --> 
 		<module>dna-integration-tests</module>
 		<!--module>docs/examples/gettingstarted</module-->
 	</modules>



From dna-commits at lists.jboss.org  Wed Jun  3 15:55:23 2009
From: dna-commits at lists.jboss.org (dna-commits at lists.jboss.org)
Date: Wed, 03 Jun 2009 15:55:23 -0400
Subject: [dna-commits] DNA SVN: r965 - in trunk/dna-cnd/src:
	test/java/org/jboss/dna/cnd and 1 other directories.
Message-ID: <E1MBwYV-00015v-CP@committer01.frg.pub.inap.atl.jboss.com>

Author: rhauch
Date: 2009-06-03 15:55:23 -0400 (Wed, 03 Jun 2009)
New Revision: 965

Added:
   trunk/dna-cnd/src/test/resources/cnd/aircraft.cnd
   trunk/dna-cnd/src/test/resources/cnd/cars.cnd
Modified:
   trunk/dna-cnd/src/main/antlr3/org/jboss/dna/cnd/Cnd.g
   trunk/dna-cnd/src/test/java/org/jboss/dna/cnd/CndImporterTest.java
Log:
Added more test cases to the CND importer, including two that use regular expressions for the constraints

Modified: trunk/dna-cnd/src/main/antlr3/org/jboss/dna/cnd/Cnd.g
===================================================================
--- trunk/dna-cnd/src/main/antlr3/org/jboss/dna/cnd/Cnd.g	2009-06-03 17:29:22 UTC (rev 964)
+++ trunk/dna-cnd/src/main/antlr3/org/jboss/dna/cnd/Cnd.g	2009-06-03 19:55:23 UTC (rev 965)
@@ -348,8 +348,8 @@
 
 // Quoted strings may contain escaped characters.
 fragment QUOTED_STRING
-    : '"' ( EscapeSequence | ~('\\'|'"'))* '"'
-    | '\'' ( EscapeSequence | ~('\\'|'\''))* '\'' 
+    : '"' ( EscapeSequence | ~('"'))* '"'
+    | '\'' ( EscapeSequence | ~('\''))* '\'' 
     ;
 
 fragment EscapeSequence 

Modified: trunk/dna-cnd/src/test/java/org/jboss/dna/cnd/CndImporterTest.java
===================================================================
--- trunk/dna-cnd/src/test/java/org/jboss/dna/cnd/CndImporterTest.java	2009-06-03 17:29:22 UTC (rev 964)
+++ trunk/dna-cnd/src/test/java/org/jboss/dna/cnd/CndImporterTest.java	2009-06-03 19:55:23 UTC (rev 965)
@@ -101,10 +101,12 @@
         }
     }
 
-    protected Node node( String pathToNode, String childNodeName, String nameValue ) {
+    protected Node node( String pathToNode,
+                         String childNodeName,
+                         String nameValue ) {
         Node a = graph.getNodeAt("/a/" + pathToNode);
         List<Location> children = a.getChildren();
-        
+
         for (Location childLocation : a.getChildren()) {
             if (!childLocation.getPath().getLastSegment().getName().equals(name(childNodeName))) continue;
             Node child = graph.getNodeAt(childLocation);
@@ -113,7 +115,7 @@
                 return child;
             }
         }
-        
+
         return null;
     }
 
@@ -245,7 +247,8 @@
         // + * (nt:base) = nt:unstructured multiple version
         assertNodeType("nt:unstructured", NO_SUPERTYPES, NO_PRIMARY_NAME, NodeOptions.Ordered);
         assertProperty("nt:unstructured", "*", "Undefined", NO_DEFAULTS, PropertyOptions.Multiple);
-        // We should test for this, but we'd have to rewrite node() to look more like RepositoryNodeTypeManager.findChildNodeDefinition
+        // We should test for this, but we'd have to rewrite node() to look more like
+        // RepositoryNodeTypeManager.findChildNodeDefinition
         // assertProperty("nt:unstructured", "*", "Undefined", NO_DEFAULTS);
         assertChild("nt:unstructured", "*", "nt:base", "nt:unstructured", OnParentVersion.Version, ChildOptions.Multiple);
 
@@ -334,8 +337,9 @@
         // + * (nt:base) = nt:unstructured multiple version
         assertNodeType("nt:unstructured", NO_SUPERTYPES, NO_PRIMARY_NAME, NodeOptions.Ordered);
         assertProperty("nt:unstructured", "*", "Undefined", NO_DEFAULTS, PropertyOptions.Multiple);
-        // We should test for this, but we'd have to rewrite node() to look more like RepositoryNodeTypeManager.findChildNodeDefinition
-        //assertProperty("nt:unstructured", "*", "Undefined", NO_DEFAULTS);
+        // We should test for this, but we'd have to rewrite node() to look more like
+        // RepositoryNodeTypeManager.findChildNodeDefinition
+        // assertProperty("nt:unstructured", "*", "Undefined", NO_DEFAULTS);
         assertChild("nt:unstructured", "*", "nt:base", "nt:unstructured", OnParentVersion.Version, ChildOptions.Multiple);
 
         // [mix:referenceable]
@@ -428,6 +432,20 @@
         assertThat(problems.size(), is(1));
     }
 
+    @Test
+    public void shouldImportCndForAircraft() throws Exception {
+        importer.importFrom(openCndFile("aircraft.cnd"), problems);
+        if (problems.size() != 0) printProblems();
+        assertThat(problems.size(), is(0));
+    }
+
+    @Test
+    public void shouldImportCndForCars() throws Exception {
+        importer.importFrom(openCndFile("cars.cnd"), problems);
+        if (problems.size() != 0) printProblems();
+        assertThat(problems.size(), is(0));
+    }
+
     public static final String[] NO_DEFAULTS = {};
     public static final String[] NO_SUPERTYPES = {};
     public static final String[] NO_VALUE_CONSTRAINTS = {};

Added: trunk/dna-cnd/src/test/resources/cnd/aircraft.cnd
===================================================================
--- trunk/dna-cnd/src/test/resources/cnd/aircraft.cnd	                        (rev 0)
+++ trunk/dna-cnd/src/test/resources/cnd/aircraft.cnd	2009-06-03 19:55:23 UTC (rev 965)
@@ -0,0 +1,64 @@
+/*
+ * 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'>
+<air='http://jboss.org/dna/examples/aircraft/1.0'>
+
+//------------------------------------------------------------------------------
+// N O D E T Y P E S
+//------------------------------------------------------------------------------
+
+[air:Aircraft] > nt:unstructured
+  - air:maker (string)
+  - air:model (string)
+  - air:designedBy (string)
+  - air:introduced (string) < "(19|20)\d{2}"                // any 4 digit number starting with '19' or '20'
+  - air:range (string)                                      // any integer (with optional ',' every 1000s place)
+     < "\d{1,3}(,?\d{3})*\s*(nm|m|km|mi|ft)"                // followed by 'nm', 'm', 'km', 'mi', or 'ft'
+  - air:maxSpeed (string)                                   // any integer (with optional ',' every 1000s place)
+    < '\d{1,3}(,?\d{3})*\s*(kt|mph|km/h|kmph)'              // followed by 'kt', 'mph', 'km/h' or 'kmph'
+  - air:takeoffSpeed (string)                               // any integer (with optional ',' every 1000s place)
+    < '\d{1,3}(,?\d{3})*\s*(kt|mph|km/h|kmph)'              // followed by 'kt', 'mph', 'km/h' or 'kmph'
+  - air:cruiseSpeed (string)                                // any integer (with optional ',' every 1000s place)
+    < '\d{1,3}(,?\d{3})*\s*(kt|mph|km/h|kmph)'              // followed by 'kt', 'mph', 'km/h' or 'kmph'
+  - air:emptyWeight (string)                                // any integer (with optional ',' every 1000s place)
+    < '\d{1,3}(,?\d{3})*\s*(lb|kg)'                         // followed by 'lb' or 'kg'
+  - air:maxWeight (string)                                  // any integer (with optional ',' every 1000s place)
+    < '\d{1,3}(,?\d{3})*\s*(lb|kg)'                         // followed by 'lb' or 'kg'
+  - air:rateOfClimb (string)                                // any integer (with optional ',' every 1000s place)
+    < '\d{1,3}(,?\d{3})*\s*(ft|km|m)/(s|min)'               // followed by 'ft/s', 'ft/min', 'km/s', 'km/min', 'm/s', or 'm/min'
+  - air:serviceCeiling (string)                             // any integer (with optional ',' every 1000s place)
+    < '\d{1,3}(,?\d{3})*\s*(nm|m|km|mi|ft)'                 // followed by 'nm', 'm', 'km', 'mi', or 'ft'
+  - air:fuelCapacity (string)                               // any integer (with optional ',' every 1000s place)
+    < '\d{1,3}(,?\d{3})*\s*(lb|kg|gal|L)'                   // followed by 'lb', 'kg', 'gal', or 'L'
+  - air:crew (long) < '[0,)'                                // any non-negative value
+  - air:numberBuilt (string)                                // any integer (with optional ',' every 1000s place)
+    < '\d{1,3}(,?\d{3})*\s*[+]?' ,                          // optionally followed by '+'
+      '([<>]\s*)?\d{1,3}(,?\d{3})*'                         // or prefixed by '<' or '>'
+  - air:url (string)

Added: trunk/dna-cnd/src/test/resources/cnd/cars.cnd
===================================================================
--- trunk/dna-cnd/src/test/resources/cnd/cars.cnd	                        (rev 0)
+++ trunk/dna-cnd/src/test/resources/cnd/cars.cnd	2009-06-03 19:55:23 UTC (rev 965)
@@ -0,0 +1,50 @@
+/*
+ * 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'>
+<car='http://jboss.org/dna/examples/cars/1.0'>
+
+//------------------------------------------------------------------------------
+// N O D E T Y P E S
+//------------------------------------------------------------------------------
+
+[car:Car] > nt:unstructured
+  - car:maker (string)
+  - car:model (string)
+  - car:year (string) < '(19|20)\d{2}'                     // any 4 digit number starting with '19' or '20'
+  - car:msrp (string) < '[$]\d{1,3}[,]?\d{3}([.]\d{2})?'   // of the form "$X,XXX.ZZ", "$XX,XXX.ZZ" or "$XXX,XXX.ZZ" 
+                                                           // where '.ZZ' is optional
+  - car:userRating (long) < '[1,5]'                        // any value from 1 to 5 (inclusive)
+  - car:valueRating (long) < '[1,5]'                       // any value from 1 to 5 (inclusive)
+  - car:mpgCity (long) < '(0,]'                            // any value greater than 0
+  - car:mpgHighway (long) < '(0,]'                         // any value greater than 0
+  - car:lengthInInches (double) < '(0,]'                   // any value greater than 0
+  - car:wheelbaseInInches (double) < '(0,]'                // any value greater than 0
+  - car:engine (string)
+



From dna-commits at lists.jboss.org  Wed Jun  3 16:07:47 2009
From: dna-commits at lists.jboss.org (dna-commits at lists.jboss.org)
Date: Wed, 03 Jun 2009 16:07:47 -0400
Subject: [dna-commits] DNA SVN: r966 -
	trunk/dna-repository/src/main/java/org/jboss/dna/repository.
Message-ID: <E1MBwkV-0001p7-6f@committer01.frg.pub.inap.atl.jboss.com>

Author: rhauch
Date: 2009-06-03 16:07:47 -0400 (Wed, 03 Jun 2009)
New Revision: 966

Modified:
   trunk/dna-repository/src/main/java/org/jboss/dna/repository/RepositoryService.java
Log:
DNA-436 Repository example uses different path in configuration repository than assumed by RepositoryService

Changed RepositoryService to use '/jcr:system' as the default path, since that makes for better integration

Modified: trunk/dna-repository/src/main/java/org/jboss/dna/repository/RepositoryService.java
===================================================================
--- trunk/dna-repository/src/main/java/org/jboss/dna/repository/RepositoryService.java	2009-06-03 19:55:23 UTC (rev 965)
+++ trunk/dna-repository/src/main/java/org/jboss/dna/repository/RepositoryService.java	2009-06-03 20:07:47 UTC (rev 966)
@@ -147,7 +147,7 @@
         CheckArg.isNotNull(context, "context");
         if (pathToConfigurationRoot == null) pathToConfigurationRoot = context.getValueFactories()
                                                                               .getPathFactory()
-                                                                              .create("/dna:system");
+                                                                              .create("/jcr:system");
         this.sources = sources;
         this.pathToConfigurationRoot = pathToConfigurationRoot;
         this.configurationSourceName = configurationSourceName;



From dna-commits at lists.jboss.org  Wed Jun  3 16:08:46 2009
From: dna-commits at lists.jboss.org (dna-commits at lists.jboss.org)
Date: Wed, 03 Jun 2009 16:08:46 -0400
Subject: [dna-commits] DNA SVN: r967 - in trunk:
	dna-cnd/src/test/java/org/jboss/dna/cnd and 11 other directories.
Message-ID: <E1MBwlS-0001ry-HM@committer01.frg.pub.inap.atl.jboss.com>

Author: rhauch
Date: 2009-06-03 16:08:46 -0400 (Wed, 03 Jun 2009)
New Revision: 967

Added:
   trunk/extensions/dna-sequencer-java/src/main/resources/org/jboss/dna/sequencer/java/javaSource.cnd
Removed:
   trunk/extensions/dna-sequencer-java/src/main/resources/org/jboss/dna/sequencer/java/java-source-artifact.cnd
Modified:
   trunk/dna-cnd/src/main/java/org/jboss/dna/cnd/CndImporter.java
   trunk/dna-cnd/src/test/java/org/jboss/dna/cnd/CndImporterTest.java
   trunk/dna-graph/src/main/java/org/jboss/dna/graph/Graph.java
   trunk/dna-graph/src/main/java/org/jboss/dna/graph/Location.java
   trunk/dna-graph/src/main/java/org/jboss/dna/graph/property/basic/AbstractPath.java
   trunk/dna-graph/src/main/java/org/jboss/dna/graph/request/BatchRequestBuilder.java
   trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/DnaLexicon.java
   trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/JcrConfiguration.java
   trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/JcrEngine.java
   trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/JcrI18n.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/resources/org/jboss/dna/jcr/JcrI18n.properties
   trunk/dna-jcr/src/main/resources/org/jboss/dna/jcr/dna_builtins.cnd
   trunk/dna-jcr/src/test/java/org/jboss/dna/jcr/CndNodeTypeRegistrationTest.java
   trunk/dna-jcr/src/test/java/org/jboss/dna/jcr/InMemoryRepositoryStub.java
   trunk/dna-jcr/src/test/java/org/jboss/dna/jcr/JcrConfigurationTest.java
   trunk/dna-repository/src/main/java/org/jboss/dna/repository/Configurator.java
   trunk/dna-repository/src/main/java/org/jboss/dna/repository/DnaConfiguration.java
   trunk/dna-repository/src/main/java/org/jboss/dna/repository/RepositoryService.java
   trunk/dna-repository/src/test/java/org/jboss/dna/repository/DnaConfigurationTest.java
   trunk/dna-repository/src/test/java/org/jboss/dna/repository/DnaEngineTest.java
   trunk/docs/examples/gettingstarted/repositories/src/main/resources/aircraft.xml
   trunk/docs/examples/gettingstarted/repositories/src/main/resources/cars.xml
   trunk/docs/examples/gettingstarted/repositories/src/main/resources/configRepository.xml
   trunk/docs/examples/gettingstarted/sequencers/src/main/java/org/jboss/example/dna/sequencer/ConsoleInput.java
   trunk/docs/examples/gettingstarted/sequencers/src/main/java/org/jboss/example/dna/sequencer/SequencingClient.java
Log:
DNA-436 Continued the work on the examples, with fairly substantial changes (simplification) to the configuration frameworks.

Modified: trunk/dna-cnd/src/main/java/org/jboss/dna/cnd/CndImporter.java
===================================================================
--- trunk/dna-cnd/src/main/java/org/jboss/dna/cnd/CndImporter.java	2009-06-03 20:07:47 UTC (rev 966)
+++ trunk/dna-cnd/src/main/java/org/jboss/dna/cnd/CndImporter.java	2009-06-03 20:08:46 UTC (rev 967)
@@ -505,7 +505,7 @@
         protected String propertyTypeNameFrom( CommonTree node,
                                                int childType ) {
             String text = stringFrom(node, childType);
-            if (text.equals("*")) text = "undefined";
+            if ("*".equals(text)) text = "undefined";
             String upperText = text.toUpperCase();
             if (!VALID_PROPERTY_TYPES.contains(upperText)) {
                 recordError(node, CndI18n.expectedValidPropertyTypeName, text, VALID_PROPERTY_TYPES);

Modified: trunk/dna-cnd/src/test/java/org/jboss/dna/cnd/CndImporterTest.java
===================================================================
--- trunk/dna-cnd/src/test/java/org/jboss/dna/cnd/CndImporterTest.java	2009-06-03 20:07:47 UTC (rev 966)
+++ trunk/dna-cnd/src/test/java/org/jboss/dna/cnd/CndImporterTest.java	2009-06-03 20:08:46 UTC (rev 967)
@@ -446,6 +446,13 @@
         assertThat(problems.size(), is(0));
     }
 
+    @Test
+    public void shouldImportCndForJavaSequencer() throws Exception {
+        importer.importFrom(openCndFile("javaSource.cnd"), problems);
+        if (problems.size() != 0) printProblems();
+        assertThat(problems.size(), is(0));
+    }
+
     public static final String[] NO_DEFAULTS = {};
     public static final String[] NO_SUPERTYPES = {};
     public static final String[] NO_VALUE_CONSTRAINTS = {};

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	2009-06-03 20:07:47 UTC (rev 966)
+++ trunk/dna-graph/src/main/java/org/jboss/dna/graph/Graph.java	2009-06-03 20:08:46 UTC (rev 967)
@@ -1717,13 +1717,15 @@
                             }
 
                             public List<Location> under( Location at ) {
-                                return requests.readBlockOfChildren(at, getCurrentWorkspaceName(), startingIndex, blockSize).getChildren();
+                                return requests.readBlockOfChildren(at, getCurrentWorkspaceName(), startingIndex, blockSize)
+                                               .getChildren();
                             }
                         };
                     }
 
                     public List<Location> startingAfter( final Location previousSibling ) {
-                        return requests.readNextBlockOfChildren(previousSibling, getCurrentWorkspaceName(), blockSize).getChildren();
+                        return requests.readNextBlockOfChildren(previousSibling, getCurrentWorkspaceName(), blockSize)
+                                       .getChildren();
                     }
 
                     public List<Location> startingAfter( String pathOfPreviousSibling ) {
@@ -1941,7 +1943,7 @@
      */
     public ImportInto<Conjunction<Graph>> importXmlFrom( final InputStream stream ) {
         CheckArg.isNotNull(stream, "stream");
-        
+
         return new ImportInto<Conjunction<Graph>>() {
             private boolean skipRootElement = false;
 
@@ -3513,6 +3515,19 @@
             }
             return new BatchResults(request);
         }
+
+        /**
+         * {@inheritDoc}
+         * 
+         * @see java.lang.Object#toString()
+         */
+        @Override
+        public String toString() {
+            StringBuilder sb = new StringBuilder();
+            sb.append("Pending requests:\n");
+            sb.append(requestQueue.toString());
+            return sb.toString();
+        }
     }
 
     /**
@@ -5380,7 +5395,10 @@
         }
 
         public SubgraphNode getNode( Name relativePath ) {
-            Path path = getGraph().getContext().getValueFactories().getPathFactory().create(getLocation().getPath(), relativePath);
+            Path path = getGraph().getContext()
+                                  .getValueFactories()
+                                  .getPathFactory()
+                                  .create(getLocation().getPath(), relativePath);
             path = path.getNormalizedPath();
             return getNode(path);
         }

Modified: trunk/dna-graph/src/main/java/org/jboss/dna/graph/Location.java
===================================================================
--- trunk/dna-graph/src/main/java/org/jboss/dna/graph/Location.java	2009-06-03 20:07:47 UTC (rev 966)
+++ trunk/dna-graph/src/main/java/org/jboss/dna/graph/Location.java	2009-06-03 20:08:46 UTC (rev 967)
@@ -558,12 +558,15 @@
     @Override
     public String toString() {
         StringBuilder sb = new StringBuilder();
-        sb.append("{ ");
         boolean hasPath = this.hasPath();
+        boolean hasProps = this.hasIdProperties();
         if (hasPath) {
+            if (hasProps) {
+                sb.append("<");
+            }
             sb.append(this.getPath());
         }
-        if (this.hasIdProperties()) {
+        if (hasProps) {
             if (hasPath) sb.append(" && ");
             sb.append("[");
             boolean first = true;
@@ -573,8 +576,10 @@
                 sb.append(idProperty);
             }
             sb.append("]");
+            if (hasPath) {
+                sb.append("<");
+            }
         }
-        sb.append(" }");
         return sb.toString();
     }
 

Modified: trunk/dna-graph/src/main/java/org/jboss/dna/graph/property/basic/AbstractPath.java
===================================================================
--- trunk/dna-graph/src/main/java/org/jboss/dna/graph/property/basic/AbstractPath.java	2009-06-03 20:07:47 UTC (rev 966)
+++ trunk/dna-graph/src/main/java/org/jboss/dna/graph/property/basic/AbstractPath.java	2009-06-03 20:08:46 UTC (rev 967)
@@ -248,7 +248,7 @@
      * {@inheritDoc}
      */
     public String getString() {
-        return doGetString(null, DEFAULT_ENCODER, null);
+        return doGetString(null, null, null);
     }
 
     /**
@@ -625,6 +625,6 @@
      */
     @Override
     public String toString() {
-        return getString(Path.URL_ENCODER);
+        return getString(Path.NO_OP_ENCODER);
     }
 }

Modified: trunk/dna-graph/src/main/java/org/jboss/dna/graph/request/BatchRequestBuilder.java
===================================================================
--- trunk/dna-graph/src/main/java/org/jboss/dna/graph/request/BatchRequestBuilder.java	2009-06-03 20:07:47 UTC (rev 966)
+++ trunk/dna-graph/src/main/java/org/jboss/dna/graph/request/BatchRequestBuilder.java	2009-06-03 20:08:46 UTC (rev 967)
@@ -681,6 +681,21 @@
         return add(new DeleteBranchRequest(at, workspaceName));
     }
 
+    /**
+     * {@inheritDoc}
+     * 
+     * @see java.lang.Object#toString()
+     */
+    @Override
+    public String toString() {
+        StringBuilder sb = new StringBuilder();
+        for (Request request : requests) {
+            sb.append(request.toString());
+            sb.append("\n");
+        }
+        return sb.toString();
+    }
+
     protected class NodeChange {
         protected final Location location;
         protected final String workspaceName;

Modified: trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/DnaLexicon.java
===================================================================
--- trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/DnaLexicon.java	2009-06-03 20:07:47 UTC (rev 966)
+++ trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/DnaLexicon.java	2009-06-03 20:08:46 UTC (rev 967)
@@ -34,6 +34,7 @@
     public static final Name BASE = new BasicName(Namespace.URI, "base");
     public static final Name NAMESPACE = new BasicName(Namespace.URI, "namespace");
     public static final Name NODE_TYPES = new BasicName(Namespace.URI, "nodeTypes");
+    public static final Name REPOSITORIES = new BasicName(Namespace.URI, "repositories");
     public static final Name ROOT = new BasicName(Namespace.URI, "root");
     public static final Name SYSTEM = new BasicName(Namespace.URI, "system");
     public static final Name URI = new BasicName(Namespace.URI, "uri");

Modified: trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/JcrConfiguration.java
===================================================================
--- trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/JcrConfiguration.java	2009-06-03 20:07:47 UTC (rev 966)
+++ trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/JcrConfiguration.java	2009-06-03 20:08:46 UTC (rev 967)
@@ -23,20 +23,31 @@
  */
 package org.jboss.dna.jcr;
 
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.URL;
+import org.jboss.dna.cnd.CndImporter;
 import org.jboss.dna.common.util.CheckArg;
 import org.jboss.dna.graph.ExecutionContext;
 import org.jboss.dna.graph.Graph;
+import org.jboss.dna.graph.Node;
 import org.jboss.dna.graph.connector.RepositorySource;
+import org.jboss.dna.graph.io.Destination;
+import org.jboss.dna.graph.io.GraphBatchDestination;
 import org.jboss.dna.graph.mimetype.MimeTypeDetector;
 import org.jboss.dna.graph.property.Path;
+import org.jboss.dna.graph.sequencer.StreamSequencer;
 import org.jboss.dna.repository.Configurator;
 import org.jboss.dna.repository.DnaConfiguration;
 import org.jboss.dna.repository.DnaConfigurationException;
-import org.jboss.dna.repository.DnaLexicon;
+import org.jboss.dna.repository.Configurator.And;
 import org.jboss.dna.repository.Configurator.ChooseClass;
-import org.jboss.dna.repository.Configurator.ConfigRepositoryDetails;
+import org.jboss.dna.repository.Configurator.ConfigSourceDetails;
 import org.jboss.dna.repository.Configurator.MimeTypeDetectorDetails;
-import org.jboss.dna.repository.Configurator.RepositoryDetails;
+import org.jboss.dna.repository.Configurator.RepositorySourceDetails;
+import org.jboss.dna.repository.Configurator.SequencerDetails;
+import org.jboss.dna.repository.Configurator.SetName;
 
 /**
  * A configuration builder for a {@link JcrEngine}. This class is an internal domain-specific language (DSL), and is designed to
@@ -56,8 +67,8 @@
  * </pre>
  */
 public class JcrConfiguration
-    implements Configurator.Initializer<JcrConfiguration>, /*Configurator.SequencerConfigurator<JcrConfiguration>,*/
-    Configurator.RepositoryConfigurator<JcrConfiguration>, Configurator.MimeDetectorConfigurator<JcrConfiguration>,
+    implements Configurator.Initializer<JcrConfiguration>, Configurator.SequencerConfigurator<JcrConfiguration>,
+    Configurator.RepositorySourceConfigurator<JcrConfiguration>, Configurator.MimeDetectorConfigurator<JcrConfiguration>,
     Configurator.Builder<JcrEngine> {
 
     private final JcrConfiguration.Builder<JcrConfiguration> builder;
@@ -91,44 +102,65 @@
     /**
      * {@inheritDoc}
      * 
-     * @see org.jboss.dna.repository.Configurator.Initializer#withConfigurationRepository()
+     * @see org.jboss.dna.repository.Configurator.Initializer#withConfigurationSource()
      */
-    public ChooseClass<RepositorySource, ConfigRepositoryDetails<JcrConfiguration>> withConfigurationRepository() {
-        return builder.withConfigurationRepository();
+    public ChooseClass<RepositorySource, ConfigSourceDetails<JcrConfiguration>> withConfigurationSource() {
+        return builder.withConfigurationSource();
     }
 
-    // /**
-    // * {@inheritDoc}
-    // *
-    // * @see org.jboss.dna.repository.Configurator.SequencerConfigurator#addSequencer(java.lang.String)
-    // */
-    // public ChooseClass<Sequencer, SequencerDetails<JcrConfiguration>> addSequencer( String id ) {
-    // CheckArg.isNotEmpty(id, "id");
-    // return builder.addSequencer(id);
-    // }
+    /**
+     * {@inheritDoc}
+     * 
+     * @see org.jboss.dna.repository.Configurator.SequencerConfigurator#addSequencer(java.lang.String)
+     */
+    public ChooseClass<StreamSequencer, SequencerDetails<JcrConfiguration>> addSequencer( String id ) {
+        CheckArg.isNotEmpty(id, "id");
+        return builder.addSequencer(id);
+    }
 
     /**
      * {@inheritDoc}
      * 
-     * @see org.jboss.dna.repository.Configurator.RepositoryConfigurator#addRepository(java.lang.String)
+     * @see org.jboss.dna.repository.Configurator.RepositorySourceConfigurator#addSource(java.lang.String)
      */
-    public ChooseClass<RepositorySource, JcrRepositoryDetails<JcrConfiguration>> addRepository( String id ) {
+    public ChooseClass<RepositorySource, RepositorySourceDetails<JcrConfiguration>> addSource( String id ) {
         CheckArg.isNotEmpty(id, "id");
-        return builder.addRepository(id);
+        return builder.addSource(id);
     }
 
     /**
      * {@inheritDoc}
      * 
-     * @see org.jboss.dna.repository.Configurator.RepositoryConfigurator#addRepository(org.jboss.dna.graph.connector.RepositorySource)
+     * @see org.jboss.dna.repository.Configurator.RepositorySourceConfigurator#addSource(org.jboss.dna.graph.connector.RepositorySource)
      */
-    public JcrConfiguration addRepository( RepositorySource source ) {
+    public JcrConfiguration addSource( RepositorySource source ) {
         CheckArg.isNotNull(source, "source");
         CheckArg.isNotEmpty(source.getName(), "source.getName()");
-        return builder.addRepository(source);
+        return builder.addSource(source);
     }
 
     /**
+     * Add a JCR repository to this configuration.
+     * 
+     * @param id the identifier for this repository; may not be null or empty
+     * @return the interface used to configure the repository
+     */
+    public SourceSetter<JcrRepositoryDetails<JcrConfiguration>> addRepository( final String id ) {
+        CheckArg.isNotEmpty(id, "id");
+        final JcrConfiguration.Builder<JcrConfiguration> builder = this.builder;
+        return new SourceSetter<JcrRepositoryDetails<JcrConfiguration>>() {
+            /**
+             * {@inheritDoc}
+             * 
+             * @see org.jboss.dna.jcr.JcrConfiguration.SourceSetter#usingSource(java.lang.String)
+             */
+            public JcrRepositoryDetails<JcrConfiguration> usingSource( String sourceId ) {
+                return builder.addRepository(id, sourceId);
+            }
+        };
+    }
+
+    /**
      * {@inheritDoc}
      * 
      * @see org.jboss.dna.repository.Configurator.MimeDetectorConfigurator#addMimeTypeDetector(java.lang.String)
@@ -161,9 +193,67 @@
         return new JcrEngine(builder.buildDnaEngine());
     }
 
+    /**
+     * The interface used to set the RepositorySource that should be used.
+     * 
+     * @param <ReturnType> the interface returned from these methods
+     */
+    public interface SourceSetter<ReturnType> {
+        /**
+         * Set the repository source that should be used.
+         * 
+         * @param sourceId that identifier of the repository source
+         * @return the next component to continue configuration; never null
+         */
+        ReturnType usingSource( String sourceId );
+    }
+
     public interface JcrRepositoryDetails<ReturnType>
-        extends RepositoryDetails<ReturnType>, SetOptions<JcrRepositoryDetails<ReturnType>> {
+        extends SetOptions<JcrRepositoryDetails<ReturnType>>, SetNamespace<JcrRepositoryDetails<ReturnType>>,
+        SetName<JcrRepositoryDetails<ReturnType>>,
+        /* SetDescription<JcrRepositoryDetails<ReturnType>>, */
+        And<ReturnType> {
 
+        /**
+         * Specify that the CND in the supplied string should be loaded into the repository.
+         * 
+         * @param cndContents the string containing the compact node definitions
+         * @return this object for chained method invocation
+         * @throws IllegalArgumentException if the string is null or empty
+         * @throws DnaConfigurationException if there is an error reading the CND contents
+         */
+        JcrRepositoryDetails<ReturnType> withNodeTypes( String cndContents );
+
+        /**
+         * Specify that the CND file is to be loaded into the repository.
+         * 
+         * @param cndFile the CND file
+         * @return this object for chained method invocation
+         * @throws IllegalArgumentException if the file is null
+         * @throws DnaConfigurationException if there is an error reading the file
+         */
+        JcrRepositoryDetails<ReturnType> withNodeTypes( File cndFile );
+
+        /**
+         * Specify that the CND file is to be loaded into the repository.
+         * 
+         * @param urlOfCndFile the URL of the CND file
+         * @return this object for chained method invocation
+         * @throws IllegalArgumentException if the URL is null
+         * @throws DnaConfigurationException if there is an error reading the content at the URL
+         */
+        JcrRepositoryDetails<ReturnType> withNodeTypes( URL urlOfCndFile );
+
+        /**
+         * Specify that the CND file is to be loaded into the repository.
+         * 
+         * @param cndContent the stream containing the CND content
+         * @return this object for chained method invocation
+         * @throws IllegalArgumentException if the URL is null
+         * @throws DnaConfigurationException if there is an error reading the stream at the URL
+         */
+        JcrRepositoryDetails<ReturnType> withNodeTypes( InputStream cndContent );
+
     }
 
     /**
@@ -198,8 +288,41 @@
         ReturnType setTo( String value );
     }
 
+    /**
+     * Interface for setting a namespace for a {@link JcrRepository JCR repository}.
+     * 
+     * @param <ReturnType> the interface returned after the option has been set.
+     */
+    public interface SetNamespace<ReturnType> {
+        /**
+         * Specify the repository option that is to be set. The value may be set using the interface returned by this method.
+         * 
+         * @param uri the uri for the namespace
+         * @return the interface used to set the value for the property; never null
+         */
+        NamespaceSetter<ReturnType> withNamespace( String uri );
+    }
+
+    /**
+     * The interface used to set the prefix for a namespace.
+     * 
+     * @param <ReturnType> the interface returned from these methods
+     * @see JcrConfiguration.SetNamespace#withNamespace(String)
+     */
+    public interface NamespaceSetter<ReturnType> {
+        /**
+         * Set the prefix for the namespace
+         * 
+         * @param prefix the prefix for the namespace
+         * @return the next component to continue configuration; never null
+         */
+        ReturnType usingPrefix( String prefix );
+    }
+
     public static class Builder<ReturnType> extends DnaConfiguration.Builder<ReturnType> {
 
+        private Path repositoriesPath;
+
         /**
          * Specify a new {@link ExecutionContext} that should be used for this DNA instance.
          * 
@@ -216,42 +339,183 @@
             return graph();
         }
 
-        /**
-         * {@inheritDoc}
-         * 
-         * @see org.jboss.dna.repository.Configurator.RepositoryConfigurator#addRepository(java.lang.String)
-         */
-        @Override
-        public ChooseClass<RepositorySource, JcrRepositoryDetails<ReturnType>> addRepository( String id ) {
+        protected Path repositoriesPath() {
+            // Make sure the "dna:repositories" node is there
+            if (repositoriesPath == null) {
+                Path path = pathFactory().create(this.configurationSource.getPath(), DnaLexicon.REPOSITORIES);
+                Node node = graph().createIfMissing(path).andReturn();
+                this.repositoriesPath = node.getLocation().getPath();
+            }
+            return this.repositoriesPath;
+        }
+
+        public JcrRepositoryDetails<ReturnType> addRepository( String id,
+                                                               String sourceId ) {
             CheckArg.isNotEmpty(id, "id");
-            // Now create the "dna:source" node with the supplied id ...
-            Path path = createOrReplaceNode(sourcesPath(), id);
-            JcrRepositoryDetails<ReturnType> details = new JcrGraphRepositoryDetails<ReturnType>(path, builder);
-            return new ClassChooser<RepositorySource, JcrRepositoryDetails<ReturnType>>(path, details);
+            // Now create the "dna:repositories/id" node ...
+            Path path = createOrReplaceNode(repositoriesPath(), id);
+            configuration().set(DnaLexicon.SOURCE_NAME).to(sourceId).on(path);
+            return new JcrGraphRepositoryDetails<ReturnType>(path, builder);
         }
 
-        public class JcrGraphRepositoryDetails<RT> extends GraphRepositoryDetails<RT> implements JcrRepositoryDetails<RT> {
+        public class JcrGraphRepositoryDetails<RT> implements JcrRepositoryDetails<RT> {
+            private final Path path;
+            private final RT returnObject;
 
             protected JcrGraphRepositoryDetails( Path path,
                                                  RT returnObject ) {
-                super(path, returnObject);
+                this.path = path;
+                this.returnObject = returnObject;
             }
 
+            /**
+             * {@inheritDoc}
+             * 
+             * @see org.jboss.dna.repository.Configurator.SetName#named(java.lang.String)
+             */
             @SuppressWarnings( "synthetic-access" )
-            public OptionSetter<JcrRepositoryDetails<RT>> with( final JcrRepository.Option option ) {
-                final Path optionsPath = createOrReplaceNode(path(), DnaLexicon.OPTIONS);
+            public JcrRepositoryDetails<RT> named( String name ) {
+                configuration().set(DnaLexicon.READABLE_NAME).to(name).on(name);
+                return this;
+            }
 
+            /**
+             * {@inheritDoc}
+             * 
+             * @see org.jboss.dna.jcr.JcrConfiguration.SetNamespace#withNamespace(java.lang.String)
+             */
+            @SuppressWarnings( "synthetic-access" )
+            public NamespaceSetter<JcrRepositoryDetails<RT>> withNamespace( final String uri ) {
+                final Path namespacesPath = createOrReplaceNode(path, DnaLexicon.NAMESPACES);
                 final JcrRepositoryDetails<RT> details = this;
+                return new NamespaceSetter<JcrRepositoryDetails<RT>>() {
+                    /**
+                     * {@inheritDoc}
+                     * 
+                     * @see org.jboss.dna.jcr.JcrConfiguration.NamespaceSetter#usingPrefix(java.lang.String)
+                     */
+                    public JcrRepositoryDetails<RT> usingPrefix( String prefix ) {
+                        Path nsPath = createOrReplaceNode(namespacesPath, prefix);
+                        configuration().set(DnaLexicon.URI).to(uri).on(nsPath);
+                        return details;
+                    }
+                };
+            }
 
+            @SuppressWarnings( "synthetic-access" )
+            public OptionSetter<JcrRepositoryDetails<RT>> with( final JcrRepository.Option option ) {
+                final Path optionsPath = createOrReplaceNode(path, DnaLexicon.OPTIONS);
+                final JcrRepositoryDetails<RT> details = this;
                 return new OptionSetter<JcrRepositoryDetails<RT>>() {
                     public JcrRepositoryDetails<RT> setTo( String value ) {
                         Path optionPath = createOrReplaceNode(optionsPath, option.name());
                         configuration().set(DnaLexicon.VALUE).to(value).on(optionPath);
-
                         return details;
                     }
                 };
             }
+
+            /**
+             * {@inheritDoc}
+             * 
+             * @see org.jboss.dna.jcr.JcrConfiguration.JcrRepositoryDetails#withNodeTypes(java.lang.String)
+             */
+            public JcrRepositoryDetails<RT> withNodeTypes( String content ) {
+                CheckArg.isNotEmpty(content, "content");
+                CndImporter importer = createCndImporter();
+                try {
+                    importer.importFrom(content, getProblems(), "stream");
+                } catch (IOException e) {
+                    throw new DnaConfigurationException(e);
+                }
+                return this;
+            }
+
+            /**
+             * {@inheritDoc}
+             * 
+             * @see org.jboss.dna.jcr.JcrConfiguration.JcrRepositoryDetails#withNodeTypes(java.net.URL)
+             */
+            public JcrRepositoryDetails<RT> withNodeTypes( URL url ) {
+                CheckArg.isNotNull(url, "url");
+                // Obtain the stream ...
+                InputStream stream = null;
+                boolean foundError = false;
+                try {
+                    stream = url.openStream();
+                    CndImporter importer = createCndImporter();
+                    importer.importFrom(stream, getProblems(), url.toString());
+                } catch (IOException e) {
+                    foundError = true;
+                    throw new DnaConfigurationException(e);
+                } finally {
+                    if (stream != null) {
+                        try {
+                            stream.close();
+                        } catch (IOException e) {
+                            if (!foundError) {
+                                throw new DnaConfigurationException(e);
+                            }
+                        }
+                    }
+                }
+                return this;
+            }
+
+            /**
+             * {@inheritDoc}
+             * 
+             * @see org.jboss.dna.jcr.JcrConfiguration.JcrRepositoryDetails#withNodeTypes(java.io.File)
+             */
+            public JcrRepositoryDetails<RT> withNodeTypes( File file ) {
+                CheckArg.isNotNull(file, "file");
+                if (file.exists() && file.canRead()) {
+                    CndImporter importer = createCndImporter();
+                    try {
+                        importer.importFrom(file, getProblems());
+                    } catch (IOException e) {
+                        throw new DnaConfigurationException(e);
+                    }
+                    return this;
+                }
+                throw new DnaConfigurationException(JcrI18n.fileDoesNotExist.text(file.getPath()));
+            }
+
+            /**
+             * {@inheritDoc}
+             * 
+             * @see org.jboss.dna.jcr.JcrConfiguration.JcrRepositoryDetails#withNodeTypes(java.io.InputStream)
+             */
+            public JcrRepositoryDetails<RT> withNodeTypes( InputStream stream ) {
+                CndImporter importer = createCndImporter();
+                try {
+                    importer.importFrom(stream, getProblems(), "stream");
+                } catch (IOException e) {
+                    throw new DnaConfigurationException(e);
+                }
+                return this;
+            }
+
+            @SuppressWarnings( "synthetic-access" )
+            protected CndImporter createCndImporter() {
+                // The node types will be loaded into 'dna:repositories/{repositoryName}/dna:nodeTypes/' ...
+                Path nodeTypesPath = createOrReplaceNode(path, DnaLexicon.NODE_TYPES);
+
+                // Now set up the destination ...
+                Destination destination = new GraphBatchDestination(graph().batch()); // will be executed
+
+                // And create the importer that will load the CND content into the repository ...
+                return new CndImporter(destination, nodeTypesPath);
+            }
+
+            /**
+             * {@inheritDoc}
+             * 
+             * @see org.jboss.dna.repository.Configurator.And#and()
+             */
+            public RT and() {
+                return returnObject;
+            }
         }
 
     }

Modified: trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/JcrEngine.java
===================================================================
--- trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/JcrEngine.java	2009-06-03 20:07:47 UTC (rev 966)
+++ trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/JcrEngine.java	2009-06-03 20:08:46 UTC (rev 967)
@@ -39,12 +39,14 @@
 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.RepositoryConnectionFactory;
 import org.jboss.dna.graph.connector.RepositorySource;
 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.basic.GraphNamespaceRegistry;
 import org.jboss.dna.jcr.JcrRepository.Option;
 import org.jboss.dna.repository.DnaEngine;
 import org.jboss.dna.repository.RepositoryLibrary;
@@ -138,12 +140,13 @@
             repositoriesLock.lock();
             JcrRepository repository = repositories.get(repositoryName);
             if (repository == null) {
-                if (getRepositorySource(repositoryName) == null) {
+                try {
+                    repository = doCreateJcrRepository(repositoryName);
+                } catch (PathNotFoundException e) {
                     // The repository name is not a valid repository ...
                     String msg = JcrI18n.repositoryDoesNotExist.text(repositoryName);
                     throw new RepositoryException(msg);
                 }
-                repository = doCreateJcrRepository(repositoryName);
                 repositories.put(repositoryName, repository);
             }
             return repository;
@@ -155,50 +158,54 @@
     protected JcrRepository doCreateJcrRepository( String repositoryName ) {
         RepositoryConnectionFactory connectionFactory = getRepositoryConnectionFactory();
         Map<String, String> descriptors = null;
-
-        /*
-         * Extract the JCR options from the configuration graph
-         */
-        String configurationName = dnaEngine.getRepositoryService().getConfigurationSourceName();
         Map<Option, String> options = new HashMap<Option, String>();
 
+        // Read the subgraph that represents the repository ...
         PathFactory pathFactory = getExecutionContext().getValueFactories().getPathFactory();
+        Path repositoriesPath = pathFactory.create(DnaLexicon.REPOSITORIES);
+        Path repositoryPath = pathFactory.create(repositoriesPath, repositoryName);
+        String configurationName = dnaEngine.getRepositoryService().getConfigurationSourceName();
         Graph configuration = Graph.create(connectionFactory.createConnection(configurationName), getExecutionContext());
+        Subgraph subgraph = configuration.getSubgraphOfDepth(3).at(repositoryPath);
 
-        try {
-            Node sources = configuration.getNodeAt(pathFactory.create(DnaLexicon.SOURCES));
+        // Read the options ...
+        Node optionsNode = subgraph.getNode(DnaLexicon.OPTIONS);
+        if (optionsNode != null) {
+            for (Location optionLocation : optionsNode.getChildren()) {
+                Node optionNode = configuration.getNodeAt(optionLocation);
+                Path.Segment segment = optionLocation.getPath().getLastSegment();
+                Property valueProperty = optionNode.getProperty(DnaLexicon.VALUE);
+                if (valueProperty == null) continue;
+                Option option = Option.findOption(segment.getName().getLocalName());
+                if (option == null) continue;
+                options.put(option, valueProperty.getFirstValue().toString());
+            }
+        }
 
-            /*
-             * Hopefully, this can all get cleaned up when the connector layer supports queries
-             */
-            for (Location childLocation : sources.getChildren()) {
-                Node source = configuration.getNodeAt(childLocation);
+        // Read the namespaces ...
+        ExecutionContext context = getExecutionContext();
+        Node namespacesNode = subgraph.getNode(DnaLexicon.NAMESPACES);
+        if (namespacesNode != null) {
+            GraphNamespaceRegistry registry = new GraphNamespaceRegistry(configuration, namespacesNode.getLocation().getPath(),
+                                                                         DnaLexicon.NAMESPACE_URI);
+            context = context.with(registry);
+        }
 
-                Property nameProperty = source.getProperty("name");
-                if (nameProperty != null && nameProperty.getFirstValue().toString().equals(repositoryName)) {
-                    for (Location optionsLocation : source.getChildren()) {
-                        if (DnaLexicon.OPTIONS.equals(optionsLocation.getPath().getLastSegment().getName())) {
-                            Node optionsNode = configuration.getNodeAt(optionsLocation);
+        // Create the repository ...
+        JcrRepository repository = new JcrRepository(context, connectionFactory, repositoryName, descriptors, options);
 
-                            for (Location optionLocation : optionsNode.getChildren()) {
-                                Path.Segment segment = optionLocation.getPath().getLastSegment();
-                                Node optionNode = configuration.getNodeAt(optionLocation);
-                                Property valueProperty = optionNode.getProperty(DnaLexicon.VALUE);
-
-                                options.put(Option.valueOf(segment.getName().getLocalName()), valueProperty.getFirstValue()
-                                                                                                           .toString());
-
-                            }
-
-                        }
-                    }
-                }
+        // Register all the the node types ...
+        Node nodeTypesNode = subgraph.getNode(DnaLexicon.NODE_TYPES);
+        if (nodeTypesNode != null) {
+            try {
+                repository.getRepositoryTypeManager().registerNodeTypes(subgraph, nodeTypesNode.getLocation());
+            } catch (RepositoryException e) {
+                // Error registering the node types ...
+                getProblems().addError(e, JcrI18n.errorRegisteringNodeTypes, repositoryName);
             }
-        } catch (PathNotFoundException pnfe) {
-            // Must not be any configuration set up
         }
 
-        return new JcrRepository(getExecutionContext(), connectionFactory, repositoryName, descriptors, options);
+        return repository;
     }
 
     /*

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	2009-06-03 20:07:47 UTC (rev 966)
+++ trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/JcrI18n.java	2009-06-03 20:08:46 UTC (rev 967)
@@ -44,6 +44,7 @@
     public static I18n repositoryMustBeConfigured;
     public static I18n sourceInUse;
     public static I18n repositoryDoesNotExist;
+    public static I18n fileDoesNotExist;
 
     public static I18n noNamespaceWithPrefix;
     public static I18n noNamespaceWithUri;
@@ -59,6 +60,7 @@
     public static I18n unableToRemapUriNotRegisteredInNamespaceRegistry;
     public static I18n unableToRemapUriUsingPrefixUsedInNamespaceRegistry;
 
+    public static I18n errorRegisteringNodeTypes;
     public static I18n errorWhileInitializingTheNamespaceRegistry;
     public static I18n invalidRelativePath;
     public static I18n invalidPathParameter;

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	2009-06-03 20:07:47 UTC (rev 966)
+++ trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/JcrRepository.java	2009-06-03 20:08:46 UTC (rev 967)
@@ -40,6 +40,7 @@
 import javax.security.auth.login.Configuration;
 import javax.security.auth.login.LoginContext;
 import net.jcip.annotations.ThreadSafe;
+import org.jboss.dna.common.text.Inflector;
 import org.jboss.dna.common.util.CheckArg;
 import org.jboss.dna.graph.ExecutionContext;
 import org.jboss.dna.graph.Graph;
@@ -90,7 +91,32 @@
          * The {@link Configuration#getAppConfigurationEntry(String) JAAS application configuration name} that specifies which
          * login modules should be used to validate credentials.
          */
-        JAAS_LOGIN_CONFIG_NAME,
+        JAAS_LOGIN_CONFIG_NAME;
+
+        /**
+         * Determine the option given the option name. This does more than {@link Option#valueOf(String)}, since this method first
+         * tries to match the supplied string to the option's {@link Option#name() name}, then the uppercase version of the
+         * supplied string to the option's name, and finally if the supplied string is a camel-case version of the name (e.g.,
+         * "projectNodeTypes").
+         * 
+         * @param option the string version of the option's name
+         * @return the matching Option instance, or null if an option could not be matched using the supplied value
+         */
+        public static Option findOption( String option ) {
+            if (option == null) return null;
+            Option result = Option.valueOf(option);
+            if (result != null) return result;
+            // Try an uppercased version ...
+            result = Option.valueOf(option.toUpperCase());
+            if (result != null) return result;
+            // Try a camel-case version ...
+            String underscored = Inflector.getInstance().underscore(option, '_');
+            if (underscored != null) {
+                result = Option.valueOf(underscored);
+            }
+
+            return result;
+        }
     }
 
     /**

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	2009-06-03 20:07:47 UTC (rev 966)
+++ trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/RepositoryNodeTypeManager.java	2009-06-03 20:08:46 UTC (rev 967)
@@ -1292,19 +1292,98 @@
      */
     List<JcrNodeType> registerNodeTypes( JcrNodeTypeSource nodeTypeSource )
         throws InvalidNodeTypeDefinitionException, NodeTypeExistsException, RepositoryException {
-
         assert nodeTypeSource != null;
+        Graph nodeTypesGraph = nodeTypeSource.getNodeTypes();
+        Subgraph nodeTypesSubgraph = nodeTypesGraph.getSubgraphOfDepth(3).at("/");
+        return registerNodeTypes(nodeTypesSubgraph, nodeTypesSubgraph.getLocation());
+    }
 
-        Graph nodeTypeBatch = nodeTypeSource.getNodeTypes();
+    /**
+     * Registers the node types from the given {@link JcrNodeTypeSource}.
+     * <p>
+     * The effect of this method is &quot;all or nothing&quot;; if an error occurs, no node types are registered or updated.
+     * </p>
+     * <p>
+     * <b>DNA Implementation Notes</b>
+     * </p>
+     * <p>
+     * DNA currently supports registration of batches of types with some constraints. DNA will allow types to be registered if
+     * they meet the following criteria:
+     * <ol>
+     * <li>Existing types cannot be modified in-place - They must be unregistered and re-registered</li>
+     * <li>Types must have a non-null, non-empty name</li>
+     * <li>If a primary item name is specified for the node type, it must match the name of a property OR a child node, not both</li>
+     * <li>Each type must have a valid set of supertypes - that is, the type's supertypes must meet the following criteria:
+     * <ol>
+     * <li>The type must have at least one supertype (unless the type is {@code nt:base}.</li>
+     * <li>No two supertypes {@code t1} and {@code t2} can declare each declare a property ({@code p1} and {@code p2}) with the
+     * same name and cardinality ({@code p1.isMultiple() == p2.isMultiple()}). Note that this does prohibit each {@code t1} and
+     * {@code t2} from having a common supertype (or super-supertype, etc.) that declares a property).</li>
+     * <li>No two supertypes {@code t1} and {@code t2} can declare each declare a child node ({@code n1} and {@code n2}) with the
+     * same name and SNS status ({@code p1.allowsSameNameSiblings() == p2.allowsSameNameSiblings()}). Note that this does prohibit
+     * each {@code t1} and {@code t2} from having a common supertype (or super-supertype, etc.) that declares a child node).</li>
+     * </ol>
+     * </li>
+     * <li>Each type must have a valid set of properties - that is, the type's properties must meet the following criteria:
+     * <ol>
+     * <li>Residual property definitions cannot be mandatory</li>
+     * <li>If the property is auto-created, it must specify a default value</li>
+     * <li>If the property is single-valued, it can only specify a single default value</li>
+     * <li>If the property overrides an existing property definition from a supertype, the new definition must be mandatory if the
+     * old definition was mandatory</li>
+     * <li>The property cannot override an existing property definition from a supertype if the ancestor definition is protected</li>
+     * <li>If the property overrides an existing property definition from a supertype that specifies value constraints, the new
+     * definition must have the same value constraints as the old definition. <i>This requirement may be relaxed in a future
+     * version of DNA.</i></li>
+     * <li>If the property overrides an existing property definition from a supertype, the new definition must have the same
+     * required type as the old definition or a required type that can ALWAYS be cast to the required type of the ancestor (see
+     * section 6.2.6 of the JCR 1.0.1 specification)</li>
+     * </ol>
+     * Note that an empty set of properties would meet the above criteria.</li>
+     * <li>The type must have a valid set of child nodes - that is, the types's child nodes must meet the following criteria:
+     * <ol>
+     * <li>Residual child node definitions cannot be mandatory</li>
+     * <li>If the child node is auto-created, it must specify a default primary type name</li>
+     * <li>All required primary types must already be fully registered with the type manager or must have been defined earlier in
+     * the batch. <i>This requirement may be relaxed in a future version of DNA.</i></li>
+     * <li>If the child node overrides an existing child node definition from a supertype, the new definition must be mandatory if
+     * the old definition was mandatory</li>
+     * <li>The child node cannot override an existing child node definition from a supertype if the ancestor definition is
+     * protected</li>
+     * <li>If the child node overrides an existing child node definition from a supertype, the required primary types of the new
+     * definition must be more restrictive than the required primary types of the old definition - that is, the new primary types
+     * must defined such that any type that satisfies all of the required primary types for the new definition must also satisfy
+     * all of the required primary types for the old definition. This requirement is analogous to the requirement that overriding
+     * property definitions have a required type that is always convertible to the required type of the overridden definition.</li>
+     * </ol>
+     * Note that an empty set of child nodes would meet the above criteria.</li>
+     * </p>
+     * 
+     * @param nodeTypeSubgraph the subgraph containing the of {@link NodeType node types} to register
+     * @param locationOfParentOfNodeTypes the location of the parent node under which the node types are found
+     * @return the newly registered (or updated) {@link NodeType NodeTypes}
+     * @throws UnsupportedRepositoryOperationException if {@code allowUpdates == true}. DNA does not support this capability at
+     *         this time but the parameter has been retained for API compatibility.
+     * @throws InvalidNodeTypeDefinitionException if the {@link NodeTypeDefinition} is invalid
+     * @throws NodeTypeExistsException if <code>allowUpdate</code> is false and the {@link NodeTypeDefinition} specifies a node
+     *         type name that is already registered
+     * @throws RepositoryException if another error occurs
+     */
+    List<JcrNodeType> registerNodeTypes( Subgraph nodeTypeSubgraph,
+                                         Location locationOfParentOfNodeTypes )
+        throws InvalidNodeTypeDefinitionException, NodeTypeExistsException, RepositoryException {
+        assert nodeTypeSubgraph != null;
+        assert locationOfParentOfNodeTypes != null;
+
         NamespaceRegistry namespaces = this.context.getNamespaceRegistry();
 
-        List<Location> nodeTypeLocations = nodeTypeBatch.getChildren().of("/");
+        List<Location> nodeTypeLocations = nodeTypeSubgraph.getNode(locationOfParentOfNodeTypes).getChildren();
         List<JcrNodeType> typesPendingRegistration = new ArrayList<JcrNodeType>(nodeTypeLocations.size());
 
         try {
             nodeTypeManagerLock.writeLock().lock();
             for (Location location : nodeTypeLocations) {
-                Node nodeTypeNode = nodeTypeBatch.getNodeAt(location);
+                Node nodeTypeNode = nodeTypeSubgraph.getNode(location);
                 assert location.getPath() != null;
 
                 Name internalName = location.getPath().getLastSegment().getName();
@@ -1319,7 +1398,7 @@
 
                 List<JcrNodeType> supertypes = supertypesFor(nodeTypeNode, typesPendingRegistration);
                 // No need to re-parse the supertypes
-                JcrNodeType nodeType = nodeTypeFrom(nodeTypeBatch.getSubgraphOfDepth(2).at(location), supertypes);
+                JcrNodeType nodeType = nodeTypeFrom(nodeTypeSubgraph, location, supertypes);
 
                 validate(nodeType, supertypes, typesPendingRegistration);
 
@@ -1383,8 +1462,9 @@
     }
 
     private JcrNodeType nodeTypeFrom( Subgraph nodeTypeGraph,
+                                      Location nodeTypeLocation,
                                       List<JcrNodeType> supertypes ) {
-        Node nodeTypeNode = nodeTypeGraph.getRoot();
+        Node nodeTypeNode = nodeTypeGraph.getNode(nodeTypeLocation);
         List<Location> children = nodeTypeNode.getChildren();
 
         List<JcrPropertyDefinition> properties = new ArrayList<JcrPropertyDefinition>(children.size());
@@ -1726,13 +1806,15 @@
         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"));
 
             }
@@ -1797,15 +1879,16 @@
 
         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());
@@ -1819,13 +1902,15 @@
         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"));
 
             }
@@ -1836,14 +1921,16 @@
                 && !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	2009-06-03 20:07:47 UTC (rev 966)
+++ trunk/dna-jcr/src/main/resources/org/jboss/dna/jcr/JcrI18n.properties	2009-06-03 20:08:46 UTC (rev 967)
@@ -34,6 +34,7 @@
 repositoryMustBeConfigured = DNA repositories must be configured with either a repository source factory or a repository source.
 sourceInUse = All sessions must end before a new repository source can be set
 repositoryDoesNotExist = There is no repository named "{0}"
+fileDoesNotExist = Unable to find or read the file "{0}"
 
 noNamespaceWithPrefix = There is no namespace with prefix "{0}"
 noNamespaceWithUri = There is no namespace with URI "{0}"
@@ -49,6 +50,7 @@
 unableToRemapUriNotRegisteredInNamespaceRegistry = Unable to remap the namespace "{1}" to prefix "{0}" because the URI is not already registered in the workspace's namespace registry
 unableToRemapUriUsingPrefixUsedInNamespaceRegistry = Unable to remap the namespace "{1}" to prefix "{0}" because the prefix is already used as the prefix for the namespace "{2}" in the workspace's namespace registry
 
+errorRegisteringNodeTypes = Error while registering the node types for repository "{0}"
 errorWhileInitializingTheNamespaceRegistry = Error while initializing the namespace registry for workspace "{0}"
 invalidRelativePath = "{0}" is not a valid relative path
 invalidPathParameter = The "{1}" parameter value "{0}" was not a valid path

Modified: trunk/dna-jcr/src/main/resources/org/jboss/dna/jcr/dna_builtins.cnd
===================================================================
--- trunk/dna-jcr/src/main/resources/org/jboss/dna/jcr/dna_builtins.cnd	2009-06-03 20:07:47 UTC (rev 966)
+++ trunk/dna-jcr/src/main/resources/org/jboss/dna/jcr/dna_builtins.cnd	2009-06-03 20:08:46 UTC (rev 967)
@@ -1,12 +1,38 @@
 /*
- * DNA Built-In Types
+ * 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
+//------------------------------------------------------------------------------
 <nt  = "http://www.jcp.org/jcr/nt/1.0">
 <mix = "http://www.jcp.org/jcr/mix/1.0">
 <dna = "http://www.jboss.org/dna/1.0">
 
+//------------------------------------------------------------------------------
+// N O D E T Y P E S
+//------------------------------------------------------------------------------
+
 [dna:namespace] > nt:base
 - dna:uri (string) primary protected version
 
@@ -25,3 +51,4 @@
 - * (undefined) version
 + jcr:system (dna:system) = dna:system autocreated mandatory protected ignore
 + * (nt:base) = nt:base multiple version
+

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	2009-06-03 20:07:47 UTC (rev 966)
+++ trunk/dna-jcr/src/test/java/org/jboss/dna/jcr/CndNodeTypeRegistrationTest.java	2009-06-03 20:08:46 UTC (rev 967)
@@ -23,10 +23,10 @@
  */
 package org.jboss.dna.jcr;
 
-import java.io.IOException;
 import static org.hamcrest.core.Is.is;
 import static org.hamcrest.core.IsNull.notNullValue;
 import static org.junit.Assert.assertThat;
+import java.io.IOException;
 import javax.jcr.PropertyType;
 import javax.jcr.RepositoryException;
 import javax.jcr.nodetype.NodeType;
@@ -72,7 +72,7 @@
 
     @Test( expected = AssertionError.class )
     public void shouldNotAllowNullTypeSource() throws Exception {
-        repoTypeManager.registerNodeTypes(null);
+        repoTypeManager.registerNodeTypes((JcrNodeTypeSource)null);
     }
 
     @Test( expected = RepositoryException.class )

Modified: trunk/dna-jcr/src/test/java/org/jboss/dna/jcr/InMemoryRepositoryStub.java
===================================================================
--- trunk/dna-jcr/src/test/java/org/jboss/dna/jcr/InMemoryRepositoryStub.java	2009-06-03 20:07:47 UTC (rev 966)
+++ trunk/dna-jcr/src/test/java/org/jboss/dna/jcr/InMemoryRepositoryStub.java	2009-06-03 20:08:46 UTC (rev 967)
@@ -23,16 +23,13 @@
  */
 package org.jboss.dna.jcr;
 
-import java.io.File;
 import java.net.URI;
 import java.util.Properties;
 import org.apache.jackrabbit.test.RepositoryStub;
 import org.jboss.dna.common.collection.Problem;
 import org.jboss.dna.graph.ExecutionContext;
 import org.jboss.dna.graph.Graph;
-import org.jboss.dna.graph.Location;
 import org.jboss.dna.graph.connector.inmemory.InMemoryRepositorySource;
-import org.jboss.dna.graph.io.GraphImporter;
 import org.jboss.dna.graph.property.Path;
 import org.jboss.dna.jcr.JcrRepository.Option;
 import org.jboss.security.config.IDTrustConfiguration;
@@ -42,7 +39,7 @@
  */
 public class InMemoryRepositoryStub extends RepositoryStub {
     private static final String REPOSITORY_SOURCE_NAME = "Test Repository Source";
-    
+
     private JcrRepository repository;
 
     static {
@@ -62,52 +59,57 @@
         super(env);
 
         // Create the in-memory (DNA) repository
-        JcrEngine engine = new JcrConfiguration()
-            .withConfigurationRepository()
-            .usingClass(InMemoryRepositorySource.class.getName())
-            .loadedFromClasspath()
-            .describedAs("configuration repository")
-            .with("name").setTo("configuration")
-            .and()
-            .addRepository("JCR Repository")
-            .usingClass(InMemoryRepositorySource.class.getName())
-            .loadedFromClasspath()
-            .with(Option.PROJECT_NODE_TYPES).setTo(Boolean.FALSE.toString())
-            .describedAs("JCR Repository")
-            .with("name").setTo(REPOSITORY_SOURCE_NAME)
-            .and().build();
+        JcrEngine engine = new JcrConfiguration().withConfigurationSource()
+                                                 .usingClass(InMemoryRepositorySource.class.getName())
+                                                 .loadedFromClasspath()
+                                                 .describedAs("configuration repository")
+                                                 .usingWorkspace("configuration workspace")
+                                                 .with("name")
+                                                 .setTo("configuration repository")
+                                                 .with("defaultWorkspaceName")
+                                                 .setTo("configuration workspace")
+                                                 .and()
+                                                 .addSource("Store")
+                                                 .usingClass(InMemoryRepositorySource.class.getName())
+                                                 .loadedFromClasspath()
+                                                 .describedAs("JCR Repository persistent store")
+                                                 .and()
+                                                 .addRepository(REPOSITORY_SOURCE_NAME)
+                                                 .usingSource("Store")
+                                                 .withNodeTypes(getClass().getClassLoader().getResource("tck_test_types.cnd"))
+                                                 .with(Option.PROJECT_NODE_TYPES)
+                                                 .setTo(Boolean.FALSE.toString())
+                                                 .and()
+                                                 .build();
         engine.start();
-        
+
+        // Print all of the problems from the engine configuration ...
+        for (Problem problem : engine.getProblems()) {
+            System.err.println(problem);
+        }
+        if (engine.getProblems().hasErrors()) {
+            throw new IllegalStateException("Problems starting JCR repository");
+        }
+
         ExecutionContext executionContext = engine.getExecutionContext();
         executionContext.getNamespaceRegistry().register(TestLexicon.Namespace.PREFIX, TestLexicon.Namespace.URI);
 
         try {
             repository = engine.getRepository(REPOSITORY_SOURCE_NAME);
-            RepositoryNodeTypeManager nodeTypes = repository.getRepositoryTypeManager();
 
             // Set up some sample nodes in the graph to match the expected test configuration
-            Graph graph = Graph.create(repository.getRepositorySourceName(), engine.getRepositoryConnectionFactory(), executionContext);
-            GraphImporter importer = new GraphImporter(graph);
+            Graph graph = Graph.create(repository.getRepositorySourceName(),
+                                       engine.getRepositoryConnectionFactory(),
+                                       executionContext);
             Path destinationPath = executionContext.getValueFactories().getPathFactory().createRootPath();
+            // URI xmlContent = new File("src/test/resources/repositoryForTckTests.xml").toURI();
+            URI xmlContent = getClass().getClassLoader().getResource("repositoryForTckTests.xml").toURI();
+            graph.importXmlFrom(xmlContent).into(destinationPath);
 
-            CndNodeTypeSource nodeTypeSource = new CndNodeTypeSource("/tck_test_types.cnd");
-
-            for (Problem problem : nodeTypeSource.getProblems()) {
-                System.err.println(problem);
-            }
-            if (!nodeTypeSource.isValid()) {
-                throw new IllegalStateException("Problems loading TCK test node types");
-            }
-
-            nodeTypes.registerNodeTypes(nodeTypeSource);
-
-            URI xmlContent = new File("src/test/resources/repositoryForTckTests.xml").toURI();
-            importer.importXml(xmlContent, Location.create(destinationPath)).execute();
-
         } catch (Exception ex) {
             // The TCK tries to quash this exception. Print it out to be more obvious.
             ex.printStackTrace();
-            throw new IllegalStateException("Repository initialization failed.", ex);
+            throw new IllegalStateException("Failed to initialize the repository with text content.", ex);
         }
     }
 

Modified: trunk/dna-jcr/src/test/java/org/jboss/dna/jcr/JcrConfigurationTest.java
===================================================================
--- trunk/dna-jcr/src/test/java/org/jboss/dna/jcr/JcrConfigurationTest.java	2009-06-03 20:07:47 UTC (rev 966)
+++ trunk/dna-jcr/src/test/java/org/jboss/dna/jcr/JcrConfigurationTest.java	2009-06-03 20:08:46 UTC (rev 967)
@@ -32,10 +32,12 @@
 import java.util.UUID;
 import java.util.concurrent.TimeUnit;
 import org.jboss.dna.graph.ExecutionContext;
+import org.jboss.dna.graph.Graph;
 import org.jboss.dna.graph.Subgraph;
 import org.jboss.dna.graph.cache.CachePolicy;
 import org.jboss.dna.graph.cache.ImmutableCachePolicy;
 import org.jboss.dna.graph.connector.RepositoryConnection;
+import org.jboss.dna.graph.connector.RepositorySource;
 import org.jboss.dna.graph.connector.inmemory.InMemoryRepositorySource;
 import org.jboss.dna.graph.mimetype.ExtensionBasedMimeTypeDetector;
 import org.jboss.dna.graph.property.Path;
@@ -88,7 +90,7 @@
         newSource.setRootNodeUuid(rootUuid);
 
         // Update the configuration and save it ...
-        configuration.addRepository(newSource).save();
+        configuration.addSource(newSource).save();
 
         // Verify that the graph has been updated correctly ...
         Subgraph subgraph = configuration.graph().getSubgraphOfDepth(3).at("/");
@@ -102,9 +104,90 @@
     }
 
     @Test
+    public void shouldAllowSettingUpConfigurationRepositoryWithDifferentConfigurationSourceName() throws Exception {
+        JcrEngine engine = configuration.withConfigurationSource()
+                                        .usingClass(InMemoryRepositorySource.class.getName())
+                                        .loadedFromClasspath()
+                                        .describedAs("Configuration Repository")
+                                        .with("name")
+                                        .setTo("config")
+                                        .with("retryLimit")
+                                        .setTo(5)
+                                        .and()
+                                        .addSource("Source2")
+                                        .usingClass(InMemoryRepositorySource.class.getName())
+                                        .loadedFromClasspath()
+                                        .describedAs("description")
+                                        .and()
+                                        .addRepository("JCR Repository")
+                                        .usingSource("Source2")
+                                        .with(Option.JAAS_LOGIN_CONFIG_NAME)
+                                        .setTo("test")
+                                        .and()
+                                        .build();
+        engine.start();
+        // Get a graph to the configuration source ...
+        RepositorySource configReposSource = engine.getRepositoryService().getRepositoryLibrary().getSource("config");
+        assertThat(configReposSource, is(notNullValue()));
+        assertThat(configReposSource, is(instanceOf(InMemoryRepositorySource.class)));
+        assertThat(configReposSource.getName(), is("config"));
+        InMemoryRepositorySource configSource = (InMemoryRepositorySource)configReposSource;
+        assertThat(configSource.getDefaultWorkspaceName(), is(""));
+        Graph graph = Graph.create("config", engine.getRepositoryService().getRepositoryLibrary(), context);
+        assertThat(graph, is(notNullValue()));
+        assertThat(graph.getNodeAt("/"), is(notNullValue()));
+
+        // Get the repository ...
+        JcrRepository repository = engine.getRepository("JCR Repository");
+        assertThat(repository, is(notNullValue()));
+    }
+
+    @Test
+    public void shouldAllowSettingUpConfigurationRepositoryWithDifferentWorkspaceName() throws Exception {
+        JcrEngine engine = configuration.withConfigurationSource()
+                                        .usingClass(InMemoryRepositorySource.class.getName())
+                                        .loadedFromClasspath()
+                                        .describedAs("Configuration Repository")
+                                        .usingWorkspace("workspaceXYZ")
+                                        .with("name")
+                                        .setTo("config2")
+                                        .with("defaultWorkspaceName")
+                                        .setTo("workspaceXYZ")
+                                        .with("retryLimit")
+                                        .setTo(5)
+                                        .and()
+                                        .addSource("Source2")
+                                        .usingClass(InMemoryRepositorySource.class.getName())
+                                        .loadedFromClasspath()
+                                        .describedAs("description")
+                                        .and()
+                                        .addRepository("JCR Repository")
+                                        .usingSource("Source2")
+                                        .with(Option.JAAS_LOGIN_CONFIG_NAME)
+                                        .setTo("test")
+                                        .and()
+                                        .build();
+        engine.start();
+        // Get a graph to the configuration source ...
+        RepositorySource configReposSource = engine.getRepositoryService().getRepositoryLibrary().getSource("config2");
+        assertThat(configReposSource, is(notNullValue()));
+        assertThat(configReposSource, is(instanceOf(InMemoryRepositorySource.class)));
+        assertThat(configReposSource.getName(), is("config2"));
+        InMemoryRepositorySource configSource = (InMemoryRepositorySource)configReposSource;
+        assertThat(configSource.getDefaultWorkspaceName(), is("workspaceXYZ"));
+        Graph graph = Graph.create("config2", engine.getRepositoryService().getRepositoryLibrary(), context);
+        assertThat(graph, is(notNullValue()));
+        assertThat(graph.getNodeAt("/"), is(notNullValue()));
+
+        // Get the repository ...
+        JcrRepository repository = engine.getRepository("JCR Repository");
+        assertThat(repository, is(notNullValue()));
+    }
+
+    @Test
     public void shouldAllowAddingRepositorySourceByClassNameAndSettingProperties() {
         // Update the configuration and save it ...
-        configuration.addRepository("Source1")
+        configuration.addSource("Source1")
                      .usingClass(InMemoryRepositorySource.class.getName())
                      .loadedFromClasspath()
                      .describedAs("description")
@@ -126,7 +209,7 @@
     @Test
     public void shouldAllowAddingRepositorySourceByClassNameAndClasspathAndSettingProperties() {
         // Update the configuration and save it ...
-        configuration.addRepository("Source1")
+        configuration.addSource("Source1")
                      .usingClass(InMemoryRepositorySource.class.getName())
                      .loadedFrom("cp1", "cp2")
                      .describedAs("description")
@@ -149,7 +232,7 @@
     @Test
     public void shouldAllowAddingRepositorySourceByClassReferenceAndSettingProperties() {
         // Update the configuration and save it ...
-        configuration.addRepository("Source1")
+        configuration.addSource("Source1")
                      .usingClass(InMemoryRepositorySource.class)
                      .describedAs("description")
                      .with("retryLimit")
@@ -171,13 +254,13 @@
     @Test
     public void shouldAllowOverwritingRepositorySourceByRepositoryName() {
         // Update the configuration and save it ...
-        configuration.addRepository("Source1")
+        configuration.addSource("Source1")
                      .usingClass(InMemoryRepositorySource.class)
                      .describedAs("description")
                      .with("retryLimit")
                      .setTo(3)
                      .and()
-                     .addRepository("Source1")
+                     .addSource("Source1")
                      .usingClass(InMemoryRepositorySource.class)
                      .describedAs("new description")
                      .with("retryLimit")
@@ -200,7 +283,7 @@
     @Test
     public void shouldAllowAddingMimeTypeDetector() {
         // Update the configuration and save it ...
-        configuration.addRepository("Source1")
+        configuration.addSource("Source1")
                      .usingClass(InMemoryRepositorySource.class)
                      .describedAs("description")
                      .and()
@@ -228,7 +311,7 @@
 
     @Test
     public void shouldAllowConfigurationInMultipleSteps() {
-        configuration.addRepository("Source1").usingClass(InMemoryRepositorySource.class).describedAs("description");
+        configuration.addSource("Source1").usingClass(InMemoryRepositorySource.class).describedAs("description");
         configuration.addMimeTypeDetector("detector")
                      .usingClass(ExtensionBasedMimeTypeDetector.class)
                      .describedAs("default detector");
@@ -254,49 +337,59 @@
     public void shouldAllowSpecifyingOptions() throws Exception {
         // Update the configuration and save it ...
 
-        JcrEngine engine = configuration.withConfigurationRepository()
-                     .usingClass(InMemoryRepositorySource.class.getName())
-                     .loadedFromClasspath()
-                     .describedAs("Configuration Repository")
-                     .with("name").setTo("configuration")
-                     .with("retryLimit")
-                     .setTo(5)
-                     .and()
-                     .addRepository("Source2")
-                     .usingClass(InMemoryRepositorySource.class.getName())
-                     .loadedFromClasspath()
-                     .with(Option.JAAS_LOGIN_CONFIG_NAME).setTo("test")
-                     .describedAs("description")
-                     .with("name").setTo("JCR Repository")
-                     .and()
-                     .build();
+        JcrEngine engine = configuration.withConfigurationSource()
+                                        .usingClass(InMemoryRepositorySource.class.getName())
+                                        .loadedFromClasspath()
+                                        .describedAs("Configuration Repository")
+                                        .with("name")
+                                        .setTo("configuration")
+                                        .with("retryLimit")
+                                        .setTo(5)
+                                        .and()
+                                        .addSource("Source2")
+                                        .usingClass(InMemoryRepositorySource.class.getName())
+                                        .loadedFromClasspath()
+                                        .describedAs("description")
+                                        .and()
+                                        .addRepository("JCR Repository")
+                                        .usingSource("Source2")
+                                        .with(Option.JAAS_LOGIN_CONFIG_NAME)
+                                        .setTo("test")
+                                        .and()
+                                        .build();
         engine.start();
 
         // Verify that the graph has been updated correctly ...
-        Subgraph subgraph = configuration.graph().getSubgraphOfDepth(3).at("/");
+        Subgraph subgraph = configuration.graph().getSubgraphOfDepth(6).at("/");
         assertThat(subgraph.getNode("/dna:sources"), is(notNullValue()));
         assertThat(subgraph.getNode("/dna:sources/Source2"), is(notNullValue()));
         assertThat(subgraph.getNode("/dna:sources/Source2"), hasProperty(DnaLexicon.READABLE_NAME, "Source2"));
         assertThat(subgraph.getNode("/dna:sources/Source2"), hasProperty(DnaLexicon.CLASSNAME,
                                                                          InMemoryRepositorySource.class.getName()));
-        
+        assertThat(subgraph.getNode("/dna:repositories"), is(notNullValue()));
+        assertThat(subgraph.getNode("/dna:repositories/JCR Repository"), is(notNullValue()));
+        assertThat(subgraph.getNode("/dna:repositories/JCR Repository"), hasProperty(DnaLexicon.SOURCE_NAME, "Source2"));
+        assertThat(subgraph.getNode("/dna:repositories/JCR Repository/dna:options"), is(notNullValue()));
+        assertThat(subgraph.getNode("/dna:repositories/JCR Repository/dna:options/JAAS_LOGIN_CONFIG_NAME"),
+                   hasProperty(DnaLexicon.VALUE, "test"));
+
         JcrRepository repository = engine.getRepository("JCR Repository");
-        
+
         Map<Option, String> options = new HashMap<Option, String>();
         options.put(Option.JAAS_LOGIN_CONFIG_NAME, "test");
         options.put(Option.PROJECT_NODE_TYPES, "false");
         assertThat(repository.getOptions(), is(options));
     }
-    
+
     @Test
     public void shouldAllowCreatingWithConfigRepository() throws InterruptedException {
-        DnaEngine engine = new DnaConfiguration().withConfigurationRepository()
-                                       .usingClass(InMemoryRepositorySource.class)
-                                       .describedAs("Configuration Repository")
-                                       .with("name")
-                                       .setTo("config repo")
-                                       .and()
-                                       .build();
+        DnaEngine engine = new DnaConfiguration().withConfigurationSource()
+                                                 .usingClass(InMemoryRepositorySource.class)
+                                                 .describedAs("Configuration Repository")
+                                                 .with("name")
+                                                 .setTo("config repo")
+                                                 .and()
+                                                 .build();
 
         assertThat(engine.getRepositorySource("config repo"), is(notNullValue()));
         assertThat(engine.getRepositorySource("config repo"), is(instanceOf(InMemoryRepositorySource.class)));

Modified: trunk/dna-repository/src/main/java/org/jboss/dna/repository/Configurator.java
===================================================================
--- trunk/dna-repository/src/main/java/org/jboss/dna/repository/Configurator.java	2009-06-03 20:07:47 UTC (rev 966)
+++ trunk/dna-repository/src/main/java/org/jboss/dna/repository/Configurator.java	2009-06-03 20:08:46 UTC (rev 967)
@@ -24,6 +24,8 @@
 import java.util.ArrayList;
 import java.util.List;
 import net.jcip.annotations.Immutable;
+import org.jboss.dna.common.collection.Problems;
+import org.jboss.dna.common.collection.SimpleProblems;
 import org.jboss.dna.common.component.ClassLoaderFactory;
 import org.jboss.dna.common.i18n.I18n;
 import org.jboss.dna.common.text.Inflector;
@@ -40,6 +42,7 @@
 import org.jboss.dna.graph.property.PathFactory;
 import org.jboss.dna.graph.property.ValueFormatException;
 import org.jboss.dna.graph.property.basic.RootPath;
+import org.jboss.dna.graph.sequencer.StreamSequencer;
 import org.jboss.dna.repository.sequencer.Sequencer;
 
 /**
@@ -55,14 +58,22 @@
     public interface SequencerConfigurator<ReturnType> {
 
         /**
-         * Add a new {@link Sequencer sequencer} to this configuration. The new sequencer will have the supplied name, and if the
-         * name of an existing sequencer is used, this will replace the existing sequencer configuration.
+         * Add a new {@link StreamSequencer sequencer} to this configuration. The new sequencer will have the supplied name, and
+         * if the name of an existing sequencer is used, this will replace the existing sequencer configuration.
          * 
          * @param id the identifier of the new sequencer
          * @return the interface for choosing the class, which returns the interface used to configure the sequencer; never null
          * @throws IllegalArgumentException if the sequencer name is null, empty, or otherwise invalid
          */
-        public ChooseClass<Sequencer, SequencerDetails<ReturnType>> addSequencer( final String id );
+        public ChooseClass<StreamSequencer, SequencerDetails<ReturnType>> addSequencer( String id );
+
+        /**
+         * Get the details for the sequencer with the supplied identifier.
+         * 
+         * @param id the identifier of the sequencer that is to be added
+         * @return the details for the repository source, or null if there is no such source in this configuration
+         */
+        public SequencerDetails<ReturnType> sequencer( String id );
     }
 
     /**
@@ -76,10 +87,17 @@
          * default each configuration uses an internal transient repository for its configuration, but using this method will make
          * the configuration use a different repository (that is perhaps shared with other processes).
          * 
-         * @return the interface for choosing the class, which returns the interface used to configure the repository source that
-         *         will be used for the configuration repository; never null
+         * @return the interface for choosing the class, which returns the interface used to configure the source that will be
+         *         used for the configuration repository; never null
          */
-        public ChooseClass<RepositorySource, ConfigRepositoryDetails<ReturnType>> withConfigurationRepository();
+        public ChooseClass<RepositorySource, ConfigSourceDetails<ReturnType>> withConfigurationSource();
+
+        /**
+         * Get the details for the configuration repository source.
+         * 
+         * @return the details for the configuration's repository source; never null
+         */
+        public ConfigSourceDetails<ReturnType> configurationSource();
     }
 
     /**
@@ -87,7 +105,7 @@
      * 
      * @param <ReturnType> the type of interface to return after the repository source's configuration is completed
      */
-    public interface RepositoryConfigurator<ReturnType> {
+    public interface RepositorySourceConfigurator<ReturnType> {
         /**
          * Add a new {@link RepositorySource repository} for this configuration. The new repository will have the supplied name,
          * and if the name of an existing repository is used, this will replace the existing repository configuration.
@@ -96,9 +114,9 @@
          * @return the interface for choosing the class, which returns the interface used to configure the repository source;
          *         never null
          * @throws IllegalArgumentException if the repository name is null, empty, or otherwise invalid
-         * @see #addRepository(RepositorySource)
+         * @see #addSource(RepositorySource)
          */
-        public ChooseClass<RepositorySource, ? extends RepositoryDetails<ReturnType>> addRepository( final String id );
+        public ChooseClass<RepositorySource, RepositorySourceDetails<ReturnType>> addSource( final String id );
 
         /**
          * Add a new {@link RepositorySource repository} for this configuration. The new repository will have the supplied name,
@@ -107,9 +125,17 @@
          * @param source the {@link RepositorySource} instance that should be used
          * @return this configuration object, for method-chaining purposes
          * @throws IllegalArgumentException if the repository source reference is null
-         * @see #addRepository(String)
+         * @see #addSource(String)
          */
-        public ReturnType addRepository( RepositorySource source );
+        public ReturnType addSource( RepositorySource source );
+
+        /**
+         * Get the details for the repository source with the supplied identifier.
+         * 
+         * @param id the identifier of the repository that is to be added
+         * @return the details for the repository source, or null if there is no such source in this configuration
+         */
+        public RepositorySourceDetails<ReturnType> source( String id );
     }
 
     /**
@@ -127,6 +153,14 @@
          * @throws IllegalArgumentException if the detector name is null, empty, or otherwise invalid
          */
         public ChooseClass<MimeTypeDetector, MimeTypeDetectorDetails<ReturnType>> addMimeTypeDetector( final String id );
+
+        /**
+         * Get the details for the MIME type detector with the supplied identifier.
+         * 
+         * @param id the identifier of the MIME type detector that is to be added
+         * @return the details for the MIME type detector, or null if there is no such detector in this configuration
+         */
+        public MimeTypeDetectorDetails<ReturnType> mimeTypeDetector( String id );
     }
 
     /**
@@ -149,9 +183,9 @@
      * 
      * @param <ReturnType>
      */
-    public interface RepositoryDetails<ReturnType>
-        extends SetName<RepositoryDetails<ReturnType>>, SetDescription<RepositoryDetails<ReturnType>>,
-        SetProperties<RepositoryDetails<ReturnType>>, And<ReturnType> {
+    public interface RepositorySourceDetails<ReturnType>
+        extends SetName<RepositorySourceDetails<ReturnType>>, SetDescription<RepositorySourceDetails<ReturnType>>,
+        SetProperties<RepositorySourceDetails<ReturnType>>, And<ReturnType> {
     }
 
     /**
@@ -159,16 +193,15 @@
      * 
      * @param <ReturnType>
      */
-    public interface ConfigRepositoryDetails<ReturnType>
-        extends SetDescription<ConfigRepositoryDetails<ReturnType>>, SetProperties<ConfigRepositoryDetails<ReturnType>>,
-        And<ReturnType> {
+    public interface ConfigSourceDetails<ReturnType>
+        extends SetDescription<ConfigSourceDetails<ReturnType>>, SetProperties<ConfigSourceDetails<ReturnType>>, And<ReturnType> {
         /**
          * Specify the path under which the configuration content is to be found. This path is assumed to be "/" by default.
          * 
          * @param path the path to the configuration content in the configuration source; may not be null
          * @return this instance for method chaining purposes; never null
          */
-        public ConfigRepositoryDetails<ReturnType> under( String path );
+        public ConfigSourceDetails<ReturnType> under( String path );
 
         /**
          * Specify the path under which the configuration content is to be found. This path is assumed to be "/" by default.
@@ -176,7 +209,7 @@
          * @param workspace the name of the workspace with the configuration content in the configuration source; may not be null
          * @return this instance for method chaining purposes; never null
          */
-        public ConfigRepositoryDetails<ReturnType> inWorkspace( String workspace );
+        public ConfigSourceDetails<ReturnType> usingWorkspace( String workspace );
     }
 
     /**
@@ -242,86 +275,84 @@
      */
     public interface SetProperties<ReturnType> {
         /**
-         * Specify the name of the JavaBean-style property that is to be set. The value may be set using the interface returned by
-         * this method.
+         * Set the property value to an integer.
          * 
          * @param beanPropertyName the name of the JavaBean-style property (e.g., "retryLimit")
-         * @return the interface used to set the value for the property; never null
-         */
-        PropertySetter<ReturnType> with( String beanPropertyName );
-    }
-
-    /**
-     * The interface used to set the value for a JavaBean-style property.
-     * 
-     * @param <ReturnType> the interface returned from these methods
-     * @author Randall Hauch
-     * @see Configurator.SetProperties#with(String)
-     */
-    public interface PropertySetter<ReturnType> {
-        /**
-         * Set the property value to an integer.
-         * 
          * @param value the new value for the property
          * @return the next component to continue configuration; never null
          */
-        ReturnType setTo( int value );
+        ReturnType setProperty( String beanPropertyName,
+                                int value );
 
         /**
          * Set the property value to a long number.
          * 
+         * @param beanPropertyName the name of the JavaBean-style property (e.g., "retryLimit")
          * @param value the new value for the property
          * @return the next component to continue configuration; never null
          */
-        ReturnType setTo( long value );
+        ReturnType setProperty( String beanPropertyName,
+                                long value );
 
         /**
          * Set the property value to a short.
          * 
+         * @param beanPropertyName the name of the JavaBean-style property (e.g., "retryLimit")
          * @param value the new value for the property
          * @return the next component to continue configuration; never null
          */
-        ReturnType setTo( short value );
+        ReturnType setProperty( String beanPropertyName,
+                                short value );
 
         /**
          * Set the property value to a boolean.
          * 
+         * @param beanPropertyName the name of the JavaBean-style property (e.g., "retryLimit")
          * @param value the new value for the property
          * @return the next component to continue configuration; never null
          */
-        ReturnType setTo( boolean value );
+        ReturnType setProperty( String beanPropertyName,
+                                boolean value );
 
         /**
          * Set the property value to a float.
          * 
+         * @param beanPropertyName the name of the JavaBean-style property (e.g., "retryLimit")
          * @param value the new value for the property
          * @return the next component to continue configuration; never null
          */
-        ReturnType setTo( float value );
+        ReturnType setProperty( String beanPropertyName,
+                                float value );
 
         /**
          * Set the property value to a double.
          * 
+         * @param beanPropertyName the name of the JavaBean-style property (e.g., "retryLimit")
          * @param value the new value for the property
          * @return the next component to continue configuration; never null
          */
-        ReturnType setTo( double value );
+        ReturnType setProperty( String beanPropertyName,
+                                double value );
 
         /**
          * Set the property value to a string.
          * 
+         * @param beanPropertyName the name of the JavaBean-style property (e.g., "retryLimit")
          * @param value the new value for the property
          * @return the next component to continue configuration; never null
          */
-        ReturnType setTo( String value );
+        ReturnType setProperty( String beanPropertyName,
+                                String value );
 
         /**
          * Set the property value to an object.
          * 
+         * @param beanPropertyName the name of the JavaBean-style property (e.g., "retryLimit")
          * @param value the new value for the property
          * @return the next component to continue configuration; never null
          */
-        ReturnType setTo( Object value );
+        ReturnType setProperty( String beanPropertyName,
+                                Object value );
     }
 
     /**
@@ -378,10 +409,10 @@
         /**
          * Specify the human-readable name for this component.
          * 
-         * @param description the description; may be null or empty
+         * @param name the name; may be null or empty
          * @return the next component to continue configuration; never null
          */
-        ReturnType named( String description );
+        ReturnType named( String name );
     }
 
     /**
@@ -434,6 +465,7 @@
     protected ConfigurationRepository configurationSource;
     private Graph graph;
     private Graph.Batch batch;
+    private final Problems problems;
 
     /**
      * Specify a new {@link ExecutionContext} that should be used for this DNA instance.
@@ -448,12 +480,20 @@
         CheckArg.isNotNull(builder, "builder");
         this.context = context;
         this.builder = builder;
+        this.problems = new SimpleProblems();
 
         // Set up the default configuration repository ...
         this.configurationSource = createDefaultConfigurationSource();
     }
 
     /**
+     * @return problems
+     */
+    public Problems getProblems() {
+        return problems;
+    }
+
+    /**
      * Method that is used to set up the default configuration repository source. By default, this method sets up the
      * {@link InMemoryRepositorySource} loaded from the classpath.
      * 
@@ -522,9 +562,28 @@
     protected abstract Name nameFor( String name );
 
     protected Path createOrReplaceNode( Path parentPath,
+                                        String id,
+                                        Name propertyName,
+                                        Object value ) {
+        Path path = pathFactory().create(parentPath, id);
+        configuration().create(path).with(propertyName, value).and();
+        return path;
+
+    }
+
+    protected Path createOrReplaceNode( Path parentPath,
+                                        Name id,
+                                        Name propertyName,
+                                        Object value ) {
+        Path path = pathFactory().create(parentPath, id);
+        configuration().create(path).with(propertyName, value).and();
+        return path;
+    }
+
+    protected Path createOrReplaceNode( Path parentPath,
                                         String id ) {
         Path path = pathFactory().create(parentPath, id);
-        configuration().create(path).with(DnaLexicon.READABLE_NAME, id).and();
+        configuration().create(path).and();
         return path;
 
     }
@@ -532,7 +591,7 @@
     protected Path createOrReplaceNode( Path parentPath,
                                         Name id ) {
         Path path = pathFactory().create(parentPath, id);
-        configuration().create(path).with(DnaLexicon.READABLE_NAME, id).and();
+        configuration().create(path).and();
         return path;
     }
 
@@ -555,7 +614,7 @@
     }
 
     protected class ConfigurationRepositoryClassChooser<ReturnType>
-        implements ChooseClass<RepositorySource, ConfigRepositoryDetails<ReturnType>> {
+        implements ChooseClass<RepositorySource, ConfigSourceDetails<ReturnType>> {
 
         private final ReturnType returnObject;
 
@@ -564,10 +623,10 @@
             this.returnObject = returnObject;
         }
 
-        public LoadedFrom<ConfigRepositoryDetails<ReturnType>> usingClass( final String className ) {
-            return new LoadedFrom<ConfigRepositoryDetails<ReturnType>>() {
+        public LoadedFrom<ConfigSourceDetails<ReturnType>> usingClass( final String className ) {
+            return new LoadedFrom<ConfigSourceDetails<ReturnType>>() {
                 @SuppressWarnings( "unchecked" )
-                public ConfigRepositoryDetails loadedFrom( String... classpath ) {
+                public ConfigSourceDetails loadedFrom( String... classpath ) {
                     ClassLoader classLoader = getExecutionContext().getClassLoader(classpath);
                     Class<? extends RepositorySource> clazz = null;
                     try {
@@ -580,7 +639,7 @@
                 }
 
                 @SuppressWarnings( "unchecked" )
-                public ConfigRepositoryDetails loadedFromClasspath() {
+                public ConfigSourceDetails loadedFromClasspath() {
                     Class<? extends RepositorySource> clazz = null;
                     try {
                         clazz = (Class<? extends RepositorySource>)Class.forName(className);
@@ -592,7 +651,7 @@
             };
         }
 
-        public ConfigRepositoryDetails<ReturnType> usingClass( Class<? extends RepositorySource> repositorySource ) {
+        public ConfigSourceDetails<ReturnType> usingClass( Class<? extends RepositorySource> repositorySource ) {
             try {
                 Configurator.this.configurationSource = new ConfigurationRepository(repositorySource.newInstance());
             } catch (InstantiationException err) {
@@ -606,7 +665,7 @@
         }
     }
 
-    protected class ConfigurationSourceDetails<ReturnType> implements ConfigRepositoryDetails<ReturnType> {
+    protected class ConfigurationSourceDetails<ReturnType> implements ConfigSourceDetails<ReturnType> {
         private final ReturnType returnObject;
 
         protected ConfigurationSourceDetails( ReturnType returnObject ) {
@@ -619,7 +678,7 @@
          * 
          * @see org.jboss.dna.repository.Configurator.SetDescription#describedAs(java.lang.String)
          */
-        public ConfigRepositoryDetails<ReturnType> describedAs( String description ) {
+        public ConfigSourceDetails<ReturnType> describedAs( String description ) {
             Configurator.this.configurationSource = Configurator.this.configurationSource.withDescription(description);
             return this;
         }
@@ -627,20 +686,98 @@
         /**
          * {@inheritDoc}
          * 
-         * @see org.jboss.dna.repository.Configurator.SetProperties#with(java.lang.String)
+         * @see org.jboss.dna.repository.Configurator.SetProperties#setProperty(java.lang.String, boolean)
          */
-        public PropertySetter<ConfigRepositoryDetails<ReturnType>> with( String propertyName ) {
-            return new BeanPropertySetter<ConfigRepositoryDetails<ReturnType>>(
-                                                                               Configurator.this.configurationSource.getRepositorySource(),
-                                                                               propertyName, this);
+        public ConfigSourceDetails<ReturnType> setProperty( String propertyName,
+                                                            boolean value ) {
+            return setProperty(propertyName, (Object)value);
         }
 
         /**
          * {@inheritDoc}
          * 
-         * @see org.jboss.dna.repository.Configurator.ConfigRepositoryDetails#inWorkspace(java.lang.String)
+         * @see org.jboss.dna.repository.Configurator.SetProperties#setProperty(java.lang.String, int)
          */
-        public ConfigRepositoryDetails<ReturnType> inWorkspace( String workspace ) {
+        public ConfigSourceDetails<ReturnType> setProperty( String propertyName,
+                                                            int value ) {
+            return setProperty(propertyName, (Object)value);
+        }
+
+        /**
+         * {@inheritDoc}
+         * 
+         * @see org.jboss.dna.repository.Configurator.SetProperties#setProperty(java.lang.String, short)
+         */
+        public ConfigSourceDetails<ReturnType> setProperty( String propertyName,
+                                                            short value ) {
+            return setProperty(propertyName, (Object)value);
+        }
+
+        /**
+         * {@inheritDoc}
+         * 
+         * @see org.jboss.dna.repository.Configurator.SetProperties#setProperty(java.lang.String, long)
+         */
+        public ConfigSourceDetails<ReturnType> setProperty( String propertyName,
+                                                            long value ) {
+            return setProperty(propertyName, (Object)value);
+        }
+
+        /**
+         * {@inheritDoc}
+         * 
+         * @see org.jboss.dna.repository.Configurator.SetProperties#setProperty(java.lang.String, float)
+         */
+        public ConfigSourceDetails<ReturnType> setProperty( String propertyName,
+                                                            float value ) {
+            return setProperty(propertyName, (Object)value);
+        }
+
+        /**
+         * {@inheritDoc}
+         * 
+         * @see org.jboss.dna.repository.Configurator.SetProperties#setProperty(java.lang.String, double)
+         */
+        public ConfigSourceDetails<ReturnType> setProperty( String propertyName,
+                                                            double value ) {
+            return setProperty(propertyName, (Object)value);
+        }
+
+        /**
+         * {@inheritDoc}
+         * 
+         * @see org.jboss.dna.repository.Configurator.SetProperties#setProperty(java.lang.String, java.lang.String)
+         */
+        public ConfigSourceDetails<ReturnType> setProperty( String propertyName,
+                                                            String value ) {
+            return setProperty(propertyName, (Object)value);
+        }
+
+        /**
+         * {@inheritDoc}
+         * 
+         * @see org.jboss.dna.repository.Configurator.SetProperties#setProperty(java.lang.String, java.lang.Object)
+         */
+        public ConfigSourceDetails<ReturnType> setProperty( String beanPropertyName,
+                                                            Object value ) {
+            // Set the JavaBean-style property on the RepositorySource instance ...
+            Object javaBean = Configurator.this.configurationSource.getRepositorySource();
+            Reflection reflection = new Reflection(javaBean.getClass());
+            try {
+                reflection.invokeSetterMethodOnTarget(beanPropertyName, javaBean, value);
+            } catch (Throwable err) {
+                I18n msg = RepositoryI18n.errorSettingJavaBeanPropertyOnInstanceOfClass;
+                throw new DnaConfigurationException(msg.text(beanPropertyName, javaBean.getClass(), err.getMessage()), err);
+            }
+            return this;
+        }
+
+        /**
+         * {@inheritDoc}
+         * 
+         * @see org.jboss.dna.repository.Configurator.ConfigSourceDetails#usingWorkspace(java.lang.String)
+         */
+        public ConfigSourceDetails<ReturnType> usingWorkspace( String workspace ) {
             Configurator.this.configurationSource = Configurator.this.configurationSource.withWorkspace(workspace);
             return this;
         }
@@ -648,9 +785,9 @@
         /**
          * {@inheritDoc}
          * 
-         * @see org.jboss.dna.repository.Configurator.ConfigRepositoryDetails#under(java.lang.String)
+         * @see org.jboss.dna.repository.Configurator.ConfigSourceDetails#under(java.lang.String)
          */
-        public ConfigRepositoryDetails<ReturnType> under( String path ) {
+        public ConfigSourceDetails<ReturnType> under( String path ) {
             CheckArg.isNotNull(path, "path");
             Path newPath = getExecutionContext().getValueFactories().getPathFactory().create(path);
             Configurator.this.configurationSource = Configurator.this.configurationSource.with(newPath);
@@ -724,174 +861,142 @@
         }
     }
 
-    /**
-     * Reusable implementation of {@link Configurator.PropertySetter} that sets the JavaBean-style property using reflection.
-     * 
-     * @param <ReturnType>
-     */
-    protected class BeanPropertySetter<ReturnType> implements Configurator.PropertySetter<ReturnType> {
-        private final Object javaBean;
-        private final String beanPropertyName;
-        private final ReturnType returnObject;
-
-        protected BeanPropertySetter( Object javaBean,
-                                      String beanPropertyName,
-                                      ReturnType returnObject ) {
-            assert javaBean != null;
-            assert beanPropertyName != null;
-            assert returnObject != null;
-            this.javaBean = javaBean;
-            this.beanPropertyName = beanPropertyName;
-            this.returnObject = returnObject;
-        }
-
-        public ReturnType setTo( boolean value ) {
-            return setTo((Object)value);
-        }
-
-        public ReturnType setTo( int value ) {
-            return setTo((Object)value);
-        }
-
-        public ReturnType setTo( long value ) {
-            return setTo((Object)value);
-        }
-
-        public ReturnType setTo( short value ) {
-            return setTo((Object)value);
-        }
-
-        public ReturnType setTo( float value ) {
-            return setTo((Object)value);
-        }
-
-        public ReturnType setTo( double value ) {
-            return setTo((Object)value);
-        }
-
-        public ReturnType setTo( String value ) {
-            return setTo((Object)value);
-        }
-
-        public ReturnType setTo( Object value ) {
-            // Set the JavaBean-style property on the RepositorySource instance ...
-            Reflection reflection = new Reflection(javaBean.getClass());
-            try {
-                reflection.invokeSetterMethodOnTarget(beanPropertyName, javaBean, value);
-            } catch (Throwable err) {
-                I18n msg = RepositoryI18n.errorSettingJavaBeanPropertyOnInstanceOfClass;
-                throw new DnaConfigurationException(msg.text(beanPropertyName, javaBean.getClass(), err.getMessage()), err);
-            }
-            return returnObject;
-        }
+    protected <ReturnType> GraphRepositorySourceDetails<ReturnType> createRepositoryDetails( Path path,
+                                                                                             ReturnType returnObject ) {
+        return new GraphRepositorySourceDetails<ReturnType>(path, returnObject);
     }
 
-    /**
-     * Reusable implementation of {@link Configurator.PropertySetter} that sets the property on the specified node in the
-     * configuration graph.
-     * 
-     * @param <ReturnType>
-     */
-    protected class GraphPropertySetter<ReturnType> implements Configurator.PropertySetter<ReturnType> {
+    protected class GraphRepositorySourceDetails<ReturnType> implements RepositorySourceDetails<ReturnType> {
         private final Path path;
-        private final String beanPropertyName;
         private final ReturnType returnObject;
 
-        protected GraphPropertySetter( Path path,
-                                       String beanPropertyName,
-                                       ReturnType returnObject ) {
+        protected GraphRepositorySourceDetails( Path path,
+                                                ReturnType returnObject ) {
             assert path != null;
-            assert beanPropertyName != null;
             assert returnObject != null;
             this.path = path;
-            this.beanPropertyName = Inflector.getInstance().lowerCamelCase(beanPropertyName);
             this.returnObject = returnObject;
         }
 
-        public ReturnType setTo( boolean value ) {
-            configuration().set(nameFor(beanPropertyName)).to(value).on(path);
-            return returnObject;
+        public Path path() {
+            return this.path;
         }
 
-        public ReturnType setTo( int value ) {
-            configuration().set(nameFor(beanPropertyName)).to(value).on(path);
-            return returnObject;
+        /**
+         * Get the name used for this source.
+         * 
+         * @return the source's node name
+         */
+        public Name name() {
+            return path().getLastSegment().getName();
         }
 
-        public ReturnType setTo( long value ) {
-            configuration().set(nameFor(beanPropertyName)).to(value).on(path);
-            return returnObject;
+        /**
+         * {@inheritDoc}
+         * 
+         * @see org.jboss.dna.repository.Configurator.SetName#named(java.lang.String)
+         */
+        public RepositorySourceDetails<ReturnType> named( String name ) {
+            configuration().set(DnaLexicon.READABLE_NAME).to(name).on(path);
+            return this;
         }
 
-        public ReturnType setTo( short value ) {
-            configuration().set(nameFor(beanPropertyName)).to(value).on(path);
-            return returnObject;
+        /**
+         * {@inheritDoc}
+         * 
+         * @see org.jboss.dna.repository.Configurator.SetDescription#describedAs(java.lang.String)
+         */
+        public RepositorySourceDetails<ReturnType> describedAs( String description ) {
+            configuration().set(DnaLexicon.DESCRIPTION).to(description).on(path);
+            return this;
         }
 
-        public ReturnType setTo( float value ) {
-            configuration().set(nameFor(beanPropertyName)).to(value).on(path);
-            return returnObject;
+        /**
+         * {@inheritDoc}
+         * 
+         * @see org.jboss.dna.repository.Configurator.SetProperties#setProperty(java.lang.String, boolean)
+         */
+        public RepositorySourceDetails<ReturnType> setProperty( String propertyName,
+                                                                boolean value ) {
+            configuration().set(nameFor(propertyName)).to(value).on(path);
+            return this;
         }
 
-        public ReturnType setTo( double value ) {
-            configuration().set(nameFor(beanPropertyName)).to(value).on(path);
-            return returnObject;
+        /**
+         * {@inheritDoc}
+         * 
+         * @see org.jboss.dna.repository.Configurator.SetProperties#setProperty(java.lang.String, int)
+         */
+        public RepositorySourceDetails<ReturnType> setProperty( String propertyName,
+                                                                int value ) {
+            configuration().set(nameFor(propertyName)).to(value).on(path);
+            return this;
         }
 
-        public ReturnType setTo( String value ) {
-            configuration().set(nameFor(beanPropertyName)).to(value).on(path);
-            return returnObject;
+        /**
+         * {@inheritDoc}
+         * 
+         * @see org.jboss.dna.repository.Configurator.SetProperties#setProperty(java.lang.String, short)
+         */
+        public RepositorySourceDetails<ReturnType> setProperty( String propertyName,
+                                                                short value ) {
+            configuration().set(nameFor(propertyName)).to(value).on(path);
+            return this;
         }
 
-        public ReturnType setTo( Object value ) {
-            configuration().set(nameFor(beanPropertyName)).to(value).on(path);
-            return returnObject;
+        /**
+         * {@inheritDoc}
+         * 
+         * @see org.jboss.dna.repository.Configurator.SetProperties#setProperty(java.lang.String, long)
+         */
+        public RepositorySourceDetails<ReturnType> setProperty( String propertyName,
+                                                                long value ) {
+            configuration().set(nameFor(propertyName)).to(value).on(path);
+            return this;
         }
-    }
 
-    protected class GraphRepositoryDetails<ReturnType> implements RepositoryDetails<ReturnType> {
-        private final Path path;
-        private final ReturnType returnObject;
-
-        protected GraphRepositoryDetails( Path path,
-                                          ReturnType returnObject ) {
-            assert path != null;
-            assert returnObject != null;
-            this.path = path;
-            this.returnObject = returnObject;
+        /**
+         * {@inheritDoc}
+         * 
+         * @see org.jboss.dna.repository.Configurator.SetProperties#setProperty(java.lang.String, float)
+         */
+        public RepositorySourceDetails<ReturnType> setProperty( String propertyName,
+                                                                float value ) {
+            configuration().set(nameFor(propertyName)).to(value).on(path);
+            return this;
         }
 
-        protected Path path() {
-            return this.path;
-        }
-
         /**
          * {@inheritDoc}
          * 
-         * @see org.jboss.dna.repository.Configurator.SetName#named(java.lang.String)
+         * @see org.jboss.dna.repository.Configurator.SetProperties#setProperty(java.lang.String, double)
          */
-        public RepositoryDetails<ReturnType> named( String name ) {
-            configuration().set(DnaLexicon.READABLE_NAME).to(name).on(path);
+        public RepositorySourceDetails<ReturnType> setProperty( String propertyName,
+                                                                double value ) {
+            configuration().set(nameFor(propertyName)).to(value).on(path);
             return this;
         }
 
         /**
          * {@inheritDoc}
          * 
-         * @see org.jboss.dna.repository.Configurator.SetDescription#describedAs(java.lang.String)
+         * @see org.jboss.dna.repository.Configurator.SetProperties#setProperty(java.lang.String, java.lang.String)
          */
-        public RepositoryDetails<ReturnType> describedAs( String description ) {
-            configuration().set(DnaLexicon.DESCRIPTION).to(description).on(path);
+        public RepositorySourceDetails<ReturnType> setProperty( String propertyName,
+                                                                String value ) {
+            configuration().set(nameFor(propertyName)).to(value).on(path);
             return this;
         }
 
         /**
          * {@inheritDoc}
          * 
-         * @see org.jboss.dna.repository.Configurator.SetProperties#with(java.lang.String)
+         * @see org.jboss.dna.repository.Configurator.SetProperties#setProperty(java.lang.String, java.lang.Object)
          */
-        public PropertySetter<RepositoryDetails<ReturnType>> with( String propertyName ) {
-            return new GraphPropertySetter<RepositoryDetails<ReturnType>>(path, propertyName, this);
+        public RepositorySourceDetails<ReturnType> setProperty( String propertyName,
+                                                                Object value ) {
+            configuration().set(nameFor(propertyName)).to(value).on(path);
+            return this;
         }
 
         /**
@@ -1005,15 +1110,94 @@
         /**
          * {@inheritDoc}
          * 
-         * @see org.jboss.dna.repository.Configurator.SetProperties#with(java.lang.String)
+         * @see org.jboss.dna.repository.Configurator.SetProperties#setProperty(java.lang.String, boolean)
          */
-        public PropertySetter<MimeTypeDetectorDetails<ReturnType>> with( String propertyName ) {
-            return new GraphPropertySetter<MimeTypeDetectorDetails<ReturnType>>(path, propertyName, this);
+        public MimeTypeDetectorDetails<ReturnType> setProperty( String propertyName,
+                                                                boolean value ) {
+            configuration().set(nameFor(propertyName)).to(value).on(path);
+            return this;
         }
 
         /**
          * {@inheritDoc}
          * 
+         * @see org.jboss.dna.repository.Configurator.SetProperties#setProperty(java.lang.String, int)
+         */
+        public MimeTypeDetectorDetails<ReturnType> setProperty( String propertyName,
+                                                                int value ) {
+            configuration().set(nameFor(propertyName)).to(value).on(path);
+            return this;
+        }
+
+        /**
+         * {@inheritDoc}
+         * 
+         * @see org.jboss.dna.repository.Configurator.SetProperties#setProperty(java.lang.String, short)
+         */
+        public MimeTypeDetectorDetails<ReturnType> setProperty( String propertyName,
+                                                                short value ) {
+            configuration().set(nameFor(propertyName)).to(value).on(path);
+            return this;
+        }
+
+        /**
+         * {@inheritDoc}
+         * 
+         * @see org.jboss.dna.repository.Configurator.SetProperties#setProperty(java.lang.String, long)
+         */
+        public MimeTypeDetectorDetails<ReturnType> setProperty( String propertyName,
+                                                                long value ) {
+            configuration().set(nameFor(propertyName)).to(value).on(path);
+            return this;
+        }
+
+        /**
+         * {@inheritDoc}
+         * 
+         * @see org.jboss.dna.repository.Configurator.SetProperties#setProperty(java.lang.String, float)
+         */
+        public MimeTypeDetectorDetails<ReturnType> setProperty( String propertyName,
+                                                                float value ) {
+            configuration().set(nameFor(propertyName)).to(value).on(path);
+            return this;
+        }
+
+        /**
+         * {@inheritDoc}
+         * 
+         * @see org.jboss.dna.repository.Configurator.SetProperties#setProperty(java.lang.String, double)
+         */
+        public MimeTypeDetectorDetails<ReturnType> setProperty( String propertyName,
+                                                                double value ) {
+            configuration().set(nameFor(propertyName)).to(value).on(path);
+            return this;
+        }
+
+        /**
+         * {@inheritDoc}
+         * 
+         * @see org.jboss.dna.repository.Configurator.SetProperties#setProperty(java.lang.String, java.lang.String)
+         */
+        public MimeTypeDetectorDetails<ReturnType> setProperty( String propertyName,
+                                                                String value ) {
+            configuration().set(nameFor(propertyName)).to(value).on(path);
+            return this;
+        }
+
+        /**
+         * {@inheritDoc}
+         * 
+         * @see org.jboss.dna.repository.Configurator.SetProperties#setProperty(java.lang.String, java.lang.Object)
+         */
+        public MimeTypeDetectorDetails<ReturnType> setProperty( String propertyName,
+                                                                Object value ) {
+            configuration().set(nameFor(propertyName)).to(value).on(path);
+            return this;
+        }
+
+        /**
+         * {@inheritDoc}
+         * 
          * @see org.jboss.dna.repository.Configurator.SetDescription#describedAs(java.lang.String)
          */
         public MimeTypeDetectorDetails<ReturnType> describedAs( String description ) {

Modified: trunk/dna-repository/src/main/java/org/jboss/dna/repository/DnaConfiguration.java
===================================================================
--- trunk/dna-repository/src/main/java/org/jboss/dna/repository/DnaConfiguration.java	2009-06-03 20:07:47 UTC (rev 966)
+++ trunk/dna-repository/src/main/java/org/jboss/dna/repository/DnaConfiguration.java	2009-06-03 20:08:46 UTC (rev 967)
@@ -34,20 +34,20 @@
 import org.jboss.dna.graph.mimetype.MimeTypeDetector;
 import org.jboss.dna.graph.property.Name;
 import org.jboss.dna.graph.property.Path;
+import org.jboss.dna.graph.sequencer.StreamSequencer;
 import org.jboss.dna.repository.Configurator.ChooseClass;
-import org.jboss.dna.repository.Configurator.ConfigRepositoryDetails;
+import org.jboss.dna.repository.Configurator.ConfigSourceDetails;
 import org.jboss.dna.repository.Configurator.ConfigurationRepository;
 import org.jboss.dna.repository.Configurator.MimeTypeDetectorDetails;
-import org.jboss.dna.repository.Configurator.RepositoryDetails;
+import org.jboss.dna.repository.Configurator.RepositorySourceDetails;
 import org.jboss.dna.repository.Configurator.SequencerDetails;
-import org.jboss.dna.repository.sequencer.Sequencer;
 
 /**
  * 
  */
 public class DnaConfiguration
     implements Configurator.Initializer<DnaConfiguration>, Configurator.SequencerConfigurator<DnaConfiguration>,
-    Configurator.RepositoryConfigurator<DnaConfiguration>, Configurator.MimeDetectorConfigurator<DnaConfiguration>,
+    Configurator.RepositorySourceConfigurator<DnaConfiguration>, Configurator.MimeDetectorConfigurator<DnaConfiguration>,
     Configurator.Builder<DnaEngine> {
 
     protected static final Map<String, Name> NAMES_TO_MAP;
@@ -94,28 +94,28 @@
     /**
      * {@inheritDoc}
      * 
-     * @see org.jboss.dna.repository.Configurator.Initializer#withConfigurationRepository()
+     * @see org.jboss.dna.repository.Configurator.Initializer#withConfigurationSource()
      */
-    public ChooseClass<RepositorySource, ConfigRepositoryDetails<DnaConfiguration>> withConfigurationRepository() {
-        return builder.withConfigurationRepository();
+    public ChooseClass<RepositorySource, ConfigSourceDetails<DnaConfiguration>> withConfigurationSource() {
+        return builder.withConfigurationSource();
     }
 
     /**
      * {@inheritDoc}
      * 
-     * @see org.jboss.dna.repository.Configurator.RepositoryConfigurator#addRepository(java.lang.String)
+     * @see org.jboss.dna.repository.Configurator.RepositorySourceConfigurator#addSource(java.lang.String)
      */
-    public ChooseClass<RepositorySource, ? extends RepositoryDetails<DnaConfiguration>> addRepository( String id ) {
-        return builder.addRepository(id);
+    public ChooseClass<RepositorySource, RepositorySourceDetails<DnaConfiguration>> addSource( String id ) {
+        return builder.addSource(id);
     }
 
     /**
      * {@inheritDoc}
      * 
-     * @see org.jboss.dna.repository.Configurator.RepositoryConfigurator#addRepository(org.jboss.dna.graph.connector.RepositorySource)
+     * @see org.jboss.dna.repository.Configurator.RepositorySourceConfigurator#addSource(org.jboss.dna.graph.connector.RepositorySource)
      */
-    public DnaConfiguration addRepository( RepositorySource source ) {
-        return builder.addRepository(source);
+    public DnaConfiguration addSource( RepositorySource source ) {
+        return builder.addSource(source);
     }
 
     /**
@@ -123,7 +123,7 @@
      * 
      * @see org.jboss.dna.repository.Configurator.SequencerConfigurator#addSequencer(java.lang.String)
      */
-    public ChooseClass<Sequencer, SequencerDetails<DnaConfiguration>> addSequencer( String id ) {
+    public ChooseClass<StreamSequencer, SequencerDetails<DnaConfiguration>> addSequencer( String id ) {
         return builder.addSequencer(id);
     }
 
@@ -165,7 +165,7 @@
 
     public static class Builder<ReturnType> extends Configurator<ReturnType>
         implements Configurator.Initializer<ReturnType>, Configurator.SequencerConfigurator<ReturnType>,
-        Configurator.RepositoryConfigurator<ReturnType>, Configurator.MimeDetectorConfigurator<ReturnType> {
+        Configurator.RepositorySourceConfigurator<ReturnType>, Configurator.MimeDetectorConfigurator<ReturnType> {
 
         private Path sourcesPath;
         private Path sequencersPath;
@@ -187,10 +187,6 @@
             return new DnaEngine(context, configurationSource);
         }
 
-        public ConfigurationRepository getConfigurationRepository() {
-            return configurationSource;
-        }
-
         protected Path sourcesPath() {
             // Make sure the "dna:sources" node is there
             if (sourcesPath == null) {
@@ -224,49 +220,58 @@
         /**
          * {@inheritDoc}
          * 
-         * @see org.jboss.dna.repository.Configurator.Initializer#withConfigurationRepository()
+         * @see org.jboss.dna.repository.Configurator.Initializer#withConfigurationSource()
          */
-        public ChooseClass<RepositorySource, ConfigRepositoryDetails<ReturnType>> withConfigurationRepository() {
+        public ChooseClass<RepositorySource, ConfigSourceDetails<ReturnType>> withConfigurationSource() {
             return new ConfigurationRepositoryClassChooser<ReturnType>(builder);
         }
+        
+        /**
+         * {@inheritDoc}
+         *
+         * @see org.jboss.dna.repository.Configurator.Initializer#configurationSource()
+         */
+        public ConfigSourceDetails<ReturnType> configurationSource() {
+            return configurationSource;
+        }
 
         /**
          * {@inheritDoc}
          * 
          * @see org.jboss.dna.repository.Configurator.SequencerConfigurator#addSequencer(java.lang.String)
          */
-        public ChooseClass<Sequencer, SequencerDetails<ReturnType>> addSequencer( String id ) {
+        public ChooseClass<StreamSequencer, SequencerDetails<ReturnType>> addSequencer( String id ) {
             CheckArg.isNotEmpty(id, "id");
             // Now create the "dna:sequencer" node with the supplied id ...
-            Path path = createOrReplaceNode(sequencersPath(), id);
+            Path path = createOrReplaceNode(sequencersPath(), id, DnaLexicon.READABLE_NAME, id);
             SequencerDetails<ReturnType> details = new GraphSequencerDetails<ReturnType>(path, builder);
-            return new ClassChooser<Sequencer, SequencerDetails<ReturnType>>(path, details);
+            return new ClassChooser<StreamSequencer, SequencerDetails<ReturnType>>(path, details);
         }
 
         /**
          * {@inheritDoc}
          * 
-         * @see org.jboss.dna.repository.Configurator.RepositoryConfigurator#addRepository(java.lang.String)
+         * @see org.jboss.dna.repository.Configurator.RepositorySourceConfigurator#addSource(java.lang.String)
          */
-        public ChooseClass<RepositorySource, ? extends RepositoryDetails<ReturnType>> addRepository( String id ) {
+        public ChooseClass<RepositorySource, RepositorySourceDetails<ReturnType>> addSource( String id ) {
             CheckArg.isNotEmpty(id, "id");
             // Now create the "dna:source" node with the supplied id ...
-            Path path = createOrReplaceNode(sourcesPath(), id);
-            RepositoryDetails<ReturnType> details = new GraphRepositoryDetails<ReturnType>(path, builder);
-            return new ClassChooser<RepositorySource, RepositoryDetails<ReturnType>>(path, details);
+            Path path = createOrReplaceNode(sourcesPath(), id, DnaLexicon.READABLE_NAME, id);
+            RepositorySourceDetails<ReturnType> details = new GraphRepositorySourceDetails<ReturnType>(path, builder);
+            return new ClassChooser<RepositorySource, RepositorySourceDetails<ReturnType>>(path, details);
         }
 
         /**
          * {@inheritDoc}
          * 
-         * @see org.jboss.dna.repository.Configurator.RepositoryConfigurator#addRepository(org.jboss.dna.graph.connector.RepositorySource)
+         * @see org.jboss.dna.repository.Configurator.RepositorySourceConfigurator#addSource(org.jboss.dna.graph.connector.RepositorySource)
          */
-        public ReturnType addRepository( RepositorySource source ) {
+        public ReturnType addSource( RepositorySource source ) {
             CheckArg.isNotNull(source, "source");
             CheckArg.isNotEmpty(source.getName(), "source.getName()");
             String name = source.getName();
-            RepositoryDetails<ReturnType> details = addRepository(source.getName()).usingClass(source.getClass().getName())
-                                                                                   .loadedFromClasspath();
+            RepositorySourceDetails<ReturnType> details = addSource(source.getName()).usingClass(source.getClass().getName())
+                                                                                     .loadedFromClasspath();
             // Record all of the bean properties ...
             Path sourcePath = pathFactory().create(sourcesPath(), name);
             recordBeanPropertiesInGraph(sourcePath, source);
@@ -281,7 +286,7 @@
         public ChooseClass<MimeTypeDetector, MimeTypeDetectorDetails<ReturnType>> addMimeTypeDetector( String id ) {
             CheckArg.isNotEmpty(id, "id");
             // Now create the "dna:sequencer" node with the supplied id ...
-            Path detectorPath = createOrReplaceNode(detectorsPath(), id);
+            Path detectorPath = createOrReplaceNode(detectorsPath(), id, DnaLexicon.READABLE_NAME, id);
             MimeTypeDetectorDetails<ReturnType> details = new GraphMimeTypeDetectorDetails<ReturnType>(detectorPath, builder);
             return new ClassChooser<MimeTypeDetector, MimeTypeDetectorDetails<ReturnType>>(detectorPath, details);
         }

Modified: trunk/dna-repository/src/main/java/org/jboss/dna/repository/RepositoryService.java
===================================================================
--- trunk/dna-repository/src/main/java/org/jboss/dna/repository/RepositoryService.java	2009-06-03 20:07:47 UTC (rev 966)
+++ trunk/dna-repository/src/main/java/org/jboss/dna/repository/RepositoryService.java	2009-06-03 20:08:46 UTC (rev 967)
@@ -147,7 +147,7 @@
         CheckArg.isNotNull(context, "context");
         if (pathToConfigurationRoot == null) pathToConfigurationRoot = context.getValueFactories()
                                                                               .getPathFactory()
-                                                                              .create("/jcr:system");
+                                                                              .create("/dna:system");
         this.sources = sources;
         this.pathToConfigurationRoot = pathToConfigurationRoot;
         this.configurationSourceName = configurationSourceName;
@@ -304,6 +304,12 @@
                                                                     path.getLastSegment().getName().getLocalName());
         properties.put(JcrLexicon.NAME, nameProperty);
 
+        // Attempt to set the configuration information as bean properties,
+        // if they exist on the RepositorySource object and are not already set to some value ...
+        setBeanPropertyIfExistsAndNotSet(source, "configurationSourceName", getConfigurationSourceName());
+        setBeanPropertyIfExistsAndNotSet(source, "configurationWorkspaceName", getConfigurationWorkspaceName());
+        setBeanPropertyIfExistsAndNotSet(source, "configurationPath", stringFactory.create(path));
+
         // Now set all the properties that we can, ignoring any property that doesn't fit the pattern ...
         Reflection reflection = new Reflection(source.getClass());
         for (Map.Entry<Name, Property> entry : properties.entrySet()) {
@@ -417,6 +423,21 @@
         return source;
     }
 
+    protected boolean setBeanPropertyIfExistsAndNotSet( Object target,
+                                                        String propertyName,
+                                                        Object value ) {
+        Reflection reflection = new Reflection(target.getClass());
+        try {
+            if (reflection.invokeGetterMethodOnTarget(propertyName, target) == null) {
+                reflection.invokeSetterMethodOnTarget(propertyName, target, value);
+                return true;
+            }
+            return false;
+        } catch (Exception e) {
+            return false;
+        }
+    }
+
     /**
      * {@inheritDoc}
      */

Modified: trunk/dna-repository/src/test/java/org/jboss/dna/repository/DnaConfigurationTest.java
===================================================================
--- trunk/dna-repository/src/test/java/org/jboss/dna/repository/DnaConfigurationTest.java	2009-06-03 20:07:47 UTC (rev 966)
+++ trunk/dna-repository/src/test/java/org/jboss/dna/repository/DnaConfigurationTest.java	2009-06-03 20:08:46 UTC (rev 967)
@@ -36,6 +36,7 @@
 import org.jboss.dna.graph.mimetype.ExtensionBasedMimeTypeDetector;
 import org.jboss.dna.graph.property.Path;
 import org.jboss.dna.repository.sequencer.MockSequencerA;
+import org.jboss.dna.repository.sequencer.MockStreamSequencerA;
 import org.junit.Before;
 import org.junit.Test;
 
@@ -74,7 +75,7 @@
 
     @Test
     public void shouldAllowSpecifyingConfigurationRepository() {
-        DnaConfiguration config = configuration.withConfigurationRepository()
+        DnaConfiguration config = configuration.withConfigurationSource()
                                                .usingClass("org.jboss.dna.graph.connector.inmemory.InMemoryRepositorySource")
                                                .loadedFromClasspath()
                                                .describedAs("description")
@@ -103,7 +104,7 @@
         newSource.setRootNodeUuid(rootUuid);
 
         // Update the configuration and save it ...
-        configuration.addRepository(newSource).save();
+        configuration.addSource(newSource).save();
 
         // Verify that the graph has been updated correctly ...
         Subgraph subgraph = configuration.graph().getSubgraphOfDepth(3).at("/");
@@ -119,7 +120,7 @@
     @Test
     public void shouldAllowAddingRepositorySourceByClassNameAndSettingProperties() {
         // Update the configuration and save it ...
-        configuration.addRepository("Source1")
+        configuration.addSource("Source1")
                      .usingClass(InMemoryRepositorySource.class.getName())
                      .loadedFromClasspath()
                      .describedAs("description")
@@ -141,7 +142,7 @@
     @Test
     public void shouldAllowAddingRepositorySourceByClassNameAndClasspathAndSettingProperties() {
         // Update the configuration and save it ...
-        configuration.addRepository("Source1")
+        configuration.addSource("Source1")
                      .usingClass(InMemoryRepositorySource.class.getName())
                      .loadedFrom("cp1", "cp2")
                      .describedAs("description")
@@ -164,7 +165,7 @@
     @Test
     public void shouldAllowAddingRepositorySourceByClassReferenceAndSettingProperties() {
         // Update the configuration and save it ...
-        configuration.addRepository("Source1")
+        configuration.addSource("Source1")
                      .usingClass(InMemoryRepositorySource.class)
                      .describedAs("description")
                      .with("retryLimit")
@@ -186,13 +187,13 @@
     @Test
     public void shouldAllowOverwritingRepositorySourceByRepositoryName() {
         // Update the configuration and save it ...
-        configuration.addRepository("Source1")
+        configuration.addSource("Source1")
                      .usingClass(InMemoryRepositorySource.class)
                      .describedAs("description")
                      .with("retryLimit")
                      .setTo(3)
                      .and()
-                     .addRepository("Source1")
+                     .addSource("Source1")
                      .usingClass(InMemoryRepositorySource.class)
                      .describedAs("new description")
                      .with("retryLimit")
@@ -215,7 +216,7 @@
     @Test
     public void shouldAllowAddingMimeTypeDetector() {
         // Update the configuration and save it ...
-        configuration.addRepository("Source1")
+        configuration.addSource("Source1")
                      .usingClass(InMemoryRepositorySource.class)
                      .describedAs("description")
                      .and()
@@ -244,13 +245,13 @@
     @Test
     public void shouldAllowAddingSequencer() {
         // Update the configuration and save it ...
-        configuration.addRepository("Source1")
+        configuration.addSource("Source1")
                      .usingClass(InMemoryRepositorySource.class)
                      .describedAs("description")
                      .named("A Source")
                      .and()
                      .addSequencer("sequencerA")
-                     .usingClass(MockSequencerA.class)
+                     .usingClass(MockStreamSequencerA.class)
                      .named("The (Main) Sequencer")
                      .describedAs("Mock Sequencer A")
                      .sequencingFrom("/foo/source")
@@ -273,7 +274,7 @@
         assertThat(subgraph.getNode("/dna:sequencers/sequencerA"), hasProperty(DnaLexicon.READABLE_NAME, "The (Main) Sequencer"));
         assertThat(subgraph.getNode("/dna:sequencers/sequencerA"), hasProperty(DnaLexicon.DESCRIPTION, "Mock Sequencer A"));
         assertThat(subgraph.getNode("/dna:sequencers/sequencerA"), hasProperty(DnaLexicon.CLASSNAME,
-                                                                               MockSequencerA.class.getName()));
+                                                                               MockStreamSequencerA.class.getName()));
         System.out.println(subgraph.getNode("/dna:sequencers/sequencerA").getProperty(DnaLexicon.PATH_EXPRESSIONS));
         assertThat(subgraph.getNode("/dna:sequencers/sequencerA"), hasProperty(DnaLexicon.PATH_EXPRESSIONS,
                                                                                "/foo/source => /foo/target",
@@ -282,7 +283,7 @@
 
     @Test
     public void shouldAllowConfigurationInMultipleSteps() {
-        configuration.addRepository("Source1").usingClass(InMemoryRepositorySource.class).describedAs("description");
+        configuration.addSource("Source1").usingClass(InMemoryRepositorySource.class).describedAs("description");
         configuration.addMimeTypeDetector("detector")
                      .usingClass(ExtensionBasedMimeTypeDetector.class)
                      .describedAs("default detector");

Modified: trunk/dna-repository/src/test/java/org/jboss/dna/repository/DnaEngineTest.java
===================================================================
--- trunk/dna-repository/src/test/java/org/jboss/dna/repository/DnaEngineTest.java	2009-06-03 20:07:47 UTC (rev 966)
+++ trunk/dna-repository/src/test/java/org/jboss/dna/repository/DnaEngineTest.java	2009-06-03 20:08:46 UTC (rev 967)
@@ -36,7 +36,7 @@
 import org.jboss.dna.graph.connector.RepositoryConnection;
 import org.jboss.dna.graph.connector.inmemory.InMemoryRepositorySource;
 import org.jboss.dna.graph.mimetype.MimeTypeDetector;
-import org.jboss.dna.repository.sequencer.MockSequencerA;
+import org.jboss.dna.repository.sequencer.MockStreamSequencerA;
 import org.jboss.dna.repository.sequencer.SequencingService;
 import org.junit.Before;
 import org.junit.Test;
@@ -60,7 +60,7 @@
 
     @Test
     public void shouldAllowCreatingWithConfigRepository() throws InterruptedException {
-        engine = new DnaConfiguration().withConfigurationRepository()
+        engine = new DnaConfiguration().withConfigurationSource()
                                        .usingClass(InMemoryRepositorySource.class)
                                        .describedAs("Configuration Repository")
                                        .with("name")
@@ -82,13 +82,13 @@
 
     @Test
     public void shouldAllowCreatingMultipleRepositories() throws Exception {
-        engine = new DnaConfiguration().withConfigurationRepository()
+        engine = new DnaConfiguration().withConfigurationSource()
                                        .usingClass(InMemoryRepositorySource.class)
                                        .describedAs("Configuration Repository")
                                        .with("name")
                                        .setTo("config repo")
                                        .and()
-                                       .addRepository("JCR")
+                                       .addSource("JCR")
                                        .usingClass(InMemoryRepositorySource.class)
                                        .describedAs("Backing Repository for JCR Implementation")
                                        .with("name")
@@ -115,7 +115,7 @@
 
     @Test
     public void shouldAllowAddingMimeTypeDetectors() throws Exception {
-        engine = new DnaConfiguration().withConfigurationRepository()
+        engine = new DnaConfiguration().withConfigurationSource()
                                        .usingClass(InMemoryRepositorySource.class)
                                        .describedAs("Configuration Repository")
                                        .with("name")
@@ -138,14 +138,14 @@
 
     @Test
     public void shouldAllowAddingSequencers() throws Exception {
-        engine = new DnaConfiguration().withConfigurationRepository()
+        engine = new DnaConfiguration().withConfigurationSource()
                                        .usingClass(InMemoryRepositorySource.class)
                                        .describedAs("Configuration Repository")
                                        .with("name")
                                        .setTo("config repo")
                                        .and()
                                        .addSequencer("Mock Sequencer A")
-                                       .usingClass(MockSequencerA.class)
+                                       .usingClass(MockStreamSequencerA.class)
                                        .describedAs("A Mock Sequencer")
                                        .sequencingFrom("/**")
                                        .andOutputtingTo("/")

Modified: trunk/docs/examples/gettingstarted/repositories/src/main/resources/aircraft.xml
===================================================================
--- trunk/docs/examples/gettingstarted/repositories/src/main/resources/aircraft.xml	2009-06-03 20:07:47 UTC (rev 966)
+++ trunk/docs/examples/gettingstarted/repositories/src/main/resources/aircraft.xml	2009-06-03 20:08:46 UTC (rev 967)
@@ -24,31 +24,31 @@
   ~ 51 Franklin Street, Fifth Floor
   ~ Boston, MA  02110-1301  USA
   -->
-<Aircraft xmlns:jcr="http://www.jcp.org/jcr/1.0" xmlns:nt="http://www.jcp.org/jcr/nt/1.0">
+<Aircraft xmlns:jcr="http://www.jcp.org/jcr/1.0" xmlns:nt="http://www.jcp.org/jcr/nt/1.0" xmlns="http://jboss.org/dna/examples/aircraft/1.0">
     <Business>
-        <nt:unstructured jcr:name="Gulfstream V" maker="Gulfstream" model="G-V" introduced="1995" range="5800nm" cruiseSpeed="488kt" crew="2" emptyWeight="46200lb" url="http://en.wikipedia.org/wiki/Gulfstream_V"/>
-        <nt:unstructured jcr:name="Learjet 45" maker="Learjet" model="LJ45" introduced="1995" numberBuilt="264+" crew="2" emptyWeight="13695lb" range="2120nm" cruiseSpeed="457kt" url="http://en.wikipedia.org/wiki/Learjet_45"/>
+        <Aircraft jcr:name="Gulfstream V" maker="Gulfstream" model="G-V" introduced="1995" range="5800nm" cruiseSpeed="488kt" crew="2" emptyWeight="46200lb" url="http://en.wikipedia.org/wiki/Gulfstream_V"/>
+        <Aircraft jcr:name="Learjet 45" maker="Learjet" model="LJ45" introduced="1995" numberBuilt="264+" crew="2" emptyWeight="13695lb" range="2120nm" cruiseSpeed="457kt" url="http://en.wikipedia.org/wiki/Learjet_45"/>
     </Business>
     <Commercial>
-        <nt:unstructured jcr:name="Boeing 777" maker="Boeing" model="777-200LR" introduced="1995" numberBuilt="731+" maxRange="7500nm" emptyWeight="326000lb" cruiseSpeed="560mph" url="http://en.wikipedia.org/wiki/Boeing_777"/>
-        <nt:unstructured jcr:name="Boeing 767" maker="Boeing" model="767-200" introduced="1982" numberBuilt="966+" maxRange="3950nm" emptyWeight="176650lb" cruiseSpeed="530mph"  url="http://en.wikipedia.org/wiki/Boeing_767"/>
-        <nt:unstructured jcr:name="Boeing 787" maker="Boeing" model="787-3" introduced="2009" range="3050nm" emptyWeight="223000lb" cruiseSpeed="561mph" url="http://en.wikipedia.org/wiki/Boeing_787"/>
-        <nt:unstructured jcr:name="Boeing 757" maker="Boeing" model="757-200" introduced="1983" numberBuilt="1050" range="3900nm" maxWeight="255000lb" cruiseSpeed="530mph" url="http://en.wikipedia.org/wiki/Boeing_757"/>
-        <nt:unstructured jcr:name="Airbus A380" maker="Airbus" model="A380-800" introduced="2007" numberBuilt="18" range="8200nm" maxWeight="1235000lb" cruiseSpeed="647mph" url="http://en.wikipedia.org/wiki/Airbus_a380"/>
-        <nt:unstructured jcr:name="Airbus A340" maker="Airbus" model="A340-200" introduced="1993" numberBuilt="354" range="8000nm" maxWeight="606300lb" cruiseSpeed="557mph" url="http://en.wikipedia.org/wiki/Airbus_A-340"/>
-        <nt:unstructured jcr:name="Airbus A310" maker="Airbus" model="A310-200" introduced="1983" numberBuilt="255" cruiseSpeed="850km/h" emptyWeight="176312lb" range="3670nm" url="http://en.wikipedia.org/wiki/Airbus_A-310"/>
-        <nt:unstructured jcr:name="Embraer RJ-175" maker="Embraer" model="ERJ170-200" introduced="2004" range="3334km" cruiseSpeed="481kt" emptyWeight="21810kg" url="http://en.wikipedia.org/wiki/EMBRAER_170"/>
+        <Aircraft jcr:name="Boeing 777" maker="Boeing" model="777-200LR" introduced="1995" numberBuilt="731+" maxRange="7500nm" emptyWeight="326000lb" cruiseSpeed="560mph" url="http://en.wikipedia.org/wiki/Boeing_777"/>
+        <Aircraft jcr:name="Boeing 767" maker="Boeing" model="767-200" introduced="1982" numberBuilt="966+" maxRange="3950nm" emptyWeight="176650lb" cruiseSpeed="530mph"  url="http://en.wikipedia.org/wiki/Boeing_767"/>
+        <Aircraft jcr:name="Boeing 787" maker="Boeing" model="787-3" introduced="2009" range="3050nm" emptyWeight="223000lb" cruiseSpeed="561mph" url="http://en.wikipedia.org/wiki/Boeing_787"/>
+        <Aircraft jcr:name="Boeing 757" maker="Boeing" model="757-200" introduced="1983" numberBuilt="1050" range="3900nm" maxWeight="255000lb" cruiseSpeed="530mph" url="http://en.wikipedia.org/wiki/Boeing_757"/>
+        <Aircraft jcr:name="Airbus A380" maker="Airbus" model="A380-800" introduced="2007" numberBuilt="18" range="8200nm" maxWeight="1235000lb" cruiseSpeed="647mph" url="http://en.wikipedia.org/wiki/Airbus_a380"/>
+        <Aircraft jcr:name="Airbus A340" maker="Airbus" model="A340-200" introduced="1993" numberBuilt="354" range="8000nm" maxWeight="606300lb" cruiseSpeed="557mph" url="http://en.wikipedia.org/wiki/Airbus_A-340"/>
+        <Aircraft jcr:name="Airbus A310" maker="Airbus" model="A310-200" introduced="1983" numberBuilt="255" cruiseSpeed="850km/h" emptyWeight="176312lb" range="3670nm" url="http://en.wikipedia.org/wiki/Airbus_A-310"/>
+        <Aircraft jcr:name="Embraer RJ-175" maker="Embraer" model="ERJ170-200" introduced="2004" range="3334km" cruiseSpeed="481kt" emptyWeight="21810kg" url="http://en.wikipedia.org/wiki/EMBRAER_170"/>
     </Commercial>
     <Vintage>
-        <nt:unstructured jcr:name="Fokker Trimotor" maker="Fokker" model="F.VII" introduced="1925" cruiseSpeed="170km/h" emptyWeight="3050kg" crew="2" url="http://en.wikipedia.org/wiki/Fokker_trimotor"/>
-        <nt:unstructured jcr:name="P-38 Lightning" maker="Lockheed" model="P-38" designedBy="Kelly Johnson" introduced="1941" numberBuilt="10037" rateOfClimb="4750ft/min" range="1300mi" emptyWeight="12780lb" crew="1" url="http://en.wikipedia.org/wiki/P-38_Lightning"/>
-        <nt:unstructured jcr:name="A6M Zero" maker="Mitsubishi" model="A6M" designedBy="Jiro Horikoshi" introduced="1940" numberBuilt="11000" crew="1" emptyWeight="3704lb" serviceCeiling="33000ft" maxSpeed="331mph" range="1929mi" rateOfClimb="3100ft/min" url="http://en.wikipedia.org/wiki/A6M_Zero"/>
-        <nt:unstructured jcr:name="Bf 109" maker="Messerschmitt" model="Bf 109" introduced="1937" url="http://en.wikipedia.org/wiki/BF_109"/>
-        <nt:unstructured jcr:name="Wright Flyer" maker="Wright Brothers" introduced="1903" range="852ft" maxSpeed="30mph" emptyWeight="605lb" crew="1"/>
+        <Aircraft jcr:name="Fokker Trimotor" maker="Fokker" model="F.VII" introduced="1925" cruiseSpeed="170km/h" emptyWeight="3050kg" crew="2" url="http://en.wikipedia.org/wiki/Fokker_trimotor"/>
+        <Aircraft jcr:name="P-38 Lightning" maker="Lockheed" model="P-38" designedBy="Kelly Johnson" introduced="1941" numberBuilt="10037" rateOfClimb="4750ft/min" range="1300mi" emptyWeight="12780lb" crew="1" url="http://en.wikipedia.org/wiki/P-38_Lightning"/>
+        <Aircraft jcr:name="A6M Zero" maker="Mitsubishi" model="A6M" designedBy="Jiro Horikoshi" introduced="1940" numberBuilt="11000" crew="1" emptyWeight="3704lb" serviceCeiling="33000ft" maxSpeed="331mph" range="1929mi" rateOfClimb="3100ft/min" url="http://en.wikipedia.org/wiki/A6M_Zero"/>
+        <Aircraft jcr:name="Bf 109" maker="Messerschmitt" model="Bf 109" introduced="1937" url="http://en.wikipedia.org/wiki/BF_109"/>
+        <Aircraft jcr:name="Wright Flyer" maker="Wright Brothers" introduced="1903" range="852ft" maxSpeed="30mph" emptyWeight="605lb" crew="1"/>
     </Vintage>
     <Homebuilt>
-        <nt:unstructured jcr:name="Long-EZ" maker="Rutan Aircraft Factory" model="61" emptyWeight="760lb" fuelCapacity="200L" maxSpeed="185kt" since="1976" range="1200nm" url="http://en.wikipedia.org/wiki/Rutan_Long-EZ"/>
-        <nt:unstructured jcr:name="Cirrus VK-30" maker="Cirrus Design" model="VK-30" emptyWeight="2400lb" maxLoad="1200lb" maxSpeed="250mph" rateOfClimb="1500ft/min" range="1300mi" url="http://en.wikipedia.org/wiki/Cirrus_VK-30"/>
-        <nt:unstructured jcr:name="Van's RV-4" maker="Van's Aircraft" model="RV-4" introduced="1980" emptyWeight="905lb" maxLoad="500lb" maxSpeed="200mph" rateOfClimb="2450ft/min" range="725mi" url="http://en.wikipedia.org/wiki/Van%27s_Aircraft_RV-4"/>
+        <Aircraft jcr:name="Long-EZ" maker="Rutan Aircraft Factory" model="61" emptyWeight="760lb" fuelCapacity="200L" maxSpeed="185kt" since="1976" range="1200nm" url="http://en.wikipedia.org/wiki/Rutan_Long-EZ"/>
+        <Aircraft jcr:name="Cirrus VK-30" maker="Cirrus Design" model="VK-30" emptyWeight="2400lb" maxLoad="1200lb" maxSpeed="250mph" rateOfClimb="1500ft/min" range="1300mi" url="http://en.wikipedia.org/wiki/Cirrus_VK-30"/>
+        <Aircraft jcr:name="Van's RV-4" maker="Van's Aircraft" model="RV-4" introduced="1980" emptyWeight="905lb" maxLoad="500lb" maxSpeed="200mph" rateOfClimb="2450ft/min" range="725mi" url="http://en.wikipedia.org/wiki/Van%27s_Aircraft_RV-4"/>
     </Homebuilt>
 </Aircraft>
\ No newline at end of file

Modified: trunk/docs/examples/gettingstarted/repositories/src/main/resources/cars.xml
===================================================================
--- trunk/docs/examples/gettingstarted/repositories/src/main/resources/cars.xml	2009-06-03 20:07:47 UTC (rev 966)
+++ trunk/docs/examples/gettingstarted/repositories/src/main/resources/cars.xml	2009-06-03 20:08:46 UTC (rev 967)
@@ -24,25 +24,27 @@
   ~ 51 Franklin Street, Fifth Floor
   ~ Boston, MA  02110-1301  USA
   -->
-<Cars xmlns:jcr="http://www.jcp.org/jcr/1.0" xmlns:nt="http://www.jcp.org/jcr/nt/1.0">
+<Cars xmlns:jcr="http://www.jcp.org/jcr/1.0"
+      xmlns:nt="http://www.jcp.org/jcr/nt/1.0" 
+      xmlns="http://jboss.org/dna/examples/cars/1.0">
     <Hybrid>
-        <nt:unstructured jcr:name="Toyota Prius" maker="Toyota" model="Prius" year="2008" msrp="$21,500" userRating="4.2" valueRating="5" mpgCity="48" mpgHighway="45"/>
-        <nt:unstructured jcr:name="Toyota Highlander" maker="Toyota" model="Highlander" year="2008" msrp="$34,200" userRating="4" valueRating="5" mpgCity="27" mpgHighway="25"/>
-        <nt:unstructured jcr:name="Nissan Altima" maker="Nissan" model="Altima" year="2008" msrp="$18,260" mpgCity="23" mpgHighway="32"/>
+        <Car jcr:name="Toyota Prius" maker="Toyota" model="Prius" year="2008" msrp="$21,500" userRating="4.2" valueRating="5" mpgCity="48" mpgHighway="45"/>
+        <Car jcr:name="Toyota Highlander" maker="Toyota" model="Highlander" year="2008" msrp="$34,200" userRating="4" valueRating="5" mpgCity="27" mpgHighway="25"/>
+        <Car jcr:name="Nissan Altima" maker="Nissan" model="Altima" year="2008" msrp="$18,260" mpgCity="23" mpgHighway="32"/>
     </Hybrid>
     <Sports>
-        <nt:unstructured jcr:name="Aston Martin DB9" maker="Aston Martin" model="DB9" year="2008" msrp="$171,600" userRating="5" mpgCity="12" mpgHighway="19" lengthInInches="185.5" wheelbaseInInches="108.0" engine="5,935 cc 5.9 liters V 12"/>
-        <nt:unstructured jcr:name="Infiniti G37" maker="Infiniti" model="G37" year="2008" msrp="$34,900" userRating="3.5" valueRating="4" mpgCity="18" mpgHighway="24" />
+        <Car jcr:name="Aston Martin DB9" maker="Aston Martin" model="DB9" year="2008" msrp="$171,600" userRating="5" mpgCity="12" mpgHighway="19" lengthInInches="185.5" wheelbaseInInches="108.0" engine="5,935 cc 5.9 liters V 12"/>
+        <Car jcr:name="Infiniti G37" maker="Infiniti" model="G37" year="2008" msrp="$34,900" userRating="3.5" valueRating="4" mpgCity="18" mpgHighway="24" />
     </Sports>
     <Luxury>
-        <nt:unstructured jcr:name="Cadillac DTS" maker="Cadillac" model="DTS" year="2008" engine="3.6-liter V6" userRating="0"/>
-        <nt:unstructured jcr:name="Bentley Continental" maker="Bentley" model="Continental" year="2008" msrp="$170,990" mpgCity="10" mpgHighway="17" />
-        <nt:unstructured jcr:name="Lexus IS350" maker="Lexus" model="IS350" year="2008" msrp="$36,305" mpgCity="18" mpgHighway="25" userRating="4" valueRating="5" />
+        <Car jcr:name="Cadillac DTS" maker="Cadillac" model="DTS" year="2008" engine="3.6-liter V6" userRating="0"/>
+        <Car jcr:name="Bentley Continental" maker="Bentley" model="Continental" year="2008" msrp="$170,990" mpgCity="10" mpgHighway="17" />
+        <Car jcr:name="Lexus IS350" maker="Lexus" model="IS350" year="2008" msrp="$36,305" mpgCity="18" mpgHighway="25" userRating="4" valueRating="5" />
     </Luxury>
     <Utility>
-        <nt:unstructured jcr:name="Land Rover LR2" maker="Land Rover" model="LR2" year="2008" msrp="$33,985" userRating="4.5" valueRating="5" mpgCity="16" mpgHighway="23" />
-        <nt:unstructured jcr:name="Land Rover LR3" maker="Land Rover" model="LR3" year="2008" msrp="$48,525" userRating="5" valueRating="2" mpgCity="12" mpgHighway="17" />
-        <nt:unstructured jcr:name="Hummer H3" maker="Hummer" model="H3" year="2008" msrp="$30,595" userRating="3.5" valueRating="4" mpgCity="13" mpgHighway="16" />
-        <nt:unstructured jcr:name="Ford F-150" maker="Ford" model="F-150" year="2008" msrp="$23,910" userRating="4" valueRating="1" mpgCity="14" mpgHighway="20" />
+        <Car jcr:name="Land Rover LR2" maker="Land Rover" model="LR2" year="2008" msrp="$33,985" userRating="4.5" valueRating="5" mpgCity="16" mpgHighway="23" />
+        <Car jcr:name="Land Rover LR3" maker="Land Rover" model="LR3" year="2008" msrp="$48,525" userRating="5" valueRating="2" mpgCity="12" mpgHighway="17" />
+        <Car jcr:name="Hummer H3" maker="Hummer" model="H3" year="2008" msrp="$30,595" userRating="3.5" valueRating="4" mpgCity="13" mpgHighway="16" />
+        <Car jcr:name="Ford F-150" maker="Ford" model="F-150" year="2008" msrp="$23,910" userRating="4" valueRating="1" mpgCity="14" mpgHighway="20" />
     </Utility>
 </Cars>
\ No newline at end of file

Modified: trunk/docs/examples/gettingstarted/repositories/src/main/resources/configRepository.xml
===================================================================
--- trunk/docs/examples/gettingstarted/repositories/src/main/resources/configRepository.xml	2009-06-03 20:07:47 UTC (rev 966)
+++ trunk/docs/examples/gettingstarted/repositories/src/main/resources/configRepository.xml	2009-06-03 20:08:46 UTC (rev 967)
@@ -24,14 +24,58 @@
   ~ 51 Franklin Street, Fifth Floor
   ~ Boston, MA  02110-1301  USA
   -->
-<jcr:system xmlns:dna="http://www.jboss.org/dna/1.0" xmlns:jcr="http://www.jcp.org/jcr/1.0">
-    <dna:namespaces jcr:primaryType="dna:namespaces">
-    </dna:namespaces>
+<configuration xmlns="http://www.jboss.org/dna/1.0" xmlns:jcr="http://www.jcp.org/jcr/1.0">
     <!-- Define the sources from which content is made available -->
-    <dna:sources jcr:primaryType="nt:unstructured">
-        <dna:source jcr:name="SourceA" jcr:primaryType="nt:unstructured" dna:name="Cars" dna:classname="org.jboss.dna.graph.connector.inmemory.InMemoryRepositorySource" dna:retryLimit="3" defaultWorkspaceName="default"/>
-        <dna:source jcr:name="SourceB" jcr:primaryType="nt:unstructured" dna:name="Aircraft" dna:classname="org.jboss.dna.graph.connector.inmemory.InMemoryRepositorySource" defaultWorkspaceName="default"/>
-        <dna:source jcr:name="SourceC" jcr:primaryType="nt:unstructured" dna:name="Vehicles" dna:classname="org.jboss.dna.graph.connector.inmemory.InMemoryRepositorySource" defaultWorkspaceName="default"/>
-        <dna:source jcr:name="SourceD" jcr:primaryType="nt:unstructured" dna:name="Cache" dna:classname="org.jboss.dna.graph.connector.inmemory.InMemoryRepositorySource" defaultWorkspaceName="default"/>
-    </dna:sources>
-</jcr:system>
\ No newline at end of file
+    <sources jcr:primaryType="nt:unstructured">
+        <source jcr:name="Cars" classname="org.jboss.dna.graph.connector.inmemory.InMemoryRepositorySource" retryLimit="3" defaultWorkspaceName="default"/>
+        <source jcr:name="Aircraft" classname="org.jboss.dna.graph.connector.inmemory.InMemoryRepositorySource">
+            <defaultWorkspaceName>default</defaultWorkspaceName>
+        </source>
+        <source jcr:name="Vehicles">
+            <classname>org.jboss.dna.graph.connector.federated.FederatedRepositorySource</classname>
+            <workspaces>
+                <workspace jcr:name="default">
+                    <projections>
+                        <projection jcr:name="Main projection" source="Cars" workspace="default">
+                            <projectionRules>/Vehicles => /</projectionRules>
+                        </projection>
+                    </projections>
+                </workspace>
+            </workspaces>
+        </source>
+        <source jcr:name="Cache" classname="org.jboss.dna.graph.connector.inmemory.InMemoryRepositorySource">
+            <defaultWorkspaceName>default</defaultWorkspaceName>
+        </source>
+    </sources>
+    <!-- Define the JCR repositories -->
+    <repositories>
+        <repository jcr:name="cars">
+            <!-- Specify the source that should be used for the repository -->
+            <source>Cars</source>
+            <!-- Define the options for the JCR repository, using camelcase version of JcrRepository.Option names -->
+            <options jcr:primaryType="dna:options"/>
+            <!-- Define any custom node types. Importing CND files via JcrConfiguration is equivalent to specifying here. -->
+            <nodeTypes jcr:primaryType="dna:nodeTypes"/>
+            <!-- Define any namespaces for this repository, other than those already defined by JCR or DNA -->
+            <namespaces jcr:primaryType="dna:namespaces">
+                <car jcr:primaryType="dna:namespace" dna:uri="http://jboss.org/dna/examples/cars/1.0"/>
+            </namespaces>
+        </repository>
+        <repository jcr:name="vehicles">
+            <!-- Specify the source that should be used for the repository -->
+            <source>Vehicles</source>
+            <!-- Define the options for the JCR repository, using camelcase version of JcrRepository.Option names -->
+            <options jcr:primaryType="dna:options">
+                <projectNodeTypes jcr:primaryType="dna:option" dna:value="false"/>
+                <jaasLoginConfigName jcr:primaryType="dna:option" dna:value="dna-jcr"/>
+            </options>
+            <!-- Define any custom node types. Importing CND files via JcrConfiguration is equivalent to specifying here. -->
+            <nodeTypes jcr:primaryType="dna:nodeTypes"/>
+            <!-- Define any namespaces for this repository, other than those already defined by JCR, DNA or by imported content. -->
+            <namespaces jcr:primaryType="dna:namespaces">
+                <car jcr:primaryType="dna:namespace" dna:uri="http://jboss.org/dna/examples/cars/1.0"/>
+                <air jcr:primaryType="dna:namespace" dna:uri="http://jboss.org/dna/examples/aircraft/1.0"/>
+            </namespaces>
+        </repository>
+    </repositories>
+</configuration>
\ No newline at end of file

Modified: trunk/docs/examples/gettingstarted/sequencers/src/main/java/org/jboss/example/dna/sequencer/ConsoleInput.java
===================================================================
--- trunk/docs/examples/gettingstarted/sequencers/src/main/java/org/jboss/example/dna/sequencer/ConsoleInput.java	2009-06-03 20:07:47 UTC (rev 966)
+++ trunk/docs/examples/gettingstarted/sequencers/src/main/java/org/jboss/example/dna/sequencer/ConsoleInput.java	2009-06-03 20:08:46 UTC (rev 967)
@@ -41,10 +41,8 @@
     public ConsoleInput( final SequencingClient client ) {
         try {
             System.out.println();
-            System.out.print("Starting repository and sequencing service ... ");
+            System.out.print("Starting DNA repository and sequencing service ... ");
             client.startRepository();
-            System.out.print("done.\nStarting sequencing service ... ");
-            client.startDnaServices();
             System.out.println("done.");
             System.out.println();
 
@@ -101,9 +99,7 @@
                         try {
                             // Terminate ...
                             System.out.println();
-                            System.out.print("Shutting down sequencing service ... ");
-                            client.shutdownDnaServices();
-                            System.out.print("done.\nShutting down repository ... ");
+                            System.out.print("Shutting down repository ... ");
                             client.shutdownRepository();
                             System.out.print("done.");
                             System.out.println();

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	2009-06-03 20:07:47 UTC (rev 966)
+++ trunk/docs/examples/gettingstarted/sequencers/src/main/java/org/jboss/example/dna/sequencer/SequencingClient.java	2009-06-03 20:08:46 UTC (rev 967)
@@ -23,7 +23,6 @@
  */
 package org.jboss.example.dna.sequencer;
 
-import java.io.File;
 import java.net.URL;
 import java.util.ArrayList;
 import java.util.Calendar;
@@ -32,7 +31,6 @@
 import java.util.Properties;
 import java.util.TreeMap;
 import java.util.concurrent.TimeUnit;
-import javax.jcr.Credentials;
 import javax.jcr.Node;
 import javax.jcr.NodeIterator;
 import javax.jcr.PathNotFoundException;
@@ -41,73 +39,97 @@
 import javax.jcr.Repository;
 import javax.jcr.RepositoryException;
 import javax.jcr.Session;
-import javax.jcr.SimpleCredentials;
 import javax.jcr.Value;
 import javax.jcr.ValueFormatException;
-import org.apache.jackrabbit.api.JackrabbitNodeTypeManager;
-import org.apache.jackrabbit.core.TransientRepository;
-import org.jboss.dna.common.SystemFailureException;
+import javax.security.auth.login.LoginException;
 import org.jboss.dna.graph.ExecutionContext;
-import org.jboss.dna.repository.sequencer.SequencerConfig;
+import org.jboss.dna.graph.connector.inmemory.InMemoryRepositorySource;
+import org.jboss.dna.jcr.JcrConfiguration;
+import org.jboss.dna.jcr.JcrEngine;
 import org.jboss.dna.repository.sequencer.SequencingService;
 import org.jboss.dna.repository.util.SessionFactory;
-import org.jboss.dna.repository.util.SimpleSessionFactory;
+import org.jboss.dna.sequencer.image.ImageMetadataSequencer;
+import org.jboss.dna.sequencer.java.JavaMetadataSequencer;
+import org.jboss.dna.sequencer.mp3.Mp3MetadataSequencer;
 
 /**
  * @author Randall Hauch
  */
 public class SequencingClient {
 
-    public static final String DEFAULT_JACKRABBIT_CONFIG_PATH = "jackrabbitConfig.xml";
-    public static final String DEFAULT_WORKING_DIRECTORY = "repositoryData";
     public static final String DEFAULT_REPOSITORY_NAME = "repo";
     public static final String DEFAULT_WORKSPACE_NAME = "default";
     public static final String DEFAULT_USERNAME = "jsmith";
     public static final char[] DEFAULT_PASSWORD = "secret".toCharArray();
 
     public static void main( String[] args ) {
-        SequencingClient client = new SequencingClient();
-        client.setRepositoryInformation(DEFAULT_REPOSITORY_NAME, DEFAULT_WORKSPACE_NAME, DEFAULT_USERNAME, DEFAULT_PASSWORD);
+        // Set up an execution context in which we'll run, and authenticate using JAAS ...
+        ExecutionContext context = new ExecutionContext();
+        String jaasAppContext = "myAppContext";
+        String username = "jsmith";
+        char[] password = "secrete".toCharArray();
+        try {
+            context.with(jaasAppContext, username, password);
+        } catch (LoginException err) {
+            System.err.println("Error authenticating \"" + username + "\". Check username and password and try again.");
+        }
+
+        // Configure the DNA JCR engine ...
+        String repositoryId = "content";
+        String workspaceName = "default";
+        JcrConfiguration config = new JcrConfiguration(context);
+        config.withConfigurationSource().usingClass(InMemoryRepositorySource.class).usingWorkspace("default").under("/");
+        // Set up an in-memory repository where the uploaded and sequenced content will be stored ...
+        config.addSource(repositoryId)
+              .usingClass(InMemoryRepositorySource.class)
+              .withNodeTypes(ImageMetadataSequencer.class.getResource("org/jboss/dna/sequencer/image/images.cnd"))
+              .withNodeTypes(Mp3MetadataSequencer.class.getResource("org/jboss/dna/sequencer/mp3/mp3.cnd"))
+              .withNodeTypes(JavaMetadataSequencer.class.getResource("org/jboss/dna/sequencer/java/javaSource.cnd"))
+              .named("Content Repository")
+              .describedAs("The repository for our content")
+              .with("defaultWorkspaceName")
+              .setTo(workspaceName);
+        // Set up the image sequencer ...
+        config.addSequencer("images")
+              .usingClass("org.jboss.dna.sequencer.image.ImageMetadataSequencer")
+              .loadedFromClasspath()
+              .describedAs("Sequences image files to extract the characteristics of the image")
+              .named("Image Sequencer")
+              .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.addSequencer("mp3s")
+              .usingClass(Mp3MetadataSequencer.class)
+              .named("MP3 Sequencer")
+              .describedAs("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 source file sequencer ...
+        config.addSequencer("javaSource")
+              .usingClass(JavaMetadataSequencer.class)
+              .named("Java Sequencer")
+              .describedAs("Sequences mp3 files to extract the id3 tags of the audio file")
+              .sequencingFrom("//(*.mp3[*])/jcr:content[@jcr:data]")
+              .andOutputtingTo("/mp3s/$1");
+
+        // Now start the client and tell it which repository and workspace to use ...
+        SequencingClient client = new SequencingClient(config, repositoryId, workspaceName);
         client.setUserInterface(new ConsoleInput(client));
     }
 
-    private String repositoryName;
-    private String workspaceName;
-    private String username;
-    private char[] password;
-    private String jackrabbitConfigPath;
-    private String workingDirectory;
-    private Session keepAliveSession;
-    private Repository repository;
-    private SequencingService sequencingService;
+    private final String repositoryName;
+    private final String workspaceName;
+    private final JcrConfiguration configuration;
+    private JcrEngine engine;
     private UserInterface userInterface;
-    private ExecutionContext executionContext;
+    private Repository repository;
 
-    public SequencingClient() {
-        setJackrabbitConfigPath(DEFAULT_JACKRABBIT_CONFIG_PATH);
-        setWorkingDirectory(DEFAULT_WORKING_DIRECTORY);
-        setRepositoryInformation(DEFAULT_REPOSITORY_NAME, DEFAULT_WORKSPACE_NAME, DEFAULT_USERNAME, DEFAULT_PASSWORD);
-    }
-
-    protected void setWorkingDirectory( String workingDirectoryPath ) {
-        this.workingDirectory = workingDirectoryPath != null ? workingDirectoryPath : DEFAULT_WORKING_DIRECTORY;
-    }
-
-    protected void setJackrabbitConfigPath( String jackrabbitConfigPath ) {
-        this.jackrabbitConfigPath = jackrabbitConfigPath != null ? jackrabbitConfigPath : DEFAULT_JACKRABBIT_CONFIG_PATH;
-    }
-
-    protected void setRepositoryInformation( String repositoryName,
-                                             String workspaceName,
-                                             String username,
-                                             char[] password ) {
-        if (this.repository != null) {
-            throw new IllegalArgumentException("Unable to set repository information when repository is already running");
-        }
+    public SequencingClient( JcrConfiguration config,
+                             String repositoryName,
+                             String workspaceName ) {
+        this.configuration = config;
         this.repositoryName = repositoryName != null ? repositoryName : DEFAULT_REPOSITORY_NAME;
         this.workspaceName = workspaceName != null ? workspaceName : DEFAULT_WORKSPACE_NAME;
-        this.username = username;
-        this.password = password;
     }
 
     /**
@@ -127,53 +149,15 @@
     public void startRepository() throws Exception {
         if (this.repository == null) {
             try {
+                // Start the DNA engine ...
+                this.engine = this.configuration.build();
+                this.engine.start();
 
-                // Load the Jackrabbit configuration ...
-                File configFile = new File(this.jackrabbitConfigPath);
-                if (!configFile.exists()) {
-                    throw new SystemFailureException("The Jackrabbit configuration file cannot be found at "
-                                                     + configFile.getAbsoluteFile());
-                }
-                if (!configFile.canRead()) {
-                    throw new SystemFailureException("Unable to read the Jackrabbit configuration file at "
-                                                     + configFile.getAbsoluteFile());
-                }
-                String pathToConfig = configFile.getAbsolutePath();
+                // Now get the repository instance ...
+                this.repository = this.engine.getRepository(repositoryName);
 
-                // Find the directory where the Jackrabbit repository data will be stored ...
-                File workingDirectory = new File(this.workingDirectory);
-                if (workingDirectory.exists()) {
-                    if (!workingDirectory.isDirectory()) {
-                        throw new SystemFailureException("Unable to create working directory at "
-                                                         + workingDirectory.getAbsolutePath());
-                    }
-                }
-                String workingDirectoryPath = workingDirectory.getAbsolutePath();
-
-                // Get the Jackrabbit custom node definition (CND) file ...
-                URL cndFile = Thread.currentThread().getContextClassLoader().getResource("jackrabbitNodeTypes.cnd");
-
-                // Create the Jackrabbit repository instance and establish a session to keep the repository alive ...
-                this.repository = new TransientRepository(pathToConfig, workingDirectoryPath);
-                if (this.username != null) {
-                    Credentials credentials = new SimpleCredentials(this.username, this.password);
-                    this.keepAliveSession = this.repository.login(credentials, this.workspaceName);
-                } else {
-                    this.keepAliveSession = this.repository.login();
-                }
-
-                try {
-                    // Register the node types (only valid the first time) ...
-                    JackrabbitNodeTypeManager mgr = (JackrabbitNodeTypeManager)this.keepAliveSession.getWorkspace()
-                                                                                                    .getNodeTypeManager();
-                    mgr.registerNodeTypes(cndFile.openStream(), JackrabbitNodeTypeManager.TEXT_X_JCR_CND);
-                } catch (RepositoryException e) {
-                    if (!e.getMessage().contains("already exists")) throw e;
-                }
-
             } catch (Exception e) {
                 this.repository = null;
-                this.keepAliveSession = null;
                 throw e;
             }
         }
@@ -187,104 +171,21 @@
     public void shutdownRepository() throws Exception {
         if (this.repository != null) {
             try {
-                this.keepAliveSession.logout();
+                this.engine.shutdown();
+                this.engine.awaitTermination(4, TimeUnit.SECONDS);
             } finally {
                 this.repository = null;
-                this.keepAliveSession = null;
             }
         }
     }
 
     /**
-     * Start the DNA services.
-     * 
-     * @throws Exception
-     */
-    public void startDnaServices() throws Exception {
-        if (this.repository == null) {
-            this.startRepository();
-        }
-        if (this.sequencingService == null) {
-
-            // Create an execution context for the sequencing service. This execution context provides an environment
-            // for the DNA services which knows about the JCR repositories, workspaces, and credentials used to
-            // establish sessions to these workspaces.
-            final String repositoryWorkspaceName = this.repositoryName + "/" + this.workspaceName;
-            SimpleSessionFactory sessionFactory = new SimpleSessionFactory();
-            sessionFactory.registerRepository(this.repositoryName, this.repository);
-            if (this.username != null) {
-                Credentials credentials = new SimpleCredentials(this.username, this.password);
-                sessionFactory.registerCredentials(repositoryWorkspaceName, credentials);
-            }
-            this.executionContext = new ExecutionContext();
-
-            // Create the sequencing service, passing in the execution context and the repository library ...
-            this.sequencingService = new SequencingService();
-            this.sequencingService.setExecutionContext(executionContext);
-            // this.sequencingService.setRepositoryLibrary(repositoryLibrary);
-
-            // Configure the sequencers. In this example, we only two sequencers that processes image and mp3 files.
-            // So create a configurations. Note that the sequencing service expects the class to be on the thread's current
-            // context
-            // classloader, or if that's null the classloader that loaded the SequencingService class.
-            //
-            // Part of the configuration includes telling DNA which JCR paths should be processed by the sequencer.
-            // These path expressions tell the service that this sequencer should be invoked on the "jcr:data" property
-            // on the "jcr:content" child node of any node uploaded to the repository whose name ends with one of the
-            // supported extensions, and the sequencer should place the generated output metadata in a node with the same name as
-            // the file but immediately below the "/images" node. Path expressions can be fairly complex, and can even
-            // specify that the generated information be placed in a different repository.
-            // 
-            // Sequencer configurations can be added before or after the service is started, but here we do it before the service
-            // is running.
-            String name = "Image Sequencer";
-            String desc = "Sequences image files to extract the characteristics of the image";
-            String classname = "org.jboss.dna.sequencer.image.ImageMetadataSequencer";
-            String[] classpath = null; // Use the current classpath
-            String[] pathExpressions = {"//(*.(jpg|jpeg|gif|bmp|pcx|png|iff|ras|pbm|pgm|ppm|psd)[*])/jcr:content[@jcr:data] => /images/$1"};
-            SequencerConfig imageSequencerConfig = new SequencerConfig(name, desc, classname, classpath, pathExpressions);
-            this.sequencingService.addSequencer(imageSequencerConfig);
-
-            // Set up the MP3 sequencer ...
-            name = "Mp3 Sequencer";
-            desc = "Sequences mp3 files to extract the id3 tags of the audio file";
-            classname = "org.jboss.dna.sequencer.mp3.Mp3MetadataSequencer";
-            String[] mp3PathExpressions = {"//(*.mp3[*])/jcr:content[@jcr:data] => /mp3s/$1"};
-            SequencerConfig mp3SequencerConfig = new SequencerConfig(name, desc, classname, classpath, mp3PathExpressions);
-            this.sequencingService.addSequencer(mp3SequencerConfig);
-
-            // Set up the MP3 sequencer ...
-            name = "Java Sequencer";
-            desc = "Sequences java files to extract the characteristics of the java sources";
-            classname = "org.jboss.dna.sequencer.java.JavaMetadataSequencer";
-            String[] javaPathExpressions = {"//(*.java[*])/jcr:content[@jcr:data] => /java/$1"};
-            SequencerConfig javaSequencerConfig = new SequencerConfig(name, desc, classname, classpath, javaPathExpressions);
-            this.sequencingService.addSequencer(javaSequencerConfig);
-        }
-        // Start up the sequencing service ...
-        this.sequencingService.getAdministrator().start();
-    }
-
-    /**
-     * Shut down the DNA services.
-     * 
-     * @throws Exception
-     */
-    public void shutdownDnaServices() throws Exception {
-        if (this.sequencingService == null) return;
-
-        // Shut down the service and wait until it's all shut down ...
-        this.sequencingService.getAdministrator().shutdown();
-        this.sequencingService.getAdministrator().awaitTermination(5, TimeUnit.SECONDS);
-    }
-
-    /**
      * Get the sequencing statistics.
      * 
      * @return the statistics; never null
      */
     public SequencingService.Statistics getStatistics() {
-        return this.sequencingService.getStatistics();
+        return this.engine.getSequencingService().getStatistics();
     }
 
     /**
@@ -538,7 +439,7 @@
      * @throws RepositoryException
      */
     protected Session createSession() throws RepositoryException {
-        throw new UnsupportedOperationException();
+        return this.repository.login(workspaceName);
     }
 
     protected String getMimeType( URL file ) {

Deleted: trunk/extensions/dna-sequencer-java/src/main/resources/org/jboss/dna/sequencer/java/java-source-artifact.cnd
===================================================================
--- trunk/extensions/dna-sequencer-java/src/main/resources/org/jboss/dna/sequencer/java/java-source-artifact.cnd	2009-06-03 20:07:47 UTC (rev 966)
+++ trunk/extensions/dna-sequencer-java/src/main/resources/org/jboss/dna/sequencer/java/java-source-artifact.cnd	2009-06-03 20:08:46 UTC (rev 967)
@@ -1,257 +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.
- */
-
-/**
- * @author Serge Pagop (serge.pagop at innoq.com)
- */
-
-//------------------------------------------------------------------------------
-// N A M E S P A C E S
-//------------------------------------------------------------------------------
-<java='http://www.jboss.org/dna/java/1.0'>
-<nt='http://www.jcp.org/jcr/nt/1.0'>
-<mix='http://www.jcp.org/jcr/mix/1.0'>
-
-//------------------------------------------------------------------------------
-// B A S E  T Y P E S
-//------------------------------------------------------------------------------
-
-
-//------------------------------------------------------------------------------
-// V E R S I O N I N G
-//------------------------------------------------------------------------------
-
-
-//------------------------------------------------------------------------------
-// N O D E T Y P E S
-//------------------------------------------------------------------------------
-
-/**
- * Element-value
- */
-[java:elementValue] > nt:unstructured
- + java:kindOfvalues (java:conditionalExpression, java:annotationDeclaration, java:elementValueArrayInitializer) mandatory
- 
-/**
- * Modifiers
- */
-[java:modifierDeclaration] > nt:unstructured
- - java:modifierName (string) mandatory
-
-/**
- * Expression element-value type
- */
-[java:conditionalExpression] > nt:unstructured
- - java:expression (string)
-
-/**
- * Array initializer element-value type
- */
-[java:elementValueArrayInitializer] > nt:unstructured
- + java:elementValue (java:elementValue) = java:elementValue multiple
-
-/**
- * Identifier
- */
-[java:identifier] > nt:unstructured
- - java:identifierName (String) mandatory
- + java:value (java:elementValue) = java:elementValue mandatory
- 
-/**
- * Element-value pair
- */
-[java:elementValuePair] > nt:unstructured
- + java:identifier (java:identifier) mandatory
-
-/**
- * Annotation type
- */
-[java:annotationDeclaration] > nt:unstructured
- + java:annotationType (java:normalAnnotation, java:markerAnnotation,  java:singleElementAnnotation) mandatory
-  
-/**
- * Normal annotation e.g. @Entity(name="Customer")
- */
-[java:normalAnnotation] > nt:unstructured
- - java:normalAnnotationName (string) mandatory
- + java:elementValuePair (java:elementValuePair)
-
-/**
- * Marker annotation e.g. @GET
- */
-[java:markerAnnotation] > nt:unstructured
- - java:markerAnnotationName (string) mandatory
-
-/**
- * Single element annotation  e.g. @Path("/book")
- */
-[java:singleElementAnnotation] > nt:unstructured
- - java:singleElementAnnotationNam
- + java:value (java:elementValue) = java:elementValue mandatory
-
-/** 
- * Formal parameter
- */
-[java:formalParameter] > nt:unstructured
- + java:type (java:primitiveType, java:arrayType, java:simpleType, java:qualifiedType, java:wildcardType, java:parameterizedType)
-
-/**
- * Primitive type:
- * - Integral type ('byte', 'short', 'int', 'long', 'char')
- * - Floating point type ('float', 'double')
- * - Boolean type ('boolean')
- * - No return type ('void')
- */
-[java:primitiveType] > nt:unstructured
- - java:primitiveTypeDescription (string)
- + java:modifier (java:modifierDeclaration) = java:modifierDeclaration
- - java:primitiveTypeName (string) mandatory
- + java:primitiveVariable (java:variable) = java:variable
- 
- [java:variable] > nt:unstructured
- - java:variableName (string) mandatory
- 
-/** 
- * java:arrayType 
- */ 
-[java:arrayType] > nt:unstructured
- - java:arrayTypeDescription (string)
- + java:arrayTypeModifier (java:modifierDeclaration) = java:modifierDeclaration
- - java:arrayTypeName (string) mandatory
- + java:arrayTypeVariable (java:variable) = java:variable
- 
-[java:simpleType] > nt:unstructured
- - java:simpleTypeDescription (string)
- + java:simpleTypeModifier (java:modifierDeclaration) = java:modifierDeclaration
- - java:simpleTypeName (string) mandatory
- + java:simpleTypeVariable (java:variable) = java:variable
-
-[java:qualifiedType] > nt:unstructured
- - java:qualifiedTypeDescription (string)
- + java:qualifiedTypeModifier (java:modifierDeclaration) = java:modifierDeclaration
- - java:qualifiedTypeName (string) mandatory
- + java:qualifiedTypeVariable (java:variable) = java:variable
-    
-[java:wildcardType] > nt:unstructured
- - java:wildcardTypeDescription (string)
- + java:wildcardTypeModifier (java:modifierDeclaration) = java:modifierDeclaration
- - java:wildcardTypeName (string) mandatory
- + java:wildcardTypeVariable (java:variable) = java:variable
-
-[java:parameterizedType] > nt:unstructured
- - java:parameterizedTypeDescription (string)
- + java:parameterizedTypeModifier (java:modifierDeclaration) = java:modifierDeclaration
- - java:parameterizedTypeName (string) mandatory
- + java:parameterizedTypeVariable (java:variable) = java:variable
-
-/** 
- * Field type 
- */
-[java:fieldType] > nt:unstructured
- + java:type (java:primitiveType, java:arrayType, java:simpleType, java:qualifiedType, java:wildcardType, java:parameterizedType) mandatory multiple 
- 
- /** 
-  * Method declaration 
-  */
-[java:methodDeclaration] > nt:unstructured
- - java:methodDescription (string)
- + java:modifier (java:modifierDeclaration) = java:modifierDeclaration
- + java:resultType (java:primitiveType, java:arrayType, java:simpleType, java:qualifiedType, java:wildcardType, java:parameterizedType) mandatory
- - java:methodName (string) mandatory
- + java:parameter (java:formalParameter) multiple
-
-/** 
- * Constructor declarations 
- */
-[java:constructorDeclaration] > nt:unstructured
- - java:constructorDescription (string)
- + java:modifier (java:modifierDeclaration) = java:modifierDeclaration
- - java:constructorName (string) mandatory
- + java:parameter (java:formalParameter)
-
-
-/**
- * Package declarations
- */
-[java:packageDeclaration] > nt:unstructured
- + java:annotation (java:annotationDeclaration) = java:annotationDeclaration
- - java:packageKeyword (string)
-   < 'package' 
- - java:packageName (string) mandatory 
-
-/**
- * Import declarations
- */
-[java:singleTypeImportDeclaration] > nt:unstructured
- - java:singleTypeImportkeyword (string) mandatory
-  < 'import'
- - java:singleImportName (string) mandatory
- 
-[java:typeImportOnDemandDeclaration] > nt:unstructured
- - java:onDemandImportKeyword (string) mandatory
-  < 'import'
- - java:onDemandImportName (string) mandatory
-
- [java:importDeclaration] > nt:unstructured
- + java:singleImport (java:singleTypeImportDeclaration) = java:singleTypeImportDeclaration
- + java:importOnDemand (java:typeImportOnDemandDeclaration) = java:typeImportOnDemandDeclaration
- 
-
-/**
- * Class declaration
- *
- * The body of class declares members (fields and methods and nested classes and interfaces), 
- * instance and static initializers, and constructors
- */
-[java:normalClassDeclaration] > nt:unstructured
- - java:description (string)
- + java:modifier (java:modifierDeclaration) = java:modifierDeclaration
- - java:normalClassName (string) mandatory
- + java:field (java:fieldType)  = java:fieldType multiple
- + java:method (java:methodDeclaration) = java:methodDeclaration multiple
- + java:constructor (java:constructorDeclaration) = java:constructorDeclaration multiple
- 
-[java:enumDeclaration] > nt:unstructured // TODO
- 
-[java:classDeclaration] > nt:unstructured
- + java:normalClass (java:normalClassDeclaration) = java:normalClassDeclaration
- + java:enum (java:enumDeclaration) = java:enumDeclaration
-
-/**
- * Interface declaration 
- *
- * The body of class declares members (fields and methods and nested classes and interfaces), 
- * instance and static initializers, and constructors
- */
- //TODO
-[java:interfaceDeclaration] > nt:unstructured
- 
- 
-/**
- * Compilation unit
- */
-[java:compilationUnit] > nt:unstructured
- + java:package (java:packageDeclaration) = java:packageDeclaration
- + java:import (java:importDeclaration) = java:importDeclaration
- + java:unitType (java:classDeclaration, java:interfaceDeclaration) 
\ No newline at end of file

Copied: trunk/extensions/dna-sequencer-java/src/main/resources/org/jboss/dna/sequencer/java/javaSource.cnd (from rev 966, trunk/extensions/dna-sequencer-java/src/main/resources/org/jboss/dna/sequencer/java/java-source-artifact.cnd)
===================================================================
--- trunk/extensions/dna-sequencer-java/src/main/resources/org/jboss/dna/sequencer/java/javaSource.cnd	                        (rev 0)
+++ trunk/extensions/dna-sequencer-java/src/main/resources/org/jboss/dna/sequencer/java/javaSource.cnd	2009-06-03 20:08:46 UTC (rev 967)
@@ -0,0 +1,257 @@
+/*
+ * 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.
+ */
+
+/**
+ * @author Serge Pagop (serge.pagop at innoq.com)
+ */
+
+//------------------------------------------------------------------------------
+// N A M E S P A C E S
+//------------------------------------------------------------------------------
+<java='http://www.jboss.org/dna/java/1.0'>
+<nt='http://www.jcp.org/jcr/nt/1.0'>
+<mix='http://www.jcp.org/jcr/mix/1.0'>
+
+//------------------------------------------------------------------------------
+// B A S E  T Y P E S
+//------------------------------------------------------------------------------
+
+
+//------------------------------------------------------------------------------
+// V E R S I O N I N G
+//------------------------------------------------------------------------------
+
+
+//------------------------------------------------------------------------------
+// N O D E T Y P E S
+//------------------------------------------------------------------------------
+
+/**
+ * Element-value
+ */
+[java:elementValue] > nt:unstructured
+ + java:kindOfvalues (java:conditionalExpression, java:annotationDeclaration, java:elementValueArrayInitializer) mandatory
+ 
+/**
+ * Modifiers
+ */
+[java:modifierDeclaration] > nt:unstructured
+ - java:modifierName (string) mandatory
+
+/**
+ * Expression element-value type
+ */
+[java:conditionalExpression] > nt:unstructured
+ - java:expression (string)
+
+/**
+ * Array initializer element-value type
+ */
+[java:elementValueArrayInitializer] > nt:unstructured
+ + java:elementValue (java:elementValue) = java:elementValue multiple
+
+/**
+ * Identifier
+ */
+[java:identifier] > nt:unstructured
+ - java:identifierName (String) mandatory
+ + java:value (java:elementValue) = java:elementValue mandatory
+ 
+/**
+ * Element-value pair
+ */
+[java:elementValuePair] > nt:unstructured
+ + java:identifier (java:identifier) mandatory
+
+/**
+ * Annotation type
+ */
+[java:annotationDeclaration] > nt:unstructured
+ + java:annotationType (java:normalAnnotation, java:markerAnnotation,  java:singleElementAnnotation) mandatory
+  
+/**
+ * Normal annotation e.g. @Entity(name="Customer")
+ */
+[java:normalAnnotation] > nt:unstructured
+ - java:normalAnnotationName (string) mandatory
+ + java:elementValuePair (java:elementValuePair)
+
+/**
+ * Marker annotation e.g. @GET
+ */
+[java:markerAnnotation] > nt:unstructured
+ - java:markerAnnotationName (string) mandatory
+
+/**
+ * Single element annotation  e.g. @Path("/book")
+ */
+[java:singleElementAnnotation] > nt:unstructured
+ - java:singleElementAnnotationNam
+ + java:value (java:elementValue) = java:elementValue mandatory
+
+/** 
+ * Formal parameter
+ */
+[java:formalParameter] > nt:unstructured
+ + java:type (java:primitiveType, java:arrayType, java:simpleType, java:qualifiedType, java:wildcardType, java:parameterizedType)
+
+/**
+ * Primitive type:
+ * - Integral type ('byte', 'short', 'int', 'long', 'char')
+ * - Floating point type ('float', 'double')
+ * - Boolean type ('boolean')
+ * - No return type ('void')
+ */
+[java:primitiveType] > nt:unstructured
+ - java:primitiveTypeDescription (string)
+ + java:modifier (java:modifierDeclaration) = java:modifierDeclaration
+ - java:primitiveTypeName (string) mandatory
+ + java:primitiveVariable (java:variable) = java:variable
+ 
+ [java:variable] > nt:unstructured
+ - java:variableName (string) mandatory
+ 
+/** 
+ * java:arrayType 
+ */ 
+[java:arrayType] > nt:unstructured
+ - java:arrayTypeDescription (string)
+ + java:arrayTypeModifier (java:modifierDeclaration) = java:modifierDeclaration
+ - java:arrayTypeName (string) mandatory
+ + java:arrayTypeVariable (java:variable) = java:variable
+ 
+[java:simpleType] > nt:unstructured
+ - java:simpleTypeDescription (string)
+ + java:simpleTypeModifier (java:modifierDeclaration) = java:modifierDeclaration
+ - java:simpleTypeName (string) mandatory
+ + java:simpleTypeVariable (java:variable) = java:variable
+
+[java:qualifiedType] > nt:unstructured
+ - java:qualifiedTypeDescription (string)
+ + java:qualifiedTypeModifier (java:modifierDeclaration) = java:modifierDeclaration
+ - java:qualifiedTypeName (string) mandatory
+ + java:qualifiedTypeVariable (java:variable) = java:variable
+    
+[java:wildcardType] > nt:unstructured
+ - java:wildcardTypeDescription (string)
+ + java:wildcardTypeModifier (java:modifierDeclaration) = java:modifierDeclaration
+ - java:wildcardTypeName (string) mandatory
+ + java:wildcardTypeVariable (java:variable) = java:variable
+
+[java:parameterizedType] > nt:unstructured
+ - java:parameterizedTypeDescription (string)
+ + java:parameterizedTypeModifier (java:modifierDeclaration) = java:modifierDeclaration
+ - java:parameterizedTypeName (string) mandatory
+ + java:parameterizedTypeVariable (java:variable) = java:variable
+
+/** 
+ * Field type 
+ */
+[java:fieldType] > nt:unstructured
+ + java:type (java:primitiveType, java:arrayType, java:simpleType, java:qualifiedType, java:wildcardType, java:parameterizedType) mandatory multiple 
+ 
+ /** 
+  * Method declaration 
+  */
+[java:methodDeclaration] > nt:unstructured
+ - java:methodDescription (string)
+ + java:modifier (java:modifierDeclaration) = java:modifierDeclaration
+ + java:resultType (java:primitiveType, java:arrayType, java:simpleType, java:qualifiedType, java:wildcardType, java:parameterizedType) mandatory
+ - java:methodName (string) mandatory
+ + java:parameter (java:formalParameter) multiple
+
+/** 
+ * Constructor declarations 
+ */
+[java:constructorDeclaration] > nt:unstructured
+ - java:constructorDescription (string)
+ + java:modifier (java:modifierDeclaration) = java:modifierDeclaration
+ - java:constructorName (string) mandatory
+ + java:parameter (java:formalParameter)
+
+
+/**
+ * Package declarations
+ */
+[java:packageDeclaration] > nt:unstructured
+ + java:annotation (java:annotationDeclaration) = java:annotationDeclaration
+ - java:packageKeyword (string)
+   < 'package' 
+ - java:packageName (string) mandatory 
+
+/**
+ * Import declarations
+ */
+[java:singleTypeImportDeclaration] > nt:unstructured
+ - java:singleTypeImportkeyword (string) mandatory
+  < 'import'
+ - java:singleImportName (string) mandatory
+ 
+[java:typeImportOnDemandDeclaration] > nt:unstructured
+ - java:onDemandImportKeyword (string) mandatory
+  < 'import'
+ - java:onDemandImportName (string) mandatory
+
+ [java:importDeclaration] > nt:unstructured
+ + java:singleImport (java:singleTypeImportDeclaration) = java:singleTypeImportDeclaration
+ + java:importOnDemand (java:typeImportOnDemandDeclaration) = java:typeImportOnDemandDeclaration
+ 
+
+/**
+ * Class declaration
+ *
+ * The body of class declares members (fields and methods and nested classes and interfaces), 
+ * instance and static initializers, and constructors
+ */
+[java:normalClassDeclaration] > nt:unstructured
+ - java:description (string)
+ + java:modifier (java:modifierDeclaration) = java:modifierDeclaration
+ - java:normalClassName (string) mandatory
+ + java:field (java:fieldType)  = java:fieldType multiple
+ + java:method (java:methodDeclaration) = java:methodDeclaration multiple
+ + java:constructor (java:constructorDeclaration) = java:constructorDeclaration multiple
+ 
+[java:enumDeclaration] > nt:unstructured // TODO
+ 
+[java:classDeclaration] > nt:unstructured
+ + java:normalClass (java:normalClassDeclaration) = java:normalClassDeclaration
+ + java:enum (java:enumDeclaration) = java:enumDeclaration
+
+/**
+ * Interface declaration 
+ *
+ * The body of class declares members (fields and methods and nested classes and interfaces), 
+ * instance and static initializers, and constructors
+ */
+ //TODO
+[java:interfaceDeclaration] > nt:unstructured
+ 
+ 
+/**
+ * Compilation unit
+ */
+[java:compilationUnit] > nt:unstructured
+ + java:package (java:packageDeclaration) = java:packageDeclaration
+ + java:import (java:importDeclaration) = java:importDeclaration
+ + java:unitType (java:classDeclaration, java:interfaceDeclaration) 
\ No newline at end of file



From dna-commits at lists.jboss.org  Wed Jun  3 16:09:12 2009
From: dna-commits at lists.jboss.org (dna-commits at lists.jboss.org)
Date: Wed, 03 Jun 2009 16:09:12 -0400
Subject: [dna-commits] DNA SVN: r968 - in trunk:
	dna-jcr/src/test/java/org/jboss/dna/jcr and 4 other directories.
Message-ID: <E1MBwls-0001tH-0u@committer01.frg.pub.inap.atl.jboss.com>

Author: rhauch
Date: 2009-06-03 16:09:11 -0400 (Wed, 03 Jun 2009)
New Revision: 968

Added:
   trunk/dna-cnd/src/test/resources/cnd/javaSource.cnd
   trunk/dna-jcr/src/test/java/org/jboss/dna/jcr/InMemoryRepositoryStubTest.java
   trunk/dna-repository/src/main/java/org/jboss/dna/repository/config/
   trunk/dna-repository/src/main/java/org/jboss/dna/repository/config/DnaConfiguration.java
   trunk/dna-repository/src/main/java/org/jboss/dna/repository/config/DnaEngine.java
   trunk/dna-repository/src/main/java/org/jboss/dna/repository/config/JcrConfiguration.java
   trunk/dna-repository/src/main/java/org/jboss/dna/repository/config/JcrConfigurationTest.java
   trunk/dna-repository/src/main/java/org/jboss/dna/repository/config/JcrEngine.java
   trunk/dna-repository/src/test/java/org/jboss/dna/repository/sequencer/MockStreamSequencerA.java
   trunk/dna-repository/src/test/java/org/jboss/dna/repository/sequencer/MockStreamSequencerB.java
   trunk/docs/examples/gettingstarted/repositories/src/main/resources/aircraft.cnd
   trunk/docs/examples/gettingstarted/repositories/src/main/resources/cars.cnd
Log:
DNA-436 Continued the work on the examples, with fairly substantial changes (simplification) to the configuration frameworks.

Added: trunk/dna-cnd/src/test/resources/cnd/javaSource.cnd
===================================================================
--- trunk/dna-cnd/src/test/resources/cnd/javaSource.cnd	                        (rev 0)
+++ trunk/dna-cnd/src/test/resources/cnd/javaSource.cnd	2009-06-03 20:09:11 UTC (rev 968)
@@ -0,0 +1,257 @@
+/*
+ * 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.
+ */
+
+/**
+ * @author Serge Pagop (serge.pagop at innoq.com)
+ */
+
+//------------------------------------------------------------------------------
+// N A M E S P A C E S
+//------------------------------------------------------------------------------
+<java='http://www.jboss.org/dna/java/1.0'>
+<nt='http://www.jcp.org/jcr/nt/1.0'>
+<mix='http://www.jcp.org/jcr/mix/1.0'>
+
+//------------------------------------------------------------------------------
+// B A S E  T Y P E S
+//------------------------------------------------------------------------------
+
+
+//------------------------------------------------------------------------------
+// V E R S I O N I N G
+//------------------------------------------------------------------------------
+
+
+//------------------------------------------------------------------------------
+// N O D E T Y P E S
+//------------------------------------------------------------------------------
+
+/**
+ * Element-value
+ */
+[java:elementValue] > nt:unstructured
+ + java:kindOfvalues (java:conditionalExpression, java:annotationDeclaration, java:elementValueArrayInitializer) mandatory
+ 
+/**
+ * Modifiers
+ */
+[java:modifierDeclaration] > nt:unstructured
+ - java:modifierName (string) mandatory
+
+/**
+ * Expression element-value type
+ */
+[java:conditionalExpression] > nt:unstructured
+ - java:expression (string)
+
+/**
+ * Array initializer element-value type
+ */
+[java:elementValueArrayInitializer] > nt:unstructured
+ + java:elementValue (java:elementValue) = java:elementValue multiple
+
+/**
+ * Identifier
+ */
+[java:identifier] > nt:unstructured
+ - java:identifierName (String) mandatory
+ + java:value (java:elementValue) = java:elementValue mandatory
+ 
+/**
+ * Element-value pair
+ */
+[java:elementValuePair] > nt:unstructured
+ + java:identifier (java:identifier) mandatory
+
+/**
+ * Annotation type
+ */
+[java:annotationDeclaration] > nt:unstructured
+ + java:annotationType (java:normalAnnotation, java:markerAnnotation,  java:singleElementAnnotation) mandatory
+  
+/**
+ * Normal annotation e.g. @Entity(name="Customer")
+ */
+[java:normalAnnotation] > nt:unstructured
+ - java:normalAnnotationName (string) mandatory
+ + java:elementValuePair (java:elementValuePair)
+
+/**
+ * Marker annotation e.g. @GET
+ */
+[java:markerAnnotation] > nt:unstructured
+ - java:markerAnnotationName (string) mandatory
+
+/**
+ * Single element annotation  e.g. @Path("/book")
+ */
+[java:singleElementAnnotation] > nt:unstructured
+ - java:singleElementAnnotationName (string) mandatory
+ + java:value (java:elementValue) = java:elementValue mandatory
+
+/** 
+ * Formal parameter
+ */
+[java:formalParameter] > nt:unstructured
+ + java:type (java:primitiveType, java:arrayType, java:simpleType, java:qualifiedType, java:wildcardType, java:parameterizedType)
+
+/**
+ * Primitive type:
+ * - Integral type ('byte', 'short', 'int', 'long', 'char')
+ * - Floating point type ('float', 'double')
+ * - Boolean type ('boolean')
+ * - No return type ('void')
+ */
+[java:primitiveType] > nt:unstructured
+ - java:primitiveTypeDescription (string)
+ + java:modifier (java:modifierDeclaration) = java:modifierDeclaration
+ - java:primitiveTypeName (string) mandatory
+ + java:primitiveVariable (java:variable) = java:variable
+ 
+ [java:variable] > nt:unstructured
+ - java:variableName (string) mandatory
+ 
+/** 
+ * java:arrayType 
+ */ 
+[java:arrayType] > nt:unstructured
+ - java:arrayTypeDescription (string)
+ + java:arrayTypeModifier (java:modifierDeclaration) = java:modifierDeclaration
+ - java:arrayTypeName (string) mandatory
+ + java:arrayTypeVariable (java:variable) = java:variable
+ 
+[java:simpleType] > nt:unstructured
+ - java:simpleTypeDescription (string)
+ + java:simpleTypeModifier (java:modifierDeclaration) = java:modifierDeclaration
+ - java:simpleTypeName (string) mandatory
+ + java:simpleTypeVariable (java:variable) = java:variable
+
+[java:qualifiedType] > nt:unstructured
+ - java:qualifiedTypeDescription (string)
+ + java:qualifiedTypeModifier (java:modifierDeclaration) = java:modifierDeclaration
+ - java:qualifiedTypeName (string) mandatory
+ + java:qualifiedTypeVariable (java:variable) = java:variable
+    
+[java:wildcardType] > nt:unstructured
+ - java:wildcardTypeDescription (string)
+ + java:wildcardTypeModifier (java:modifierDeclaration) = java:modifierDeclaration
+ - java:wildcardTypeName (string) mandatory
+ + java:wildcardTypeVariable (java:variable) = java:variable
+
+[java:parameterizedType] > nt:unstructured
+ - java:parameterizedTypeDescription (string)
+ + java:parameterizedTypeModifier (java:modifierDeclaration) = java:modifierDeclaration
+ - java:parameterizedTypeName (string) mandatory
+ + java:parameterizedTypeVariable (java:variable) = java:variable
+
+/** 
+ * Field type 
+ */
+[java:fieldType] > nt:unstructured
+ + java:type (java:primitiveType, java:arrayType, java:simpleType, java:qualifiedType, java:wildcardType, java:parameterizedType) mandatory multiple 
+ 
+ /** 
+  * Method declaration 
+  */
+[java:methodDeclaration] > nt:unstructured
+ - java:methodDescription (string)
+ + java:modifier (java:modifierDeclaration) = java:modifierDeclaration
+ + java:resultType (java:primitiveType, java:arrayType, java:simpleType, java:qualifiedType, java:wildcardType, java:parameterizedType) mandatory
+ - java:methodName (string) mandatory
+ + java:parameter (java:formalParameter) multiple
+
+/** 
+ * Constructor declarations 
+ */
+[java:constructorDeclaration] > nt:unstructured
+ - java:constructorDescription (string)
+ + java:modifier (java:modifierDeclaration) = java:modifierDeclaration
+ - java:constructorName (string) mandatory
+ + java:parameter (java:formalParameter)
+
+
+/**
+ * Package declarations
+ */
+[java:packageDeclaration] > nt:unstructured
+ + java:annotation (java:annotationDeclaration) = java:annotationDeclaration
+ - java:packageKeyword (string)
+   < 'package' 
+ - java:packageName (string) mandatory 
+
+/**
+ * Import declarations
+ */
+[java:singleTypeImportDeclaration] > nt:unstructured
+ - java:singleTypeImportkeyword (string) mandatory
+  < 'import'
+ - java:singleImportName (string) mandatory
+ 
+[java:typeImportOnDemandDeclaration] > nt:unstructured
+ - java:onDemandImportKeyword (string) mandatory
+  < 'import'
+ - java:onDemandImportName (string) mandatory
+
+ [java:importDeclaration] > nt:unstructured
+ + java:singleImport (java:singleTypeImportDeclaration) = java:singleTypeImportDeclaration
+ + java:importOnDemand (java:typeImportOnDemandDeclaration) = java:typeImportOnDemandDeclaration
+ 
+
+/**
+ * Class declaration
+ *
+ * The body of class declares members (fields and methods and nested classes and interfaces), 
+ * instance and static initializers, and constructors
+ */
+[java:normalClassDeclaration] > nt:unstructured
+ - java:description (string)
+ + java:modifier (java:modifierDeclaration) = java:modifierDeclaration
+ - java:normalClassName (string) mandatory
+ + java:field (java:fieldType)  = java:fieldType multiple
+ + java:method (java:methodDeclaration) = java:methodDeclaration multiple
+ + java:constructor (java:constructorDeclaration) = java:constructorDeclaration multiple
+ 
+[java:enumDeclaration] > nt:unstructured // TODO
+ 
+[java:classDeclaration] > nt:unstructured
+ + java:normalClass (java:normalClassDeclaration) = java:normalClassDeclaration
+ + java:enum (java:enumDeclaration) = java:enumDeclaration
+
+/**
+ * Interface declaration 
+ *
+ * The body of class declares members (fields and methods and nested classes and interfaces), 
+ * instance and static initializers, and constructors
+ */
+ //TODO
+[java:interfaceDeclaration] > nt:unstructured
+ 
+ 
+/**
+ * Compilation unit
+ */
+[java:compilationUnit] > nt:unstructured
+ + java:package (java:packageDeclaration) = java:packageDeclaration
+ + java:import (java:importDeclaration) = java:importDeclaration
+ + java:unitType (java:classDeclaration, java:interfaceDeclaration) 
\ No newline at end of file

Added: trunk/dna-jcr/src/test/java/org/jboss/dna/jcr/InMemoryRepositoryStubTest.java
===================================================================
--- trunk/dna-jcr/src/test/java/org/jboss/dna/jcr/InMemoryRepositoryStubTest.java	                        (rev 0)
+++ trunk/dna-jcr/src/test/java/org/jboss/dna/jcr/InMemoryRepositoryStubTest.java	2009-06-03 20:09:11 UTC (rev 968)
@@ -0,0 +1,46 @@
+/*
+ * 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.jcr;
+
+import static org.hamcrest.core.Is.is;
+import static org.hamcrest.core.IsNull.notNullValue;
+import static org.junit.Assert.assertThat;
+import java.io.IOException;
+import java.util.Properties;
+import org.junit.Test;
+
+/**
+ * 
+ */
+public class InMemoryRepositoryStubTest {
+
+    @Test
+    public void shouldStartRepositoryStub() throws IOException {
+        Properties env = new Properties();
+        env.load(getClass().getClassLoader().getResourceAsStream("repositoryStubImpl.properties"));
+        InMemoryRepositoryStub stub = new InMemoryRepositoryStub(env);
+        assertThat(stub.getRepository(), is(notNullValue()));
+    }
+
+}


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

Added: trunk/dna-repository/src/main/java/org/jboss/dna/repository/config/DnaConfiguration.java
===================================================================
--- trunk/dna-repository/src/main/java/org/jboss/dna/repository/config/DnaConfiguration.java	                        (rev 0)
+++ trunk/dna-repository/src/main/java/org/jboss/dna/repository/config/DnaConfiguration.java	2009-06-03 20:09:11 UTC (rev 968)
@@ -0,0 +1,512 @@
+/*
+ * 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.repository.config;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.URL;
+import net.jcip.annotations.Immutable;
+import org.jboss.dna.common.util.CheckArg;
+import org.jboss.dna.graph.ExecutionContext;
+import org.jboss.dna.graph.Graph;
+import org.jboss.dna.graph.Node;
+import org.jboss.dna.graph.Workspace;
+import org.jboss.dna.graph.connector.RepositorySource;
+import org.jboss.dna.graph.connector.inmemory.InMemoryRepositorySource;
+import org.jboss.dna.graph.property.Path;
+import org.jboss.dna.graph.property.basic.RootPath;
+import org.xml.sax.SAXException;
+
+/**
+ * 
+ */
+public class DnaConfiguration {
+
+    protected static final String DEFAULT_WORKSPACE_NAME = "";
+    protected static final String DEFAULT_PATH = "/";
+
+    private final ExecutionContext context;
+    private ConfigurationContent configurationContent;
+
+    /**
+     * Create a new configuration, using a default-constructed {@link ExecutionContext}.
+     */
+    public DnaConfiguration() {
+        this(new ExecutionContext());
+    }
+
+    /**
+     * Create a new configuration using the supplied {@link ExecutionContext}.
+     * 
+     * @param context the execution context
+     * @throws IllegalArgumentException if the path is null or empty
+     */
+    public DnaConfiguration( ExecutionContext context ) {
+        CheckArg.isNotNull(context, "context");
+        this.context = context;
+    }
+
+    /**
+     * Load the configuration from a file at the given path.
+     * 
+     * @param pathToConfigurationFile the path the file containing the configuration information
+     * @return this configuration object, for convenience and method chaining
+     * @throws IOException if there is an error or problem reading the file at the supplied location
+     * @throws SAXException if the file is not a valid XML format
+     * @throws IllegalArgumentException if the path is null or empty
+     */
+    public DnaConfiguration loadFrom( String pathToConfigurationFile ) throws IOException, SAXException {
+        CheckArg.isNotEmpty(pathToConfigurationFile, "pathToConfigurationFile");
+        return loadFrom(new File(pathToConfigurationFile));
+    }
+
+    /**
+     * Load the configuration from a file.
+     * 
+     * @param configurationFile the file containing the configuration information
+     * @return this configuration object, for convenience and method chaining
+     * @throws IOException if there is an error or problem reading the supplied file
+     * @throws SAXException if the file is not a valid XML format
+     * @throws IllegalArgumentException if the file reference is null
+     */
+    public DnaConfiguration loadFrom( File configurationFile ) throws IOException, SAXException {
+        CheckArg.isNotNull(configurationFile, "configurationFile");
+        InputStream stream = new FileInputStream(configurationFile);
+        try {
+            return loadFrom(stream);
+        } finally {
+            stream.close();
+        }
+    }
+
+    /**
+     * Load the configuration from a file at the supplied URL.
+     * 
+     * @param urlToConfigurationFile the URL of the file containing the configuration information
+     * @return this configuration object, for convenience and method chaining
+     * @throws IOException if there is an error or problem reading the file at the supplied URL
+     * @throws SAXException if the file is not a valid XML format
+     * @throws IllegalArgumentException if the URL is null
+     */
+    public DnaConfiguration loadFrom( URL urlToConfigurationFile ) throws IOException, SAXException {
+        CheckArg.isNotNull(urlToConfigurationFile, "urlToConfigurationFile");
+        InputStream stream = urlToConfigurationFile.openStream();
+        try {
+            return loadFrom(stream);
+        } finally {
+            stream.close();
+        }
+    }
+
+    /**
+     * Load the configuration from a file at the supplied URL.
+     * 
+     * @param configurationFileInputStream the stream with the configuration information
+     * @return this configuration object, for convenience and method chaining
+     * @throws IOException if there is an error or problem reading the file at the supplied URL
+     * @throws SAXException if the file is not a valid XML format
+     * @throws IllegalArgumentException if the stream is null
+     */
+    public DnaConfiguration loadFrom( InputStream configurationFileInputStream ) throws IOException, SAXException {
+        CheckArg.isNotNull(configurationFileInputStream, "configurationFileInputStream");
+
+        // Create the in-memory repository source in which the content will be stored ...
+        InMemoryRepositorySource source = new InMemoryRepositorySource();
+        source.setName("Configuration Repository");
+        source.setDefaultWorkspaceName(DEFAULT_WORKSPACE_NAME);
+
+        // Import the information into the source ...
+        Path path = path(DEFAULT_PATH);
+        Graph graph = Graph.create(source, context);
+        graph.importXmlFrom(configurationFileInputStream).into(path);
+
+        // The file was imported successfully, so now create the content information ...
+        configurationContent = new ConfigurationContent(source, null, path, context);
+        return this;
+    }
+
+    /**
+     * Load the configuration from the repository content using the supplied repository source. This method assumes that the
+     * supplied source has already been configured and is ready to {@link RepositorySource#getConnection() create connections}.
+     * Also, the default workspace of the source will be used, and the configuration content may be found directly under the root
+     * node.
+     * 
+     * @param source the source that defines the repository with the configuration content
+     * @return this configuration object, for convenience and method chaining
+     * @throws IllegalArgumentException if the source is null
+     */
+    public DnaConfiguration loadFrom( RepositorySource source ) {
+        return loadFrom(source, null, null);
+    }
+
+    /**
+     * Load the configuration from the repository content using the workspace in the supplied repository source. This method
+     * assumes that the supplied source has already been configured and is ready to {@link RepositorySource#getConnection() create
+     * connections}. Also, the configuration content may be found directly under the root node.
+     * 
+     * @param source the source that defines the repository with the configuration content
+     * @param workspaceName the name of the workspace with the configuration content, or null if the source's default workspace
+     *        should be used
+     * @return this configuration object, for convenience and method chaining
+     * @throws IllegalArgumentException if the source is null
+     */
+    public DnaConfiguration loadFrom( RepositorySource source,
+                                      String workspaceName ) {
+        CheckArg.isNotNull(source, "source");
+        return loadFrom(source, workspaceName, null);
+    }
+
+    /**
+     * Load the configuration from the repository content at the supplied path in the workspace in the supplied repository source.
+     * This method assumes that the supplied source has already been configured and is ready to
+     * {@link RepositorySource#getConnection() create connections}.
+     * 
+     * @param source the source that defines the repository with the configuration content
+     * @param workspaceName the name of the workspace with the configuration content, or null if the source's default workspace
+     *        should be used
+     * @param pathInWorkspace the path to the parent node under which the configuration content may be found, or null if the
+     *        content may be found under the root node
+     * @return this configuration object, for convenience and method chaining
+     * @throws IllegalArgumentException if the source is null
+     */
+    public DnaConfiguration loadFrom( RepositorySource source,
+                                      String workspaceName,
+                                      String pathInWorkspace ) {
+        CheckArg.isNotNull(source, "source");
+
+        // Verify connectivity ...
+        Graph graph = Graph.create(source, context);
+        if (workspaceName != null) {
+            Workspace workspace = graph.useWorkspace(workspaceName); // should throw exception if not connectable
+            assert workspace.getRoot() != null;
+        }
+
+        // Verify the path ...
+        Path path = pathInWorkspace != null ? path(pathInWorkspace) : path(DEFAULT_PATH);
+        Node parent = graph.getNodeAt(path);
+        assert parent != null;
+
+        // Now create the content information ...
+        configurationContent = new ConfigurationContent(source, workspaceName, path, context);
+        return this;
+    }
+
+    protected ConfigurationContent getConfigurationContent() {
+        return configurationContent;
+    }
+
+    protected Path path( String path ) {
+        return context.getValueFactories().getPathFactory().create(path);
+    }
+
+    public MimeTypeDetectorDetails<? extends DnaConfiguration> mimeTypeDetector( String name ) {
+        return new MimeTypeDetectorBuilder<DnaConfiguration>(this);
+    }
+
+    /**
+     * Construct an engine that reflects the current state of this configuration. This method always creates a new instance.
+     * 
+     * @return the resulting engine; never null
+     */
+    public DnaEngine build() {
+        return new DnaEngine();
+    }
+
+    public interface Returnable<ReturnType> {
+        /**
+         * Return the configuration component.
+         * 
+         * @return the configuration component; never null
+         */
+        ReturnType and();
+    }
+
+    protected static class BaseReturnable<ReturnType> implements Returnable<ReturnType> {
+        protected final ReturnType returnObject;
+
+        protected BaseReturnable( ReturnType returnObject ) {
+            this.returnObject = returnObject;
+        }
+
+        /**
+         * {@inheritDoc}
+         * 
+         * @see org.jboss.dna.repository.config.DnaConfiguration.Returnable#and()
+         */
+        public ReturnType and() {
+            return returnObject;
+        }
+    }
+
+    /**
+     * Interface used to set up and build a RepositorySource instance.
+     * 
+     * @param <ReturnType> the type of the configuration component
+     */
+    public interface MimeTypeDetectorDetails<ReturnType> extends Returnable<ReturnType> {
+    }
+
+    protected static class MimeTypeDetectorBuilder<ReturnType> extends BaseReturnable<ReturnType>
+        implements MimeTypeDetectorDetails<ReturnType> {
+        protected MimeTypeDetectorBuilder( ReturnType returnObject ) {
+            super(returnObject);
+        }
+    }
+
+    /**
+     * Interface used to set up and build a RepositorySource instance.
+     * 
+     * @param <ReturnType> the type of the configuration component
+     */
+    public interface RepositorySourceDetails<ReturnType>
+        extends SetProperties<RepositorySourceDetails<ReturnType>>, Returnable<ReturnType> {
+    }
+
+    /**
+     * Interface for configuring the JavaBean-style properties of an object.
+     * 
+     * @param <ReturnType> the interface returned after the property has been set.
+     * @author Randall Hauch
+     */
+    public interface SetProperties<ReturnType> {
+        /**
+         * Set the property value to an integer.
+         * 
+         * @param beanPropertyName the name of the JavaBean-style property (e.g., "retryLimit")
+         * @param value the new value for the property
+         * @return the next component to continue configuration; never null
+         */
+        ReturnType setProperty( String beanPropertyName,
+                                int value );
+
+        /**
+         * Set the property value to a long number.
+         * 
+         * @param beanPropertyName the name of the JavaBean-style property (e.g., "retryLimit")
+         * @param value the new value for the property
+         * @return the next component to continue configuration; never null
+         */
+        ReturnType setProperty( String beanPropertyName,
+                                long value );
+
+        /**
+         * Set the property value to a short.
+         * 
+         * @param beanPropertyName the name of the JavaBean-style property (e.g., "retryLimit")
+         * @param value the new value for the property
+         * @return the next component to continue configuration; never null
+         */
+        ReturnType setProperty( String beanPropertyName,
+                                short value );
+
+        /**
+         * Set the property value to a boolean.
+         * 
+         * @param beanPropertyName the name of the JavaBean-style property (e.g., "retryLimit")
+         * @param value the new value for the property
+         * @return the next component to continue configuration; never null
+         */
+        ReturnType setProperty( String beanPropertyName,
+                                boolean value );
+
+        /**
+         * Set the property value to a float.
+         * 
+         * @param beanPropertyName the name of the JavaBean-style property (e.g., "retryLimit")
+         * @param value the new value for the property
+         * @return the next component to continue configuration; never null
+         */
+        ReturnType setProperty( String beanPropertyName,
+                                float value );
+
+        /**
+         * Set the property value to a double.
+         * 
+         * @param beanPropertyName the name of the JavaBean-style property (e.g., "retryLimit")
+         * @param value the new value for the property
+         * @return the next component to continue configuration; never null
+         */
+        ReturnType setProperty( String beanPropertyName,
+                                double value );
+
+        /**
+         * Set the property value to a string.
+         * 
+         * @param beanPropertyName the name of the JavaBean-style property (e.g., "retryLimit")
+         * @param value the new value for the property
+         * @return the next component to continue configuration; never null
+         */
+        ReturnType setProperty( String beanPropertyName,
+                                String value );
+
+        /**
+         * Set the property value to an object.
+         * 
+         * @param beanPropertyName the name of the JavaBean-style property (e.g., "retryLimit")
+         * @param value the new value for the property
+         * @return the next component to continue configuration; never null
+         */
+        ReturnType setProperty( String beanPropertyName,
+                                Object value );
+    }
+
+    protected class SourceDetails<ReturnType> extends BaseReturnable<ReturnType> implements RepositorySourceDetails<ReturnType> {
+
+        protected SourceDetails( ReturnType returnObject ) {
+            super(returnObject);
+        }
+
+        public RepositorySourceDetails<ReturnType> setProperty( String beanPropertyName,
+                                                                int value ) {
+            return setProperty(beanPropertyName, (Object)value);
+        }
+
+        public RepositorySourceDetails<ReturnType> setProperty( String beanPropertyName,
+                                                                long value ) {
+            return setProperty(beanPropertyName, (Object)value);
+        }
+
+        public RepositorySourceDetails<ReturnType> setProperty( String beanPropertyName,
+                                                                short value ) {
+            return setProperty(beanPropertyName, (Object)value);
+        }
+
+        public RepositorySourceDetails<ReturnType> setProperty( String beanPropertyName,
+                                                                boolean value ) {
+            return setProperty(beanPropertyName, (Object)value);
+        }
+
+        public RepositorySourceDetails<ReturnType> setProperty( String beanPropertyName,
+                                                                float value ) {
+            return setProperty(beanPropertyName, (Object)value);
+        }
+
+        public RepositorySourceDetails<ReturnType> setProperty( String beanPropertyName,
+                                                                double value ) {
+            return setProperty(beanPropertyName, (Object)value);
+        }
+
+        public RepositorySourceDetails<ReturnType> setProperty( String beanPropertyName,
+                                                                String value ) {
+            return setProperty(beanPropertyName, (Object)value);
+        }
+
+        public RepositorySourceDetails<ReturnType> setProperty( String beanPropertyName,
+                                                                Object value ) {
+            throw new UnsupportedOperationException();
+        }
+    }
+
+    /**
+     * Representation of the current configuration content.
+     */
+    @Immutable
+    protected static class ConfigurationContent {
+        private final RepositorySource source;
+        private final Path path;
+        private final String workspace;
+        private final ExecutionContext context;
+        private Graph graph;
+
+        protected ConfigurationContent( RepositorySource source,
+                                        String workspace,
+                                        Path path,
+                                        ExecutionContext context ) {
+            this.source = source;
+            this.path = path != null ? path : RootPath.INSTANCE;
+            this.workspace = workspace;
+            this.context = context;
+        }
+
+        /**
+         * Get the repository source where the configuration content may be found
+         * 
+         * @return the source for the configuration repository; never null
+         */
+        public RepositorySource getRepositorySource() {
+            return source;
+        }
+
+        /**
+         * Get the path in the configuration repository where the configuration content may be found
+         * 
+         * @return the path to the configuration content; never null
+         */
+        public Path getPath() {
+            return path;
+        }
+
+        /**
+         * Get the name of the workspace used for the configuration repository.
+         * 
+         * @return the name of the workspace, or null if the default workspace should be used
+         */
+        public String getWorkspace() {
+            return workspace;
+        }
+
+        /**
+         * @return context
+         */
+        public ExecutionContext getContext() {
+            return context;
+        }
+
+        /**
+         * Return a copy of this configuration that uses the supplied path instead of this object's {@link #getPath() path}.
+         * 
+         * @param path the desired path for the new configuration; if null, then "/" is used
+         * @return the new configuration
+         */
+        public ConfigurationContent with( Path path ) {
+            return new ConfigurationContent(source, workspace, path, context);
+        }
+
+        /**
+         * Return a copy of this configuration that uses the supplied workspace name instead of this object's
+         * {@link #getWorkspace() workspace}.
+         * 
+         * @param workspace the desired workspace name for the new configuration; if null, then the default workspace will be used
+         * @return the new configuration
+         */
+        public ConfigurationContent withWorkspace( String workspace ) {
+            return new ConfigurationContent(source, workspace, path, context);
+        }
+
+        /**
+         * Obtain a graph to this configuration repository. This method will always return the same graph instance.
+         * 
+         * @return the graph; never null
+         */
+        protected Graph graph() {
+            if (graph == null) {
+                graph = Graph.create(source, context);
+                if (workspace != null) graph.useWorkspace(workspace);
+            }
+            return graph;
+        }
+    }
+}


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

Added: trunk/dna-repository/src/main/java/org/jboss/dna/repository/config/DnaEngine.java
===================================================================
--- trunk/dna-repository/src/main/java/org/jboss/dna/repository/config/DnaEngine.java	                        (rev 0)
+++ trunk/dna-repository/src/main/java/org/jboss/dna/repository/config/DnaEngine.java	2009-06-03 20:09:11 UTC (rev 968)
@@ -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.repository.config;
+
+/**
+ * 
+ */
+public class DnaEngine {
+
+}


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

Added: trunk/dna-repository/src/main/java/org/jboss/dna/repository/config/JcrConfiguration.java
===================================================================
--- trunk/dna-repository/src/main/java/org/jboss/dna/repository/config/JcrConfiguration.java	                        (rev 0)
+++ trunk/dna-repository/src/main/java/org/jboss/dna/repository/config/JcrConfiguration.java	2009-06-03 20:09:11 UTC (rev 968)
@@ -0,0 +1,145 @@
+/*
+ * 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.repository.config;
+
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.URL;
+import org.jboss.dna.graph.connector.RepositorySource;
+import org.xml.sax.SAXException;
+
+/**
+ * 
+ */
+public class JcrConfiguration extends DnaConfiguration {
+
+    /**
+     * {@inheritDoc}
+     * 
+     * @throws IOException
+     * @throws SAXException
+     * @see org.jboss.dna.repository.config.DnaConfiguration#loadFrom(java.lang.String)
+     */
+    @Override
+    public JcrConfiguration loadFrom( String pathToFile ) throws IOException, SAXException {
+        super.loadFrom(pathToFile);
+        return this;
+    }
+
+    /**
+     * {@inheritDoc}
+     * 
+     * @see org.jboss.dna.repository.config.DnaConfiguration#loadFrom(java.io.File)
+     */
+    @Override
+    public JcrConfiguration loadFrom( File configurationFile ) throws IOException, SAXException {
+        super.loadFrom(configurationFile);
+        return this;
+    }
+
+    /**
+     * {@inheritDoc}
+     * 
+     * @see org.jboss.dna.repository.config.DnaConfiguration#loadFrom(java.net.URL)
+     */
+    @Override
+    public JcrConfiguration loadFrom( URL urlToConfigurationFile ) throws IOException, SAXException {
+        super.loadFrom(urlToConfigurationFile);
+        return this;
+    }
+
+    /**
+     * {@inheritDoc}
+     * 
+     * @see org.jboss.dna.repository.config.DnaConfiguration#loadFrom(java.io.InputStream)
+     */
+    @Override
+    public JcrConfiguration loadFrom( InputStream configurationFileInputStream ) throws IOException, SAXException {
+        super.loadFrom(configurationFileInputStream);
+        return this;
+    }
+
+    /**
+     * {@inheritDoc}
+     * 
+     * @see org.jboss.dna.repository.config.DnaConfiguration#loadFrom(org.jboss.dna.graph.connector.RepositorySource)
+     */
+    @Override
+    public JcrConfiguration loadFrom( RepositorySource source ) {
+        super.loadFrom(source);
+        return this;
+    }
+
+    /**
+     * {@inheritDoc}
+     * 
+     * @see org.jboss.dna.repository.config.DnaConfiguration#loadFrom(org.jboss.dna.graph.connector.RepositorySource,
+     *      java.lang.String)
+     */
+    @Override
+    public JcrConfiguration loadFrom( RepositorySource source,
+                                      String workspaceName ) {
+        super.loadFrom(source, workspaceName);
+        return this;
+    }
+
+    /**
+     * {@inheritDoc}
+     * 
+     * @see org.jboss.dna.repository.config.DnaConfiguration#loadFrom(org.jboss.dna.graph.connector.RepositorySource,
+     *      java.lang.String, java.lang.String)
+     */
+    @Override
+    public JcrConfiguration loadFrom( RepositorySource source,
+                                      String workspaceName,
+                                      String pathInWorkspace ) {
+        super.loadFrom(source, workspaceName, pathInWorkspace);
+        return this;
+    }
+
+    /**
+     * {@inheritDoc}
+     * 
+     * @see org.jboss.dna.repository.config.DnaConfiguration#mimeTypeDetector(java.lang.String)
+     */
+    @Override
+    public MimeTypeDetectorDetails<JcrConfiguration> mimeTypeDetector( String name ) {
+        return new MimeTypeDetectorBuilder<JcrConfiguration>(this);
+    }
+
+    public JcrConfiguration addRepository( String repositoryId ) {
+        return this;
+    }
+
+    /**
+     * {@inheritDoc}
+     * 
+     * @see org.jboss.dna.repository.config.DnaConfiguration#build()
+     */
+    @Override
+    public JcrEngine build() {
+        return new JcrEngine();
+    }
+}


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

Added: trunk/dna-repository/src/main/java/org/jboss/dna/repository/config/JcrConfigurationTest.java
===================================================================
--- trunk/dna-repository/src/main/java/org/jboss/dna/repository/config/JcrConfigurationTest.java	                        (rev 0)
+++ trunk/dna-repository/src/main/java/org/jboss/dna/repository/config/JcrConfigurationTest.java	2009-06-03 20:09:11 UTC (rev 968)
@@ -0,0 +1,98 @@
+/*
+ * 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.repository.config;
+
+import static org.hamcrest.core.Is.is;
+import static org.hamcrest.core.IsNull.notNullValue;
+import static org.hamcrest.core.IsSame.sameInstance;
+import static org.junit.Assert.assertThat;
+import java.io.File;
+import java.net.URL;
+import org.jboss.dna.graph.connector.inmemory.InMemoryRepositorySource;
+import org.junit.Test;
+
+/**
+ * 
+ */
+public class JcrConfigurationTest {
+
+    @Test
+    public void shoulConfigureDnaFromFileUsingPath() throws Exception {
+        DnaConfiguration config = new DnaConfiguration();
+        config.loadFrom("some path");
+
+        DnaEngine engine = config.build();
+        assertThat(engine, is(notNullValue()));
+    }
+
+    @Test
+    public void shoulConfigureDnaFromFile() throws Exception {
+        DnaConfiguration config = new DnaConfiguration();
+        config.loadFrom(new File("file:some path"));
+
+        DnaEngine engine = config.build();
+        assertThat(engine, is(notNullValue()));
+    }
+
+    @Test
+    public void shoulConfigureDnaFromFileUsingURL() throws Exception {
+        DnaConfiguration config = new DnaConfiguration();
+        config.loadFrom(new URL("file:some path"));
+
+        DnaEngine engine = config.build();
+        assertThat(engine, is(notNullValue()));
+    }
+
+    @Test
+    public void shoulConfigureDnaFromRepositorySource() throws Exception {
+        InMemoryRepositorySource source = new InMemoryRepositorySource();
+        DnaConfiguration config = new DnaConfiguration();
+        config.loadFrom(source);
+
+        DnaEngine engine = config.build();
+        assertThat(engine, is(notNullValue()));
+    }
+
+    @Test
+    public void shouldBeConfigurableAsDnaConfiguration() throws Exception {
+        DnaConfiguration config = new DnaConfiguration();
+        assertThat(config.loadFrom("some path"), is(sameInstance(config)));
+        assertThat(config.addMimeTypeDetector("something").and(), is(sameInstance(config)));
+
+        DnaEngine engine = config.build();
+        assertThat(engine, is(notNullValue()));
+    }
+
+    @Test
+    public void shouldBeConfigurableAsJcrConfiguration() throws Exception {
+        JcrConfiguration config = new JcrConfiguration();
+        config.loadFrom("some path").addRepository("some repository ID");
+        assertThat(config.loadFrom("some path"), is(sameInstance(config)));
+        assertThat(config.addMimeTypeDetector("something").and(), is(sameInstance(config)));
+
+        JcrEngine engine = config.build();
+        assertThat(engine, is(notNullValue()));
+    }
+
+}


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

Added: trunk/dna-repository/src/main/java/org/jboss/dna/repository/config/JcrEngine.java
===================================================================
--- trunk/dna-repository/src/main/java/org/jboss/dna/repository/config/JcrEngine.java	                        (rev 0)
+++ trunk/dna-repository/src/main/java/org/jboss/dna/repository/config/JcrEngine.java	2009-06-03 20:09:11 UTC (rev 968)
@@ -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.repository.config;
+
+/**
+ * 
+ */
+public class JcrEngine extends DnaEngine {
+
+}


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

Added: trunk/dna-repository/src/test/java/org/jboss/dna/repository/sequencer/MockStreamSequencerA.java
===================================================================
--- trunk/dna-repository/src/test/java/org/jboss/dna/repository/sequencer/MockStreamSequencerA.java	                        (rev 0)
+++ trunk/dna-repository/src/test/java/org/jboss/dna/repository/sequencer/MockStreamSequencerA.java	2009-06-03 20:09:11 UTC (rev 968)
@@ -0,0 +1,79 @@
+/*
+ * 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.repository.sequencer;
+
+import java.io.InputStream;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.atomic.AtomicInteger;
+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;
+
+/**
+ * A mock stream sequencer that can be used for basic unit testing.
+ */
+ at ThreadSafe
+public class MockStreamSequencerA implements StreamSequencer {
+
+    private AtomicInteger counter = new AtomicInteger();
+    private volatile CountDownLatch latch = new CountDownLatch(0);
+
+    public void setExpectedCount( int numExpected ) {
+        this.latch = new CountDownLatch(numExpected);
+    }
+
+    public boolean awaitExecution( long timeout,
+                                   TimeUnit unit ) throws InterruptedException {
+        return this.latch.await(timeout, unit);
+    }
+
+    /**
+     * {@inheritDoc}
+     * 
+     * @see org.jboss.dna.graph.sequencer.StreamSequencer#sequence(java.io.InputStream,
+     *      org.jboss.dna.graph.sequencer.SequencerOutput, org.jboss.dna.graph.sequencer.StreamSequencerContext)
+     */
+    public void sequence( InputStream stream,
+                          SequencerOutput output,
+                          StreamSequencerContext context ) {
+        // increment the counter and record the progress ...
+        this.counter.incrementAndGet();
+        this.latch.countDown();
+    }
+
+    public int getCounter() {
+        return this.counter.get();
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public String toString() {
+        return "MockStreamSequencerA [" + this.getCounter() + "]";
+    }
+}


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

Added: trunk/dna-repository/src/test/java/org/jboss/dna/repository/sequencer/MockStreamSequencerB.java
===================================================================
--- trunk/dna-repository/src/test/java/org/jboss/dna/repository/sequencer/MockStreamSequencerB.java	                        (rev 0)
+++ trunk/dna-repository/src/test/java/org/jboss/dna/repository/sequencer/MockStreamSequencerB.java	2009-06-03 20:09:11 UTC (rev 968)
@@ -0,0 +1,79 @@
+/*
+ * 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.repository.sequencer;
+
+import java.io.InputStream;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.atomic.AtomicInteger;
+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;
+
+/**
+ * A mock stream sequencer that can be used for basic unit testing.
+ */
+ at ThreadSafe
+public class MockStreamSequencerB implements StreamSequencer {
+
+    private AtomicInteger counter = new AtomicInteger();
+    private volatile CountDownLatch latch = new CountDownLatch(0);
+
+    public void setExpectedCount( int numExpected ) {
+        this.latch = new CountDownLatch(numExpected);
+    }
+
+    public boolean awaitExecution( long timeout,
+                                   TimeUnit unit ) throws InterruptedException {
+        return this.latch.await(timeout, unit);
+    }
+
+    /**
+     * {@inheritDoc}
+     * 
+     * @see org.jboss.dna.graph.sequencer.StreamSequencer#sequence(java.io.InputStream,
+     *      org.jboss.dna.graph.sequencer.SequencerOutput, org.jboss.dna.graph.sequencer.StreamSequencerContext)
+     */
+    public void sequence( InputStream stream,
+                          SequencerOutput output,
+                          StreamSequencerContext context ) {
+        // increment the counter and record the progress ...
+        this.counter.incrementAndGet();
+        this.latch.countDown();
+    }
+
+    public int getCounter() {
+        return this.counter.get();
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public String toString() {
+        return "MockStreamSequencerB [" + this.getCounter() + "]";
+    }
+}


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

Added: trunk/docs/examples/gettingstarted/repositories/src/main/resources/aircraft.cnd
===================================================================
--- trunk/docs/examples/gettingstarted/repositories/src/main/resources/aircraft.cnd	                        (rev 0)
+++ trunk/docs/examples/gettingstarted/repositories/src/main/resources/aircraft.cnd	2009-06-03 20:09:11 UTC (rev 968)
@@ -0,0 +1,64 @@
+/*
+ * 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'>
+<air='http://jboss.org/dna/examples/aircraft/1.0'>
+
+//------------------------------------------------------------------------------
+// N O D E T Y P E S
+//------------------------------------------------------------------------------
+
+[air:Aircraft] > nt:unstructured
+  - air:maker (string)
+  - air:model (string)
+  - air:designedBy (string)
+  - air:introduced (string) < '(19|20)\d{2}'                // any 4 digit number starting with '19' or '20'
+  - air:range (string)                                      // any integer (with optional ',' every 1000s place)
+     < '\d{1,3}(,?\d{3})*\s*(nm|m|km|mi|ft)'                // followed by 'nm', 'm', 'km', 'mi', or 'ft'
+  - air:maxSpeed (string)                                   // any integer (with optional ',' every 1000s place)
+    < '\d{1,3}(,?\d{3})*\s*(kt|mph|km/h|kmph)'              // followed by 'kt', 'mph', 'km/h' or 'kmph'
+  - air:takeoffSpeed (string)                               // any integer (with optional ',' every 1000s place)
+    < '\d{1,3}(,?\d{3})*\s*(kt|mph|km/h|kmph)'              // followed by 'kt', 'mph', 'km/h' or 'kmph'
+  - air:cruiseSpeed (string)                                // any integer (with optional ',' every 1000s place)
+    < '\d{1,3}(,?\d{3})*\s*(kt|mph|km/h|kmph)'              // followed by 'kt', 'mph', 'km/h' or 'kmph'
+  - air:emptyWeight (string)                                // any integer (with optional ',' every 1000s place)
+    < '\d{1,3}(,?\d{3})*\s*(lb|kg)'                         // followed by 'lb' or 'kg'
+  - air:maxWeight (string)                                  // any integer (with optional ',' every 1000s place)
+    < '\d{1,3}(,?\d{3})*\s*(lb|kg)'                         // followed by 'lb' or 'kg'
+  - air:rateOfClimb (string)                                // any integer (with optional ',' every 1000s place)
+    < '\d{1,3}(,?\d{3})*\s*(ft|km|m)/(s|min)'               // followed by 'ft/s', 'ft/min', 'km/s', 'km/min', 'm/s', or 'm/min'
+  - air:serviceCeiling (string)                             // any integer (with optional ',' every 1000s place)
+    < '\d{1,3}(,?\d{3})*\s*(nm|m|km|mi|ft)'                 // followed by 'nm', 'm', 'km', 'mi', or 'ft'
+  - air:fuelCapacity (string)                               // any integer (with optional ',' every 1000s place)
+    < '\d{1,3}(,?\d{3})*\s*(lb|kg|gal|L)'                   // followed by 'lb', 'kg', 'gal', or 'L'
+  - air:crew (long) < '[0,)'                                // any non-negative value
+  - air:numberBuilt (string)                                // any integer (with optional ',' every 1000s place)
+    < '\d{1,3}(,?\d{3})*\s*[+]?' ,                          // optionally followed by '+'
+      '([<>]\s*)?\d{1,3}(,?\d{3})*'                         // or prefixed by '<' or '>'
+  - air:url (string)

Added: trunk/docs/examples/gettingstarted/repositories/src/main/resources/cars.cnd
===================================================================
--- trunk/docs/examples/gettingstarted/repositories/src/main/resources/cars.cnd	                        (rev 0)
+++ trunk/docs/examples/gettingstarted/repositories/src/main/resources/cars.cnd	2009-06-03 20:09:11 UTC (rev 968)
@@ -0,0 +1,50 @@
+/*
+ * 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'>
+<car='http://jboss.org/dna/examples/cars/1.0'>
+
+//------------------------------------------------------------------------------
+// N O D E T Y P E S
+//------------------------------------------------------------------------------
+
+[car:Car] > nt:unstructured
+  - car:maker (string)
+  - car:model (string)
+  - car:year (string) < '(19|20)\d{2}'                     // any 4 digit number starting with '19' or '20'
+  - car:msrp (string) < '[$]\d{1,3}[,]?\d{3}([.]\d{2})?'   // of the form "$X,XXX.ZZ", "$XX,XXX.ZZ" or "$XXX,XXX.ZZ" 
+                                                           // where '.ZZ' is optional
+  - car:userRating (long) < '[1,5]'                        // any value from 1 to 5 (inclusive)
+  - car:valueRating (long) < '[1,5]'                       // any value from 1 to 5 (inclusive)
+  - car:mpgCity (long) < '(0,]'                            // any value greater than 0
+  - car:mpgHighway (long) < '(0,]'                         // any value greater than 0
+  - car:lengthInInches (double) < '(0,]'                   // any value greater than 0
+  - car:wheelbaseInInches (double) < '(0,]'                // any value greater than 0
+  - car:engine (string)
+



From dna-commits at lists.jboss.org  Wed Jun  3 16:10:20 2009
From: dna-commits at lists.jboss.org (dna-commits at lists.jboss.org)
Date: Wed, 03 Jun 2009 16:10:20 -0400
Subject: [dna-commits] DNA SVN: r969 - in trunk:
	dna-graph/src/main/java/org/jboss/dna/graph and 19 other
	directories.
Message-ID: <E1MBwmy-0001we-E1@committer01.frg.pub.inap.atl.jboss.com>

Author: rhauch
Date: 2009-06-03 16:10:19 -0400 (Wed, 03 Jun 2009)
New Revision: 969

Added:
   trunk/dna-jcr/src/test/resources/config/
   trunk/dna-jcr/src/test/resources/config/configRepository.xml
   trunk/dna-repository/src/test/resources/config/
   trunk/dna-repository/src/test/resources/config/configRepository.xml
   trunk/docs/examples/gettingstarted/sequencers/src/main/resources/security/
   trunk/docs/examples/gettingstarted/sequencers/src/main/resources/security/jaas.conf.xml
   trunk/docs/examples/gettingstarted/sequencers/src/main/resources/security/roles.properties
   trunk/docs/examples/gettingstarted/sequencers/src/main/resources/security/users.properties
Removed:
   trunk/dna-repository/src/main/java/org/jboss/dna/repository/Configurator.java
   trunk/dna-repository/src/main/java/org/jboss/dna/repository/config/DnaConfiguration.java
   trunk/dna-repository/src/main/java/org/jboss/dna/repository/config/DnaEngine.java
   trunk/dna-repository/src/main/java/org/jboss/dna/repository/config/JcrConfiguration.java
   trunk/dna-repository/src/main/java/org/jboss/dna/repository/config/JcrConfigurationTest.java
   trunk/dna-repository/src/main/java/org/jboss/dna/repository/config/JcrEngine.java
Modified:
   trunk/dna-cnd/src/main/java/org/jboss/dna/cnd/CndImporter.java
   trunk/dna-graph/src/main/java/org/jboss/dna/graph/Graph.java
   trunk/dna-graph/src/main/java/org/jboss/dna/graph/request/BatchRequestBuilder.java
   trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/JcrConfiguration.java
   trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/JcrEngine.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/SessionCache.java
   trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/cache/ImmutableNodeInfo.java
   trunk/dna-jcr/src/test/java/org/jboss/dna/jcr/AbstractJcrNodeTest.java
   trunk/dna-jcr/src/test/java/org/jboss/dna/jcr/InMemoryRepositoryStub.java
   trunk/dna-jcr/src/test/java/org/jboss/dna/jcr/JcrConfigurationTest.java
   trunk/dna-repository/src/main/java/org/jboss/dna/repository/DnaConfiguration.java
   trunk/dna-repository/src/main/java/org/jboss/dna/repository/DnaEngine.java
   trunk/dna-repository/src/main/java/org/jboss/dna/repository/DnaLexicon.java
   trunk/dna-repository/src/main/java/org/jboss/dna/repository/RepositoryI18n.java
   trunk/dna-repository/src/main/resources/org/jboss/dna/repository/RepositoryI18n.properties
   trunk/dna-repository/src/test/java/org/jboss/dna/repository/DnaConfigurationTest.java
   trunk/dna-repository/src/test/java/org/jboss/dna/repository/DnaEngineTest.java
   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/test/java/org/jboss/example/dna/sequencer/SequencingClientTest.java
   trunk/extensions/dna-connector-jbosscache/src/main/java/org/jboss/dna/connector/jbosscache/JBossCacheRequestProcessor.java
   trunk/extensions/dna-sequencer-java/src/main/resources/org/jboss/dna/sequencer/java/javaSource.cnd
Log:
DNA-389 Change Getting Started examples to use the DnaConfiguration and JcrConfiguration components

Simplified and improved the DnaConfiguration and JcrConfiguration classes, and added to JcrConfiguration the ability to define the repositories separately from the repository sources and to define on these repositories the JCR options, namespaces, and node types in the configuration (including via the configuration API).  All the existing uses of the configuration classes were changed to use the new/modified methods.

Modified: trunk/dna-cnd/src/main/java/org/jboss/dna/cnd/CndImporter.java
===================================================================
--- trunk/dna-cnd/src/main/java/org/jboss/dna/cnd/CndImporter.java	2009-06-03 20:09:11 UTC (rev 968)
+++ trunk/dna-cnd/src/main/java/org/jboss/dna/cnd/CndImporter.java	2009-06-03 20:10:19 UTC (rev 969)
@@ -222,7 +222,7 @@
                     String prefix = namespace.getFirstChildWithType(CndLexer.PREFIX).getChild(0).getText();
                     String uri = namespace.getFirstChildWithType(CndLexer.URI).getChild(0).getText();
                     // Register the namespace ...
-                    context.namespaces().register(removeQuotes(prefix), removeQuotes(uri));
+                    context.register(removeQuotes(prefix), removeQuotes(uri));
                 }
             }
 
@@ -346,6 +346,7 @@
      */
     protected final class ImportContext {
         private final ExecutionContext context;
+        private final ExecutionContext originalContext;
         private final Problems problems;
         private final String resourceName;
 
@@ -354,6 +355,7 @@
                                  String resourceName ) {
             // Create a context that has a local namespace registry
             NamespaceRegistry localNamespaces = new LocalNamespaceRegistry(context.getNamespaceRegistry());
+            this.originalContext = context;
             this.context = context.with(localNamespaces);
             this.problems = problems;
             this.resourceName = resourceName;
@@ -363,8 +365,17 @@
             return this.context;
         }
 
-        protected NamespaceRegistry namespaces() {
-            return this.context.getNamespaceRegistry();
+        protected void register( String prefix,
+                                 String uri ) {
+            // Register it in the local registry with the supplied prefix ...
+            context.getNamespaceRegistry().register(prefix, uri);
+
+            // See if it is already registered in the original context ...
+            NamespaceRegistry registry = originalContext.getNamespaceRegistry();
+            if (!registry.isRegisteredNamespaceUri(uri)) {
+                // It is not, so register it ...
+                registry.register(prefix, uri);
+            }
         }
 
         protected NameFactory nameFactory() {

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	2009-06-03 20:09:11 UTC (rev 968)
+++ trunk/dna-graph/src/main/java/org/jboss/dna/graph/Graph.java	2009-06-03 20:10:19 UTC (rev 969)
@@ -109,6 +109,7 @@
      * @param context the context in which all executions should be performed
      * @return the new graph
      * @throws IllegalArgumentException if the source or context parameters are null
+     * @throws RepositorySourceException if a source with the supplied name does not exist
      */
     public static Graph create( String sourceName,
                                 RepositoryConnectionFactory connectionFactory,
@@ -1311,6 +1312,15 @@
                         return nextGraph;
                     }
 
+                    public Conjunction<Graph> to( Object[] values ) {
+                        for (int i = 0, len = values.length; i != len; ++i) {
+                            values[i] = convertReferenceValue(values[i]);
+                        }
+                        Property property = getContext().getPropertyFactory().create(propertyName, values);
+                        requests.setProperty(location, getCurrentWorkspaceName(), property);
+                        return nextGraph;
+                    }
+
                     public Conjunction<Graph> to( Iterable<?> values ) {
                         List<Object> valueList = new LinkedList<Object>();
                         for (Object value : values) {
@@ -1468,6 +1478,13 @@
                 return set(getContext().getPropertyFactory().create(propertyName, firstValue, otherValues));
             }
 
+            public On<Conjunction<Graph>> to( Object[] values ) {
+                for (int i = 0, len = values.length; i != len; ++i) {
+                    values[i] = convertReferenceValue(values[i]);
+                }
+                return set(getContext().getPropertyFactory().create(propertyName, values));
+            }
+
             public On<Conjunction<Graph>> to( Iterable<?> values ) {
                 List<Object> valueList = new LinkedList<Object>();
                 for (Object value : values) {
@@ -2734,6 +2751,157 @@
         }
 
         /**
+         * Begin the request to create a node located at the supplied path if there is no such node already.
+         * <p>
+         * Like all other methods on the {@link Batch}, the request will be performed when the {@link #execute()} method is
+         * called.
+         * </p>
+         * 
+         * @param atPath the path to the node that is to be created.
+         * @return the object that can be used to specify addition properties for the new node to be copied or the location of the
+         *         node where the node is to be created
+         */
+        public Create<Batch> createIfMissing( String atPath ) {
+            return createIfMissing(createPath(atPath));
+        }
+
+        /**
+         * Begin the request to create a node located at the supplied path if there is no such node already.
+         * <p>
+         * Like all other methods on the {@link Batch}, the request will be performed when the {@link #execute()} method is
+         * called.
+         * </p>
+         * 
+         * @param atPath the path to the node that is to be created.
+         * @param property a property for the new node
+         * @return the object that can be used to specify addition properties for the new node to be copied or the location of the
+         *         node where the node is to be created
+         */
+        public Create<Batch> createIfMissing( String atPath,
+                                              Property property ) {
+            return createIfMissing(createPath(atPath)).with(property);
+        }
+
+        /**
+         * Begin the request to create a node located at the supplied path if there is no such node already.
+         * <p>
+         * Like all other methods on the {@link Batch}, the request will be performed when the {@link #execute()} method is
+         * called.
+         * </p>
+         * 
+         * @param atPath the path to the node that is to be created.
+         * @param firstProperty a property for the new node
+         * @param additionalProperties additional properties for the new node
+         * @return the object that can be used to specify addition properties for the new node to be copied or the location of the
+         *         node where the node is to be created
+         */
+        public Create<Batch> createIfMissing( String atPath,
+                                              Property firstProperty,
+                                              Property... additionalProperties ) {
+            return createIfMissing(createPath(atPath)).with(firstProperty, additionalProperties);
+        }
+
+        /**
+         * Begin the request to create a node located at the supplied path if there is no such node already.
+         * <p>
+         * Like all other methods on the {@link Batch}, the request will be performed when the {@link #execute()} method is
+         * called.
+         * </p>
+         * 
+         * @param at the path to the node that is to be created.
+         * @return the object that can be used to specify addition properties for the new node to be copied or the location of the
+         *         node where the node is to be created
+         */
+        public final Create<Batch> createIfMissing( Path at ) {
+            assertNotExecuted();
+            CheckArg.isNotNull(at, "at");
+            Path parent = at.getParent();
+            Name name = at.getLastSegment().getName();
+            return createIfMissing(Location.create(parent), name);
+        }
+
+        protected final CreateAction<Batch> createIfMissing( Location parent,
+                                                             Name child ) {
+            return new CreateAction<Batch>(this, parent, getCurrentWorkspaceName(), child) {
+                @Override
+                protected Batch submit( Location parent,
+                                        String workspaceName,
+                                        Name childName,
+                                        Collection<Property> properties ) {
+                    requestQueue.createNode(parent, workspaceName, childName, properties.iterator(), NodeConflictBehavior.UPDATE);
+                    return Batch.this;
+                }
+
+                /**
+                 * {@inheritDoc}
+                 * 
+                 * @see org.jboss.dna.graph.Graph.Executable#execute()
+                 */
+                public Results execute() {
+                    and();
+                    return Batch.this.execute();
+                }
+            };
+        }
+
+        /**
+         * Begin the request to create a node located at the supplied path.
+         * <p>
+         * Like all other methods on the {@link Batch}, the request will be performed when the {@link #execute()} method is
+         * called.
+         * </p>
+         * 
+         * @param at the path to the node that is to be created.
+         * @param properties the iterator over the properties for the new node
+         * @return the object that can be used to specify addition properties for the new node to be copied or the location of the
+         *         node where the node is to be created
+         */
+        public Create<Batch> createIfMissing( Path at,
+                                              Iterable<Property> properties ) {
+            Create<Batch> action = createIfMissing(at);
+            for (Property property : properties) {
+                action.and(property);
+            }
+            return action;
+        }
+
+        /**
+         * Begin the request to create a node located at the supplied path if there is no such node already.
+         * <p>
+         * Like all other methods on the {@link Batch}, the request will be performed when the {@link #execute()} method is
+         * called.
+         * </p>
+         * 
+         * @param at the path to the node that is to be created.
+         * @param property a property for the new node
+         * @return the object that can be used to specify addition properties for the new node to be copied or the location of the
+         *         node where the node is to be created
+         */
+        public Create<Batch> createIfMissing( Path at,
+                                              Property property ) {
+            return createIfMissing(at).with(property);
+        }
+
+        /**
+         * Begin the request to create a node located at the supplied path if there is no such node already.
+         * <p>
+         * Like all other methods on the {@link Batch}, the request will be performed when the {@link #execute()} method is
+         * called.
+         * </p>
+         * 
+         * @param at the path to the node that is to be created.
+         * @param firstProperty a property for the new node
+         * @param additionalProperties additional properties for the new node
+         * @return the object that can be used to specify addition properties for the new node to be copied or the location of the
+         *         node where the node is to be created
+         */
+        public Create<Batch> createIfMissing( Path at,
+                                              Property firstProperty,
+                                              Property... additionalProperties ) {
+            return createIfMissing(at).with(firstProperty, additionalProperties);
+        }
+
+        /**
          * Begin the request to create a node under the existing parent node at the supplied location. This request is submitted
          * to the repository after the returned components are completed.
          * 
@@ -2930,6 +3098,15 @@
                             return nextRequests;
                         }
 
+                        public BatchConjunction to( Object[] values ) {
+                            for (int i = 0; i != values.length; ++i) {
+                                values[i] = convertReferenceValue(values[i]);
+                            }
+                            Property property = getContext().getPropertyFactory().create(propertyName, values);
+                            requestQueue.setProperty(location, getCurrentWorkspaceName(), property);
+                            return nextRequests;
+                        }
+
                         public BatchConjunction to( Iterable<?> values ) {
                             List<Object> valueList = new LinkedList<Object>();
                             for (Object value : values) {
@@ -3089,6 +3266,13 @@
                     return set(getContext().getPropertyFactory().create(propertyName, values));
                 }
 
+                public On<BatchConjunction> to( Object[] values ) {
+                    for (int i = 0, len = values.length; i != len; ++i) {
+                        values[i] = convertReferenceValue(values[i]);
+                    }
+                    return set(getContext().getPropertyFactory().create(propertyName, values));
+                }
+
                 public On<BatchConjunction> to( Iterable<?> values ) {
                     List<Object> valueList = new LinkedList<Object>();
                     for (Object value : values) {
@@ -4779,6 +4963,18 @@
         Next to( Object value );
 
         /**
+         * Set the property values to the given object. Each of the supplied <code>values</code> should be a valid property value,
+         * or a {@link Node} (or {@link Location}) if the property value is to be a reference to that node (or location). Note
+         * that it is an error if the Node (or Location) does not have a {@link Location#getUuid() UUID}.
+         * 
+         * @param values the property values
+         * @return the interface for additional requests or actions
+         * @throws IllegalArgumentException if the any of the values is a Node or Location that has no {@link Location#getUuid()
+         *         UUID}
+         */
+        Next to( Object[] values );
+
+        /**
          * Set the property value to the given objects. Each of the supplied values should be a valid property value, or a
          * {@link Node} (or {@link Location}) if the property value is to be a reference to that node (or location). Note that it
          * is an error if the Node (or Location) does not have a {@link Location#getUuid() UUID}.

Modified: trunk/dna-graph/src/main/java/org/jboss/dna/graph/request/BatchRequestBuilder.java
===================================================================
--- trunk/dna-graph/src/main/java/org/jboss/dna/graph/request/BatchRequestBuilder.java	2009-06-03 20:09:11 UTC (rev 968)
+++ trunk/dna-graph/src/main/java/org/jboss/dna/graph/request/BatchRequestBuilder.java	2009-06-03 20:10:19 UTC (rev 969)
@@ -467,6 +467,7 @@
         // Record this operation as a pending change ...
         pendingRequest = new NodeChange(on, workspaceName);
         for (Property property : properties) {
+            if (property == null) continue;
             pendingRequest.pendingProperties.put(property.getName(), property);
         }
         return this;

Modified: trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/JcrConfiguration.java
===================================================================
--- trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/JcrConfiguration.java	2009-06-03 20:09:11 UTC (rev 968)
+++ trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/JcrConfiguration.java	2009-06-03 20:10:19 UTC (rev 969)
@@ -6,8 +6,8 @@
  * See the AUTHORS.txt file in the distribution for a full listing of 
  * individual contributors.
  *
- * Unless otherwise indicated, all code in JBoss DNA is licensed
- * to you under the terms of the GNU Lesser General Public License as
+ * 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.
  * 
@@ -27,496 +27,589 @@
 import java.io.IOException;
 import java.io.InputStream;
 import java.net.URL;
+import java.util.Collections;
+import java.util.EnumMap;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+import net.jcip.annotations.NotThreadSafe;
 import org.jboss.dna.cnd.CndImporter;
+import org.jboss.dna.common.component.ClassLoaderFactory;
 import org.jboss.dna.common.util.CheckArg;
 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.RepositorySource;
 import org.jboss.dna.graph.io.Destination;
 import org.jboss.dna.graph.io.GraphBatchDestination;
-import org.jboss.dna.graph.mimetype.MimeTypeDetector;
+import org.jboss.dna.graph.property.Name;
 import org.jboss.dna.graph.property.Path;
-import org.jboss.dna.graph.sequencer.StreamSequencer;
-import org.jboss.dna.repository.Configurator;
+import org.jboss.dna.graph.property.PathNotFoundException;
+import org.jboss.dna.graph.property.Property;
+import org.jboss.dna.graph.property.NamespaceRegistry.Namespace;
+import org.jboss.dna.jcr.JcrRepository.Option;
 import org.jboss.dna.repository.DnaConfiguration;
 import org.jboss.dna.repository.DnaConfigurationException;
-import org.jboss.dna.repository.Configurator.And;
-import org.jboss.dna.repository.Configurator.ChooseClass;
-import org.jboss.dna.repository.Configurator.ConfigSourceDetails;
-import org.jboss.dna.repository.Configurator.MimeTypeDetectorDetails;
-import org.jboss.dna.repository.Configurator.RepositorySourceDetails;
-import org.jboss.dna.repository.Configurator.SequencerDetails;
-import org.jboss.dna.repository.Configurator.SetName;
+import org.xml.sax.SAXException;
 
 /**
  * A configuration builder for a {@link JcrEngine}. This class is an internal domain-specific language (DSL), and is designed to
  * be used in a traditional way or in a method-chained manner:
  * 
  * <pre>
- * configuration.addRepository(&quot;Source1&quot;).usingClass(InMemoryRepositorySource.class).describedAs(&quot;description&quot;);
- * configuration.addMimeTypeDetector(&quot;detector&quot;).usingClass(ExtensionBasedMimeTypeDetector.class).describedAs(&quot;default detector&quot;);
- * configuration.addSequencer(&quot;MicrosoftDocs&quot;)
- *              .usingClass(&quot;org.jboss.dna.sequencer.msoffice.MSOfficeMetadataSequencer&quot;)
- *              .loadedFromClasspath()
- *              .named(&quot;Microsoft Document sequencer&quot;)
- *              .describedAs(&quot;Our primary sequencer for all .doc files&quot;)
+ * configuration.repositorySource(&quot;Source1&quot;).setClass(InMemoryRepositorySource.class).setDescription(&quot;description&quot;);
+ * configuration.mimeTypeDetector(&quot;detector&quot;).setClass(ExtensionBasedMimeTypeDetector.class).setDescription(&quot;default detector&quot;);
+ * configuration.sequencer(&quot;MicrosoftDocs&quot;)
+ *              .setClass(&quot;org.jboss.dna.sequencer.msoffice.MSOfficeMetadataSequencer&quot;)
+ *              .setDescription(&quot;Our primary sequencer for all .doc files&quot;)
  *              .sequencingFrom(&quot;/public//(*.(doc|xml|ppt)[*]/jcr:content[@jcr:data]&quot;)
  *              .andOutputtingTo(&quot;/documents/$1&quot;);
+ * configuration.repository(&quot;MyRepository&quot;).setSource(&quot;Source1&quot;);
  * configuration.save();
  * </pre>
  */
-public class JcrConfiguration
-    implements Configurator.Initializer<JcrConfiguration>, Configurator.SequencerConfigurator<JcrConfiguration>,
-    Configurator.RepositorySourceConfigurator<JcrConfiguration>, Configurator.MimeDetectorConfigurator<JcrConfiguration>,
-    Configurator.Builder<JcrEngine> {
+ at NotThreadSafe
+public class JcrConfiguration extends DnaConfiguration {
 
-    private final JcrConfiguration.Builder<JcrConfiguration> builder;
+    /**
+     * Interface used to define a JCR Repository that's accessible from the JcrEngine.
+     * 
+     * @param <ReturnType>
+     */
+    public interface RepositoryDefinition<ReturnType> extends Returnable<ReturnType>, Removable<ReturnType> {
 
+        /**
+         * Specify the name of the repository source that is to be used by this JCR repository.
+         * 
+         * @param sourceName the name of the repository source that should be exposed by this JCR repository
+         * @return the interface used to set the value for the property; never null
+         * @throws IllegalArgumentException if the source name parameter is null
+         */
+        RepositoryDefinition<ReturnType> setSource( String sourceName );
+
+        /**
+         * Get the name of the repository source that is to be used by this JCR repository.
+         * 
+         * @return the source name, or null if it has not yet been set
+         */
+        String getSource();
+
+        /**
+         * Specify the repository option that is to be set.
+         * 
+         * @param option the option to be set
+         * @param value the new value for the option
+         * @return the interface used to set the value for the property; never null
+         * @throws IllegalArgumentException if either parameter is null
+         */
+        RepositoryDefinition<ReturnType> setOption( JcrRepository.Option option,
+                                                    String value );
+
+        /**
+         * Get the value for the repository option.
+         * 
+         * @param option the option
+         * @return the current option value, which may be null if the option has not been set (and its default would be used)
+         * @throws IllegalArgumentException if the option parameter is null
+         */
+        String getOption( JcrRepository.Option option );
+
+        /**
+         * Specify that the CND in the supplied string should be loaded into the repository.
+         * 
+         * @param cndContents the string containing the compact node definitions
+         * @return this object for chained method invocation
+         * @throws IllegalArgumentException if the string is null or empty
+         * @throws DnaConfigurationException if there is an error reading the CND contents
+         */
+        RepositoryDefinition<ReturnType> addNodeTypes( String cndContents );
+
+        /**
+         * Specify that the CND file is to be loaded into the repository.
+         * 
+         * @param cndFile the CND file
+         * @return this object for chained method invocation
+         * @throws IllegalArgumentException if the file is null
+         * @throws DnaConfigurationException if there is an error reading the file
+         */
+        RepositoryDefinition<ReturnType> addNodeTypes( File cndFile );
+
+        /**
+         * Specify that the CND file is to be loaded into the repository.
+         * 
+         * @param urlOfCndFile the URL of the CND file
+         * @return this object for chained method invocation
+         * @throws IllegalArgumentException if the URL is null
+         * @throws DnaConfigurationException if there is an error reading the content at the URL
+         */
+        RepositoryDefinition<ReturnType> addNodeTypes( URL urlOfCndFile );
+
+        /**
+         * Specify that the CND file is to be loaded into the repository.
+         * 
+         * @param cndContent the stream containing the CND content
+         * @return this object for chained method invocation
+         * @throws IllegalArgumentException if the URL is null
+         * @throws DnaConfigurationException if there is an error reading the stream at the URL
+         */
+        RepositoryDefinition<ReturnType> addNodeTypes( InputStream cndContent );
+
+        /**
+         * Specify the namespace binding that should be made available in this repository.
+         * 
+         * @param prefix the namespace prefix; may not be null or empty, and must be a valid prefix
+         * @param uri the uri for the namespace; may not be null or empty
+         * @return the interface used to set the value for the property; never null
+         */
+        RepositoryDefinition<ReturnType> registerNamespace( String prefix,
+                                                            String uri );
+    }
+
+    private final Map<String, RepositoryDefinition<? extends JcrConfiguration>> repositoryDefinitions = new HashMap<String, RepositoryDefinition<? extends JcrConfiguration>>();
+
     /**
-     * Create a new configuration for DNA.
+     * Create a new configuration, using a default-constructed {@link ExecutionContext}.
      */
     public JcrConfiguration() {
-        this(new ExecutionContext());
+        super();
     }
 
     /**
-     * Specify a new {@link ExecutionContext} that should be used for this DNA instance.
+     * Create a new configuration using the supplied {@link ExecutionContext}.
      * 
-     * @param context the new context, or null if a default-constructed execution context should be used
-     * @throws IllegalArgumentException if the supplied context reference is null
+     * @param context the execution context
+     * @throws IllegalArgumentException if the path is null or empty
      */
     public JcrConfiguration( ExecutionContext context ) {
-        this.builder = new JcrConfiguration.Builder<JcrConfiguration>(context, this);
+        super(context);
     }
 
     /**
-     * Get the execution context used by this configurator.
+     * {@inheritDoc}
      * 
-     * @return the execution context; never null
+     * @throws IOException
+     * @throws SAXException
+     * @see org.jboss.dna.repository.DnaConfiguration#loadFrom(java.lang.String)
      */
-    public final ExecutionContext getExecutionContext() {
-        return builder.getExecutionContext();
+    @Override
+    public JcrConfiguration loadFrom( String pathToFile ) throws IOException, SAXException {
+        super.loadFrom(pathToFile);
+        return this;
     }
 
     /**
      * {@inheritDoc}
      * 
-     * @see org.jboss.dna.repository.Configurator.Initializer#withConfigurationSource()
+     * @see org.jboss.dna.repository.DnaConfiguration#loadFrom(java.lang.String, java.lang.String)
      */
-    public ChooseClass<RepositorySource, ConfigSourceDetails<JcrConfiguration>> withConfigurationSource() {
-        return builder.withConfigurationSource();
+    @Override
+    public JcrConfiguration loadFrom( String pathToConfigurationFile,
+                                      String path ) throws IOException, SAXException {
+        super.loadFrom(pathToConfigurationFile, path);
+        return this;
     }
 
     /**
      * {@inheritDoc}
      * 
-     * @see org.jboss.dna.repository.Configurator.SequencerConfigurator#addSequencer(java.lang.String)
+     * @see org.jboss.dna.repository.DnaConfiguration#loadFrom(java.io.File)
      */
-    public ChooseClass<StreamSequencer, SequencerDetails<JcrConfiguration>> addSequencer( String id ) {
-        CheckArg.isNotEmpty(id, "id");
-        return builder.addSequencer(id);
+    @Override
+    public JcrConfiguration loadFrom( File configurationFile ) throws IOException, SAXException {
+        super.loadFrom(configurationFile);
+        return this;
     }
 
     /**
      * {@inheritDoc}
      * 
-     * @see org.jboss.dna.repository.Configurator.RepositorySourceConfigurator#addSource(java.lang.String)
+     * @see org.jboss.dna.repository.DnaConfiguration#loadFrom(java.io.File, java.lang.String)
      */
-    public ChooseClass<RepositorySource, RepositorySourceDetails<JcrConfiguration>> addSource( String id ) {
-        CheckArg.isNotEmpty(id, "id");
-        return builder.addSource(id);
+    @Override
+    public JcrConfiguration loadFrom( File configurationFile,
+                                      String path ) throws IOException, SAXException {
+        super.loadFrom(configurationFile, path);
+        return this;
     }
 
     /**
      * {@inheritDoc}
      * 
-     * @see org.jboss.dna.repository.Configurator.RepositorySourceConfigurator#addSource(org.jboss.dna.graph.connector.RepositorySource)
+     * @see org.jboss.dna.repository.DnaConfiguration#loadFrom(java.net.URL)
      */
-    public JcrConfiguration addSource( RepositorySource source ) {
-        CheckArg.isNotNull(source, "source");
-        CheckArg.isNotEmpty(source.getName(), "source.getName()");
-        return builder.addSource(source);
+    @Override
+    public JcrConfiguration loadFrom( URL urlToConfigurationFile ) throws IOException, SAXException {
+        super.loadFrom(urlToConfigurationFile);
+        return this;
     }
 
     /**
-     * Add a JCR repository to this configuration.
+     * {@inheritDoc}
      * 
-     * @param id the identifier for this repository; may not be null or empty
-     * @return the interface used to configure the repository
+     * @see org.jboss.dna.repository.DnaConfiguration#loadFrom(java.net.URL, java.lang.String)
      */
-    public SourceSetter<JcrRepositoryDetails<JcrConfiguration>> addRepository( final String id ) {
-        CheckArg.isNotEmpty(id, "id");
-        final JcrConfiguration.Builder<JcrConfiguration> builder = this.builder;
-        return new SourceSetter<JcrRepositoryDetails<JcrConfiguration>>() {
-            /**
-             * {@inheritDoc}
-             * 
-             * @see org.jboss.dna.jcr.JcrConfiguration.SourceSetter#usingSource(java.lang.String)
-             */
-            public JcrRepositoryDetails<JcrConfiguration> usingSource( String sourceId ) {
-                return builder.addRepository(id, sourceId);
-            }
-        };
+    @Override
+    public JcrConfiguration loadFrom( URL urlToConfigurationFile,
+                                      String path ) throws IOException, SAXException {
+        super.loadFrom(urlToConfigurationFile, path);
+        return this;
     }
 
     /**
      * {@inheritDoc}
      * 
-     * @see org.jboss.dna.repository.Configurator.MimeDetectorConfigurator#addMimeTypeDetector(java.lang.String)
+     * @see org.jboss.dna.repository.DnaConfiguration#loadFrom(java.io.InputStream)
      */
-    public ChooseClass<MimeTypeDetector, MimeTypeDetectorDetails<JcrConfiguration>> addMimeTypeDetector( String id ) {
-        CheckArg.isNotEmpty(id, "id");
-        return builder.addMimeTypeDetector(id);
+    @Override
+    public JcrConfiguration loadFrom( InputStream configurationFileInputStream ) throws IOException, SAXException {
+        super.loadFrom(configurationFileInputStream);
+        return this;
     }
 
     /**
-     * Save any changes that have been made so far to the configuration. This method does nothing if no changes have been made.
+     * {@inheritDoc}
      * 
-     * @return this configuration object for method chaining purposes; never null
+     * @see org.jboss.dna.repository.DnaConfiguration#loadFrom(java.io.InputStream, java.lang.String)
      */
-    public JcrConfiguration save() {
-        return builder.save();
+    @Override
+    public JcrConfiguration loadFrom( InputStream configurationFileInputStream,
+                                      String path ) throws IOException, SAXException {
+        super.loadFrom(configurationFileInputStream, path);
+        return this;
     }
 
-    protected Graph graph() {
-        return builder.getGraph();
+    /**
+     * {@inheritDoc}
+     * 
+     * @see org.jboss.dna.repository.DnaConfiguration#loadFrom(org.jboss.dna.graph.connector.RepositorySource)
+     */
+    @Override
+    public JcrConfiguration loadFrom( RepositorySource source ) {
+        super.loadFrom(source);
+        return this;
     }
 
     /**
      * {@inheritDoc}
      * 
-     * @see org.jboss.dna.repository.Configurator.Builder#build()
+     * @see org.jboss.dna.repository.DnaConfiguration#loadFrom(org.jboss.dna.graph.connector.RepositorySource, java.lang.String)
      */
-    public JcrEngine build() throws DnaConfigurationException {
-        save();
-        return new JcrEngine(builder.buildDnaEngine());
+    @Override
+    public JcrConfiguration loadFrom( RepositorySource source,
+                                      String workspaceName ) {
+        super.loadFrom(source, workspaceName);
+        return this;
     }
 
     /**
-     * The interface used to set the RepositorySource that should be used.
+     * {@inheritDoc}
      * 
-     * @param <ReturnType> the interface returned from these methods
+     * @see org.jboss.dna.repository.DnaConfiguration#loadFrom(org.jboss.dna.graph.connector.RepositorySource, java.lang.String,
+     *      java.lang.String)
      */
-    public interface SourceSetter<ReturnType> {
-        /**
-         * Set the repository source that should be used.
-         * 
-         * @param sourceId that identifier of the repository source
-         * @return the next component to continue configuration; never null
-         */
-        ReturnType usingSource( String sourceId );
+    @Override
+    public JcrConfiguration loadFrom( RepositorySource source,
+                                      String workspaceName,
+                                      String pathInWorkspace ) {
+        super.loadFrom(source, workspaceName, pathInWorkspace);
+        return this;
     }
 
-    public interface JcrRepositoryDetails<ReturnType>
-        extends SetOptions<JcrRepositoryDetails<ReturnType>>, SetNamespace<JcrRepositoryDetails<ReturnType>>,
-        SetName<JcrRepositoryDetails<ReturnType>>,
-        /* SetDescription<JcrRepositoryDetails<ReturnType>>, */
-        And<ReturnType> {
+    /**
+     * {@inheritDoc}
+     * 
+     * @see org.jboss.dna.repository.DnaConfiguration#and()
+     */
+    @Override
+    public JcrConfiguration and() {
+        return this;
+    }
 
-        /**
-         * Specify that the CND in the supplied string should be loaded into the repository.
-         * 
-         * @param cndContents the string containing the compact node definitions
-         * @return this object for chained method invocation
-         * @throws IllegalArgumentException if the string is null or empty
-         * @throws DnaConfigurationException if there is an error reading the CND contents
-         */
-        JcrRepositoryDetails<ReturnType> withNodeTypes( String cndContents );
+    /**
+     * {@inheritDoc}
+     * 
+     * @see org.jboss.dna.repository.DnaConfiguration#withClassLoaderFactory(org.jboss.dna.common.component.ClassLoaderFactory)
+     */
+    @Override
+    public JcrConfiguration withClassLoaderFactory( ClassLoaderFactory classLoaderFactory ) {
+        super.withClassLoaderFactory(classLoaderFactory);
+        return this;
+    }
 
-        /**
-         * Specify that the CND file is to be loaded into the repository.
-         * 
-         * @param cndFile the CND file
-         * @return this object for chained method invocation
-         * @throws IllegalArgumentException if the file is null
-         * @throws DnaConfigurationException if there is an error reading the file
-         */
-        JcrRepositoryDetails<ReturnType> withNodeTypes( File cndFile );
+    /**
+     * {@inheritDoc}
+     * 
+     * @see org.jboss.dna.repository.DnaConfiguration#mimeTypeDetector(java.lang.String)
+     */
+    @Override
+    public MimeTypeDetectorDefinition<JcrConfiguration> mimeTypeDetector( String name ) {
+        return mimeTypeDetectorDefinition(this, name);
+    }
 
-        /**
-         * Specify that the CND file is to be loaded into the repository.
-         * 
-         * @param urlOfCndFile the URL of the CND file
-         * @return this object for chained method invocation
-         * @throws IllegalArgumentException if the URL is null
-         * @throws DnaConfigurationException if there is an error reading the content at the URL
-         */
-        JcrRepositoryDetails<ReturnType> withNodeTypes( URL urlOfCndFile );
+    /**
+     * {@inheritDoc}
+     * 
+     * @see org.jboss.dna.repository.DnaConfiguration#repositorySource(java.lang.String)
+     */
+    @Override
+    public RepositorySourceDefinition<JcrConfiguration> repositorySource( String name ) {
+        return repositorySourceDefinition(this, name);
+    }
 
-        /**
-         * Specify that the CND file is to be loaded into the repository.
-         * 
-         * @param cndContent the stream containing the CND content
-         * @return this object for chained method invocation
-         * @throws IllegalArgumentException if the URL is null
-         * @throws DnaConfigurationException if there is an error reading the stream at the URL
-         */
-        JcrRepositoryDetails<ReturnType> withNodeTypes( InputStream cndContent );
+    /**
+     * {@inheritDoc}
+     * 
+     * @see org.jboss.dna.repository.DnaConfiguration#sequencer(java.lang.String)
+     */
+    @Override
+    public SequencerDefinition<JcrConfiguration> sequencer( String name ) {
+        return sequencerDefinition(this, name);
+    }
 
+    /**
+     * Obtain or create a definition for the {@link javax.jcr.Repository JCR Repository} with the supplied name or identifier. A
+     * new definition will be created if there currently is no sequencer defined with the supplied name.
+     * 
+     * @param name the name or identifier of the sequencer
+     * @return the details of the sequencer definition; never null
+     */
+    public RepositoryDefinition<JcrConfiguration> repository( String name ) {
+        return repositoryDefinition(this, name);
     }
 
     /**
-     * Interface for configuring the {@link JcrRepository.Option JCR repository options} for a {@link JcrRepository JCR
-     * repository}.
+     * Get the list of sequencer definitions.
      * 
-     * @param <ReturnType> the interface returned after the option has been set.
+     * @return the unmodifiable set of definitions; never null but possibly empty if there are no definitions
      */
-    public interface SetOptions<ReturnType> {
-        /**
-         * Specify the repository option that is to be set. The value may be set using the interface returned by this method.
-         * 
-         * @param option the option to be set
-         * @return the interface used to set the value for the property; never null
-         */
-        OptionSetter<ReturnType> with( JcrRepository.Option option );
+    public Set<RepositoryDefinition<JcrConfiguration>> repositories() {
+        // Get the children under the 'dna:mimeTypeDetectors' node ...
+        Set<String> names = getNamesOfComponentsUnder(DnaLexicon.REPOSITORIES);
+        names.addAll(this.repositoryDefinitions.keySet());
+        Set<RepositoryDefinition<JcrConfiguration>> results = new HashSet<RepositoryDefinition<JcrConfiguration>>();
+        for (String name : names) {
+            results.add(repository(name));
+        }
+        return Collections.unmodifiableSet(results);
     }
 
     /**
-     * The interface used to set the value for a {@link JcrRepository.Option JCR repository option}.
+     * {@inheritDoc}
      * 
-     * @param <ReturnType> the interface returned from these methods
-     * @see JcrConfiguration.SetOptions#with(org.jboss.dna.jcr.JcrRepository.Option)
+     * @see org.jboss.dna.repository.DnaConfiguration#save()
      */
-    public interface OptionSetter<ReturnType> {
-        /**
-         * Set the property value to an integer.
-         * 
-         * @param value the new value for the property
-         * @return the next component to continue configuration; never null
-         */
-        ReturnType setTo( String value );
+    @Override
+    public JcrConfiguration save() {
+        super.save();
+        this.repositoryDefinitions.clear();
+        return this;
     }
 
     /**
-     * Interface for setting a namespace for a {@link JcrRepository JCR repository}.
+     * {@inheritDoc}
      * 
-     * @param <ReturnType> the interface returned after the option has been set.
+     * @see org.jboss.dna.repository.DnaConfiguration#build()
      */
-    public interface SetNamespace<ReturnType> {
-        /**
-         * Specify the repository option that is to be set. The value may be set using the interface returned by this method.
-         * 
-         * @param uri the uri for the namespace
-         * @return the interface used to set the value for the property; never null
-         */
-        NamespaceSetter<ReturnType> withNamespace( String uri );
+    @Override
+    public JcrEngine build() {
+        save();
+        return new JcrEngine(getExecutionContext(), getConfigurationDefinition());
     }
 
     /**
-     * The interface used to set the prefix for a namespace.
+     * Utility method to construct a definition object for the repository with the supplied name and return type.
      * 
-     * @param <ReturnType> the interface returned from these methods
-     * @see JcrConfiguration.SetNamespace#withNamespace(String)
+     * @param <ReturnType> the type of the return object
+     * @param returnObject the return object
+     * @param name the name of the repository
+     * @return the definition for the repository
      */
-    public interface NamespaceSetter<ReturnType> {
-        /**
-         * Set the prefix for the namespace
-         * 
-         * @param prefix the prefix for the namespace
-         * @return the next component to continue configuration; never null
-         */
-        ReturnType usingPrefix( String prefix );
+    @SuppressWarnings( "unchecked" )
+    protected <ReturnType extends JcrConfiguration> RepositoryDefinition<ReturnType> repositoryDefinition( ReturnType returnObject,
+                                                                                                           String name ) {
+        RepositoryDefinition<ReturnType> definition = (RepositoryDefinition<ReturnType>)repositoryDefinitions.get(name);
+        if (definition == null) {
+            definition = new RepositoryBuilder<ReturnType>(returnObject, changes(), path(), DnaLexicon.REPOSITORIES, name(name));
+            repositoryDefinitions.put(name, definition);
+        }
+        return definition;
     }
 
-    public static class Builder<ReturnType> extends DnaConfiguration.Builder<ReturnType> {
+    protected class RepositoryBuilder<ReturnType> extends GraphReturnable<ReturnType, RepositoryDefinition<ReturnType>>
+        implements RepositoryDefinition<ReturnType> {
+        private final EnumMap<JcrRepository.Option, String> optionValues = new EnumMap<Option, String>(Option.class);
 
-        private Path repositoriesPath;
+        protected RepositoryBuilder( ReturnType returnObject,
+                                     Graph.Batch batch,
+                                     Path path,
+                                     Name... names ) {
+            super(returnObject, batch, path, names);
+            // Load the current options ...
+            try {
+                Path optionsPath = context.getValueFactories().getPathFactory().create(path, DnaLexicon.OPTIONS);
+                Subgraph options = batch.getGraph().getSubgraphOfDepth(2).at(optionsPath);
+                for (Location optionChild : options.getRoot().getChildren()) {
+                    Node option = options.getNode(optionChild);
+                    Property property = option.getProperty(DnaLexicon.VALUE);
+                    if (property != null && property.isEmpty()) {
+                        try {
+                            Option key = Option.findOption(optionChild.getPath()
+                                                                      .getLastSegment()
+                                                                      .getString(context.getNamespaceRegistry()));
+                            String value = context.getValueFactories().getStringFactory().create(property.getFirstValue());
+                            optionValues.put(key, value);
+                        } catch (IllegalArgumentException e) {
+                            // the key is not valid, so skip it ...
+                        }
+                    }
+                }
+            } catch (PathNotFoundException e) {
+                // No current options
+            }
+        }
 
-        /**
-         * Specify a new {@link ExecutionContext} that should be used for this DNA instance.
-         * 
-         * @param context the new context, or null if a default-constructed execution context should be used
-         * @param builder the builder object returned from all the methods
-         * @throws IllegalArgumentException if the supplied context reference is null
-         */
-        public Builder( ExecutionContext context,
-                        ReturnType builder ) {
-            super(context, builder);
+        @Override
+        protected RepositoryDefinition<ReturnType> thisType() {
+            return this;
         }
 
-        protected Graph getGraph() {
-            return graph();
+        public RepositoryDefinition<ReturnType> setSource( String sourceName ) {
+            setProperty(DnaLexicon.SOURCE_NAME, sourceName);
+            return this;
         }
 
-        protected Path repositoriesPath() {
-            // Make sure the "dna:repositories" node is there
-            if (repositoriesPath == null) {
-                Path path = pathFactory().create(this.configurationSource.getPath(), DnaLexicon.REPOSITORIES);
-                Node node = graph().createIfMissing(path).andReturn();
-                this.repositoriesPath = node.getLocation().getPath();
+        public String getSource() {
+            Property property = getProperty(DnaLexicon.SOURCE_NAME);
+            if (property != null && !property.isEmpty()) {
+                return context.getValueFactories().getStringFactory().create(property.getFirstValue());
             }
-            return this.repositoriesPath;
+            return null;
         }
 
-        public JcrRepositoryDetails<ReturnType> addRepository( String id,
-                                                               String sourceId ) {
-            CheckArg.isNotEmpty(id, "id");
-            // Now create the "dna:repositories/id" node ...
-            Path path = createOrReplaceNode(repositoriesPath(), id);
-            configuration().set(DnaLexicon.SOURCE_NAME).to(sourceId).on(path);
-            return new JcrGraphRepositoryDetails<ReturnType>(path, builder);
+        public RepositoryDefinition<ReturnType> setOption( JcrRepository.Option option,
+                                                           String value ) {
+            CheckArg.isNotNull(option, "option");
+            CheckArg.isNotNull(value, "value");
+            createIfMissing(DnaLexicon.OPTIONS, option.name()).with(DnaLexicon.VALUE, value.trim()).and();
+            optionValues.put(option, value);
+            return this;
         }
 
-        public class JcrGraphRepositoryDetails<RT> implements JcrRepositoryDetails<RT> {
-            private final Path path;
-            private final RT returnObject;
+        public String getOption( Option option ) {
+            CheckArg.isNotNull(option, "option");
+            return optionValues.get(option);
+        }
 
-            protected JcrGraphRepositoryDetails( Path path,
-                                                 RT returnObject ) {
-                this.path = path;
-                this.returnObject = returnObject;
-            }
+        public RepositoryDefinition<ReturnType> registerNamespace( String prefix,
+                                                                   String uri ) {
+            CheckArg.isNotEmpty(prefix, "prefix");
+            CheckArg.isNotEmpty(uri, "uri");
+            prefix = prefix.trim();
+            uri = uri.trim();
+            createIfMissing(DnaLexicon.NAMESPACES, prefix).with(DnaLexicon.URI, uri).and();
+            return this;
+        }
 
-            /**
-             * {@inheritDoc}
-             * 
-             * @see org.jboss.dna.repository.Configurator.SetName#named(java.lang.String)
-             */
-            @SuppressWarnings( "synthetic-access" )
-            public JcrRepositoryDetails<RT> named( String name ) {
-                configuration().set(DnaLexicon.READABLE_NAME).to(name).on(name);
-                return this;
-            }
+        public RepositoryDefinition<ReturnType> addNodeTypes( String cndContents ) {
+            CheckArg.isNotEmpty(cndContents, "cndContents");
+            CndImporter importer = createCndImporter();
+            try {
+                Set<Namespace> namespacesBefore = batch.getGraph().getContext().getNamespaceRegistry().getNamespaces();
+                importer.importFrom(cndContents, getProblems(), "stream");
 
-            /**
-             * {@inheritDoc}
-             * 
-             * @see org.jboss.dna.jcr.JcrConfiguration.SetNamespace#withNamespace(java.lang.String)
-             */
-            @SuppressWarnings( "synthetic-access" )
-            public NamespaceSetter<JcrRepositoryDetails<RT>> withNamespace( final String uri ) {
-                final Path namespacesPath = createOrReplaceNode(path, DnaLexicon.NAMESPACES);
-                final JcrRepositoryDetails<RT> details = this;
-                return new NamespaceSetter<JcrRepositoryDetails<RT>>() {
-                    /**
-                     * {@inheritDoc}
-                     * 
-                     * @see org.jboss.dna.jcr.JcrConfiguration.NamespaceSetter#usingPrefix(java.lang.String)
-                     */
-                    public JcrRepositoryDetails<RT> usingPrefix( String prefix ) {
-                        Path nsPath = createOrReplaceNode(namespacesPath, prefix);
-                        configuration().set(DnaLexicon.URI).to(uri).on(nsPath);
-                        return details;
-                    }
-                };
+                // Record any new namespaces added by this import ...
+                registerNewNamespaces(namespacesBefore);
+            } catch (IOException e) {
+                throw new DnaConfigurationException(e);
             }
+            return this;
+        }
 
-            @SuppressWarnings( "synthetic-access" )
-            public OptionSetter<JcrRepositoryDetails<RT>> with( final JcrRepository.Option option ) {
-                final Path optionsPath = createOrReplaceNode(path, DnaLexicon.OPTIONS);
-                final JcrRepositoryDetails<RT> details = this;
-                return new OptionSetter<JcrRepositoryDetails<RT>>() {
-                    public JcrRepositoryDetails<RT> setTo( String value ) {
-                        Path optionPath = createOrReplaceNode(optionsPath, option.name());
-                        configuration().set(DnaLexicon.VALUE).to(value).on(optionPath);
-                        return details;
-                    }
-                };
-            }
-
-            /**
-             * {@inheritDoc}
-             * 
-             * @see org.jboss.dna.jcr.JcrConfiguration.JcrRepositoryDetails#withNodeTypes(java.lang.String)
-             */
-            public JcrRepositoryDetails<RT> withNodeTypes( String content ) {
-                CheckArg.isNotEmpty(content, "content");
+        public RepositoryDefinition<ReturnType> addNodeTypes( File file ) {
+            CheckArg.isNotNull(file, "file");
+            if (file.exists() && file.canRead()) {
                 CndImporter importer = createCndImporter();
                 try {
-                    importer.importFrom(content, getProblems(), "stream");
-                } catch (IOException e) {
-                    throw new DnaConfigurationException(e);
-                }
-                return this;
-            }
+                    Set<Namespace> namespacesBefore = batch.getGraph().getContext().getNamespaceRegistry().getNamespaces();
+                    importer.importFrom(file, getProblems());
 
-            /**
-             * {@inheritDoc}
-             * 
-             * @see org.jboss.dna.jcr.JcrConfiguration.JcrRepositoryDetails#withNodeTypes(java.net.URL)
-             */
-            public JcrRepositoryDetails<RT> withNodeTypes( URL url ) {
-                CheckArg.isNotNull(url, "url");
-                // Obtain the stream ...
-                InputStream stream = null;
-                boolean foundError = false;
-                try {
-                    stream = url.openStream();
-                    CndImporter importer = createCndImporter();
-                    importer.importFrom(stream, getProblems(), url.toString());
+                    // Record any new namespaces added by this import ...
+                    registerNewNamespaces(namespacesBefore);
                 } catch (IOException e) {
-                    foundError = true;
                     throw new DnaConfigurationException(e);
-                } finally {
-                    if (stream != null) {
-                        try {
-                            stream.close();
-                        } catch (IOException e) {
-                            if (!foundError) {
-                                throw new DnaConfigurationException(e);
-                            }
-                        }
-                    }
                 }
                 return this;
             }
+            throw new DnaConfigurationException(JcrI18n.fileDoesNotExist.text(file.getPath()));
+        }
 
-            /**
-             * {@inheritDoc}
-             * 
-             * @see org.jboss.dna.jcr.JcrConfiguration.JcrRepositoryDetails#withNodeTypes(java.io.File)
-             */
-            public JcrRepositoryDetails<RT> withNodeTypes( File file ) {
-                CheckArg.isNotNull(file, "file");
-                if (file.exists() && file.canRead()) {
-                    CndImporter importer = createCndImporter();
+        public RepositoryDefinition<ReturnType> addNodeTypes( URL url ) {
+            CheckArg.isNotNull(url, "url");
+            // Obtain the stream ...
+            InputStream stream = null;
+            boolean foundError = false;
+            try {
+                Set<Namespace> namespacesBefore = batch.getGraph().getContext().getNamespaceRegistry().getNamespaces();
+                stream = url.openStream();
+                CndImporter importer = createCndImporter();
+                importer.importFrom(stream, getProblems(), url.toString());
+
+                // Record any new namespaces added by this import ...
+                registerNewNamespaces(namespacesBefore);
+            } catch (IOException e) {
+                foundError = true;
+                throw new DnaConfigurationException(e);
+            } finally {
+                if (stream != null) {
                     try {
-                        importer.importFrom(file, getProblems());
+                        stream.close();
                     } catch (IOException e) {
-                        throw new DnaConfigurationException(e);
+                        if (!foundError) {
+                            throw new DnaConfigurationException(e);
+                        }
                     }
-                    return this;
                 }
-                throw new DnaConfigurationException(JcrI18n.fileDoesNotExist.text(file.getPath()));
             }
+            return this;
+        }
 
-            /**
-             * {@inheritDoc}
-             * 
-             * @see org.jboss.dna.jcr.JcrConfiguration.JcrRepositoryDetails#withNodeTypes(java.io.InputStream)
-             */
-            public JcrRepositoryDetails<RT> withNodeTypes( InputStream stream ) {
-                CndImporter importer = createCndImporter();
-                try {
-                    importer.importFrom(stream, getProblems(), "stream");
-                } catch (IOException e) {
-                    throw new DnaConfigurationException(e);
-                }
-                return this;
+        public RepositoryDefinition<ReturnType> addNodeTypes( InputStream cndContent ) {
+            CndImporter importer = createCndImporter();
+            try {
+                Set<Namespace> namespacesBefore = batch.getGraph().getContext().getNamespaceRegistry().getNamespaces();
+                importer.importFrom(cndContent, getProblems(), "stream");
+
+                // Record any new namespaces added by this import ...
+                registerNewNamespaces(namespacesBefore);
+            } catch (IOException e) {
+                throw new DnaConfigurationException(e);
             }
+            return this;
+        }
 
-            @SuppressWarnings( "synthetic-access" )
-            protected CndImporter createCndImporter() {
-                // The node types will be loaded into 'dna:repositories/{repositoryName}/dna:nodeTypes/' ...
-                Path nodeTypesPath = createOrReplaceNode(path, DnaLexicon.NODE_TYPES);
+        protected void registerNewNamespaces( Set<Namespace> namespacesBefore ) {
+            Set<Namespace> namespacesAfter = batch.getGraph().getContext().getNamespaceRegistry().getNamespaces();
+            Set<Namespace> newNamespaces = new HashSet<Namespace>(namespacesAfter);
+            newNamespaces.removeAll(namespacesBefore);
+            for (Namespace namespace : newNamespaces) {
+                registerNamespace(namespace.getPrefix(), namespace.getNamespaceUri());
+            }
+        }
 
-                // Now set up the destination ...
-                Destination destination = new GraphBatchDestination(graph().batch()); // will be executed
+        protected CndImporter createCndImporter() {
+            // The node types will be loaded into 'dna:repositories/{repositoryName}/dna:nodeTypes/' ...
+            Path nodeTypesPath = subpath(DnaLexicon.NODE_TYPES);
+            createIfMissing(DnaLexicon.NODE_TYPES).and();
 
-                // And create the importer that will load the CND content into the repository ...
-                return new CndImporter(destination, nodeTypesPath);
-            }
+            // Now set up the destination ...
+            Destination destination = new GraphBatchDestination(batch, true); // will NOT be executed
 
-            /**
-             * {@inheritDoc}
-             * 
-             * @see org.jboss.dna.repository.Configurator.And#and()
-             */
-            public RT and() {
-                return returnObject;
-            }
+            // And create the importer that will load the CND content into the repository ...
+            return new CndImporter(destination, nodeTypesPath);
         }
+    }
 
-    }
 }

Modified: trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/JcrEngine.java
===================================================================
--- trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/JcrEngine.java	2009-06-03 20:09:11 UTC (rev 968)
+++ trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/JcrEngine.java	2009-06-03 20:10:19 UTC (rev 969)
@@ -23,17 +23,12 @@
  */
 package org.jboss.dna.jcr;
 
-import java.util.ArrayList;
-import java.util.Collection;
 import java.util.HashMap;
-import java.util.List;
 import java.util.Map;
-import java.util.concurrent.TimeUnit;
 import java.util.concurrent.locks.Lock;
 import java.util.concurrent.locks.ReentrantLock;
 import javax.jcr.Repository;
 import javax.jcr.RepositoryException;
-import org.jboss.dna.common.collection.Problems;
 import org.jboss.dna.common.util.CheckArg;
 import org.jboss.dna.graph.ExecutionContext;
 import org.jboss.dna.graph.Graph;
@@ -42,100 +37,43 @@
 import org.jboss.dna.graph.Subgraph;
 import org.jboss.dna.graph.connector.RepositoryConnectionFactory;
 import org.jboss.dna.graph.connector.RepositorySource;
+import org.jboss.dna.graph.property.Name;
 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.basic.GraphNamespaceRegistry;
 import org.jboss.dna.jcr.JcrRepository.Option;
+import org.jboss.dna.repository.DnaConfiguration;
 import org.jboss.dna.repository.DnaEngine;
-import org.jboss.dna.repository.RepositoryLibrary;
-import org.jboss.dna.repository.RepositoryService;
-import org.jboss.dna.repository.sequencer.SequencingService;
 
 /**
  * The basic component that encapsulates the JBoss DNA services, including the {@link Repository} instances.
  */
-public class JcrEngine {
+public class JcrEngine extends DnaEngine {
 
-    private final DnaEngine dnaEngine;
     private final Map<String, JcrRepository> repositories;
     private final Lock repositoriesLock;
 
-    JcrEngine( DnaEngine dnaEngine ) {
-        this.dnaEngine = dnaEngine;
+    JcrEngine( ExecutionContext context,
+               DnaConfiguration.ConfigurationDefinition configuration ) {
+        super(context, configuration);
         this.repositories = new HashMap<String, JcrRepository>();
         this.repositoriesLock = new ReentrantLock();
     }
 
     /**
-     * Get the problems that were encountered when setting up this engine from the configuration.
-     * 
-     * @return the problems, which may be empty but will never be null
-     */
-    public Problems getProblems() {
-        return dnaEngine.getProblems();
-    }
-
-    /**
-     * Get the execution context for this engine. This context can be used to create additional (perhaps narrowed) contexts.
-     * 
-     * @return the engine's execution context; never null
-     */
-    public final ExecutionContext getExecutionContext() {
-        return dnaEngine.getExecutionContext();
-    }
-
-    /**
-     * Get the RepositorySource with the supplied name.
-     * 
-     * @param repositoryName the name of the repository (or repository source)
-     * @return the named repository source, or null if there is no such repository
-     */
-    protected final RepositorySource getRepositorySource( String repositoryName ) {
-        return dnaEngine.getRepositorySource(repositoryName);
-    }
-
-    protected final RepositoryConnectionFactory getRepositoryConnectionFactory() {
-        return dnaEngine.getRepositoryConnectionFactory();
-    }
-
-    protected final RepositoryService getRepositoryService() {
-        return dnaEngine.getRepositoryService();
-    }
-
-    protected final SequencingService getSequencingService() {
-        return dnaEngine.getSequencingService();
-    }
-
-    /**
-     * Returns a list of the names of all available JCR repositories.
-     * <p>
-     * In a {@code JcrEngine}, the available repositories are {@link RepositoryLibrary#getSourceNames() all repositories} except
-     * for the {@link RepositoryService#getConfigurationSourceName() the configuration repository}.
-     * </p>
-     * 
-     * @return a list of all repository names.
-     */
-    public final Collection<String> getJcrRepositoryNames() {
-        List<String> jcrRepositories = new ArrayList<String>();
-        jcrRepositories.addAll(getRepositoryService().getRepositoryLibrary().getSourceNames());
-        
-        jcrRepositories.remove(getRepositoryService().getConfigurationSourceName());
-        
-        return jcrRepositories;
-    }
-
-    /**
      * Get the {@link Repository} implementation for the named repository.
      * 
      * @param repositoryName the name of the repository, which corresponds to the name of a configured {@link RepositorySource}
      * @return the named repository instance
      * @throws IllegalArgumentException if the repository name is null, blank or invalid
      * @throws RepositoryException if there is no repository with the specified name
+     * @throws IllegalStateException if this engine was not {@link #start() started}
      */
     public final JcrRepository getRepository( String repositoryName ) throws RepositoryException {
         CheckArg.isNotEmpty(repositoryName, "repositoryName");
+        checkRunning();
         try {
             repositoriesLock.lock();
             JcrRepository repository = repositories.get(repositoryName);
@@ -155,17 +93,16 @@
         }
     }
 
-    protected JcrRepository doCreateJcrRepository( String repositoryName ) {
+    protected JcrRepository doCreateJcrRepository( String repositoryName ) throws RepositoryException, PathNotFoundException {
         RepositoryConnectionFactory connectionFactory = getRepositoryConnectionFactory();
         Map<String, String> descriptors = null;
         Map<Option, String> options = new HashMap<Option, String>();
 
         // Read the subgraph that represents the repository ...
         PathFactory pathFactory = getExecutionContext().getValueFactories().getPathFactory();
-        Path repositoriesPath = pathFactory.create(DnaLexicon.REPOSITORIES);
+        Path repositoriesPath = pathFactory.create(configuration.getPath(), DnaLexicon.REPOSITORIES);
         Path repositoryPath = pathFactory.create(repositoriesPath, repositoryName);
-        String configurationName = dnaEngine.getRepositoryService().getConfigurationSourceName();
-        Graph configuration = Graph.create(connectionFactory.createConnection(configurationName), getExecutionContext());
+        Graph configuration = getConfigurationGraph();
         Subgraph subgraph = configuration.getSubgraphOfDepth(3).at(repositoryPath);
 
         // Read the options ...
@@ -191,8 +128,18 @@
             context = context.with(registry);
         }
 
+        // Get the name of the source ...
+        Property property = subgraph.getRoot().getProperty(DnaLexicon.SOURCE_NAME);
+        if (property == null || property.isEmpty()) {
+            String readableName = readable(DnaLexicon.SOURCE_NAME);
+            String readablePath = readable(subgraph.getLocation());
+            String msg = JcrI18n.propertyNotFoundOnNode.text(readableName, readablePath, configuration.getCurrentWorkspaceName());
+            throw new RepositoryException(msg);
+        }
+        String sourceName = context.getValueFactories().getStringFactory().create(property.getFirstValue());
+
         // Create the repository ...
-        JcrRepository repository = new JcrRepository(context, connectionFactory, repositoryName, descriptors, options);
+        JcrRepository repository = new JcrRepository(context, connectionFactory, sourceName, descriptors, options);
 
         // Register all the the node types ...
         Node nodeTypesNode = subgraph.getNode(DnaLexicon.NODE_TYPES);
@@ -208,44 +155,15 @@
         return repository;
     }
 
-    /*
-     * Lifecycle methods
-     */
-
-    /**
-     * Start this engine to make it available for use.
-     * 
-     * @throws IllegalStateException if this method is called when already shut down.
-     * @see #shutdown()
-     */
-    public void start() {
-        dnaEngine.start();
+    protected final String readable( Name name ) {
+        return name.getString(context.getNamespaceRegistry());
     }
 
-    /**
-     * Shutdown this engine to close all connections, terminate any ongoing background operations (such as sequencing), and
-     * reclaim any resources that were acquired by this engine. This method may be called multiple times, but only the first time
-     * has an effect.
-     * 
-     * @see #start()
-     */
-    public void shutdown() {
-        dnaEngine.shutdown();
+    protected final String readable( Path path ) {
+        return path.getString(context.getNamespaceRegistry());
     }
 
-    /**
-     * Blocks until the shutdown has completed, or the timeout occurs, or the current thread is interrupted, whichever happens
-     * first.
-     * 
-     * @param timeout the maximum time to wait for each component in this engine
-     * @param unit the time unit of the timeout argument
-     * @return <tt>true</tt> if this service complete shut down and <tt>false</tt> if the timeout elapsed before it was shut down
-     *         completely
-     * @throws InterruptedException if interrupted while waiting
-     */
-    public boolean awaitTermination( long timeout,
-                                     TimeUnit unit ) throws InterruptedException {
-        return dnaEngine.awaitTermination(timeout, unit);
+    protected final String readable( Location location ) {
+        return location.getString(context.getNamespaceRegistry());
     }
-
 }

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	2009-06-03 20:09:11 UTC (rev 968)
+++ trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/JcrRepository.java	2009-06-03 20:10:19 UTC (rev 969)
@@ -104,18 +104,21 @@
          */
         public static Option findOption( String option ) {
             if (option == null) return null;
-            Option result = Option.valueOf(option);
-            if (result != null) return result;
-            // Try an uppercased version ...
-            result = Option.valueOf(option.toUpperCase());
-            if (result != null) return result;
-            // Try a camel-case version ...
-            String underscored = Inflector.getInstance().underscore(option, '_');
-            if (underscored != null) {
-                result = Option.valueOf(underscored);
+            try {
+                return Option.valueOf(option);
+            } catch (IllegalArgumentException e) {
+                // Try an uppercased version ...
+                try {
+                    return Option.valueOf(option.toUpperCase());
+                } catch (IllegalArgumentException e2) {
+                    // Try a camel-case version ...
+                    String underscored = Inflector.getInstance().underscore(option, '_');
+                    if (underscored == null) {
+                        throw e2;
+                    }
+                    return Option.valueOf(underscored.toUpperCase());
+                }
             }
-
-            return result;
         }
     }
 

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	2009-06-03 20:09:11 UTC (rev 968)
+++ trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/RepositoryNodeTypeManager.java	2009-06-03 20:10:19 UTC (rev 969)
@@ -413,29 +413,31 @@
         }
 
         if (checkMultiValuedDefinitions) {
-            // Look for a multi-value property definition on the primary type that matches by name and type ...
-            for (JcrPropertyDefinition definition : primaryType.allMultiValuePropertyDefinitions(propertyName)) {
-                matchedOnName = true;
-                // See if the definition allows the value ...
-                if (skipProtected && definition.isProtected()) return null;
-                if (setToEmpty) {
-                    if (!definition.isMandatory()) return definition;
-                    // Otherwise this definition doesn't work, so continue with the next ...
-                    continue;
-                }
-                assert value != null;
-                // We can use the definition if it matches the type and satisfies the constraints ...
-                int type = definition.getRequiredType();
-                if ((type == PropertyType.UNDEFINED || type == value.getType()) && definition.satisfiesConstraints(value)) return definition;
-            }
-            if (value != null) {
+            if (primaryType != null) {
+                // Look for a multi-value property definition on the primary type that matches by name and type ...
                 for (JcrPropertyDefinition definition : primaryType.allMultiValuePropertyDefinitions(propertyName)) {
                     matchedOnName = true;
                     // See if the definition allows the value ...
                     if (skipProtected && definition.isProtected()) return null;
-                    assert definition.getRequiredType() != PropertyType.UNDEFINED;
-                    if (definition.canCastToTypeAndSatisfyConstraints(value)) return definition;
+                    if (setToEmpty) {
+                        if (!definition.isMandatory()) return definition;
+                        // Otherwise this definition doesn't work, so continue with the next ...
+                        continue;
+                    }
+                    assert value != null;
+                    // We can use the definition if it matches the type and satisfies the constraints ...
+                    int type = definition.getRequiredType();
+                    if ((type == PropertyType.UNDEFINED || type == value.getType()) && definition.satisfiesConstraints(value)) return definition;
                 }
+                if (value != null) {
+                    for (JcrPropertyDefinition definition : primaryType.allMultiValuePropertyDefinitions(propertyName)) {
+                        matchedOnName = true;
+                        // See if the definition allows the value ...
+                        if (skipProtected && definition.isProtected()) return null;
+                        assert definition.getRequiredType() != PropertyType.UNDEFINED;
+                        if (definition.canCastToTypeAndSatisfyConstraints(value)) return definition;
+                    }
+                }
             }
 
             if (matchedOnName) return null;

Modified: trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/SessionCache.java
===================================================================
--- trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/SessionCache.java	2009-06-03 20:09:11 UTC (rev 968)
+++ trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/SessionCache.java	2009-06-03 20:10:19 UTC (rev 969)
@@ -576,16 +576,16 @@
     }
 
     /**
-     * The JCR specification assumes that reading a node into the session does not imply reading the
-     * relationship between the node and its children into the session.  As a performance optimization,
-     * DNA eagerly loads the list of child names and UUIDs (but not the child nodes themselves).  This creates
-     * an issue when direct writes are performed through the workspace.  The act of modifying a node is assumed
-     * to imply loading its children, but we must load the node in order to modify it.
+     * The JCR specification assumes that reading a node into the session does not imply reading the relationship between the node
+     * and its children into the session. As a performance optimization, DNA eagerly loads the list of child names and UUIDs (but
+     * not the child nodes themselves). This creates an issue when direct writes are performed through the workspace. The act of
+     * modifying a node is assumed to imply loading its children, but we must load the node in order to modify it.
      * <p>
-     * This method provides a way to signal that a child should be added to one parent and, optionally, removed
-     * from another.  The cache of loaded nodes and the cache of changed nodes are modified accordingly, but no
-     * additional graph requests are batched. 
+     * This method provides a way to signal that a child should be added to one parent and, optionally, removed from another. The
+     * cache of loaded nodes and the cache of changed nodes are modified accordingly, but no additional graph requests are
+     * batched.
      * </p>
+     * 
      * @param newParentUuid the UUID of the node to which the child is to be moved; may not be null
      * @param oldParentUuid the UUID of the parent node from which the child was moved; may not be null
      * @param child the UUID of the child node that was moved or copied; may not be null
@@ -593,13 +593,13 @@
      * @throws RepositoryException if an error occurs
      */
     public void compensateForWorkspaceChildChange( UUID newParentUuid,
-                        UUID oldParentUuid,
-                        UUID child,
-                        Name childName ) throws RepositoryException {
+                                                   UUID oldParentUuid,
+                                                   UUID child,
+                                                   Name childName ) throws RepositoryException {
         assert newParentUuid != null;
         assert child != null;
         assert childName != null;
-        
+
         ChangedNodeInfo changedNode = this.changedNodes.get(newParentUuid);
         if (changedNode != null) {
             // This adds the child to the changed node, but doesn't generate a corresponding pending request
@@ -1343,12 +1343,13 @@
             }
         }
 
-        public void orderChildBefore(Path.Segment childToBeMoved, Path.Segment before) throws RepositoryException {
+        public void orderChildBefore( Path.Segment childToBeMoved,
+                                      Path.Segment before ) {
             PathFactory pathFactory = SessionCache.this.pathFactory;
             Path thisPath = this.currentLocation.getPath();
             UUID fromUuid = this.node.getChildren().getChild(childToBeMoved).getUuid();
             Location fromLocation = Location.create(pathFactory.create(thisPath, childToBeMoved), fromUuid);
-            
+
             Children children = this.node.getChildren();
             ChildNode nodeToBeMoved = children.getChild(childToBeMoved);
             this.node.removeChild(nodeToBeMoved.getUuid(), pathFactory);
@@ -1358,17 +1359,16 @@
                 // Moving the node into its parent will remove it from its current spot in the child list and re-add it to the end
                 operations.move(fromLocation).into(this.currentLocation);
 
-            }
-            else {
+            } else {
                 Path beforePath = pathFactory.create(thisPath, before);
                 UUID beforeUuid = this.node.getChildren().getChild(before).getUuid();
                 Location beforeLocation = Location.create(beforePath, beforeUuid);
-                
+
                 this.node.addChild(nodeToBeMoved.getName(), before, nodeToBeMoved.getUuid(), pathFactory);
                 operations.move(fromLocation).before(beforeLocation);
             }
         }
-        
+
         /**
          * Move the child specified by the supplied UUID to be a child of this node, appending the child to the end of the current
          * list of children. This method automatically disconnects the node from its current parent.
@@ -1407,8 +1407,8 @@
             if (!definition.getId().equals(node.getDefinitionId())) {
                 // The node definition changed, so try to set the property ...
                 try {
-                    JcrValue value = new JcrValue(factories(), SessionCache.this, PropertyType.STRING,
-                                                  definition.getId().getString());
+                    JcrValue value = new JcrValue(factories(), SessionCache.this, PropertyType.STRING, definition.getId()
+                                                                                                                 .getString());
                     setProperty(DnaIntLexicon.NODE_DEFINITON, value);
                 } catch (ConstraintViolationException e) {
                     // We can't set this property on the node (according to the node definition).
@@ -1641,7 +1641,10 @@
             // ---------------------------------------
             // Now record the changes to the store ...
             // ---------------------------------------
-            Graph.Create<Graph.Batch> create = operations.createUnder(currentLocation).nodeNamed(name).with(desiredUuid).with(primaryTypeProp);
+            Graph.Create<Graph.Batch> create = operations.createUnder(currentLocation)
+                                                         .nodeNamed(name)
+                                                         .with(desiredUuid)
+                                                         .with(primaryTypeProp);
             if (nodeDefnDefn != null) {
                 create = create.with(nodeDefinitionProp);
             }
@@ -2396,8 +2399,8 @@
                                                                                    DnaIntLexicon.MULTI_VALUED_PROPERTIES,
                                                                                    values,
                                                                                    false);
-        Property dnaProp = propertyFactory.create(DnaIntLexicon.MULTI_VALUED_PROPERTIES,
-                                                  newSingleMultiPropertyNames.iterator().next());
+        Property dnaProp = propertyFactory.create(DnaIntLexicon.MULTI_VALUED_PROPERTIES, newSingleMultiPropertyNames.iterator()
+                                                                                                                    .next());
         PropertyId propId = new PropertyId(uuid, dnaProp.getName());
         JcrPropertyDefinition defn = (JcrPropertyDefinition)propertyDefinition;
         return new PropertyInfo(propId, defn.getId(), PropertyType.STRING, dnaProp, defn.isMultiple(), true, false);

Modified: trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/cache/ImmutableNodeInfo.java
===================================================================
--- trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/cache/ImmutableNodeInfo.java	2009-06-03 20:09:11 UTC (rev 968)
+++ trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/cache/ImmutableNodeInfo.java	2009-06-03 20:10:19 UTC (rev 969)
@@ -181,8 +181,8 @@
     }
 
     /**
+     * {@inheritDoc}
      * 
-     * {@inheritDoc}
      * @return {@code false} always as this object represents unmodified nodes only
      * @see org.jboss.dna.jcr.cache.NodeInfo#isNew()
      */
@@ -191,8 +191,8 @@
     }
 
     /**
+     * {@inheritDoc}
      * 
-     * {@inheritDoc}
      * @return {@code false} always as this object represents unmodified nodes only
      * @see org.jboss.dna.jcr.cache.NodeInfo#isModified()
      */
@@ -200,7 +200,8 @@
         return false;
     }
 
+    @Override
     public String toString() {
-        return this.uuid + " (" + primaryTypeName + ") {" + properties + "}"; 
+        return this.uuid + " (" + primaryTypeName + ") {" + properties + "}";
     }
 }

Modified: trunk/dna-jcr/src/test/java/org/jboss/dna/jcr/AbstractJcrNodeTest.java
===================================================================
--- trunk/dna-jcr/src/test/java/org/jboss/dna/jcr/AbstractJcrNodeTest.java	2009-06-03 20:09:11 UTC (rev 968)
+++ trunk/dna-jcr/src/test/java/org/jboss/dna/jcr/AbstractJcrNodeTest.java	2009-06-03 20:10:19 UTC (rev 969)
@@ -32,7 +32,6 @@
 import javax.jcr.Item;
 import javax.jcr.ItemNotFoundException;
 import javax.jcr.ItemVisitor;
-import javax.jcr.NoSuchWorkspaceException;
 import javax.jcr.Node;
 import javax.jcr.NodeIterator;
 import javax.jcr.PathNotFoundException;

Modified: trunk/dna-jcr/src/test/java/org/jboss/dna/jcr/InMemoryRepositoryStub.java
===================================================================
--- trunk/dna-jcr/src/test/java/org/jboss/dna/jcr/InMemoryRepositoryStub.java	2009-06-03 20:09:11 UTC (rev 968)
+++ trunk/dna-jcr/src/test/java/org/jboss/dna/jcr/InMemoryRepositoryStub.java	2009-06-03 20:10:19 UTC (rev 969)
@@ -59,28 +59,20 @@
         super(env);
 
         // Create the in-memory (DNA) repository
-        JcrEngine engine = new JcrConfiguration().withConfigurationSource()
-                                                 .usingClass(InMemoryRepositorySource.class.getName())
-                                                 .loadedFromClasspath()
-                                                 .describedAs("configuration repository")
-                                                 .usingWorkspace("configuration workspace")
-                                                 .with("name")
-                                                 .setTo("configuration repository")
-                                                 .with("defaultWorkspaceName")
-                                                 .setTo("configuration workspace")
-                                                 .and()
-                                                 .addSource("Store")
-                                                 .usingClass(InMemoryRepositorySource.class.getName())
-                                                 .loadedFromClasspath()
-                                                 .describedAs("JCR Repository persistent store")
-                                                 .and()
-                                                 .addRepository(REPOSITORY_SOURCE_NAME)
-                                                 .usingSource("Store")
-                                                 .withNodeTypes(getClass().getClassLoader().getResource("tck_test_types.cnd"))
-                                                 .with(Option.PROJECT_NODE_TYPES)
-                                                 .setTo(Boolean.FALSE.toString())
-                                                 .and()
-                                                 .build();
+        JcrConfiguration configuration = new JcrConfiguration();
+        // Define the single in-memory repository source ...
+        configuration.repositorySource("Store")
+                     .usingClass(InMemoryRepositorySource.class.getName())
+                     .loadedFromClasspath()
+                     .setDescription("JCR Repository persistent store");
+        // Define the JCR repository for the source ...
+        configuration.repository(REPOSITORY_SOURCE_NAME)
+                     .setSource("Store")
+                     .setOption(Option.PROJECT_NODE_TYPES, "false")
+                     .addNodeTypes(getClass().getClassLoader().getResource("tck_test_types.cnd"));
+        // Save and build the engine ...
+        configuration.save();
+        JcrEngine engine = configuration.build();
         engine.start();
 
         // Print all of the problems from the engine configuration ...

Modified: trunk/dna-jcr/src/test/java/org/jboss/dna/jcr/JcrConfigurationTest.java
===================================================================
--- trunk/dna-jcr/src/test/java/org/jboss/dna/jcr/JcrConfigurationTest.java	2009-06-03 20:09:11 UTC (rev 968)
+++ trunk/dna-jcr/src/test/java/org/jboss/dna/jcr/JcrConfigurationTest.java	2009-06-03 20:10:19 UTC (rev 969)
@@ -24,43 +24,71 @@
 import static org.hamcrest.core.Is.is;
 import static org.hamcrest.core.IsInstanceOf.instanceOf;
 import static org.hamcrest.core.IsNull.notNullValue;
+import static org.hamcrest.core.IsSame.sameInstance;
 import static org.jboss.dna.graph.IsNodeWithChildren.hasChild;
+import static org.jboss.dna.graph.IsNodeWithChildren.hasChildren;
 import static org.jboss.dna.graph.IsNodeWithProperty.hasProperty;
 import static org.junit.Assert.assertThat;
+import java.io.File;
+import java.net.URL;
 import java.util.HashMap;
 import java.util.Map;
 import java.util.UUID;
 import java.util.concurrent.TimeUnit;
+import javax.jcr.Repository;
+import javax.jcr.Session;
+import javax.jcr.SimpleCredentials;
+import javax.jcr.nodetype.NodeTypeManager;
 import org.jboss.dna.graph.ExecutionContext;
 import org.jboss.dna.graph.Graph;
 import org.jboss.dna.graph.Subgraph;
 import org.jboss.dna.graph.cache.CachePolicy;
 import org.jboss.dna.graph.cache.ImmutableCachePolicy;
-import org.jboss.dna.graph.connector.RepositoryConnection;
 import org.jboss.dna.graph.connector.RepositorySource;
 import org.jboss.dna.graph.connector.inmemory.InMemoryRepositorySource;
 import org.jboss.dna.graph.mimetype.ExtensionBasedMimeTypeDetector;
 import org.jboss.dna.graph.property.Path;
 import org.jboss.dna.jcr.JcrRepository.Option;
 import org.jboss.dna.repository.DnaConfiguration;
-import org.jboss.dna.repository.DnaEngine;
-import org.jboss.dna.repository.RepositoryLibrary;
+import org.jboss.dna.repository.DnaLexicon;
+import org.jboss.dna.repository.DnaConfiguration.ConfigurationDefinition;
+import org.jboss.security.config.IDTrustConfiguration;
+import org.junit.After;
 import org.junit.Before;
 import org.junit.Test;
 
 public class JcrConfigurationTest {
 
-    private ExecutionContext context;
     private JcrConfiguration configuration;
+    private JcrEngine engine;
 
     @Before
     public void beforeEach() {
-        context = new ExecutionContext();
         configuration = new JcrConfiguration();
     }
 
+    @After
+    public void afterEach() throws Exception {
+        if (engine != null) {
+            try {
+                engine.shutdown();
+                engine.awaitTermination(3, TimeUnit.SECONDS);
+            } finally {
+                engine = null;
+            }
+        }
+    }
+
+    protected ExecutionContext context() {
+        return configuration.getConfigurationDefinition().getContext();
+    }
+
+    protected Path path( String path ) {
+        return context().getValueFactories().getPathFactory().create(path);
+    }
+
     protected Path.Segment segment( String segment ) {
-        return context.getValueFactories().getPathFactory().createSegment(segment);
+        return context().getValueFactories().getPathFactory().createSegment(segment);
     }
 
     @Test
@@ -70,72 +98,73 @@
 
     @Test
     public void shouldAllowCreatingWithSpecifiedExecutionContext() {
-        configuration = new JcrConfiguration(context);
+        ExecutionContext newContext = new ExecutionContext();
+        configuration = new JcrConfiguration(newContext);
+        assertThat(configuration.getConfigurationDefinition().getContext(), is(sameInstance(newContext)));
     }
 
     @Test
     public void shouldHaveDefaultConfigurationSourceIfNotSpecified() {
-        assertThat(configuration.graph(), is(notNullValue()));
+        assertThat(configuration.getConfigurationDefinition(), is(notNullValue()));
     }
 
     @Test
     public void shouldAllowAddingRepositorySourceInstance() {
         UUID rootUuid = UUID.randomUUID();
         CachePolicy cachePolicy = new ImmutableCachePolicy(100);
-        InMemoryRepositorySource newSource = new InMemoryRepositorySource();
-        newSource.setName("name");
-        newSource.setDefaultCachePolicy(cachePolicy);
-        newSource.setDefaultWorkspaceName("default workspace name");
-        newSource.setRetryLimit(100);
-        newSource.setRootNodeUuid(rootUuid);
 
         // Update the configuration and save it ...
-        configuration.addSource(newSource).save();
+        configuration.repositorySource("name")
+                     .usingClass(InMemoryRepositorySource.class)
+                     .setRetryLimit(100)
+                     .setProperty("defaultCachePolicy", cachePolicy)
+                     .setProperty("defaultWorkspaceName", "default workspace name")
+                     .setProperty("rootNodeUuid", rootUuid)
+                     .and()
+                     .save();
 
         // Verify that the graph has been updated correctly ...
-        Subgraph subgraph = configuration.graph().getSubgraphOfDepth(3).at("/");
+        DnaConfiguration.ConfigurationDefinition content = configuration.getConfigurationDefinition();
+        Subgraph subgraph = content.graph().getSubgraphOfDepth(3).at("/");
         assertThat(subgraph.getNode("/dna:sources"), is(notNullValue()));
         assertThat(subgraph.getNode("/dna:sources/name"), is(notNullValue()));
-        assertThat(subgraph.getNode("/dna:sources/name"), hasProperty(DnaLexicon.READABLE_NAME, "name"));
         assertThat(subgraph.getNode("/dna:sources/name"), hasProperty(DnaLexicon.RETRY_LIMIT, 100));
-        assertThat(subgraph.getNode("/dna:sources/name"), hasProperty(DnaLexicon.DEFAULT_CACHE_POLICY, cachePolicy));
+        assertThat(subgraph.getNode("/dna:sources/name"), hasProperty("defaultCachePolicy", cachePolicy));
         assertThat(subgraph.getNode("/dna:sources/name"), hasProperty("defaultWorkspaceName", "default workspace name"));
         assertThat(subgraph.getNode("/dna:sources/name"), hasProperty("rootNodeUuid", rootUuid));
     }
 
     @Test
     public void shouldAllowSettingUpConfigurationRepositoryWithDifferentConfigurationSourceName() throws Exception {
-        JcrEngine engine = configuration.withConfigurationSource()
-                                        .usingClass(InMemoryRepositorySource.class.getName())
-                                        .loadedFromClasspath()
-                                        .describedAs("Configuration Repository")
-                                        .with("name")
-                                        .setTo("config")
-                                        .with("retryLimit")
-                                        .setTo(5)
-                                        .and()
-                                        .addSource("Source2")
-                                        .usingClass(InMemoryRepositorySource.class.getName())
-                                        .loadedFromClasspath()
-                                        .describedAs("description")
-                                        .and()
-                                        .addRepository("JCR Repository")
-                                        .usingSource("Source2")
-                                        .with(Option.JAAS_LOGIN_CONFIG_NAME)
-                                        .setTo("test")
-                                        .and()
-                                        .build();
+        configuration.repositorySource("Source2")
+                     .usingClass(InMemoryRepositorySource.class.getName())
+                     .loadedFromClasspath()
+                     .setDescription("description")
+                     .and()
+                     .repository("JCR Repository")
+                     .setSource("Source2")
+                     .setOption(Option.JAAS_LOGIN_CONFIG_NAME, "test")
+                     .and()
+                     .save();
+
+        // Start the engine ...
+        engine = configuration.build();
         engine.start();
         // Get a graph to the configuration source ...
-        RepositorySource configReposSource = engine.getRepositoryService().getRepositoryLibrary().getSource("config");
+        RepositorySource configReposSource = engine.getRepositoryService()
+                                                   .getRepositoryLibrary()
+                                                   .getSource(JcrConfiguration.DEFAULT_CONFIGURATION_SOURCE_NAME);
         assertThat(configReposSource, is(notNullValue()));
         assertThat(configReposSource, is(instanceOf(InMemoryRepositorySource.class)));
-        assertThat(configReposSource.getName(), is("config"));
+        assertThat(configReposSource.getName(), is(JcrConfiguration.DEFAULT_CONFIGURATION_SOURCE_NAME));
         InMemoryRepositorySource configSource = (InMemoryRepositorySource)configReposSource;
-        assertThat(configSource.getDefaultWorkspaceName(), is(""));
-        Graph graph = Graph.create("config", engine.getRepositoryService().getRepositoryLibrary(), context);
+        assertThat(configSource.getDefaultWorkspaceName(), is(JcrConfiguration.DEFAULT_WORKSPACE_NAME));
+        Graph graph = engine.getGraph(JcrConfiguration.DEFAULT_CONFIGURATION_SOURCE_NAME);
         assertThat(graph, is(notNullValue()));
         assertThat(graph.getNodeAt("/"), is(notNullValue()));
+        assertThat(graph.getNodeAt("/dna:sources"), is(notNullValue()));
+        assertThat(graph.getNodeAt("/dna:sources/Source2"), hasProperty(DnaLexicon.DESCRIPTION, "description"));
+        assertThat(graph.getNodeAt("/dna:repositories/JCR Repository"), hasProperty(DnaLexicon.SOURCE_NAME, "Source2"));
 
         // Get the repository ...
         JcrRepository repository = engine.getRepository("JCR Repository");
@@ -144,40 +173,41 @@
 
     @Test
     public void shouldAllowSettingUpConfigurationRepositoryWithDifferentWorkspaceName() throws Exception {
-        JcrEngine engine = configuration.withConfigurationSource()
-                                        .usingClass(InMemoryRepositorySource.class.getName())
-                                        .loadedFromClasspath()
-                                        .describedAs("Configuration Repository")
-                                        .usingWorkspace("workspaceXYZ")
-                                        .with("name")
-                                        .setTo("config2")
-                                        .with("defaultWorkspaceName")
-                                        .setTo("workspaceXYZ")
-                                        .with("retryLimit")
-                                        .setTo(5)
-                                        .and()
-                                        .addSource("Source2")
-                                        .usingClass(InMemoryRepositorySource.class.getName())
-                                        .loadedFromClasspath()
-                                        .describedAs("description")
-                                        .and()
-                                        .addRepository("JCR Repository")
-                                        .usingSource("Source2")
-                                        .with(Option.JAAS_LOGIN_CONFIG_NAME)
-                                        .setTo("test")
-                                        .and()
-                                        .build();
+        InMemoryRepositorySource configSource = new InMemoryRepositorySource();
+        configSource.setName("config2");
+        configSource.setRetryLimit(5);
+        configuration.loadFrom(configSource, "workspaceXYZ");
+        configuration.repositorySource("Source2")
+                     .usingClass(InMemoryRepositorySource.class.getName())
+                     .loadedFromClasspath()
+                     .setDescription("description")
+                     .and()
+                     .repository("JCR Repository")
+                     .setSource("Source2")
+                     .setOption(Option.JAAS_LOGIN_CONFIG_NAME, "test");
+        configuration.save();
+        // Save the configuration and start the engine ...
+        engine = configuration.build();
         engine.start();
+
+        ConfigurationDefinition configDefn = configuration.getConfigurationDefinition();
+        assertThat(configDefn.getWorkspace(), is("workspaceXYZ"));
+        assertThat(configDefn.getPath(), is(path("/")));
+
         // Get a graph to the configuration source ...
         RepositorySource configReposSource = engine.getRepositoryService().getRepositoryLibrary().getSource("config2");
         assertThat(configReposSource, is(notNullValue()));
         assertThat(configReposSource, is(instanceOf(InMemoryRepositorySource.class)));
         assertThat(configReposSource.getName(), is("config2"));
-        InMemoryRepositorySource configSource = (InMemoryRepositorySource)configReposSource;
-        assertThat(configSource.getDefaultWorkspaceName(), is("workspaceXYZ"));
-        Graph graph = Graph.create("config2", engine.getRepositoryService().getRepositoryLibrary(), context);
+        InMemoryRepositorySource configSource2 = (InMemoryRepositorySource)configReposSource;
+        assertThat(configSource2.getDefaultWorkspaceName(), is("")); // didn't change this
+
+        Graph graph = engine.getGraph("config2");
         assertThat(graph, is(notNullValue()));
         assertThat(graph.getNodeAt("/"), is(notNullValue()));
+        assertThat(graph.getNodeAt("/dna:sources"), is(notNullValue()));
+        assertThat(graph.getNodeAt("/dna:sources/Source2"), hasProperty(DnaLexicon.DESCRIPTION, "description"));
+        assertThat(graph.getNodeAt("/dna:repositories/JCR Repository"), hasProperty(DnaLexicon.SOURCE_NAME, "Source2"));
 
         // Get the repository ...
         JcrRepository repository = engine.getRepository("JCR Repository");
@@ -185,221 +215,192 @@
     }
 
     @Test
-    public void shouldAllowAddingRepositorySourceByClassNameAndSettingProperties() {
-        // Update the configuration and save it ...
-        configuration.addSource("Source1")
+    public void shouldAllowSpecifyingOptions() throws Exception {
+        configuration.repositorySource("Source2")
                      .usingClass(InMemoryRepositorySource.class.getName())
                      .loadedFromClasspath()
-                     .describedAs("description")
-                     .with("retryLimit")
-                     .setTo(5)
+                     .setDescription("description")
                      .and()
-                     .save();
+                     .repository("JCR Repository")
+                     .setSource("Source2")
+                     .setOption(Option.JAAS_LOGIN_CONFIG_NAME, "test");
 
+        engine = configuration.build();
+        engine.start();
+
         // Verify that the graph has been updated correctly ...
-        Subgraph subgraph = configuration.graph().getSubgraphOfDepth(3).at("/");
+        Graph config = engine.getGraph(JcrConfiguration.DEFAULT_CONFIGURATION_SOURCE_NAME);
+        Subgraph subgraph = config.getSubgraphOfDepth(6).at("/");
         assertThat(subgraph.getNode("/dna:sources"), is(notNullValue()));
-        assertThat(subgraph.getNode("/dna:sources/Source1"), is(notNullValue()));
-        assertThat(subgraph.getNode("/dna:sources/Source1"), hasProperty(DnaLexicon.READABLE_NAME, "Source1"));
-        assertThat(subgraph.getNode("/dna:sources/Source1"), hasProperty(DnaLexicon.RETRY_LIMIT, 5));
-        assertThat(subgraph.getNode("/dna:sources/Source1"), hasProperty(DnaLexicon.CLASSNAME,
+        assertThat(subgraph.getNode("/dna:sources/Source2"), is(notNullValue()));
+        assertThat(subgraph.getNode("/dna:sources/Source2"), hasProperty(DnaLexicon.CLASSNAME,
                                                                          InMemoryRepositorySource.class.getName()));
-    }
+        assertThat(subgraph.getNode("/dna:repositories"), is(notNullValue()));
+        assertThat(subgraph.getNode("/dna:repositories/JCR Repository"), is(notNullValue()));
+        assertThat(subgraph.getNode("/dna:repositories/JCR Repository"), hasProperty(DnaLexicon.SOURCE_NAME, "Source2"));
+        assertThat(subgraph.getNode("/dna:repositories/JCR Repository/dna:options"), is(notNullValue()));
+        assertThat(subgraph.getNode("/dna:repositories/JCR Repository/dna:options/JAAS_LOGIN_CONFIG_NAME"),
+                   hasProperty(DnaLexicon.VALUE, "test"));
 
-    @Test
-    public void shouldAllowAddingRepositorySourceByClassNameAndClasspathAndSettingProperties() {
-        // Update the configuration and save it ...
-        configuration.addSource("Source1")
-                     .usingClass(InMemoryRepositorySource.class.getName())
-                     .loadedFrom("cp1", "cp2")
-                     .describedAs("description")
-                     .with("retryLimit")
-                     .setTo(5)
-                     .and()
-                     .save();
+        JcrRepository repository = engine.getRepository("JCR Repository");
 
-        // Verify that the graph has been updated correctly ...
-        Subgraph subgraph = configuration.graph().getSubgraphOfDepth(3).at("/");
-        assertThat(subgraph.getNode("/dna:sources"), is(notNullValue()));
-        assertThat(subgraph.getNode("/dna:sources/Source1"), is(notNullValue()));
-        assertThat(subgraph.getNode("/dna:sources/Source1"), hasProperty(DnaLexicon.READABLE_NAME, "Source1"));
-        assertThat(subgraph.getNode("/dna:sources/Source1"), hasProperty(DnaLexicon.RETRY_LIMIT, 5));
-        assertThat(subgraph.getNode("/dna:sources/Source1"), hasProperty(DnaLexicon.CLASSNAME,
-                                                                         InMemoryRepositorySource.class.getName()));
-        assertThat(subgraph.getNode("/dna:sources/Source1"), hasProperty(DnaLexicon.CLASSPATH, "cp1", "cp2"));
+        Map<Option, String> options = new HashMap<Option, String>();
+        options.put(Option.JAAS_LOGIN_CONFIG_NAME, "test");
+        options.put(Option.PROJECT_NODE_TYPES, "false");
+        assertThat(repository.getOptions(), is(options));
     }
 
     @Test
-    public void shouldAllowAddingRepositorySourceByClassReferenceAndSettingProperties() {
-        // Update the configuration and save it ...
-        configuration.addSource("Source1")
-                     .usingClass(InMemoryRepositorySource.class)
-                     .describedAs("description")
-                     .with("retryLimit")
-                     .setTo(5)
-                     .and()
-                     .save();
+    public void shouldLoadConfigurationFromFilePath() throws Exception {
+        File file = new File("src/test/resources/config/configRepository.xml");
+        assertThat(file.exists(), is(true));
+        assertThat(file.canRead(), is(true));
+        assertThat(file.isFile(), is(true));
 
-        // Verify that the graph has been updated correctly ...
-        Subgraph subgraph = configuration.graph().getSubgraphOfDepth(3).at("/");
-        assertThat(subgraph.getNode("/dna:sources"), is(notNullValue()));
-        assertThat(subgraph.getNode("/dna:sources/Source1"), is(notNullValue()));
-        assertThat(subgraph.getNode("/dna:sources/Source1"), hasProperty(DnaLexicon.READABLE_NAME, "Source1"));
-        assertThat(subgraph.getNode("/dna:sources/Source1"), hasProperty(DnaLexicon.RETRY_LIMIT, 5));
-        assertThat(subgraph.getNode("/dna:sources/Source1"), hasProperty(DnaLexicon.DESCRIPTION, "description"));
-        assertThat(subgraph.getNode("/dna:sources/Source1"), hasProperty(DnaLexicon.CLASSNAME,
-                                                                         InMemoryRepositorySource.class.getName()));
-    }
+        configuration.loadFrom("src/test/resources/config/configRepository.xml");
 
-    @Test
-    public void shouldAllowOverwritingRepositorySourceByRepositoryName() {
-        // Update the configuration and save it ...
-        configuration.addSource("Source1")
-                     .usingClass(InMemoryRepositorySource.class)
-                     .describedAs("description")
-                     .with("retryLimit")
-                     .setTo(3)
-                     .and()
-                     .addSource("Source1")
-                     .usingClass(InMemoryRepositorySource.class)
-                     .describedAs("new description")
-                     .with("retryLimit")
-                     .setTo(6)
-                     .and()
-                     .save();
+        assertThat(configuration.getProblems().isEmpty(), is(true));
 
         // Verify that the graph has been updated correctly ...
-        Subgraph subgraph = configuration.graph().getSubgraphOfDepth(3).at("/");
+        DnaConfiguration.ConfigurationDefinition content = configuration.getConfigurationDefinition();
+        Subgraph subgraph = content.graph().getSubgraphOfDepth(6).at("/");
+
         assertThat(subgraph.getNode("/dna:sources"), is(notNullValue()));
-        assertThat(subgraph.getNode("/dna:sources").getChildren(), hasChild(segment("Source1")));
-        assertThat(subgraph.getNode("/dna:sources/Source1"), is(notNullValue()));
-        assertThat(subgraph.getNode("/dna:sources/Source1"), hasProperty(DnaLexicon.READABLE_NAME, "Source1"));
-        assertThat(subgraph.getNode("/dna:sources/Source1"), hasProperty(DnaLexicon.RETRY_LIMIT, 6));
-        assertThat(subgraph.getNode("/dna:sources/Source1"), hasProperty(DnaLexicon.DESCRIPTION, "new description"));
-        assertThat(subgraph.getNode("/dna:sources/Source1"), hasProperty(DnaLexicon.CLASSNAME,
-                                                                         InMemoryRepositorySource.class.getName()));
-    }
+        assertThat(subgraph.getNode("/dna:sources/Cars"), is(notNullValue()));
+        assertThat(subgraph.getNode("/dna:sources/Cars"), hasProperty(DnaLexicon.RETRY_LIMIT, "3"));
+        assertThat(subgraph.getNode("/dna:sources/Cars"), hasProperty(DnaLexicon.CLASSNAME,
+                                                                      InMemoryRepositorySource.class.getName()));
+        assertThat(subgraph.getNode("/dna:sources/Aircraft"), is(notNullValue()));
+        assertThat(subgraph.getNode("/dna:sources/Aircraft"), hasProperty("defaultWorkspaceName", "default"));
+        assertThat(subgraph.getNode("/dna:sources/Aircraft"), hasProperty(DnaLexicon.CLASSNAME,
+                                                                          InMemoryRepositorySource.class.getName()));
+        assertThat(subgraph.getNode("/dna:sources/Cache"), is(notNullValue()));
+        assertThat(subgraph.getNode("/dna:sources/Cache"), hasProperty(DnaLexicon.CLASSNAME,
+                                                                       InMemoryRepositorySource.class.getName()));
 
-    @Test
-    public void shouldAllowAddingMimeTypeDetector() {
-        // Update the configuration and save it ...
-        configuration.addSource("Source1")
-                     .usingClass(InMemoryRepositorySource.class)
-                     .describedAs("description")
-                     .and()
-                     .addMimeTypeDetector("detector")
-                     .usingClass(ExtensionBasedMimeTypeDetector.class)
-                     .describedAs("default detector")
-                     .and()
-                     .save();
-
-        // Verify that the graph has been updated correctly ...
-        Subgraph subgraph = configuration.graph().getSubgraphOfDepth(3).at("/");
-        assertThat(subgraph.getNode("/dna:sources").getChildren(), hasChild(segment("Source1")));
-        assertThat(subgraph.getNode("/dna:sources/Source1"), is(notNullValue()));
-        assertThat(subgraph.getNode("/dna:sources/Source1"), hasProperty(DnaLexicon.READABLE_NAME, "Source1"));
-        assertThat(subgraph.getNode("/dna:sources/Source1"), hasProperty(DnaLexicon.DESCRIPTION, "description"));
-        assertThat(subgraph.getNode("/dna:sources/Source1"), hasProperty(DnaLexicon.CLASSNAME,
-                                                                         InMemoryRepositorySource.class.getName()));
-        assertThat(subgraph.getNode("/dna:mimeTypeDetectors").getChildren(), hasChild(segment("detector")));
-        assertThat(subgraph.getNode("/dna:mimeTypeDetectors/detector"), is(notNullValue()));
-        assertThat(subgraph.getNode("/dna:mimeTypeDetectors/detector"), hasProperty(DnaLexicon.READABLE_NAME, "detector"));
-        assertThat(subgraph.getNode("/dna:mimeTypeDetectors/detector"), hasProperty(DnaLexicon.DESCRIPTION, "default detector"));
-        assertThat(subgraph.getNode("/dna:mimeTypeDetectors/detector"),
+        assertThat(subgraph.getNode("/dna:mimeTypeDetectors").getChildren(), hasChild(segment("Detector")));
+        assertThat(subgraph.getNode("/dna:mimeTypeDetectors/Detector"), is(notNullValue()));
+        assertThat(subgraph.getNode("/dna:mimeTypeDetectors/Detector"),
+                   hasProperty(DnaLexicon.DESCRIPTION, "Standard extension-based MIME type detector"));
+        assertThat(subgraph.getNode("/dna:mimeTypeDetectors/Detector"),
                    hasProperty(DnaLexicon.CLASSNAME, ExtensionBasedMimeTypeDetector.class.getName()));
-    }
 
-    @Test
-    public void shouldAllowConfigurationInMultipleSteps() {
-        configuration.addSource("Source1").usingClass(InMemoryRepositorySource.class).describedAs("description");
-        configuration.addMimeTypeDetector("detector")
-                     .usingClass(ExtensionBasedMimeTypeDetector.class)
-                     .describedAs("default detector");
-        configuration.save();
+        assertThat(subgraph.getNode("/dna:repositories").getChildren(), hasChild(segment("Car Repository")));
+        assertThat(subgraph.getNode("/dna:repositories/Car Repository"), is(notNullValue()));
+        assertThat(subgraph.getNode("/dna:repositories/Car Repository"), hasProperty(DnaLexicon.SOURCE_NAME, "Cars"));
+        assertThat(subgraph.getNode("/dna:repositories/Car Repository").getChildren(), hasChild(segment("dna:options")));
+        assertThat(subgraph.getNode("/dna:repositories/Car Repository/dna:options"), is(notNullValue()));
+        assertThat(subgraph.getNode("/dna:repositories/Car Repository/dna:options").getChildren(),
+                   hasChild(segment("jaasLoginConfigName")));
+        assertThat(subgraph.getNode("/dna:repositories/Car Repository/dna:options/jaasLoginConfigName"), is(notNullValue()));
+        assertThat(subgraph.getNode("/dna:repositories/Car Repository/dna:options/jaasLoginConfigName"),
+                   hasProperty(DnaLexicon.VALUE, "dna-jcr"));
 
-        // Verify that the graph has been updated correctly ...
-        Subgraph subgraph = configuration.graph().getSubgraphOfDepth(3).at("/");
-        assertThat(subgraph.getNode("/dna:sources").getChildren(), hasChild(segment("Source1")));
-        assertThat(subgraph.getNode("/dna:sources/Source1"), is(notNullValue()));
-        assertThat(subgraph.getNode("/dna:sources/Source1"), hasProperty(DnaLexicon.READABLE_NAME, "Source1"));
-        assertThat(subgraph.getNode("/dna:sources/Source1"), hasProperty(DnaLexicon.DESCRIPTION, "description"));
-        assertThat(subgraph.getNode("/dna:sources/Source1"), hasProperty(DnaLexicon.CLASSNAME,
-                                                                         InMemoryRepositorySource.class.getName()));
-        assertThat(subgraph.getNode("/dna:mimeTypeDetectors").getChildren(), hasChild(segment("detector")));
-        assertThat(subgraph.getNode("/dna:mimeTypeDetectors/detector"), is(notNullValue()));
-        assertThat(subgraph.getNode("/dna:mimeTypeDetectors/detector"), hasProperty(DnaLexicon.READABLE_NAME, "detector"));
-        assertThat(subgraph.getNode("/dna:mimeTypeDetectors/detector"), hasProperty(DnaLexicon.DESCRIPTION, "default detector"));
-        assertThat(subgraph.getNode("/dna:mimeTypeDetectors/detector"),
-                   hasProperty(DnaLexicon.CLASSNAME, ExtensionBasedMimeTypeDetector.class.getName()));
+        // Initialize IDTrust and a policy file (which defines the "dna-jcr" login config name)
+        String configFile = "security/jaas.conf.xml";
+        IDTrustConfiguration idtrustConfig = new IDTrustConfiguration();
+        try {
+            idtrustConfig.config(configFile);
+        } catch (Exception ex) {
+            throw new IllegalStateException(ex);
+        }
+
+        // Create and start the engine ...
+        engine = configuration.build();
+        engine.start();
+        Repository repository = engine.getRepository("Car Repository");
+        assertThat(repository, is(notNullValue()));
+
+        // Create a session, authenticating using one of the usernames defined by our JAAS policy file(s) ...
+        Session session = null;
+        try {
+            session = repository.login(new SimpleCredentials("superuser", "superuser".toCharArray()));
+        } finally {
+            if (session != null) session.logout();
+        }
     }
 
     @Test
-    public void shouldAllowSpecifyingOptions() throws Exception {
-        // Update the configuration and save it ...
+    public void shouldAddNodeTypesAndNamespaces() throws Exception {
+        File file = new File("src/test/resources/config/configRepository.xml");
+        assertThat(file.exists(), is(true));
+        assertThat(file.canRead(), is(true));
+        assertThat(file.isFile(), is(true));
 
-        JcrEngine engine = configuration.withConfigurationSource()
-                                        .usingClass(InMemoryRepositorySource.class.getName())
-                                        .loadedFromClasspath()
-                                        .describedAs("Configuration Repository")
-                                        .with("name")
-                                        .setTo("configuration")
-                                        .with("retryLimit")
-                                        .setTo(5)
-                                        .and()
-                                        .addSource("Source2")
-                                        .usingClass(InMemoryRepositorySource.class.getName())
-                                        .loadedFromClasspath()
-                                        .describedAs("description")
-                                        .and()
-                                        .addRepository("JCR Repository")
-                                        .usingSource("Source2")
-                                        .with(Option.JAAS_LOGIN_CONFIG_NAME)
-                                        .setTo("test")
-                                        .and()
-                                        .build();
-        engine.start();
+        configuration.loadFrom("src/test/resources/config/configRepository.xml");
+        // Verify that the configration was loaded correctly ...
+        assertThat(configuration.repository("Car Repository").getSource(), is("Cars"));
 
+        // Load the node types from the CND file, and save the configuration ...
+        URL nodeTypesUrl = getClass().getClassLoader().getResource("tck_test_types.cnd");
+        configuration.repository("Car Repository").addNodeTypes(nodeTypesUrl);
+        configuration.save();
+
+        // Verify there were no problems loading the CND file ...
+        assertThat(configuration.getProblems().isEmpty(), is(true));
+        assertThat(configuration.getConfigurationDefinition()
+                                .getContext()
+                                .getNamespaceRegistry()
+                                .isRegisteredNamespaceUri("http://www.jboss.org/dna/test/1.0"), is(true));
+
         // Verify that the graph has been updated correctly ...
-        Subgraph subgraph = configuration.graph().getSubgraphOfDepth(6).at("/");
-        assertThat(subgraph.getNode("/dna:sources"), is(notNullValue()));
-        assertThat(subgraph.getNode("/dna:sources/Source2"), is(notNullValue()));
-        assertThat(subgraph.getNode("/dna:sources/Source2"), hasProperty(DnaLexicon.READABLE_NAME, "Source2"));
-        assertThat(subgraph.getNode("/dna:sources/Source2"), hasProperty(DnaLexicon.CLASSNAME,
-                                                                         InMemoryRepositorySource.class.getName()));
-        assertThat(subgraph.getNode("/dna:repositories"), is(notNullValue()));
-        assertThat(subgraph.getNode("/dna:repositories/JCR Repository"), is(notNullValue()));
-        assertThat(subgraph.getNode("/dna:repositories/JCR Repository"), hasProperty(DnaLexicon.SOURCE_NAME, "Source2"));
-        assertThat(subgraph.getNode("/dna:repositories/JCR Repository/dna:options"), is(notNullValue()));
-        assertThat(subgraph.getNode("/dna:repositories/JCR Repository/dna:options/JAAS_LOGIN_CONFIG_NAME"),
-                   hasProperty(DnaLexicon.VALUE, "test"));
+        DnaConfiguration.ConfigurationDefinition content = configuration.getConfigurationDefinition();
+        Subgraph subgraph = content.graph().getSubgraphOfDepth(6).at("/");
 
-        JcrRepository repository = engine.getRepository("JCR Repository");
+        assertThat(subgraph.getNode("/dna:repositories").getChildren(), hasChild(segment("Car Repository")));
+        assertThat(subgraph.getNode("/dna:repositories/Car Repository"), is(notNullValue()));
+        assertThat(subgraph.getNode("/dna:repositories/Car Repository"), hasProperty(DnaLexicon.SOURCE_NAME, "Cars"));
+        assertThat(subgraph.getNode("/dna:repositories/Car Repository").getChildren(), hasChild(segment("dna:options")));
+        assertThat(subgraph.getNode("/dna:repositories/Car Repository/dna:nodeTypes"), is(notNullValue()));
+        // for (Location child : subgraph.getNode("/dna:repositories/Car Repository/dna:nodeTypes").getChildren()) {
+        // System.out.println(child.getPath().getLastSegment().getString(context().getNamespaceRegistry()));
+        // }
+        assertThat(subgraph.getNode("/dna:repositories/Car Repository/dna:nodeTypes").getChildren(),
+                   hasChildren(segment("dnatest:noSameNameSibs"),
+                               segment("dnatest:referenceableUnstructured"),
+                               segment("dnatest:nodeWithMandatoryProperty"),
+                               segment("dnatest:nodeWithMandatoryChild"),
+                               segment("dnatest:unorderableUnstructured")));
+        assertThat(subgraph.getNode("/dna:repositories/Car Repository/dna:namespaces"), is(notNullValue()));
 
-        Map<Option, String> options = new HashMap<Option, String>();
-        options.put(Option.JAAS_LOGIN_CONFIG_NAME, "test");
-        options.put(Option.PROJECT_NODE_TYPES, "false");
-        assertThat(repository.getOptions(), is(options));
-    }
+        // Check that the namespace in the CND file was persisted correctly ...
+        assertThat(subgraph.getNode("/dna:repositories/Car Repository/dna:namespaces").getChildren(),
+                   hasChild(segment("dnatest")));
+        assertThat(subgraph.getNode("/dna:repositories/Car Repository/dna:namespaces/dnatest"),
+                   hasProperty(DnaLexicon.NAMESPACE_URI, "http://www.jboss.org/dna/test/1.0"));
 
-    @Test
-    public void shouldAllowCreatingWithConfigRepository() throws InterruptedException {
-        DnaEngine engine = new DnaConfiguration().withConfigurationSource()
-                                                 .usingClass(InMemoryRepositorySource.class)
-                                                 .describedAs("Configuration Repository")
-                                                 .with("name")
-                                                 .setTo("config repo")
-                                                 .and()
-                                                 .build();
+        // Initialize IDTrust and a policy file (which defines the "dna-jcr" login config name)
+        String configFile = "security/jaas.conf.xml";
+        IDTrustConfiguration idtrustConfig = new IDTrustConfiguration();
+        try {
+            idtrustConfig.config(configFile);
+        } catch (Exception ex) {
+            throw new IllegalStateException(ex);
+        }
 
-        assertThat(engine.getRepositorySource("config repo"), is(notNullValue()));
-        assertThat(engine.getRepositorySource("config repo"), is(instanceOf(InMemoryRepositorySource.class)));
+        // Create and start the engine ...
+        engine = configuration.build();
+        engine.start();
+        Repository repository = engine.getRepository("Car Repository");
+        assertThat(repository, is(notNullValue()));
 
-        RepositoryLibrary library = engine.getRepositoryService().getRepositoryLibrary();
-        assertThat(library.getConnectionPool("config repo").getInUseCount(), is(0));
+        // Create a session, authenticating using one of the usernames defined by our JAAS policy file(s) ...
+        Session session = null;
+        try {
+            session = repository.login(new SimpleCredentials("superuser", "superuser".toCharArray()));
 
-        RepositoryConnection connection = library.getConnectionPool("config repo").getConnection();
-        assertThat(connection.ping(500, TimeUnit.MILLISECONDS), is(true));
-        connection.close();
+            // Check that the namespace showed up ...
+            assertThat(session.getNamespacePrefix("http://www.jboss.org/dna/test/1.0"), is("dnatest"));
 
+            // Check that some of the node types showed up ...
+            NodeTypeManager ntm = session.getWorkspace().getNodeTypeManager();
+            assertThat(ntm.getNodeType("dnatest:noSameNameSibs"), is(notNullValue())); // throws exception
+            assertThat(ntm.getNodeType("dnatest:referenceableUnstructured"), is(notNullValue())); // throws exception
+            assertThat(ntm.getNodeType("dnatest:nodeWithMandatoryProperty"), is(notNullValue())); // throws exception
+            assertThat(ntm.getNodeType("dnatest:nodeWithMandatoryChild"), is(notNullValue())); // throws exception
+            assertThat(ntm.getNodeType("dnatest:unorderableUnstructured"), is(notNullValue())); // throws exception
+        } finally {
+            if (session != null) session.logout();
+        }
     }
 }

Added: trunk/dna-jcr/src/test/resources/config/configRepository.xml
===================================================================
--- trunk/dna-jcr/src/test/resources/config/configRepository.xml	                        (rev 0)
+++ trunk/dna-jcr/src/test/resources/config/configRepository.xml	2009-06-03 20:10:19 UTC (rev 969)
@@ -0,0 +1,76 @@
+<?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
+  -->
+<configuration xmlns:dna="http://www.jboss.org/dna/1.0"
+               xmlns:jcr="http://www.jcp.org/jcr/1.0"
+               xmlns:nt="http://www.jcp.org/jcr/nt/1.0">
+    <!-- Define the sources from which content is made available.  -->
+    <dna:sources jcr:primaryType="nt:unstructured">
+        <dna:source jcr:name="Cars" dna:classname="org.jboss.dna.graph.connector.inmemory.InMemoryRepositorySource" dna:retryLimit="3" defaultWorkspaceName="default"/>
+        <dna:source jcr:name="Aircraft" dna:classname="org.jboss.dna.graph.connector.inmemory.InMemoryRepositorySource">
+            <defaultWorkspaceName>default</defaultWorkspaceName>
+        </dna:source>
+        <dna:source jcr:name="Cache" dna:classname="org.jboss.dna.graph.connector.inmemory.InMemoryRepositorySource">
+            <defaultWorkspaceName>default</defaultWorkspaceName>
+        </dna:source>
+    </dna:sources>
+    <!-- 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: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 the mime type detectors. This is an optional section. -->
+    <dna:mimeTypeDetectors>
+        <dna:mimeTypeDetector jcr:name="Detector">
+            <dna:description>Standard extension-based MIME type detector</dna:description>        
+            <!-- 
+            Specify the implementation class (required), as a child element or attribute on parent element.
+            -->
+            <dna:classname>org.jboss.dna.graph.mimetype.ExtensionBasedMimeTypeDetector</dna:classname>
+            <!-- 
+            Specify the classpath (optional) as an ordered list of 'names', where each name is significant to 
+            the classpath factory.  For example, a name could be an OSGI identifier or a Maven coordinate,
+            depending upon the classpath factory being used.  If there is only one 'name' in the classpath,
+            it may be specified as an attribute on the 'mimeTypeDetector' element.  If there is more than one
+            'name', then they must be specified as child 'classpath' elements. Blank or empty values are ignored. 
+             -->
+            <dna:classpath></dna:classpath>
+            <dna:classpath></dna:classpath>
+        </dna:mimeTypeDetector>
+    </dna:mimeTypeDetectors>
+    <!-- JCR Repositories.  This is required, with a separate repository for each JCR repository instance. -->
+    <dna:repositories>
+        <dna:repository jcr:name="Car Repository" dna:sourceName="Cars">
+            <dna:options>
+                <dna:option jcr:name="projectNodeTypes" dna:value="true"/>
+                <dna:option jcr:name="jaasLoginConfigName" dna:value="dna-jcr"/>
+            </dna:options>
+        </dna:repository>
+    </dna:repositories>
+</configuration>
\ No newline at end of file


Property changes on: trunk/dna-jcr/src/test/resources/config/configRepository.xml
___________________________________________________________________
Name: svn:keywords
   + Id Revision
Name: svn:eol-style
   + LF

Deleted: trunk/dna-repository/src/main/java/org/jboss/dna/repository/Configurator.java
===================================================================
--- trunk/dna-repository/src/main/java/org/jboss/dna/repository/Configurator.java	2009-06-03 20:09:11 UTC (rev 968)
+++ trunk/dna-repository/src/main/java/org/jboss/dna/repository/Configurator.java	2009-06-03 20:10:19 UTC (rev 969)
@@ -1,1279 +0,0 @@
-/*
- * JBoss, Home of Professional Open Source.
- * Copyright 2008, Red Hat Middleware LLC, and individual contributors
- * as indicated by the @author tags. See the copyright.txt file in the
- * distribution for a full listing of individual contributors. 
- *
- * This is free software; you can redistribute it and/or modify it
- * 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.
- *
- * This software 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.repository;
-
-import java.util.ArrayList;
-import java.util.List;
-import net.jcip.annotations.Immutable;
-import org.jboss.dna.common.collection.Problems;
-import org.jboss.dna.common.collection.SimpleProblems;
-import org.jboss.dna.common.component.ClassLoaderFactory;
-import org.jboss.dna.common.i18n.I18n;
-import org.jboss.dna.common.text.Inflector;
-import org.jboss.dna.common.util.CheckArg;
-import org.jboss.dna.common.util.Reflection;
-import org.jboss.dna.graph.ExecutionContext;
-import org.jboss.dna.graph.Graph;
-import org.jboss.dna.graph.connector.RepositorySource;
-import org.jboss.dna.graph.connector.inmemory.InMemoryRepositorySource;
-import org.jboss.dna.graph.mimetype.MimeTypeDetector;
-import org.jboss.dna.graph.property.Name;
-import org.jboss.dna.graph.property.Path;
-import org.jboss.dna.graph.property.PathExpression;
-import org.jboss.dna.graph.property.PathFactory;
-import org.jboss.dna.graph.property.ValueFormatException;
-import org.jboss.dna.graph.property.basic.RootPath;
-import org.jboss.dna.graph.sequencer.StreamSequencer;
-import org.jboss.dna.repository.sequencer.Sequencer;
-
-/**
- * @param <BuilderType>
- */
-public abstract class Configurator<BuilderType> {
-
-    /**
-     * Interface used to configure a sequencer.
-     * 
-     * @param <ReturnType> the type of interface to return after the sequencer's configuration is completed
-     */
-    public interface SequencerConfigurator<ReturnType> {
-
-        /**
-         * Add a new {@link StreamSequencer sequencer} to this configuration. The new sequencer will have the supplied name, and
-         * if the name of an existing sequencer is used, this will replace the existing sequencer configuration.
-         * 
-         * @param id the identifier of the new sequencer
-         * @return the interface for choosing the class, which returns the interface used to configure the sequencer; never null
-         * @throws IllegalArgumentException if the sequencer name is null, empty, or otherwise invalid
-         */
-        public ChooseClass<StreamSequencer, SequencerDetails<ReturnType>> addSequencer( String id );
-
-        /**
-         * Get the details for the sequencer with the supplied identifier.
-         * 
-         * @param id the identifier of the sequencer that is to be added
-         * @return the details for the repository source, or null if there is no such source in this configuration
-         */
-        public SequencerDetails<ReturnType> sequencer( String id );
-    }
-
-    /**
-     * Interface used to initialize the configurator to use a specific repository containing configuration information.
-     * 
-     * @param <ReturnType> the configurator type returned after the configuration repository is defined
-     */
-    public interface Initializer<ReturnType> {
-        /**
-         * Specify that this configuration should use a particular {@link RepositorySource} for its configuration repository. By
-         * default each configuration uses an internal transient repository for its configuration, but using this method will make
-         * the configuration use a different repository (that is perhaps shared with other processes).
-         * 
-         * @return the interface for choosing the class, which returns the interface used to configure the source that will be
-         *         used for the configuration repository; never null
-         */
-        public ChooseClass<RepositorySource, ConfigSourceDetails<ReturnType>> withConfigurationSource();
-
-        /**
-         * Get the details for the configuration repository source.
-         * 
-         * @return the details for the configuration's repository source; never null
-         */
-        public ConfigSourceDetails<ReturnType> configurationSource();
-    }
-
-    /**
-     * Interface used to configure a repository source.
-     * 
-     * @param <ReturnType> the type of interface to return after the repository source's configuration is completed
-     */
-    public interface RepositorySourceConfigurator<ReturnType> {
-        /**
-         * Add a new {@link RepositorySource repository} for this configuration. The new repository will have the supplied name,
-         * and if the name of an existing repository is used, this will replace the existing repository configuration.
-         * 
-         * @param id the id of the new repository that is to be added
-         * @return the interface for choosing the class, which returns the interface used to configure the repository source;
-         *         never null
-         * @throws IllegalArgumentException if the repository name is null, empty, or otherwise invalid
-         * @see #addSource(RepositorySource)
-         */
-        public ChooseClass<RepositorySource, RepositorySourceDetails<ReturnType>> addSource( final String id );
-
-        /**
-         * Add a new {@link RepositorySource repository} for this configuration. The new repository will have the supplied name,
-         * and if the name of an existing repository is used, this will replace the existing repository configuration.
-         * 
-         * @param source the {@link RepositorySource} instance that should be used
-         * @return this configuration object, for method-chaining purposes
-         * @throws IllegalArgumentException if the repository source reference is null
-         * @see #addSource(String)
-         */
-        public ReturnType addSource( RepositorySource source );
-
-        /**
-         * Get the details for the repository source with the supplied identifier.
-         * 
-         * @param id the identifier of the repository that is to be added
-         * @return the details for the repository source, or null if there is no such source in this configuration
-         */
-        public RepositorySourceDetails<ReturnType> source( String id );
-    }
-
-    /**
-     * Interface used to configure a MIME type detector.
-     * 
-     * @param <ReturnType> the type of interface to return after the detector's configuration is completed
-     */
-    public interface MimeDetectorConfigurator<ReturnType> {
-        /**
-         * Add a new {@link MimeTypeDetector MIME type detector} to this configuration. The new detector will have the supplied
-         * name, and if the name of an existing detector is used, this will replace the existing detector configuration.
-         * 
-         * @param id the id of the new detector
-         * @return the interface for choosing the class, which returns the interface used to configure the detector; never null
-         * @throws IllegalArgumentException if the detector name is null, empty, or otherwise invalid
-         */
-        public ChooseClass<MimeTypeDetector, MimeTypeDetectorDetails<ReturnType>> addMimeTypeDetector( final String id );
-
-        /**
-         * Get the details for the MIME type detector with the supplied identifier.
-         * 
-         * @param id the identifier of the MIME type detector that is to be added
-         * @return the details for the MIME type detector, or null if there is no such detector in this configuration
-         */
-        public MimeTypeDetectorDetails<ReturnType> mimeTypeDetector( String id );
-    }
-
-    /**
-     * Interface used to build the configured component.
-     * 
-     * @param <ReturnType> the type of component that this configuration builds
-     */
-    public interface Builder<ReturnType> {
-        /**
-         * Complete this configuration and create the corresponding engine.
-         * 
-         * @return the new engine configured by this instance
-         * @throws DnaConfigurationException if the engine cannot be created from this configuration.
-         */
-        public ReturnType build() throws DnaConfigurationException;
-    }
-
-    /**
-     * Interface used to configure a {@link RepositorySource repository}.
-     * 
-     * @param <ReturnType>
-     */
-    public interface RepositorySourceDetails<ReturnType>
-        extends SetName<RepositorySourceDetails<ReturnType>>, SetDescription<RepositorySourceDetails<ReturnType>>,
-        SetProperties<RepositorySourceDetails<ReturnType>>, And<ReturnType> {
-    }
-
-    /**
-     * Interface used to define the configuration repository.
-     * 
-     * @param <ReturnType>
-     */
-    public interface ConfigSourceDetails<ReturnType>
-        extends SetDescription<ConfigSourceDetails<ReturnType>>, SetProperties<ConfigSourceDetails<ReturnType>>, And<ReturnType> {
-        /**
-         * Specify the path under which the configuration content is to be found. This path is assumed to be "/" by default.
-         * 
-         * @param path the path to the configuration content in the configuration source; may not be null
-         * @return this instance for method chaining purposes; never null
-         */
-        public ConfigSourceDetails<ReturnType> under( String path );
-
-        /**
-         * Specify the path under which the configuration content is to be found. This path is assumed to be "/" by default.
-         * 
-         * @param workspace the name of the workspace with the configuration content in the configuration source; may not be null
-         * @return this instance for method chaining purposes; never null
-         */
-        public ConfigSourceDetails<ReturnType> usingWorkspace( String workspace );
-    }
-
-    /**
-     * Interface used to configure a {@link Sequencer sequencer}.
-     * 
-     * @param <ReturnType>
-     */
-    public interface SequencerDetails<ReturnType>
-        extends SetName<SequencerDetails<ReturnType>>, SetDescription<SequencerDetails<ReturnType>>, And<ReturnType> {
-
-        /**
-         * Specify the input {@link PathExpression path expression} represented as a string, which determines when this sequencer
-         * will be executed.
-         * 
-         * @param inputPathExpression the path expression for nodes that, when they change, will be passed as an input to the
-         *        sequencer
-         * @return the interface used to specify the output path expression; never null
-         */
-        PathExpressionOutput<ReturnType> sequencingFrom( String inputPathExpression );
-
-        /**
-         * Specify the input {@link PathExpression path expression}, which determines when this sequencer will be executed.
-         * 
-         * @param inputPathExpression the path expression for nodes that, when they change, will be passed as an input to the
-         *        sequencer
-         * @return the interface used to continue specifying the configuration of the sequencer
-         */
-        SequencerDetails<ReturnType> sequencingFrom( PathExpression inputPathExpression );
-    }
-
-    /**
-     * Interface used to specify the output path expression for a
-     * {@link Configurator.SequencerDetails#sequencingFrom(PathExpression) sequencer configuration}.
-     * 
-     * @param <ReturnType>
-     */
-    public interface PathExpressionOutput<ReturnType> {
-        /**
-         * Specify the output {@link PathExpression path expression}, which determines where this sequencer's output will be
-         * placed.
-         * 
-         * @param outputExpression the path expression for the location(s) where output generated by the sequencer is to be placed
-         * @return the interface used to continue specifying the configuration of the sequencer
-         */
-        SequencerDetails<ReturnType> andOutputtingTo( String outputExpression );
-    }
-
-    /**
-     * Interface used to configure a {@link MimeTypeDetector MIME type detector}.
-     * 
-     * @param <ReturnType>
-     */
-    public interface MimeTypeDetectorDetails<ReturnType>
-        extends SetName<MimeTypeDetectorDetails<ReturnType>>, SetDescription<MimeTypeDetectorDetails<ReturnType>>,
-        SetProperties<MimeTypeDetectorDetails<ReturnType>>, And<ReturnType> {
-    }
-
-    /**
-     * Interface for configuring the JavaBean-style properties of an object.
-     * 
-     * @param <ReturnType> the interface returned after the property has been set.
-     * @author Randall Hauch
-     */
-    public interface SetProperties<ReturnType> {
-        /**
-         * Set the property value to an integer.
-         * 
-         * @param beanPropertyName the name of the JavaBean-style property (e.g., "retryLimit")
-         * @param value the new value for the property
-         * @return the next component to continue configuration; never null
-         */
-        ReturnType setProperty( String beanPropertyName,
-                                int value );
-
-        /**
-         * Set the property value to a long number.
-         * 
-         * @param beanPropertyName the name of the JavaBean-style property (e.g., "retryLimit")
-         * @param value the new value for the property
-         * @return the next component to continue configuration; never null
-         */
-        ReturnType setProperty( String beanPropertyName,
-                                long value );
-
-        /**
-         * Set the property value to a short.
-         * 
-         * @param beanPropertyName the name of the JavaBean-style property (e.g., "retryLimit")
-         * @param value the new value for the property
-         * @return the next component to continue configuration; never null
-         */
-        ReturnType setProperty( String beanPropertyName,
-                                short value );
-
-        /**
-         * Set the property value to a boolean.
-         * 
-         * @param beanPropertyName the name of the JavaBean-style property (e.g., "retryLimit")
-         * @param value the new value for the property
-         * @return the next component to continue configuration; never null
-         */
-        ReturnType setProperty( String beanPropertyName,
-                                boolean value );
-
-        /**
-         * Set the property value to a float.
-         * 
-         * @param beanPropertyName the name of the JavaBean-style property (e.g., "retryLimit")
-         * @param value the new value for the property
-         * @return the next component to continue configuration; never null
-         */
-        ReturnType setProperty( String beanPropertyName,
-                                float value );
-
-        /**
-         * Set the property value to a double.
-         * 
-         * @param beanPropertyName the name of the JavaBean-style property (e.g., "retryLimit")
-         * @param value the new value for the property
-         * @return the next component to continue configuration; never null
-         */
-        ReturnType setProperty( String beanPropertyName,
-                                double value );
-
-        /**
-         * Set the property value to a string.
-         * 
-         * @param beanPropertyName the name of the JavaBean-style property (e.g., "retryLimit")
-         * @param value the new value for the property
-         * @return the next component to continue configuration; never null
-         */
-        ReturnType setProperty( String beanPropertyName,
-                                String value );
-
-        /**
-         * Set the property value to an object.
-         * 
-         * @param beanPropertyName the name of the JavaBean-style property (e.g., "retryLimit")
-         * @param value the new value for the property
-         * @return the next component to continue configuration; never null
-         */
-        ReturnType setProperty( String beanPropertyName,
-                                Object value );
-    }
-
-    /**
-     * The interface used to configure the class used for a component.
-     * 
-     * @param <ComponentClassType> the class or interface that the component is to implement
-     * @param <ReturnType> the interface returned from these methods
-     */
-    public interface ChooseClass<ComponentClassType, ReturnType> {
-
-        /**
-         * Specify the name of the class that should be instantiated for the instance. The classpath information will need to be
-         * defined using the returned interface.
-         * 
-         * @param classname the name of the class that should be instantiated
-         * @return the interface used to define the classpath information; never null
-         * @throws IllegalArgumentException if the class name is null, empty, blank, or not a valid class name
-         */
-        LoadedFrom<ReturnType> usingClass( String classname );
-
-        /**
-         * Specify the class that should be instantiated for the instance. Because the class is already available to this class
-         * loader, there is no need to specify the classloader information.
-         * 
-         * @param clazz the class that should be instantiated
-         * @return the next component to continue configuration; never null
-         * @throws DnaConfigurationException if the class could not be accessed and instantiated (if needed)
-         * @throws IllegalArgumentException if the class reference is null
-         */
-        ReturnType usingClass( Class<? extends ComponentClassType> clazz );
-    }
-
-    /**
-     * The interface used to set a description on a component.
-     * 
-     * @param <ReturnType> the interface returned from these methods
-     */
-    public interface SetDescription<ReturnType> {
-        /**
-         * Specify the description of this component.
-         * 
-         * @param description the description; may be null or empty
-         * @return the next component to continue configuration; never null
-         */
-        ReturnType describedAs( String description );
-    }
-
-    /**
-     * The interface used to set a human readable name on a component.
-     * 
-     * @param <ReturnType> the interface returned from these methods
-     */
-    public interface SetName<ReturnType> {
-        /**
-         * Specify the human-readable name for this component.
-         * 
-         * @param name the name; may be null or empty
-         * @return the next component to continue configuration; never null
-         */
-        ReturnType named( String name );
-    }
-
-    /**
-     * Interface for specifying from where the component's class is to be loaded.
-     * 
-     * @param <ReturnType> the interface returned from these methods
-     */
-    public interface LoadedFrom<ReturnType> {
-        /**
-         * Specify the names of the classloaders that form the classpath for the component, from which the component's class (and
-         * its dependencies) can be loaded. The names correspond to the names supplied to the
-         * {@link ExecutionContext#getClassLoader(String...)} methods.
-         * 
-         * @param classPathNames the names for the classloaders, as passed to the {@link ClassLoaderFactory} implementation (e.g.,
-         *        the {@link ExecutionContext}).
-         * @return the next component to continue configuration; never null
-         * @see #loadedFromClasspath()
-         * @see ExecutionContext#getClassLoader(String...)
-         */
-        ReturnType loadedFrom( String... classPathNames );
-
-        /**
-         * Specify that the component (and its dependencies) will be found on the current (or
-         * {@link Thread#getContextClassLoader() current context}) classloader.
-         * 
-         * @return the next component to continue configuration; never null
-         * @see #loadedFrom(String...)
-         * @see ExecutionContext#getClassLoader(String...)
-         */
-        ReturnType loadedFromClasspath();
-    }
-
-    /**
-     * Continue with another aspect of configuration.
-     * 
-     * @param <ReturnType>
-     */
-    public interface And<ReturnType> {
-
-        /**
-         * Return a reference to the next configuration interface for additional operations.
-         * 
-         * @return a reference to the next configuration interface
-         */
-        ReturnType and();
-    }
-
-    protected final BuilderType builder;
-    protected final ExecutionContext context;
-    protected ConfigurationRepository configurationSource;
-    private Graph graph;
-    private Graph.Batch batch;
-    private final Problems problems;
-
-    /**
-     * Specify a new {@link ExecutionContext} that should be used for this DNA instance.
-     * 
-     * @param context the new context, or null if a default-constructed execution context should be used
-     * @param builder the builder
-     * @throws IllegalArgumentException if the supplied context reference is null
-     */
-    protected Configurator( ExecutionContext context,
-                            BuilderType builder ) {
-        CheckArg.isNotNull(context, "context");
-        CheckArg.isNotNull(builder, "builder");
-        this.context = context;
-        this.builder = builder;
-        this.problems = new SimpleProblems();
-
-        // Set up the default configuration repository ...
-        this.configurationSource = createDefaultConfigurationSource();
-    }
-
-    /**
-     * @return problems
-     */
-    public Problems getProblems() {
-        return problems;
-    }
-
-    /**
-     * Method that is used to set up the default configuration repository source. By default, this method sets up the
-     * {@link InMemoryRepositorySource} loaded from the classpath.
-     * 
-     * @return the default repository source
-     */
-    protected ConfigurationRepository createDefaultConfigurationSource() {
-        InMemoryRepositorySource defaultSource = new InMemoryRepositorySource();
-        defaultSource.setName("Configuration");
-        ConfigurationRepository result = new ConfigurationRepository(defaultSource, "Configuration Repository", null, null);
-        return result;
-    }
-
-    /**
-     * Get the execution context used by this configurator.
-     * 
-     * @return the execution context; never null
-     */
-    public final ExecutionContext getExecutionContext() {
-        return this.context;
-    }
-
-    protected final PathFactory pathFactory() {
-        return getExecutionContext().getValueFactories().getPathFactory();
-    }
-
-    /**
-     * Get the graph containing the configuration information.
-     * 
-     * @return the configuration repository graph; never null
-     * @see #graph()
-     */
-    protected final Graph graph() {
-        if (this.graph == null) {
-            this.graph = Graph.create(configurationSource.getRepositorySource(), context);
-        }
-        return this.graph;
-    }
-
-    /**
-     * Get the graph batch that can be used to change the configuration, where the changes are enqueued until {@link #save()
-     * saved}.
-     * 
-     * @return the latest batch for changes to the configuration repository; never null
-     * @see #graph()
-     */
-    protected final Graph.Batch configuration() {
-        if (this.batch == null) {
-            this.batch = graph().batch();
-        }
-        return this.batch;
-    }
-
-    /**
-     * Save any changes that have been made so far to the configuration. This method does nothing if no changes have been made.
-     * 
-     * @return this configuration object for method chaining purposes; never null
-     */
-    public BuilderType save() {
-        if (this.batch != null) {
-            this.batch.execute();
-            this.batch = this.graph.batch();
-        }
-        return this.builder;
-    }
-
-    protected abstract Name nameFor( String name );
-
-    protected Path createOrReplaceNode( Path parentPath,
-                                        String id,
-                                        Name propertyName,
-                                        Object value ) {
-        Path path = pathFactory().create(parentPath, id);
-        configuration().create(path).with(propertyName, value).and();
-        return path;
-
-    }
-
-    protected Path createOrReplaceNode( Path parentPath,
-                                        Name id,
-                                        Name propertyName,
-                                        Object value ) {
-        Path path = pathFactory().create(parentPath, id);
-        configuration().create(path).with(propertyName, value).and();
-        return path;
-    }
-
-    protected Path createOrReplaceNode( Path parentPath,
-                                        String id ) {
-        Path path = pathFactory().create(parentPath, id);
-        configuration().create(path).and();
-        return path;
-
-    }
-
-    protected Path createOrReplaceNode( Path parentPath,
-                                        Name id ) {
-        Path path = pathFactory().create(parentPath, id);
-        configuration().create(path).and();
-        return path;
-    }
-
-    protected void recordBeanPropertiesInGraph( Path path,
-                                                Object javaBean ) {
-        Reflection reflector = new Reflection(javaBean.getClass());
-        for (String propertyName : reflector.findGetterPropertyNames()) {
-            Object value;
-            try {
-                value = reflector.invokeGetterMethodOnTarget(propertyName, javaBean);
-                if (value == null) continue;
-                propertyName = Inflector.getInstance().lowerCamelCase(propertyName);
-                configuration().set(nameFor(propertyName)).to(value).on(path);
-            } catch (ValueFormatException err) {
-                throw err;
-            } catch (Throwable err) {
-                // Unable to call getter and set property
-            }
-        }
-    }
-
-    protected class ConfigurationRepositoryClassChooser<ReturnType>
-        implements ChooseClass<RepositorySource, ConfigSourceDetails<ReturnType>> {
-
-        private final ReturnType returnObject;
-
-        protected ConfigurationRepositoryClassChooser( ReturnType returnObject ) {
-            assert returnObject != null;
-            this.returnObject = returnObject;
-        }
-
-        public LoadedFrom<ConfigSourceDetails<ReturnType>> usingClass( final String className ) {
-            return new LoadedFrom<ConfigSourceDetails<ReturnType>>() {
-                @SuppressWarnings( "unchecked" )
-                public ConfigSourceDetails loadedFrom( String... classpath ) {
-                    ClassLoader classLoader = getExecutionContext().getClassLoader(classpath);
-                    Class<? extends RepositorySource> clazz = null;
-                    try {
-                        clazz = (Class<? extends RepositorySource>)classLoader.loadClass(className);
-                    } catch (ClassNotFoundException err) {
-                        throw new DnaConfigurationException(RepositoryI18n.unableToLoadClassUsingClasspath.text(className,
-                                                                                                                classpath));
-                    }
-                    return usingClass(clazz);
-                }
-
-                @SuppressWarnings( "unchecked" )
-                public ConfigSourceDetails loadedFromClasspath() {
-                    Class<? extends RepositorySource> clazz = null;
-                    try {
-                        clazz = (Class<? extends RepositorySource>)Class.forName(className);
-                    } catch (ClassNotFoundException err) {
-                        throw new DnaConfigurationException(RepositoryI18n.unableToLoadClass.text(className));
-                    }
-                    return usingClass(clazz);
-                }
-            };
-        }
-
-        public ConfigSourceDetails<ReturnType> usingClass( Class<? extends RepositorySource> repositorySource ) {
-            try {
-                Configurator.this.configurationSource = new ConfigurationRepository(repositorySource.newInstance());
-            } catch (InstantiationException err) {
-                I18n msg = RepositoryI18n.errorCreatingInstanceOfClass;
-                throw new DnaConfigurationException(msg.text(repositorySource.getName(), err.getLocalizedMessage()), err);
-            } catch (IllegalAccessException err) {
-                I18n msg = RepositoryI18n.errorCreatingInstanceOfClass;
-                throw new DnaConfigurationException(msg.text(repositorySource.getName(), err.getLocalizedMessage()), err);
-            }
-            return new ConfigurationSourceDetails<ReturnType>(returnObject);
-        }
-    }
-
-    protected class ConfigurationSourceDetails<ReturnType> implements ConfigSourceDetails<ReturnType> {
-        private final ReturnType returnObject;
-
-        protected ConfigurationSourceDetails( ReturnType returnObject ) {
-            assert returnObject != null;
-            this.returnObject = returnObject;
-        }
-
-        /**
-         * {@inheritDoc}
-         * 
-         * @see org.jboss.dna.repository.Configurator.SetDescription#describedAs(java.lang.String)
-         */
-        public ConfigSourceDetails<ReturnType> describedAs( String description ) {
-            Configurator.this.configurationSource = Configurator.this.configurationSource.withDescription(description);
-            return this;
-        }
-
-        /**
-         * {@inheritDoc}
-         * 
-         * @see org.jboss.dna.repository.Configurator.SetProperties#setProperty(java.lang.String, boolean)
-         */
-        public ConfigSourceDetails<ReturnType> setProperty( String propertyName,
-                                                            boolean value ) {
-            return setProperty(propertyName, (Object)value);
-        }
-
-        /**
-         * {@inheritDoc}
-         * 
-         * @see org.jboss.dna.repository.Configurator.SetProperties#setProperty(java.lang.String, int)
-         */
-        public ConfigSourceDetails<ReturnType> setProperty( String propertyName,
-                                                            int value ) {
-            return setProperty(propertyName, (Object)value);
-        }
-
-        /**
-         * {@inheritDoc}
-         * 
-         * @see org.jboss.dna.repository.Configurator.SetProperties#setProperty(java.lang.String, short)
-         */
-        public ConfigSourceDetails<ReturnType> setProperty( String propertyName,
-                                                            short value ) {
-            return setProperty(propertyName, (Object)value);
-        }
-
-        /**
-         * {@inheritDoc}
-         * 
-         * @see org.jboss.dna.repository.Configurator.SetProperties#setProperty(java.lang.String, long)
-         */
-        public ConfigSourceDetails<ReturnType> setProperty( String propertyName,
-                                                            long value ) {
-            return setProperty(propertyName, (Object)value);
-        }
-
-        /**
-         * {@inheritDoc}
-         * 
-         * @see org.jboss.dna.repository.Configurator.SetProperties#setProperty(java.lang.String, float)
-         */
-        public ConfigSourceDetails<ReturnType> setProperty( String propertyName,
-                                                            float value ) {
-            return setProperty(propertyName, (Object)value);
-        }
-
-        /**
-         * {@inheritDoc}
-         * 
-         * @see org.jboss.dna.repository.Configurator.SetProperties#setProperty(java.lang.String, double)
-         */
-        public ConfigSourceDetails<ReturnType> setProperty( String propertyName,
-                                                            double value ) {
-            return setProperty(propertyName, (Object)value);
-        }
-
-        /**
-         * {@inheritDoc}
-         * 
-         * @see org.jboss.dna.repository.Configurator.SetProperties#setProperty(java.lang.String, java.lang.String)
-         */
-        public ConfigSourceDetails<ReturnType> setProperty( String propertyName,
-                                                            String value ) {
-            return setProperty(propertyName, (Object)value);
-        }
-
-        /**
-         * {@inheritDoc}
-         * 
-         * @see org.jboss.dna.repository.Configurator.SetProperties#setProperty(java.lang.String, java.lang.Object)
-         */
-        public ConfigSourceDetails<ReturnType> setProperty( String beanPropertyName,
-                                                            Object value ) {
-            // Set the JavaBean-style property on the RepositorySource instance ...
-            Object javaBean = Configurator.this.configurationSource.getRepositorySource();
-            Reflection reflection = new Reflection(javaBean.getClass());
-            try {
-                reflection.invokeSetterMethodOnTarget(beanPropertyName, javaBean, value);
-            } catch (Throwable err) {
-                I18n msg = RepositoryI18n.errorSettingJavaBeanPropertyOnInstanceOfClass;
-                throw new DnaConfigurationException(msg.text(beanPropertyName, javaBean.getClass(), err.getMessage()), err);
-            }
-            return this;
-        }
-
-        /**
-         * {@inheritDoc}
-         * 
-         * @see org.jboss.dna.repository.Configurator.ConfigSourceDetails#usingWorkspace(java.lang.String)
-         */
-        public ConfigSourceDetails<ReturnType> usingWorkspace( String workspace ) {
-            Configurator.this.configurationSource = Configurator.this.configurationSource.withWorkspace(workspace);
-            return this;
-        }
-
-        /**
-         * {@inheritDoc}
-         * 
-         * @see org.jboss.dna.repository.Configurator.ConfigSourceDetails#under(java.lang.String)
-         */
-        public ConfigSourceDetails<ReturnType> under( String path ) {
-            CheckArg.isNotNull(path, "path");
-            Path newPath = getExecutionContext().getValueFactories().getPathFactory().create(path);
-            Configurator.this.configurationSource = Configurator.this.configurationSource.with(newPath);
-            return this;
-        }
-
-        /**
-         * {@inheritDoc}
-         * 
-         * @see org.jboss.dna.repository.Configurator.And#and()
-         */
-        public ReturnType and() {
-            return returnObject;
-        }
-    }
-
-    /**
-     * Reusable implementation of {@link Configurator.ChooseClass} that can be used to obtain the name of a class and how its
-     * class loader is defined.
-     * 
-     * @param <ComponentClass> the type of the component that is being chosen
-     * @param <ReturnType> the interface that should be returned when the class name and classpath have been chosen.
-     */
-    protected class ClassChooser<ComponentClass, ReturnType> implements Configurator.ChooseClass<ComponentClass, ReturnType> {
-        protected final Path pathOfComponentNode;
-        protected final ReturnType returnObject;
-
-        public ClassChooser( Path pathOfComponentNode,
-                             ReturnType returnObject ) {
-            assert pathOfComponentNode != null;
-            assert returnObject != null;
-            this.pathOfComponentNode = pathOfComponentNode;
-            this.returnObject = returnObject;
-        }
-
-        /**
-         * {@inheritDoc}
-         * 
-         * @see Configurator.ChooseClass#usingClass(java.lang.String)
-         */
-        public Configurator.LoadedFrom<ReturnType> usingClass( final String classname ) {
-            CheckArg.isNotEmpty(classname, "classname");
-            configuration().set(DnaLexicon.CLASSNAME).to(classname).on(pathOfComponentNode);
-            return new Configurator.LoadedFrom<ReturnType>() {
-                public ReturnType loadedFromClasspath() {
-                    return returnObject;
-                }
-
-                public ReturnType loadedFrom( String... classpath ) {
-                    CheckArg.isNotEmpty(classpath, "classpath");
-                    if (classpath.length == 1 && classpath[0] != null) {
-                        configuration().set(DnaLexicon.CLASSPATH).to(classpath[0]).on(pathOfComponentNode);
-                    } else {
-                        Object[] remaining = new String[classpath.length - 1];
-                        System.arraycopy(classpath, 1, remaining, 0, remaining.length);
-                        configuration().set(DnaLexicon.CLASSPATH).to(classpath[0], remaining).on(pathOfComponentNode);
-                    }
-                    return returnObject;
-                }
-            };
-        }
-
-        /**
-         * {@inheritDoc}
-         * 
-         * @see Configurator.ChooseClass#usingClass(java.lang.Class)
-         */
-        public ReturnType usingClass( Class<? extends ComponentClass> clazz ) {
-            CheckArg.isNotNull(clazz, "clazz");
-            return usingClass(clazz.getName()).loadedFromClasspath();
-        }
-    }
-
-    protected <ReturnType> GraphRepositorySourceDetails<ReturnType> createRepositoryDetails( Path path,
-                                                                                             ReturnType returnObject ) {
-        return new GraphRepositorySourceDetails<ReturnType>(path, returnObject);
-    }
-
-    protected class GraphRepositorySourceDetails<ReturnType> implements RepositorySourceDetails<ReturnType> {
-        private final Path path;
-        private final ReturnType returnObject;
-
-        protected GraphRepositorySourceDetails( Path path,
-                                                ReturnType returnObject ) {
-            assert path != null;
-            assert returnObject != null;
-            this.path = path;
-            this.returnObject = returnObject;
-        }
-
-        public Path path() {
-            return this.path;
-        }
-
-        /**
-         * Get the name used for this source.
-         * 
-         * @return the source's node name
-         */
-        public Name name() {
-            return path().getLastSegment().getName();
-        }
-
-        /**
-         * {@inheritDoc}
-         * 
-         * @see org.jboss.dna.repository.Configurator.SetName#named(java.lang.String)
-         */
-        public RepositorySourceDetails<ReturnType> named( String name ) {
-            configuration().set(DnaLexicon.READABLE_NAME).to(name).on(path);
-            return this;
-        }
-
-        /**
-         * {@inheritDoc}
-         * 
-         * @see org.jboss.dna.repository.Configurator.SetDescription#describedAs(java.lang.String)
-         */
-        public RepositorySourceDetails<ReturnType> describedAs( String description ) {
-            configuration().set(DnaLexicon.DESCRIPTION).to(description).on(path);
-            return this;
-        }
-
-        /**
-         * {@inheritDoc}
-         * 
-         * @see org.jboss.dna.repository.Configurator.SetProperties#setProperty(java.lang.String, boolean)
-         */
-        public RepositorySourceDetails<ReturnType> setProperty( String propertyName,
-                                                                boolean value ) {
-            configuration().set(nameFor(propertyName)).to(value).on(path);
-            return this;
-        }
-
-        /**
-         * {@inheritDoc}
-         * 
-         * @see org.jboss.dna.repository.Configurator.SetProperties#setProperty(java.lang.String, int)
-         */
-        public RepositorySourceDetails<ReturnType> setProperty( String propertyName,
-                                                                int value ) {
-            configuration().set(nameFor(propertyName)).to(value).on(path);
-            return this;
-        }
-
-        /**
-         * {@inheritDoc}
-         * 
-         * @see org.jboss.dna.repository.Configurator.SetProperties#setProperty(java.lang.String, short)
-         */
-        public RepositorySourceDetails<ReturnType> setProperty( String propertyName,
-                                                                short value ) {
-            configuration().set(nameFor(propertyName)).to(value).on(path);
-            return this;
-        }
-
-        /**
-         * {@inheritDoc}
-         * 
-         * @see org.jboss.dna.repository.Configurator.SetProperties#setProperty(java.lang.String, long)
-         */
-        public RepositorySourceDetails<ReturnType> setProperty( String propertyName,
-                                                                long value ) {
-            configuration().set(nameFor(propertyName)).to(value).on(path);
-            return this;
-        }
-
-        /**
-         * {@inheritDoc}
-         * 
-         * @see org.jboss.dna.repository.Configurator.SetProperties#setProperty(java.lang.String, float)
-         */
-        public RepositorySourceDetails<ReturnType> setProperty( String propertyName,
-                                                                float value ) {
-            configuration().set(nameFor(propertyName)).to(value).on(path);
-            return this;
-        }
-
-        /**
-         * {@inheritDoc}
-         * 
-         * @see org.jboss.dna.repository.Configurator.SetProperties#setProperty(java.lang.String, double)
-         */
-        public RepositorySourceDetails<ReturnType> setProperty( String propertyName,
-                                                                double value ) {
-            configuration().set(nameFor(propertyName)).to(value).on(path);
-            return this;
-        }
-
-        /**
-         * {@inheritDoc}
-         * 
-         * @see org.jboss.dna.repository.Configurator.SetProperties#setProperty(java.lang.String, java.lang.String)
-         */
-        public RepositorySourceDetails<ReturnType> setProperty( String propertyName,
-                                                                String value ) {
-            configuration().set(nameFor(propertyName)).to(value).on(path);
-            return this;
-        }
-
-        /**
-         * {@inheritDoc}
-         * 
-         * @see org.jboss.dna.repository.Configurator.SetProperties#setProperty(java.lang.String, java.lang.Object)
-         */
-        public RepositorySourceDetails<ReturnType> setProperty( String propertyName,
-                                                                Object value ) {
-            configuration().set(nameFor(propertyName)).to(value).on(path);
-            return this;
-        }
-
-        /**
-         * {@inheritDoc}
-         * 
-         * @see org.jboss.dna.repository.Configurator.And#and()
-         */
-        public ReturnType and() {
-            return returnObject;
-        }
-    }
-
-    protected class GraphSequencerDetails<ReturnType> implements SequencerDetails<ReturnType> {
-        private final Path path;
-        private final List<String> compiledExpressions = new ArrayList<String>();
-        private final ReturnType returnObject;
-
-        protected GraphSequencerDetails( Path path,
-                                         ReturnType returnObject ) {
-            assert path != null;
-            assert returnObject != null;
-            this.path = path;
-            this.returnObject = returnObject;
-        }
-
-        /**
-         * {@inheritDoc}
-         * 
-         * @see org.jboss.dna.repository.Configurator.SequencerDetails#sequencingFrom(java.lang.String)
-         */
-        public PathExpressionOutput<ReturnType> sequencingFrom( final String from ) {
-            CheckArg.isNotEmpty(from, "from");
-            return new PathExpressionOutput<ReturnType>() {
-                /**
-                 * {@inheritDoc}
-                 * 
-                 * @see org.jboss.dna.repository.Configurator.PathExpressionOutput#andOutputtingTo(java.lang.String)
-                 */
-                public SequencerDetails<ReturnType> andOutputtingTo( String into ) {
-                    CheckArg.isNotEmpty(into, "into");
-                    return sequencingFrom(PathExpression.compile(from + " => " + into));
-                }
-            };
-        }
-
-        /**
-         * {@inheritDoc}
-         * 
-         * @see org.jboss.dna.repository.Configurator.SetName#named(java.lang.String)
-         */
-        public SequencerDetails<ReturnType> named( String name ) {
-            configuration().set(DnaLexicon.READABLE_NAME).to(name).on(path);
-            return this;
-        }
-
-        /**
-         * {@inheritDoc}
-         * 
-         * @see org.jboss.dna.repository.Configurator.SequencerDetails#sequencingFrom(org.jboss.dna.graph.property.PathExpression)
-         */
-        public SequencerDetails<ReturnType> sequencingFrom( PathExpression expression ) {
-            CheckArg.isNotNull(expression, "expression");
-            String compiledExpression = expression.getExpression();
-            if (!compiledExpressions.contains(compiledExpression)) compiledExpressions.add(compiledExpression);
-            configuration().set(DnaLexicon.PATH_EXPRESSIONS).on(path).to(compiledExpressions);
-            return this;
-        }
-
-        /**
-         * {@inheritDoc}
-         * 
-         * @see org.jboss.dna.repository.Configurator.SetDescription#describedAs(java.lang.String)
-         */
-        public SequencerDetails<ReturnType> describedAs( String description ) {
-            configuration().set(DnaLexicon.DESCRIPTION).to(description).on(path);
-            return this;
-        }
-
-        /**
-         * {@inheritDoc}
-         * 
-         * @see org.jboss.dna.repository.Configurator.And#and()
-         */
-        public ReturnType and() {
-            return returnObject;
-        }
-    }
-
-    protected class GraphMimeTypeDetectorDetails<ReturnType> implements MimeTypeDetectorDetails<ReturnType> {
-        private final Path path;
-        private final ReturnType returnObject;
-
-        protected GraphMimeTypeDetectorDetails( Path path,
-                                                ReturnType returnObject ) {
-            assert path != null;
-            assert returnObject != null;
-            this.path = path;
-            this.returnObject = returnObject;
-        }
-
-        /**
-         * {@inheritDoc}
-         * 
-         * @see org.jboss.dna.repository.Configurator.SetName#named(java.lang.String)
-         */
-        public MimeTypeDetectorDetails<ReturnType> named( String name ) {
-            configuration().set(DnaLexicon.READABLE_NAME).to(name).on(path);
-            return this;
-        }
-
-        /**
-         * {@inheritDoc}
-         * 
-         * @see org.jboss.dna.repository.Configurator.SetProperties#setProperty(java.lang.String, boolean)
-         */
-        public MimeTypeDetectorDetails<ReturnType> setProperty( String propertyName,
-                                                                boolean value ) {
-            configuration().set(nameFor(propertyName)).to(value).on(path);
-            return this;
-        }
-
-        /**
-         * {@inheritDoc}
-         * 
-         * @see org.jboss.dna.repository.Configurator.SetProperties#setProperty(java.lang.String, int)
-         */
-        public MimeTypeDetectorDetails<ReturnType> setProperty( String propertyName,
-                                                                int value ) {
-            configuration().set(nameFor(propertyName)).to(value).on(path);
-            return this;
-        }
-
-        /**
-         * {@inheritDoc}
-         * 
-         * @see org.jboss.dna.repository.Configurator.SetProperties#setProperty(java.lang.String, short)
-         */
-        public MimeTypeDetectorDetails<ReturnType> setProperty( String propertyName,
-                                                                short value ) {
-            configuration().set(nameFor(propertyName)).to(value).on(path);
-            return this;
-        }
-
-        /**
-         * {@inheritDoc}
-         * 
-         * @see org.jboss.dna.repository.Configurator.SetProperties#setProperty(java.lang.String, long)
-         */
-        public MimeTypeDetectorDetails<ReturnType> setProperty( String propertyName,
-                                                                long value ) {
-            configuration().set(nameFor(propertyName)).to(value).on(path);
-            return this;
-        }
-
-        /**
-         * {@inheritDoc}
-         * 
-         * @see org.jboss.dna.repository.Configurator.SetProperties#setProperty(java.lang.String, float)
-         */
-        public MimeTypeDetectorDetails<ReturnType> setProperty( String propertyName,
-                                                                float value ) {
-            configuration().set(nameFor(propertyName)).to(value).on(path);
-            return this;
-        }
-
-        /**
-         * {@inheritDoc}
-         * 
-         * @see org.jboss.dna.repository.Configurator.SetProperties#setProperty(java.lang.String, double)
-         */
-        public MimeTypeDetectorDetails<ReturnType> setProperty( String propertyName,
-                                                                double value ) {
-            configuration().set(nameFor(propertyName)).to(value).on(path);
-            return this;
-        }
-
-        /**
-         * {@inheritDoc}
-         * 
-         * @see org.jboss.dna.repository.Configurator.SetProperties#setProperty(java.lang.String, java.lang.String)
-         */
-        public MimeTypeDetectorDetails<ReturnType> setProperty( String propertyName,
-                                                                String value ) {
-            configuration().set(nameFor(propertyName)).to(value).on(path);
-            return this;
-        }
-
-        /**
-         * {@inheritDoc}
-         * 
-         * @see org.jboss.dna.repository.Configurator.SetProperties#setProperty(java.lang.String, java.lang.Object)
-         */
-        public MimeTypeDetectorDetails<ReturnType> setProperty( String propertyName,
-                                                                Object value ) {
-            configuration().set(nameFor(propertyName)).to(value).on(path);
-            return this;
-        }
-
-        /**
-         * {@inheritDoc}
-         * 
-         * @see org.jboss.dna.repository.Configurator.SetDescription#describedAs(java.lang.String)
-         */
-        public MimeTypeDetectorDetails<ReturnType> describedAs( String description ) {
-            configuration().set(DnaLexicon.DESCRIPTION).to(description).on(path);
-            return this;
-        }
-
-        /**
-         * {@inheritDoc}
-         * 
-         * @see org.jboss.dna.repository.Configurator.And#and()
-         */
-        public ReturnType and() {
-            return returnObject;
-        }
-    }
-
-    @Immutable
-    public static class ConfigurationRepository {
-        private final RepositorySource source;
-        private final String description;
-        private final Path path;
-        private final String workspace;
-
-        protected ConfigurationRepository( RepositorySource source ) {
-            this(source, null, null, null);
-        }
-
-        protected ConfigurationRepository( RepositorySource source,
-                                           String description,
-                                           Path path,
-                                           String workspace ) {
-            this.source = source;
-            this.description = description != null ? description : "";
-            this.path = path != null ? path : RootPath.INSTANCE;
-            this.workspace = workspace != null ? workspace : "";
-        }
-
-        /**
-         * @return source
-         */
-        public RepositorySource getRepositorySource() {
-            return source;
-        }
-
-        /**
-         * @return description
-         */
-        public String getDescription() {
-            return description;
-        }
-
-        /**
-         * @return path
-         */
-        public Path getPath() {
-            return path;
-        }
-
-        /**
-         * @return workspace
-         */
-        public String getWorkspace() {
-            return workspace;
-        }
-
-        public ConfigurationRepository withDescription( String description ) {
-            return new ConfigurationRepository(source, description, path, workspace);
-        }
-
-        public ConfigurationRepository with( Path path ) {
-            return new ConfigurationRepository(source, description, path, workspace);
-        }
-
-        public ConfigurationRepository withWorkspace( String workspace ) {
-            return new ConfigurationRepository(source, description, path, workspace);
-        }
-    }
-}

Modified: trunk/dna-repository/src/main/java/org/jboss/dna/repository/DnaConfiguration.java
===================================================================
--- trunk/dna-repository/src/main/java/org/jboss/dna/repository/DnaConfiguration.java	2009-06-03 20:09:11 UTC (rev 968)
+++ trunk/dna-repository/src/main/java/org/jboss/dna/repository/DnaConfiguration.java	2009-06-03 20:10:19 UTC (rev 969)
@@ -6,8 +6,8 @@
  * See the AUTHORS.txt file in the distribution for a full listing of 
  * individual contributors.
  *
- * Unless otherwise indicated, all code in JBoss DNA is licensed
- * to you under the terms of the GNU Lesser General Public License as
+ * 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.
  * 
@@ -23,285 +23,1365 @@
  */
 package org.jboss.dna.repository;
 
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.URL;
+import java.util.ArrayList;
 import java.util.Collections;
 import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
 import java.util.Map;
+import java.util.Set;
+import net.jcip.annotations.Immutable;
+import net.jcip.annotations.NotThreadSafe;
+import org.jboss.dna.common.collection.Problems;
+import org.jboss.dna.common.collection.SimpleProblems;
+import org.jboss.dna.common.component.ClassLoaderFactory;
+import org.jboss.dna.common.component.StandardClassLoaderFactory;
 import org.jboss.dna.common.util.CheckArg;
 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.Workspace;
 import org.jboss.dna.graph.connector.RepositorySource;
+import org.jboss.dna.graph.connector.inmemory.InMemoryRepositorySource;
 import org.jboss.dna.graph.mimetype.MimeTypeDetector;
 import org.jboss.dna.graph.property.Name;
 import org.jboss.dna.graph.property.Path;
+import org.jboss.dna.graph.property.PathExpression;
+import org.jboss.dna.graph.property.PathNotFoundException;
+import org.jboss.dna.graph.property.Property;
+import org.jboss.dna.graph.property.basic.RootPath;
+import org.jboss.dna.graph.request.InvalidWorkspaceException;
 import org.jboss.dna.graph.sequencer.StreamSequencer;
-import org.jboss.dna.repository.Configurator.ChooseClass;
-import org.jboss.dna.repository.Configurator.ConfigSourceDetails;
-import org.jboss.dna.repository.Configurator.ConfigurationRepository;
-import org.jboss.dna.repository.Configurator.MimeTypeDetectorDetails;
-import org.jboss.dna.repository.Configurator.RepositorySourceDetails;
-import org.jboss.dna.repository.Configurator.SequencerDetails;
+import org.xml.sax.SAXException;
 
 /**
+ * A configuration builder for a {@link DnaEngine}. This class is an internal domain-specific language (DSL), and is designed to
+ * be used in a traditional way or in a method-chained manner:
  * 
+ * <pre>
+ * configuration.repositorySource(&quot;Source1&quot;).setClass(InMemoryRepositorySource.class).setDescription(&quot;description&quot;);
+ * configuration.mimeTypeDetector(&quot;detector&quot;).setClass(ExtensionBasedMimeTypeDetector.class).setDescription(&quot;default detector&quot;);
+ * configuration.sequencer(&quot;MicrosoftDocs&quot;)
+ *              .setClass(&quot;org.jboss.dna.sequencer.msoffice.MSOfficeMetadataSequencer&quot;)
+ *              .setDescription(&quot;Our primary sequencer for all .doc files&quot;)
+ *              .sequencingFrom(&quot;/public//(*.(doc|xml|ppt)[*]/jcr:content[@jcr:data]&quot;)
+ *              .andOutputtingTo(&quot;/documents/$1&quot;);
+ * configuration.save();
+ * </pre>
  */
-public class DnaConfiguration
-    implements Configurator.Initializer<DnaConfiguration>, Configurator.SequencerConfigurator<DnaConfiguration>,
-    Configurator.RepositorySourceConfigurator<DnaConfiguration>, Configurator.MimeDetectorConfigurator<DnaConfiguration>,
-    Configurator.Builder<DnaEngine> {
+ at NotThreadSafe
+public class DnaConfiguration {
 
-    protected static final Map<String, Name> NAMES_TO_MAP;
-    static {
-        Map<String, Name> names = new HashMap<String, Name>();
-        names.put(DnaLexicon.READABLE_NAME.getLocalName(), DnaLexicon.READABLE_NAME);
-        names.put(DnaLexicon.DESCRIPTION.getLocalName(), DnaLexicon.DESCRIPTION);
-        names.put(DnaLexicon.DEFAULT_CACHE_POLICY.getLocalName(), DnaLexicon.DEFAULT_CACHE_POLICY);
-        names.put(DnaLexicon.RETRY_LIMIT.getLocalName(), DnaLexicon.RETRY_LIMIT);
-        names.put(DnaLexicon.PATH_EXPRESSIONS.getLocalName(), DnaLexicon.PATH_EXPRESSIONS);
-        names.put(DnaLexicon.CLASSNAME.getLocalName(), DnaLexicon.CLASSNAME);
-        names.put(DnaLexicon.CLASSPATH.getLocalName(), DnaLexicon.CLASSPATH);
-        NAMES_TO_MAP = Collections.unmodifiableMap(names);
-    }
+    public static final String DEFAULT_WORKSPACE_NAME = "";
+    public static final String DEFAULT_PATH = "/";
+    public static final String DEFAULT_CONFIGURATION_SOURCE_NAME = "DNA Configuration Repository";
 
-    private final Builder<DnaConfiguration> builder;
+    private final ExecutionContext context;
+    private final Problems problems = new SimpleProblems();
+    private ConfigurationDefinition configurationContent;
+    private Graph.Batch changes;
 
+    private final Map<String, SequencerDefinition<? extends DnaConfiguration>> sequencerDefinitions = new HashMap<String, SequencerDefinition<? extends DnaConfiguration>>();
+    private final Map<String, RepositorySourceDefinition<? extends DnaConfiguration>> repositorySourceDefinitions = new HashMap<String, RepositorySourceDefinition<? extends DnaConfiguration>>();
+    private final Map<String, MimeTypeDetectorDefinition<? extends DnaConfiguration>> mimeTypeDetectorDefinitions = new HashMap<String, MimeTypeDetectorDefinition<? extends DnaConfiguration>>();
+
     /**
-     * Create a new configuration for DNA.
+     * Create a new configuration, using a default-constructed {@link ExecutionContext}.
      */
     public DnaConfiguration() {
         this(new ExecutionContext());
     }
 
     /**
-     * Specify a new {@link ExecutionContext} that should be used for this DNA instance.
+     * Create a new configuration using the supplied {@link ExecutionContext}.
      * 
-     * @param context the new context, or null if a default-constructed execution context should be used
-     * @throws IllegalArgumentException if the supplied context reference is null
+     * @param context the execution context
+     * @throws IllegalArgumentException if the path is null or empty
      */
     public DnaConfiguration( ExecutionContext context ) {
-        this.builder = new Builder<DnaConfiguration>(context, this);
+        CheckArg.isNotNull(context, "context");
+        this.context = context;
+
+        // Create the in-memory repository source in which the content will be stored ...
+        InMemoryRepositorySource source = new InMemoryRepositorySource();
+        source.setName(DEFAULT_CONFIGURATION_SOURCE_NAME);
+        source.setDefaultWorkspaceName(DEFAULT_WORKSPACE_NAME);
+
+        // The file was imported successfully, so now create the content information ...
+        configurationContent = new ConfigurationDefinition(source, null, null, context, null);
     }
 
     /**
-     * Get the execution context used by this configurator.
+     * Load the configuration from a file at the given path.
      * 
-     * @return the execution context; never null
+     * @param pathToConfigurationFile the path the file containing the configuration information
+     * @return this configuration object, for convenience and method chaining
+     * @throws IOException if there is an error or problem reading the file at the supplied location
+     * @throws SAXException if the file is not a valid XML format
+     * @throws IllegalArgumentException if the path is null or empty
      */
-    public final ExecutionContext getExecutionContext() {
-        return builder.getExecutionContext();
+    public DnaConfiguration loadFrom( String pathToConfigurationFile ) throws IOException, SAXException {
+        CheckArg.isNotEmpty(pathToConfigurationFile, "pathToConfigurationFile");
+        return loadFrom(pathToConfigurationFile, DEFAULT_PATH);
     }
 
     /**
-     * {@inheritDoc}
+     * Load the configuration from a file at the given path.
      * 
-     * @see org.jboss.dna.repository.Configurator.Initializer#withConfigurationSource()
+     * @param pathToConfigurationFile the path the file containing the configuration information
+     * @param path path within the content to the parent containing the configuration information, or null if the
+     *        {@link #DEFAULT_PATH default path} should be used
+     * @return this configuration object, for convenience and method chaining
+     * @throws IOException if there is an error or problem reading the file at the supplied location
+     * @throws SAXException if the file is not a valid XML format
+     * @throws IllegalArgumentException if the path is null or empty
      */
-    public ChooseClass<RepositorySource, ConfigSourceDetails<DnaConfiguration>> withConfigurationSource() {
-        return builder.withConfigurationSource();
+    public DnaConfiguration loadFrom( String pathToConfigurationFile,
+                                      String path ) throws IOException, SAXException {
+        CheckArg.isNotEmpty(pathToConfigurationFile, "pathToConfigurationFile");
+        return loadFrom(new File(pathToConfigurationFile), path);
     }
 
     /**
-     * {@inheritDoc}
+     * Load the configuration from a file.
      * 
-     * @see org.jboss.dna.repository.Configurator.RepositorySourceConfigurator#addSource(java.lang.String)
+     * @param configurationFile the file containing the configuration information
+     * @return this configuration object, for convenience and method chaining
+     * @throws IOException if there is an error or problem reading the supplied file
+     * @throws SAXException if the file is not a valid XML format
+     * @throws IllegalArgumentException if the file reference is null
      */
-    public ChooseClass<RepositorySource, RepositorySourceDetails<DnaConfiguration>> addSource( String id ) {
-        return builder.addSource(id);
+    public DnaConfiguration loadFrom( File configurationFile ) throws IOException, SAXException {
+        CheckArg.isNotNull(configurationFile, "configurationFile");
+        return loadFrom(configurationFile, DEFAULT_PATH);
     }
 
     /**
-     * {@inheritDoc}
+     * Load the configuration from a file.
      * 
-     * @see org.jboss.dna.repository.Configurator.RepositorySourceConfigurator#addSource(org.jboss.dna.graph.connector.RepositorySource)
+     * @param configurationFile the file containing the configuration information
+     * @param path path within the content to the parent containing the configuration information, or null if the
+     *        {@link #DEFAULT_PATH default path} should be used
+     * @return this configuration object, for convenience and method chaining
+     * @throws IOException if there is an error or problem reading the supplied file
+     * @throws SAXException if the file is not a valid XML format
+     * @throws IllegalArgumentException if the file reference is null
      */
-    public DnaConfiguration addSource( RepositorySource source ) {
-        return builder.addSource(source);
+    public DnaConfiguration loadFrom( File configurationFile,
+                                      String path ) throws IOException, SAXException {
+        CheckArg.isNotNull(configurationFile, "configurationFile");
+        InputStream stream = new FileInputStream(configurationFile);
+        try {
+            return loadFrom(stream, path);
+        } finally {
+            stream.close();
+        }
     }
 
     /**
-     * {@inheritDoc}
+     * Load the configuration from a file at the supplied URL.
      * 
-     * @see org.jboss.dna.repository.Configurator.SequencerConfigurator#addSequencer(java.lang.String)
+     * @param urlToConfigurationFile the URL of the file containing the configuration information
+     * @return this configuration object, for convenience and method chaining
+     * @throws IOException if there is an error or problem reading the file at the supplied URL
+     * @throws SAXException if the file is not a valid XML format
+     * @throws IllegalArgumentException if the URL is null
      */
-    public ChooseClass<StreamSequencer, SequencerDetails<DnaConfiguration>> addSequencer( String id ) {
-        return builder.addSequencer(id);
+    public DnaConfiguration loadFrom( URL urlToConfigurationFile ) throws IOException, SAXException {
+        CheckArg.isNotNull(urlToConfigurationFile, "urlToConfigurationFile");
+        return loadFrom(urlToConfigurationFile, DEFAULT_PATH);
     }
 
     /**
-     * {@inheritDoc}
+     * Load the configuration from a file at the supplied URL.
      * 
-     * @see org.jboss.dna.repository.Configurator.MimeDetectorConfigurator#addMimeTypeDetector(java.lang.String)
+     * @param urlToConfigurationFile the URL of the file containing the configuration information
+     * @param path path within the content to the parent containing the configuration information, or null if the
+     *        {@link #DEFAULT_PATH default path} should be used
+     * @return this configuration object, for convenience and method chaining
+     * @throws IOException if there is an error or problem reading the file at the supplied URL
+     * @throws SAXException if the file is not a valid XML format
+     * @throws IllegalArgumentException if the URL is null
      */
-    public ChooseClass<MimeTypeDetector, MimeTypeDetectorDetails<DnaConfiguration>> addMimeTypeDetector( String id ) {
-        return builder.addMimeTypeDetector(id);
+    public DnaConfiguration loadFrom( URL urlToConfigurationFile,
+                                      String path ) throws IOException, SAXException {
+        CheckArg.isNotNull(urlToConfigurationFile, "urlToConfigurationFile");
+        InputStream stream = urlToConfigurationFile.openStream();
+        try {
+            return loadFrom(stream, path);
+        } finally {
+            stream.close();
+        }
     }
 
     /**
-     * Save any changes that have been made so far to the configuration. This method does nothing if no changes have been made.
+     * Load the configuration from a file at the supplied URL.
      * 
-     * @return this configuration object for method chaining purposes; never null
+     * @param configurationFileInputStream the stream with the configuration information
+     * @return this configuration object, for convenience and method chaining
+     * @throws IOException if there is an error or problem reading the file at the supplied URL
+     * @throws SAXException if the file is not a valid XML format
+     * @throws IllegalArgumentException if the stream is null
      */
+    public DnaConfiguration loadFrom( InputStream configurationFileInputStream ) throws IOException, SAXException {
+        CheckArg.isNotNull(configurationFileInputStream, "configurationFileInputStream");
+        return loadFrom(configurationFileInputStream, DEFAULT_PATH);
+    }
+
+    /**
+     * Load the configuration from a file at the supplied URL.
+     * 
+     * @param configurationFileInputStream the stream with the configuration information
+     * @param path path within the content to the parent containing the configuration information, or null if the
+     *        {@link #DEFAULT_PATH default path} should be used
+     * @return this configuration object, for convenience and method chaining
+     * @throws IOException if there is an error or problem reading the file at the supplied URL
+     * @throws SAXException if the file is not a valid XML format
+     * @throws IllegalArgumentException if the stream is null
+     */
+    public DnaConfiguration loadFrom( InputStream configurationFileInputStream,
+                                      String path ) throws IOException, SAXException {
+        CheckArg.isNotNull(configurationFileInputStream, "configurationFileInputStream");
+
+        // Create the in-memory repository source in which the content will be stored ...
+        InMemoryRepositorySource source = new InMemoryRepositorySource();
+        source.setName(DEFAULT_CONFIGURATION_SOURCE_NAME);
+        source.setDefaultWorkspaceName(DEFAULT_WORKSPACE_NAME);
+
+        // Import the information into the source ...
+        Path pathToParent = path(path != null ? path : DEFAULT_PATH);
+        Graph graph = Graph.create(source, context);
+        graph.importXmlFrom(configurationFileInputStream).skippingRootElement(true).into(pathToParent);
+
+        // The file was imported successfully, so now create the content information ...
+        configurationContent = new ConfigurationDefinition(source, null, pathToParent, context, null);
+        return this;
+    }
+
+    /**
+     * Load the configuration from the repository content using the supplied repository source. This method assumes that the
+     * supplied source has already been configured and is ready to {@link RepositorySource#getConnection() create connections}.
+     * Also, the default workspace of the source will be used, and the configuration content may be found directly under the root
+     * node.
+     * 
+     * @param source the source that defines the repository with the configuration content
+     * @return this configuration object, for convenience and method chaining
+     * @throws IllegalArgumentException if the source is null
+     */
+    public DnaConfiguration loadFrom( RepositorySource source ) {
+        return loadFrom(source, null, null);
+    }
+
+    /**
+     * Load the configuration from the repository content using the workspace in the supplied repository source. This method
+     * assumes that the supplied source has already been configured and is ready to {@link RepositorySource#getConnection() create
+     * connections}. Also, the configuration content may be found directly under the root node.
+     * 
+     * @param source the source that defines the repository with the configuration content
+     * @param workspaceName the name of the workspace with the configuration content, or null if the source's default workspace
+     *        should be used
+     * @return this configuration object, for convenience and method chaining
+     * @throws IllegalArgumentException if the source is null
+     */
+    public DnaConfiguration loadFrom( RepositorySource source,
+                                      String workspaceName ) {
+        CheckArg.isNotNull(source, "source");
+        return loadFrom(source, workspaceName, null);
+    }
+
+    /**
+     * Load the configuration from the repository content at the supplied path in the workspace in the supplied repository source.
+     * This method assumes that the supplied source has already been configured and is ready to
+     * {@link RepositorySource#getConnection() create connections}.
+     * 
+     * @param source the source that defines the repository with the configuration content
+     * @param workspaceName the name of the workspace with the configuration content, or null if the source's default workspace
+     *        should be used
+     * @param pathInWorkspace the path to the parent node under which the configuration content may be found, or null if the
+     *        content may be found under the root node
+     * @return this configuration object, for convenience and method chaining
+     * @throws IllegalArgumentException if the source is null
+     */
+    public DnaConfiguration loadFrom( RepositorySource source,
+                                      String workspaceName,
+                                      String pathInWorkspace ) {
+        CheckArg.isNotNull(source, "source");
+
+        // Verify connectivity ...
+        Graph graph = Graph.create(source, context);
+        if (workspaceName != null) {
+            Workspace workspace = null;
+            try {
+                workspace = graph.useWorkspace(workspaceName); // should throw exception if not connectable
+            } catch (InvalidWorkspaceException e) {
+                // Try creating the workspace ...
+                workspace = graph.createWorkspace().named(workspaceName);
+            }
+            assert workspace.getRoot() != null;
+        }
+
+        // Verify the path ...
+        Path path = pathInWorkspace != null ? path(pathInWorkspace) : path(DEFAULT_PATH);
+        Node parent = graph.getNodeAt(path);
+        assert parent != null;
+
+        // Now create the content information ...
+        configurationContent = new ConfigurationDefinition(source, workspaceName, path, context, null);
+        return this;
+    }
+
+    /**
+     * Get the immutable representation of the information defining where the configuration content can be found.
+     * 
+     * @return the configuration definition
+     */
+    public ConfigurationDefinition getConfigurationDefinition() {
+        return configurationContent;
+    }
+
+    protected ExecutionContext getExecutionContext() {
+        return configurationContent.getContext();
+    }
+
+    protected Path path() {
+        return configurationContent.getPath();
+    }
+
+    protected Path path( String path ) {
+        return context.getValueFactories().getPathFactory().create(path);
+    }
+
+    protected Name name( String name ) {
+        return context.getValueFactories().getNameFactory().create(name);
+    }
+
+    /**
+     * Get the problems (if any) that are associated with this configuration.
+     * 
+     * @return the problems
+     */
+    public Problems getProblems() {
+        return problems;
+    }
+
+    protected Graph.Batch changes() {
+        if (changes == null) {
+            ConfigurationDefinition content = getConfigurationDefinition();
+            Graph graph = Graph.create(content.getRepositorySource(), content.getContext());
+            if (content.getWorkspace() != null) {
+                graph.useWorkspace(content.getWorkspace());
+            }
+            changes = graph.batch();
+        }
+        return changes;
+    }
+
+    /**
+     * Determine if there are any unsaved changes to this configuration that must be {@link #save() saved} before they take
+     * effect.
+     * 
+     * @return true if a {@link #save()} is required, or false no changes have been made to the configuration since the last
+     *         {@link #save()}
+     */
+    public boolean hasChanges() {
+        Graph.Batch changes = this.changes;
+        return changes != null && changes.isExecuteRequired();
+    }
+
+    /**
+     * Persist any unsaved changes that have been made to this configuration. This method has no effect if there are currently
+     * {@link #hasChanges() no unsaved changes}.
+     * 
+     * @return this configuration, for method chaining purposes
+     */
     public DnaConfiguration save() {
-        return builder.save();
+        Graph.Batch changes = this.changes;
+        if (changes != null && changes.isExecuteRequired()) {
+            changes.execute();
+        }
+        sequencerDefinitions.clear();
+        mimeTypeDetectorDefinitions.clear();
+        repositorySourceDefinitions.clear();
+        return this;
     }
 
     /**
-     * {@inheritDoc}
+     * Specify the {@link ClassLoaderFactory} that should be used to load the classes for the various components. Most of the
+     * definitions can specify the {@link LoadedFrom#loadedFrom(String...) classpath} that should be used, and that classpath is
+     * passed to the supplied ClassLoaderFactory instance to obtain a {@link ClassLoader} for the class.
+     * <p>
+     * If not called, this configuration will use the class loader that loaded this configuration's class.
+     * </p>
      * 
-     * @see org.jboss.dna.repository.Configurator.Builder#build()
+     * @param classLoaderFactory the class loader factory implementation, or null if the classes should be loaded using the class
+     *        loader of this object
+     * @return this configuration, for method chaining purposes
      */
-    public DnaEngine build() throws DnaConfigurationException {
+    public DnaConfiguration withClassLoaderFactory( ClassLoaderFactory classLoaderFactory ) {
+        this.configurationContent = this.configurationContent.with(classLoaderFactory);
+        return this;
+    }
+
+    protected Set<String> getNamesOfComponentsUnder( Name parentName ) {
+        Set<String> names = new HashSet<String>();
+        try {
+            ConfigurationDefinition content = this.getConfigurationDefinition();
+            Path path = context.getValueFactories().getPathFactory().create(content.getPath(), parentName);
+            for (Location child : content.graph().getChildren().of(path)) {
+                names.add(child.getPath().getLastSegment().getString(context.getNamespaceRegistry()));
+            }
+        } catch (PathNotFoundException e) {
+            // Nothing has been saved yet ...
+        }
+        return names;
+    }
+
+    /**
+     * Get the list of MIME type detector definitions.
+     * 
+     * @return the unmodifiable set of definitions; never null but possibly empty if there are no definitions
+     */
+    public Set<MimeTypeDetectorDefinition<? extends DnaConfiguration>> mimeTypeDetectors() {
+        // Get the children under the 'dna:mimeTypeDetectors' node ...
+        Set<String> names = getNamesOfComponentsUnder(DnaLexicon.MIME_TYPE_DETECTORS);
+        names.addAll(this.mimeTypeDetectorDefinitions.keySet());
+        Set<MimeTypeDetectorDefinition<? extends DnaConfiguration>> results = new HashSet<MimeTypeDetectorDefinition<? extends DnaConfiguration>>();
+        for (String name : names) {
+            results.add(mimeTypeDetector(name));
+        }
+        return Collections.unmodifiableSet(results);
+    }
+
+    /**
+     * Get the list of repository source definitions.
+     * 
+     * @return the unmodifiable set of definitions; never null but possibly empty if there are no definitions
+     */
+    public Set<RepositorySourceDefinition<? extends DnaConfiguration>> repositorySources() {
+        // Get the children under the 'dna:mimeTypeDetectors' node ...
+        Set<String> names = getNamesOfComponentsUnder(DnaLexicon.SOURCES);
+        names.addAll(this.repositorySourceDefinitions.keySet());
+        Set<RepositorySourceDefinition<? extends DnaConfiguration>> results = new HashSet<RepositorySourceDefinition<? extends DnaConfiguration>>();
+        for (String name : names) {
+            results.add(repositorySource(name));
+        }
+        return Collections.unmodifiableSet(results);
+    }
+
+    /**
+     * Get the list of sequencer definitions.
+     * 
+     * @return the unmodifiable set of definitions; never null but possibly empty if there are no definitions
+     */
+    public Set<SequencerDefinition<? extends DnaConfiguration>> sequencers() {
+        // Get the children under the 'dna:mimeTypeDetectors' node ...
+        Set<String> names = getNamesOfComponentsUnder(DnaLexicon.SEQUENCERS);
+        names.addAll(this.sequencerDefinitions.keySet());
+        Set<SequencerDefinition<? extends DnaConfiguration>> results = new HashSet<SequencerDefinition<? extends DnaConfiguration>>();
+        for (String name : names) {
+            results.add(sequencer(name));
+        }
+        return Collections.unmodifiableSet(results);
+    }
+
+    /**
+     * Obtain or create a definition for the {@link MimeTypeDetector MIME type detector} with the supplied name or identifier. A
+     * new definition will be created if there currently is no MIME type detector defined with the supplied name.
+     * 
+     * @param name the name or identifier of the detector
+     * @return the details of the MIME type detector definition; never null
+     */
+    public MimeTypeDetectorDefinition<? extends DnaConfiguration> mimeTypeDetector( String name ) {
+        return mimeTypeDetectorDefinition(this, name);
+    }
+
+    /**
+     * Obtain or create a definition for the {@link RepositorySource} with the supplied name or identifier. A new definition will
+     * be created if there currently is no repository source defined with the supplied name.
+     * 
+     * @param name the name or identifier of the repository source
+     * @return the details of the repository source definition; never null
+     */
+    public RepositorySourceDefinition<? extends DnaConfiguration> repositorySource( String name ) {
+        return repositorySourceDefinition(this, name);
+    }
+
+    /**
+     * Obtain or create a definition for the {@link StreamSequencer sequencer} with the supplied name or identifier. A new
+     * definition will be created if there currently is no sequencer defined with the supplied name.
+     * 
+     * @param name the name or identifier of the sequencer
+     * @return the details of the sequencer definition; never null
+     */
+    public SequencerDefinition<? extends DnaConfiguration> sequencer( String name ) {
+        return sequencerDefinition(this, name);
+    }
+
+    /**
+     * Convenience method to make the code that sets up this configuration easier to read. This method simply returns this object.
+     * 
+     * @return this configuration component; never null
+     */
+    public DnaConfiguration and() {
+        return this;
+    }
+
+    /**
+     * Construct an engine that reflects the current state of this configuration. This method always creates a new instance.
+     * 
+     * @return the resulting engine; never null
+     */
+    public DnaEngine build() {
         save();
-        return new DnaEngine(builder.getExecutionContext(), builder.configurationSource);
+        return new DnaEngine(getExecutionContext(), getConfigurationDefinition());
     }
 
-    protected Graph graph() {
-        return builder.graph();
+    /**
+     * Interface that defines the ability to obtain the configuration component.
+     * 
+     * @param <ReturnType> the interface returned from these methods
+     */
+    public interface Returnable<ReturnType> {
+        /**
+         * Return the configuration component.
+         * 
+         * @return the configuration component; never null
+         */
+        ReturnType and();
     }
 
-    protected ConfigurationRepository configurationRepository() {
-        return builder.configurationSource;
+    /**
+     * Interface that defines the ability to remove the configuration component.
+     * 
+     * @param <ReturnType> the configuration interface returned from these methods
+     */
+    public interface Removable<ReturnType> {
+        /**
+         * Remove this configuration component.
+         * 
+         * @return the configuration; never null
+         */
+        ReturnType remove();
     }
 
-    public static class Builder<ReturnType> extends Configurator<ReturnType>
-        implements Configurator.Initializer<ReturnType>, Configurator.SequencerConfigurator<ReturnType>,
-        Configurator.RepositorySourceConfigurator<ReturnType>, Configurator.MimeDetectorConfigurator<ReturnType> {
+    /**
+     * The interface used to set a description on a component.
+     * 
+     * @param <ReturnType> the interface returned from these methods
+     */
+    public interface SetDescription<ReturnType> {
+        /**
+         * Specify the description of this component.
+         * 
+         * @param description the description; may be null or empty
+         * @return the next component to continue configuration; never null
+         */
+        ReturnType setDescription( String description );
 
-        private Path sourcesPath;
-        private Path sequencersPath;
-        private Path detectorsPath;
+        /**
+         * Get the description of this component.
+         * 
+         * @return the description, or null if there is no description
+         */
+        String getDescription();
+    }
 
+    /**
+     * Interface for configuring the JavaBean-style properties of an object.
+     * 
+     * @param <ReturnType> the interface returned after the property has been set.
+     * @author Randall Hauch
+     */
+    public interface SetProperties<ReturnType> {
         /**
-         * Specify a new {@link ExecutionContext} that should be used for this DNA instance.
+         * Set the property value to an integer.
          * 
-         * @param context the new context, or null if a default-constructed execution context should be used
-         * @param builder the builder object returned from all the methods
-         * @throws IllegalArgumentException if the supplied context reference is null
+         * @param beanPropertyName the name of the JavaBean-style property (e.g., "retryLimit")
+         * @param value the new value for the property
+         * @return the next component to continue configuration; never null
          */
-        public Builder( ExecutionContext context,
-                        ReturnType builder ) {
-            super(context, builder);
+        ReturnType setProperty( String beanPropertyName,
+                                int value );
+
+        /**
+         * Set the property value to a long number.
+         * 
+         * @param beanPropertyName the name of the JavaBean-style property (e.g., "retryLimit")
+         * @param value the new value for the property
+         * @return the next component to continue configuration; never null
+         */
+        ReturnType setProperty( String beanPropertyName,
+                                long value );
+
+        /**
+         * Set the property value to a short.
+         * 
+         * @param beanPropertyName the name of the JavaBean-style property (e.g., "retryLimit")
+         * @param value the new value for the property
+         * @return the next component to continue configuration; never null
+         */
+        ReturnType setProperty( String beanPropertyName,
+                                short value );
+
+        /**
+         * Set the property value to a boolean.
+         * 
+         * @param beanPropertyName the name of the JavaBean-style property (e.g., "retryLimit")
+         * @param value the new value for the property
+         * @return the next component to continue configuration; never null
+         */
+        ReturnType setProperty( String beanPropertyName,
+                                boolean value );
+
+        /**
+         * Set the property value to a float.
+         * 
+         * @param beanPropertyName the name of the JavaBean-style property (e.g., "retryLimit")
+         * @param value the new value for the property
+         * @return the next component to continue configuration; never null
+         */
+        ReturnType setProperty( String beanPropertyName,
+                                float value );
+
+        /**
+         * Set the property value to a double.
+         * 
+         * @param beanPropertyName the name of the JavaBean-style property (e.g., "retryLimit")
+         * @param value the new value for the property
+         * @return the next component to continue configuration; never null
+         */
+        ReturnType setProperty( String beanPropertyName,
+                                double value );
+
+        /**
+         * Set the property value to a string.
+         * 
+         * @param beanPropertyName the name of the JavaBean-style property (e.g., "retryLimit")
+         * @param value the new value for the property
+         * @return the next component to continue configuration; never null
+         */
+        ReturnType setProperty( String beanPropertyName,
+                                String value );
+
+        /**
+         * Set the property value to an object.
+         * 
+         * @param beanPropertyName the name of the JavaBean-style property (e.g., "retryLimit")
+         * @param value the new value for the property
+         * @return the next component to continue configuration; never null
+         */
+        ReturnType setProperty( String beanPropertyName,
+                                Object value );
+
+        /**
+         * Set the property values to an object.
+         * 
+         * @param beanPropertyName the name of the JavaBean-style property (e.g., "retryLimit")
+         * @param values the array of new values for the property
+         * @return the next component to continue configuration; never null
+         */
+        ReturnType setProperty( String beanPropertyName,
+                                Object[] values );
+
+        /**
+         * Get the property.
+         * 
+         * @param beanPropertyName the name of the JavaBean-style property (e.g., "retryLimit")
+         * @return the property object, or null if there is no such property
+         */
+        Property getProperty( String beanPropertyName );
+    }
+
+    /**
+     * The interface used to configure the class used for a component.
+     * 
+     * @param <ComponentClassType> the class or interface that the component is to implement
+     * @param <ReturnType> the interface returned from these methods
+     */
+    public interface ChooseClass<ComponentClassType, ReturnType> {
+
+        /**
+         * Specify the name of the class that should be instantiated for the instance. The classpath information will need to be
+         * defined using the returned interface.
+         * 
+         * @param classname the name of the class that should be instantiated
+         * @return the interface used to define the classpath information; never null
+         * @throws IllegalArgumentException if the class name is null, empty, blank, or not a valid class name
+         */
+        LoadedFrom<ReturnType> usingClass( String classname );
+
+        /**
+         * Specify the class that should be instantiated for the instance. Because the class is already available to this class
+         * loader, there is no need to specify the classloader information.
+         * 
+         * @param clazz the class that should be instantiated
+         * @return the next component to continue configuration; never null
+         * @throws DnaConfigurationException if the class could not be accessed and instantiated (if needed)
+         * @throws IllegalArgumentException if the class reference is null
+         */
+        ReturnType usingClass( Class<? extends ComponentClassType> clazz );
+    }
+
+    /**
+     * Interface for specifying from where the component's class is to be loaded.
+     * 
+     * @param <ReturnType> the interface returned from these methods
+     */
+    public interface LoadedFrom<ReturnType> {
+        /**
+         * Specify the names of the classloaders that form the classpath for the component, from which the component's class (and
+         * its dependencies) can be loaded. The names correspond to the names supplied to the
+         * {@link ExecutionContext#getClassLoader(String...)} methods.
+         * 
+         * @param classPathNames the names for the classloaders, as passed to the {@link ClassLoaderFactory} implementation (e.g.,
+         *        the {@link ExecutionContext}).
+         * @return the next component to continue configuration; never null
+         * @see #loadedFromClasspath()
+         * @see ExecutionContext#getClassLoader(String...)
+         */
+        ReturnType loadedFrom( String... classPathNames );
+
+        /**
+         * Specify that the component (and its dependencies) will be found on the current (or
+         * {@link Thread#getContextClassLoader() current context}) classloader.
+         * 
+         * @return the next component to continue configuration; never null
+         * @see #loadedFrom(String...)
+         * @see ExecutionContext#getClassLoader(String...)
+         */
+        ReturnType loadedFromClasspath();
+    }
+
+    /**
+     * Interface for a component that has a name.
+     */
+    public interface HasName {
+        /**
+         * Get the name.
+         * 
+         * @return the name; never null
+         */
+        String getName();
+    }
+
+    /**
+     * Interface used to set up and define a MIME type detector instance.
+     * 
+     * @param <ReturnType> the type of the configuration component that owns this definition object
+     */
+    public interface MimeTypeDetectorDefinition<ReturnType>
+        extends Returnable<ReturnType>, SetDescription<MimeTypeDetectorDefinition<ReturnType>>,
+        SetProperties<MimeTypeDetectorDefinition<ReturnType>>,
+        ChooseClass<MimeTypeDetector, MimeTypeDetectorDefinition<ReturnType>>, Removable<ReturnType> {
+    }
+
+    /**
+     * Interface used to set up and define a RepositorySource instance.
+     * 
+     * @param <ReturnType> the type of the configuration component that owns this definition object
+     */
+    public interface RepositorySourceDefinition<ReturnType>
+        extends Returnable<ReturnType>, SetDescription<RepositorySourceDefinition<ReturnType>>,
+        SetProperties<RepositorySourceDefinition<ReturnType>>,
+        ChooseClass<RepositorySource, RepositorySourceDefinition<ReturnType>>, Removable<ReturnType>, HasName {
+
+        /**
+         * Set the retry limit on the repository source. This is equivalent to calling {@link #setProperty(String, int)} with "
+         * {@link DnaLexicon#RETRY_LIMIT dna:retryLimit}" as the property name.
+         * 
+         * @param retryLimit the retry limit
+         * @return this definition, for method chaining purposes
+         * @see RepositorySource#setRetryLimit(int)
+         */
+        RepositorySourceDefinition<ReturnType> setRetryLimit( int retryLimit );
+    }
+
+    /**
+     * Interface used to set up and define a {@link StreamSequencer sequencer} instance.
+     * 
+     * @param <ReturnType> the type of the configuration component that owns this definition object
+     */
+    public interface SequencerDefinition<ReturnType>
+        extends Returnable<ReturnType>, SetDescription<SequencerDefinition<ReturnType>>,
+        SetProperties<SequencerDefinition<ReturnType>>, ChooseClass<StreamSequencer, SequencerDefinition<ReturnType>>,
+        Removable<ReturnType> {
+
+        /**
+         * Specify the input {@link PathExpression path expression} represented as a string, which determines when this sequencer
+         * will be executed.
+         * 
+         * @param inputPathExpression the path expression for nodes that, when they change, will be passed as an input to the
+         *        sequencer
+         * @return the interface used to specify the output path expression; never null
+         */
+        PathExpressionOutput<ReturnType> sequencingFrom( String inputPathExpression );
+
+        /**
+         * Specify the input {@link PathExpression path expression}, which determines when this sequencer will be executed.
+         * 
+         * @param inputPathExpression the path expression for nodes that, when they change, will be passed as an input to the
+         *        sequencer
+         * @return the interface used to continue specifying the configuration of the sequencer
+         */
+        SequencerDefinition<ReturnType> sequencingFrom( PathExpression inputPathExpression );
+
+        /**
+         * Get the path expressions from the saved configuration.
+         * 
+         * @return the set of path expressions; never null but possibly empty
+         */
+        Set<PathExpression> getPathExpressions();
+    }
+
+    /**
+     * Interface used to specify the output path expression for a
+     * {@link DnaConfiguration.SequencerDefinition#sequencingFrom(PathExpression) sequencer configuration}.
+     * 
+     * @param <ReturnType>
+     */
+    public interface PathExpressionOutput<ReturnType> {
+        /**
+         * Specify the output {@link PathExpression path expression}, which determines where this sequencer's output will be
+         * placed.
+         * 
+         * @param outputExpression the path expression for the location(s) where output generated by the sequencer is to be placed
+         * @return the interface used to continue specifying the configuration of the sequencer
+         */
+        SequencerDefinition<ReturnType> andOutputtingTo( String outputExpression );
+    }
+
+    /**
+     * Utility method to construct a definition object for the detector with the supplied name and return type.
+     * 
+     * @param <ReturnType> the type of the return object
+     * @param returnObject the return object
+     * @param name the name of the detector
+     * @return the definition for the detector
+     */
+    @SuppressWarnings( "unchecked" )
+    protected <ReturnType extends DnaConfiguration> MimeTypeDetectorDefinition<ReturnType> mimeTypeDetectorDefinition( ReturnType returnObject,
+                                                                                                                       String name ) {
+        MimeTypeDetectorDefinition<ReturnType> definition = (MimeTypeDetectorDefinition<ReturnType>)mimeTypeDetectorDefinitions.get(name);
+        if (definition == null) {
+            definition = new MimeTypeDetectorBuilder<ReturnType>(returnObject, changes(), path(), DnaLexicon.MIME_TYPE_DETECTORS,
+                                                                 name(name));
+            mimeTypeDetectorDefinitions.put(name, definition);
         }
+        return definition;
+    }
 
-        public DnaEngine buildDnaEngine() {
-            return new DnaEngine(context, configurationSource);
+    /**
+     * Utility method to construct a definition object for the repository source with the supplied name and return type.
+     * 
+     * @param <ReturnType> the type of the return object
+     * @param returnObject the return object
+     * @param name the name of the repository source
+     * @return the definition for the repository source
+     */
+    @SuppressWarnings( "unchecked" )
+    protected <ReturnType extends DnaConfiguration> RepositorySourceDefinition<ReturnType> repositorySourceDefinition( ReturnType returnObject,
+                                                                                                                       String name ) {
+        RepositorySourceDefinition<ReturnType> definition = (RepositorySourceDefinition<ReturnType>)repositorySourceDefinitions.get(name);
+        if (definition == null) {
+            definition = new SourceBuilder<ReturnType>(returnObject, changes(), path(), DnaLexicon.SOURCES, name(name));
+            repositorySourceDefinitions.put(name, definition);
         }
+        return definition;
+    }
 
-        protected Path sourcesPath() {
-            // Make sure the "dna:sources" node is there
-            if (sourcesPath == null) {
-                Path path = pathFactory().create(this.configurationSource.getPath(), DnaLexicon.SOURCES);
-                Node node = graph().createIfMissing(path).andReturn();
-                this.sourcesPath = node.getLocation().getPath();
+    /**
+     * Utility method to construct a definition object for the sequencer with the supplied name and return type.
+     * 
+     * @param <ReturnType> the type of the return object
+     * @param returnObject the return object
+     * @param name the name of the sequencer
+     * @return the definition for the sequencer
+     */
+    @SuppressWarnings( "unchecked" )
+    protected <ReturnType extends DnaConfiguration> SequencerDefinition<ReturnType> sequencerDefinition( ReturnType returnObject,
+                                                                                                         String name ) {
+        SequencerDefinition<ReturnType> definition = (SequencerDefinition<ReturnType>)sequencerDefinitions.get(name);
+        if (definition == null) {
+            definition = new SequencerBuilder<ReturnType>(returnObject, changes(), path(), DnaLexicon.SEQUENCERS, name(name));
+            sequencerDefinitions.put(name, definition);
+        }
+        return definition;
+    }
+
+    protected static class BaseReturnable<ReturnType> implements Returnable<ReturnType> {
+        protected final ReturnType returnObject;
+
+        protected BaseReturnable( ReturnType returnObject ) {
+            this.returnObject = returnObject;
+        }
+
+        /**
+         * {@inheritDoc}
+         * 
+         * @see org.jboss.dna.repository.DnaConfiguration.Returnable#and()
+         */
+        public ReturnType and() {
+            return returnObject;
+        }
+    }
+
+    /**
+     * Base class for {@link Returnable} types that work on a node in the graph.
+     * 
+     * @param <ReturnType> the type to be returned
+     * @param <ThisType> the type to be returned by the set properties, set description, etc. methods
+     */
+    protected static abstract class GraphReturnable<ReturnType, ThisType> extends BaseReturnable<ReturnType>
+        implements SetDescription<ThisType>, SetProperties<ThisType>, Removable<ReturnType> {
+        protected final ExecutionContext context;
+        protected final Graph.Batch batch;
+        protected final Path path;
+        private Map<Name, Property> properties = new HashMap<Name, Property>();
+
+        protected GraphReturnable( ReturnType returnObject,
+                                   Graph.Batch batch,
+                                   Path path,
+                                   Name... names ) {
+            super(returnObject);
+            assert batch != null;
+            assert path != null;
+            assert names.length > 0;
+            this.context = batch.getGraph().getContext();
+            this.batch = batch;
+            // Make sure there are nodes down to the supplied path ...
+            createIfMissing(path, names).and();
+            this.path = context.getValueFactories().getPathFactory().create(path, names);
+            try {
+                properties = batch.getGraph().getPropertiesByName().on(this.path);
+            } catch (PathNotFoundException e) {
+                // The node doesn't exist yet (wasn't yet saved)
+                properties = new HashMap<Name, Property>();
             }
-            return this.sourcesPath;
         }
 
-        protected Path sequencersPath() {
-            // Make sure the "dna:sequencers" node is there
-            if (sequencersPath == null) {
-                Path path = pathFactory().create(this.configurationSource.getPath(), DnaLexicon.SEQUENCERS);
-                Node node = graph().createIfMissing(path).andReturn();
-                this.sequencersPath = node.getLocation().getPath();
+        /**
+         * Create the node at the supplied path under the current path, and return the Create operation for the last node created.
+         * The caller <i>must</i> call {@link Graph.Create#and()} to complete the operation.
+         * 
+         * @param child the name of the child
+         * @param segments the segments in the remainder of the path
+         * @return the newly-created but incomplete operation
+         */
+        protected Graph.Create<Graph.Batch> createIfMissing( Name child,
+                                                             String... segments ) {
+            Path nodePath = context.getValueFactories().getPathFactory().create(path, child);
+            Graph.Create<Graph.Batch> result = batch.createIfMissing(nodePath);
+            for (String name : segments) {
+                result.and();
+                nodePath = context.getValueFactories().getPathFactory().create(nodePath, name);
+                result = batch.createIfMissing(nodePath);
             }
-            return this.sequencersPath;
+            return result;
         }
 
-        protected Path detectorsPath() {
-            // Make sure the "dna:mimeTypeDetectors" node is there
-            if (detectorsPath == null) {
-                Path path = pathFactory().create(this.configurationSource.getPath(), DnaLexicon.MIME_TYPE_DETECTORS);
-                Node node = graph().createIfMissing(path).andReturn();
-                this.detectorsPath = node.getLocation().getPath();
+        /**
+         * Create the node at the supplied path under the current path, and return the Create operation for the last node created.
+         * The caller <i>must</i> call {@link Graph.Create#and()} to complete the operation.
+         * 
+         * @param segment the name segment for the child
+         * @return the newly-created but incomplete operation
+         */
+        protected Graph.Create<Graph.Batch> createIfMissing( Name segment ) {
+            Path nodePath = context.getValueFactories().getPathFactory().create(path, segment);
+            Graph.Create<Graph.Batch> result = batch.createIfMissing(nodePath);
+            return result;
+        }
+
+        /**
+         * Create the node at the supplied path under the current path, and return the Create operation for the last node created.
+         * The caller <i>must</i> call {@link Graph.Create#and()} to complete the operation.
+         * 
+         * @param path the path to the node
+         * @param segments the segments in the remainder of the path
+         * @return the newly-created but incomplete operation
+         */
+        protected Graph.Create<Graph.Batch> createIfMissing( Path path,
+                                                             Name... segments ) {
+            Path nodePath = path;
+            Graph.Create<Graph.Batch> result = null;
+            for (Name name : segments) {
+                if (result != null) result.and();
+                nodePath = context.getValueFactories().getPathFactory().create(nodePath, name);
+                result = batch.createIfMissing(nodePath);
             }
-            return this.detectorsPath;
+            return result;
         }
 
+        protected Path subpath( Name... segments ) {
+            return context.getValueFactories().getPathFactory().create(path, segments);
+        }
+
+        protected abstract ThisType thisType();
+
+        public String getName() {
+            return path.getLastSegment().getName().getString(context.getNamespaceRegistry());
+        }
+
+        public ThisType setDescription( String description ) {
+            return setProperty(DnaLexicon.DESCRIPTION, description);
+        }
+
+        public String getDescription() {
+            Property property = getProperty(DnaLexicon.DESCRIPTION);
+            if (property != null && !property.isEmpty()) {
+                return context.getValueFactories().getStringFactory().create(property.getFirstValue());
+            }
+            return null;
+        }
+
+        protected ThisType setProperty( Name propertyName,
+                                        Object value ) {
+            // Set the property via the batch ...
+            batch.set(propertyName).on(path).to(value).and();
+            // Record that we changed this property ...
+            properties.put(propertyName, context.getPropertyFactory().create(propertyName, value));
+            return thisType();
+        }
+
+        public ThisType setProperty( String propertyName,
+                                     Object value ) {
+            return setProperty(context.getValueFactories().getNameFactory().create(propertyName), value);
+        }
+
+        public ThisType setProperty( Name propertyName,
+                                     Object[] values ) {
+            // Set the property via the batch ...
+            batch.set(propertyName).on(path).to(values).and();
+            // Record that we changed this property ...
+            properties.put(propertyName, context.getPropertyFactory().create(propertyName, values));
+            return thisType();
+        }
+
+        public ThisType setProperty( String propertyName,
+                                     Object[] values ) {
+            return setProperty(context.getValueFactories().getNameFactory().create(propertyName), values);
+        }
+
+        public ThisType setProperty( String beanPropertyName,
+                                     boolean value ) {
+            return setProperty(beanPropertyName, (Object)value);
+        }
+
+        public ThisType setProperty( String beanPropertyName,
+                                     int value ) {
+            return setProperty(beanPropertyName, (Object)value);
+        }
+
+        public ThisType setProperty( String beanPropertyName,
+                                     short value ) {
+            return setProperty(beanPropertyName, (Object)value);
+        }
+
+        public ThisType setProperty( String beanPropertyName,
+                                     long value ) {
+            return setProperty(beanPropertyName, (Object)value);
+        }
+
+        public ThisType setProperty( String beanPropertyName,
+                                     double value ) {
+            return setProperty(beanPropertyName, (Object)value);
+        }
+
+        public ThisType setProperty( String beanPropertyName,
+                                     float value ) {
+            return setProperty(beanPropertyName, (Object)value);
+        }
+
+        public ThisType setProperty( String beanPropertyName,
+                                     String value ) {
+            return setProperty(beanPropertyName, (Object)value);
+        }
+
+        public Property getProperty( String beanPropertyName ) {
+            return properties.get(context.getValueFactories().getNameFactory().create(beanPropertyName));
+        }
+
+        public Property getProperty( Name beanPropertyName ) {
+            return properties.get(beanPropertyName);
+        }
+
+        public ReturnType remove() {
+            batch.delete(path);
+            properties.clear();
+            return and();
+        }
+    }
+
+    /**
+     * Base class for {@link Returnable} types that work on a node in the graph.
+     * 
+     * @param <ReturnType> the type to be returned
+     * @param <ThisType> the type to be returned by the set properties, set description, etc. methods
+     * @param <ComponentType> the type of the component being configured
+     */
+    protected static abstract class GraphComponentBuilder<ReturnType, ThisType, ComponentType>
+        extends GraphReturnable<ReturnType, ThisType> implements ChooseClass<ComponentType, ThisType> {
+        protected GraphComponentBuilder( ReturnType returnObject,
+                                         Graph.Batch batch,
+                                         Path path,
+                                         Name... names ) {
+            super(returnObject, batch, path, names);
+        }
+
+        public LoadedFrom<ThisType> usingClass( final String classname ) {
+            return new LoadedFrom<ThisType>() {
+                public ThisType loadedFromClasspath() {
+                    return setProperty(DnaLexicon.CLASSNAME, classname);
+                }
+
+                public ThisType loadedFrom( String... classpath ) {
+                    List<String> classpaths = new ArrayList<String>();
+                    // Ignore any null, zero-length, or duplicate elements ...
+                    for (String value : classpath) {
+                        if (value == null) continue;
+                        value = value.trim();
+                        if (value.length() == 0) continue;
+                        if (!classpaths.contains(value)) classpaths.add(value);
+                    }
+                    if (classpaths.size() != 0) {
+                        classpath = classpaths.toArray(new String[classpaths.size()]);
+                        setProperty(DnaLexicon.CLASSPATH, classpath);
+                    }
+                    return setProperty(DnaLexicon.CLASSNAME, classname);
+                }
+            };
+        }
+
+        public ThisType usingClass( Class<? extends ComponentType> componentClass ) {
+            return setProperty(DnaLexicon.CLASSNAME, componentClass.getCanonicalName());
+        }
+    }
+
+    protected static class MimeTypeDetectorBuilder<ReturnType>
+        extends GraphComponentBuilder<ReturnType, MimeTypeDetectorDefinition<ReturnType>, MimeTypeDetector>
+        implements MimeTypeDetectorDefinition<ReturnType> {
+        protected MimeTypeDetectorBuilder( ReturnType returnObject,
+                                           Graph.Batch batch,
+                                           Path path,
+                                           Name... names ) {
+            super(returnObject, batch, path, names);
+        }
+
+        @Override
+        protected MimeTypeDetectorBuilder<ReturnType> thisType() {
+            return this;
+        }
+
+    }
+
+    protected static class SourceBuilder<ReturnType>
+        extends GraphComponentBuilder<ReturnType, RepositorySourceDefinition<ReturnType>, RepositorySource>
+        implements RepositorySourceDefinition<ReturnType> {
+        protected SourceBuilder( ReturnType returnObject,
+                                 Graph.Batch batch,
+                                 Path path,
+                                 Name... names ) {
+            super(returnObject, batch, path, names);
+        }
+
+        @Override
+        protected RepositorySourceDefinition<ReturnType> thisType() {
+            return this;
+        }
+
+        public RepositorySourceDefinition<ReturnType> setRetryLimit( int retryLimit ) {
+            return setProperty(DnaLexicon.RETRY_LIMIT, retryLimit);
+        }
+
+        @Override
+        public RepositorySourceDefinition<ReturnType> setProperty( String propertyName,
+                                                                   Object value ) {
+            Name name = context.getValueFactories().getNameFactory().create(propertyName);
+            // Check the "standard" names that should be prefixed with 'dna:'
+            if (name.getLocalName().equals(DnaLexicon.RETRY_LIMIT.getLocalName())) name = DnaLexicon.RETRY_LIMIT;
+            if (name.getLocalName().equals(DnaLexicon.DESCRIPTION.getLocalName())) name = DnaLexicon.DESCRIPTION;
+            return super.setProperty(name, value);
+        }
+
+        @Override
+        public Property getProperty( Name name ) {
+            // Check the "standard" names that should be prefixed with 'dna:'
+            if (name.getLocalName().equals(DnaLexicon.RETRY_LIMIT.getLocalName())) name = DnaLexicon.RETRY_LIMIT;
+            if (name.getLocalName().equals(DnaLexicon.DESCRIPTION.getLocalName())) name = DnaLexicon.DESCRIPTION;
+            return super.getProperty(name);
+        }
+    }
+
+    protected static class SequencerBuilder<ReturnType>
+        extends GraphComponentBuilder<ReturnType, SequencerDefinition<ReturnType>, StreamSequencer>
+        implements SequencerDefinition<ReturnType> {
+
+        protected SequencerBuilder( ReturnType returnObject,
+                                    Graph.Batch batch,
+                                    Path path,
+                                    Name... names ) {
+            super(returnObject, batch, path, names);
+        }
+
+        @Override
+        protected SequencerDefinition<ReturnType> thisType() {
+            return this;
+        }
+
+        public Set<PathExpression> getPathExpressions() {
+            Set<PathExpression> expressions = new HashSet<PathExpression>();
+            try {
+                Property existingExpressions = getProperty(DnaLexicon.PATH_EXPRESSION);
+                if (existingExpressions != null) {
+                    for (Object existing : existingExpressions.getValuesAsArray()) {
+                        String existingExpression = context.getValueFactories().getStringFactory().create(existing);
+                        expressions.add(PathExpression.compile(existingExpression));
+                    }
+                }
+            } catch (PathNotFoundException e) {
+                // Nothing saved yet ...
+            }
+            return expressions;
+        }
+
+        public SequencerDefinition<ReturnType> sequencingFrom( PathExpression expression ) {
+            CheckArg.isNotNull(expression, "expression");
+            Set<PathExpression> compiledExpressions = getPathExpressions();
+            compiledExpressions.add(expression);
+            String[] strings = new String[compiledExpressions.size()];
+            int index = 0;
+            for (PathExpression compiledExpression : compiledExpressions) {
+                strings[index++] = compiledExpression.getExpression();
+            }
+            setProperty(DnaLexicon.PATH_EXPRESSION, strings);
+            return this;
+        }
+
+        public PathExpressionOutput<ReturnType> sequencingFrom( final String fromPathExpression ) {
+            CheckArg.isNotEmpty(fromPathExpression, "fromPathExpression");
+            return new PathExpressionOutput<ReturnType>() {
+                public SequencerDefinition<ReturnType> andOutputtingTo( String into ) {
+                    CheckArg.isNotEmpty(into, "into");
+                    return sequencingFrom(PathExpression.compile(fromPathExpression + " => " + into));
+                }
+            };
+        }
+    }
+
+    /**
+     * Representation of the current configuration content.
+     */
+    @Immutable
+    public static class ConfigurationDefinition {
+        private final ClassLoaderFactory classLoaderFactory;
+        private final RepositorySource source;
+        private final Path path;
+        private final String workspace;
+        private final ExecutionContext context;
+        private Graph graph;
+
+        protected ConfigurationDefinition( RepositorySource source,
+                                           String workspace,
+                                           Path path,
+                                           ExecutionContext context,
+                                           ClassLoaderFactory classLoaderFactory ) {
+            this.source = source;
+            this.path = path != null ? path : RootPath.INSTANCE;
+            this.workspace = workspace;
+            this.context = context;
+            this.classLoaderFactory = classLoaderFactory != null ? classLoaderFactory : new StandardClassLoaderFactory();
+        }
+
         /**
-         * {@inheritDoc}
+         * Get the repository source where the configuration content may be found
          * 
-         * @see org.jboss.dna.repository.Configurator.Initializer#withConfigurationSource()
+         * @return the source for the configuration repository; never null
          */
-        public ChooseClass<RepositorySource, ConfigSourceDetails<ReturnType>> withConfigurationSource() {
-            return new ConfigurationRepositoryClassChooser<ReturnType>(builder);
+        public RepositorySource getRepositorySource() {
+            return source;
         }
-        
+
         /**
-         * {@inheritDoc}
-         *
-         * @see org.jboss.dna.repository.Configurator.Initializer#configurationSource()
+         * Get the path in the configuration repository where the configuration content may be found
+         * 
+         * @return the path to the configuration content; never null
          */
-        public ConfigSourceDetails<ReturnType> configurationSource() {
-            return configurationSource;
+        public Path getPath() {
+            return path;
         }
 
         /**
-         * {@inheritDoc}
+         * Get the name of the workspace used for the configuration repository.
          * 
-         * @see org.jboss.dna.repository.Configurator.SequencerConfigurator#addSequencer(java.lang.String)
+         * @return the name of the workspace, or null if the default workspace should be used
          */
-        public ChooseClass<StreamSequencer, SequencerDetails<ReturnType>> addSequencer( String id ) {
-            CheckArg.isNotEmpty(id, "id");
-            // Now create the "dna:sequencer" node with the supplied id ...
-            Path path = createOrReplaceNode(sequencersPath(), id, DnaLexicon.READABLE_NAME, id);
-            SequencerDetails<ReturnType> details = new GraphSequencerDetails<ReturnType>(path, builder);
-            return new ClassChooser<StreamSequencer, SequencerDetails<ReturnType>>(path, details);
+        public String getWorkspace() {
+            return workspace;
         }
 
         /**
-         * {@inheritDoc}
+         * @return context
+         */
+        public ExecutionContext getContext() {
+            return context;
+        }
+
+        /**
+         * @return classLoaderFactory
+         */
+        public ClassLoaderFactory getClassLoaderFactory() {
+            return classLoaderFactory;
+        }
+
+        /**
+         * Return a copy of this configuration that uses the supplied path instead of this object's {@link #getPath() path}.
          * 
-         * @see org.jboss.dna.repository.Configurator.RepositorySourceConfigurator#addSource(java.lang.String)
+         * @param path the desired path for the new configuration; if null, then "/" is used
+         * @return the new configuration
          */
-        public ChooseClass<RepositorySource, RepositorySourceDetails<ReturnType>> addSource( String id ) {
-            CheckArg.isNotEmpty(id, "id");
-            // Now create the "dna:source" node with the supplied id ...
-            Path path = createOrReplaceNode(sourcesPath(), id, DnaLexicon.READABLE_NAME, id);
-            RepositorySourceDetails<ReturnType> details = new GraphRepositorySourceDetails<ReturnType>(path, builder);
-            return new ClassChooser<RepositorySource, RepositorySourceDetails<ReturnType>>(path, details);
+        public ConfigurationDefinition with( Path path ) {
+            return new ConfigurationDefinition(source, workspace, path, context, classLoaderFactory);
         }
 
         /**
-         * {@inheritDoc}
+         * Return a copy of this configuration that uses the supplied workspace name instead of this object's
+         * {@link #getWorkspace() workspace}.
          * 
-         * @see org.jboss.dna.repository.Configurator.RepositorySourceConfigurator#addSource(org.jboss.dna.graph.connector.RepositorySource)
+         * @param workspace the desired workspace name for the new configuration; if null, then the default workspace will be used
+         * @return the new configuration
          */
-        public ReturnType addSource( RepositorySource source ) {
-            CheckArg.isNotNull(source, "source");
-            CheckArg.isNotEmpty(source.getName(), "source.getName()");
-            String name = source.getName();
-            RepositorySourceDetails<ReturnType> details = addSource(source.getName()).usingClass(source.getClass().getName())
-                                                                                     .loadedFromClasspath();
-            // Record all of the bean properties ...
-            Path sourcePath = pathFactory().create(sourcesPath(), name);
-            recordBeanPropertiesInGraph(sourcePath, source);
-            return details.and();
+        public ConfigurationDefinition withWorkspace( String workspace ) {
+            return new ConfigurationDefinition(source, workspace, path, context, classLoaderFactory);
         }
 
         /**
-         * {@inheritDoc}
+         * Return a copy of this configuration that uses the supplied class loader factory instead of this object's
+         * {@link #getClassLoaderFactory() class loader factory}.
          * 
-         * @see org.jboss.dna.repository.Configurator.MimeDetectorConfigurator#addMimeTypeDetector(java.lang.String)
+         * @param classLoaderFactory the classloader factory, or null if the default factory should be used
+         * @return the new configuration
          */
-        public ChooseClass<MimeTypeDetector, MimeTypeDetectorDetails<ReturnType>> addMimeTypeDetector( String id ) {
-            CheckArg.isNotEmpty(id, "id");
-            // Now create the "dna:sequencer" node with the supplied id ...
-            Path detectorPath = createOrReplaceNode(detectorsPath(), id, DnaLexicon.READABLE_NAME, id);
-            MimeTypeDetectorDetails<ReturnType> details = new GraphMimeTypeDetectorDetails<ReturnType>(detectorPath, builder);
-            return new ClassChooser<MimeTypeDetector, MimeTypeDetectorDetails<ReturnType>>(detectorPath, details);
+        public ConfigurationDefinition with( ClassLoaderFactory classLoaderFactory ) {
+            return new ConfigurationDefinition(source, workspace, path, context, classLoaderFactory);
         }
 
         /**
-         * {@inheritDoc}
+         * Obtain a graph to this configuration repository. This method will always return the same graph instance.
          * 
-         * @see org.jboss.dna.repository.Configurator#nameFor(java.lang.String)
+         * @return the graph; never null
          */
-        @Override
-        protected Name nameFor( String name ) {
-            Name result = NAMES_TO_MAP.get(name);
-            if (result == null) result = context.getValueFactories().getNameFactory().create(name);
-            return result;
+        public Graph graph() {
+            if (graph == null) {
+                graph = Graph.create(source, context);
+                if (workspace != null) graph.useWorkspace(workspace);
+            }
+            return graph;
         }
     }
-
 }

Modified: trunk/dna-repository/src/main/java/org/jboss/dna/repository/DnaEngine.java
===================================================================
--- trunk/dna-repository/src/main/java/org/jboss/dna/repository/DnaEngine.java	2009-06-03 20:09:11 UTC (rev 968)
+++ trunk/dna-repository/src/main/java/org/jboss/dna/repository/DnaEngine.java	2009-06-03 20:10:19 UTC (rev 969)
@@ -33,6 +33,7 @@
 import net.jcip.annotations.Immutable;
 import org.jboss.dna.common.collection.Problems;
 import org.jboss.dna.common.collection.SimpleProblems;
+import org.jboss.dna.common.util.CheckArg;
 import org.jboss.dna.graph.ExecutionContext;
 import org.jboss.dna.graph.Graph;
 import org.jboss.dna.graph.JcrLexicon;
@@ -67,10 +68,10 @@
 
     public static final String CONFIGURATION_REPOSITORY_NAME = "dna:configuration";
 
-    private final Configurator.ConfigurationRepository configuration;
+    protected final DnaConfiguration.ConfigurationDefinition configuration;
     private final ConfigurationScanner scanner;
     private final Problems problems;
-    private final ExecutionContext context;
+    protected final ExecutionContext context;
 
     private final RepositoryService repositoryService;
     private final SequencingService sequencingService;
@@ -79,8 +80,8 @@
 
     private final RepositoryConnectionFactory connectionFactory;
 
-    DnaEngine( ExecutionContext context,
-               Configurator.ConfigurationRepository configuration ) {
+    protected DnaEngine( ExecutionContext context,
+                         DnaConfiguration.ConfigurationDefinition configuration ) {
         this.problems = new SimpleProblems();
 
         // Use the configuration's context ...
@@ -119,7 +120,7 @@
         connectionFactory = new RepositoryConnectionFactory() {
             public RepositoryConnection createConnection( String sourceName ) throws RepositorySourceException {
                 RepositorySource source = DnaEngine.this.getRepositorySource(sourceName);
-                if (sourceName == null) {
+                if (source == null) {
                     throw new RepositorySourceException(sourceName);
                 }
 
@@ -151,8 +152,10 @@
      * 
      * @param repositoryName the name of the repository source
      * @return the source, or null if no source with the given name exists
+     * @throws IllegalStateException if this engine was not {@link #start() started}
      */
     public final RepositorySource getRepositorySource( String repositoryName ) {
+        checkRunning();
         return repositoryService.getRepositoryLibrary().getSource(repositoryName);
     }
 
@@ -160,8 +163,10 @@
      * Get a factory of connections, backed by the RepositorySor
      * 
      * @return the connection factory; never null
+     * @throws IllegalStateException if this engine was not {@link #start() started}
      */
     public final RepositoryConnectionFactory getRepositoryConnectionFactory() {
+        checkRunning();
         return connectionFactory;
     }
 
@@ -169,17 +174,41 @@
      * Get the repository service.
      * 
      * @return the repository service owned by this engine; never null
+     * @throws IllegalStateException if this engine was not {@link #start() started}
      */
     public final RepositoryService getRepositoryService() {
+        checkRunning();
         return repositoryService;
     }
 
     /**
+     * Get a graph to the underlying source.
+     * 
+     * @param sourceName the name of the source
+     * @return the graph
+     * @throws IllegalArgumentException if the source name is null
+     * @throws RepositorySourceException if a source with the supplied name does not exist
+     * @throws IllegalStateException if this engine was not {@link #start() started}
+     */
+    public final Graph getGraph( String sourceName ) {
+        CheckArg.isNotNull(sourceName, "sourceName");
+        checkRunning();
+        Graph graph = Graph.create(sourceName, getRepositoryService().getRepositoryLibrary(), getExecutionContext());
+        if (configuration.getRepositorySource().getName().equals(sourceName) && configuration.getWorkspace() != null) {
+            // set the workspace ...
+            graph.useWorkspace(configuration.getWorkspace());
+        }
+        return graph;
+    }
+
+    /**
      * Get the sequencing service.
      * 
      * @return the sequencing service owned by this engine; never null
+     * @throws IllegalStateException if this engine was not {@link #start() started}
      */
     public final SequencingService getSequencingService() {
+        checkRunning();
         return sequencingService;
     }
 
@@ -187,11 +216,20 @@
      * Return the component that is able to detect MIME types given the name of a stream and a stream.
      * 
      * @return the MIME type detector used by this engine; never null
+     * @throws IllegalStateException if this engine was not {@link #start() started}
      */
     protected final MimeTypeDetector getMimeTypeDetector() {
+        checkRunning();
         return detectors;
     }
 
+    protected final boolean checkRunning() {
+        if (repositoryService.getAdministrator().isStarted() && sequencingService.getAdministrator().isStarted()) {
+            return true;
+        }
+        throw new IllegalStateException(RepositoryI18n.engineIsNotRunning.text());
+    }
+
     /*
      * Lifecycle methods
      */
@@ -249,17 +287,30 @@
     }
 
     /**
+     * Get a graph to the configuration content.
+     * 
+     * @return a graph to the configuration content
+     */
+    protected Graph getConfigurationGraph() {
+        Graph result = Graph.create(configuration.getRepositorySource(), context);
+        if (configuration.getWorkspace() != null) {
+            result.useWorkspace(configuration.getWorkspace());
+        }
+        return result;
+    }
+
+    /**
      * The component responsible for reading the configuration repository and (eventually) for propagating changes in the
      * configuration repository into the services.
      */
     protected class ConfigurationScanner {
         private final Problems problems;
         private final ExecutionContext context;
-        private final Configurator.ConfigurationRepository configurationRepository;
+        private final DnaConfiguration.ConfigurationDefinition configurationRepository;
 
         protected ConfigurationScanner( Problems problems,
                                         ExecutionContext context,
-                                        Configurator.ConfigurationRepository configurationRepository ) {
+                                        DnaConfiguration.ConfigurationDefinition configurationRepository ) {
             this.problems = problems;
             this.context = context;
             this.configurationRepository = configurationRepository;
@@ -278,7 +329,7 @@
                 skipProperties.add(DnaLexicon.DESCRIPTION);
                 skipProperties.add(DnaLexicon.CLASSNAME);
                 skipProperties.add(DnaLexicon.CLASSPATH);
-                skipProperties.add(DnaLexicon.PATH_EXPRESSIONS);
+                skipProperties.add(DnaLexicon.PATH_EXPRESSION);
                 Set<String> skipNamespaces = new HashSet<String>();
                 skipNamespaces.add(JcrLexicon.Namespace.URI);
                 skipNamespaces.add(JcrNtLexicon.Namespace.URI);
@@ -287,6 +338,7 @@
                 for (Location detectorLocation : subgraph.getRoot().getChildren()) {
                     Node node = subgraph.getNode(detectorLocation);
                     String name = stringValueOf(node, DnaLexicon.READABLE_NAME);
+                    if (name == null) name = stringValueOf(node);
                     String desc = stringValueOf(node, DnaLexicon.DESCRIPTION);
                     String classname = stringValueOf(node, DnaLexicon.CLASSNAME);
                     String[] classpath = stringValuesOf(node, DnaLexicon.CLASSPATH);
@@ -323,7 +375,7 @@
                 skipProperties.add(DnaLexicon.DESCRIPTION);
                 skipProperties.add(DnaLexicon.CLASSNAME);
                 skipProperties.add(DnaLexicon.CLASSPATH);
-                skipProperties.add(DnaLexicon.PATH_EXPRESSIONS);
+                skipProperties.add(DnaLexicon.PATH_EXPRESSION);
                 Set<String> skipNamespaces = new HashSet<String>();
                 skipNamespaces.add(JcrLexicon.Namespace.URI);
                 skipNamespaces.add(JcrNtLexicon.Namespace.URI);
@@ -332,10 +384,11 @@
                 for (Location sequencerLocation : subgraph.getRoot().getChildren()) {
                     Node sequencerNode = subgraph.getNode(sequencerLocation);
                     String name = stringValueOf(sequencerNode, DnaLexicon.READABLE_NAME);
+                    if (name == null) name = stringValueOf(sequencerNode);
                     String desc = stringValueOf(sequencerNode, DnaLexicon.DESCRIPTION);
                     String classname = stringValueOf(sequencerNode, DnaLexicon.CLASSNAME);
                     String[] classpath = stringValuesOf(sequencerNode, DnaLexicon.CLASSPATH);
-                    String[] expressionStrings = stringValuesOf(sequencerNode, DnaLexicon.PATH_EXPRESSIONS);
+                    String[] expressionStrings = stringValuesOf(sequencerNode, DnaLexicon.PATH_EXPRESSION);
                     List<PathExpression> pathExpressions = new ArrayList<PathExpression>();
                     if (expressionStrings != null) {
                         for (String expressionString : expressionStrings) {
@@ -376,6 +429,10 @@
             return configs;
         }
 
+        private String stringValueOf( Node node ) {
+            return node.getLocation().getPath().getLastSegment().getString(context.getNamespaceRegistry());
+        }
+
         private String stringValueOf( Node node,
                                       Name propertyName ) {
             Property property = node.getProperty(propertyName);

Modified: trunk/dna-repository/src/main/java/org/jboss/dna/repository/DnaLexicon.java
===================================================================
--- trunk/dna-repository/src/main/java/org/jboss/dna/repository/DnaLexicon.java	2009-06-03 20:09:11 UTC (rev 968)
+++ trunk/dna-repository/src/main/java/org/jboss/dna/repository/DnaLexicon.java	2009-06-03 20:10:19 UTC (rev 969)
@@ -37,7 +37,7 @@
     public static final Name DESCRIPTION = new BasicName(Namespace.URI, "description");
     public static final Name SEQUENCERS = new BasicName(Namespace.URI, "sequencers");
     public static final Name SEQUENCER = new BasicName(Namespace.URI, "sequencer");
-    public static final Name PATH_EXPRESSIONS = new BasicName(Namespace.URI, "pathExpressions");
+    public static final Name PATH_EXPRESSION = new BasicName(Namespace.URI, "pathExpression");
     public static final Name JNDI_NAME = new BasicName(Namespace.URI, "jndiName");
     public static final Name MIME_TYPE_DETECTORS = new BasicName(Namespace.URI, "mimeTypeDetectors");
     public static final Name MIME_TYPE_DETECTOR = new BasicName(Namespace.URI, "mimeTypeDetector");

Modified: trunk/dna-repository/src/main/java/org/jboss/dna/repository/RepositoryI18n.java
===================================================================
--- trunk/dna-repository/src/main/java/org/jboss/dna/repository/RepositoryI18n.java	2009-06-03 20:09:11 UTC (rev 968)
+++ trunk/dna-repository/src/main/java/org/jboss/dna/repository/RepositoryI18n.java	2009-06-03 20:10:19 UTC (rev 969)
@@ -122,6 +122,9 @@
     // Repository
     public static I18n errorStartingRepositoryService;
 
+    // Engine
+    public static I18n engineIsNotRunning;
+
     static {
         try {
             I18n.initialize(RepositoryI18n.class);

Deleted: trunk/dna-repository/src/main/java/org/jboss/dna/repository/config/DnaConfiguration.java
===================================================================
--- trunk/dna-repository/src/main/java/org/jboss/dna/repository/config/DnaConfiguration.java	2009-06-03 20:09:11 UTC (rev 968)
+++ trunk/dna-repository/src/main/java/org/jboss/dna/repository/config/DnaConfiguration.java	2009-06-03 20:10:19 UTC (rev 969)
@@ -1,512 +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.repository.config;
-
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.net.URL;
-import net.jcip.annotations.Immutable;
-import org.jboss.dna.common.util.CheckArg;
-import org.jboss.dna.graph.ExecutionContext;
-import org.jboss.dna.graph.Graph;
-import org.jboss.dna.graph.Node;
-import org.jboss.dna.graph.Workspace;
-import org.jboss.dna.graph.connector.RepositorySource;
-import org.jboss.dna.graph.connector.inmemory.InMemoryRepositorySource;
-import org.jboss.dna.graph.property.Path;
-import org.jboss.dna.graph.property.basic.RootPath;
-import org.xml.sax.SAXException;
-
-/**
- * 
- */
-public class DnaConfiguration {
-
-    protected static final String DEFAULT_WORKSPACE_NAME = "";
-    protected static final String DEFAULT_PATH = "/";
-
-    private final ExecutionContext context;
-    private ConfigurationContent configurationContent;
-
-    /**
-     * Create a new configuration, using a default-constructed {@link ExecutionContext}.
-     */
-    public DnaConfiguration() {
-        this(new ExecutionContext());
-    }
-
-    /**
-     * Create a new configuration using the supplied {@link ExecutionContext}.
-     * 
-     * @param context the execution context
-     * @throws IllegalArgumentException if the path is null or empty
-     */
-    public DnaConfiguration( ExecutionContext context ) {
-        CheckArg.isNotNull(context, "context");
-        this.context = context;
-    }
-
-    /**
-     * Load the configuration from a file at the given path.
-     * 
-     * @param pathToConfigurationFile the path the file containing the configuration information
-     * @return this configuration object, for convenience and method chaining
-     * @throws IOException if there is an error or problem reading the file at the supplied location
-     * @throws SAXException if the file is not a valid XML format
-     * @throws IllegalArgumentException if the path is null or empty
-     */
-    public DnaConfiguration loadFrom( String pathToConfigurationFile ) throws IOException, SAXException {
-        CheckArg.isNotEmpty(pathToConfigurationFile, "pathToConfigurationFile");
-        return loadFrom(new File(pathToConfigurationFile));
-    }
-
-    /**
-     * Load the configuration from a file.
-     * 
-     * @param configurationFile the file containing the configuration information
-     * @return this configuration object, for convenience and method chaining
-     * @throws IOException if there is an error or problem reading the supplied file
-     * @throws SAXException if the file is not a valid XML format
-     * @throws IllegalArgumentException if the file reference is null
-     */
-    public DnaConfiguration loadFrom( File configurationFile ) throws IOException, SAXException {
-        CheckArg.isNotNull(configurationFile, "configurationFile");
-        InputStream stream = new FileInputStream(configurationFile);
-        try {
-            return loadFrom(stream);
-        } finally {
-            stream.close();
-        }
-    }
-
-    /**
-     * Load the configuration from a file at the supplied URL.
-     * 
-     * @param urlToConfigurationFile the URL of the file containing the configuration information
-     * @return this configuration object, for convenience and method chaining
-     * @throws IOException if there is an error or problem reading the file at the supplied URL
-     * @throws SAXException if the file is not a valid XML format
-     * @throws IllegalArgumentException if the URL is null
-     */
-    public DnaConfiguration loadFrom( URL urlToConfigurationFile ) throws IOException, SAXException {
-        CheckArg.isNotNull(urlToConfigurationFile, "urlToConfigurationFile");
-        InputStream stream = urlToConfigurationFile.openStream();
-        try {
-            return loadFrom(stream);
-        } finally {
-            stream.close();
-        }
-    }
-
-    /**
-     * Load the configuration from a file at the supplied URL.
-     * 
-     * @param configurationFileInputStream the stream with the configuration information
-     * @return this configuration object, for convenience and method chaining
-     * @throws IOException if there is an error or problem reading the file at the supplied URL
-     * @throws SAXException if the file is not a valid XML format
-     * @throws IllegalArgumentException if the stream is null
-     */
-    public DnaConfiguration loadFrom( InputStream configurationFileInputStream ) throws IOException, SAXException {
-        CheckArg.isNotNull(configurationFileInputStream, "configurationFileInputStream");
-
-        // Create the in-memory repository source in which the content will be stored ...
-        InMemoryRepositorySource source = new InMemoryRepositorySource();
-        source.setName("Configuration Repository");
-        source.setDefaultWorkspaceName(DEFAULT_WORKSPACE_NAME);
-
-        // Import the information into the source ...
-        Path path = path(DEFAULT_PATH);
-        Graph graph = Graph.create(source, context);
-        graph.importXmlFrom(configurationFileInputStream).into(path);
-
-        // The file was imported successfully, so now create the content information ...
-        configurationContent = new ConfigurationContent(source, null, path, context);
-        return this;
-    }
-
-    /**
-     * Load the configuration from the repository content using the supplied repository source. This method assumes that the
-     * supplied source has already been configured and is ready to {@link RepositorySource#getConnection() create connections}.
-     * Also, the default workspace of the source will be used, and the configuration content may be found directly under the root
-     * node.
-     * 
-     * @param source the source that defines the repository with the configuration content
-     * @return this configuration object, for convenience and method chaining
-     * @throws IllegalArgumentException if the source is null
-     */
-    public DnaConfiguration loadFrom( RepositorySource source ) {
-        return loadFrom(source, null, null);
-    }
-
-    /**
-     * Load the configuration from the repository content using the workspace in the supplied repository source. This method
-     * assumes that the supplied source has already been configured and is ready to {@link RepositorySource#getConnection() create
-     * connections}. Also, the configuration content may be found directly under the root node.
-     * 
-     * @param source the source that defines the repository with the configuration content
-     * @param workspaceName the name of the workspace with the configuration content, or null if the source's default workspace
-     *        should be used
-     * @return this configuration object, for convenience and method chaining
-     * @throws IllegalArgumentException if the source is null
-     */
-    public DnaConfiguration loadFrom( RepositorySource source,
-                                      String workspaceName ) {
-        CheckArg.isNotNull(source, "source");
-        return loadFrom(source, workspaceName, null);
-    }
-
-    /**
-     * Load the configuration from the repository content at the supplied path in the workspace in the supplied repository source.
-     * This method assumes that the supplied source has already been configured and is ready to
-     * {@link RepositorySource#getConnection() create connections}.
-     * 
-     * @param source the source that defines the repository with the configuration content
-     * @param workspaceName the name of the workspace with the configuration content, or null if the source's default workspace
-     *        should be used
-     * @param pathInWorkspace the path to the parent node under which the configuration content may be found, or null if the
-     *        content may be found under the root node
-     * @return this configuration object, for convenience and method chaining
-     * @throws IllegalArgumentException if the source is null
-     */
-    public DnaConfiguration loadFrom( RepositorySource source,
-                                      String workspaceName,
-                                      String pathInWorkspace ) {
-        CheckArg.isNotNull(source, "source");
-
-        // Verify connectivity ...
-        Graph graph = Graph.create(source, context);
-        if (workspaceName != null) {
-            Workspace workspace = graph.useWorkspace(workspaceName); // should throw exception if not connectable
-            assert workspace.getRoot() != null;
-        }
-
-        // Verify the path ...
-        Path path = pathInWorkspace != null ? path(pathInWorkspace) : path(DEFAULT_PATH);
-        Node parent = graph.getNodeAt(path);
-        assert parent != null;
-
-        // Now create the content information ...
-        configurationContent = new ConfigurationContent(source, workspaceName, path, context);
-        return this;
-    }
-
-    protected ConfigurationContent getConfigurationContent() {
-        return configurationContent;
-    }
-
-    protected Path path( String path ) {
-        return context.getValueFactories().getPathFactory().create(path);
-    }
-
-    public MimeTypeDetectorDetails<? extends DnaConfiguration> mimeTypeDetector( String name ) {
-        return new MimeTypeDetectorBuilder<DnaConfiguration>(this);
-    }
-
-    /**
-     * Construct an engine that reflects the current state of this configuration. This method always creates a new instance.
-     * 
-     * @return the resulting engine; never null
-     */
-    public DnaEngine build() {
-        return new DnaEngine();
-    }
-
-    public interface Returnable<ReturnType> {
-        /**
-         * Return the configuration component.
-         * 
-         * @return the configuration component; never null
-         */
-        ReturnType and();
-    }
-
-    protected static class BaseReturnable<ReturnType> implements Returnable<ReturnType> {
-        protected final ReturnType returnObject;
-
-        protected BaseReturnable( ReturnType returnObject ) {
-            this.returnObject = returnObject;
-        }
-
-        /**
-         * {@inheritDoc}
-         * 
-         * @see org.jboss.dna.repository.config.DnaConfiguration.Returnable#and()
-         */
-        public ReturnType and() {
-            return returnObject;
-        }
-    }
-
-    /**
-     * Interface used to set up and build a RepositorySource instance.
-     * 
-     * @param <ReturnType> the type of the configuration component
-     */
-    public interface MimeTypeDetectorDetails<ReturnType> extends Returnable<ReturnType> {
-    }
-
-    protected static class MimeTypeDetectorBuilder<ReturnType> extends BaseReturnable<ReturnType>
-        implements MimeTypeDetectorDetails<ReturnType> {
-        protected MimeTypeDetectorBuilder( ReturnType returnObject ) {
-            super(returnObject);
-        }
-    }
-
-    /**
-     * Interface used to set up and build a RepositorySource instance.
-     * 
-     * @param <ReturnType> the type of the configuration component
-     */
-    public interface RepositorySourceDetails<ReturnType>
-        extends SetProperties<RepositorySourceDetails<ReturnType>>, Returnable<ReturnType> {
-    }
-
-    /**
-     * Interface for configuring the JavaBean-style properties of an object.
-     * 
-     * @param <ReturnType> the interface returned after the property has been set.
-     * @author Randall Hauch
-     */
-    public interface SetProperties<ReturnType> {
-        /**
-         * Set the property value to an integer.
-         * 
-         * @param beanPropertyName the name of the JavaBean-style property (e.g., "retryLimit")
-         * @param value the new value for the property
-         * @return the next component to continue configuration; never null
-         */
-        ReturnType setProperty( String beanPropertyName,
-                                int value );
-
-        /**
-         * Set the property value to a long number.
-         * 
-         * @param beanPropertyName the name of the JavaBean-style property (e.g., "retryLimit")
-         * @param value the new value for the property
-         * @return the next component to continue configuration; never null
-         */
-        ReturnType setProperty( String beanPropertyName,
-                                long value );
-
-        /**
-         * Set the property value to a short.
-         * 
-         * @param beanPropertyName the name of the JavaBean-style property (e.g., "retryLimit")
-         * @param value the new value for the property
-         * @return the next component to continue configuration; never null
-         */
-        ReturnType setProperty( String beanPropertyName,
-                                short value );
-
-        /**
-         * Set the property value to a boolean.
-         * 
-         * @param beanPropertyName the name of the JavaBean-style property (e.g., "retryLimit")
-         * @param value the new value for the property
-         * @return the next component to continue configuration; never null
-         */
-        ReturnType setProperty( String beanPropertyName,
-                                boolean value );
-
-        /**
-         * Set the property value to a float.
-         * 
-         * @param beanPropertyName the name of the JavaBean-style property (e.g., "retryLimit")
-         * @param value the new value for the property
-         * @return the next component to continue configuration; never null
-         */
-        ReturnType setProperty( String beanPropertyName,
-                                float value );
-
-        /**
-         * Set the property value to a double.
-         * 
-         * @param beanPropertyName the name of the JavaBean-style property (e.g., "retryLimit")
-         * @param value the new value for the property
-         * @return the next component to continue configuration; never null
-         */
-        ReturnType setProperty( String beanPropertyName,
-                                double value );
-
-        /**
-         * Set the property value to a string.
-         * 
-         * @param beanPropertyName the name of the JavaBean-style property (e.g., "retryLimit")
-         * @param value the new value for the property
-         * @return the next component to continue configuration; never null
-         */
-        ReturnType setProperty( String beanPropertyName,
-                                String value );
-
-        /**
-         * Set the property value to an object.
-         * 
-         * @param beanPropertyName the name of the JavaBean-style property (e.g., "retryLimit")
-         * @param value the new value for the property
-         * @return the next component to continue configuration; never null
-         */
-        ReturnType setProperty( String beanPropertyName,
-                                Object value );
-    }
-
-    protected class SourceDetails<ReturnType> extends BaseReturnable<ReturnType> implements RepositorySourceDetails<ReturnType> {
-
-        protected SourceDetails( ReturnType returnObject ) {
-            super(returnObject);
-        }
-
-        public RepositorySourceDetails<ReturnType> setProperty( String beanPropertyName,
-                                                                int value ) {
-            return setProperty(beanPropertyName, (Object)value);
-        }
-
-        public RepositorySourceDetails<ReturnType> setProperty( String beanPropertyName,
-                                                                long value ) {
-            return setProperty(beanPropertyName, (Object)value);
-        }
-
-        public RepositorySourceDetails<ReturnType> setProperty( String beanPropertyName,
-                                                                short value ) {
-            return setProperty(beanPropertyName, (Object)value);
-        }
-
-        public RepositorySourceDetails<ReturnType> setProperty( String beanPropertyName,
-                                                                boolean value ) {
-            return setProperty(beanPropertyName, (Object)value);
-        }
-
-        public RepositorySourceDetails<ReturnType> setProperty( String beanPropertyName,
-                                                                float value ) {
-            return setProperty(beanPropertyName, (Object)value);
-        }
-
-        public RepositorySourceDetails<ReturnType> setProperty( String beanPropertyName,
-                                                                double value ) {
-            return setProperty(beanPropertyName, (Object)value);
-        }
-
-        public RepositorySourceDetails<ReturnType> setProperty( String beanPropertyName,
-                                                                String value ) {
-            return setProperty(beanPropertyName, (Object)value);
-        }
-
-        public RepositorySourceDetails<ReturnType> setProperty( String beanPropertyName,
-                                                                Object value ) {
-            throw new UnsupportedOperationException();
-        }
-    }
-
-    /**
-     * Representation of the current configuration content.
-     */
-    @Immutable
-    protected static class ConfigurationContent {
-        private final RepositorySource source;
-        private final Path path;
-        private final String workspace;
-        private final ExecutionContext context;
-        private Graph graph;
-
-        protected ConfigurationContent( RepositorySource source,
-                                        String workspace,
-                                        Path path,
-                                        ExecutionContext context ) {
-            this.source = source;
-            this.path = path != null ? path : RootPath.INSTANCE;
-            this.workspace = workspace;
-            this.context = context;
-        }
-
-        /**
-         * Get the repository source where the configuration content may be found
-         * 
-         * @return the source for the configuration repository; never null
-         */
-        public RepositorySource getRepositorySource() {
-            return source;
-        }
-
-        /**
-         * Get the path in the configuration repository where the configuration content may be found
-         * 
-         * @return the path to the configuration content; never null
-         */
-        public Path getPath() {
-            return path;
-        }
-
-        /**
-         * Get the name of the workspace used for the configuration repository.
-         * 
-         * @return the name of the workspace, or null if the default workspace should be used
-         */
-        public String getWorkspace() {
-            return workspace;
-        }
-
-        /**
-         * @return context
-         */
-        public ExecutionContext getContext() {
-            return context;
-        }
-
-        /**
-         * Return a copy of this configuration that uses the supplied path instead of this object's {@link #getPath() path}.
-         * 
-         * @param path the desired path for the new configuration; if null, then "/" is used
-         * @return the new configuration
-         */
-        public ConfigurationContent with( Path path ) {
-            return new ConfigurationContent(source, workspace, path, context);
-        }
-
-        /**
-         * Return a copy of this configuration that uses the supplied workspace name instead of this object's
-         * {@link #getWorkspace() workspace}.
-         * 
-         * @param workspace the desired workspace name for the new configuration; if null, then the default workspace will be used
-         * @return the new configuration
-         */
-        public ConfigurationContent withWorkspace( String workspace ) {
-            return new ConfigurationContent(source, workspace, path, context);
-        }
-
-        /**
-         * Obtain a graph to this configuration repository. This method will always return the same graph instance.
-         * 
-         * @return the graph; never null
-         */
-        protected Graph graph() {
-            if (graph == null) {
-                graph = Graph.create(source, context);
-                if (workspace != null) graph.useWorkspace(workspace);
-            }
-            return graph;
-        }
-    }
-}

Deleted: trunk/dna-repository/src/main/java/org/jboss/dna/repository/config/DnaEngine.java
===================================================================
--- trunk/dna-repository/src/main/java/org/jboss/dna/repository/config/DnaEngine.java	2009-06-03 20:09:11 UTC (rev 968)
+++ trunk/dna-repository/src/main/java/org/jboss/dna/repository/config/DnaEngine.java	2009-06-03 20:10:19 UTC (rev 969)
@@ -1,31 +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.repository.config;
-
-/**
- * 
- */
-public class DnaEngine {
-
-}

Deleted: trunk/dna-repository/src/main/java/org/jboss/dna/repository/config/JcrConfiguration.java
===================================================================
--- trunk/dna-repository/src/main/java/org/jboss/dna/repository/config/JcrConfiguration.java	2009-06-03 20:09:11 UTC (rev 968)
+++ trunk/dna-repository/src/main/java/org/jboss/dna/repository/config/JcrConfiguration.java	2009-06-03 20:10:19 UTC (rev 969)
@@ -1,145 +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.repository.config;
-
-import java.io.File;
-import java.io.IOException;
-import java.io.InputStream;
-import java.net.URL;
-import org.jboss.dna.graph.connector.RepositorySource;
-import org.xml.sax.SAXException;
-
-/**
- * 
- */
-public class JcrConfiguration extends DnaConfiguration {
-
-    /**
-     * {@inheritDoc}
-     * 
-     * @throws IOException
-     * @throws SAXException
-     * @see org.jboss.dna.repository.config.DnaConfiguration#loadFrom(java.lang.String)
-     */
-    @Override
-    public JcrConfiguration loadFrom( String pathToFile ) throws IOException, SAXException {
-        super.loadFrom(pathToFile);
-        return this;
-    }
-
-    /**
-     * {@inheritDoc}
-     * 
-     * @see org.jboss.dna.repository.config.DnaConfiguration#loadFrom(java.io.File)
-     */
-    @Override
-    public JcrConfiguration loadFrom( File configurationFile ) throws IOException, SAXException {
-        super.loadFrom(configurationFile);
-        return this;
-    }
-
-    /**
-     * {@inheritDoc}
-     * 
-     * @see org.jboss.dna.repository.config.DnaConfiguration#loadFrom(java.net.URL)
-     */
-    @Override
-    public JcrConfiguration loadFrom( URL urlToConfigurationFile ) throws IOException, SAXException {
-        super.loadFrom(urlToConfigurationFile);
-        return this;
-    }
-
-    /**
-     * {@inheritDoc}
-     * 
-     * @see org.jboss.dna.repository.config.DnaConfiguration#loadFrom(java.io.InputStream)
-     */
-    @Override
-    public JcrConfiguration loadFrom( InputStream configurationFileInputStream ) throws IOException, SAXException {
-        super.loadFrom(configurationFileInputStream);
-        return this;
-    }
-
-    /**
-     * {@inheritDoc}
-     * 
-     * @see org.jboss.dna.repository.config.DnaConfiguration#loadFrom(org.jboss.dna.graph.connector.RepositorySource)
-     */
-    @Override
-    public JcrConfiguration loadFrom( RepositorySource source ) {
-        super.loadFrom(source);
-        return this;
-    }
-
-    /**
-     * {@inheritDoc}
-     * 
-     * @see org.jboss.dna.repository.config.DnaConfiguration#loadFrom(org.jboss.dna.graph.connector.RepositorySource,
-     *      java.lang.String)
-     */
-    @Override
-    public JcrConfiguration loadFrom( RepositorySource source,
-                                      String workspaceName ) {
-        super.loadFrom(source, workspaceName);
-        return this;
-    }
-
-    /**
-     * {@inheritDoc}
-     * 
-     * @see org.jboss.dna.repository.config.DnaConfiguration#loadFrom(org.jboss.dna.graph.connector.RepositorySource,
-     *      java.lang.String, java.lang.String)
-     */
-    @Override
-    public JcrConfiguration loadFrom( RepositorySource source,
-                                      String workspaceName,
-                                      String pathInWorkspace ) {
-        super.loadFrom(source, workspaceName, pathInWorkspace);
-        return this;
-    }
-
-    /**
-     * {@inheritDoc}
-     * 
-     * @see org.jboss.dna.repository.config.DnaConfiguration#mimeTypeDetector(java.lang.String)
-     */
-    @Override
-    public MimeTypeDetectorDetails<JcrConfiguration> mimeTypeDetector( String name ) {
-        return new MimeTypeDetectorBuilder<JcrConfiguration>(this);
-    }
-
-    public JcrConfiguration addRepository( String repositoryId ) {
-        return this;
-    }
-
-    /**
-     * {@inheritDoc}
-     * 
-     * @see org.jboss.dna.repository.config.DnaConfiguration#build()
-     */
-    @Override
-    public JcrEngine build() {
-        return new JcrEngine();
-    }
-}

Deleted: trunk/dna-repository/src/main/java/org/jboss/dna/repository/config/JcrConfigurationTest.java
===================================================================
--- trunk/dna-repository/src/main/java/org/jboss/dna/repository/config/JcrConfigurationTest.java	2009-06-03 20:09:11 UTC (rev 968)
+++ trunk/dna-repository/src/main/java/org/jboss/dna/repository/config/JcrConfigurationTest.java	2009-06-03 20:10:19 UTC (rev 969)
@@ -1,98 +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.repository.config;
-
-import static org.hamcrest.core.Is.is;
-import static org.hamcrest.core.IsNull.notNullValue;
-import static org.hamcrest.core.IsSame.sameInstance;
-import static org.junit.Assert.assertThat;
-import java.io.File;
-import java.net.URL;
-import org.jboss.dna.graph.connector.inmemory.InMemoryRepositorySource;
-import org.junit.Test;
-
-/**
- * 
- */
-public class JcrConfigurationTest {
-
-    @Test
-    public void shoulConfigureDnaFromFileUsingPath() throws Exception {
-        DnaConfiguration config = new DnaConfiguration();
-        config.loadFrom("some path");
-
-        DnaEngine engine = config.build();
-        assertThat(engine, is(notNullValue()));
-    }
-
-    @Test
-    public void shoulConfigureDnaFromFile() throws Exception {
-        DnaConfiguration config = new DnaConfiguration();
-        config.loadFrom(new File("file:some path"));
-
-        DnaEngine engine = config.build();
-        assertThat(engine, is(notNullValue()));
-    }
-
-    @Test
-    public void shoulConfigureDnaFromFileUsingURL() throws Exception {
-        DnaConfiguration config = new DnaConfiguration();
-        config.loadFrom(new URL("file:some path"));
-
-        DnaEngine engine = config.build();
-        assertThat(engine, is(notNullValue()));
-    }
-
-    @Test
-    public void shoulConfigureDnaFromRepositorySource() throws Exception {
-        InMemoryRepositorySource source = new InMemoryRepositorySource();
-        DnaConfiguration config = new DnaConfiguration();
-        config.loadFrom(source);
-
-        DnaEngine engine = config.build();
-        assertThat(engine, is(notNullValue()));
-    }
-
-    @Test
-    public void shouldBeConfigurableAsDnaConfiguration() throws Exception {
-        DnaConfiguration config = new DnaConfiguration();
-        assertThat(config.loadFrom("some path"), is(sameInstance(config)));
-        assertThat(config.addMimeTypeDetector("something").and(), is(sameInstance(config)));
-
-        DnaEngine engine = config.build();
-        assertThat(engine, is(notNullValue()));
-    }
-
-    @Test
-    public void shouldBeConfigurableAsJcrConfiguration() throws Exception {
-        JcrConfiguration config = new JcrConfiguration();
-        config.loadFrom("some path").addRepository("some repository ID");
-        assertThat(config.loadFrom("some path"), is(sameInstance(config)));
-        assertThat(config.addMimeTypeDetector("something").and(), is(sameInstance(config)));
-
-        JcrEngine engine = config.build();
-        assertThat(engine, is(notNullValue()));
-    }
-
-}

Deleted: trunk/dna-repository/src/main/java/org/jboss/dna/repository/config/JcrEngine.java
===================================================================
--- trunk/dna-repository/src/main/java/org/jboss/dna/repository/config/JcrEngine.java	2009-06-03 20:09:11 UTC (rev 968)
+++ trunk/dna-repository/src/main/java/org/jboss/dna/repository/config/JcrEngine.java	2009-06-03 20:10:19 UTC (rev 969)
@@ -1,31 +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.repository.config;
-
-/**
- * 
- */
-public class JcrEngine extends DnaEngine {
-
-}

Modified: trunk/dna-repository/src/main/resources/org/jboss/dna/repository/RepositoryI18n.properties
===================================================================
--- trunk/dna-repository/src/main/resources/org/jboss/dna/repository/RepositoryI18n.properties	2009-06-03 20:09:11 UTC (rev 968)
+++ trunk/dna-repository/src/main/resources/org/jboss/dna/repository/RepositoryI18n.properties	2009-06-03 20:10:19 UTC (rev 969)
@@ -100,3 +100,5 @@
 unableToAccessClassUsingClasspath = Unable to access class "{0}" using classpath "{1}"
 
 errorStartingRepositoryService = Error while starting repository service
+
+engineIsNotRunning = The engine is not running; make sure it was started.

Modified: trunk/dna-repository/src/test/java/org/jboss/dna/repository/DnaConfigurationTest.java
===================================================================
--- trunk/dna-repository/src/test/java/org/jboss/dna/repository/DnaConfigurationTest.java	2009-06-03 20:09:11 UTC (rev 968)
+++ trunk/dna-repository/src/test/java/org/jboss/dna/repository/DnaConfigurationTest.java	2009-06-03 20:10:19 UTC (rev 969)
@@ -27,15 +27,15 @@
 import static org.jboss.dna.graph.IsNodeWithChildren.hasChild;
 import static org.jboss.dna.graph.IsNodeWithProperty.hasProperty;
 import static org.junit.Assert.assertThat;
-import java.util.UUID;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.InputStream;
+import java.net.URL;
 import org.jboss.dna.graph.ExecutionContext;
 import org.jboss.dna.graph.Subgraph;
-import org.jboss.dna.graph.cache.CachePolicy;
-import org.jboss.dna.graph.cache.ImmutableCachePolicy;
 import org.jboss.dna.graph.connector.inmemory.InMemoryRepositorySource;
 import org.jboss.dna.graph.mimetype.ExtensionBasedMimeTypeDetector;
 import org.jboss.dna.graph.property.Path;
-import org.jboss.dna.repository.sequencer.MockSequencerA;
 import org.jboss.dna.repository.sequencer.MockStreamSequencerA;
 import org.junit.Before;
 import org.junit.Test;
@@ -70,145 +70,268 @@
 
     @Test
     public void shouldHaveDefaultConfigurationSourceIfNotSpecified() {
-        assertThat(configuration.graph(), is(notNullValue()));
+        assertThat(configuration.getConfigurationDefinition(), is(notNullValue()));
     }
 
     @Test
-    public void shouldAllowSpecifyingConfigurationRepository() {
-        DnaConfiguration config = configuration.withConfigurationSource()
-                                               .usingClass("org.jboss.dna.graph.connector.inmemory.InMemoryRepositorySource")
-                                               .loadedFromClasspath()
-                                               .describedAs("description")
-                                               .with("retryLimit")
-                                               .setTo(5)
-                                               .with("name")
-                                               .setTo("repository name")
-                                               .and()
-                                               .save();
-        assertThat(config, is(notNullValue()));
-        assertThat(config.configurationRepository().getRepositorySource(), is(instanceOf(InMemoryRepositorySource.class)));
-        InMemoryRepositorySource source = (InMemoryRepositorySource)config.configurationRepository().getRepositorySource();
-        assertThat(source.getName(), is("repository name"));
-        assertThat(source.getRetryLimit(), is(5));
-    }
+    public void shouldLoadConfigurationFromFilePath() throws Exception {
+        File file = new File("src/test/resources/config/configRepository.xml");
+        assertThat(file.exists(), is(true));
+        assertThat(file.canRead(), is(true));
+        assertThat(file.isFile(), is(true));
 
-    @Test
-    public void shouldAllowAddingRepositorySourceInstance() {
-        UUID rootUuid = UUID.randomUUID();
-        CachePolicy cachePolicy = new ImmutableCachePolicy(100);
-        InMemoryRepositorySource newSource = new InMemoryRepositorySource();
-        newSource.setName("name");
-        newSource.setDefaultCachePolicy(cachePolicy);
-        newSource.setDefaultWorkspaceName("default workspace name");
-        newSource.setRetryLimit(100);
-        newSource.setRootNodeUuid(rootUuid);
+        configuration.loadFrom("src/test/resources/config/configRepository.xml");
 
-        // Update the configuration and save it ...
-        configuration.addSource(newSource).save();
+        assertThat(configuration.getProblems().isEmpty(), is(true));
 
         // Verify that the graph has been updated correctly ...
-        Subgraph subgraph = configuration.graph().getSubgraphOfDepth(3).at("/");
+        DnaConfiguration.ConfigurationDefinition content = configuration.getConfigurationDefinition();
+        Subgraph subgraph = content.graph().getSubgraphOfDepth(3).at("/");
+
         assertThat(subgraph.getNode("/dna:sources"), is(notNullValue()));
-        assertThat(subgraph.getNode("/dna:sources/name"), is(notNullValue()));
-        assertThat(subgraph.getNode("/dna:sources/name"), hasProperty(DnaLexicon.READABLE_NAME, "name"));
-        assertThat(subgraph.getNode("/dna:sources/name"), hasProperty(DnaLexicon.RETRY_LIMIT, 100));
-        assertThat(subgraph.getNode("/dna:sources/name"), hasProperty(DnaLexicon.DEFAULT_CACHE_POLICY, cachePolicy));
-        assertThat(subgraph.getNode("/dna:sources/name"), hasProperty("defaultWorkspaceName", "default workspace name"));
-        assertThat(subgraph.getNode("/dna:sources/name"), hasProperty("rootNodeUuid", rootUuid));
+        assertThat(subgraph.getNode("/dna:sources/Cars"), is(notNullValue()));
+        assertThat(subgraph.getNode("/dna:sources/Cars"), hasProperty(DnaLexicon.RETRY_LIMIT, "3"));
+        assertThat(subgraph.getNode("/dna:sources/Cars"), hasProperty(DnaLexicon.CLASSNAME,
+                                                                      InMemoryRepositorySource.class.getName()));
+        assertThat(subgraph.getNode("/dna:sources/Aircraft"), is(notNullValue()));
+        assertThat(subgraph.getNode("/dna:sources/Aircraft"), hasProperty("defaultWorkspaceName", "default"));
+        assertThat(subgraph.getNode("/dna:sources/Aircraft"), hasProperty(DnaLexicon.CLASSNAME,
+                                                                          InMemoryRepositorySource.class.getName()));
+        assertThat(subgraph.getNode("/dna:sources/Cache"), is(notNullValue()));
+        assertThat(subgraph.getNode("/dna:sources/Cache"), hasProperty("defaultWorkspaceName", "default"));
+        assertThat(subgraph.getNode("/dna:sources/Cache"), hasProperty(DnaLexicon.CLASSNAME,
+                                                                       InMemoryRepositorySource.class.getName()));
+
+        assertThat(subgraph.getNode("/dna:mimeTypeDetectors").getChildren(), hasChild(segment("Detector")));
+        assertThat(subgraph.getNode("/dna:mimeTypeDetectors/Detector"), is(notNullValue()));
+        assertThat(subgraph.getNode("/dna:mimeTypeDetectors/Detector"),
+                   hasProperty(DnaLexicon.DESCRIPTION, "Standard extension-based MIME type detector"));
+        assertThat(subgraph.getNode("/dna:mimeTypeDetectors/Detector"),
+                   hasProperty(DnaLexicon.CLASSNAME, ExtensionBasedMimeTypeDetector.class.getName()));
+
+        assertThat(subgraph.getNode("/dna:sequencers").getChildren(), hasChild(segment("Image Sequencer")));
+        assertThat(subgraph.getNode("/dna:sequencers/Image Sequencer"), is(notNullValue()));
+        assertThat(subgraph.getNode("/dna:sequencers/Image Sequencer"), hasProperty(DnaLexicon.DESCRIPTION,
+                                                                                    "Image metadata sequencer"));
+        assertThat(subgraph.getNode("/dna:sequencers/Image Sequencer"),
+                   hasProperty(DnaLexicon.CLASSNAME, "org.jboss.dna.sequencer.image.ImageMetadataSequencer"));
+        assertThat(subgraph.getNode("/dna:sequencers/Image Sequencer"), hasProperty(DnaLexicon.PATH_EXPRESSION,
+                                                                                    "/foo/source => /foo/target",
+                                                                                    "/bar/source => /bar/target"));
     }
 
     @Test
+    public void shoulLoadConfigurationFromFileObject() throws Exception {
+        File file = new File("src/test/resources/config/configRepository.xml");
+        assertThat(file.exists(), is(true));
+        assertThat(file.canRead(), is(true));
+        assertThat(file.isFile(), is(true));
+
+        configuration.loadFrom(new File("src/test/resources/config/configRepository.xml"));
+
+        assertThat(configuration.getProblems().isEmpty(), is(true));
+    }
+
+    @Test
+    public void shoulLoadConfigurationFromURL() throws Exception {
+        File file = new File("src/test/resources/config/configRepository.xml");
+        assertThat(file.exists(), is(true));
+        assertThat(file.canRead(), is(true));
+        assertThat(file.isFile(), is(true));
+        URL fileUrl = file.toURL();
+        assertThat(fileUrl, is(notNullValue()));
+
+        configuration.loadFrom(fileUrl);
+
+        assertThat(configuration.getProblems().isEmpty(), is(true));
+    }
+
+    @Test
+    public void shoulLoadConfigurationFromInputStream() throws Exception {
+        File file = new File("src/test/resources/config/configRepository.xml");
+        assertThat(file.exists(), is(true));
+        assertThat(file.canRead(), is(true));
+        assertThat(file.isFile(), is(true));
+        InputStream stream = new FileInputStream(file);
+        try {
+            configuration.loadFrom(stream);
+        } finally {
+            stream.close();
+        }
+
+        assertThat(configuration.getProblems().isEmpty(), is(true));
+    }
+
+    @Test
+    public void shoulLoadConfigurationFromRepositorySource() throws Exception {
+        InMemoryRepositorySource source = new InMemoryRepositorySource();
+        source.setName("name");
+        configuration.loadFrom(source);
+        assertThat(configuration.getProblems().isEmpty(), is(true));
+        DnaEngine engine = configuration.build();
+        assertThat(engine, is(notNullValue()));
+        assertThat(engine.getProblems().isEmpty(), is(true));
+    }
+
+    @Test
+    public void shouldLoadConfigurationEvenAfterAlreadyHavingLoadedConfiguration() throws Exception {
+        configuration.loadFrom("src/test/resources/config/configRepository.xml");
+        configuration.loadFrom(new File("src/test/resources/config/configRepository.xml"));
+        configuration.loadFrom(new File("src/test/resources/config/configRepository.xml").toURL());
+        assertThat(configuration.getProblems().isEmpty(), is(true));
+    }
+
+    @Test
+    public void shouldBuildEngineWithDefaultConfiguration() throws Exception {
+        assertThat(configuration.getProblems().isEmpty(), is(true));
+        DnaEngine engine = configuration.build();
+        assertThat(engine, is(notNullValue()));
+        assertThat(engine.getProblems().isEmpty(), is(true));
+    }
+
+    @Test
+    public void shouldLoadConfigurationFromInMemoryRepositorySource() {
+        InMemoryRepositorySource configSource = new InMemoryRepositorySource();
+        configSource.setName("config repo");
+        configuration.loadFrom(configSource).and().save();
+        assertThat(configuration, is(notNullValue()));
+        DnaConfiguration.ConfigurationDefinition content = configuration.getConfigurationDefinition();
+        assertThat(content.getRepositorySource(), is(instanceOf(InMemoryRepositorySource.class)));
+        InMemoryRepositorySource source = (InMemoryRepositorySource)content.getRepositorySource();
+        assertThat(source.getName(), is(configSource.getName()));
+        assertThat(source.getRetryLimit(), is(configSource.getRetryLimit()));
+    }
+
+    @Test
     public void shouldAllowAddingRepositorySourceByClassNameAndSettingProperties() {
         // Update the configuration and save it ...
-        configuration.addSource("Source1")
+        configuration.repositorySource("Source1")
                      .usingClass(InMemoryRepositorySource.class.getName())
                      .loadedFromClasspath()
-                     .describedAs("description")
-                     .with("retryLimit")
-                     .setTo(5)
+                     .setDescription("description")
+                     .setRetryLimit(5)
                      .and()
                      .save();
 
         // Verify that the graph has been updated correctly ...
-        Subgraph subgraph = configuration.graph().getSubgraphOfDepth(3).at("/");
+        DnaConfiguration.ConfigurationDefinition content = configuration.getConfigurationDefinition();
+        Subgraph subgraph = content.graph().getSubgraphOfDepth(3).at("/");
         assertThat(subgraph.getNode("/dna:sources"), is(notNullValue()));
         assertThat(subgraph.getNode("/dna:sources/Source1"), is(notNullValue()));
-        assertThat(subgraph.getNode("/dna:sources/Source1"), hasProperty(DnaLexicon.READABLE_NAME, "Source1"));
+        assertThat(subgraph.getNode("/dna:sources/Source1"), hasProperty(DnaLexicon.DESCRIPTION, "description"));
         assertThat(subgraph.getNode("/dna:sources/Source1"), hasProperty(DnaLexicon.RETRY_LIMIT, 5));
         assertThat(subgraph.getNode("/dna:sources/Source1"), hasProperty(DnaLexicon.CLASSNAME,
                                                                          InMemoryRepositorySource.class.getName()));
     }
 
     @Test
-    public void shouldAllowAddingRepositorySourceByClassNameAndClasspathAndSettingProperties() {
+    public void shouldAllowSettingDescriptionOnRepositorySourceUsingPrefixedPropertyName() {
         // Update the configuration and save it ...
-        configuration.addSource("Source1")
+        configuration.repositorySource("Source1")
                      .usingClass(InMemoryRepositorySource.class.getName())
-                     .loadedFrom("cp1", "cp2")
-                     .describedAs("description")
-                     .with("retryLimit")
-                     .setTo(5)
+                     .loadedFromClasspath()
+                     .setProperty("dna:description", "desc")
                      .and()
                      .save();
 
         // Verify that the graph has been updated correctly ...
-        Subgraph subgraph = configuration.graph().getSubgraphOfDepth(3).at("/");
+        DnaConfiguration.ConfigurationDefinition content = configuration.getConfigurationDefinition();
+        Subgraph subgraph = content.graph().getSubgraphOfDepth(3).at("/");
         assertThat(subgraph.getNode("/dna:sources"), is(notNullValue()));
         assertThat(subgraph.getNode("/dna:sources/Source1"), is(notNullValue()));
-        assertThat(subgraph.getNode("/dna:sources/Source1"), hasProperty(DnaLexicon.READABLE_NAME, "Source1"));
+        assertThat(subgraph.getNode("/dna:sources/Source1"), hasProperty(DnaLexicon.DESCRIPTION, "desc"));
+    }
+
+    @Test
+    public void shouldAllowSettingDescriptionOnRepositorySourceUsingNonPrefixedPropertyName() {
+        // Update the configuration and save it ...
+        configuration.repositorySource("Source1")
+                     .usingClass(InMemoryRepositorySource.class.getName())
+                     .loadedFromClasspath()
+                     .setProperty("description", "desc")
+                     .and()
+                     .save();
+
+        // Verify that the graph has been updated correctly ...
+        DnaConfiguration.ConfigurationDefinition content = configuration.getConfigurationDefinition();
+        Subgraph subgraph = content.graph().getSubgraphOfDepth(3).at("/");
+        assertThat(subgraph.getNode("/dna:sources"), is(notNullValue()));
+        assertThat(subgraph.getNode("/dna:sources/Source1"), is(notNullValue()));
+        assertThat(subgraph.getNode("/dna:sources/Source1"), hasProperty(DnaLexicon.DESCRIPTION, "desc"));
+    }
+
+    @Test
+    public void shouldAllowSettingRetryLimitOnRepositorySourceUsingPrefixedPropertyName() {
+        // Update the configuration and save it ...
+        configuration.repositorySource("Source1")
+                     .usingClass(InMemoryRepositorySource.class.getName())
+                     .loadedFromClasspath()
+                     .setProperty("dna:retryLimit", 5)
+                     .and()
+                     .save();
+
+        // Verify that the graph has been updated correctly ...
+        DnaConfiguration.ConfigurationDefinition content = configuration.getConfigurationDefinition();
+        Subgraph subgraph = content.graph().getSubgraphOfDepth(3).at("/");
+        assertThat(subgraph.getNode("/dna:sources"), is(notNullValue()));
+        assertThat(subgraph.getNode("/dna:sources/Source1"), is(notNullValue()));
         assertThat(subgraph.getNode("/dna:sources/Source1"), hasProperty(DnaLexicon.RETRY_LIMIT, 5));
-        assertThat(subgraph.getNode("/dna:sources/Source1"), hasProperty(DnaLexicon.CLASSNAME,
-                                                                         InMemoryRepositorySource.class.getName()));
-        assertThat(subgraph.getNode("/dna:sources/Source1"), hasProperty(DnaLexicon.CLASSPATH, "cp1", "cp2"));
     }
 
     @Test
-    public void shouldAllowAddingRepositorySourceByClassReferenceAndSettingProperties() {
+    public void shouldAllowSettingRetryLimitOnRepositorySourceUsingNonPrefixedPropertyName() {
         // Update the configuration and save it ...
-        configuration.addSource("Source1")
-                     .usingClass(InMemoryRepositorySource.class)
-                     .describedAs("description")
-                     .with("retryLimit")
-                     .setTo(5)
+        configuration.repositorySource("Source1")
+                     .usingClass(InMemoryRepositorySource.class.getName())
+                     .loadedFromClasspath()
+                     .setProperty("retryLimit", 5)
                      .and()
                      .save();
 
         // Verify that the graph has been updated correctly ...
-        Subgraph subgraph = configuration.graph().getSubgraphOfDepth(3).at("/");
+        DnaConfiguration.ConfigurationDefinition content = configuration.getConfigurationDefinition();
+        Subgraph subgraph = content.graph().getSubgraphOfDepth(3).at("/");
         assertThat(subgraph.getNode("/dna:sources"), is(notNullValue()));
         assertThat(subgraph.getNode("/dna:sources/Source1"), is(notNullValue()));
-        assertThat(subgraph.getNode("/dna:sources/Source1"), hasProperty(DnaLexicon.READABLE_NAME, "Source1"));
         assertThat(subgraph.getNode("/dna:sources/Source1"), hasProperty(DnaLexicon.RETRY_LIMIT, 5));
-        assertThat(subgraph.getNode("/dna:sources/Source1"), hasProperty(DnaLexicon.DESCRIPTION, "description"));
+    }
+
+    @Test
+    public void shouldAllowAddingRepositorySourceByClassNameAndClasspathAndSettingProperties() {
+        // Update the configuration and save it ...
+        configuration.repositorySource("Source1")
+                     .usingClass(InMemoryRepositorySource.class.getName())
+                     .loadedFrom("cp1", "cp2")
+                     .setProperty("retryLimit", 5)
+                     .and()
+                     .save();
+
+        // Verify that the graph has been updated correctly ...
+        DnaConfiguration.ConfigurationDefinition content = configuration.getConfigurationDefinition();
+        Subgraph subgraph = content.graph().getSubgraphOfDepth(3).at("/");
+        assertThat(subgraph.getNode("/dna:sources"), is(notNullValue()));
+        assertThat(subgraph.getNode("/dna:sources/Source1"), is(notNullValue()));
+        assertThat(subgraph.getNode("/dna:sources/Source1"), hasProperty(DnaLexicon.RETRY_LIMIT, 5));
         assertThat(subgraph.getNode("/dna:sources/Source1"), hasProperty(DnaLexicon.CLASSNAME,
                                                                          InMemoryRepositorySource.class.getName()));
+        assertThat(subgraph.getNode("/dna:sources/Source1"), hasProperty(DnaLexicon.CLASSPATH, "cp1", "cp2"));
     }
 
     @Test
-    public void shouldAllowOverwritingRepositorySourceByRepositoryName() {
+    public void shouldAllowAddingRepositorySourceByClassReferenceAndSettingProperties() {
         // Update the configuration and save it ...
-        configuration.addSource("Source1")
+        configuration.repositorySource("Source1")
                      .usingClass(InMemoryRepositorySource.class)
-                     .describedAs("description")
-                     .with("retryLimit")
-                     .setTo(3)
+                     .setProperty("retryLimit", 5)
                      .and()
-                     .addSource("Source1")
-                     .usingClass(InMemoryRepositorySource.class)
-                     .describedAs("new description")
-                     .with("retryLimit")
-                     .setTo(6)
-                     .and()
                      .save();
 
         // Verify that the graph has been updated correctly ...
-        Subgraph subgraph = configuration.graph().getSubgraphOfDepth(3).at("/");
+        DnaConfiguration.ConfigurationDefinition content = configuration.getConfigurationDefinition();
+        Subgraph subgraph = content.graph().getSubgraphOfDepth(3).at("/");
         assertThat(subgraph.getNode("/dna:sources"), is(notNullValue()));
-        assertThat(subgraph.getNode("/dna:sources").getChildren(), hasChild(segment("Source1")));
         assertThat(subgraph.getNode("/dna:sources/Source1"), is(notNullValue()));
-        assertThat(subgraph.getNode("/dna:sources/Source1"), hasProperty(DnaLexicon.READABLE_NAME, "Source1"));
-        assertThat(subgraph.getNode("/dna:sources/Source1"), hasProperty(DnaLexicon.RETRY_LIMIT, 6));
-        assertThat(subgraph.getNode("/dna:sources/Source1"), hasProperty(DnaLexicon.DESCRIPTION, "new description"));
+        assertThat(subgraph.getNode("/dna:sources/Source1"), hasProperty(DnaLexicon.RETRY_LIMIT, 5));
         assertThat(subgraph.getNode("/dna:sources/Source1"), hasProperty(DnaLexicon.CLASSNAME,
                                                                          InMemoryRepositorySource.class.getName()));
     }
@@ -216,27 +339,17 @@
     @Test
     public void shouldAllowAddingMimeTypeDetector() {
         // Update the configuration and save it ...
-        configuration.addSource("Source1")
-                     .usingClass(InMemoryRepositorySource.class)
-                     .describedAs("description")
-                     .and()
-                     .addMimeTypeDetector("detector")
+        configuration.mimeTypeDetector("detector")
                      .usingClass(ExtensionBasedMimeTypeDetector.class)
-                     .describedAs("default detector")
+                     .setDescription("default detector")
                      .and()
                      .save();
 
         // Verify that the graph has been updated correctly ...
-        Subgraph subgraph = configuration.graph().getSubgraphOfDepth(3).at("/");
-        assertThat(subgraph.getNode("/dna:sources").getChildren(), hasChild(segment("Source1")));
-        assertThat(subgraph.getNode("/dna:sources/Source1"), is(notNullValue()));
-        assertThat(subgraph.getNode("/dna:sources/Source1"), hasProperty(DnaLexicon.READABLE_NAME, "Source1"));
-        assertThat(subgraph.getNode("/dna:sources/Source1"), hasProperty(DnaLexicon.DESCRIPTION, "description"));
-        assertThat(subgraph.getNode("/dna:sources/Source1"), hasProperty(DnaLexicon.CLASSNAME,
-                                                                         InMemoryRepositorySource.class.getName()));
+        DnaConfiguration.ConfigurationDefinition content = configuration.getConfigurationDefinition();
+        Subgraph subgraph = content.graph().getSubgraphOfDepth(3).at("/");
         assertThat(subgraph.getNode("/dna:mimeTypeDetectors").getChildren(), hasChild(segment("detector")));
         assertThat(subgraph.getNode("/dna:mimeTypeDetectors/detector"), is(notNullValue()));
-        assertThat(subgraph.getNode("/dna:mimeTypeDetectors/detector"), hasProperty(DnaLexicon.READABLE_NAME, "detector"));
         assertThat(subgraph.getNode("/dna:mimeTypeDetectors/detector"), hasProperty(DnaLexicon.DESCRIPTION, "default detector"));
         assertThat(subgraph.getNode("/dna:mimeTypeDetectors/detector"),
                    hasProperty(DnaLexicon.CLASSNAME, ExtensionBasedMimeTypeDetector.class.getName()));
@@ -245,15 +358,9 @@
     @Test
     public void shouldAllowAddingSequencer() {
         // Update the configuration and save it ...
-        configuration.addSource("Source1")
-                     .usingClass(InMemoryRepositorySource.class)
-                     .describedAs("description")
-                     .named("A Source")
-                     .and()
-                     .addSequencer("sequencerA")
+        configuration.sequencer("sequencerA")
                      .usingClass(MockStreamSequencerA.class)
-                     .named("The (Main) Sequencer")
-                     .describedAs("Mock Sequencer A")
+                     .setDescription("Mock Sequencer A")
                      .sequencingFrom("/foo/source")
                      .andOutputtingTo("/foo/target")
                      .sequencingFrom("/bar/source")
@@ -262,36 +369,32 @@
                      .save();
 
         // Verify that the graph has been updated correctly ...
-        Subgraph subgraph = configuration.graph().getSubgraphOfDepth(3).at("/");
-        assertThat(subgraph.getNode("/dna:sources").getChildren(), hasChild(segment("Source1")));
-        assertThat(subgraph.getNode("/dna:sources/Source1"), is(notNullValue()));
-        assertThat(subgraph.getNode("/dna:sources/Source1"), hasProperty(DnaLexicon.READABLE_NAME, "A Source"));
-        assertThat(subgraph.getNode("/dna:sources/Source1"), hasProperty(DnaLexicon.DESCRIPTION, "description"));
-        assertThat(subgraph.getNode("/dna:sources/Source1"), hasProperty(DnaLexicon.CLASSNAME,
-                                                                         InMemoryRepositorySource.class.getName()));
+        DnaConfiguration.ConfigurationDefinition content = configuration.getConfigurationDefinition();
+        Subgraph subgraph = content.graph().getSubgraphOfDepth(3).at("/");
         assertThat(subgraph.getNode("/dna:sequencers").getChildren(), hasChild(segment("sequencerA")));
         assertThat(subgraph.getNode("/dna:sequencers/sequencerA"), is(notNullValue()));
-        assertThat(subgraph.getNode("/dna:sequencers/sequencerA"), hasProperty(DnaLexicon.READABLE_NAME, "The (Main) Sequencer"));
         assertThat(subgraph.getNode("/dna:sequencers/sequencerA"), hasProperty(DnaLexicon.DESCRIPTION, "Mock Sequencer A"));
         assertThat(subgraph.getNode("/dna:sequencers/sequencerA"), hasProperty(DnaLexicon.CLASSNAME,
                                                                                MockStreamSequencerA.class.getName()));
-        System.out.println(subgraph.getNode("/dna:sequencers/sequencerA").getProperty(DnaLexicon.PATH_EXPRESSIONS));
-        assertThat(subgraph.getNode("/dna:sequencers/sequencerA"), hasProperty(DnaLexicon.PATH_EXPRESSIONS,
+        System.out.println(subgraph.getNode("/dna:sequencers/sequencerA").getProperty(DnaLexicon.PATH_EXPRESSION));
+        assertThat(subgraph.getNode("/dna:sequencers/sequencerA"), hasProperty(DnaLexicon.PATH_EXPRESSION,
                                                                                "/foo/source => /foo/target",
                                                                                "/bar/source => /bar/target"));
     }
 
     @Test
     public void shouldAllowConfigurationInMultipleSteps() {
-        configuration.addSource("Source1").usingClass(InMemoryRepositorySource.class).describedAs("description");
-        configuration.addMimeTypeDetector("detector")
+        // Update the configuration and save it ...
+        configuration.repositorySource("Source1")
+                     .usingClass(InMemoryRepositorySource.class.getName())
+                     .loadedFrom("cp1", "cp2")
+                     .setProperty("retryLimit", 5);
+        configuration.mimeTypeDetector("detector")
                      .usingClass(ExtensionBasedMimeTypeDetector.class)
-                     .describedAs("default detector");
-        configuration.addSequencer("sequencerA")
-                     .usingClass(MockSequencerA.class.getName())
-                     .loadedFromClasspath()
-                     .named("The (Main) Sequencer")
-                     .describedAs("Mock Sequencer A")
+                     .setDescription("default detector");
+        configuration.sequencer("sequencerA")
+                     .usingClass(MockStreamSequencerA.class)
+                     .setDescription("Mock Sequencer A")
                      .sequencingFrom("/foo/source")
                      .andOutputtingTo("/foo/target")
                      .sequencingFrom("/bar/source")
@@ -299,27 +402,29 @@
         configuration.save();
 
         // Verify that the graph has been updated correctly ...
-        Subgraph subgraph = configuration.graph().getSubgraphOfDepth(3).at("/");
-        assertThat(subgraph.getNode("/dna:sources").getChildren(), hasChild(segment("Source1")));
+        DnaConfiguration.ConfigurationDefinition content = configuration.getConfigurationDefinition();
+        Subgraph subgraph = content.graph().getSubgraphOfDepth(3).at("/");
+
+        assertThat(subgraph.getNode("/dna:sources"), is(notNullValue()));
         assertThat(subgraph.getNode("/dna:sources/Source1"), is(notNullValue()));
-        assertThat(subgraph.getNode("/dna:sources/Source1"), hasProperty(DnaLexicon.READABLE_NAME, "Source1"));
-        assertThat(subgraph.getNode("/dna:sources/Source1"), hasProperty(DnaLexicon.DESCRIPTION, "description"));
+        assertThat(subgraph.getNode("/dna:sources/Source1"), hasProperty(DnaLexicon.RETRY_LIMIT, 5));
         assertThat(subgraph.getNode("/dna:sources/Source1"), hasProperty(DnaLexicon.CLASSNAME,
                                                                          InMemoryRepositorySource.class.getName()));
+        assertThat(subgraph.getNode("/dna:sources/Source1"), hasProperty(DnaLexicon.CLASSPATH, "cp1", "cp2"));
+
         assertThat(subgraph.getNode("/dna:mimeTypeDetectors").getChildren(), hasChild(segment("detector")));
         assertThat(subgraph.getNode("/dna:mimeTypeDetectors/detector"), is(notNullValue()));
-        assertThat(subgraph.getNode("/dna:mimeTypeDetectors/detector"), hasProperty(DnaLexicon.READABLE_NAME, "detector"));
         assertThat(subgraph.getNode("/dna:mimeTypeDetectors/detector"), hasProperty(DnaLexicon.DESCRIPTION, "default detector"));
         assertThat(subgraph.getNode("/dna:mimeTypeDetectors/detector"),
                    hasProperty(DnaLexicon.CLASSNAME, ExtensionBasedMimeTypeDetector.class.getName()));
+
         assertThat(subgraph.getNode("/dna:sequencers").getChildren(), hasChild(segment("sequencerA")));
         assertThat(subgraph.getNode("/dna:sequencers/sequencerA"), is(notNullValue()));
-        assertThat(subgraph.getNode("/dna:sequencers/sequencerA"), hasProperty(DnaLexicon.READABLE_NAME, "The (Main) Sequencer"));
         assertThat(subgraph.getNode("/dna:sequencers/sequencerA"), hasProperty(DnaLexicon.DESCRIPTION, "Mock Sequencer A"));
         assertThat(subgraph.getNode("/dna:sequencers/sequencerA"), hasProperty(DnaLexicon.CLASSNAME,
-                                                                               MockSequencerA.class.getName()));
-        System.out.println(subgraph.getNode("/dna:sequencers/sequencerA").getProperty(DnaLexicon.PATH_EXPRESSIONS));
-        assertThat(subgraph.getNode("/dna:sequencers/sequencerA"), hasProperty(DnaLexicon.PATH_EXPRESSIONS,
+                                                                               MockStreamSequencerA.class.getName()));
+        System.out.println(subgraph.getNode("/dna:sequencers/sequencerA").getProperty(DnaLexicon.PATH_EXPRESSION));
+        assertThat(subgraph.getNode("/dna:sequencers/sequencerA"), hasProperty(DnaLexicon.PATH_EXPRESSION,
                                                                                "/foo/source => /foo/target",
                                                                                "/bar/source => /bar/target"));
     }

Modified: trunk/dna-repository/src/test/java/org/jboss/dna/repository/DnaEngineTest.java
===================================================================
--- trunk/dna-repository/src/test/java/org/jboss/dna/repository/DnaEngineTest.java	2009-06-03 20:09:11 UTC (rev 968)
+++ trunk/dna-repository/src/test/java/org/jboss/dna/repository/DnaEngineTest.java	2009-06-03 20:10:19 UTC (rev 969)
@@ -35,9 +35,11 @@
 import javax.jcr.observation.Event;
 import org.jboss.dna.graph.connector.RepositoryConnection;
 import org.jboss.dna.graph.connector.inmemory.InMemoryRepositorySource;
+import org.jboss.dna.graph.mimetype.ExtensionBasedMimeTypeDetector;
 import org.jboss.dna.graph.mimetype.MimeTypeDetector;
 import org.jboss.dna.repository.sequencer.MockStreamSequencerA;
 import org.jboss.dna.repository.sequencer.SequencingService;
+import org.junit.After;
 import org.junit.Before;
 import org.junit.Test;
 
@@ -53,6 +55,18 @@
     public void beforeEach() {
     }
 
+    @After
+    public void afterEach() throws Exception {
+        if (engine != null) {
+            try {
+                engine.shutdown();
+                engine.awaitTermination(3, TimeUnit.SECONDS);
+            } finally {
+                engine = null;
+            }
+        }
+    }
+
     @Test
     public void shouldAllowCreatingWithEmptyConfig() {
         engine = new DnaConfiguration().build();
@@ -60,13 +74,10 @@
 
     @Test
     public void shouldAllowCreatingWithConfigRepository() throws InterruptedException {
-        engine = new DnaConfiguration().withConfigurationSource()
-                                       .usingClass(InMemoryRepositorySource.class)
-                                       .describedAs("Configuration Repository")
-                                       .with("name")
-                                       .setTo("config repo")
-                                       .and()
-                                       .build();
+        InMemoryRepositorySource configSource = new InMemoryRepositorySource();
+        configSource.setName("config repo");
+        engine = new DnaConfiguration().loadFrom(configSource).build();
+        engine.start();
 
         assertThat(engine.getRepositorySource("config repo"), is(notNullValue()));
         assertThat(engine.getRepositorySource("config repo"), is(instanceOf(InMemoryRepositorySource.class)));
@@ -81,19 +92,17 @@
     }
 
     @Test
-    public void shouldAllowCreatingMultipleRepositories() throws Exception {
-        engine = new DnaConfiguration().withConfigurationSource()
-                                       .usingClass(InMemoryRepositorySource.class)
-                                       .describedAs("Configuration Repository")
-                                       .with("name")
-                                       .setTo("config repo")
+    public void shouldAllowCreatingMultipleRepositorySources() throws Exception {
+        InMemoryRepositorySource configSource = new InMemoryRepositorySource();
+        configSource.setName("config repo");
+        engine = new DnaConfiguration().loadFrom(configSource)
                                        .and()
-                                       .addSource("JCR")
+                                       .repositorySource("JCR")
                                        .usingClass(InMemoryRepositorySource.class)
-                                       .describedAs("Backing Repository for JCR Implementation")
-                                       .with("name")
-                                       .setTo("JCR")
+                                       .setDescription("Backing Repository for JCR Implementation")
+                                       .setProperty("name", "JCR")
                                        .and()
+                                       .save()
                                        .build();
         // Start the engine ...
         engine.start();
@@ -115,42 +124,48 @@
 
     @Test
     public void shouldAllowAddingMimeTypeDetectors() throws Exception {
-        engine = new DnaConfiguration().withConfigurationSource()
+        InMemoryRepositorySource configSource = new InMemoryRepositorySource();
+        configSource.setName("config repo");
+        engine = new DnaConfiguration().loadFrom(configSource)
+                                       .and()
+                                       .repositorySource("JCR")
                                        .usingClass(InMemoryRepositorySource.class)
-                                       .describedAs("Configuration Repository")
-                                       .with("name")
-                                       .setTo("config repo")
+                                       .setDescription("Backing Repository for JCR Implementation")
+                                       .setProperty("name", "JCR")
                                        .and()
-                                       .addMimeTypeDetector("default")
-                                       .usingClass(MockMimeTypeDetector.class)
-                                       .describedAs("Default MimeTypeDetector")
-                                       .with("mimeType")
-                                       .setTo("mock")
+                                       .mimeTypeDetector("default")
+                                       .usingClass(ExtensionBasedMimeTypeDetector.class)
+                                       .setDescription("Default MimeTypeDetector")
                                        .and()
                                        .build();
+        engine.start();
 
         assertThat(engine.getRepositorySource("config repo"), is(notNullValue()));
         assertThat(engine.getRepositorySource("config repo"), is(instanceOf(InMemoryRepositorySource.class)));
 
         MimeTypeDetector detector = engine.getExecutionContext().getMimeTypeDetector();
-        assertThat(detector.mimeTypeOf("test", new ByteArrayInputStream("This is useless data".getBytes())), is("mock"));
+        assertThat(detector.mimeTypeOf("test", new ByteArrayInputStream("This is useless data".getBytes())), is("text/plain"));
     }
 
     @Test
     public void shouldAllowAddingSequencers() throws Exception {
-        engine = new DnaConfiguration().withConfigurationSource()
+        InMemoryRepositorySource configSource = new InMemoryRepositorySource();
+        configSource.setName("config repo");
+        engine = new DnaConfiguration().loadFrom(configSource)
+                                       .and()
+                                       .repositorySource("JCR")
                                        .usingClass(InMemoryRepositorySource.class)
-                                       .describedAs("Configuration Repository")
-                                       .with("name")
-                                       .setTo("config repo")
+                                       .setDescription("Backing Repository for JCR Implementation")
+                                       .setProperty("name", "JCR")
                                        .and()
-                                       .addSequencer("Mock Sequencer A")
+                                       .sequencer("Mock Sequencer A")
                                        .usingClass(MockStreamSequencerA.class)
-                                       .describedAs("A Mock Sequencer")
+                                       .setDescription("A Mock Sequencer")
                                        .sequencingFrom("/**")
                                        .andOutputtingTo("/")
                                        .and()
                                        .build();
+        engine.start();
 
         assertThat(engine.getRepositorySource("config repo"), is(notNullValue()));
         assertThat(engine.getRepositorySource("config repo"), is(instanceOf(InMemoryRepositorySource.class)));

Added: trunk/dna-repository/src/test/resources/config/configRepository.xml
===================================================================
--- trunk/dna-repository/src/test/resources/config/configRepository.xml	                        (rev 0)
+++ trunk/dna-repository/src/test/resources/config/configRepository.xml	2009-06-03 20:10:19 UTC (rev 969)
@@ -0,0 +1,67 @@
+<?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
+  -->
+<configuration xmlns:dna="http://www.jboss.org/dna/1.0"
+               xmlns:jcr="http://www.jcp.org/jcr/1.0"
+               xmlns:nt="http://www.jcp.org/jcr/nt/1.0">
+    <!-- Define the sources from which content is made available. -->
+    <dna:sources jcr:primaryType="nt:unstructured">
+        <dna:source jcr:name="Cars" dna:classname="org.jboss.dna.graph.connector.inmemory.InMemoryRepositorySource" dna:retryLimit="3" defaultWorkspaceName="default"/>
+        <dna:source jcr:name="Aircraft" dna:classname="org.jboss.dna.graph.connector.inmemory.InMemoryRepositorySource">
+            <defaultWorkspaceName>default</defaultWorkspaceName>
+        </dna:source>
+        <dna:source jcr:name="Cache" dna:classname="org.jboss.dna.graph.connector.inmemory.InMemoryRepositorySource">
+            <defaultWorkspaceName>default</defaultWorkspaceName>
+        </dna:source>
+    </dna:sources>
+    <!-- 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: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 the mime type detectors. This is an optional section. -->
+    <dna:mimeTypeDetectors>
+        <dna:mimeTypeDetector jcr:name="Detector">
+            <dna:description>Standard extension-based MIME type detector</dna:description>        
+            <!-- 
+            Specify the implementation class (required), as a child element or attribute on parent element.
+            -->
+            <dna:classname>org.jboss.dna.graph.mimetype.ExtensionBasedMimeTypeDetector</dna:classname>
+            <!-- 
+            Specify the classpath (optional) as an ordered list of 'names', where each name is significant to 
+            the classpath factory.  For example, a name could be an OSGI identifier or a Maven coordinate,
+            depending upon the classpath factory being used.  If there is only one 'name' in the classpath,
+            it may be specified as an attribute on the 'mimeTypeDetector' element.  If there is more than one
+            'name', then they must be specified as child 'classpath' elements. Blank or empty values are ignored. 
+             -->
+            <dna:classpath></dna:classpath>
+            <dna:classpath></dna:classpath>
+        </dna:mimeTypeDetector>
+    </dna:mimeTypeDetectors>
+</configuration>
\ No newline at end of file


Property changes on: trunk/dna-repository/src/test/resources/config/configRepository.xml
___________________________________________________________________
Name: svn:keywords
   + Id Revision
Name: svn:eol-style
   + LF

Modified: trunk/docs/examples/gettingstarted/sequencers/pom.xml
===================================================================
--- trunk/docs/examples/gettingstarted/sequencers/pom.xml	2009-06-03 20:09:11 UTC (rev 968)
+++ trunk/docs/examples/gettingstarted/sequencers/pom.xml	2009-06-03 20:10:19 UTC (rev 969)
@@ -24,12 +24,6 @@
     </dependency>
     <dependency>
       <groupId>org.jboss.dna</groupId>
-      <artifactId>dna-common</artifactId>
-      <version>${pom.version}</version>
-      <scope>compile</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.jboss.dna</groupId>
       <artifactId>dna-sequencer-images</artifactId>
       <version>${pom.version}</version>
       <scope>runtime</scope>
@@ -69,24 +63,44 @@
       <artifactId>jcr</artifactId>
     </dependency>
     <!-- 
-      Apache Jackrabbit (JCR Implementation) for repository implementation
+      Test cases use JUnit
     -->
     <dependency>
-      <groupId>org.apache.jackrabbit</groupId>
-      <artifactId>jackrabbit-api</artifactId>
+      <groupId>junit</groupId>
+      <artifactId>junit</artifactId>
+      <scope>test</scope>
     </dependency>
-    <dependency>
-      <groupId>org.apache.jackrabbit</groupId>
-      <artifactId>jackrabbit-core</artifactId>
-    </dependency>
     <!-- 
-      Test cases use JUnit
+      JAAS implementation (and dependencies)
     -->
     <dependency>
-      <groupId>junit</groupId>
-      <artifactId>junit</artifactId>
+        <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>
 
   <build>

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	2009-06-03 20:09:11 UTC (rev 968)
+++ trunk/docs/examples/gettingstarted/sequencers/src/main/java/org/jboss/example/dna/sequencer/SequencingClient.java	2009-06-03 20:10:19 UTC (rev 969)
@@ -41,16 +41,16 @@
 import javax.jcr.Session;
 import javax.jcr.Value;
 import javax.jcr.ValueFormatException;
-import javax.security.auth.login.LoginException;
-import org.jboss.dna.graph.ExecutionContext;
 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.JcrRepository;
 import org.jboss.dna.repository.sequencer.SequencingService;
 import org.jboss.dna.repository.util.SessionFactory;
 import org.jboss.dna.sequencer.image.ImageMetadataSequencer;
 import org.jboss.dna.sequencer.java.JavaMetadataSequencer;
 import org.jboss.dna.sequencer.mp3.Mp3MetadataSequencer;
+import org.jboss.security.config.IDTrustConfiguration;
 
 /**
  * @author Randall Hauch
@@ -63,52 +63,48 @@
     public static final char[] DEFAULT_PASSWORD = "secret".toCharArray();
 
     public static void main( String[] args ) {
-        // Set up an execution context in which we'll run, and authenticate using JAAS ...
-        ExecutionContext context = new ExecutionContext();
-        String jaasAppContext = "myAppContext";
-        String username = "jsmith";
-        char[] password = "secrete".toCharArray();
+        // Set up the JAAS provider (IDTrust) and a policy file (which defines the "dna-jcr" login config name)
+        String configFile = "security/jaas.conf.xml";
+        IDTrustConfiguration idtrustConfig = new IDTrustConfiguration();
         try {
-            context.with(jaasAppContext, username, password);
-        } catch (LoginException err) {
-            System.err.println("Error authenticating \"" + username + "\". Check username and password and try again.");
+            idtrustConfig.config(configFile);
+        } catch (Exception ex) {
+            throw new IllegalStateException(ex);
         }
 
         // Configure the DNA JCR engine ...
         String repositoryId = "content";
         String workspaceName = "default";
-        JcrConfiguration config = new JcrConfiguration(context);
-        config.withConfigurationSource().usingClass(InMemoryRepositorySource.class).usingWorkspace("default").under("/");
-        // Set up an in-memory repository where the uploaded and sequenced content will be stored ...
-        config.addSource(repositoryId)
+        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("store")
               .usingClass(InMemoryRepositorySource.class)
-              .withNodeTypes(ImageMetadataSequencer.class.getResource("org/jboss/dna/sequencer/image/images.cnd"))
-              .withNodeTypes(Mp3MetadataSequencer.class.getResource("org/jboss/dna/sequencer/mp3/mp3.cnd"))
-              .withNodeTypes(JavaMetadataSequencer.class.getResource("org/jboss/dna/sequencer/java/javaSource.cnd"))
-              .named("Content Repository")
-              .describedAs("The repository for our content")
-              .with("defaultWorkspaceName")
-              .setTo(workspaceName);
+              .setDescription("The repository for our content")
+              .setProperty("defaultWorkspaceName", workspaceName);
+        // Set up the JCR repository to use the source ...
+        config.repository(repositoryId)
+              .addNodeTypes(ImageMetadataSequencer.class.getResource("org/jboss/dna/sequencer/image/images.cnd"))
+              .addNodeTypes(Mp3MetadataSequencer.class.getResource("org/jboss/dna/sequencer/mp3/mp3.cnd"))
+              .addNodeTypes(JavaMetadataSequencer.class.getResource("org/jboss/dna/sequencer/java/javaSource.cnd"))
+              .setSource("store")
+              .setOption(JcrRepository.Option.JAAS_LOGIN_CONFIG_NAME, "dna-jcr");
         // Set up the image sequencer ...
-        config.addSequencer("images")
+        config.sequencer("Image Sequencer")
               .usingClass("org.jboss.dna.sequencer.image.ImageMetadataSequencer")
               .loadedFromClasspath()
-              .describedAs("Sequences image files to extract the characteristics of the image")
-              .named("Image Sequencer")
+              .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");
         // Set up the MP3 sequencer ...
-        config.addSequencer("mp3s")
+        config.sequencer("MP3 Sequencer")
               .usingClass(Mp3MetadataSequencer.class)
-              .named("MP3 Sequencer")
-              .describedAs("Sequences mp3 files to extract the id3 tags of the audio file")
+              .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 source file sequencer ...
-        config.addSequencer("javaSource")
+        config.sequencer("Java Sequencer")
               .usingClass(JavaMetadataSequencer.class)
-              .named("Java Sequencer")
-              .describedAs("Sequences mp3 files to extract the id3 tags of the audio file")
+              .setDescription("Sequences mp3 files to extract the id3 tags of the audio file")
               .sequencingFrom("//(*.mp3[*])/jcr:content[@jcr:data]")
               .andOutputtingTo("/mp3s/$1");
 

Added: trunk/docs/examples/gettingstarted/sequencers/src/main/resources/security/jaas.conf.xml
===================================================================
--- trunk/docs/examples/gettingstarted/sequencers/src/main/resources/security/jaas.conf.xml	                        (rev 0)
+++ trunk/docs/examples/gettingstarted/sequencers/src/main/resources/security/jaas.conf.xml	2009-06-03 20:10:19 UTC (rev 969)
@@ -0,0 +1,24 @@
+<?xml version='1.0'?>
+
+<policy xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="urn:jboss:security-config:5.0" xmlns="urn:jboss:security-config:5.0"
+	xmlns:jbxb="urn:jboss:security-config:5.0">
+	<application-policy name="dna-jcr">
+		<authentication>
+			<login-module code="org.jboss.security.auth.spi.UsersRolesLoginModule" flag="required">
+                <module-option name="usersProperties">security/users.properties</module-option>
+                <module-option name="rolesProperties">security/roles.properties</module-option>
+				<module-option name="name">1.1</module-option>
+				<module-option name="succeed">true</module-option>
+				<module-option name="throwEx">false</module-option>
+			</login-module>
+		</authentication>
+<!-- 		
+		<authorization>
+			<policy-module code="org.jboss.security.idtrust.impl.plugins.authorization.IDTrustAuthorizationModule">
+				<module-option name="roles">validuser</module-option>
+			</policy-module>
+		</authorization>
+-->		
+	</application-policy>
+</policy>


Property changes on: trunk/docs/examples/gettingstarted/sequencers/src/main/resources/security/jaas.conf.xml
___________________________________________________________________
Name: svn:keywords
   + Id Revision
Name: svn:eol-style
   + LF

Added: trunk/docs/examples/gettingstarted/sequencers/src/main/resources/security/roles.properties
===================================================================
--- trunk/docs/examples/gettingstarted/sequencers/src/main/resources/security/roles.properties	                        (rev 0)
+++ trunk/docs/examples/gettingstarted/sequencers/src/main/resources/security/roles.properties	2009-06-03 20:10:19 UTC (rev 969)
@@ -0,0 +1,2 @@
+#<userName>=[readonly[.<workspaceName>] | readwrite[.<workspaceName>]][, [readonly[.<workspaceName>] | readwrite[.<workspaceName>]]]*
+jsmith=readwrite

Added: trunk/docs/examples/gettingstarted/sequencers/src/main/resources/security/users.properties
===================================================================
--- trunk/docs/examples/gettingstarted/sequencers/src/main/resources/security/users.properties	                        (rev 0)
+++ trunk/docs/examples/gettingstarted/sequencers/src/main/resources/security/users.properties	2009-06-03 20:10:19 UTC (rev 969)
@@ -0,0 +1,2 @@
+# <username>=<password>
+jsmith=secret

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	2009-06-03 20:09:11 UTC (rev 968)
+++ trunk/docs/examples/gettingstarted/sequencers/src/test/java/org/jboss/example/dna/sequencer/SequencingClientTest.java	2009-06-03 20:10:19 UTC (rev 969)
@@ -31,6 +31,12 @@
 import java.net.MalformedURLException;
 import java.net.URL;
 import org.jboss.dna.common.util.FileUtil;
+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.image.ImageMetadataSequencer;
+import org.jboss.dna.sequencer.java.JavaMetadataSequencer;
+import org.jboss.dna.sequencer.mp3.Mp3MetadataSequencer;
 import org.junit.After;
 import org.junit.Before;
 import org.junit.Ignore;
@@ -57,23 +63,49 @@
         // Get the URL of source (MySource.java), that have to be sequencing
         this.javaSourceUrl = FileUtil.convertFileToURL("workspace/project1/src/org/acme/MySource.java");
 
-        client = new SequencingClient();
-        client.setWorkingDirectory("target/repositoryData");
-        client.setJackrabbitConfigPath("src/main/resources/jackrabbitConfig.xml");
-        FileUtil.delete("target/repositoryData");
+        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 ...
+        config.repositorySource("store")
+              .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(ImageMetadataSequencer.class.getClassLoader().getResource("org/jboss/dna/sequencer/image/images.cnd"))
+              .addNodeTypes(Mp3MetadataSequencer.class.getClassLoader().getResource("org/jboss/dna/sequencer/mp3/mp3.cnd"))
+              .addNodeTypes(JavaMetadataSequencer.class.getClassLoader()
+                                                       .getResource("org/jboss/dna/sequencer/java/javaSource.cnd"))
+              .setSource("store")
+              .setOption(JcrRepository.Option.JAAS_LOGIN_CONFIG_NAME, "dna-jcr");
+        // Set up the image sequencer ...
+        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");
+        // Set up the MP3 sequencer ...
+        config.sequencer("MP3 Sequencer")
+              .usingClass(Mp3MetadataSequencer.class)
+              .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 source file sequencer ...
+        config.sequencer("Java Sequencer")
+              .usingClass(JavaMetadataSequencer.class)
+              .setDescription("Sequences mp3 files to extract the id3 tags of the audio file")
+              .sequencingFrom("//(*.mp3[*])/jcr:content[@jcr:data]")
+              .andOutputtingTo("/mp3s/$1");
+
+        // Now start the client and tell it which repository and workspace to use ...
+        client = new SequencingClient(config, repositoryId, workspaceName);
     }
 
     @After
     public void afterEach() throws Exception {
-        try {
-            client.shutdownDnaServices();
-        } finally {
-            try {
-                client.shutdownRepository();
-            } finally {
-                FileUtil.delete("target/repositoryData");
-            }
-        }
+        if (client != null) client.shutdownRepository();
     }
 
     @Test
@@ -93,25 +125,14 @@
 
     @Ignore
     @Test
-    public void shouldStartupAndShutdownRepositoryAndSequencingService() throws Exception {
-        client.startRepository();
-        client.startDnaServices();
-        client.shutdownDnaServices();
-        client.shutdownRepository();
-    }
-
-    @Ignore
-    @Test
     public void shouldUploadAndSequencePngFile() throws Exception {
         client.setUserInterface(new MockUserInterface(this.pngImageUrl, "/a/b/caution.png", 1));
         client.startRepository();
-        client.startDnaServices();
         client.uploadFile();
 
         // Use a trick to wait until the sequencing has been done by sleeping (to give the sequencing time to start)
         // and to then shut down the DNA services (which will block until all sequencing has been completed) ...
         Thread.sleep(1000);
-        client.shutdownDnaServices();
 
         // The sequencers should have run, so perform the search.
         // The mock user interface checks the results.
@@ -125,13 +146,11 @@
     public void shouldUploadAndSequenceJpegFile() throws Exception {
         client.setUserInterface(new MockUserInterface(this.jpegImageUrl, "/a/b/caution.jpeg", 1));
         client.startRepository();
-        client.startDnaServices();
         client.uploadFile();
 
         // Use a trick to wait until the sequencing has been done by sleeping (to give the sequencing time to start)
         // and to then shut down the DNA services (which will block until all sequencing has been completed) ...
         Thread.sleep(1000);
-        client.shutdownDnaServices();
 
         // The sequencers should have run, so perform the search.
         // The mock user interface checks the results.
@@ -145,13 +164,11 @@
     public void shouldUploadAndNotSequencePictFile() throws Exception {
         client.setUserInterface(new MockUserInterface(this.pictImageUrl, "/a/b/caution.pict", 0));
         client.startRepository();
-        client.startDnaServices();
         client.uploadFile();
 
         // Use a trick to wait until the sequencing has been done by sleeping (to give the sequencing time to start)
         // and to then shut down the DNA services (which will block until all sequencing has been completed) ...
         Thread.sleep(1000);
-        client.shutdownDnaServices();
 
         // The sequencers should have run, so perform the search.
         // The mock user interface checks the results.
@@ -165,13 +182,11 @@
     public void shouldUploadAndSequenceMp3File() throws Exception {
         client.setUserInterface(new MockUserInterface(this.mp3Url, "/a/b/test.mp3", 1));
         client.startRepository();
-        client.startDnaServices();
         client.uploadFile();
 
         // Use a trick to wait until the sequencing has been done by sleeping (to give the sequencing time to start)
         // and to then shut down the DNA services (which will block until all sequencing has been completed) ...
         Thread.sleep(1000);
-        client.shutdownDnaServices();
 
         // The sequencers should have run, so perform the search.
         // The mock user interface checks the results.
@@ -198,13 +213,11 @@
     public void shouldUploadAndSequenceJavaSourceFile() throws Exception {
         client.setUserInterface(new MockUserInterface(this.javaSourceUrl, "/a/b/MySource.java", 1));
         client.startRepository();
-        client.startDnaServices();
         client.uploadFile();
 
         // Use a trick to wait until the sequencing has been done by sleeping (to give the sequencing time to start)
         // and to then shut down the DNA services (which will block until all sequencing has been completed) ...
         Thread.sleep(1000);
-        client.shutdownDnaServices();
 
         // The sequencers should have run, so perform the search.
         // The mock user interface checks the results.

Modified: trunk/extensions/dna-connector-jbosscache/src/main/java/org/jboss/dna/connector/jbosscache/JBossCacheRequestProcessor.java
===================================================================
--- trunk/extensions/dna-connector-jbosscache/src/main/java/org/jboss/dna/connector/jbosscache/JBossCacheRequestProcessor.java	2009-06-03 20:09:11 UTC (rev 968)
+++ trunk/extensions/dna-connector-jbosscache/src/main/java/org/jboss/dna/connector/jbosscache/JBossCacheRequestProcessor.java	2009-06-03 20:10:19 UTC (rev 969)
@@ -564,7 +564,8 @@
         assert original != null;
         assert newParent != null;
         // Get or create the new node ...
-        Path.Segment name = desiredName != null ? context.getValueFactories().getPathFactory().createSegment(desiredName) : (Path.Segment)original.getFqn().getLastElement();
+        Path.Segment name = desiredName != null ? context.getValueFactories().getPathFactory().createSegment(desiredName) : (Path.Segment)original.getFqn()
+                                                                                                                                                  .getLastElement();
 
         // Update the children to account for same-name siblings.
         // This not only updates the FQN of the child nodes, but it also sets the property that stores the
@@ -639,11 +640,11 @@
                     ChildInfo info = new ChildInfo(childName, snsIndex);
                     childrenWithChangedName.add(info);
                 }
-                
+
                 snsIndex++;
                 if (!foundBeforeNode) index++;
             }
-            
+
         }
         if (addChildWithName) {
             // Make room for the new child at the end of the array ...
@@ -664,7 +665,7 @@
                 // Make sure that we add a record for the new node if it hasn't previously been added
                 ChildInfo info = new ChildInfo(null, index);
                 childrenWithChangedName.add(info);
-                
+
             }
             Path.Segment newSegment = context.getValueFactories().getPathFactory().createSegment(changedName);
             childNames[index] = newSegment;
@@ -760,8 +761,9 @@
                     // don't copy ...
                 } else {
                     // Append an updated segment ...
-                    Path.Segment newSegment = context.getValueFactories().getPathFactory().createSegment(childName.getName(),
-                                                                                                         childName.getIndex() - 1);
+                    Path.Segment newSegment = context.getValueFactories()
+                                                     .getPathFactory()
+                                                     .createSegment(childName.getName(), childName.getIndex() - 1);
                     newChildNames[index] = newSegment;
                     // Replace the child with the correct FQN ...
                     changeNodeName(cache, parent, childName, newSegment, context);
@@ -793,7 +795,9 @@
     }
 
     /**
-     * Utility class used by the {@link #updateChildList(Cache, Node, Name, ExecutionContext, boolean)} method.
+     * Utility class used by the
+     * {@link JBossCacheRequestProcessor#updateChildList(Cache, Node, Name, org.jboss.dna.graph.property.Path.Segment, ExecutionContext, boolean)}
+     * method.
      * 
      * @author Randall Hauch
      */
@@ -806,9 +810,10 @@
             this.segment = childSegment;
             this.childIndex = childIndex;
         }
-        
+
+        @Override
         public String toString() {
-            return (segment != null ? segment.getString() : "null") + "@" + childIndex; 
+            return (segment != null ? segment.getString() : "null") + "@" + childIndex;
         }
 
     }

Modified: trunk/extensions/dna-sequencer-java/src/main/resources/org/jboss/dna/sequencer/java/javaSource.cnd
===================================================================
--- trunk/extensions/dna-sequencer-java/src/main/resources/org/jboss/dna/sequencer/java/javaSource.cnd	2009-06-03 20:09:11 UTC (rev 968)
+++ trunk/extensions/dna-sequencer-java/src/main/resources/org/jboss/dna/sequencer/java/javaSource.cnd	2009-06-03 20:10:19 UTC (rev 969)
@@ -107,7 +107,7 @@
  * Single element annotation  e.g. @Path("/book")
  */
 [java:singleElementAnnotation] > nt:unstructured
- - java:singleElementAnnotationNam
+ - java:singleElementAnnotationName (string) mandatory
  + java:value (java:elementValue) = java:elementValue mandatory
 
 /** 



From dna-commits at lists.jboss.org  Wed Jun  3 16:26:37 2009
From: dna-commits at lists.jboss.org (dna-commits at lists.jboss.org)
Date: Wed, 03 Jun 2009 16:26:37 -0400
Subject: [dna-commits] DNA SVN: r970 -
	trunk/dna-jcr/src/main/java/org/jboss/dna/jcr.
Message-ID: <E1MBx2j-0002fS-5P@committer01.frg.pub.inap.atl.jboss.com>

Author: rhauch
Date: 2009-06-03 16:26:37 -0400 (Wed, 03 Jun 2009)
New Revision: 970

Modified:
   trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/JcrEngine.java
Log:
DNA-389 Corrected the JcrEngine's code that obtained a too-shallow subgraph of the configuration repository, so that it obtains a sufficiently deep subgraph.

Modified: trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/JcrEngine.java
===================================================================
--- trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/JcrEngine.java	2009-06-03 20:10:19 UTC (rev 969)
+++ trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/JcrEngine.java	2009-06-03 20:26:37 UTC (rev 970)
@@ -103,7 +103,7 @@
         Path repositoriesPath = pathFactory.create(configuration.getPath(), DnaLexicon.REPOSITORIES);
         Path repositoryPath = pathFactory.create(repositoriesPath, repositoryName);
         Graph configuration = getConfigurationGraph();
-        Subgraph subgraph = configuration.getSubgraphOfDepth(3).at(repositoryPath);
+        Subgraph subgraph = configuration.getSubgraphOfDepth(6).at(repositoryPath);
 
         // Read the options ...
         Node optionsNode = subgraph.getNode(DnaLexicon.OPTIONS);



From dna-commits at lists.jboss.org  Thu Jun  4 12:32:16 2009
From: dna-commits at lists.jboss.org (dna-commits at lists.jboss.org)
Date: Thu, 04 Jun 2009 12:32:16 -0400
Subject: [dna-commits] DNA SVN: r971 - in trunk:
	dna-graph/src/main/java/org/jboss/dna/graph/connector/federation
	and 14 other directories.
Message-ID: <E1MCFrU-0000N8-E0@committer01.frg.pub.inap.atl.jboss.com>

Author: rhauch
Date: 2009-06-04 12:32:16 -0400 (Thu, 04 Jun 2009)
New Revision: 971

Added:
   trunk/docs/examples/gettingstarted/sequencers/src/main/resources/sequencing.cnd
Removed:
   trunk/docs/examples/gettingstarted/sequencers/src/main/resources/jackrabbitNodeTypes.cnd
Modified:
   trunk/dna-graph/src/main/java/org/jboss/dna/graph/Graph.java
   trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/federation/Projection.java
   trunk/dna-graph/src/main/java/org/jboss/dna/graph/io/GraphBatchDestination.java
   trunk/dna-graph/src/test/java/org/jboss/dna/graph/connector/federation/ProjectionPathRuleTest.java
   trunk/dna-graph/src/test/java/org/jboss/dna/graph/connector/inmemory/InMemoryRepositoryWorkspaceTest.java
   trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/JcrConfiguration.java
   trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/JcrEngine.java
   trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/JcrI18n.java
   trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/JcrSession.java
   trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/SessionCache.java
   trunk/dna-jcr/src/main/resources/org/jboss/dna/jcr/JcrI18n.properties
   trunk/dna-repository/src/main/java/org/jboss/dna/repository/DnaConfiguration.java
   trunk/dna-repository/src/main/java/org/jboss/dna/repository/DnaEngine.java
   trunk/dna-repository/src/main/java/org/jboss/dna/repository/RepositoryI18n.java
   trunk/dna-repository/src/main/java/org/jboss/dna/repository/sequencer/StreamSequencerAdapter.java
   trunk/dna-repository/src/main/resources/org/jboss/dna/repository/RepositoryI18n.properties
   trunk/dna-repository/src/test/java/org/jboss/dna/repository/DnaConfigurationTest.java
   trunk/docs/examples/gettingstarted/sequencers/pom.xml
   trunk/docs/examples/gettingstarted/sequencers/src/main/java/org/jboss/example/dna/sequencer/ConsoleInput.java
   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/UserInterface.java
   trunk/docs/examples/gettingstarted/sequencers/src/test/java/org/jboss/example/dna/sequencer/MockUserInterface.java
   trunk/docs/examples/gettingstarted/sequencers/src/test/java/org/jboss/example/dna/sequencer/SequencingClientTest.java
   trunk/extensions/dna-connector-svn/src/test/java/org/jboss/dna/connector/svn/SVNConnectorTestUtil.java
Log:
DNA-389 Further changes to make the JcrConfiguration and JcrEngine easier to use while also correcting a few problems.  Additional changes to the sequencing example toward getting it working again.

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	2009-06-03 20:26:37 UTC (rev 970)
+++ trunk/dna-graph/src/main/java/org/jboss/dna/graph/Graph.java	2009-06-04 16:32:16 UTC (rev 971)
@@ -2676,8 +2676,9 @@
                 protected Batch submit( Location parent,
                                         String workspaceName,
                                         Name childName,
-                                        Collection<Property> properties ) {
-                    requestQueue.createNode(parent, workspaceName, childName, properties.iterator());
+                                        Collection<Property> properties,
+                                        NodeConflictBehavior behavior ) {
+                    requestQueue.createNode(parent, workspaceName, childName, properties.iterator(), behavior);
                     return Batch.this;
                 }
 
@@ -2751,157 +2752,6 @@
         }
 
         /**
-         * Begin the request to create a node located at the supplied path if there is no such node already.
-         * <p>
-         * Like all other methods on the {@link Batch}, the request will be performed when the {@link #execute()} method is
-         * called.
-         * </p>
-         * 
-         * @param atPath the path to the node that is to be created.
-         * @return the object that can be used to specify addition properties for the new node to be copied or the location of the
-         *         node where the node is to be created
-         */
-        public Create<Batch> createIfMissing( String atPath ) {
-            return createIfMissing(createPath(atPath));
-        }
-
-        /**
-         * Begin the request to create a node located at the supplied path if there is no such node already.
-         * <p>
-         * Like all other methods on the {@link Batch}, the request will be performed when the {@link #execute()} method is
-         * called.
-         * </p>
-         * 
-         * @param atPath the path to the node that is to be created.
-         * @param property a property for the new node
-         * @return the object that can be used to specify addition properties for the new node to be copied or the location of the
-         *         node where the node is to be created
-         */
-        public Create<Batch> createIfMissing( String atPath,
-                                              Property property ) {
-            return createIfMissing(createPath(atPath)).with(property);
-        }
-
-        /**
-         * Begin the request to create a node located at the supplied path if there is no such node already.
-         * <p>
-         * Like all other methods on the {@link Batch}, the request will be performed when the {@link #execute()} method is
-         * called.
-         * </p>
-         * 
-         * @param atPath the path to the node that is to be created.
-         * @param firstProperty a property for the new node
-         * @param additionalProperties additional properties for the new node
-         * @return the object that can be used to specify addition properties for the new node to be copied or the location of the
-         *         node where the node is to be created
-         */
-        public Create<Batch> createIfMissing( String atPath,
-                                              Property firstProperty,
-                                              Property... additionalProperties ) {
-            return createIfMissing(createPath(atPath)).with(firstProperty, additionalProperties);
-        }
-
-        /**
-         * Begin the request to create a node located at the supplied path if there is no such node already.
-         * <p>
-         * Like all other methods on the {@link Batch}, the request will be performed when the {@link #execute()} method is
-         * called.
-         * </p>
-         * 
-         * @param at the path to the node that is to be created.
-         * @return the object that can be used to specify addition properties for the new node to be copied or the location of the
-         *         node where the node is to be created
-         */
-        public final Create<Batch> createIfMissing( Path at ) {
-            assertNotExecuted();
-            CheckArg.isNotNull(at, "at");
-            Path parent = at.getParent();
-            Name name = at.getLastSegment().getName();
-            return createIfMissing(Location.create(parent), name);
-        }
-
-        protected final CreateAction<Batch> createIfMissing( Location parent,
-                                                             Name child ) {
-            return new CreateAction<Batch>(this, parent, getCurrentWorkspaceName(), child) {
-                @Override
-                protected Batch submit( Location parent,
-                                        String workspaceName,
-                                        Name childName,
-                                        Collection<Property> properties ) {
-                    requestQueue.createNode(parent, workspaceName, childName, properties.iterator(), NodeConflictBehavior.UPDATE);
-                    return Batch.this;
-                }
-
-                /**
-                 * {@inheritDoc}
-                 * 
-                 * @see org.jboss.dna.graph.Graph.Executable#execute()
-                 */
-                public Results execute() {
-                    and();
-                    return Batch.this.execute();
-                }
-            };
-        }
-
-        /**
-         * Begin the request to create a node located at the supplied path.
-         * <p>
-         * Like all other methods on the {@link Batch}, the request will be performed when the {@link #execute()} method is
-         * called.
-         * </p>
-         * 
-         * @param at the path to the node that is to be created.
-         * @param properties the iterator over the properties for the new node
-         * @return the object that can be used to specify addition properties for the new node to be copied or the location of the
-         *         node where the node is to be created
-         */
-        public Create<Batch> createIfMissing( Path at,
-                                              Iterable<Property> properties ) {
-            Create<Batch> action = createIfMissing(at);
-            for (Property property : properties) {
-                action.and(property);
-            }
-            return action;
-        }
-
-        /**
-         * Begin the request to create a node located at the supplied path if there is no such node already.
-         * <p>
-         * Like all other methods on the {@link Batch}, the request will be performed when the {@link #execute()} method is
-         * called.
-         * </p>
-         * 
-         * @param at the path to the node that is to be created.
-         * @param property a property for the new node
-         * @return the object that can be used to specify addition properties for the new node to be copied or the location of the
-         *         node where the node is to be created
-         */
-        public Create<Batch> createIfMissing( Path at,
-                                              Property property ) {
-            return createIfMissing(at).with(property);
-        }
-
-        /**
-         * Begin the request to create a node located at the supplied path if there is no such node already.
-         * <p>
-         * Like all other methods on the {@link Batch}, the request will be performed when the {@link #execute()} method is
-         * called.
-         * </p>
-         * 
-         * @param at the path to the node that is to be created.
-         * @param firstProperty a property for the new node
-         * @param additionalProperties additional properties for the new node
-         * @return the object that can be used to specify addition properties for the new node to be copied or the location of the
-         *         node where the node is to be created
-         */
-        public Create<Batch> createIfMissing( Path at,
-                                              Property firstProperty,
-                                              Property... additionalProperties ) {
-            return createIfMissing(at).with(firstProperty, additionalProperties);
-        }
-
-        /**
          * Begin the request to create a node under the existing parent node at the supplied location. This request is submitted
          * to the repository after the returned components are completed.
          * 
@@ -3913,9 +3763,9 @@
     }
 
     /**
-     * A component that defines the location before which a node should be copied or moved.  This is similar to an
-     * {@link Into}, but it allows for placing a node at a particular location within the new destination, rather than
-     * always placing the moved or copied node as the last child of the new parent.
+     * A component that defines the location before which a node should be copied or moved. This is similar to an {@link Into},
+     * but it allows for placing a node at a particular location within the new destination, rather than always placing the moved
+     * or copied node as the last child of the new parent.
      * 
      * @param <Next> The interface that is to be returned when this request is completed
      * @author Randall Hauch
@@ -3989,7 +3839,7 @@
          * @return the interface for additional requests or actions
          */
         Next before( Property firstParentIdProperty,
-                   Property... additionalParentIdProperties );
+                     Property... additionalParentIdProperties );
     }
 
     /**
@@ -4154,6 +4004,38 @@
      */
     public interface Create<Next> extends Conjunction<Next>, Executable<Node> {
         /**
+         * Create the node only if there is no existing node with the same {@link Path.Segment#getName() name} (ignoring
+         * {@link Path.Segment#getIndex() same-name-sibling indexes}).
+         * 
+         * @return this interface for continued specification of the request
+         */
+        Create<Next> ifAbsent();
+
+        /**
+         * Create the node if it does not exist, or update any existing node that has the same {@link Path.Segment#getName() name}
+         * (ignoring {@link Path.Segment#getIndex() same-name-sibling indexes}).
+         * 
+         * @return this interface for continued specification of the request
+         */
+        Create<Next> orUpdate();
+
+        /**
+         * Create the node if it does not exist, or replace any existing node that has the same {@link Path.Segment#getName()
+         * name} (ignoring {@link Path.Segment#getIndex() same-name-sibling indexes}).
+         * 
+         * @return this interface for continued specification of the request
+         */
+        Create<Next> orReplace();
+
+        /**
+         * Create the node if it does not exist by appending or adjusting the {@link Path.Segment#getIndex() same-name-sibling
+         * index}). This is the default behavior.
+         * 
+         * @return this interface for continued specification of the request
+         */
+        Create<Next> byAppending();
+
+        /**
          * Specify the UUID that should the new node should have. This is an alias for {@link #and(UUID)}.
          * 
          * @param uuid the UUID
@@ -5822,8 +5704,8 @@
          * @return this object, for method chaining
          */
         protected T submit( Locations from,
-                                     Location into,
-                                     Name newName ) {
+                            Location into,
+                            Name newName ) {
             return submit(from, into, null, newName);
         }
 
@@ -5851,7 +5733,7 @@
         public T into( String into ) {
             return submit(from, Location.create(createPath(into)), newName);
         }
-        
+
         public T before( Location before ) {
             return submit(from, null, before, newName);
         }
@@ -5865,7 +5747,7 @@
         }
 
         public T before( Property firstIdProperty,
-                       Property... additionalIdProperties ) {
+                         Property... additionalIdProperties ) {
             return submit(from, null, Location.create(firstIdProperty, additionalIdProperties), newName);
         }
 
@@ -5875,7 +5757,7 @@
 
         public T before( String before ) {
             return submit(from, null, Location.create(createPath(before)), newName);
-        }        
+        }
     }
 
     @NotThreadSafe
@@ -5993,6 +5875,7 @@
         private final Name childName;
         private final Map<Name, Property> properties = new HashMap<Name, Property>();
         private boolean submitted = false;
+        private NodeConflictBehavior conflictBehavior = NodeConflictBehavior.APPEND;
 
         /*package*/CreateAction( T afterConjunction,
                                   Location parent,
@@ -6004,6 +5887,46 @@
             this.childName = childName;
         }
 
+        /**
+         * {@inheritDoc}
+         * 
+         * @see org.jboss.dna.graph.Graph.Create#ifAbsent()
+         */
+        public Create<T> ifAbsent() {
+            conflictBehavior = NodeConflictBehavior.DO_NOT_REPLACE;
+            return this;
+        }
+
+        /**
+         * {@inheritDoc}
+         * 
+         * @see org.jboss.dna.graph.Graph.Create#orReplace()
+         */
+        public Create<T> orReplace() {
+            conflictBehavior = NodeConflictBehavior.REPLACE;
+            return this;
+        }
+
+        /**
+         * {@inheritDoc}
+         * 
+         * @see org.jboss.dna.graph.Graph.Create#orUpdate()
+         */
+        public Create<T> orUpdate() {
+            conflictBehavior = NodeConflictBehavior.UPDATE;
+            return this;
+        }
+
+        /**
+         * {@inheritDoc}
+         * 
+         * @see org.jboss.dna.graph.Graph.Create#byAppending()
+         */
+        public Create<T> byAppending() {
+            conflictBehavior = NodeConflictBehavior.APPEND;
+            return this;
+        }
+
         public Create<T> and( UUID uuid ) {
             PropertyFactory factory = getContext().getPropertyFactory();
             properties.put(DnaLexicon.UUID, factory.create(DnaLexicon.UUID, uuid));
@@ -6078,12 +6001,13 @@
         protected abstract T submit( Location parent,
                                      String workspaceName,
                                      Name childName,
-                                     Collection<Property> properties );
+                                     Collection<Property> properties,
+                                     NodeConflictBehavior conflictBehavior );
 
         @Override
         public T and() {
             if (!submitted) {
-                submit(parent, workspaceName, childName, this.properties.values());
+                submit(parent, workspaceName, childName, this.properties.values(), this.conflictBehavior);
                 submitted = true;
             }
             return super.and();

Modified: trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/federation/Projection.java
===================================================================
--- trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/federation/Projection.java	2009-06-03 20:26:37 UTC (rev 970)
+++ trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/federation/Projection.java	2009-06-04 16:32:16 UTC (rev 971)
@@ -575,8 +575,8 @@
         public PathRule( Path repositoryPath,
                          Path sourcePath,
                          Path... exceptions ) {
-            assert sourcePath != null;
-            assert repositoryPath != null;
+            CheckArg.isNotNull(sourcePath, "sourcePath");
+            CheckArg.isNotNull(repositoryPath, "repositoryPath");
             this.sourcePath = sourcePath;
             this.repositoryPath = repositoryPath;
             if (exceptions == null || exceptions.length == 0) {
@@ -589,15 +589,21 @@
                 this.exceptions = Collections.unmodifiableList(exceptionList);
             }
             this.hc = HashCode.compute(sourcePath, repositoryPath, exceptions);
-            assert exceptionPathsAreRelative();
+            if (this.exceptions != null) {
+                for (Path path : this.exceptions) {
+                    if (path.isAbsolute()) {
+                        throw new IllegalArgumentException(GraphI18n.pathIsNotRelative.text(path));
+                    }
+                }
+            }
             this.topLevelRepositoryPaths = Collections.singletonList(getPathInRepository());
         }
 
         public PathRule( Path repositoryPath,
                          Path sourcePath,
                          List<Path> exceptions ) {
-            assert sourcePath != null;
-            assert repositoryPath != null;
+            CheckArg.isNotNull(sourcePath, "sourcePath");
+            CheckArg.isNotNull(repositoryPath, "repositoryPath");
             this.sourcePath = sourcePath;
             this.repositoryPath = repositoryPath;
             if (exceptions == null || exceptions.isEmpty()) {
@@ -606,17 +612,14 @@
                 this.exceptions = Collections.unmodifiableList(new ArrayList<Path>(exceptions));
             }
             this.hc = HashCode.compute(sourcePath, repositoryPath, exceptions);
-            assert exceptionPathsAreRelative();
-            this.topLevelRepositoryPaths = Collections.singletonList(getPathInRepository());
-        }
-
-        private boolean exceptionPathsAreRelative() {
             if (this.exceptions != null) {
                 for (Path path : this.exceptions) {
-                    if (path.isAbsolute()) return false;
+                    if (path.isAbsolute()) {
+                        throw new IllegalArgumentException(GraphI18n.pathIsNotRelative.text(path));
+                    }
                 }
             }
-            return true;
+            this.topLevelRepositoryPaths = Collections.singletonList(getPathInRepository());
         }
 
         /**

Modified: trunk/dna-graph/src/main/java/org/jboss/dna/graph/io/GraphBatchDestination.java
===================================================================
--- trunk/dna-graph/src/main/java/org/jboss/dna/graph/io/GraphBatchDestination.java	2009-06-03 20:26:37 UTC (rev 970)
+++ trunk/dna-graph/src/main/java/org/jboss/dna/graph/io/GraphBatchDestination.java	2009-06-04 16:32:16 UTC (rev 971)
@@ -27,7 +27,9 @@
 import net.jcip.annotations.NotThreadSafe;
 import org.jboss.dna.graph.ExecutionContext;
 import org.jboss.dna.graph.Graph;
+import org.jboss.dna.graph.NodeConflictBehavior;
 import org.jboss.dna.graph.Graph.Batch;
+import org.jboss.dna.graph.Graph.Create;
 import org.jboss.dna.graph.property.Path;
 import org.jboss.dna.graph.property.Property;
 
@@ -92,11 +94,31 @@
     public void create( Path path,
                         List<Property> properties ) {
         assert properties != null;
+        Create<Batch> create = null;
         if (properties.isEmpty()) {
-            batch.create(path).and();
+            create = batch.create(path);
         } else {
-            batch.create(path, properties).and();
+            create = batch.create(path, properties);
         }
+        assert create != null;
+        NodeConflictBehavior behavior = createBehaviorFor(path);
+        if (behavior != null) {
+            switch (behavior) {
+                case APPEND:
+                    create.byAppending();
+                    break;
+                case REPLACE:
+                    create.orReplace();
+                    break;
+                case UPDATE:
+                    create.byAppending();
+                    break;
+                case DO_NOT_REPLACE:
+                    create.byAppending();
+                    break;
+            }
+        }
+        create.and();
     }
 
     /**
@@ -108,22 +130,43 @@
     public void create( Path path,
                         Property firstProperty,
                         Property... additionalProperties ) {
+        Create<Batch> create = null;
         if (firstProperty == null) {
-            batch.create(path).and();
+            create = batch.create(path);
         } else {
-            batch.create(path, firstProperty, additionalProperties).and();
+            create = batch.create(path, firstProperty, additionalProperties);
         }
+        assert create != null;
+        NodeConflictBehavior behavior = createBehaviorFor(path);
+        if (behavior != null) {
+            switch (behavior) {
+                case APPEND:
+                    create.byAppending();
+                    break;
+                case REPLACE:
+                    create.orReplace();
+                    break;
+                case UPDATE:
+                    create.byAppending();
+                    break;
+                case DO_NOT_REPLACE:
+                    create.byAppending();
+                    break;
+            }
+        }
+        create.and();
     }
 
     /**
      * {@inheritDoc}
-     *
-     * @see org.jboss.dna.graph.io.Destination#setProperties(org.jboss.dna.graph.property.Path, org.jboss.dna.graph.property.Property[])
+     * 
+     * @see org.jboss.dna.graph.io.Destination#setProperties(org.jboss.dna.graph.property.Path,
+     *      org.jboss.dna.graph.property.Property[])
      */
-    public void setProperties( Path path, 
+    public void setProperties( Path path,
                                Property... properties ) {
         if (properties == null) return;
-        
+
         batch.set(properties).on(path);
     }
 
@@ -135,6 +178,16 @@
     public void submit() {
         // Execute only if we're not ignoring submits ...
         if (!this.ignoreSubmit && !batch.hasExecuted()) batch.execute();
+    }
 
+    /**
+     * Override this method in a subclass to control the {@link NodeConflictBehavior} that should be used when creating the node
+     * at the supplied path. By default, this method returns null.
+     * 
+     * @param path the path of the new node
+     * @return the conflict behavior, or null if {@link NodeConflictBehavior#UPDATE} should be used
+     */
+    protected NodeConflictBehavior createBehaviorFor( Path path ) {
+        return null;
     }
 }

Modified: trunk/dna-graph/src/test/java/org/jboss/dna/graph/connector/federation/ProjectionPathRuleTest.java
===================================================================
--- trunk/dna-graph/src/test/java/org/jboss/dna/graph/connector/federation/ProjectionPathRuleTest.java	2009-06-03 20:26:37 UTC (rev 970)
+++ trunk/dna-graph/src/test/java/org/jboss/dna/graph/connector/federation/ProjectionPathRuleTest.java	2009-06-04 16:32:16 UTC (rev 971)
@@ -80,19 +80,19 @@
         assertThat(rule.getExceptionsToRule(), hasItems(validExceptions));
     }
 
-    @Test( expected = AssertionError.class )
+    @Test( expected = IllegalArgumentException.class )
     public void shouldFailToCreateInstanceWithNullRepositoryPathAndValidSourcePathAndNoExceptions() {
         repositoryPath = null;
         new Projection.PathRule(repositoryPath, sourcePath);
     }
 
-    @Test( expected = AssertionError.class )
+    @Test( expected = IllegalArgumentException.class )
     public void shouldFailToCreateInstanceWithValidRepositoryPathAndNullSourcePathAndNoExceptions() {
         sourcePath = null;
         new Projection.PathRule(repositoryPath, sourcePath);
     }
 
-    @Test( expected = AssertionError.class )
+    @Test( expected = IllegalArgumentException.class )
     public void shouldFailToCreateInstanceWithValidRepositoryPathAndValidSourcePathAndAbsoluteExceptions() {
         Path relativePath = validExceptions[0];
         Path absolutePath = pathFactory.create("/j/k/l/m");

Modified: trunk/dna-graph/src/test/java/org/jboss/dna/graph/connector/inmemory/InMemoryRepositoryWorkspaceTest.java
===================================================================
--- trunk/dna-graph/src/test/java/org/jboss/dna/graph/connector/inmemory/InMemoryRepositoryWorkspaceTest.java	2009-06-03 20:26:37 UTC (rev 970)
+++ trunk/dna-graph/src/test/java/org/jboss/dna/graph/connector/inmemory/InMemoryRepositoryWorkspaceTest.java	2009-06-04 16:32:16 UTC (rev 971)
@@ -30,7 +30,6 @@
 import static org.hamcrest.core.IsSame.sameInstance;
 import static org.junit.Assert.assertThat;
 import static org.junit.matchers.JUnitMatchers.hasItems;
-import static org.mockito.Mockito.mock;
 import java.util.HashMap;
 import java.util.Map;
 import java.util.UUID;
@@ -101,17 +100,6 @@
         assertThat(workspace.getRoot().getProperties().size(), is(0));
     }
 
-    @Test( expected = AssertionError.class )
-    public void shouldNotAllowNodeToBeRemovedUsingNullEnvironment() {
-        InMemoryNode node = mock(InMemoryNode.class);
-        workspace.removeNode(null, node);
-    }
-
-    @Test( expected = AssertionError.class )
-    public void shouldNotAllowNullNodeToBeRemoved() {
-        workspace.removeNode(context, null);
-    }
-
     @Test
     public void shouldCreateNodesByPath() {
         Name name_a = nameFactory.create("a");
@@ -274,7 +262,7 @@
         Name propName = nameFactory.create("prop");
         node_b.setProperty(propertyFactory.create(propName, "node_b"));
         node_b2.setProperty(propertyFactory.create(propName, "node_b2"));
-        
+
         assertThat(workspace.getNodesByUuid().size(), is(7));
         assertThat(workspace.getNode(pathFactory.create("/")), is(sameInstance(workspace.getRoot())));
         assertThat(workspace.getNode(pathFactory.create("/a")), is(sameInstance(node_a)));
@@ -296,8 +284,10 @@
         assertThat(workspace.getNode(pathFactory.create("/d/b[2]")), is(sameInstance(node_b2)));
         assertThat(workspace.getNode(pathFactory.create("/d/b[1]")), is(sameInstance(node_b)));
         assertThat(workspace.getNode(pathFactory.create("/d/b[1]/c")), is(sameInstance(node_c)));
-        assertThat(workspace.getNode(pathFactory.create("/d/b[1]")).getProperty(propName).getFirstValue().toString(), is("node_b"));
-        assertThat(workspace.getNode(pathFactory.create("/d/b[2]")).getProperty(propName).getFirstValue().toString(), is("node_b2"));
+        assertThat(workspace.getNode(pathFactory.create("/d/b[1]")).getProperty(propName).getFirstValue().toString(),
+                   is("node_b"));
+        assertThat(workspace.getNode(pathFactory.create("/d/b[2]")).getProperty(propName).getFirstValue().toString(),
+                   is("node_b2"));
 
         // Move after the last node
         workspace.moveNode(context, node_b, null, workspace, root, null);

Modified: trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/JcrConfiguration.java
===================================================================
--- trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/JcrConfiguration.java	2009-06-03 20:26:37 UTC (rev 970)
+++ trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/JcrConfiguration.java	2009-06-04 16:32:16 UTC (rev 971)
@@ -604,7 +604,7 @@
             Path nodeTypesPath = subpath(DnaLexicon.NODE_TYPES);
             createIfMissing(DnaLexicon.NODE_TYPES).and();
 
-            // Now set up the destination ...
+            // Now set up the destination, but make it so that ...
             Destination destination = new GraphBatchDestination(batch, true); // will NOT be executed
 
             // And create the importer that will load the CND content into the repository ...

Modified: trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/JcrEngine.java
===================================================================
--- trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/JcrEngine.java	2009-06-03 20:26:37 UTC (rev 970)
+++ trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/JcrEngine.java	2009-06-04 16:32:16 UTC (rev 971)
@@ -144,12 +144,7 @@
         // Register all the the node types ...
         Node nodeTypesNode = subgraph.getNode(DnaLexicon.NODE_TYPES);
         if (nodeTypesNode != null) {
-            try {
-                repository.getRepositoryTypeManager().registerNodeTypes(subgraph, nodeTypesNode.getLocation());
-            } catch (RepositoryException e) {
-                // Error registering the node types ...
-                getProblems().addError(e, JcrI18n.errorRegisteringNodeTypes, repositoryName);
-            }
+            repository.getRepositoryTypeManager().registerNodeTypes(subgraph, nodeTypesNode.getLocation());// throws exception
         }
 
         return repository;

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	2009-06-03 20:26:37 UTC (rev 970)
+++ trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/JcrI18n.java	2009-06-04 16:32:16 UTC (rev 971)
@@ -60,7 +60,6 @@
     public static I18n unableToRemapUriNotRegisteredInNamespaceRegistry;
     public static I18n unableToRemapUriUsingPrefixUsedInNamespaceRegistry;
 
-    public static I18n errorRegisteringNodeTypes;
     public static I18n errorWhileInitializingTheNamespaceRegistry;
     public static I18n invalidRelativePath;
     public static I18n invalidPathParameter;

Modified: trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/JcrSession.java
===================================================================
--- trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/JcrSession.java	2009-06-03 20:26:37 UTC (rev 970)
+++ trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/JcrSession.java	2009-06-04 16:32:16 UTC (rev 971)
@@ -218,6 +218,10 @@
         return graph.batch();
     }
 
+    String sourceName() {
+        return this.repository.getRepositorySourceName();
+    }
+
     /**
      * {@inheritDoc}
      * 
@@ -329,9 +333,10 @@
 
         this.checkPermission(executionContext.getValueFactories().getPathFactory().create(path), actions);
     }
-    
-    public void checkPermission( Path path, String actions) {
-        
+
+    public void checkPermission( Path path,
+                                 String actions ) {
+
         CheckArg.isNotNull(path, "path");
         CheckArg.isNotEmpty(actions, "actions");
 

Modified: trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/SessionCache.java
===================================================================
--- trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/SessionCache.java	2009-06-03 20:26:37 UTC (rev 970)
+++ trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/SessionCache.java	2009-06-04 16:32:16 UTC (rev 971)
@@ -204,6 +204,10 @@
         return workspaceName;
     }
 
+    String sourceName() {
+        return session.sourceName();
+    }
+
     ExecutionContext context() {
         return context;
     }
@@ -2085,7 +2089,8 @@
             throw new ItemNotFoundException(JcrI18n.itemNotFoundWithUuid.text(uuid, workspaceName, e.getLocalizedMessage()));
         } catch (RepositorySourceException e) {
             throw new RepositoryException(
-                                          JcrI18n.errorWhileFindingNodeWithUuid.text(uuid, workspaceName, e.getLocalizedMessage()));
+                                          JcrI18n.errorWhileFindingNodeWithUuid.text(uuid, workspaceName, e.getLocalizedMessage()),
+                                          e);
         }
     }
 
@@ -2234,7 +2239,7 @@
             }
             if (definition == null) {
                 String msg = JcrI18n.nodeDefinitionCouldNotBeDeterminedForNode.text(path, workspaceName);
-                throw new RepositorySourceException(msg);
+                throw new RepositorySourceException(sourceName(), msg);
             }
         }
 
@@ -2248,7 +2253,7 @@
         if (primaryType == null) {
             Path path = location.getPath();
             String msg = JcrI18n.missingNodeTypeForExistingNode.text(primaryTypeName.getString(namespaces), path, workspaceName);
-            throw new RepositorySourceException(msg);
+            throw new RepositorySourceException(sourceName(), msg);
         }
         if (primaryType.isNodeType(JcrMixLexicon.REFERENCEABLE)) referenceable = true;
 

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	2009-06-03 20:26:37 UTC (rev 970)
+++ trunk/dna-jcr/src/main/resources/org/jboss/dna/jcr/JcrI18n.properties	2009-06-04 16:32:16 UTC (rev 971)
@@ -50,7 +50,6 @@
 unableToRemapUriNotRegisteredInNamespaceRegistry = Unable to remap the namespace "{1}" to prefix "{0}" because the URI is not already registered in the workspace's namespace registry
 unableToRemapUriUsingPrefixUsedInNamespaceRegistry = Unable to remap the namespace "{1}" to prefix "{0}" because the prefix is already used as the prefix for the namespace "{2}" in the workspace's namespace registry
 
-errorRegisteringNodeTypes = Error while registering the node types for repository "{0}"
 errorWhileInitializingTheNamespaceRegistry = Error while initializing the namespace registry for workspace "{0}"
 invalidRelativePath = "{0}" is not a valid relative path
 invalidPathParameter = The "{1}" parameter value "{0}" was not a valid path
@@ -123,4 +122,4 @@
 allNodeTypeTemplatesMustComeFromSameSession=All node type templates must be created from the same javax.jcr.Session
 
 nodeNotReferenceable=Only referenceable nodes may be the value of reference properties
-noPendingChangesAllowed=This operation cannot be performed when the session has pending changes
\ No newline at end of file
+noPendingChangesAllowed=This operation cannot be performed when the session has pending changes

Modified: trunk/dna-repository/src/main/java/org/jboss/dna/repository/DnaConfiguration.java
===================================================================
--- trunk/dna-repository/src/main/java/org/jboss/dna/repository/DnaConfiguration.java	2009-06-03 20:26:37 UTC (rev 970)
+++ trunk/dna-repository/src/main/java/org/jboss/dna/repository/DnaConfiguration.java	2009-06-04 16:32:16 UTC (rev 971)
@@ -976,11 +976,11 @@
         protected Graph.Create<Graph.Batch> createIfMissing( Name child,
                                                              String... segments ) {
             Path nodePath = context.getValueFactories().getPathFactory().create(path, child);
-            Graph.Create<Graph.Batch> result = batch.createIfMissing(nodePath);
+            Graph.Create<Graph.Batch> result = batch.create(nodePath).orUpdate();
             for (String name : segments) {
                 result.and();
                 nodePath = context.getValueFactories().getPathFactory().create(nodePath, name);
-                result = batch.createIfMissing(nodePath);
+                result = batch.create(nodePath).orUpdate();
             }
             return result;
         }
@@ -994,7 +994,7 @@
          */
         protected Graph.Create<Graph.Batch> createIfMissing( Name segment ) {
             Path nodePath = context.getValueFactories().getPathFactory().create(path, segment);
-            Graph.Create<Graph.Batch> result = batch.createIfMissing(nodePath);
+            Graph.Create<Graph.Batch> result = batch.create(nodePath).orUpdate();
             return result;
         }
 
@@ -1013,7 +1013,7 @@
             for (Name name : segments) {
                 if (result != null) result.and();
                 nodePath = context.getValueFactories().getPathFactory().create(nodePath, name);
-                result = batch.createIfMissing(nodePath);
+                result = batch.create(nodePath).orUpdate();
             }
             return result;
         }

Modified: trunk/dna-repository/src/main/java/org/jboss/dna/repository/DnaEngine.java
===================================================================
--- trunk/dna-repository/src/main/java/org/jboss/dna/repository/DnaEngine.java	2009-06-03 20:26:37 UTC (rev 970)
+++ trunk/dna-repository/src/main/java/org/jboss/dna/repository/DnaEngine.java	2009-06-04 16:32:16 UTC (rev 971)
@@ -31,9 +31,11 @@
 import java.util.concurrent.ScheduledThreadPoolExecutor;
 import java.util.concurrent.TimeUnit;
 import net.jcip.annotations.Immutable;
+import org.jboss.dna.common.collection.Problem;
 import org.jboss.dna.common.collection.Problems;
 import org.jboss.dna.common.collection.SimpleProblems;
 import org.jboss.dna.common.util.CheckArg;
+import org.jboss.dna.common.util.Logger;
 import org.jboss.dna.graph.ExecutionContext;
 import org.jboss.dna.graph.Graph;
 import org.jboss.dna.graph.JcrLexicon;
@@ -240,6 +242,16 @@
      * @see #shutdown()
      */
     public void start() {
+        if (getProblems().hasErrors()) {
+            // First log the messages ...
+            Logger log = Logger.getLogger(getClass());
+            log.error(RepositoryI18n.errorsPreventStarting);
+            for (Problem problem : getProblems()) {
+                log.error(problem.getMessage(), problem.getParameters());
+            }
+            // Then throw an exception ...
+            throw new IllegalStateException(RepositoryI18n.errorsPreventStarting.text());
+        }
         repositoryService.getAdministrator().start();
         sequencingService.getAdministrator().start();
     }

Modified: trunk/dna-repository/src/main/java/org/jboss/dna/repository/RepositoryI18n.java
===================================================================
--- trunk/dna-repository/src/main/java/org/jboss/dna/repository/RepositoryI18n.java	2009-06-03 20:26:37 UTC (rev 970)
+++ trunk/dna-repository/src/main/java/org/jboss/dna/repository/RepositoryI18n.java	2009-06-04 16:32:16 UTC (rev 971)
@@ -124,6 +124,7 @@
 
     // Engine
     public static I18n engineIsNotRunning;
+    public static I18n errorsPreventStarting;
 
     static {
         try {

Modified: trunk/dna-repository/src/main/java/org/jboss/dna/repository/sequencer/StreamSequencerAdapter.java
===================================================================
--- trunk/dna-repository/src/main/java/org/jboss/dna/repository/sequencer/StreamSequencerAdapter.java	2009-06-03 20:26:37 UTC (rev 970)
+++ trunk/dna-repository/src/main/java/org/jboss/dna/repository/sequencer/StreamSequencerAdapter.java	2009-06-04 16:32:16 UTC (rev 971)
@@ -34,6 +34,7 @@
 import org.jboss.dna.common.collection.Problems;
 import org.jboss.dna.graph.Node;
 import org.jboss.dna.graph.observe.NetChangeObserver.NetChange;
+import org.jboss.dna.graph.property.Binary;
 import org.jboss.dna.graph.property.Path;
 import org.jboss.dna.graph.property.PathFactory;
 import org.jboss.dna.graph.property.Property;
@@ -90,18 +91,21 @@
         // Get the property that contains the data, given by 'propertyName' ...
         Property sequencedProperty = input.getProperty(sequencedPropertyName);
 
-        if (sequencedProperty == null) {
+        if (sequencedProperty == null || sequencedProperty.isEmpty()) {
             String msg = RepositoryI18n.unableToFindPropertyForSequencing.text(sequencedPropertyName, input.getLocation());
             throw new SequencerException(msg);
         }
 
         // Get the binary property with the image content, and build the image metadata from the image ...
-        SequencerOutputMap output = new SequencerOutputMap(context.getExecutionContext().getValueFactories());
+        ValueFactories factories = context.getExecutionContext().getValueFactories();
+        SequencerOutputMap output = new SequencerOutputMap(factories);
         InputStream stream = null;
         Throwable firstError = null;
+        Binary binary = factories.getBinaryFactory().create(sequencedProperty.getFirstValue());
+        binary.acquire();
         try {
             // Parallel the JCR lemma for converting objects into streams
-            stream = new ByteArrayInputStream(sequencedProperty.toString().getBytes());
+            stream = binary.getStream();
             StreamSequencerContext StreamSequencerContext = createStreamSequencerContext(input,
                                                                                          sequencedProperty,
                                                                                          context,
@@ -111,20 +115,24 @@
             // Record the error ...
             firstError = t;
         } finally {
-            if (stream != null) {
-                // Always close the stream, recording the error if we've not yet seen an error
-                try {
-                    stream.close();
-                } catch (Throwable t) {
-                    if (firstError == null) firstError = t;
-                } finally {
-                    stream = null;
+            try {
+                if (stream != null) {
+                    // Always close the stream, recording the error if we've not yet seen an error
+                    try {
+                        stream.close();
+                    } catch (Throwable t) {
+                        if (firstError == null) firstError = t;
+                    } finally {
+                        stream = null;
+                    }
                 }
+                if (firstError != null) {
+                    // Wrap and throw the first error that we saw ...
+                    throw new SequencerException(firstError);
+                }
+            } finally {
+                binary.release();
             }
-            if (firstError != null) {
-                // Wrap and throw the first error that we saw ...
-                throw new SequencerException(firstError);
-            }
         }
 
         // Find each output node and save the image metadata there ...

Modified: trunk/dna-repository/src/main/resources/org/jboss/dna/repository/RepositoryI18n.properties
===================================================================
--- trunk/dna-repository/src/main/resources/org/jboss/dna/repository/RepositoryI18n.properties	2009-06-03 20:26:37 UTC (rev 970)
+++ trunk/dna-repository/src/main/resources/org/jboss/dna/repository/RepositoryI18n.properties	2009-06-04 16:32:16 UTC (rev 971)
@@ -102,3 +102,4 @@
 errorStartingRepositoryService = Error while starting repository service
 
 engineIsNotRunning = The engine is not running; make sure it was started.
+errorsPreventStarting = The engine has errors and cannot be started
\ No newline at end of file

Modified: trunk/dna-repository/src/test/java/org/jboss/dna/repository/DnaConfigurationTest.java
===================================================================
--- trunk/dna-repository/src/test/java/org/jboss/dna/repository/DnaConfigurationTest.java	2009-06-03 20:26:37 UTC (rev 970)
+++ trunk/dna-repository/src/test/java/org/jboss/dna/repository/DnaConfigurationTest.java	2009-06-04 16:32:16 UTC (rev 971)
@@ -138,7 +138,7 @@
         assertThat(file.exists(), is(true));
         assertThat(file.canRead(), is(true));
         assertThat(file.isFile(), is(true));
-        URL fileUrl = file.toURL();
+        URL fileUrl = file.toURI().toURL();
         assertThat(fileUrl, is(notNullValue()));
 
         configuration.loadFrom(fileUrl);
@@ -177,7 +177,7 @@
     public void shouldLoadConfigurationEvenAfterAlreadyHavingLoadedConfiguration() throws Exception {
         configuration.loadFrom("src/test/resources/config/configRepository.xml");
         configuration.loadFrom(new File("src/test/resources/config/configRepository.xml"));
-        configuration.loadFrom(new File("src/test/resources/config/configRepository.xml").toURL());
+        configuration.loadFrom(new File("src/test/resources/config/configRepository.xml").toURI().toURL());
         assertThat(configuration.getProblems().isEmpty(), is(true));
     }
 

Modified: trunk/docs/examples/gettingstarted/sequencers/pom.xml
===================================================================
--- trunk/docs/examples/gettingstarted/sequencers/pom.xml	2009-06-03 20:26:37 UTC (rev 970)
+++ trunk/docs/examples/gettingstarted/sequencers/pom.xml	2009-06-04 16:32:16 UTC (rev 971)
@@ -63,27 +63,17 @@
       <artifactId>jcr</artifactId>
     </dependency>
     <!-- 
-      Test cases use JUnit
-    -->
-    <dependency>
-      <groupId>junit</groupId>
-      <artifactId>junit</artifactId>
-      <scope>test</scope>
-    </dependency>
-    <!-- 
       JAAS implementation (and dependencies)
     -->
     <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>
@@ -99,6 +89,13 @@
                 <artifactId>serializer</artifactId>
             </exclusion>
         </exclusions>
+    </dependency>
+    <!-- 
+      Test cases use JUnit
+    -->
+    <dependency>
+      <groupId>junit</groupId>
+      <artifactId>junit</artifactId>
       <scope>test</scope>
     </dependency>
   </dependencies>

Modified: trunk/docs/examples/gettingstarted/sequencers/src/main/java/org/jboss/example/dna/sequencer/ConsoleInput.java
===================================================================
--- trunk/docs/examples/gettingstarted/sequencers/src/main/java/org/jboss/example/dna/sequencer/ConsoleInput.java	2009-06-03 20:26:37 UTC (rev 970)
+++ trunk/docs/examples/gettingstarted/sequencers/src/main/java/org/jboss/example/dna/sequencer/ConsoleInput.java	2009-06-04 16:32:16 UTC (rev 971)
@@ -198,4 +198,8 @@
         sb.append("\n");
         return sb.toString();
     }
+
+    public void displayError( Exception e ) {
+        System.err.println(e.getMessage());
+    }
 }

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	2009-06-03 20:26:37 UTC (rev 970)
+++ trunk/docs/examples/gettingstarted/sequencers/src/main/java/org/jboss/example/dna/sequencer/SequencingClient.java	2009-06-04 16:32:16 UTC (rev 971)
@@ -47,9 +47,6 @@
 import org.jboss.dna.jcr.JcrRepository;
 import org.jboss.dna.repository.sequencer.SequencingService;
 import org.jboss.dna.repository.util.SessionFactory;
-import org.jboss.dna.sequencer.image.ImageMetadataSequencer;
-import org.jboss.dna.sequencer.java.JavaMetadataSequencer;
-import org.jboss.dna.sequencer.mp3.Mp3MetadataSequencer;
 import org.jboss.security.config.IDTrustConfiguration;
 
 /**
@@ -72,7 +69,9 @@
             throw new IllegalStateException(ex);
         }
 
-        // Configure the DNA JCR engine ...
+        // Configure the DNA JCR engine. 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 example uses the programmatic approach...
         String repositoryId = "content";
         String workspaceName = "default";
         JcrConfiguration config = new JcrConfiguration();
@@ -83,9 +82,7 @@
               .setProperty("defaultWorkspaceName", workspaceName);
         // Set up the JCR repository to use the source ...
         config.repository(repositoryId)
-              .addNodeTypes(ImageMetadataSequencer.class.getResource("org/jboss/dna/sequencer/image/images.cnd"))
-              .addNodeTypes(Mp3MetadataSequencer.class.getResource("org/jboss/dna/sequencer/mp3/mp3.cnd"))
-              .addNodeTypes(JavaMetadataSequencer.class.getResource("org/jboss/dna/sequencer/java/javaSource.cnd"))
+              .addNodeTypes("sequencing.cnd")
               .setSource("store")
               .setOption(JcrRepository.Option.JAAS_LOGIN_CONFIG_NAME, "dna-jcr");
         // Set up the image sequencer ...
@@ -97,13 +94,15 @@
               .andOutputtingTo("/images/$1");
         // Set up the MP3 sequencer ...
         config.sequencer("MP3 Sequencer")
-              .usingClass(Mp3MetadataSequencer.class)
+              .usingClass("org.jboss.dna.sequencer.mp3.Mp3MetadataSequencer")
+              .loadedFromClasspath()
               .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 source file sequencer ...
         config.sequencer("Java Sequencer")
-              .usingClass(JavaMetadataSequencer.class)
+              .usingClass("org.jboss.dna.sequencer.java.JavaMetadataSequencer")
+              .loadedFromClasspath()
               .setDescription("Sequences mp3 files to extract the id3 tags of the audio file")
               .sequencingFrom("//(*.mp3[*])/jcr:content[@jcr:data]")
               .andOutputtingTo("/mp3s/$1");

Modified: trunk/docs/examples/gettingstarted/sequencers/src/main/java/org/jboss/example/dna/sequencer/UserInterface.java
===================================================================
--- trunk/docs/examples/gettingstarted/sequencers/src/main/java/org/jboss/example/dna/sequencer/UserInterface.java	2009-06-03 20:26:37 UTC (rev 970)
+++ trunk/docs/examples/gettingstarted/sequencers/src/main/java/org/jboss/example/dna/sequencer/UserInterface.java	2009-06-04 16:32:16 UTC (rev 971)
@@ -37,4 +37,6 @@
     public String getRepositoryPath( String defaultPath ) throws IllegalArgumentException, IOException;
 
     public void displaySearchResults( List<ContentInfo> contentInfo ) throws IOException;
+
+    public void displayError( Exception e );
 }

Deleted: trunk/docs/examples/gettingstarted/sequencers/src/main/resources/jackrabbitNodeTypes.cnd
===================================================================
--- trunk/docs/examples/gettingstarted/sequencers/src/main/resources/jackrabbitNodeTypes.cnd	2009-06-03 20:26:37 UTC (rev 970)
+++ trunk/docs/examples/gettingstarted/sequencers/src/main/resources/jackrabbitNodeTypes.cnd	2009-06-04 16:32:16 UTC (rev 971)
@@ -1,264 +0,0 @@
-<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'>
-<image='http://jboss.org/dna/images/1.0'>
-<mp3='http://jboss.org/dna/mp3/1.0'>
-<java='http://www.jboss.org/dna/java/1.0'>
-
-// ----------------------------------------------------------
-// JCR Pre-defined Mixin Types that are not loaded by default
-// ----------------------------------------------------------
-
-[mix:mimeTyped] mixin 
-  - jcr:mimeType (string)  
-  - jcr:encoding (string)
-
-
-// -------------------
-// DNA Image Sequencer
-// -------------------
-
-/**
- * Node type that defines the metadata for an image
- */
-[image:metadata] > nt:unstructured, mix:mimeTyped
-  - image:formatName (string) mandatory
-    < 'JPEG', 'GIF', 'PNG', 'BMP', 'PCX', 'IFF', 'RAS', 'PBM', 'PGM', 'PPM', 'PSD'
-  - image:width (long)
-  - image:height (long)
-  - image:bitsPerPixel (long)
-  - image:progressive (boolean)
-  - image:numberOfImages (long)
-  - image:physicalWidthDpi (long)
-  - image:physicalHeightDpi (long)
-  - image:physicalWidthInches (long)
-  - image:physicalHeightInches (long)
-
-// -------------------
-// DNA MP3 Sequencer
-// -------------------
-
-/**
- * Node type that defines the metadata for an MP3 audio file
- */
-[mp3:metadata] > nt:unstructured, mix:mimeTyped
-  - mp3:title (string)
-  - mp3:author (string)
-  - mp3:album (string)
-  - mp3:year (long)
-  - mp3:comment (string)
-
-// -------------------
-// DNA Java Sequencer
-// -------------------
-
-/**
- * Node types that define metadata for a Java source file
- */
-/**
- * Element-value
- */
-[java:elementValue] > nt:unstructured
- + java:kindOfvalues (java:conditionalExpression, java:annotationDeclaration, java:elementValueArrayInitializer) mandatory
- 
-/**
- * Modifiers
- */
-[java:modifierDeclaration] > nt:unstructured
- - java:modifierName (string) mandatory
-
-/**
- * Expression element-value type
- */
-[java:conditionalExpression] > nt:unstructured
- - java:expression (string)
-
-/**
- * Array initializer element-value type
- */
-[java:elementValueArrayInitializer] > nt:unstructured
- + java:elementValue (java:elementValue) = java:elementValue multiple
-
-/**
- * Identifier
- */
-[java:identifier] > nt:unstructured
- - java:identifierName (String) mandatory
- + java:value (java:elementValue) = java:elementValue mandatory
- 
-/**
- * Element-value pair
- */
-[java:elementValuePair] > nt:unstructured
- + java:identifier (java:identifier) mandatory
-
-/**
- * Annotation type
- */
-[java:annotationDeclaration] > nt:unstructured
- + java:annotationType (java:normalAnnotation, java:markerAnnotation,  java:singleElementAnnotation) mandatory
-  
-/**
- * Normal annotation e.g. @Entity(name="Customer")
- */
-[java:normalAnnotation] > nt:unstructured
- - java:normalAnnotationName (string) mandatory
- + java:elementValuePair (java:elementValuePair)
-
-/**
- * Marker annotation e.g. @GET
- */
-[java:markerAnnotation] > nt:unstructured
- - java:markerAnnotationName (string) mandatory
-
-/**
- * Single element annotation  e.g. @Path("/book")
- */
-[java:singleElementAnnotation] > nt:unstructured
- - java:singleElementAnnotationNam
- + java:value (java:elementValue) = java:elementValue mandatory
-
-/** 
- * Formal parameter
- */
-[java:formalParameter] > nt:unstructured
- + java:type (java:primitiveType, java:arrayType, java:simpleType, java:qualifiedType, java:wildcardType, java:parameterizedType)
-
-/**
- * Primitive type:
- * - Integral type ('byte', 'short', 'int', 'long', 'char')
- * - Floating point type ('float', 'double')
- * - Boolean type ('boolean')
- * - No return type ('void')
- */
-[java:primitiveType] > nt:unstructured
- - java:primitiveTypeDescription (string)
- + java:modifier (java:modifierDeclaration) = java:modifierDeclaration
- - java:primitiveTypeName (string) mandatory
- + java:primitiveVariable (java:variable) = java:variable
- 
- [java:variable] > nt:unstructured
- - java:variableName (string) mandatory
- 
-/** 
- * java:arrayType 
- */ 
-[java:arrayType] > nt:unstructured
- - java:arrayTypeDescription (string)
- + java:arrayTypeModifier (java:modifierDeclaration) = java:modifierDeclaration
- - java:arrayTypeName (string) mandatory
- + java:arrayTypeVariable (java:variable) = java:variable
- 
-[java:simpleType] > nt:unstructured
- - java:simpleTypeDescription (string)
- + java:simpleTypeModifier (java:modifierDeclaration) = java:modifierDeclaration
- - java:simpleTypeName (string) mandatory
- + java:simpleTypeVariable (java:variable) = java:variable
-
-[java:qualifiedType] > nt:unstructured
- - java:qualifiedTypeDescription (string)
- + java:qualifiedTypeModifier (java:modifierDeclaration) = java:modifierDeclaration
- - java:qualifiedTypeName (string) mandatory
- + java:qualifiedTypeVariable (java:variable) = java:variable
-    
-[java:wildcardType] > nt:unstructured
- - java:wildcardTypeDescription (string)
- + java:wildcardTypeModifier (java:modifierDeclaration) = java:modifierDeclaration
- - java:wildcardTypeName (string) mandatory
- + java:wildcardTypeVariable (java:variable) = java:variable
-
-[java:parameterizedType] > nt:unstructured
- - java:parameterizedTypeDescription (string)
- + java:parameterizedTypeModifier (java:modifierDeclaration) = java:modifierDeclaration
- - java:parameterizedTypeName (string) mandatory
- + java:parameterizedTypeVariable (java:variable) = java:variable
-
-/** 
- * Field type 
- */
-[java:fieldType] > nt:unstructured
- + java:type (java:primitiveType, java:arrayType, java:simpleType, java:qualifiedType, java:wildcardType, java:parameterizedType) mandatory multiple 
- 
- /** 
-  * Method declaration 
-  */
-[java:methodDeclaration] > nt:unstructured
- - java:methodDescription (string)
- + java:modifier (java:modifierDeclaration) = java:modifierDeclaration
- + java:resultType (java:primitiveType, java:arrayType, java:simpleType, java:qualifiedType, java:wildcardType, java:parameterizedType) mandatory
- - java:methodName (string) mandatory
- + java:parameter (java:formalParameter) multiple
-
-/** 
- * Constructor declarations 
- */
-[java:constructorDeclaration] > nt:unstructured
- - java:constructorDescription (string)
- + java:modifier (java:modifierDeclaration) = java:modifierDeclaration
- - java:constructorName (string) mandatory
- + java:parameter (java:formalParameter)
-
-
-/**
- * Package declarations
- */
-[java:packageDeclaration] > nt:unstructured
- + java:annotation (java:annotationDeclaration) = java:annotationDeclaration
- - java:packageKeyword (string)
-   < 'package' 
- - java:packageName (string) mandatory 
-
-/**
- * Import declarations
- */
-[java:singleTypeImportDeclaration] > nt:unstructured
- - java:singleTypeImportkeyword (string) mandatory
-  < 'import'
- - java:singleImportName (string) mandatory
- 
-[java:typeImportOnDemandDeclaration] > nt:unstructured
- - java:onDemandImportKeyword (string) mandatory
-  < 'import'
- - java:onDemandImportName (string) mandatory
-
- [java:importDeclaration] > nt:unstructured
- + java:singleImport (java:singleTypeImportDeclaration) = java:singleTypeImportDeclaration
- + java:importOnDemand (java:typeImportOnDemandDeclaration) = java:typeImportOnDemandDeclaration
- 
-
-/**
- * Class declaration
- *
- * The body of class declares members (fields and methods and nested classes and interfaces), 
- * instance and static initializers, and constructors
- */
-[java:normalClassDeclaration] > nt:unstructured
- - java:description (string)
- + java:modifier (java:modifierDeclaration) = java:modifierDeclaration
- - java:normalClassName (string) mandatory
- + java:field (java:fieldType)  = java:fieldType multiple
- + java:method (java:methodDeclaration) = java:methodDeclaration multiple
- + java:constructor (java:constructorDeclaration) = java:constructorDeclaration multiple
- 
-[java:enumDeclaration] > nt:unstructured // TODO
- 
-[java:classDeclaration] > nt:unstructured
- + java:normalClass (java:normalClassDeclaration) = java:normalClassDeclaration
- + java:enum (java:enumDeclaration) = java:enumDeclaration
-
-/**
- * Interface declaration 
- *
- * The body of class declares members (fields and methods and nested classes and interfaces), 
- * instance and static initializers, and constructors
- */
-[java:interfaceDeclaration] > nt:unstructured
- 
- 
-/**
- * Compilation unit
- */
-[java:compilationUnit] > nt:unstructured
- + java:package (java:packageDeclaration) = java:packageDeclaration
- + java:import (java:importDeclaration) = java:importDeclaration
- + java:unitType (java:classDeclaration, java:interfaceDeclaration) 

Copied: trunk/docs/examples/gettingstarted/sequencers/src/main/resources/sequencing.cnd (from rev 970, trunk/docs/examples/gettingstarted/sequencers/src/main/resources/jackrabbitNodeTypes.cnd)
===================================================================
--- trunk/docs/examples/gettingstarted/sequencers/src/main/resources/sequencing.cnd	                        (rev 0)
+++ trunk/docs/examples/gettingstarted/sequencers/src/main/resources/sequencing.cnd	2009-06-04 16:32:16 UTC (rev 971)
@@ -0,0 +1,266 @@
+<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'>
+<image='http://jboss.org/dna/images/1.0'>
+<mp3='http://jboss.org/dna/mp3/1.0'>
+<java='http://www.jboss.org/dna/java/1.0'>
+
+// ----------------------------------------------------------
+// JCR Pre-defined Mixin Types that are not loaded by default
+// ----------------------------------------------------------
+
+[mix:mimeTyped] mixin 
+  - jcr:mimeType (string)  
+  - jcr:encoding (string)
+
+
+// -------------------
+// DNA Image Sequencer
+// -------------------
+
+/**
+ * Node type that defines the metadata for an image
+ */
+[image:metadata] > nt:unstructured, mix:mimeTyped
+  - image:formatName (string) mandatory
+    < 'JPEG', 'GIF', 'PNG', 'BMP', 'PCX', 'IFF', 'RAS', 'PBM', 'PGM', 'PPM', 'PSD'
+  - image:width (long)
+  - image:height (long)
+  - image:bitsPerPixel (long)
+  - image:progressive (boolean)
+  - image:numberOfImages (long)
+  - image:physicalWidthDpi (long)
+  - image:physicalHeightDpi (long)
+  - image:physicalWidthInches (long)
+  - image:physicalHeightInches (long)
+
+// -------------------
+// DNA MP3 Sequencer
+// -------------------
+
+/**
+ * Node type that defines the metadata for an MP3 audio file
+ */
+[mp3:metadata] > nt:unstructured, mix:mimeTyped
+  - mp3:title (string)
+  - mp3:author (string)
+  - mp3:album (string)
+  - mp3:year (long)
+  - mp3:comment (string)
+
+// -------------------
+// DNA Java Sequencer
+// -------------------
+
+//------------------------------------------------------------------------------
+// N O D E T Y P E S
+//------------------------------------------------------------------------------
+
+/**
+ * Element-value
+ */
+[java:elementValue] > nt:unstructured
+ + java:kindOfvalues (java:conditionalExpression, java:annotationDeclaration, java:elementValueArrayInitializer) mandatory
+ 
+/**
+ * Modifiers
+ */
+[java:modifierDeclaration] > nt:unstructured
+ - java:modifierName (string) mandatory
+
+/**
+ * Expression element-value type
+ */
+[java:conditionalExpression] > nt:unstructured
+ - java:expression (string)
+
+/**
+ * Array initializer element-value type
+ */
+[java:elementValueArrayInitializer] > nt:unstructured
+ + java:elementValue (java:elementValue) = java:elementValue multiple
+
+/**
+ * Identifier
+ */
+[java:identifier] > nt:unstructured
+ - java:identifierName (String) mandatory
+ + java:value (java:elementValue) = java:elementValue mandatory
+ 
+/**
+ * Element-value pair
+ */
+[java:elementValuePair] > nt:unstructured
+ + java:identifier (java:identifier) mandatory
+
+/**
+ * Annotation type
+ */
+[java:annotationDeclaration] > nt:unstructured
+ + java:annotationType (java:normalAnnotation, java:markerAnnotation,  java:singleElementAnnotation) mandatory
+  
+/**
+ * Normal annotation e.g. @Entity(name="Customer")
+ */
+[java:normalAnnotation] > nt:unstructured
+ - java:normalAnnotationName (string) mandatory
+ + java:elementValuePair (java:elementValuePair)
+
+/**
+ * Marker annotation e.g. @GET
+ */
+[java:markerAnnotation] > nt:unstructured
+ - java:markerAnnotationName (string) mandatory
+
+/**
+ * Single element annotation  e.g. @Path("/book")
+ */
+[java:singleElementAnnotation] > nt:unstructured
+ - java:singleElementAnnotationName (string) mandatory
+ + java:value (java:elementValue) = java:elementValue mandatory
+
+/** 
+ * Formal parameter
+ */
+[java:formalParameter] > nt:unstructured
+ + java:type (java:primitiveType, java:arrayType, java:simpleType, java:qualifiedType, java:wildcardType, java:parameterizedType)
+
+/**
+ * Primitive type:
+ * - Integral type ('byte', 'short', 'int', 'long', 'char')
+ * - Floating point type ('float', 'double')
+ * - Boolean type ('boolean')
+ * - No return type ('void')
+ */
+[java:primitiveType] > nt:unstructured
+ - java:primitiveTypeDescription (string)
+ + java:modifier (java:modifierDeclaration) = java:modifierDeclaration
+ - java:primitiveTypeName (string) mandatory
+ + java:primitiveVariable (java:variable) = java:variable
+ 
+ [java:variable] > nt:unstructured
+ - java:variableName (string) mandatory
+ 
+/** 
+ * java:arrayType 
+ */ 
+[java:arrayType] > nt:unstructured
+ - java:arrayTypeDescription (string)
+ + java:arrayTypeModifier (java:modifierDeclaration) = java:modifierDeclaration
+ - java:arrayTypeName (string) mandatory
+ + java:arrayTypeVariable (java:variable) = java:variable
+ 
+[java:simpleType] > nt:unstructured
+ - java:simpleTypeDescription (string)
+ + java:simpleTypeModifier (java:modifierDeclaration) = java:modifierDeclaration
+ - java:simpleTypeName (string) mandatory
+ + java:simpleTypeVariable (java:variable) = java:variable
+
+[java:qualifiedType] > nt:unstructured
+ - java:qualifiedTypeDescription (string)
+ + java:qualifiedTypeModifier (java:modifierDeclaration) = java:modifierDeclaration
+ - java:qualifiedTypeName (string) mandatory
+ + java:qualifiedTypeVariable (java:variable) = java:variable
+    
+[java:wildcardType] > nt:unstructured
+ - java:wildcardTypeDescription (string)
+ + java:wildcardTypeModifier (java:modifierDeclaration) = java:modifierDeclaration
+ - java:wildcardTypeName (string) mandatory
+ + java:wildcardTypeVariable (java:variable) = java:variable
+
+[java:parameterizedType] > nt:unstructured
+ - java:parameterizedTypeDescription (string)
+ + java:parameterizedTypeModifier (java:modifierDeclaration) = java:modifierDeclaration
+ - java:parameterizedTypeName (string) mandatory
+ + java:parameterizedTypeVariable (java:variable) = java:variable
+
+/** 
+ * Field type 
+ */
+[java:fieldType] > nt:unstructured
+ + java:type (java:primitiveType, java:arrayType, java:simpleType, java:qualifiedType, java:wildcardType, java:parameterizedType) mandatory multiple 
+ 
+ /** 
+  * Method declaration 
+  */
+[java:methodDeclaration] > nt:unstructured
+ - java:methodDescription (string)
+ + java:modifier (java:modifierDeclaration) = java:modifierDeclaration
+ + java:resultType (java:primitiveType, java:arrayType, java:simpleType, java:qualifiedType, java:wildcardType, java:parameterizedType) mandatory
+ - java:methodName (string) mandatory
+ + java:parameter (java:formalParameter) multiple
+
+/** 
+ * Constructor declarations 
+ */
+[java:constructorDeclaration] > nt:unstructured
+ - java:constructorDescription (string)
+ + java:modifier (java:modifierDeclaration) = java:modifierDeclaration
+ - java:constructorName (string) mandatory
+ + java:parameter (java:formalParameter)
+
+
+/**
+ * Package declarations
+ */
+[java:packageDeclaration] > nt:unstructured
+ + java:annotation (java:annotationDeclaration) = java:annotationDeclaration
+ - java:packageKeyword (string)
+   < 'package' 
+ - java:packageName (string) mandatory 
+
+/**
+ * Import declarations
+ */
+[java:singleTypeImportDeclaration] > nt:unstructured
+ - java:singleTypeImportkeyword (string) mandatory
+  < 'import'
+ - java:singleImportName (string) mandatory
+ 
+[java:typeImportOnDemandDeclaration] > nt:unstructured
+ - java:onDemandImportKeyword (string) mandatory
+  < 'import'
+ - java:onDemandImportName (string) mandatory
+
+ [java:importDeclaration] > nt:unstructured
+ + java:singleImport (java:singleTypeImportDeclaration) = java:singleTypeImportDeclaration
+ + java:importOnDemand (java:typeImportOnDemandDeclaration) = java:typeImportOnDemandDeclaration
+ 
+
+/**
+ * Class declaration
+ *
+ * The body of class declares members (fields and methods and nested classes and interfaces), 
+ * instance and static initializers, and constructors
+ */
+[java:normalClassDeclaration] > nt:unstructured
+ - java:description (string)
+ + java:modifier (java:modifierDeclaration) = java:modifierDeclaration
+ - java:normalClassName (string) mandatory
+ + java:field (java:fieldType)  = java:fieldType multiple
+ + java:method (java:methodDeclaration) = java:methodDeclaration multiple
+ + java:constructor (java:constructorDeclaration) = java:constructorDeclaration multiple
+ 
+[java:enumDeclaration] > nt:unstructured // TODO
+ 
+[java:classDeclaration] > nt:unstructured
+ + java:normalClass (java:normalClassDeclaration) = java:normalClassDeclaration
+ + java:enum (java:enumDeclaration) = java:enumDeclaration
+
+/**
+ * Interface declaration 
+ *
+ * The body of class declares members (fields and methods and nested classes and interfaces), 
+ * instance and static initializers, and constructors
+ */
+[java:interfaceDeclaration] > nt:unstructured
+ 
+ 
+/**
+ * Compilation unit
+ */
+[java:compilationUnit] > nt:unstructured
+ + java:package (java:packageDeclaration) = java:packageDeclaration
+ + java:import (java:importDeclaration) = java:importDeclaration
+ + java:unitType (java:classDeclaration, java:interfaceDeclaration)
+ 
\ No newline at end of file

Modified: trunk/docs/examples/gettingstarted/sequencers/src/test/java/org/jboss/example/dna/sequencer/MockUserInterface.java
===================================================================
--- trunk/docs/examples/gettingstarted/sequencers/src/test/java/org/jboss/example/dna/sequencer/MockUserInterface.java	2009-06-03 20:26:37 UTC (rev 970)
+++ trunk/docs/examples/gettingstarted/sequencers/src/test/java/org/jboss/example/dna/sequencer/MockUserInterface.java	2009-06-04 16:32:16 UTC (rev 971)
@@ -27,8 +27,6 @@
 import static org.junit.Assert.assertThat;
 import java.net.URL;
 import java.util.List;
-import org.jboss.example.dna.sequencer.ContentInfo;
-import org.jboss.example.dna.sequencer.UserInterface;
 
 /**
  * @author Randall Hauch
@@ -72,4 +70,13 @@
         return this.repositoryPath != null ? this.repositoryPath : defaultPath;
     }
 
+    /**
+     * {@inheritDoc}
+     * 
+     * @see org.jboss.example.dna.sequencer.UserInterface#displayError(java.lang.Exception)
+     */
+    public void displayError( Exception e ) {
+        // Do nothing
+    }
+
 }

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	2009-06-03 20:26:37 UTC (rev 970)
+++ trunk/docs/examples/gettingstarted/sequencers/src/test/java/org/jboss/example/dna/sequencer/SequencingClientTest.java	2009-06-04 16:32:16 UTC (rev 971)
@@ -34,7 +34,6 @@
 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.image.ImageMetadataSequencer;
 import org.jboss.dna.sequencer.java.JavaMetadataSequencer;
 import org.jboss.dna.sequencer.mp3.Mp3MetadataSequencer;
 import org.junit.After;
@@ -73,10 +72,7 @@
               .setProperty("defaultWorkspaceName", workspaceName);
         // Set up the JCR repository to use the source ...
         config.repository(repositoryId)
-              .addNodeTypes(ImageMetadataSequencer.class.getClassLoader().getResource("org/jboss/dna/sequencer/image/images.cnd"))
-              .addNodeTypes(Mp3MetadataSequencer.class.getClassLoader().getResource("org/jboss/dna/sequencer/mp3/mp3.cnd"))
-              .addNodeTypes(JavaMetadataSequencer.class.getClassLoader()
-                                                       .getResource("org/jboss/dna/sequencer/java/javaSource.cnd"))
+              .addNodeTypes(getClass().getClassLoader().getResource("sequencing.cnd"))
               .setSource("store")
               .setOption(JcrRepository.Option.JAAS_LOGIN_CONFIG_NAME, "dna-jcr");
         // Set up the image sequencer ...
@@ -123,7 +119,6 @@
 
     }
 
-    @Ignore
     @Test
     public void shouldUploadAndSequencePngFile() throws Exception {
         client.setUserInterface(new MockUserInterface(this.pngImageUrl, "/a/b/caution.png", 1));
@@ -132,13 +127,13 @@
 
         // Use a trick to wait until the sequencing has been done by sleeping (to give the sequencing time to start)
         // and to then shut down the DNA services (which will block until all sequencing has been completed) ...
-        Thread.sleep(1000);
+        Thread.sleep(4000);
 
+        assertThat(client.getStatistics().getNumberOfNodesSequenced(), is(1l));
+
         // The sequencers should have run, so perform the search.
         // The mock user interface checks the results.
         client.search();
-
-        assertThat(client.getStatistics().getNumberOfNodesSequenced(), is(1l));
     }
 
     @Ignore

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/svn/SVNConnectorTestUtil.java	2009-06-03 20:26:37 UTC (rev 970)
+++ trunk/extensions/dna-connector-svn/src/test/java/org/jboss/dna/connector/svn/SVNConnectorTestUtil.java	2009-06-04 16:32:16 UTC (rev 971)
@@ -45,7 +45,7 @@
  */
 public class SVNConnectorTestUtil {
 
-    @SuppressWarnings("unchecked")
+    @SuppressWarnings( "unchecked" )
     public static void main( String[] args ) throws Exception {
         try {
             System.out.println("My repos. ......");
@@ -53,53 +53,47 @@
             String username = "sp";
             String password = "";
             System.out.println(svnUrl);
-            SVNRepository trunkWorkspace = createRepository(svnUrl +"/trunk", username, password);
+            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.
+             * 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);
+
+            final Collection<SVNDirEntry> dirEntries = trunkWorkspace.getDir("", -1, null, (Collection<SVNDirEntry>)null);
             for (SVNDirEntry dirEntry : dirEntries) {
-             System.out.println("name: " + dirEntry.getName());   
+                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");
-//            }
 
+            // //
+            // 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();
@@ -144,26 +138,26 @@
         FileUtil.copy(mySrc, myDst);
 
         // Now set the two path roots
-        String url = myDst.getCanonicalFile().toURL().toString();
+        String url = myDst.getCanonicalFile().toURI().toURL().toString();
         return url.replaceFirst("file:/", "file://localhost/");
     }
-    
-    @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( ) );
+
+    @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) {
+    public static String getRepositoryWorspaceName( SVNRepository repository ) {
         String[] segments = repository.getLocation().getPath().split("/");
         return segments[segments.length - 1];
     }



From dna-commits at lists.jboss.org  Thu Jun  4 14:13:04 2009
From: dna-commits at lists.jboss.org (dna-commits at lists.jboss.org)
Date: Thu, 04 Jun 2009 14:13:04 -0400
Subject: [dna-commits] DNA SVN: r972 - in
	trunk/extensions/dna-connector-svn/src:
	main/resources/org/jboss/dna/connector/svn and 1 other directories.
Message-ID: <E1MCHR2-00053x-3d@committer01.frg.pub.inap.atl.jboss.com>

Author: rhauch
Date: 2009-06-04 14:13:03 -0400 (Thu, 04 Jun 2009)
New Revision: 972

Added:
   trunk/extensions/dna-connector-svn/src/main/resources/org/jboss/dna/connector/svn/SVNRepositoryConnectorI18n.properties
   trunk/extensions/dna-connector-svn/src/test/java/org/jboss/dna/connector/svn/SVNRepositoryConnectorI18nTest.java
Removed:
   trunk/extensions/dna-connector-svn/src/main/resources/org/jboss/dna/connector/svn/SVNConnectorI18n.properties
Modified:
   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/SVNRepositoryRequestProcessor.java
   trunk/extensions/dna-connector-svn/src/main/java/org/jboss/dna/connector/svn/SVNRepositoryUtil.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/SVNRepositoryConnectorCreateWorspaceTest.java
Log:
Many errors in the SVN connector tests, and the I18n files are all messed up.

Modified: 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	2009-06-04 16:32:16 UTC (rev 971)
+++ trunk/extensions/dna-connector-svn/src/main/java/org/jboss/dna/connector/svn/SVNRepositoryConnectorI18n.java	2009-06-04 18:13:03 UTC (rev 972)
@@ -35,11 +35,8 @@
     public static I18n connectorName;
     public static I18n nodeDoesNotExist;
     public static I18n nodeIsActuallyUnknow;
-    public static I18n nodeTypeIsNotSupported;
     public static I18n propertyIsRequired;
     public static I18n errorSerializingCachePolicyInSource;
-    public static I18n objectFoundInJndiWasNotCache;
-    public static I18n objectFoundInJndiWasNotCacheFactory;
     public static I18n locationInRequestMustHavePath;
     public static I18n sourceIsReadOnly;
     public static I18n sourceDoesNotSupportCreatingWorkspaces;
@@ -49,7 +46,6 @@
     public static I18n pathForPredefinedWorkspaceDoesNotExist;
     public static I18n pathForPredefinedWorkspaceIsNotDirectory;
     public static I18n pathForPredefinedWorkspaceCannotBeRead;
-    public static I18n worspaceDoesNotExist;
     public static I18n workspaceDoesNotExist;
     public static I18n pathForDefaultWorkspaceDoesNotExist;
     public static I18n pathForDefaultWorkspaceIsNotDirectory;

Modified: 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	2009-06-04 16:32:16 UTC (rev 971)
+++ trunk/extensions/dna-connector-svn/src/main/java/org/jboss/dna/connector/svn/SVNRepositoryRequestProcessor.java	2009-06-04 18:13:03 UTC (rev 972)
@@ -403,7 +403,7 @@
             }
             if (!found) {
                 request.setError(new InvalidWorkspaceException(
-                                                               SVNRepositoryConnectorI18n.worspaceDoesNotExist.text(workspaceName)));
+                                                               SVNRepositoryConnectorI18n.workspaceDoesNotExist.text(workspaceName)));
                 return;
             }
         }
@@ -800,7 +800,7 @@
      * @param message - comment for the creation.
      * @throws SVNException - if during the creation, there is an error.
      */
-    @SuppressWarnings("unused")
+    @SuppressWarnings( "unused" )
     private void mkdir( SVNRepository repos,
                         String root,
                         String childName,
@@ -825,7 +825,7 @@
      * @param message
      * @throws SVNException
      */
-    @SuppressWarnings("unused")
+    @SuppressWarnings( "unused" )
     private void newFile( String path,
                           String file,
                           byte[] content,
@@ -954,7 +954,7 @@
 
     }
 
-    @SuppressWarnings("unused")
+    @SuppressWarnings( "unused" )
     private byte[] getContent( Object[] objs ) {
         byte[] content = null;
         for (Object object : objs) {
@@ -966,7 +966,7 @@
         return content;
     }
 
-    @SuppressWarnings("unused")
+    @SuppressWarnings( "unused" )
     private Object[] values( Collection<Property> childNodeProperties ) {
         Set<Object> result = new HashSet<Object>();
         for (Property property : childNodeProperties) {
@@ -984,10 +984,10 @@
                 throw new RepositorySourceException(getSourceName(), msg.text(getSourceName(), request));
             }
             // TODO
-//             if (!segment.getName().getNamespaceUri().equals(defaultNamespaceUri)) {
-//                I18n msg = SVNRepositoryConnectorI18n.onlyTheDefaultNamespaceIsAllowed;
-//                throw new RepositorySourceException(getSourceName(), msg.text(getSourceName(), request));
-//            }
+            // if (!segment.getName().getNamespaceUri().equals(defaultNamespaceUri)) {
+            // I18n msg = SVNRepositoryConnectorI18n.onlyTheDefaultNamespaceIsAllowed;
+            // throw new RepositorySourceException(getSourceName(), msg.text(getSourceName(), request));
+            // }
         }
     }
 

Modified: 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	2009-06-04 16:32:16 UTC (rev 971)
+++ trunk/extensions/dna-connector-svn/src/main/java/org/jboss/dna/connector/svn/SVNRepositoryUtil.java	2009-06-04 18:13:03 UTC (rev 972)
@@ -16,9 +16,7 @@
 import org.tmatesoft.svn.core.wc.SVNWCUtil;
 
 /**
- * 
  * @author Serge Pagop
- *
  */
 public class SVNRepositoryUtil {
 
@@ -73,7 +71,6 @@
         return kind;
     }
 
-
     /**
      * Create a {@link SVNRepository} from a http protocol.
      * 
@@ -84,8 +81,7 @@
      */
     public static SVNRepository createRepository( String url,
                                                   String username,
-                                                  String password
-                                                  ) {
+                                                  String password ) {
         // for DAV (over http and https)
         DAVRepositoryFactory.setup();
         // For File
@@ -196,7 +192,6 @@
         return false;
     }
 
-    
     public static boolean exists( SVNRepository repository,
                                   String path ) {
         try {

Deleted: trunk/extensions/dna-connector-svn/src/main/resources/org/jboss/dna/connector/svn/SVNConnectorI18n.properties
===================================================================
--- trunk/extensions/dna-connector-svn/src/main/resources/org/jboss/dna/connector/svn/SVNConnectorI18n.properties	2009-06-04 16:32:16 UTC (rev 971)
+++ trunk/extensions/dna-connector-svn/src/main/resources/org/jboss/dna/connector/svn/SVNConnectorI18n.properties	2009-06-04 18:13:03 UTC (rev 972)
@@ -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.
-#
-
-connectorName = SVN Connector
-workspaceDoesNotExist = The workspace "{0}" does not exist
-nodeDoesNotExist = This node kind is missing at {0}
-locationInRequestMustHavePath = {0} requires a path in the request\: {1}
-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
-objectFoundInJndiWasNotSVNRepository = Object in JNDI at {0} found by SVNRepositorySource {1} was expected to be a typ of org.tmatesoft.svn.core.io.SVNRepository but instead was {2}
-objectFoundInJndiWasNotSVNRepositoryFactory =Object in JNDI at {0} found by SVNRepositorySource {1} was expected to be a typ of org.tmatesoft.svn.core.io.SVNRepositoryFactory but instead was {2}
-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} does not allow same name siblings on nodes: {1}
-onlyTheDefaultNamespaceIsAllowed = {0} requires node names use the default namespace: {1}
-unableToCreateWorkspaces ={0} does not allow creating new workspaces (request was to create "{1}")
-locationInRequestMustHavePath = {0} requires a path in the request: {1}
-sameNameSiblingsAreNotAllowed = {0} does not allow same name siblings on nodes: {1}
-onlyTheDefaultNamespaceIsAllowed = {0} requires node names use the default namespace: {1}
-sourceIsReadOnly = {0} is a read-only source; no updates are allowed
-unableToCreateWorkspaces = {0} does not allow creating new workspaces (request was to create "{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 971, trunk/extensions/dna-connector-svn/src/main/resources/org/jboss/dna/connector/svn/SVNConnectorI18n.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	2009-06-04 18:13:03 UTC (rev 972)
@@ -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.
+#
+
+connectorName = SVN Connector
+nodeDoesNotExist = This node kind is missing at {0}
+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} does not allow same name siblings on nodes: {1}
+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}")
\ No newline at end of file

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/svn/SVNConnectorTestUtil.java	2009-06-04 16:32:16 UTC (rev 971)
+++ trunk/extensions/dna-connector-svn/src/test/java/org/jboss/dna/connector/svn/SVNConnectorTestUtil.java	2009-06-04 18:13:03 UTC (rev 972)
@@ -127,7 +127,7 @@
     }
 
     public static String createURL( String src,
-                                    String dst ) throws IOException {
+                                    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);
@@ -138,8 +138,16 @@
         FileUtil.copy(mySrc, myDst);
 
         // Now set the two path roots
-        String url = myDst.getCanonicalFile().toURI().toURL().toString();
-        return url.replaceFirst("file:/", "file://localhost/");
+        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" )

Modified: trunk/extensions/dna-connector-svn/src/test/java/org/jboss/dna/connector/svn/SVNRepositoryConnectorCreateWorspaceTest.java
===================================================================
--- trunk/extensions/dna-connector-svn/src/test/java/org/jboss/dna/connector/svn/SVNRepositoryConnectorCreateWorspaceTest.java	2009-06-04 16:32:16 UTC (rev 971)
+++ trunk/extensions/dna-connector-svn/src/test/java/org/jboss/dna/connector/svn/SVNRepositoryConnectorCreateWorspaceTest.java	2009-06-04 18:13:03 UTC (rev 972)
@@ -12,8 +12,8 @@
 
 public class SVNRepositoryConnectorCreateWorspaceTest extends WorkspaceConnectorTest {
 
-    
     private String repositoryRootURL;
+
     /**
      * {@inheritDoc}
      * 
@@ -22,7 +22,7 @@
     @Override
     protected RepositorySource setUpSource() throws Exception {
         repositoryRootURL = SVNConnectorTestUtil.createURL("src/test/resources/dummy_svn_repos", "target/copy_of dummy_svn_repos");
-        String[] predefinedWorkspaceNames = new String[]{repositoryRootURL + "trunk", repositoryRootURL + "tags"};
+        String[] predefinedWorkspaceNames = new String[] {repositoryRootURL + "trunk", repositoryRootURL + "tags"};
         SVNRepositorySource source = new SVNRepositorySource();
         source.setName("Test Repository");
         source.setUsername("sp");
@@ -31,10 +31,10 @@
         source.setPredefinedWorkspaceNames(predefinedWorkspaceNames);
         source.setDirectoryForDefaultWorkspace(predefinedWorkspaceNames[0]);
         source.setCreatingWorkspacesAllowed(true);
-        
+
         return source;
     }
-    
+
     /**
      * {@inheritDoc}
      * 
@@ -62,9 +62,9 @@
      */
     @Override
     protected String[] generateValidNamesForNewWorkspaces() {
-        return new String[] { repositoryRootURL + "branches"};
+        return new String[] {repositoryRootURL + "branches"};
     }
-    
+
     @Test
     public void shouldReturnListOfWorkspacesMatchingRepositoryURLs() throws Exception {
         // The the actual names of the workspaces ...
@@ -73,7 +73,7 @@
             Workspace workspace = graph.useWorkspace(workspaceName);
             workspaceNames.add(workspace.getName());
         }
-        
+
         assertThat(workspaceNames.remove(repositoryRootURL + "trunk"), is(true));
         assertThat(workspaceNames.remove(repositoryRootURL + "tags"), is(true));
         assertThat(workspaceNames.isEmpty(), is(true));

Added: 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/SVNRepositoryConnectorI18nTest.java	                        (rev 0)
+++ trunk/extensions/dna-connector-svn/src/test/java/org/jboss/dna/connector/svn/SVNRepositoryConnectorI18nTest.java	2009-06-04 18:13:03 UTC (rev 972)
@@ -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.svn;
+
+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/svn/SVNRepositoryConnectorI18nTest.java
___________________________________________________________________
Name: svn:keywords
   + Id Revision
Name: svn:eol-style
   + LF



From dna-commits at lists.jboss.org  Thu Jun  4 15:16:36 2009
From: dna-commits at lists.jboss.org (dna-commits at lists.jboss.org)
Date: Thu, 04 Jun 2009 15:16:36 -0400
Subject: [dna-commits] DNA SVN: r973 -
	trunk/dna-jcr/src/main/java/org/jboss/dna/jcr.
Message-ID: <E1MCIQW-0007zE-IX@committer01.frg.pub.inap.atl.jboss.com>

Author: rhauch
Date: 2009-06-04 15:16:36 -0400 (Thu, 04 Jun 2009)
New Revision: 973

Modified:
   trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/RepositoryNodeTypeManager.java
Log:
DNA-442 Small change to allow node types to be registered in any order (within the batch)

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	2009-06-04 18:13:03 UTC (rev 972)
+++ trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/RepositoryNodeTypeManager.java	2009-06-04 19:16:36 UTC (rev 973)
@@ -1413,10 +1413,21 @@
 
                 List<JcrNodeDefinition> nodeDefs = new ArrayList<JcrNodeDefinition>(
                                                                                     nodeType.getDeclaredChildNodeDefinitions().length);
+                for (JcrNodeDefinition nodeDef : nodeType.getDeclaredChildNodeDefinitions()) {
+                    nodeDefs.add(nodeDef.with(this.context).with(this));
+                }
 
+                // Create a new node type that also has the correct property and child node definitions associated
+                JcrNodeType newNodeType = new JcrNodeType(this.context, this, nodeType.getInternalName(), supertypes,
+                                                          nodeType.getInternalPrimaryItemName(), nodeDefs, propertyDefs,
+                                                          nodeType.isMixin(), nodeType.hasOrderableChildNodes());
+                typesPendingRegistration.add(newNodeType);
+            }
+
+            // Make sure the nodes have primary types that are either already registered, or pending registration ...
+            for (JcrNodeType nodeType : typesPendingRegistration) {
                 for (JcrNodeDefinition nodeDef : nodeType.getDeclaredChildNodeDefinitions()) {
                     JcrNodeType[] requiredPrimaryTypes = new JcrNodeType[nodeDef.requiredPrimaryTypeNames().length];
-
                     int i = 0;
                     for (Name primaryTypeName : nodeDef.requiredPrimaryTypeNames()) {
                         requiredPrimaryTypes[i] = findTypeInMapOrList(primaryTypeName, typesPendingRegistration);
@@ -1427,15 +1438,7 @@
                         }
                         i++;
                     }
-
-                    nodeDefs.add(nodeDef.with(this.context).with(this));
                 }
-
-                // Create a new node type that also has the correct property and child node definitions associated
-                JcrNodeType newNodeType = new JcrNodeType(this.context, this, nodeType.getInternalName(), supertypes,
-                                                          nodeType.getInternalPrimaryItemName(), nodeDefs, propertyDefs,
-                                                          nodeType.isMixin(), nodeType.hasOrderableChildNodes());
-                typesPendingRegistration.add(newNodeType);
             }
 
             // Graph.Batch batch = graph.batch();



From dna-commits at lists.jboss.org  Thu Jun  4 15:29:33 2009
From: dna-commits at lists.jboss.org (dna-commits at lists.jboss.org)
Date: Thu, 04 Jun 2009 15:29:33 -0400
Subject: [dna-commits] DNA SVN: r974 -
	trunk/dna-jcr/src/main/java/org/jboss/dna/jcr.
Message-ID: <E1MCId3-0008QG-BA@committer01.frg.pub.inap.atl.jboss.com>

Author: rhauch
Date: 2009-06-04 15:29:32 -0400 (Thu, 04 Jun 2009)
New Revision: 974

Modified:
   trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/RepositoryNodeTypeManager.java
Log:
DNA-442 Small change to allow node types to be registered in any order (within the batch)

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	2009-06-04 19:16:36 UTC (rev 973)
+++ trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/RepositoryNodeTypeManager.java	2009-06-04 19:29:32 UTC (rev 974)
@@ -1177,8 +1177,6 @@
      * <ol>
      * <li>Residual child node definitions cannot be mandatory</li>
      * <li>If the child node is auto-created, it must specify a default primary type name</li>
-     * <li>All required primary types must already be fully registered with the type manager or must have been defined earlier in
-     * the batch. <i>This requirement may be relaxed in a future version of DNA.</i></li>
      * <li>If the child node overrides an existing child node definition from a supertype, the new definition must be mandatory if
      * the old definition was mandatory</li>
      * <li>The child node cannot override an existing child node definition from a supertype if the ancestor definition is
@@ -1268,8 +1266,6 @@
      * <ol>
      * <li>Residual child node definitions cannot be mandatory</li>
      * <li>If the child node is auto-created, it must specify a default primary type name</li>
-     * <li>All required primary types must already be fully registered with the type manager or must have been defined earlier in
-     * the batch. <i>This requirement may be relaxed in a future version of DNA.</i></li>
      * <li>If the child node overrides an existing child node definition from a supertype, the new definition must be mandatory if
      * the old definition was mandatory</li>
      * <li>The child node cannot override an existing child node definition from a supertype if the ancestor definition is
@@ -1346,8 +1342,6 @@
      * <ol>
      * <li>Residual child node definitions cannot be mandatory</li>
      * <li>If the child node is auto-created, it must specify a default primary type name</li>
-     * <li>All required primary types must already be fully registered with the type manager or must have been defined earlier in
-     * the batch. <i>This requirement may be relaxed in a future version of DNA.</i></li>
      * <li>If the child node overrides an existing child node definition from a supertype, the new definition must be mandatory if
      * the old definition was mandatory</li>
      * <li>The child node cannot override an existing child node definition from a supertype if the ancestor definition is
@@ -1774,8 +1768,6 @@
      * <ol>
      * <li>Residual child node definitions cannot be mandatory</li>
      * <li>If the child node is auto-created, it must specify a default primary type name</li>
-     * <li>All required primary types must already be fully registered with the type manager or must have been defined earlier in
-     * the batch. This requirement may be relaxed in a future version of DNA.</li>
      * <li>If the child node overrides an existing child node definition from a supertype, the new definition must be mandatory if
      * the old definition was mandatory</li>
      * <li>The child node cannot override an existing child node definition from a supertype if the ancestor definition is



From dna-commits at lists.jboss.org  Thu Jun  4 17:42:27 2009
From: dna-commits at lists.jboss.org (dna-commits at lists.jboss.org)
Date: Thu, 04 Jun 2009 17:42:27 -0400
Subject: [dna-commits] DNA SVN: r975 - in trunk:
	dna-repository/src/main/java/org/jboss/dna/repository/sequencer
	and 2 other directories.
Message-ID: <E1MCKhf-0000J2-Ft@committer01.frg.pub.inap.atl.jboss.com>

Author: rhauch
Date: 2009-06-04 17:42:27 -0400 (Thu, 04 Jun 2009)
New Revision: 975

Modified:
   trunk/dna-graph/src/main/java/org/jboss/dna/graph/property/PropertyType.java
   trunk/dna-graph/src/main/java/org/jboss/dna/graph/property/ValueComparators.java
   trunk/dna-repository/src/main/java/org/jboss/dna/repository/sequencer/StreamSequencerAdapter.java
   trunk/docs/examples/gettingstarted/sequencers/src/main/java/org/jboss/example/dna/sequencer/SequencingClient.java
   trunk/docs/examples/gettingstarted/sequencers/src/test/java/org/jboss/example/dna/sequencer/SequencingClientTest.java
Log:
DNA-389 More minor corrections in how property types are determined for different values (including values that are instances of non-canonical classes, such as Integer).  Discovered DNA-443, so adding temporary ignore to the sequencing test of Java source code.

Modified: trunk/dna-graph/src/main/java/org/jboss/dna/graph/property/PropertyType.java
===================================================================
--- trunk/dna-graph/src/main/java/org/jboss/dna/graph/property/PropertyType.java	2009-06-04 19:29:32 UTC (rev 974)
+++ trunk/dna-graph/src/main/java/org/jboss/dna/graph/property/PropertyType.java	2009-06-04 21:42:27 UTC (rev 975)
@@ -26,10 +26,13 @@
 import java.math.BigDecimal;
 import java.net.URI;
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.Collections;
 import java.util.Comparator;
+import java.util.HashSet;
 import java.util.Iterator;
 import java.util.List;
+import java.util.Set;
 import java.util.UUID;
 import net.jcip.annotations.Immutable;
 import org.jboss.dna.common.util.CheckArg;
@@ -42,20 +45,45 @@
 @Immutable
 public enum PropertyType {
 
-    STRING("String", ValueComparators.STRING_COMPARATOR, String.class),
-    BINARY("Binary", ValueComparators.BINARY_COMPARATOR, Binary.class),
-    LONG("Long", ValueComparators.LONG_COMPARATOR, Long.class),
-    DOUBLE("Double", ValueComparators.DOUBLE_COMPARATOR, Double.class),
-    DECIMAL("Decimal", ValueComparators.DECIMAL_COMPARATOR, BigDecimal.class),
-    DATE("Date", ValueComparators.DATE_TIME_COMPARATOR, DateTime.class),
-    BOOLEAN("Boolean", ValueComparators.BOOLEAN_COMPARATOR, Boolean.class),
-    NAME("Name", ValueComparators.NAME_COMPARATOR, Name.class),
-    PATH("Path", ValueComparators.PATH_COMPARATOR, Path.class),
-    UUID("UUID", ValueComparators.UUID_COMPARATOR, UUID.class),
-    REFERENCE("Reference", ValueComparators.REFERENCE_COMPARATOR, Reference.class),
-    URI("URI", ValueComparators.URI_COMPARATOR, URI.class),
-    OBJECT("Object", ValueComparators.OBJECT_COMPARATOR, Object.class);
+    STRING("String", ValueComparators.STRING_COMPARATOR, new ObjectCanonicalizer(), String.class),
+    BINARY("Binary", ValueComparators.BINARY_COMPARATOR, new ObjectCanonicalizer(), Binary.class),
+    LONG("Long", ValueComparators.LONG_COMPARATOR, new LongCanonicalizer(), Long.class, Integer.class, Short.class),
+    DOUBLE("Double", ValueComparators.DOUBLE_COMPARATOR, new DoubleCanonicalizer(), Double.class, Float.class),
+    DECIMAL("Decimal", ValueComparators.DECIMAL_COMPARATOR, new ObjectCanonicalizer(), BigDecimal.class),
+    DATE("Date", ValueComparators.DATE_TIME_COMPARATOR, new ObjectCanonicalizer(), DateTime.class),
+    BOOLEAN("Boolean", ValueComparators.BOOLEAN_COMPARATOR, new ObjectCanonicalizer(), Boolean.class),
+    NAME("Name", ValueComparators.NAME_COMPARATOR, new ObjectCanonicalizer(), Name.class),
+    PATH("Path", ValueComparators.PATH_COMPARATOR, new ObjectCanonicalizer(), Path.class),
+    UUID("UUID", ValueComparators.UUID_COMPARATOR, new ObjectCanonicalizer(), UUID.class),
+    REFERENCE("Reference", ValueComparators.REFERENCE_COMPARATOR, new ObjectCanonicalizer(), Reference.class),
+    URI("URI", ValueComparators.URI_COMPARATOR, new ObjectCanonicalizer(), URI.class),
+    OBJECT("Object", ValueComparators.OBJECT_COMPARATOR, new ObjectCanonicalizer(), Object.class);
 
+    private static interface Canonicalizer {
+        Object canonicalizeValue( Object value );
+    }
+
+    protected final static class ObjectCanonicalizer implements Canonicalizer {
+        public Object canonicalizeValue( Object value ) {
+            return value;
+        }
+    }
+
+    protected final static class LongCanonicalizer implements Canonicalizer {
+        public Object canonicalizeValue( Object value ) {
+            if (value instanceof Integer) return new Long((Integer)value);
+            if (value instanceof Short) return new Long((Short)value);
+            return value;
+        }
+    }
+
+    protected final static class DoubleCanonicalizer implements Canonicalizer {
+        public Object canonicalizeValue( Object value ) {
+            if (value instanceof Float) return new Double((Float)value);
+            return value;
+        }
+    }
+
     private static final List<PropertyType> ALL_PROPERTY_TYPES;
     static {
         List<PropertyType> types = new ArrayList<PropertyType>();
@@ -67,14 +95,24 @@
 
     private final String name;
     private final Comparator<?> comparator;
+    private final Canonicalizer canonicalizer;
     private final Class<?> valueClass;
+    private final Set<Class<?>> castableValueClasses;
 
     private PropertyType( String name,
                           Comparator<?> comparator,
-                          Class<?> valueClass ) {
+                          Canonicalizer canonicalizer,
+                          Class<?> valueClass,
+                          Class<?>... castableClasses ) {
         this.name = name;
         this.comparator = comparator;
+        this.canonicalizer = canonicalizer;
         this.valueClass = valueClass;
+        if (castableClasses != null && castableClasses.length != 0) {
+            castableValueClasses = Collections.unmodifiableSet(new HashSet<Class<?>>(Arrays.asList(castableClasses)));
+        } else {
+            castableValueClasses = Collections.emptySet();
+        }
     }
 
     public Class<?> getValueClass() {
@@ -89,21 +127,39 @@
         return this.comparator;
     }
 
-    public boolean isTypeFor( Object value ) {
-        return this.valueClass.isInstance(value);
+    /**
+     * Obtain a value of this type in its canonical form. Some property types allow values to be instances of the canonical class
+     * or an alternative class. This method ensures that the value is always an instance of the canonical class.
+     * <p>
+     * Note that this method does <i>not</i> cast from one property type to another.
+     * </p>
+     * 
+     * @param value the property value
+     * @return the value in canonical form
+     */
+    public Object getCanonicalValue( Object value ) {
+        return this.canonicalizer.canonicalizeValue(value);
     }
 
-    public boolean isTypeForEach( Iterable<?> values ) {
+    public final boolean isTypeFor( Object value ) {
+        if (this.valueClass.isInstance(value)) return true;
+        for (Class<?> valueClass : castableValueClasses) {
+            if (valueClass.isInstance(value)) return true;
+        }
+        return false;
+    }
+
+    public final boolean isTypeForEach( Iterable<?> values ) {
         for (Object value : values) {
-            if (!this.valueClass.isInstance(value)) return false;
+            if (!isTypeFor(value)) return false;
         }
         return true;
     }
 
-    public boolean isTypeForEach( Iterator<?> values ) {
+    public final boolean isTypeForEach( Iterator<?> values ) {
         while (values.hasNext()) {
             Object value = values.next();
-            if (!this.valueClass.isInstance(value)) return false;
+            if (!isTypeFor(value)) return false;
         }
         return true;
     }

Modified: trunk/dna-graph/src/main/java/org/jboss/dna/graph/property/ValueComparators.java
===================================================================
--- trunk/dna-graph/src/main/java/org/jboss/dna/graph/property/ValueComparators.java	2009-06-04 19:29:32 UTC (rev 974)
+++ trunk/dna-graph/src/main/java/org/jboss/dna/graph/property/ValueComparators.java	2009-06-04 21:42:27 UTC (rev 975)
@@ -308,6 +308,11 @@
             if (o2 == null) return 1;
             PropertyType type1 = PropertyType.discoverType(o1);
             PropertyType type2 = PropertyType.discoverType(o2);
+
+            // Canonicalize the values ...
+            o1 = type1.getCanonicalValue(o1);
+            o2 = type2.getCanonicalValue(o2);
+
             if (type1 != PropertyType.OBJECT && type2 != PropertyType.OBJECT) {
                 if (type1 == type2) return ((Comparator<Object>)type1.getComparator()).compare(o1, o2);
 

Modified: trunk/dna-repository/src/main/java/org/jboss/dna/repository/sequencer/StreamSequencerAdapter.java
===================================================================
--- trunk/dna-repository/src/main/java/org/jboss/dna/repository/sequencer/StreamSequencerAdapter.java	2009-06-04 19:29:32 UTC (rev 974)
+++ trunk/dna-repository/src/main/java/org/jboss/dna/repository/sequencer/StreamSequencerAdapter.java	2009-06-04 21:42:27 UTC (rev 975)
@@ -178,13 +178,18 @@
                               SequencerContext context ) {
         PathFactory pathFactory = context.getExecutionContext().getValueFactories().getPathFactory();
 
+        if (targetPath.isRoot()) return;
         Path workingPath = pathFactory.createRootPath();
         Path.Segment[] segments = targetPath.getSegmentsArray();
-        for (int i = 0; i < segments.length; i++) {
-            workingPath = pathFactory.create(workingPath, segments[i]);
-
-            context.graph().createIfMissing(workingPath);
+        int i = 0;
+        if (segments.length > 1) {
+            for (int max = segments.length - 1; i < max; i++) {
+                workingPath = pathFactory.create(workingPath, segments[i]);
+                context.graph().createIfMissing(workingPath);
+            }
         }
+        workingPath = pathFactory.create(workingPath, segments[i]);
+        context.graph().create(workingPath);
     }
 
     /**

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	2009-06-04 19:29:32 UTC (rev 974)
+++ trunk/docs/examples/gettingstarted/sequencers/src/main/java/org/jboss/example/dna/sequencer/SequencingClient.java	2009-06-04 21:42:27 UTC (rev 975)
@@ -103,9 +103,9 @@
         config.sequencer("Java Sequencer")
               .usingClass("org.jboss.dna.sequencer.java.JavaMetadataSequencer")
               .loadedFromClasspath()
-              .setDescription("Sequences mp3 files to extract the id3 tags of the audio file")
-              .sequencingFrom("//(*.mp3[*])/jcr:content[@jcr:data]")
-              .andOutputtingTo("/mp3s/$1");
+              .setDescription("Sequences Java files to extract the AST structure of the Java source code")
+              .sequencingFrom("//(*.java[*])/jcr:content[@jcr:data]")
+              .andOutputtingTo("/java/$1");
 
         // Now start the client and tell it which repository and workspace to use ...
         SequencingClient client = new SequencingClient(config, repositoryId, workspaceName);

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	2009-06-04 19:29:32 UTC (rev 974)
+++ trunk/docs/examples/gettingstarted/sequencers/src/test/java/org/jboss/example/dna/sequencer/SequencingClientTest.java	2009-06-04 21:42:27 UTC (rev 975)
@@ -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.junit.Assert.fail;
 import java.io.IOException;
 import java.io.InputStream;
 import java.net.MalformedURLException;
@@ -91,9 +92,9 @@
         // Set up the Java source file sequencer ...
         config.sequencer("Java Sequencer")
               .usingClass(JavaMetadataSequencer.class)
-              .setDescription("Sequences mp3 files to extract the id3 tags of the audio file")
-              .sequencingFrom("//(*.mp3[*])/jcr:content[@jcr:data]")
-              .andOutputtingTo("/mp3s/$1");
+              .setDescription("Sequences Java files to extract the AST structure of the Java source code")
+              .sequencingFrom("//(*.java[*])/jcr:content[@jcr:data]")
+              .andOutputtingTo("/java/$1");
 
         // Now start the client and tell it which repository and workspace to use ...
         client = new SequencingClient(config, repositoryId, workspaceName);
@@ -125,69 +126,64 @@
         client.startRepository();
         client.uploadFile();
 
-        // Use a trick to wait until the sequencing has been done by sleeping (to give the sequencing time to start)
-        // and to then shut down the DNA services (which will block until all sequencing has been completed) ...
-        Thread.sleep(4000);
+        waitUntilSequencedNodesIs(1);
 
-        assertThat(client.getStatistics().getNumberOfNodesSequenced(), is(1l));
-
         // The sequencers should have run, so perform the search.
         // The mock user interface checks the results.
         client.search();
     }
 
-    @Ignore
     @Test
     public void shouldUploadAndSequenceJpegFile() throws Exception {
         client.setUserInterface(new MockUserInterface(this.jpegImageUrl, "/a/b/caution.jpeg", 1));
         client.startRepository();
         client.uploadFile();
 
-        // Use a trick to wait until the sequencing has been done by sleeping (to give the sequencing time to start)
-        // and to then shut down the DNA services (which will block until all sequencing has been completed) ...
-        Thread.sleep(1000);
+        waitUntilSequencedNodesIs(1);
 
         // The sequencers should have run, so perform the search.
         // The mock user interface checks the results.
         client.search();
-
-        assertThat(client.getStatistics().getNumberOfNodesSequenced(), is(1l));
     }
 
-    @Ignore
     @Test
-    public void shouldUploadAndNotSequencePictFile() throws Exception {
-        client.setUserInterface(new MockUserInterface(this.pictImageUrl, "/a/b/caution.pict", 0));
+    public void shouldUploadAndSequenceMp3File() throws Exception {
+        client.setUserInterface(new MockUserInterface(this.mp3Url, "/a/b/test.mp3", 1));
         client.startRepository();
         client.uploadFile();
 
-        // Use a trick to wait until the sequencing has been done by sleeping (to give the sequencing time to start)
-        // and to then shut down the DNA services (which will block until all sequencing has been completed) ...
-        Thread.sleep(1000);
+        waitUntilSequencedNodesIs(1);
 
         // The sequencers should have run, so perform the search.
         // The mock user interface checks the results.
         client.search();
-
-        assertThat(client.getStatistics().getNumberOfNodesSequenced(), is(0l));
     }
 
     @Ignore
     @Test
-    public void shouldUploadAndSequenceMp3File() throws Exception {
-        client.setUserInterface(new MockUserInterface(this.mp3Url, "/a/b/test.mp3", 1));
+    public void shouldUploadAndSequenceJavaSourceFile() throws Exception {
+        client.setUserInterface(new MockUserInterface(this.javaSourceUrl, "/a/b/MySource.java", 1));
         client.startRepository();
         client.uploadFile();
 
-        // Use a trick to wait until the sequencing has been done by sleeping (to give the sequencing time to start)
-        // and to then shut down the DNA services (which will block until all sequencing has been completed) ...
-        Thread.sleep(1000);
+        waitUntilSequencedNodesIs(1);
 
         // The sequencers should have run, so perform the search.
         // The mock user interface checks the results.
         client.search();
+    }
 
-        assertThat(client.getStatistics().getNumberOfNodesSequenced(), is(1l));
+    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 = client.getStatistics().getNumberOfNodesSequenced();
+            if (numFound >= totalNumberOfNodesSequenced) {
+                return;
+            }
+            Thread.sleep(100);
+        }
+        fail("Expected to find " + totalNumberOfNodesSequenced + " nodes sequenced, but found " + numFound);
     }
 
     @Test
@@ -203,21 +199,4 @@
         }
     }
 
-    @Ignore
-    @Test
-    public void shouldUploadAndSequenceJavaSourceFile() throws Exception {
-        client.setUserInterface(new MockUserInterface(this.javaSourceUrl, "/a/b/MySource.java", 1));
-        client.startRepository();
-        client.uploadFile();
-
-        // Use a trick to wait until the sequencing has been done by sleeping (to give the sequencing time to start)
-        // and to then shut down the DNA services (which will block until all sequencing has been completed) ...
-        Thread.sleep(1000);
-
-        // The sequencers should have run, so perform the search.
-        // The mock user interface checks the results.
-        client.search();
-        assertThat(client.getStatistics().getNumberOfNodesSequenced(), is(1L));
-    }
-
 }



From dna-commits at lists.jboss.org  Thu Jun  4 17:46:34 2009
From: dna-commits at lists.jboss.org (dna-commits at lists.jboss.org)
Date: Thu, 04 Jun 2009 17:46:34 -0400
Subject: [dna-commits] DNA SVN: r976 -
	trunk/docs/examples/gettingstarted/sequencers/src/main/resources.
Message-ID: <E1MCKle-0000ae-SW@committer01.frg.pub.inap.atl.jboss.com>

Author: rhauch
Date: 2009-06-04 17:46:34 -0400 (Thu, 04 Jun 2009)
New Revision: 976

Removed:
   trunk/docs/examples/gettingstarted/sequencers/src/main/resources/jackrabbitConfig.xml
Modified:
   trunk/docs/examples/gettingstarted/sequencers/src/main/resources/log4j.properties
Log:
DNA-405 Removed all remaining traces of Jackrabbit from the sequencer example.

Deleted: trunk/docs/examples/gettingstarted/sequencers/src/main/resources/jackrabbitConfig.xml
===================================================================
--- trunk/docs/examples/gettingstarted/sequencers/src/main/resources/jackrabbitConfig.xml	2009-06-04 21:42:27 UTC (rev 975)
+++ trunk/docs/examples/gettingstarted/sequencers/src/main/resources/jackrabbitConfig.xml	2009-06-04 21:46:34 UTC (rev 976)
@@ -1,115 +0,0 @@
-<?xml version="1.0"?>
-<!--
-   Licensed to the Apache Software Foundation (ASF) under one or more
-   contributor license agreements.  See the NOTICE file distributed with
-   this work for additional information regarding copyright ownership.
-   The ASF licenses this file to You under the Apache License, Version 2.0
-   (the "License"); you may not use this file except in compliance with
-   the License.  You may obtain a copy of the License at
-
-       http://www.apache.org/licenses/LICENSE-2.0
-
-   Unless required by applicable law or agreed to in writing, software
-   distributed under the License is distributed on an "AS IS" BASIS,
-   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-   See the License for the specific language governing permissions and
-   limitations under the License.
--->
-<!DOCTYPE Repository PUBLIC "-//The Apache Software Foundation//DTD Jackrabbit 1.2//EN"
-                            "http://jackrabbit.apache.org/dtd/repository-1.2.dtd">
-<!-- Example Repository Configuration File -->
-<Repository>
-    <!--
-        virtual file system where the repository stores global state
-        (e.g. registered namespaces, custom node types, etc.)
-    -->
-    <FileSystem class="org.apache.jackrabbit.core.fs.local.LocalFileSystem">
-        <param name="path" value="${rep.home}/repository"/>
-    </FileSystem>
-
-    <!--
-        security configuration
-    -->
-    <Security appName="Jackrabbit">
-        <!--
-            access manager:
-            class: FQN of class implementing the AccessManager interface
-        -->
-        <AccessManager class="org.apache.jackrabbit.core.security.SimpleAccessManager">
-            <!-- <param name="config" value="${rep.home}/access.xml"/> -->
-        </AccessManager>
-
-        <LoginModule class="org.apache.jackrabbit.core.security.SimpleLoginModule">
-           <!-- anonymous user name ('anonymous' is the default value) -->
-           <param name="anonymousId" value="anonymous"/>
-           <!--
-              default user name to be used instead of the anonymous user
-              when no login credentials are provided (unset by default)
-           -->
-           <!-- <param name="defaultUserId" value="superuser"/> -->
-        </LoginModule>
-    </Security>
-
-    <!--
-        location of workspaces root directory and name of default workspace
-    -->
-    <Workspaces rootPath="${rep.home}/workspaces" defaultWorkspace="default"/>
-    <!--
-        workspace configuration template:
-        used to create the initial workspace if there's no workspace yet
-    -->
-    <Workspace name="Jackrabbit Core">
-        <!--
-            virtual file system of the workspace:
-            class: FQN of class implementing the FileSystem interface
-        -->
-        <FileSystem class="org.apache.jackrabbit.core.fs.local.LocalFileSystem">
-            <param name="path" value="${wsp.home}"/>
-        </FileSystem>
-        <!--
-            persistence manager of the workspace:
-            class: FQN of class implementing the PersistenceManager interface
-        -->
-        <PersistenceManager class="org.apache.jackrabbit.core.persistence.mem.InMemPersistenceManager">
-          <param name="persistent" value="false"/>
-        </PersistenceManager>
-        <!--
-            Search index and the file system it uses.
-            class: FQN of class implementing the QueryHandler interface
-        -->
-        <SearchIndex class="org.apache.jackrabbit.core.query.lucene.SearchIndex">
-            <param name="path" value="${wsp.home}/index"/>
-        </SearchIndex>
-    </Workspace>
-
-    <!--
-        Configures the versioning
-    -->
-    <Versioning rootPath="${rep.home}/version">
-        <!--
-            Configures the filesystem to use for versioning for the respective
-            persistence manager
-        -->
-        <FileSystem class="org.apache.jackrabbit.core.fs.local.LocalFileSystem">
-            <param name="path" value="${rep.home}/version" />
-        </FileSystem>
-
-        <!--
-            Configures the persistence manager to be used for persisting version state.
-            Please note that the current versioning implementation is based on
-            a 'normal' persistence manager, but this could change in future
-            implementations.
-        -->
-        <PersistenceManager class="org.apache.jackrabbit.core.persistence.mem.InMemPersistenceManager">
-          <param name="persistent" value="false"/>
-        </PersistenceManager>
-    </Versioning>
-
-    <!--
-        Search index for content that is shared repository wide
-        (/jcr:system tree, contains mainly versions)
-    -->
-    <SearchIndex class="org.apache.jackrabbit.core.query.lucene.SearchIndex">
-        <param name="path" value="${rep.home}/repository/index"/>
-    </SearchIndex>
-</Repository>

Modified: trunk/docs/examples/gettingstarted/sequencers/src/main/resources/log4j.properties
===================================================================
--- trunk/docs/examples/gettingstarted/sequencers/src/main/resources/log4j.properties	2009-06-04 21:42:27 UTC (rev 975)
+++ trunk/docs/examples/gettingstarted/sequencers/src/main/resources/log4j.properties	2009-06-04 21:46:34 UTC (rev 976)
@@ -10,7 +10,3 @@
 # Set up the default logging to be INFO level, then override specific units
 log4j.logger.org.jboss.dna=INFO
 
-# Jackrabbit logging
-log4j.logger.org.apache.jackrabbit=WARN, stdout
-log4j.logger.org.apache.derby=INFO, stdout
-



From dna-commits at lists.jboss.org  Thu Jun  4 19:36:28 2009
From: dna-commits at lists.jboss.org (dna-commits at lists.jboss.org)
Date: Thu, 04 Jun 2009 19:36:28 -0400
Subject: [dna-commits] DNA SVN: r978 - in trunk:
	dna-jcr/src/test/java/org/jboss/dna/jcr and 16 other directories.
Message-ID: <E1MCMU0-0007yT-1X@committer01.frg.pub.inap.atl.jboss.com>

Author: rhauch
Date: 2009-06-04 19:36:27 -0400 (Thu, 04 Jun 2009)
New Revision: 978

Removed:
   trunk/dna-jcr/src/test/java/org/jboss/dna/jcr/TestUtil.java
   trunk/extensions/dna-sequencer-java/src/test/resources/jackrabbitInMemoryTestRepositoryConfig.xml
   trunk/extensions/dna-sequencer-xml/src/test/resources/jackrabbitInMemoryTestRepositoryConfig.xml
Modified:
   trunk/dna-graph/src/test/resources/log4j.properties
   trunk/dna-repository/src/test/resources/log4j.properties
   trunk/docs/examples/gettingstarted/repositories/src/test/resources/log4j.properties
   trunk/docs/examples/gettingstarted/sequencers/src/main/assembly/basic.xml
   trunk/docs/examples/gettingstarted/sequencers/src/main/java/org/jboss/example/dna/sequencer/SequencingClient.java
   trunk/docs/examples/gettingstarted/sequencers/src/test/resources/log4j.properties
   trunk/docs/reference/src/main/docbook/en-US/content/introduction.xml
   trunk/extensions/dna-connector-federation/src/test/resources/log4j.properties
   trunk/extensions/dna-mimetype-detector-aperture/pom.xml
   trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/master.xml
   trunk/extensions/dna-sequencer-images/src/test/resources/log4j.properties
   trunk/extensions/dna-sequencer-java/src/test/resources/log4j.properties
   trunk/extensions/dna-sequencer-mp3/src/test/resources/log4j.properties
   trunk/extensions/dna-sequencer-msoffice/src/test/resources/log4j.properties
   trunk/extensions/dna-sequencer-xml/src/test/java/org/jboss/dna/sequencer/xml/XmlSequencerTest.java
   trunk/extensions/dna-sequencer-xml/src/test/resources/log4j.properties
   trunk/extensions/dna-sequencer-xml/src/test/resources/master.xml
   trunk/extensions/dna-sequencer-zip/src/test/resources/log4j.properties
Log:
DNA-405 Continued the removal of most references and use of Jackrabbit, with the exception of the Jackrabbit API unit tests (aka, the TCK unit tests), the Maven classloader project, and the 'dna-integration-test' project.  Some documentation still needs to be updated.

Modified: trunk/dna-graph/src/test/resources/log4j.properties
===================================================================
--- trunk/dna-graph/src/test/resources/log4j.properties	2009-06-04 22:31:30 UTC (rev 977)
+++ trunk/dna-graph/src/test/resources/log4j.properties	2009-06-04 23:36:27 UTC (rev 978)
@@ -10,7 +10,3 @@
 # Set up the default logging to be INFO level, then override specific units
 log4j.logger.org.jboss.dna=INFO
 
-# Jackrabbit logging
-log4j.logger.org.apache.jackrabbit=WARN, stdout
-log4j.logger.org.apache.derby=INFO, stdout
-

Deleted: trunk/dna-jcr/src/test/java/org/jboss/dna/jcr/TestUtil.java
===================================================================
--- trunk/dna-jcr/src/test/java/org/jboss/dna/jcr/TestUtil.java	2009-06-04 22:31:30 UTC (rev 977)
+++ trunk/dna-jcr/src/test/java/org/jboss/dna/jcr/TestUtil.java	2009-06-04 23:36:27 UTC (rev 978)
@@ -1,716 +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.jcr;
-
-import javax.security.auth.login.LoginContext;
-import net.jcip.annotations.NotThreadSafe;
-import org.jboss.dna.graph.ExecutionContext;
-import org.jboss.dna.graph.Graph;
-import org.jboss.dna.graph.JcrNtLexicon;
-import org.jboss.dna.graph.connector.RepositoryConnection;
-import org.jboss.dna.graph.connector.RepositoryConnectionFactory;
-import org.jboss.dna.graph.connector.RepositorySource;
-import org.jboss.dna.graph.property.NamespaceRegistry;
-import org.mockito.Mockito;
-
-/**
- * @author jverhaeg
- */
- at NotThreadSafe
-public class TestUtil {
-
-    public static RepositoryConnectionFactory createJackRabbitConnectionFactory( final RepositorySource source,
-                                                                                 final ExecutionContext context ) {
-        Graph repository = Graph.create(source, context);
-        Graph.Batch batch = repository.batch();
-        batch.set(JcrLexicon.PRIMARY_TYPE).on("/").to(JcrNtLexicon.UNSTRUCTURED).and();
-        batch.create("/dna:system").with(JcrLexicon.PRIMARY_TYPE, JcrNtLexicon.UNSTRUCTURED).and();
-        batch.create("/dna:system/jcr:versionStorage").with(JcrLexicon.PRIMARY_TYPE, "rep:versionStorage").and();
-        batch.create("/dna:system/jcr:nodeTypes").with(JcrLexicon.PRIMARY_TYPE, "rep:nodeTypes").and();
-        batch.execute();
-
-        createNodeType(repository, context, "rep:nodeTypes", false, false);
-        createChildDefinition(repository, context, "rep:nodeTypes", false, "nt:nodeType", false, "ABORT", true, false);
-        createNodeType(repository, context, "mix:versionable", false, true);
-        createPropertyDefinition(repository,
-                                 context,
-                                 "mix:versionable",
-                                 1,
-                                 false,
-                                 false,
-                                 true,
-                                 "jcr:mergeFailed",
-                                 "ABORT",
-                                 true,
-                                 "REFERENCE");
-        createPropertyDefinition(repository,
-                                 context,
-                                 "mix:versionable",
-                                 2,
-                                 false,
-                                 true,
-                                 true,
-                                 "jcr:predecessors",
-                                 "COPY",
-                                 true,
-                                 "REFERENCE");
-        createPropertyDefinition(repository,
-                                 context,
-                                 "mix:versionable",
-                                 3,
-                                 true,
-                                 true,
-                                 false,
-                                 "jcr:isCheckedOut",
-                                 "IGNORE",
-                                 true,
-                                 "BOOLEAN");
-        createPropertyDefinition(repository,
-                                 context,
-                                 "mix:versionable",
-                                 4,
-                                 false,
-                                 true,
-                                 false,
-                                 "jcr:baseVersion",
-                                 "IGNORE",
-                                 true,
-                                 "REFERENCE");
-        createPropertyDefinition(repository,
-                                 context,
-                                 "mix:versionable",
-                                 5,
-                                 false,
-                                 true,
-                                 false,
-                                 "jcr:versionHistory",
-                                 "COPY",
-                                 true,
-                                 "REFERENCE");
-        createNodeType(repository, context, "nt:file", false, false);
-        createProperty(repository, context, "nt:file", "jcr:primaryItemName", "jcr:content");
-        createChildDefinition(repository, context, "nt:file", false, true, "jcr:content", "COPY", false, false);
-        createNodeType(repository, context, "nt:hierarchyNode", false, false);
-        createPropertyDefinition(repository,
-                                 context,
-                                 "nt:hierarchyNode",
-                                 true,
-                                 false,
-                                 false,
-                                 "jcr:created",
-                                 "INITIALIZE",
-                                 true,
-                                 "DATE");
-        createNodeType(repository, context, "nt:versionedChild", false, false);
-        createPropertyDefinition(repository,
-                                 context,
-                                 "nt:versionedChild",
-                                 true,
-                                 true,
-                                 false,
-                                 "jcr:childVersionHistory",
-                                 "ABORT",
-                                 true,
-                                 "REFERENCE");
-        createNodeType(repository, context, "nt:version", false, false);
-        createPropertyDefinition(repository,
-                                 context,
-                                 "nt:version",
-                                 1,
-                                 false,
-                                 false,
-                                 true,
-                                 "jcr:successors",
-                                 "ABORT",
-                                 true,
-                                 "REFERENCE");
-        createPropertyDefinition(repository,
-                                 context,
-                                 "nt:version",
-                                 2,
-                                 false,
-                                 false,
-                                 true,
-                                 "jcr:predecessors",
-                                 "ABORT",
-                                 true,
-                                 "REFERENCE");
-        createPropertyDefinition(repository, context, "nt:version", 3, true, true, false, "jcr:created", "ABORT", true, "DATE");
-        createChildDefinition(repository, context, "nt:version", false, false, "jcr:frozenNode", "ABORT", true, false);
-        /*
-            <nt:versionLabels jcr:primaryType="nt:nodeType" jcr:hasOrderableChildNodes="false" jcr:isMixin="false" jcr:nodeTypeName="nt:versionLabels">
-                <jcr:propertyDefinition jcr:primaryType="nt:propertyDefinition" jcr:autoCreated="false" jcr:mandatory="false" jcr:multiple="false" jcr:onParentVersion="ABORT" jcr:protected="true" jcr:requiredType="REFERENCE"/>
-            <nt:folder jcr:primaryType="nt:nodeType" jcr:hasOrderableChildNodes="false" jcr:isMixin="false" jcr:nodeTypeName="nt:folder">
-                <jcr:childNodeDefinition jcr:primaryType="nt:childNodeDefinition" jcr:autoCreated="false" jcr:mandatory="false" jcr:onParentVersion="VERSION" jcr:protected="false" jcr:sameNameSiblings="false"/>
-        */
-        createNodeType(repository, context, "nt:nodeType", false, false);
-        createPropertyDefinition(repository,
-                                 context,
-                                 "nt:nodeType",
-                                 1,
-                                 false,
-                                 false,
-                                 false,
-                                 "jcr:primaryItemName",
-                                 "COPY",
-                                 false,
-                                 "NAME");
-        createPropertyDefinition(repository,
-                                 context,
-                                 "nt:nodeType",
-                                 2,
-                                 false,
-                                 true,
-                                 false,
-                                 "jcr:hasOrderableChildNodes",
-                                 "COPY",
-                                 false,
-                                 "BOOLEAN");
-        createPropertyDefinition(repository,
-                                 context,
-                                 "nt:nodeType",
-                                 3,
-                                 false,
-                                 true,
-                                 false,
-                                 "jcr:isMixin",
-                                 "COPY",
-                                 false,
-                                 "BOOLEAN");
-        createPropertyDefinition(repository,
-                                 context,
-                                 "nt:nodeType",
-                                 4,
-                                 false,
-                                 false,
-                                 true,
-                                 "jcr:supertypes",
-                                 "COPY",
-                                 false,
-                                 "NAME");
-        createPropertyDefinition(repository,
-                                 context,
-                                 "nt:nodeType",
-                                 5,
-                                 false,
-                                 true,
-                                 false,
-                                 "jcr:nodeTypeName",
-                                 "COPY",
-                                 false,
-                                 "NAME");
-        createChildDefinition(repository,
-                              context,
-                              "nt:nodeType",
-                              1,
-                              false,
-                              "nt:childNodeDefinition",
-                              false,
-                              "jcr:childNodeDefinition",
-                              "VERSION",
-                              false,
-                              true);
-        createChildDefinition(repository,
-                              context,
-                              "nt:nodeType",
-                              2,
-                              false,
-                              "nt:propertyDefinition",
-                              false,
-                              "jcr:propertyDefinition",
-                              "VERSION",
-                              false,
-                              true);
-        createNodeType(repository, context, "nt:propertyDefinition", false, false);
-        createPropertyDefinition(repository,
-                                 context,
-                                 "nt:propertyDefinition",
-                                 1,
-                                 false,
-                                 true,
-                                 false,
-                                 "jcr:multiple",
-                                 "COPY",
-                                 false,
-                                 "BOOLEAN");
-        createPropertyDefinition(repository,
-                                 context,
-                                 "nt:propertyDefinition",
-                                 2,
-                                 false,
-                                 false,
-                                 true,
-                                 "jcr:defaultValues",
-                                 "COPY",
-                                 false,
-                                 "UNDEFINED");
-        createPropertyDefinition(repository,
-                                 context,
-                                 "nt:propertyDefinition",
-                                 3,
-                                 false,
-                                 false,
-                                 true,
-                                 "jcr:valueConstraints",
-                                 "COPY",
-                                 false,
-                                 "STRING");
-        createPropertyDefinition(repository,
-                                 context,
-                                 "nt:propertyDefinition",
-                                 4,
-                                 false,
-                                 true,
-                                 false,
-                                 "jcr:requiredType",
-                                 "COPY",
-                                 false,
-                                 "STRING");
-        createPropertyDefinition(repository,
-                                 context,
-                                 "nt:propertyDefinition",
-                                 5,
-                                 false,
-                                 true,
-                                 false,
-                                 "jcr:protected",
-                                 "COPY",
-                                 false,
-                                 "BOOLEAN");
-        createPropertyDefinition(repository,
-                                 context,
-                                 "nt:propertyDefinition",
-                                 6,
-                                 false,
-                                 true,
-                                 false,
-                                 "jcr:onParentVersion",
-                                 "COPY",
-                                 false,
-                                 "STRING");
-        createPropertyDefinition(repository,
-                                 context,
-                                 "nt:propertyDefinition",
-                                 7,
-                                 false,
-                                 true,
-                                 false,
-                                 "jcr:mandatory",
-                                 "COPY",
-                                 false,
-                                 "BOOLEAN");
-        createPropertyDefinition(repository,
-                                 context,
-                                 "nt:propertyDefinition",
-                                 8,
-                                 false,
-                                 true,
-                                 false,
-                                 "jcr:autoCreated",
-                                 "COPY",
-                                 false,
-                                 "BOOLEAN");
-        createPropertyDefinition(repository,
-                                 context,
-                                 "nt:propertyDefinition",
-                                 9,
-                                 false,
-                                 false,
-                                 false,
-                                 "jcr:name",
-                                 "COPY",
-                                 false,
-                                 "NAME");
-        /*
-            <rep:versionStorage jcr:primaryType="nt:nodeType" jcr:hasOrderableChildNodes="false" jcr:isMixin="false" jcr:nodeTypeName="rep:versionStorage">
-                <jcr:childNodeDefinition jcr:primaryType="nt:childNodeDefinition" jcr:autoCreated="false" jcr:defaultPrimaryType="rep:versionStorage" jcr:mandatory="false" jcr:onParentVersion="ABORT" jcr:protected="true" jcr:sameNameSiblings="true"/>
-                <jcr:childNodeDefinition jcr:primaryType="nt:childNodeDefinition" jcr:autoCreated="false" jcr:defaultPrimaryType="nt:versionHistory" jcr:mandatory="false" jcr:onParentVersion="ABORT" jcr:protected="true" jcr:sameNameSiblings="true"/>
-        */
-        createNodeType(repository, context, "nt:base", false, false);
-        createPropertyDefinition(repository, context, "nt:base", false, false, true, "jcr:mixinTypes", "COMPUTE", true, "NAME");
-        createPropertyDefinition(repository, context, "nt:base", true, true, false, "jcr:primaryType", "COMPUTE", true, "NAME");
-        /*
-            <nt:resource jcr:primaryType="nt:nodeType" jcr:hasOrderableChildNodes="false" jcr:isMixin="false" jcr:nodeTypeName="nt:resource" jcr:primaryItemName="jcr:data">
-                <jcr:propertyDefinition jcr:primaryType="nt:propertyDefinition" jcr:autoCreated="false" jcr:mandatory="true" jcr:multiple="false" jcr:name="jcr:lastModified" jcr:onParentVersion="IGNORE" jcr:protected="false" jcr:requiredType="DATE"/>
-                <jcr:propertyDefinition jcr:primaryType="nt:propertyDefinition" jcr:autoCreated="false" jcr:mandatory="true" jcr:multiple="false" jcr:name="jcr:data" jcr:onParentVersion="COPY" jcr:protected="false" jcr:requiredType="BINARY"/>
-                <jcr:propertyDefinition jcr:primaryType="nt:propertyDefinition" jcr:autoCreated="false" jcr:mandatory="true" jcr:multiple="false" jcr:name="jcr:mimeType" jcr:onParentVersion="COPY" jcr:protected="false" jcr:requiredType="STRING"/>
-                <jcr:propertyDefinition jcr:primaryType="nt:propertyDefinition" jcr:autoCreated="false" jcr:mandatory="false" jcr:multiple="false" jcr:name="jcr:encoding" jcr:onParentVersion="COPY" jcr:protected="false" jcr:requiredType="STRING"/>
-        */
-        createNodeType(repository, context, "nt:childNodeDefinition", false, false);
-        createPropertyDefinition(repository,
-                                 context,
-                                 "nt:childNodeDefinition",
-                                 1,
-                                 false,
-                                 true,
-                                 false,
-                                 "jcr:sameNameSiblings",
-                                 "COPY",
-                                 false,
-                                 "BOOLEAN");
-        createPropertyDefinition(repository,
-                                 context,
-                                 "nt:childNodeDefinition",
-                                 2,
-                                 false,
-                                 false,
-                                 false,
-                                 "jcr:defaultPrimaryType",
-                                 "COPY",
-                                 false,
-                                 "NAME");
-        createPropertyDefinition(repository,
-                                 context,
-                                 "nt:childNodeDefinition",
-                                 3,
-                                 false,
-                                 true,
-                                 true,
-                                 "jcr:requiredPrimaryTypes",
-                                 "COPY",
-                                 false,
-                                 "NAME");
-        createPropertyDefinition(repository,
-                                 context,
-                                 "nt:childNodeDefinition",
-                                 4,
-                                 false,
-                                 true,
-                                 false,
-                                 "jcr:protected",
-                                 "COPY",
-                                 false,
-                                 "BOOLEAN");
-        createPropertyDefinition(repository,
-                                 context,
-                                 "nt:childNodeDefinition",
-                                 5,
-                                 false,
-                                 true,
-                                 false,
-                                 "jcr:onParentVersion",
-                                 "COPY",
-                                 false,
-                                 "STRING");
-        createPropertyDefinition(repository,
-                                 context,
-                                 "nt:childNodeDefinition",
-                                 6,
-                                 false,
-                                 true,
-                                 false,
-                                 "jcr:mandatory",
-                                 "COPY",
-                                 false,
-                                 "BOOLEAN");
-        createPropertyDefinition(repository,
-                                 context,
-                                 "nt:childNodeDefinition",
-                                 7,
-                                 false,
-                                 true,
-                                 false,
-                                 "jcr:autoCreated",
-                                 "COPY",
-                                 false,
-                                 "BOOLEAN");
-        createPropertyDefinition(repository,
-                                 context,
-                                 "nt:childNodeDefinition",
-                                 8,
-                                 false,
-                                 false,
-                                 false,
-                                 "jcr:name",
-                                 "COPY",
-                                 false,
-                                 "NAME");
-        createNodeType(repository, context, "mix:referenceable", false, true);
-        createPropertyDefinition(repository,
-                                 context,
-                                 "mix:referenceable",
-                                 true,
-                                 true,
-                                 false,
-                                 "jcr:uuid",
-                                 "INITIALIZE",
-                                 true,
-                                 "STRING");
-        createNodeType(repository, context, "nt:unstructured", true, false);
-        createPropertyDefinition(repository, context, "nt:unstructured", false, false, false, "COPY", false, "UNDEFINED");
-        createPropertyDefinition(repository, context, "nt:unstructured", false, false, true, "COPY", false, "UNDEFINED");
-        createChildDefinition(repository, context, "nt:unstructured", false, "nt:unstructured", false, "VERSION", false, true);
-        /*
-            <nt:versionHistory jcr:primaryType="nt:nodeType" jcr:hasOrderableChildNodes="false" jcr:isMixin="false" jcr:nodeTypeName="nt:versionHistory">
-                <jcr:propertyDefinition jcr:primaryType="nt:propertyDefinition" jcr:autoCreated="true" jcr:mandatory="true" jcr:multiple="false" jcr:name="jcr:versionableUuid" jcr:onParentVersion="ABORT" jcr:protected="true" jcr:requiredType="STRING"/>
-                <jcr:childNodeDefinition jcr:primaryType="nt:childNodeDefinition" jcr:autoCreated="false" jcr:defaultPrimaryType="nt:version" jcr:mandatory="false" jcr:onParentVersion="ABORT" jcr:protected="true" jcr:sameNameSiblings="false"/>
-                <jcr:childNodeDefinition jcr:primaryType="nt:childNodeDefinition" jcr:autoCreated="true" jcr:defaultPrimaryType="nt:versionLabels" jcr:mandatory="true" jcr:name="jcr:versionLabels" jcr:onParentVersion="ABORT" jcr:protected="true" jcr:sameNameSiblings="false"/>
-                <jcr:childNodeDefinition jcr:primaryType="nt:childNodeDefinition" jcr:autoCreated="true" jcr:defaultPrimaryType="nt:version" jcr:mandatory="true" jcr:name="jcr:rootVersion" jcr:onParentVersion="ABORT" jcr:protected="true" jcr:sameNameSiblings="false"/>
-            <mix:lockable jcr:primaryType="nt:nodeType" jcr:hasOrderableChildNodes="false" jcr:isMixin="true" jcr:nodeTypeName="mix:lockable">
-                <jcr:propertyDefinition jcr:primaryType="nt:propertyDefinition" jcr:autoCreated="false" jcr:mandatory="false" jcr:multiple="false" jcr:name="jcr:lockIsDeep" jcr:onParentVersion="IGNORE" jcr:protected="true" jcr:requiredType="BOOLEAN"/>
-                <jcr:propertyDefinition jcr:primaryType="nt:propertyDefinition" jcr:autoCreated="false" jcr:mandatory="false" jcr:multiple="false" jcr:name="jcr:lockOwner" jcr:onParentVersion="IGNORE" jcr:protected="true" jcr:requiredType="STRING"/>
-            <nt:frozenNode jcr:primaryType="nt:nodeType" jcr:hasOrderableChildNodes="true" jcr:isMixin="false" jcr:nodeTypeName="nt:frozenNode">
-                <jcr:propertyDefinition jcr:primaryType="nt:propertyDefinition" jcr:autoCreated="false" jcr:mandatory="false" jcr:multiple="true" jcr:onParentVersion="ABORT" jcr:protected="true" jcr:requiredType="UNDEFINED"/>
-                <jcr:propertyDefinition jcr:primaryType="nt:propertyDefinition" jcr:autoCreated="false" jcr:mandatory="false" jcr:multiple="false" jcr:onParentVersion="ABORT" jcr:protected="true" jcr:requiredType="UNDEFINED"/>
-                <jcr:propertyDefinition jcr:primaryType="nt:propertyDefinition" jcr:autoCreated="true" jcr:mandatory="true" jcr:multiple="false" jcr:name="jcr:frozenUuid" jcr:onParentVersion="ABORT" jcr:protected="true" jcr:requiredType="STRING"/>
-                <jcr:propertyDefinition jcr:primaryType="nt:propertyDefinition" jcr:autoCreated="false" jcr:mandatory="false" jcr:multiple="true" jcr:name="jcr:frozenMixinTypes" jcr:onParentVersion="ABORT" jcr:protected="true" jcr:requiredType="NAME"/>
-                <jcr:propertyDefinition jcr:primaryType="nt:propertyDefinition" jcr:autoCreated="true" jcr:mandatory="true" jcr:multiple="false" jcr:name="jcr:frozenPrimaryType" jcr:onParentVersion="ABORT" jcr:protected="true" jcr:requiredType="NAME"/>
-                <jcr:childNodeDefinition jcr:primaryType="nt:childNodeDefinition" jcr:autoCreated="false" jcr:mandatory="false" jcr:onParentVersion="ABORT" jcr:protected="true" jcr:sameNameSiblings="true"/>
-            <rep:system jcr:primaryType="nt:nodeType" jcr:hasOrderableChildNodes="true" jcr:isMixin="false" jcr:nodeTypeName="rep:system">
-                <jcr:childNodeDefinition jcr:primaryType="nt:childNodeDefinition" jcr:autoCreated="false" jcr:defaultPrimaryType="nt:unstructured" jcr:mandatory="false" jcr:onParentVersion="IGNORE" jcr:protected="false" jcr:sameNameSiblings="true"/>
-                <jcr:childNodeDefinition jcr:primaryType="nt:childNodeDefinition" jcr:autoCreated="false" jcr:defaultPrimaryType="rep:nodeTypes" jcr:mandatory="true" jcr:name="jcr:nodeTypes" jcr:onParentVersion="ABORT" jcr:protected="true" jcr:sameNameSiblings="false"/>
-                <jcr:childNodeDefinition jcr:primaryType="nt:childNodeDefinition" jcr:autoCreated="false" jcr:defaultPrimaryType="rep:versionStorage" jcr:mandatory="true" jcr:name="jcr:versionStorage" jcr:onParentVersion="ABORT" jcr:protected="true" jcr:sameNameSiblings="false"/>
-        */
-        createNodeType(repository, context, "rep:root", true, false);
-        createChildDefinition(repository, context, "rep:root", false, true, "jcr:system", false, false);
-        /*
-            <nt:query jcr:primaryType="nt:nodeType" jcr:hasOrderableChildNodes="false" jcr:isMixin="false" jcr:nodeTypeName="nt:query">
-                <jcr:propertyDefinition jcr:primaryType="nt:propertyDefinition" jcr:autoCreated="false" jcr:mandatory="false" jcr:multiple="false" jcr:name="jcr:language" jcr:onParentVersion="COPY" jcr:protected="false" jcr:requiredType="STRING"/>
-                <jcr:propertyDefinition jcr:primaryType="nt:propertyDefinition" jcr:autoCreated="false" jcr:mandatory="false" jcr:multiple="false" jcr:name="jcr:statement" jcr:onParentVersion="COPY" jcr:protected="false" jcr:requiredType="STRING"/>
-            </nt:query>
-            <nt:linkedFile jcr:primaryType="nt:nodeType" jcr:hasOrderableChildNodes="false" jcr:isMixin="false" jcr:nodeTypeName="nt:linkedFile" jcr:primaryItemName="jcr:content">
-                <jcr:propertyDefinition jcr:primaryType="nt:propertyDefinition" jcr:autoCreated="false" jcr:mandatory="true" jcr:multiple="false" jcr:name="jcr:content" jcr:onParentVersion="COPY" jcr:protected="false" jcr:requiredType="REFERENCE"/>
-            </nt:linkedFile>
-         */
-
-        return new RepositoryConnectionFactory() {
-
-            public RepositoryConnection createConnection( String sourceName ) {
-                return source.getConnection();
-            }
-        };
-    }
-
-    public static ExecutionContext getExecutionContext() {
-        final ExecutionContext context = new ExecutionContext().create(Mockito.mock(LoginContext.class));
-        NamespaceRegistry registry = context.getNamespaceRegistry();
-        registry.register("dna", "http://www.jboss.org/dna/1.0");
-        registry.register("fn", "http://www.w3.org/2005/xpath-functions");
-        registry.register("fn_old", "http://www.w3.org/2004/10/xpath-functions");
-        registry.register("jcr", "http://www.jcp.org/jcr/1.0");
-        registry.register("mix", "http://www.jcp.org/jcr/mix/1.0");
-        registry.register("nt", "http://www.jcp.org/jcr/nt/1.0");
-        registry.register("rep", "internal");
-        registry.register("sv", "http://www.jcp.org/jcr/sv/1.0");
-        registry.register("xs", "http://www.w3.org/2001/XMLSchema");
-        return context;
-    }
-
-    private static void createChildDefinition( Graph repository,
-                                               ExecutionContext context,
-                                               String node,
-                                               Boolean autoCreated,
-                                               Boolean mandatory,
-                                               String onParentVersion,
-                                               Boolean isProtected,
-                                               Boolean sameNameSiblings ) {
-        createChildDefinition(repository,
-                              context,
-                              node,
-                              0,
-                              autoCreated,
-                              null,
-                              mandatory,
-                              null,
-                              onParentVersion,
-                              isProtected,
-                              sameNameSiblings);
-    }
-
-    private static void createChildDefinition( Graph repository,
-                                               ExecutionContext context,
-                                               String node,
-                                               Boolean autoCreated,
-                                               Boolean mandatory,
-                                               String name,
-                                               String onParentVersion,
-                                               Boolean isProtected,
-                                               Boolean sameNameSiblings ) {
-        createChildDefinition(repository,
-                              context,
-                              node,
-                              0,
-                              autoCreated,
-                              null,
-                              mandatory,
-                              name,
-                              onParentVersion,
-                              isProtected,
-                              sameNameSiblings);
-    }
-
-    private static void createChildDefinition( Graph repository,
-                                               ExecutionContext context,
-                                               String node,
-                                               Boolean autoCreated,
-                                               String defaultPrimaryType,
-                                               Boolean mandatory,
-                                               String onParentVersion,
-                                               Boolean isProtected,
-                                               Boolean sameNameSiblings ) {
-        createChildDefinition(repository,
-                              context,
-                              node,
-                              0,
-                              autoCreated,
-                              defaultPrimaryType,
-                              mandatory,
-                              null,
-                              onParentVersion,
-                              isProtected,
-                              sameNameSiblings);
-    }
-
-    private static void createChildDefinition( Graph repository,
-                                               ExecutionContext context,
-                                               String node,
-                                               int index,
-                                               Boolean autoCreated,
-                                               String defaultPrimaryType,
-                                               Boolean mandatory,
-                                               String name,
-                                               String onParentVersion,
-                                               Boolean isProtected,
-                                               Boolean sameNameSiblings ) {
-        String defNode = "/dna:system/jcr:nodeTypes/" + node + "/jcr:childNodeDefinition";
-        if (index > 0) {
-            defNode += '[' + index + ']';
-        }
-        createProperty(repository, context, defNode, "jcr:primaryType", "nt:childNodeDefinition");
-        createProperty(repository, context, defNode, "jcr:autoCreated", autoCreated.toString());
-        if (defaultPrimaryType != null) {
-            createProperty(repository, context, defNode, "jcr:defaultPrimaryType", defaultPrimaryType);
-        }
-        createProperty(repository, context, defNode, "jcr:mandatory", mandatory.toString());
-        if (name != null) {
-            createProperty(repository, context, defNode, "jcr:name", name);
-        }
-        createProperty(repository, context, defNode, "jcr:onParentVersion", onParentVersion);
-        createProperty(repository, context, defNode, "jcr:protected", isProtected.toString());
-        createProperty(repository, context, defNode, "jcr:sameNameSiblings", sameNameSiblings.toString());
-    }
-
-    //
-    // private static void createChildDefinitionProperty( SimpleRepository repository,
-    // ExecutionContext context,
-    // String node,
-    // String property,
-    // String value ) {
-    // createProperty(repository, context, node + "/jcr:childNodeDefinition", property, value);
-    // }
-
-    private static void createNodeType( Graph repository,
-                                        ExecutionContext context,
-                                        String node,
-                                        Boolean hasOrderableChildNodes,
-                                        Boolean isMixin ) {
-        node = "/dna:system/jcr:nodeTypes/" + node;
-        repository.create(node);
-        createProperty(repository, context, node, "jcr:primaryType", "nt:nodeType");
-        createProperty(repository, context, node, "jcr:hasOrderableChildNodes", hasOrderableChildNodes.toString());
-        createProperty(repository, context, node, "jcr:isMixin", isMixin.toString());
-        createProperty(repository, context, node, "jcr:nodeTypeName", node);
-    }
-
-    private static void createProperty( Graph repository,
-                                        ExecutionContext context,
-                                        String node,
-                                        String property,
-                                        String value ) {
-        repository.set(property).on(node).to(value);
-    }
-
-    private static void createPropertyDefinition( Graph repository,
-                                                  ExecutionContext context,
-                                                  String node,
-                                                  Boolean autoCreated,
-                                                  Boolean mandatory,
-                                                  Boolean multiple,
-                                                  String onParentVersion,
-                                                  Boolean isProtected,
-                                                  String requiredType ) {
-        createPropertyDefinition(repository,
-                                 context,
-                                 node,
-                                 0,
-                                 autoCreated,
-                                 mandatory,
-                                 multiple,
-                                 null,
-                                 onParentVersion,
-                                 isProtected,
-                                 requiredType);
-    }
-
-    private static void createPropertyDefinition( Graph repository,
-                                                  ExecutionContext context,
-                                                  String node,
-                                                  Boolean autoCreated,
-                                                  Boolean mandatory,
-                                                  Boolean multiple,
-                                                  String name,
-                                                  String onParentVersion,
-                                                  Boolean isProtected,
-                                                  String requiredType ) {
-        createPropertyDefinition(repository,
-                                 context,
-                                 node,
-                                 0,
-                                 autoCreated,
-                                 mandatory,
-                                 multiple,
-                                 name,
-                                 onParentVersion,
-                                 isProtected,
-                                 requiredType);
-    }
-
-    private static void createPropertyDefinition( Graph repository,
-                                                  ExecutionContext context,
-                                                  String node,
-                                                  int index,
-                                                  Boolean autoCreated,
-                                                  Boolean mandatory,
-                                                  Boolean multiple,
-                                                  String name,
-                                                  String onParentVersion,
-                                                  Boolean isProtected,
-                                                  String requiredType ) {
-        String defNode = "/dna:system/jcr:nodeTypes/" + node + "/nt:propertyDefinition";
-        if (index > 0) {
-            defNode += '[' + index + ']';
-        }
-        repository.create(defNode);
-        createProperty(repository, context, defNode, "jcr:primaryType", "nt:propertyDefinition");
-        createProperty(repository, context, defNode, "jcr:autoCreated", autoCreated.toString());
-        createProperty(repository, context, defNode, "jcr:mandatory", mandatory.toString());
-        createProperty(repository, context, defNode, "jcr:multiple", multiple.toString());
-        if (name != null) {
-            createProperty(repository, context, defNode, "jcr:name", name);
-        }
-        createProperty(repository, context, defNode, "jcr:onParentVersion", onParentVersion);
-        createProperty(repository, context, defNode, "jcr:protected", isProtected.toString());
-        createProperty(repository, context, defNode, "jcr:requiredType", requiredType);
-    }
-}

Modified: trunk/dna-repository/src/test/resources/log4j.properties
===================================================================
--- trunk/dna-repository/src/test/resources/log4j.properties	2009-06-04 22:31:30 UTC (rev 977)
+++ trunk/dna-repository/src/test/resources/log4j.properties	2009-06-04 23:36:27 UTC (rev 978)
@@ -13,7 +13,3 @@
 #log4j.logger.org.jboss.dna.repository.federation=DEBUG
 #log4j.logger.org.jboss.dna.spi=DEBUG
 
-# Jackrabbit logging
-log4j.logger.org.apache.jackrabbit=WARN, stdout
-log4j.logger.org.apache.derby=INFO, stdout
-

Modified: trunk/docs/examples/gettingstarted/repositories/src/test/resources/log4j.properties
===================================================================
--- trunk/docs/examples/gettingstarted/repositories/src/test/resources/log4j.properties	2009-06-04 22:31:30 UTC (rev 977)
+++ trunk/docs/examples/gettingstarted/repositories/src/test/resources/log4j.properties	2009-06-04 23:36:27 UTC (rev 978)
@@ -17,6 +17,3 @@
 #log4j.logger.org.jboss.dna.spi=DEBUG
 #log4j.logger.org.jboss.example.dna=TRACE
 
-# Jackrabbit logging
-log4j.logger.org.apache.jackrabbit=WARN, stdout
-

Modified: trunk/docs/examples/gettingstarted/sequencers/src/main/assembly/basic.xml
===================================================================
--- trunk/docs/examples/gettingstarted/sequencers/src/main/assembly/basic.xml	2009-06-04 22:31:30 UTC (rev 977)
+++ trunk/docs/examples/gettingstarted/sequencers/src/main/assembly/basic.xml	2009-06-04 23:36:27 UTC (rev 978)
@@ -21,6 +21,8 @@
         <include>*.jpg</include>
         <include>*.pict</include>
         <include>*.mp3</include>
+        <include>*.cnd</include>
+        <include>*.xml</include>
       </includes>
     </fileSet>
     <fileSet>
@@ -39,14 +41,6 @@
       <fileMode>0744</fileMode>
     </file>
     <file>
-      <source>src/main/resources/jackrabbitConfig.xml</source>
-      <fileMode>0644</fileMode>
-    </file>
-    <file>
-      <source>src/main/resources/jackrabbitNodeTypes.cnd</source>
-      <fileMode>0644</fileMode>
-    </file>
-    <file>
       <source>src/main/resources/log4j.properties</source>
       <fileMode>0644</fileMode>
     </file>

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	2009-06-04 22:31:30 UTC (rev 977)
+++ trunk/docs/examples/gettingstarted/sequencers/src/main/java/org/jboss/example/dna/sequencer/SequencingClient.java	2009-06-04 23:36:27 UTC (rev 978)
@@ -137,7 +137,7 @@
     }
 
     /**
-     * Start up the JCR repository. This method only operates using the JCR API and Jackrabbit-specific API.
+     * Start up the JCR repository, using an implementation-specific API.
      * 
      * @throws Exception
      */

Modified: trunk/docs/examples/gettingstarted/sequencers/src/test/resources/log4j.properties
===================================================================
--- trunk/docs/examples/gettingstarted/sequencers/src/test/resources/log4j.properties	2009-06-04 22:31:30 UTC (rev 977)
+++ trunk/docs/examples/gettingstarted/sequencers/src/test/resources/log4j.properties	2009-06-04 23:36:27 UTC (rev 978)
@@ -9,6 +9,3 @@
 
 # Set up the default logging to be INFO level, then override specific units
 log4j.logger.org.jboss.dna=WARNING
-
-# Jackrabbit logging
-log4j.logger.org.apache.jackrabbit=WARN, stdout

Modified: trunk/docs/reference/src/main/docbook/en-US/content/introduction.xml
===================================================================
--- trunk/docs/reference/src/main/docbook/en-US/content/introduction.xml	2009-06-04 22:31:30 UTC (rev 977)
+++ trunk/docs/reference/src/main/docbook/en-US/content/introduction.xml	2009-06-04 23:36:27 UTC (rev 978)
@@ -306,7 +306,7 @@
         <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
+            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>

Modified: trunk/extensions/dna-connector-federation/src/test/resources/log4j.properties
===================================================================
--- trunk/extensions/dna-connector-federation/src/test/resources/log4j.properties	2009-06-04 22:31:30 UTC (rev 977)
+++ trunk/extensions/dna-connector-federation/src/test/resources/log4j.properties	2009-06-04 23:36:27 UTC (rev 978)
@@ -10,8 +10,3 @@
 # Set up the default logging to be INFO level, then override specific units
 log4j.logger.org.jboss.dna=INFO
 log4j.logger.org.jboss.dna.connector.federation=TRACE
-
-# Jackrabbit logging
-log4j.logger.org.apache.jackrabbit=WARN, stdout
-log4j.logger.org.apache.derby=INFO, stdout
-

Modified: trunk/extensions/dna-mimetype-detector-aperture/pom.xml
===================================================================
--- trunk/extensions/dna-mimetype-detector-aperture/pom.xml	2009-06-04 22:31:30 UTC (rev 977)
+++ trunk/extensions/dna-mimetype-detector-aperture/pom.xml	2009-06-04 23:36:27 UTC (rev 978)
@@ -236,9 +236,6 @@
 	  <groupId>net.jcip</groupId>
 	  <artifactId>jcip-annotations</artifactId>
 	</dependency>
-    <!-- 
-      Java Content Repository API and Apache Jackrabbit for the JCR unit test infrastructure
-    -->
   </dependencies>
   <reporting>
     <plugins>

Modified: trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/master.xml
===================================================================
--- trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/master.xml	2009-06-04 22:31:30 UTC (rev 977)
+++ trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/master.xml	2009-06-04 23:36:27 UTC (rev 978)
@@ -675,1218 +675,4 @@
       </sect2>
     </sect1>
   </chapter>
-  <!--  ====================================================================================================
-                                                   Chapter 
-        ====================================================================================================   -->
-  <chapter id="downloading_and_running">
-    <title>Running the example application</title>
-    <para>
-      This chapter provides instructions for downloading and running a sample application that demonstrates how JBoss DNA works
-      with a JCR repository to automatically sequence changing content to extract useful information. So read on to get the simple
-      application running, and then in the
-      <link linkend="using_dna">next chapter</link>
-      we'll dive into the source code for the example and show how to use JBoss DNA in your own applications.
-    </para>
-    <para>JBoss DNA uses Maven 2 for its build system, as is 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>
-    <note>
-      <para>
-        To use Maven with JBoss DNA, you'll need to have
-        <ulink url="http://java.sun.com/javase/downloads/index_jdk5.jsp">JDK 5 or 6</ulink>
-        and Maven 2.0.7 (or higher).
-      </para>
-      <para>
-        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.7-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:
-        <programlisting role="XML" language="xml">&lt;settings&gt;
-  &lt;profiles&gt;
-    &lt;profile&gt;
-      &lt;id&gt;jboss.repository&lt;/id&gt;
-      &lt;activation&gt;
-        &lt;property&gt;          
-          &lt;name&gt;!jboss.repository.off&lt;/name&gt;
-        &lt;/property&gt;
-      &lt;/activation&gt;
-      &lt;repositories&gt;
-        &lt;repository&gt;
-          &lt;id&gt;snapshots.jboss.org&lt;/id&gt;
-          &lt;url&gt;http://snapshots.jboss.org/maven2&lt;/url&gt;
-          &lt;snapshots&gt;
-            &lt;enabled&gt;true&lt;/enabled&gt;
-          &lt;/snapshots&gt;
-        &lt;/repository&gt;
-        &lt;repository&gt;
-          &lt;id&gt;repository.jboss.org&lt;/id&gt;
-          &lt;url&gt;http://repository.jboss.org/maven2&lt;/url&gt;
-          &lt;snapshots&gt;
-            &lt;enabled&gt;false&lt;/enabled&gt;
-          &lt;/snapshots&gt;
-        &lt;/repository&gt;
-      &lt;/repositories&gt;
-      &lt;pluginRepositories&gt;
-        &lt;pluginRepository&gt;
-          &lt;id&gt;repository.jboss.org&lt;/id&gt;
-          &lt;url&gt;http://repository.jboss.org/maven2&lt;/url&gt;
-          &lt;snapshots&gt;
-            &lt;enabled&gt;false&lt;/enabled&gt;
-          &lt;/snapshots&gt;
-        &lt;/pluginRepository&gt;
-        &lt;pluginRepository&gt;
-          &lt;id&gt;snapshots.jboss.org&lt;/id&gt;
-          &lt;url&gt;http://snapshots.jboss.org/maven2&lt;/url&gt;
-          &lt;snapshots&gt;
-            &lt;enabled&gt;true&lt;/enabled&gt;
-          &lt;/snapshots&gt;
-        &lt;/pluginRepository&gt;
-      &lt;/pluginRepositories&gt;
-    &lt;/profile&gt;
-  &lt;/profiles&gt;
-&lt;/settings&gt;</programlisting>
-        This profile informs Maven of the two JBoss repositories (snapshots and releases) that contain 
-        all of the JARs for JBoss DNA and all dependent libraries.</para>
-      </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.1/jboss-dna-0.1-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:
-  <programlisting>
-examples/pom.xml
-         sequencers/pom.xml
-                   /src/main/assembly
-                            /config
-                            /java
-                            /resources
-                       /test/java
-                            /resources
-  </programlisting>
-      </para>
-      <para>There are essentially two Maven projects: a <code>sequencers</code> project and a parent project.  All of the source
-      for the example is located in the <code>sequencers</code> subdirectory.  And you may have noticed that none
-      of the JBoss DNA libraries are there.  This is where Maven comes in.  The two <code>pom.xml</code> files tell
-      Maven everything it needs to know about what libraries are required and how to build the example.</para>
-      <para>In a terminal, go to the <code>examples</code> directory and run <emphasis role="strong"><code>mvn install</code></emphasis>.  
-      This command downloads all of the JARs necessary to compile and build the example, including the JBoss DNA libraries,
-      the libraries they depend on, and any missing Maven components.  (These are downloaded from the JBoss repositories
-      only once and saved on your machine.  This means that the next time you run Maven, all the libraries will
-      already be available locally, and the build will run much faster.)  The command then continues by compiling the example's source
-      code (and unit tests) and running the unit tests.  The build is successful if you see the following:
-           <programlisting language="bash">$ mvn install
-...
-[INFO] ------------------------------------------------------------------------
-[INFO] Reactor Summary:
-[INFO] ------------------------------------------------------------------------
-[INFO] Getting Started examples .............................. SUCCESS [2.106s]
-[INFO] Sequencer Examples .................................... SUCCESS [9.768s]
-[INFO] ------------------------------------------------------------------------
-[INFO] ------------------------------------------------------------------------
-[INFO] BUILD SUCCESSFUL
-[INFO] ------------------------------------------------------------------------
-[INFO] Total time: 12 seconds
-[INFO] Finished at: Wed May 07 12:00:06 CDT 2008
-[INFO] Final Memory: 14M/28M
-[INFO] ------------------------------------------------------------------------
-$ </programlisting>
-      If there are errors, check whether you have the correct version of Maven installed and that you've correctly updated
-           your Maven settings as described above.</para>
-    <para>If you've successfully built the examples, there will be a <code>examples/sequencers/target/dna-example-sequencers-basic.dir/</code>
-    directory that contains the following:
-    <itemizedlist>
-  	<listitem>
-  	  <para><emphasis role="strong"><code>run.sh</code></emphasis> is the *nix shell script that will run the example.</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>jackrabbitConfig.xml</code>
-        </emphasis>
-        is the Jackrabbit configuration file, which is set up to use a transient in-memory repository.
-      </para>
-    </listitem>
-    <listitem>
-      <para>
-        <emphasis role="strong">
-          <code>jackrabbitNodeTypes.cnd</code>
-        </emphasis>
-        defines the additional JCR node types used by this example.
-      </para>
-    </listitem>
-    <listitem>
-      <para>
-        <emphasis role="strong">
-          <code>sample1.mp3</code>
-        </emphasis>
-        is a sample MP3 audio file you'll use later to upload into the repository.
-      </para>
-    </listitem>
-    <listitem>
-      <para>
-        <emphasis role="strong">
-          <code>caution.gif</code>
-        </emphasis>, <emphasis role="strong">
-          <code>caution.png</code>
-        </emphasis>, and <emphasis role="strong">
-          <code>caution.jpg</code>
-        </emphasis>
-        are images that you'll use later and upload into the repository.
-      </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 example.
-      </para>
-    </listitem>
-    </itemizedlist>
-    <note>
-      <para>JBoss DNA 0.1 and the examples are currently tested with <ulink url="http://jackrabbit.apache.org/">Apache Jackrabbit</ulink> version 1.3.3.  
-      This version is stable and used by a number of other projects and applications.  However, you should be able to use a newer
-      version of Jackrabbit, as long as that version uses the same JCR API.  For example, version 1.4.2 was released on March 26, 2008 and
-      should be compatible.
-      </para>
-      <para>Just remember, if the version of Jackrabbit you want to use for these examples is not in the Maven repository,
-      you'll have to either add it or add it locally.  For more information, see the <ulink url="http://maven.apache.org/">Maven documentation</ulink>.
-      </para>
-    </note>
-    </para>
-  </sect1>
-  <sect1 id="running">
-    <title>Running the example</title>
-    <para>This 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>
-    <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">
-        <title>Example Client</title>
-        <graphic align="center" scale="100" fileref="images/example-sequencer-cli-client.png" />
-      </figure>
-      From this menu, you can upload a file into the repository, search for media in the repository, print sequencing statistics,
-      or quit the application.
-    </para>
-    <para>
-      The first step is to upload one of the example images. If you type 'u' and press return, you'll be prompted to supply the
-      path to the file you want to upload. Since the application is running from within the
-      <code>examples/sequencers/target/dna-example-sequencers-basic.dir/
-      </code>
-      directory, you can specify any of the files in that directory without specifying the path:
-      <figure id="example-sequencer-upload">
-        <title>Uploading an image using the Example Client</title>
-        <graphic align="center" scale="100" fileref="images/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 and MP3 audio files and 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>
-      . Files with other extensions in the repository path will be ignored. For your convenience, the example provides several
-      files that will be sequenced (
-      <code>caution.png</code>
-      ,
-      <code>caution.jpg</code>
-      ,
-      <code>caution.gif</code>
-      , and
-      <code>sample1.mp3</code>
-      ) and one image that will not be sequenced (
-      <code>caution.pict</code>
-      ). Feel free to try other files.
-    </para>
-    <para>
-      After you have specified the file you want to upload, the example application asks you where in the repository you'd like to
-      place the file. (If you want to use the suggested location, just press
-      <code>return</code>
-      .) The client application uses the JCR API to upload the file to that location in the repository, creating any nodes (of
-      type
-      <code>nt:folder</code>
-      ) for any directories that don't exist, and creating a node (of type
-      <code>nt:file</code>
-      ) for the file. And, per the JCR specification, the application creates a
-      <code>jcr:content</code>
-      node (of type
-      <code>nt:resource</code>
-      ) under the file node. The file contents are placed on this
-      <code>jcr:content</code>
-      node in the
-      <code>jcr:data</code>
-      property. For example, if you specify
-      <code>/a/b/caution.png</code>
-      , the following structure will be created in the repository:<programlisting>
-    /a   (nt:folder)
-      /b   (nt:folder)
-        /caution.png   (nt:file)
-                    /jcr:content    (nt:resource)
-                                @jcr:data = {contents of the file}
-                                @jcr:mimeType = {mime type of the file}
-                                @jcr:lastModified = {now}
-    </programlisting>
-    Other kinds of files are treated in a similar way.
-    </para>
-  <para>
-    When the client uploads the file using the JCR API, DNA gets notified of the changes, consults the sequencers to see whether
-    any of them are interested in the new or updated content, and if so runs those sequencers. The image sequencer processes image
-    files for metadata, and any metadata found is stored under the
-    <code>/images</code>
-    branch of the repository. The MP3 sequencer processes MP3 audio files for metadata, and any metadata found is stored under the
-    <code>/mp3s</code>
-    branch of the repository.  All of this happens asynchronously, so any DNA activity doesn't impede or slow down the client
-    activities.
-  </para>
-  <para>
-    So, after the file is uploaded, you can search the repository for the image metadata using the "s" menu option:
-    <figure id="example-sequencer-search">
-      <title>Searching for media using the Example Client</title>
-      <graphic align="center" scale="100" fileref="images/example-sequencer-search.png" />
-    </figure>
-    Here are the search results after the <code>sample1.mp3</code> audio file has been uploaded (to the <code>/a/b/sample1.mp3</code> location):
-    <figure id="example-sequencer-search-with-mp3">
-      <title>Searching for media using the Example Client</title>
-      <graphic align="center" scale="100" fileref="images/example-sequencer-search-with-mp3.png" />
-    </figure>
-    You can also display the sequencing statistics using the "d" menu option:
-    <figure id="example-sequencer-statistics">
-      <title>Sequencing statistics using the Example Client</title>
-      <graphic align="center" scale="100" fileref="images/example-sequencer-statistics.png" />
-    </figure>
-    These stats show how many nodes were sequenced, and how many nodes were skipped because they didn't apply to the sequencer's
-    criteria.
-  </para>
-  <note>
-    <para>
-      There will probably be more nodes skipped than sequenced, since there are more
-      <code>nt:folder</code>
-      and
-      <code>nt:resource</code>
-      nodes than there are
-      <code>nt:file</code>
-      nodes with acceptable names.
-    </para>
-  </note>
-  <para>You can repeat this process with other files. Any file that isn't an image or MP3 files (as recognized by the sequencing configurations
-    that we'll describe later) will not be sequenced.</para>
-  </sect1>
-  <sect1 id="downloading_and_running_review">
-    <title>Summarizing what we just did</title>
-    <para>In this chapter you downloaded and installed the example application and used it to upload files into a
-    JCR repository.  JBoss DNA automatically sequenced the image and/or MP3 files you uploaded, extracted the metadata from the
-    files, and stored that metadata inside the repository.  The application allowed you to see this metadata
-    and the sequencing statistics.</para>
-    <para>This application was very simplistic.  In fact, running through the example probably only took you a minute or two.
-    So while this application won't win any awards, it does show the basics of what JBoss DNA can do.</para>
-    <para>In the <link linkend="using_dna">next chapter</link> we'll venture into the code to get an understanding
-    of how JBoss DNA actually works and how you can use it in your own applications.</para>
-  </sect1>
-  </chapter>
-  
-  <!--  ====================================================================================================
-                                                   Chapter 
-        ====================================================================================================   -->
-<chapter id="using_dna">
-  <title>Using JBoss DNA</title>
-  <para>As we've mentioned before, JBoss DNA is able to work with existing JCR repositories.  Your client applications
-  make changes to the information in those repositories, and JBoss DNA automatically uses its sequencers to extract
-  additional information from the uploaded files.</para>
-  <note>
-    <para>Configuring JBoss DNA sequencers is a bit more manual than is ideal. As you'll see, JBoss DNA uses dependency
-      injection to allow a great deal of flexibility in how it can be configured and customized. However, the next release will
-      provide a much easier mechanism for configuring not only the sequencer service but also the upcoming federation engine and
-      JCR implementation.</para>
-  </note>
-  <sect1 id="sequencing_service">
-    <title>Configuring the Sequencing Service</title>
-    <para>
-      The JBoss DNA <emphasis>sequencing service</emphasis> is the component that manages the <emphasis>sequencers</emphasis>
-      , reacting to changes in JCR repositories and then running the appropriate sequencers.
-      This involves processing the changes on a node, determining which (if any) sequencers should be run on that node,
-      and for each sequencer constructing the execution environment, calling the sequencer, and saving the information
-      generated by the sequencer.</para>
-    <para>To set up the sequencing service, an instance is created, and dependent components are injected into
-      the object.  This includes among other things:
-      <itemizedlist>
-        <listitem>
-          <para>An <emphasis>execution context</emphasis> that defines the context in which the service runs, including
-        a factory for JCR sessions given names of the repository and workspace.  This factory must be configured,
-        and is how JBoss DNA knows about your JCR repositories and how to connect to them.  More on this a bit later.</para>
-        </listitem>
-        <listitem>
-          <para>An optional <emphasis>factory for class loaders</emphasis> used to load sequencers.  If no factory is supplied,
-        the service uses the current thread's context class loader (or if that is null, the class loader that loaded the
-        sequencing service class).</para>
-        </listitem>
-        <listitem>
-          <para>An <code>java.util.concurrent.ExecutorService</code> used to execute the sequencing activites.  If none
-        is supplied, a new single-threaded executor is created by calling <code>Executors.newSingleThreadExecutor()</code>.
-        (This can easily be changed by subclassing and overriding the <code>SequencerService.createDefaultExecutorService()</code> method.)</para>
-        </listitem>
-        <listitem>
-          <para>Filters for sequencers and events.  By default, all sequencers are considered for "node added", "property added"
-        and "property changed" events.</para>
-        </listitem>
-      </itemizedlist>
-      </para>
-      <para>As mentioned above, the <code>ExecutionContext</code> provides access to a <code>SessionFactory</code> that is used
-      by JBoss DNA to establish sessions to your JCR repositories.  Two implementations are available:
-      <itemizedlist>
-        <listitem>
-          <para>The <code>JndiSessionFactory</code> looks up JCR <code>Repository</code> instances in JNDI using
-          names that are supplied when creating sessions.  This implementation also has methods to set the
-          JCR <code>Credentials</code> for a given workspace name.</para>
-        </listitem>
-        <listitem>
-          <para>The <code>SimpleSessionFactory</code> has methods to register the JCR <code>Repository</code> instances
-          with names, as well as methods to set the JCR <code>Credentials</code> for a given workspace name.</para>
-        </listitem>
-      </itemizedlist>
-      You can use the <code>SimpleExecutionContext</code> implementation of <code>ExecutionContext</code> and supply
-      a <code>SessionFactory</code> instance, or you can provide your own implementation.
-      </para>
-      <para>Here's an example of how to instantiate and configure the SequencingService:
-      <programlisting>
-SimpleSessionFactory sessionFactory = new SimpleSessionFactory();
-sessionFactory.registerRepository("Main Repository", this.repository);
-Credentials credentials = new SimpleCredentials("jsmith", "secret".toCharArray());
-sessionFactory.registerCredentials("Main Repository/Workspace1", credentials);
-ExecutionContext executionContext = new SimpleExecutionContext(sessionFactory);
-
-// Create the sequencing service, passing in the execution context ...
-SequencingService sequencingService = new SequencingService();
-sequencingService.setExecutionContext(executionContext);</programlisting>
-      </para>
-      <para>After the sequencing service is created and configured, it must be started.  The SequencingService
-      has an <emphasis>administration object</emphasis> (that is an instance of <code>ServiceAdministrator</code>)
-      with <code>start()</code>, <code>pause()</code>, and <code>shutdown()</code> methods.  The latter method will 
-      close the queue for sequencing, but will allow sequencing operations already running to complete normally.
-      To wait until all sequencing operations have completed, simply call the <code>awaitTermination</code> method
-      and pass it the maximum amount of time you want to wait.</para>
-      <para>
-      <programlisting>
-sequencingService.getAdministrator().start();</programlisting>
-      </para>
-      <para>The sequencing service must also be configured with the sequencers that it will use.  This is done using the
-      <code>addSequencer(SequencerConfig)</code> method and passing a <code>SequencerConfig</code> instance that
-      you create.  Here's an example:
-      <programlisting>
-String name = "Image Sequencer";
-String desc = "Sequences image files to extract the characteristics of the image";
-String classname = "org.jboss.dna.sequencer.images.ImageMetadataSequencer";
-String[] classpath = null; // Use the current classpath
-String[] pathExpressions = {"//(*.(jpg|jpeg|gif|bmp|pcx|png))[*]/jcr:content[@jcr:data] => /images/$1"};
-SequencerConfig imageSequencerConfig = new SequencerConfig(name, desc, classname, classpath, pathExpressions);
-sequencingService.addSequencer(imageSequencerConfig);
-
-name = "Mp3 Sequencer";
-desc = "Sequences mp3 files to extract the id3 tags of the audio file";
-classname = "org.jboss.dna.sequencer.mp3.Mp3MetadataSequencer";
-String[] mp3PathExpressions = {"//(*.mp3)[*]/jcr:content[@jcr:data] => /mp3s/$1"};
-SequencerConfig mp3SequencerConfig = new SequencerConfig(name, desc, classname, classpath, mp3PathExpressions);
-sequencingService.addSequencer(mp3SequencerConfig);</programlisting>
-      This is pretty self-explanatory, except for the <code>classpath</code> and <code>pathExpression</code> parameters.
-      The classpath parameter defines the classpath that is passed to the class loader factory mentioned above.
-      Our sequencer is on the classpath, so we can simply use <code>null</code> here.
-      </para>
-      <para>The path expression is more complicated.  Sequencer path expressions are used by the sequencing service to
-      determine whether a particular changed node should be sequenced.  The expressions consist of two parts: a selection
-      criteria and an output expression.  Here's a simple example:
-      <programlisting>
-/a/b/c at title =&gt; /d/e/f</programlisting>
-      Here, the <code>/a/b/c at title</code> is the selection criteria that applies when the <code>/a/b/c</code> node has a <code>title</code> property
-      that is added or changed.  When the selection criteria matches a change event, the sequencer will be run
-      and any generated output will be inserted into the repository described by the output expression.  In this example,
-      the generated output would be placed at the <code>/d/e/f</code> node.
-      </para>
-      <note>
-        <para>Sequencer path expressions can be fairly complex and may use wildcards, specificy same-name sibling indexes,
-        provide optional and choice elements, and may capture parts of the selection criteria for use in the output expression.
-        The path expression used in the image sequencer configuration example above shows a more complex example:
-        <programlisting>
-//(*.(jpg|jpeg|gif|bmp|pcx|png))[*]/jcr:content[@jcr:data] => /images/$1</programlisting>
-        This uses "//" to select any node at any level in the repository whose name ends with "." and one of the extensions (e.g., ".jpg", ".jpeg", etc.)
-        and that has a child node named "jcr:content" that has a "jcr:data" property.  It also selects the file name
-        as the first capture group (the first set of parentheses) for use in the output expression.
-        In this example, any sequencer output is placed on a node with that same file name under the "/images" node.
-        </para>
-        <para></para>
-        <para>Other things are possible, too.  For example, the name of the repository/workspace (as used by the <code>SessionFactory</code>)
-        may be specified at the beginning of the select criteria and/or the output expression.  This means it's possible to place
-        the sequencer output in a different repository than the node being sequenced.</para>
-        <para>For more detail about sequencer path expressions, see the <code>org.jboss.dna.repository.sequencer.SequencerPathExpression</code>
-        class and the corresponding <code>org.jboss.dna.repository.sequencer.SequencerPathExpressionTest</code> test case.</para>
-      </note>
-      <para>After the service is started, it is ready to start reacting to changes in the repository.  But it first
-      must be wired to the repositories using a listener.  This is accomplished using the <code>ObservationService</code>
-      described in the <link linkend="observation_service">next section</link>.</para>
-  </sect1>
-  <sect1 id="observation_service">
-    <title>Configuring the Observation Service</title>
-    <para>The JBoss DNA <code>ObservationService</code> is responsible for listening to one or more JCR repositories
-    and multiplexing the events to its listeners.  Unlike JCR events, this framework embeds in the events the
-    name of the repository and workspace that can be passed to a <code>SessionFactory</code> to obtain a session
-    to the repository in which the change occurred.  This simple design makes it very easy for JBoss DNA to
-    concurrently work with multiple JCR repositories.</para>
-    <para>Configuring an observation service is pretty easy, especially if you reuse the same <code>SessionFactory</code>
-    supplied to the sequencing service.  Here's an example:
-    <programlisting>
-this.observationService = new ObservationService(sessionFactory);
-this.observationService.getAdministrator().start();</programlisting>
-    </para> 
-    <note>
-    <para>Both <code>ObservationService</code> and <code>SequencingService</code> implement
-    <code>AdministeredService</code>, which has a <code>ServiceAdministrator</code> used to start, pause, and shutdown the
-    service.  In other words, the lifecycle of the services are managed in the same way.</para>
-    </note>
-    <para>
-    After the observation service is started, listeners can be added.  The <code>SequencingService</code> implements the required
-    interface, and so it may be registered directly:
-    <programlisting>
-observationService.addListener(sequencingService);</programlisting>
-    </para>
-    <para>Finally, the observation service must be wired to monitor one of your JCR repositories.  This is done with
-    one of the <code>monitor(...)</code> methods:
-    <programlisting>
-int eventTypes = Event.NODE_ADDED | Event.PROPERTY_ADDED | Event.PROPERTY_CHANGED;
-observationService.monitor("Main Repository/Workspace1", eventTypes);</programlisting>
-    </para>
-    <para>At this point, the observation service is listening to a JCR repository and forwarding the appropriate events
-    to the sequencing service, which will asynchronously process the changes and sequence the information added to or changed in the repository.
-    </para>
-  </sect1>
-  <sect1 id="shutting_down">
-    <title>Shutting down JBoss DNA services</title>
-    <para>The JBoss DNA services are utilizing resources and threads that must be released before your application is ready to shut down.
-    The safe way to do this is to simply obtain the <code>ServiceAdministrator</code> for each service (via the <code>getServiceAdministrator()</code> method)
-    and call <code>shutdown()</code>.  As previously mentioned, the shutdown method will simply prevent new work from being processed
-    and will not wait for existing work to be completed.  If you want to wait until the service completes all its work, you must wait
-    until the service terminates.  Here's an example that shows how this is done:
-    <programlisting>
-// Shut down the service and wait until it's all shut down ...
-sequencingService.getAdministrator().shutdown();
-sequencingService.getAdministrator().awaitTermination(5, TimeUnit.SECONDS);
-
-// Shut down the observation service ...
-observationService.getAdministrator().shutdown();
-observationService.getAdministrator().awaitTermination(5, TimeUnit.SECONDS);</programlisting>
-    </para>
-    <para>At this point, we've covered how to configure and use the JBoss DNA services in your application.
-    The next chapter goes back to the <link linkend="downloading_and_running">sample application</link> to show how all these pieces fit together.</para>
-  </sect1>
-  <sect1 id="example_application_review">
-    <title>Reviewing the example application</title>
-    <para>Recall that the example application 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 an image sequencer 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.  Or, if the client uploads
-      MP3 audio files, the title, author, album, year, and comment are extracted from the audio file and stored in the repository.</para>
-    <para>
-      The example is comprised of 3 classes and 1 interface, located in the
-      <code>src/main/java</code>
-      directory:
-      <programlisting>
-  org/jboss/example/dna/sequencers/ConsoleInput.java
-                                  /MediaInfo.java
-                                  /SequencingClient.java
-                                  /UserInterface.java</programlisting>
-    </para>
-    <para>
-      <code>SequencingClient</code>
-      is the class that contains the main application.
-      <code>MediaInfo</code>
-      is a simple Java object that encapsulates metadata about a media file (as generated by the sequencer), and used by the client to
-      pass information to the
-      <code>UserInterface</code>
-      , which 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
-      <code>UserInterface</code>
-      at a later date. 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 automatically using conventional JUnit test cases, as demonstrated by the
-      code in the
-      <code>src/test/java</code>
-      directory:
-      <programlisting>
-  org/jboss/example/dna/sequencers/SequencingClientTest.java
-                                  /MockUserInterface.java</programlisting>
-    </para>
-    <para>
-      If we look at the
-      <code>SequencingClient</code>
-      code, there are a handful of methods that encapsulate the various activities.
-    </para>
-    <note>
-      <para>To keep the code shown in this book as readable as possible, some of the comments and error handling
-      have been removed.</para>
-    </note>
-    <para>
-      The
-      <code>startRepository()</code>
-      method starts up an in-memory Jackrabbit JCR repository. The bulk of this method is simply gathering and passing the
-      information required by Jackrabbit. Because Jackrabbit's
-      <code>TransientRepository</code>
-      implementation shuts down after the last session is closed, the application maintains a session to ensure that the
-      repository remains open throughout the application's lifetime. And finally, the node type needed by the image sequencer is
-      registered with Jackrabbit.
-    </para>
-    <programlisting>
-public void startRepository() throws Exception {
-    if (this.repository == null) {
-        try {
-
-            // Load the Jackrabbit configuration ...
-            File configFile = new File(this.jackrabbitConfigPath);
-            String pathToConfig = configFile.getAbsolutePath();
-
-            // Find the directory where the Jackrabbit repository data will be stored ...
-            File workingDirectory = new File(this.workingDirectory);
-            String workingDirectoryPath = workingDirectory.getAbsolutePath();
-
-            // Get the Jackrabbit custom node definition (CND) file ...
-            URL cndFile = Thread.currentThread().getContextClassLoader().getResource("jackrabbitNodeTypes.cnd");
-
-            // Create the Jackrabbit repository instance and establish a session to keep the repository alive ...
-            this.repository = new TransientRepository(pathToConfig, workingDirectoryPath);
-            if (this.username != null) {
-                Credentials credentials = new SimpleCredentials(this.username, this.password);
-                this.keepAliveSession = this.repository.login(credentials, this.workspaceName);
-            } else {
-                this.keepAliveSession = this.repository.login();
-            }
-
-            try {
-                // Register the node types (only valid the first time) ...
-                JackrabbitNodeTypeManager mgr = (JackrabbitNodeTypeManager)this.keepAliveSession.getWorkspace().getNodeTypeManager();
-                mgr.registerNodeTypes(cndFile.openStream(), JackrabbitNodeTypeManager.TEXT_X_JCR_CND);
-            } catch (RepositoryException e) {
-                if (!e.getMessage().contains("already exists")) throw e;
-            }
-
-        } catch (Exception e) {
-            this.repository = null;
-            this.keepAliveSession = null;
-            throw e;
-        }
-    }
-}</programlisting>
-    <para>As you can see, this method really has nothing to do with JBoss DNA, other than setting up a JCR repository that JBoss
-      DNA will use.</para>
-    <para>
-      The
-      <code>shutdownRepository()</code>
-      method shuts down the Jackrabbit transient repository by closing the "keep-alive session". Again, this method really does
-      nothing specifically with JBoss DNA, but is needed to manage the JCR repository that JBoss DNA uses.
-      <programlisting>
-public void shutdownRepository() throws Exception {
-    if (this.repository != null) {
-        try {
-            this.keepAliveSession.logout();
-        } finally {
-            this.repository = null;
-            this.keepAliveSession = null;
-        }
-    }
-}</programlisting>
-    </para>
-    <para>
-      The
-      <code>startDnaServices()</code>
-      method first starts the JCR repository (if it was not already started), and proceeds to create and configure the
-      <code>SequencingService</code>
-      as described
-      <link linkend="sequencing_service">earlier</link>
-      . This involes setting up the
-      <code>SessionFactory</code>
-      and
-      <code>ExecutionContext</code>
-      , creating the
-      <code>SequencingService</code>
-      instance, and configuring the image sequencer. The method then continues by setting up the
-      <code>ObservationService</code>
-      as described
-      <link linkend="observation_service">earlier</link>
-      and starting the service.
-      <programlisting>
-public void startDnaServices() throws Exception {
-    if (this.repository == null) this.startRepository();
-    if (this.sequencingService == null) {
-
-        SimpleSessionFactory sessionFactory = new SimpleSessionFactory();
-        sessionFactory.registerRepository(this.repositoryName, this.repository);
-        if (this.username != null) {
-            Credentials credentials = new SimpleCredentials(this.username, this.password);
-            sessionFactory.registerCredentials(this.repositoryName + "/" + this.workspaceName, credentials);
-        }
-        this.executionContext = new SimpleExecutionContext(sessionFactory);
-
-        // Create the sequencing service, passing in the execution context ...
-        this.sequencingService = new SequencingService();
-        this.sequencingService.setExecutionContext(executionContext);
-
-        // Configure the sequencers.
-        String name = "Image Sequencer";
-        String desc = "Sequences image files to extract the characteristics of the image";
-        String classname = "org.jboss.dna.sequencer.images.ImageMetadataSequencer";
-        String[] classpath = null; // Use the current classpath
-        String[] pathExpressions = {"//(*.(jpg|jpeg|gif|bmp|pcx|png|iff|ras|pbm|pgm|ppm|psd))[*]/jcr:content[@jcr:data] => /images/$1"};
-        SequencerConfig imageSequencerConfig = new SequencerConfig(name, desc, classname, classpath, pathExpressions);
-        this.sequencingService.addSequencer(imageSequencerConfig);
-
-        // Set up the MP3 sequencer ...
-        name = "Mp3 Sequencer";
-        desc = "Sequences mp3 files to extract the id3 tags of the audio file";
-        classname = "org.jboss.dna.sequencer.mp3.Mp3MetadataSequencer";
-        String[] mp3PathExpressions = {"//(*.mp3)[*]/jcr:content[@jcr:data] => /mp3s/$1"};
-        SequencerConfig mp3SequencerConfig = new SequencerConfig(name, desc, classname, classpath, mp3PathExpressions);
-        this.sequencingService.addSequencer(mp3SequencerConfig);
-
-        // Use the DNA observation service to listen to the JCR repository (or multiple ones), and
-        // then register the sequencing service as a listener to this observation service...
-        this.observationService = new ObservationService(this.executionContext.getSessionFactory());
-        this.observationService.getAdministrator().start();
-        this.observationService.addListener(this.sequencingService);
-        this.observationService.monitor(this.repositoryName + "/" + this.workspaceName, Event.NODE_ADDED | Event.PROPERTY_ADDED | Event.PROPERTY_CHANGED);
-    }
-    // Start up the sequencing service ...
-    this.sequencingService.getAdministrator().start();
-}</programlisting>
-    </para>
-    <para>
-      The
-      <code>shutdownDnaServices()</code>
-      method is pretty straightforward: it just calls shutdown on each of the services and waits until they terminate.
-      <programlisting>
-public void shutdownDnaServices() throws Exception {
-    if (this.sequencingService == null) return;
-
-    // Shut down the service and wait until it's all shut down ...
-    this.sequencingService.getAdministrator().shutdown();
-    this.sequencingService.getAdministrator().awaitTermination(5, TimeUnit.SECONDS);
-
-    // Shut down the observation service ...
-    this.observationService.getAdministrator().shutdown();
-    this.observationService.getAdministrator().awaitTermination(5, TimeUnit.SECONDS);
-}</programlisting>
-    </para>
-    <para>None of the other methods really do anything with JBoss DNA <emphasis>per se</emphasis>. Instead, they merely work with the repository
-      using the JCR API.</para>
-    <para>
-      The <code>main</code> method of the <code>SequencingClient</code> class creates a <code>SequencingClient</code> instance,
-      and passes a new <code>ConsoleInput</code> instance:
-      <programlisting>
-public static void main( String[] args ) throws Exception {
-    SequencingClient client = new SequencingClient();
-    client.setRepositoryInformation("repo", "default", "jsmith", "secret".toCharArray());
-    client.setUserInterface(new ConsoleInput(client));
-}</programlisting>
-      </para>
-      <para>If we look at the
-      <code>ConsoleInput</code>
-      constructor, it starts the repository, the DNA services, and a thread for the user interface. At this point, the constructor
-      returns, but the main application continues under the user interface thread.  When the user requests to quit,
-      the user interface thread also shuts down the DNA services and JCR repository.
-      <programlisting>
-public ConsoleInput( SequencerClient client ) {
-  try {
-      client.startRepository();
-      client.startDnaServices();
-  
-      System.out.println(getMenu());
-      Thread eventThread = new Thread(new Runnable() {
-          private boolean quit = false;
-          public void run() {
-              try {
-                  while (!quit) {
-                      // Display the prompt and process the requested operation ...
-                  }
-              } finally {
-                  try {
-                      // Terminate ...
-                      client.shutdownDnaServices();
-                      client.shutdownRepository();
-                  } catch (Exception err) {
-                      System.out.println("Error shutting down sequencing service and repository: " + err.getLocalizedMessage());
-                      err.printStackTrace(System.err);
-                  }
-              }
-          }
-      });
-      eventThread.start();
-  } catch (Exception err) {
-      System.out.println("Error: " + err.getLocalizedMessage());
-      err.printStackTrace(System.err);
-  }
-}</programlisting>
-    </para>
-    <para>At this point, we've reviewed all of the interesting code in the example application.  However, feel free
-    to play with the application, trying different things.
-    </para>
-  </sect1>
-  <sect1 id="using_dna_review">
-    <title>Summarizing what we just did</title>
-    <para>In this chapter we covered the different JBoss DNA components and how they can be used in your application.
-      Specifically, we described how the <code>SequencingService</code> and <code>ObservationService</code> can 
-      be configured and used.  And we ended the chapter by reviewing the example application, which not only uses
-      JBoss DNA, but also the repository via the JCR API.
-    </para>
-  </sect1>
-</chapter>
-  
-<!--  ====================================================================================================
-                                               Chapter 
-      ====================================================================================================   -->
-<chapter id="custom_sequencers">
-  <title>Creating custom sequencers</title>
-  <para>The current release of JBoss DNA comes with two sequencers: one that extracts metadata from a variety of image file formats,
-  and another that extracts some of the ID3 metadata from MP3 audio files.  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>
-  Creating a custom sequencer involves the following steps:
-  <itemizedlist>
-    <listitem>
-      <para>Create a Maven 2 project for your sequencer;</para>
-    </listitem>
-    <listitem>
-      <para>Implement the <code>org.jboss.dna.graph.sequencer.StreamSequencer</code> interface with your own implementation, and create unit tests to verify
-      the functionality and expected behavior;</para>
-    </listitem>
-    <listitem>
-      <para>Add the sequencer configuration to the JBoss DNA <code>SequencingService</code> in your application
-      as described in the <link linkend="using_dna">previous chapter</link>; and</para>
-    </listitem>
-    <listitem>
-      <para>Deploy the JAR file with your implementation (as well as any dependencies), and make them available to JBoss DNA
-      in your application.</para>
-    </listitem>
-  </itemizedlist>
-  It's that simple.
-  </para>
-  <sect1 id="custom_sequencer_project">
-    <title>Creating the Maven 2 project</title>
-    <para>The first step is to create the Maven 2 project that you can use to compile your code and build the JARs.
-    Maven 2 automates a lot of the work, and since you're already <link linkend="downloading_and_running">set up to use Maven</link>,
-    using Maven for your project will save you a lot of time and effort.  Of course, you don't have to use Maven 2, but then you'll
-    have to get the required libraries and manage the compiling and building process yourself.</para>
-    <note>
-      <para>JBoss DNA may provide in the future a Maven archetype for creating sequencer projects.  If you'd find this useful
-        and would like to help create it, please <link linkend="preface">join the community</link>.</para>
-    </note>
-  <note>
-    <para>The <code>dna-sequencer-images</code> project is a small, self-contained sequencer implementation that
-    has only the minimal dependencies.  Starting with this project's source and modifying it to suit your needs may be the easiest way to get started.
-    See the subversion repository: <ulink url="http://anonsvn.jboss.org/repos/dna/trunk/sequencers/dna-sequencer-images/">http://anonsvn.jboss.org/repos/dna/trunk/sequencers/dna-sequencer-images/</ulink>
-    </para>
-  </note>
-    <para>You can create your Maven project any way you'd like.  For examples, see the <ulink url="http://maven.apache.org/guides/getting-started/index.html#How_do_I_make_my_first_Maven_project">Maven 2 documentation</ulink>.  
-    Once you've done that, just add the dependencies in your project's <code>pom.xml</code> dependencies section:
-  <programlisting>
-&lt;dependency&gt;
-  &lt;groupId&gt;org.jboss.dna&lt;/groupId&gt;
-  &lt;artifactId&gt;dna-common&lt;/artifactId&gt;
-  &lt;version&gt;0.1&lt;/version&gt;
-&lt;/dependency&gt;
-&lt;dependency&gt;
-  &lt;groupId&gt;org.jboss.dna&lt;/groupId&gt;
-  &lt;artifactId&gt;dna-graph&lt;/artifactId&gt;
-  &lt;version&gt;0.1&lt;/version&gt;
-&lt;/dependency&gt;
-&lt;dependency&gt;
-  &lt;groupId&gt;org.slf4j&lt;/groupId&gt;
-  &lt;artifactId&gt;slf4j-api&lt;/artifactId&gt;
-&lt;/dependency&gt;
-</programlisting>
-  These are minimum dependencies required for compiling a sequencer.  Of course, you'll have to add
-  other dependencies that your sequencer needs.</para>
-  <para>As for testing, you probably will want to add more dependencies, such as those listed here:
-<programlisting>
-&lt;dependency&gt;
-  &lt;groupId&gt;junit&lt;/groupId&gt;
-  &lt;artifactId&gt;junit&lt;/artifactId&gt;
-  &lt;version&gt;4.4&lt;/version&gt;
-  &lt;scope&gt;test&lt;/scope&gt;
-&lt;/dependency&gt;
-&lt;dependency&gt;
-  &lt;groupId&gt;org.hamcrest&lt;/groupId&gt;
-  &lt;artifactId&gt;hamcrest-library&lt;/artifactId&gt;
-  &lt;version&gt;1.1&lt;/version&gt;
-  &lt;scope&gt;test&lt;/scope&gt;
-&lt;/dependency&gt;
-&lt;!-- Logging with Log4J --&gt;
-&lt;dependency&gt;
-  &lt;groupId&gt;org.slf4j&lt;/groupId&gt;
-  &lt;artifactId&gt;slf4j-log4j12&lt;/artifactId&gt;
-  &lt;version&gt;1.4.3&lt;/version&gt;
-  &lt;scope&gt;test&lt;/scope&gt;
-&lt;/dependency&gt;
-&lt;dependency&gt;
-  &lt;groupId&gt;log4j&lt;/groupId&gt;
-  &lt;artifactId&gt;log4j&lt;/artifactId&gt;
-  &lt;version&gt;1.2.14&lt;/version&gt;
-  &lt;scope&gt;test&lt;/scope&gt;
-&lt;/dependency&gt;
-</programlisting>
-  Testing JBoss DNA sequencers does not require a JCR repository or the JBoss DNA services.  (For more detail,
-  see the <link linkend="testing_custom_sequencers">testing section</link>.)  However, if you want to do
-  integration testing with a JCR repository and the JBoss DNA services, you'll need additional dependencies for these libraries.
-<programlisting>
-&lt;dependency&gt;
-  &lt;groupId&gt;org.jboss.dna&lt;/groupId&gt;
-  &lt;artifactId&gt;dna-repository&lt;/artifactId&gt;
-  &lt;version&gt;0.1&lt;/version&gt;
-  &lt;scope&gt;test&lt;/scope&gt;
-&lt;/dependency&gt;
-&lt;!-- Java Content Repository API --&gt;
-&lt;dependency&gt;
-  &lt;groupId&gt;javax.jcr&lt;/groupId&gt;
-  &lt;artifactId&gt;jcr&lt;/artifactId&gt;
-  &lt;version&gt;1.0.1&lt;/version&gt;
-  &lt;scope&gt;test&lt;/scope&gt;
-&lt;/dependency&gt;
-&lt;!-- Apache Jackrabbit (JCR Implementation) --&gt;
-&lt;dependency&gt;
-  &lt;groupId&gt;org.apache.jackrabbit&lt;/groupId&gt;
-  &lt;artifactId&gt;jackrabbit-api&lt;/artifactId&gt;
-  &lt;version&gt;1.3.3&lt;/version&gt;
-  &lt;scope&gt;test&lt;/scope&gt;
-  &lt;!-- Exclude these since they are included in JDK 1.5 --&gt;
-  &lt;exclusions&gt;
-    &lt;exclusion&gt;
-      &lt;groupId&gt;xml-apis&lt;/groupId&gt;
-      &lt;artifactId&gt;xml-apis&lt;/artifactId&gt;
-    &lt;/exclusion&gt;
-    &lt;exclusion&gt;
-      &lt;groupId&gt;xerces&lt;/groupId&gt;
-      &lt;artifactId&gt;xercesImpl&lt;/artifactId&gt;
-    &lt;/exclusion&gt;
-  &lt;/exclusions&gt;
-&lt;/dependency&gt;
-&lt;dependency&gt;
-  &lt;groupId&gt;org.apache.jackrabbit&lt;/groupId&gt;
-  &lt;artifactId&gt;jackrabbit-core&lt;/artifactId&gt;
-  &lt;version&gt;1.3.3&lt;/version&gt;
-  &lt;scope&gt;test&lt;/scope&gt;
-  &lt;!-- Exclude these since they are included in JDK 1.5 --&gt;
-  &lt;exclusions&gt;
-    &lt;exclusion&gt;
-      &lt;groupId&gt;xml-apis&lt;/groupId&gt;
-      &lt;artifactId&gt;xml-apis&lt;/artifactId&gt;
-    &lt;/exclusion&gt;
-    &lt;exclusion&gt;
-      &lt;groupId&gt;xerces&lt;/groupId&gt;
-      &lt;artifactId&gt;xercesImpl&lt;/artifactId&gt;
-    &lt;/exclusion&gt;
-  &lt;/exclusions&gt;
-&lt;/dependency&gt;
-</programlisting>
-  </para>
-  <para>At this point, your project should be set up correctly, and you're ready to move on to 
-  <link linkend="custom_sequencer_implementation">writing the Java implementation</link> for your sequencer.
-  </para>
-  </sect1>
-  <sect1 id="custom_sequencer_implementation">
-    <title>Implementing the StreamSequencer interface</title>
-    <para>After creating the project and setting up the dependencies, the next step is to create a Java class that implements
-    the <code>org.jboss.dna.graph.sequencer.StreamSequencer</code> interface.  This interface is very straightforward
-    and involves a single method:
-    <programlisting>
-public interface StreamSequencer {
-
-    /**
-     * Sequence the data found in the supplied stream, placing the output 
-     * information into the supplied map.
-     *
-     * @param stream the stream with the data to be sequenced; never null
-     * @param output the output from the sequencing operation; never null
-     * @param progressMonitor the progress monitor that should be kept 
-     *   updated with the sequencer's progress and that should be
-     *   frequently consulted as to whether this operation has been cancelled.
-     */
-    void sequence( InputStream stream, SequencerOutput output, 
-                   ProgressMonitor progressMonitor );</programlisting>
-    </para>
-    <para>The job of a stream sequencer is to process the data in the supplied stream, and place into the <code>SequencerOutput</code> 
-    any information that is to go into the JCR repository.  JBoss DNA figures out when your sequencer should be called
-    (of course, using the sequencing configuration you'll add in a bit), and then makes sure the generated information
-    is saved in the correct place in the repository.  
-    </para>
-    <para>The <code>SequencerOutput</code> class is fairly easy to use.  There are basically two methods you need to call.
-    One method sets the property values, while the other sets references to other nodes in the repository.  Use these
-    methods to describe the properties of the nodes you want to create, using relative paths for the nodes and
-    valid JCR property names for properties and references.  JBoss DNA will ensure that nodes are created or updated
-    whenever they're needed.
-    <programlisting>
-public interface SequencerOutput {
-
-  /**
-   * Set the supplied property on the supplied node.  The allowable
-   * values are any of the following:
-   *   - primitives (which will be autoboxed)
-   *   - String instances
-   *   - String arrays
-   *   - byte arrays
-   *   - InputStream instances
-   *   - Calendar instances
-   *
-   * @param nodePath the path to the node containing the property; 
-   * may not be null
-   * @param property the name of the property to be set
-   * @param values the value(s) for the property; may be empty if 
-   * any existing property is to be removed
-   */
-  void setProperty( String nodePath, String property,
-                    Object... values );
-
-  /**
-   * Set the supplied reference on the supplied node.
-   *
-   * @param nodePath the path to the node containing the property; 
-   * may not be null
-   * @param property the name of the property to be set
-   * @param paths the paths to the referenced property, which may be
-   * absolute paths or relative to the sequencer output node;
-   * may be empty if any existing property is to be removed
-   */
-  void setReference( String nodePath, String property,
-                     String... paths );
-}</programlisting>
-    </para>
-      <para>JBoss DNA will create nodes of type <code>nt:unstructured</code> unless you specify the value for the
-      <code>jcr:primaryType</code> property.  You can also specify the values for the <code>jcr:mixinTypes</code> property
-      if you want to add mixins to any node.
-      </para>
-    <para>For a complete example of a sequencer, let's look at the <code>org.jboss.dna.sequencers.image.ImageMetadataSequencer</code> implementation:
-    <programlisting>
-public class ImageMetadataSequencer implements StreamSequencer {
-
-    public static final String METADATA_NODE = "image:metadata";
-    public static final String IMAGE_PRIMARY_TYPE = "jcr:primaryType";
-    public static final String IMAGE_MIXINS = "jcr:mixinTypes";
-    public static final String IMAGE_MIME_TYPE = "jcr:mimeType";
-    public static final String IMAGE_ENCODING = "jcr:encoding";
-    public static final String IMAGE_FORMAT_NAME = "image:formatName";
-    public static final String IMAGE_WIDTH = "image:width";
-    public static final String IMAGE_HEIGHT = "image:height";
-    public static final String IMAGE_BITS_PER_PIXEL = "image:bitsPerPixel";
-    public static final String IMAGE_PROGRESSIVE = "image:progressive";
-    public static final String IMAGE_NUMBER_OF_IMAGES = "image:numberOfImages";
-    public static final String IMAGE_PHYSICAL_WIDTH_DPI = "image:physicalWidthDpi";
-    public static final String IMAGE_PHYSICAL_HEIGHT_DPI = "image:physicalHeightDpi";
-    public static final String IMAGE_PHYSICAL_WIDTH_INCHES = "image:physicalWidthInches";
-    public static final String IMAGE_PHYSICAL_HEIGHT_INCHES = "image:physicalHeightInches";
-
-    /**
-     * {@inheritDoc}
-     */
-    public void sequence( InputStream stream, SequencerOutput output, 
-                          ProgressMonitor progressMonitor ) {
-        progressMonitor.beginTask(10, ImageSequencerI18n.sequencerTaskName);
-
-        ImageMetadata metadata = new ImageMetadata();
-        metadata.setInput(stream);
-        metadata.setDetermineImageNumber(true);
-        metadata.setCollectComments(true);
-
-        // Process the image stream and extract the metadata ...
-        if (!metadata.check()) {
-            metadata = null;
-        }
-        progressMonitor.worked(5);
-        if (progressMonitor.isCancelled()) return;
-
-        // Generate the output graph if we found useful metadata ...
-        if (metadata != null) {
-            // Place the image metadata into the output map ...
-            output.setProperty(METADATA_NODE, IMAGE_PRIMARY_TYPE, "image:metadata");
-            // output.psetProperty(METADATA_NODE, IMAGE_MIXINS, "");
-            output.setProperty(METADATA_NODE, IMAGE_MIME_TYPE, metadata.getMimeType());
-            // output.setProperty(METADATA_NODE, IMAGE_ENCODING, "");
-            output.setProperty(METADATA_NODE, IMAGE_FORMAT_NAME, metadata.getFormatName());
-            output.setProperty(METADATA_NODE, IMAGE_WIDTH, metadata.getWidth());
-            output.setProperty(METADATA_NODE, IMAGE_HEIGHT, metadata.getHeight());
-            output.setProperty(METADATA_NODE, IMAGE_BITS_PER_PIXEL, metadata.getBitsPerPixel());
-            output.setProperty(METADATA_NODE, IMAGE_PROGRESSIVE, metadata.isProgressive());
-            output.setProperty(METADATA_NODE, IMAGE_NUMBER_OF_IMAGES, metadata.getNumberOfImages());
-            output.setProperty(METADATA_NODE, IMAGE_PHYSICAL_WIDTH_DPI, metadata.getPhysicalWidthDpi());
-            output.setProperty(METADATA_NODE, IMAGE_PHYSICAL_HEIGHT_DPI, metadata.getPhysicalHeightDpi());
-            output.setProperty(METADATA_NODE, IMAGE_PHYSICAL_WIDTH_INCHES, metadata.getPhysicalWidthInch());
-            output.setProperty(METADATA_NODE, IMAGE_PHYSICAL_HEIGHT_INCHES, metadata.getPhysicalHeightInch());
-        }
-
-        progressMonitor.done();
-    }
-}</programlisting>
-    </para>
-    <para>
-    Notice how the image metadata is extracted and the output graph is generated.  A single node is created with the name <code>image:metadata</code>
-    and with the <code>image:metadata</code> node type.  No mixins are defined for the node, but several properties are set on the node
-    using the values obtained from the image metadata.  After this method returns, the constructed graph will be saved to the repository
-    in all of the places defined by its configuration.  (This is why only relative paths are used in the sequencer.)
-    </para>
-    <para>Also note how the progress monitor is used.  Reporting progress through the supplied <code>ProgressMonitor</code> is very easy, and it ensures that JBoss DNA
-     can accurately monitor and report the status of sequencing activities to the users.  At the beginning of the operation, call
-     <code>beginTask(...)</code> with a meaningful message describing
-     the operation and a total for the amount of work that will be done by this sequencer. Then perform the sequencing work,
-     periodically reporting work by specifying the incremental amount of work with the <code>worked(double)</code> method, or
-     by creating a subtask with the <code>createSubtask(double)</code> method and reporting work against that subtask
-     monitor.
-     </para>
-     <para>Your method should periodically use the ProgressMonitor's <code>isCancelled()</code> method to check whether the operation has been
-     cancelled.. If this method returns true, the implementation should abort all work as
-     soon as possible and close any resources that were acquired or opened.
-     </para>
-     <para>
-     Finally, when your sequencing operation is completed, it should call <code>done()</code> on the progress monitor.
-     </para>
-  </sect1>
-  <sect1 id="testing_custom_sequencers">
-    <title>Testing custom sequencers</title>
-    <para>The sequencing framework was designed to make testing sequencers much easier.  In particular, the
-    <code>StreamSequencer</code> interface does not make use of the JCR API.  So instead of requiring a fully-configured
-    JCR repository and JBoss DNA system, unit tests for a sequencer can focus on testing that the content is
-    processed correctly and the desired output graph is generated.</para>
-    <note>
-      <para>For a complete example of a sequencer unit test, see the <code>ImageMetadataSequencerTest</code> unit test
-      in the <code>org.jboss.dna.sequencer.images</code> package of the <code>dna-sequencers-image</code> project.
-      </para>
-    </note>
-    <para>The following code fragment shows one way of testing a sequencer, using JUnit 4.4 assertions and 
-      some of the classes made available by JBoss DNA.  Of course,
-      this example code does not do any error handling and does not make all the assertions a real test would.
-    <programlisting>
-Sequencer sequencer = new ImageMetadataSequencer();
-MockSequencerOutput output = new MockSequencerOutput();
-ProgressMonitor progress = new SimpleProgressMonitor("Test activity");
-InputStream stream = null;
-try {
-    stream = this.getClass().getClassLoader().getResource("caution.gif").openStream();
-    sequencer.sequence(stream,output,progress);   // writes to 'output'
-    assertThat(output.getPropertyValues("image:metadata", "jcr:primaryType"), 
-               is(new Object[] {"image:metadata"}));
-    assertThat(output.getPropertyValues("image:metadata", "jcr:mimeType"), 
-               is(new Object[] {"image/gif"}));
-    // ... make more assertions here
-    assertThat(output.hasReferences(), is(false));
-} finally {
-    stream.close();
-}</programlisting>
-  </para>
-  <para>It's also useful to test that a sequencer produces no output for something it should not understand:
-    <programlisting>
-Sequencer sequencer = new ImageMetadataSequencer();
-MockSequencerOutput output = new MockSequencerOutput();
-ProgressMonitor progress = new SimpleProgressMonitor("Test activity");
-InputStream stream = null;
-try {
-    stream = this.getClass().getClassLoader().getResource("caution.pict").openStream();
-    sequencer.sequence(stream,output,progress);   // writes to 'output'
-    assertThat(output.hasProperties(), is(false));
-    assertThat(output.hasReferences(), is(false));
-} finally {
-    stream.close();
-}</programlisting>
-    </para>
-    <para>These are just two simple tests that show ways of testing a sequencer.  Some tests may get quite involved,
-    especially if a lot of output data is produced.  
-    </para>
-    <para>It may also be useful to create some integration tests
-    that <link linkend="using_dna">configure JBoss DNA</link> to use a custom sequencer, and to then upload
-    content using the JCR API, verifying that the custom sequencer did run.  However, remember that JBoss DNA
-    runs sequencers asynchronously in the background, and you must sychronize your tests to ensure that the
-    sequencers have a chance to run before checking the results.  (One way of doing this (although, granted, not always reliable) is to wait for a second
-    after uploading your content, shutdown the <code>SequencingService</code> and await its termination,
-    and then check that the sequencer output has been saved to the JCR repository.  For an example of this technique,
-    see the <code>SequencingClientTest</code> unit test in the example application.)
-    </para>  
-  </sect1>
-  <sect1 id="deploying_custom_sequencers">
-    <title>Deploying custom sequencers</title>
-    <para>The first step of deploying a sequencer consists of adding/changing the sequencer configuration (e.g., <code>SequencerConfig</code>)
-    in the <code>SequencingService</code>.  This was covered in the <link linkend="sequencing_service">previous chapter</link>.
-    </para>
-    <para>
-    The second step is to make the sequencer implementation available to JBoss DNA.  At this time, the JAR containing 
-    your new sequencer, as well as any JARs that your sequencer depends on, should be placed on your application classpath.</para>
-    <note>
-      <para>A future goal of JBoss DNA is to allow sequencers, connectors, and other extensions to be easily deployed into
-        a runtime repository.  This process will not only be much simpler, but it will also provide JBoss DNA 
-        with the information necessary to update configurations and create the appropriate class loaders for each extension.
-        Having separate class loaders for each extension helps prevent the pollution of the common classpath, 
-        facilitates an isolated runtime environment to eliminate any dependency conflicts, and may potentially
-        enable hot redeployment of newer extension versions.
-      </para>
-    </note>
-  </sect1>
-</chapter>
-  
-<!--  ====================================================================================================
-                                               Chapter 
-      ====================================================================================================   -->
-<chapter id="future_directions">
-  <title>Looking to the future</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.
-  If you're interested in getting involved with the JBoss DNA project, consider picking up one of the sequencers on our
-  <ulink url="http://jira.jboss.org/jira/browse/DNA?report=com.atlassian.jira.plugin.system.project:roadmap-panel">roadmap</ulink>.
-  Or, check out <ulink url="http://jira.jboss.org/jira/secure/IssueNavigator.jspa?reset=true&amp;mode=hide&amp;pid=12310520&amp;sorter/order=DESC&amp;sorter/field=priority&amp;resolution=-1&amp;component=12311436">JIRA</ulink>
-  for the list of sequencers we've thought of.  If you think of one that's not there, please add it to JIRA!
-  </para>
-  <para>
-  The next release will focus on creating the <link linkend="federation">federation engine</link> and connectors
-  for several popular and ubiquitous systems.  The 0.2 release will likely only federate information in a read-only manner,
-  but updates will soon follow.  Also, during the early part of the next release, the JBoss DNA project will switch to use JDK 6.  
-  Java 5 is being end-of-lifed, so we want to move to a supported JDK. However, a number of JBoss projects and products continue to
-  require Java 5, so our next release will most likely use JDK 6 with Java 5 compatibility.</para>
-  <para>
-  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.  If any of these are of interest to you, please <link linkend="preface">get involved</link> in the community.
-  </para>
-</chapter>
 </book>
\ No newline at end of file

Modified: trunk/extensions/dna-sequencer-images/src/test/resources/log4j.properties
===================================================================
--- trunk/extensions/dna-sequencer-images/src/test/resources/log4j.properties	2009-06-04 22:31:30 UTC (rev 977)
+++ trunk/extensions/dna-sequencer-images/src/test/resources/log4j.properties	2009-06-04 23:36:27 UTC (rev 978)
@@ -10,6 +10,3 @@
 # Set up the default logging to be INFO level, then override specific units
 log4j.logger.org.jboss.dna=INFO
 
-# Jackrabbit logging
-log4j.logger.org.apache.jackrabbit=WARN, stdout
-

Deleted: trunk/extensions/dna-sequencer-java/src/test/resources/jackrabbitInMemoryTestRepositoryConfig.xml
===================================================================
--- trunk/extensions/dna-sequencer-java/src/test/resources/jackrabbitInMemoryTestRepositoryConfig.xml	2009-06-04 22:31:30 UTC (rev 977)
+++ trunk/extensions/dna-sequencer-java/src/test/resources/jackrabbitInMemoryTestRepositoryConfig.xml	2009-06-04 23:36:27 UTC (rev 978)
@@ -1,115 +0,0 @@
-<?xml version="1.0"?>
-<!--
-   Licensed to the Apache Software Foundation (ASF) under one or more
-   contributor license agreements.  See the NOTICE file distributed with
-   this work for additional information regarding copyright ownership.
-   The ASF licenses this file to You under the Apache License, Version 2.0
-   (the "License"); you may not use this file except in compliance with
-   the License.  You may obtain a copy of the License at
-
-       http://www.apache.org/licenses/LICENSE-2.0
-
-   Unless required by applicable law or agreed to in writing, software
-   distributed under the License is distributed on an "AS IS" BASIS,
-   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-   See the License for the specific language governing permissions and
-   limitations under the License.
--->
-<!DOCTYPE Repository PUBLIC "-//The Apache Software Foundation//DTD Jackrabbit 1.2//EN"
-                            "http://jackrabbit.apache.org/dtd/repository-1.2.dtd">
-<!-- Example Repository Configuration File -->
-<Repository>
-    <!--
-        virtual file system where the repository stores global state
-        (e.g. registered namespaces, custom node types, etc.)
-    -->
-    <FileSystem class="org.apache.jackrabbit.core.fs.local.LocalFileSystem">
-        <param name="path" value="${rep.home}/repository"/>
-    </FileSystem>
-
-    <!--
-        security configuration
-    -->
-    <Security appName="Jackrabbit">
-        <!--
-            access manager:
-            class: FQN of class implementing the AccessManager interface
-        -->
-        <AccessManager class="org.apache.jackrabbit.core.security.SimpleAccessManager">
-            <!-- <param name="config" value="${rep.home}/access.xml"/> -->
-        </AccessManager>
-
-        <LoginModule class="org.apache.jackrabbit.core.security.SimpleLoginModule">
-           <!-- anonymous user name ('anonymous' is the default value) -->
-           <param name="anonymousId" value="anonymous"/>
-           <!--
-              default user name to be used instead of the anonymous user
-              when no login credentials are provided (unset by default)
-           -->
-           <!-- <param name="defaultUserId" value="superuser"/> -->
-        </LoginModule>
-    </Security>
-
-    <!--
-        location of workspaces root directory and name of default workspace
-    -->
-    <Workspaces rootPath="${rep.home}/workspaces" defaultWorkspace="default"/>
-    <!--
-        workspace configuration template:
-        used to create the initial workspace if there's no workspace yet
-    -->
-    <Workspace name="Jackrabbit Core">
-        <!--
-            virtual file system of the workspace:
-            class: FQN of class implementing the FileSystem interface
-        -->
-        <FileSystem class="org.apache.jackrabbit.core.fs.local.LocalFileSystem">
-            <param name="path" value="${wsp.home}"/>
-        </FileSystem>
-        <!--
-            persistence manager of the workspace:
-            class: FQN of class implementing the PersistenceManager interface
-        -->
-        <PersistenceManager class="org.apache.jackrabbit.core.persistence.mem.InMemPersistenceManager">
-          <param name="persistent" value="false"/>
-        </PersistenceManager>
-        <!--
-            Search index and the file system it uses.
-            class: FQN of class implementing the QueryHandler interface
-        -->
-        <SearchIndex class="org.apache.jackrabbit.core.query.lucene.SearchIndex">
-            <param name="path" value="${wsp.home}/index"/>
-        </SearchIndex>
-    </Workspace>
-
-    <!--
-        Configures the versioning
-    -->
-    <Versioning rootPath="${rep.home}/version">
-        <!--
-            Configures the filesystem to use for versioning for the respective
-            persistence manager
-        -->
-        <FileSystem class="org.apache.jackrabbit.core.fs.local.LocalFileSystem">
-            <param name="path" value="${rep.home}/version" />
-        </FileSystem>
-
-        <!--
-            Configures the persistence manager to be used for persisting version state.
-            Please note that the current versioning implementation is based on
-            a 'normal' persistence manager, but this could change in future
-            implementations.
-        -->
-        <PersistenceManager class="org.apache.jackrabbit.core.persistence.mem.InMemPersistenceManager">
-          <param name="persistent" value="false"/>
-        </PersistenceManager>
-    </Versioning>
-
-    <!--
-        Search index for content that is shared repository wide
-        (/jcr:system tree, contains mainly versions)
-    -->
-    <SearchIndex class="org.apache.jackrabbit.core.query.lucene.SearchIndex">
-        <param name="path" value="${rep.home}/repository/index"/>
-    </SearchIndex>
-</Repository>

Modified: trunk/extensions/dna-sequencer-java/src/test/resources/log4j.properties
===================================================================
--- trunk/extensions/dna-sequencer-java/src/test/resources/log4j.properties	2009-06-04 22:31:30 UTC (rev 977)
+++ trunk/extensions/dna-sequencer-java/src/test/resources/log4j.properties	2009-06-04 23:36:27 UTC (rev 978)
@@ -9,6 +9,3 @@
 
 # Set up the default logging to be INFO level, then override specific units
 log4j.logger.org.jboss.dna=INFO
-
-# Jackrabbit logging
-log4j.logger.org.apache.jackrabbit=WARN, stdout

Modified: trunk/extensions/dna-sequencer-mp3/src/test/resources/log4j.properties
===================================================================
--- trunk/extensions/dna-sequencer-mp3/src/test/resources/log4j.properties	2009-06-04 22:31:30 UTC (rev 977)
+++ trunk/extensions/dna-sequencer-mp3/src/test/resources/log4j.properties	2009-06-04 23:36:27 UTC (rev 978)
@@ -9,6 +9,3 @@
 
 # Set up the default logging to be INFO level, then override specific units
 log4j.logger.org.jboss.dna=INFO
-
-# Jackrabbit logging
-log4j.logger.org.apache.jackrabbit=WARN, stdout

Modified: trunk/extensions/dna-sequencer-msoffice/src/test/resources/log4j.properties
===================================================================
--- trunk/extensions/dna-sequencer-msoffice/src/test/resources/log4j.properties	2009-06-04 22:31:30 UTC (rev 977)
+++ trunk/extensions/dna-sequencer-msoffice/src/test/resources/log4j.properties	2009-06-04 23:36:27 UTC (rev 978)
@@ -10,6 +10,3 @@
 # Set up the default logging to be INFO level, then override specific units
 log4j.logger.org.jboss.dna=INFO
 
-# Jackrabbit logging
-log4j.logger.org.apache.jackrabbit=WARN, stdout
-

Modified: trunk/extensions/dna-sequencer-xml/src/test/java/org/jboss/dna/sequencer/xml/XmlSequencerTest.java
===================================================================
--- trunk/extensions/dna-sequencer-xml/src/test/java/org/jboss/dna/sequencer/xml/XmlSequencerTest.java	2009-06-04 22:31:30 UTC (rev 977)
+++ trunk/extensions/dna-sequencer-xml/src/test/java/org/jboss/dna/sequencer/xml/XmlSequencerTest.java	2009-06-04 23:36:27 UTC (rev 978)
@@ -45,11 +45,8 @@
 
     private static final String CDATA = "dnaxml:cData";
     private static final String CDATA_CONTENT = "dnaxml:cDataContent";
-    private static final String COMMENT = "dnaxml:comment";
-    private static final String COMMENT_CONTENT = "dnaxml:commentContent";
     private static final String DOCUMENT = "dnaxml:document";
     private static final String DTD_NAME = "dnadtd:name";
-    private static final String DTD_PUBLIC_ID = "dnadtd:publicId";
     private static final String DTD_SYSTEM_ID = "dnadtd:systemId";
     private static final String DTD_VALUE = "dnadtd:value";
     private static final String ELEMENT_CONTENT = "dnaxml:elementContent";
@@ -61,7 +58,6 @@
     private XmlSequencer sequencer;
     private InputStream stream;
     private MockSequencerOutput output;
-    private URL xml1;
     private URL xml2;
     private URL xml3;
     private URL xml4;
@@ -73,8 +69,6 @@
         sequencer = new XmlSequencer();
         context = new MockSequencerContext();
         output = new MockSequencerOutput(context);
-        xml1 = this.getClass().getClassLoader().getResource("jackrabbitInMemoryTestRepositoryConfig.xml");
-        assertThat(xml1, is(notNullValue()));
         xml2 = this.getClass().getClassLoader().getResource("master.xml");
         assertThat(xml2, is(notNullValue()));
         xml3 = this.getClass().getClassLoader().getResource("CurrencyFormatterExample.mxml");
@@ -97,23 +91,6 @@
     }
 
     @Test
-    public void shouldSequenceXml() throws IOException {
-        verifyDocument(xml1);
-        verifyName(COMMENT + "[1]", "jcr:primaryType", COMMENT);
-        String text = verify(COMMENT + "[1]", COMMENT_CONTENT, String.class);
-        assertThat(text.startsWith("Licensed to the Apache Software Foundation (ASF)"), is(true));
-        assertThat(text.indexOf('\n') > 0, is(true));
-        assertThat(text.endsWith("   limitations under the License."), is(true));
-        verifyString("", DTD_NAME, "Repository");
-        verifyString("", DTD_PUBLIC_ID, "-//The Apache Software Foundation//DTD Jackrabbit 1.2//EN");
-        verifyString("", DTD_SYSTEM_ID, "http://jackrabbit.apache.org/dtd/repository-1.2.dtd");
-        verifyName(COMMENT + "[2]", "jcr:primaryType", COMMENT);
-        verifyString(COMMENT + "[2]", COMMENT_CONTENT, "Example Repository Configuration File");
-        verifyName("Repository[1]", "jcr:primaryType", "nt:unstructured");
-        verifyName("Repository[1]/" + COMMENT + "[1]", "jcr:primaryType", COMMENT);
-    }
-
-    @Test
     public void shouldHandleNamespaces() throws IOException {
         verifyDocument(xml2);
         verifyName("book[1]/bookinfo[1]/xi:include[1]", "jcr:primaryType", "nt:unstructured");
@@ -139,15 +116,12 @@
     @Test
     public void shouldSequenceElementContent() throws IOException {
         verifyDocument(xml2);
-        verifyString("book[1]/chapter[4]/sect1[1]/para[8]/" + ELEMENT_CONTENT + "[1]",
+        verifyString("book[1]/chapter[1]/para[8]/" + ELEMENT_CONTENT + "[1]",
                      ELEMENT_CONTENT,
-                     "The path expression is more complicated."
-                     + " Sequencer path expressions are used by the sequencing service to determine whether a particular changed node should be sequenced."
-                     + " The expressions consist of two parts: a selection criteria and an output expression."
-                     + " Here's a simple example:");
-        verifyString("book[1]/chapter[4]/sect1[1]/para[8]/programlisting[1]/" + ELEMENT_CONTENT + "[1]",
-                     ELEMENT_CONTENT,
-                     "/a/b/c at title =&gt; /d/e/f");
+                     "JBoss DNA is building other features as well. One goal of JBoss DNA is to create federated repositories that "
+                     + "dynamically merge the information from multiple databases, services, applications, and other JCR repositories. Another is to "
+                     + "create customized views based upon the type of data and the role of the user that is accessing the data. And yet another is "
+                     + "to create a REST-ful API to allow the JCR content to be accessed easily by other applications written in other languages.");
     }
 
     @Test

Deleted: trunk/extensions/dna-sequencer-xml/src/test/resources/jackrabbitInMemoryTestRepositoryConfig.xml
===================================================================
--- trunk/extensions/dna-sequencer-xml/src/test/resources/jackrabbitInMemoryTestRepositoryConfig.xml	2009-06-04 22:31:30 UTC (rev 977)
+++ trunk/extensions/dna-sequencer-xml/src/test/resources/jackrabbitInMemoryTestRepositoryConfig.xml	2009-06-04 23:36:27 UTC (rev 978)
@@ -1,116 +0,0 @@
-<?xml version="1.0"?>
-<!--
-   Licensed to the Apache Software Foundation (ASF) under one or more
-   contributor license agreements.  See the NOTICE file distributed with
-   this work for additional information regarding copyright ownership.
-   The ASF licenses this file to You under the Apache License, Version 2.0
-   (the "License"); you may not use this file except in compliance with
-   the License.  You may obtain a copy of the License at
-
-       http://www.apache.org/licenses/LICENSE-2.0
-
-   Unless required by applicable law or agreed to in writing, software
-   distributed under the License is distributed on an "AS IS" BASIS,
-   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-   See the License for the specific language governing permissions and
-   limitations under the License.
--->
-<!DOCTYPE Repository PUBLIC "-//The Apache Software Foundation//DTD Jackrabbit 1.2//EN"
-                            "http://jackrabbit.apache.org/dtd/repository-1.2.dtd">
-<!-- Example Repository Configuration File -->
-<Repository>
-    <!--
-        virtual file system where the repository stores global state
-        (e.g. registered namespaces, custom node types, etc.)
-    -->
-    <FileSystem class="org.apache.jackrabbit.core.fs.mem.MemoryFileSystem">
-        <param name="path" value="${rep.home}/repository"/>
-    </FileSystem>
-
-    <!--
-        security configuration
-    -->
-    <Security appName="Jackrabbit">
-        <!--
-            access manager:
-            class: FQN of class implementing the AccessManager interface
-        -->
-        <AccessManager class="org.apache.jackrabbit.core.security.SimpleAccessManager">
-            <!-- <param name="config" value="${rep.home}/access.xml"/> -->
-        </AccessManager>
-
-        <LoginModule class="org.apache.jackrabbit.core.security.SimpleLoginModule">
-           <!-- anonymous user name ('anonymous' is the default value) -->
-           <param name="anonymousId" value="anonymous"/>
-           <!--
-              default user name to be used instead of the anonymous user
-              when no login credentials are provided (unset by default)
-           -->
-           <!-- <param name="defaultUserId" value="superuser"/> -->
-        </LoginModule>
-    </Security>
-
-    <!--
-        location of workspaces root directory and name of default workspace
-    -->
-    <Workspaces rootPath="${rep.home}/workspaces" defaultWorkspace="default"/>
-    <!--
-        workspace configuration template:
-        used to create the initial workspace if there's no workspace yet
-    -->
-    <Workspace name="Jackrabbit Core">
-        <!--
-            virtual file system of the workspace:
-            class: FQN of class implementing the FileSystem interface
-        -->
-
-        <FileSystem class="org.apache.jackrabbit.core.fs.mem.MemoryFileSystem">
-            <param name="path" value="${wsp.home}"/>
-        </FileSystem>
-        <!--
-            persistence manager of the workspace:
-            class: FQN of class implementing the PersistenceManager interface
-        -->
-        <PersistenceManager class="org.apache.jackrabbit.core.persistence.mem.InMemPersistenceManager">
-          <param name="persistent" value="false"/>
-        </PersistenceManager>
-        <!--
-            Search index and the file system it uses.
-            class: FQN of class implementing the QueryHandler interface
-        -->
-        <SearchIndex class="org.apache.jackrabbit.core.query.lucene.SearchIndex">
-            <param name="path" value="${wsp.home}/index"/>
-        </SearchIndex>
-    </Workspace>
-
-    <!--
-        Configures the versioning
-    -->
-    <Versioning rootPath="${rep.home}/version">
-        <!--
-            Configures the filesystem to use for versioning for the respective
-            persistence manager
-        -->
-        <FileSystem class="org.apache.jackrabbit.core.fs.mem.MemoryFileSystem">
-            <param name="path" value="${rep.home}/version" />
-        </FileSystem>
-
-        <!--
-            Configures the persistence manager to be used for persisting version state.
-            Please note that the current versioning implementation is based on
-            a 'normal' persistence manager, but this could change in future
-            implementations.
-        -->
-        <PersistenceManager class="org.apache.jackrabbit.core.persistence.mem.InMemPersistenceManager">
-          <param name="persistent" value="false"/>
-        </PersistenceManager>
-    </Versioning>
-
-    <!--
-        Search index for content that is shared repository wide
-        (/jcr:system tree, contains mainly versions)
-    -->
-    <SearchIndex class="org.apache.jackrabbit.core.query.lucene.SearchIndex">
-        <param name="path" value="${rep.home}/repository/index"/>
-    </SearchIndex>
-</Repository>

Modified: trunk/extensions/dna-sequencer-xml/src/test/resources/log4j.properties
===================================================================
--- trunk/extensions/dna-sequencer-xml/src/test/resources/log4j.properties	2009-06-04 22:31:30 UTC (rev 977)
+++ trunk/extensions/dna-sequencer-xml/src/test/resources/log4j.properties	2009-06-04 23:36:27 UTC (rev 978)
@@ -9,6 +9,3 @@
 
 # Set up the default logging to be INFO level, then override specific units
 log4j.logger.org.jboss.dna=INFO
-
-# Jackrabbit logging
-log4j.logger.org.apache.jackrabbit=WARN, stdout

Modified: trunk/extensions/dna-sequencer-xml/src/test/resources/master.xml
===================================================================
--- trunk/extensions/dna-sequencer-xml/src/test/resources/master.xml	2009-06-04 22:31:30 UTC (rev 977)
+++ trunk/extensions/dna-sequencer-xml/src/test/resources/master.xml	2009-06-04 23:36:27 UTC (rev 978)
@@ -675,1178 +675,4 @@
       </sect2>
     </sect1>
   </chapter>
-  <!--  ====================================================================================================
-                                                   Chapter 
-        ====================================================================================================   -->
-  <chapter id="downloading_and_running">
-    <title>Running the example application</title>
-    <para>
-      This chapter provides instructions for downloading and running a sample application that demonstrates how JBoss DNA works
-      with a JCR repository to automatically sequence changing content to extract useful information. So read on to get the simple
-      application running, and then in the
-      <link linkend="using_dna">next chapter</link>
-      we'll dive into the source code for the example and show how to use JBoss DNA in your own applications.
-    </para>
-    <para>JBoss DNA uses Maven 2 for its build system, as is 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>
-    <note>
-      <para>
-        To use Maven with JBoss DNA, you'll need to have
-        <ulink url="http://java.sun.com/javase/downloads/index_jdk5.jsp">JDK 5 or 6</ulink>
-        and Maven 2.0.7 (or higher).
-      </para>
-      <para>
-        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.7-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:
-        <programlisting role="XML" language="xml">&lt;settings&gt;
-  &lt;profiles&gt;
-    &lt;profile&gt;
-      &lt;id&gt;jboss.repository&lt;/id&gt;
-      &lt;activation&gt;
-        &lt;property&gt;          
-          &lt;name&gt;!jboss.repository.off&lt;/name&gt;
-        &lt;/property&gt;
-      &lt;/activation&gt;
-      &lt;repositories&gt;
-        &lt;repository&gt;
-          &lt;id&gt;snapshots.jboss.org&lt;/id&gt;
-          &lt;url&gt;http://snapshots.jboss.org/maven2&lt;/url&gt;
-          &lt;snapshots&gt;
-            &lt;enabled&gt;true&lt;/enabled&gt;
-          &lt;/snapshots&gt;
-        &lt;/repository&gt;
-        &lt;repository&gt;
-          &lt;id&gt;repository.jboss.org&lt;/id&gt;
-          &lt;url&gt;http://repository.jboss.org/maven2&lt;/url&gt;
-          &lt;snapshots&gt;
-            &lt;enabled&gt;false&lt;/enabled&gt;
-          &lt;/snapshots&gt;
-        &lt;/repository&gt;
-      &lt;/repositories&gt;
-      &lt;pluginRepositories&gt;
-        &lt;pluginRepository&gt;
-          &lt;id&gt;repository.jboss.org&lt;/id&gt;
-          &lt;url&gt;http://repository.jboss.org/maven2&lt;/url&gt;
-          &lt;snapshots&gt;
-            &lt;enabled&gt;false&lt;/enabled&gt;
-          &lt;/snapshots&gt;
-        &lt;/pluginRepository&gt;
-        &lt;pluginRepository&gt;
-          &lt;id&gt;snapshots.jboss.org&lt;/id&gt;
-          &lt;url&gt;http://snapshots.jboss.org/maven2&lt;/url&gt;
-          &lt;snapshots&gt;
-            &lt;enabled&gt;true&lt;/enabled&gt;
-          &lt;/snapshots&gt;
-        &lt;/pluginRepository&gt;
-      &lt;/pluginRepositories&gt;
-    &lt;/profile&gt;
-  &lt;/profiles&gt;
-&lt;/settings&gt;</programlisting>
-        This profile informs Maven of the two JBoss repositories (snapshots and releases) that contain 
-        all of the JARs for JBoss DNA and all dependent libraries.</para>
-      </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.1/jboss-dna-0.1-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:
-  <programlisting>
-examples/pom.xml
-         sequencers/pom.xml
-                   /src/main/assembly
-                            /config
-                            /java
-                            /resources
-                       /test/java
-                            /resources
-  </programlisting>
-      </para>
-      <para>There are essentially two Maven projects: a <code>sequencers</code> project and a parent project.  All of the source
-      for the example is located in the <code>sequencers</code> subdirectory.  And you may have noticed that none
-      of the JBoss DNA libraries are there.  This is where Maven comes in.  The two <code>pom.xml</code> files tell
-      Maven everything it needs to know about what libraries are required and how to build the example.</para>
-      <para>In a terminal, go to the <code>examples</code> directory and run <emphasis role="strong"><code>mvn install</code></emphasis>.  
-      This command downloads all of the JARs necessary to compile and build the example, including the JBoss DNA libraries,
-      the libraries they depend on, and any missing Maven components.  (These are downloaded from the JBoss repositories
-      only once and saved on your machine.  This means that the next time you run Maven, all the libraries will
-      already be available locally, and the build will run much faster.)  The command then continues by compiling the example's source
-      code (and unit tests) and running the unit tests.  The build is successful if you see the following:
-           <programlisting language="bash">$ mvn install
-...
-[INFO] ------------------------------------------------------------------------
-[INFO] Reactor Summary:
-[INFO] ------------------------------------------------------------------------
-[INFO] Getting Started examples .............................. SUCCESS [2.106s]
-[INFO] Sequencer Examples .................................... SUCCESS [9.768s]
-[INFO] ------------------------------------------------------------------------
-[INFO] ------------------------------------------------------------------------
-[INFO] BUILD SUCCESSFUL
-[INFO] ------------------------------------------------------------------------
-[INFO] Total time: 12 seconds
-[INFO] Finished at: Wed May 07 12:00:06 CDT 2008
-[INFO] Final Memory: 14M/28M
-[INFO] ------------------------------------------------------------------------
-$ </programlisting>
-      If there are errors, check whether you have the correct version of Maven installed and that you've correctly updated
-           your Maven settings as described above.</para>
-    <para>If you've successfully built the examples, there will be a <code>examples/sequencers/target/dna-example-sequencers-basic.dir/</code>
-    directory that contains the following:
-    <itemizedlist>
-  	<listitem>
-  	  <para><emphasis role="strong"><code>run.sh</code></emphasis> is the *nix shell script that will run the example.</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>jackrabbitConfig.xml</code>
-        </emphasis>
-        is the Jackrabbit configuration file, which is set up to use a transient in-memory repository.
-      </para>
-    </listitem>
-    <listitem>
-      <para>
-        <emphasis role="strong">
-          <code>jackrabbitNodeTypes.cnd</code>
-        </emphasis>
-        defines the additional JCR node types used by this example.
-      </para>
-    </listitem>
-    <listitem>
-      <para>
-        <emphasis role="strong">
-          <code>sample1.mp3</code>
-        </emphasis>
-        is a sample MP3 audio file you'll use later to upload into the repository.
-      </para>
-    </listitem>
-    <listitem>
-      <para>
-        <emphasis role="strong">
-          <code>caution.gif</code>
-        </emphasis>, <emphasis role="strong">
-          <code>caution.png</code>
-        </emphasis>, and <emphasis role="strong">
-          <code>caution.jpg</code>
-        </emphasis>
-        are images that you'll use later and upload into the repository.
-      </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 example.
-      </para>
-    </listitem>
-    </itemizedlist>
-    <note>
-      <para>JBoss DNA 0.1 and the examples are currently tested with <ulink url="http://jackrabbit.apache.org/">Apache Jackrabbit</ulink> version 1.3.3.  
-      This version is stable and used by a number of other projects and applications.  However, you should be able to use a newer
-      version of Jackrabbit, as long as that version uses the same JCR API.  For example, version 1.4.2 was released on March 26, 2008 and
-      should be compatible.
-      </para>
-      <para>Just remember, if the version of Jackrabbit you want to use for these examples is not in the Maven repository,
-      you'll have to either add it or add it locally.  For more information, see the <ulink url="http://maven.apache.org/">Maven documentation</ulink>.
-      </para>
-    </note>
-    </para>
-  </sect1>
-  <sect1 id="running">
-    <title>Running the example</title>
-    <para>This 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>
-    <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">
-        <title>Example Client</title>
-        <graphic align="center" scale="100" fileref="images/example-sequencer-cli-client.png" />
-      </figure>
-      From this menu, you can upload a file into the repository, search for media in the repository, print sequencing statistics,
-      or quit the application.
-    </para>
-    <para>
-      The first step is to upload one of the example images. If you type 'u' and press return, you'll be prompted to supply the
-      path to the file you want to upload. Since the application is running from within the
-      <code>examples/sequencers/target/dna-example-sequencers-basic.dir/
-      </code>
-      directory, you can specify any of the files in that directory without specifying the path:
-      <figure id="example-sequencer-upload">
-        <title>Uploading an image using the Example Client</title>
-        <graphic align="center" scale="100" fileref="images/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 and MP3 audio files and 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>
-      . Files with other extensions in the repository path will be ignored. For your convenience, the example provides several
-      files that will be sequenced (
-      <code>caution.png</code>
-      ,
-      <code>caution.jpg</code>
-      ,
-      <code>caution.gif</code>
-      , and
-      <code>sample1.mp3</code>
-      ) and one image that will not be sequenced (
-      <code>caution.pict</code>
-      ). Feel free to try other files.
-    </para>
-    <para>
-      After you have specified the file you want to upload, the example application asks you where in the repository you'd like to
-      place the file. (If you want to use the suggested location, just press
-      <code>return</code>
-      .) The client application uses the JCR API to upload the file to that location in the repository, creating any nodes (of
-      type
-      <code>nt:folder</code>
-      ) for any directories that don't exist, and creating a node (of type
-      <code>nt:file</code>
-      ) for the file. And, per the JCR specification, the application creates a
-      <code>jcr:content</code>
-      node (of type
-      <code>nt:resource</code>
-      ) under the file node. The file contents are placed on this
-      <code>jcr:content</code>
-      node in the
-      <code>jcr:data</code>
-      property. For example, if you specify
-      <code>/a/b/caution.png</code>
-      , the following structure will be created in the repository:<programlisting>
-    /a   (nt:folder)
-      /b   (nt:folder)
-        /caution.png   (nt:file)
-                    /jcr:content    (nt:resource)
-                                @jcr:data = {contents of the file}
-                                @jcr:mimeType = {mime type of the file}
-                                @jcr:lastModified = {now}
-    </programlisting>
-    Other kinds of files are treated in a similar way.
-    </para>
-  <para>
-    When the client uploads the file using the JCR API, DNA gets notified of the changes, consults the sequencers to see whether
-    any of them are interested in the new or updated content, and if so runs those sequencers. The image sequencer processes image
-    files for metadata, and any metadata found is stored under the
-    <code>/images</code>
-    branch of the repository. The MP3 sequencer processes MP3 audio files for metadata, and any metadata found is stored under the
-    <code>/mp3s</code>
-    branch of the repository.  All of this happens asynchronously, so any DNA activity doesn't impede or slow down the client
-    activities.
-  </para>
-  <para>
-    So, after the file is uploaded, you can search the repository for the image metadata using the "s" menu option:
-    <figure id="example-sequencer-search">
-      <title>Searching for media using the Example Client</title>
-      <graphic align="center" scale="100" fileref="images/example-sequencer-search.png" />
-    </figure>
-    Here are the search results after the <code>sample1.mp3</code> audio file has been uploaded (to the <code>/a/b/sample1.mp3</code> location):
-    <figure id="example-sequencer-search-with-mp3">
-      <title>Searching for media using the Example Client</title>
-      <graphic align="center" scale="100" fileref="images/example-sequencer-search-with-mp3.png" />
-    </figure>
-    You can also display the sequencing statistics using the "d" menu option:
-    <figure id="example-sequencer-statistics">
-      <title>Sequencing statistics using the Example Client</title>
-      <graphic align="center" scale="100" fileref="images/example-sequencer-statistics.png" />
-    </figure>
-    These stats show how many nodes were sequenced, and how many nodes were skipped because they didn't apply to the sequencer's
-    criteria.
-  </para>
-  <note>
-    <para>
-      There will probably be more nodes skipped than sequenced, since there are more
-      <code>nt:folder</code>
-      and
-      <code>nt:resource</code>
-      nodes than there are
-      <code>nt:file</code>
-      nodes with acceptable names.
-    </para>
-  </note>
-  <para>You can repeat this process with other files. Any file that isn't an image or MP3 files (as recognized by the sequencing configurations
-    that we'll describe later) will not be sequenced.</para>
-  </sect1>
-  <sect1 id="downloading_and_running_review">
-    <title>Summarizing what we just did</title>
-    <para>In this chapter you downloaded and installed the example application and used it to upload files into a
-    JCR repository.  JBoss DNA automatically sequenced the image and/or MP3 files you uploaded, extracted the metadata from the
-    files, and stored that metadata inside the repository.  The application allowed you to see this metadata
-    and the sequencing statistics.</para>
-    <para>This application was very simplistic.  In fact, running through the example probably only took you a minute or two.
-    So while this application won't win any awards, it does show the basics of what JBoss DNA can do.</para>
-    <para>In the <link linkend="using_dna">next chapter</link> we'll venture into the code to get an understanding
-    of how JBoss DNA actually works and how you can use it in your own applications.</para>
-  </sect1>
-  </chapter>
-  
-  <!--  ====================================================================================================
-                                                   Chapter 
-        ====================================================================================================   -->
-<chapter id="using_dna">
-  <title>Using JBoss DNA</title>
-  <para>As we've mentioned before, JBoss DNA is able to work with existing JCR repositories.  Your client applications
-  make changes to the information in those repositories, and JBoss DNA automatically uses its sequencers to extract
-  additional information from the uploaded files.</para>
-  <note>
-    <para>Configuring JBoss DNA sequencers is a bit more manual than is ideal. As you'll see, JBoss DNA uses dependency
-      injection to allow a great deal of flexibility in how it can be configured and customized. However, the next release will
-      provide a much easier mechanism for configuring not only the sequencer service but also the upcoming federation engine and
-      JCR implementation.</para>
-  </note>
-  <sect1 id="sequencing_service">
-    <title>Configuring the Sequencing Service</title>
-    <para>
-      The JBoss DNA <emphasis>sequencing service</emphasis> is the component that manages the <emphasis>sequencers</emphasis>
-      , reacting to changes in JCR repositories and then running the appropriate sequencers.
-      This involves processing the changes on a node, determining which (if any) sequencers should be run on that node,
-      and for each sequencer constructing the execution environment, calling the sequencer, and saving the information
-      generated by the sequencer.</para>
-    <para>To set up the sequencing service, an instance is created, and dependent components are injected into
-      the object.  This includes among other things:
-      <itemizedlist>
-        <listitem>
-          <para>An <emphasis>execution context</emphasis> that defines the context in which the service runs, including
-        a factory for JCR sessions given names of the repository and workspace.  This factory must be configured,
-        and is how JBoss DNA knows about your JCR repositories and how to connect to them.  More on this a bit later.</para>
-        </listitem>
-        <listitem>
-          <para>An optional <emphasis>factory for class loaders</emphasis> used to load sequencers.  If no factory is supplied,
-        the service uses the current thread's context class loader (or if that is null, the class loader that loaded the
-        sequencing service class).</para>
-        </listitem>
-        <listitem>
-          <para>An <code>java.util.concurrent.ExecutorService</code> used to execute the sequencing activites.  If none
-        is supplied, a new single-threaded executor is created by calling <code>Executors.newSingleThreadExecutor()</code>.
-        (This can easily be changed by subclassing and overriding the <code>SequencerService.createDefaultExecutorService()</code> method.)</para>
-        </listitem>
-        <listitem>
-          <para>Filters for sequencers and events.  By default, all sequencers are considered for "node added", "property added"
-        and "property changed" events.</para>
-        </listitem>
-      </itemizedlist>
-      </para>
-      <para>As mentioned above, the <code>ExecutionContext</code> provides access to a <code>SessionFactory</code> that is used
-      by JBoss DNA to establish sessions to your JCR repositories.  Two implementations are available:
-      <itemizedlist>
-        <listitem>
-          <para>The <code>JndiSessionFactory</code> looks up JCR <code>Repository</code> instances in JNDI using
-          names that are supplied when creating sessions.  This implementation also has methods to set the
-          JCR <code>Credentials</code> for a given workspace name.</para>
-        </listitem>
-        <listitem>
-          <para>The <code>SimpleSessionFactory</code> has methods to register the JCR <code>Repository</code> instances
-          with names, as well as methods to set the JCR <code>Credentials</code> for a given workspace name.</para>
-        </listitem>
-      </itemizedlist>
-      You can use the <code>SimpleExecutionContext</code> implementation of <code>ExecutionContext</code> and supply
-      a <code>SessionFactory</code> instance, or you can provide your own implementation.
-      </para>
-      <para>Here's an example of how to instantiate and configure the SequencingService:
-      <programlisting>
-SimpleSessionFactory sessionFactory = new SimpleSessionFactory();
-sessionFactory.registerRepository("Main Repository", this.repository);
-Credentials credentials = new SimpleCredentials("jsmith", "secret".toCharArray());
-sessionFactory.registerCredentials("Main Repository/Workspace1", credentials);
-ExecutionContext executionContext = new SimpleExecutionContext(sessionFactory);
-
-// Create the sequencing service, passing in the execution context ...
-SequencingService sequencingService = new SequencingService();
-sequencingService.setExecutionContext(executionContext);</programlisting>
-      </para>
-      <para>After the sequencing service is created and configured, it must be started.  The SequencingService
-      has an <emphasis>administration object</emphasis> (that is an instance of <code>ServiceAdministrator</code>)
-      with <code>start()</code>, <code>pause()</code>, and <code>shutdown()</code> methods.  The latter method will 
-      close the queue for sequencing, but will allow sequencing operations already running to complete normally.
-      To wait until all sequencing operations have completed, simply call the <code>awaitTermination</code> method
-      and pass it the maximum amount of time you want to wait.</para>
-      <para>
-      <programlisting>
-sequencingService.getAdministrator().start();</programlisting>
-      </para>
-      <para>The sequencing service must also be configured with the sequencers that it will use.  This is done using the
-      <code>addSequencer(SequencerConfig)</code> method and passing a <code>SequencerConfig</code> instance that
-      you create.  Here's an example:
-      <programlisting>
-String name = "Image Sequencer";
-String desc = "Sequences image files to extract the characteristics of the image";
-String classname = "org.jboss.dna.sequencer.images.ImageMetadataSequencer";
-String[] classpath = null; // Use the current classpath
-String[] pathExpressions = {"//(*.(jpg|jpeg|gif|bmp|pcx|png))[*]/jcr:content[@jcr:data] => /images/$1"};
-SequencerConfig imageSequencerConfig = new SequencerConfig(name, desc, classname, classpath, pathExpressions);
-sequencingService.addSequencer(imageSequencerConfig);
-
-name = "Mp3 Sequencer";
-desc = "Sequences mp3 files to extract the id3 tags of the audio file";
-classname = "org.jboss.dna.sequencer.mp3.Mp3MetadataSequencer";
-String[] mp3PathExpressions = {"//(*.mp3)[*]/jcr:content[@jcr:data] => /mp3s/$1"};
-SequencerConfig mp3SequencerConfig = new SequencerConfig(name, desc, classname, classpath, mp3PathExpressions);
-sequencingService.addSequencer(mp3SequencerConfig);</programlisting>
-      This is pretty self-explanatory, except for the <code>classpath</code> and <code>pathExpression</code> parameters.
-      The classpath parameter defines the classpath that is passed to the class loader factory mentioned above.
-      Our sequencer is on the classpath, so we can simply use <code>null</code> here.
-      </para>
-      <para>The path expression is more complicated.  Sequencer path expressions are used by the sequencing service to
-      determine whether a particular changed node should be sequenced.  The expressions consist of two parts: a selection
-      criteria and an output expression.  Here's a simple example:
-      <programlisting>
-/a/b/c at title =&gt; /d/e/f</programlisting>
-      Here, the <code>/a/b/c at title</code> is the selection criteria that applies when the <code>/a/b/c</code> node has a <code>title</code> property
-      that is added or changed.  When the selection criteria matches a change event, the sequencer will be run
-      and any generated output will be inserted into the repository described by the output expression.  In this example,
-      the generated output would be placed at the <code>/d/e/f</code> node.
-      </para>
-      <note>
-        <para>Sequencer path expressions can be fairly complex and may use wildcards, specificy same-name sibling indexes,
-        provide optional and choice elements, and may capture parts of the selection criteria for use in the output expression.
-        The path expression used in the image sequencer configuration example above shows a more complex example:
-        <programlisting>
-//(*.(jpg|jpeg|gif|bmp|pcx|png))[*]/jcr:content[@jcr:data] => /images/$1</programlisting>
-        This uses "//" to select any node at any level in the repository whose name ends with "." and one of the extensions (e.g., ".jpg", ".jpeg", etc.)
-        and that has a child node named "jcr:content" that has a "jcr:data" property.  It also selects the file name
-        as the first capture group (the first set of parentheses) for use in the output expression.
-        In this example, any sequencer output is placed on a node with that same file name under the "/images" node.
-        </para>
-        <para></para>
-        <para>Other things are possible, too.  For example, the name of the repository/workspace (as used by the <code>SessionFactory</code>)
-        may be specified at the beginning of the select criteria and/or the output expression.  This means it's possible to place
-        the sequencer output in a different repository than the node being sequenced.</para>
-        <para>For more detail about sequencer path expressions, see the <code>org.jboss.dna.repository.sequencer.SequencerPathExpression</code>
-        class and the corresponding <code>org.jboss.dna.repository.sequencer.SequencerPathExpressionTest</code> test case.</para>
-      </note>
-      <para>After the service is started, it is ready to start reacting to changes in the repository.  But it first
-      must be wired to the repositories using a listener.  This is accomplished using the <code>ObservationService</code>
-      described in the <link linkend="observation_service">next section</link>.</para>
-  </sect1>
-  <sect1 id="observation_service">
-    <title>Configuring the Observation Service</title>
-    <para>The JBoss DNA <code>ObservationService</code> is responsible for listening to one or more JCR repositories
-    and multiplexing the events to its listeners.  Unlike JCR events, this framework embeds in the events the
-    name of the repository and workspace that can be passed to a <code>SessionFactory</code> to obtain a session
-    to the repository in which the change occurred.  This simple design makes it very easy for JBoss DNA to
-    concurrently work with multiple JCR repositories.</para>
-    <para>Configuring an observation service is pretty easy, especially if you reuse the same <code>SessionFactory</code>
-    supplied to the sequencing service.  Here's an example:
-    <programlisting>
-this.observationService = new ObservationService(sessionFactory);
-this.observationService.getAdministrator().start();</programlisting>
-    </para> 
-    <note>
-    <para>Both <code>ObservationService</code> and <code>SequencingService</code> implement
-    <code>AdministeredService</code>, which has a <code>ServiceAdministrator</code> used to start, pause, and shutdown the
-    service.  In other words, the lifecycle of the services are managed in the same way.</para>
-    </note>
-    <para>
-    After the observation service is started, listeners can be added.  The <code>SequencingService</code> implements the required
-    interface, and so it may be registered directly:
-    <programlisting>
-observationService.addListener(sequencingService);</programlisting>
-    </para>
-    <para>Finally, the observation service must be wired to monitor one of your JCR repositories.  This is done with
-    one of the <code>monitor(...)</code> methods:
-    <programlisting>
-int eventTypes = Event.NODE_ADDED | Event.PROPERTY_ADDED | Event.PROPERTY_CHANGED;
-observationService.monitor("Main Repository/Workspace1", eventTypes);</programlisting>
-    </para>
-    <para>At this point, the observation service is listening to a JCR repository and forwarding the appropriate events
-    to the sequencing service, which will asynchronously process the changes and sequence the information added to or changed in the repository.
-    </para>
-  </sect1>
-  <sect1 id="shutting_down">
-    <title>Shutting down JBoss DNA services</title>
-    <para>The JBoss DNA services are utilizing resources and threads that must be released before your application is ready to shut down.
-    The safe way to do this is to simply obtain the <code>ServiceAdministrator</code> for each service (via the <code>getServiceAdministrator()</code> method)
-    and call <code>shutdown()</code>.  As previously mentioned, the shutdown method will simply prevent new work from being processed
-    and will not wait for existing work to be completed.  If you want to wait until the service completes all its work, you must wait
-    until the service terminates.  Here's an example that shows how this is done:
-    <programlisting>
-// Shut down the service and wait until it's all shut down ...
-sequencingService.getAdministrator().shutdown();
-sequencingService.getAdministrator().awaitTermination(5, TimeUnit.SECONDS);
-
-// Shut down the observation service ...
-observationService.getAdministrator().shutdown();
-observationService.getAdministrator().awaitTermination(5, TimeUnit.SECONDS);</programlisting>
-    </para>
-    <para>At this point, we've covered how to configure and use the JBoss DNA services in your application.
-    The next chapter goes back to the <link linkend="downloading_and_running">sample application</link> to show how all these pieces fit together.</para>
-  </sect1>
-  <sect1 id="example_application_review">
-    <title>Reviewing the example application</title>
-    <para>Recall that the example application 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 an image sequencer 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.  Or, if the client uploads
-      MP3 audio files, the title, author, album, year, and comment are extracted from the audio file and stored in the repository.</para>
-    <para>
-      The example is comprised of 3 classes and 1 interface, located in the
-      <code>src/main/java</code>
-      directory:
-      <programlisting>
-  org/jboss/example/dna/sequencers/ConsoleInput.java
-                                  /MediaInfo.java
-                                  /SequencingClient.java
-                                  /UserInterface.java</programlisting>
-    </para>
-    <para>
-      <code>SequencingClient</code>
-      is the class that contains the main application.
-      <code>MediaInfo</code>
-      is a simple Java object that encapsulates metadata about a media file (as generated by the sequencer), and used by the client to
-      pass information to the
-      <code>UserInterface</code>
-      , which 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
-      <code>UserInterface</code>
-      at a later date. 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 automatically using conventional JUnit test cases, as demonstrated by the
-      code in the
-      <code>src/test/java</code>
-      directory:
-      <programlisting>
-  org/jboss/example/dna/sequencers/SequencingClientTest.java
-                                  /MockUserInterface.java</programlisting>
-    </para>
-    <para>
-      If we look at the
-      <code>SequencingClient</code>
-      code, there are a handful of methods that encapsulate the various activities.
-    </para>
-    <note>
-      <para>To keep the code shown in this book as readable as possible, some of the comments and error handling
-      have been removed.</para>
-    </note>
-    <para>
-      The
-      <code>startRepository()</code>
-      method starts up an in-memory Jackrabbit JCR repository. The bulk of this method is simply gathering and passing the
-      information required by Jackrabbit. Because Jackrabbit's
-      <code>TransientRepository</code>
-      implementation shuts down after the last session is closed, the application maintains a session to ensure that the
-      repository remains open throughout the application's lifetime. And finally, the node type needed by the image sequencer is
-      registered with Jackrabbit.
-    </para>
-    <programlisting>
-public void startRepository() throws Exception {
-    if (this.repository == null) {
-        try {
-
-            // Load the Jackrabbit configuration ...
-            File configFile = new File(this.jackrabbitConfigPath);
-            String pathToConfig = configFile.getAbsolutePath();
-
-            // Find the directory where the Jackrabbit repository data will be stored ...
-            File workingDirectory = new File(this.workingDirectory);
-            String workingDirectoryPath = workingDirectory.getAbsolutePath();
-
-            // Get the Jackrabbit custom node definition (CND) file ...
-            URL cndFile = Thread.currentThread().getContextClassLoader().getResource("jackrabbitNodeTypes.cnd");
-
-            // Create the Jackrabbit repository instance and establish a session to keep the repository alive ...
-            this.repository = new TransientRepository(pathToConfig, workingDirectoryPath);
-            if (this.username != null) {
-                Credentials credentials = new SimpleCredentials(this.username, this.password);
-                this.keepAliveSession = this.repository.login(credentials, this.workspaceName);
-            } else {
-                this.keepAliveSession = this.repository.login();
-            }
-
-            try {
-                // Register the node types (only valid the first time) ...
-                JackrabbitNodeTypeManager mgr = (JackrabbitNodeTypeManager)this.keepAliveSession.getWorkspace().getNodeTypeManager();
-                mgr.registerNodeTypes(cndFile.openStream(), JackrabbitNodeTypeManager.TEXT_X_JCR_CND);
-            } catch (RepositoryException e) {
-                if (!e.getMessage().contains("already exists")) throw e;
-            }
-
-        } catch (Exception e) {
-            this.repository = null;
-            this.keepAliveSession = null;
-            throw e;
-        }
-    }
-}</programlisting>
-    <para>As you can see, this method really has nothing to do with JBoss DNA, other than setting up a JCR repository that JBoss
-      DNA will use.</para>
-    <para>
-      The
-      <code>shutdownRepository()</code>
-      method shuts down the Jackrabbit transient repository by closing the "keep-alive session". Again, this method really does
-      nothing specifically with JBoss DNA, but is needed to manage the JCR repository that JBoss DNA uses.
-      <programlisting>
-public void shutdownRepository() throws Exception {
-    if (this.repository != null) {
-        try {
-            this.keepAliveSession.logout();
-        } finally {
-            this.repository = null;
-            this.keepAliveSession = null;
-        }
-    }
-}</programlisting>
-    </para>
-    <para>
-      The
-      <code>startDnaServices()</code>
-      method first starts the JCR repository (if it was not already started), and proceeds to create and configure the
-      <code>SequencingService</code>
-      as described
-      <link linkend="sequencing_service">earlier</link>
-      . This involes setting up the
-      <code>SessionFactory</code>
-      and
-      <code>ExecutionContext</code>
-      , creating the
-      <code>SequencingService</code>
-      instance, and configuring the image sequencer. The method then continues by setting up the
-      <code>ObservationService</code>
-      as described
-      <link linkend="observation_service">earlier</link>
-      and starting the service.
-      <programlisting>
-public void startDnaServices() throws Exception {
-    if (this.repository == null) this.startRepository();
-    if (this.sequencingService == null) {
-
-        SimpleSessionFactory sessionFactory = new SimpleSessionFactory();
-        sessionFactory.registerRepository(this.repositoryName, this.repository);
-        if (this.username != null) {
-            Credentials credentials = new SimpleCredentials(this.username, this.password);
-            sessionFactory.registerCredentials(this.repositoryName + "/" + this.workspaceName, credentials);
-        }
-        this.executionContext = new SimpleExecutionContext(sessionFactory);
-
-        // Create the sequencing service, passing in the execution context ...
-        this.sequencingService = new SequencingService();
-        this.sequencingService.setExecutionContext(executionContext);
-
-        // Configure the sequencers.
-        String name = "Image Sequencer";
-        String desc = "Sequences image files to extract the characteristics of the image";
-        String classname = "org.jboss.dna.sequencer.images.ImageMetadataSequencer";
-        String[] classpath = null; // Use the current classpath
-        String[] pathExpressions = {"//(*.(jpg|jpeg|gif|bmp|pcx|png|iff|ras|pbm|pgm|ppm|psd))[*]/jcr:content[@jcr:data] => /images/$1"};
-        SequencerConfig imageSequencerConfig = new SequencerConfig(name, desc, classname, classpath, pathExpressions);
-        this.sequencingService.addSequencer(imageSequencerConfig);
-
-        // Set up the MP3 sequencer ...
-        name = "Mp3 Sequencer";
-        desc = "Sequences mp3 files to extract the id3 tags of the audio file";
-        classname = "org.jboss.dna.sequencer.mp3.Mp3MetadataSequencer";
-        String[] mp3PathExpressions = {"//(*.mp3)[*]/jcr:content[@jcr:data] => /mp3s/$1"};
-        SequencerConfig mp3SequencerConfig = new SequencerConfig(name, desc, classname, classpath, mp3PathExpressions);
-        this.sequencingService.addSequencer(mp3SequencerConfig);
-
-        // Use the DNA observation service to listen to the JCR repository (or multiple ones), and
-        // then register the sequencing service as a listener to this observation service...
-        this.observationService = new ObservationService(this.executionContext.getSessionFactory());
-        this.observationService.getAdministrator().start();
-        this.observationService.addListener(this.sequencingService);
-        this.observationService.monitor(this.repositoryName + "/" + this.workspaceName, Event.NODE_ADDED | Event.PROPERTY_ADDED | Event.PROPERTY_CHANGED);
-    }
-    // Start up the sequencing service ...
-    this.sequencingService.getAdministrator().start();
-}</programlisting>
-    </para>
-    <para>
-      The
-      <code>shutdownDnaServices()</code>
-      method is pretty straightforward: it just calls shutdown on each of the services and waits until they terminate.
-      <programlisting>
-public void shutdownDnaServices() throws Exception {
-    if (this.sequencingService == null) return;
-
-    // Shut down the service and wait until it's all shut down ...
-    this.sequencingService.getAdministrator().shutdown();
-    this.sequencingService.getAdministrator().awaitTermination(5, TimeUnit.SECONDS);
-
-    // Shut down the observation service ...
-    this.observationService.getAdministrator().shutdown();
-    this.observationService.getAdministrator().awaitTermination(5, TimeUnit.SECONDS);
-}</programlisting>
-    </para>
-    <para>None of the other methods really do anything with JBoss DNA <emphasis>per se</emphasis>. Instead, they merely work with the repository
-      using the JCR API.</para>
-    <para>
-      The <code>main</code> method of the <code>SequencingClient</code> class creates a <code>SequencingClient</code> instance,
-      and passes a new <code>ConsoleInput</code> instance:
-      <programlisting>
-public static void main( String[] args ) throws Exception {
-    SequencingClient client = new SequencingClient();
-    client.setRepositoryInformation("repo", "default", "jsmith", "secret".toCharArray());
-    client.setUserInterface(new ConsoleInput(client));
-}</programlisting>
-      </para>
-      <para>If we look at the
-      <code>ConsoleInput</code>
-      constructor, it starts the repository, the DNA services, and a thread for the user interface. At this point, the constructor
-      returns, but the main application continues under the user interface thread.  When the user requests to quit,
-      the user interface thread also shuts down the DNA services and JCR repository.
-      <programlisting>
-public ConsoleInput( SequencerClient client ) {
-  try {
-      client.startRepository();
-      client.startDnaServices();
-  
-      System.out.println(getMenu());
-      Thread eventThread = new Thread(new Runnable() {
-          private boolean quit = false;
-          public void run() {
-              try {
-                  while (!quit) {
-                      // Display the prompt and process the requested operation ...
-                  }
-              } finally {
-                  try {
-                      // Terminate ...
-                      client.shutdownDnaServices();
-                      client.shutdownRepository();
-                  } catch (Exception err) {
-                      System.out.println("Error shutting down sequencing service and repository: " + err.getLocalizedMessage());
-                      err.printStackTrace(System.err);
-                  }
-              }
-          }
-      });
-      eventThread.start();
-  } catch (Exception err) {
-      System.out.println("Error: " + err.getLocalizedMessage());
-      err.printStackTrace(System.err);
-  }
-}</programlisting>
-    </para>
-    <para>At this point, we've reviewed all of the interesting code in the example application.  However, feel free
-    to play with the application, trying different things.
-    </para>
-  </sect1>
-  <sect1 id="using_dna_review">
-    <title>Summarizing what we just did</title>
-    <para>In this chapter we covered the different JBoss DNA components and how they can be used in your application.
-      Specifically, we described how the <code>SequencingService</code> and <code>ObservationService</code> can 
-      be configured and used.  And we ended the chapter by reviewing the example application, which not only uses
-      JBoss DNA, but also the repository via the JCR API.
-    </para>
-  </sect1>
-</chapter>
-  
-<!--  ====================================================================================================
-                                               Chapter 
-      ====================================================================================================   -->
-<chapter id="custom_sequencers">
-  <title>Creating custom sequencers</title>
-  <para>The current release of JBoss DNA comes with two sequencers: one that extracts metadata from a variety of image file formats,
-  and another that extracts some of the ID3 metadata from MP3 audio files.  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>
-  Creating a custom sequencer involves the following steps:
-  <itemizedlist>
-    <listitem>
-      <para>Create a Maven 2 project for your sequencer;</para>
-    </listitem>
-    <listitem>
-      <para>Implement the <code>org.jboss.dna.graph.sequencer.StreamSequencer</code> interface with your own implementation, and create unit tests to verify
-      the functionality and expected behavior;</para>
-    </listitem>
-    <listitem>
-      <para>Add the sequencer configuration to the JBoss DNA <code>SequencingService</code> in your application
-      as described in the <link linkend="using_dna">previous chapter</link>; and</para>
-    </listitem>
-    <listitem>
-      <para>Deploy the JAR file with your implementation (as well as any dependencies), and make them available to JBoss DNA
-      in your application.</para>
-    </listitem>
-  </itemizedlist>
-  It's that simple.
-  </para>
-  <sect1 id="custom_sequencer_project">
-    <title>Creating the Maven 2 project</title>
-    <para>The first step is to create the Maven 2 project that you can use to compile your code and build the JARs.
-    Maven 2 automates a lot of the work, and since you're already <link linkend="downloading_and_running">set up to use Maven</link>,
-    using Maven for your project will save you a lot of time and effort.  Of course, you don't have to use Maven 2, but then you'll
-    have to get the required libraries and manage the compiling and building process yourself.</para>
-    <note>
-      <para>JBoss DNA may provide in the future a Maven archetype for creating sequencer projects.  If you'd find this useful
-        and would like to help create it, please <link linkend="preface">join the community</link>.</para>
-    </note>
-  <note>
-    <para>The <code>dna-sequencer-images</code> project is a small, self-contained sequencer implementation that
-    has only the minimal dependencies.  Starting with this project's source and modifying it to suit your needs may be the easiest way to get started.
-    See the subversion repository: <ulink url="http://anonsvn.jboss.org/repos/dna/trunk/sequencers/dna-sequencer-images/">http://anonsvn.jboss.org/repos/dna/trunk/sequencers/dna-sequencer-images/</ulink>
-    </para>
-  </note>
-    <para>You can create your Maven project any way you'd like.  For examples, see the <ulink url="http://maven.apache.org/guides/getting-started/index.html#How_do_I_make_my_first_Maven_project">Maven 2 documentation</ulink>.  
-    Once you've done that, just add the dependencies in your project's <code>pom.xml</code> dependencies section:
-  <programlisting>
-&lt;dependency&gt;
-  &lt;groupId&gt;org.jboss.dna&lt;/groupId&gt;
-  &lt;artifactId&gt;dna-graph&lt;/artifactId&gt;
-  &lt;version&gt;0.5&lt;/version&gt;
-&lt;/dependency&gt;
-&lt;dependency&gt;
-  &lt;groupId&gt;org.slf4j&lt;/groupId&gt;
-  &lt;artifactId&gt;slf4j-api&lt;/artifactId&gt;
-&lt;/dependency&gt;
-</programlisting>
-  These are minimum dependencies required for compiling a sequencer.  Of course, you'll have to add
-  other dependencies that your sequencer needs.</para>
-  <para>As for testing, you probably will want to add more dependencies, such as those listed here:
-<programlisting>
-&lt;dependency&gt;
-  &lt;groupId&gt;junit&lt;/groupId&gt;
-  &lt;artifactId&gt;junit&lt;/artifactId&gt;
-  &lt;version&gt;4.4&lt;/version&gt;
-  &lt;scope&gt;test&lt;/scope&gt;
-&lt;/dependency&gt;
-&lt;dependency&gt;
-  &lt;groupId&gt;org.hamcrest&lt;/groupId&gt;
-  &lt;artifactId&gt;hamcrest-library&lt;/artifactId&gt;
-  &lt;version&gt;1.1&lt;/version&gt;
-  &lt;scope&gt;test&lt;/scope&gt;
-&lt;/dependency&gt;
-&lt;!-- Logging with Log4J --&gt;
-&lt;dependency&gt;
-  &lt;groupId&gt;org.slf4j&lt;/groupId&gt;
-  &lt;artifactId&gt;slf4j-log4j12&lt;/artifactId&gt;
-  &lt;version&gt;1.4.3&lt;/version&gt;
-  &lt;scope&gt;test&lt;/scope&gt;
-&lt;/dependency&gt;
-&lt;dependency&gt;
-  &lt;groupId&gt;log4j&lt;/groupId&gt;
-  &lt;artifactId&gt;log4j&lt;/artifactId&gt;
-  &lt;version&gt;1.2.14&lt;/version&gt;
-  &lt;scope&gt;test&lt;/scope&gt;
-&lt;/dependency&gt;
-</programlisting>
-  Testing JBoss DNA sequencers does not require a JCR repository or the JBoss DNA services.  (For more detail,
-  see the <link linkend="testing_custom_sequencers">testing section</link>.)  However, if you want to do
-  integration testing with a JCR repository and the JBoss DNA services, you'll need additional dependencies for these libraries.
-<programlisting>
-&lt;dependency&gt;
-  &lt;groupId&gt;org.jboss.dna&lt;/groupId&gt;
-  &lt;artifactId&gt;dna-jcr&lt;/artifactId&gt;
-  &lt;version&gt;0.5&lt;/version&gt;
-  &lt;scope&gt;test&lt;/scope&gt;
-&lt;/dependency&gt;
-&lt;!-- Java Content Repository API --&gt;
-&lt;dependency&gt;
-  &lt;groupId&gt;javax.jcr&lt;/groupId&gt;
-  &lt;artifactId&gt;jcr&lt;/artifactId&gt;
-  &lt;version&gt;1.0.1&lt;/version&gt;
-  &lt;scope&gt;test&lt;/scope&gt;
-&lt;/dependency&gt;
-</programlisting>
-  </para>
-  <para>At this point, your project should be set up correctly, and you're ready to move on to 
-  <link linkend="custom_sequencer_implementation">writing the Java implementation</link> for your sequencer.
-  </para>
-  </sect1>
-  <sect1 id="custom_sequencer_implementation">
-    <title>Implementing the StreamSequencer interface</title>
-    <para>After creating the project and setting up the dependencies, the next step is to create a Java class that implements
-    the <code>org.jboss.dna.graph.sequencer.StreamSequencer</code> interface.  This interface is very straightforward
-    and involves a single method:
-    <programlisting>
-public interface StreamSequencer {
-
-    /**
-     * Sequence the data found in the supplied stream, placing the output 
-     * information into the supplied map.
-     *
-     * @param stream the stream with the data to be sequenced; never null
-     * @param output the output from the sequencing operation; never null
-     * @param progressMonitor the progress monitor that should be kept 
-     *   updated with the sequencer's progress and that should be
-     *   frequently consulted as to whether this operation has been cancelled.
-     */
-    void sequence( InputStream stream, SequencerOutput output, 
-                   ProgressMonitor progressMonitor );</programlisting>
-    </para>
-    <para>The job of a stream sequencer is to process the data in the supplied stream, and place into the <code>SequencerOutput</code> 
-    any information that is to go into the JCR repository.  JBoss DNA figures out when your sequencer should be called
-    (of course, using the sequencing configuration you'll add in a bit), and then makes sure the generated information
-    is saved in the correct place in the repository.  
-    </para>
-    <para>The <code>SequencerOutput</code> class is fairly easy to use.  There are basically two methods you need to call.
-    One method sets the property values, while the other sets references to other nodes in the repository.  Use these
-    methods to describe the properties of the nodes you want to create, using relative paths for the nodes and
-    valid JCR property names for properties and references.  JBoss DNA will ensure that nodes are created or updated
-    whenever they're needed.
-    <programlisting>
-public interface SequencerOutput {
-
-  /**
-   * Set the supplied property on the supplied node.  The allowable
-   * values are any of the following:
-   *   - primitives (which will be autoboxed)
-   *   - String instances
-   *   - String arrays
-   *   - byte arrays
-   *   - InputStream instances
-   *   - Calendar instances
-   *
-   * @param nodePath the path to the node containing the property; 
-   * may not be null
-   * @param property the name of the property to be set
-   * @param values the value(s) for the property; may be empty if 
-   * any existing property is to be removed
-   */
-  void setProperty( String nodePath, String property,
-                    Object... values );
-
-  /**
-   * Set the supplied reference on the supplied node.
-   *
-   * @param nodePath the path to the node containing the property; 
-   * may not be null
-   * @param property the name of the property to be set
-   * @param paths the paths to the referenced property, which may be
-   * absolute paths or relative to the sequencer output node;
-   * may be empty if any existing property is to be removed
-   */
-  void setReference( String nodePath, String property,
-                     String... paths );
-}</programlisting>
-    </para>
-      <para>JBoss DNA will create nodes of type <code>nt:unstructured</code> unless you specify the value for the
-      <code>jcr:primaryType</code> property.  You can also specify the values for the <code>jcr:mixinTypes</code> property
-      if you want to add mixins to any node.
-      </para>
-    <para>For a complete example of a sequencer, let's look at the <code>org.jboss.dna.sequencers.image.ImageMetadataSequencer</code> implementation:
-    <programlisting>
-public class ImageMetadataSequencer implements StreamSequencer {
-
-    public static final String METADATA_NODE = "image:metadata";
-    public static final String IMAGE_PRIMARY_TYPE = "jcr:primaryType";
-    public static final String IMAGE_MIXINS = "jcr:mixinTypes";
-    public static final String IMAGE_MIME_TYPE = "jcr:mimeType";
-    public static final String IMAGE_ENCODING = "jcr:encoding";
-    public static final String IMAGE_FORMAT_NAME = "image:formatName";
-    public static final String IMAGE_WIDTH = "image:width";
-    public static final String IMAGE_HEIGHT = "image:height";
-    public static final String IMAGE_BITS_PER_PIXEL = "image:bitsPerPixel";
-    public static final String IMAGE_PROGRESSIVE = "image:progressive";
-    public static final String IMAGE_NUMBER_OF_IMAGES = "image:numberOfImages";
-    public static final String IMAGE_PHYSICAL_WIDTH_DPI = "image:physicalWidthDpi";
-    public static final String IMAGE_PHYSICAL_HEIGHT_DPI = "image:physicalHeightDpi";
-    public static final String IMAGE_PHYSICAL_WIDTH_INCHES = "image:physicalWidthInches";
-    public static final String IMAGE_PHYSICAL_HEIGHT_INCHES = "image:physicalHeightInches";
-
-    /**
-     * {@inheritDoc}
-     */
-    public void sequence( InputStream stream, SequencerOutput output, 
-                          ProgressMonitor progressMonitor ) {
-        progressMonitor.beginTask(10, ImageSequencerI18n.sequencerTaskName);
-
-        ImageMetadata metadata = new ImageMetadata();
-        metadata.setInput(stream);
-        metadata.setDetermineImageNumber(true);
-        metadata.setCollectComments(true);
-
-        // Process the image stream and extract the metadata ...
-        if (!metadata.check()) {
-            metadata = null;
-        }
-        progressMonitor.worked(5);
-        if (progressMonitor.isCancelled()) return;
-
-        // Generate the output graph if we found useful metadata ...
-        if (metadata != null) {
-            // Place the image metadata into the output map ...
-            output.setProperty(METADATA_NODE, IMAGE_PRIMARY_TYPE, "image:metadata");
-            // output.psetProperty(METADATA_NODE, IMAGE_MIXINS, "");
-            output.setProperty(METADATA_NODE, IMAGE_MIME_TYPE, metadata.getMimeType());
-            // output.setProperty(METADATA_NODE, IMAGE_ENCODING, "");
-            output.setProperty(METADATA_NODE, IMAGE_FORMAT_NAME, metadata.getFormatName());
-            output.setProperty(METADATA_NODE, IMAGE_WIDTH, metadata.getWidth());
-            output.setProperty(METADATA_NODE, IMAGE_HEIGHT, metadata.getHeight());
-            output.setProperty(METADATA_NODE, IMAGE_BITS_PER_PIXEL, metadata.getBitsPerPixel());
-            output.setProperty(METADATA_NODE, IMAGE_PROGRESSIVE, metadata.isProgressive());
-            output.setProperty(METADATA_NODE, IMAGE_NUMBER_OF_IMAGES, metadata.getNumberOfImages());
-            output.setProperty(METADATA_NODE, IMAGE_PHYSICAL_WIDTH_DPI, metadata.getPhysicalWidthDpi());
-            output.setProperty(METADATA_NODE, IMAGE_PHYSICAL_HEIGHT_DPI, metadata.getPhysicalHeightDpi());
-            output.setProperty(METADATA_NODE, IMAGE_PHYSICAL_WIDTH_INCHES, metadata.getPhysicalWidthInch());
-            output.setProperty(METADATA_NODE, IMAGE_PHYSICAL_HEIGHT_INCHES, metadata.getPhysicalHeightInch());
-        }
-
-        progressMonitor.done();
-    }
-}</programlisting>
-    </para>
-    <para>
-    Notice how the image metadata is extracted and the output graph is generated.  A single node is created with the name <code>image:metadata</code>
-    and with the <code>image:metadata</code> node type.  No mixins are defined for the node, but several properties are set on the node
-    using the values obtained from the image metadata.  After this method returns, the constructed graph will be saved to the repository
-    in all of the places defined by its configuration.  (This is why only relative paths are used in the sequencer.)
-    </para>
-    <para>Also note how the progress monitor is used.  Reporting progress through the supplied <code>ProgressMonitor</code> is very easy, and it ensures that JBoss DNA
-     can accurately monitor and report the status of sequencing activities to the users.  At the beginning of the operation, call
-     <code>beginTask(...)</code> with a meaningful message describing
-     the operation and a total for the amount of work that will be done by this sequencer. Then perform the sequencing work,
-     periodically reporting work by specifying the incremental amount of work with the <code>worked(double)</code> method, or
-     by creating a subtask with the <code>createSubtask(double)</code> method and reporting work against that subtask
-     monitor.
-     </para>
-     <para>Your method should periodically use the ProgressMonitor's <code>isCancelled()</code> method to check whether the operation has been
-     cancelled.. If this method returns true, the implementation should abort all work as
-     soon as possible and close any resources that were acquired or opened.
-     </para>
-     <para>
-     Finally, when your sequencing operation is completed, it should call <code>done()</code> on the progress monitor.
-     </para>
-  </sect1>
-  <sect1 id="testing_custom_sequencers">
-    <title>Testing custom sequencers</title>
-    <para>The sequencing framework was designed to make testing sequencers much easier.  In particular, the
-    <code>StreamSequencer</code> interface does not make use of the JCR API.  So instead of requiring a fully-configured
-    JCR repository and JBoss DNA system, unit tests for a sequencer can focus on testing that the content is
-    processed correctly and the desired output graph is generated.</para>
-    <note>
-      <para>For a complete example of a sequencer unit test, see the <code>ImageMetadataSequencerTest</code> unit test
-      in the <code>org.jboss.dna.sequencer.images</code> package of the <code>dna-sequencers-image</code> project.
-      </para>
-    </note>
-    <para>The following code fragment shows one way of testing a sequencer, using JUnit 4.4 assertions and 
-      some of the classes made available by JBoss DNA.  Of course,
-      this example code does not do any error handling and does not make all the assertions a real test would.
-    <programlisting>
-Sequencer sequencer = new ImageMetadataSequencer();
-MockSequencerOutput output = new MockSequencerOutput();
-ProgressMonitor progress = new SimpleProgressMonitor("Test activity");
-InputStream stream = null;
-try {
-    stream = this.getClass().getClassLoader().getResource("caution.gif").openStream();
-    sequencer.sequence(stream,output,progress);   // writes to 'output'
-    assertThat(output.getPropertyValues("image:metadata", "jcr:primaryType"), 
-               is(new Object[] {"image:metadata"}));
-    assertThat(output.getPropertyValues("image:metadata", "jcr:mimeType"), 
-               is(new Object[] {"image/gif"}));
-    // ... make more assertions here
-    assertThat(output.hasReferences(), is(false));
-} finally {
-    stream.close();
-}</programlisting>
-  </para>
-  <para>It's also useful to test that a sequencer produces no output for something it should not understand:
-    <programlisting>
-Sequencer sequencer = new ImageMetadataSequencer();
-MockSequencerOutput output = new MockSequencerOutput();
-ProgressMonitor progress = new SimpleProgressMonitor("Test activity");
-InputStream stream = null;
-try {
-    stream = this.getClass().getClassLoader().getResource("caution.pict").openStream();
-    sequencer.sequence(stream,output,progress);   // writes to 'output'
-    assertThat(output.hasProperties(), is(false));
-    assertThat(output.hasReferences(), is(false));
-} finally {
-    stream.close();
-}</programlisting>
-    </para>
-    <para>These are just two simple tests that show ways of testing a sequencer.  Some tests may get quite involved,
-    especially if a lot of output data is produced.  
-    </para>
-    <para>It may also be useful to create some integration tests
-    that <link linkend="using_dna">configure JBoss DNA</link> to use a custom sequencer, and to then upload
-    content using the JCR API, verifying that the custom sequencer did run.  However, remember that JBoss DNA
-    runs sequencers asynchronously in the background, and you must sychronize your tests to ensure that the
-    sequencers have a chance to run before checking the results.  (One way of doing this (although, granted, not always reliable) is to wait for a second
-    after uploading your content, shutdown the <code>SequencingService</code> and await its termination,
-    and then check that the sequencer output has been saved to the JCR repository.  For an example of this technique,
-    see the <code>SequencingClientTest</code> unit test in the example application.)
-    </para>  
-  </sect1>
-  <sect1 id="deploying_custom_sequencers">
-    <title>Deploying custom sequencers</title>
-    <para>The first step of deploying a sequencer consists of adding/changing the sequencer configuration (e.g., <code>SequencerConfig</code>)
-    in the <code>SequencingService</code>.  This was covered in the <link linkend="sequencing_service">previous chapter</link>.
-    </para>
-    <para>
-    The second step is to make the sequencer implementation available to JBoss DNA.  At this time, the JAR containing 
-    your new sequencer, as well as any JARs that your sequencer depends on, should be placed on your application classpath.</para>
-    <note>
-      <para>A future goal of JBoss DNA is to allow sequencers, connectors, and other extensions to be easily deployed into
-        a runtime repository.  This process will not only be much simpler, but it will also provide JBoss DNA 
-        with the information necessary to update configurations and create the appropriate class loaders for each extension.
-        Having separate class loaders for each extension helps prevent the pollution of the common classpath, 
-        facilitates an isolated runtime environment to eliminate any dependency conflicts, and may potentially
-        enable hot redeployment of newer extension versions.
-      </para>
-    </note>
-  </sect1>
-</chapter>
-  
-<!--  ====================================================================================================
-                                               Chapter 
-      ====================================================================================================   -->
-<chapter id="future_directions">
-  <title>Looking to the future</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.
-  If you're interested in getting involved with the JBoss DNA project, consider picking up one of the sequencers on our
-  <ulink url="http://jira.jboss.org/jira/browse/DNA?report=com.atlassian.jira.plugin.system.project:roadmap-panel">roadmap</ulink>.
-  Or, check out <ulink url="http://jira.jboss.org/jira/secure/IssueNavigator.jspa?reset=true&amp;mode=hide&amp;pid=12310520&amp;sorter/order=DESC&amp;sorter/field=priority&amp;resolution=-1&amp;component=12311436">JIRA</ulink>
-  for the list of sequencers we've thought of.  If you think of one that's not there, please add it to JIRA!
-  </para>
-  <para>
-  The next release will focus on creating the <link linkend="federation">federation engine</link> and connectors
-  for several popular and ubiquitous systems.  The 0.2 release will likely only federate information in a read-only manner,
-  but updates will soon follow.  Also, during the early part of the next release, the JBoss DNA project will switch to use JDK 6.  
-  Java 5 is being end-of-lifed, so we want to move to a supported JDK. However, a number of JBoss projects and products continue to
-  require Java 5, so our next release will most likely use JDK 6 with Java 5 compatibility.</para>
-  <para>
-  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.  If any of these are of interest to you, please <link linkend="preface">get involved</link> in the community.
-  </para>
-</chapter>
 </book>
\ No newline at end of file

Modified: trunk/extensions/dna-sequencer-zip/src/test/resources/log4j.properties
===================================================================
--- trunk/extensions/dna-sequencer-zip/src/test/resources/log4j.properties	2009-06-04 22:31:30 UTC (rev 977)
+++ trunk/extensions/dna-sequencer-zip/src/test/resources/log4j.properties	2009-06-04 23:36:27 UTC (rev 978)
@@ -10,6 +10,3 @@
 # Set up the default logging to be INFO level, then override specific units
 log4j.logger.org.jboss.dna=INFO
 
-# Jackrabbit logging
-log4j.logger.org.apache.jackrabbit=WARN, stdout
-



From dna-commits at lists.jboss.org  Thu Jun  4 22:20:41 2009
From: dna-commits at lists.jboss.org (dna-commits at lists.jboss.org)
Date: Thu, 04 Jun 2009 22:20:41 -0400
Subject: [dna-commits] DNA SVN: r979 - in trunk:
	dna-repository/src/main/java/org/jboss/dna/repository and 5
	other directories.
Message-ID: <E1MCP2v-00086o-BD@committer01.frg.pub.inap.atl.jboss.com>

Author: rhauch
Date: 2009-06-04 22:20:41 -0400 (Thu, 04 Jun 2009)
New Revision: 979

Added:
   trunk/docs/examples/gettingstarted/repositories/src/main/resources/security/
   trunk/docs/examples/gettingstarted/repositories/src/main/resources/security/jaas.conf.xml
   trunk/docs/examples/gettingstarted/repositories/src/main/resources/security/roles.properties
   trunk/docs/examples/gettingstarted/repositories/src/main/resources/security/users.properties
   trunk/docs/examples/gettingstarted/repositories/src/main/resources/virtual.cnd
Modified:
   trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/JcrEngine.java
   trunk/dna-repository/src/main/java/org/jboss/dna/repository/DnaEngine.java
   trunk/docs/examples/gettingstarted/repositories/pom.xml
   trunk/docs/examples/gettingstarted/repositories/src/main/java/org/jboss/example/dna/repository/ConsoleInput.java
   trunk/docs/examples/gettingstarted/repositories/src/main/java/org/jboss/example/dna/repository/RepositoryClient.java
   trunk/docs/examples/gettingstarted/repositories/src/main/java/org/jboss/example/dna/repository/UserInterface.java
   trunk/docs/examples/gettingstarted/repositories/src/main/resources/cars.cnd
   trunk/docs/examples/gettingstarted/repositories/src/main/resources/configRepository.xml
   trunk/docs/examples/gettingstarted/sequencers/src/main/java/org/jboss/example/dna/sequencer/SequencingClient.java
Log:
DNA-389 Changed the repository example to use the new configuration.  It's not quite complete.

Modified: trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/JcrEngine.java
===================================================================
--- trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/JcrEngine.java	2009-06-04 23:36:27 UTC (rev 978)
+++ trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/JcrEngine.java	2009-06-05 02:20:41 UTC (rev 979)
@@ -23,8 +23,11 @@
  */
 package org.jboss.dna.jcr;
 
+import java.util.Collections;
 import java.util.HashMap;
+import java.util.HashSet;
 import java.util.Map;
+import java.util.Set;
 import java.util.concurrent.locks.Lock;
 import java.util.concurrent.locks.ReentrantLock;
 import javax.jcr.Repository;
@@ -93,6 +96,21 @@
         }
     }
 
+    /**
+     * Get the names of the JCR repositories.
+     * 
+     * @return the immutable names of the repositories that exist at the time this method is called
+     */
+    public Set<String> getRepositoryNames() {
+        checkRunning();
+        try {
+            repositoriesLock.lock();
+            return Collections.unmodifiableSet(new HashSet<String>(repositories.keySet()));
+        } finally {
+            repositoriesLock.unlock();
+        }
+    }
+
     protected JcrRepository doCreateJcrRepository( String repositoryName ) throws RepositoryException, PathNotFoundException {
         RepositoryConnectionFactory connectionFactory = getRepositoryConnectionFactory();
         Map<String, String> descriptors = null;

Modified: trunk/dna-repository/src/main/java/org/jboss/dna/repository/DnaEngine.java
===================================================================
--- trunk/dna-repository/src/main/java/org/jboss/dna/repository/DnaEngine.java	2009-06-04 23:36:27 UTC (rev 978)
+++ trunk/dna-repository/src/main/java/org/jboss/dna/repository/DnaEngine.java	2009-06-05 02:20:41 UTC (rev 979)
@@ -194,8 +194,26 @@
      */
     public final Graph getGraph( String sourceName ) {
         CheckArg.isNotNull(sourceName, "sourceName");
+        return getGraph(getExecutionContext(), sourceName);
+    }
+
+    /**
+     * Get a graph to the underlying source, using the supplied context. Note that the supplied context should be a derivative of
+     * the engine's {@link #getExecutionContext() context}.
+     * 
+     * @param context the context of execution for this graph; may not be null
+     * @param sourceName the name of the source
+     * @return the graph
+     * @throws IllegalArgumentException if the context or source name are null
+     * @throws RepositorySourceException if a source with the supplied name does not exist
+     * @throws IllegalStateException if this engine was not {@link #start() started}
+     */
+    public final Graph getGraph( ExecutionContext context,
+                                 String sourceName ) {
+        CheckArg.isNotNull(context, "context");
+        CheckArg.isNotNull(sourceName, "sourceName");
         checkRunning();
-        Graph graph = Graph.create(sourceName, getRepositoryService().getRepositoryLibrary(), getExecutionContext());
+        Graph graph = Graph.create(sourceName, getRepositoryService().getRepositoryLibrary(), context);
         if (configuration.getRepositorySource().getName().equals(sourceName) && configuration.getWorkspace() != null) {
             // set the workspace ...
             graph.useWorkspace(configuration.getWorkspace());

Modified: trunk/docs/examples/gettingstarted/repositories/pom.xml
===================================================================
--- trunk/docs/examples/gettingstarted/repositories/pom.xml	2009-06-04 23:36:27 UTC (rev 978)
+++ trunk/docs/examples/gettingstarted/repositories/pom.xml	2009-06-05 02:20:41 UTC (rev 979)
@@ -30,22 +30,10 @@
     </dependency>
     <dependency>
       <groupId>org.jboss.dna</groupId>
-      <artifactId>dna-common</artifactId>
-      <version>${pom.version}</version>
-      <scope>compile</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.jboss.dna</groupId>
       <artifactId>dna-connector-jbosscache</artifactId>
       <version>${pom.version}</version>
       <scope>runtime</scope>
     </dependency>
-    <dependency>
-      <groupId>org.jboss.dna</groupId>
-      <artifactId>dna-connector-federation</artifactId>
-      <version>${pom.version}</version>
-      <scope>runtime</scope>
-    </dependency>
     <!-- 
     Logging (require SLF4J API for compiling, but use Log4J and its SLF4J binding for testing) 
     -->
@@ -69,6 +57,34 @@
       <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>

Modified: trunk/docs/examples/gettingstarted/repositories/src/main/java/org/jboss/example/dna/repository/ConsoleInput.java
===================================================================
--- trunk/docs/examples/gettingstarted/repositories/src/main/java/org/jboss/example/dna/repository/ConsoleInput.java	2009-06-04 23:36:27 UTC (rev 978)
+++ trunk/docs/examples/gettingstarted/repositories/src/main/java/org/jboss/example/dna/repository/ConsoleInput.java	2009-06-05 02:20:41 UTC (rev 979)
@@ -274,8 +274,8 @@
      * @param activity the activity; may not be null but may be empty
      * @param t the exception; may not be null
      */
-    protected void displayError( String activity,
-                                 Throwable t ) {
+    public void displayError( String activity,
+                              Throwable t ) {
         assert activity != null;
         assert t != null;
         System.err.println();
@@ -303,6 +303,24 @@
     /**
      * {@inheritDoc}
      * 
+     * @see org.jboss.example.dna.repository.UserInterface#getRepositoryConfiguration()
+     */
+    public File getRepositoryConfiguration() {
+        return new File("configRepository.xml");
+    }
+
+    /**
+     * {@inheritDoc}
+     * 
+     * @see org.jboss.example.dna.repository.UserInterface#getLocationOfCndFiles()
+     */
+    public String getLocationOfCndFiles() {
+        return new File("").getAbsolutePath();
+    }
+
+    /**
+     * {@inheritDoc}
+     * 
      * @see org.jboss.example.dna.repository.UserInterface#getCallbackHandler()
      */
     public CallbackHandler getCallbackHandler() {

Modified: trunk/docs/examples/gettingstarted/repositories/src/main/java/org/jboss/example/dna/repository/RepositoryClient.java
===================================================================
--- trunk/docs/examples/gettingstarted/repositories/src/main/java/org/jboss/example/dna/repository/RepositoryClient.java	2009-06-04 23:36:27 UTC (rev 978)
+++ trunk/docs/examples/gettingstarted/repositories/src/main/java/org/jboss/example/dna/repository/RepositoryClient.java	2009-06-05 02:20:41 UTC (rev 979)
@@ -37,7 +37,6 @@
 import javax.jcr.PropertyIterator;
 import javax.jcr.Session;
 import javax.jcr.Value;
-import javax.naming.NamingException;
 import javax.security.auth.login.LoginContext;
 import javax.security.auth.login.LoginException;
 import net.jcip.annotations.Immutable;
@@ -46,14 +45,14 @@
 import org.jboss.dna.graph.ExecutionContext;
 import org.jboss.dna.graph.Graph;
 import org.jboss.dna.graph.Location;
-import org.jboss.dna.graph.connector.inmemory.InMemoryRepositorySource;
 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.jcr.JcrConfiguration;
+import org.jboss.dna.jcr.JcrEngine;
 import org.jboss.dna.jcr.JcrRepository;
-import org.jboss.dna.repository.RepositoryLibrary;
-import org.jboss.dna.repository.RepositoryService;
+import org.jboss.security.config.IDTrustConfiguration;
 import org.xml.sax.SAXException;
 
 /**
@@ -68,6 +67,15 @@
      * @param args
      */
     public static void main( String[] args ) {
+        // Set up the JAAS provider (IDTrust) and a policy file (which defines the "dna-jcr" login config name)
+        IDTrustConfiguration idtrustConfig = new IDTrustConfiguration();
+        try {
+            idtrustConfig.config("security/jaas.conf.xml");
+        } catch (Exception ex) {
+            throw new IllegalStateException(ex);
+        }
+
+        // Now configure the repository client component ...
         RepositoryClient client = new RepositoryClient();
         for (String arg : args) {
             arg = arg.trim();
@@ -76,6 +84,8 @@
             if (arg.equals("--jaas")) client.setJaasContextName(JAAS_LOGIN_CONTEXT_NAME);
             if (arg.startsWith("--jaas=") && arg.length() > 7) client.setJaasContextName(arg.substring(7).trim());
         }
+
+        // And have it use a ConsoleInput user interface ...
         client.setUserInterface(new ConsoleInput(client, args));
     }
 
@@ -84,13 +94,12 @@
         DNA;
     }
 
-    private RepositoryLibrary sources;
-    private RepositoryService repositoryService;
     private Api api = Api.JCR;
     private String jaasContextName;
     private UserInterface userInterface;
     private LoginContext loginContext;
     private ExecutionContext context;
+    private JcrEngine engine;
 
     /**
      * @param userInterface Sets userInterface to the specified value.
@@ -118,65 +127,51 @@
     }
 
     /**
-     * Start up the repositories. This method creates the necessary components and services, and initializes the in-memory
-     * repositories.
+     * Start up the repositories. This method loads the configuration, then creates the engine and starts it.
      * 
      * @throws IOException if there is a problem initializing the repositories from the files.
      * @throws SAXException if there is a problem with the SAX Parser
-     * @throws NamingException if there is a problem registering or looking up objects in JNDI
      */
-    public void startRepositories() throws IOException, SAXException, NamingException {
-        if (repositoryService != null) return; // already started
+    public void startRepositories() throws IOException, SAXException {
+        if (engine != null) return; // already started
 
-        // Create the execution context that we'll use for the services. If we'd want to use JAAS, we'd create the context
-        // by supplying LoginContext, AccessControlContext, or even Subject with CallbackHandlers. But no JAAS in this example.
-        context = new ExecutionContext();
+        // Load the configuration from a file, as provided by the user interface ...
+        JcrConfiguration configuration = new JcrConfiguration();
+        configuration.loadFrom(userInterface.getRepositoryConfiguration());
 
-        // Create the library for the RepositorySource instances ...
-        sources = new RepositoryLibrary(context);
+        // Load the node types for each JCR repository, via a CND file. These could have been defined
+        // in the configuration file, but this approach is easy and allows us to define the node types
+        // using the CND format in one or multiple files.
+        String locationOfCndFiles = userInterface.getLocationOfCndFiles();
+        configuration.repository("aircraft repository").addNodeTypes(locationOfCndFiles + "/aircraft.cnd");
+        configuration.repository("car repository").addNodeTypes(locationOfCndFiles + "/cars.cnd");
+        configuration.repository("virtual").addNodeTypes(locationOfCndFiles + "/virtual.cnd");
 
-        // Load into the source manager the repository source for the configuration repository ...
-        InMemoryRepositorySource configSource = new InMemoryRepositorySource();
-        configSource.setName("Configuration");
-        configSource.setDefaultWorkspaceName("default");
-        sources.addSource(configSource);
+        // Now create the JCR engine ...
+        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 ...
         String location = this.userInterface.getLocationOfRepositoryFiles();
-        Graph config = Graph.create("Configuration", sources, context);
-        config.useWorkspace("default");
-        config.importXmlFrom(location + "/configRepository.xml").into("/");
 
-        // Now instantiate the Repository Service ...
-        Path configRoot = context.getValueFactories().getPathFactory().create("/jcr:system");
-        repositoryService = new RepositoryService(sources, configSource.getName(), "default", configRoot, context);
-        repositoryService.getAdministrator().start();
-
-        // Now import the conten for two of the other in-memory repositories ...
-        Graph cars = Graph.create("Cars", sources, context);
+        // Now import the content for the two in-memory repositories ...
+        Graph cars = engine.getGraph("Cars");
         cars.importXmlFrom(location + "/cars.xml").into("/");
-
-        Graph aircraft = Graph.create("Aircraft", sources, context);
+        Graph aircraft = engine.getGraph("Aircraft");
         aircraft.importXmlFrom(location + "/aircraft.xml").into("/");
-
-        Graph vehicles = Graph.create("Vehicles", sources, context);
-        vehicles.create("/Vehicles");
-        vehicles.importXmlFrom(location + "/cars.xml").into("/Vehicles");
-        vehicles.importXmlFrom(location + "/aircraft.xml").into("/Vehicles");
-    
     }
 
     /**
      * Get the names of the repositories.
      * 
-     * @return the repository names
+     * @return the sorted but immutable list of repository names; never null
      */
     public List<String> getNamesOfRepositories() {
-        List<String> names = new ArrayList<String>(sources.getSourceNames());
+        List<String> names = new ArrayList<String>(engine.getRepositoryNames());
         Collections.sort(names);
-        return names;
+        return Collections.unmodifiableList(names);
     }
 
     /**
@@ -187,17 +182,13 @@
      */
     public void shutdown() throws InterruptedException, LoginException {
         logout();
-        if (repositoryService == null) return;
+        if (engine == null) return;
         try {
-            // Shut down the various services ...
-            repositoryService.getAdministrator().shutdown();
-
-            // Shut down the manager of the RepositorySource instances, waiting until all connections are closed
-            sources.getAdministrator().shutdown();
-            sources.getAdministrator().awaitTermination(1, TimeUnit.SECONDS);
+            // Tell the engine to shut down, and then wait up to 5 seconds for it to complete...
+            engine.shutdown();
+            engine.awaitTermination(5, TimeUnit.SECONDS);
         } finally {
-            repositoryService = null;
-            sources = null;
+            engine = null;
         }
     }
 
@@ -251,13 +242,14 @@
         LoginContext loginContext = getLoginContext(); // will ask user to authenticate if needed
         switch (api) {
             case JCR: {
-                JcrRepository jcrRepository = new JcrRepository(context, sources, sourceName);
+                JcrRepository jcrRepository = engine.getRepository(sourceName);
                 Session session = null;
                 if (loginContext != null) {
+                    // Could also use SimpleCredentials(username,password) too
                     Credentials credentials = new JaasCredentials(loginContext);
-                    session = jcrRepository.login(credentials, "default");
+                    session = jcrRepository.login(credentials);
                 } else {
-                    session = jcrRepository.login("default");
+                    session = jcrRepository.login();
                 }
                 try {
                     // Make the path relative to the root by removing the leading slash(es) ...
@@ -315,7 +307,7 @@
                 try {
                     // Use the DNA Graph API to read the properties and children of the node ...
                     ExecutionContext context = loginContext != null ? this.context.create(loginContext) : this.context;
-                    Graph graph = Graph.create(sourceName, sources, context);
+                    Graph graph = engine.getGraph(context, sourceName);
                     graph.useWorkspace("default");
                     org.jboss.dna.graph.Node node = graph.getNodeAt(pathToNode);
 
@@ -350,8 +342,8 @@
      * @param input the input path
      * @return the resulting full and normalized path
      */
-    protected String buildPath( String current,
-                                String input ) {
+    public String buildPath( String current,
+                             String input ) {
         if (current == null) current = "/";
         if (input == null || input.length() == 0) return current;
         PathFactory factory = context.getValueFactories().getPathFactory();

Modified: trunk/docs/examples/gettingstarted/repositories/src/main/java/org/jboss/example/dna/repository/UserInterface.java
===================================================================
--- trunk/docs/examples/gettingstarted/repositories/src/main/java/org/jboss/example/dna/repository/UserInterface.java	2009-06-04 23:36:27 UTC (rev 978)
+++ trunk/docs/examples/gettingstarted/repositories/src/main/java/org/jboss/example/dna/repository/UserInterface.java	2009-06-05 02:20:41 UTC (rev 979)
@@ -23,6 +23,7 @@
  */
 package org.jboss.example.dna.repository;
 
+import java.io.File;
 import javax.security.auth.callback.CallbackHandler;
 
 /**
@@ -32,6 +33,13 @@
 
     String getLocationOfRepositoryFiles();
 
+    File getRepositoryConfiguration();
+
+    String getLocationOfCndFiles();
+
     CallbackHandler getCallbackHandler();
 
+    void displayError( String activity,
+                       Throwable t );
+
 }

Modified: trunk/docs/examples/gettingstarted/repositories/src/main/resources/cars.cnd
===================================================================
--- trunk/docs/examples/gettingstarted/repositories/src/main/resources/cars.cnd	2009-06-04 23:36:27 UTC (rev 978)
+++ trunk/docs/examples/gettingstarted/repositories/src/main/resources/cars.cnd	2009-06-05 02:20:41 UTC (rev 979)
@@ -47,4 +47,3 @@
   - car:lengthInInches (double) < '(0,]'                   // any value greater than 0
   - car:wheelbaseInInches (double) < '(0,]'                // any value greater than 0
   - car:engine (string)
-

Modified: trunk/docs/examples/gettingstarted/repositories/src/main/resources/configRepository.xml
===================================================================
--- trunk/docs/examples/gettingstarted/repositories/src/main/resources/configRepository.xml	2009-06-04 23:36:27 UTC (rev 978)
+++ trunk/docs/examples/gettingstarted/repositories/src/main/resources/configRepository.xml	2009-06-05 02:20:41 UTC (rev 979)
@@ -25,44 +25,128 @@
   ~ Boston, MA  02110-1301  USA
   -->
 <configuration xmlns="http://www.jboss.org/dna/1.0" xmlns:jcr="http://www.jcp.org/jcr/1.0">
-    <!-- Define the sources from which content is made available -->
-    <sources jcr:primaryType="nt:unstructured">
-        <source jcr:name="Cars" classname="org.jboss.dna.graph.connector.inmemory.InMemoryRepositorySource" retryLimit="3" defaultWorkspaceName="default"/>
-        <source jcr:name="Aircraft" classname="org.jboss.dna.graph.connector.inmemory.InMemoryRepositorySource">
-            <defaultWorkspaceName>default</defaultWorkspaceName>
-        </source>
-        <source jcr:name="Vehicles">
-            <classname>org.jboss.dna.graph.connector.federated.FederatedRepositorySource</classname>
-            <workspaces>
-                <workspace jcr:name="default">
-                    <projections>
-                        <projection jcr:name="Main projection" source="Cars" workspace="default">
-                            <projectionRules>/Vehicles => /</projectionRules>
-                        </projection>
-                    </projections>
-                </workspace>
-            </workspaces>
-        </source>
-        <source jcr:name="Cache" classname="org.jboss.dna.graph.connector.inmemory.InMemoryRepositorySource">
-            <defaultWorkspaceName>default</defaultWorkspaceName>
-        </source>
-    </sources>
-    <!-- Define the JCR repositories -->
-    <repositories>
-        <repository jcr:name="cars">
+    <!-- 
+    Define the sources for the content.  These sources are directly accessible using the DNA-specific Graph API.
+    In fact, this is how the DNA JCR implementation works.  You can think of these as being similar to
+    JDBC DataSource objects, except that they expose graph content via the Graph API instead of records via SQL or JDBC. 
+    -->
+    <dna:sources jcr:primaryType="nt:unstructured">
+        <!-- 
+        The 'Cars' repository is an in-memory source with a single default workspace (though others could be created, too).
+        -->
+        <dna:source jcr:name="Cars" dna:classname="org.jboss.dna.graph.connector.inmemory.InMemoryRepositorySource" dna:retryLimit="3" dna:defaultWorkspaceName="workspace1"/>
+        <!-- 
+        The 'Aircraft' repository is also an in-memory source with a single default workspace.
+        By defining a default workspace, the clients using the Graph API will by default use that workspace,
+        but can easily say to use other workspaces (or create, clone, or destroy workspaces).
+        -->
+        <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>
+        <!-- 
+        The 'Vehicles' repository is a federated source that owns none of its own content, but instead
+        projects (in this case) all of the content from the 'Cars' source as if it appears
+        under '/Vehicles/Cars', while all the 'Aircraft' content appears under '/Vehicles/Aircraft'.
+        -->
+        <dna:source jcr:name="Vehicles">
+            <dna:classname>org.jboss.dna.graph.connector.federated.FederatedRepositorySource</dna:classname>
+            <dna:workspaces>
+                <!-- 
+                Unlike some other repository sources, federated sources have to define all of their workspaces,
+                including how and where the content is projected.  So, we only need a single workspace,
+                but we could actually define additional workspaces that expose various combinations or portions
+                of 'Cars' and/or 'Aircraft' content.
+                -->
+                <dna:workspace jcr:name="virtual">
+                    <dna:projections>
+                        <!-- Project the 'Cars' content, starting with the '/Cars' node. -->
+                        <dna:projection jcr:name="Cars projection" dna:source="Cars" dna:workspace="workspace1">
+                            <dna:projectionRules>/Vehicles/Cars => /Cars</dna:projectionRules>
+                        </dna:projection>
+                        <!-- Project the 'Aicraft' content, starting with the '/Aircraft' node. -->
+                        <dna:projection jcr:name="Aircarft projection" dna:source="Aircraft" dna:workspace="workspace2">
+                            <dna:projectionRules>/Vehicles/Aircraft => /Aircraft</dna:projectionRules>
+                        </dna:projection>
+                    </dna:projections>
+                </dna:workspace>
+            </dna:workspaces>
+        </dna:source>
+    </dna:sources>
+    <!-- 
+    Define the sequencers. This is an optional section. For this example, we're not using any sequencers. 
+    -->
+    <dna:sequencers>
+        <!--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 the mime type detectors. This is an optional section.  By default, each engine will use the 
+    MIME type detector that uses filename extensions.  So we wouldn't need to define the same detector again,
+    but this is how you'd define another extension.
+    -->
+    <dna:mimeTypeDetectors>
+        <dna:mimeTypeDetector jcr:name="Detector">
+            <dna:description>Standard extension-based MIME type detector</dna:description>        
+            <!-- 
+            Specify the implementation class (required), as a child element or attribute on parent element.
+            -->
+            <dna:classname>org.jboss.dna.graph.mimetype.ExtensionBasedMimeTypeDetector</dna:classname>
+            <!-- 
+            Specify the classpath (optional) as an ordered list of 'names', where each name is significant to 
+            the classpath factory.  For example, a name could be an OSGI identifier or a Maven coordinate,
+            depending upon the classpath factory being used.  If there is only one 'name' in the classpath,
+            it may be specified as an attribute on the 'mimeTypeDetector' element.  If there is more than one
+            'name', then they must be specified as child 'classpath' elements. Blank or empty values are ignored. 
+             -->
+            <dna:classpath></dna:classpath>
+            <dna:classpath></dna:classpath>
+        </dna:mimeTypeDetector>
+    </dna:mimeTypeDetectors>
+    <!-- 
+    Define the JCR repositories 
+    -->
+    <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">
             <!-- Specify the source that should be used for the repository -->
             <source>Cars</source>
             <!-- Define the options for the JCR repository, using camelcase version of JcrRepository.Option names -->
             <options jcr:primaryType="dna:options"/>
+                <jaasLoginConfigName jcr:primaryType="dna:option" dna:value="dna-jcr"/>
+            </options>
             <!-- Define any custom node types. Importing CND files via JcrConfiguration is equivalent to specifying here. -->
             <nodeTypes jcr:primaryType="dna:nodeTypes"/>
             <!-- Define any namespaces for this repository, other than those already defined by JCR or DNA -->
             <namespaces jcr:primaryType="dna:namespaces">
                 <car jcr:primaryType="dna:namespace" dna:uri="http://jboss.org/dna/examples/cars/1.0"/>
             </namespaces>
-        </repository>
-        <repository jcr:name="vehicles">
+        </dna:repository>
+        <!-- 
+        Define a JCR repository that accesses the 'Aircraft' source directly.
+        This of course isn't really necessary for this example, since we could access the same content through 'vehicles'.
+        -->
+        <dna:repository jcr:name="aircraft repository">
             <!-- Specify the source that should be used for the repository -->
+            <source>Aircraft</source>
+            <!-- Define the options for the JCR repository, using camelcase version of JcrRepository.Option names -->
+            <options jcr:primaryType="dna:options"/>
+                <jaasLoginConfigName jcr:primaryType="dna:option" dna:value="dna-jcr"/>
+            </options>
+        </dna:repository>
+        <!-- 
+        Define a JCR repository that accesses the 'Vehicles' federated source directly,
+        which is defined in the sources to be a projection of the 'Cars' and 'Vehicles' content.
+        -->
+        <!-- Define a JCR repository that accesses the 'Vehicles' federated source directly -->
+        <dna:repository jcr:name="vehicles">
+            <!-- Specify the source that should be used for the repository -->
             <source>Vehicles</source>
             <!-- Define the options for the JCR repository, using camelcase version of JcrRepository.Option names -->
             <options jcr:primaryType="dna:options">
@@ -76,6 +160,6 @@
                 <car jcr:primaryType="dna:namespace" dna:uri="http://jboss.org/dna/examples/cars/1.0"/>
                 <air jcr:primaryType="dna:namespace" dna:uri="http://jboss.org/dna/examples/aircraft/1.0"/>
             </namespaces>
-        </repository>
-    </repositories>
+        </dna:repository>
+    </dna:repositories>
 </configuration>
\ No newline at end of file

Added: trunk/docs/examples/gettingstarted/repositories/src/main/resources/security/jaas.conf.xml
===================================================================
--- trunk/docs/examples/gettingstarted/repositories/src/main/resources/security/jaas.conf.xml	                        (rev 0)
+++ trunk/docs/examples/gettingstarted/repositories/src/main/resources/security/jaas.conf.xml	2009-06-05 02:20:41 UTC (rev 979)
@@ -0,0 +1,24 @@
+<?xml version='1.0'?>
+
+<policy xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="urn:jboss:security-config:5.0" xmlns="urn:jboss:security-config:5.0"
+	xmlns:jbxb="urn:jboss:security-config:5.0">
+	<application-policy name="dna-jcr">
+		<authentication>
+			<login-module code="org.jboss.security.auth.spi.UsersRolesLoginModule" flag="required">
+                <module-option name="usersProperties">security/users.properties</module-option>
+                <module-option name="rolesProperties">security/roles.properties</module-option>
+				<module-option name="name">1.1</module-option>
+				<module-option name="succeed">true</module-option>
+				<module-option name="throwEx">false</module-option>
+			</login-module>
+		</authentication>
+<!-- 		
+		<authorization>
+			<policy-module code="org.jboss.security.idtrust.impl.plugins.authorization.IDTrustAuthorizationModule">
+				<module-option name="roles">validuser</module-option>
+			</policy-module>
+		</authorization>
+-->		
+	</application-policy>
+</policy>


Property changes on: trunk/docs/examples/gettingstarted/repositories/src/main/resources/security/jaas.conf.xml
___________________________________________________________________
Name: svn:keywords
   + Id Revision
Name: svn:eol-style
   + LF

Added: trunk/docs/examples/gettingstarted/repositories/src/main/resources/security/roles.properties
===================================================================
--- trunk/docs/examples/gettingstarted/repositories/src/main/resources/security/roles.properties	                        (rev 0)
+++ trunk/docs/examples/gettingstarted/repositories/src/main/resources/security/roles.properties	2009-06-05 02:20:41 UTC (rev 979)
@@ -0,0 +1,2 @@
+#<userName>=[readonly[.<workspaceName>] | readwrite[.<workspaceName>]][, [readonly[.<workspaceName>] | readwrite[.<workspaceName>]]]*
+jsmith=readwrite

Added: trunk/docs/examples/gettingstarted/repositories/src/main/resources/security/users.properties
===================================================================
--- trunk/docs/examples/gettingstarted/repositories/src/main/resources/security/users.properties	                        (rev 0)
+++ trunk/docs/examples/gettingstarted/repositories/src/main/resources/security/users.properties	2009-06-05 02:20:41 UTC (rev 979)
@@ -0,0 +1,2 @@
+# <username>=<password>
+jsmith=secret

Added: trunk/docs/examples/gettingstarted/repositories/src/main/resources/virtual.cnd
===================================================================
--- trunk/docs/examples/gettingstarted/repositories/src/main/resources/virtual.cnd	                        (rev 0)
+++ trunk/docs/examples/gettingstarted/repositories/src/main/resources/virtual.cnd	2009-06-05 02:20:41 UTC (rev 979)
@@ -0,0 +1,79 @@
+/*
+ * 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'>
+<air='http://jboss.org/dna/examples/aircraft/1.0'>
+<car='http://jboss.org/dna/examples/cars/1.0'>
+
+//------------------------------------------------------------------------------
+// N O D E T Y P E S
+//------------------------------------------------------------------------------
+
+[car:Car] > nt:unstructured
+  - car:maker (string)
+  - car:model (string)
+  - car:year (string) < '(19|20)\d{2}'                     // any 4 digit number starting with '19' or '20'
+  - car:msrp (string) < '[$]\d{1,3}[,]?\d{3}([.]\d{2})?'   // of the form "$X,XXX.ZZ", "$XX,XXX.ZZ" or "$XXX,XXX.ZZ" 
+                                                           // where '.ZZ' is optional
+  - car:userRating (long) < '[1,5]'                        // any value from 1 to 5 (inclusive)
+  - car:valueRating (long) < '[1,5]'                       // any value from 1 to 5 (inclusive)
+  - car:mpgCity (long) < '(0,]'                            // any value greater than 0
+  - car:mpgHighway (long) < '(0,]'                         // any value greater than 0
+  - car:lengthInInches (double) < '(0,]'                   // any value greater than 0
+  - car:wheelbaseInInches (double) < '(0,]'                // any value greater than 0
+  - car:engine (string)
+
+[air:Aircraft] > nt:unstructured
+  - air:maker (string)
+  - air:model (string)
+  - air:designedBy (string)
+  - air:introduced (string) < '(19|20)\d{2}'                // any 4 digit number starting with '19' or '20'
+  - air:range (string)                                      // any integer (with optional ',' every 1000s place)
+     < '\d{1,3}(,?\d{3})*\s*(nm|m|km|mi|ft)'                // followed by 'nm', 'm', 'km', 'mi', or 'ft'
+  - air:maxSpeed (string)                                   // any integer (with optional ',' every 1000s place)
+    < '\d{1,3}(,?\d{3})*\s*(kt|mph|km/h|kmph)'              // followed by 'kt', 'mph', 'km/h' or 'kmph'
+  - air:takeoffSpeed (string)                               // any integer (with optional ',' every 1000s place)
+    < '\d{1,3}(,?\d{3})*\s*(kt|mph|km/h|kmph)'              // followed by 'kt', 'mph', 'km/h' or 'kmph'
+  - air:cruiseSpeed (string)                                // any integer (with optional ',' every 1000s place)
+    < '\d{1,3}(,?\d{3})*\s*(kt|mph|km/h|kmph)'              // followed by 'kt', 'mph', 'km/h' or 'kmph'
+  - air:emptyWeight (string)                                // any integer (with optional ',' every 1000s place)
+    < '\d{1,3}(,?\d{3})*\s*(lb|kg)'                         // followed by 'lb' or 'kg'
+  - air:maxWeight (string)                                  // any integer (with optional ',' every 1000s place)
+    < '\d{1,3}(,?\d{3})*\s*(lb|kg)'                         // followed by 'lb' or 'kg'
+  - air:rateOfClimb (string)                                // any integer (with optional ',' every 1000s place)
+    < '\d{1,3}(,?\d{3})*\s*(ft|km|m)/(s|min)'               // followed by 'ft/s', 'ft/min', 'km/s', 'km/min', 'm/s', or 'm/min'
+  - air:serviceCeiling (string)                             // any integer (with optional ',' every 1000s place)
+    < '\d{1,3}(,?\d{3})*\s*(nm|m|km|mi|ft)'                 // followed by 'nm', 'm', 'km', 'mi', or 'ft'
+  - air:fuelCapacity (string)                               // any integer (with optional ',' every 1000s place)
+    < '\d{1,3}(,?\d{3})*\s*(lb|kg|gal|L)'                   // followed by 'lb', 'kg', 'gal', or 'L'
+  - air:crew (long) < '[0,)'                                // any non-negative value
+  - air:numberBuilt (string)                                // any integer (with optional ',' every 1000s place)
+    < '\d{1,3}(,?\d{3})*\s*[+]?' ,                          // optionally followed by '+'
+      '([<>]\s*)?\d{1,3}(,?\d{3})*'                         // or prefixed by '<' or '>'
+  - air:url (string)

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	2009-06-04 23:36:27 UTC (rev 978)
+++ trunk/docs/examples/gettingstarted/sequencers/src/main/java/org/jboss/example/dna/sequencer/SequencingClient.java	2009-06-05 02:20:41 UTC (rev 979)
@@ -61,10 +61,9 @@
 
     public static void main( String[] args ) {
         // Set up the JAAS provider (IDTrust) and a policy file (which defines the "dna-jcr" login config name)
-        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);
         }



From dna-commits at lists.jboss.org  Thu Jun  4 22:49:35 2009
From: dna-commits at lists.jboss.org (dna-commits at lists.jboss.org)
Date: Thu, 04 Jun 2009 22:49:35 -0400
Subject: [dna-commits] DNA SVN: r980 -
	trunk/dna-jcr/src/main/java/org/jboss/dna/jcr.
Message-ID: <E1MCPUt-0000vQ-Dd@committer01.frg.pub.inap.atl.jboss.com>

Author: rhauch
Date: 2009-06-04 22:49:35 -0400 (Thu, 04 Jun 2009)
New Revision: 980

Modified:
   trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/JcrEngine.java
Log:
DNA-389 Corrected how JcrEngine returns the names of the repositories, using the configuration to get all of them regardless of which Repository objects were used by the engine.

Modified: trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/JcrEngine.java
===================================================================
--- trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/JcrEngine.java	2009-06-05 02:20:41 UTC (rev 979)
+++ trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/JcrEngine.java	2009-06-05 02:49:35 UTC (rev 980)
@@ -97,18 +97,22 @@
     }
 
     /**
-     * Get the names of the JCR repositories.
+     * Get the names of each of the JCR repositories.
      * 
      * @return the immutable names of the repositories that exist at the time this method is called
      */
     public Set<String> getRepositoryNames() {
         checkRunning();
-        try {
-            repositoriesLock.lock();
-            return Collections.unmodifiableSet(new HashSet<String>(repositories.keySet()));
-        } finally {
-            repositoriesLock.unlock();
+        Set<String> results = new HashSet<String>();
+        // Read the names of the JCR repositories from the configuration (not from the Repository objects used so far) ...
+        PathFactory pathFactory = getExecutionContext().getValueFactories().getPathFactory();
+        Path repositoriesPath = pathFactory.create(configuration.getPath(), DnaLexicon.REPOSITORIES);
+        Graph configuration = getConfigurationGraph();
+        for (Location child : configuration.getChildren().of(repositoriesPath)) {
+            Name repositoryName = child.getPath().getLastSegment().getName();
+            results.add(readable(repositoryName));
         }
+        return Collections.unmodifiableSet(results);
     }
 
     protected JcrRepository doCreateJcrRepository( String repositoryName ) throws RepositoryException, PathNotFoundException {



From dna-commits at lists.jboss.org  Thu Jun  4 23:41:47 2009
From: dna-commits at lists.jboss.org (dna-commits at lists.jboss.org)
Date: Thu, 04 Jun 2009 23:41:47 -0400
Subject: [dna-commits] DNA SVN: r981 - in trunk/docs:
	examples/gettingstarted/sequencers/src/main/assembly and 6
	other directories.
Message-ID: <E1MCQJP-0003A9-Jl@committer01.frg.pub.inap.atl.jboss.com>

Author: rhauch
Date: 2009-06-04 23:41:47 -0400 (Thu, 04 Jun 2009)
New Revision: 981

Modified:
   trunk/docs/examples/gettingstarted/repositories/src/main/assembly/basic.xml
   trunk/docs/examples/gettingstarted/sequencers/src/main/assembly/basic.xml
   trunk/docs/gettingstarted/src/main/docbook/en-US/content/downloading_and_running.xml
   trunk/docs/gettingstarted/src/main/docbook/en-US/content/understanding_dna.xml
   trunk/docs/gettingstarted/src/main/docbook/en-US/images/example-federated-repository.graffle/QuickLook/Preview.pdf
   trunk/docs/gettingstarted/src/main/docbook/en-US/images/example-federated-repository.graffle/QuickLook/Thumbnail.tiff
   trunk/docs/gettingstarted/src/main/docbook/en-US/images/example-federated-repository.graffle/data.plist
   trunk/docs/gettingstarted/src/main/docbook/en-US/images/example-federated-repository.png
   trunk/docs/gettingstarted/src/main/docbook/en-US/images/example-repositories.graffle/QuickLook/Preview.pdf
   trunk/docs/gettingstarted/src/main/docbook/en-US/images/example-repositories.graffle/QuickLook/Thumbnail.tiff
   trunk/docs/gettingstarted/src/main/docbook/en-US/images/example-repositories.graffle/data.plist
   trunk/docs/gettingstarted/src/main/docbook/en-US/images/example-repositories.png
Log:
DNA-389 DNA-405 Updated the first few sections of the Getting Started guide to reflect the new configuration and that we're no longer dependent upon Jackrabbit.

Modified: trunk/docs/examples/gettingstarted/repositories/src/main/assembly/basic.xml
===================================================================
--- trunk/docs/examples/gettingstarted/repositories/src/main/assembly/basic.xml	2009-06-05 02:49:35 UTC (rev 980)
+++ trunk/docs/examples/gettingstarted/repositories/src/main/assembly/basic.xml	2009-06-05 03:41:47 UTC (rev 981)
@@ -16,9 +16,14 @@
       <directory>src/main/resources/</directory>
       <outputDirectory/>
       <includes>
+        <include>*.cnd</include>
         <include>*.xml</include>
       </includes>
     </fileSet>
+    <fileSet>
+      <directory>src/main/resources/security/</directory>
+      <outputDirectory/>
+    </fileSet>
   </fileSets>
   <files>
     <file>

Modified: trunk/docs/examples/gettingstarted/sequencers/src/main/assembly/basic.xml
===================================================================
--- trunk/docs/examples/gettingstarted/sequencers/src/main/assembly/basic.xml	2009-06-05 02:49:35 UTC (rev 980)
+++ trunk/docs/examples/gettingstarted/sequencers/src/main/assembly/basic.xml	2009-06-05 03:41:47 UTC (rev 981)
@@ -26,6 +26,10 @@
       </includes>
     </fileSet>
     <fileSet>
+      <directory>src/main/resources/security/</directory>
+      <outputDirectory/>
+    </fileSet>
+    <fileSet>
       <directory>workspace/</directory>
       <outputDirectory/>
       <useDefaultExcludes>true</useDefaultExcludes>

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	2009-06-05 02:49:35 UTC (rev 980)
+++ trunk/docs/gettingstarted/src/main/docbook/en-US/content/downloading_and_running.xml	2009-06-05 03:41:47 UTC (rev 981)
@@ -168,24 +168,25 @@
 			      </para>
 				</listitem>
 				<listitem>
-					<para><emphasis role="strong"><code>jackrabbitConfig.xml</code></emphasis>
-			        is the Jackrabbit configuration file, which is set up to use a transient in-memory repository.
+					<para><emphasis role="strong"><code>sample1.mp3</code></emphasis>
+			        is a sample MP3 audio file you'll use later to upload into the repository.
 			      </para>
 				</listitem>
 				<listitem>
-					<para><emphasis role="strong"><code>jackrabbitNodeTypes.cnd</code></emphasis>
-			        defines the additional JCR node types used by this example.
+					<para><emphasis role="strong"><code>caution.gif</code></emphasis>, <emphasis role="strong"><code>caution.png</code></emphasis>, 
+					<emphasis role="strong"><code>caution.jpg</code></emphasis>, and <emphasis role="strong"><code>caution.pict</code></emphasis>
+			        are images that you'll use later and upload into the repository.
 			      </para>
 				</listitem>
 				<listitem>
-					<para><emphasis role="strong"><code>sample1.mp3</code></emphasis>
-			        is a sample MP3 audio file you'll use later to upload into the repository.
+					<para><emphasis role="strong"><code>sequencing.cnd</code></emphasis>
+			        is a Compact Node Definition (CND) file that defines the node types used in the output from the sequencers.
 			      </para>
 				</listitem>
 				<listitem>
-					<para><emphasis role="strong"><code>caution.gif</code></emphasis>, <emphasis role="strong"><code>caution.png</code></emphasis>, and <emphasis role="strong"><code>caution.jpg</code></emphasis>
-			        are images that you'll use later and upload into the repository.
-			      </para>
+					<para><emphasis role="strong"><code>security</code></emphasis> subdirectory containing several files related to the
+				  JAAS implementation used for authentication.
+				  </para>
 				</listitem>
 				<listitem>
 					<para><emphasis role="strong"><code>project1</code></emphasis> subdirectory contains some Java source that can be loaded
@@ -199,14 +200,6 @@
 				</listitem>
 			</itemizedlist>
 		</para>
-    <note>
-			<para>JBoss DNA &versionNumber; and the sequencer example uses <ulink url="http://jackrabbit.apache.org/">Apache Jackrabbit</ulink> version 1.4.5.  
-      	This version is stable and used by a number of other projects and applications.  However, you should be able to use any
-      	version of Jackrabbit, as long as that version uses the same JCR API.</para>
-			<para>Just remember, if the version of Jackrabbit you want to use for these examples is not in the Maven repository,
-      	you'll have to either add it or add it locally.  For more information, see the <ulink url="http://maven.apache.org/">Maven documentation</ulink>.
-      </para>
-		</note>
 		<para>Similarly, the <code>examples/repository/target/</code> directory contains all of the generated output for the repository example, including
 			a <code>dna-example-repository-basic.dir/</code> subdirectory that contains the following:
 			<itemizedlist>
@@ -227,12 +220,23 @@
 					</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>virtual.cnd</code></emphasis> are the CND files used for the three different JCR Repositories
+					set up in the example.  The <emphasis role="strong"><code>virtual.cnd</code></emphasis> is just a combination of the other two.
+					</para>
+				</listitem>
+				<listitem>
 					<para><emphasis role="strong"><code>configRepository.xml</code></emphasis> is an XML file containing the information that the
-					  example application imports into its "Configuration" repository and which defines how the application sets up access
-					  to the other example repositories.
+					  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.
+				  </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.
 			      </para>
@@ -327,9 +331,8 @@
 	</sect1>
 	<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 
-			"Configuration") as well as a federated repository ("Vehicles") that dynamically federates the information from the three other 
-			repositories and a cache repository (named "Cache") in which the federated content is stored.  
+		<para>The repository example consists of a client application that sets up two DNA repositories (named "Cars" and "Airplanes") and 
+			a federated repository ("Vehicles") that dynamically federates the information from the other two 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:

Modified: trunk/docs/gettingstarted/src/main/docbook/en-US/content/understanding_dna.xml
===================================================================
--- trunk/docs/gettingstarted/src/main/docbook/en-US/content/understanding_dna.xml	2009-06-05 02:49:35 UTC (rev 980)
+++ trunk/docs/gettingstarted/src/main/docbook/en-US/content/understanding_dna.xml	2009-06-05 03:41:47 UTC (rev 981)
@@ -75,8 +75,8 @@
         <listitem>
           <para>
             <emphasis role="strong">DNA Federation</emphasis>
-            is actually special repository connector that accesses information from multiple other sources via connectors,
- 						making all this information look like it is part of a single, unified graph.  Because it is a connector,
+            is actually a special repository connector that accesses information from multiple other sources via connectors,
+ 						making all this information look like it is part of a single, unified repository.  Because it is a connector,
  						it can be used wherever connectors can be used.  And because it uses connectors, the federation connector
 						makes it possible to integrate a wide variety of external systems, like other JCR
             repositories, databases, applications, and services.
@@ -86,7 +86,7 @@
           <para>
             <emphasis role="strong">DNA JCR</emphasis>
             is an implementation of the JCR API that accesses the content from a single connector.  Our implementation has come a long
-						with in the 0.4 release, and is nearly Level 1 and Level 2 compliant.  Finishing the remaining features, including search
+						way, and is nearly Level 1 and Level 2 compliant.  Finishing the remaining features, including search
 						and query, are major objectives of our next release.
           </para>
         </listitem>
@@ -375,10 +375,9 @@
 			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 creates issues with knowing which information is accurate.
 		</para>
-    <para>The JBoss DNA allows lets us leave the information where it is, yet provide access to that information through
-			the JCR API.  The first benefit is that any existing applications that already use that information can keep using it.
-			Plus, if the underlying information changes, all the client applications see the correct information.  JCR clients
-			even get the benefit of using JCR observation to be notified of the changes.  And if a JBoss DNA repository is
+    <para>The JBoss DNA allows lets us leave the information where it is, yet provide access to that information to new applications through
+			the JCR API.  As the existing applications update the information in the original systems, applications using JBoss DNA also see
+			these updates.  JCR clients	even get the benefit of using JCR observation to be notified of the changes.  And if a JBoss DNA repository is
       configured to allow updates, client applications can change the information in the repository and JBoss DNA will propagate
       those changes down to the original source.</para>
     <sect2 id="repository-connectors">
@@ -415,7 +414,7 @@
         </listitem>
         <listitem>
           <para>
-            <emphasis role="strong">JDBC Storage Connector</emphasis>
+            <emphasis role="strong">JPA-based Storage Connector</emphasis>
             - Store and access information in a relational database through JPA. Also useful for persisting information in the federated
             repository not stored elsewhere.
           </para>

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

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

Modified: trunk/docs/gettingstarted/src/main/docbook/en-US/images/example-federated-repository.graffle/data.plist
===================================================================
--- trunk/docs/gettingstarted/src/main/docbook/en-US/images/example-federated-repository.graffle/data.plist	2009-06-05 02:49:35 UTC (rev 980)
+++ trunk/docs/gettingstarted/src/main/docbook/en-US/images/example-federated-repository.graffle/data.plist	2009-06-05 03:41:47 UTC (rev 981)
@@ -7,7 +7,7 @@
 	<key>ApplicationVersion</key>
 	<array>
 		<string>com.omnigroup.OmniGraffle</string>
-		<string>136.19.0.104178</string>
+		<string>137.11.0.108132</string>
 	</array>
 	<key>AutoAdjust</key>
 	<true/>
@@ -102,7 +102,7 @@
 			<key>Text</key>
 			<dict>
 				<key>Text</key>
-				<string>{\rtf1\ansi\ansicpg1252\cocoartf949\cocoasubrtf350
+				<string>{\rtf1\ansi\ansicpg1252\cocoartf949\cocoasubrtf460
 {\fonttbl\f0\fswiss\fcharset0 Helvetica;}
 {\colortbl;\red255\green255\blue255;}
 \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
@@ -150,45 +150,14 @@
 			<key>Head</key>
 			<dict>
 				<key>ID</key>
-				<integer>164</integer>
-			</dict>
-			<key>ID</key>
-			<integer>170</integer>
-			<key>Points</key>
-			<array>
-				<string>{323.339, 176}</string>
-				<string>{269.429, 176}</string>
-			</array>
-			<key>Style</key>
-			<dict>
-				<key>stroke</key>
-				<dict>
-					<key>HeadArrow</key>
-					<string>0</string>
-					<key>TailArrow</key>
-					<string>FilledArrow</string>
-				</dict>
-			</dict>
-			<key>Tail</key>
-			<dict>
-				<key>ID</key>
-				<integer>166</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>Class</key>
-			<string>LineGraphic</string>
-			<key>Head</key>
-			<dict>
-				<key>ID</key>
 				<integer>162</integer>
 			</dict>
 			<key>ID</key>
 			<integer>169</integer>
 			<key>Points</key>
 			<array>
-				<string>{256.331, 215.02}</string>
-				<string>{304.806, 258.698}</string>
+				<string>{252.614, 215.02}</string>
+				<string>{274.135, 255.02}</string>
 			</array>
 			<key>Style</key>
 			<dict>
@@ -218,8 +187,8 @@
 			<integer>168</integer>
 			<key>Points</key>
 			<array>
-				<string>{249.117, 215.02}</string>
-				<string>{249.117, 255.02}</string>
+				<string>{245.4, 215.02}</string>
+				<string>{222.529, 255.02}</string>
 			</array>
 			<key>Style</key>
 			<dict>
@@ -238,121 +207,7 @@
 			</dict>
 		</dict>
 		<dict>
-			<key>Class</key>
-			<string>LineGraphic</string>
-			<key>Head</key>
-			<dict>
-				<key>ID</key>
-				<integer>158</integer>
-			</dict>
-			<key>ID</key>
-			<integer>140</integer>
-			<key>Points</key>
-			<array>
-				<string>{241.903, 215.02}</string>
-				<string>{193.429, 258.698}</string>
-			</array>
-			<key>Style</key>
-			<dict>
-				<key>stroke</key>
-				<dict>
-					<key>HeadArrow</key>
-					<string>0</string>
-					<key>TailArrow</key>
-					<string>FilledArrow</string>
-				</dict>
-			</dict>
-			<key>Tail</key>
-			<dict>
-				<key>ID</key>
-				<integer>165</integer>
-			</dict>
-		</dict>
-		<dict>
 			<key>Bounds</key>
-			<string>{{317.65, 202.02}, {52, 13}}</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-Bold</string>
-				<key>Size</key>
-				<real>12</real>
-			</dict>
-			<key>ID</key>
-			<integer>167</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\fs22 \cf0 Cache}</string>
-				<key>VerticalPad</key>
-				<integer>0</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>Bounds</key>
-			<string>{{323.339, 154.02}, {40.6226, 43.9593}}</string>
-			<key>Class</key>
-			<string>ShapedGraphic</string>
-			<key>ID</key>
-			<integer>166</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>{{223.117, 202.02}, {52, 13}}</string>
 			<key>Class</key>
 			<string>ShapedGraphic</string>
@@ -394,7 +249,7 @@
 				<key>Pad</key>
 				<integer>0</integer>
 				<key>Text</key>
-				<string>{\rtf1\ansi\ansicpg1252\cocoartf949\cocoasubrtf350
+				<string>{\rtf1\ansi\ansicpg1252\cocoartf949\cocoasubrtf460
 {\fonttbl\f0\fswiss\fcharset0 Helvetica;}
 {\colortbl;\red255\green255\blue255;}
 \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
@@ -436,7 +291,7 @@
 		</dict>
 		<dict>
 			<key>Bounds</key>
-			<string>{{299.117, 308.02}, {52, 13}}</string>
+			<string>{{259.961, 308.02}, {52, 13}}</string>
 			<key>Class</key>
 			<string>ShapedGraphic</string>
 			<key>FitText</key>
@@ -477,7 +332,7 @@
 				<key>Pad</key>
 				<integer>0</integer>
 				<key>Text</key>
-				<string>{\rtf1\ansi\ansicpg1252\cocoartf949\cocoasubrtf350
+				<string>{\rtf1\ansi\ansicpg1252\cocoartf949\cocoasubrtf460
 {\fonttbl\f0\fswiss\fcharset0 Helvetica;}
 {\colortbl;\red255\green255\blue255;}
 \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
@@ -489,7 +344,7 @@
 		</dict>
 		<dict>
 			<key>Bounds</key>
-			<string>{{304.806, 255.02}, {40.6226, 43.9593}}</string>
+			<string>{{265.65, 255.02}, {40.6226, 43.9593}}</string>
 			<key>Class</key>
 			<string>ShapedGraphic</string>
 			<key>ID</key>
@@ -519,7 +374,7 @@
 		</dict>
 		<dict>
 			<key>Bounds</key>
-			<string>{{223.117, 308.02}, {52, 13}}</string>
+			<string>{{183.961, 308.02}, {52, 13}}</string>
 			<key>Class</key>
 			<string>ShapedGraphic</string>
 			<key>FitText</key>
@@ -560,7 +415,7 @@
 				<key>Pad</key>
 				<integer>0</integer>
 				<key>Text</key>
-				<string>{\rtf1\ansi\ansicpg1252\cocoartf949\cocoasubrtf350
+				<string>{\rtf1\ansi\ansicpg1252\cocoartf949\cocoasubrtf460
 {\fonttbl\f0\fswiss\fcharset0 Helvetica;}
 {\colortbl;\red255\green255\blue255;}
 \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
@@ -572,63 +427,10 @@
 		</dict>
 		<dict>
 			<key>Bounds</key>
-			<string>{{132, 308.02}, {82.2334, 13}}</string>
+			<string>{{189.65, 255.02}, {40.6226, 43.9593}}</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-Bold</string>
-				<key>Size</key>
-				<real>12</real>
-			</dict>
 			<key>ID</key>
-			<integer>160</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\fs22 \cf0 Configuration}</string>
-				<key>VerticalPad</key>
-				<integer>0</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>Bounds</key>
-			<string>{{228.806, 255.02}, {40.6226, 43.9593}}</string>
-			<key>Class</key>
-			<string>ShapedGraphic</string>
-			<key>ID</key>
 			<integer>159</integer>
 			<key>ImageID</key>
 			<integer>1</integer>
@@ -653,36 +455,6 @@
 				</dict>
 			</dict>
 		</dict>
-		<dict>
-			<key>Bounds</key>
-			<string>{{152.806, 255.02}, {40.6226, 43.9593}}</string>
-			<key>Class</key>
-			<string>ShapedGraphic</string>
-			<key>ID</key>
-			<integer>158</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>
 	</array>
 	<key>GridInfo</key>
 	<dict/>
@@ -739,7 +511,7 @@
 	<key>MasterSheets</key>
 	<array/>
 	<key>ModificationDate</key>
-	<string>2008-09-19 09:46:58 -0500</string>
+	<string>2009-06-04 22:36:51 -0500</string>
 	<key>Modifier</key>
 	<string>Randall Hauch</string>
 	<key>NotesVisible</key>

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

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

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

Modified: trunk/docs/gettingstarted/src/main/docbook/en-US/images/example-repositories.graffle/data.plist
===================================================================
--- trunk/docs/gettingstarted/src/main/docbook/en-US/images/example-repositories.graffle/data.plist	2009-06-05 02:49:35 UTC (rev 980)
+++ trunk/docs/gettingstarted/src/main/docbook/en-US/images/example-repositories.graffle/data.plist	2009-06-05 03:41:47 UTC (rev 981)
@@ -7,7 +7,7 @@
 	<key>ApplicationVersion</key>
 	<array>
 		<string>com.omnigroup.OmniGraffle</string>
-		<string>136.19.0.104178</string>
+		<string>137.11.0.108132</string>
 	</array>
 	<key>AutoAdjust</key>
 	<true/>
@@ -51,59 +51,6 @@
 	<array>
 		<dict>
 			<key>Bounds</key>
-			<string>{{369.161, 277}, {62.4553, 13}}</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</string>
-				<key>Size</key>
-				<real>12</real>
-			</dict>
-			<key>ID</key>
-			<integer>186</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\fs22 \cf0 (In-Memory)}</string>
-				<key>VerticalPad</key>
-				<integer>0</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>Bounds</key>
 			<string>{{293.161, 277}, {62.4553, 13}}</string>
 			<key>Class</key>
 			<string>ShapedGraphic</string>
@@ -145,7 +92,7 @@
 				<key>Pad</key>
 				<integer>0</integer>
 				<key>Text</key>
-				<string>{\rtf1\ansi\ansicpg1252\cocoartf949\cocoasubrtf350
+				<string>{\rtf1\ansi\ansicpg1252\cocoartf949\cocoasubrtf460
 {\fonttbl\f0\fswiss\fcharset0 Helvetica;}
 {\colortbl;\red255\green255\blue255;}
 \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
@@ -198,7 +145,7 @@
 				<key>Pad</key>
 				<integer>0</integer>
 				<key>Text</key>
-				<string>{\rtf1\ansi\ansicpg1252\cocoartf949\cocoasubrtf350
+				<string>{\rtf1\ansi\ansicpg1252\cocoartf949\cocoasubrtf460
 {\fonttbl\f0\fswiss\fcharset0 Helvetica;}
 {\colortbl;\red255\green255\blue255;}
 \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
@@ -210,112 +157,6 @@
 		</dict>
 		<dict>
 			<key>Bounds</key>
-			<string>{{65.1614, 277}, {62.4553, 13}}</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</string>
-				<key>Size</key>
-				<real>12</real>
-			</dict>
-			<key>ID</key>
-			<integer>183</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\fs22 \cf0 (In-Memory)}</string>
-				<key>VerticalPad</key>
-				<integer>0</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>Bounds</key>
-			<string>{{55.2724, 264}, {82.2334, 13}}</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-Bold</string>
-				<key>Size</key>
-				<real>12</real>
-			</dict>
-			<key>ID</key>
-			<integer>182</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\fs22 \cf0 Configuration}</string>
-				<key>VerticalPad</key>
-				<integer>0</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>Bounds</key>
 			<string>{{143.317, 277}, {62.4553, 13}}</string>
 			<key>Class</key>
 			<string>ShapedGraphic</string>
@@ -357,7 +198,7 @@
 				<key>Pad</key>
 				<integer>0</integer>
 				<key>Text</key>
-				<string>{\rtf1\ansi\ansicpg1252\cocoartf949\cocoasubrtf350
+				<string>{\rtf1\ansi\ansicpg1252\cocoartf949\cocoasubrtf460
 {\fonttbl\f0\fswiss\fcharset0 Helvetica;}
 {\colortbl;\red255\green255\blue255;}
 \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
@@ -370,42 +211,11 @@
 		<dict>
 			<key>Class</key>
 			<string>LineGraphic</string>
-			<key>Head</key>
-			<dict>
-				<key>ID</key>
-				<integer>148</integer>
-			</dict>
 			<key>ID</key>
-			<integer>177</integer>
-			<key>Points</key>
-			<array>
-				<string>{380.078, 235.98}</string>
-				<string>{344.701, 235.98}</string>
-			</array>
-			<key>Style</key>
-			<dict>
-				<key>stroke</key>
-				<dict>
-					<key>HeadArrow</key>
-					<string>0</string>
-					<key>TailArrow</key>
-					<string>FilledArrow</string>
-				</dict>
-			</dict>
-			<key>Tail</key>
-			<dict>
-				<key>ID</key>
-				<integer>156</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>Class</key>
-			<string>LineGraphic</string>
-			<key>ID</key>
 			<integer>175</integer>
 			<key>Points</key>
 			<array>
-				<string>{269.457, 154}</string>
+				<string>{269.926, 159}</string>
 				<string>{323.767, 214}</string>
 			</array>
 			<key>Style</key>
@@ -427,12 +237,17 @@
 		<dict>
 			<key>Class</key>
 			<string>LineGraphic</string>
+			<key>Head</key>
+			<dict>
+				<key>ID</key>
+				<integer>146</integer>
+			</dict>
 			<key>ID</key>
 			<integer>174</integer>
 			<key>Points</key>
 			<array>
-				<string>{251.378, 154}</string>
-				<string>{256.521, 215.678}</string>
+				<string>{248.389, 159}</string>
+				<string>{248.389, 214}</string>
 			</array>
 			<key>Style</key>
 			<dict>
@@ -457,7 +272,7 @@
 			<integer>173</integer>
 			<key>Points</key>
 			<array>
-				<string>{231.806, 154}</string>
+				<string>{229.847, 159}</string>
 				<string>{182.078, 215.678}</string>
 			</array>
 			<key>Style</key>
@@ -477,34 +292,8 @@
 			</dict>
 		</dict>
 		<dict>
-			<key>Class</key>
-			<string>LineGraphic</string>
-			<key>ID</key>
-			<integer>172</integer>
-			<key>Points</key>
-			<array>
-				<string>{212.234, 154}</string>
-				<string>{107.634, 215.678}</string>
-			</array>
-			<key>Style</key>
-			<dict>
-				<key>stroke</key>
-				<dict>
-					<key>HeadArrow</key>
-					<string>0</string>
-					<key>TailArrow</key>
-					<string>FilledArrow</string>
-				</dict>
-			</dict>
-			<key>Tail</key>
-			<dict>
-				<key>ID</key>
-				<integer>134</integer>
-			</dict>
-		</dict>
-		<dict>
 			<key>Bounds</key>
-			<string>{{168.544, 110}, {162, 44}}</string>
+			<string>{{167.389, 115}, {162, 44}}</string>
 			<key>Class</key>
 			<string>ShapedGraphic</string>
 			<key>ID</key>
@@ -555,7 +344,7 @@
 			<key>Text</key>
 			<dict>
 				<key>Text</key>
-				<string>{\rtf1\ansi\ansicpg1252\cocoartf949\cocoasubrtf350
+				<string>{\rtf1\ansi\ansicpg1252\cocoartf949\cocoasubrtf460
 {\fonttbl\f0\fswiss\fcharset0 Helvetica;}
 {\colortbl;\red255\green255\blue255;}
 \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
@@ -566,89 +355,6 @@
 		</dict>
 		<dict>
 			<key>Bounds</key>
-			<string>{{374.389, 264}, {52, 13}}</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-Bold</string>
-				<key>Size</key>
-				<real>12</real>
-			</dict>
-			<key>ID</key>
-			<integer>157</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\fs22 \cf0 Cache}</string>
-				<key>VerticalPad</key>
-				<integer>0</integer>
-			</dict>
-		</dict>
-		<dict>
-			<key>Bounds</key>
-			<string>{{380.078, 214}, {40.6226, 43.9593}}</string>
-			<key>Class</key>
-			<string>ShapedGraphic</string>
-			<key>ID</key>
-			<integer>156</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.389, 264}, {52, 13}}</string>
 			<key>Class</key>
 			<string>ShapedGraphic</string>
@@ -690,7 +396,7 @@
 				<key>Pad</key>
 				<integer>0</integer>
 				<key>Text</key>
-				<string>{\rtf1\ansi\ansicpg1252\cocoartf949\cocoasubrtf350
+				<string>{\rtf1\ansi\ansicpg1252\cocoartf949\cocoasubrtf460
 {\fonttbl\f0\fswiss\fcharset0 Helvetica;}
 {\colortbl;\red255\green255\blue255;}
 \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
@@ -773,7 +479,7 @@
 				<key>Pad</key>
 				<integer>0</integer>
 				<key>Text</key>
-				<string>{\rtf1\ansi\ansicpg1252\cocoartf949\cocoasubrtf350
+				<string>{\rtf1\ansi\ansicpg1252\cocoartf949\cocoasubrtf460
 {\fonttbl\f0\fswiss\fcharset0 Helvetica;}
 {\colortbl;\red255\green255\blue255;}
 \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
@@ -856,7 +562,7 @@
 				<key>Pad</key>
 				<integer>0</integer>
 				<key>Text</key>
-				<string>{\rtf1\ansi\ansicpg1252\cocoartf949\cocoasubrtf350
+				<string>{\rtf1\ansi\ansicpg1252\cocoartf949\cocoasubrtf460
 {\fonttbl\f0\fswiss\fcharset0 Helvetica;}
 {\colortbl;\red255\green255\blue255;}
 \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
@@ -896,36 +602,6 @@
 				</dict>
 			</dict>
 		</dict>
-		<dict>
-			<key>Bounds</key>
-			<string>{{76.0778, 214}, {40.6226, 43.9593}}</string>
-			<key>Class</key>
-			<string>ShapedGraphic</string>
-			<key>ID</key>
-			<integer>141</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>
 	</array>
 	<key>GridInfo</key>
 	<dict/>
@@ -982,7 +658,7 @@
 	<key>MasterSheets</key>
 	<array/>
 	<key>ModificationDate</key>
-	<string>2008-09-19 09:47:31 -0500</string>
+	<string>2009-06-04 22:36:27 -0500</string>
 	<key>Modifier</key>
 	<string>Randall Hauch</string>
 	<key>NotesVisible</key>

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



From dna-commits at lists.jboss.org  Thu Jun  4 18:31:32 2009
From: dna-commits at lists.jboss.org (dna-commits at lists.jboss.org)
Date: Thu, 04 Jun 2009 18:31:32 -0400
Subject: [dna-commits] DNA SVN: r977 - in trunk:
	dna-common/src/test/resources and 15 other directories.
Message-ID: <E1MCLTA-0003Ze-KF@committer01.frg.pub.inap.atl.jboss.com>

Author: rhauch
Date: 2009-06-04 18:31:30 -0400 (Thu, 04 Jun 2009)
New Revision: 977

Added:
   trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/CurrencyFormatterExample.mxml
   trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/Descriptor.1.0.xsd
   trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/TestData.pst
   trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/aircraft.cnd
   trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/aperture.example.manifest.mf
   trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/cars.cnd
   trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/component-architecture.odp
   trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/dna-repository-0.2-SNAPSHOT.jar
   trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/
   trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/corel-presentations-3.0.shw
   trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/corel-presentations-x3.shw
   trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/corel-quattro-pro-6.wb2
   trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/corel-quattro-pro-7.wb3
   trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/corel-quattro-pro-x3.qpw
   trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/corel-wordperfect-4.2.wp
   trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/corel-wordperfect-5.0.wp
   trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/corel-wordperfect-5.1-far-east.wp
   trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/corel-wordperfect-5.1.wp
   trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/corel-wordperfect-x3.wpd
   trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/counting-input-stream-test-file.dat
   trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/html-condenast.html
   trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/html-handwritten-with-wrong-file-extension.txt
   trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/html-handwritten.html
   trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/html-quelle.de.html
   trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/html-utf16-leading-whitespace-wrong-extension.doc
   trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/icaltestdata/
   trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/icaltestdata/Todos1.ics
   trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/icaltestdata/basicCalendar.ics
   trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/icaltestdata/cal01-1.ics
   trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/icaltestdata/cal01-2.ics
   trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/icaltestdata/cal01-3.ics
   trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/icaltestdata/cal01-4.ics
   trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/icaltestdata/cal01-5.ics
   trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/icaltestdata/cal01-6.ics
   trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/icaltestdata/cal01-exrule.ics
   trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/icaltestdata/cal01.ics
   trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/icaltestdata/calconnect7.ics
   trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/icaltestdata/calconnect9.ics
   trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/icaltestdata/combined_multiplevcalendar.ics
   trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/icaltestdata/combined_onevcalendar.ics
   trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/icaltestdata/extendedCalendar.ics
   trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/icaltestdata/freebusy.ics
   trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/icaltestdata/geo1.ics
   trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/icaltestdata/gkexample.ics
   trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/icaltestdata/incoming.ics
   trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/icaltestdata/korganizer-jicaltest-vjournal.ics
   trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/icaltestdata/korganizer-jicaltest.ics
   trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/icaltestdata/php-flp.ics
   trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/icaltestdata/simplevevent.ics
   trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/icaltestdata/sunbird_sample.ics
   trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/icaltestdata/tag-bug.ics
   trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/icaltestdata/test-created.ics
   trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/jingle1.mp3
   trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/jingle2.mp3
   trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/jingle3.mp3
   trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/jpg-exif-img_9367.JPG
   trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/jpg-exif-zerolength.jpg
   trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/jpg-geotagged-ipanema.jpg
   trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/jpg-geotagged.jpg
   trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/mail-thunderbird-1.5.eml
   trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/mhtml-firefox.mht
   trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/mhtml-internet-explorer.mht
   trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/microsoft-excel-2000.xls
   trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/microsoft-excel-2007beta2.xlam
   trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/microsoft-excel-2007beta2.xlsb
   trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/microsoft-excel-2007beta2.xlsm
   trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/microsoft-excel-2007beta2.xlsx
   trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/microsoft-excel-2007beta2.xltm
   trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/microsoft-excel-2007beta2.xltx
   trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/microsoft-powerpoint-2000.ppt
   trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/microsoft-powerpoint-2007beta2.potm
   trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/microsoft-powerpoint-2007beta2.potx
   trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/microsoft-powerpoint-2007beta2.ppsm
   trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/microsoft-powerpoint-2007beta2.ppsx
   trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/microsoft-powerpoint-2007beta2.pptm
   trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/microsoft-powerpoint-2007beta2.pptx
   trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/microsoft-publisher-2003.pub
   trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/microsoft-visio.vsd
   trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/microsoft-word-2000-with-wrong-file-extension.pdf
   trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/microsoft-word-2000.doc
   trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/microsoft-word-2007beta2.docm
   trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/microsoft-word-2007beta2.docx
   trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/microsoft-word-2007beta2.dotm
   trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/microsoft-word-2007beta2.dotx
   trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/microsoft-works-spreadsheet-3.0.wks
   trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/microsoft-works-spreadsheet-4.0-2000.wks
   trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/microsoft-works-spreadsheet-7.0.xlr
   trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/microsoft-works-word-processor-2000.wps
   trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/microsoft-works-word-processor-3.0.wps
   trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/microsoft-works-word-processor-4.0.wps
   trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/microsoft-works-word-processor-7.0.wps
   trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/openoffice-1.1.5-calc-template.stc
   trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/openoffice-1.1.5-calc.sxc
   trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/openoffice-1.1.5-draw-template.std
   trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/openoffice-1.1.5-draw.sxd
   trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/openoffice-1.1.5-impress-template.sti
   trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/openoffice-1.1.5-impress.sxi
   trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/openoffice-1.1.5-writer-template.stw
   trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/openoffice-1.1.5-writer.sxw
   trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/openoffice-2.0-calc-template.ots
   trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/openoffice-2.0-calc.ods
   trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/openoffice-2.0-draw-template.otg
   trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/openoffice-2.0-draw.odg
   trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/openoffice-2.0-formula.odf
   trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/openoffice-2.0-impress-template.otp
   trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/openoffice-2.0-impress.odp
   trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/openoffice-2.0-writer-template.ott
   trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/openoffice-2.0-writer.odt
   trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/pdf-distiller-6-weirdchars.pdf
   trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/pdf-no-author.pdf
   trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/pdf-openoffice-1.1.5-writer.pdf
   trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/pdf-openoffice-2.0-writer.pdf
   trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/pdf-word-2000-pdfcreator-0.8.0.pdf
   trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/pdf-word-2000-pdfmaker-7.0.pdf
   trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/pdf-word-2000-pdfwriter-7.0.pdf
   trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/plain-text-ansi.txt
   trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/plain-text-empty.txt
   trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/plain-text-utf16be.txt
   trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/plain-text-utf16le.txt
   trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/plain-text-utf8.txt
   trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/plain-text-with-null-character.txt
   trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/plain-text-without-extension
   trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/plain-text.txt
   trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/rtf-openoffice-1.1.5.rtf
   trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/rtf-openoffice-2.0.rtf
   trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/rtf-staroffice-5.2.rtf
   trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/rtf-word-2000.rtf
   trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/staroffice-5.2-calc-template.vor
   trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/staroffice-5.2-calc.sdc
   trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/staroffice-5.2-draw-template.vor
   trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/staroffice-5.2-draw.sda
   trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/staroffice-5.2-impress-template.vor
   trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/staroffice-5.2-impress.sdd
   trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/staroffice-5.2-writer-template.vor
   trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/staroffice-5.2-writer.sdw
   trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/thunderbird-addressbook.mab
   trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/vcard-antoni-kontact.vcf
   trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/vcard-antoni-outlook2003.vcf
   trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/vcard-dirk.vcf
   trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/vcard-rfc2426.vcf
   trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/vcard-vCards-SAP.vcf
   trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/xml-handwritten.xml
   trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/xml-nonexistent-dtd.xml
   trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/xml-nonexistent-remote-dtd.xml
   trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/xml-nonexistent-remote-xsd.xml
   trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/xml-nonexistent-xsd.xml
   trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/xml-utf8-bom
   trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/master.xml
   trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/plugin.xml
   trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/rule_test.dsl
   trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/rule_test.dslr
   trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/test.au
   trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/test.bin
   trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/test.bmp
   trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/test.dtd
   trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/test.emf
   trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/test.eps
   trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/test.fli
   trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/test.gif
   trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/test.ico
   trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/test.java
   trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/test.jpg
   trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/test.mp3
   trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/test.ogg
   trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/test.pcx
   trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/test.pdf
   trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/test.pict
   trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/test.pl
   trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/test.png
   trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/test.pnm
   trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/test.ppm
   trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/test.ppt
   trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/test.ps
   trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/test.psd
   trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/test.py
   trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/test.rtf
   trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/test.sh
   trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/test.tar
   trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/test.tar.gz
   trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/test.tga
   trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/test.txt
   trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/test.txt.gz
   trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/test.wav
   trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/test.wmf
   trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/test.xcf
   trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/test.xml
   trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/test.xpm
   trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/test_1.2.class
   trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/test_1.3.class
   trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/test_1.4.class
   trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/test_128_44_jstereo.mp3
   trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/test_excel_2000.xls
   trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/test_excel_spreadsheet.xml
   trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/test_excel_web_archive.mht
   trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/test_nocompress.tif
   trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/test_word_2000.doc
   trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/test_word_6.0_95.doc
Removed:
   trunk/dna-common/src/test/resources/jackrabbitInMemoryTestRepositoryConfig.xml
   trunk/dna-repository/src/test/resources/CurrencyFormatterExample.mxml
   trunk/dna-repository/src/test/resources/Descriptor.1.0.xsd
   trunk/dna-repository/src/test/resources/TestData.pst
   trunk/dna-repository/src/test/resources/aperture.example.manifest.mf
   trunk/dna-repository/src/test/resources/component-architecture.odp
   trunk/dna-repository/src/test/resources/dna-repository-0.2-SNAPSHOT.jar
   trunk/dna-repository/src/test/resources/docs/corel-presentations-3.0.shw
   trunk/dna-repository/src/test/resources/docs/corel-presentations-x3.shw
   trunk/dna-repository/src/test/resources/docs/corel-quattro-pro-6.wb2
   trunk/dna-repository/src/test/resources/docs/corel-quattro-pro-7.wb3
   trunk/dna-repository/src/test/resources/docs/corel-quattro-pro-x3.qpw
   trunk/dna-repository/src/test/resources/docs/corel-wordperfect-4.2.wp
   trunk/dna-repository/src/test/resources/docs/corel-wordperfect-5.0.wp
   trunk/dna-repository/src/test/resources/docs/corel-wordperfect-5.1-far-east.wp
   trunk/dna-repository/src/test/resources/docs/corel-wordperfect-5.1.wp
   trunk/dna-repository/src/test/resources/docs/corel-wordperfect-x3.wpd
   trunk/dna-repository/src/test/resources/docs/counting-input-stream-test-file.dat
   trunk/dna-repository/src/test/resources/docs/html-condenast.html
   trunk/dna-repository/src/test/resources/docs/html-handwritten-with-wrong-file-extension.txt
   trunk/dna-repository/src/test/resources/docs/html-handwritten.html
   trunk/dna-repository/src/test/resources/docs/html-quelle.de.html
   trunk/dna-repository/src/test/resources/docs/html-utf16-leading-whitespace-wrong-extension.doc
   trunk/dna-repository/src/test/resources/docs/icaltestdata/Todos1.ics
   trunk/dna-repository/src/test/resources/docs/icaltestdata/basicCalendar.ics
   trunk/dna-repository/src/test/resources/docs/icaltestdata/cal01-1.ics
   trunk/dna-repository/src/test/resources/docs/icaltestdata/cal01-2.ics
   trunk/dna-repository/src/test/resources/docs/icaltestdata/cal01-3.ics
   trunk/dna-repository/src/test/resources/docs/icaltestdata/cal01-4.ics
   trunk/dna-repository/src/test/resources/docs/icaltestdata/cal01-5.ics
   trunk/dna-repository/src/test/resources/docs/icaltestdata/cal01-6.ics
   trunk/dna-repository/src/test/resources/docs/icaltestdata/cal01-exrule.ics
   trunk/dna-repository/src/test/resources/docs/icaltestdata/cal01.ics
   trunk/dna-repository/src/test/resources/docs/icaltestdata/calconnect7.ics
   trunk/dna-repository/src/test/resources/docs/icaltestdata/calconnect9.ics
   trunk/dna-repository/src/test/resources/docs/icaltestdata/combined_multiplevcalendar.ics
   trunk/dna-repository/src/test/resources/docs/icaltestdata/combined_onevcalendar.ics
   trunk/dna-repository/src/test/resources/docs/icaltestdata/extendedCalendar.ics
   trunk/dna-repository/src/test/resources/docs/icaltestdata/freebusy.ics
   trunk/dna-repository/src/test/resources/docs/icaltestdata/geo1.ics
   trunk/dna-repository/src/test/resources/docs/icaltestdata/gkexample.ics
   trunk/dna-repository/src/test/resources/docs/icaltestdata/incoming.ics
   trunk/dna-repository/src/test/resources/docs/icaltestdata/korganizer-jicaltest-vjournal.ics
   trunk/dna-repository/src/test/resources/docs/icaltestdata/korganizer-jicaltest.ics
   trunk/dna-repository/src/test/resources/docs/icaltestdata/php-flp.ics
   trunk/dna-repository/src/test/resources/docs/icaltestdata/simplevevent.ics
   trunk/dna-repository/src/test/resources/docs/icaltestdata/sunbird_sample.ics
   trunk/dna-repository/src/test/resources/docs/icaltestdata/tag-bug.ics
   trunk/dna-repository/src/test/resources/docs/icaltestdata/test-created.ics
   trunk/dna-repository/src/test/resources/docs/jingle1.mp3
   trunk/dna-repository/src/test/resources/docs/jingle2.mp3
   trunk/dna-repository/src/test/resources/docs/jingle3.mp3
   trunk/dna-repository/src/test/resources/docs/jpg-exif-img_9367.JPG
   trunk/dna-repository/src/test/resources/docs/jpg-exif-zerolength.jpg
   trunk/dna-repository/src/test/resources/docs/jpg-geotagged-ipanema.jpg
   trunk/dna-repository/src/test/resources/docs/jpg-geotagged.jpg
   trunk/dna-repository/src/test/resources/docs/mail-thunderbird-1.5.eml
   trunk/dna-repository/src/test/resources/docs/mhtml-firefox.mht
   trunk/dna-repository/src/test/resources/docs/mhtml-internet-explorer.mht
   trunk/dna-repository/src/test/resources/docs/microsoft-excel-2000.xls
   trunk/dna-repository/src/test/resources/docs/microsoft-excel-2007beta2.xlam
   trunk/dna-repository/src/test/resources/docs/microsoft-excel-2007beta2.xlsb
   trunk/dna-repository/src/test/resources/docs/microsoft-excel-2007beta2.xlsm
   trunk/dna-repository/src/test/resources/docs/microsoft-excel-2007beta2.xlsx
   trunk/dna-repository/src/test/resources/docs/microsoft-excel-2007beta2.xltm
   trunk/dna-repository/src/test/resources/docs/microsoft-excel-2007beta2.xltx
   trunk/dna-repository/src/test/resources/docs/microsoft-powerpoint-2000.ppt
   trunk/dna-repository/src/test/resources/docs/microsoft-powerpoint-2007beta2.potm
   trunk/dna-repository/src/test/resources/docs/microsoft-powerpoint-2007beta2.potx
   trunk/dna-repository/src/test/resources/docs/microsoft-powerpoint-2007beta2.ppsm
   trunk/dna-repository/src/test/resources/docs/microsoft-powerpoint-2007beta2.ppsx
   trunk/dna-repository/src/test/resources/docs/microsoft-powerpoint-2007beta2.pptm
   trunk/dna-repository/src/test/resources/docs/microsoft-powerpoint-2007beta2.pptx
   trunk/dna-repository/src/test/resources/docs/microsoft-publisher-2003.pub
   trunk/dna-repository/src/test/resources/docs/microsoft-visio.vsd
   trunk/dna-repository/src/test/resources/docs/microsoft-word-2000-with-wrong-file-extension.pdf
   trunk/dna-repository/src/test/resources/docs/microsoft-word-2000.doc
   trunk/dna-repository/src/test/resources/docs/microsoft-word-2007beta2.docm
   trunk/dna-repository/src/test/resources/docs/microsoft-word-2007beta2.docx
   trunk/dna-repository/src/test/resources/docs/microsoft-word-2007beta2.dotm
   trunk/dna-repository/src/test/resources/docs/microsoft-word-2007beta2.dotx
   trunk/dna-repository/src/test/resources/docs/microsoft-works-spreadsheet-3.0.wks
   trunk/dna-repository/src/test/resources/docs/microsoft-works-spreadsheet-4.0-2000.wks
   trunk/dna-repository/src/test/resources/docs/microsoft-works-spreadsheet-7.0.xlr
   trunk/dna-repository/src/test/resources/docs/microsoft-works-word-processor-2000.wps
   trunk/dna-repository/src/test/resources/docs/microsoft-works-word-processor-3.0.wps
   trunk/dna-repository/src/test/resources/docs/microsoft-works-word-processor-4.0.wps
   trunk/dna-repository/src/test/resources/docs/microsoft-works-word-processor-7.0.wps
   trunk/dna-repository/src/test/resources/docs/openoffice-1.1.5-calc-template.stc
   trunk/dna-repository/src/test/resources/docs/openoffice-1.1.5-calc.sxc
   trunk/dna-repository/src/test/resources/docs/openoffice-1.1.5-draw-template.std
   trunk/dna-repository/src/test/resources/docs/openoffice-1.1.5-draw.sxd
   trunk/dna-repository/src/test/resources/docs/openoffice-1.1.5-impress-template.sti
   trunk/dna-repository/src/test/resources/docs/openoffice-1.1.5-impress.sxi
   trunk/dna-repository/src/test/resources/docs/openoffice-1.1.5-writer-template.stw
   trunk/dna-repository/src/test/resources/docs/openoffice-1.1.5-writer.sxw
   trunk/dna-repository/src/test/resources/docs/openoffice-2.0-calc-template.ots
   trunk/dna-repository/src/test/resources/docs/openoffice-2.0-calc.ods
   trunk/dna-repository/src/test/resources/docs/openoffice-2.0-draw-template.otg
   trunk/dna-repository/src/test/resources/docs/openoffice-2.0-draw.odg
   trunk/dna-repository/src/test/resources/docs/openoffice-2.0-formula.odf
   trunk/dna-repository/src/test/resources/docs/openoffice-2.0-impress-template.otp
   trunk/dna-repository/src/test/resources/docs/openoffice-2.0-impress.odp
   trunk/dna-repository/src/test/resources/docs/openoffice-2.0-writer-template.ott
   trunk/dna-repository/src/test/resources/docs/openoffice-2.0-writer.odt
   trunk/dna-repository/src/test/resources/docs/pdf-distiller-6-weirdchars.pdf
   trunk/dna-repository/src/test/resources/docs/pdf-no-author.pdf
   trunk/dna-repository/src/test/resources/docs/pdf-openoffice-1.1.5-writer.pdf
   trunk/dna-repository/src/test/resources/docs/pdf-openoffice-2.0-writer.pdf
   trunk/dna-repository/src/test/resources/docs/pdf-word-2000-pdfcreator-0.8.0.pdf
   trunk/dna-repository/src/test/resources/docs/pdf-word-2000-pdfmaker-7.0.pdf
   trunk/dna-repository/src/test/resources/docs/pdf-word-2000-pdfwriter-7.0.pdf
   trunk/dna-repository/src/test/resources/docs/plain-text-ansi.txt
   trunk/dna-repository/src/test/resources/docs/plain-text-empty.txt
   trunk/dna-repository/src/test/resources/docs/plain-text-utf16be.txt
   trunk/dna-repository/src/test/resources/docs/plain-text-utf16le.txt
   trunk/dna-repository/src/test/resources/docs/plain-text-utf8.txt
   trunk/dna-repository/src/test/resources/docs/plain-text-with-null-character.txt
   trunk/dna-repository/src/test/resources/docs/plain-text-without-extension
   trunk/dna-repository/src/test/resources/docs/plain-text.txt
   trunk/dna-repository/src/test/resources/docs/rtf-openoffice-1.1.5.rtf
   trunk/dna-repository/src/test/resources/docs/rtf-openoffice-2.0.rtf
   trunk/dna-repository/src/test/resources/docs/rtf-staroffice-5.2.rtf
   trunk/dna-repository/src/test/resources/docs/rtf-word-2000.rtf
   trunk/dna-repository/src/test/resources/docs/staroffice-5.2-calc-template.vor
   trunk/dna-repository/src/test/resources/docs/staroffice-5.2-calc.sdc
   trunk/dna-repository/src/test/resources/docs/staroffice-5.2-draw-template.vor
   trunk/dna-repository/src/test/resources/docs/staroffice-5.2-draw.sda
   trunk/dna-repository/src/test/resources/docs/staroffice-5.2-impress-template.vor
   trunk/dna-repository/src/test/resources/docs/staroffice-5.2-impress.sdd
   trunk/dna-repository/src/test/resources/docs/staroffice-5.2-writer-template.vor
   trunk/dna-repository/src/test/resources/docs/staroffice-5.2-writer.sdw
   trunk/dna-repository/src/test/resources/docs/thunderbird-addressbook.mab
   trunk/dna-repository/src/test/resources/docs/vcard-antoni-kontact.vcf
   trunk/dna-repository/src/test/resources/docs/vcard-antoni-outlook2003.vcf
   trunk/dna-repository/src/test/resources/docs/vcard-dirk.vcf
   trunk/dna-repository/src/test/resources/docs/vcard-rfc2426.vcf
   trunk/dna-repository/src/test/resources/docs/vcard-vCards-SAP.vcf
   trunk/dna-repository/src/test/resources/docs/xml-handwritten.xml
   trunk/dna-repository/src/test/resources/docs/xml-nonexistent-dtd.xml
   trunk/dna-repository/src/test/resources/docs/xml-nonexistent-remote-dtd.xml
   trunk/dna-repository/src/test/resources/docs/xml-nonexistent-remote-xsd.xml
   trunk/dna-repository/src/test/resources/docs/xml-nonexistent-xsd.xml
   trunk/dna-repository/src/test/resources/docs/xml-utf8-bom
   trunk/dna-repository/src/test/resources/jackrabbitInMemoryTestRepositoryConfig.xml
   trunk/dna-repository/src/test/resources/jackrabbitNodeTypes.cnd
   trunk/dna-repository/src/test/resources/master.xml
   trunk/dna-repository/src/test/resources/plugin.xml
   trunk/dna-repository/src/test/resources/rule_test.dsl
   trunk/dna-repository/src/test/resources/rule_test.dslr
   trunk/dna-repository/src/test/resources/test.au
   trunk/dna-repository/src/test/resources/test.bin
   trunk/dna-repository/src/test/resources/test.bmp
   trunk/dna-repository/src/test/resources/test.dtd
   trunk/dna-repository/src/test/resources/test.emf
   trunk/dna-repository/src/test/resources/test.eps
   trunk/dna-repository/src/test/resources/test.fli
   trunk/dna-repository/src/test/resources/test.gif
   trunk/dna-repository/src/test/resources/test.ico
   trunk/dna-repository/src/test/resources/test.java
   trunk/dna-repository/src/test/resources/test.jpg
   trunk/dna-repository/src/test/resources/test.mp3
   trunk/dna-repository/src/test/resources/test.ogg
   trunk/dna-repository/src/test/resources/test.pcx
   trunk/dna-repository/src/test/resources/test.pdf
   trunk/dna-repository/src/test/resources/test.pict
   trunk/dna-repository/src/test/resources/test.pl
   trunk/dna-repository/src/test/resources/test.png
   trunk/dna-repository/src/test/resources/test.pnm
   trunk/dna-repository/src/test/resources/test.ppm
   trunk/dna-repository/src/test/resources/test.ppt
   trunk/dna-repository/src/test/resources/test.ps
   trunk/dna-repository/src/test/resources/test.psd
   trunk/dna-repository/src/test/resources/test.py
   trunk/dna-repository/src/test/resources/test.rtf
   trunk/dna-repository/src/test/resources/test.sh
   trunk/dna-repository/src/test/resources/test.tar
   trunk/dna-repository/src/test/resources/test.tar.gz
   trunk/dna-repository/src/test/resources/test.tga
   trunk/dna-repository/src/test/resources/test.txt
   trunk/dna-repository/src/test/resources/test.txt.gz
   trunk/dna-repository/src/test/resources/test.wav
   trunk/dna-repository/src/test/resources/test.wmf
   trunk/dna-repository/src/test/resources/test.xcf
   trunk/dna-repository/src/test/resources/test.xml
   trunk/dna-repository/src/test/resources/test.xpm
   trunk/dna-repository/src/test/resources/test_1.2.class
   trunk/dna-repository/src/test/resources/test_1.3.class
   trunk/dna-repository/src/test/resources/test_1.4.class
   trunk/dna-repository/src/test/resources/test_128_44_jstereo.mp3
   trunk/dna-repository/src/test/resources/test_excel_2000.xls
   trunk/dna-repository/src/test/resources/test_excel_spreadsheet.xml
   trunk/dna-repository/src/test/resources/test_excel_web_archive.mht
   trunk/dna-repository/src/test/resources/test_nocompress.tif
   trunk/dna-repository/src/test/resources/test_word_2000.doc
   trunk/dna-repository/src/test/resources/test_word_6.0_95.doc
Modified:
   trunk/dna-common/src/test/resources/log4j.properties
   trunk/dna-graph/src/test/java/org/jboss/dna/graph/mimetype/AbstractMimeTypeTest.java
   trunk/dna-integration-tests/pom.xml
   trunk/docs/examples/gettingstarted/pom.xml
   trunk/docs/gettingstarted/src/main/docbook/en-US/content/custom_sequencers.xml
   trunk/docs/reference/src/main/docbook/en-US/content/sequencing.xml
   trunk/extensions/dna-classloader-maven/pom.xml
   trunk/extensions/dna-mimetype-detector-aperture/src/test/java/org/jboss/dna/mimetype/aperture/MimeTypeTest.java
   trunk/extensions/dna-sequencer-jbpm-jpdl/pom.xml
   trunk/extensions/dna-sequencer-xml/src/test/resources/master.xml
   trunk/pom.xml
Log:
DNA-405 Removed even more Jackrabbit references from test files, test cases, and documentation. Also moved all the test files that were in 'dna-repository' but used for MIME type testing out of 'dna-repository' and into 'dna-mimtype-detector-aperture'.

Deleted: trunk/dna-common/src/test/resources/jackrabbitInMemoryTestRepositoryConfig.xml
===================================================================
--- trunk/dna-common/src/test/resources/jackrabbitInMemoryTestRepositoryConfig.xml	2009-06-04 21:46:34 UTC (rev 976)
+++ trunk/dna-common/src/test/resources/jackrabbitInMemoryTestRepositoryConfig.xml	2009-06-04 22:31:30 UTC (rev 977)
@@ -1,115 +0,0 @@
-<?xml version="1.0"?>
-<!--
-   Licensed to the Apache Software Foundation (ASF) under one or more
-   contributor license agreements.  See the NOTICE file distributed with
-   this work for additional information regarding copyright ownership.
-   The ASF licenses this file to You under the Apache License, Version 2.0
-   (the "License"); you may not use this file except in compliance with
-   the License.  You may obtain a copy of the License at
-
-       http://www.apache.org/licenses/LICENSE-2.0
-
-   Unless required by applicable law or agreed to in writing, software
-   distributed under the License is distributed on an "AS IS" BASIS,
-   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-   See the License for the specific language governing permissions and
-   limitations under the License.
--->
-<!DOCTYPE Repository PUBLIC "-//The Apache Software Foundation//DTD Jackrabbit 1.2//EN"
-                            "http://jackrabbit.apache.org/dtd/repository-1.2.dtd">
-<!-- Example Repository Configuration File -->
-<Repository>
-    <!--
-        virtual file system where the repository stores global state
-        (e.g. registered namespaces, custom node types, etc.)
-    -->
-    <FileSystem class="org.apache.jackrabbit.core.fs.mem.MemoryFileSystem">
-        <param name="path" value="${rep.home}/repository"/>
-    </FileSystem>
-
-    <!--
-        security configuration
-    -->
-    <Security appName="Jackrabbit">
-        <!--
-            access manager:
-            class: FQN of class implementing the AccessManager interface
-        -->
-        <AccessManager class="org.apache.jackrabbit.core.security.SimpleAccessManager">
-            <!-- <param name="config" value="${rep.home}/access.xml"/> -->
-        </AccessManager>
-
-        <LoginModule class="org.apache.jackrabbit.core.security.SimpleLoginModule">
-           <!-- anonymous user name ('anonymous' is the default value) -->
-           <param name="anonymousId" value="anonymous"/>
-           <!--
-              default user name to be used instead of the anonymous user
-              when no login credentials are provided (unset by default)
-           -->
-           <!-- <param name="defaultUserId" value="superuser"/> -->
-        </LoginModule>
-    </Security>
-
-    <!--
-        location of workspaces root directory and name of default workspace
-    -->
-    <Workspaces rootPath="${rep.home}/workspaces" defaultWorkspace="default"/>
-    <!--
-        workspace configuration template:
-        used to create the initial workspace if there's no workspace yet
-    -->
-    <Workspace name="Jackrabbit Core">
-        <!--
-            virtual file system of the workspace:
-            class: FQN of class implementing the FileSystem interface
-        -->
-        <FileSystem class="org.apache.jackrabbit.core.fs.mem.MemoryFileSystem">
-            <param name="path" value="${wsp.home}"/>
-        </FileSystem>
-        <!--
-            persistence manager of the workspace:
-            class: FQN of class implementing the PersistenceManager interface
-        -->
-        <PersistenceManager class="org.apache.jackrabbit.core.persistence.mem.InMemPersistenceManager">
-          <param name="persistent" value="false"/>
-        </PersistenceManager>
-        <!--
-            Search index and the file system it uses.
-            class: FQN of class implementing the QueryHandler interface
-        -->
-        <SearchIndex class="org.apache.jackrabbit.core.query.lucene.SearchIndex">
-            <param name="path" value="${wsp.home}/index"/>
-        </SearchIndex>
-    </Workspace>
-
-    <!--
-        Configures the versioning
-    -->
-    <Versioning rootPath="${rep.home}/version">
-        <!--
-            Configures the filesystem to use for versioning for the respective
-            persistence manager
-        -->
-        <FileSystem class="org.apache.jackrabbit.core.fs.mem.MemoryFileSystem">
-            <param name="path" value="${rep.home}/version" />
-        </FileSystem>
-
-        <!--
-            Configures the persistence manager to be used for persisting version state.
-            Please note that the current versioning implementation is based on
-            a 'normal' persistence manager, but this could change in future
-            implementations.
-        -->
-        <PersistenceManager class="org.apache.jackrabbit.core.persistence.mem.InMemPersistenceManager">
-          <param name="persistent" value="false"/>
-        </PersistenceManager>
-    </Versioning>
-
-    <!--
-        Search index for content that is shared repository wide
-        (/jcr:system tree, contains mainly versions)
-    -->
-    <SearchIndex class="org.apache.jackrabbit.core.query.lucene.SearchIndex">
-        <param name="path" value="${rep.home}/repository/index"/>
-    </SearchIndex>
-</Repository>

Modified: trunk/dna-common/src/test/resources/log4j.properties
===================================================================
--- trunk/dna-common/src/test/resources/log4j.properties	2009-06-04 21:46:34 UTC (rev 976)
+++ trunk/dna-common/src/test/resources/log4j.properties	2009-06-04 22:31:30 UTC (rev 977)
@@ -25,8 +25,4 @@
 # Set up the logging for the LoggerTest test cases (which need this to be explicitly set rather than inherited)
 log4j.logger.org.jboss.dna.common.util.LoggerTest=INFO
 
-# Jackrabbit logging
-log4j.logger.org.apache.jackrabbit=WARN, stdout
-log4j.logger.org.apache.derby=INFO, stdout
 
-

Modified: trunk/dna-graph/src/test/java/org/jboss/dna/graph/mimetype/AbstractMimeTypeTest.java
===================================================================
--- trunk/dna-graph/src/test/java/org/jboss/dna/graph/mimetype/AbstractMimeTypeTest.java	2009-06-04 21:46:34 UTC (rev 976)
+++ trunk/dna-graph/src/test/java/org/jboss/dna/graph/mimetype/AbstractMimeTypeTest.java	2009-06-04 22:31:30 UTC (rev 977)
@@ -29,7 +29,6 @@
 import java.io.File;
 import java.io.InputStream;
 import java.util.Collections;
-import org.jboss.dna.graph.mimetype.MimeTypeDetector;
 import org.junit.After;
 import org.junit.Before;
 import org.junit.Test;
@@ -64,10 +63,13 @@
 
     protected void testMimeType( String name,
                                  String mimeType ) throws Exception {
-        InputStream content = new File("../../dna-repository/src/test/resources/" + name).toURI().toURL().openStream();
+        File file = getFile(name);
+        InputStream content = file.toURI().toURL().openStream();
         assertThat(detectors.mimeTypeOf(name, content), is(mimeType));
     }
 
+    protected abstract File getFile( String name );
+
     protected abstract String expectedMimeTypeForText_test_txt();
 
     protected abstract String expectedMimeTypeForText_plain_text_txt();

Modified: trunk/dna-integration-tests/pom.xml
===================================================================
--- trunk/dna-integration-tests/pom.xml	2009-06-04 21:46:34 UTC (rev 976)
+++ trunk/dna-integration-tests/pom.xml	2009-06-04 22:31:30 UTC (rev 977)
@@ -71,18 +71,42 @@
       <artifactId>jcr</artifactId>
       <scope>test</scope>
     </dependency>
+		<!-- Apache Jackrabbit (JCR Implementation) -->
+		<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>
     <!-- 
-      Apache Jackrabbit (JCR Implementation)
-    -->
-    <dependency>
-      <groupId>org.apache.jackrabbit</groupId>
-      <artifactId>jackrabbit-api</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.jackrabbit</groupId>
-      <artifactId>jackrabbit-core</artifactId>
-    </dependency>
-    <!-- 
       Databases and JDBC Drivers
     -->
     <dependency>

Deleted: trunk/dna-repository/src/test/resources/CurrencyFormatterExample.mxml
===================================================================
--- trunk/dna-repository/src/test/resources/CurrencyFormatterExample.mxml	2009-06-04 21:46:34 UTC (rev 976)
+++ trunk/dna-repository/src/test/resources/CurrencyFormatterExample.mxml	2009-06-04 22:31:30 UTC (rev 977)
@@ -1,54 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Simple example to demonstrate the CurrencyFormatter. -->
-<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml">
-
-    <mx:Script>
-        <![CDATA[
-
-              import mx.events.ValidationResultEvent;			
-              private var vResult:ValidationResultEvent;
-			
-              // Event handler to validate and format input.
-              private function Format():void {
-              
-                    vResult = numVal.validate();
-
-                    if (vResult.type==ValidationResultEvent.VALID) {
-                        var temp:Number=Number(priceUS.text); 
-                        formattedUSPrice.text= usdFormatter.format(temp);
-                    }
-                    
-                    else {
-                       formattedUSPrice.text="";
-                    }
-              }
-        ]]>
-    </mx:Script>
-
-    <mx:CurrencyFormatter id="usdFormatter" precision="2" 
-        currencySymbol="$" decimalSeparatorFrom="."
-        decimalSeparatorTo="." useNegativeSign="true" 
-        useThousandsSeparator="true" alignSymbol="left"/>
-
-    <mx:NumberValidator id="numVal" source="{priceUS}" property="text" 
-        allowNegative="true" domain="real"/>
-
-    <mx:Panel title="CurrencyFormatter Example" width="75%" height="75%" 
-        paddingTop="10" paddingLeft="10" paddingRight="10" paddingBottom="10">
-
-        <mx:Form>
-            <mx:FormItem label="Enter U.S. dollar amount:">
-                <mx:TextInput id="priceUS" text="" width="50%"/>
-            </mx:FormItem>
-
-            <mx:FormItem label="Formatted amount: ">
-                <mx:TextInput id="formattedUSPrice" text="" width="50%" editable="false"/>
-            </mx:FormItem>
-
-            <mx:FormItem>
-                <mx:Button label="Validate and Format" click="Format();"/>
-            </mx:FormItem>
-        </mx:Form>
-
-    </mx:Panel>
-</mx:Application>

Deleted: trunk/dna-repository/src/test/resources/Descriptor.1.0.xsd
===================================================================
--- trunk/dna-repository/src/test/resources/Descriptor.1.0.xsd	2009-06-04 21:46:34 UTC (rev 976)
+++ trunk/dna-repository/src/test/resources/Descriptor.1.0.xsd	2009-06-04 22:31:30 UTC (rev 977)
@@ -1,127 +0,0 @@
-<?xml version="1.0"?>
-<xs:schema 
-    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
-    targetNamespace="http://ns.adobe.com/air/application/1.0" 
-    xmlns="http://ns.adobe.com/air/application/1.0" 
-    elementFormDefault="qualified"
->
-  <xs:element name="application">
-    <xs:complexType>
-      <xs:all>
-        <!-- About this application -->
-        <xs:element name="id">
-          <xs:simpleType>
-            <xs:restriction base="xs:string">
-              <xs:pattern value="[A-Za-z0-9\-\.]{1,212}"/>
-            </xs:restriction>
-          </xs:simpleType>
-        </xs:element>
-        <xs:element name="name"           type="xs:string" minOccurs="0"/>
-        <xs:element name="version"        type="xs:string"/>
-        <xs:element name="filename">
-          <xs:simpleType>
-            <xs:restriction base="xs:string">
-              <!-- name cannot begin with a ' ' (space), have any of these characters: *"/:<>?\|, and end with a . (dot) or ' ' (space) -->
-              <xs:pattern value='[^\*"/:&gt;&lt;\?\\\|\. ]|[^\*"/:&gt;&lt;\?\\\| ][^\*"/:&gt;&lt;\?\\\|]*[^\*"/:&gt;&lt;\?\\\|\. ]'/>
-            </xs:restriction>
-          </xs:simpleType>
-        </xs:element>
-        <xs:element name="description"    type="xs:string" minOccurs="0"/>
-        <xs:element name="copyright"      type="xs:string" minOccurs="0"/>
-        <xs:element name="icon" type="IconType" minOccurs="0"/>
-
-        <!-- How to start this application -->
-        <xs:element name="initialWindow">
-          <xs:complexType>
-            <xs:all>
-              <xs:element name="content" type="xs:anyURI" minOccurs="1" />
-              <xs:element name="title" type="xs:string" minOccurs="0" />
-
-              <xs:element name="systemChrome" minOccurs="0" >
-                <xs:simpleType>
-                  <xs:restriction base="xs:string">
-                    <xs:enumeration value="none"/>
-                    <xs:enumeration value="standard"/>
-                  </xs:restriction>
-                </xs:simpleType>
-              </xs:element>
-              <xs:element name="transparent" type="xs:boolean" minOccurs="0" />
-              <xs:element name="visible" type="xs:boolean" minOccurs="0" />
-
-              <xs:element name="minimizable" type="xs:boolean" minOccurs="0" />
-              <xs:element name="maximizable" type="xs:boolean" minOccurs="0" />
-              <xs:element name="resizable" type="xs:boolean" minOccurs="0" />
-
-              <xs:element name="x" type="xs:int" minOccurs="0" />
-              <xs:element name="y" type="xs:int" minOccurs="0" />
-              <xs:element name="width" type="xs:unsignedInt" minOccurs="0" />
-              <xs:element name="height" type="xs:unsignedInt" minOccurs="0" />
-              <xs:element name="minSize" type="BoundsSizeType" minOccurs="0" />
-              <xs:element name="maxSize" type="BoundsSizeType" minOccurs="0" />
-            </xs:all>
-          </xs:complexType>
-        </xs:element>
-        
-        <!-- About installing this application -->
-        <xs:element name="installFolder" minOccurs="0">
-          <xs:simpleType>
-            <xs:restriction base="xs:string">
-              <!-- installFolder cannot begin with a / (forward-slash) or a ' ' (space), have any of these characters: *":<>?\|, and end with a . (dot) or ' ' (space) -->
-              <xs:pattern value='[^\*"/:&gt;&lt;\?\\\|\. ]|[^\*"/:&gt;&lt;\?\\\| ][^\*":&gt;&lt;\?\\\|]*[^\*":&gt;&lt;\?\\\|\. ]'/>
-            </xs:restriction>
-          </xs:simpleType>
-        </xs:element>
-        <xs:element name="programMenuFolder" minOccurs="0">
-          <xs:simpleType>
-            <xs:restriction base="xs:string">
-              <!-- programMenuFolder cannot begin with a / (forward-slash) or a ' ' (space), have any of these characters: *":<>?\|, and end with a . (dot) or ' ' (space) -->
-              <xs:pattern value='[^\*"/:&gt;&lt;\?\\\|\. ]|[^\*"/:&gt;&lt;\?\\\| ][^\*":&gt;&lt;\?\\\|]*[^\*":&gt;&lt;\?\\\|\. ]'/>
-            </xs:restriction>
-          </xs:simpleType>
-        </xs:element>        
-
-        <!-- Features this application can opt in to -->
-        <xs:element name="customUpdateUI" type="xs:boolean" minOccurs="0"/>
-        <xs:element name="allowBrowserInvocation" type="xs:boolean" minOccurs="0"/>
-        <xs:element name="fileTypes" minOccurs="0">
-          <xs:complexType>
-            <xs:sequence>                    
-              <xs:element name="fileType" minOccurs="0" maxOccurs="unbounded">
-                <xs:complexType>
-                  <xs:all>
-                  <xs:element name="name" type="xs:string"/>
-                  <xs:element name="extension" type="xs:string"/>
-                  <xs:element name="description" type="xs:string" minOccurs="0"/>
-                  <xs:element name="contentType" type="xs:string" minOccurs="0"/>
-                  <xs:element name="icon" type="IconType" minOccurs="0"/>
-                </xs:all>
-                </xs:complexType>
-              </xs:element>
-            </xs:sequence>
-          </xs:complexType>
-        </xs:element>
-      </xs:all>
-
-      <!-- About the runtime version required -->
-      <xs:attribute name="minimumPatchLevel" type="xs:unsignedInt"/>
-    </xs:complexType>
-  </xs:element>
-
-  <!-- Type definitions -->
-  <xs:complexType name="IconType">
-      <xs:all>
-          <xs:element name="image16x16"   type="xs:anyURI" minOccurs="0"/>
-          <xs:element name="image32x32"   type="xs:anyURI" minOccurs="0"/>
-          <xs:element name="image48x48"   type="xs:anyURI" minOccurs="0"/>
-          <xs:element name="image128x128" type="xs:anyURI" minOccurs="0"/>
-      </xs:all>
-  </xs:complexType>
-  <xs:simpleType name="UnsignedIntListType">
-    <xs:list itemType="xs:unsignedInt"/>
-  </xs:simpleType>
-  <xs:simpleType name="BoundsSizeType">
-    <xs:restriction base="UnsignedIntListType">
-      <xs:length value="2"/> 
-    </xs:restriction>
-  </xs:simpleType>
-</xs:schema>

Deleted: trunk/dna-repository/src/test/resources/TestData.pst
===================================================================
(Binary files differ)

Deleted: trunk/dna-repository/src/test/resources/aperture.example.manifest.mf
===================================================================
--- trunk/dna-repository/src/test/resources/aperture.example.manifest.mf	2009-06-04 21:46:34 UTC (rev 976)
+++ trunk/dna-repository/src/test/resources/aperture.example.manifest.mf	2009-06-04 22:31:30 UTC (rev 977)
@@ -1,12 +0,0 @@
-Manifest-Version: 1.0
-Bundle-Name: Aperture Crawling Example
-Bundle-SymbolicName: org.semanticdesktop.aperture.example
-Bundle-Description: Aperture file crawling example
-Bundle-Activator: org.semanticdesktop.aperture.examples.osgi.ExampleFileCrawlerActivator
-Require-Bundle: org.semanticdesktop.aperture,
- org.semanticdesktop.aperture.impl,
- org.semweb4j.rdf2go.api,
- org.semweb4j.rdf2go.impl.base,
- org.openrdf.rdf2go
-Import-Package: org.osgi.framework
-Eclipse-LazyStart: true

Deleted: trunk/dna-repository/src/test/resources/component-architecture.odp
===================================================================
(Binary files differ)

Deleted: trunk/dna-repository/src/test/resources/dna-repository-0.2-SNAPSHOT.jar
===================================================================
(Binary files differ)

Deleted: trunk/dna-repository/src/test/resources/docs/corel-presentations-3.0.shw
===================================================================
(Binary files differ)

Deleted: trunk/dna-repository/src/test/resources/docs/corel-presentations-x3.shw
===================================================================
(Binary files differ)

Deleted: trunk/dna-repository/src/test/resources/docs/corel-quattro-pro-6.wb2
===================================================================
(Binary files differ)

Deleted: trunk/dna-repository/src/test/resources/docs/corel-quattro-pro-7.wb3
===================================================================
(Binary files differ)

Deleted: trunk/dna-repository/src/test/resources/docs/corel-quattro-pro-x3.qpw
===================================================================
(Binary files differ)

Deleted: trunk/dna-repository/src/test/resources/docs/corel-wordperfect-4.2.wp
===================================================================
--- trunk/dna-repository/src/test/resources/docs/corel-wordperfect-4.2.wp	2009-06-04 21:46:34 UTC (rev 976)
+++ trunk/dna-repository/src/test/resources/docs/corel-wordperfect-4.2.wp	2009-06-04 22:31:30 UTC (rev 977)
@@ -1,3 +0,0 @@
-?
-
-??This is an example document created with Corel WordPerfect X3.

Deleted: trunk/dna-repository/src/test/resources/docs/corel-wordperfect-5.0.wp
===================================================================
(Binary files differ)

Deleted: trunk/dna-repository/src/test/resources/docs/corel-wordperfect-5.1-far-east.wp
===================================================================
(Binary files differ)

Deleted: trunk/dna-repository/src/test/resources/docs/corel-wordperfect-5.1.wp
===================================================================
(Binary files differ)

Deleted: trunk/dna-repository/src/test/resources/docs/corel-wordperfect-x3.wpd
===================================================================
(Binary files differ)

Deleted: trunk/dna-repository/src/test/resources/docs/counting-input-stream-test-file.dat
===================================================================
(Binary files differ)

Deleted: trunk/dna-repository/src/test/resources/docs/html-condenast.html
===================================================================
--- trunk/dna-repository/src/test/resources/docs/html-condenast.html	2009-06-04 21:46:34 UTC (rev 976)
+++ trunk/dna-repository/src/test/resources/docs/html-condenast.html	2009-06-04 22:31:30 UTC (rev 977)
@@ -1,2794 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-		
-		
-
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html>
-
-
-
-	
-	
-		
-	
-	
-	
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-		
-		
-
-
-
-	
-		
-	
-	
-
-
-
-
-
-	
-
-	
-
-	
-
-	
-
-	
-
-	
-
-
-
-	
-
-
-
-	
-	
-	
-	
-	
-	
-	
-	
-		 
-	
-
-
-
-
-
-<head>
-	<title>CondeNast - Welcome!</title>
-	<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
-	<meta name="description" content=""/>
-	<meta name="keyword" content="CondeNast, , LeftNav, Specials, AllMags, CategorizedMags, Better Together Bundles, EmployeeProducts, "/>
-		
-	<!-- useMooTools: true -->
-	
-		
-			<script src="/webapp/wcs/stores/CondeNast/lib/mootools.v1.11.js" type="text/javascript"></script>		
-			<script src="/webapp/wcs/stores/CondeNast/lib/iCarousel.js" type="text/javascript"></script>		
-		
-		
-	
-	<script type="text/javascript">
-		// jQuery.noConflict(); // Only needed if we use mootools and jQuery together
-		djConfig = { isDebug: false, parseWidgets:false, searchIds:[]};
-		var currentId = '';
-		var currentImage = '';
-	</script>
-	<script type="text/javascript" src="/webapp/wcs/stores/dojo041/dojo.js"></script>	
-	<script type="text/javascript" src="/webapp/wcs/stores/CondeNast/AJAXUserInterface/javascript/Common.js"></script>
-	<script type="text/javascript" src="/webapp/wcs/stores/CondeNast/AJAXUserInterface/javascript/ServicesEventMapping.js"></script>	
-	<script type="text/javascript" src="/webapp/wcs/stores/CondeNast/lib/cdsutils.js"></script>	
-	
-
-
-
-<!-- Start- JSP File Name: ServicesDeclaration.jsp -->
-
-
-
-<script type="text/javascript">
-<!-- <![CDATA[
-dojo.require("wc.service.*");
-wc.service.declare({
-	id: "AjaxAddOrderItem",
-	actionId: "AjaxAddOrderItem",
-	url: "AjaxOrderChangeServiceItemAdd",
-	formId: ""
-
-	,failureHandler: function(serviceResponse) {
-		if (serviceResponse.errorMessage) {
-                     alertDialog(serviceResponse.errorMessage,10001,10001,-1);
-              } else {
-                     if (serviceResponse.errorMessageKey) {
-                            alertDialog(serviceResponse.errorMessageKey,10001,10001,-1);
-                     }
-              }
-              cursor_clear();
-	}
-
-});
-//[[>-->
-</script>
-
-
-
-
-
-<script type="text/javascript">
-<!-- <![CDATA[
-dojo.require("wc.service.*");
-wc.service.declare({
-	id: "AjaxDeleteOrderItem",
-	actionId: "AjaxDeleteOrderItem",
-	url: "AjaxOrderChangeServiceItemDelete",
-	formId: ""
-
-	,failureHandler: function(serviceResponse) {
-		if (serviceResponse.errorMessage) {
-                     alertDialog(serviceResponse.errorMessage,10001,10001,-1);
-              } else {
-                     if (serviceResponse.errorMessageKey) {
-                            alertDialog(serviceResponse.errorMessageKey,10001,10001,-1);
-                     }
-              }
-              cursor_clear();
-	}
-
-});
-//[[>-->
-</script>
-
-
-
-
-
-<script type="text/javascript">
-<!-- <![CDATA[
-dojo.require("wc.service.*");
-wc.service.declare({
-	id: "AjaxUpdateOrderItem",
-	actionId: "AjaxUpdateOrderItem",
-	url: "AjaxOrderChangeServiceItemUpdate",
-	formId: ""
-
-	,failureHandler: function(serviceResponse) {
-		if (serviceResponse.errorMessage) {
-                     alertDialog(serviceResponse.errorMessage,10001,10001,-1);
-              } else {
-                     if (serviceResponse.errorMessageKey) {
-                            alertDialog(serviceResponse.errorMessageKey,10001,10001,-1);
-                     }
-              }
-              cursor_clear();
-	}
-
-});
-//[[>-->
-</script>
-
-
-
-
-
-<script type="text/javascript">
-<!-- <![CDATA[
-dojo.require("wc.service.*");
-wc.service.declare({
-	id: "AjaxUpdateOrderShippingInfo",
-	actionId: "AjaxUpdateOrderShippingInfo",
-	url: "AjaxOrderChangeServiceShipInfoUpdate",
-	formId: ""
-
-	,failureHandler: function(serviceResponse) {
-		if (serviceResponse.errorMessage) {
-                     alertDialog(serviceResponse.errorMessage,10001,10001,-1);
-              } else {
-                     if (serviceResponse.errorMessageKey) {
-                            alertDialog(serviceResponse.errorMessageKey,10001,10001,-1);
-                     }
-              }
-              cursor_clear();
-	}
-
-});
-//[[>-->
-</script>
-
-
-
-
-
-<script type="text/javascript">
-<!-- <![CDATA[
-dojo.require("wc.service.*");
-wc.service.declare({
-	id: "AjaxPrepareOrder",
-	actionId: "AjaxPrepareOrder",
-	url: "AjaxOrderProcessServiceOrderPrepare",
-	formId: ""
-
-	,failureHandler: function(serviceResponse) {
-		if (serviceResponse.errorMessage) {
-                     alertDialog(serviceResponse.errorMessage,10001,10001,-1);
-              } else {
-                     if (serviceResponse.errorMessageKey) {
-                            alertDialog(serviceResponse.errorMessageKey,10001,10001,-1);
-                     }
-              }
-              cursor_clear();
-	}
-
-});
-//[[>-->
-</script>
-
-
-
-
-
-<script type="text/javascript">
-<!-- <![CDATA[
-dojo.require("wc.service.*");
-wc.service.declare({
-	id: "AjaxSubmitOrder",
-	actionId: "AjaxSubmitOrder",
-	url: "AjaxOrderProcessServiceOrderSubmit",
-	formId: ""
-
-	,successHandler: function(serviceResponse) {
-		document.location.href = "AjaxOrderConfirmationView?storeId=" + 10001 + "&catalogId=" + 10001 + "&langId=" + -1 + "&orderId=" + serviceResponse.orderId;
-	}
-
-	,failureHandler: function(serviceResponse) {
-		if (serviceResponse.errorMessage) {
-                     alertDialog(serviceResponse.errorMessage,10001,10001,-1);
-              } else {
-                     if (serviceResponse.errorMessageKey) {
-                            alertDialog(serviceResponse.errorMessageKey,10001,10001,-1);
-                     }
-              }
-              cursor_clear();
-	}
-
-});
-//[[>-->
-</script>
-
-
-
-
-
-<script type="text/javascript">
-<!-- <![CDATA[
-dojo.require("wc.service.*");
-wc.service.declare({
-	id: "AjaxAddAddressForPerson",
-	actionId: "AjaxAddAddressForPerson",
-	url: "AjaxPersonChangeServiceAddressAdd",
-	formId: ""
-
-	,failureHandler: function(serviceResponse) {
-		if (serviceResponse.errorMessage) {
-                     alertDialog(serviceResponse.errorMessage,10001,10001,-1);
-              } else {
-                     if (serviceResponse.errorMessageKey) {
-                            alertDialog(serviceResponse.errorMessageKey,10001,10001,-1);
-                     }
-              }
-              cursor_clear();
-	}
-
-});
-//[[>-->
-</script>
-
-
-
-
-
-<script type="text/javascript">
-<!-- <![CDATA[
-dojo.require("wc.service.*");
-wc.service.declare({
-	id: "AjaxUpdateAddressForPerson",
-	actionId: "AjaxUpdateAddressForPerson",
-	url: "AjaxPersonChangeServiceAddressUpdate",
-	formId: ""
-
-	,failureHandler: function(serviceResponse) {
-		if (serviceResponse.errorMessage) {
-                     alertDialog(serviceResponse.errorMessage,10001,10001,-1);
-              } else {
-                     if (serviceResponse.errorMessageKey) {
-                            alertDialog(serviceResponse.errorMessageKey,10001,10001,-1);
-                     }
-              }
-              cursor_clear();
-	}
-
-});
-//[[>-->
-</script>
-
-
-	
-
-
-<script type="text/javascript">
-<!-- <![CDATA[
-dojo.require("wc.service.*");
-wc.service.declare({
-	id: "AjaxReplaceOrderItem",
-	actionId: "AjaxReplaceOrderItem",
-	url: "AjaxReplaceOrderItemCmd",
-	formId: ""
-
-	,failureHandler: function(serviceResponse) {
-		if (serviceResponse.errorMessage) {
-                     alertDialog(serviceResponse.errorMessage,10001,10001,-1);
-              } else {
-                     if (serviceResponse.errorMessageKey) {
-                            alertDialog(serviceResponse.errorMessageKey,10001,10001,-1);
-                     }
-              }
-              cursor_clear();
-	}
-
-});
-//[[>-->
-</script>
-
-
-
-
-
-<script type="text/javascript">
-<!-- <![CDATA[
-dojo.require("wc.service.*");
-wc.service.declare({
-	id: "AjaxOrderItemResetAddress",
-	actionId: "AjaxOrderItemResetAddress",
-	url: "AjaxOrderItemResetAddressCmd",
-	formId: ""
-
-	,failureHandler: function(serviceResponse) {
-		if (serviceResponse.errorMessage) {
-                     alertDialog(serviceResponse.errorMessage,10001,10001,-1);
-              } else {
-                     if (serviceResponse.errorMessageKey) {
-                            alertDialog(serviceResponse.errorMessageKey,10001,10001,-1);
-                     }
-              }
-              cursor_clear();
-	}
-
-});
-//[[>-->
-</script>
-
-
-
-<!-- End - JSP File Name: ServicesDeclaration.jsp -->
-
-	
-
-<script type="text/javascript">
-<!-- <![CDATA[
-dojo.require("wc.render.*");
-wc.render.declareRefreshController({
-	id: "miniShopCartAreaController",
-	renderContext: wc.render.getContextById("currentPage_Context"),
-	url: "MiniCartView?storeId=10001&catalogId=10001&justAdded=1",
-	formId: ""
-
-	,modelChangedHandler: function(message, widget) {
-		var controller = this;
-		var renderContext = this.renderContext;
-		if (message.actionId in order_updated) {	
-				var origURL = this.url;
-				if (message.orderItemId.length > 1) {					
-					this.url = this.url + '&betterTogether=1';
-				}
-				widget.refresh();
-				if (document.getElementById(currentId)) {
-					document.getElementById(currentId).src = currentImage;
-					currentId = '';
-					currentImage = '';
-				}				
-				this.url = origURL;
-			}
-	}
-
-});
-//[[>-->
-</script>
-
-	
-	<style type="text/css">
-	<!--
-	 @import url("/webapp/wcs/stores/CondeNast/css/mainCat.css");
-	-->
-	</style>
-	<link href="/webapp/wcs/stores/CondeNast/css/greybox.css" rel="stylesheet" type="text/css" media="all" />
-</head>
-<body>
-<div id="container"><!-- JSP File Name:  TopCategoriesDisplay.jsp -->
-<table width="960" align="center" border="0" cellspacing="0" cellpadding="0">
-  <tr><!--header-->
-    <td colspan="3" align="left" valign="top">	
-
-<!-- BEGIN HeaderDisplay.jspf -->
-
-
-	
-	
-	
-	
-		
-
-<!-- Start - JSP File name:  style1/CachedHeaderDisplay.jsp -->
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-		
-		
-
-
-
-
-
-
-
-	
-		
-		
-		
-		
-		
-		
-	
-	
-
-	
-
-
-<!--START HEADER-->
-
-
-
-
-
-
-
-
-	
-		
-	
-	
-	
-		
-	
-		
-	
-	
-
-<IE:clientCaps ID="oClientCaps" STYLE="behavior:url('#default#clientCaps')"></IE:clientCaps>
-<div id="header">	
-	</div>
-	<div id="subheader">	
-		<div id="subnavcontainer">
-			<ul id="subnavlist">
-				<li id="active"><a href="Home_Page" id="nav_home">Home</a></li>
-				<li id=""><a href="BrowseMagazines_Page" id="nav_browse">Browse Magazines</a></li>
-				<li id=""><a href="Categories_Page" id="nav_cat">Categories</a></li>
-				<li id=""><a href="GiveAGift_Page" id="nav_gift">Give a Gift</a></li>
-				
-					<li id=""><a href="SpecialOffers_Page" id="nav_so">Special Offers</a></li>				
-				
-				<li id=""><a href="OrderCalculate?langId=-1&amp;storeId=10001&amp;catalogId=10001&amp;URL=OrderItemDisplay%3fstoreId%3d10001%26catalogId%3d10001&amp;activeLink=Cart" id="nav_cart">Shopping Cart</a></li>
-				<li id=""><a href="MyAccount_Page" id="nav_custserv">Customer Service</a></li>
-			</ul>
-		</div>
-	</div>
-<!--END HEADER-->
-<!-- End - JSP File name:  style1/CachedHeaderDisplay.jsp -->
-
-<!-- END HeaderDisplay.jspf -->
-</td>
-  </tr>
-  <tr>
-    <td width="146" rowspan="3" align="left" valign="top" >
-
-
-<!-- BEGIN SidebarDisplay.jspf -->
-
-
-	
-	
-	
-	
-	
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-		
-		
-
-
-
-
-
-
-
-
-
-
-	
-	
-		
-	
-	
-	
-	
-	
-	
-	
-	
-	
-	
-	
-	
-<div id="leftNav"><!--<h1>Browse Magazines</h1>-->
-<ul id="logo_nav">
-	<li>
-	<img src="/webapp/wcs/stores/content/CondeNast/images/leftnavmap.png" border="0" usemap="#mags" />
-	</li>
-</ul>
-
-	
-				
-<map name="mags">
-	
-	
-		
-			
-		
-		
-	
-	
-	
-			
-				
-				
-				
-			
-	
-	<area alt="Vogue" shape="rect" coords="7,5,144,25" href="Subscriptions_Vogue">
-	
-	
-		
-			
-		
-		
-	
-	
-	
-			
-				
-				
-				
-			
-	
-	<area alt="W" shape="rect" coords="7,25,144,48" href="Subscriptions_W">
-	
-	
-		
-			
-		
-		
-	
-	
-	
-			
-				
-				
-				
-			
-	
-	<area alt="Glamour" shape="rect" coords="7,48,144,68" href="Subscriptions_Glamour">
-	
-	
-		
-			
-		
-		
-	
-	
-	
-			
-				
-				
-				
-			
-	
-	<area alt="Allure" shape="rect" coords="7,68,144,88" href="Subscriptions_allure">
-	
-	
-		
-			
-		
-		
-	
-	
-	
-			
-				
-				
-				
-			
-	
-	<area alt="Self" shape="rect" coords="7,88,144,112" href="Subscriptions_Self">
-	
-	
-		
-			
-		
-		
-	
-	
-	
-			
-				
-				
-				
-			
-	
-	<area alt="Teen Vogue" shape="rect" coords="7,112,144,131" href="Subscriptions_TeenVogue">
-	
-	
-		
-			
-		
-		
-	
-	
-	
-			
-				
-				
-				
-			
-	
-	<area alt="GQ" shape="rect" coords="7,131,144,153" href="Subscriptions_GQ">
-	
-	
-		
-			
-		
-		
-	
-	
-	
-			
-				
-				
-				
-			
-	
-	<area alt="Details" shape="rect" coords="7,153,144,173" href="Subscriptions_Details">
-	
-	
-		
-			
-		
-		
-	
-	
-	
-			
-				
-				
-				
-			
-	
-	<area alt="Men's Vogue" shape="rect" coords="7,173,144,193" href="Subscriptions_MensVogue">
-	
-	
-		
-			
-		
-		
-	
-	
-	
-			
-				
-				
-				
-			
-	
-	<area alt="Architectural Digest" shape="rect" coords="7,193,144,210" href="Subscriptions_ArchitecturalDigest">
-	
-	
-		
-			
-		
-		
-	
-	
-	
-			
-				
-				
-				
-			
-	
-	<area alt="Brides" shape="rect" coords="7,210,144,230" href="Subscriptions_Brides">
-	
-	
-		
-			
-		
-		
-	
-	
-	
-			
-				
-				
-				
-			
-	
-	<area alt="Modern Bride" shape="rect" coords="7,230,144,250" href="Subscriptions_ModernBride">
-	
-	
-		
-			
-		
-		
-	
-	
-	
-			
-				
-				
-				
-			
-	
-	<area alt="Elegant Bride" shape="rect" coords="7,250,144,275" href="Subscriptions_ElegantBride">
-	
-	
-		
-			
-		
-		
-	
-	
-	
-			
-				
-				
-				
-			
-	
-	<area alt="Lucky" shape="rect" coords="7,275,144,295" href="Subscriptions_Lucky">
-	
-	
-		
-			
-		
-		
-	
-	
-	
-			
-				
-				
-				
-			
-	
-	<area alt="Domino" shape="rect" coords="7,295,144,315" href="Subscriptions_Domino">
-	
-	
-		
-			
-		
-		
-	
-	
-	
-			
-				
-				
-				
-			
-	
-	<area alt="Golf Digest" shape="rect" coords="7,315,144,337" href="Subscriptions_GolfDigest">
-	
-	
-		
-			
-		
-		
-	
-	
-	
-			
-				
-				
-				
-			
-	
-	<area alt="Golf World" shape="rect" coords="7,337,144,359" href="Subscriptions_GolfWorld">
-	
-	
-		
-			
-		
-		
-	
-	
-	
-			
-				
-				
-				
-			
-	
-	<area alt="Golf For Women" shape="rect" coords="7,359,144,379" href="Subscriptions_GolfForWomen">
-	
-	
-		
-			
-		
-		
-	
-	
-	
-			
-				
-				
-				
-			
-	
-	<area alt="Vanity Fair" shape="rect" coords="7,379,144,397" href="Subscriptions_VanityFair">
-	
-	
-		
-			
-		
-		
-	
-	
-	
-			
-				
-				
-				
-			
-	
-	<area alt="Gourmet" shape="rect" coords="7,397,144,420" href="Subscriptions_Gourmet">
-	
-	
-		
-			
-		
-		
-	
-	
-	
-			
-				
-				
-				
-			
-	
-	<area alt="Bon App&eacute;tit" shape="rect" coords="7,428,144,446" href="Subscriptions_BonAppetite">
-	
-	
-		
-			
-		
-		
-	
-	
-	
-			
-				
-				
-				
-			
-	
-	<area alt="Cond&eacute; Nast Traveler" shape="rect" coords="7,446,144,469" href="Subscriptions_CondeNastTraveler">
-	
-	
-		
-			
-		
-		
-	
-	
-	
-			
-				
-				
-				
-			
-	
-	<area alt="Wired" shape="rect" coords="7,469,144,486" href="Subscriptions_Wired">
-	
-	
-		
-			
-		
-		
-	
-	
-	
-			
-				
-				
-				
-			
-	
-	<area alt="Cookie" shape="rect" coords="7,486,144,506" href="Subscriptions_Cookie">
-	
-	
-		
-			
-		
-		
-	
-	
-	
-			
-				
-				
-				
-			
-	
-	<area alt="Cond&eacute; Nast Portfolio" shape="rect" coords="7,506,144,529" href="Subscriptions_CondeNastPortfolio">
-	
-	
-		
-			
-		
-		
-	
-	
-	
-			
-				
-				
-				
-			
-	
-	<area alt="The New Yorker" shape="rect" coords="7,529,144,546" href="Subscriptions_NewYorker">
-					
-</map>
-
-	
-	
-</div>
-
-<!-- END SidebarDisplay.jspf -->
-</td>
-    <td colspan="2" align="left" valign="top" ></td>
-    </tr>
-  <tr><!--left nav & subheader-->
-    <!--content and right nav-->
-    <td align="left" valign="top" >
-<!--MAIN CONTENT STARTS HERE--><div id="content" style="padding-top:5px;">
-	
-			    
-                			
-                			
-                			
-                			
-                			
-                        
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-		
-		
-
-
-
-
-
-<!-- Start of the JSP: CachedTopCategoriesDisplay.jsp -->	
-	
-	
-	
-			
-				
-			    	
-			    	
-			    	
-			    	
-			    	
-			    			    	
-			    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-		
-		
-
-
-
-
-	
-	
-		
-			
-		
-		
-	
-	
-	
-		
-			<span   style=" ">
-				
-				 
-				 					
-				
-					
-					
-					
-						<img src="/webapp/wcs/stores/content/CondeNast/images/banner.gif" />
-<!--<h2 style="margin:3px 0; color:#000;padding-left:10px;">Welcome to the<span style="color:#369;"> Cond&eacute; Nast Online Magazine Store</span></h2><h3 style="margin:3px 0 15px 0; color:#000;padding-left:10px;">Buy Direct - Best Deals, Free Gifts, Free Shipping</h3> -->
-<p ><br />Home to many of the world's most celebrated magazines, Cond&eacute; Nast Publications is committed to journalistic integrity, influential reporting and superior design.</p>
-<p> Now you can buy magazines online <strong></strong>direct</strong> from Cond&eacute; 
-Nast at the lowest authorized prices available! Your satisfaction is also <strong>100% Guaranteed:</strong> you can receive a full refund for all undelivered issues, at any time, for any reason. <br /></p><br />
-
-					
-					
-					
-				
-			</span>
-		
-		
-		
-	
-
-			
-			
-						
-		
-		<div id="showcase">   
-			<div id="DEF_showcase">
-							
-					
-						
-							
-						
-						
-						
-					
-				
-				
-				<ul id="specialoffer">
-				
-					
-						
-						
-						
-						
-									
-							
-						
-	
-						
-											
-												
-								
-							
-								
-									
-								
-									
-								
-							
-						
-											
-												
-								
-							
-								
-									
-								
-									
-								
-							
-						
-											
-												
-								
-							
-								
-									
-								
-									
-								
-							
-						
-											
-												
-								
-							
-								
-									
-								
-									
-								
-							
-						
-											
-												
-								
-							
-								
-									
-								
-									
-								
-							
-						
-											
-												
-								
-							
-								
-									
-								
-									
-								
-							
-						
-											
-						
-						<li>
-							<div class="so_bg">
-											
-													
-									<h1>GQ</h1>
-									
-									<a href="ProductDisplay?catalogId=10001&amp;storeId=10001&amp;productId=10514&amp;langId=-1"><img width="100" border="0" alt="GQ" src="/webapp/wcs/stores/content/CondeNast/images/cover_gq_100.jpg" style="margin:5px 15px 5px 15px;border:1px solid #000;"/></a>
-									<!-- bundle img class="soImgBottom" -->			
-									
-													
-									
-										
-											
-										
-														
-											
-									
-										
-												
-													<div class="so_desc">
-														<br/>
-														<span class="termValue">12 issues / 1 year</span><br/>
-														<span class="cvrPrice">Cover Price: <span class="strike">$47.88</span></span><br/>
-														<span class="ourPrice">Our Price: $12.00</span><br/>
-														
-														
-														
-														
-														
-														<span class="youSave">You Save: 74%</span><br/>
-													</div>
-												
-												<form name="OrderItemAddForm_1" ACTION="OrderItemAdd" METHOD="POST" id="OrderItemAddForm_1" onsubmit="return Add2ShopCartAjax('OrderItemAddForm_1', 'addtocart_11527', '/webapp/wcs/stores/content/CondeNast/images/so_add_to_cart.gif', '/webapp/wcs/stores/content/CondeNast/images/loader_so_add_to_cart.gif', '/webapp/wcs/stores/content/CondeNast/images/so_added.gif')">
-													<input type="hidden" name="storeId" value="10001">
-													<input type="hidden" name="langId" value="-1"> 
-													<input type="hidden" name="catalogId" value="10001"> 
-													<input type="hidden" name="URL" value="OrderCalculate?URL=OrderItemResetAddressCmd?URL=TopCategoriesDisplay?catalogId=10001&amp;storeId=10001&amp;activeLink=Home&amp;langId=-1&amp;justAdded=1"> 			
-													<input type="hidden" name="quantity" value="1">	
-													<input type="hidden" name="catEntryId" value="11527">	
-													<input type="hidden" name="comment" value="GQ">	
-													<input type="image" name="addtocart" id="addtocart_11527" src="/webapp/wcs/stores/content/CondeNast/images/so_add_to_cart.gif" alt="Add to Cart" />						
-												</form>						
-										
-											
-										
-																								
-							</div>
-						</li>				
-						
-					
-						
-						
-						
-						
-						
-	
-						
-											
-												
-								
-							
-								
-									
-								
-									
-								
-							
-						
-											
-												
-								
-							
-								
-									
-								
-									
-								
-							
-						
-											
-												
-								
-							
-								
-									
-								
-									
-								
-							
-						
-											
-												
-								
-							
-								
-									
-								
-									
-								
-							
-						
-											
-												
-								
-							
-								
-									
-								
-									
-								
-							
-						
-											
-												
-								
-							
-								
-									
-								
-									
-								
-							
-						
-											
-						
-						<li>
-							<div class="so_bg">
-											
-													
-									<h1>The New Yorker</h1>
-									
-									<a href="ProductDisplay?catalogId=10001&amp;storeId=10001&amp;productId=10519&amp;langId=-1"><img width="100" border="0" alt="The New Yorker" src="/webapp/wcs/stores/content/CondeNast/images/cover_newyorker_100.jpg" style="margin:5px 15px 5px 15px;border:1px solid #000;"/></a>
-									<!-- bundle img class="soImgBottom" -->			
-									
-													
-									
-										
-											
-										
-														
-											
-									
-										
-												
-													<div class="so_desc">
-														<br/>
-														<span class="termValue">47 issues / 1 year</span><br/>
-														<span class="cvrPrice">Cover Price: <span class="strike">$196.18</span></span><br/>
-														<span class="ourPrice">Our Price: $39.95</span><br/>
-														
-														
-														
-														
-														
-														<span class="youSave">You Save: 79%</span><br/>
-													</div>
-												
-												<form name="OrderItemAddForm_2" ACTION="OrderItemAdd" METHOD="POST" id="OrderItemAddForm_2" onsubmit="return Add2ShopCartAjax('OrderItemAddForm_2', 'addtocart_11537', '/webapp/wcs/stores/content/CondeNast/images/so_add_to_cart.gif', '/webapp/wcs/stores/content/CondeNast/images/loader_so_add_to_cart.gif', '/webapp/wcs/stores/content/CondeNast/images/so_added.gif')">
-													<input type="hidden" name="storeId" value="10001">
-													<input type="hidden" name="langId" value="-1"> 
-													<input type="hidden" name="catalogId" value="10001"> 
-													<input type="hidden" name="URL" value="OrderCalculate?URL=OrderItemResetAddressCmd?URL=TopCategoriesDisplay?catalogId=10001&amp;storeId=10001&amp;activeLink=Home&amp;langId=-1&amp;justAdded=1"> 			
-													<input type="hidden" name="quantity" value="1">	
-													<input type="hidden" name="catEntryId" value="11537">	
-													<input type="hidden" name="comment" value="The New Yorker">	
-													<input type="image" name="addtocart" id="addtocart_11537" src="/webapp/wcs/stores/content/CondeNast/images/so_add_to_cart.gif" alt="Add to Cart" />						
-												</form>						
-										
-											
-										
-																								
-							</div>
-						</li>				
-						
-					
-				
-				</ul>
-			</div>
-	</div>
-	
-
-
-
-<!-- BEGIN CarouselDisplay.jspf -->
-
-
-	
-	
-	
-	
-		
-		
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-		
-		
-
-
-
-
-
-
-
-
-	
-	
-	
-		
-		
-			
-		
-		
-		
-		
-		
-		
-		
-		
-		
-		
-		
-	
-
-
-<style type="text/css">
-.carousel-component {
-	padding-left: 1px;
-	width: 615px; 
-    overflow: hidden;
-}
-.carousel-component .carousel-list li { 
-    margin:0px;
-    /*width:58px;*/
-    /*    margin-left: auto;*/ /* for testing IE auto issue */
-}
-
-.carousel-component .carousel-list li a { 
-    display:block;
-    /*border:1px solid #e2edfa;*/
-    outline:none;
-    -moz-outline:none; 
-}
-
-.carousel-component .carousel-list li a:hover { 
-    /*border: 1px solid #87bf4e; */
-}
-
-.carousel-component .carousel-list li img { 
-    /*border:1px solid #999;*/
-    display:block;
-}
-
-.carousel-component .carousel-list li strong { 
-    display:block;
-}
-.carousel-clip-region {
-	/*background: #AFC5DA none repeat;*/
-	padding-left:51px;
-}
-</style>
-
-<script type="text/javascript" src="/webapp/wcs/stores/CondeNast/lib/yahoo-dom-event.js"></script> 
-<script type="text/javascript" src="/webapp/wcs/stores/CondeNast/lib/utilities.js"></script>
-<script type="text/javascript" src="/webapp/wcs/stores/CondeNast/lib/dragdrop-min.js"></script>
-<script type="text/javascript" src="/webapp/wcs/stores/CondeNast/lib/container_core-min.js"></script>
-<script type="text/javascript" src="/webapp/wcs/stores/CondeNast/lib/ycarousel_min.js"></script>		
-<script language="javascript">
-	function ProductUrl() {
-		this.id = 0;
-		this.partNumber;
-		this.altText;
-		this.src;
-		this.url;
-		this.hasBeenLoaded = false;
-	}
-var hash = new Hash();
-var carItems = new Hash();
-var imageList = [];
-var urlList = [];
-
-/**
- * Since carousel.addItem uses an HTML string to create the interface
- * for each carousel item, this method formats the HTML for an LI.
- **/
-var fmtItem = function(imgUrl, url, title, id) {
-
-      var innerHTML = 
-          '<a href="' + 
-          url + 
-          '"><img src="' + 
-          imgUrl +
-        '" title="' +
-        title +
-        '" width="' +
-        58 +
-        '" height="' +
-        80+
-        '" id="' +
-        id+
-        '"/>' + 
-          '<\/a>';
-  
-    return innerHTML;
-    
-};
-/**
- * Custom inital load handler. Called when the carousel loads the initial
- * set of data items. Specified to the carousel as the configuration
- * parameter: loadInitHandler
- **/
-var loadInitialItems = function(type, args) {
-    var start = args[0];
-    var last = args[1]; 
-    load(this, 1, 27+10);
-    //this.moveTo(27);
-};
-/**
- * Custom load next handler. Called when the carousel loads the next
- * set of data items. Specified to the carousel as the configuration
- * parameter: loadNextHandler
- **/
-var loadNextItems = function(type, args) {    
-    var start = args[0];
-    var last = args[1]; 
-    var alreadyCached = args[2];
-
-    if(!alreadyCached) {
-        load(this, start, last);
-    	initCovers();
-    }
-};
-
-/**
- * Custom load previous handler. Called when the carousel loads the previous
- * set of data items. Specified to the carousel as the configuration
- * parameter: loadPrevHandler
- **/
-var loadPrevItems = function(type, args) {
-    var start = args[0];
-    var last = args[1]; 
-    var alreadyCached = args[2];
-    if (last == 6) {
-    	var pu = carItems.get(26);
-    	carousel.addItem(1, fmtItem(pu.src, pu.url, pu.altText, i));
-    	var pu = carItems.get(25);
-    	carousel.addItem(1, fmtItem(pu.src, pu.url, pu.altText, i));
-    	var pu = carItems.get(24);
-    	carousel.addItem(1, fmtItem(pu.src, pu.url, pu.altText, i));
-    	var pu = carItems.get(23);
-    	carousel.addItem(1, fmtItem(pu.src, pu.url, pu.altText, i));
-    } else {
-	    if(!alreadyCached) {
-	        load(this, start, last);
-	    }
-    }
-};
-
-var load = function(carousel, start, last) {
-    for(var i=start;i<=last;i++) {
-    	var itemIndex = i;
-    	while (itemIndex > 26) {
-    		itemIndex -= 26;
-    	}
-        var pu = carItems.get(itemIndex);
-        carousel.addItem(i, fmtItem(pu.src, pu.url, pu.altText, i));
-    }
-};
-
-var getRandom = function(max, last) {
-    var randomIndex;
-    do {
-        randomIndex = Math.floor(Math.random()*max);
-    } while(randomIndex == last);
-    
-    return randomIndex;
-};
-
-/**
- * Custom button state handler for enabling/disabling button state. 
- * Called when the carousel has determined that the previous button
- * state should be changed.
- * Specified to the carousel as the configuration
- * parameter: prevButtonStateHandler
- **/
-var handlePrevButtonState = function(type, args) {
-
-    var enabling = args[0];
-    var leftImage = args[1];
-/*    if(enabling) {
-        leftImage.src = "images/left-enabled.gif";    
-    } else {
-        leftImage.src = "images/left-disabled.gif";
-    }
-*/
-};
-
-/**
- * You must create the carousel after the page is loaded since it is
- * dependent on an HTML element (in this case 'dhtml-carousel'.) See the
- * HTML code below.
- **/
-
-var carousel; // for ease of debugging; globals generally not a good idea
-var pageLoad = function() 
-{
-    carousel = new YAHOO.extension.Carousel("car_container", 
-        {
-            numVisible:        10,
-            animationSpeed:    0.45,
-            scrollInc:         4,
-//            size:			   26,
-            prevElement:       "prev-arrow",
-            nextElement:       "next-arrow",
-            loadInitHandler:   loadInitialItems,
-            loadNextHandler:   loadNextItems,
-            loadPrevHandler:   loadPrevItems,
-            navMargin:		   23,
-//            wrap:			   true,
-			firstVisible: 	   27,
-            prevButtonStateHandler:   handlePrevButtonState
-        }
-    );
-    initCovers();
-};
-
-YAHOO.util.Event.addListener(window, 'load', pageLoad);
-
-function initCovers() {
-	var htNormal = 80, htSmall =80, htFull = 109,wNormal = 58, wSmall = 58, wFull = 80;
-	var cvrs = $$("ul#carousel_list_content li img");
-	var fx = new Fx.Elements(cvrs, {wait: false, duration: 300, transition: Fx.Transitions.Back.easeOut});
-	
-	cvrs.each(function(cvr, i) {
-		cvr.setStyles('width: '+wNormal+'px; height: '+htNormal+'px;');
-		cvr.addEvent("mouseenter", function(event) {
-			var o = {};
-			o[i] = {width: [cvr.getStyle("width").toInt(), wFull],height: [cvr.getStyle("height").toInt(), htFull]}
-			cvrs.each(function(other, j) {
-				if(i != j) {
-					var w = other.getStyle("width").toInt();
-					var h = other.getStyle("height").toInt();
-					if(h != htSmall) { o[j] = {height: [h, htSmall], width: [w, wSmall]}};
-				}
-			});
-			fx.start(o);
-			if ($('DEF_showcase')) {
-			var cvrIndex = cvr.getProperty('id');
-			while (cvrIndex > 26) {
-				cvrIndex -= 26;
-			}
-			var myAjax = new Ajax(hash.get(cvrIndex), 
-								 {method: 'get', 
-								  onComplete: function(resp) {
-//								  if ($('#DEF_showcase')) {
-									  $('DEF_showcase').setHTML(resp);
-//									  $('DEF_showcase').setOpacity('0');
-//									  $('UPD_showcase').setOpacity('1');
-//									  $('DEF_showcase').setStyle('display','none');
-//									  $('UPD_showcase').setStyle('display','block');
-//								  }
-								  }});
-			myAjax.request();
-			}
-		});
-		//click		
-	}); 
-
-	cvrs.addEvent("mouseleave", function(event) {
-		var o = {};
-		cvrs.each(function(cvr, i) {
-			o[i] = {width: [cvr.getStyle("width").toInt(), wNormal],height: [cvr.getStyle("height").toInt(), htNormal]}			
-		});
-		fx.start(o);
-	}); 
-	
-}
-
-</script>
-
-		
-			
-			
-								    		
-		
-									
-					   
-			<script language="javascript">
-			var productUrl = new ProductUrl();
-			productUrl.id="10523";
-			productUrl.partNumber="Vogue";
-			productUrl.altText = "Vogue";
-			productUrl.src = '/webapp/wcs/stores/content/CondeNast/images/cover_vogue_100.jpg';
-			productUrl.url = 'ProductDisplay?catalogId=10001&storeId=10001&productId=10523&langId=-1';
-			carItems.set('1', productUrl);
-			hash.set('1', 'ProductESpotDisplayView?catalogId=10001&storeId=10001&productId=10523&langId=-1&returnUrl=TopCategoriesDisplay%3fcatalogId%3d10001%26storeId%3d10001%26activeLink%3dHome%26langId%3d-1');
-			</script>
-									
-		
-									
-					   
-			<script language="javascript">
-			var productUrl = new ProductUrl();
-			productUrl.id="10524";
-			productUrl.partNumber="W";
-			productUrl.altText = "W";
-			productUrl.src = '/webapp/wcs/stores/content/CondeNast/images/cover_w_100.jpg';
-			productUrl.url = 'ProductDisplay?catalogId=10001&storeId=10001&productId=10524&langId=-1';
-			carItems.set('2', productUrl);
-			hash.set('2', 'ProductESpotDisplayView?catalogId=10001&storeId=10001&productId=10524&langId=-1&returnUrl=TopCategoriesDisplay%3fcatalogId%3d10001%26storeId%3d10001%26activeLink%3dHome%26langId%3d-1');
-			</script>
-									
-		
-									
-					   
-			<script language="javascript">
-			var productUrl = new ProductUrl();
-			productUrl.id="10510";
-			productUrl.partNumber="Glamour";
-			productUrl.altText = "Glamour";
-			productUrl.src = '/webapp/wcs/stores/content/CondeNast/images/cover_glamour_100.jpg';
-			productUrl.url = 'ProductDisplay?catalogId=10001&storeId=10001&productId=10510&langId=-1';
-			carItems.set('3', productUrl);
-			hash.set('3', 'ProductESpotDisplayView?catalogId=10001&storeId=10001&productId=10510&langId=-1&returnUrl=TopCategoriesDisplay%3fcatalogId%3d10001%26storeId%3d10001%26activeLink%3dHome%26langId%3d-1');
-			</script>
-									
-		
-									
-					   
-			<script language="javascript">
-			var productUrl = new ProductUrl();
-			productUrl.id="10001";
-			productUrl.partNumber="allure";
-			productUrl.altText = "Allure";
-			productUrl.src = '/webapp/wcs/stores/content/CondeNast/images/cover_allure_100.jpg';
-			productUrl.url = 'ProductDisplay?catalogId=10001&storeId=10001&productId=10001&langId=-1';
-			carItems.set('4', productUrl);
-			hash.set('4', 'ProductESpotDisplayView?catalogId=10001&storeId=10001&productId=10001&langId=-1&returnUrl=TopCategoriesDisplay%3fcatalogId%3d10001%26storeId%3d10001%26activeLink%3dHome%26langId%3d-1');
-			</script>
-									
-		
-									
-					   
-			<script language="javascript">
-			var productUrl = new ProductUrl();
-			productUrl.id="10520";
-			productUrl.partNumber="Self";
-			productUrl.altText = "Self";
-			productUrl.src = '/webapp/wcs/stores/content/CondeNast/images/cover_self_100.jpg';
-			productUrl.url = 'ProductDisplay?catalogId=10001&storeId=10001&productId=10520&langId=-1';
-			carItems.set('5', productUrl);
-			hash.set('5', 'ProductESpotDisplayView?catalogId=10001&storeId=10001&productId=10520&langId=-1&returnUrl=TopCategoriesDisplay%3fcatalogId%3d10001%26storeId%3d10001%26activeLink%3dHome%26langId%3d-1');
-			</script>
-									
-		
-									
-					   
-			<script language="javascript">
-			var productUrl = new ProductUrl();
-			productUrl.id="10521";
-			productUrl.partNumber="TeenVogue";
-			productUrl.altText = "Teen Vogue";
-			productUrl.src = '/webapp/wcs/stores/content/CondeNast/images/cover_teenvogue_100.jpg';
-			productUrl.url = 'ProductDisplay?catalogId=10001&storeId=10001&productId=10521&langId=-1';
-			carItems.set('6', productUrl);
-			hash.set('6', 'ProductESpotDisplayView?catalogId=10001&storeId=10001&productId=10521&langId=-1&returnUrl=TopCategoriesDisplay%3fcatalogId%3d10001%26storeId%3d10001%26activeLink%3dHome%26langId%3d-1');
-			</script>
-									
-		
-									
-					   
-			<script language="javascript">
-			var productUrl = new ProductUrl();
-			productUrl.id="10514";
-			productUrl.partNumber="GQ";
-			productUrl.altText = "GQ";
-			productUrl.src = '/webapp/wcs/stores/content/CondeNast/images/cover_gq_100.jpg';
-			productUrl.url = 'ProductDisplay?catalogId=10001&storeId=10001&productId=10514&langId=-1';
-			carItems.set('7', productUrl);
-			hash.set('7', 'ProductESpotDisplayView?catalogId=10001&storeId=10001&productId=10514&langId=-1&returnUrl=TopCategoriesDisplay%3fcatalogId%3d10001%26storeId%3d10001%26activeLink%3dHome%26langId%3d-1');
-			</script>
-									
-		
-									
-					   
-			<script language="javascript">
-			var productUrl = new ProductUrl();
-			productUrl.id="10507";
-			productUrl.partNumber="Details";
-			productUrl.altText = "Details";
-			productUrl.src = '/webapp/wcs/stores/content/CondeNast/images/cover_details_100.jpg';
-			productUrl.url = 'ProductDisplay?catalogId=10001&storeId=10001&productId=10507&langId=-1';
-			carItems.set('8', productUrl);
-			hash.set('8', 'ProductESpotDisplayView?catalogId=10001&storeId=10001&productId=10507&langId=-1&returnUrl=TopCategoriesDisplay%3fcatalogId%3d10001%26storeId%3d10001%26activeLink%3dHome%26langId%3d-1');
-			</script>
-									
-		
-									
-					   
-			<script language="javascript">
-			var productUrl = new ProductUrl();
-			productUrl.id="10517";
-			productUrl.partNumber="MensVogue";
-			productUrl.altText = "Men&#039;s Vogue";
-			productUrl.src = '/webapp/wcs/stores/content/CondeNast/images/cover_mensvogue_100.jpg';
-			productUrl.url = 'ProductDisplay?catalogId=10001&storeId=10001&productId=10517&langId=-1';
-			carItems.set('9', productUrl);
-			hash.set('9', 'ProductESpotDisplayView?catalogId=10001&storeId=10001&productId=10517&langId=-1&returnUrl=TopCategoriesDisplay%3fcatalogId%3d10001%26storeId%3d10001%26activeLink%3dHome%26langId%3d-1');
-			</script>
-									
-		
-									
-					   
-			<script language="javascript">
-			var productUrl = new ProductUrl();
-			productUrl.id="10501";
-			productUrl.partNumber="ArchitecturalDigest";
-			productUrl.altText = "Architectural Digest";
-			productUrl.src = '/webapp/wcs/stores/content/CondeNast/images/cover_archdigest_100.jpg';
-			productUrl.url = 'ProductDisplay?catalogId=10001&storeId=10001&productId=10501&langId=-1';
-			carItems.set('10', productUrl);
-			hash.set('10', 'ProductESpotDisplayView?catalogId=10001&storeId=10001&productId=10501&langId=-1&returnUrl=TopCategoriesDisplay%3fcatalogId%3d10001%26storeId%3d10001%26activeLink%3dHome%26langId%3d-1');
-			</script>
-									
-		
-									
-					   
-			<script language="javascript">
-			var productUrl = new ProductUrl();
-			productUrl.id="10502";
-			productUrl.partNumber="Brides";
-			productUrl.altText = "Brides";
-			productUrl.src = '/webapp/wcs/stores/content/CondeNast/images/cover_brides_100.jpg';
-			productUrl.url = 'ProductDisplay?catalogId=10001&storeId=10001&productId=10502&langId=-1';
-			carItems.set('11', productUrl);
-			hash.set('11', 'ProductESpotDisplayView?catalogId=10001&storeId=10001&productId=10502&langId=-1&returnUrl=TopCategoriesDisplay%3fcatalogId%3d10001%26storeId%3d10001%26activeLink%3dHome%26langId%3d-1');
-			</script>
-									
-		
-									
-					   
-			<script language="javascript">
-			var productUrl = new ProductUrl();
-			productUrl.id="10518";
-			productUrl.partNumber="ModernBride";
-			productUrl.altText = "Modern Bride";
-			productUrl.src = '/webapp/wcs/stores/content/CondeNast/images/cover_modernbride_100.jpg';
-			productUrl.url = 'ProductDisplay?catalogId=10001&storeId=10001&productId=10518&langId=-1';
-			carItems.set('12', productUrl);
-			hash.set('12', 'ProductESpotDisplayView?catalogId=10001&storeId=10001&productId=10518&langId=-1&returnUrl=TopCategoriesDisplay%3fcatalogId%3d10001%26storeId%3d10001%26activeLink%3dHome%26langId%3d-1');
-			</script>
-									
-		
-									
-					   
-			<script language="javascript">
-			var productUrl = new ProductUrl();
-			productUrl.id="10509";
-			productUrl.partNumber="ElegantBride";
-			productUrl.altText = "Elegant Bride";
-			productUrl.src = '/webapp/wcs/stores/content/CondeNast/images/cover_elegantbride_100.jpg';
-			productUrl.url = 'ProductDisplay?catalogId=10001&storeId=10001&productId=10509&langId=-1';
-			carItems.set('13', productUrl);
-			hash.set('13', 'ProductESpotDisplayView?catalogId=10001&storeId=10001&productId=10509&langId=-1&returnUrl=TopCategoriesDisplay%3fcatalogId%3d10001%26storeId%3d10001%26activeLink%3dHome%26langId%3d-1');
-			</script>
-									
-		
-									
-					   
-			<script language="javascript">
-			var productUrl = new ProductUrl();
-			productUrl.id="10516";
-			productUrl.partNumber="Lucky";
-			productUrl.altText = "Lucky";
-			productUrl.src = '/webapp/wcs/stores/content/CondeNast/images/cover_lucky_100.jpg';
-			productUrl.url = 'ProductDisplay?catalogId=10001&storeId=10001&productId=10516&langId=-1';
-			carItems.set('14', productUrl);
-			hash.set('14', 'ProductESpotDisplayView?catalogId=10001&storeId=10001&productId=10516&langId=-1&returnUrl=TopCategoriesDisplay%3fcatalogId%3d10001%26storeId%3d10001%26activeLink%3dHome%26langId%3d-1');
-			</script>
-									
-		
-									
-					   
-			<script language="javascript">
-			var productUrl = new ProductUrl();
-			productUrl.id="10508";
-			productUrl.partNumber="Domino";
-			productUrl.altText = "Domino";
-			productUrl.src = '/webapp/wcs/stores/content/CondeNast/images/cover_domino_100.jpg';
-			productUrl.url = 'ProductDisplay?catalogId=10001&storeId=10001&productId=10508&langId=-1';
-			carItems.set('15', productUrl);
-			hash.set('15', 'ProductESpotDisplayView?catalogId=10001&storeId=10001&productId=10508&langId=-1&returnUrl=TopCategoriesDisplay%3fcatalogId%3d10001%26storeId%3d10001%26activeLink%3dHome%26langId%3d-1');
-			</script>
-									
-		
-									
-					   
-			<script language="javascript">
-			var productUrl = new ProductUrl();
-			productUrl.id="10512";
-			productUrl.partNumber="GolfDigest";
-			productUrl.altText = "Golf Digest";
-			productUrl.src = '/webapp/wcs/stores/content/CondeNast/images/cover_golfdigest_100.jpg';
-			productUrl.url = 'ProductDisplay?catalogId=10001&storeId=10001&productId=10512&langId=-1';
-			carItems.set('16', productUrl);
-			hash.set('16', 'ProductESpotDisplayView?catalogId=10001&storeId=10001&productId=10512&langId=-1&returnUrl=TopCategoriesDisplay%3fcatalogId%3d10001%26storeId%3d10001%26activeLink%3dHome%26langId%3d-1');
-			</script>
-									
-		
-									
-					   
-			<script language="javascript">
-			var productUrl = new ProductUrl();
-			productUrl.id="10511";
-			productUrl.partNumber="GolfWorld";
-			productUrl.altText = "Golf World";
-			productUrl.src = '/webapp/wcs/stores/content/CondeNast/images/cover_golfworld_100.jpg';
-			productUrl.url = 'ProductDisplay?catalogId=10001&storeId=10001&productId=10511&langId=-1';
-			carItems.set('17', productUrl);
-			hash.set('17', 'ProductESpotDisplayView?catalogId=10001&storeId=10001&productId=10511&langId=-1&returnUrl=TopCategoriesDisplay%3fcatalogId%3d10001%26storeId%3d10001%26activeLink%3dHome%26langId%3d-1');
-			</script>
-									
-		
-									
-					   
-			<script language="javascript">
-			var productUrl = new ProductUrl();
-			productUrl.id="10513";
-			productUrl.partNumber="GolfForWomen";
-			productUrl.altText = "Golf For Women";
-			productUrl.src = '/webapp/wcs/stores/content/CondeNast/images/cover_golfforwomen_100.jpg';
-			productUrl.url = 'ProductDisplay?catalogId=10001&storeId=10001&productId=10513&langId=-1';
-			carItems.set('18', productUrl);
-			hash.set('18', 'ProductESpotDisplayView?catalogId=10001&storeId=10001&productId=10513&langId=-1&returnUrl=TopCategoriesDisplay%3fcatalogId%3d10001%26storeId%3d10001%26activeLink%3dHome%26langId%3d-1');
-			</script>
-									
-		
-									
-					   
-			<script language="javascript">
-			var productUrl = new ProductUrl();
-			productUrl.id="10522";
-			productUrl.partNumber="VanityFair";
-			productUrl.altText = "Vanity Fair";
-			productUrl.src = '/webapp/wcs/stores/content/CondeNast/images/cover_vanityfair_100.jpg';
-			productUrl.url = 'ProductDisplay?catalogId=10001&storeId=10001&productId=10522&langId=-1';
-			carItems.set('19', productUrl);
-			hash.set('19', 'ProductESpotDisplayView?catalogId=10001&storeId=10001&productId=10522&langId=-1&returnUrl=TopCategoriesDisplay%3fcatalogId%3d10001%26storeId%3d10001%26activeLink%3dHome%26langId%3d-1');
-			</script>
-									
-		
-									
-					   
-			<script language="javascript">
-			var productUrl = new ProductUrl();
-			productUrl.id="10515";
-			productUrl.partNumber="Gourmet";
-			productUrl.altText = "Gourmet";
-			productUrl.src = '/webapp/wcs/stores/content/CondeNast/images/cover_gourmet_100.jpg';
-			productUrl.url = 'ProductDisplay?catalogId=10001&storeId=10001&productId=10515&langId=-1';
-			carItems.set('20', productUrl);
-			hash.set('20', 'ProductESpotDisplayView?catalogId=10001&storeId=10001&productId=10515&langId=-1&returnUrl=TopCategoriesDisplay%3fcatalogId%3d10001%26storeId%3d10001%26activeLink%3dHome%26langId%3d-1');
-			</script>
-									
-		
-									
-					   
-			<script language="javascript">
-			var productUrl = new ProductUrl();
-			productUrl.id="10503";
-			productUrl.partNumber="BonAppetite";
-			productUrl.altText = "Bon App&amp;eacute;tit";
-			productUrl.src = '/webapp/wcs/stores/content/CondeNast/images/cover_bonap_100.jpg';
-			productUrl.url = 'ProductDisplay?catalogId=10001&storeId=10001&productId=10503&langId=-1';
-			carItems.set('21', productUrl);
-			hash.set('21', 'ProductESpotDisplayView?catalogId=10001&storeId=10001&productId=10503&langId=-1&returnUrl=TopCategoriesDisplay%3fcatalogId%3d10001%26storeId%3d10001%26activeLink%3dHome%26langId%3d-1');
-			</script>
-									
-		
-									
-					   
-			<script language="javascript">
-			var productUrl = new ProductUrl();
-			productUrl.id="10506";
-			productUrl.partNumber="CondeNastTraveler";
-			productUrl.altText = "Cond&amp;eacute; Nast Traveler";
-			productUrl.src = '/webapp/wcs/stores/content/CondeNast/images/cover_travel_100.jpg';
-			productUrl.url = 'ProductDisplay?catalogId=10001&storeId=10001&productId=10506&langId=-1';
-			carItems.set('22', productUrl);
-			hash.set('22', 'ProductESpotDisplayView?catalogId=10001&storeId=10001&productId=10506&langId=-1&returnUrl=TopCategoriesDisplay%3fcatalogId%3d10001%26storeId%3d10001%26activeLink%3dHome%26langId%3d-1');
-			</script>
-									
-		
-									
-					   
-			<script language="javascript">
-			var productUrl = new ProductUrl();
-			productUrl.id="11001";
-			productUrl.partNumber="Wired";
-			productUrl.altText = "Wired";
-			productUrl.src = '/webapp/wcs/stores/content/CondeNast/images/cover_wired_100.jpg';
-			productUrl.url = 'ProductDisplay?catalogId=10001&storeId=10001&productId=11001&langId=-1';
-			carItems.set('23', productUrl);
-			hash.set('23', 'ProductESpotDisplayView?catalogId=10001&storeId=10001&productId=11001&langId=-1&returnUrl=TopCategoriesDisplay%3fcatalogId%3d10001%26storeId%3d10001%26activeLink%3dHome%26langId%3d-1');
-			</script>
-									
-		
-									
-					   
-			<script language="javascript">
-			var productUrl = new ProductUrl();
-			productUrl.id="10504";
-			productUrl.partNumber="Cookie";
-			productUrl.altText = "Cookie";
-			productUrl.src = '/webapp/wcs/stores/content/CondeNast/images/cover_cookie_100.jpg';
-			productUrl.url = 'ProductDisplay?catalogId=10001&storeId=10001&productId=10504&langId=-1';
-			carItems.set('24', productUrl);
-			hash.set('24', 'ProductESpotDisplayView?catalogId=10001&storeId=10001&productId=10504&langId=-1&returnUrl=TopCategoriesDisplay%3fcatalogId%3d10001%26storeId%3d10001%26activeLink%3dHome%26langId%3d-1');
-			</script>
-									
-		
-									
-					   
-			<script language="javascript">
-			var productUrl = new ProductUrl();
-			productUrl.id="10505";
-			productUrl.partNumber="CondeNastPortfolio";
-			productUrl.altText = "Cond&amp;eacute; Nast Portfolio";
-			productUrl.src = '/webapp/wcs/stores/content/CondeNast/images/cover_portfolio_100.jpg';
-			productUrl.url = 'ProductDisplay?catalogId=10001&storeId=10001&productId=10505&langId=-1';
-			carItems.set('25', productUrl);
-			hash.set('25', 'ProductESpotDisplayView?catalogId=10001&storeId=10001&productId=10505&langId=-1&returnUrl=TopCategoriesDisplay%3fcatalogId%3d10001%26storeId%3d10001%26activeLink%3dHome%26langId%3d-1');
-			</script>
-									
-		
-									
-					   
-			<script language="javascript">
-			var productUrl = new ProductUrl();
-			productUrl.id="10519";
-			productUrl.partNumber="NewYorker";
-			productUrl.altText = "The New Yorker";
-			productUrl.src = '/webapp/wcs/stores/content/CondeNast/images/cover_newyorker_100.jpg';
-			productUrl.url = 'ProductDisplay?catalogId=10001&storeId=10001&productId=10519&langId=-1';
-			carItems.set('26', productUrl);
-			hash.set('26', 'ProductESpotDisplayView?catalogId=10001&storeId=10001&productId=10519&langId=-1&returnUrl=TopCategoriesDisplay%3fcatalogId%3d10001%26storeId%3d10001%26activeLink%3dHome%26langId%3d-1');
-			</script>
-									
-						
-			
-
-<div id="car_container">
-<div class="carousel-component">
-	<div style="text-align: center; left:5px; display: block;">
-		Click cover to find out more.<br />
-	</div><!-- show only on homepage -->
-    <div><img id="prev-arrow" class="left-button-image" src="/webapp/wcs/stores/content/CondeNast/images//left3-disabled.gif" alt="Previous group"/>
-    </div>
-    <div><img id="next-arrow" class="right-button-image" src="/webapp/wcs/stores/content/CondeNast/images//right3-disabled.gif" alt="Next group" />
-    </div>
-    <div class="carousel-clip-region">
-        <ul id="carousel_list_content" class="carousel-list">
-        </ul>
-    </div>
-</div>
-</div>
-
-
-
-<script type="text/javascript">
-
-
-
-</script>
-
-
-<!-- END CarouselDisplay.jspf -->
-
-</div><!-- MAIN CONTENT ENDS HERE -->
-</td>
-    <td align="left" valign="top" rowspan="2">    
-
-<!-- BEGIN RightSideDisplay.jspf -->
-
-
-	
-	
-	
-	
-	
-	
-	
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-		
-		
-
-
-
-
-	
-
-
-
-
-	<!-- useMooTools:2 true -->
-<div id="rightnav">
-	
-		
-		
-		
-		
-	
-		
-		<script> djConfig.searchIds.push("miniShopCartArea"); </script>
-		<div dojoType="wc:RefreshArea" id="miniShopCartArea" widgetId="miniShopCartArea" controllerId="miniShopCartAreaController">		
-	
-		
-    		
-    			
-    			
-    			    			
-            
-<!-- Start - JSP File Name: MiniShopCartDisplay.jsp -->
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-		
-		
-
-
-
-   
-
-
-
-
-
-	
-
-
-
-	
-
-
-
-
-
-
-
-
-	
-	<h1>Your Cart <img src="/webapp/wcs/stores/content/CondeNast/images/cart.png" style="border:0; vertical-align:middle;" alt="Shopping Cart" /></h1>
-	<div class="box">
-		 Cart: <span class="h_text_red">
-			0</span> item(s)
-		<br />
-		Subtotal:
-		$0.00
-		<br />
-		
-		<br />		
-		<strong><span style="float:right"><a href="OrderCalculate?langId=-1&amp;storeId=10001&amp;catalogId=10001&amp;URL=ReviewCartDisplay%3fstoreId%3d10001%26catalogId%3d10001">Check Out</a></span><a href="OrderCalculate?langId=-1&amp;storeId=10001&amp;catalogId=10001&amp;URL=OrderItemDisplay%3fstoreId%3d10001%26catalogId%3d10001&amp;activeLink=Cart">View Cart</a> </strong>
-	</div>				
-	
-				
-		</div>
-</div>
-
-<!-- END RightSideDisplay.jspf -->
-  </td>
-  </tr>
-  <tr><td>
-  <tr>
-    <td colspan="3" align="left" valign="top">
-
-<!-- BEGIN FooterDisplay.jspf -->
-
-	
-	
-	
-	
-		
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-		
-		
-
-
-
-<!-- BEGIN CachedFooterDisplay.jsp -->
-<div id="footer">
-	<br style="clear:both"/>
-<a href="ContactUsView?langId=-1&amp;storeId=10001&amp;catalogId=10001">Contact Us</a> - 
-<a href="http://www.condenastdirect.com/store/services_magazine/user" target="terms">Terms of Use</a> - 
-<a href="http://www.condenastdirect.com/store/services_magazine/privacy" target="privacy">Privacy Policy</a> - 
-<a href="http://condenastcareers.com" target="careers">Careers</a>
-<p>&copy; 2007 Cond&eacute; Nast Publications - All Rights Reserved</p>
-</div>
-
-<!-- END CachedFooterDisplay.jsp -->
-
-<!-- END FooterDisplay.jspf -->
-</td>
-  </tr>
-</table></div>
-</body></html>
\ No newline at end of file

Deleted: trunk/dna-repository/src/test/resources/docs/html-handwritten-with-wrong-file-extension.txt
===================================================================
--- trunk/dna-repository/src/test/resources/docs/html-handwritten-with-wrong-file-extension.txt	2009-06-04 21:46:34 UTC (rev 976)
+++ trunk/dna-repository/src/test/resources/docs/html-handwritten-with-wrong-file-extension.txt	2009-06-04 22:31:30 UTC (rev 977)
@@ -1,16 +0,0 @@
-<html>
-
-<head>
-	<title>Example document</title>
-	<meta name="author" content="Chris">
-	<meta name="keywords" content="extractor, test, rdf">
-	<meta name="description" content="testing the html extractor">
-</head>
-
-<body>
-	<h1>Example document</h1>
-	
-	<p>This is some example text.
-</body>
-
-</html>
\ No newline at end of file

Deleted: trunk/dna-repository/src/test/resources/docs/html-handwritten.html
===================================================================
--- trunk/dna-repository/src/test/resources/docs/html-handwritten.html	2009-06-04 21:46:34 UTC (rev 976)
+++ trunk/dna-repository/src/test/resources/docs/html-handwritten.html	2009-06-04 22:31:30 UTC (rev 977)
@@ -1,16 +0,0 @@
-<html>
-
-<head>
-	<title>Example document</title>
-	<meta name="author" content="Chris">
-	<meta name="keywords" content="extractor, test, rdf">
-	<meta name="description" content="testing the html extractor">
-</head>
-
-<body>
-	<h1>Example document</h1>
-	
-	<p>This is some example text.
-</body>
-
-</html>
\ No newline at end of file

Deleted: trunk/dna-repository/src/test/resources/docs/html-quelle.de.html
===================================================================
--- trunk/dna-repository/src/test/resources/docs/html-quelle.de.html	2009-06-04 21:46:34 UTC (rev 976)
+++ trunk/dna-repository/src/test/resources/docs/html-quelle.de.html	2009-06-04 22:31:30 UTC (rev 977)
@@ -1,2636 +0,0 @@
-<!-- TemplateBegin: $Archive:   //pvcssrv02.service.itellium.net/pvcsfs/b2ccc/pvcsprojekte/Q2_Gesamt/archives/enfinity/share/private/eCS/Store/templates/de/q_category_10000.isml-arc  $ $Revision:   1.9  $ -->
-
-<!-- Hallo //-->
-
-
-
-
-
-
-
-
-
-
-
-
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
-"http://www.w3.org/TR/html4/loose.dtd">
-<html>
-<head>
-<meta name="INTERSHOP" content="Powered by INTERSHOP Enfinity"/>
-
-<script type="text/javascript">
-var storefront = true;
-</script>
-<!-- TemplateBegin : inc/q6_first_include.isml  $Revision$ -->
-
-<script type="text/javascript">
-var WebRoot='http://images.quelle.de/is-bin/intershop.static/WFS/Quelle-quelle_de-Site/-/de_DE';
-var d=new Date();
-var dat=d.getYear()+''+d.getMonth()+''+d.getDate();
-document.write('<scr'+'ipt type="text/javascr'+'ipt" src="'+WebRoot+'/js/basic.js?idrefresh='+dat+'"><\/scr'+'ipt>');
-if ( (typeof(window['storefront']) == "undefined") || (storefront !== true) ){
-document.write('<scr'+'ipt type="text/javascr'+'ipt" src="'+WebRoot+'/js/q_cookie.js?idrefresh='+dat+'"><\/scr'+'ipt>');}
-</script>
-<script type="text/javascript">
-var sid = '';
-if ( sid != '' ) {
-sid = sid.substring(5, sid.length);
-} else {
-sid = getCookie('sid');
-}
-</script>
-
-<!-- TemplateEnd : inc/q6_first_include.isml $Revision$ -->
-
-<title> quelle.de </title>
-<link rel="stylesheet" href="http://images.quelle.de/is-bin/intershop.static/WFS/Quelle-quelle_de-Site/-/de_DE/css/position.css" type="text/css">
-<link rel="stylesheet" href="http://images.quelle.de/is-bin/intershop.static/WFS/Quelle-quelle_de-Site/-/de_DE/css/font.css" type="text/css">
-<link rel="shortcut icon" href="http://images.quelle.de/is-bin/intershop.static/WFS/Quelle-quelle_de-Site/-/de_DE/imagesOnline/favicon.ico">
-<!-- Template Begin:  inc/q_minibasket_ecs.isml (sld_ch_quelle_app) -->
-
-
-
-<link rel="shortcut icon" href="http://images.quelle.de/is-bin/intershop.static/WFS/Quelle-quelle_de-Site/-/de_DE/imagesOnline/favicon.ico">
-
-<script type="text/javascript">
-<!--
-var testProduktSKU = '';
-var testProduktAAID = '';
-setCookie("CookieActive", "yes");
-if(getBasketSum().length < 1) {
-setCookie("BasketSum", "0.00");
-}
-if(getBasketElemCount().length < 1) {
-setCookie("BasketElemCount", 0);
-}
-function prepareMBPrice(price){
-//alert(price+"do");
-price = price.replace(/\,/,".")
-if(price.indexOf(".") != price.lastIndexOf(".")){
-price=price.replace(".","");
-}
-//alert(price+"posle");
-return price;
-}
-function NNuser() {
-var ns4=document.layers;
-if(ns4) {
-window.open("http://www.quelle.de/is-bin/INTERSHOP.enfinity/WFS/Quelle-quelle_de-Site/de_DE/-/EUR/Q_ViewTemplate_ecs-View?Template=q_quick_basket_hinweis_nn_popup&Linktype=K", "QuickBasketNN", "width=250,height=262,toolbar=no,location=0,directories=0,status=0,menubar=0,scrollbars=no,resizeable=no");
-}
-}
-function getBasketSum(){
-var bs = getCookie("BasketSum");
-if (bs != null && bs != -1 && bs != "N/A" && bs != "undefined"){
-return bs.replace(/,/,"."); // return value with Euro symbol
-}else{
-return "0.00";}
-}
-function getBasketElemCount(){
-var ec = getCookie("BasketElemCount");
-if (ec != null && ec != -1 && ec != "N/A" && ec != "undefined"){
-return ec;
-}
-else {
-return 0;
-}
-}
-var bBasketClick = false; //this variable is also used in q_basket_direct_order
-function callZurKasse()
-{
-if (!bBasketClick)
-{
-switch_zum_warenkorb_button();
-window.setTimeout('window.location.href = "https://www.quelle.de/is-bin/INTERSHOP.enfinity/WFS/Quelle-quelle_de-Site/de_DE/-/EUR/Q_ViewBasketOpt-DispatchForm?Linktype=AB";',100);
-window.bBasketClick = true;
-}
-try {document.getElementById("zurKasseBTN").href = "";} catch(e) {}
-}
-function callExpressKasse()
-{
-if (!bBasketClick)
-{
-window.location.href = "https://www.quelle.de/is-bin/INTERSHOP.enfinity/WFS/Quelle-quelle_de-Site/de_DE/-/EUR/Q_ViewBasketOpt-DispatchForm?Linktype=AB";
-bBasketClick = true;
-}
-try {document.getElementById("zurExpressKasseBTN").href = "";} catch(e) {}
-}
-function printMiniBasket(catalogbarPipelineInclude) {
-var html;
-if(getCookie('CookieActive') != "")
-{
-html = '<span id="bluebar-minibasket-k1gfx"><img src="http://images.quelle.de/is-bin/intershop.static/WFS/Quelle-quelle_de-Site/-/de_DE/imagesOnline/q5_kasse1.gif" width="17" height="15" border="0" alt=""></span>';
-html += '<span id="basketelementcount" style="position:absolute;left:140px;top:4px;" class="q-normal-12px-darkgray">Artikel: <b>' + getBasketElemCount() + '</b></span>';
-html += '<span id="basketsum" style="position:absolute;left:204px;top:4px;" class="q-normal-12px-darkgray">Summe: <b>' + getBasketSum() + ' &euro;</b></span>';
-if (catalogbarPipelineInclude != null && catalogbarPipelineInclude == 'true')
-{
-html = html + '<span style="position:absolute;left:34px;top:26px;"><a href="https://www.quelle.de/is-bin/INTERSHOP.enfinity/WFS/Quelle-quelle_de-Site/de_DE/-/EUR/Q_ViewBasketOpt-DispatchForm?Linktype=AB" id="zurKasseBTN" class="q-normal-11px-darkblue">direkt zur Kasse</a></span>';
-}
-else
-{
-html = html + '<span style="position:absolute;left:34px;top:26px;"><a href="javascript:if (top.frames.length == 0) javascript:callZurKasse(); else location.href=\'https://www.quelle.de/is-bin/INTERSHOP.enfinity/WFS/Quelle-quelle_de-Site/de_DE/-/EUR/Q_ViewBasketOpt-DispatchForm?Linktype=AB\'"';
-html = html + ' id="zurKasseBTN" class="q-normal-11px-darkblue">direkt zur Kasse</a></span>';
-}
-}
-else
-{
-html = '<span style="position:absolute;top:26px;left:6px;" class="q-normal-10px-darkblue">Eine Anzeige ist nur mit <a href="javascript:showHelp();" class="q-normal-11px-darkblue"><b>aktivierten Cookies</b></a> m&ouml;glich.</span>';
-}
-document.write(html);
-}
-function showHelp() {
-newWin('CookieHelp','http://www.quelle.de/is-bin/INTERSHOP.enfinity/WFS/Quelle-quelle_de-Site/de_DE/-/EUR/Q_ViewStatic-CookieHelp',462,568,'scrollbars=no');
-}
-function updateMiniBasket(basketsum, basketelementcount)
-{
-if(getCookie('CookieActive') != "")
-{
-//Dynmic-Basket Interface call
-if ((typeof(dynBasket) != "undefined") && (dynBasket != null)) {
-dynBasket.productNumberDisplay.innerHTML = "<b>"+basketelementcount+"</b> Artikel";
-dynBasket.productSumDisplay.innerHTML = "Artikel:&nbsp;&nbsp;<b>"+basketelementcount+"</b> Summe:&nbsp;&nbsp;<b>"+basketsum.replace(/\./,",")+"&nbsp;&euro;</b>";
-dynBasket.stateDisplay.innerHTML = "<img src='"+dynBasket.imageList.open+"' class='bild' onclick='"+dynBasket.id+".toggle();'>";
-dynBasket.dirty = true;
-}
-//document.getElementById("basketelementcount").innerHTML="Artikel: <b>" + basketelementcount + "</b>";
-//document.getElementById("basketsum").innerHTML="Summe: <b>" + basketsum.replace(/\./,",") + " &euro;</b>";
-}
-}
-if (typeof(testProdukt) == "undefined"){
-testProdukt = false;
-}
-// fuer "In den WK" Button ohne Redirect
-function addToBasket( price, quantity, sLink )
-{
-if (!testProdukt) {
-price = price.replace(/,/,".");
-basketSum = getBasketSum();
-basketCount = getBasketElemCount();
-try {
-if (document.getElementById("amount").value > 1) {
-sLink = sLink + '&Quantity=' + document.getElementById("amount").value;
-quantity = document.getElementById("amount").value;
-}
-} catch(e) {}
-if( price.indexOf("EUR") == 0 )
-{
-iLen = price.length;
-price = price.substring( 3, iLen );
-}
-basketCount = basketCount * 1;
-if( basketCount < 19 )
-{
-basketSum = basketSum * 1 + price * quantity;
-basketCount = basketCount + 1;
-basketSum = Math.round(basketSum*Math.pow(10,2))/Math.pow(10,2);
-setCookie("BasketElemCount", basketCount);
-setCookie("BasketSum", basketSum.toFixed(2));
-if ( (typeof(show_rec2_ok) != "undefined") && show_rec2_ok) {
-switch_wkbutton();
-}
-var bi = new Image();
-var dat = new Date;
-var anID = ('' + dat.getTime()) + ('' + Math.random());
-bi.src = sLink + '&randomid=' + anID;
-updateMiniBasket(basketSum.toFixed(2), basketCount);
-after_basket(quantity);
-}
-else
-{
-window.location.href = "https://www.quelle.de/is-bin/INTERSHOP.enfinity/WFS/Quelle-quelle_de-Site/de_DE/-/EUR/Q_ViewBasketOpt-View?Linktype=AB&ERROR_Basket=BasketSize";
-}
-}
-else
-{
-var tmp;
-switch_wkbutton();
-tmp = sLink.substring(sLink.indexOf("ProductSKU=")+11, sLink.length);
-testProduktSKU = tmp.substring(0, tmp.indexOf("&"));
-tmp = sLink.substring(sLink.indexOf("AAID=")+5, sLink.length);
-testProduktAAID = tmp.substring(0, tmp.indexOf("&"));
-after_basket(quantity);
-}
-}
-// nach addToBasket
-function after_basket(quantity) {
-var url;
-var sku;
-if (q6content) {
-url = "http://www.quelle.de/is-bin/INTERSHOP.enfinity/WFS/Quelle-quelle_de-Site/de_DE/-/EUR/Q_ProductRecommendation-Rec2NewStatic?textonly=true";
-} else {
-url = "http://www.quelle.de/is-bin/INTERSHOP.enfinity/WFS/Quelle-quelle_de-Site/de_DE/-/EUR/Q_ProductRecommendation-Rec2Static?textonly=true";
-}
-if ( (typeof(FileShowRecommended) != "undefined") && FileShowRecommended && (typeof(REAnzeigePA2) != "undefined") && REAnzeigePA2) {
-sku = '';
-if (last_action == 'infobox') { sku = document.getElementById("infobox_bstnr").innerHTML.substr(5, 6); }
-try {
-if (q6content) {
-url = "http://www.quelle.de/is-bin/INTERSHOP.enfinity/WFS/Quelle-quelle_de-Site/de_DE/-/EUR/Q_ProductRecommendation-Rec2New?textonly=true&ShortSKU=" + sku;
-}
-if (testProdukt) {
-url = "http://www.quelle.de/is-bin/INTERSHOP.enfinity/WFS/Quelle-quelle_de-Site/de_DE/-/EUR/Q_ProductRecommendation-Rec2New?textonly=true&ShortSKU=" + sku + "&Quantity=" + quantity + "&TestProdukt=" + testProdukt + "&TestProduktSKU=" + testProduktSKU + "&AAID=" + testProduktAAID + "&CategoryName=QuelleRoot&TestProduktID=" + UUID;
-}
-} catch (e) {
-url = "http://www.quelle.de/is-bin/INTERSHOP.enfinity/WFS/Quelle-quelle_de-Site/de_DE/-/EUR/Q_ProductRecommendation-Rec2?textonly=true&ShortSKU=" + sku;
-}
-}
-if ( (typeof(show_rec2_ok) != "undefined") && show_rec2_ok) {
-show_rec2(url);
-//// CODE FamilienBonus ///
-var cGrID = ''; //005 = QuelleMarket Produkt
-var fburl = 'http://www.quelle.de/is-bin/INTERSHOP.enfinity/WFS/Quelle-quelle_de-Site/de_DE/-/EUR/Q_ViewFamilienBonus-Teaser';
-try {
-fb_mehrwert(cGrID, fburl);
-} catch (e) {}
-/// CODE FamilienBonus END ///
-} else {
-conf();
-}
-}
-// fuer "In den WK" Button mit Product Parameter (use in inc/q4-product160-wkb.isml)
-function addToBasketProd( price, quantity, sLink, product )
-{
-var bi;
-var anID;
-var dat;
-price=prepareMBPrice(price);
-basketSum = getBasketSum();
-basketCount = getBasketElemCount();
-if( price.indexOf("EUR") == 0 )
-{
-iLen = price.length;
-price = price.substring( 3, iLen );
-}
-basketCount = basketCount * 1;
-if( basketCount < 19 )
-{
-basketSum = basketSum * 1 + price * quantity;
-basketCount = basketCount + 1;
-basketSum = Math.round(basketSum*Math.pow(10,2))/Math.pow(10,2);
-setCookie("BasketElemCount", basketCount);
-setCookie("BasketSum", basketSum.toFixed(2));
-if ( (typeof(show_rec2_ok) != "undefined") && show_rec2_ok) {
-switch_wkbutton();
-}
-// set prod parameter, defined in product_rec.js
-prod = product;
-bi = new Image();
-bi.onload = after_basket;
-dat = new Date();
-anID = ('' + dat.getTime()) + ('' + Math.random());
-bi.src = sLink + '&randomid=' + anID;
-updateMiniBasket(basketSum.toFixed(2), basketCount);
-}
-else
-{
-window.location.href = "https://www.quelle.de/is-bin/INTERSHOP.enfinity/WFS/Quelle-quelle_de-Site/de_DE/-/EUR/Q_ViewBasketOpt-View?Linktype=AB&ERROR_Basket=BasketSize";
-}
-}
-// fuer "In den WK" von Fashionshow
-function addManyToBasket( price, quantity, articleAmout, sLink )
-{
-var aImg;
-price = prepareMBPrice(price);
-basketSum = getBasketSum();
-basketCount = getBasketElemCount();
-if( price.indexOf("EUR") == 0 )
-{
-iLen = price.length;
-price = price.substring( 3, iLen );
-}
-basketCount = basketCount * 1;
-if( basketCount + articleAmout <= 19 )
-{
-basketSum = basketSum * 1 + price * quantity;
-basketCount = basketCount + articleAmout;
-basketSum = Math.round(basketSum*Math.pow(10,2))/Math.pow(10,2);
-setCookie("BasketElemCount", basketCount);
-setCookie("BasketSum", basketSum.toFixed(2));
-aImg = new Image();
-aImg.src = sLink.replace(/\"/g, '%22');
-updateMiniBasket(basketSum.toFixed(2), basketCount);
-conf();
-}
-else
-{
-window.location.href = "https://www.quelle.de/is-bin/INTERSHOP.enfinity/WFS/Quelle-quelle_de-Site/de_DE/-/EUR/Q_ViewBasketOpt-View?Linktype=AB&ERROR_Basket=BasketSize";
-}
-}
-//-->
-</script>
-
-<script type="text/javascript">
-<!--
-if( typeof(PD_RANDOM) != "undefined" && PD_RANDOM > 0 )
-{
-if(getCookie('CookieActive') != "")
-{
-// phaydon cookie is set
-if(getCookie('phaydon') != "" )
-{
-pdCookie = getCookie("phaydon");
-if( pdCookie == 1 )
-{
-sendpath(true);
-}
-}
-else // cookie not set yet
-{
-raz = 0.5 + PD_RANDOM * ( Math.random() );
-raz = Math.round(raz);
-if (raz == PD_RANDOM) // alle x. te
-{
-setCookie("phaydon", 1);
-sendpath(true);
-}
-else
-{
-setCookie("phaydon", 0);
-}
-}
-}
-}
-document.write('<scr'+'ipt type="text/javascr'+'ipt" src="http://www.quelle.de/is-bin/INTERSHOP.enfinity/WFS/Quelle-quelle_de-Site/de_DE/-/EUR/Q_Survey-Start"?idrefresh='+dat+'"><\/scr'+'ipt>');
-//-->
-</script>
-<script type="text/javascript">
-<!--
-
-
-
-
-//-->
-</script>
-<!-- Template End: inc/q_minibasket_ecs.isml (sld_ch_quelle_app) -->
-
-<style type="text/css">
-<!--
-.q-history {position:absolute; top:155px; left:20px; width:777px; height:14px; z-index:3; display:none; visibility:hidden;}
--->
-</style>
-</head>
-<body>
-<!-- Template Begin:  inc/q_blueBar_ecs.isml (sld_ch_quelle_app) -->
-
-
-<!-- Template Begin:  inc/q_blueBar_content_ecs.isml (sld_ch_quelle_app) -->
-
-
-
-
-<!-- 1341640805070541-->
-
-
-
-<!-- 1341640805070541-->
-
-<script type="text/javascript">
-function changeBlueBarSearchCacheCtrl() {
-var foundItem = false;
-var sSearchFree;
-var sSearchReplace;
-var sSearchCache;
-sSearchFree = document.BlueBarSearch.search_free.value; // after ToUpper !
-sSearchReplace = "";
-for (i=0; i<itemsSearchCacheCtrl.length;i++) {
-if (sSearchFree == itemsSearchCacheCtrl[i].search_free) {
-foundItem = true;
-sSearchReplace = itemsSearchCacheCtrl[i].search_replace; // can be empty ""
-sSearchCache = itemsSearchCacheCtrl[i].search_cache;
-break;
-}
-}
-if (foundItem) {
-document.BlueBarSearch.search_replace.value = sSearchReplace;
-document.BlueBarSearch.search_cache.value = sSearchCache;
-}
-}
-// end 18.02.2004
-</script>
-
-<!-- q4-qtaste_include.isml -->
-
-
-
-
-
-
-
-
-<script type="text/javascript">
-<!--
-var d=new Date;
-var m=d.getMonth();
-var t=d.getDate();
-var j=d.getYear();
-j=(j>=2000)?j:((j<80)?j+2000:j+1900);
-var dat=(j+''+m+''+t);
-//-->
-</script>
-
-<script type="text/javascript">
-<!--
-if ( (typeof(window['storefront']) == "undefined") || (storefront !== true) ){
-document.write('<scr'+'ipt type="text\/javascript" src="http://images.quelle.de/is-bin/intershop.static/WFS/Quelle-quelle_de-Site/-/de_DE\/js\/fehlertoleranz.js?idrefresh='+dat+'"><\/scr'+'ipt>');}
-//-->
-</script>
-<script type="text/javascript">
-<!--
-var keyCount = 0, pwd = "qQ";
-var naObj = new Array("text","file","password");
-function keyCheck(e) {
-var obj = (document.all) ? window.event.srcElement : e.target;
-var qOk = true;
-if (obj.type) {
-for (i=0;i<naObj.length;i++) {
-if (qOk) {qOk = (obj.type.toLowerCase() != naObj[i]);}
-}
-if (!qOk && obj.tagName && obj.tagName.toLowerCase() != "input") {qOk = true;}
-}
-if (obj.type == "textarea") {qOk = false;}
-if (qOk) {winTrigger(((document.all) ? window.event.keyCode : e.which));}
-}
-function winTrigger(taste) {
-for (i=0;i<pwd.length;i++) {
-if (taste == pwd.charCodeAt(i)) {
-jumpto("https://www.quelle.de/is-bin/INTERSHOP.enfinity/WFS/Quelle-quelle_de-Site/de_DE/-/EUR/Q_Taste06-Start");
-break;
-}
-}
-}
-if (document.layers) {
-window.captureEvents(Event.KEYPRESS);
-window.onkeypress = keyCheck;
-} else {
-document.onkeydown = keyCheck;
-}
-//-->
-</script>
-
-
-<script type="text/javascript">
-<!--
-popini("http://www.quelle.de/is-bin/INTERSHOP.enfinity/WFS/Quelle-quelle_de-Site/de_DE/-/EUR/Q_ViewStatic-ViewPopup?CategoryName=1&Template=static%2Fq_welcome_popup&OmitHTMLWrapper=1" , location.href , "http://www.quelle.de/is-bin/INTERSHOP.enfinity/WFS/Quelle-quelle_de-Site/de_DE/-/EUR/Q_AmendDictionary-SetGoodbyePage");
-//-->
-</script>
-
-<!-- Resolution check -->
-<script>
-if ( (typeof(PaRefreshActivated) == 'undefined') && (typeof(window['storefront']) == "undefined") || (storefront !== true) ) {
-document.write('<scr'+'ipt type="text/javascr'+'ipt" src="http://images.quelle.de/is-bin/intershop.static/WFS/Quelle-quelle_de-Site/-/de_DE/js/reswitch.js?idrefresh='+dat+'"><\/scr'+'ipt>');
-}
-</script>
-<!-- TemplateEnd -->
-
-
-
-
-
-
-
-
-
-
-<script type="text/javascript">
-<!--
-function conf() {
-var conf_win;
-//bBasketClick=true; Bug 7888 Auskommentiert, da kein Reload von ProduktAnsicht mehr
-if( (document.cookie.indexOf("BasketElemCount") == -1) || (getCookieValue("BasketElemCount") < 19) ) {
-conf_win = window.open("http://www.quelle.de/is-bin/INTERSHOP.enfinity/WFS/Quelle-quelle_de-Site/de_DE/-/EUR/Q_ViewStatic-ViewPopup?Template=q_basket_conf", "Warenkorb", "width=250,height=262,toolbar=no,location=0,directories=0,status=0,menubar=0,scrollbars=no,resizeable=0");
-}
-conf_win.opener=self;
-conf_win.focus();
-}
-function zuHome () {
-if( (window.location.protocol == "https:") || ((document.cookie.indexOf('CookieActive') != -1) && (getCookie("UserLoggedIn") == "true")) )
-{
-jumpto("https://www.quelle.de/is-bin/INTERSHOP.enfinity/WFS/Quelle-quelle_de-Site/de_DE/-/EUR/Q_ViewLogin-Home?Linktype=B");
-} else {
-jumpto("http://www.quelle.de/is-bin/INTERSHOP.enfinity/WFS/Quelle-quelle_de-Site/de_DE/-/EUR/Q_ViewLogin-Home?Linktype=B");
-}
-}
-function loggingImage() {
-var url;
-var params;
-cookieName = 'ClientParameter';
-pipeline = 'http://www.quelle.de/is-bin/INTERSHOP.enfinity/WFS/Quelle-quelle_de-Site/de_DE/-/EUR/Q_ClientParameters-Start';
-pipeline = pipeline.substr(pipeline.indexOf('/',7));
-if (document.cookie.indexOf(cookieName) == -1){ // not set before ?
-document.cookie = cookieName+'=yes; path=/'; // set cookie
-params = 'Resolution='+screen.width+'x'+screen.height;
-params = params + '&ColorDepth='+screen.colorDepth;
-url = pipeline+'?'+params;
-while(url.search(/ /) != -1) {
-url = url.replace(/ /, '%20');
-}
-document.write('<div style="position:absolute;top:0px;left:0px;"><img src="' + url + '" width="1" height="1" border="0"></div>');
-}
-}
-loggingImage();
-if(document.cookie.indexOf('CookieActive')==-1 && document.URL.indexOf("Bannerref")!=-1) {
-document.cookie = "znx=; path=/; expires=Wed, 1 Jan 2003 12:00:00 GMT";
-}
-
-var selectedMenu = "QuelleRoot";
-var enfsession = '';
-var parse_enfsession = enfsession.substr(5);
-//-->
-</script>
-<noscript>
-<div style="position:absolute;top:0px;left:0px;"><img src="http://www.quelle.de/is-bin/INTERSHOP.enfinity/WFS/Quelle-quelle_de-Site/de_DE/-/EUR/Q_ClientParameters-Start" width="1" height="1" border="0"></div>
-</noscript>
-<style type="text/css">
-<!--
-.q4-component-bg-white{background-color:#FFFFFF;border-color:#164093;}
-
-.q4-component-bg-shop, .q-mehrwert-1px-dotted-line, .q-mehrwert-250px-div-border, .q-mehrwert-250px-div-border-neutral{background-color:#E4E9F4;}
-
-
-.q4-component-bg-shop, .q-mehrwert-1px-dotted-line, .q-mehrwert-250px-div-border, .q-mehrwert-250px-div-border-neutral{border-color:#4463A1;}
-.q4-component-bg-shop2{background-color:#4463A1;}
-
-
-
--->
-</style>
-
-
-<script type="text/javascript">
-var pcready;
-function loadPersComps()
-{
-if (pcready == null)
-{
-// Pr?fe ob Zugriff auf AS notwendig (getCookieValue => Funktion aus general-JS)
-if (getCookieValue('udc') != null && getCookieValue('udc') != '')
-{
-pcready = false;
-getPersonalComponents();
-}
-else
-{
-pcready = true;
-}
-}
-}
-function getPersonalComponents()
-{
-if (window.XMLHttpRequest)
-{
-pcreq = new XMLHttpRequest();
-}
-else
-{
-if(window.ActiveXObject)
-{
-pcreq = new ActiveXObject("Microsoft.XMLHTTP");
-}
-}
-if (pcreq != null)
-{
-pcreq.onreadystatechange = pccallback;
-
-pcreq.open("GET", "http://www.quelle.de/is-bin/INTERSHOP.enfinity/WFS/Quelle-quelle_de-Site/de_DE/-/EUR/Q_DeterminePersonalizedContent-GetComponentURLs?CategoryName=QuelleRoot&ActionGroupID=261", true);
-
-pcreq.send('');
-}
-}
-// Zurueckschreiben der AJAX-Rueckmeldung
-function pccallback()
-{
-if (pcreq.readyState == 4)
-{
-pcready = true;
-}
-}
-</script>
-
-
-<script type="text/javascript">
-var browsername = navigator.userAgent;
-var posi = browsername.search(/Netscape.+/);
-if(posi != -1){
-document.write('<div style="position:relative;height:53px;width:985px;border:2px solid red;background-color:white">');
-document.write('<div style="position:relative;height:20px;width:910px;margin-left:8px;margin-top:4px">');
-document.write('<table>');
-document.write('<tr>');
-document.write('<td>');
-document.write('<img src="http://images.quelle.de/is-bin/intershop.static/WFS/Quelle-quelle_de-Site/-/de_DE/imagesOnline/achtung_01.gif" style="vertical-align:middle" alt="">');
-document.write('<img src="http://images.quelle.de/is-bin/intershop.static/WFS/Quelle-quelle_de-Site/-/de_DE/imagesOnline/space.gif" width="6" height="10" border=0 alt="">');
-document.write('</td>');
-document.write('<td style="font-size:12px;color:darkblue">');
-document.write('Lieber Kunde, Sie verwenden einen Browser der von Quelle.de nicht unterst&uuml;tzt wird. Um alle Features der Quelle Webseite');
-document.write('</td>');
-document.write('</tr>');
-document.write('<tr>');
-document.write('<td></td>');
-document.write('<td style="font-size:12px;color:darkblue">');
-document.write('nutzen zu k&ouml;nnen nutzen Sie bitte einen der folgenden Browser: Internet Explorer, Firefox, Opera und Safari.');
-document.write('</td>');
-document.write('</tr>');
-document.write('</table>');
-document.write('</div>');
-document.write('</div>');
-}
-</script>
-<iframe id="killSelectElement" style="position:absolute;z-index:98;top:166px;visibility:hidden;display:none;" src="http://images.quelle.de/is-bin/intershop.static/WFS/Quelle-quelle_de-Site/-/de_DE/imagesOnline/space.gif"></iframe>
-<!-- Tracker:10217 -->
-<noscript>
-<div style="position:relative;height:53px;width:985px;border:2px solid red;background-color:white">
-<div style="position:relative;height:20px;width:910px;margin-left:8px;margin-top:4px">
-<table>
-<tr>
-<td>
-<img src="http://images.quelle.de/is-bin/intershop.static/WFS/Quelle-quelle_de-Site/-/de_DE/imagesOnline/achtung_01.gif" style="vertical-align:middle" alt="">
-<img src="http://images.quelle.de/is-bin/intershop.static/WFS/Quelle-quelle_de-Site/-/de_DE/imagesOnline/space.gif" width="6" height="10" border=0 alt="">
-</td>
-<td style="font-size:12px;color:darkblue">
-JavaScript ist in Ihrem Browser nicht aktiviert. Entweder unterst?tzt Ihr Browser kein JavaScript oder Sie haben JavaScript aus Sicherheitsgr?nden abgeschaltet.
-</td>
-</tr>
-<tr>
-<td></td>
-<td style="font-size:12px;color:darkblue">
-Um alle Features der Quelle Webseite nutzen zu k?nnen, schalten Sie bitte <a href="http://www.quelle.de/is-bin/INTERSHOP.enfinity/WFS/Quelle-quelle_de-Site/de_DE/-/EUR/Q_ViewStatic-ViewPage?ProductSKU=static3148" style="font-size:12px;color:red">JavaScript ein</a>.
-</td>
-</tr>
-</table>
-</div>
-</div>
-</noscript>
-
-<div id="bluebar" style="background-color: white;">
-<div id="bluebar-qtaste">
-<a href="https://www.quelle.de/is-bin/INTERSHOP.enfinity/WFS/Quelle-quelle_de-Site/de_DE/-/EUR/Q_Taste06-Start?Linktype=A"><img src="http://images.quelle.de/is-bin/intershop.static/WFS/Quelle-quelle_de-Site/-/de_DE/imagesOnline/Head_qtaste.gif" width="260" height="77" border="0" alt="Q-Taste"></a>
-</div>
-<div id="bluebar-banner">
-<script type="text/javascript">
-var bluebar_banner_baseurl = 'http://www.quelle.de/is-bin/INTERSHOP.enfinity/WFS/Quelle-quelle_de-Site/de_DE/-/EUR/Q_ViewTemplate-View';
-update_bluebar_banner();
-</script>
-</div>
-<div id="bluebar-blue-banner">
-<div id="bluebar-search-lens"><img src="http://images.quelle.de/is-bin/intershop.static/WFS/Quelle-quelle_de-Site/-/de_DE/imagesOnline/bbar_lens.gif" alt="Suchen nach" border="0" align="bottom"></div>
-<div id="bluebar-search-txt" class="q-bold-14px-white">Suche:</div>
-<div id="bluebar-pres-txt"><img src="http://images.quelle.de/is-bin/intershop.static/WFS/Quelle-quelle_de-Site/-/de_DE/imagesOnline/quelle_hp_BlauesBand.gif" alt="Ideen f?r ein sch&ouml;neres Leben" border="0"></div>
-<script type="text/javascript">
-<!--
-var defaulttext = "Bitte Produkt oder Bestellnr. eingeben";
-//-->
-</script>
-
-<form action="http://www.quelle.de/is-bin/INTERSHOP.enfinity/WFS/Quelle-quelle_de-Site/de_DE/-/EUR/Q_FreeSearch-Start" method="get" name="BlueBarSearch" onsubmit="return changeBlueBarSearchTextToUpper()" style="margin:0px;padding:0px;" autocomplete="off" accept-charset="ISO-8859-1">
-	<div id="bluebar-search-field">
-		
-			<input type="text" name="search_input" id="search_input" style="color:#000000;width:225px;font-size:12px;" value="" onclick="get_search_library();if(this.value==defaulttext)this.value='';return false" onblur="if( this.value.replace(/\s/g, '') == '' )this.value=defaulttext; return false">
-		
-		<input type="hidden" name="search_free" value="">
-		<input type="hidden" name="fh_view_size" value="10">
-		<input type="hidden" name="fh_sort_by" value="">
-		<input type="hidden" name="enfaction" value="msearch">
-		<input type="hidden" name="action" value="search" >
-		<input type="hidden" name="Linktype" value="E">
-		<input type="hidden" name="fh_location" value="//quelle_de/de_DE">^
-		
-	</div>
-	<div id="bluebar-search-btn">
-		<input type="Image" src="http://images.quelle.de/is-bin/intershop.static/WFS/Quelle-quelle_de-Site/-/de_DE/imagesOnline/q5_search_btn.gif" width="37" height="20" alt="Los" border="0" id="search_go">
-	</div>
-</form>
-
-<script type="text/javascript">
-<!--
-
-
-	document.BlueBarSearch.search_input.value = defaulttext;
-
-
-function changeBlueBarSearchTextToUpper()
-{
-	var DOM;
-	var sText;
-	var whiteSpaces1 = /^\s+/;
-	var whiteSpaces2 = /\s+$/;
-	
-	expireDate = new Date();
-	expireDate.setDate(expireDate.getDate());
-	document.cookie = "searchcompare=;expires=" + expireDate.toGMTString() + ";path=/";
-	
-	sText = document.BlueBarSearch.search_input.value;
-	sText = sText.replace(whiteSpaces1, "");
-	sText = sText.replace(whiteSpaces2, "");
-
-	if (sText == "" || sText == defaulttext)
-	{
-		return false;
-	}
-	else
-	{
-		DOM = (document.getElementById)? true : false;
-		if (DOM)
-		{
-			
-			if (navigator.userAgent.indexOf('Safari') == -1)
-			{
-				document.getElementById("search_input").disabled = true;
-			}
-			document.getElementById("search_go").disabled = true;
-		}
-		document.BlueBarSearch.search_input.value = sText;
-		document.BlueBarSearch.search_free.value = sText.toLowerCase();
-		orderProcessSurvey('search');
-		return true;
-	}
-}
-//-->
-</script>
-
-<div id="bluebar-search-verlauf">&nbsp;</div>
-<div id="bluebar-qlogo">
-<a href="http://www.quelle.de/is-bin/INTERSHOP.enfinity/WFS/Quelle-quelle_de-Site/de_DE/-/EUR/Q_Storefront-Start?Linktype=A"><img src="http://images.quelle.de/is-bin/intershop.static/WFS/Quelle-quelle_de-Site/-/de_DE/imagesOnline/bbar_qlogo.gif" width="188" height="54" border="0" alt="QUELLE"></a>
-</div>
-</div>
-
-
-
-<!-- TemplateBegin : $Archive:   //pvcssrv02.service.itellium.net/pvcsfs/b2ccc/pvcsprojekte/Q2_Gesamt/archives/enfinity/share/private/eCS/Store/templates/de/inc/q_catalogbar_include.isml-arc  $ $Revision:   1.26  $ -->
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-<div id="bluebar-category-reiter-container">
-<script type="text/javascript">
-if (checkHideLayerNavigation()) {
-document.write('<div style="display: none;">');
-}
-</script>
-<table border="0" cellspacing="0" cellpadding="0" width="980">
-<tr>
-
-<td width="1" height="34" bgcolor="#CCCCCC"><img src="http://images.quelle.de/is-bin/intershop.static/WFS/Quelle-quelle_de-Site/-/de_DE/imagesOnline/space.gif" width="1" height="34" border="0" alt=""></td>
-<td id="r_QuelleRoot" width="45" valign="middle" align="center" bgcolor="#FFFFFF" class="catbar_home" onClick="orderProcessSurvey('catalogbar'); top.location.href='http://www.quelle.de/is-bin/INTERSHOP.enfinity/WFS/Quelle-quelle_de-Site/de_DE/-/EUR/Q_Storefront-Start?Linktype=G'" nowrap>Home</td>
-
-
-
-
-<td width="2" height="34" align="left"><img src="http://images.quelle.de/is-bin/intershop.static/WFS/Quelle-quelle_de-Site/-/de_DE/imagesOnline/q_trenn_verlauf.gif" border="0" alt=""></td>
-<td width="63" id="r_50000010" style="overflow:hidden; text-align:center" class="catbar_inact_new" align="center" valign="middle" bgcolor="#FFFFFF" background="http://images.quelle.de/is-bin/intershop.static/WFS/Quelle-quelle_de-Site/-/de_DE/imagesOnline/q_verlauf_bg.gif" nowrap onmouseover="if (typeof displayLayer == 'function')displayLayer('50000010',true, 'http://images.quelle.de/is-bin/intershop.static/WFS/Quelle-quelle_de-Site/-/de_DE', false,'#CC0033');" onmouseout="if (typeof displayLayer == 'function')displayLayer('50000010',false,'http://images.quelle.de/is-bin/intershop.static/WFS/Quelle-quelle_de-Site/-/de_DE', false);" onClick="orderProcessSurvey('catalogbar'); top.location.href='http://www.quelle.de/is-bin/INTERSHOP.enfinity/WFS/Quelle-quelle_de-Site/de_DE/-/EUR/Q_BrowseCatalog-Start?CategoryName=50000010&Linktype=G'">Aktuelles</td>
-
-
-
-
-
-<td width="2" height="34" align="left"><img src="http://images.quelle.de/is-bin/intershop.static/WFS/Quelle-quelle_de-Site/-/de_DE/imagesOnline/q_trenn_verlauf.gif" border="0" alt=""></td>
-<td width="65" id="r_50000059" style="overflow:hidden; text-align:center" class="catbar_inact_new" align="center" valign="middle" bgcolor="#FFFFFF" background="http://images.quelle.de/is-bin/intershop.static/WFS/Quelle-quelle_de-Site/-/de_DE/imagesOnline/q_verlauf_bg.gif" nowrap onmouseover="if (typeof displayLayer == 'function')displayLayer('50000059',true, 'http://images.quelle.de/is-bin/intershop.static/WFS/Quelle-quelle_de-Site/-/de_DE', false,'#556622');" onmouseout="if (typeof displayLayer == 'function')displayLayer('50000059',false,'http://images.quelle.de/is-bin/intershop.static/WFS/Quelle-quelle_de-Site/-/de_DE', false);" onClick="orderProcessSurvey('catalogbar'); top.location.href='http://www.quelle.de/is-bin/INTERSHOP.enfinity/WFS/Quelle-quelle_de-Site/de_DE/-/EUR/Q_BrowseCatalog-Start?CategoryName=50000059&Linktype=G'">Mode<BR>f&uuml;r SIE</td>
-
-
-
-
-
-<td width="2" height="34" align="left"><img src="http://images.quelle.de/is-bin/intershop.static/WFS/Quelle-quelle_de-Site/-/de_DE/imagesOnline/q_trenn_verlauf.gif" border="0" alt=""></td>
-<td width="65" id="r_50000138" style="overflow:hidden; text-align:center" class="catbar_inact_new" align="center" valign="middle" bgcolor="#FFFFFF" background="http://images.quelle.de/is-bin/intershop.static/WFS/Quelle-quelle_de-Site/-/de_DE/imagesOnline/q_verlauf_bg.gif" nowrap onmouseover="if (typeof displayLayer == 'function')displayLayer('50000138',true, 'http://images.quelle.de/is-bin/intershop.static/WFS/Quelle-quelle_de-Site/-/de_DE', false,'#556622');" onmouseout="if (typeof displayLayer == 'function')displayLayer('50000138',false,'http://images.quelle.de/is-bin/intershop.static/WFS/Quelle-quelle_de-Site/-/de_DE', false);" onClick="orderProcessSurvey('catalogbar'); top.location.href='http://www.quelle.de/is-bin/INTERSHOP.enfinity/WFS/Quelle-quelle_de-Site/de_DE/-/EUR/Q_BrowseCatalog-Start?CategoryName=50000138&Linktype=G'">Mode<BR>f&uuml;r IHN</td>
-
-
-
-
-
-<td width="2" height="34" align="left"><img src="http://images.quelle.de/is-bin/intershop.static/WFS/Quelle-quelle_de-Site/-/de_DE/imagesOnline/q_trenn_verlauf.gif" border="0" alt=""></td>
-<td width="70" id="r_50000732" style="overflow:hidden; text-align:center" class="catbar_inact_new" align="center" valign="middle" bgcolor="#FFFFFF" background="http://images.quelle.de/is-bin/intershop.static/WFS/Quelle-quelle_de-Site/-/de_DE/imagesOnline/q_verlauf_bg.gif" nowrap onmouseover="if (typeof displayLayer == 'function')displayLayer('50000732',true, 'http://images.quelle.de/is-bin/intershop.static/WFS/Quelle-quelle_de-Site/-/de_DE', false,'#556622');" onmouseout="if (typeof displayLayer == 'function')displayLayer('50000732',false,'http://images.quelle.de/is-bin/intershop.static/WFS/Quelle-quelle_de-Site/-/de_DE', false);" onClick="orderProcessSurvey('catalogbar'); top.location.href='http://www.quelle.de/is-bin/INTERSHOP.enfinity/WFS/Quelle-quelle_de-Site/de_DE/-/EUR/Q_BrowseCatalog-Start?CategoryName=50000732&Linktype=G'">Baby, Kind<BR>&amp; Spielen</td>
-
-
-
-
-
-<td width="2" height="34" align="left"><img src="http://images.quelle.de/is-bin/intershop.static/WFS/Quelle-quelle_de-Site/-/de_DE/imagesOnline/q_trenn_verlauf.gif" border="0" alt=""></td>
-<td width="73" id="r_50000180" style="overflow:hidden; text-align:center" class="catbar_inact_new" align="center" valign="middle" bgcolor="#FFFFFF" background="http://images.quelle.de/is-bin/intershop.static/WFS/Quelle-quelle_de-Site/-/de_DE/imagesOnline/q_verlauf_bg.gif" nowrap onmouseover="if (typeof displayLayer == 'function')displayLayer('50000180',true, 'http://images.quelle.de/is-bin/intershop.static/WFS/Quelle-quelle_de-Site/-/de_DE', false,'#007788');" onmouseout="if (typeof displayLayer == 'function')displayLayer('50000180',false,'http://images.quelle.de/is-bin/intershop.static/WFS/Quelle-quelle_de-Site/-/de_DE', false);" onClick="orderProcessSurvey('catalogbar'); top.location.href='http://www.quelle.de/is-bin/INTERSHOP.enfinity/WFS/Quelle-quelle_de-Site/de_DE/-/EUR/Q_BrowseCatalog-Start?CategoryName=50000180&Linktype=G'">Technik &amp;<BR>Multimedia</td>
-
-
-
-
-
-<td width="2" height="34" align="left"><img src="http://images.quelle.de/is-bin/intershop.static/WFS/Quelle-quelle_de-Site/-/de_DE/imagesOnline/q_trenn_verlauf.gif" border="0" alt=""></td>
-<td width="72" id="r_50000283" style="overflow:hidden; text-align:center" class="catbar_inact_new" align="center" valign="middle" bgcolor="#FFFFFF" background="http://images.quelle.de/is-bin/intershop.static/WFS/Quelle-quelle_de-Site/-/de_DE/imagesOnline/q_verlauf_bg.gif" nowrap onmouseover="if (typeof displayLayer == 'function')displayLayer('50000283',true, 'http://images.quelle.de/is-bin/intershop.static/WFS/Quelle-quelle_de-Site/-/de_DE', false,'#007788');" onmouseout="if (typeof displayLayer == 'function')displayLayer('50000283',false,'http://images.quelle.de/is-bin/intershop.static/WFS/Quelle-quelle_de-Site/-/de_DE', false);" onClick="orderProcessSurvey('catalogbar'); top.location.href='http://www.quelle.de/is-bin/INTERSHOP.enfinity/WFS/Quelle-quelle_de-Site/de_DE/-/EUR/Q_BrowseCatalog-Start?CategoryName=50000283&Linktype=G'">Haushalts-<BR>ger&auml;te</td>
-
-
-
-
-
-<td width="2" height="34" align="left"><img src="http://images.quelle.de/is-bin/intershop.static/WFS/Quelle-quelle_de-Site/-/de_DE/imagesOnline/q_trenn_verlauf.gif" border="0" alt=""></td>
-<td width="70" id="r_50000373" style="overflow:hidden; text-align:center" class="catbar_inact_new" align="center" valign="middle" bgcolor="#FFFFFF" background="http://images.quelle.de/is-bin/intershop.static/WFS/Quelle-quelle_de-Site/-/de_DE/imagesOnline/q_verlauf_bg.gif" nowrap onmouseover="if (typeof displayLayer == 'function')displayLayer('50000373',true, 'http://images.quelle.de/is-bin/intershop.static/WFS/Quelle-quelle_de-Site/-/de_DE', false,'#644f3e');" onmouseout="if (typeof displayLayer == 'function')displayLayer('50000373',false,'http://images.quelle.de/is-bin/intershop.static/WFS/Quelle-quelle_de-Site/-/de_DE', false);" onClick="orderProcessSurvey('catalogbar'); top.location.href='http://www.quelle.de/is-bin/INTERSHOP.enfinity/WFS/Quelle-quelle_de-Site/de_DE/-/EUR/Q_BrowseCatalog-Start?CategoryName=50000373&Linktype=G'">Wohnen &amp;<BR>Haushalt</td>
-
-
-
-
-
-<td width="2" height="34" align="left"><img src="http://images.quelle.de/is-bin/intershop.static/WFS/Quelle-quelle_de-Site/-/de_DE/imagesOnline/q_trenn_verlauf.gif" border="0" alt=""></td>
-<td width="72" id="r_50000483" style="overflow:hidden; text-align:center" class="catbar_inact_new" align="center" valign="middle" bgcolor="#FFFFFF" background="http://images.quelle.de/is-bin/intershop.static/WFS/Quelle-quelle_de-Site/-/de_DE/imagesOnline/q_verlauf_bg.gif" nowrap onmouseover="if (typeof displayLayer == 'function')displayLayer('50000483',true, 'http://images.quelle.de/is-bin/intershop.static/WFS/Quelle-quelle_de-Site/-/de_DE', false,'#644f3e');" onmouseout="if (typeof displayLayer == 'function')displayLayer('50000483',false,'http://images.quelle.de/is-bin/intershop.static/WFS/Quelle-quelle_de-Site/-/de_DE', false);" onClick="orderProcessSurvey('catalogbar'); top.location.href='http://www.quelle.de/is-bin/INTERSHOP.enfinity/WFS/Quelle-quelle_de-Site/de_DE/-/EUR/Q_BrowseCatalog-Start?CategoryName=50000483&Linktype=G'">Auto, Haus<BR>&amp; Garten</td>
-
-
-
-
-
-<td width="2" height="34" align="left"><img src="http://images.quelle.de/is-bin/intershop.static/WFS/Quelle-quelle_de-Site/-/de_DE/imagesOnline/q_trenn_verlauf.gif" border="0" alt=""></td>
-<td width="88" id="r_50000598" style="overflow:hidden; text-align:center" class="catbar_inact_new" align="center" valign="middle" bgcolor="#FFFFFF" background="http://images.quelle.de/is-bin/intershop.static/WFS/Quelle-quelle_de-Site/-/de_DE/imagesOnline/q_verlauf_bg.gif" nowrap onmouseover="if (typeof displayLayer == 'function')displayLayer('50000598',true, 'http://images.quelle.de/is-bin/intershop.static/WFS/Quelle-quelle_de-Site/-/de_DE', false,'#644f3e');" onmouseout="if (typeof displayLayer == 'function')displayLayer('50000598',false,'http://images.quelle.de/is-bin/intershop.static/WFS/Quelle-quelle_de-Site/-/de_DE', false);" onClick="orderProcessSurvey('catalogbar'); top.location.href='http://www.quelle.de/is-bin/INTERSHOP.enfinity/WFS/Quelle-quelle_de-Site/de_DE/-/EUR/Q_BrowseCatalog-Start?CategoryName=50000598&Linktype=G'">Sport, Reisen<BR>&amp; Freizeit</td>
-
-
-
-
-
-<td width="2" height="34" align="left"><img src="http://images.quelle.de/is-bin/intershop.static/WFS/Quelle-quelle_de-Site/-/de_DE/imagesOnline/q_trenn_verlauf.gif" border="0" alt=""></td>
-<td width="88" id="r_50000336" style="overflow:hidden; text-align:center" class="catbar_inact_new" align="center" valign="middle" bgcolor="#FFFFFF" background="http://images.quelle.de/is-bin/intershop.static/WFS/Quelle-quelle_de-Site/-/de_DE/imagesOnline/q_verlauf_bg.gif" nowrap onmouseover="if (typeof displayLayer == 'function')displayLayer('50000336',true, 'http://images.quelle.de/is-bin/intershop.static/WFS/Quelle-quelle_de-Site/-/de_DE', false,'#556622');" onmouseout="if (typeof displayLayer == 'function')displayLayer('50000336',false,'http://images.quelle.de/is-bin/intershop.static/WFS/Quelle-quelle_de-Site/-/de_DE', false);" onClick="orderProcessSurvey('catalogbar'); top.location.href='http://www.quelle.de/is-bin/INTERSHOP.enfinity/WFS/Quelle-quelle_de-Site/de_DE/-/EUR/Q_BrowseCatalog-Start?CategoryName=50000336&Linktype=G'">Schmuck<BR>&amp; Geschenke </td>
-
-
-
-
-
-<td width="2" height="34" align="left"><img src="http://images.quelle.de/is-bin/intershop.static/WFS/Quelle-quelle_de-Site/-/de_DE/imagesOnline/q_trenn_verlauf.gif" border="0" alt=""></td>
-<td width="92" id="r_50000880" style="overflow:hidden; text-align:center" class="catbar_inact_new" align="center" valign="middle" bgcolor="#FFFFFF" background="http://images.quelle.de/is-bin/intershop.static/WFS/Quelle-quelle_de-Site/-/de_DE/imagesOnline/q_verlauf_bg.gif" nowrap onmouseover="if (typeof displayLayer == 'function')displayLayer('50000880',true, 'http://images.quelle.de/is-bin/intershop.static/WFS/Quelle-quelle_de-Site/-/de_DE', false,'#CC0033');" onmouseout="if (typeof displayLayer == 'function')displayLayer('50000880',false,'http://images.quelle.de/is-bin/intershop.static/WFS/Quelle-quelle_de-Site/-/de_DE', false);" onClick="orderProcessSurvey('catalogbar'); top.location.href='http://www.quelle.de/is-bin/INTERSHOP.enfinity/WFS/Quelle-quelle_de-Site/de_DE/-/EUR/Q_BrowseCatalog-Start?CategoryName=50000880&Linktype=G'">B&uuml;cher,<BR>Filme &amp; Musik</td>
-
-
-
-
-
-<td width="2" height="34" align="left"><img src="http://images.quelle.de/is-bin/intershop.static/WFS/Quelle-quelle_de-Site/-/de_DE/imagesOnline/q_trenn_verlauf.gif" border="0" alt=""></td>
-<td width="92" id="r_500544" style="overflow:hidden; text-align:center" class="catbar_inact_new" align="center" valign="middle" bgcolor="#FFFFFF" background="http://images.quelle.de/is-bin/intershop.static/WFS/Quelle-quelle_de-Site/-/de_DE/imagesOnline/q_verlauf_bg.gif" nowrap onmouseover="if (typeof displayLayer == 'function')displayLayer('500544',true, 'http://images.quelle.de/is-bin/intershop.static/WFS/Quelle-quelle_de-Site/-/de_DE', false,'#CC0033');" onmouseout="if (typeof displayLayer == 'function')displayLayer('500544',false,'http://images.quelle.de/is-bin/intershop.static/WFS/Quelle-quelle_de-Site/-/de_DE', false);" onClick="orderProcessSurvey('catalogbar'); top.location.href='http://www.quelle.de/is-bin/INTERSHOP.enfinity/WFS/Quelle-quelle_de-Site/de_DE/-/EUR/Q_BrowseCatalog-Start?CategoryName=500544&Linktype=G'">Schn&auml;ppchen<BR>&amp; Auktionen</td>
-
-
-
-
-
-</tr>
-</table>
-<script type="text/javascript">
-if (checkHideLayerNavigation()) {
-document.write('</div>');
-}
-</script>
-<div width="980" height="1" style="background-color:#FFF;border-top-width:1px;border-top-color:#CCCCCC;"></div>
-</div>
-
-
-
-
-</div> <!-- bluebar -->
-
-<script type="text/javascript">
-<!--
-function clientlogout()
-{
-setUserLoggedInCookie("false");
-document.cookie = "ProBesyCostumer=no; path=/";
-updateMiniBasket("0.00", "0");
-// alternativ aktives logout
-logoutIMG = new Image();
-logoutIMG.src = "https://www.quelle.de/is-bin/INTERSHOP.enfinity/WFS/Quelle-quelle_de-Site/de_DE/-/EUR/Q_ViewLogout-Process?clientlogout=true";
-if( typeof(isHomePage) != "undefined" ) {
-checkLoginSwitch();
-}
-}
-if(document.cookie.indexOf('CookieActive') != -1)
-{
-if(getCookie("UserLoggedIn") == "true")
-{
-setTimeout("clientlogout()", 1800000); // 30 Minuten
-}
-}
-//-->
-</script>
-<!-- Template End: inc/q_blueBar_content_ecs.isml (sld_ch_quelle_app) -->
-
-<!-- Template End: inc/q_blueBar_ecs.isml (sld_ch_quelle_app) -->
-
-<div id="content-container">
-<div id="content">
-
-<!-- TemplateBegin : $Archive:   //pvcssrv02.service.itellium.net/pvcsfs/b2ccc/pvcsprojekte/Q2_Gesamt/archives/enfinity/share/private/eCS/Store/templates/de/scc/container-types/nxm.isml-arc  $ $  $-->
-
-
-
-<!-- generiert am May 5, 2008 10:26:34 PM -->
-
-
-
-
-
-
-
-<div style="position:relative;height:1076px;overflow:hidden;">
-<div style="position:absolute;overflow:hidden;width:700px;left:0px;top:0px;">
-
- 
-<!-- TemplateBegin : scc/component-types/10.isml -->
-<div id="welcome-cookie-container">
-<script type="text/javascript">
-var DEFAULTWELCOMEMESSAGE = '<span class="q5-welcome-msg" style="position:relative;top:8px;font-size:12px;"><b>Hallo lieber Kunde und herzlich willkommen auf quelle.de!</b> Melden Sie sich gleich <a href="http://www.quelle.de/is-bin/INTERSHOP.enfinity/WFS/Quelle-quelle_de-Site/de_DE/-/EUR/Q_ViewLogin-LoginPrefix" class="q-bold-12px-darkblue"><u>hier an</u></a> und nutzen Sie Ihre Vorteile!</span>';
-// Pr?fe ob Zugriff auf AS notwendig (getCookieValue => Funktion aus general-JS)
-if (getCookieValue('udc') != null && getCookieValue('udc') != '')
-setPersonalWelcomeText();
-else
-setWelcomeTextDIV(DEFAULTWELCOMEMESSAGE);
-// Setze Ajax-Call ab, zur Ermittllung des persoenlichen Begruessungstextes
-function setPersonalWelcomeText(){
-if (window.XMLHttpRequest){
-udcreq = new XMLHttpRequest();
-}
-else{
-if(window.ActiveXObject)
-udcreq = new ActiveXObject("Microsoft.XMLHTTP");
-}
-if (udcreq != null){
-udcreq.onreadystatechange = callback;
-udcreq.open("GET", "http://www.quelle.de/is-bin/INTERSHOP.enfinity/WFS/Quelle-quelle_de-Site/de_DE/-/EUR/Q_ProcessUserCookie-Include?Template=q_personal_welcome&show=true", true);
-udcreq.send('');
-}
-}
-// Zurueckschreiben der AJAX-Rueckmeldung
-function callback(){
-if (udcreq.readyState == 4)
-{
-if (udcreq.status == 200)
-setWelcomeTextDIV(udcreq.responseText);
-else
-setWelcomeTextDIV(DEFAULTWELCOMEMESSAGE);
-}
-}
-function setWelcomeTextDIV(aText){
-document.getElementById("welcome-cookie-container").innerHTML = aText;
-}
-</script>
-</div>
-<!-- TemplateEnd -->
-
-</div>
-<div style="position:absolute;overflow:hidden;width:190px;left:765px;top:5px;">
-
-<!-- TemplateBegin : $Archive:   //pvcssrv02.service.itellium.net/pvcsfs/b2ccc/pvcsprojekte/Q2_Gesamt/archives/enfinity/share/private/eCS/Store/templates/de/inc/q_dynamicBasket.isml-arc  $ $Revision: 19811 $-->
-
-
-<div style="position: relative; top: 0px; left: 0px; height: 100px; width: 190px;">
-<div style="position: relative; top: -2px; left: 0px; width: 190px; height: 20px;">
-<script type="text/javascript">
-<!--
-document.write("&nbsp;&nbsp;<a href='https://www.quelle.de/is-bin/INTERSHOP.enfinity/WFS/Quelle-quelle_de-Site/de_DE/-/EUR/Q_ViewLogin-Home?Linktype=D' class='q-bold-12px-darkblue' style='text-decoration: underline'>Meine Quelle</a><span class='q-bold-12px-darkblue'>&nbsp;&nbsp;|&nbsp;&nbsp;</span>");
-if(document.cookie.indexOf('CookieActive') != -1) {
-if(getCookie("UserLoggedIn") == "true" || document.location.hostname.indexOf("meinepost") != -1) {
-document.write("<a href='https://www.quelle.de/is-bin/INTERSHOP.enfinity/WFS/Quelle-quelle_de-Site/de_DE/-/EUR/Q_ViewLogout-Process?Linktype=D'><span class='q-bold-12px-darkblue'><u>Logout</u></span></a>");
-} else {
-document.write("<a href='https://www.quelle.de/is-bin/INTERSHOP.enfinity/WFS/Quelle-quelle_de-Site/de_DE/-/EUR/Q_ViewLogin-View?Linktype=D'><span class='q-bold-12px-darkblue'><u>Login</u></span></a>");
-}
-} else {
-document.write("<a href='https://www.quelle.de/is-bin/INTERSHOP.enfinity/WFS/Quelle-quelle_de-Site/de_DE/-/EUR/Q_ViewLogin-View?Linktype=D'><span class='q-bold-12px-darkblue'><u>Login/Logout</u></span></a>");
-}
-//-->
-</script>
-</div>
-<script type="text/javascript">
-if (getBasketElemCount() != 0 || storefront != true){
-document.write('<scr'+'ipt type="text/javascr'+'ipt" src="'+WebRoot+'/js/dynamicBasket.js?idrefresh='+dat+'"><\/scr'+'ipt>');
-document.write('<scr'+'ipt type="text/javascr'+'ipt" src="'+WebRoot+'/js/xmlhttprequest.js?idrefresh='+dat+'"><\/scr'+'ipt>');
-}
-</script>
-
-<style type="text/css">
-<!--
-.dynWarenkorb {width:190px;background:#c1cbe4;overflow: hidden;z-index: 10;position: relative;top : 0px;left: 0px;}
-.warenkorbHelperFrame {z-index: 1;position: absolute;top: 0px;left: 0px;width: 190px;}
-/*.dynWarenkorb .kopfbereich {width:190px; height:25px;background:#d81a26;color:white;}*/
-.dynWarenkorb .kopfbereich {width:190px; height:25px;background-image: url('http://images.quelle.de/is-bin/intershop.static/WFS/Quelle-quelle_de-Site/-/de_DE/imagesOnline/basket/q_ajax_wk_header.gif');background-color: #003399; color:white;}
-.dynWarenkorb .kopfbereich .headline-warenkorb {color:white;font-weight:bold;padding:4px 15px 0px 6px;margin:0px;float:left;}
-.dynWarenkorb .kopfbereich .headline-artikel {color:white;font-size:11px;float:left;padding:5px 4px 3px 0px;margin:0px}
-.dynWarenkorb .headline-preis {width:190px;height:22px;background-color:white;margin-bottom: 1px; color: #003399; font-size: 12px; padding-top: 3px; padding-left: 10px; }
-.dynWarenkorb .aufklapp-button {width:190px;height:30px;background-color:white;text-align:left;padding-left: 8px;}
-.dynWarenkorb .aufklapp-button .bild {margin:4px 4px 0px 0px;cursor: pointer;}
-.dynWarenkorb .produktListe {overflow: hidden;}
-.dynWarenkorb .produkt {width:190px;height:65px;margin:1px 0px 0px 0px;background:white;*height:65px;overflow: hidden;position: relative;}
-.dynWarenkorb .produkt .produktbild {float:left;width:65px; height:48px;margin-right: 3px}
-.dynWarenkorb .produkt .produktbild .prodMenge {font-size: 9px; color:#a5adc2; padding-top: 2px; width: 55px; height: 12px; overflow: hidden; padding-left: 5px; }
-.dynWarenkorb .produkt .produktbild .bild {width:57px; height:48px;}
-.dynWarenkorb .produkt .produktbeschreibung a{font-size:11px;font-weight:bold;color:#162286; }
-.dynWarenkorb .produkt .rechts {width:190px;clear:both;margin: 0px; padding: 0px; margin-top: -11px}
-.dynWarenkorb .produkt .rechts .bild {margin:0px 6px 4px 2px;float:right;cursor: pointer;}
-.dynWarenkorb .produkt .hoverText {font-size: 11px;position: absolute;z-index: 20;top: 27px;left: 54px;padding-left: 5px;padding-top: 1px;background-repeat: no-repeat;width: 127px;height: 19px;background-image: url('http://images.quelle.de/is-bin/intershop.static/WFS/Quelle-quelle_de-Site/-/de_DE/imagesOnline/basket/q_ajax_wk_hover_bk.gif');}
-.dynWarenkorb .produkt .rechts .preis {font-size:10px;color:#a5adc2; width:104px;margin:0px;padding:0px;float:right}
-.dynWarenkorb .kasse {width:190px;height:30px;background:white;margin:1px 0px 0px 0px;}
-.dynWarenkorb .kasse .bild {margin:4px 6px 0px 6px;float:none;cursor: pointer;}
-.shade {width:190px;height:60px;background-image:url(http://images.quelle.de/is-bin/intershop.static/WFS/Quelle-quelle_de-Site/-/de_DE/imagesOnline/basket/q_ajax_wk_shade.png); background-repeat:repeat-x;*background:none;font-size: 1px;z-index: 10;filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src=http://images.quelle.de/is-bin/intershop.static/WFS/Quelle-quelle_de-Site/-/de_DE/imagesOnline/basket/q_ajax_wk_shade.png);}
-.dynWarenkorb .produkt .produktbeschreibung {font-size:11px;font-weight:bold;color:#162286;padding:4px 0px 0px 0px;float:left;width:120px;height:37px; overflow:hidden}
-.dynWarenkorb .produkt .produktbeschreibung {;#}
-.dynWarenkorb .produkt .produktbeschreibung {font-size:11px;font-weight:bold;color:#162286;padding:4px 0px 0px 0px;width:120px;height:45px; overflow:hidden; float: right; margin: 0px;}
-//-->
-</style>
-<div id="dynBasketPlaceHolder" style="top: 0px; left: 0px; width: 190px; height: 78px; display: none; z-index: 10; position: relative">
-<div id="dynBasketContainer" style="position: absolute; top: 0px; left: 0px; z-index: 10;"></div>
-</div>
-<script type="text/javascript">
-<!--
-if (getBasketElemCount() != 0 || storefront != true){
-var dynBasket = null;
-try {
-dynBasket = new dynamicBasket("dynBasket",
-"http://www.quelle.de/is-bin/INTERSHOP.enfinity/WFS/Quelle-quelle_de-Site/de_DE/-/EUR/Q_ViewBasketOpt-ViewXML",
-"https://www.quelle.de/is-bin/INTERSHOP.enfinity/WFS/Quelle-quelle_de-Site/de_DE/-/EUR/Q_ViewBasketOpt-View?Linktype=AW",
-"https://www.quelle.de/is-bin/INTERSHOP.enfinity/WFS/Quelle-quelle_de-Site/de_DE/-/EUR/Q_ViewBasketOpt-View?Linktype=K",
-"dynWarenkorb",
-"http://www.quelle.de/is-bin/INTERSHOP.enfinity/WFS/Quelle-quelle_de-Site/de_DE/-/EUR/Q_ViewBasketOpt-UpdateXML",
-{"open" :"http://images.quelle.de/is-bin/intershop.static/WFS/Quelle-quelle_de-Site/-/de_DE/imagesOnline/basket/q_ajax_wk_aufklappen.gif",
-"close" :"http://images.quelle.de/is-bin/intershop.static/WFS/Quelle-quelle_de-Site/-/de_DE/imagesOnline/basket/q_ajax_wk_zuklappen.gif",
-"trash" :"http://images.quelle.de/is-bin/intershop.static/WFS/Quelle-quelle_de-Site/-/de_DE/imagesOnline/basket/q_ajax_wk_trash.gif",
-"shade" :"http://images.quelle.de/is-bin/intershop.static/WFS/Quelle-quelle_de-Site/-/de_DE/imagesOnline/basket/q_ajax_wk_shade.png",
-"hoverTrash" :"http://images.quelle.de/is-bin/intershop.static/WFS/Quelle-quelle_de-Site/-/de_DE/imagesOnline/basket/q_ajax_wk_hover_bk.gif",
-"zurKasse" :"http://images.quelle.de/is-bin/intershop.static/WFS/Quelle-quelle_de-Site/-/de_DE/imagesOnline/basket/q_ajax_wk_zurkasse.gif"},
-"http://images.quelle.de/is-bin/intershop.static/WFS/Quelle-quelle_de-Site/-/de_DE/",
-"http://www.quelle.de/is-bin/INTERSHOP.enfinity/WFS/Quelle-quelle_de-Site/de_DE/-/EUR/Q_TrackResultPage-Start"
-);
-document.getElementById("dynBasketContainer").appendChild(dynBasket.DOMBasket);
-}
-catch (e) {
-document.getElementById("dynBasketPlaceHolder").innerHTML = createBasketReplacement('https://www.quelle.de/is-bin/INTERSHOP.enfinity/WFS/Quelle-quelle_de-Site/de_DE/-/EUR/Q_ViewBasketOpt-View?Linktype=K','http://images.quelle.de/is-bin/intershop.static/WFS/Quelle-quelle_de-Site/-/de_DE/imagesOnline/basket/q_ajax_wk_zurkasse.gif','https://www.quelle.de/is-bin/INTERSHOP.enfinity/WFS/Quelle-quelle_de-Site/de_DE/-/EUR/Q_ViewBasketOpt-View?Linktype=AW');
-}
-document.getElementById("dynBasketPlaceHolder").style.display = "block";
-try {
-dynBasket.zIndexInheritance(document.getElementById("dynBasketContainer"), 10);
-} catch(e) {;}
-} else {
-document.getElementById("dynBasketPlaceHolder").innerHTML = createEmptyBasket('https://www.quelle.de/is-bin/INTERSHOP.enfinity/WFS/Quelle-quelle_de-Site/de_DE/-/EUR/Q_ViewBasketOpt-View?Linktype=K');
-document.getElementById("dynBasketPlaceHolder").style.display = "block";
-}
-//-->
-</script>
-</div>
-
-
-</div>
-<div style="position:absolute;overflow:hidden;width:245px;left:0px;top:35px;">
-  
-<!-- TemplateBegin : $Archive: //pvcssrv02.service.itellium.net/pvcsfs/b2ccc/pvcsprojekte/Q2_Gesamt/archives/enfinity/share/private/eCS/Store/templates/de/scc/component-types/1560.isml-arc $ $Revision: 1.2 $-->
-<div style="position:relative;width:245px;height:200px;">
-
-<a href="http://www.quelle.de/is-bin/INTERSHOP.enfinity/WFS/Quelle-quelle_de-Site/de_DE/-/EUR/Q_BrowseCatalog-Start?CategoryName=315690&PromoShopID=QuelleRoot&Linktype=M" class="" style="">
-<img src="http://images.quelle.de/is-bin/intershop.static/WFS/Quelle-quelle_de-Site/-/de_DE/images/5e/hp-frottier.gif" border="0" class="noStyle" alt=""></a>
-</div>
-<!-- TemplateEnd -->
-
-</div>
-<div style="position:absolute;overflow:hidden;width:245px;left:250px;top:35px;">
-  
-<!-- TemplateBegin : $Archive: //pvcssrv02.service.itellium.net/pvcsfs/b2ccc/pvcsprojekte/Q2_Gesamt/archives/enfinity/share/private/eCS/Store/templates/de/scc/component-types/1560.isml-arc $ $Revision: 1.2 $-->
-<div style="position:relative;width:245px;height:200px;">
-
-<a href="http://www.quelle.de/is-bin/INTERSHOP.enfinity/WFS/Quelle-quelle_de-Site/de_DE/-/EUR/Q_BrowseCatalog-Start?CategoryName=306156&PromoShopID=QuelleRoot&Linktype=M" class="" style="">
-<img src="http://images.quelle.de/is-bin/intershop.static/WFS/Quelle-quelle_de-Site/-/de_DE/images/ed/hp-abendmode.gif" border="0" class="noStyle" alt=""></a>
-</div>
-<!-- TemplateEnd -->
-
-</div>
-<div style="position:absolute;overflow:hidden;width:245px;left:500px;top:35px;">
-  
-<!-- TemplateBegin : $Archive: //pvcssrv02.service.itellium.net/pvcsfs/b2ccc/pvcsprojekte/Q2_Gesamt/archives/enfinity/share/private/eCS/Store/templates/de/scc/component-types/9998.isml-arc $ $Revision: 1.4 $-->
-<script>
-var defContentOf1236210 = '\<div style=\"position:relative;width:245px;height:200px;\"\> \<a href=\"http://www.quelle.de/is-bin/INTERSHOP.enfinity/WFS/Quelle-quelle_de-Site/de_DE/-/EUR/Q_BrowseCatalog-Start?CategoryName=315942&PromoShopID=&Linktype=M\" class=\"\" style=\"\"\> \<img src=\"http://www.quelle.de/is-bin/intershop.static/WFS/Quelle-quelle_de-Site/-/de_DE/images/9b/hp-10euro_fruehling.jpg\" border=\"0\" class=\"noStyle\" alt=\"\"\>\</a\> \</div\>';
-</script>
-<div id="Comp_1236210" style="position:relative;top:0px;left:0px;"></div>
-<script type="text/javascript">
-try
-{
-loadPersComps();
-checkPersComps_1236210();
-}
-catch(e)
-{
-pcready = true;
-}
-var req_counter_1236210 = 0;
-function checkPersComps_1236210()
-{
-if(pcready == true || req_counter_1236210 >= 50)
-{
-setActionCompoment_1236210();
-}
-else
-{
-req_counter_1236210++;
-setTimeout("checkPersComps_1236210()", 200);
-}
-}
-function setActionCompoment_1236210()
-{
-try
-{
-if ((pcreq != null) && (pcreq.responseText != ''))
-{
-eval(pcreq.responseText);
-}
-if (ContentOf1236210 != null && ContentOf1236210 != '')
-{
-document.getElementById("Comp_1236210").innerHTML = ContentOf1236210;
-}
-else
-{
-document.getElementById("Comp_1236210").innerHTML = defContentOf1236210;
-}
-}
-catch (e)
-{
-document.getElementById("Comp_1236210").innerHTML = defContentOf1236210;
-}
-}
-</script>
-<!-- TemplateEnd -->
-
-</div>
-<div style="position:absolute;overflow:hidden;width:190px;left:765px;top:115px;">
-  
-<!-- TemplateBegin : $Archive: //pvcssrv02.service.itellium.net/pvcsfs/b2ccc/pvcsprojekte/Q2_Gesamt/archives/enfinity/share/private/eCS/Store/templates/de/scc/component-types/1572.isml-arc $ $Revision: 1.2 $-->
-<div style="position:relative;width:190px;height:74px;overflow:hidden;">
-<div style="position:relative;width:190px;height:25px;overflow:hidden;background-color:#7990bd;">
-<div style="position:absolute;top:5px;left:10px;">
-<span class="q-bold-12px-white" style="color:#ffffff;text-decoration:none;">Katalog-Besteller</span>
-</div>
-</div>
-<div style="position:relative;width:190px;height:50px;overflow:hidden;background-color:white;">
-<div style="position:absolute;top:7px;left:10px;width:115px;height:49px;">
-<a href="https://www.quelle.de/is-bin/INTERSHOP.enfinity/WFS/Quelle-quelle_de-Site/de_DE/-/EUR/Q_ViewBasketOpt-View?Linktype=M" class="q-bold-15px-darkred" style="color:#ff0000;text-decoration:none;">
-Direkt bestellen aus Katalogen</a>
-<br>
-</div>
-</div>
-<div style="position:absolute;top:0px;left:125px;width:65px;height:75px;overflow:hidden;">
-
-<a href="https://www.quelle.de/is-bin/INTERSHOP.enfinity/WFS/Quelle-quelle_de-Site/de_DE/-/EUR/Q_ViewBasketOpt-View?Linktype=M" class="" style="">
-<img src="http://images.quelle.de/is-bin/intershop.static/WFS/Quelle-quelle_de-Site/-/de_DE/images/66/mw_hkfs2008_65x75.gif" width="65" height="75" border="0" class="noStyle" alt=""></a>
-</div>
-<div style="position:relative;width:190px;height:1px;overflow:hidden;background-color:#7990bd;"></div>
-</div>
-<!-- TemplateEnd -->
-
-</div>
-<div style="position:absolute;overflow:hidden;width:190px;left:765px;top:190px;">
-  
-<!-- TemplateBegin : $Archive: //pvcssrv02.service.itellium.net/pvcsfs/b2ccc/pvcsprojekte/Q2_Gesamt/archives/enfinity/share/private/eCS/Store/templates/de/scc/component-types/1520.isml-arc $ $Revision: 1.0 $-->
-<div style="position:relative;width:190px;height:25px;">
-<div style="position:relative;width:190px;height:24px;overflow:hidden;background-color:white;">
-<div style="position:absolute;left:6px;top:7px;width:16px;height:12px;">
-<img src="http://images.quelle.de/is-bin/intershop.static/WFS/Quelle-quelle_de-Site/-/de_DE/images/8e/start_icon_katalog-bestelle.gif" border="0" class="noStyle" style="width:17px;height:12px;" alt="">
-</div>
-<div style="position:absolute;left:31px;top:5px;width:157px;height:19px;">
-<a href="javascript:newWin('M1990208981','http://www.quelle.de/is-bin/INTERSHOP.enfinity/WFS/Quelle-quelle_de-Site/de_DE/-/EUR/Q_ViewTemplate_ecs-View?PromoShopID=QuelleRoot&Template=q_redirect&RedirectURL=http%253a%2F%2Fwww.quelle-katalog.de%2Fsokats.php&Linktype=M',850,720,'scrollbars=yes')" class="q-normal-12px-darkblue">
-Kataloge gratis anfordern</a>
-</div>
-</div>
-</div>
-<!-- TemplateEnd -->
-
-</div>
-<div style="position:absolute;overflow:hidden;width:190px;left:765px;top:215px;">
-  
-<!-- TemplateBegin : $Archive: //pvcssrv02.service.itellium.net/pvcsfs/b2ccc/pvcsprojekte/Q2_Gesamt/archives/enfinity/share/private/eCS/Store/templates/de/scc/component-types/1520.isml-arc $ $Revision: 1.0 $-->
-<div style="position:relative;width:190px;height:25px;">
-<div style="position:relative;width:190px;height:24px;overflow:hidden;background-color:white;">
-<div style="position:absolute;left:6px;top:7px;width:16px;height:12px;">
-<img src="http://images.quelle.de/is-bin/intershop.static/WFS/Quelle-quelle_de-Site/-/de_DE/images/d7/icon-ecat-inhalstverzeichnis.gif" border="0" class="noStyle" style="width:17px;height:12px;" alt="">
-</div>
-<div style="position:absolute;left:31px;top:5px;width:157px;height:19px;">
-<a href="http://www.quelle.de/is-bin/INTERSHOP.enfinity/WFS/Quelle-quelle_de-Site/de_DE/-/EUR/Q_BrowseCatalog-Start?CategoryName=113774&Linktype=H&PromoShopID=QuelleRoot&Linktype=M" class="q-normal-12px-darkblue">
-Online Kataloge bl&auml;ttern</a>
-</div>
-</div>
-</div>
-<!-- TemplateEnd -->
-
-</div>
-<div style="position:absolute;overflow:hidden;width:245px;left:0px;top:240px;">
-  
-<!-- TemplateBegin : $Archive: //pvcssrv02.service.itellium.net/pvcsfs/b2ccc/pvcsprojekte/Q2_Gesamt/archives/enfinity/share/private/eCS/Store/templates/de/scc/component-types/1560.isml-arc $ $Revision: 1.2 $-->
-<div style="position:relative;width:245px;height:65px;">
-
-<a href="http://www.quelle.de/is-bin/INTERSHOP.enfinity/WFS/Quelle-quelle_de-Site/de_DE/-/EUR/Q_BrowseCatalog-Start?CategoryName=259089&PromoShopID=QuelleRoot&Linktype=M" class="" style="">
-<img src="http://images.quelle.de/is-bin/intershop.static/WFS/Quelle-quelle_de-Site/-/de_DE/images/4e/hp-you.gif" border="0" class="noStyle" alt=""></a>
-</div>
-<!-- TemplateEnd -->
-
-</div>
-<div style="position:absolute;overflow:hidden;width:245px;left:250px;top:240px;">
-  
-<!-- TemplateBegin : $Archive: //pvcssrv02.service.itellium.net/pvcsfs/b2ccc/pvcsprojekte/Q2_Gesamt/archives/enfinity/share/private/eCS/Store/templates/de/scc/component-types/1560.isml-arc $ $Revision: 1.2 $-->
-<div style="position:relative;width:245px;height:65px;">
-
-<a href="http://www.quelle.de/is-bin/INTERSHOP.enfinity/WFS/Quelle-quelle_de-Site/de_DE/-/EUR/Q_BrowseCatalog-Start?CategoryName=315729&PromoShopID=QuelleRoot&Linktype=M" class="" style="">
-<img src="http://images.quelle.de/is-bin/intershop.static/WFS/Quelle-quelle_de-Site/-/de_DE/images/7c/hp-cashback.gif" border="0" class="noStyle" alt=""></a>
-</div>
-<!-- TemplateEnd -->
-
-</div>
-<div style="position:absolute;overflow:hidden;width:245px;left:500px;top:240px;">
-  
-<!-- TemplateBegin : $Archive: //pvcssrv02.service.itellium.net/pvcsfs/b2ccc/pvcsprojekte/Q2_Gesamt/archives/enfinity/share/private/eCS/Store/templates/de/scc/component-types/1560.isml-arc $ $Revision: 1.2 $-->
-<div style="position:relative;width:245px;height:65px;">
-
-<a href="http://www.quelle.de/is-bin/INTERSHOP.enfinity/WFS/Quelle-quelle_de-Site/de_DE/-/EUR/Q_BrowseCatalog-Start?CategoryName=287157&PromoShopID=QuelleRoot&Linktype=M" class="" style="">
-<img src="http://images.quelle.de/is-bin/intershop.static/WFS/Quelle-quelle_de-Site/-/de_DE/images/46/hp-kochbuch.gif" border="0" class="noStyle" alt=""></a>
-</div>
-<!-- TemplateEnd -->
-
-</div>
-<div style="position:absolute;overflow:hidden;width:190px;left:765px;top:245px;">
-  
-<!-- TemplateBegin : $Archive: //pvcssrv02.service.itellium.net/pvcsfs/b2ccc/pvcsprojekte/Q2_Gesamt/archives/enfinity/share/private/eCS/Store/templates/de/scc/component-types/1571.isml-arc $ $Revision: 1.2 $-->
-<div style="position:relative;width:190px;height:49px;overflow:hidden;">
-<div style="position:relative;width:190px;height:25px;overflow:hidden;background-color:#7990bd;">
-<div style="position:absolute;top:5px;left:10px;">
-<span class="q-bold-12px-white" style="color:#ffffff;text-decoration:none;">Meine Services</span>
-</div>
-</div>
-<div style="position:relative;width:190px;height:25px;overflow:hidden;background-color:white;">
-<div style="position:absolute;top:5px;left:10px;">
-<a href="http://www.quelle.de/is-bin/INTERSHOP.enfinity/WFS/Quelle-quelle_de-Site/de_DE/-/EUR/Q_ViewBuyerAccount-ViewNewsletter?CategoryName=3000592&PromoShopID=QuelleRoot&Linktype=M" class="q-bold-12px-darkred" style="color:#003399;text-decoration:none;">
-<b>Newsletter-Service</b></a>
-<br>
-</div>
-</div>
-<div style="position:absolute;top:5px;left:135px;width:50px;height:44px;overflow:hidden;">
-
-<a href="http://www.quelle.de/is-bin/INTERSHOP.enfinity/WFS/Quelle-quelle_de-Site/de_DE/-/EUR/Q_ViewBuyerAccount-ViewNewsletter?Linktype=M" class="" style="">
-<img src="http://images.quelle.de/is-bin/intershop.static/WFS/Quelle-quelle_de-Site/-/de_DE/images/50/newsletter_navi.gif" width="50" height="44" border="0" class="noStyle" alt=""></a>
-</div>
-<div style="position:relative;width:190px;height:1px;overflow:hidden;background-color:#7990bd;"></div>
-</div>
-<!-- TemplateEnd -->
-
-</div>
-<div style="position:absolute;overflow:hidden;width:190px;left:765px;top:295px;">
-  
-<!-- TemplateBegin : $Archive: //pvcssrv02.service.itellium.net/pvcsfs/b2ccc/pvcsprojekte/Q2_Gesamt/archives/enfinity/share/private/eCS/Store/templates/de/scc/component-types/1520.isml-arc $ $Revision: 1.0 $-->
-<div style="position:relative;width:190px;height:25px;">
-<div style="position:relative;width:190px;height:24px;overflow:hidden;background-color:white;">
-<div style="position:absolute;left:6px;top:7px;width:16px;height:12px;">
-
-<a href="https://www.quelle.de/is-bin/INTERSHOP.enfinity/WFS/Quelle-quelle_de-Site/de_DE/-/EUR/Q_ViewKIS-View?CategoryName=2000124&PromoShopID=QuelleRoot&Linktype=M" class="" style="">
-<img src="http://images.quelle.de/is-bin/intershop.static/WFS/Quelle-quelle_de-Site/-/de_DE/images/72/start_icon_02.gif" border="0" class="noStyle" style="width:17px;height:12px;" alt=""></a>
-</div>
-<div style="position:absolute;left:31px;top:5px;width:157px;height:19px;">
-<a href="https://www.quelle.de/is-bin/INTERSHOP.enfinity/WFS/Quelle-quelle_de-Site/de_DE/-/EUR/Q_ViewKIS-View?CategoryName=2000124&PromoShopID=QuelleRoot&Linktype=M" class="q-normal-12px-darkblue">
-Mein Konto</a>
-</div>
-</div>
-</div>
-<!-- TemplateEnd -->
-
-</div>
-<div style="position:absolute;overflow:hidden;width:745px;left:0px;top:310px;">
-  
-<!-- TemplateBegin : $Archive: //pvcssrv02.service.itellium.net/pvcsfs/b2ccc/pvcsprojekte/Q2_Gesamt/archives/enfinity/share/private/eCS/Store/templates/de/scc/component-types/1560.isml-arc $ $Revision: 1.2 $-->
-<div style="position:relative;width:745px;height:65px;">
-
-<a href="http://www.quelle.de/is-bin/INTERSHOP.enfinity/WFS/Quelle-quelle_de-Site/de_DE/-/EUR/Q_BrowseCatalog-Start?CategoryName=302979&PromoShopID=QuelleRoot&Linktype=M" class="" style="">
-<img src="http://images.quelle.de/is-bin/intershop.static/WFS/Quelle-quelle_de-Site/-/de_DE/images/5e/hp-muttertag.gif" border="0" class="noStyle" alt=""></a>
-</div>
-<!-- TemplateEnd -->
-
-</div>
-<div style="position:absolute;overflow:hidden;width:190px;left:765px;top:320px;">
-  
-<!-- TemplateBegin : $Archive: //pvcssrv02.service.itellium.net/pvcsfs/b2ccc/pvcsprojekte/Q2_Gesamt/archives/enfinity/share/private/eCS/Store/templates/de/scc/component-types/1520.isml-arc $ $Revision: 1.0 $-->
-<div style="position:relative;width:190px;height:25px;">
-<div style="position:relative;width:190px;height:24px;overflow:hidden;background-color:white;">
-<div style="position:absolute;left:6px;top:7px;width:16px;height:12px;">
-
-<a href="https://www.quelle.de/is-bin/INTERSHOP.enfinity/WFS/Quelle-quelle_de-Site/de_DE/-/EUR/Q_MeinePost-Start?Linktype=M" class="" style="">
-<img src="http://images.quelle.de/is-bin/intershop.static/WFS/Quelle-quelle_de-Site/-/de_DE/images/5f/HP-Icon_meine-Post.gif" border="0" class="noStyle" style="width:17px;height:12px;" alt=""></a>
-</div>
-<div style="position:absolute;left:31px;top:5px;width:157px;height:19px;">
-<a href="https://www.quelle.de/is-bin/INTERSHOP.enfinity/WFS/Quelle-quelle_de-Site/de_DE/-/EUR/Q_MeinePost-Start?Linktype=M" class="q-normal-12px-darkblue">
-Meine Post</a>
-</div>
-</div>
-</div>
-<!-- TemplateEnd -->
-
-</div>
-<div style="position:absolute;overflow:hidden;width:190px;left:765px;top:345px;">
-  
-<!-- TemplateBegin : $Archive: //pvcssrv02.service.itellium.net/pvcsfs/b2ccc/pvcsprojekte/Q2_Gesamt/archives/enfinity/share/private/eCS/Store/templates/de/scc/component-types/1520.isml-arc $ $Revision: 1.0 $-->
-<div style="position:relative;width:190px;height:25px;">
-<div style="position:relative;width:190px;height:24px;overflow:hidden;background-color:white;">
-<div style="position:absolute;left:6px;top:7px;width:16px;height:12px;">
-
-<a href="http://www.quelle.de/is-bin/INTERSHOP.enfinity/WFS/Quelle-quelle_de-Site/de_DE/-/EUR/Q_ViewTemplate_ecs-View?PromoShopID=QuelleRoot&Template=q_redirect&RedirectURL=https%3A%2F%2Fwww.quelle.de%2Fis-bin%2FINTERSHOP.enfinity%2FWFS%2FQuelle-quelle_de-Site%2Fde_DE%2F-%2FEUR%2FQ_HappyDigits-View&Linktype=M" class="" style="">
-<img src="http://images.quelle.de/is-bin/intershop.static/WFS/Quelle-quelle_de-Site/-/de_DE/images/81/icon_happydigits.gif" border="0" class="noStyle" style="width:17px;height:12px;" alt=""></a>
-</div>
-<div style="position:absolute;left:31px;top:5px;width:157px;height:19px;">
-<a href="http://www.quelle.de/is-bin/INTERSHOP.enfinity/WFS/Quelle-quelle_de-Site/de_DE/-/EUR/Q_ViewTemplate_ecs-View?PromoShopID=QuelleRoot&Template=q_redirect&RedirectURL=https%3A%2F%2Fwww.quelle.de%2Fis-bin%2FINTERSHOP.enfinity%2FWFS%2FQuelle-quelle_de-Site%2Fde_DE%2F-%2FEUR%2FQ_HappyDigits-View&Linktype=M" class="q-normal-12px-darkblue">
-HappyDigits</a>
-</div>
-</div>
-</div>
-<!-- TemplateEnd -->
-
-</div>
-<div style="position:absolute;overflow:hidden;width:190px;left:765px;top:370px;">
-  
-<!-- TemplateBegin : $Archive: //pvcssrv02.service.itellium.net/pvcsfs/b2ccc/pvcsprojekte/Q2_Gesamt/archives/enfinity/share/private/eCS/Store/templates/de/scc/component-types/1520.isml-arc $ $Revision: 1.0 $-->
-<div style="position:relative;width:190px;height:25px;">
-<div style="position:relative;width:190px;height:24px;overflow:hidden;background-color:white;">
-<div style="position:absolute;left:6px;top:7px;width:16px;height:12px;">
-
-<a href="http://www.quelle.de/is-bin/INTERSHOP.enfinity/WFS/Quelle-quelle_de-Site/de_DE/-/EUR/Q_BrowseCatalog-Start?CategoryName=257616&PromoShopID=QuelleRoot&Linktype=M" class="" style="">
-<img src="http://images.quelle.de/is-bin/intershop.static/WFS/Quelle-quelle_de-Site/-/de_DE/images/69/Icon-Herz.gif" border="0" class="noStyle" style="width:17px;height:12px;" alt=""></a>
-</div>
-<div style="position:absolute;left:31px;top:5px;width:157px;height:19px;">
-<a href="http://www.quelle.de/is-bin/INTERSHOP.enfinity/WFS/Quelle-quelle_de-Site/de_DE/-/EUR/Q_BrowseCatalog-Start?CategoryName=257616&PromoShopID=QuelleRoot&Linktype=M" class="q-normal-12px-darkblue">
-F?r unsere Neukunden</a>
-</div>
-</div>
-</div>
-<!-- TemplateEnd -->
-
-</div>
-<div style="position:absolute;overflow:hidden;width:245px;left:0px;top:380px;">
- <!-- TemplateBegin : $Archive:   //pvcssrv02.service.itellium.net/pvcsfs/b2ccc/pvcsprojekte/Q2_Gesamt/archives/enfinity/share/private/eCS/Store/templates/de/scc/component-types/1575.isml-arc  $ $Revision: 8195 $-->
-
-
-
-
-
-<div style="position:relative;width:245px;height:25px;text-align:left;color:#ffffff;background-color:#acaf93;overflow:hidden;">
-	<div style="position:absolute;left:7px;top:5px;width:231px;height:15px;">
-	<span style="font: normal bold 12px Arial;color:#ffffff;text-decoration:none;">Aktuelle Fashion-Trends</span>
-	</div>	
-</div>
-
-
-
-
-
-<!-- TemplateEnd -->
-
-</div>
-<div style="position:absolute;overflow:hidden;width:245px;left:250px;top:380px;">
- <!-- TemplateBegin : $Archive:   //pvcssrv02.service.itellium.net/pvcsfs/b2ccc/pvcsprojekte/Q2_Gesamt/archives/enfinity/share/private/eCS/Store/templates/de/scc/component-types/1575.isml-arc  $ $Revision: 8195 $-->
-
-
-
-
-
-<div style="position:relative;width:245px;height:25px;text-align:left;color:#ffffff;background-color:#94bac1;overflow:hidden;">
-	<div style="position:absolute;left:7px;top:5px;width:231px;height:15px;">
-	<span style="font: normal bold 12px Arial;color:#ffffff;text-decoration:none;">Technik-Angebote</span>
-	</div>	
-</div>
-
-
-
-
-
-<!-- TemplateEnd -->
-
-</div>
-<div style="position:absolute;overflow:hidden;width:245px;left:500px;top:380px;">
- <!-- TemplateBegin : $Archive:   //pvcssrv02.service.itellium.net/pvcsfs/b2ccc/pvcsprojekte/Q2_Gesamt/archives/enfinity/share/private/eCS/Store/templates/de/scc/component-types/1575.isml-arc  $ $Revision: 8195 $-->
-
-
-
-
-
-<div style="position:relative;width:245px;height:25px;text-align:left;color:#ffffff;background-color:#afa59d;overflow:hidden;">
-	<div style="position:absolute;left:7px;top:5px;width:231px;height:15px;">
-	<span style="font: normal bold 12px Arial;color:#ffffff;text-decoration:none;">Sch&#246;nes Zuhause</span>
-	</div>	
-</div>
-
-
-
-
-
-<!-- TemplateEnd -->
-
-</div>
-<div style="position:absolute;overflow:hidden;width:190px;left:765px;top:395px;">
-  
-<!-- TemplateBegin : $Archive: //pvcssrv02.service.itellium.net/pvcsfs/b2ccc/pvcsprojekte/Q2_Gesamt/archives/enfinity/share/private/eCS/Store/templates/de/scc/component-types/1520.isml-arc $ $Revision: 1.0 $-->
-<div style="position:relative;width:190px;height:25px;">
-<div style="position:relative;width:190px;height:24px;overflow:hidden;background-color:white;">
-<div style="position:absolute;left:6px;top:7px;width:16px;height:12px;">
-
-<a href="http://www.quelle.de/is-bin/INTERSHOP.enfinity/WFS/Quelle-quelle_de-Site/de_DE/-/EUR/Q_BrowseCatalog-Start?CategoryName=278187&PromoShopID=QuelleRoot&Linktype=M" class="" style="">
-<img src="http://images.quelle.de/is-bin/intershop.static/WFS/Quelle-quelle_de-Site/-/de_DE/images/72/HP_Mobile-Services.gif" border="0" class="noStyle" style="width:17px;height:12px;" alt=""></a>
-</div>
-<div style="position:absolute;left:31px;top:5px;width:157px;height:19px;">
-<a href="http://www.quelle.de/is-bin/INTERSHOP.enfinity/WFS/Quelle-quelle_de-Site/de_DE/-/EUR/Q_BrowseCatalog-Start?CategoryName=278187&PromoShopID=QuelleRoot&Linktype=M" class="q-normal-12px-darkblue">
-QUELLE Mobile</a>
-</div>
-</div>
-</div>
-<!-- TemplateEnd -->
-
-</div>
-<div style="position:absolute;overflow:hidden;width:245px;left:0px;top:410px;">
-  
-<!-- TemplateBegin : $Archive: //pvcssrv02.service.itellium.net/pvcsfs/b2ccc/pvcsprojekte/Q2_Gesamt/archives/enfinity/share/private/eCS/Store/templates/de/scc/component-types/1565.isml-arc $ $Revision: 1.3 $-->
-<script type="text/javascript">
-<!--
-var compID651996 = '651996';
-var prodcount651996 = 0;
-var products651996 = new Array();
-products651996[0] = new Object();
-products651996[0]["desc"] = 'Y.O.U. 2er-Set Tops';
-products651996[0]["longdesc"] = 'Das Basic an hei&szlig;en Sommertagen!';
-products651996[0]["price"] = '12.49';
-products651996[0]["secondaryprice"] = '24.99';
-products651996[0]["UVP"] = '';
-products651996[0]["abPrice"] = '1';
-products651996[0]["pic"] = 'http://products.quelle.de/zc/bs/q1/images/d/7/4/d74753c4f10dd584411bc7161c8eed62.tif/JDAqxrSlXGIzEidNs4z8S1GBB8ptARw_';
-products651996[0]["ProductSKU"] = '0574441U-34';
-products651996[0]["AAID"] = '200001637920';
-products651996[0]["CategoryName"] = '295779';
-products651996[0]["PromoShopID"] = 'QuelleRoot';
-products651996[0]["category_text"] = '... mehr von Y.O.U.';
-products651996[0]["category_linkid"] = '294687';
-products651996[1] = new Object();
-products651996[1]["desc"] = 'EXPLORER Ballerina';
-products651996[1]["longdesc"] = 'Der perfekte Schuh zum sportlich legeren Look.';
-products651996[1]["price"] = '24.99';
-products651996[1]["secondaryprice"] = '';
-products651996[1]["UVP"] = '';
-products651996[1]["abPrice"] = '';
-products651996[1]["pic"] = 'http://products.quelle.de/zc/bs/q1/images/3/3/8/338c21ec5fe1f6d9c01fac816dfa350e.tif/JDAqxrSlXGIzEidNs4z8S1GBB8ptARw_';
-products651996[1]["ProductSKU"] = '0082424Y-36';
-products651996[1]["AAID"] = '200002382001';
-products651996[1]["CategoryName"] = '296556';
-products651996[1]["PromoShopID"] = 'QuelleRoot';
-products651996[1]["category_text"] = '... mehr Schuhe';
-products651996[1]["category_linkid"] = '229587';
-function showProd651996(count) {
-var ProductLink = window.location.protocol + "//" + window.location.hostname + "/is-bin/INTERSHOP.enfinity/WFS/Quelle-quelle_de-Site/de_DE/-/EUR/Q_DisplayProductInformation-Start;"+"sid"+"="+parse_enfsession+"?ProductSKU="+products651996[count]["ProductSKU"]+"&AAID="+products651996[count]["AAID"]+"&ProductRefID="+products651996[count]["ProductSKU"]+"@Quelle-quelle_de&CategoryName="+products651996[count]["CategoryName"]+"&PromoShopID="+products651996[count]["PromoShopID"]+"&Linktype=M";
-var CategoryLink = window.location.protocol + "//" + window.location.hostname + "/is-bin/INTERSHOP.enfinity/WFS/Quelle-quelle_de-Site/de_DE/-/EUR/Q_BrowseCatalog-Start;"+"sid"+"="+parse_enfsession+"?CategoryName="+products651996[count]["category_linkid"]+"&Linktype=M";
-var longdesc = products651996[count]["longdesc"].substr(0, 70);
-var shoptext = products651996[count]["category_text"];
-if (products651996[count]["longdesc"].length > 70) { longdesc = longdesc + ' ...';};
-document.write('<a href="'+ProductLink+'"><img src="'+products651996[count]["pic"]+'" width="112" height="95" border="0" alt=""></a>');
-document.write('<div style="position:relative;left:5px;top:8px;width:110px;height:80px;overflow:hidden;line-height:15px;">');
-document.write('<a href="'+ProductLink+'" style="font-face:arial;font-size:12px;font-weight:bold;text-decoration:underline;">'+products651996[count]["desc"]+'</a><br>');
-document.write(longdesc);
-document.write('</div><div style="position:relative;top:10px;left:5px;width:110px;">');
-if (products651996[count]["secondaryprice"] != '') {
-if (products651996[count]["secondaryprice"].length + products651996[count]["price"].length > 11) {
-document.write('<span id="pa_streichprice" class="q-trebuchet-12px-darkgrey">&euro; '+products651996[count]["secondaryprice"]+'</span>&nbsp;<br>');
-} else {
-document.write('<br><span id="pa_streichprice" class="q-trebuchet-12px-darkgrey">&euro; '+products651996[count]["secondaryprice"]+'</span>&nbsp;');
-}
-} else {
-if (products651996[count]["UVP"] != '') {
-document.write('<span id="pa_uvp" class="q-normal-12px-darkblue" style="color:#999999;">UVP*&nbsp;&euro;&nbsp;'+products651996[count]["UVP"]+'</span><br>');
-} else {
-document.write('<br>&nbsp;');
-}
-}
-if(products651996[count]["abPrice"] == '1') {
-document.write('<span class="q-bold-12px-red">ab &euro; '+products651996[count]["price"]+'</span></div>');
-} else {
-document.write('<span class="q-bold-12px-red">&euro; '+products651996[count]["price"]+'</span></div>');
-}
-document.write('<div style="position:relative;top:15px;width:120px;height:30px;float:left;background-color:#acaf93;overflow:hidden;">');
-if (products651996[count]["category_text"] != '') {
-document.write('<table border="0" cellpadding="2" cellspacing="0" width="100%" height="30"><tbody><tr><td valign="bottom"><a href="'+CategoryLink+'" style="color:white;font-face:arial;font-size:11px;font-weight:bold;text-decoration:none;">'+shoptext+'</a></td><td valign="bottom"><a href="'+CategoryLink+'"><img src="http://images.quelle.de/is-bin/intershop.static/WFS/Quelle-quelle_de-Site/-/de_DE/imagesOnline/pfeil_10x13.gif" border="0" style="position:relative;"></a></td></tr></tbody></table>');
-}
-document.write('</div>');
-}
-//-->
-</script>
-<div style="position:relative;width:245px;height:260px;overflow:hidden;background-color:#acaf93;">
-<div style="position:relative;width:120px;height:255px;background-color:white;float:left;">
-<script type="text/javascript">
-<!--
-showProd651996(prodcount651996);
-prodcount651996++;
-//-->
-</script>
-</div>
-<div style="position:relative;width:5px;height:255px;overflow:hidden;float:left;background-color:white;">
-</div>
-<div style="position:relative;width:120px;height:255px;background-color:white;float:left;">
-<script type="text/javascript">
-<!--
-showProd651996(prodcount651996);
-prodcount651996++;
-//-->
-</script>
-</div>
-</div>
-<!-- TemplateEnd -->
-
-</div>
-<div style="position:absolute;overflow:hidden;width:245px;left:250px;top:410px;">
-  
-<!-- TemplateBegin : $Archive: //pvcssrv02.service.itellium.net/pvcsfs/b2ccc/pvcsprojekte/Q2_Gesamt/archives/enfinity/share/private/eCS/Store/templates/de/scc/component-types/1565.isml-arc $ $Revision: 1.3 $-->
-<script type="text/javascript">
-<!--
-var compID476442 = '476442';
-var prodcount476442 = 0;
-var products476442 = new Array();
-products476442[0] = new Object();
-products476442[0]["desc"] = 'FUJITSU SIEMENS Desktoprechner';
-products476442[0]["longdesc"] = 'AMD Athlon 64 Prozessor 4400+';
-products476442[0]["price"] = '399.00';
-products476442[0]["secondaryprice"] = '';
-products476442[0]["UVP"] = '';
-products476442[0]["abPrice"] = '';
-products476442[0]["pic"] = 'http://products.quelle.de/zc/bs/q1/images/f/c/a/fcaa40ecde4918a317f344ecd7e72dbc.tif/JDAqxrSlXGIzEidNs4z8S1GBB8ptARw_';
-products476442[0]["ProductSKU"] = '0701985F';
-products476442[0]["AAID"] = '200002449414';
-products476442[0]["CategoryName"] = '282165';
-products476442[0]["PromoShopID"] = 'QuelleRoot';
-products476442[0]["category_text"] = '... mehr Computer';
-products476442[0]["category_linkid"] = '282162';
-products476442[1] = new Object();
-products476442[1]["desc"] = 'SONY Digitale Spiegelreflex';
-products476442[1]["longdesc"] = 'Mit hochwirksamer Bildstabilisierung';
-products476442[1]["price"] = '749.99';
-products476442[1]["secondaryprice"] = '849.99';
-products476442[1]["UVP"] = '850.00';
-products476442[1]["abPrice"] = '';
-products476442[1]["pic"] = 'http://products.quelle.de/zc/bs/q1/images/6/b/b/6bb916d9b81f8381547efb71dc8c34a4.tif/JDAqxrSlXGIzEidNs4z8S1GBB8ptARw_';
-products476442[1]["ProductSKU"] = '0416417R';
-products476442[1]["AAID"] = '200004083178';
-products476442[1]["CategoryName"] = '112707';
-products476442[1]["PromoShopID"] = 'QuelleRoot';
-products476442[1]["category_text"] = '... mehr von SONY';
-products476442[1]["category_linkid"] = '112499';
-function showProd476442(count) {
-var ProductLink = window.location.protocol + "//" + window.location.hostname + "/is-bin/INTERSHOP.enfinity/WFS/Quelle-quelle_de-Site/de_DE/-/EUR/Q_DisplayProductInformation-Start;"+"sid"+"="+parse_enfsession+"?ProductSKU="+products476442[count]["ProductSKU"]+"&AAID="+products476442[count]["AAID"]+"&ProductRefID="+products476442[count]["ProductSKU"]+"@Quelle-quelle_de&CategoryName="+products476442[count]["CategoryName"]+"&PromoShopID="+products476442[count]["PromoShopID"]+"&Linktype=M";
-var CategoryLink = window.location.protocol + "//" + window.location.hostname + "/is-bin/INTERSHOP.enfinity/WFS/Quelle-quelle_de-Site/de_DE/-/EUR/Q_BrowseCatalog-Start;"+"sid"+"="+parse_enfsession+"?CategoryName="+products476442[count]["category_linkid"]+"&Linktype=M";
-var longdesc = products476442[count]["longdesc"].substr(0, 70);
-var shoptext = products476442[count]["category_text"];
-if (products476442[count]["longdesc"].length > 70) { longdesc = longdesc + ' ...';};
-document.write('<a href="'+ProductLink+'"><img src="'+products476442[count]["pic"]+'" width="112" height="95" border="0" alt=""></a>');
-document.write('<div style="position:relative;left:5px;top:8px;width:110px;height:80px;overflow:hidden;line-height:15px;">');
-document.write('<a href="'+ProductLink+'" style="font-face:arial;font-size:12px;font-weight:bold;text-decoration:underline;">'+products476442[count]["desc"]+'</a><br>');
-document.write(longdesc);
-document.write('</div><div style="position:relative;top:10px;left:5px;width:110px;">');
-if (products476442[count]["secondaryprice"] != '') {
-if (products476442[count]["secondaryprice"].length + products476442[count]["price"].length > 11) {
-document.write('<span id="pa_streichprice" class="q-trebuchet-12px-darkgrey">&euro; '+products476442[count]["secondaryprice"]+'</span>&nbsp;<br>');
-} else {
-document.write('<br><span id="pa_streichprice" class="q-trebuchet-12px-darkgrey">&euro; '+products476442[count]["secondaryprice"]+'</span>&nbsp;');
-}
-} else {
-if (products476442[count]["UVP"] != '') {
-document.write('<span id="pa_uvp" class="q-normal-12px-darkblue" style="color:#999999;">UVP*&nbsp;&euro;&nbsp;'+products476442[count]["UVP"]+'</span><br>');
-} else {
-document.write('<br>&nbsp;');
-}
-}
-if(products476442[count]["abPrice"] == '1') {
-document.write('<span class="q-bold-12px-red">ab &euro; '+products476442[count]["price"]+'</span></div>');
-} else {
-document.write('<span class="q-bold-12px-red">&euro; '+products476442[count]["price"]+'</span></div>');
-}
-document.write('<div style="position:relative;top:15px;width:120px;height:30px;float:left;background-color:#94bac1;overflow:hidden;">');
-if (products476442[count]["category_text"] != '') {
-document.write('<table border="0" cellpadding="2" cellspacing="0" width="100%" height="30"><tbody><tr><td valign="bottom"><a href="'+CategoryLink+'" style="color:white;font-face:arial;font-size:11px;font-weight:bold;text-decoration:none;">'+shoptext+'</a></td><td valign="bottom"><a href="'+CategoryLink+'"><img src="http://images.quelle.de/is-bin/intershop.static/WFS/Quelle-quelle_de-Site/-/de_DE/imagesOnline/pfeil_10x13.gif" border="0" style="position:relative;"></a></td></tr></tbody></table>');
-}
-document.write('</div>');
-}
-//-->
-</script>
-<div style="position:relative;width:245px;height:260px;overflow:hidden;background-color:#94bac1;">
-<div style="position:relative;width:120px;height:255px;background-color:white;float:left;">
-<script type="text/javascript">
-<!--
-showProd476442(prodcount476442);
-prodcount476442++;
-//-->
-</script>
-</div>
-<div style="position:relative;width:5px;height:255px;overflow:hidden;float:left;background-color:white;">
-</div>
-<div style="position:relative;width:120px;height:255px;background-color:white;float:left;">
-<script type="text/javascript">
-<!--
-showProd476442(prodcount476442);
-prodcount476442++;
-//-->
-</script>
-</div>
-</div>
-<!-- TemplateEnd -->
-
-</div>
-<div style="position:absolute;overflow:hidden;width:245px;left:500px;top:410px;">
-  
-<!-- TemplateBegin : $Archive: //pvcssrv02.service.itellium.net/pvcsfs/b2ccc/pvcsprojekte/Q2_Gesamt/archives/enfinity/share/private/eCS/Store/templates/de/scc/component-types/1565.isml-arc $ $Revision: 1.3 $-->
-<script type="text/javascript">
-<!--
-var compID476634 = '476634';
-var prodcount476634 = 0;
-var products476634 = new Array();
-products476634[0] = new Object();
-products476634[0]["desc"] = 'NINTENDO Wii Fit mit Balance Board';
-products476634[0]["longdesc"] = 'Die Erg&auml;nzung zur Spielekonsole Wii';
-products476634[0]["price"] = '99.99';
-products476634[0]["secondaryprice"] = '';
-products476634[0]["UVP"] = '';
-products476634[0]["abPrice"] = '';
-products476634[0]["pic"] = 'http://products.quelle.de/zc/bs/q1/images/e/2/0/e2052ae9c0714c0255d471a9d22ffbc2.tif/JDAqxrSlXGIzEidNs4z8S1GBB8ptARw_';
-products476634[0]["ProductSKU"] = '0637510J';
-products476634[0]["AAID"] = '200004143535';
-products476634[0]["CategoryName"] = '263031';
-products476634[0]["PromoShopID"] = 'QuelleRoot';
-products476634[0]["category_text"] = '... mehr von NINTENDO';
-products476634[0]["category_linkid"] = '260871';
-products476634[1] = new Object();
-products476634[1]["desc"] = 'PLAYBOY 2-tlg. Bettw&auml;sche';
-products476634[1]["longdesc"] = 'Exklusiv bei Quelle!';
-products476634[1]["price"] = '24.99';
-products476634[1]["secondaryprice"] = '34.99';
-products476634[1]["UVP"] = '';
-products476634[1]["abPrice"] = '';
-products476634[1]["pic"] = 'http://products.quelle.de/zc/bs/q1/images/6/2/a/62af39aae081a6b5dee7104de890d5b2.tif/JDAqxrSlXGIzEidNs4z8S1GBB8ptARw_';
-products476634[1]["ProductSKU"] = '0543499M-135/200';
-products476634[1]["AAID"] = '200001983598';
-products476634[1]["CategoryName"] = '264045';
-products476634[1]["PromoShopID"] = 'QuelleRoot';
-products476634[1]["category_text"] = '... mehr Bettw&auml;sche';
-products476634[1]["category_linkid"] = '264045';
-function showProd476634(count) {
-var ProductLink = window.location.protocol + "//" + window.location.hostname + "/is-bin/INTERSHOP.enfinity/WFS/Quelle-quelle_de-Site/de_DE/-/EUR/Q_DisplayProductInformation-Start;"+"sid"+"="+parse_enfsession+"?ProductSKU="+products476634[count]["ProductSKU"]+"&AAID="+products476634[count]["AAID"]+"&ProductRefID="+products476634[count]["ProductSKU"]+"@Quelle-quelle_de&CategoryName="+products476634[count]["CategoryName"]+"&PromoShopID="+products476634[count]["PromoShopID"]+"&Linktype=M";
-var CategoryLink = window.location.protocol + "//" + window.location.hostname + "/is-bin/INTERSHOP.enfinity/WFS/Quelle-quelle_de-Site/de_DE/-/EUR/Q_BrowseCatalog-Start;"+"sid"+"="+parse_enfsession+"?CategoryName="+products476634[count]["category_linkid"]+"&Linktype=M";
-var longdesc = products476634[count]["longdesc"].substr(0, 70);
-var shoptext = products476634[count]["category_text"];
-if (products476634[count]["longdesc"].length > 70) { longdesc = longdesc + ' ...';};
-document.write('<a href="'+ProductLink+'"><img src="'+products476634[count]["pic"]+'" width="112" height="95" border="0" alt=""></a>');
-document.write('<div style="position:relative;left:5px;top:8px;width:110px;height:80px;overflow:hidden;line-height:15px;">');
-document.write('<a href="'+ProductLink+'" style="font-face:arial;font-size:12px;font-weight:bold;text-decoration:underline;">'+products476634[count]["desc"]+'</a><br>');
-document.write(longdesc);
-document.write('</div><div style="position:relative;top:10px;left:5px;width:110px;">');
-if (products476634[count]["secondaryprice"] != '') {
-if (products476634[count]["secondaryprice"].length + products476634[count]["price"].length > 11) {
-document.write('<span id="pa_streichprice" class="q-trebuchet-12px-darkgrey">&euro; '+products476634[count]["secondaryprice"]+'</span>&nbsp;<br>');
-} else {
-document.write('<br><span id="pa_streichprice" class="q-trebuchet-12px-darkgrey">&euro; '+products476634[count]["secondaryprice"]+'</span>&nbsp;');
-}
-} else {
-if (products476634[count]["UVP"] != '') {
-document.write('<span id="pa_uvp" class="q-normal-12px-darkblue" style="color:#999999;">UVP*&nbsp;&euro;&nbsp;'+products476634[count]["UVP"]+'</span><br>');
-} else {
-document.write('<br>&nbsp;');
-}
-}
-if(products476634[count]["abPrice"] == '1') {
-document.write('<span class="q-bold-12px-red">ab &euro; '+products476634[count]["price"]+'</span></div>');
-} else {
-document.write('<span class="q-bold-12px-red">&euro; '+products476634[count]["price"]+'</span></div>');
-}
-document.write('<div style="position:relative;top:15px;width:120px;height:30px;float:left;background-color:#afa59d;overflow:hidden;">');
-if (products476634[count]["category_text"] != '') {
-document.write('<table border="0" cellpadding="2" cellspacing="0" width="100%" height="30"><tbody><tr><td valign="bottom"><a href="'+CategoryLink+'" style="color:white;font-face:arial;font-size:11px;font-weight:bold;text-decoration:none;">'+shoptext+'</a></td><td valign="bottom"><a href="'+CategoryLink+'"><img src="http://images.quelle.de/is-bin/intershop.static/WFS/Quelle-quelle_de-Site/-/de_DE/imagesOnline/pfeil_10x13.gif" border="0" style="position:relative;"></a></td></tr></tbody></table>');
-}
-document.write('</div>');
-}
-//-->
-</script>
-<div style="position:relative;width:245px;height:260px;overflow:hidden;background-color:#afa59d;">
-<div style="position:relative;width:120px;height:255px;background-color:white;float:left;">
-<script type="text/javascript">
-<!--
-showProd476634(prodcount476634);
-prodcount476634++;
-//-->
-</script>
-</div>
-<div style="position:relative;width:5px;height:255px;overflow:hidden;float:left;background-color:white;">
-</div>
-<div style="position:relative;width:120px;height:255px;background-color:white;float:left;">
-<script type="text/javascript">
-<!--
-showProd476634(prodcount476634);
-prodcount476634++;
-//-->
-</script>
-</div>
-</div>
-<!-- TemplateEnd -->
-
-</div>
-<div style="position:absolute;overflow:hidden;width:190px;left:765px;top:420px;">
-  
-<!-- TemplateBegin : $Archive: //pvcssrv02.service.itellium.net/pvcsfs/b2ccc/pvcsprojekte/Q2_Gesamt/archives/enfinity/share/private/eCS/Store/templates/de/scc/component-types/1520.isml-arc $ $Revision: 1.0 $-->
-<div style="position:relative;width:190px;height:25px;">
-<div style="position:relative;width:190px;height:24px;overflow:hidden;background-color:white;">
-<div style="position:absolute;left:6px;top:7px;width:16px;height:12px;">
-
-<a href="http://www.quelle.de/is-bin/INTERSHOP.enfinity/WFS/Quelle-quelle_de-Site/de_DE/-/EUR/Q_ViewStatic-ViewPage2?ProductSKU=static3109&CategoryName=50000010&PromoShopID=QuelleRoot&Linktype=M" class="" style="">
-<img src="http://images.quelle.de/is-bin/intershop.static/WFS/Quelle-quelle_de-Site/-/de_DE/images/5d/Icon-eCard-v01.gif" border="0" class="noStyle" style="width:17px;height:12px;" alt=""></a>
-</div>
-<div style="position:absolute;left:31px;top:5px;width:157px;height:19px;">
-<a href="http://www.quelle.de/is-bin/INTERSHOP.enfinity/WFS/Quelle-quelle_de-Site/de_DE/-/EUR/Q_ViewStatic-ViewPage2?ProductSKU=static3192&CategoryName=275550&PromoShopID=QuelleRoot&Linktype=M" class="q-normal-12px-darkblue">
-Meine eCards</a>
-</div>
-</div>
-</div>
-<!-- TemplateEnd -->
-
-</div>
-<div style="position:absolute;overflow:hidden;width:190px;left:765px;top:445px;">
-  
-<!-- TemplateBegin : $Archive: //pvcssrv02.service.itellium.net/pvcsfs/b2ccc/pvcsprojekte/Q2_Gesamt/archives/enfinity/share/private/eCS/Store/templates/de/scc/component-types/1520.isml-arc $ $Revision: 1.0 $-->
-<div style="position:relative;width:190px;height:25px;">
-<div style="position:relative;width:190px;height:24px;overflow:hidden;background-color:white;">
-<div style="position:absolute;left:6px;top:7px;width:16px;height:12px;">
-
-<a href="http://www.quelle.de/is-bin/INTERSHOP.enfinity/WFS/Quelle-quelle_de-Site/de_DE/-/EUR/Q_ViewTemplate-View?Template=q_redirect&RedirectURL=http://www.quelle.de/is-bin/INTERSHOP.enfinity/WFS/Quelle-quelle_de-Site/de_DE/-/EUR/Q_ViewTemplate_ecs-View?Template=static/q_quelletv_iframe&PromoShopID=QuelleRoot&Linktype=M" class="" style="">
-<img src="http://images.quelle.de/is-bin/intershop.static/WFS/Quelle-quelle_de-Site/-/de_DE/images/d8/icon_kamera.gif" border="0" class="noStyle" style="width:17px;height:12px;" alt=""></a>
-</div>
-<div style="position:absolute;left:31px;top:5px;width:157px;height:19px;">
-<a href="http://www.quelle.de/is-bin/INTERSHOP.enfinity/WFS/Quelle-quelle_de-Site/de_DE/-/EUR/Q_ViewTemplate-View?Template=q_redirect&RedirectURL=http://www.quelle.de/is-bin/INTERSHOP.enfinity/WFS/Quelle-quelle_de-Site/de_DE/-/EUR/Q_ViewTemplate_ecs-View?Template=static/q_quelletv_iframe&PromoShopID=QuelleRoot&Linktype=M" class="q-normal-12px-darkblue">
-quelle.tv</a>
-</div>
-</div>
-</div>
-<!-- TemplateEnd -->
-
-</div>
-<div style="position:absolute;overflow:hidden;width:190px;left:765px;top:475px;">
-  
-<!-- TemplateBegin : $Archive: //pvcssrv02.service.itellium.net/pvcsfs/b2ccc/pvcsprojekte/Q2_Gesamt/archives/enfinity/share/private/eCS/Store/templates/de/scc/component-types/1518.isml-arc $ $Revision: 1.1 $-->
-<div style="position:relative;height:25px;width:190px;overflow:hidden;background:url('http://images.quelle.de/is-bin/intershop.static/WFS/Quelle-quelle_de-Site/-/de_DE/imagesOnline/q5_mw_header_bg.gif') repeat-x;">
-<div style="position:relative;top:5px;left:7px;">
-<span class="q-bold-12px-white" style="text-decoration:none;">Weitere Sortimente</span>
-</div>
-</div>
-<!-- TemplateEnd -->
-
-</div>
-<div style="position:absolute;overflow:hidden;width:190px;left:765px;top:500px;">
-  
-<!-- TemplateBegin : $Archive: //pvcssrv02.service.itellium.net/pvcsfs/b2ccc/pvcsprojekte/Q2_Gesamt/archives/enfinity/share/private/eCS/Store/templates/de/scc/component-types/1569.isml-arc $ $Revision: 1.1 $-->
-<div style="position:relative;width:190px;height:40px;overflow:hidden;">
-<div style="position:relative;width:38px;height:38px;overflow:hidden;background-color:white;float:left;">
-<img src="http://images.quelle.de/is-bin/intershop.static/WFS/Quelle-quelle_de-Site/-/de_DE/images/68/kq_kochmuetze_38x38.gif" width="38" height="38">
-</div>
-<div style="position:relative;width:152px;height:38px;overflow:hidden;background-color:white;float:left;">
-<table border="0" callpadding="0" callspacing="0"><tr><td height="40">
-<a href="http://www.quelle.de/is-bin/INTERSHOP.enfinity/WFS/Quelle-quelle_de-Site/de_DE/-/EUR/Q_BrowseCatalog-Start?CategoryName=201159&PromoShopID=QuelleRoot&Linktype=M" class="q-bold-12px-darkred" style="color:#003399;text-decoration:none;">
-K?chen-QUELLE</a><br>
-</td></tr></table>
-</div>
-</div>
-<!-- TemplateEnd -->
-
-</div>
-<div style="position:absolute;overflow:hidden;width:190px;left:765px;top:540px;">
-  
-<!-- TemplateBegin : $Archive: //pvcssrv02.service.itellium.net/pvcsfs/b2ccc/pvcsprojekte/Q2_Gesamt/archives/enfinity/share/private/eCS/Store/templates/de/scc/component-types/1569.isml-arc $ $Revision: 1.1 $-->
-<div style="position:relative;width:190px;height:40px;overflow:hidden;">
-<div style="position:relative;width:38px;height:38px;overflow:hidden;background-color:white;float:left;">
-<img src="http://images.quelle.de/is-bin/intershop.static/WFS/Quelle-quelle_de-Site/-/de_DE/images/78/hp_icon_no7_finanzen_neu.gif" width="38" height="38">
-</div>
-<div style="position:relative;width:152px;height:38px;overflow:hidden;background-color:white;float:left;">
-<table border="0" callpadding="0" callspacing="0"><tr><td height="40">
-<a href="http://www.quelle.de/is-bin/INTERSHOP.enfinity/WFS/Quelle-quelle_de-Site/de_DE/-/EUR/Q_ViewStatic-ViewPage?ProductSKU=static2154&PromoShopID=QuelleRoot&Linktype=M" class="q-bold-12px-darkred" style="color:#003399;text-decoration:none;">
-Versicherungen &
-Finanzen</a><br>
-</td></tr></table>
-</div>
-</div>
-<!-- TemplateEnd -->
-
-</div>
-<div style="position:absolute;overflow:hidden;width:190px;left:765px;top:580px;">
-  
-<!-- TemplateBegin : $Archive: //pvcssrv02.service.itellium.net/pvcsfs/b2ccc/pvcsprojekte/Q2_Gesamt/archives/enfinity/share/private/eCS/Store/templates/de/scc/component-types/1569.isml-arc $ $Revision: 1.1 $-->
-<div style="position:relative;width:190px;height:40px;overflow:hidden;">
-<div style="position:relative;width:38px;height:38px;overflow:hidden;background-color:white;float:left;">
-<img src="http://images.quelle.de/is-bin/intershop.static/WFS/Quelle-quelle_de-Site/-/de_DE/images/e1/hp_icon_no3_reisen.gif" width="38" height="38">
-</div>
-<div style="position:relative;width:152px;height:38px;overflow:hidden;background-color:white;float:left;">
-<table border="0" callpadding="0" callspacing="0"><tr><td height="40">
-<a href="http://www.quelle.de/is-bin/INTERSHOP.enfinity/WFS/Quelle-quelle_de-Site/de_DE/-/EUR/Q_ViewTemplate_ecs-View?PromoShopID=QuelleRoot&Template=q_redirect&RedirectURL=http%3A%2F%2Fwww.quelle.de%2Fis-bin%2FINTERSHOP.enfinity%2FWFS%2FQuelle-quelle_de-Site%2Fde_DE%2F-%2FEUR%2FQ_ViewTemplate_ecs-View%3FTemplate%3Dstatic%2Fq_reisequelle_iframe%26LinkType%3DM&Linktype=M" class="q-bold-12px-darkred" style="color:#003399;text-decoration:none;">
-Lust auf Urlaub?<br>Jetzt hier buchen!</a><br>
-</td></tr></table>
-</div>
-</div>
-<!-- TemplateEnd -->
-
-</div>
-<div style="position:absolute;overflow:hidden;width:190px;left:765px;top:620px;">
-  
-<!-- TemplateBegin : $Archive: //pvcssrv02.service.itellium.net/pvcsfs/b2ccc/pvcsprojekte/Q2_Gesamt/archives/enfinity/share/private/eCS/Store/templates/de/scc/component-types/1569.isml-arc $ $Revision: 1.1 $-->
-<div style="position:relative;width:190px;height:40px;overflow:hidden;">
-<div style="position:relative;width:38px;height:38px;overflow:hidden;background-color:white;float:left;">
-<img src="http://images.quelle.de/is-bin/intershop.static/WFS/Quelle-quelle_de-Site/-/de_DE/images/bc/hp_icon_no1_bildershop_neu.gif" width="38" height="38">
-</div>
-<div style="position:relative;width:152px;height:38px;overflow:hidden;background-color:white;float:left;">
-<table border="0" callpadding="0" callspacing="0"><tr><td height="40">
-<a href="javascript:newWin('M1185485459','http://www.quelle.de/is-bin/INTERSHOP.enfinity/WFS/Quelle-quelle_de-Site/de_DE/-/EUR/Q_ViewTemplate-View?Template=q_redirect&RedirectURL=http://www.fotoquelle.de/&PromoShopID=QuelleRoot&Linktype=M',1026,736,'scrollbars=yes','scrollbars=yes')" class="q-bold-12px-darkred" style="color:#003399;text-decoration:none;">
-Foto Service</a><br>
-</td></tr></table>
-</div>
-</div>
-<!-- TemplateEnd -->
-
-</div>
-<div style="position:absolute;overflow:hidden;width:190px;left:765px;top:660px;">
-  
-<!-- TemplateBegin : $Archive: //pvcssrv02.service.itellium.net/pvcsfs/b2ccc/pvcsprojekte/Q2_Gesamt/archives/enfinity/share/private/eCS/Store/templates/de/scc/component-types/1569.isml-arc $ $Revision: 1.1 $-->
-<div style="position:relative;width:190px;height:40px;overflow:hidden;">
-<div style="position:relative;width:38px;height:38px;overflow:hidden;background-color:white;float:left;">
-<img src="http://images.quelle.de/is-bin/intershop.static/WFS/Quelle-quelle_de-Site/-/de_DE/images/32/HP_icon_dvd_gedreht.gif" width="38" height="38">
-</div>
-<div style="position:relative;width:152px;height:38px;overflow:hidden;background-color:white;float:left;">
-<table border="0" callpadding="0" callspacing="0"><tr><td height="40">
-<a href="http://www.quelle.de/is-bin/INTERSHOP.enfinity/WFS/Quelle-quelle_de-Site/de_DE/-/EUR/Q_ViewTemplate-View?Template=q_redirect&RedirectURL=http://www.quelle.de/is-bin/INTERSHOP.enfinity/WFS/Quelle-quelle_de-Site/de_DE/-/EUR/Q_DVDRental-Show&PromoShopID=QuelleRoot&Linktype=M" class="q-bold-12px-darkred" style="color:#003399;text-decoration:none;">
-DVD-Verleih</a><br>
-</td></tr></table>
-</div>
-</div>
-<!-- TemplateEnd -->
-
-</div>
-<div style="position:absolute;overflow:hidden;width:245px;left:0px;top:675px;">
-  
-<!-- TemplateBegin : $Archive: //pvcssrv02.service.itellium.net/pvcsfs/b2ccc/pvcsprojekte/Q2_Gesamt/archives/enfinity/share/private/eCS/Store/templates/de/scc/component-types/1565.isml-arc $ $Revision: 1.3 $-->
-<script type="text/javascript">
-<!--
-var compID609720 = '609720';
-var prodcount609720 = 0;
-var products609720 = new Array();
-products609720[0] = new Object();
-products609720[0]["desc"] = 'QS by s.Oliver T-Shirt';
-products609720[0]["longdesc"] = 'Markenqualit&auml;t f&uuml;r wenig Geld.';
-products609720[0]["price"] = '9.95';
-products609720[0]["secondaryprice"] = '';
-products609720[0]["UVP"] = '';
-products609720[0]["abPrice"] = '';
-products609720[0]["pic"] = 'http://products.quelle.de/zc/bs/q1/images/1/5/1/1510e07947c63b75198624320ee85cd0.tif/JDAqxrSlXGIzEidNs4z8S1GBB8ptARw_';
-products609720[0]["ProductSKU"] = '0480106A-M';
-products609720[0]["AAID"] = '200000900841';
-products609720[0]["CategoryName"] = '298140';
-products609720[0]["PromoShopID"] = 'QuelleRoot';
-products609720[0]["category_text"] = '... mehr von s. Oliver';
-products609720[0]["category_linkid"] = '298035';
-products609720[1] = new Object();
-products609720[1]["desc"] = 'Bermudas';
-products609720[1]["longdesc"] = 'L&auml;ssige Falten-Optik an den Taschen.';
-products609720[1]["price"] = '19.99';
-products609720[1]["secondaryprice"] = '';
-products609720[1]["UVP"] = '';
-products609720[1]["abPrice"] = '1';
-products609720[1]["pic"] = 'http://products.quelle.de/zc/bs/q1/images/7/7/4/774055ab531c4864fab60c526a580b9b.tif/JDAqxrSlXGIzEidNs4z8S1GBB8ptARw_';
-products609720[1]["ProductSKU"] = '0175320K-44';
-products609720[1]["AAID"] = '200002410180';
-products609720[1]["CategoryName"] = '272715';
-products609720[1]["PromoShopID"] = 'QuelleRoot';
-products609720[1]["category_text"] = '... mehr Hosen f&uuml;r Ihn';
-products609720[1]["category_linkid"] = '272715';
-function showProd609720(count) {
-var ProductLink = window.location.protocol + "//" + window.location.hostname + "/is-bin/INTERSHOP.enfinity/WFS/Quelle-quelle_de-Site/de_DE/-/EUR/Q_DisplayProductInformation-Start;"+"sid"+"="+parse_enfsession+"?ProductSKU="+products609720[count]["ProductSKU"]+"&AAID="+products609720[count]["AAID"]+"&ProductRefID="+products609720[count]["ProductSKU"]+"@Quelle-quelle_de&CategoryName="+products609720[count]["CategoryName"]+"&PromoShopID="+products609720[count]["PromoShopID"]+"&Linktype=M";
-var CategoryLink = window.location.protocol + "//" + window.location.hostname + "/is-bin/INTERSHOP.enfinity/WFS/Quelle-quelle_de-Site/de_DE/-/EUR/Q_BrowseCatalog-Start;"+"sid"+"="+parse_enfsession+"?CategoryName="+products609720[count]["category_linkid"]+"&Linktype=M";
-var longdesc = products609720[count]["longdesc"].substr(0, 70);
-var shoptext = products609720[count]["category_text"];
-if (products609720[count]["longdesc"].length > 70) { longdesc = longdesc + ' ...';};
-document.write('<a href="'+ProductLink+'"><img src="'+products609720[count]["pic"]+'" width="112" height="95" border="0" alt=""></a>');
-document.write('<div style="position:relative;left:5px;top:8px;width:110px;height:80px;overflow:hidden;line-height:15px;">');
-document.write('<a href="'+ProductLink+'" style="font-face:arial;font-size:12px;font-weight:bold;text-decoration:underline;">'+products609720[count]["desc"]+'</a><br>');
-document.write(longdesc);
-document.write('</div><div style="position:relative;top:10px;left:5px;width:110px;">');
-if (products609720[count]["secondaryprice"] != '') {
-if (products609720[count]["secondaryprice"].length + products609720[count]["price"].length > 11) {
-document.write('<span id="pa_streichprice" class="q-trebuchet-12px-darkgrey">&euro; '+products609720[count]["secondaryprice"]+'</span>&nbsp;<br>');
-} else {
-document.write('<br><span id="pa_streichprice" class="q-trebuchet-12px-darkgrey">&euro; '+products609720[count]["secondaryprice"]+'</span>&nbsp;');
-}
-} else {
-if (products609720[count]["UVP"] != '') {
-document.write('<span id="pa_uvp" class="q-normal-12px-darkblue" style="color:#999999;">UVP*&nbsp;&euro;&nbsp;'+products609720[count]["UVP"]+'</span><br>');
-} else {
-document.write('<br>&nbsp;');
-}
-}
-if(products609720[count]["abPrice"] == '1') {
-document.write('<span class="q-bold-12px-red">ab &euro; '+products609720[count]["price"]+'</span></div>');
-} else {
-document.write('<span class="q-bold-12px-red">&euro; '+products609720[count]["price"]+'</span></div>');
-}
-document.write('<div style="position:relative;top:15px;width:120px;height:30px;float:left;background-color:#acaf93;overflow:hidden;">');
-if (products609720[count]["category_text"] != '') {
-document.write('<table border="0" cellpadding="2" cellspacing="0" width="100%" height="30"><tbody><tr><td valign="bottom"><a href="'+CategoryLink+'" style="color:white;font-face:arial;font-size:11px;font-weight:bold;text-decoration:none;">'+shoptext+'</a></td><td valign="bottom"><a href="'+CategoryLink+'"><img src="http://images.quelle.de/is-bin/intershop.static/WFS/Quelle-quelle_de-Site/-/de_DE/imagesOnline/pfeil_10x13.gif" border="0" style="position:relative;"></a></td></tr></tbody></table>');
-}
-document.write('</div>');
-}
-//-->
-</script>
-<div style="position:relative;width:245px;height:260px;overflow:hidden;background-color:#acaf93;">
-<div style="position:relative;width:120px;height:255px;background-color:white;float:left;">
-<script type="text/javascript">
-<!--
-showProd609720(prodcount609720);
-prodcount609720++;
-//-->
-</script>
-</div>
-<div style="position:relative;width:5px;height:255px;overflow:hidden;float:left;background-color:white;">
-</div>
-<div style="position:relative;width:120px;height:255px;background-color:white;float:left;">
-<script type="text/javascript">
-<!--
-showProd609720(prodcount609720);
-prodcount609720++;
-//-->
-</script>
-</div>
-</div>
-<!-- TemplateEnd -->
-
-</div>
-<div style="position:absolute;overflow:hidden;width:245px;left:250px;top:675px;">
-  
-<!-- TemplateBegin : $Archive: //pvcssrv02.service.itellium.net/pvcsfs/b2ccc/pvcsprojekte/Q2_Gesamt/archives/enfinity/share/private/eCS/Store/templates/de/scc/component-types/1565.isml-arc $ $Revision: 1.3 $-->
-<script type="text/javascript">
-<!--
-var compID476619 = '476619';
-var prodcount476619 = 0;
-var products476619 = new Array();
-products476619[0] = new Object();
-products476619[0]["desc"] = 'PRIVILEG Einbauherdset';
-products476619[0]["longdesc"] = 'Unser Preishit!';
-products476619[0]["price"] = '399.99';
-products476619[0]["secondaryprice"] = '';
-products476619[0]["UVP"] = '';
-products476619[0]["abPrice"] = '1';
-products476619[0]["pic"] = 'http://products.quelle.de/zc/bs/q1/images/9/c/8/9c8eaaa44a6c92ca08c27c2b9bc072ba.tif/JDAqxrSlXGIzEidNs4z8S1GBB8ptARw_';
-products476619[0]["ProductSKU"] = '0360507U';
-products476619[0]["AAID"] = '200004073101';
-products476619[0]["CategoryName"] = '279057';
-products476619[0]["PromoShopID"] = 'QuelleRoot';
-products476619[0]["category_text"] = '... mehr Einbauger&auml;te';
-products476619[0]["category_linkid"] = '50000288';
-products476619[1] = new Object();
-products476619[1]["desc"] = 'PRIVILEG Waschmaschine';
-products476619[1]["longdesc"] = 'Inklusive Lieferung und Anschluss!';
-products476619[1]["price"] = '349.99';
-products476619[1]["secondaryprice"] = '369.99';
-products476619[1]["UVP"] = '';
-products476619[1]["abPrice"] = '';
-products476619[1]["pic"] = 'http://products.quelle.de/zc/bs/q1/images/8/d/d/8dd11f17bb23ffd363b8017d75a10eb9.tif/JDAqxrSlXGIzEidNs4z8S1GBB8ptARw_';
-products476619[1]["ProductSKU"] = '0121676Z';
-products476619[1]["AAID"] = '200002333404';
-products476619[1]["CategoryName"] = '264048';
-products476619[1]["PromoShopID"] = 'QuelleRoot';
-products476619[1]["category_text"] = '... mehr Waschmaschinen';
-products476619[1]["category_linkid"] = '264048';
-function showProd476619(count) {
-var ProductLink = window.location.protocol + "//" + window.location.hostname + "/is-bin/INTERSHOP.enfinity/WFS/Quelle-quelle_de-Site/de_DE/-/EUR/Q_DisplayProductInformation-Start;"+"sid"+"="+parse_enfsession+"?ProductSKU="+products476619[count]["ProductSKU"]+"&AAID="+products476619[count]["AAID"]+"&ProductRefID="+products476619[count]["ProductSKU"]+"@Quelle-quelle_de&CategoryName="+products476619[count]["CategoryName"]+"&PromoShopID="+products476619[count]["PromoShopID"]+"&Linktype=M";
-var CategoryLink = window.location.protocol + "//" + window.location.hostname + "/is-bin/INTERSHOP.enfinity/WFS/Quelle-quelle_de-Site/de_DE/-/EUR/Q_BrowseCatalog-Start;"+"sid"+"="+parse_enfsession+"?CategoryName="+products476619[count]["category_linkid"]+"&Linktype=M";
-var longdesc = products476619[count]["longdesc"].substr(0, 70);
-var shoptext = products476619[count]["category_text"];
-if (products476619[count]["longdesc"].length > 70) { longdesc = longdesc + ' ...';};
-document.write('<a href="'+ProductLink+'"><img src="'+products476619[count]["pic"]+'" width="112" height="95" border="0" alt=""></a>');
-document.write('<div style="position:relative;left:5px;top:8px;width:110px;height:80px;overflow:hidden;line-height:15px;">');
-document.write('<a href="'+ProductLink+'" style="font-face:arial;font-size:12px;font-weight:bold;text-decoration:underline;">'+products476619[count]["desc"]+'</a><br>');
-document.write(longdesc);
-document.write('</div><div style="position:relative;top:10px;left:5px;width:110px;">');
-if (products476619[count]["secondaryprice"] != '') {
-if (products476619[count]["secondaryprice"].length + products476619[count]["price"].length > 11) {
-document.write('<span id="pa_streichprice" class="q-trebuchet-12px-darkgrey">&euro; '+products476619[count]["secondaryprice"]+'</span>&nbsp;<br>');
-} else {
-document.write('<br><span id="pa_streichprice" class="q-trebuchet-12px-darkgrey">&euro; '+products476619[count]["secondaryprice"]+'</span>&nbsp;');
-}
-} else {
-if (products476619[count]["UVP"] != '') {
-document.write('<span id="pa_uvp" class="q-normal-12px-darkblue" style="color:#999999;">UVP*&nbsp;&euro;&nbsp;'+products476619[count]["UVP"]+'</span><br>');
-} else {
-document.write('<br>&nbsp;');
-}
-}
-if(products476619[count]["abPrice"] == '1') {
-document.write('<span class="q-bold-12px-red">ab &euro; '+products476619[count]["price"]+'</span></div>');
-} else {
-document.write('<span class="q-bold-12px-red">&euro; '+products476619[count]["price"]+'</span></div>');
-}
-document.write('<div style="position:relative;top:15px;width:120px;height:30px;float:left;background-color:#94bac1;overflow:hidden;">');
-if (products476619[count]["category_text"] != '') {
-document.write('<table border="0" cellpadding="2" cellspacing="0" width="100%" height="30"><tbody><tr><td valign="bottom"><a href="'+CategoryLink+'" style="color:white;font-face:arial;font-size:11px;font-weight:bold;text-decoration:none;">'+shoptext+'</a></td><td valign="bottom"><a href="'+CategoryLink+'"><img src="http://images.quelle.de/is-bin/intershop.static/WFS/Quelle-quelle_de-Site/-/de_DE/imagesOnline/pfeil_10x13.gif" border="0" style="position:relative;"></a></td></tr></tbody></table>');
-}
-document.write('</div>');
-}
-//-->
-</script>
-<div style="position:relative;width:245px;height:260px;overflow:hidden;background-color:#94bac1;">
-<div style="position:relative;width:120px;height:255px;background-color:white;float:left;">
-<script type="text/javascript">
-<!--
-showProd476619(prodcount476619);
-prodcount476619++;
-//-->
-</script>
-</div>
-<div style="position:relative;width:5px;height:255px;overflow:hidden;float:left;background-color:white;">
-</div>
-<div style="position:relative;width:120px;height:255px;background-color:white;float:left;">
-<script type="text/javascript">
-<!--
-showProd476619(prodcount476619);
-prodcount476619++;
-//-->
-</script>
-</div>
-</div>
-<!-- TemplateEnd -->
-
-</div>
-<div style="position:absolute;overflow:hidden;width:245px;left:500px;top:675px;">
-  
-<!-- TemplateBegin : $Archive: //pvcssrv02.service.itellium.net/pvcsfs/b2ccc/pvcsprojekte/Q2_Gesamt/archives/enfinity/share/private/eCS/Store/templates/de/scc/component-types/1565.isml-arc $ $Revision: 1.3 $-->
-<script type="text/javascript">
-<!--
-var compID722898 = '722898';
-var prodcount722898 = 0;
-var products722898 = new Array();
-products722898[0] = new Object();
-products722898[0]["desc"] = 'K&Auml;RCHER Hochdruckreiniger';
-products722898[0]["longdesc"] = 'Perfekt f&uuml;r den Fr&uuml;hjarsputz!';
-products722898[0]["price"] = '89.99';
-products722898[0]["secondaryprice"] = '';
-products722898[0]["UVP"] = '';
-products722898[0]["abPrice"] = '';
-products722898[0]["pic"] = 'http://products.quelle.de/zc/bs/q1/images/5/6/e/56edae93917833678f41e5fc3fecee18.tif/JDAqxrSlXGIzEidNs4z8S1GBB8ptARw_';
-products722898[0]["ProductSKU"] = '0048931X';
-products722898[0]["AAID"] = '200000363373';
-products722898[0]["CategoryName"] = '250716';
-products722898[0]["PromoShopID"] = 'QuelleRoot';
-products722898[0]["category_text"] = '... mehr Gartentechnik';
-products722898[0]["category_linkid"] = '116664';
-products722898[1] = new Object();
-products722898[1]["desc"] = 'Pflanzkasten mit Blumenrankgitter';
-products722898[1]["longdesc"] = 'F&uuml;r Balkon oder Terasse';
-products722898[1]["price"] = '59.99';
-products722898[1]["secondaryprice"] = '';
-products722898[1]["UVP"] = '';
-products722898[1]["abPrice"] = '';
-products722898[1]["pic"] = 'http://products.quelle.de/zc/bs/q1/images/4/6/b/46b6a77695ebb54fb4ac5ca2c37db125.tif/JDAqxrSlXGIzEidNs4z8S1GBB8ptARw_';
-products722898[1]["ProductSKU"] = '0743623H';
-products722898[1]["AAID"] = '100000164234';
-products722898[1]["CategoryName"] = '267687';
-products722898[1]["PromoShopID"] = 'QuelleRoot';
-products722898[1]["category_text"] = '... mehr Gartendeko';
-products722898[1]["category_linkid"] = '267687';
-function showProd722898(count) {
-var ProductLink = window.location.protocol + "//" + window.location.hostname + "/is-bin/INTERSHOP.enfinity/WFS/Quelle-quelle_de-Site/de_DE/-/EUR/Q_DisplayProductInformation-Start;"+"sid"+"="+parse_enfsession+"?ProductSKU="+products722898[count]["ProductSKU"]+"&AAID="+products722898[count]["AAID"]+"&ProductRefID="+products722898[count]["ProductSKU"]+"@Quelle-quelle_de&CategoryName="+products722898[count]["CategoryName"]+"&PromoShopID="+products722898[count]["PromoShopID"]+"&Linktype=M";
-var CategoryLink = window.location.protocol + "//" + window.location.hostname + "/is-bin/INTERSHOP.enfinity/WFS/Quelle-quelle_de-Site/de_DE/-/EUR/Q_BrowseCatalog-Start;"+"sid"+"="+parse_enfsession+"?CategoryName="+products722898[count]["category_linkid"]+"&Linktype=M";
-var longdesc = products722898[count]["longdesc"].substr(0, 70);
-var shoptext = products722898[count]["category_text"];
-if (products722898[count]["longdesc"].length > 70) { longdesc = longdesc + ' ...';};
-document.write('<a href="'+ProductLink+'"><img src="'+products722898[count]["pic"]+'" width="112" height="95" border="0" alt=""></a>');
-document.write('<div style="position:relative;left:5px;top:8px;width:110px;height:80px;overflow:hidden;line-height:15px;">');
-document.write('<a href="'+ProductLink+'" style="font-face:arial;font-size:12px;font-weight:bold;text-decoration:underline;">'+products722898[count]["desc"]+'</a><br>');
-document.write(longdesc);
-document.write('</div><div style="position:relative;top:10px;left:5px;width:110px;">');
-if (products722898[count]["secondaryprice"] != '') {
-if (products722898[count]["secondaryprice"].length + products722898[count]["price"].length > 11) {
-document.write('<span id="pa_streichprice" class="q-trebuchet-12px-darkgrey">&euro; '+products722898[count]["secondaryprice"]+'</span>&nbsp;<br>');
-} else {
-document.write('<br><span id="pa_streichprice" class="q-trebuchet-12px-darkgrey">&euro; '+products722898[count]["secondaryprice"]+'</span>&nbsp;');
-}
-} else {
-if (products722898[count]["UVP"] != '') {
-document.write('<span id="pa_uvp" class="q-normal-12px-darkblue" style="color:#999999;">UVP*&nbsp;&euro;&nbsp;'+products722898[count]["UVP"]+'</span><br>');
-} else {
-document.write('<br>&nbsp;');
-}
-}
-if(products722898[count]["abPrice"] == '1') {
-document.write('<span class="q-bold-12px-red">ab &euro; '+products722898[count]["price"]+'</span></div>');
-} else {
-document.write('<span class="q-bold-12px-red">&euro; '+products722898[count]["price"]+'</span></div>');
-}
-document.write('<div style="position:relative;top:15px;width:120px;height:30px;float:left;background-color:#afa59d;overflow:hidden;">');
-if (products722898[count]["category_text"] != '') {
-document.write('<table border="0" cellpadding="2" cellspacing="0" width="100%" height="30"><tbody><tr><td valign="bottom"><a href="'+CategoryLink+'" style="color:white;font-face:arial;font-size:11px;font-weight:bold;text-decoration:none;">'+shoptext+'</a></td><td valign="bottom"><a href="'+CategoryLink+'"><img src="http://images.quelle.de/is-bin/intershop.static/WFS/Quelle-quelle_de-Site/-/de_DE/imagesOnline/pfeil_10x13.gif" border="0" style="position:relative;"></a></td></tr></tbody></table>');
-}
-document.write('</div>');
-}
-//-->
-</script>
-<div style="position:relative;width:245px;height:260px;overflow:hidden;background-color:#afa59d;">
-<div style="position:relative;width:120px;height:255px;background-color:white;float:left;">
-<script type="text/javascript">
-<!--
-showProd722898(prodcount722898);
-prodcount722898++;
-//-->
-</script>
-</div>
-<div style="position:relative;width:5px;height:255px;overflow:hidden;float:left;background-color:white;">
-</div>
-<div style="position:relative;width:120px;height:255px;background-color:white;float:left;">
-<script type="text/javascript">
-<!--
-showProd722898(prodcount722898);
-prodcount722898++;
-//-->
-</script>
-</div>
-</div>
-<!-- TemplateEnd -->
-
-</div>
-<div style="position:absolute;overflow:hidden;width:190px;left:765px;top:705px;">
-  
-<!-- TemplateBegin : $Archive: //pvcssrv02.service.itellium.net/pvcsfs/b2ccc/pvcsprojekte/Q2_Gesamt/archives/enfinity/share/private/eCS/Store/templates/de/scc/component-types/1518.isml-arc $ $Revision: 1.1 $-->
-<div style="position:relative;height:25px;width:190px;overflow:hidden;background:url('http://images.quelle.de/is-bin/intershop.static/WFS/Quelle-quelle_de-Site/-/de_DE/imagesOnline/q5_mw_header_bg.gif') repeat-x;">
-<div style="position:relative;top:5px;left:7px;">
-<span class="q-bold-12px-white" style="text-decoration:none;">Quelle in Ihrer N?he</span>
-</div>
-</div>
-<!-- TemplateEnd -->
-
-</div>
-<div style="position:absolute;overflow:hidden;width:190px;left:765px;top:730px;">
-  
-<!-- TemplateBegin : $Archive: //pvcssrv02.service.itellium.net/pvcsfs/b2ccc/pvcsprojekte/Q2_Gesamt/archives/enfinity/share/private/eCS/Store/templates/de/scc/component-types/1570.isml-arc $ $Revision: 1.3 $-->
-<div style="position:relative;width:190px;height:85px;overflow:hidden;background-color:white;">
-<form action="http://www.quelle.de/is-bin/INTERSHOP.enfinity/WFS/Quelle-quelle_de-Site/de_DE/-/EUR/Q_Shopfinder-Process" method="GET" name="formMask_mw">
-<div align="center" style="position:relative;left:5px;top:13px;width:180px;height:30px;">
-<select name="Show" size="1" style="width:170px;" class="q-normal-12px-darkblue">
-<option value="all"> Alle
-<option value="qtcs" > QUELLE Filialen *
-<option value="bas" > QUELLE-Bestellannahmen
-</select>
-</div>
-<div align="center" class="q-normal-12px-darkblue" style="position:relative;left:5px;top:6px;width:180px;height:30px;">
-PLZ: &nbsp;<input type="text" size="5" maxlength="5" name="ZipCode" class="q-normal-12px-darkblue"> &nbsp;<a href="javascript:document.formMask_mw.submit()" target="_self"><img src="http://images.quelle.de/is-bin/intershop.static/WFS/Quelle-quelle_de-Site/-/de_DE/imagesOnline/q5_sf_search.gif" border="0" style="position:relative;top:5px;"></a>
-<div style="font-size:smaller;padding:5px 5px 0px 5px; text-align:left">* Eigene und Partner-Filialen</div>
-</div>
-<input type="Hidden" name="City" value="">
-<input type="Hidden" name="Type" value="eTS">
-<input type="Hidden" name="CategoryName" value="qnav6000293">
-<input type="Hidden" name="Linktype" value="M">
-<input type="Hidden" name="PromoShopID" value="QuelleRoot">
-</form>
-</div>
-<!-- TemplateEnd -->
-
-</div>
-<div style="position:absolute;overflow:hidden;width:190px;left:765px;top:820px;">
-  
-<!-- TemplateBegin : $Archive: //pvcssrv02.service.itellium.net/pvcsfs/b2ccc/pvcsprojekte/Q2_Gesamt/archives/enfinity/share/private/eCS/Store/templates/de/scc/component-types/1518.isml-arc $ $Revision: 1.1 $-->
-<div style="position:relative;height:25px;width:190px;overflow:hidden;background:url('http://images.quelle.de/is-bin/intershop.static/WFS/Quelle-quelle_de-Site/-/de_DE/imagesOnline/q5_mw_header_bg.gif') repeat-x;">
-<div style="position:relative;top:5px;left:7px;">
-<a href="http://www.quelle.de/is-bin/INTERSHOP.enfinity/WFS/Quelle-quelle_de-Site/de_DE/-/EUR/Q_BrowseCatalog-Start?CategoryName=245730&PromoShopID=QuelleRoot&Linktype=M" class="q-bold-12px-white" style="text-decoration:none;">
-Sicheres Einkaufen</a>
-</div>
-</div>
-<!-- TemplateEnd -->
-
-</div>
-<div style="position:absolute;overflow:hidden;width:190px;left:765px;top:845px;">
-  
-<!-- TemplateBegin : $Archive: //pvcssrv02.service.itellium.net/pvcsfs/b2ccc/pvcsprojekte/Q2_Gesamt/archives/enfinity/share/private/eCS/Store/templates/de/scc/component-types/1560.isml-arc $ $Revision: 1.2 $-->
-<div style="position:relative;width:190px;height:70px;">
-
-<a href="http://www.quelle.de/is-bin/INTERSHOP.enfinity/WFS/Quelle-quelle_de-Site/de_DE/-/EUR/Q_BrowseCatalog-Start?CategoryName=273975&PromoShopID=QuelleRoot&Linktype=M" class="" style="">
-<img src="http://images.quelle.de/is-bin/intershop.static/WFS/Quelle-quelle_de-Site/-/de_DE/images/1f/hp_awards.gif" border="0" class="noStyle" alt=""></a>
-</div>
-<!-- TemplateEnd -->
-
-</div>
-<div style="position:absolute;overflow:hidden;width:190px;left:765px;top:920px;">
-  
-<!-- TemplateBegin : $Archive: //pvcssrv02.service.itellium.net/pvcsfs/b2ccc/pvcsprojekte/Q2_Gesamt/archives/enfinity/share/private/eCS/Store/templates/de/scc/component-types/1518.isml-arc $ $Revision: 1.1 $-->
-<div style="position:relative;height:25px;width:190px;overflow:hidden;background:url('http://images.quelle.de/is-bin/intershop.static/WFS/Quelle-quelle_de-Site/-/de_DE/imagesOnline/q5_mw_header_bg.gif') repeat-x;">
-<div style="position:relative;top:5px;left:7px;">
-<span class="q-bold-12px-white" style="text-decoration:none;">Extra profitieren mit Quelle</span>
-</div>
-</div>
-<!-- TemplateEnd -->
-
-</div>
-<div style="position:absolute;overflow:hidden;width:150px;left:0px;top:945px;">
- <!-- TemplateBegin : $Archive:   //pvcssrv02.service.itellium.net/pvcsfs/b2ccc/pvcsprojekte/Q2_Gesamt/archives/enfinity/share/private/eCS/Store/templates/de/scc/component-types/1575.isml-arc  $ $Revision: 8195 $-->
-
-
-
-
-
-<div style="position:relative;width:150px;height:20px;text-align:left;color:#003399;background-color:white;overflow:hidden;">
-	<div style="position:absolute;left:7px;top:5px;width:136px;height:10px;">
-	<span style="font: normal bold 12px Arial;color:#003399;text-decoration:none;">Marken bei QUELLE</span>
-	</div>	
-</div>
-
-
-
-
-
-<!-- TemplateEnd -->
-
-</div>
-<div style="position:absolute;overflow:hidden;width:190px;left:765px;top:945px;">
-  
-<!-- TemplateBegin : $Archive: //pvcssrv02.service.itellium.net/pvcsfs/b2ccc/pvcsprojekte/Q2_Gesamt/archives/enfinity/share/private/eCS/Store/templates/de/scc/component-types/1519.isml-arc $ $Revision: 1.1 $-->
-<div style="position:relative;width:190px;height:25px;">
-<div style="position:relative;width:190px;height:24px;overflow:hidden;background-color:white;">
-<div style="position:absolute;left:6px;top:4px;">
-<a href="http://www.quelle.de/is-bin/INTERSHOP.enfinity/WFS/Quelle-quelle_de-Site/de_DE/-/EUR/Q_ViewStatic-ViewPage?ProductSKU=static2449&PromoShopID=QuelleRoot&Linktype=M" class="q-normal-12px-darkblue">
-Profi Partner werden</a>
-</div>
-</div>
-</div>
-<!-- TemplateEnd -->
-
-</div>
-<div style="position:absolute;overflow:hidden;width:75px;left:0px;top:970px;">
-  
-<!-- TemplateBegin : $Archive: //pvcssrv02.service.itellium.net/pvcsfs/b2ccc/pvcsprojekte/Q2_Gesamt/archives/enfinity/share/private/eCS/Store/templates/de/scc/component-types/1560.isml-arc $ $Revision: 1.2 $-->
-<div style="position:relative;width:75px;height:36px;">
-
-<a href="http://www.quelle.de/is-bin/INTERSHOP.enfinity/WFS/Quelle-quelle_de-Site/de_DE/-/EUR/Q_BrowseCatalog-Start?CategoryName=114184&PromoShopID=QuelleRoot&Linktype=M" class="" style="">
-<img src="http://images.quelle.de/is-bin/intershop.static/WFS/Quelle-quelle_de-Site/-/de_DE/images/9f/HP_Marke_adidas.gif" border="0" class="noStyle" alt=""></a>
-</div>
-<!-- TemplateEnd -->
-
-</div>
-<div style="position:absolute;overflow:hidden;width:75px;left:75px;top:970px;">
-  
-<!-- TemplateBegin : $Archive: //pvcssrv02.service.itellium.net/pvcsfs/b2ccc/pvcsprojekte/Q2_Gesamt/archives/enfinity/share/private/eCS/Store/templates/de/scc/component-types/1560.isml-arc $ $Revision: 1.2 $-->
-<div style="position:relative;width:75px;height:36px;">
-
-<a href="http://www.quelle.de/is-bin/INTERSHOP.enfinity/WFS/Quelle-quelle_de-Site/de_DE/-/EUR/Q_BrowseCatalog-Start?CategoryName=251631&PromoShopID=QuelleRoot&Linktype=M" class="" style="">
-<img src="http://images.quelle.de/is-bin/intershop.static/WFS/Quelle-quelle_de-Site/-/de_DE/images/ff/HP_Marke_casamaxx.gif" border="0" class="noStyle" alt=""></a>
-</div>
-<!-- TemplateEnd -->
-
-</div>
-<div style="position:absolute;overflow:hidden;width:75px;left:150px;top:970px;">
-  
-<!-- TemplateBegin : $Archive: //pvcssrv02.service.itellium.net/pvcsfs/b2ccc/pvcsprojekte/Q2_Gesamt/archives/enfinity/share/private/eCS/Store/templates/de/scc/component-types/1560.isml-arc $ $Revision: 1.2 $-->
-<div style="position:relative;width:75px;height:36px;">
-
-<a href="http://www.quelle.de/is-bin/INTERSHOP.enfinity/WFS/Quelle-quelle_de-Site/de_DE/-/EUR/Q_BrowseCatalog-Start?CategoryName=256260&PromoShopID=QuelleRoot&Linktype=M" class="" style="">
-<img src="http://images.quelle.de/is-bin/intershop.static/WFS/Quelle-quelle_de-Site/-/de_DE/images/27/HP_Marke_esprit.gif" border="0" class="noStyle" alt=""></a>
-</div>
-<!-- TemplateEnd -->
-
-</div>
-<div style="position:absolute;overflow:hidden;width:75px;left:225px;top:970px;">
-  
-<!-- TemplateBegin : $Archive: //pvcssrv02.service.itellium.net/pvcsfs/b2ccc/pvcsprojekte/Q2_Gesamt/archives/enfinity/share/private/eCS/Store/templates/de/scc/component-types/1560.isml-arc $ $Revision: 1.2 $-->
-<div style="position:relative;width:75px;height:36px;">
-
-<a href="http://www.quelle.de/is-bin/INTERSHOP.enfinity/WFS/Quelle-quelle_de-Site/de_DE/-/EUR/Q_FreeSearch-Start?search_free=fujitsu&PromoShopID=QuelleRoot&Linktype=M" class="" style="">
-<img src="http://images.quelle.de/is-bin/intershop.static/WFS/Quelle-quelle_de-Site/-/de_DE/images/a7/Hp_Marke_FujitsuSiemens.gif" border="0" class="noStyle" alt=""></a>
-</div>
-<!-- TemplateEnd -->
-
-</div>
-<div style="position:absolute;overflow:hidden;width:75px;left:300px;top:970px;">
-  
-<!-- TemplateBegin : $Archive: //pvcssrv02.service.itellium.net/pvcsfs/b2ccc/pvcsprojekte/Q2_Gesamt/archives/enfinity/share/private/eCS/Store/templates/de/scc/component-types/1560.isml-arc $ $Revision: 1.2 $-->
-<div style="position:relative;width:75px;height:36px;">
-
-<a href="http://www.quelle.de/is-bin/INTERSHOP.enfinity/WFS/Quelle-quelle_de-Site/de_DE/-/EUR/Q_BrowseCatalog-Start?CategoryName=223659&PromoShopID=QuelleRoot&Linktype=M" class="" style="">
-<img src="http://images.quelle.de/is-bin/intershop.static/WFS/Quelle-quelle_de-Site/-/de_DE/images/e3/HP_Marke_Mexx.gif" border="0" class="noStyle" alt=""></a>
-</div>
-<!-- TemplateEnd -->
-
-</div>
-<div style="position:absolute;overflow:hidden;width:75px;left:375px;top:970px;">
-  
-<!-- TemplateBegin : $Archive: //pvcssrv02.service.itellium.net/pvcsfs/b2ccc/pvcsprojekte/Q2_Gesamt/archives/enfinity/share/private/eCS/Store/templates/de/scc/component-types/1560.isml-arc $ $Revision: 1.2 $-->
-<div style="position:relative;width:75px;height:36px;">
-
-<a href="http://www.quelle.de/is-bin/INTERSHOP.enfinity/WFS/Quelle-quelle_de-Site/de_DE/-/EUR/Q_BrowseCatalog-Start?CategoryName=200388&PromoShopID=QuelleRoot&Linktype=M" class="" style="">
-<img src="http://images.quelle.de/is-bin/intershop.static/WFS/Quelle-quelle_de-Site/-/de_DE/images/ae/HP_Marke_privileg.gif" border="0" class="noStyle" alt=""></a>
-</div>
-<!-- TemplateEnd -->
-
-</div>
-<div style="position:absolute;overflow:hidden;width:75px;left:450px;top:970px;">
-  
-<!-- TemplateBegin : $Archive: //pvcssrv02.service.itellium.net/pvcsfs/b2ccc/pvcsprojekte/Q2_Gesamt/archives/enfinity/share/private/eCS/Store/templates/de/scc/component-types/1560.isml-arc $ $Revision: 1.2 $-->
-<div style="position:relative;width:75px;height:36px;">
-
-<a href="http://www.quelle.de/is-bin/INTERSHOP.enfinity/WFS/Quelle-quelle_de-Site/de_DE/-/EUR/Q_BrowseCatalog-Start?CategoryName=116286&PromoShopID=QuelleRoot&Linktype=M" class="" style="">
-<img src="http://images.quelle.de/is-bin/intershop.static/WFS/Quelle-quelle_de-Site/-/de_DE/images/17/HP_Marke_puma.gif" border="0" class="noStyle" alt=""></a>
-</div>
-<!-- TemplateEnd -->
-
-</div>
-<div style="position:absolute;overflow:hidden;width:75px;left:525px;top:970px;">
-  
-<!-- TemplateBegin : $Archive: //pvcssrv02.service.itellium.net/pvcsfs/b2ccc/pvcsprojekte/Q2_Gesamt/archives/enfinity/share/private/eCS/Store/templates/de/scc/component-types/1560.isml-arc $ $Revision: 1.2 $-->
-<div style="position:relative;width:75px;height:36px;">
-
-<a href="http://www.quelle.de/is-bin/INTERSHOP.enfinity/WFS/Quelle-quelle_de-Site/de_DE/-/EUR/Q_BrowseCatalog-Start?CategoryName=112499&PromoShopID=QuelleRoot&Linktype=M" class="" style="">
-<img src="http://images.quelle.de/is-bin/intershop.static/WFS/Quelle-quelle_de-Site/-/de_DE/images/f2/HP_Marke_Sony.gif" border="0" class="noStyle" alt=""></a>
-</div>
-<!-- TemplateEnd -->
-
-</div>
-<div style="position:absolute;overflow:hidden;width:65px;left:600px;top:970px;">
-  
-<!-- TemplateBegin : $Archive: //pvcssrv02.service.itellium.net/pvcsfs/b2ccc/pvcsprojekte/Q2_Gesamt/archives/enfinity/share/private/eCS/Store/templates/de/scc/component-types/1560.isml-arc $ $Revision: 1.2 $-->
-<div style="position:relative;width:65px;height:36px;">
-
-<a href="http://www.quelle.de/is-bin/INTERSHOP.enfinity/WFS/Quelle-quelle_de-Site/de_DE/-/EUR/Q_BrowseCatalog-Start?CategoryName=274512&PromoShopID=QuelleRoot&Linktype=M" class="" style="">
-<img src="http://images.quelle.de/is-bin/intershop.static/WFS/Quelle-quelle_de-Site/-/de_DE/images/f3/hp_marke_wmf_neu2.gif" border="0" class="noStyle" alt=""></a>
-</div>
-<!-- TemplateEnd -->
-
-</div>
-<div style="position:absolute;overflow:hidden;width:190px;left:765px;top:970px;">
-  
-<!-- TemplateBegin : $Archive: //pvcssrv02.service.itellium.net/pvcsfs/b2ccc/pvcsprojekte/Q2_Gesamt/archives/enfinity/share/private/eCS/Store/templates/de/scc/component-types/1519.isml-arc $ $Revision: 1.1 $-->
-<div style="position:relative;width:190px;height:25px;">
-<div style="position:relative;width:190px;height:24px;overflow:hidden;background-color:white;">
-<div style="position:absolute;left:6px;top:4px;">
-<a href="http://www.quelle.de/is-bin/INTERSHOP.enfinity/WFS/Quelle-quelle_de-Site/de_DE/-/EUR/Q_BrowseCatalog-Start?CategoryName=265365&PromoShopID=QuelleRoot&Linktype=M" class="q-normal-12px-darkblue">
-Freunde werben Freunde</a>
-</div>
-</div>
-</div>
-<!-- TemplateEnd -->
-
-</div>
-<div style="position:absolute;overflow:hidden;width:75px;left:665px;top:980px;">
- <!-- TemplateBegin : $Archive:   //pvcssrv02.service.itellium.net/pvcsfs/b2ccc/pvcsprojekte/Q2_Gesamt/archives/enfinity/share/private/eCS/Store/templates/de/scc/component-types/1575.isml-arc  $ $Revision: 8195 $-->
-
-
-
-
-
-<div style="position:relative;width:75px;height:20px;text-align:left;color:#003399;background-color:white;overflow:hidden;">
-	<div style="position:absolute;left:7px;top:5px;width:61px;height:10px;">
-	
-
-
-
-
-
-<a href="http://www.quelle.de/is-bin/INTERSHOP.enfinity/WFS/Quelle-quelle_de-Site/de_DE/-/EUR/Q_BrowseCatalog-Start?CategoryName=242112&PromoShopID=QuelleRoot&Linktype=M" class="none" style="font: normal normal 10px Arial;color:#003399;text-decoration:underline;">
-Alle Marken</a>
-	</div>	
-</div>
-
-
-
-
-
-<!-- TemplateEnd -->
-
-</div>
-<div style="position:absolute;overflow:hidden;width:190px;left:765px;top:995px;">
-  
-<!-- TemplateBegin : $Archive: //pvcssrv02.service.itellium.net/pvcsfs/b2ccc/pvcsprojekte/Q2_Gesamt/archives/enfinity/share/private/eCS/Store/templates/de/scc/component-types/1519.isml-arc $ $Revision: 1.1 $-->
-<div style="position:relative;width:190px;height:25px;">
-<div style="position:relative;width:190px;height:24px;overflow:hidden;background-color:white;">
-<div style="position:absolute;left:6px;top:4px;">
-<a href="http://www.quelle.de/is-bin/INTERSHOP.enfinity/WFS/Quelle-quelle_de-Site/de_DE/-/EUR/Q_ViewStatic-ViewPage2?CategoryName=qnav6000007&ProductSKU=static2974&PromoShopID=QuelleRoot&Linktype=M" class="q-normal-12px-darkblue">
-Internet-Partnerprogramm</a>
-</div>
-</div>
-</div>
-<!-- TemplateEnd -->
-
-</div>
-<div style="position:absolute;overflow:hidden;width:150px;left:0px;top:1015px;">
- <!-- TemplateBegin : $Archive:   //pvcssrv02.service.itellium.net/pvcsfs/b2ccc/pvcsprojekte/Q2_Gesamt/archives/enfinity/share/private/eCS/Store/templates/de/scc/component-types/1575.isml-arc  $ $Revision: 8195 $-->
-
-
-
-
-
-<div style="position:relative;width:150px;height:20px;text-align:left;color:#003399;background-color:white;overflow:hidden;">
-	<div style="position:absolute;left:7px;top:5px;width:136px;height:10px;">
-	<span style="font: normal bold 12px Arial;color:#003399;text-decoration:none;">Unser Versandpartner</span>
-	</div>	
-</div>
-
-
-
-
-
-<!-- TemplateEnd -->
-
-</div>
-<div style="position:absolute;overflow:hidden;width:75px;left:5px;top:1040px;">
-  
-<!-- TemplateBegin : $Archive: //pvcssrv02.service.itellium.net/pvcsfs/b2ccc/pvcsprojekte/Q2_Gesamt/archives/enfinity/share/private/eCS/Store/templates/de/scc/component-types/1560.isml-arc $ $Revision: 1.2 $-->
-<div style="position:relative;width:75px;height:36px;">
-
-<a href="http://www.quelle.de/is-bin/INTERSHOP.enfinity/WFS/Quelle-quelle_de-Site/de_DE/-/EUR/Q_BrowseCatalog-Start?CategoryName=287325&PromoShopID=QuelleRoot&Linktype=M" class="" style="">
-<img src="http://images.quelle.de/is-bin/intershop.static/WFS/Quelle-quelle_de-Site/-/de_DE/images/e2/dhl_logo_75x36.gif" border="0" class="noStyle" alt=""></a>
-</div>
-<!-- TemplateEnd -->
-
-</div>
-</div>
-<div style="color:#636363;position:relative;padding-top:5px;padding-left:12px;height:25px;overflow:hidden;" class="q-normal-12px-darkblue">
-&nbsp;&nbsp;*) UVP = Unverbindliche Preisempfehlung des Herstellers
-</div>
-
-<div class="q-spacer" style="height:10px;">&nbsp;</div>
-
-</div>
-</div>
-<!-- Template Begin:  inc/q5_pg_footer_ecs.isml (sld_ch_quelle_app) -->
-
-
-<!-- Template Begin:  inc/q5_pg_footer_content.isml (sld_ch_quelle_app) -->
-
-
-
-
-
-
-
-
-
-<div id="footer-container">
-<div id="footer-verlauf">&nbsp;</div>
-<div id="footer-inhalt">
-<div id="footer-inhalt-txt3" class="q5-footer">
-Preisangaben inkl. gesetzl. MwSt. und zzgl. <a class="q5-footer link" href="http://www.quelle.de/is-bin/INTERSHOP.enfinity/WFS/Quelle-quelle_de-Site/de_DE/-/EUR/Q_ViewStatic-ViewPage?ProductSKU=static1046&PromoShopID=241494&Linktype=M">Service- &amp; Versandkosten</a><br>
-Quelle - Das Versandhaus pr?sentiert ein Sortiment aus Mode f?r <a class="q5-footer link" href="http://www.quelle.de/Mode-fuer-SIE/">Sie</a> und <a class="q5-footer link" href="http://www.quelle.de/Mode-fuer-IHN/">Ihn</a>, <a class="q5-footer link" href="http://www.quelle.de/Technik-Multimedia/">Technik</a>, <a class="q5-footer link" href="http://www.quelle.de/Wohnen-Haushalt/">Haushalt</a> ...
-</div>
-<div id="footer-inhalt-txt" class="q5-footer" >
-<a class="q5-footer link" href="http://www.quelle.de/is-bin/INTERSHOP.enfinity/WFS/Quelle-quelle_de-Site/de_DE/-/EUR/Q_ViewStatic-ViewPage?ProductSKU=static1510&Linktype=AD">Kontakt</a>
-&nbsp;|&nbsp;
-<a class="q5-footer link" href="http://www.quelle.de/is-bin/INTERSHOP.enfinity/WFS/Quelle-quelle_de-Site/de_DE/-/EUR/Q_ViewStatic-ViewPage?ProductSKU=static1021&Linktype=AD">AGB</a>
-&nbsp;|&nbsp;
-<a class="q5-footer link" href="http://www.quelle.de/is-bin/INTERSHOP.enfinity/WFS/Quelle-quelle_de-Site/de_DE/-/EUR/Q_ViewStatic-ViewPage?ProductSKU=static1034&Linktype=AD">Datenschutz</a>
-&nbsp;|&nbsp;
-<a class="q5-footer link" href="http://www.quelle.de/is-bin/INTERSHOP.enfinity/WFS/Quelle-quelle_de-Site/de_DE/-/EUR/Q_ViewStatic-ViewPage?ProductSKU=static2565&Linktype=AD">Impressum</a>
-&nbsp;|&nbsp;
-<a class="q5-footer link" href="http://www.quelle.de/is-bin/INTERSHOP.enfinity/WFS/Quelle-quelle_de-Site/de_DE/-/EUR/Q_ViewStatic-ViewPage?ProductSKU=static1003&Linktype=AD">Jobs &amp; Karriere</a>
-&nbsp;|&nbsp;
-<a class="q5-footer link" href="http://www.quelle.de/is-bin/INTERSHOP.enfinity/WFS/Quelle-quelle_de-Site/de_DE/-/EUR/Q_ViewStatic-ViewPage?ProductSKU=static2313&Linktype=AD">&Uuml;ber Quelle</a>
-&nbsp;|&nbsp;
-<a class="q5-footer link" href="http://www.quelle.de/versand/arcandor.html">Arcandor-Unternehmensgruppe</a>
-&nbsp;|&nbsp;
-<a class="q5-footer link" href="#" onclick="javascript:window.open('http://www.quelle.de/is-bin/INTERSHOP.enfinity/WFS/Quelle-quelle_de-Site/de_DE/-/EUR/Q_ViewStatic-ViewPage?ProductSKU=static2904&Linktype=AD','presse','status=1,scrollbars=1,toolbar=1,location=1,resizable=1,height=550,width=840')">Presse</a>
-&nbsp;|&nbsp;
-<a class="q5-footer link" href="http://www.quelle.de/is-bin/INTERSHOP.enfinity/WFS/Quelle-quelle_de-Site/de_DE/-/EUR/Q_ViewStatic-ViewPage?ProductSKU=static1512&Linktype=AD">Hilfe</a>
-&nbsp;|&nbsp;
-<a class="q5-footer link" href="http://www.quelle.de/is-bin/INTERSHOP.enfinity/WFS/Quelle-quelle_de-Site/de_DE/-/EUR/Q_ViewStatic-ViewPage?ProductSKU=static2731&Linktype=AD">Service & Beratung</a>
-&nbsp;|&nbsp;
-<a class="q5-footer link" href="http://www.quelle.de/is-bin/INTERSHOP.enfinity/WFS/Quelle-quelle_de-Site/de_DE/-/EUR/Q_ViewStatic-ViewPage?ProductSKU=static2488&Linktype=AD">Sicher einkaufen</a>
-</div>
-<div id="footer-inhalt-txt2" class="q5-footer">
-<a class="q5-footer link" href="http://www.quelle.de/Aktuelles/" style="text-decoration:none;">QUELLE GmbH 2008</a>
-</div>
-</div>
-</div>
-
-<div style="display: none;"><a href="http://www.quelle.de">Quelle Produktverzeichnis</a></div>
-<script type="text/javascript">
-<!--
-try {QTCMWPosition();}
-catch (e) {}
-//-->
-</script>
-
-<script type="text/javascript">
-<!--
-var b1 = document.body;
-try {
-if (b1)
-{
-var oldfunc = window.onload;
-if(typeof window.onload != 'function'){
-window.onload=function () {
-basic_onload();
-if(!storefront) {
-DSLCheckUp ();
-}
-}
-}else{
-window.onload = function() {
-//oldfunc();
-basic_onload();
-if(!storefront) {
-DSLCheckUp ();
-}
-}
-}
-}
-}
-catch (e) {}
-
-if (window.location.protocol == "https:") {
-document.write('<scr'+'ipt type="text/javascr'+'ipt" src="https://www.quelle.de/is-bin/INTERSHOP.enfinity/WFS/Quelle-quelle_de-Site/de_DE/-/EUR/Q_BrowseCatalog-StartRootCategories?NavigationBarReloaded="><\/scr'+'ipt>');
-} else {
-document.write('<scr'+'ipt type="text/javascr'+'ipt" src="http://www.quelle.de/is-bin/INTERSHOP.enfinity/WFS/Quelle-quelle_de-Site/de_DE/-/EUR/Q_BrowseCatalog-StartRootCategories?NavigationBarReloaded="><\/scr'+'ipt>');
-}
-
-//-->
-</script>
-<!-- QBuild: v11_30_48 20183 2008-05-06_123930 -->
-<!-- Template End: inc/q5_pg_footer_content.isml (sld_ch_quelle_app) -->
-
-
-
-
-
-
-
-
-
-
-<style type="text/css">
-<!--
-.q-private-normal-12px-darkblue-ul{position:relative;float:left;}
--->
-</style>
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-</div>
-<div class="q-history" style="width:745px;height:32px;overflow:hidden;">
-<table style="width:100%;"><tr style="height:32px;"><td style="vertical-align:middle; font-size:12px;">
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-<span class="q5-history"><b>Sie sind hier: &gt;</b></span>
-
-
-<!-- TemplateEnd -->
-
-
-
-</td></tr></table>
-</div>
-<div>
-
-
-</body>
-</html>

Deleted: trunk/dna-repository/src/test/resources/docs/html-utf16-leading-whitespace-wrong-extension.doc
===================================================================
(Binary files differ)

Deleted: trunk/dna-repository/src/test/resources/docs/icaltestdata/Todos1.ics
===================================================================
--- trunk/dna-repository/src/test/resources/docs/icaltestdata/Todos1.ics	2009-06-04 21:46:34 UTC (rev 976)
+++ trunk/dna-repository/src/test/resources/docs/icaltestdata/Todos1.ics	2009-06-04 22:31:30 UTC (rev 977)
@@ -1,63 +0,0 @@
-BEGIN:VCALENDAR
-VERSION:2.0
-X-WR-CALNAME:random...
-PRODID:-//Apple Computer\, Inc//iCal 1.5//EN
-X-WR-RELCALID:761181FD-5338-11D8-A876-000A958826AA
-X-WR-TIMEZONE:Europe/Rome
-CALSCALE:GREGORIAN
-METHOD:PUBLISH
-BEGIN:VTIMEZONE
-TZID:Europe/Lisbon
-LAST-MODIFIED:20040130T152457Z
-BEGIN:STANDARD
-DTSTART:20031026T010000
-TZOFFSETTO:+0000
-TZOFFSETFROM:+0000
-TZNAME:WET
-END:STANDARD
-BEGIN:DAYLIGHT
-DTSTART:20040328T010000
-TZOFFSETTO:+0100
-TZOFFSETFROM:+0000
-TZNAME:WEST
-END:DAYLIGHT
-END:VTIMEZONE
-BEGIN:VTIMEZONE
-TZID:Europe/Rome
-LAST-MODIFIED:20040130T152457Z
-BEGIN:STANDARD
-DTSTART:20031026T010000
-TZOFFSETTO:+0100
-TZOFFSETFROM:+0000
-TZNAME:CET
-END:STANDARD
-BEGIN:DAYLIGHT
-DTSTART:20040328T030000
-TZOFFSETTO:+0200
-TZOFFSETFROM:+0100
-TZNAME:CEST
-END:DAYLIGHT
-END:VTIMEZONE
-BEGIN:VTODO
-PRIORITY:2
-DTSTAMP:20031126T051950Z
-UID:76116BB6-5338-11D8-A876-000A958826AA
-SEQUENCE:1
-STATUS:COMPLETED
-DTSTART;TZID=Europe/Lisbon:20031103T193251
-SUMMARY:CSS for Accessibility stuff
-COMPLETED:20031125T130000Z
-END:VTODO
-BEGIN:VTODO
-PRIORITY:1
-DTSTAMP:20040130T152344Z
-UID:7611710A-5338-11D8-A876-000A958826AA
-SEQUENCE:3
-URL;VALUE=URI:http://www.w3.org/2004/01/ideas/
-STATUS:COMPLETED
-DTSTART;TZID=Europe/Rome:20031217T133610
-SUMMARY:project page
-COMPLETED:20040129T230000Z
-DUE:20031216T000000Z
-END:VTODO
-END:VCALENDAR

Deleted: trunk/dna-repository/src/test/resources/docs/icaltestdata/basicCalendar.ics
===================================================================
--- trunk/dna-repository/src/test/resources/docs/icaltestdata/basicCalendar.ics	2009-06-04 21:46:34 UTC (rev 976)
+++ trunk/dna-repository/src/test/resources/docs/icaltestdata/basicCalendar.ics	2009-06-04 22:31:30 UTC (rev 977)
@@ -1,6 +0,0 @@
-BEGIN:VCALENDAR
-CALSCALE:GREGORIAN
-PRODID:-//Apple Computer\, Inc//iCal 1.0//EN
-VERSION:2.0
-METHOD:PUBLISH
-END:VCALENDAR
\ No newline at end of file

Deleted: trunk/dna-repository/src/test/resources/docs/icaltestdata/cal01-1.ics
===================================================================
--- trunk/dna-repository/src/test/resources/docs/icaltestdata/cal01-1.ics	2009-06-04 21:46:34 UTC (rev 976)
+++ trunk/dna-repository/src/test/resources/docs/icaltestdata/cal01-1.ics	2009-06-04 22:31:30 UTC (rev 977)
@@ -1,79 +0,0 @@
-BEGIN:VCALENDAR
-CALSCALE:GREGORIAN
-PRODID:-//Ximian//NONSGML Evolution Calendar//EN
-VERSION:2.0
-BEGIN:VTIMEZONE
-TZID:/softwarestudio.org/Olson_20011030_5/America/New_York
-TZURL:http://timezones.r.us.net/tz/US-California-Los_Angeles
-BEGIN:STANDARD
-TZOFFSETFROM:-0400
-TZOFFSETTO:-0500
-TZNAME:EST
-DTSTART:19701025T020000
-RRULE:FREQ=YEARLY;INTERVAL=1;BYDAY=-1SU;BYMONTH=10
-END:STANDARD
-BEGIN:DAYLIGHT
-TZOFFSETFROM:-0500
-TZOFFSETTO:-0400
-TZNAME:EDT
-DTSTART:19700405T020000
-RRULE:FREQ=YEARLY;INTERVAL=1;BYDAY=1SU;BYMONTH=4
-END:DAYLIGHT
-END:VTIMEZONE
-BEGIN:VEVENT
-UID:20020630T230353Z-3895-69-1-0 at jammer
-DTSTAMP:20020630T230353Z
-DTSTART;TZID=/softwarestudio.org/Olson_20011030_5/America/New_York:
- 20020630T090000
-DTEND;TZID=/softwarestudio.org/Olson_20011030_5/America/New_York:
- 20020630T103000  
-TRANSP:OPAQUE
-SEQUENCE:2
-SUMMARY:Church
-CLASS:PRIVATE
-RRULE:FREQ=WEEKLY;INTERVAL=1;BYDAY=SU
-END:VEVENT
-BEGIN:VEVENT
-UID:20020630T230445Z-3895-69-1-7 at jammer
-DTSTAMP:20020630T230445Z
-DTSTART;VALUE=DATE:20020703
-DTEND;VALUE=DATE:20020706
-TRANSP:OPAQUE
-SEQUENCE:3
-SUMMARY:Scooby Conference Rules
-LOCATION:San Francisco
-CONTACT:Jim Dolittle\, ABC Industries\, +1-919-555-1234
-DESCRIPTION:can't wait!\n
-CATEGORIES:Miscellaneous
-CLASS:PUBLIC
-BEGIN:VALARM
-X-EVOLUTION-ALARM-UID:20020701T033628Z-3895-69-1-48 at jammer
-TRIGGER;RELATED=START:-PT30M
-ACTION:DISPLAY
-DESCRIPTION:Federal Reserve Board Meeting
-END:VALARM
-END:VEVENT
-BEGIN:VEVENT
-UID:20020630T230600Z-3895-69-1-16 at jammer
-DTSTAMP:20020630T230600Z
-DTSTART;TZID=/softwarestudio.org/Olson_20011030_5/America/New_York:
- 20020718T090000
-DTEND;TZID=/softwarestudio.org/Olson_20011030_5/America/New_York:
- 20020718T093000
-TRANSP:OPAQUE
-SEQUENCE:3
-SUMMARY:Federal Reserve Board Meeting
-CLASS:PUBLIC
-ORGANIZER;CN=Dan Connolly:MAILTO:connolly at w3.org
-ATTENDEE;CUTYPE=INDIVIDUAL;ROLE=REQ-PARTICIPANT;PARTSTAT=NEEDS-ACTION;
- RSVP=TRUE;LANGUAGE=en:MAILTO:hoopy at frood.example
-ATTENDEE;CUTYPE=INDIVIDUAL;ROLE=OPT-PARTICIPANT;PARTSTAT=NEEDS-ACTION;
- RSVP=TRUE;LANGUAGE=en:MAILTO:prefect at ford.example
-BEGIN:VALARM
-X-EVOLUTION-ALARM-UID:20020701T033628Z-3895-69-1-22 at jammer
-TRIGGER;VALUE=DURATION;RELATED=START:-PT15M
-ACTION:DISPLAY
-DESCRIPTION:Federal Reserve Board Meeting
-END:VALARM
-END:VEVENT
-END:VCALENDAR

Deleted: trunk/dna-repository/src/test/resources/docs/icaltestdata/cal01-2.ics
===================================================================
--- trunk/dna-repository/src/test/resources/docs/icaltestdata/cal01-2.ics	2009-06-04 21:46:34 UTC (rev 976)
+++ trunk/dna-repository/src/test/resources/docs/icaltestdata/cal01-2.ics	2009-06-04 22:31:30 UTC (rev 977)
@@ -1,79 +0,0 @@
-BEGIN:VCALENDAR
-CALSCALE:GREGORIAN
-PRODID:-//Ximian//NONSGML Evolution Calendar//EN
-VERSION:2.0
-BEGIN:VTIMEZONE
-TZID:/softwarestudio.org/Olson_20011030_5/America/New_York
-TZURL:http://timezones.r.us.net/tz/US-California-Los_Angeles2
-BEGIN:STANDARD
-TZOFFSETFROM:-0400
-TZOFFSETTO:-0500
-TZNAME:EST
-DTSTART:19701025T020000
-RRULE:FREQ=YEARLY;INTERVAL=1;BYDAY=-1SU;BYMONTH=10
-END:STANDARD
-BEGIN:DAYLIGHT
-TZOFFSETFROM:-0500
-TZOFFSETTO:-0400
-TZNAME:EDT
-DTSTART:19700405T020000
-RRULE:FREQ=YEARLY;INTERVAL=1;BYDAY=1SU;BYMONTH=4
-END:DAYLIGHT
-END:VTIMEZONE
-BEGIN:VEVENT
-UID:20020630T230353Z-3895-69-1-0 at jammer
-DTSTAMP:20020630T230353Z
-DTSTART;TZID=/softwarestudio.org/Olson_20011030_5/America/New_York:
- 20020630T090000
-DTEND;TZID=/softwarestudio.org/Olson_20011030_5/America/New_York:
- 20020630T103000  
-TRANSP:OPAQUE
-SEQUENCE:2
-SUMMARY:Church
-CLASS:PRIVATE
-RRULE:FREQ=WEEKLY;INTERVAL=1;BYDAY=SU
-END:VEVENT
-BEGIN:VEVENT
-UID:20020630T230445Z-3895-69-1-7 at jammer
-DTSTAMP:20020630T230445Z
-DTSTART;VALUE=DATE:20020703
-DTEND;VALUE=DATE:20020706
-TRANSP:OPAQUE
-SEQUENCE:2
-SUMMARY:Scooby Conference
-LOCATION:San Francisco
-CONTACT:Jim Dolittle\, ABC Industries\, +1-919-555-1234
-DESCRIPTION:can't wait!\n
-CATEGORIES:Miscellaneous
-CLASS:PUBLIC
-BEGIN:VALARM
-X-EVOLUTION-ALARM-UID:20020701T033628Z-3895-69-1-48 at jammer
-TRIGGER;RELATED=START:-PT30M
-ACTION:DISPLAY
-DESCRIPTION:Federal Reserve Board Meeting
-END:VALARM
-END:VEVENT
-BEGIN:VEVENT
-UID:20020630T230600Z-3895-69-1-16 at jammer
-DTSTAMP:20020630T230600Z
-DTSTART;TZID=/softwarestudio.org/Olson_20011030_5/America/New_York:
- 20020718T090000
-DTEND;TZID=/softwarestudio.org/Olson_20011030_5/America/New_York:
- 20020718T093000
-TRANSP:OPAQUE
-SEQUENCE:3
-SUMMARY:Federal Reserve Board Meeting
-CLASS:PUBLIC
-ORGANIZER;CN=Dan Connolly:MAILTO:connolly at w3.org
-ATTENDEE;CUTYPE=INDIVIDUAL;ROLE=REQ-PARTICIPANT;PARTSTAT=NEEDS-ACTION;
- RSVP=TRUE;LANGUAGE=en:MAILTO:hoopy at frood.example
-ATTENDEE;CUTYPE=INDIVIDUAL;ROLE=OPT-PARTICIPANT;PARTSTAT=NEEDS-ACTION;
- RSVP=TRUE;LANGUAGE=en:MAILTO:prefect at ford.example
-BEGIN:VALARM
-X-EVOLUTION-ALARM-UID:20020701T033628Z-3895-69-1-22 at jammer
-TRIGGER;VALUE=DURATION;RELATED=START:-PT15M
-ACTION:DISPLAY
-DESCRIPTION:Federal Reserve Board Meeting
-END:VALARM
-END:VEVENT
-END:VCALENDAR

Deleted: trunk/dna-repository/src/test/resources/docs/icaltestdata/cal01-3.ics
===================================================================
--- trunk/dna-repository/src/test/resources/docs/icaltestdata/cal01-3.ics	2009-06-04 21:46:34 UTC (rev 976)
+++ trunk/dna-repository/src/test/resources/docs/icaltestdata/cal01-3.ics	2009-06-04 22:31:30 UTC (rev 977)
@@ -1,102 +0,0 @@
-BEGIN:VCALENDAR
-CALSCALE:GREGORIAN
-PRODID:-//Ximian//NONSGML Evolution Calendar//EN
-VERSION:2.0
-BEGIN:VTIMEZONE
-TZID:/softwarestudio.org/Olson_20011030_5/America/New_York
-TZURL:http://timezones.r.us.net/tz/US-California-Los_Angeles
-BEGIN:STANDARD
-TZOFFSETFROM:-0400
-TZOFFSETTO:-0500
-TZNAME:EST
-DTSTART:19701025T020000
-RRULE:FREQ=YEARLY;INTERVAL=1;BYDAY=-1SU;BYMONTH=10
-END:STANDARD
-BEGIN:DAYLIGHT
-TZOFFSETFROM:-0500
-TZOFFSETTO:-0400
-TZNAME:EDT
-DTSTART:19700405T020000
-RRULE:FREQ=YEARLY;INTERVAL=1;BYDAY=1SU;BYMONTH=4
-END:DAYLIGHT
-END:VTIMEZONE
-BEGIN:VEVENT
-UID:20020630T230353Z-3895-69-1-0 at jammer
-DTSTAMP:20020630T230353Z
-DTSTART;TZID=/softwarestudio.org/Olson_20011030_5/America/New_York:
- 20020630T090000
-DTEND;TZID=/softwarestudio.org/Olson_20011030_5/America/New_York:
- 20020630T103000  
-TRANSP:OPAQUE
-SEQUENCE:2
-SUMMARY:Church
-CLASS:PRIVATE
-RRULE:FREQ=WEEKLY;INTERVAL=1;BYDAY=SU
-END:VEVENT
-BEGIN:VEVENT
-UID:20020630T230445Z-3895-69-1-7 at jammer
-DTSTAMP:20020630T230445Z
-DTSTART;VALUE=DATE:20020703
-DTEND;VALUE=DATE:20020706
-TRANSP:OPAQUE
-SEQUENCE:2
-SUMMARY:Scooby Conference
-LOCATION:San Francisco
-CONTACT:Jim Dolittle\, ABC Industries\, +1-919-555-1234
-DESCRIPTION:can't wait!\n
-CATEGORIES:Miscellaneous
-CLASS:PUBLIC
-BEGIN:VALARM
-X-EVOLUTION-ALARM-UID:20020701T033628Z-3895-69-1-48 at jammer
-TRIGGER;RELATED=START:-PT30M
-ACTION:DISPLAY
-DESCRIPTION:Federal Reserve Board Meeting
-END:VALARM
-END:VEVENT
-BEGIN:VEVENT
-UID:20020630T230600Z-3895-69-1-16 at jammer
-DTSTAMP:20020630T230600Z
-DTSTART;TZID=/softwarestudio.org/Olson_20011030_5/America/New_York:
- 20020718T090000
-DTEND;TZID=/softwarestudio.org/Olson_20011030_5/America/New_York:
- 20020718T093000
-TRANSP:OPAQUE
-SEQUENCE:3
-SUMMARY:Federal Reserve Board Meeting
-CLASS:PUBLIC
-ORGANIZER;CN=Dan Connolly:MAILTO:connolly at w3.org
-ATTENDEE;CUTYPE=INDIVIDUAL;ROLE=REQ-PARTICIPANT;PARTSTAT=NEEDS-ACTION;
- RSVP=TRUE;LANGUAGE=en:MAILTO:hoopy at frood.example
-ATTENDEE;CUTYPE=INDIVIDUAL;ROLE=OPT-PARTICIPANT;PARTSTAT=NEEDS-ACTION;
- RSVP=TRUE;LANGUAGE=en:MAILTO:prefect at ford.example
-BEGIN:VALARM
-X-EVOLUTION-ALARM-UID:20020701T033628Z-3895-69-1-22 at jammer
-TRIGGER;VALUE=DURATION;RELATED=START:-PT15M
-ACTION:DISPLAY
-DESCRIPTION:Federal Reserve Board Meeting
-END:VALARM
-END:VEVENT
-BEGIN:VEVENT
-UID:20020630T230600Z-3895-69-1-2343 at jammer
-DTSTAMP:20060630T230600Z
-DTSTART;TZID=/softwarestudio.org/Olson_20011030_5/America/New_York:
- 20060718T090000
-DTEND;TZID=/softwarestudio.org/Olson_20011030_5/America/New_York:
- 20060718T093000
-TRANSP:OPAQUE
-SEQUENCE:0
-SUMMARY:This is a typical summary of an event
-CLASS:PUBLIC
-ORGANIZER;CN=Dan Connolly:MAILTO:connolly at w3.org
-ATTENDEE;CUTYPE=INDIVIDUAL;ROLE=REQ-PARTICIPANT;PARTSTAT=NEEDS-ACTION;
- RSVP=TRUE;LANGUAGE=en:MAILTO:hoopy at frood.example
-ATTENDEE;CUTYPE=INDIVIDUAL;ROLE=OPT-PARTICIPANT;PARTSTAT=NEEDS-ACTION;
- RSVP=TRUE;LANGUAGE=en:MAILTO:prefect at ford.example
-BEGIN:VALARM
-X-EVOLUTION-ALARM-UID:20020701T033628Z-3895-69-1-343 at jammer
-TRIGGER;VALUE=DURATION;RELATED=START:-PT30M
-ACTION:DISPLAY
-DESCRIPTION:This is a typical alarm
-END:VALARM
-END:VEVENT
-END:VCALENDAR

Deleted: trunk/dna-repository/src/test/resources/docs/icaltestdata/cal01-4.ics
===================================================================
--- trunk/dna-repository/src/test/resources/docs/icaltestdata/cal01-4.ics	2009-06-04 21:46:34 UTC (rev 976)
+++ trunk/dna-repository/src/test/resources/docs/icaltestdata/cal01-4.ics	2009-06-04 22:31:30 UTC (rev 977)
@@ -1,56 +0,0 @@
-BEGIN:VCALENDAR
-CALSCALE:GREGORIAN
-PRODID:-//Ximian//NONSGML Evolution Calendar//EN
-VERSION:2.0
-BEGIN:VTIMEZONE
-TZID:/softwarestudio.org/Olson_20011030_5/America/New_York
-TZURL:http://timezones.r.us.net/tz/US-California-Los_Angeles
-BEGIN:STANDARD
-TZOFFSETFROM:-0400
-TZOFFSETTO:-0500
-TZNAME:EST
-DTSTART:19701025T020000
-RRULE:FREQ=YEARLY;INTERVAL=1;BYDAY=-1SU;BYMONTH=10
-END:STANDARD
-BEGIN:DAYLIGHT
-TZOFFSETFROM:-0500
-TZOFFSETTO:-0400
-TZNAME:EDT
-DTSTART:19700405T020000
-RRULE:FREQ=YEARLY;INTERVAL=1;BYDAY=1SU;BYMONTH=4
-END:DAYLIGHT
-END:VTIMEZONE
-BEGIN:VEVENT
-UID:20020630T230353Z-3895-69-1-0 at jammer
-DTSTAMP:20020630T230353Z
-DTSTART;TZID=/softwarestudio.org/Olson_20011030_5/America/New_York:
- 20020630T090000
-DTEND;TZID=/softwarestudio.org/Olson_20011030_5/America/New_York:
- 20020630T103000  
-TRANSP:OPAQUE
-SEQUENCE:2
-SUMMARY:Church
-CLASS:PRIVATE
-RRULE:FREQ=WEEKLY;INTERVAL=1;BYDAY=SU
-END:VEVENT
-BEGIN:VEVENT
-UID:20020630T230445Z-3895-69-1-7 at jammer
-DTSTAMP:20020630T230445Z
-DTSTART;VALUE=DATE:20020703
-DTEND;VALUE=DATE:20020706
-TRANSP:OPAQUE
-SEQUENCE:2
-SUMMARY:Scooby Conference
-LOCATION:San Francisco
-CONTACT:Jim Dolittle\, ABC Industries\, +1-919-555-1234
-DESCRIPTION:can't wait!\n
-CATEGORIES:Miscellaneous
-CLASS:PUBLIC
-BEGIN:VALARM
-X-EVOLUTION-ALARM-UID:20020701T033628Z-3895-69-1-48 at jammer
-TRIGGER;RELATED=START:-PT30M
-ACTION:DISPLAY
-DESCRIPTION:Federal Reserve Board Meeting
-END:VALARM
-END:VEVENT
-END:VCALENDAR

Deleted: trunk/dna-repository/src/test/resources/docs/icaltestdata/cal01-5.ics
===================================================================
--- trunk/dna-repository/src/test/resources/docs/icaltestdata/cal01-5.ics	2009-06-04 21:46:34 UTC (rev 976)
+++ trunk/dna-repository/src/test/resources/docs/icaltestdata/cal01-5.ics	2009-06-04 22:31:30 UTC (rev 977)
@@ -1,79 +0,0 @@
-BEGIN:VCALENDAR
-CALSCALE:GREGORIAN
-PRODID:-//Ximian//NONSGML Evolution Calendar//EN
-VERSION:2.0
-BEGIN:VTIMEZONE
-TZID:/softwarestudio.org/Olson_20011030_5/America/New_York
-TZURL:http://timezones.r.us.net/tz/US-California-Los_Angeles
-BEGIN:STANDARD
-TZOFFSETFROM:-0400
-TZOFFSETTO:-0500
-TZNAME:EST
-DTSTART:19701025T020000
-RRULE:FREQ=YEARLY;INTERVAL=1;BYDAY=-1SU;BYMONTH=11
-END:STANDARD
-BEGIN:DAYLIGHT
-TZOFFSETFROM:-0500
-TZOFFSETTO:-0400
-TZNAME:EDT
-DTSTART:19700405T020000
-RRULE:FREQ=YEARLY;INTERVAL=1;BYDAY=1SU;BYMONTH=4
-END:DAYLIGHT
-END:VTIMEZONE
-BEGIN:VEVENT
-UID:20020630T230353Z-3895-69-1-0 at jammer
-DTSTAMP:20020630T230353Z
-DTSTART;TZID=/softwarestudio.org/Olson_20011030_5/America/New_York:
- 20020630T090000
-DTEND;TZID=/softwarestudio.org/Olson_20011030_5/America/New_York:
- 20020630T103000  
-TRANSP:OPAQUE
-SEQUENCE:2
-SUMMARY:Church
-CLASS:PRIVATE
-RRULE:FREQ=WEEKLY;INTERVAL=1;BYDAY=SU
-END:VEVENT
-BEGIN:VEVENT
-UID:20020630T230445Z-3895-69-1-7 at jammer
-DTSTAMP:20020630T230445Z
-DTSTART;VALUE=DATE:20020703
-DTEND;VALUE=DATE:20020706
-TRANSP:OPAQUE
-SEQUENCE:2
-SUMMARY:Scooby Conference
-LOCATION:San Francisco
-CONTACT:Jim Dolittle\, ABC Industries\, +1-919-555-1234
-DESCRIPTION:can't wait!\n
-CATEGORIES:Miscellaneous
-CLASS:PUBLIC
-BEGIN:VALARM
-X-EVOLUTION-ALARM-UID:20020701T033628Z-3895-69-1-48 at jammer
-TRIGGER;RELATED=START:-PT30M
-ACTION:DISPLAY
-DESCRIPTION:Federal Reserve Board Meeting
-END:VALARM
-END:VEVENT
-BEGIN:VEVENT
-UID:20020630T230600Z-3895-69-1-16 at jammer
-DTSTAMP:20020630T230600Z
-DTSTART;TZID=/softwarestudio.org/Olson_20011030_5/America/New_York:
- 20020718T090000
-DTEND;TZID=/softwarestudio.org/Olson_20011030_5/America/New_York:
- 20020718T093000
-TRANSP:OPAQUE
-SEQUENCE:3
-SUMMARY:Federal Reserve Board Meeting
-CLASS:PUBLIC
-ORGANIZER;CN=Dan Connolly:MAILTO:connolly at w3.org
-ATTENDEE;CUTYPE=INDIVIDUAL;ROLE=REQ-PARTICIPANT;PARTSTAT=NEEDS-ACTION;
- RSVP=TRUE;LANGUAGE=en:MAILTO:hoopy at frood.example
-ATTENDEE;CUTYPE=INDIVIDUAL;ROLE=OPT-PARTICIPANT;PARTSTAT=NEEDS-ACTION;
- RSVP=TRUE;LANGUAGE=en:MAILTO:prefect at ford.example
-BEGIN:VALARM
-X-EVOLUTION-ALARM-UID:20020701T033628Z-3895-69-1-22 at jammer
-TRIGGER;VALUE=DURATION;RELATED=START:-PT15M
-ACTION:DISPLAY
-DESCRIPTION:Federal Reserve Board Meeting
-END:VALARM
-END:VEVENT
-END:VCALENDAR

Deleted: trunk/dna-repository/src/test/resources/docs/icaltestdata/cal01-6.ics
===================================================================
--- trunk/dna-repository/src/test/resources/docs/icaltestdata/cal01-6.ics	2009-06-04 21:46:34 UTC (rev 976)
+++ trunk/dna-repository/src/test/resources/docs/icaltestdata/cal01-6.ics	2009-06-04 22:31:30 UTC (rev 977)
@@ -1,79 +0,0 @@
-BEGIN:VCALENDAR
-CALSCALE:GREGORIAN
-PRODID:-//Ximian//NONSGML Evolution Calendar//EN
-VERSION:2.0
-BEGIN:VTIMEZONE
-TZID:/softwarestudio.org/Olson_20011030_5/America/New_York
-TZURL:http://timezones.r.us.net/tz/US-California-Los_Angeles
-BEGIN:STANDARD
-TZOFFSETFROM:-0400
-TZOFFSETTO:-0500
-TZNAME:EST
-DTSTART:19701025T020000
-RRULE:FREQ=YEARLY;INTERVAL=1;BYDAY=-1SU;BYMONTH=10
-END:STANDARD
-BEGIN:DAYLIGHT
-TZOFFSETFROM:-0500
-TZOFFSETTO:-0400
-TZNAME:EDT
-DTSTART:19700405T020000
-RRULE:FREQ=YEARLY;INTERVAL=1;BYDAY=1SU;BYMONTH=4
-END:DAYLIGHT
-END:VTIMEZONE
-BEGIN:VEVENT
-UID:20020630T230353Z-3895-69-1-0 at jammer
-DTSTAMP:20020630T230353Z
-DTSTART;TZID=/softwarestudio.org/Olson_20011030_5/America/New_York:
- 20020630T100000
-DTEND;TZID=/softwarestudio.org/Olson_20011030_5/America/New_York:
- 20020630T103000  
-TRANSP:OPAQUE
-SEQUENCE:2
-SUMMARY:Church
-CLASS:PRIVATE
-RRULE:FREQ=WEEKLY;INTERVAL=1;BYDAY=SU
-END:VEVENT
-BEGIN:VEVENT
-UID:20020630T230445Z-3895-69-1-7 at jammer
-DTSTAMP:20020630T230445Z
-DTSTART;VALUE=DATE:20020703
-DTEND;VALUE=DATE:20020706
-TRANSP:OPAQUE
-SEQUENCE:2
-SUMMARY:Scooby Conference
-LOCATION:San Francisco
-CONTACT:Jim Dolittle\, ABC Industries\, +1-919-555-1234
-DESCRIPTION:can't wait!\n
-CATEGORIES:Miscellaneous
-CLASS:PUBLIC
-BEGIN:VALARM
-X-EVOLUTION-ALARM-UID:20020701T033628Z-3895-69-1-48 at jammer
-TRIGGER;RELATED=START:-PT30M
-ACTION:DISPLAY
-DESCRIPTION:Federal Reserve Board Meeting
-END:VALARM
-END:VEVENT
-BEGIN:VEVENT
-UID:20020630T230600Z-3895-69-1-16 at jammer
-DTSTAMP:20020630T230600Z
-DTSTART;TZID=/softwarestudio.org/Olson_20011030_5/America/New_York:
- 20020718T090000
-DTEND;TZID=/softwarestudio.org/Olson_20011030_5/America/New_York:
- 20020718T093000
-TRANSP:OPAQUE
-SEQUENCE:3
-SUMMARY:Federal Reserve Board Meeting
-CLASS:PUBLIC
-ORGANIZER;CN=Dan Connolly:MAILTO:connolly at w3.org
-ATTENDEE;CUTYPE=INDIVIDUAL;ROLE=REQ-PARTICIPANT;PARTSTAT=NEEDS-ACTION;
- RSVP=TRUE;LANGUAGE=en:MAILTO:hoopy at frood.example
-ATTENDEE;CUTYPE=INDIVIDUAL;ROLE=OPT-PARTICIPANT;PARTSTAT=NEEDS-ACTION;
- RSVP=TRUE;LANGUAGE=en:MAILTO:prefect at ford.example
-BEGIN:VALARM
-X-EVOLUTION-ALARM-UID:20020701T033628Z-3895-69-1-22 at jammer
-TRIGGER;VALUE=DURATION;RELATED=START:-PT15M
-ACTION:DISPLAY
-DESCRIPTION:Federal Reserve Board Meeting
-END:VALARM
-END:VEVENT
-END:VCALENDAR

Deleted: trunk/dna-repository/src/test/resources/docs/icaltestdata/cal01-exrule.ics
===================================================================
--- trunk/dna-repository/src/test/resources/docs/icaltestdata/cal01-exrule.ics	2009-06-04 21:46:34 UTC (rev 976)
+++ trunk/dna-repository/src/test/resources/docs/icaltestdata/cal01-exrule.ics	2009-06-04 22:31:30 UTC (rev 977)
@@ -1,80 +0,0 @@
-BEGIN:VCALENDAR
-CALSCALE:GREGORIAN
-PRODID:-//Ximian//NONSGML Evolution Calendar//EN
-VERSION:2.0
-BEGIN:VTIMEZONE
-TZID:/softwarestudio.org/Olson_20011030_5/America/New_York
-X-LIC-LOCATION:America/New_York
-BEGIN:STANDARD
-TZOFFSETFROM:-0400
-TZOFFSETTO:-0500
-TZNAME:EST
-DTSTART:19701025T020000
-RRULE:FREQ=YEARLY;INTERVAL=1;BYDAY=-1SU;BYMONTH=10
-END:STANDARD
-BEGIN:DAYLIGHT
-TZOFFSETFROM:-0500
-TZOFFSETTO:-0400
-TZNAME:EDT
-DTSTART:19700405T020000
-RRULE:FREQ=YEARLY;INTERVAL=1;BYDAY=1SU;BYMONTH=4
-END:DAYLIGHT
-END:VTIMEZONE
-BEGIN:VEVENT
-UID:20020630T230353Z-3895-69-1-0 at jammer
-DTSTAMP:20020630T230353Z
-DTSTART;TZID=/softwarestudio.org/Olson_20011030_5/America/New_York:
- 20020630T090000
-DTEND;TZID=/softwarestudio.org/Olson_20011030_5/America/New_York:
- 20020630T103000  
-TRANSP:OPAQUE
-SEQUENCE:2
-SUMMARY:Church
-CLASS:PRIVATE
-RRULE:FREQ=WEEKLY;INTERVAL=1;BYDAY=SU
-EXRULE:FREQ=WEEKLY;INTERVAL=5;BYDAY=SU
-END:VEVENT
-BEGIN:VEVENT
-UID:20020630T230445Z-3895-69-1-7 at jammer
-DTSTAMP:20020630T230445Z
-DTSTART;VALUE=DATE:20020703
-DTEND;VALUE=DATE:20020706
-TRANSP:OPAQUE
-SEQUENCE:2
-SUMMARY:Scooby Conference
-LOCATION:San Francisco
-CONTACT:Jim Dolittle\, ABC Industries\, +1-919-555-1234
-DESCRIPTION:can't wait!\n
-CATEGORIES:Miscellaneous
-CLASS:PUBLIC
-BEGIN:VALARM
-X-EVOLUTION-ALARM-UID:20020701T033628Z-3895-69-1-48 at jammer
-TRIGGER;RELATED=START:-PT30M
-ACTION:DISPLAY
-DESCRIPTION:Federal Reserve Board Meeting
-END:VALARM
-END:VEVENT
-BEGIN:VEVENT
-UID:20020630T230600Z-3895-69-1-16 at jammer
-DTSTAMP:20020630T230600Z
-DTSTART;TZID=/softwarestudio.org/Olson_20011030_5/America/New_York:
- 20020718T090000
-DTEND;TZID=/softwarestudio.org/Olson_20011030_5/America/New_York:
- 20020718T093000
-TRANSP:OPAQUE
-SEQUENCE:3
-SUMMARY:Federal Reserve Board Meeting
-CLASS:PUBLIC
-ORGANIZER;CN=Dan Connolly:MAILTO:connolly at w3.org
-ATTENDEE;CUTYPE=INDIVIDUAL;ROLE=REQ-PARTICIPANT;PARTSTAT=NEEDS-ACTION;
- RSVP=TRUE;LANGUAGE=en:MAILTO:hoopy at frood.example
-ATTENDEE;CUTYPE=INDIVIDUAL;ROLE=OPT-PARTICIPANT;PARTSTAT=NEEDS-ACTION;
- RSVP=TRUE;LANGUAGE=en:MAILTO:prefect at ford.example
-BEGIN:VALARM
-X-EVOLUTION-ALARM-UID:20020701T033628Z-3895-69-1-22 at jammer
-TRIGGER;VALUE=DURATION;RELATED=START:-PT15M
-ACTION:DISPLAY
-DESCRIPTION:Federal Reserve Board Meeting
-END:VALARM
-END:VEVENT
-END:VCALENDAR

Deleted: trunk/dna-repository/src/test/resources/docs/icaltestdata/cal01.ics
===================================================================
--- trunk/dna-repository/src/test/resources/docs/icaltestdata/cal01.ics	2009-06-04 21:46:34 UTC (rev 976)
+++ trunk/dna-repository/src/test/resources/docs/icaltestdata/cal01.ics	2009-06-04 22:31:30 UTC (rev 977)
@@ -1,79 +0,0 @@
-BEGIN:VCALENDAR
-CALSCALE:GREGORIAN
-PRODID:-//Ximian//NONSGML Evolution Calendar//EN
-VERSION:2.0
-BEGIN:VTIMEZONE
-TZID:/softwarestudio.org/Olson_20011030_5/America/New_York
-TZURL:http://timezones.r.us.net/tz/US-California-Los_Angeles
-BEGIN:STANDARD
-TZOFFSETFROM:-0400
-TZOFFSETTO:-0500
-TZNAME:EST
-DTSTART:19701025T020000
-RRULE:FREQ=YEARLY;INTERVAL=1;BYDAY=-1SU;BYMONTH=10
-END:STANDARD
-BEGIN:DAYLIGHT
-TZOFFSETFROM:-0500
-TZOFFSETTO:-0400
-TZNAME:EDT
-DTSTART:19700405T020000
-RRULE:FREQ=YEARLY;INTERVAL=1;BYDAY=1SU;BYMONTH=4
-END:DAYLIGHT
-END:VTIMEZONE
-BEGIN:VEVENT
-UID:20020630T230353Z-3895-69-1-0 at jammer
-DTSTAMP:20020630T230353Z
-DTSTART;TZID=/softwarestudio.org/Olson_20011030_5/America/New_York:
- 20020630T090000
-DTEND;TZID=/softwarestudio.org/Olson_20011030_5/America/New_York:
- 20020630T103000  
-TRANSP:OPAQUE
-SEQUENCE:2
-SUMMARY:Church
-CLASS:PRIVATE
-RRULE:FREQ=WEEKLY;INTERVAL=1;BYDAY=SU
-END:VEVENT
-BEGIN:VEVENT
-UID:20020630T230445Z-3895-69-1-7 at jammer
-DTSTAMP:20020630T230445Z
-DTSTART;VALUE=DATE:20020703
-DTEND;VALUE=DATE:20020706
-TRANSP:OPAQUE
-SEQUENCE:2
-SUMMARY:Scooby Conference
-LOCATION:San Francisco
-CONTACT:Jim Dolittle\, ABC Industries\, +1-919-555-1234
-DESCRIPTION:can't wait!\n
-CATEGORIES:Miscellaneous
-CLASS:PUBLIC
-BEGIN:VALARM
-X-EVOLUTION-ALARM-UID:20020701T033628Z-3895-69-1-48 at jammer
-TRIGGER;RELATED=START:-PT30M
-ACTION:DISPLAY
-DESCRIPTION:Federal Reserve Board Meeting
-END:VALARM
-END:VEVENT
-BEGIN:VEVENT
-UID:20020630T230600Z-3895-69-1-16 at jammer
-DTSTAMP:20020630T230600Z
-DTSTART;TZID=/softwarestudio.org/Olson_20011030_5/America/New_York:
- 20020718T090000
-DTEND;TZID=/softwarestudio.org/Olson_20011030_5/America/New_York:
- 20020718T093000
-TRANSP:OPAQUE
-SEQUENCE:3
-SUMMARY:Federal Reserve Board Meeting
-CLASS:PUBLIC
-ORGANIZER;CN=Dan Connolly:MAILTO:connolly at w3.org
-ATTENDEE;CUTYPE=INDIVIDUAL;ROLE=REQ-PARTICIPANT;PARTSTAT=NEEDS-ACTION;
- RSVP=TRUE;LANGUAGE=en:MAILTO:hoopy at frood.example
-ATTENDEE;CUTYPE=INDIVIDUAL;ROLE=OPT-PARTICIPANT;PARTSTAT=NEEDS-ACTION;
- RSVP=TRUE;LANGUAGE=en:MAILTO:prefect at ford.example
-BEGIN:VALARM
-X-EVOLUTION-ALARM-UID:20020701T033628Z-3895-69-1-22 at jammer
-TRIGGER;VALUE=DURATION;RELATED=START:-PT15M
-ACTION:DISPLAY
-DESCRIPTION:Federal Reserve Board Meeting
-END:VALARM
-END:VEVENT
-END:VCALENDAR

Deleted: trunk/dna-repository/src/test/resources/docs/icaltestdata/calconnect7.ics
===================================================================
--- trunk/dna-repository/src/test/resources/docs/icaltestdata/calconnect7.ics	2009-06-04 21:46:34 UTC (rev 976)
+++ trunk/dna-repository/src/test/resources/docs/icaltestdata/calconnect7.ics	2009-06-04 22:31:30 UTC (rev 977)
@@ -1,44 +0,0 @@
-BEGIN:VCALENDAR
-X-LOTUS-CHARSET:UTF-8
-VERSION:2.0
-PRODID:-//Lotus Development Corporation//NONSGML Notes 6.0//EN
-METHOD:REQUEST
-BEGIN:VTIMEZONE
-TZID:Eastern
-BEGIN:STANDARD
-DTSTART:19501029T020000
-TZOFFSETFROM:-0400
-TZOFFSETTO:-0500
-RRULE:FREQ=YEARLY;BYMINUTE=0;BYHOUR=2;BYDAY=-1SU;BYMONTH=10
-END:STANDARD
-BEGIN:DAYLIGHT
-DTSTART:19500402T020000
-TZOFFSETFROM:-0500
-TZOFFSETTO:-0400
-RRULE:FREQ=YEARLY;BYMINUTE=0;BYHOUR=2;BYDAY=1SU;BYMONTH=4
-END:DAYLIGHT
-END:VTIMEZONE
-BEGIN:VEVENT
-DTSTART;TZID=Eastern:20050428T110000
-DTEND;TZID=Eastern:20050428T120000
-TRANSP:OPAQUE
-RDATE;TZID=Eastern;VALUE=PERIOD:20050428T110000/20050428T120000
-RECURRENCE-ID:20050428T130000Z
-RELATED-TO:<jsmith.part7.19960817T083000.xyzMail at host3.com>
-DTSTAMP:20050406T205055Z
-COMMENT;ALTREP="CID:<FFFF__=0ABBE548DFE1F4C08f9e8a93d at coffeebean.com>":A
- nother single instance reschedule - time only (+2 hrs)
-SEQUENCE:1
-ATTENDEE;ROLE=CHAIR;PARTSTAT=ACCEPTED;CN="iCal Chair/CoffeeBean"
- ;RSVP=FALSE:mailto:iCalChair at coffeebean.com
-ATTENDEE;ROLE=REQ-PARTICIPANT;PARTSTAT=NEEDS-ACTION
- ;CN="iCal Participant/CoffeeBean";RSVP=TRUE
- :mailto:iCalParticipant at coffeebean.com
-CLASS:PUBLIC
-DESCRIPTION;ALTREP="CID:<FFFE__=0ABBE548DFE1F4C08f9e8a93d at coffeebean.com>":b
- ody
-SUMMARY:More complicated stream (5 day recurring)
-ORGANIZER;CN="iCal Chair/CoffeeBean":mailto:iCalChair at coffeebean.com
-UID:6BA1ECA4D58B306C85256FDB0071B664-Lotus_Notes_Generated
-END:VEVENT
-END:VCALENDAR

Deleted: trunk/dna-repository/src/test/resources/docs/icaltestdata/calconnect9.ics
===================================================================
--- trunk/dna-repository/src/test/resources/docs/icaltestdata/calconnect9.ics	2009-06-04 21:46:34 UTC (rev 976)
+++ trunk/dna-repository/src/test/resources/docs/icaltestdata/calconnect9.ics	2009-06-04 22:31:30 UTC (rev 977)
@@ -1,44 +0,0 @@
-BEGIN:VCALENDAR
-X-LOTUS-CHARSET:UTF-8
-VERSION:2.0
-PRODID:-//Lotus Development Corporation//NONSGML Notes 6.0//EN
-METHOD:REQUEST
-BEGIN:VTIMEZONE
-TZID:Eastern
-BEGIN:STANDARD
-DTSTART:19501029T020000
-TZOFFSETFROM:-0400
-TZOFFSETTO:-0500
-RRULE:FREQ=YEARLY;BYMINUTE=0;BYHOUR=2;BYDAY=-1SU;BYMONTH=10
-END:STANDARD
-BEGIN:DAYLIGHT
-DTSTART:19500402T020000
-TZOFFSETFROM:-0500
-TZOFFSETTO:-0400
-RRULE:FREQ=YEARLY;BYMINUTE=0;BYHOUR=2;BYDAY=1SU;BYMONTH=4
-END:DAYLIGHT
-END:VTIMEZONE
-BEGIN:VEVENT
-DTSTART;TZID=Eastern:20050425T090000
-DTEND;TZID=Eastern:20050425T091500
-TRANSP:OPAQUE
-RDATE;TZID=Eastern;VALUE=PERIOD:20050425T090000/20050425T091500
- ,20050426T090000/20050426T091500,20050427T090000/20050427T091500
- ,20050428T090000/20050428T091500,20050429T090000/20050429T091500
-DTSTAMP:20050406T205429Z
-COMMENT;ALTREP="CID:<0ABBE548DFE147488f9e8a93d at coffeebean.com>":S
- et the Start and End Time to be implicit - 9 to 9:15am
-SEQUENCE:3
-ATTENDEE;ROLE=CHAIR;PARTSTAT=ACCEPTED;CN="iCal Chair/CoffeeBean"
- ;RSVP=FALSE:mailto:iCalChair at coffeebean.com
-ATTENDEE;ROLE=REQ-PARTICIPANT;PARTSTAT=NEEDS-ACTION
- ;CN="iCal Participant/CoffeeBean";RSVP=TRUE
- :mailto:iCalParticipant at coffeebean.com
-CLASS:PUBLIC
-DESCRIPTION;ALTREP="CID:<0ABBE548DFE147488f9e8a93d at coffeebean.com>":b
- ody
-SUMMARY:More complicated stream (5 day recurring)
-ORGANIZER;CN="iCal Chair/CoffeeBean":mailto:iCalChair at coffeebean.com
-UID:6BA1ECA4D58B306C85256FDB0071B664-Lotus_Notes_Generated
-END:VEVENT
-END:VCALENDAR

Deleted: trunk/dna-repository/src/test/resources/docs/icaltestdata/combined_multiplevcalendar.ics
===================================================================
--- trunk/dna-repository/src/test/resources/docs/icaltestdata/combined_multiplevcalendar.ics	2009-06-04 21:46:34 UTC (rev 976)
+++ trunk/dna-repository/src/test/resources/docs/icaltestdata/combined_multiplevcalendar.ics	2009-06-04 22:31:30 UTC (rev 977)
@@ -1,155 +0,0 @@
-BEGIN:VCALENDAR
-PRODID:-//Microsoft Corporation//Outlook 11.0 MIMEDIR//EN
-VERSION:2.0
-METHOD:PUBLISH
-BEGIN:VEVENT
-ORGANIZER:MAILTO:mbrunzel at gmx.de
-DTSTART;VALUE=DATE:20080325
-DTEND;VALUE=DATE:20080328
-LOCATION:Belfast\, Northern Ireland
-TRANSP:TRANSPARENT
-SEQUENCE:0
-UID:040000008200E00074C5B7101A82E00800000000B020A967E159C8010000000000000000100
- 000001F009082EE836A4D9E9F85D0FD610DDC
-DTSTAMP:20080120T153743Z
-SUMMARY:Belfast CID Meeting
-PRIORITY:5
-X-MICROSOFT-CDO-IMPORTANCE:1
-CLASS:PUBLIC
-END:VEVENT
-END:VCALENDAR
-BEGIN:VCALENDAR
-PRODID:-//Microsoft Corporation//Outlook 11.0 MIMEDIR//EN
-VERSION:2.0
-METHOD:PUBLISH
-BEGIN:VEVENT
-ORGANIZER:MAILTO:mbrunzel at gmx.de
-DTSTART:20080324T173000Z
-DTEND:20080324T214000Z
-LOCATION:Frankfurt Airport
-TRANSP:OPAQUE
-SEQUENCE:0
-UID:040000008200E00074C5B7101A82E0080000000040BE0B4CE559C8010000000000000000100
- 000000BAFD137BB92CE4DB8E4425C5E7FF4AD
-DTSTAMP:20080120T153756Z
-SUMMARY:Flight from Frankfurt to Belfast
-PRIORITY:5
-X-MICROSOFT-CDO-IMPORTANCE:1
-CLASS:PUBLIC
-END:VEVENT
-END:VCALENDAR
-BEGIN:VCALENDAR
-PRODID:-//Microsoft Corporation//Outlook 11.0 MIMEDIR//EN
-VERSION:2.0
-METHOD:PUBLISH
-BEGIN:VEVENT
-DTSTART:20080328T130000Z
-DTEND:20080328T140000Z
-TRANSP:OPAQUE
-SEQUENCE:0
-UID:040000008200E00074C5B7101A82E00800000000D056B58DE267C7010000000000000000100
- 00000CA851E18BBFCB44BA9712194A6B93E79
-DTSTAMP:20080120T154341Z
-SUMMARY:Get together at Franks Cafe - Meet Chris
-PRIORITY:5
-X-MICROSOFT-CDO-IMPORTANCE:1
-CLASS:PUBLIC
-END:VEVENT
-END:VCALENDAR
-BEGIN:VCALENDAR
-PRODID:-//Microsoft Corporation//Outlook 11.0 MIMEDIR//EN
-VERSION:2.0
-METHOD:PUBLISH
-BEGIN:VEVENT
-ORGANIZER:MAILTO:mbrunzel at gmx.de
-DTSTART:20080324T133000Z
-DTEND:20080324T140000Z
-LOCATION:Karlsruhe
-TRANSP:OPAQUE
-SEQUENCE:0
-UID:040000008200E00074C5B7101A82E0080000000090C60C93E559C8010000000000000000100
- 00000281BF31808B91146B806EE76B4B8FEF2
-DTSTAMP:20080120T153825Z
-SUMMARY:Go to Karlsruhe Train Station (tram or taxi)
-PRIORITY:5
-X-MICROSOFT-CDO-IMPORTANCE:1
-CLASS:PUBLIC
-END:VEVENT
-END:VCALENDAR
-BEGIN:VCALENDAR
-PRODID:-//Microsoft Corporation//Outlook 11.0 MIMEDIR//EN
-VERSION:2.0
-METHOD:PUBLISH
-BEGIN:VEVENT
-ORGANIZER:MAILTO:mbrunzel at gmx.de
-DTSTART:20080227T080000Z
-DTEND:20080227T110000Z
-LOCATION:Karlsruhe
-TRANSP:OPAQUE
-SEQUENCE:0
-UID:040000008200E00074C5B7101A82E00800000000D087C37FE659C8010000000000000000100
- 00000EF2613DAF4B219448E468E5014A49CD7
-DTSTAMP:20080120T153837Z
-SUMMARY:Preparation of Belfast CID Meeting with Karl
-PRIORITY:5
-X-MICROSOFT-CDO-IMPORTANCE:1
-CLASS:PUBLIC
-END:VEVENT
-END:VCALENDAR
-BEGIN:VCALENDAR
-PRODID:-//Microsoft Corporation//Outlook 11.0 MIMEDIR//EN
-VERSION:2.0
-METHOD:PUBLISH
-BEGIN:VEVENT
-DTSTART:20080320T130000Z
-DTEND:20080320T160000Z
-TRANSP:OPAQUE
-SEQUENCE:0
-UID:040000008200E00074C5B7101A82E00800000000D0A5AC74E267C7010000000000000000100
- 000006FD3421DC287794EACF90A65292314C9
-DTSTAMP:20080120T154032Z
-SUMMARY:Prepare Slides for Presentation
-PRIORITY:5
-X-MICROSOFT-CDO-IMPORTANCE:1
-CLASS:PUBLIC
-END:VEVENT
-END:VCALENDAR
-BEGIN:VCALENDAR
-PRODID:-//Microsoft Corporation//Outlook 11.0 MIMEDIR//EN
-VERSION:2.0
-METHOD:PUBLISH
-BEGIN:VEVENT
-ORGANIZER:MAILTO:mbrunzel at gmx.de
-DTSTART:20080324T140000Z
-DTEND:20080324T151000Z
-LOCATION:Karlsruhe 
-TRANSP:OPAQUE
-SEQUENCE:0
-UID:040000008200E00074C5B7101A82E00800000000E0916768E559C8010000000000000000100
- 000006EDDBEC4B585664EBEA9BE24F9B0E681
-DTSTAMP:20080120T153806Z
-SUMMARY:Train from Karlsruhe to Frankfurt
-PRIORITY:5
-X-MICROSOFT-CDO-IMPORTANCE:1
-CLASS:PUBLIC
-END:VEVENT
-END:VCALENDAR
-BEGIN:VCALENDAR
-PRODID:-//Microsoft Corporation//Outlook 11.0 MIMEDIR//EN
-VERSION:2.0
-METHOD:PUBLISH
-BEGIN:VEVENT
-DTSTART:20080225T090000Z
-DTEND:20080225T100000Z
-TRANSP:OPAQUE
-SEQUENCE:0
-UID:040000008200E00074C5B7101A82E008000000002085026DE267C7010000000000000000100
- 00000D5738E7936B0C84E9D53E9DEFB830F4E
-DTSTAMP:20080120T154305Z
-SUMMARY:Weekly Planning Meeting
-PRIORITY:5
-X-MICROSOFT-CDO-IMPORTANCE:1
-CLASS:PUBLIC
-END:VEVENT
-END:VCALENDAR
-
\ No newline at end of file

Deleted: trunk/dna-repository/src/test/resources/docs/icaltestdata/combined_onevcalendar.ics
===================================================================
--- trunk/dna-repository/src/test/resources/docs/icaltestdata/combined_onevcalendar.ics	2009-06-04 21:46:34 UTC (rev 976)
+++ trunk/dna-repository/src/test/resources/docs/icaltestdata/combined_onevcalendar.ics	2009-06-04 22:31:30 UTC (rev 977)
@@ -1,126 +0,0 @@
-BEGIN:VCALENDAR
-PRODID:-//Microsoft Corporation//Outlook 11.0 MIMEDIR//EN
-VERSION:2.0
-METHOD:PUBLISH
-BEGIN:VEVENT
-ORGANIZER:MAILTO:mbrunzel at gmx.de
-DTSTART;VALUE=DATE:20080325
-DTEND;VALUE=DATE:20080328
-LOCATION:Belfast\, Northern Ireland
-TRANSP:TRANSPARENT
-SEQUENCE:0
-UID:040000008200E00074C5B7101A82E00800000000B020A967E159C8010000000000000000100
- 000001F009082EE836A4D9E9F85D0FD610DDC
-DTSTAMP:20080120T153743Z
-SUMMARY:Belfast CID Meeting
-PRIORITY:5
-X-MICROSOFT-CDO-IMPORTANCE:1
-CLASS:PUBLIC
-END:VEVENT
-
-BEGIN:VEVENT
-ORGANIZER:MAILTO:mbrunzel at gmx.de
-DTSTART:20080324T173000Z
-DTEND:20080324T214000Z
-LOCATION:Frankfurt Airport
-TRANSP:OPAQUE
-SEQUENCE:0
-UID:040000008200E00074C5B7101A82E0080000000040BE0B4CE559C8010000000000000000100
- 000000BAFD137BB92CE4DB8E4425C5E7FF4AD
-DTSTAMP:20080120T153756Z
-SUMMARY:Flight from Frankfurt to Belfast
-PRIORITY:5
-X-MICROSOFT-CDO-IMPORTANCE:1
-CLASS:PUBLIC
-END:VEVENT
-
-BEGIN:VEVENT
-DTSTART:20080328T130000Z
-DTEND:20080328T140000Z
-TRANSP:OPAQUE
-SEQUENCE:0
-UID:040000008200E00074C5B7101A82E00800000000D056B58DE267C7010000000000000000100
- 00000CA851E18BBFCB44BA9712194A6B93E79
-DTSTAMP:20080120T154341Z
-SUMMARY:Get together at Franks Cafe - Meet Chris
-PRIORITY:5
-X-MICROSOFT-CDO-IMPORTANCE:1
-CLASS:PUBLIC
-END:VEVENT
-
-BEGIN:VEVENT
-ORGANIZER:MAILTO:mbrunzel at gmx.de
-DTSTART:20080324T133000Z
-DTEND:20080324T140000Z
-LOCATION:Karlsruhe
-TRANSP:OPAQUE
-SEQUENCE:0
-UID:040000008200E00074C5B7101A82E0080000000090C60C93E559C8010000000000000000100
- 00000281BF31808B91146B806EE76B4B8FEF2
-DTSTAMP:20080120T153825Z
-SUMMARY:Go to Karlsruhe Train Station (tram or taxi)
-PRIORITY:5
-X-MICROSOFT-CDO-IMPORTANCE:1
-CLASS:PUBLIC
-END:VEVENT
-
-BEGIN:VEVENT
-ORGANIZER:MAILTO:mbrunzel at gmx.de
-DTSTART:20080227T080000Z
-DTEND:20080227T110000Z
-LOCATION:Karlsruhe
-TRANSP:OPAQUE
-SEQUENCE:0
-UID:040000008200E00074C5B7101A82E00800000000D087C37FE659C8010000000000000000100
- 00000EF2613DAF4B219448E468E5014A49CD7
-DTSTAMP:20080120T153837Z
-SUMMARY:Preparation of Belfast CID Meeting with Karl
-PRIORITY:5
-X-MICROSOFT-CDO-IMPORTANCE:1
-CLASS:PUBLIC
-END:VEVENT
-
-BEGIN:VEVENT
-DTSTART:20080320T130000Z
-DTEND:20080320T160000Z
-TRANSP:OPAQUE
-SEQUENCE:0
-UID:040000008200E00074C5B7101A82E00800000000D0A5AC74E267C7010000000000000000100
- 000006FD3421DC287794EACF90A65292314C9
-DTSTAMP:20080120T154032Z
-SUMMARY:Prepare Slides for Presentation
-PRIORITY:5
-X-MICROSOFT-CDO-IMPORTANCE:1
-CLASS:PUBLIC
-END:VEVENT
-
-BEGIN:VEVENT
-ORGANIZER:MAILTO:mbrunzel at gmx.de
-DTSTART:20080324T140000Z
-DTEND:20080324T151000Z
-LOCATION:Karlsruhe 
-TRANSP:OPAQUE
-SEQUENCE:0
-UID:040000008200E00074C5B7101A82E00800000000E0916768E559C8010000000000000000100
- 000006EDDBEC4B585664EBEA9BE24F9B0E681
-DTSTAMP:20080120T153806Z
-SUMMARY:Train from Karlsruhe to Frankfurt
-PRIORITY:5
-X-MICROSOFT-CDO-IMPORTANCE:1
-CLASS:PUBLIC
-END:VEVENT
-
-BEGIN:VEVENT
-DTSTART:20080225T090000Z
-DTEND:20080225T100000Z
-TRANSP:OPAQUE
-SEQUENCE:0
-UID:040000008200E00074C5B7101A82E008000000002085026DE267C7010000000000000000100
- 00000D5738E7936B0C84E9D53E9DEFB830F4E
-DTSTAMP:20080120T154305Z
-SUMMARY:Weekly Planning Meeting
-PRIORITY:5
-X-MICROSOFT-CDO-IMPORTANCE:1
-CLASS:PUBLIC
-END:VEVENT
-END:VCALENDAR

Deleted: trunk/dna-repository/src/test/resources/docs/icaltestdata/extendedCalendar.ics
===================================================================
--- trunk/dna-repository/src/test/resources/docs/icaltestdata/extendedCalendar.ics	2009-06-04 21:46:34 UTC (rev 976)
+++ trunk/dna-repository/src/test/resources/docs/icaltestdata/extendedCalendar.ics	2009-06-04 22:31:30 UTC (rev 977)
@@ -1,9 +0,0 @@
-BEGIN:VCALENDAR
-CALSCALE:GREGORIAN
-PRODID:-//Apple Computer\, Inc//iCal 1.0//EN
-VERSION:2.0
-METHOD:PUBLISH
-X-WR-TIMEZONE;VALUE=TEXT:Europe/London
-X-WR-CALNAME;VALUE=TEXT:Work
-X-WR-RELCALID;VALUE=TEXT:E1445B1A-5974-11D7-8A5F-000393161A98
-END:VCALENDAR
\ No newline at end of file

Deleted: trunk/dna-repository/src/test/resources/docs/icaltestdata/freebusy.ics
===================================================================
--- trunk/dna-repository/src/test/resources/docs/icaltestdata/freebusy.ics	2009-06-04 21:46:34 UTC (rev 976)
+++ trunk/dna-repository/src/test/resources/docs/icaltestdata/freebusy.ics	2009-06-04 22:31:30 UTC (rev 977)
@@ -1,14 +0,0 @@
-BEGIN:VCALENDAR
-METHOD:REQUEST
-PRODID:-//Ximian//NONSGML Evolution Calendar//EN
-BEGIN:VFREEBUSY
-ORGANIZER:MAILTO:jane_doe at host1.com
-ATTENDEE:MAILTO:john_public at host2.com
-DTSTAMP:19970901T100000Z
-FREEBUSY;VALUE=PERIOD:19971015T050000Z/PT8H30M,
- 19971015T160000Z/PT5H30M,19971015T223000Z/PT6H30M
-URL:http://host2.com/pub/busy/jpublic-01.ifb
-COMMENT:This iCalendar file contains busy time information for
- the next three months.
-END:VFREEBUSY
-END:VCALENDAR

Deleted: trunk/dna-repository/src/test/resources/docs/icaltestdata/geo1.ics
===================================================================
--- trunk/dna-repository/src/test/resources/docs/icaltestdata/geo1.ics	2009-06-04 21:46:34 UTC (rev 976)
+++ trunk/dna-repository/src/test/resources/docs/icaltestdata/geo1.ics	2009-06-04 22:31:30 UTC (rev 977)
@@ -1,40 +0,0 @@
-BEGIN:VCALENDAR
-CALSCALE:GREGORIAN
-PRODID:-//Dan C//edited with emacs//EN
-X-WR-TIMEZONE;VALUE=TEXT:US/Eastern
-VERSION:2.0
-BEGIN:VEVENT
-SEQUENCE:3
-URL:http://kanzaki.com/works/2004/cal/0406vocab.html
-GEO:40.442673;-79.945815
-DTSTAMP:20021219T205357Z
-SUMMARY:icalendaring #rdfig meeting
-DTEND;
- TZID=/softwarestudio.org/Olson_20011030_5/America/New_York:20030108T140000
-DTSTART;
- TZID=/softwarestudio.org/Olson_20011030_5/America/New_York:20030108T130000
-UID:CDC474D4-1393-11D7-9A2C-000393914268
-END:VEVENT
-
-BEGIN:VTIMEZONE
-TZID:/softwarestudio.org/Olson_20011030_5/America/New_York
-X-LIC-LOCATION:America/New_York
-BEGIN:STANDARD
-TZOFFSETFROM:-0400
-TZOFFSETTO:-0500
-TZNAME:EST
-DTSTART:19701025T020000
-RRULE:FREQ=YEARLY;INTERVAL=1;BYDAY=-1SU;BYMONTH=10
-END:STANDARD
-BEGIN:DAYLIGHT
-TZOFFSETFROM:-0500
-TZOFFSETTO:-0400
-TZNAME:EDT
-DTSTART:19700405T020000
-RRULE:FREQ=YEARLY;INTERVAL=1;BYDAY=1SU;BYMONTH=4
-END:DAYLIGHT
-END:VTIMEZONE
-
-END:VCALENDAR
-
-

Deleted: trunk/dna-repository/src/test/resources/docs/icaltestdata/gkexample.ics
===================================================================
--- trunk/dna-repository/src/test/resources/docs/icaltestdata/gkexample.ics	2009-06-04 21:46:34 UTC (rev 976)
+++ trunk/dna-repository/src/test/resources/docs/icaltestdata/gkexample.ics	2009-06-04 22:31:30 UTC (rev 977)
@@ -1,18 +0,0 @@
-BEGIN:VCALENDAR
-VERSION:2.0
-PRODID:http://id.ninebynine.org/wip/2002/timetable
-BEGIN:VEVENT
-UID:20020630T230353Z-3895-69-2-0 at antoni
-DTSTART:20021201T190000Z
-DTEND:20021201T210000Z
-RRULE:FREQ=WEEKLY;BYDAY=MO,TU,WE,TH,FR
-END:VEVENT
-BEGIN:VEVENT
-UID:20020630T230353Z-3895-69-1-0 at antoni
-DTSTART:20021201T160000Z
-DTEND:20021201T220000Z
-RRULE:FREQ=WEEKLY;BYDAY=SA,SU
-COMMENT:from G.Klyne - iCalendarExample.txt
-END:VEVENT
-END:VCALENDAR
-

Deleted: trunk/dna-repository/src/test/resources/docs/icaltestdata/incoming.ics
===================================================================
--- trunk/dna-repository/src/test/resources/docs/icaltestdata/incoming.ics	2009-06-04 21:46:34 UTC (rev 976)
+++ trunk/dna-repository/src/test/resources/docs/icaltestdata/incoming.ics	2009-06-04 22:31:30 UTC (rev 977)
@@ -1,170 +0,0 @@
-BEGIN:VCALENDAR
-PRODID:-//ACME/DesktopCalendar//EN
-METHOD:REPLY
-X-LIC-NOTE: #I6: Crasher Y is declining  A's request\, #C2
-VERSION:2.0
-BEGIN:VEVENT
-ATTENDEE;PARTSTAT=DECLINED:Mailto:Y at example.com
-ORGANIZER:MAILTO:A at example.com
-UID:calsrv.example.com-873970198738785 at example.com
-SEQUENCE:1
-REQUEST-STATUS:2.0;Success
-DTSTAMP:19970612T190000Z
-END:VEVENT
-END:VCALENDAR
-
-BEGIN:VCALENDAR
-PRODID:-//ACME/DesktopCalendar//EN
-METHOD:REQUEST
-X-LIC-NOTE: #I1. Reschedules C1
-VERSION:2.0
-BEGIN:VEVENT
-ORGANIZER:Mailto:B at example.com
-ATTENDEE;ROLE=CHAIR;PARTSTAT=ACCEPTED;CN=BIG A:Mailto:A at example.com
-ATTENDEE;RSVP=TRUE;CUTYPE=INDIVIDUAL;CN=B:Mailto:B at example.com
-ATTENDEE;RSVP=TRUE;CUTYPE=INDIVIDUAL;CN=C:Mailto:C at example.com
-ATTENDEE;RSVP=TRUE;CUTYPE=INDIVIDUAL;CN=Hal:Mailto:D at example.com
-ATTENDEE;RSVP=FALSE;CUTYPE=ROOM:conf_Big at example.com
-ATTENDEE;ROLE=NON-PARTICIPANT;RSVP=FALSE:Mailto:E at example.com
-DTSTAMP:19970611T190000Z
-DTSTART:19970701T200000Z
-DTEND:19970701T2000000Z
-SUMMARY:Conference
-UID:calsrv.example.com-873970198738777 at example.com
-SEQUENCE:2
-STATUS:CONFIRMED
-END:VEVENT
-END:VCALENDAR
-
-BEGIN:VCALENDAR
-PRODID:-//ACME/DesktopCalendar//EN
-METHOD:REQUEST
-X-LIC-NOTE: #I2. Updates C1
-VERSION:2.0
-BEGIN:VEVENT
-ORGANIZER:Mailto:B at example.com
-ATTENDEE;ROLE=CHAIR;PARTSTAT=ACCEPTED;CN=BIG A:Mailto:A at example.com
-ATTENDEE;RSVP=TRUE;CUTYPE=INDIVIDUAL;CN=B:Mailto:B at example.com
-ATTENDEE;RSVP=TRUE;CUTYPE=INDIVIDUAL;CN=C:Mailto:C at example.com
-ATTENDEE;RSVP=TRUE;CUTYPE=INDIVIDUAL;CN=Hal:Mailto:D at example.com
-ATTENDEE;RSVP=FALSE;CUTYPE=ROOM:conf_Big at example.com
-ATTENDEE;ROLE=NON-PARTICIPANT;RSVP=FALSE:Mailto:E at example.com
-DTSTAMP:19970611T193000Z
-DTSTART:19970701T190000Z
-DTEND:19970701T1930000Z
-SUMMARY: Pool party
-UID:calsrv.example.com-873970198738777 at example.com
-SEQUENCE:2
-STATUS:CONFIRMED
-END:VEVENT
-END:VCALENDAR
-
-BEGIN:VCALENDAR
-PRODID:-//ACME/DesktopCalendar//EN
-METHOD:REQUEST
-X-LIC-NOTE: #I2: This is an obsolete request\, otherwise identical to #I1
-VERSION:2.0
-BEGIN:VEVENT
-ORGANIZER:Mailto:B at example.com
-ATTENDEE;ROLE=CHAIR;PARTSTAT=ACCEPTED:Mailto:A at example.com
-ATTENDEE;RSVP=TRUE;CUTYPE=INDIVIDUAL:Mailto:B at example.com
-ATTENDEE;RSVP=TRUE;CUTYPE=INDIVIDUAL:Mailto:C at example.com
-ATTENDEE;RSVP=TRUE;CUTYPE=INDIVIDUAL;CN=Hal:Mailto:D at example.com
-ATTENDEE;ROLE=NON-PARTICIPANT;RSVP=FALSE;
- CUTYPE=ROOM:Mailto:Conf at example.com
-ATTENDEE;ROLE=NON-PARTICIPANT;RSVP=FALSE:Mailto:E at example.com
-DTSTART:19960701T180000Z
-DTEND:19970701T190000Z
-SUMMARY:Phone Conference
-UID:calsrv.example.com-873970198738777 at example.com
-SEQUENCE:0
-DTSTAMP:19960613T190000Z
-STATUS:CONFIRMED
-END:VEVENT
-END:VCALENDAR
-
-BEGIN:VCALENDAR
-PRODID:-//ACME/DesktopCalendar//EN
-METHOD:REPLY
-X-LIC-NOTE: #I3: User B is accepting A's request\, #C2
-VERSION:2.0
-BEGIN:VEVENT
-ATTENDEE;PARTSTAT=ACCEPTED:Mailto:B at example.com
-ORGANIZER:MAILTO:A at example.com
-UID:calsrv.example.com-873970198738785 at example.com
-SEQUENCE:1
-REQUEST-STATUS:2.0;Success
-DTSTAMP:19970612T190000Z
-END:VEVENT
-END:VCALENDAR
-
-BEGIN:VCALENDAR
-PRODID:-//ACME/DesktopCalendar//EN
-METHOD:REPLY
-X-LIC-NOTE: #I4: User C is rejecting A's request\, #C2
-VERSION:2.0
-BEGIN:VEVENT
-ATTENDEE;PARTSTAT=DECLINED:Mailto:C at example.com
-ORGANIZER:MAILTO:A at example.com
-UID:calsrv.example.com-873970198738785 at example.com
-SEQUENCE:1
-REQUEST-STATUS:2.0;Success
-DTSTAMP:19970612T190000Z
-END:VEVENT
-END:VCALENDAR
-
-BEGIN:VCALENDAR
-PRODID:-//ACME/DesktopCalendar//EN
-METHOD:REPLY
-X-LIC-NOTE: #I5: Crasher X is accepting A's request\, #C2
-VERSION:2.0
-BEGIN:VEVENT
-ATTENDEE;PARTSTAT=ACCEPTED:Mailto:X at example.com
-ORGANIZER:MAILTO:A at example.com
-UID:calsrv.example.com-873970198738785 at example.com
-SEQUENCE:1
-REQUEST-STATUS:2.0;Success
-DTSTAMP:19970612T190000Z
-END:VEVENT
-END:VCALENDAR
-
-
-
-BEGIN:VCALENDAR
-PRODID:-//ACME/DesktopCalendar//EN
-METHOD:CANCEL
-X-LIC-NOTE: #I7: Cancel #c1
-VERSION:2.0
-BEGIN:VEVENT
-ORGANIZER:Mailto:B at example.com
-ATTENDEE;CUTYPE=INDIVIDUAL:Mailto:A at example.com
-ATTENDEE;CUTYPE=INDIVIDUAL:Mailto:B at example.com
-ATTENDEE;CUTYPE=INDIVIDUAL:Mailto:C at example.com
-ATTENDEE;CUTYPE=INDIVIDUAL:Mailto:D at example.com
-COMMENT:Mr. B cannot attend. It's raining. Lets cancel.
-UID:calsrv.example.com-873970198738777 at example.com
-SEQUENCE:1
-UID:calsrv.example.com-873970198738777 at example.com
-STATUS:CANCELLED
-DTSTAMP:19970613T190000Z
-END:VEVENT
-END:VCALENDAR
-
-BEGIN:VCALENDAR
-PRODID:-//ACME/DesktopCalendar//EN
-METHOD:COUNTER
-X-LIC-NOTE: #I8. Counter to #C1. Changed DTEND to DURATION.
-VERSION:2.0
-BEGIN:VEVENT
-DTSTAMP:19970611T190000Z
-DTSTART:19970701T190000Z
-DURATION:PT2H
-ORGANIZER:Mailto:B at example.com
-ATTENDEE;RSVP=TRUE;CUTYPE=INDIVIDUAL;CN=C:Mailto:C at example.com
-SUMMARY:Conference
-COMMENT: I think the conference should be 2 hours long
-UID:calsrv.example.com-873970198738777 at example.com
-SEQUENCE:1
-END:VEVENT
-END:VCALENDAR
-

Deleted: trunk/dna-repository/src/test/resources/docs/icaltestdata/korganizer-jicaltest-vjournal.ics
===================================================================
--- trunk/dna-repository/src/test/resources/docs/icaltestdata/korganizer-jicaltest-vjournal.ics	2009-06-04 21:46:34 UTC (rev 976)
+++ trunk/dna-repository/src/test/resources/docs/icaltestdata/korganizer-jicaltest-vjournal.ics	2009-06-04 22:31:30 UTC (rev 977)
@@ -1,214 +0,0 @@
-BEGIN:VCALENDAR
-PRODID
- :-//K Desktop Environment//NONSGML KOrganizer 3.1//EN
-VERSION
- :2.0
-BEGIN:VTODO
-CREATED
- :20030227T110704Z
-UID
- :KOrganizer-1573136895.534
-SEQUENCE
- :0
-LAST-MODIFIED
- :20030227T110704Z
-DTSTAMP
- :20030227T110715Z
-ORGANIZER
- :MAILTO:nobody at nowhere
-SUMMARY
- :todo
-CLASS
- :PUBLIC
-PRIORITY
- :3
-X-PILOTID
- :0
-X-PILOTSTAT
- :1
-PERCENT-COMPLETE
- :0
-END:VTODO
-BEGIN:VEVENT
-CREATED
- :20030227T102259Z
-UID
- :KOrganizer-924981711.459
-SEQUENCE
- :1
-LAST-MODIFIED
- :20030227T104732Z
-DTSTAMP
- :20030227T110715Z
-ORGANIZER
- :MAILTO:nobody at nowhere
-DESCRIPTION
- :Japs\nJaps\nJups\n
-SUMMARY
- :All day long
-CLASS
- :PUBLIC
-PRIORITY
- :3
-CATEGORIES
- :Holiday
-CATEGORIES
- :Meeting
-X-PILOTID
- :0
-X-PILOTSTAT
- :1
-DTSTART
- ;VALUE=DATE
- :20030227
-DTEND
- ;VALUE=DATE
- :20030301
-END:VEVENT
-BEGIN:VEVENT
-CREATED
- :20030227T102213Z
-UID
- :KOrganizer-1935087658.710
-SEQUENCE
- :1
-LAST-MODIFIED
- :20030227T104821Z
-DTSTAMP
- :20030227T110715Z
-ORGANIZER
- :MAILTO:nobody at nowhere
-ATTENDEE
- ;CN=Person2
- ;RSVP=FALSE
- ;PARTSTAT=NEEDS-ACTION
- ;ROLE=REQ-PARTICIPANT
- :mailto:person2 at mail
-ATTENDEE
- ;CN=Person1
- ;RSVP=FALSE
- ;PARTSTAT=NEEDS-ACTION
- ;ROLE=REQ-PARTICIPANT
- :mailto:person1 at mail
-DESCRIPTION
- :Summary
-SUMMARY
- :Event
-LOCATION
- :Location
-CLASS
- :PUBLIC
-PRIORITY
- :3
-X-PILOTID
- :0
-X-PILOTSTAT
- :1
-DTSTART
- :20030227T051500Z
-DTEND
- :20030227T064500Z
-END:VEVENT
-BEGIN:VEVENT
-CREATED
- :20021125T143801Z
-UID
- :KOrganizer-888675881.329
-SEQUENCE
- :0
-LAST-MODIFIED
- :20021125T143801Z
-DTSTAMP
- :20030227T110715Z
-ORGANIZER
- :MAILTO:nobody at nowhere
-SUMMARY
- :Recur
-CLASS
- :PUBLIC
-PRIORITY
- :3
-X-PILOTID
- :0
-X-PILOTSTAT
- :1
-RRULE
- :FREQ=YEARLY;INTERVAL=1;BYMONTH=11
-DTSTART
- ;VALUE=DATE
- :20021127
-DTEND
- ;VALUE=DATE
- :20021128
-END:VEVENT
-BEGIN:VEVENT
-CREATED
- :20030227T102234Z
-UID
- :KOrganizer-1978967821.135
-SEQUENCE
- :0
-LAST-MODIFIED
- :20030227T102234Z
-DTSTAMP
- :20030227T110715Z
-ORGANIZER
- :MAILTO:nobody at nowhere
-SUMMARY
- :Another Event
-CLASS
- :PUBLIC
-PRIORITY
- :3
-X-PILOTID
- :0
-X-PILOTSTAT
- :1
-RRULE
- :FREQ=DAILY;COUNT=3;INTERVAL=1
-DTSTART
- :20030228T073000Z
-DTEND
- :20030228T100000Z
-END:VEVENT
-BEGIN:VJOURNAL
-CREATED
- :20020723T142142Z
-UID
- :KOrganizer-2070641952.348
-SEQUENCE
- :0
-LAST-MODIFIED
- :20020723T142142Z
-DTSTAMP
- :20030227T110715Z
-ORGANIZER
- :MAILTO:nobody at nowhere
-DESCRIPTION
- :dfdfsdfsdf
-CLASS
- :PUBLIC
-X-PILOTID
- :0
-X-PILOTSTAT
- :1
-END:VJOURNAL
-BEGIN:VJOURNAL
-CREATED
- :20030227T110715Z
-UID
- :KOrganizer-948365006.348
-SEQUENCE
- :0
-LAST-MODIFIED
- :20030227T110715Z
-DTSTAMP
- :20030227T110715Z
-ORGANIZER
- :MAILTO:nobody at nowhere
-DESCRIPTION
- :journal\n
-CLASS
- :PUBLIC
-END:VJOURNAL
-END:VCALENDAR

Deleted: trunk/dna-repository/src/test/resources/docs/icaltestdata/korganizer-jicaltest.ics
===================================================================
--- trunk/dna-repository/src/test/resources/docs/icaltestdata/korganizer-jicaltest.ics	2009-06-04 21:46:34 UTC (rev 976)
+++ trunk/dna-repository/src/test/resources/docs/icaltestdata/korganizer-jicaltest.ics	2009-06-04 22:31:30 UTC (rev 977)
@@ -1,174 +0,0 @@
-BEGIN:VCALENDAR
-PRODID
- :-//K Desktop Environment//NONSGML KOrganizer 3.1//EN
-VERSION
- :2.0
-BEGIN:VTODO
-CREATED
- :20030227T110704Z
-UID
- :KOrganizer-1573136895.534
-SEQUENCE
- :0
-LAST-MODIFIED
- :20030227T110704Z
-DTSTAMP
- :20030227T110715Z
-ORGANIZER
- :MAILTO:nobody at nowhere
-SUMMARY
- :todo
-CLASS
- :PUBLIC
-PRIORITY
- :3
-X-KORG-PILOTID
- :0
-X-KORG-PILOTSTAT
- :1
-PERCENT-COMPLETE
- :0
-END:VTODO
-BEGIN:VEVENT
-CREATED
- :20030227T102259Z
-UID
- :KOrganizer-924981711.459
-SEQUENCE
- :1
-LAST-MODIFIED
- :20030227T104732Z
-DTSTAMP
- :20030227T110715Z
-ORGANIZER
- :MAILTO:nobody at nowhere
-DESCRIPTION
- :Japs\nJaps\nJups\n
-SUMMARY
- :All day long
-CLASS
- :PUBLIC
-PRIORITY
- :3
-CATEGORIES
- :Holiday
-CATEGORIES
- :Meeting
-X-KORG-PILOTID
- :0
-X-KORG-PILOTSTAT
- :1
-DTSTART
- ;VALUE=DATE
- :20030227
-DTEND
- ;VALUE=DATE
- :20030301
-END:VEVENT
-BEGIN:VEVENT
-CREATED
- :20030227T102213Z
-UID
- :KOrganizer-1935087658.710
-SEQUENCE
- :1
-LAST-MODIFIED
- :20030227T104821Z
-DTSTAMP
- :20030227T110715Z
-ORGANIZER
- :MAILTO:nobody at nowhere
-ATTENDEE
- ;CN=Person2
- ;RSVP=FALSE
- ;PARTSTAT=NEEDS-ACTION
- ;ROLE=REQ-PARTICIPANT
- :mailto:person2 at mail
-ATTENDEE
- ;CN=Person1
- ;RSVP=FALSE
- ;PARTSTAT=NEEDS-ACTION
- ;ROLE=REQ-PARTICIPANT
- :mailto:person1 at mail
-DESCRIPTION
- :Summary
-SUMMARY
- :Event
-LOCATION
- :Location
-CLASS
- :PUBLIC
-PRIORITY
- :3
-X-KORG-PILOTID
- :0
-X-KORG-PILOTSTAT
- :1
-DTSTART
- :20030227T051500Z
-DTEND
- :20030227T064500Z
-END:VEVENT
-BEGIN:VEVENT
-CREATED
- :20021125T143801Z
-UID
- :KOrganizer-888675881.329
-SEQUENCE
- :0
-LAST-MODIFIED
- :20021125T143801Z
-DTSTAMP
- :20030227T110715Z
-ORGANIZER
- :MAILTO:nobody at nowhere
-SUMMARY
- :Recur
-CLASS
- :PUBLIC
-PRIORITY
- :3
-X-KORG-PILOTID
- :0
-X-KORG-PILOTSTAT
- :1
-RRULE
- :FREQ=YEARLY;INTERVAL=1;BYMONTH=11
-DTSTART
- ;VALUE=DATE
- :20021127
-DTEND
- ;VALUE=DATE
- :20021128
-END:VEVENT
-BEGIN:VEVENT
-CREATED
- :20030227T102234Z
-UID
- :KOrganizer-1978967821.135
-SEQUENCE
- :0
-LAST-MODIFIED
- :20030227T102234Z
-DTSTAMP
- :20030227T110715Z
-ORGANIZER
- :MAILTO:nobody at nowhere
-SUMMARY
- :Another Event
-CLASS
- :PUBLIC
-PRIORITY
- :3
-X-KORG-PILOTID
- :0
-X-KORG-PILOTSTAT
- :1
-RRULE
- :FREQ=DAILY;COUNT=3;INTERVAL=1
-DTSTART
- :20030228T073000Z
-DTEND
- :20030228T100000Z
-END:VEVENT
-END:VCALENDAR

Deleted: trunk/dna-repository/src/test/resources/docs/icaltestdata/php-flp.ics
===================================================================
--- trunk/dna-repository/src/test/resources/docs/icaltestdata/php-flp.ics	2009-06-04 21:46:34 UTC (rev 976)
+++ trunk/dna-repository/src/test/resources/docs/icaltestdata/php-flp.ics	2009-06-04 22:31:30 UTC (rev 977)
@@ -1,29 +0,0 @@
-BEGIN:VCALENDAR
-PRODID:-//flaimo.com//iCal Class MIMEDIR//EN
-VERSION:2.0
-METHOD:REQUEST
-BEGIN:VEVENT
-ORGANIZER;CN=TMS -- Calendar Publisher:MAILTO:cal_publisher at xxxx.xxxx.xxxx.com
-DTSTART:20030620T220000Z
-DTEND:20030620T220000Z
-TRANSP:TRANSPARENT
-SEQUENCE:0
-UID:TPACTIDSTREAMTASKID
-DTSTAMP:20030410T113400Z
-CATEGORIES;LANGUAGE=en;ENCODING=QUOTED-PRINTABLE:TMS Dates
-DESCRIPTION;LANGUAGE=en;ENCODING=QUOTED-PRINTABLE:View the status of this ACT ID:=0Ahttp://xxxx.xxxx.xxxx.com/public/view_detailed_status.php?act_id=3DACTID&stream=3DSTREAM&task_id=3DTASKID=0A
-SUMMARY;LANGUAGE=en;ENCODING=QUOTED-PRINTABLE:TP for Act ID XXXXX -- Not important : Stream -- Task ID
-PRIORITY:5
-CLASS:PUBLIC
-URL:http://xxxx.xxxx.xxxx.com/
-RESOURCES:EASEL,PROJECTOR,VCR
-STATUS:CONFIRMED
-BEGIN:VALARM
-ACTION:DISPLAY
-TRIGGER:-PT2880M
-DESCRIPTION:TP for Act ID XXXXX -- Vx.x Not important : Stream -- Task ID
-SUMMARY:TP for Act ID XXXXX -- Vx.x Not important : Stream -- Task ID
-REPEAT:3
-END:VALARM
-END:VEVENT
-END:VCALENDAR
\ No newline at end of file

Deleted: trunk/dna-repository/src/test/resources/docs/icaltestdata/simplevevent.ics
===================================================================
--- trunk/dna-repository/src/test/resources/docs/icaltestdata/simplevevent.ics	2009-06-04 21:46:34 UTC (rev 976)
+++ trunk/dna-repository/src/test/resources/docs/icaltestdata/simplevevent.ics	2009-06-04 22:31:30 UTC (rev 977)
@@ -1,43 +0,0 @@
-BEGIN:VCALENDAR
-CALSCALE:GREGORIAN
-PRODID:-//Apple Computer\, Inc//iCal 1.0//EN
-VERSION:2.0
-METHOD:PUBLISH
-
-BEGIN:VEVENT
-SEQUENCE:2
-ATTENDEE;CN=Libby Miller:mailto:libby.miller at bristol.ac.uk
-DTSTAMP:20030109T123909Z
-SUMMARY:IRC Meet
-UID:EB825E41-23CE-11D7-B93D-003065B0C95E
-ORGANIZER;CN=Damian Steer:mailto:pldms at mac.com
-DTSTART;
- TZID=/softwarestudio.org/Olson_20011030_5/Europe/London:20030115T180000
-DURATION:PT1H
-BEGIN:VALARM
-ATTACH;VALUE=URI:http://www.w3.org/index.html
-TRIGGER;VALUE=DATE-TIME:20060412T230000Z
-ACTION:AUDIO
-END:VALARM
-END:VEVENT
-
-BEGIN:VTIMEZONE
-TZID:/softwarestudio.org/Olson_20011030_5/America/New_York
-TZURL:http://timezones.r.us.net/tz/US-California-Los_Angeles
-BEGIN:STANDARD
-TZOFFSETFROM:-0400
-TZOFFSETTO:-0500
-TZNAME:EST
-DTSTART:19701025T020000
-RRULE:FREQ=YEARLY;INTERVAL=1;BYDAY=-1SU;BYMONTH=10
-END:STANDARD
-BEGIN:DAYLIGHT
-TZOFFSETFROM:-0500
-TZOFFSETTO:-0400
-TZNAME:EDT
-DTSTART:19700405T020000
-RRULE:FREQ=YEARLY;INTERVAL=1;BYDAY=1SU;BYMONTH=4
-END:DAYLIGHT
-END:VTIMEZONE
-
-END:VCALENDAR

Deleted: trunk/dna-repository/src/test/resources/docs/icaltestdata/sunbird_sample.ics
===================================================================
--- trunk/dna-repository/src/test/resources/docs/icaltestdata/sunbird_sample.ics	2009-06-04 21:46:34 UTC (rev 976)
+++ trunk/dna-repository/src/test/resources/docs/icaltestdata/sunbird_sample.ics	2009-06-04 22:31:30 UTC (rev 977)
@@ -1,4313 +0,0 @@
-BEGIN:VCALENDAR
-VERSION
- :2.0
-PRODID
- :-//Mozilla.org/NONSGML Mozilla Calendar V1.0//EN
-BEGIN:VEVENT
-UID
- :C20350E0-22CF-11D7-B452-0050E4C50C66
-SUMMARY
- :Catch Me If You Can - Leonardo DiCaprio stars as Frank Abagnale\, 
- the youngest man to make the FBI's most-wanted list for forgery. Assuming 
- various identities\, Abagnale passed millions of dollars in bad checks. 
- Stars Leonardo DiCaprio\, Tom Hanks\, Christopher Walken\, Jennifer 
- Garner and Martin Sheen. - Empire rating: 4/5 stars.
-CLASS
- :PUBLIC
-X-MOZILLA-RECUR-DEFAULT-INTERVAL
- :0
-DTSTART
- ;VALUE=DATE
- :20030109
-DTEND
- ;VALUE=DATE
- :20030110
-DTSTAMP
- :20030108T062114Z
-END:VEVENT
-BEGIN:VEVENT
-UID
- :F7F52318-22D1-11D7-B452-0050E4C50C66
-SUMMARY
- :Like Mike - Hip Hop star Lil' Bow Wow stars as Calvin\, a 14-year-old 
- orphan with the dream of becoming a famous basketball star. When he 
- puts on a mysterious pair of old sneakers inscribed with the faded 
- initials \"MJ\,\" he inherits the abilities of Michael Jordan and 
- makes the leap to NBA superstardom. Empire Rating 1/5
-CLASS
- :PUBLIC
-X-MOZILLA-RECUR-DEFAULT-INTERVAL
- :0
-DTSTART
- ;VALUE=DATE
- :20030116
-DTEND
- ;VALUE=DATE
- :20030117
-DTSTAMP
- :20030108T063328Z
-END:VEVENT
-BEGIN:VEVENT
-UID
- :FA2DF665-22D1-11D7-B452-0050E4C50C66
-SUMMARY
- :Star Trek: Nemesis -                                              
-                                      Ordered by Starfleet to be the 
- first line of diplomacy in ushering in a new era for the Federation\, 
- the crew of the USS Enterprise-E is dispatched to Romulus for an unexpected 
- peace mission. Once in the shadow of the Romulan Empire\, Captain 
- Jean-Luc Picard and the Enterprise crew are thrust into the center 
- of a plot that could lead to the destruction of Earth at the hands 
- of a new and chilling nemesis. Stars Patrick Stewart\, Jonathan Frakes\, 
- Brent Spiner and LeVar Burton - Empire Rating 3/5
-CLASS
- :PUBLIC
-X-MOZILLA-RECUR-DEFAULT-INTERVAL
- :0
-DTSTART
- ;VALUE=DATE
- :20030116
-DTEND
- ;VALUE=DATE
- :20030117
-DTSTAMP
- :20030108T063225Z
-END:VEVENT
-BEGIN:VEVENT
-UID
- :FBC432FB-22D1-11D7-B452-0050E4C50C66
-SUMMARY
- :The Quiet American -                                              
-                                     Set against the French Indochina 
- War in Vietnam\, circa 1952\, this murder mystery follows a veteran 
- English journalist who challenges a young American for the affections 
- of a Vietnamese beauty. Based on the novel by Graham Green. Stars 
- Michael Caine\, Brendan Fraser and Hai Yen Do. Empire rating 5/5
-CLASS
- :PUBLIC
-X-MOZILLA-RECUR-DEFAULT-INTERVAL
- :0
-DTSTART
- ;VALUE=DATE
- :20030116
-DTEND
- ;VALUE=DATE
- :20030117
-DTSTAMP
- :20030108T063314Z
-END:VEVENT
-BEGIN:VEVENT
-UID
- :319A08D9-22D3-11D7-B452-0050E4C50C66
-SUMMARY
- :8 Mile - Set against the 1995 hip-hop scene in Detroit\, this drama 
- is about a young man's struggle to find the strength and courage to 
- transcend the boundaries that define his life. Stars Eminem\, Mekhi 
- Phifer\, Brittany Murphy and Kim Basinger. \n\n \n            
-             \n                        \n
-CLASS
- :PUBLIC
-X-MOZILLA-RECUR-DEFAULT-INTERVAL
- :0
-DTSTART
- ;VALUE=DATE
- :20030123
-DTEND
- ;VALUE=DATE
- :20030124
-DTSTAMP
- :20030108T063427Z
-END:VEVENT
-BEGIN:VEVENT
-UID
- :62B2B092-AF8D-11D7-9EF2-0050E4C50C66
-SUMMARY
- :The League of Extraordinary Gentlemen
-URL
- :http://www.movie-list.com/trailers.php?id=lxg
-CLASS
- :PUBLIC
-X-MOZILLA-RECUR-DEFAULT-INTERVAL
- :0
-DTSTART
- ;VALUE=DATE
- :20031002
-DTEND
- ;VALUE=DATE
- :20031003
-DTSTAMP
- :20040109T022324Z
-END:VEVENT
-BEGIN:VEVENT
-UID
- :FD5DF18A-B2A9-11D7-B3D4-0050E4C50C66
-SUMMARY
- :Darkness Falls\n\n
-CLASS
- :PUBLIC
-X-MOZILLA-RECUR-DEFAULT-INTERVAL
- :0
-DTSTART
- ;VALUE=DATE
- :20030828
-DTEND
- ;VALUE=DATE
- :20030829
-DTSTAMP
- :20040109T022212Z
-END:VEVENT
-BEGIN:VEVENT
-UID
- :01822D56-B2AA-11D7-B3D4-0050E4C50C66
-SUMMARY
- :Finding Nemo
-CLASS
- :PUBLIC
-X-MOZILLA-RECUR-DEFAULT-INTERVAL
- :0
-DTSTART
- ;VALUE=DATE
- :20030828
-DTEND
- ;VALUE=DATE
- :20030829
-DTSTAMP
- :20040109T022156Z
-END:VEVENT
-BEGIN:VEVENT
-UID
- :045BC2BB-B2AA-11D7-B3D4-0050E4C50C66
-SUMMARY
- :A Guy Thing\n\n
-CLASS
- :PUBLIC
-X-MOZILLA-RECUR-DEFAULT-INTERVAL
- :0
-DTSTART
- ;VALUE=DATE
- :20030828
-DTEND
- ;VALUE=DATE
- :20030829
-DTSTAMP
- :20040109T022159Z
-END:VEVENT
-BEGIN:VEVENT
-UID
- :104F57E9-B2AB-11D7-B3D4-0050E4C50C66
-SUMMARY
- :Hollywood Homicide
-CLASS
- :PUBLIC
-X-MOZILLA-RECUR-DEFAULT-INTERVAL
- :0
-DTSTART
- ;VALUE=DATE
- :20030904
-DTEND
- ;VALUE=DATE
- :20030905
-DTSTAMP
- :20040109T022218Z
-END:VEVENT
-BEGIN:VEVENT
-UID
- :25FEE878-B2AB-11D7-B3D4-0050E4C50C66
-SUMMARY
- :Ghosts of the Abyss-\n
-CLASS
- :PUBLIC
-X-MOZILLA-RECUR-DEFAULT-INTERVAL
- :0
-DTSTART
- ;VALUE=DATE
- :20030904
-DTEND
- ;VALUE=DATE
- :20030905
-DTSTAMP
- :20040109T022222Z
-END:VEVENT
-BEGIN:VEVENT
-UID
- :766EFCB6-B2AB-11D7-B3D4-0050E4C50C66
-SUMMARY
- :Legally Blonde 2-
-URL
- :http://www.movie-list.com/trailers.php?id=legallyblonde2
-CLASS
- :PUBLIC
-X-MOZILLA-RECUR-DEFAULT-INTERVAL
- :0
-DTSTART
- ;VALUE=DATE
- :20030911
-DTEND
- ;VALUE=DATE
- :20030912
-DTSTAMP
- :20040109T022234Z
-END:VEVENT
-BEGIN:VEVENT
-UID
- :7EE175DC-B2AB-11D7-B3D4-0050E4C50C66
-SUMMARY
- :Pirates of the Carribean
-URL
- :http://www.movie-list.com/trailers.php?id=piratesofthecaribbean
-CLASS
- :PUBLIC
-X-MOZILLA-RECUR-DEFAULT-INTERVAL
- :0
-DTSTART
- ;VALUE=DATE
- :20030911
-DTEND
- ;VALUE=DATE
- :20030912
-DTSTAMP
- :20040109T022239Z
-END:VEVENT
-BEGIN:VEVENT
-UID
- :AE93963E-B2AB-11D7-B3D4-0050E4C50C66
-SUMMARY
- :Bad Boys 2
-URL
- :http://www.movie-list.com/trailers.php?id=badboys2
-CLASS
- :PUBLIC
-X-MOZILLA-RECUR-DEFAULT-INTERVAL
- :0
-DTSTART
- ;VALUE=DATE
- :20030918
-DTEND
- ;VALUE=DATE
- :20030919
-DTSTAMP
- :20040109T022247Z
-END:VEVENT
-BEGIN:VEVENT
-UID
- :B8CB65AA-B2AB-11D7-B3D4-0050E4C50C66
-SUMMARY
- :Tomb Raider 2
-URL
- :http://www.movie-list.com/trailers.php?id=tombraider2
-CLASS
- :PUBLIC
-X-MOZILLA-RECUR-DEFAULT-INTERVAL
- :0
-DTSTART
- ;VALUE=DATE
- :20030925
-DTEND
- ;VALUE=DATE
- :20030926
-DTSTAMP
- :20040109T022313Z
-END:VEVENT
-BEGIN:VEVENT
-UID
- :42536AD3-B770-11D7-8FBE-0050E4C50C66
-SUMMARY
- :Agent Cody Banks -
-URL
- :http://www.movie-list.com/trailers.php?id=agentcodybanks
-CLASS
- :PUBLIC
-X-MOZILLA-RECUR-DEFAULT-INTERVAL
- :0
-DTSTART
- ;VALUE=DATE
- :20030925
-DTEND
- ;VALUE=DATE
- :20030926
-DTSTAMP
- :20040109T022254Z
-END:VEVENT
-BEGIN:VEVENT
-UID
- :45F049D0-B770-11D7-8FBE-0050E4C50C66
-SUMMARY
- :Dumb and Dumberer
-URL
- :http://www.movie-list.com/trailers.php?id=whenharrymetlloyd
-CLASS
- :PUBLIC
-X-MOZILLA-RECUR-DEFAULT-INTERVAL
- :0
-DTSTART
- ;VALUE=DATE
- :20031211
-DTEND
- ;VALUE=DATE
- :20031212
-DTSTAMP
- :20040114T130855Z
-END:VEVENT
-BEGIN:VEVENT
-UID
- :505AD1EE-B770-11D7-8FBE-0050E4C50C66
-SUMMARY
- :Freaky Friday
-URL
- :http://www.movie-list.com/trailers.php?id=freakyfriday
-CLASS
- :PUBLIC
-X-MOZILLA-RECUR-DEFAULT-INTERVAL
- :0
-DTSTART
- ;VALUE=DATE
- :20030925
-DTEND
- ;VALUE=DATE
- :20030926
-DTSTAMP
- :20040109T022259Z
-END:VEVENT
-BEGIN:VEVENT
-UID
- :534E394A-B770-11D7-8FBE-0050E4C50C66
-SUMMARY
- :How to Deal -
-URL
- :http://www.movie-list.com/trailers.php?id=howtodeal
-CLASS
- :PUBLIC
-X-MOZILLA-RECUR-DEFAULT-INTERVAL
- :0
-DTSTART
- ;VALUE=DATE
- :20031106
-DTEND
- ;VALUE=DATE
- :20031107
-DTSTAMP
- :20040109T022601Z
-END:VEVENT
-BEGIN:VEVENT
-UID
- :61483E80-B770-11D7-8FBE-0050E4C50C66
-SUMMARY
- :28 Days Later
-CLASS
- :PUBLIC
-X-MOZILLA-RECUR-DEFAULT-INTERVAL
- :0
-DTSTART
- ;VALUE=DATE
- :20030904
-DTEND
- ;VALUE=DATE
- :20030905
-DTSTAMP
- :20040109T022227Z
-END:VEVENT
-BEGIN:VEVENT
-UID
- :791FB42F-B770-11D7-8FBE-0050E4C50C66
-SUMMARY
- :Matchstick Men\n
-URL
- :http://www.movie-list.com/m/matchstickmen.shtml
-CLASS
- :PUBLIC
-X-MOZILLA-RECUR-DEFAULT-INTERVAL
- :0
-DTSTART
- ;VALUE=DATE
- :20031002
-DTEND
- ;VALUE=DATE
- :20031003
-DTSTAMP
- :20040109T022331Z
-END:VEVENT
-BEGIN:VEVENT
-UID
- :9AB21C3C-B770-11D7-8FBE-0050E4C50C66
-SUMMARY
- :Head of State \n
-URL
- :http://www.movie-list.com/h/headofstate.shtml
-CLASS
- :PUBLIC
-X-MOZILLA-RECUR-DEFAULT-INTERVAL
- :0
-DTSTART
- ;VALUE=DATE
- :20031016
-DTEND
- ;VALUE=DATE
- :20031017
-DTSTAMP
- :20040109T022355Z
-END:VEVENT
-BEGIN:VEVENT
-UID
- :C21710F8-B770-11D7-8FBE-0050E4C50C66
-SUMMARY
- :Le Divorce
-URL
- :http://www.movie-list.com/trailers.php?id=ledivorce
-CLASS
- :PUBLIC
-X-MOZILLA-RECUR-DEFAULT-INTERVAL
- :0
-DTSTART
- ;VALUE=DATE
- :20031106
-DTEND
- ;VALUE=DATE
- :20031107
-DTSTAMP
- :20040109T022612Z
-END:VEVENT
-BEGIN:VEVENT
-UID
- :C8BAEA5A-B770-11D7-8FBE-0050E4C50C66
-SUMMARY
- :Alex and Emma -
-URL
- :http://www.movie-list.com/trailers.php?id=alexandemma
-CLASS
- :PUBLIC
-X-MOZILLA-RECUR-DEFAULT-INTERVAL
- :0
-DTSTART
- ;VALUE=DATE
- :20031016
-DTEND
- ;VALUE=DATE
- :20031017
-DTSTAMP
- :20040109T022400Z
-END:VEVENT
-BEGIN:VEVENT
-UID
- :CCF41603-B770-11D7-8FBE-0050E4C50C66
-SUMMARY
- :Kill Bill Volume 1
-URL
- :http://www.movie-list.com/k/killbill.shtml
-CLASS
- :PUBLIC
-X-MOZILLA-RECUR-DEFAULT-INTERVAL
- :0
-DTSTART
- ;VALUE=DATE
- :20031016
-DTEND
- ;VALUE=DATE
- :20031017
-DTSTAMP
- :20040109T022413Z
-END:VEVENT
-BEGIN:VEVENT
-UID
- :DBB76B96-B770-11D7-8FBE-0050E4C50C66
-SUMMARY
- :Intolerable Cruelty\n
-URL
- :http://www.movie-list.com/trailers.php?id=intolerablecruelty
-CLASS
- :PUBLIC
-X-MOZILLA-RECUR-DEFAULT-INTERVAL
- :0
-DTSTART
- ;VALUE=DATE
- :20031023
-DTEND
- ;VALUE=DATE
- :20031024
-DTSTAMP
- :20040109T022438Z
-END:VEVENT
-BEGIN:VEVENT
-UID
- :F52CF678-B770-11D7-8FBE-0050E4C50C66
-SUMMARY
- :Freddy vs Jason
-URL
- :http://www.movie-list.com/trailers.php?id=freddyvsjason
-CLASS
- :PUBLIC
-X-MOZILLA-RECUR-DEFAULT-INTERVAL
- :0
-DTSTART
- ;VALUE=DATE
- :20031023
-DTEND
- ;VALUE=DATE
- :20031024
-DTSTAMP
- :20040109T022444Z
-END:VEVENT
-BEGIN:VEVENT
-UID
- :FA8DB261-B770-11D7-8FBE-0050E4C50C66
-SUMMARY
- :Holes\n\n
-URL
- :http://www.movie-list.com/h/holes.shtml
-CLASS
- :PUBLIC
-X-MOZILLA-RECUR-DEFAULT-INTERVAL
- :0
-DTSTART
- ;VALUE=DATE
- :20031030
-DTEND
- ;VALUE=DATE
- :20031031
-DTSTAMP
- :20040109T022532Z
-END:VEVENT
-BEGIN:VEVENT
-UID
- :FD1D3D99-B770-11D7-8FBE-0050E4C50C66
-SUMMARY
- :Runaway Jury
-URL
- :http://www.movie-list.com/r/runawayjury.shtml
-CLASS
- :PUBLIC
-X-MOZILLA-RECUR-DEFAULT-INTERVAL
- :0
-DTSTART
- ;VALUE=DATE
- :20031030
-DTEND
- ;VALUE=DATE
- :20031031
-DTSTAMP
- :20040109T022544Z
-END:VEVENT
-BEGIN:VEVENT
-UID
- :58C64DE8-B771-11D7-8FBE-0050E4C50C66
-SUMMARY
- :Elf
-URL
- :http://elfmovie.com/
-CLASS
- :PUBLIC
-X-MOZILLA-RECUR-DEFAULT-INTERVAL
- :0
-DTSTART
- ;VALUE=DATE
- :20031127
-DTEND
- ;VALUE=DATE
- :20031128
-DTSTAMP
- :20040114T130827Z
-END:VEVENT
-BEGIN:VEVENT
-UID
- :5FDE5542-B771-11D7-8FBE-0050E4C50C66
-SUMMARY
- :Nicholas Nickleby
-URL
- :http://us.imdb.com/title/tt0309912/
-CLASS
- :PUBLIC
-X-MOZILLA-RECUR-DEFAULT-INTERVAL
- :0
-DTSTART
- ;VALUE=DATE
- :20031120
-DTEND
- ;VALUE=DATE
- :20031121
-DTSTAMP
- :20040109T023356Z
-END:VEVENT
-BEGIN:VEVENT
-UID
- :64F4869C-B771-11D7-8FBE-0050E4C50C66
-SUMMARY
- :Seabiscuit
-URL
- :http://www.movie-list.com/trailers.php?id=seabiscuit
-CLASS
- :PUBLIC
-X-MOZILLA-RECUR-DEFAULT-INTERVAL
- :0
-DTSTART
- ;VALUE=DATE
- :20031113
-DTEND
- ;VALUE=DATE
- :20031114
-DTSTAMP
- :20040109T022652Z
-END:VEVENT
-BEGIN:VEVENT
-UID
- :69083917-B771-11D7-8FBE-0050E4C50C66
-SUMMARY
- :The Honourable Wally Newman
-CLASS
- :PUBLIC
-X-MOZILLA-RECUR-DEFAULT-INTERVAL
- :0
-DTSTART
- ;VALUE=DATE
- :20031113
-DTEND
- ;VALUE=DATE
- :20031114
-DTSTAMP
- :20040109T022644Z
-END:VEVENT
-BEGIN:VEVENT
-UID
- :76FA9A76-B771-11D7-8FBE-0050E4C50C66
-SUMMARY
- :Mystic River
-DESCRIPTION
- :Mystic River explores the dark\, interwoven history of three men 
- and their families coming to terms with a brutal murder on the mean 
- streets of south Boston...
-URL
- :http://us.imdb.com/title/tt0327056/
-CLASS
- :PUBLIC
-X-MOZILLA-RECUR-DEFAULT-INTERVAL
- :0
-DTSTART
- ;VALUE=DATE
- :20031120
-DTEND
- ;VALUE=DATE
- :20031121
-DTSTAMP
- :20040109T023422Z
-END:VEVENT
-BEGIN:VEVENT
-UID
- :991DA2D2-B771-11D7-8FBE-0050E4C50C66
-SUMMARY
- :School of Rock
-URL
- :http://us.imdb.com/title/tt0332379/
-CLASS
- :PUBLIC
-X-MOZILLA-RECUR-DEFAULT-INTERVAL
- :0
-DTSTART
- ;VALUE=DATE
- :20031120
-DTEND
- ;VALUE=DATE
- :20031121
-DTSTAMP
- :20040109T023448Z
-END:VEVENT
-BEGIN:VEVENT
-UID
- :C0C9EF5C-B771-11D7-8FBE-0050E4C50C66
-SUMMARY
- :Brother Bear
-URL
- :http://disney.go.com/disneypictures/brotherbear/
-CLASS
- :PUBLIC
-X-MOZILLA-RECUR-DEFAULT-INTERVAL
- :0
-DTSTART
- ;VALUE=DATE
- :20031226
-DTEND
- ;VALUE=DATE
- :20031227
-DTSTAMP
- :20040130T022151Z
-END:VEVENT
-BEGIN:VEVENT
-UID
- :DD1A2D8E-B788-11D7-98AE-0050E4C50C66
-SUMMARY
- :Mr and
-CLASS
- :PUBLIC
-X-MOZILLA-RECUR-DEFAULT-INTERVAL
- :0
-DTSTART
- :20030731T230000
-DTEND
- :20030801T000000
-DTSTAMP
- :20030716T122737Z
-END:VEVENT
-BEGIN:VEVENT
-UID
- :E77268CA-B788-11D7-98AE-0050E4C50C66
-SUMMARY
- :Mr
-CLASS
- :PUBLIC
-X-MOZILLA-RECUR-DEFAULT-INTERVAL
- :0
-DTSTART
- :20030731T230000
-DTEND
- :20030801T000000
-DTSTAMP
- :20030716T122750Z
-END:VEVENT
-BEGIN:VEVENT
-UID
- :EDA9BFBC-B788-11D7-98AE-0050E4C50C66
-SUMMARY
- :New Event
-CLASS
- :PUBLIC
-X-MOZILLA-RECUR-DEFAULT-INTERVAL
- :0
-DTSTART
- :20030731T230000
-DTEND
- :20030801T000000
-DTSTAMP
- :20030716T122756Z
-END:VEVENT
-BEGIN:VEVENT
-UID
- :531D2DE2-B78A-11D7-98AE-0050E4C50C66
-SUMMARY
- :Rugrats Go Wild -
-URL
- :http://www.movie-list.com/trailers.php?id=rugratsgowild
-CLASS
- :PUBLIC
-X-MOZILLA-RECUR-DEFAULT-INTERVAL
- :0
-DTSTART
- ;VALUE=DATE
- :20030925
-DTEND
- ;VALUE=DATE
- :20030926
-DTSTAMP
- :20040109T022304Z
-END:VEVENT
-BEGIN:VEVENT
-UID
- :C5CEA534-B78A-11D7-98AE-0050E4C50C66
-SUMMARY
- :The Wannabes
-CLASS
- :PUBLIC
-X-MOZILLA-RECUR-DEFAULT-INTERVAL
- :0
-DTSTART
- ;VALUE=DATE
- :20030925
-DTEND
- ;VALUE=DATE
- :20030926
-DTSTAMP
- :20040109T022318Z
-END:VEVENT
-BEGIN:VEVENT
-UID
- :75AA4E8E-B78B-11D7-98AE-0050E4C50C66
-SUMMARY
- :Gettin' Square
-CLASS
- :PUBLIC
-X-MOZILLA-RECUR-DEFAULT-INTERVAL
- :0
-DTSTART
- ;VALUE=DATE
- :20031009
-DTEND
- ;VALUE=DATE
- :20031010
-DTSTAMP
- :20040109T022341Z
-END:VEVENT
-BEGIN:VEVENT
-UID
- :E77DA524-B78B-11D7-98AE-0050E4C50C66
-SUMMARY
- :Underworld
-URL
- :http://www.movie-list.com/trailers.php?id=underworld
-CLASS
- :PUBLIC
-X-MOZILLA-RECUR-DEFAULT-INTERVAL
- :0
-DTSTART
- ;VALUE=DATE
- :20040122
-DTEND
- ;VALUE=DATE
- :20040123
-DTSTAMP
- :20040209T220323Z
-END:VEVENT
-BEGIN:VEVENT
-UID
- :16D3301C-B78D-11D7-98AE-0050E4C50C66
-SUMMARY
- :Medallion\, The\n
-URL
- :http://www.movie-list.com/trailers.php?id=medallion
-CLASS
- :PUBLIC
-X-MOZILLA-RECUR-DEFAULT-INTERVAL
- :0
-DTSTART
- ;VALUE=DATE
- :20031030
-DTEND
- ;VALUE=DATE
- :20031031
-DTSTAMP
- :20040109T022453Z
-END:VEVENT
-BEGIN:VEVENT
-UID
- :B8A6A612-B78D-11D7-98AE-0050E4C50C66
-SUMMARY
- :Matrix Revolutions -
-URL
- :http://www.movie-list.com/trailers.php?id=matrixrevolutions
-CLASS
- :PUBLIC
-X-MOZILLA-RECUR-DEFAULT-INTERVAL
- :0
-DTSTART
- ;VALUE=DATE
- :20031106
-DTEND
- ;VALUE=DATE
- :20031107
-DTSTAMP
- :20040109T022605Z
-END:VEVENT
-BEGIN:VEVENT
-UID
- :346534FC-B78E-11D7-98AE-0050E4C50C66
-SUMMARY
- :Uptown Girls
-URL
- :http://us.imdb.com/title/tt0263757/
-CLASS
- :PUBLIC
-X-MOZILLA-RECUR-DEFAULT-INTERVAL
- :0
-DTSTART
- ;VALUE=DATE
- :20031120
-DTEND
- ;VALUE=DATE
- :20031121
-DTSTAMP
- :20040109T023331Z
-END:VEVENT
-BEGIN:VEVENT
-UID
- :6ED80E14-B78E-11D7-98AE-0050E4C50C66
-SUMMARY
- :One Perfect Day
-DESCRIPTION
- :Dan Spielman\, Leanna Walsman\, Kerry Armstrong\, Abbie Cornish. 
- D: Paul Currie (debut). One perfect day tells the story of a 22 year 
- old musical prodigy\, Tommy Matisse (Dan Spielman) who embarks on 
- a journey of self-discovery as he confronts his own beliefs to seek 
- answers relating to his sister???s life and death. \n\n\"grooves 
- to a dynamic\, passionate and electric beat\, whilst never speaking 
- down to the niche youth-audience it???s targeted at. \" - moviehole
-LOCATION
- :Kerry Armstrong\, Dan Spielman\, Directed by Paul Currie.
-URL
- :http://www.movie-list.com/trailers.php?id=oneperfectday
-CLASS
- :PUBLIC
-X-MOZILLA-RECUR-DEFAULT-INTERVAL
- :0
-DTSTART
- ;VALUE=DATE
- :20040219
-DTEND
- ;VALUE=DATE
- :20040220
-DTSTAMP
- :20040205T080939Z
-END:VEVENT
-BEGIN:VEVENT
-UID
- :9C3EDDE0-B78E-11D7-98AE-0050E4C50C66
-SUMMARY
- :Sin Eater\, The
-DESCRIPTION
- :A young conflicted NY priest\, Alex       Bermier (Ledger)\, helps 
- a female detective\, Lucy Sinclair (Sossamon)\,       investigating 
- the case of the French ambassador\, whose corpse was covered  with 
- mysterious religious symbols written in Aramaic.\n\n\"A supernaturally 
- silly drama about priests\, exorcism\, sin-eaters and Heath Ledger 
- struggling with such pious problems as how to keep his fake Euro accent 
- in place.\"\n-- Jami Bernard\, NEW YORK NEWS
-LOCATION
- :Heath Ledger\, Shannyn Sossamon\, Mark Addy\, Directed by Brian 
- Helgeland
-URL
- :http://www.movie-list.com/trailers.php?id=order
-CLASS
- :PUBLIC
-X-MOZILLA-RECUR-DEFAULT-INTERVAL
- :0
-DTSTART
- ;VALUE=DATE
- :20040219
-DTEND
- ;VALUE=DATE
- :20040220
-DTSTAMP
- :20040108T084618Z
-END:VEVENT
-BEGIN:VEVENT
-UID
- :2DADD58E-B78F-11D7-98AE-0050E4C50C66
-SUMMARY
- :Good Boy
-URL
- :http://www.movie-list.com/trailers.php?id=goodboy
-CLASS
- :PUBLIC
-X-MOZILLA-RECUR-DEFAULT-INTERVAL
- :0
-DTSTART
- ;VALUE=DATE
- :20031127
-DTEND
- ;VALUE=DATE
- :20031128
-DTSTAMP
- :20040114T130823Z
-END:VEVENT
-BEGIN:VEVENT
-UID
- :EAFC91EC-B7FB-11D7-98AE-0050E4C50C66
-SUMMARY
- :Master and Commander
-URL
- :http://darkhorizons.com/2003/masterandcommander.php
-CLASS
- :PUBLIC
-X-MOZILLA-RECUR-DEFAULT-INTERVAL
- :0
-DTSTART
- ;VALUE=DATE
- :20031204
-DTEND
- ;VALUE=DATE
- :20031205
-DTSTAMP
- :20040114T130844Z
-END:VEVENT
-BEGIN:VEVENT
-UID
- :F973724C-B7FB-11D7-98AE-0050E4C50C66
-SUMMARY
- :Looney Tunes: Back in Action
-URL
- :http://darkhorizons.com/2003/looneytunesbackinaction.php
-CLASS
- :PUBLIC
-X-MOZILLA-RECUR-DEFAULT-INTERVAL
- :0
-DTSTART
- ;VALUE=DATE
- :20031211
-DTEND
- ;VALUE=DATE
- :20031212
-DTSTAMP
- :20040114T130917Z
-END:VEVENT
-BEGIN:VEVENT
-UID
- :07D52B50-B7FC-11D7-98AE-0050E4C50C66
-SUMMARY
- :Welcome to the Jungle aka The Run Down
-LOCATION
- :Seann William Scott\, Christopher Walker\, Rosario Dawson.
-URL
- :http://www.therundown.com/
-CLASS
- :PUBLIC
-X-MOZILLA-RECUR-DEFAULT-INTERVAL
- :0
-DTSTART
- ;VALUE=DATE
- :20040101
-DTEND
- ;VALUE=DATE
- :20040102
-DTSTAMP
- :20040204T061117Z
-END:VEVENT
-BEGIN:VEVENT
-UID
- :2145281F-B7FC-11D7-98AE-0050E4C50C66
-SUMMARY
- :Lord of the Rings: The Return of the King\n
-DESCRIPTION
- :\n
-URL
- :http://www.lordoftherings.net/
-CLASS
- :PUBLIC
-X-MOZILLA-RECUR-DEFAULT-INTERVAL
- :0
-DTSTART
- ;VALUE=DATE
- :20031226
-DTEND
- ;VALUE=DATE
- :20031227
-DTSTAMP
- :20040130T022141Z
-END:VEVENT
-BEGIN:VEVENT
-UID
- :28C20E2A-B7FC-11D7-98AE-0050E4C50C66
-SUMMARY
- :Love Actually
-URL
- :http://www.loveactually.com/
-CLASS
- :PUBLIC
-X-MOZILLA-RECUR-DEFAULT-INTERVAL
- :0
-DTSTART
- ;VALUE=DATE
- :20031226
-DTEND
- ;VALUE=DATE
- :20031227
-DTSTAMP
- :20040130T022145Z
-END:VEVENT
-BEGIN:VEVENT
-UID
- :2FFB536A-B7FC-11D7-98AE-0050E4C50C66
-SUMMARY
- :Peter Pan
-CLASS
- :PUBLIC
-X-MOZILLA-RECUR-DEFAULT-INTERVAL
- :0
-DTSTART
- ;VALUE=DATE
- :20031218
-DTEND
- ;VALUE=DATE
- :20031219
-DTSTAMP
- :20040130T022130Z
-END:VEVENT
-BEGIN:VEVENT
-UID
- :9F5865BE-B7FF-11D7-A7B3-0050E4C50C66
-SUMMARY
- :Spy Kids 3D
-LOCATION
- :Sylvester Stallone\, Directed by Michael Rodriguez
-URL
- :http://www.movie-list.com/trailers.php?id=spykids3
-CLASS
- :PUBLIC
-X-MOZILLA-RECUR-DEFAULT-INTERVAL
- :0
-DTSTART
- ;VALUE=DATE
- :20040101
-DTEND
- ;VALUE=DATE
- :20040102
-DTSTAMP
- :20040204T061122Z
-END:VEVENT
-BEGIN:VEVENT
-UID
- :A39CAC56-B7FF-11D7-A7B3-0050E4C50C66
-SUMMARY
- :Cold Mountain
-URL
- :http://www.apple.com/trailers/miramax/cold_mountain/
-CLASS
- :PUBLIC
-X-MOZILLA-RECUR-DEFAULT-INTERVAL
- :0
-DTSTART
- ;VALUE=DATE
- :20040101
-DTEND
- ;VALUE=DATE
- :20040102
-DTSTAMP
- :20040204T061203Z
-END:VEVENT
-BEGIN:VEVENT
-UID
- :B5CE8E4C-B7FF-11D7-A7B3-0050E4C50C66
-SUMMARY
- :The Last Samurai
-DESCRIPTION
- :Set in Japan during the 1870s\, The Last Samurai tells the story 
- of Capt. Nathan Algren (Tom Cruise)\, an American military officer 
- hired by the Emperor of Japan to train the country's first army in 
- the art of modern warfare.????\n\n\"Great to look at and respectful 
- of its subject matter\, this is an epic with excitement\, brains 
- and heart.\"\n-- Brian Webster\, APOLLO GUIDE\n
-URL
- :http://www.movie-list.com/trailers.php?id=lastsamurai
-CLASS
- :PUBLIC
-X-MOZILLA-RECUR-DEFAULT-INTERVAL
- :0
-DTSTART
- ;VALUE=DATE
- :20040115
-DTEND
- ;VALUE=DATE
- :20040116
-DTSTAMP
- :20040108T075642Z
-END:VEVENT
-BEGIN:VEVENT
-UID
- :BCF496E0-B7FF-11D7-A7B3-0050E4C50C66
-SUMMARY
- :Cheaper By The Dozen
-URL
- :http://us.imdb.com/title/tt0349205/
-CLASS
- :PUBLIC
-X-MOZILLA-RECUR-DEFAULT-INTERVAL
- :0
-DTSTART
- ;VALUE=DATE
- :20040108
-DTEND
- ;VALUE=DATE
- :20040109
-DTSTAMP
- :20040204T061710Z
-END:VEVENT
-BEGIN:VEVENT
-UID
- :E61FB149-B803-11D7-A7B3-0050E4C50C66
-SUMMARY
- :Sylvia
-DESCRIPTION
- :Director Christine Jeffs takes the heartbreaking story of writer Sylvia 
- Plath's life and suicide (which has taken on mythological significance 
- in certain literary circles) and renders it in a palette of surprising 
- beauty. ??\n\n\"Sylvia delves into the tawdry details\, which 
- give the movie all the power of ... a daytime soap.\"\n-- Gary Thompson
-LOCATION
- :Gwyneth Paltrow\, Daniel Craig\, Michael Gambon\, Jared Harris\, 
- Blythe
-URL
- :http://www.movie-list.com/trailers.php?id=sylvia
-CLASS
- :PUBLIC
-X-MOZILLA-RECUR-DEFAULT-INTERVAL
- :0
-DTSTART
- ;VALUE=DATE
- :20040129
-DTEND
- ;VALUE=DATE
- :20040130
-DTSTAMP
- :20040108T080633Z
-END:VEVENT
-BEGIN:VEVENT
-UID
- :E8D2A882-B803-11D7-A7B3-0050E4C50C66
-SUMMARY
- :Texas Chainsaw Massacre\, The
-URL
- :http://us.imdb.com/title/tt0324216/
-CLASS
- :PUBLIC
-X-MOZILLA-RECUR-DEFAULT-INTERVAL
- :0
-DTSTART
- ;VALUE=DATE
- :20031120
-DTEND
- ;VALUE=DATE
- :20031121
-DTSTAMP
- :20040109T023538Z
-END:VEVENT
-BEGIN:VEVENT
-UID
- :F4D3A90A-B826-11D7-BABE-0050E4C50C66
-SUMMARY
- :Oceans 12
-CLASS
- :PUBLIC
-X-MOZILLA-RECUR-DEFAULT-INTERVAL
- :0
-DTSTART
- ;VALUE=DATE
- :20041226
-DTEND
- ;VALUE=DATE
- :20041227
-DTSTAMP
- :20030717T071928Z
-END:VEVENT
-BEGIN:VEVENT
-UID
- :F80AB0BC-B2A9-11D7-B3D4-0050E4C50C66
-SUMMARY
- :In Laws
-CLASS
- :PUBLIC
-X-MOZILLA-RECUR-DEFAULT-INTERVAL
- :0
-DTSTART
- ;VALUE=DATE
- :20030828
-DTEND
- ;VALUE=DATE
- :20030829
-DTSTAMP
- :20040109T022205Z
-END:VEVENT
-BEGIN:VEVENT
-UID
- :9A6C34F6-BDA4-11D7-8992-0050E4C50C66
-SUMMARY
- :S.W.A.T
-URL
- :http://www.movie-list.com/trailers.php?id=swat
-CLASS
- :PUBLIC
-X-MOZILLA-RECUR-DEFAULT-INTERVAL
- :0
-DTSTART
- ;VALUE=DATE
- :20031127
-DTEND
- ;VALUE=DATE
- :20031128
-DTSTAMP
- :20040114T130832Z
-END:VEVENT
-BEGIN:VEVENT
-UID
- :2A57D4DB-BDA5-11D7-8992-0050E4C50C66
-SUMMARY
- :Scary Movie 3
-DESCRIPTION
- :\n
-CLASS
- :PUBLIC
-X-MOZILLA-RECUR-DEFAULT-INTERVAL
- :0
-DTSTART
- ;VALUE=DATE
- :20031211
-DTEND
- ;VALUE=DATE
- :20031212
-DTSTAMP
- :20040130T022418Z
-END:VEVENT
-BEGIN:VEVENT
-UID
- :0B18064D-BDA6-11D7-8992-0050E4C50C66
-SUMMARY
- :Timeline
-LOCATION
- :Paul Walker\, Frances O'Connor\nDirected by Richard Donner
-URL
- :http://www.movie-list.com/trailers.php?id=timeline
-CLASS
- :PUBLIC
-X-MOZILLA-RECUR-DEFAULT-INTERVAL
- :0
-DTSTART
- ;VALUE=DATE
- :20040205
-DTEND
- ;VALUE=DATE
- :20040206
-DTSTAMP
- :20040314T025056Z
-END:VEVENT
-BEGIN:VEVENT
-UID
- :22028875-C883-11D7-947E-0050E4C50C66
-SUMMARY
- :Something's Gotta Give
-URL
- :http://us.imdb.com/title/tt0337741/
-CLASS
- :PUBLIC
-X-MOZILLA-RECUR-DEFAULT-INTERVAL
- :0
-DTSTART
- ;VALUE=DATE
- :20040108
-DTEND
- ;VALUE=DATE
- :20040109
-DTSTAMP
- :20040204T061705Z
-END:VEVENT
-BEGIN:VEVENT
-UID
- :368C4524-CF02-11D7-B1B3-0050E4C50C66
-SUMMARY
- :Big Fish
-LOCATION
- :Ewan McGregor\, Albert Finney\, Jessica Lange\, Danny DeVito\, 
- Helena Bonham Carter. Director: Tim Burton
-URL
- :http://www.apple.com/trailers/sony_pictures/big_fish/
-CLASS
- :PUBLIC
-X-MOZILLA-RECUR-DEFAULT-INTERVAL
- :0
-DTSTART
- ;VALUE=DATE
- :20040205
-DTEND
- ;VALUE=DATE
- :20040206
-DTSTAMP
- :20040314T025100Z
-END:VEVENT
-BEGIN:VEVENT
-UID
- :12BDC0F4-D520-11D7-9509-0050E4C50C66
-SUMMARY
- :Honey
-URL
- :http://us.imdb.com/title/tt0322589/
-CLASS
- :PUBLIC
-X-MOZILLA-RECUR-DEFAULT-INTERVAL
- :0
-DTSTART
- ;VALUE=DATE
- :20040108
-DTEND
- ;VALUE=DATE
- :20040109
-DTSTAMP
- :20040204T061702Z
-END:VEVENT
-BEGIN:VEVENT
-UID
- :B6B19FAC-DBA6-11D7-B8AE-0050E4C50C66
-SUMMARY
- :Once Upon a Time in Mexico
-LOCATION
- :Antonio Banderas\, Johnny Depp\, Salma Hayek\nDirected by Robert 
- Rodriguez
-URL
- :http://www.movie-list.com/trailers.php?id=onceuponatimeinmexico
-CLASS
- :PUBLIC
-X-MOZILLA-RECUR-DEFAULT-INTERVAL
- :0
-DTSTART
- ;VALUE=DATE
- :20040226
-DTEND
- ;VALUE=DATE
- :20040227
-DTSTAMP
- :20040314T025015Z
-END:VEVENT
-BEGIN:VEVENT
-UID
- :98BACC62-DBA8-11D7-B8AE-0050E4C50C66
-SUMMARY
- :Stuck On You
-LOCATION
- :Matt Damon\, Greg Kinnear\, Directed by the Farrelly brothers
-URL
- :http://www.movie-list.com/s/stuckonyou.shtml
-CLASS
- :PUBLIC
-X-MOZILLA-RECUR-DEFAULT-INTERVAL
- :0
-DTSTART
- ;VALUE=DATE
- :20040212
-DTEND
- ;VALUE=DATE
- :20040213
-DTSTAMP
- :20040314T025133Z
-END:VEVENT
-BEGIN:VEVENT
-UID
- :C42C607A-DBA9-11D7-B8AE-0050E4C50C66
-SUMMARY
- :Veronica Guerin
-LOCATION
- :Cate Blanchett\, Gerard McSorley\, Ciaran Hinds\nDirected by Joel 
- Schumacher
-URL
- :http://www.movie-list.com/v/veronicaguerin.shtml
-CLASS
- :PUBLIC
-X-MOZILLA-RECUR-DEFAULT-INTERVAL
- :0
-DTSTART
- ;VALUE=DATE
- :20040115
-DTEND
- ;VALUE=DATE
- :20040116
-DTSTAMP
- :20040225T234607Z
-END:VEVENT
-BEGIN:VEVENT
-UID
- :4E766A8D-DBAA-11D7-B8AE-0050E4C50C66
-SUMMARY
- :Torque
-LOCATION
- :Ice Cube\, Jay Hernandez\, Dane Cook\,Jaime Pressly\, Faizon Love
-URL
- :http://www.movie-list.com/trailers.php?id=torque
-CLASS
- :PUBLIC
-X-MOZILLA-RECUR-DEFAULT-INTERVAL
- :0
-DTSTART
- ;VALUE=DATE
- :20040122
-DTEND
- ;VALUE=DATE
- :20040123
-DTSTAMP
- :20040209T220343Z
-END:VEVENT
-BEGIN:VEVENT
-UID
- :E078BC0A-DBAA-11D7-B8AE-0050E4C50C66
-SUMMARY
- :Out of Time
-LOCATION
- :Denzel Washington\; Sanaa Lathan\; Dean Cain\; Eva Mendes\; Alex 
- Carter
-URL
- :http://www.movie-list.com/o/outoftime.shtml
-CLASS
- :PUBLIC
-X-MOZILLA-RECUR-DEFAULT-INTERVAL
- :0
-DTSTART
- ;VALUE=DATE
- :20040129
-DTEND
- ;VALUE=DATE
- :20040130
-DTSTAMP
- :20040314T025047Z
-END:VEVENT
-BEGIN:VEVENT
-UID
- :D8D78EC3-E0FD-11D7-8420-0050E4C50C66
-SUMMARY
- :Fellowship of the ring : Extended Edition
-URL
- :http://www.lordoftherings.net/
-CLASS
- :PUBLIC
-X-MOZILLA-RECUR-DEFAULT-INTERVAL
- :0
-DTSTART
- ;VALUE=DATE
- :20031211
-DTEND
- ;VALUE=DATE
- :20031212
-DTSTAMP
- :20040114T130858Z
-END:VEVENT
-BEGIN:VEVENT
-UID
- :A045EA5E-E0FE-11D7-8420-0050E4C50C66
-SUMMARY
- :Two Towers: Extended Edition
-CLASS
- :PUBLIC
-X-MOZILLA-RECUR-DEFAULT-INTERVAL
- :0
-DTSTART
- ;VALUE=DATE
- :20031218
-DTEND
- ;VALUE=DATE
- :20031219
-DTSTAMP
- :20040130T022135Z
-END:VEVENT
-BEGIN:VEVENT
-UID
- :2A68E47E-E29A-11D7-8F13-0050E4C50C66
-SUMMARY
- :dr parikh
-CLASS
- :PUBLIC
-X-MOZILLA-RECUR-DEFAULT-INTERVAL
- :0
-DTSTART
- :20030910T111500
-DTEND
- :20030910T121500
-DTSTAMP
- :20030909T074953Z
-END:VEVENT
-BEGIN:VEVENT
-UID
- :AD39AA27-EAB4-11D7-A5A2-0050E4C50C66
-SUMMARY
- :Calendar Girls\n
-URL
- :http://www.movie-list.com/trailers.php?id=calendargirls
-CLASS
- :PUBLIC
-X-MOZILLA-RECUR-DEFAULT-INTERVAL
- :0
-DTSTART
- ;VALUE=DATE
- :20031009
-DTEND
- ;VALUE=DATE
- :20031010
-DTSTAMP
- :20040109T022346Z
-END:VEVENT
-BEGIN:VEVENT
-UID
- :91FC077E-EAB5-11D7-A5A2-0050E4C50C66
-SUMMARY
- :Cabin Fever
-URL
- :http://www.movie-list.com/trailers.php?id=cabinfever
-CLASS
- :PUBLIC
-X-MOZILLA-RECUR-DEFAULT-INTERVAL
- :0
-DTSTART
- ;VALUE=DATE
- :20031204
-DTEND
- ;VALUE=DATE
- :20031205
-DTSTAMP
- :20040114T130838Z
-END:VEVENT
-BEGIN:VEVENT
-UID
- :2E3A3E44-EAB7-11D7-A5A2-0050E4C50C66
-SUMMARY
- :In America
-LOCATION
- :Paddy Considine\, director: Jim Sheridan
-URL
- :http://www.movie-list.com/i/inamerica.shtml
-CLASS
- :PUBLIC
-X-MOZILLA-RECUR-DEFAULT-INTERVAL
- :0
-DTSTART
- ;VALUE=DATE
- :20040122
-DTEND
- ;VALUE=DATE
- :20040123
-DTSTAMP
- :20040209T222558Z
-END:VEVENT
-BEGIN:VEVENT
-UID
- :0554DF6E-F290-11D7-A47E-0050E4C50C66
-SUMMARY
- :Mambo Italiano
-URL
- :http://www.movie-list.com/trailers.php?id=mamboitaliano
-CLASS
- :PUBLIC
-X-MOZILLA-RECUR-DEFAULT-INTERVAL
- :0
-DTSTART
- ;VALUE=DATE
- :20031023
-DTEND
- ;VALUE=DATE
- :20031024
-DTSTAMP
- :20040109T022422Z
-END:VEVENT
-BEGIN:VEVENT
-UID
- :E29DDEAA-F491-11D7-A522-0050E4C50C66
-SUMMARY
- :Laurel Canyon\n
-URL
- :http://www.apple.com/trailers/sony/laurel_canyon.html
-CLASS
- :PUBLIC
-X-MOZILLA-RECUR-DEFAULT-INTERVAL
- :0
-DTSTART
- ;VALUE=DATE
- :20031030
-DTEND
- ;VALUE=DATE
- :20031031
-DTSTAMP
- :20040109T022524Z
-END:VEVENT
-BEGIN:VEVENT
-UID
- :8CCBA852-F492-11D7-A522-0050E4C50C66
-SUMMARY
- :Jet Lag
-URL
- :http://www.apple.com/trailers/miramax/jet_lag.html
-CLASS
- :PUBLIC
-X-MOZILLA-RECUR-DEFAULT-INTERVAL
- :0
-DTSTART
- ;VALUE=DATE
- :20031030
-DTEND
- ;VALUE=DATE
- :20031031
-DTSTAMP
- :20040109T022512Z
-END:VEVENT
-BEGIN:VEVENT
-UID
- :27DDCB52-F493-11D7-A522-0050E4C50C66
-SUMMARY
- :Formula 51
-URL
- :http://www.apple.com/trailers/columbia/formula_51/
-CLASS
- :PUBLIC
-X-MOZILLA-RECUR-DEFAULT-INTERVAL
- :0
-DTSTART
- ;VALUE=DATE
- :20031030
-DTEND
- ;VALUE=DATE
- :20031031
-DTSTAMP
- :20040109T022503Z
-END:VEVENT
-BEGIN:VEVENT
-UID
- :C37782F9-F493-11D7-A522-0050E4C50C66
-SUMMARY
- :In the Cut \n
-URL
- :http://www.movie-list.com/trailers.php?id=inthecut
-CLASS
- :PUBLIC
-X-MOZILLA-RECUR-DEFAULT-INTERVAL
- :0
-DTSTART
- ;VALUE=DATE
- :20031113
-DTEND
- ;VALUE=DATE
- :20031114
-DTSTAMP
- :20040109T022648Z
-END:VEVENT
-BEGIN:VEVENT
-UID
- :E0956030-F4A9-11D7-A522-0050E4C50C66
-SUMMARY
- :Lost in Translation
-URL
- :http://www.focusfeatures.com/
-CLASS
- :PUBLIC
-X-MOZILLA-RECUR-DEFAULT-INTERVAL
- :0
-DTSTART
- ;VALUE=DATE
- :20031226
-DTEND
- ;VALUE=DATE
- :20031227
-DTSTAMP
- :20040130T022200Z
-END:VEVENT
-BEGIN:VEVENT
-UID
- :21429594-FAE1-11D7-B0FA-000A958D1EFE
-SUMMARY
- :Alien: Director's Cut
-URL
- :http://www.apple.com/trailers/fox/alien_25/
-CLASS
- :PUBLIC
-X-MOZILLA-RECUR-DEFAULT-INTERVAL
- :0
-DTSTART
- ;VALUE=DATE
- :20031113
-DTEND
- ;VALUE=DATE
- :20031114
-DTSTAMP
- :20040109T022629Z
-END:VEVENT
-BEGIN:VEVENT
-UID
- :CF4F742C-FAE1-11D7-B0FA-000A958D1EFE
-SUMMARY
- :Misadventures in 3d (IMAX)
-DESCRIPTION
- :A sequel to nWave's 'Encounter in the Third Dimension' (1999)\, dealing 
- with the groundbreaking nature of large format 3D cinema. The first 
- episode was a comedy about the history of 3D cinema. Encounter II 
- deals with the future of the format.
-CLASS
- :PUBLIC
-X-MOZILLA-RECUR-DEFAULT-INTERVAL
- :0
-DTSTART
- ;VALUE=DATE
- :20031120
-DTEND
- ;VALUE=DATE
- :20031121
-DTSTAMP
- :20031110T031429Z
-END:VEVENT
-BEGIN:VEVENT
-UID
- :E572A6EC-FAE4-11D7-B0FA-000A958D1EFE
-SUMMARY
- :Brown Sugar
-URL
- :http://www2.foxsearchlight.com/brownsugar/
-CLASS
- :PUBLIC
-X-MOZILLA-RECUR-DEFAULT-INTERVAL
- :0
-DTSTART
- ;VALUE=DATE
- :20031211
-DTEND
- ;VALUE=DATE
- :20031212
-DTSTAMP
- :20040114T130902Z
-END:VEVENT
-BEGIN:VEVENT
-UID
- :62CCA3E4-FAE7-11D7-B0FA-000A958D1EFE
-SUMMARY
- :Bright Young Things
-URL
- :http://iconmovies.co.uk/brightyoungthings/
-CLASS
- :PUBLIC
-X-MOZILLA-RECUR-DEFAULT-INTERVAL
- :0
-DTSTART
- ;VALUE=DATE
- :20031226
-DTEND
- ;VALUE=DATE
- :20031227
-DTSTAMP
- :20040130T022148Z
-END:VEVENT
-BEGIN:VEVENT
-UID
- :9987E6F8-FAEC-11D7-B0FA-000A958D1EFE
-SUMMARY
- :Camp
-DESCRIPTION
- : Todd Graff's crowd-pleasing directorial debut pays tribute to summer 
- camps\, musical theatre\, and Stephen Sondheim. \n\n\"The combination 
- of sap\, echoes of truth\, and lots of razzle-dazzle\, song-and-dance 
- is lethal.\"\n-- Thom Fowler\, HOLLYWOOD BITCHSLAP
-URL
- :http://www.apple.com/trailers/independent/camp.html
-CLASS
- :PUBLIC
-X-MOZILLA-RECUR-DEFAULT-INTERVAL
- :0
-DTSTART
- ;VALUE=DATE
- :20040304
-DTEND
- ;VALUE=DATE
- :20040305
-DTSTAMP
- :20040130T013949Z
-END:VEVENT
-BEGIN:VEVENT
-UID
- :D1CF26D2-FAED-11D7-B0FA-000A958D1EFE
-SUMMARY
- :Along Came Polly
-URL
- :http://www.apple.com/trailers/universal/along_came_polly/
-CLASS
- :PUBLIC
-X-MOZILLA-RECUR-DEFAULT-INTERVAL
- :0
-DTSTART
- ;VALUE=DATE
- :20040122
-DTEND
- ;VALUE=DATE
- :20040123
-DTSTAMP
- :20040209T220334Z
-END:VEVENT
-BEGIN:VEVENT
-UID
- :B5CAFE48-FF86-11D7-8061-000A958D1EFE
-SUMMARY
- :Raising Victor Vargas -
-URL
- :http://www.apple.com/trailers/samuel_goldwyn/raising_victor_vargas.html
-CLASS
- :PUBLIC
-X-MOZILLA-RECUR-DEFAULT-INTERVAL
- :0
-DTSTART
- ;VALUE=DATE
- :20031023
-DTEND
- ;VALUE=DATE
- :20031024
-DTSTAMP
- :20040109T022427Z
-END:VEVENT
-BEGIN:VEVENT
-UID
- :F5178AE8-090B-11D8-B1DB-000A958D1EFE
-SUMMARY
- :Step Into Liquid
-URL
- :http://www.apple.com/trailers/artisan/step_into_liquid/
-CLASS
- :PUBLIC
-X-MOZILLA-RECUR-DEFAULT-INTERVAL
- :0
-DTSTART
- ;VALUE=DATE
- :20040115
-DTEND
- ;VALUE=DATE
- :20040116
-DTSTAMP
- :20040225T234600Z
-END:VEVENT
-BEGIN:VEVENT
-UID
- :EB1CF48C-0D34-11D8-9D9F-000A958D1EFE
-SUMMARY
- :Dickie Roberts\, Former Child Star
-DESCRIPTION
- :In the reverse rags-to-riches story of DICKIE ROBERTS: FORMER CHILD 
- STAR\, writer/actor David Spade's string of infectious laughs turn 
- into waves of compassion. \n\n\"Just a platform for Spade to tell 
- smutty jokes to kids\, fall off bicycles\, puncture waterbeds\, 
- and\, oh yes\, learn the real meaning of family.\"\n-- David Edelstein\,
-  SLATE
-LOCATION
- :David Spade\; Craig Bierko\; Jenna Boyd\; Jon Lovitz\; Mary McCormack
-URL
- :http://www.movie-list.com/trailers.php?id=dickieroberts
-CLASS
- :PUBLIC
-X-MOZILLA-RECUR-DEFAULT-INTERVAL
- :0
-DTSTART
- ;VALUE=DATE
- :20040219
-DTEND
- ;VALUE=DATE
- :20040220
-DTSTAMP
- :20040205T080741Z
-END:VEVENT
-BEGIN:VEVENT
-UID
- :5C7F689A-0D35-11D8-9D9F-000A958D1EFE
-SUMMARY
- :Jeepers Creepers 2
-URL
- :http://www.movie-list.com/trailers.php?id=jeeperscreepers2
-CLASS
- :PUBLIC
-X-MOZILLA-RECUR-DEFAULT-INTERVAL
- :0
-DTSTART
- ;VALUE=DATE
- :20040205
-DTEND
- ;VALUE=DATE
- :20040206
-DTSTAMP
- :20040314T025104Z
-END:VEVENT
-BEGIN:VEVENT
-UID
- :F1818C74-0D35-11D8-9D9F-000A958D1EFE
-SUMMARY
- :Big Bounce
-DESCRIPTION
- :Set on Hawaii's stunning North Shore\, a charismatic drifter (Owen 
- Wilson) forms a dubious alliance with a powerful local businessman 
- (Morgan Freeman) while hooking up with a criminally-minded seductress 
- (Sara Foster) to double-cross a wealthy developer (Gary Sinise) and 
- his cohorts (Charlie Sheen).\n\n\"A travelogue pretending to be 
- a movie.\"\n-- Chauncey Mabe\, SOUTH FLORIDA SUN-SENTINEL
-LOCATION
- :Owen Wilson\, Morgan Freeman\, Gary Sinise\, Charlie Sheen\, Sara 
- Foster. Director: George Armitage
-URL
- :http://www.movie-list.com/trailers.php?id=bigbounce
-CLASS
- :PUBLIC
-X-MOZILLA-RECUR-DEFAULT-INTERVAL
- :0
-DTSTART
- ;VALUE=DATE
- :20040311
-DTEND
- ;VALUE=DATE
- :20040312
-DTSTAMP
- :20040205T081925Z
-END:VEVENT
-BEGIN:VEVENT
-UID
- :18D1C4EE-0D36-11D8-9D9F-000A958D1EFE
-SUMMARY
- :Drumline
-LOCATION
- :Orlando Jones\, Director: Charles Stone
-URL
- :http://www.movie-list.com/d/drumline.shtml
-CLASS
- :PUBLIC
-X-MOZILLA-RECUR-DEFAULT-INTERVAL
- :0
-DTSTART
- ;VALUE=DATE
- :20040212
-DTEND
- ;VALUE=DATE
- :20040213
-DTSTAMP
- :20040314T025116Z
-END:VEVENT
-BEGIN:VEVENT
-UID
- :C33B96EE-0D9E-11D8-9D9F-000A958D1EFE
-SUMMARY
- :Open Range
-LOCATION
- :Kevin Costner\; Annette Bening\; Abraham Benrubi\; Robert Duvall\; 
- Michael Gambon. Director: Kevin Costner
-URL
- :http://www.movie-list.com/trailers.php?id=openrange
-CLASS
- :PUBLIC
-X-MOZILLA-RECUR-DEFAULT-INTERVAL
- :0
-DTSTART
- ;VALUE=DATE
- :20040212
-DTEND
- ;VALUE=DATE
- :20040213
-DTSTAMP
- :20040314T025147Z
-END:VEVENT
-BEGIN:VEVENT
-UID
- :97C0E9FE-0D9F-11D8-9D9F-000A958D1EFE
-SUMMARY
- :Shattered Glass
-LOCATION
- :Hayden Christensen\, Chloe Sevigny\, Hank Azaria\, Rosario Dawson\, 
- Maggie Gyllenhaal
-URL
- :http://www.movie-list.com/trailers.php?id=shatteredglass
-CLASS
- :PUBLIC
-X-MOZILLA-RECUR-DEFAULT-INTERVAL
- :0
-DTSTART
- ;VALUE=DATE
- :20040212
-DTEND
- ;VALUE=DATE
- :20040213
-DTSTAMP
- :20040314T025129Z
-END:VEVENT
-BEGIN:VEVENT
-UID
- :C2679196-0D9F-11D8-9D9F-000A958D1EFE
-SUMMARY
- :Under the Tuscan Sun
-LOCATION
- :Diane Lane
-URL
- :http://tuscansun.movies.com/
-CLASS
- :PUBLIC
-X-MOZILLA-RECUR-DEFAULT-INTERVAL
- :0
-DTSTART
- ;VALUE=DATE
- :20040212
-DTEND
- ;VALUE=DATE
- :20040213
-DTSTAMP
- :20040314T025144Z
-END:VEVENT
-BEGIN:VEVENT
-UID
- :9924742C-0DA1-11D8-9D9F-000A958D1EFE
-SUMMARY
- :Mona Lisa Smile
-DESCRIPTION
- :Mike Newell's MONA LISA SMILE is a pretty period film that combines 
- a quaint pedagogical tale with a feminist dissection of traditional 
- female roles in 1950s society\n\n\"Newell tries to make a profound 
- film that challenges the social standards of the 1950s\, but all 
- he does is throw some stereotypes up against some other stereotypes.\"\n--
-  Josh Bell\, LAS VEGAS WEEKL
-LOCATION
- :Julia Roberts\, Maggie Gyllenhaal\, Kirsten Dunst
-URL
- :http://www.movie-list.com/trailers.php?id=monalisasmile
-CLASS
- :PUBLIC
-X-MOZILLA-RECUR-DEFAULT-INTERVAL
- :0
-DTSTART
- ;VALUE=DATE
- :20040219
-DTEND
- ;VALUE=DATE
- :20040220
-DTSTAMP
- :20040108T084057Z
-END:VEVENT
-BEGIN:VEVENT
-UID
- :7CE9491F-0DA2-11D8-9D9F-000A958D1EFE
-SUMMARY
- :Humain Stain\, the
-DESCRIPTION
- :The story of Coleman Silk (ANTHONY HOPKINS)\, a distinguished professor 
- at a prestigious New England college whose professional life is shattered 
- by allegations of racism and whose personal life is infected with 
- the cancer of a lie he has been living for fifty years.??\"All the 
- talent and expertise has resulted in a film that\, while poised and 
- beautifully crafted\, is emotionally detached and remote.\"\n-- 
- Frank Swietek\, ONE GUY'S OPINION
-URL
- :http://www.miramax.com/the_human_stain/
-CLASS
- :PUBLIC
-X-MOZILLA-RECUR-DEFAULT-INTERVAL
- :0
-DTSTART
- ;VALUE=DATE
- :20040304
-DTEND
- ;VALUE=DATE
- :20040305
-DTSTAMP
- :20031205T084858Z
-END:VEVENT
-BEGIN:VEVENT
-UID
- :1D1BC802-0DA3-11D8-9D9F-000A958D1EFE
-SUMMARY
- :Secondhand Lions
-LOCATION
- :Michael Caine\, Robert Duvall\, Haley Joel Osment\, Director: Tim 
- McCanlies
-URL
- :http://www.movie-list.com/trailers.php?id=secondhandlions
-CLASS
- :PUBLIC
-X-MOZILLA-RECUR-DEFAULT-INTERVAL
- :0
-DTSTART
- ;VALUE=DATE
- :20040226
-DTEND
- ;VALUE=DATE
- :20040227
-DTSTAMP
- :20040314T024958Z
-END:VEVENT
-BEGIN:VEVENT
-UID
- :F54CB761-0DA3-11D8-9D9F-000A958D1EFE
-SUMMARY
- :Ocean Wonderland 3D (IMAX)
-DESCRIPTION
- :\"Perfectly balances entertainment and nature-science elements in 
- its brisk and sometimes thrilling 46 minutes.\"\n-- Bruce Kirkland\, 
- JAM! MOVIES
-LOCATION
- :Narrated by Liam Neeson
-URL
- :http://us.imdb.com/title/tt0270291/
-CLASS
- :PUBLIC
-X-MOZILLA-RECUR-DEFAULT-INTERVAL
- :0
-DTSTART
- ;VALUE=DATE
- :20040219
-DTEND
- ;VALUE=DATE
- :20040220
-DTSTAMP
- :20040130T013352Z
-END:VEVENT
-BEGIN:VEVENT
-UID
- :6B2A061C-1A94-11D8-B19A-000A958D1EFE
-SUMMARY
- :Wonderland
-LOCATION
- :Val Kilmer\, Lisa Kudrow\, Kate Bosworth\, Josh Lucas\, Christina 
- Applegate
-URL
- :http://www.wonderlandthemovie.com/
-CLASS
- :PUBLIC
-X-MOZILLA-RECUR-DEFAULT-INTERVAL
- :0
-DTSTART
- ;VALUE=DATE
- :20040129
-DTEND
- ;VALUE=DATE
- :20040130
-DTSTAMP
- :20040314T025043Z
-END:VEVENT
-BEGIN:VEVENT
-UID
- :ADD125A8-23B5-11D8-AA82-000A958D1EFE
-SUMMARY
- :House of Sand and Fog
-LOCATION
- :Sir Ben Kingsley\, Jennifer Connelly\, Ron Eldard\, Shohreh Aghdashloo\,
-  Jonathan Ahdout
-URL
- :http://www.movie-list.com/trailers.php?id=houseofsandandfog
-CLASS
- :PUBLIC
-X-MOZILLA-RECUR-DEFAULT-INTERVAL
- :0
-DTSTART
- ;VALUE=DATE
- :20040212
-DTEND
- ;VALUE=DATE
- :20040213
-DTSTAMP
- :20040314T025140Z
-END:VEVENT
-BEGIN:VEVENT
-UID
- :FE08BDE5-26FF-11D8-AA82-000A958D1EFE
-SUMMARY
- :Fighting Temptations\, The
-DESCRIPTION
- :A New York advertising executive travels to a small Southern town 
- to collect an inheritance but finds he must create a gospel choir 
- and lead it to success before he can collect. \n\n\"When he's not 
- keening and shucking and jiving and behaving altogether spastically\, 
- Cuba kicks into full-on \"dramatic mode\" and the results are unquestionab
- ly more amusing.\"\n-- Scott Weinberg\,EFILMCRITIC.COM
-LOCATION
- :Cuba Gooding Jr\, Beyonce Knowles
-URL
- :http://www.apple.com/trailers/paramount/the_fighting_temptations/
-CLASS
- :PUBLIC
-X-MOZILLA-RECUR-DEFAULT-INTERVAL
- :0
-DTSTART
- ;VALUE=DATE
- :20040304
-DTEND
- ;VALUE=DATE
- :20040305
-DTSTAMP
- :20040205T081454Z
-END:VEVENT
-BEGIN:VEVENT
-UID
- :0CCE9724-2700-11D8-AA82-000A958D1EFE
-SUMMARY
- :Missing\, The
-DESCRIPTION
- :In 19th-century New Mexico\, a father (Tommy Lee Jones) comes back 
- home\, hoping to reconcile with his adult daughter Maggie (Cate Blanchett).
- \n\n??\"The movie can't overcome characterizations that are as 
- spare as the landscapes and a Searchers- like story line that just 
- isn't interesting enough to sustain interest over the course of 135 
- minutes.\"\n-- Glenn Whipp\, LOS ANGELES DAILY NEWS
-URL
- :http://darkhorizons.com/2003/missing.php
-CLASS
- :PUBLIC
-X-MOZILLA-RECUR-DEFAULT-INTERVAL
- :0
-DTSTART
- ;VALUE=DATE
- :20040304
-DTEND
- ;VALUE=DATE
- :20040305
-DTSTAMP
- :20040205T081434Z
-END:VEVENT
-BEGIN:VEVENT
-UID
- :CF4CF2A7-296A-11D8-965C-000A958D1EFE
-SUMMARY
- :Passion of the Christ\, The
-DESCRIPTION
- :A film detailing the final hours and crucifixion of Jesus Christ.. 
- directed by Mel Gibson. \n\n\"shouldn't be second-guessed with 
- religious or political agendas. It stands as a work of art\" - AICN
-LOCATION
- :James Caviezel\, Monica Belluci\, Directed by Mel Gibson
-URL
- :http://www.thepassionofthechrist.com/
-CLASS
- :PUBLIC
-X-MOZILLA-RECUR-DEFAULT-INTERVAL
- :0
-DTSTART
- ;VALUE=DATE
- :20040225
-DTEND
- ;VALUE=DATE
- :20040226
-DTSTAMP
- :20040108T085726Z
-END:VEVENT
-BEGIN:VEVENT
-UID
- :D9AEA84D-296B-11D8-965C-000A958D1EFE
-SUMMARY
- :Chasing Liberty
-DESCRIPTION
- :Tired of being followed around every moment of every day\, the 18-year-old 
- daughter of the president of the United States ditches her Secret 
- Service handlers and sets out on a romantic road trip through Europe 
- with her boyfriend.\n\n\"A fairly standard-issue teen romantic 
- comedy.\"\n-- James Berardinelli\,REELVIEWS
-LOCATION
- :Mandy Moore
-URL
- :http://www.movie-list.com/trailers.php?id=chasingliberty
-CLASS
- :PUBLIC
-X-MOZILLA-RECUR-DEFAULT-INTERVAL
- :0
-DTSTART
- ;VALUE=DATE
- :20040408
-DTEND
- ;VALUE=DATE
- :20040409
-DTSTAMP
- :20040204T044958Z
-END:VEVENT
-BEGIN:VEVENT
-UID
- :DC36435A-30A0-11D8-B441-000A958D1EFE
-SUMMARY
- :Station Agent\, The
-LOCATION
- :Peter Dinklage\, Patricia Clarkson\, Bobby Cannavale\nDirected 
- by Tom McCarthy
-URL
- :http://www.movie-list.com/trailers.php?id=stationagent
-CLASS
- :PUBLIC
-X-MOZILLA-RECUR-DEFAULT-INTERVAL
- :0
-DTSTART
- ;VALUE=DATE
- :20040205
-DTEND
- ;VALUE=DATE
- :20040206
-DTSTAMP
- :20040314T025112Z
-END:VEVENT
-BEGIN:VEVENT
-UID
- :61A858A8-30A2-11D8-B441-000A958D1EFE
-SUMMARY
- :Pieces of April
-DESCRIPTION
- :Katie Holmes is outstanding as the title character in Peter Hedges's 
- PIECES OF APRIL. Holmes stars as April Burns\, the black sheep of 
- her family who has left suburbia for a Lower East Side tenement. ????\n\n\"
- Pieces of April feel less like a movie and more like a series of moments 
- in search of one.\"\n-- Kevin Smokler \, filmcritic.com
-LOCATION
- :Katie Holmes\, Patricia Clarkson\, Oliver Platt\nDirected by Peter 
- Hedges
-URL
- :http://www.piecesofaprilmovie.com/
-CLASS
- :PUBLIC
-X-MOZILLA-RECUR-DEFAULT-INTERVAL
- :0
-DTSTART
- ;VALUE=DATE
- :20040304
-DTEND
- ;VALUE=DATE
- :20040305
-DTSTAMP
- :20040121T075426Z
-END:VEVENT
-BEGIN:VEVENT
-UID
- :0AFD2D64-30A3-11D8-B441-000A958D1EFE
-SUMMARY
- :Agent Cody Banks 2: Destination London
-DESCRIPTION
- :Frankie Muniz returns as super cool spy Cody Banks in Agent Cody Banks 
- 2. In Cody's new adventure\, a rogue CIA agent has stolen a top secret 
- mind-control device and Cody has to go undercover in London to get 
- it back...
-LOCATION
- :Frankie Muniz\, Hilary Duff\, Angie Harmon\,Anthony Anderson\, 
- Cynthia Stevenson
-URL
- :http://www.futuresecretagent.com/
-CLASS
- :PUBLIC
-X-MOZILLA-RECUR-DEFAULT-INTERVAL
- :0
-DTSTART
- ;VALUE=DATE
- :20040318
-DTEND
- ;VALUE=DATE
- :20040319
-DTSTAMP
- :20040108T090338Z
-END:VEVENT
-BEGIN:VEVENT
-UID
- :E4E935F6-30A3-11D8-B441-000A958D1EFE
-SUMMARY
- :Paycheck
-DESCRIPTION
- :Based on the short story by Philip K. Dick\, \"Paycheck\" is about 
- world famous genius Michael Jennings (Ben Affleck)\, who does specialized 
- projects for high-tech corporations...\n\n????\"Sadly\, the once 
- glowing Hollywood promise of Ben Affleck and director John Woo has 
- gradually given way to good paycheck hunting.\"\n-- Todd Gilchrist\,FILMS
- TEW.COM\n
-LOCATION
- :Ben Affleck\, Aaron Eckhart\, Uma Thurman\,Kathryn Morris\, directed 
- by John Woo
-URL
- :http://www.movie-list.com/trailers.php?id=paycheck
-CLASS
- :PUBLIC
-X-MOZILLA-RECUR-DEFAULT-INTERVAL
- :0
-DTSTART
- ;VALUE=DATE
- :20040318
-DTEND
- ;VALUE=DATE
- :20040319
-DTSTAMP
- :20040108T090715Z
-END:VEVENT
-BEGIN:VEVENT
-UID
- :4E52DE4B-3B43-11D8-9EA1-000A958D1EFE
-SUMMARY
- :Gothika
-DESCRIPTION
- :A brilliant and respected criminal psychologist\, Dr. Miranda Grey 
- (HALLE BERRY) is an expert at knowing what is rational.. What is sane. 
- But Miranda's comfortable marriage and stable life are thrust into 
- terrifying jeopardy after a cryptic encounter with a mysterious young 
- girl leads to a nightmare beyond her wildest imagination.\n\n\"Dwells 
- in its own abysmal dreariness without creating real suspense\, relying 
- instead on a stream of easy shocks to convince us that we're watching 
- a scary movie.\"\n-- Erich Scholz\, CITYSEARCH
-LOCATION
- :Halle Berry\, Robert Downey Jr\,
-URL
- :http://www.movie-list.com/trailers.php?id=gothika
-CLASS
- :PUBLIC
-X-MOZILLA-RECUR-DEFAULT-INTERVAL
- :0
-DTSTART
- ;VALUE=DATE
- :20040429
-DTEND
- ;VALUE=DATE
- :20040430
-DTSTAMP
- :20040221T005140Z
-END:VEVENT
-BEGIN:VEVENT
-UID
- :AE628D2C-167E-11D8-9D6F-000A958D1EFE
-SUMMARY
- :Hidalgo
-DESCRIPTION
- :Based on the true story of the greatest long-distance horse race ever 
- run\, \"Hidalgo\" is an epic action-adventure and one man's journey 
- of personal redemption..
-LOCATION
- :Viggo Mortensen\, Omar Sharif\, Frank Collison\, Louise Lombard\, 
- Directed by Joe Johnston
-URL
- :http://www.movie-list.com/trailers.php?id=hidalgo
-CLASS
- :PUBLIC
-X-MOZILLA-RECUR-DEFAULT-INTERVAL
- :0
-DTSTART
- ;VALUE=DATE
- :20040318
-DTEND
- ;VALUE=DATE
- :20040319
-DTSTAMP
- :20040209T211727Z
-END:VEVENT
-BEGIN:VEVENT
-UID
- :B6C91881-090E-11D8-B1DB-000A958D1EFE
-SUMMARY
- :21 Grams
-LOCATION
- :Sean Penn\, Benicio Del Toro\,Naomi Watts\, Directed by Alejandro 
- Gonzalez Inarritu
-URL
- :http://www.movie-list.com/trailers.php?id=21grams
-CLASS
- :PUBLIC
-X-MOZILLA-RECUR-DEFAULT-INTERVAL
- :0
-DTSTART
- ;VALUE=DATE
- :20040122
-DTEND
- ;VALUE=DATE
- :20040123
-DTSTAMP
- :20040209T220338Z
-END:VEVENT
-BEGIN:VEVENT
-UID
- :431667C9-41AA-11D8-8E3D-000A958D1EFE
-SUMMARY
- :Cat in the Hat
-DESCRIPTION
- :This adaptation of the classic children's book stars Mike Meyers (AUSTIN 
- POWERS) as the wily talking cat with a tall striped hat and more than 
- a few tricks up his sleeve.\n\n\"They missed the point\, But stole 
- the name / The real question today\, Is who to blame?\"\n-- Steven 
- Snyder\, ZERTINET MOVIES
-LOCATION
- :Mike Myers\, Alec Baldwin\,Kelly Preston. Directed by Bo Welch
-URL
- :http://www.movie-list.com/trailers.php?id=drseusscatinthehat
-CLASS
- :PUBLIC
-X-MOZILLA-RECUR-DEFAULT-INTERVAL
- :0
-DTSTART
- ;VALUE=DATE
- :20040401
-DTEND
- ;VALUE=DATE
- :20040402
-DTSTAMP
- :20040108T092136Z
-END:VEVENT
-BEGIN:VEVENT
-UID
- :C4C219E6-41AD-11D8-8E3D-000A958D1EFE
-SUMMARY
- :50 First Dates
-DESCRIPTION
- :Adam Sandler and Drew Barrymore star in this romantic comedy about 
- a man who has to make a woman fall in love with him everyday because 
- of the woman's short term memory lost...\n\n\"A terrible movie 
- by all reasonable standards -- yet it leaves a sweet taste.\"\n-- 
- Jami Bernard\, NEW YORK DAILY NEWS
-LOCATION
- :Adam Sandler\, Drew Barrymore\, Sean Astin\, Rob Schneider\,\nDirector:
-  Peter Segal
-URL
- :http://www.movie-list.com/trailers.php?id=50firstdates
-CLASS
- :PUBLIC
-X-MOZILLA-RECUR-DEFAULT-INTERVAL
- :0
-DTSTART
- ;VALUE=DATE
- :20040325
-DTEND
- ;VALUE=DATE
- :20040326
-DTSTAMP
- :20040221T005439Z
-END:VEVENT
-BEGIN:VEVENT
-UID
- :C35ABE14-167E-11D8-9D6F-000A958D1EFE
-SUMMARY
- :Haunted Mansion
-DESCRIPTION
- :Inspired by Disney's theme park attraction\,Haunted Mansion tells 
- the story of a man discovering how important his family is through 
- the intervention of a few ghosts\n\n??\"Mansion is everything we 
- fearedPirates [of the Caribbean] would be: gimmicky\, unimaginative\, 
- and shackled to its source like an anvil.\"\n-- Rob Vaux\, FLIPSIDE 
- MOVIE EMPORIUM
-LOCATION
- :Eddie Murphy\, Terence Stamp
-URL
- :http://www.movie-list.com/trailers.php?id=hauntedmansion
-CLASS
- :PUBLIC
-X-MOZILLA-RECUR-DEFAULT-INTERVAL
- :0
-DTSTART
- ;VALUE=DATE
- :20040325
-DTEND
- ;VALUE=DATE
- :20040326
-DTSTAMP
- :20040218T065453Z
-END:VEVENT
-BEGIN:VEVENT
-UID
- :C493A654-41AE-11D8-8E3D-000A958D1EFE
-SUMMARY
- :Scooby Doo 2 : Monster's Unleashed
-DESCRIPTION
- :The mysterious adventures of the five members of the Mystery\, Inc. 
- detective agency\, as they investigate the nefarious plans of an 
- anonymous masked villain who is plotting to take over control of the 
- city of Coolsville by wreaking mayhem with a monster machine that 
- recreates Mystery\, Inc.'s greatest classic foes.\n\n\"While Scooby 
- 2 is probably no worse or better than the first installment\, the 
- freshness has definitely worn off.\"\n-- John Monaghan\, DETROIT 
- FREE PRESS\n
-LOCATION
- :Freddie Prinze Jr. Sarah Michelle Gellar\, Matthew Lillard\, Seth 
- Green
-URL
- :http://www.movie-list.com/trailers.php?id=scoobydoo2
-CLASS
- :PUBLIC
-X-MOZILLA-RECUR-DEFAULT-INTERVAL
- :0
-DTSTART
- ;VALUE=DATE
- :20040401
-DTEND
- ;VALUE=DATE
- :20040402
-DTSTAMP
- :20040330T050612Z
-END:VEVENT
-BEGIN:VEVENT
-UID
- :B4A01ACE-0D32-11D8-9D9F-000A958D1EFE
-SUMMARY
- :Beyond Borders
-DESCRIPTION
- :Set against the backdrop of the world's most dangerous hot spots\, 
- this thrilling romantic adventure stars Academy Award winner Angelina 
- Jolie as Sarah Jordan\, a sheltered American socialite living in 
- London. \n\n\"The formula that gave life to such poignant and powerful 
- films as The Killing Fieldsand The Year of Living Dangerously this 
- time results in something closer to parody.\"\n-- Colin Covert\,MINNEAPOL
- IS STAR TRIBUNE
-LOCATION
- :Angelina Jolie\, Clive Owen\, Noah Emmerich. Directed by Martin 
- Campbell
-URL
- :http://www.movie-list.com/trailers.php?id=beyondborders
-CLASS
- :PUBLIC
-X-MOZILLA-RECUR-DEFAULT-INTERVAL
- :0
-DTSTART
- ;VALUE=DATE
- :20040318
-DTEND
- ;VALUE=DATE
- :20040319
-DTSTAMP
- :20040218T065356Z
-END:VEVENT
-BEGIN:VEVENT
-UID
- :12E42769-2B97-11D8-8F07-000A958D1EFE
-SUMMARY
- :Taking Lives
-DESCRIPTION
- :An FBI profiler is called in by French Canadian police to catch a 
- serial killer who takes on the identity of each new victim.\n\n??\"Jolie 
- is one of those actresses like Ashley Judd who are capable of giving 
- good performances in good movies\, but for undisclosed reasons have 
- decided not to.\"\n-- Rob Thomas\, CAPITAL TIMES (MADISON\, WI)
-LOCATION
- :Angelina Jolie\, Ethan Hawke\, Kiefer Sutherland
-URL
- :http://www.movie-list.com/trailers.php?id=takinglives
-CLASS
- :PUBLIC
-X-MOZILLA-RECUR-DEFAULT-INTERVAL
- :0
-DTSTART
- ;VALUE=DATE
- :20040415
-DTEND
- ;VALUE=DATE
- :20040416
-DTSTAMP
- :20040330T051329Z
-END:VEVENT
-BEGIN:VEVENT
-UID
- :504BD191-4BE9-11D8-A981-000A958D1EFE
-SUMMARY
- :Starsky and Hutch
-DESCRIPTION
- :Set in the 1970s in a metropolis called \"Bay City\,\" this is 
- the tale of two police detective partners\, Ken \"Hutch\" Hutchinson\, 
- and Dave Starsky\, telling the story of their first big case\, which 
- involved a former college campus drug dealer who went on to become 
- a white collar criminal.\n\n\"Starsky & Hutch is guilty pleasure 
- fun that just rolls along having a grand old time.\"\n-- Bob Bloom\, 
- JOURNAL AND COURIER (LAFAYETTE\, IN)
-LOCATION
- :Ben Stiller\, Owen Wilson\, Snoop Dogg\, Vince Vaughn\, Carmen 
- Electra\, Directed by Todd Phillips
-URL
- :http://www.movie-list.com/trailers.php?id=starskyandhutch
-CLASS
- :PUBLIC
-X-MOZILLA-RECUR-DEFAULT-INTERVAL
- :0
-DTSTART
- ;VALUE=DATE
- :20040408
-DTEND
- ;VALUE=DATE
- :20040409
-DTSTAMP
- :20040330T050923Z
-END:VEVENT
-BEGIN:VEVENT
-UID
- :2D448F3A-468D-11D8-A8A0-000A958D1EFE
-SUMMARY
- :Catch That Kid
-DESCRIPTION
- :A remake of the Danish blockbuster \"Klatretosen\,\" MISSION WITHOUT 
- PERMISSION is an action-packed caper that revolves around a youngster 
- who\, with the help of two friends\, robs the state-of-the-art bank 
- where her mother works to acquire the cash needed for a costly operation 
- to save her ailing father...\n\n\"Another Spy Kids rip-off that???s 
- no great catch.\"\n-- Thomas Delapa\, BOULDER WEEKLY\n
-URL
- :http://www.movie-list.com/trailers.php?id=catchthatkid
-CLASS
- :PUBLIC
-X-MOZILLA-RECUR-DEFAULT-INTERVAL
- :0
-DTSTART
- ;VALUE=DATE
- :20040408
-DTEND
- ;VALUE=DATE
- :20040409
-DTSTAMP
- :20040330T050811Z
-END:VEVENT
-BEGIN:VEVENT
-UID
- :6ED0468A-2B95-11D8-8F07-000A958D1EFE
-SUMMARY
- :House of 1000 Corpses
-DESCRIPTION
- :An empty fuel tank and a flat tire lead two couples down a terror-riddled 
- road to the House of 1000 Corpses. \n\n\"Neither scary\, perversely 
- funny nor suspenseful\, this demented dung heap is not even inventively 
- gory.\"\n-- Megan Lehmann\, NEW YORK POST
-LOCATION
- :Bill Moseley\, Karen Black\,Chris Hardwick. Directed by Rob Zombie
-URL
- :http://www.movie-list.com/h/houseof1000corpses.shtml
-CLASS
- :PUBLIC
-X-MOZILLA-RECUR-DEFAULT-INTERVAL
- :0
-DTSTART
- ;VALUE=DATE
- :20040311
-DTEND
- ;VALUE=DATE
- :20040312
-DTSTAMP
- :20040130T014537Z
-END:VEVENT
-BEGIN:VEVENT
-UID
- :325B6BB5-52C6-11D8-B289-000A958D1EFE
-SUMMARY
- :Butterfly Effect\, The
-DESCRIPTION
- :A young man struggling with the psychological effects of sublimated 
- childhood memories devises a technique of traveling back in time to 
- inhabit his childhood body.\n\n\"It's as if [Kutcher] decided that 
- he would prove himself as a dramatic actor by trying out every clich??d 
- serious role in the history of cinema.\"\n-- Michael Agger\, SLATE
-LOCATION
- :Ashton Kutcher\, Amy Smart\,Eric Stoltz
-URL
- :http://www.movie-list.com/trailers.php?id=butterflyeffect
-CLASS
- :PUBLIC
-X-MOZILLA-RECUR-DEFAULT-INTERVAL
- :0
-DTSTART
- ;VALUE=DATE
- :20040311
-DTEND
- ;VALUE=DATE
- :20040312
-DTSTAMP
- :20040130T015204Z
-END:VEVENT
-BEGIN:VEVENT
-UID
- :E485B660-52C9-11D8-B289-000A958D1EFE
-SUMMARY
- :Eternal Sunshine Of The Spotless Mind
-DESCRIPTION
- :Joel (Jim Carrey) is stunned to discover that his girlfriend Clementine 
- (Kate Winslet) has had her memories of their tumultuous relationship 
- erased.
-LOCATION
- :Jim Carrey\, Kate Winslet. Directed by Michael Gondry.
-URL
- :http://www.movie-list.com/trailers.php?id=eternalsunshineofthespotlessmind
-CLASS
- :PUBLIC
-X-MOZILLA-RECUR-DEFAULT-INTERVAL
- :0
-DTSTART
- ;VALUE=DATE
- :20040422
-DTEND
- ;VALUE=DATE
- :20040423
-DTSTAMP
- :20040225T000906Z
-END:VEVENT
-BEGIN:VEVENT
-UID
- :AE5C078C-52CA-11D8-B289-000A958D1EFE
-SUMMARY
- :Perfect Score\, The
-DESCRIPTION
- :A group of seven high school seniors\, made up of two girls and five 
- boys\, decide to break into the Princeton Testing Center\, so they 
- can steal the answers to their upcoming SAT tests and all get perfect 
- scores.\n\n\"Like The Breakfast Club recast as a videogame for 
- simpletons.\"\n-- Owen Gleiberman\,ENTERTAINMENT WEEKLY
-URL
- :http://www.movie-list.com/trailers.php?id=perfectscore
-CLASS
- :PUBLIC
-X-MOZILLA-RECUR-DEFAULT-INTERVAL
- :0
-DTSTART
- ;VALUE=DATE
- :20040422
-DTEND
- ;VALUE=DATE
- :20040423
-DTSTAMP
- :20040130T022007Z
-END:VEVENT
-BEGIN:VEVENT
-UID
- :A10194B6-30A1-11D8-B441-000A958D1EFE
-SUMMARY
- :Grind
-URL
- :http://www.movie-list.com/trailers.php?id=grind
-CLASS
- :PUBLIC
-X-MOZILLA-RECUR-DEFAULT-INTERVAL
- :0
-DTSTART
- ;VALUE=DATE
- :20040226
-DTEND
- ;VALUE=DATE
- :20040227
-DTSTAMP
- :20040314T025009Z
-END:VEVENT
-BEGIN:VEVENT
-UID
- :CBE5867A-56D6-11D8-8E6C-000A958D1EFE
-SUMMARY
- :Billabong Odyssey
-DESCRIPTION
- :Surfing documentary.\n\n\"A dog's dinner of profiles\, repetitive 
- narration\, safety tips and banal 'insights' into the joys and dangers 
- of cresting waves that sometimes reach 70 feet.\"\n-- Megan Lehmann\, 
- NEW YORK POST
-URL
- :http://www.movie-list.com/trailers.php?id=billabongodyssey
-CLASS
- :PUBLIC
-X-MOZILLA-RECUR-DEFAULT-INTERVAL
- :0
-DTSTART
- ;VALUE=DATE
- :20040325
-DTEND
- ;VALUE=DATE
- :20040326
-DTSTAMP
- :20040318T111244Z
-END:VEVENT
-BEGIN:VEVENT
-UID
- :5BD3E8DC-0D34-11D8-9D9F-000A958D1EFE
-SUMMARY
- :Cooler\, The
-DESCRIPTION
- :Bernie Lootz (William H. Macy) is the unluckiest guy in Vegas. From 
- a failed marriage to an estranged son to a lost cat\, everything 
- Bernie touches turns bad. \n\n\"A movie perfectly written for the 
- look of William H. Macy.\"\n-- Chuck Schwartz\, CRANKY CRITIC&REG
-URL
- :http://www.movie-list.com/trailers.php?id=cooler
-CLASS
- :PUBLIC
-X-MOZILLA-RECUR-DEFAULT-INTERVAL
- :0
-DTSTART
- ;VALUE=DATE
- :20040415
-DTEND
- ;VALUE=DATE
- :20040416
-DTSTAMP
- :20040330T051335Z
-END:VEVENT
-BEGIN:VEVENT
-UID
- :266BE550-56D8-11D8-8E6C-000A958D1EFE
-SUMMARY
- :Strange Bedfellows
-URL
- :http://www.movie-list.com/trailers.php?id=strangebedfellows
-CLASS
- :PUBLIC
-X-MOZILLA-RECUR-DEFAULT-INTERVAL
- :0
-DTSTART
- ;VALUE=DATE
- :20040422
-DTEND
- ;VALUE=DATE
- :20040423
-DTSTAMP
- :20040318T183347Z
-END:VEVENT
-BEGIN:VEVENT
-UID
- :FF6C6F26-30A1-11D8-B441-000A958D1EFE
-SUMMARY
- :Welcome to Mooseport
-DESCRIPTION
- :A former U.S. president whose plan to retire in a small Northeastern 
- coastal town goes awry when he tries to fill an empty mayoral seat...
-LOCATION
- :Gene Hackman\, Ray Romano\, Marcia Gay Harden\, Maura Tierney
-URL
- :http://www.movie-list.com/trailers.php?id=welcometomooseport
-CLASS
- :PUBLIC
-X-MOZILLA-RECUR-DEFAULT-INTERVAL
- :0
-DTSTART
- ;VALUE=DATE
- :20040429
-DTEND
- ;VALUE=DATE
- :20040430
-DTSTAMP
- :20040204T061336Z
-END:VEVENT
-BEGIN:VEVENT
-UID
- :9E5FBB10-56D9-11D8-8E6C-000A958D1EFE
-SUMMARY
- :Connie and Carla
-DESCRIPTION
- :Two chanteuses working the dinner theater circuit in L.A. take an 
- undercover assignment\, posing as drag queens. Things get extra-weird 
- when a guy falls for one of the girls (as a guy?).
-LOCATION
- :Toni Collette\, David Duchovny
-CLASS
- :PUBLIC
-X-MOZILLA-RECUR-DEFAULT-INTERVAL
- :0
-DTSTART
- ;VALUE=DATE
- :20040429
-DTEND
- ;VALUE=DATE
- :20040430
-DTSTAMP
- :20040204T061634Z
-END:VEVENT
-BEGIN:VEVENT
-UID
- :73C5FE96-5B44-11D8-976E-000A958D1EFE
-SUMMARY
- :Monster
-DESCRIPTION
- :In a revelatory performance\, Charlize Theron stars in the shocking 
- and moving true-life story of Aileen Wuornos\, a prostitute executed 
- last year in Florida after being convicted of murdering six men.\n\n\"The
- re's Theron\, like a force of nature\, compelling us to go beyond 
- TV-movie supposition and look Wuornos straight in the eye.\"\n-- 
- Peter Travers\, ROLLING STONE
-LOCATION
- :Charlize Theron\, Christina Ricci\, Bruce Dern
-URL
- :http://www.movie-list.com/trailers.php?id=monster
-CLASS
- :PUBLIC
-X-MOZILLA-RECUR-DEFAULT-INTERVAL
- :0
-DTSTART
- ;VALUE=DATE
- :20040325
-DTEND
- ;VALUE=DATE
- :20040326
-DTSTAMP
- :20040213T075720Z
-END:VEVENT
-BEGIN:VEVENT
-UID
- :5CCFE05E-3B43-11D8-9EA1-000A958D1EFE
-SUMMARY
- :Young Black Stallion (IMAX)
-DESCRIPTION
- :In Disney's first dramatic feature made specifically for the giant 
- screen\, Walt Disney Pictures is proud to present the continuation 
- of a family favorite and a story that has enthralled generations of 
- readers.\n\n\"As with most IMAX pictures\, the spectacular presentation 
- is worth seeing\, although this time the cinematography is nearly 
- ruined by some spectacularly awful child acting.\"\n-- Jeffrey Westhoff\,
- NORTHWEST HERALD (CRYSTAL LAKE\, IL)
-URL
- :http://www.movie-list.com/trailers.php?id=youngblackstallion
-CLASS
- :PUBLIC
-X-MOZILLA-RECUR-DEFAULT-INTERVAL
- :0
-DTSTART
- ;VALUE=DATE
- :20040401
-DTEND
- ;VALUE=DATE
- :20040402
-DTSTAMP
- :20040209T212107Z
-END:VEVENT
-BEGIN:VEVENT
-UID
- :C83B05F5-5B46-11D8-976E-000A958D1EFE
-SUMMARY
- :Secret Window
-DESCRIPTION
- :Mort Rainey\, a writer just coming off of a troublesome divorce with 
- his ex-wife\, Amy\, finds himself stalked at his remote lake house 
- by a psychotic stranger who claims Mort stole his best story idea\, 
- changing just the ending.\n\n\"No matter how good Depp and Turturro 
- are\, no matter how pretty the cinematography??is...??there just 
- isn't any suspense or real interest in the story.\" - AICN
-LOCATION
- :Johnny Depp
-URL
- :http://www.movie-list.com/trailers.php?id=secretwindow
-CLASS
- :PUBLIC
-X-MOZILLA-RECUR-DEFAULT-INTERVAL
- :0
-DTSTART
- ;VALUE=DATE
- :20040408
-DTEND
- ;VALUE=DATE
- :20040409
-DTSTAMP
- :20040304T212514Z
-END:VEVENT
-BEGIN:VEVENT
-UID
- :A6DAFD22-4691-11D8-A8A0-000A958D1EFE
-SUMMARY
- :Win A Date With Tad Hamilton !
-DESCRIPTION
- :When a hot young actor\, Tad Hamilton agrees to participate in a 
- \"win a date\" contest to promote his new movie\, his world is 
- turned upside-down when he finds himself falling in love with the 
- winner\, a grocery store checkout girl from West Virginia named \n\n??\"
- A nice but inconsequential romancer.\"\n-- Robert Koehler\, VARIETY
-LOCATION
- :Kate Bosworth\, Topher Grace\,Nathan Lane. Directed by Robert Luketic
-URL
- :http://www.movie-list.com/trailers.php?id=winadatewithtadhamilton
-CLASS
- :PUBLIC
-X-MOZILLA-RECUR-DEFAULT-INTERVAL
- :0
-DTSTART
- ;VALUE=DATE
- :20040415
-DTEND
- ;VALUE=DATE
- :20040416
-DTSTAMP
- :20040209T213227Z
-END:VEVENT
-BEGIN:VEVENT
-UID
- :9E6AF11C-0DA2-11D8-9D9F-000A958D1EFE
-SUMMARY
- :Kill Bill volume 2
-DESCRIPTION
- :The Bride continues her vengeance quest against her ex-boss\, Bill\, 
- and his associates.
-LOCATION
- :Uma Thurman\, Lucy Liu\,David Carradine\, Directed by Quentin Tarantino
-URL
- :http://www.movie-list.com/trailers.php?id=killbill
-CLASS
- :PUBLIC
-X-MOZILLA-RECUR-DEFAULT-INTERVAL
- :0
-DTSTART
- ;VALUE=DATE
- :20040422
-DTEND
- ;VALUE=DATE
- :20040423
-DTSTAMP
- :20040209T213729Z
-END:VEVENT
-BEGIN:VEVENT
-UID
- :DBAA74C4-5B49-11D8-976E-000A958D1EFE
-SUMMARY
- :Twisted
-DESCRIPTION
- :In this thriller starring Ashley Judd\, a detective who is an expert 
- at profiling murderers finds herself stumped by a difficult case with 
- a killer who may actually be somebody she knows--and is coming after 
- her...\n
-LOCATION
- :Ashley Judd\, Samuel L. Jackson\, Andy Garcia\, D.W. Moffett\, 
- Mark Pellegrino
-URL
- :http://www.movie-list.com/trailers.php?id=twisted
-CLASS
- :PUBLIC
-X-MOZILLA-RECUR-DEFAULT-INTERVAL
- :0
-DTSTART
- ;VALUE=DATE
- :20040429
-DTEND
- ;VALUE=DATE
- :20040430
-DTSTAMP
- :20040209T215100Z
-END:VEVENT
-BEGIN:VEVENT
-UID
- :2EFCF209-5B4A-11D8-976E-000A958D1EFE
-SUMMARY
- :Van Helsing
-DESCRIPTION
- :Set in the late 19th century\, monster hunter Dr. Abraham Van Helsing 
- is summoned to a mysterious land in East Europe to vanquish evil forces... 
- evil forces with names like Count Dracula\, the Wolf Man\, and Frankenstei
- n's Monster.
-LOCATION
- :Hugh Jackman\, Kate Beckinsale\, Richard Roxburgh\, David Wenham. 
- Director: Stephen Sommers
-URL
- :http://www.movie-list.com/trailers.php?id=vanhelsing
-CLASS
- :PUBLIC
-X-MOZILLA-RECUR-DEFAULT-INTERVAL
- :0
-DTSTART
- ;VALUE=DATE
- :20040506
-DTEND
- ;VALUE=DATE
- :20040507
-DTSTAMP
- :20040209T215514Z
-END:VEVENT
-BEGIN:VEVENT
-UID
- :43BF518B-5B4B-11D8-976E-000A958D1EFE
-SUMMARY
- :You Got Served
-DESCRIPTION
- :Explores the social subculture of street dancing\, focusing on a 
- pair of friends\, David and Elgin\, who want to open their own hip-hop 
- dance and recording studio.\n\n\"On the checklist of things a movie 
- should offer\, like character development\, dialogue with subtext 
- and plausibility\, You Got Served is more like You Got Screwed.\"\n-- 
- Jami Bernard\, NEW YORK DAILY NEWS
-URL
- :http://www.movie-list.com/trailers.php?id=yougotserved
-CLASS
- :PUBLIC
-X-MOZILLA-RECUR-DEFAULT-INTERVAL
- :0
-DTSTART
- ;VALUE=DATE
- :20040617
-DTEND
- ;VALUE=DATE
- :20040618
-DTSTAMP
- :20040318T183544Z
-END:VEVENT
-BEGIN:VEVENT
-UID
- :624DB792-5DFA-11D8-A6BA-000A958D1EFE
-SUMMARY
- :Hebrew Hammer
-DESCRIPTION
- :Jefferson Carver\, also known as the Hebrew Hammer\, a private detective 
- who has an overbearing mother (Nora Dunn) and a propensity to whine 
- when things get difficult\n\n\"The corker-to-groaner ratio heavily 
- favors the latter as the bagel-and-dreidel jokes begin to lose their 
- spark\, as does the story.\"\n-- Robert Abele\, L.A. WEEKLY
-LOCATION
- :Adam Goldberg\, Andy Dick
-URL
- :http://www.movie-list.com/trailers.php?id=hebrewhammer
-CLASS
- :PUBLIC
-X-MOZILLA-RECUR-DEFAULT-INTERVAL
- :0
-DTSTART
- ;VALUE=DATE
- :20040325
-DTEND
- ;VALUE=DATE
- :20040326
-DTSTAMP
- :20040213T081228Z
-END:VEVENT
-BEGIN:VEVENT
-UID
- :0A76F396-5DFD-11D8-A6BA-000A958D1EFE
-SUMMARY
- :Company\, The
-DESCRIPTION
- :A look at the world of ballet.\n\n\"The experience will satisfy 
- ballet lovers more than film lovers.\"\n-- Jeffrey Westhoff\, NORTHWEST 
- HERALD (CRYSTAL LAKE\, IL
-LOCATION
- :Neve Campbell\, Malcolm McDowell\, James Franco\nDirected by Robert 
- Altman
-URL
- :http://www.movie-list.com/trailers.php?id=company
-CLASS
- :PUBLIC
-X-MOZILLA-RECUR-DEFAULT-INTERVAL
- :0
-DTSTART
- ;VALUE=DATE
- :20040513
-DTEND
- ;VALUE=DATE
- :20040514
-DTSTAMP
- :20040213T082211Z
-END:VEVENT
-BEGIN:VEVENT
-UID
- :93C449F0-5DFD-11D8-A6BA-000A958D1EFE
-SUMMARY
- :Troy
-DESCRIPTION
- :In 1193 B.C.\, Prince Paris of Troy stole the beautiful Greek woman\, 
- Helen\, away from her husband\, Menelaus\, the king of Sparta\, 
- setting the two nations at war with each other.
-LOCATION
- :Brad Pitt\, Eric Bana\, Orlando Bloom\, Diane Kruger\, Peter O'Toole. 
- Director: Wolfgang Petersen
-URL
- :http://www.movie-list.com/trailers.php?id=troy
-CLASS
- :PUBLIC
-X-MOZILLA-RECUR-DEFAULT-INTERVAL
- :0
-DTSTART
- ;VALUE=DATE
- :20040513
-DTEND
- ;VALUE=DATE
- :20040514
-DTSTAMP
- :20040213T082419Z
-END:VEVENT
-BEGIN:VEVENT
-UID
- :2B38D5E6-61DC-11D8-961E-000A958D1EFE
-SUMMARY
- :Scarface
-LOCATION
- :Al Pacino\, Steven Bauer\, Michelle Pfeiffer. Director: Brian De 
- Palma
-URL
- :http://www.movie-list.com/trailers.php?id=scarface
-CLASS
- :PUBLIC
-X-MOZILLA-RECUR-DEFAULT-INTERVAL
- :0
-DTSTART
- ;VALUE=DATE
- :20040226
-DTEND
- ;VALUE=DATE
- :20040227
-DTSTAMP
- :20040330T051600Z
-END:VEVENT
-BEGIN:VEVENT
-UID
- :AE93AE12-61DC-11D8-961E-000A958D1EFE
-SUMMARY
- :Solarmax (IMAX)
-DESCRIPTION
- :Documentary tells the story of humankind's struggle to understand 
- the sun.\n\n\"I thought I was back in grade school watching 'Our 
- Mister Sun.'\"\n-- Robert Roten\, LARAMIE MOVIE SCOPE
-CLASS
- :PUBLIC
-X-MOZILLA-RECUR-DEFAULT-INTERVAL
- :0
-DTSTART
- ;VALUE=DATE
- :20040318
-DTEND
- ;VALUE=DATE
- :20040319
-DTSTAMP
- :20040310T010350Z
-END:VEVENT
-BEGIN:VEVENT
-UID
- :767EA137-61DE-11D8-961E-000A958D1EFE
-SUMMARY
- :Against the Ropes
-DESCRIPTION
- :Jackie Kallen (Meg Ryan) knows a winner when she sees one. As soon 
- as she sees Luther Shaw in a fight\, Jackie knows he's a champion 
- in the raw\n\n\"Meg Ryan's swell\, but this \"Erin Rocky-vich\" 
- inspirational story lacks punch.\"\n-- Michael Rechtshaffen\, HOLLYWOOD 
- REPORTER
-LOCATION
- :Meg Ryan\; Omar Epps
-URL
- :http://www.movie-list.com/trailers.php?id=againsttheropes
-CLASS
- :PUBLIC
-X-MOZILLA-RECUR-DEFAULT-INTERVAL
- :0
-DTSTART
- ;VALUE=DATE
- :20040520
-DTEND
- ;VALUE=DATE
- :20040521
-DTSTAMP
- :20040218T065105Z
-END:VEVENT
-BEGIN:VEVENT
-UID
- :A6FA2BBC-2B96-11D8-8F07-000A958D1EFE
-SUMMARY
- :Thunderstruck
-DESCRIPTION
- :After a near death experience\, five Boys\, all devoted AC/DC fans\, 
- make a pact to bury their best friend next to the grave of Bon Scott. 
- 12 years later\, having gone their different ways\, they come together 
- to fulfill the promise.
-LOCATION
- :Roy Billing\, Stephen Curry\, Damon Gameau
-CLASS
- :PUBLIC
-X-MOZILLA-RECUR-DEFAULT-INTERVAL
- :0
-DTSTART
- ;VALUE=DATE
- :20040520
-DTEND
- ;VALUE=DATE
- :20040521
-DTSTAMP
- :20040218T065121Z
-END:VEVENT
-BEGIN:VEVENT
-UID
- :59E5182C-6218-11D8-961E-000A958D1EFE
-SUMMARY
- :New Event
-CLASS
- :PUBLIC
-X-MOZILLA-RECUR-DEFAULT-INTERVAL
- :0
-DTSTART
- :20040219T000000
-DTEND
- :20040219T010000
-DTSTAMP
- :20040218T134253Z
-END:VEVENT
-BEGIN:VEVENT
-UID
- :5CC87FFC-6407-11D8-AA60-000A958D1EFE
-SUMMARY
- :Evelyn
-DESCRIPTION
- :Desmond Doyle\, an Irishman whose troubles mount after his philandering 
- wife runs away with another man\, and now must fight to regain his 
- children\,\n\n\"It's that rare family movie -- genuine and sweet 
- without relying on animation or dumb humor.\"\n-- Mary F. Pols\, 
- CONTRA COSTA TIMES\n
-LOCATION
- :Pierce Brosnan\, Aidan Quinn. Directed by Bruce Beresford
-URL
- :http://www.movie-list.com/e/evelyn.shtml
-CLASS
- :PUBLIC
-X-MOZILLA-RECUR-DEFAULT-INTERVAL
- :0
-DTSTART
- ;VALUE=DATE
- :20040506
-DTEND
- ;VALUE=DATE
- :20040507
-DTSTAMP
- :20040221T004943Z
-END:VEVENT
-BEGIN:VEVENT
-UID
- :F002D124-6724-11D8-9A21-000A958D1EFE
-SUMMARY
- :Bon Voyage
-DESCRIPTION
- :At the start of World War II\, the fate of the free world hangs in 
- the balance at the posh Hotel Splendide in Bordeaux\n\n\"The bustling 
- structure keeps us gripped\, even though there's too much going on.\"\n--
-  Rich Cline\, SHADOWS ON THE WALL
-LOCATION
- :Rupert Everett\, Isabelle Adjani\, Virginie Ledoyen
-URL
- :http://www.movie-list.com/trailers.php?id=bonvoyage
-CLASS
- :PUBLIC
-X-MOZILLA-RECUR-DEFAULT-INTERVAL
- :0
-DTSTART
- ;VALUE=DATE
- :20040527
-DTEND
- ;VALUE=DATE
- :20040528
-DTSTAMP
- :20040225T000026Z
-END:VEVENT
-BEGIN:VEVENT
-UID
- :9F593EEE-6725-11D8-9A21-000A958D1EFE
-SUMMARY
- :Day After Tomorrow\, The
-DESCRIPTION
- :A big-budget\, mega-event epic motion picture that revolves around 
- an abrupt climate change that has cataclysmic consequences for the 
- planet
-URL
- :http://www.movie-list.com/trailers.php?id=dayaftertomorrow
-CLASS
- :PUBLIC
-X-MOZILLA-RECUR-DEFAULT-INTERVAL
- :0
-DTSTART
- ;VALUE=DATE
- :20040527
-DTEND
- ;VALUE=DATE
- :20040528
-DTSTAMP
- :20040225T000236Z
-END:VEVENT
-BEGIN:VEVENT
-UID
- :AA438D50-3B40-11D8-9EA1-000A958D1EFE
-SUMMARY
- :Dirty Pretty Things
-DESCRIPTION
- :Chiwetel Ejiofor gives a remarkably understated performance in director 
- Stephen Frears's offbeat and gripping drama DIRTY PRETTY THINGS.\n\n\"Not
-  only does Frears dress this London with a palpable atmosphere -- 
- and even a kind of rank smell and rough touch -- but he also coaxes 
- deeply affecting performances out of his stars.\"\n-- Jeffrey M. 
- Anderson\, SAN FRANCISCO EXAMINER
-LOCATION
- :Chjwetel Ejiofor\, Audrey Tautou\, Sergi Lopez\, Directed by Stephen 
- Frears
-URL
- :http://www.miramax.com/dirty_pretty_things/
-CLASS
- :PUBLIC
-X-MOZILLA-RECUR-DEFAULT-INTERVAL
- :0
-DTSTART
- ;VALUE=DATE
- :20040527
-DTEND
- ;VALUE=DATE
- :20040528
-DTSTAMP
- :20040225T000343Z
-END:VEVENT
-BEGIN:VEVENT
-UID
- :1C1D56D0-6D6A-11D8-AA68-000A27B6071A
-SUMMARY
- :Stepford Wives\, The
-DESCRIPTION
- :Joanna\, a young wife and mother\, moves from Manhattan to the upper-class
-  suburb of Stepford\, Connecticut. Once there\, she makes friends 
- with bombastic Bobbie Markowitz. Together they find out\, much to 
- their horror\, that all the housewives are strangely blissful\, 
- and somehow... doomed.
-LOCATION
- :Nicole Kidman\, Bette Midler\, Matthew Broderick\, Christopher 
- Walken\, Glenn Close\, Jon Lovitz. Directed by Frank Oz
-URL
- :http://www.movie-list.com/trailers.php?id=stepfordwives
-CLASS
- :PUBLIC
-X-MOZILLA-RECUR-DEFAULT-INTERVAL
- :0
-DTSTART
- ;VALUE=DATE
- :20040603
-DTEND
- ;VALUE=DATE
- :20040604
-DTSTAMP
- :20040303T232933Z
-END:VEVENT
-BEGIN:VEVENT
-UID
- :4BB14D27-722F-11D8-B1E4-000A27B6071A
-SUMMARY
- :Teachers Pet
-DESCRIPTION
- :Spot\, a talking dog who longs to be a boy so much that he even dresses 
- up as one so he can accompany his owner Leonard to school??..\n\n\"This 
- completely random creation is essentially an adult's cartoon cut for 
- a kid's short attention span.\"\n-- Ed Gonzalez\, CITY PAGES\, 
- MINNEAPOLIS/ST. PAUL\n
-LOCATION
- :Nathan Lane\, Kelsey Grammer\, Jerry Stiller
-URL
- :http://www.movie-list.com/trailers.php?id=teacherspet
-CLASS
- :PUBLIC
-X-MOZILLA-RECUR-DEFAULT-INTERVAL
- :0
-DTSTART
- ;VALUE=DATE
- :20040506
-DTEND
- ;VALUE=DATE
- :20040507
-DTSTAMP
- :20040310T011204Z
-END:VEVENT
-BEGIN:VEVENT
-UID
- :11474DEF-7230-11D8-B1E4-000A27B6071A
-SUMMARY
- :Breakin' All The Rules
-DESCRIPTION
- :A romantic comedy about a man who\, after being unceremoniously dumped 
- by his  fiance\, pens a \"how to\" book on breaking up and becomes 
- a best-selling author on the subject.
-LOCATION
- :Jamie Foxx
-URL
- :http://www.movie-list.com/trailers.php?id=breakinalltherules
-CLASS
- :PUBLIC
-X-MOZILLA-RECUR-DEFAULT-INTERVAL
- :0
-DTSTART
- ;VALUE=DATE
- :20040812
-DTEND
- ;VALUE=DATE
- :20040813
-DTSTAMP
- :20040318T184352Z
-END:VEVENT
-BEGIN:VEVENT
-UID
- :37BBFC2A-7230-11D8-B1E4-000A27B6071A
-SUMMARY
- :Harry Potter And The Prisoner Of Azkaban
-DESCRIPTION
- :Harry Potter and his friends Ron and Hermione return as teenagers 
- to Hogwarts School of Witchcraft and Wizardry for their third year 
- of study\, where they delve into the mystery surrounding an escaped 
- prisoner who poses a dangerous threat to the young wizard.
-LOCATION
- :Daniel Radcliffe\, Rupert Grint\, Emma Watson\, Michael Gamon\, 
- Gary Oldman\, Dawn French\, Emma Thompson
-URL
- :http://www.movie-list.com/trailers.php?id=harrypotter3
-CLASS
- :PUBLIC
-X-MOZILLA-RECUR-DEFAULT-INTERVAL
- :0
-DTSTART
- ;VALUE=DATE
- :20040610
-DTEND
- ;VALUE=DATE
- :20040611
-DTSTAMP
- :20040310T012817Z
-END:VEVENT
-BEGIN:VEVENT
-UID
- :5DD27BBA-7230-11D8-B1E4-000A27B6071A
-SUMMARY
- :Chronicles of Riddick aka Pitch Black 2
-DESCRIPTION
- :Riddick\, now a hunted man\, finds himself in the middle of  two 
- opposing forces in a major crusade.
-LOCATION
- :Vin Diesel\, Judi Dench
-URL
- :http://www.movie-list.com/trailers.php?id=breakinalltherules
-CLASS
- :PUBLIC
-X-MOZILLA-RECUR-DEFAULT-INTERVAL
- :0
-DTSTART
- ;VALUE=DATE
- :20040610
-DTEND
- ;VALUE=DATE
- :20040611
-DTSTAMP
- :20040310T012906Z
-END:VEVENT
-BEGIN:VEVENT
-UID
- :A253E792-7230-11D8-B1E4-000A27B6071A
-SUMMARY
- :Lady Killers\, The
-DESCRIPTION
- :Goldthwait Higginson Dorr III\, Ph.D.\, a charlatan professor who???s 
- assembled a gang of \"experts\" for the heist of the century. The 
- thieves The ruse: the five need a place to practice their church music. 
- The problem: it quickly becomes evident that Dorr???s thieves lack 
- the mental capacity to do the job. The bigger problem: they have all 
- seriously underestimated their upstairs host.\n
-LOCATION
- :Tom Hanks\, Marlon Wayans\nDirected by Joel Coen
-URL
- :http://www.movie-list.com/trailers.php?id=theladykillers
-CLASS
- :PUBLIC
-X-MOZILLA-RECUR-DEFAULT-INTERVAL
- :0
-DTSTART
- ;VALUE=DATE
- :20040603
-DTEND
- ;VALUE=DATE
- :20040604
-DTSTAMP
- :20040318T184326Z
-END:VEVENT
-BEGIN:VEVENT
-UID
- :B83EE0B2-755C-11D8-885C-000A9596385E
-SUMMARY
- :Intermission
-DESCRIPTION
- :Intermission is an urban love story about people adrift and their 
- convoluted journeys in the search for some kind of love. \n\n\"\"Intermi
- ssion\" is all done with an assured hand that combines action\, 
- violence\, sex and humor in liberal doses with its talented ensemble 
- cast and manic\, inventive story.\"\n-- Robin Clifford\, REELING 
- REVIEWS
-LOCATION
- :Colin Farrell
-URL
- :http://www.movie-list.com/trailers.php?id=intermission
-CLASS
- :PUBLIC
-X-MOZILLA-RECUR-DEFAULT-INTERVAL
- :0
-DTSTART
- ;VALUE=DATE
- :20040603
-DTEND
- ;VALUE=DATE
- :20040604
-DTSTAMP
- :20040314T021245Z
-END:VEVENT
-BEGIN:VEVENT
-UID
- :2B748ED4-755D-11D8-885C-000A9596385E
-SUMMARY
- :13 Going on 30
-DESCRIPTION
- :A 13 year old girl plays a game on her 13th birthday and wakes up 
- the next day as a 30 year old woman.
-LOCATION
- :Jennifer Garner
-URL
- :http://www.movie-list.com/trailers.php?id=13goingon30
-CLASS
- :PUBLIC
-X-MOZILLA-RECUR-DEFAULT-INTERVAL
- :0
-DTSTART
- ;VALUE=DATE
- :20040916
-DTEND
- ;VALUE=DATE
- :20040917
-DTSTAMP
- :20040318T184643Z
-END:VEVENT
-BEGIN:VEVENT
-UID
- :6D27F7F9-755D-11D8-885C-000A9596385E
-SUMMARY
- :Shrek 2
-DESCRIPTION
- :Princess Fiona's parents invite her and Shrek to dinner to celebrate 
- her marriage. If only they knew the newlyweds were both ogres.
-LOCATION
- :Mike Myers\, Eddie Murphy\, Cameron Diaz\, John Lithgow\, John 
- Cleese
-URL
- :http://www.movie-list.com/trailers.php?id=shrek2
-CLASS
- :PUBLIC
-X-MOZILLA-RECUR-DEFAULT-INTERVAL
- :0
-DTSTART
- ;VALUE=DATE
- :20040617
-DTEND
- ;VALUE=DATE
- :20040618
-DTSTAMP
- :20040314T021623Z
-END:VEVENT
-BEGIN:VEVENT
-UID
- :9EEA9830-755D-11D8-885C-000A9596385E
-SUMMARY
- :Barbershop 2: Back in Business
-DESCRIPTION
- :Why not spend another day with the crew at Calvin's shop in the South 
- Side of Chicago?\n\n\"The seriousness with which Barbershop II 
- treats its political conscience offers an unexpected weight to what???s 
- essentially a big screen sitcom.\"\n-- Mark Palermo\, COAST (HALIFAX\, 
- NOVA SCOTIA
-URL
- :http://www.movie-list.com/trailers.php?id=barbershop2
-CLASS
- :PUBLIC
-X-MOZILLA-RECUR-DEFAULT-INTERVAL
- :0
-DTSTART
- ;VALUE=DATE
- :20040624
-DTEND
- ;VALUE=DATE
- :20040625
-DTSTAMP
- :20040314T022349Z
-END:VEVENT
-BEGIN:VEVENT
-UID
- :BBD3136E-755D-11D8-885C-000A9596385E
-SUMMARY
- :Club Dread
-DESCRIPTION
- :At Club Dread\, an alcohol drenched swinging-singles-style island 
- resort off the coast of Costa Rica\, the festivities are interrupted 
- by the presence of a machete-wielding serial killer.\n\n\"Most 
- of the movie is just blood and bodies\, some of the dead\, some 
- of them topless\, and none of them interesting.\"\n-- Stephen Whitty\, 
- NEWARK STAR-LEDGER
-LOCATION
- :Bill Paxton
-URL
- :http://www.movie-list.com/trailers.php?id=clubdread
-CLASS
- :PUBLIC
-X-MOZILLA-RECUR-DEFAULT-INTERVAL
- :0
-DTSTART
- ;VALUE=DATE
- :20040624
-DTEND
- ;VALUE=DATE
- :20040625
-DTSTAMP
- :20040314T024934Z
-END:VEVENT
-BEGIN:VEVENT
-UID
- :C4BE60EA-755D-11D8-885C-000A9596385E
-SUMMARY
- :Confessions of a Teenage Drama Queen
-DESCRIPTION
- :A teenage girl is convinced that her home city revolves around her 
- until her family packs up and moves to the suburbs\, where she finds 
- herself competing for attention. \n\n\"What teenage girl would 
- enjoy watching this? I'm glad Disney addresses this oft-ignored demographic\,
-  but if these girls are pandered to so obviously\, won't they feel 
- insulted?\"\n-- Jeffrey Chen\, WINDOW TO THE MOVIES
-LOCATION
- :Lindsay Lohan\, Adam Garcia
-URL
- :http://www.movie-list.com/trailers.php?id=confessionsofateenagedramaqueen
-CLASS
- :PUBLIC
-X-MOZILLA-RECUR-DEFAULT-INTERVAL
- :0
-DTSTART
- ;VALUE=DATE
- :20040408
-DTEND
- ;VALUE=DATE
- :20040409
-DTSTAMP
- :20040318T183009Z
-END:VEVENT
-BEGIN:VEVENT
-UID
- :CAEA6CFA-755D-11D8-885C-000A9596385E
-SUMMARY
- :Mean Girls
-DESCRIPTION
- :A girl who grew up in many places returns to an Illinois public high 
- school\, falls for the wrong guy\, and experiences humiliation from 
- her female classmates.
-LOCATION
- :Lindsay Lohan
-URL
- :http://www.movie-list.com/trailers.php?id=meangirls
-CLASS
- :PUBLIC
-X-MOZILLA-RECUR-DEFAULT-INTERVAL
- :0
-DTSTART
- ;VALUE=DATE
- :20040624
-DTEND
- ;VALUE=DATE
- :20040625
-DTSTAMP
- :20040314T022716Z
-END:VEVENT
-BEGIN:VEVENT
-UID
- :D0644C6E-468F-11D8-A8A0-000A958D1EFE
-SUMMARY
- :Prince and Me\, The
-DESCRIPTION
- :A fairy tale love-story about a pre-med student who falls in love 
- with a Danish Prince.
-LOCATION
- :Julia Stiles\, Miranda Richardson\, James Fox\, Ben Miller. D: 
- Martha Cooli
-URL
- :http://www.movie-list.com/trailers.php?id=princeandme
-CLASS
- :PUBLIC
-X-MOZILLA-RECUR-DEFAULT-INTERVAL
- :0
-DTSTART
- ;VALUE=DATE
- :20040624
-DTEND
- ;VALUE=DATE
- :20040625
-DTSTAMP
- :20040314T021829Z
-END:VEVENT
-BEGIN:VEVENT
-UID
- :236E44EA-77A6-11D8-937F-000A9596385E
-SUMMARY
- :New York Minute
-CLASS
- :PUBLIC
-X-MOZILLA-RECUR-DEFAULT-INTERVAL
- :0
-DTSTART
- ;VALUE=DATE
- :20040701
-DTEND
- ;VALUE=DATE
- :20040702
-DTSTAMP
- :20040317T000108Z
-END:VEVENT
-BEGIN:VEVENT
-UID
- :27824F06-77A6-11D8-937F-000A9596385E
-SUMMARY
- :Spiderman 2
-CLASS
- :PUBLIC
-X-MOZILLA-RECUR-DEFAULT-INTERVAL
- :0
-DTSTART
- ;VALUE=DATE
- :20040701
-DTEND
- ;VALUE=DATE
- :20040702
-DTSTAMP
- :20040317T000106Z
-END:VEVENT
-BEGIN:VEVENT
-UID
- :C6329B7B-52C7-11D8-B289-000A958D1EFE
-SUMMARY
- :Dirty Dancing: Havana Nights
-DESCRIPTION
- :Set in 1958 Havana\, this is the story of a lonely 17-year-old American 
- girl\, Katie\, who moves to Cuba in the days right before the Revolution 
- with her parents\, where she meets a charming and talented local 
- dancer\, Javier.\n\n\"molds a great deal of the franchise's first 
- film and makes an even more compelling film than the original.\"\n-- 
- Chris Faile\, FILMJERK.COM
-URL
- :http://www.movie-list.com/trailers.php?id=dirtydancinghavananights
-CLASS
- :PUBLIC
-X-MOZILLA-RECUR-DEFAULT-INTERVAL
- :0
-DTSTART
- ;VALUE=DATE
- :20040429
-DTEND
- ;VALUE=DATE
- :20040430
-DTSTAMP
- :20040318T183450Z
-END:VEVENT
-BEGIN:VEVENT
-UID
- :CFB7CEFC-090D-11D8-B1DB-000A958D1EFE
-SUMMARY
- :Mother\, The
-DESCRIPTION
- :A recently widowed suburban hausfrau falls for her adult daughter's 
- married lover in The Mother\, a kitchen-sink drama of building dramatic 
- force and incongruous visual loveliness.
-LOCATION
- :Dir Roger Michell w/ Anne Reid\, Daniel Craig.
-CLASS
- :PUBLIC
-X-MOZILLA-RECUR-DEFAULT-INTERVAL
- :0
-DTSTART
- ;VALUE=DATE
- :20040520
-DTEND
- ;VALUE=DATE
- :20040521
-DTSTAMP
- :20040318T183748Z
-END:VEVENT
-BEGIN:VEVENT
-UID
- :5FD00E54-468E-11D8-A8A0-000A958D1EFE
-SUMMARY
- :Hero
-DESCRIPTION
- :Using the assasination attempt of the historical figure\, Chin Shi 
- Huang Di (The first emperor of China) as a backdrop\, this film attempts 
- to explore and develop a better understanding of the Chinese concept 
- of a hero.\n\n????\"Instead of reinventing this genre\, Zhang 
- opts to dazzle his audience with his assemblage of technical and aesthetic 
- wonders.\"\n-- Jeremy Heilman\,MOVIEMARTYR.COM
-LOCATION
- :Jet Li\; Maggie Cheung\; Tony Leung\; Zhang Ziyi\; Daoming Chen
-URL
- :http://www.movie-list.com/h/hero.shtml
-CLASS
- :PUBLIC
-X-MOZILLA-RECUR-DEFAULT-INTERVAL
- :0
-DTSTART
- ;VALUE=DATE
- :20040624
-DTEND
- ;VALUE=DATE
- :20040625
-DTSTAMP
- :20040318T184928Z
-END:VEVENT
-BEGIN:VEVENT
-UID
- :89737536-790D-11D8-8109-000A9596385E
-SUMMARY
- :Statement\, The
-DESCRIPTION
- :Tale of a former Nazi executioner who becomes a target of hit men 
- and Police investigators. \n\n??\"A surprisingly mild thriller\, 
- one that meanders and spasms dramatically\, and that\, despite its 
- occasional outburst of violence\, wastes a cast of ordinarily superb 
- actors.\"\n-- John Anderson\, NEWSDAY
-LOCATION
- :Michael Caine\, Tilda Swinton\, Jeremy Northam. Directed by Norman 
- Jewison
-URL
- :http://www.movie-list.com/trailers.php?id=statement
-CLASS
- :PUBLIC
-X-MOZILLA-RECUR-DEFAULT-INTERVAL
- :0
-DTSTART
- ;VALUE=DATE
- :20040708
-DTEND
- ;VALUE=DATE
- :20040709
-DTSTAMP
- :20040318T185526Z
-END:VEVENT
-BEGIN:VEVENT
-UID
- :D2C9AC2A-790D-11D8-8109-000A9596385E
-SUMMARY
- :Without a Paddle
-DESCRIPTION
- :Three city-dwelling friends go on a camping trip with disastrous results.
-LOCATION
- :Matthew Lillard\, Seth Gree
-CLASS
- :PUBLIC
-X-MOZILLA-RECUR-DEFAULT-INTERVAL
- :0
-DTSTART
- ;VALUE=DATE
- :20040708
-DTEND
- ;VALUE=DATE
- :20040709
-DTSTAMP
- :20040318T185626Z
-END:VEVENT
-BEGIN:VEVENT
-UID
- :F6A36D66-790D-11D8-8109-000A9596385E
-SUMMARY
- :Whole Ten Yards\, The
-DESCRIPTION
- :Jimmy the Tulip's (Willis) quiet new life is shaken up by his old 
- pal Oz (Perry)\, whose wife (Henstridge) has been kidnapped by a 
- Hungarian mob. The Tulip and his wife Jill (Peet) spring into action.
-LOCATION
- :Bruce Willis\, Matthew Perry\, Natasha Henstridge\, Amanda Peet\, 
- Kevin Pollak
-URL
- :http://www.movie-list.com/trailers.php?id=wholetenyards
-CLASS
- :PUBLIC
-X-MOZILLA-RECUR-DEFAULT-INTERVAL
- :0
-DTSTART
- ;VALUE=DATE
- :20040708
-DTEND
- ;VALUE=DATE
- :20040709
-DTSTAMP
- :20040318T185823Z
-END:VEVENT
-BEGIN:VEVENT
-UID
- :C88418E3-7FD1-11D8-86BD-000A27B6071A
-SUMMARY
- :Envy
-DESCRIPTION
- :A man becomes increasingly jealous of his friend's newfound success.
-LOCATION
- :Jack Black\, Ben Stiller\, Rachel Weisz\, Christopher Walken. Directed 
- by Barry Levinson.
-URL
- :http://www.movie-list.com/trailers.php?id=envy
-CLASS
- :PUBLIC
-X-MOZILLA-RECUR-DEFAULT-INTERVAL
- :0
-DTSTART
- ;VALUE=DATE
- :20040715
-DTEND
- ;VALUE=DATE
- :20040716
-DTSTAMP
- :20040327T093820Z
-END:VEVENT
-BEGIN:VEVENT
-UID
- :CBEDB8F1-7FD1-11D8-86BD-000A27B6071A
-SUMMARY
- :King Arthur
-DESCRIPTION
- :A demystified take on the tale of King Arthur and the Knights of the 
- Round Table.
-LOCATION
- :Keira Knightley
-URL
- :http://www.movie-list.com/trailers.php?id=kingarthur
-CLASS
- :PUBLIC
-X-MOZILLA-RECUR-DEFAULT-INTERVAL
- :0
-DTSTART
- ;VALUE=DATE
- :20040715
-DTEND
- ;VALUE=DATE
- :20040716
-DTSTAMP
- :20040327T094354Z
-END:VEVENT
-BEGIN:VEVENT
-UID
- :4E91CBDC-7FD3-11D8-86BD-000A27B6071A
-SUMMARY
- :I Robot
-DESCRIPTION
- :In the year 2035 a techno-phobic cop investigates a crime that may 
- have been perpetrated by a robot\, which leads to a larger threat 
- to humanity.\n
-LOCATION
- :Will Smith. Directed by Alex Proyas.
-URL
- :http://www.movie-list.com/trailers.php?id=irobot
-CLASS
- :PUBLIC
-X-MOZILLA-RECUR-DEFAULT-INTERVAL
- :0
-DTSTART
- ;VALUE=DATE
- :20040722
-DTEND
- ;VALUE=DATE
- :20040723
-DTSTAMP
- :20040327T094831Z
-END:VEVENT
-BEGIN:VEVENT
-UID
- :B7B32328-7FD3-11D8-86BD-000A27B6071A
-SUMMARY
- :Miracle
-DESCRIPTION
- :Miracle tells the true story of Herb Brooks (Russell)\, the player-turned-c
- oach who led the 1980 U.S. Olympic hockey team to victory over the 
- seemingly invincible Russian squad.\n
-LOCATION
- :Kurt Russell\, Patricia Clarkson
-URL
- :http://www.movie-list.com/trailers.php?id=miracle
-CLASS
- :PUBLIC
-X-MOZILLA-RECUR-DEFAULT-INTERVAL
- :0
-DTSTART
- ;VALUE=DATE
- :20040722
-DTEND
- ;VALUE=DATE
- :20040723
-DTSTAMP
- :20040327T095105Z
-END:VEVENT
-BEGIN:VTODO
-UID
- :1E2C09FC-FBA7-11D7-B98C-000A958D1EFE
-SUMMARY
- :$35 Metro: Paul Kelly tickets $35
-STATUS
- :COMPLETED
-CLASS
- :PUBLIC
-X-MOZILLA-RECUR-DEFAULT-INTERVAL
- :0
-DTSTART
- :20031018T000000
-DUE
- ;VALUE=DATE
- :20031018
-DTSTAMP
- :20031018T164749Z
-END:VTODO
-BEGIN:VTODO
-UID
- :7A0EDDE6-FF8A-11D7-8061-000A958D1EFE
-SUMMARY
- :$430 200GB hard drive
-STATUS
- :COMPLETED
-CLASS
- :PUBLIC
-X-MOZILLA-RECUR-DEFAULT-INTERVAL
- :0
-DTSTART
- :20031023T000000
-DUE
- ;TZID=/softwarestudio.org/Olson_20011030_5/America/New_York
- :20031023T000000
-DTSTAMP
- :20031018T164747Z
-END:VTODO
-BEGIN:VTODO
-UID
- :0AE6D541-1F54-11D8-8F64-000A958D1EFE
-SUMMARY
- :neon KB
-CLASS
- :PUBLIC
-X-MOZILLA-RECUR-DEFAULT-INTERVAL
- :0
-DTSTART
- :20040203T000000
-DUE
- :20040203T000000
-DTSTAMP
- :20031125T143151Z
-END:VTODO
-BEGIN:VTODO
-UID
- :6E72474D-1F69-11D8-8F64-000A958D1EFE
-SUMMARY
- :master commander
-STATUS
- :COMPLETED
-CLASS
- :PUBLIC
-X-MOZILLA-RECUR-DEFAULT-INTERVAL
- :0
-DTSTART
- :20031126T000000
-DUE
- :20031126T000000
-DTSTAMP
- :20031130T024112Z
-END:VTODO
-END:VCALENDAR

Deleted: trunk/dna-repository/src/test/resources/docs/icaltestdata/tag-bug.ics
===================================================================
--- trunk/dna-repository/src/test/resources/docs/icaltestdata/tag-bug.ics	2009-06-04 21:46:34 UTC (rev 976)
+++ trunk/dna-repository/src/test/resources/docs/icaltestdata/tag-bug.ics	2009-06-04 22:31:30 UTC (rev 977)
@@ -1,14 +0,0 @@
-BEGIN:VCALENDAR
-VERSION:2.0
-PRODID:-//Mozilla.org/NONSGML Mozilla Calendar V1.0//EN
-BEGIN:VEVENT
-CATEGORIES:Telcon
-UID:78492d2f-aacd-40e3-80cc-4f078d1516e0
-EXDATE;VALUE=DATE:20020225
-SUMMARY:W3C TAG
-DESCRIPTION:rdf:\np:phone +1.617.761.6200\np:code 0824#\n
-RRULE:FREQ=WEEKLY;INTERVAL=1;BYDAY=MO
-DTEND:20020513T163000
-DTSTART:20020513T000000
-END:VEVENT
-END:VCALENDAR

Deleted: trunk/dna-repository/src/test/resources/docs/icaltestdata/test-created.ics
===================================================================
--- trunk/dna-repository/src/test/resources/docs/icaltestdata/test-created.ics	2009-06-04 21:46:34 UTC (rev 976)
+++ trunk/dna-repository/src/test/resources/docs/icaltestdata/test-created.ics	2009-06-04 22:31:30 UTC (rev 977)
@@ -1,21 +0,0 @@
-BEGIN:VCALENDAR
-VERSION:2.0
-X-WR-CALNAME:tim-test
-PRODID:-//Apple Computer\, Inc//iCal 1.5//EN
-X-WR-RELCALID:A08BFEBE-73D1-11D9-B5C3-000393CD78B4
-X-WR-TIMEZONE:US/Eastern
-CALSCALE:GREGORIAN
-BEGIN:VEVENT
-CLASS:PUBLIC
-DURATION:PT1H30M
-DTSTAMP:20050124T205828Z
-TRANSP:OPAQUE
-UID:A0831EE4-73D1-11D9-B5C3-000393CD78B4
-LAST-MODIFIED:20041223T151752
-SEQUENCE:3
-CREATED:20041223T135226
-DTSTART:20050127T090000
-SUMMARY:An event with a CREATED field
-CATEGORIES:Strategies
-END:VEVENT
-END:VCALENDAR

Deleted: trunk/dna-repository/src/test/resources/docs/jingle1.mp3
===================================================================
(Binary files differ)

Deleted: trunk/dna-repository/src/test/resources/docs/jingle2.mp3
===================================================================
(Binary files differ)

Deleted: trunk/dna-repository/src/test/resources/docs/jingle3.mp3
===================================================================
(Binary files differ)

Deleted: trunk/dna-repository/src/test/resources/docs/jpg-exif-img_9367.JPG
===================================================================
(Binary files differ)

Deleted: trunk/dna-repository/src/test/resources/docs/jpg-exif-zerolength.jpg
===================================================================
(Binary files differ)

Deleted: trunk/dna-repository/src/test/resources/docs/jpg-geotagged-ipanema.jpg
===================================================================
(Binary files differ)

Deleted: trunk/dna-repository/src/test/resources/docs/jpg-geotagged.jpg
===================================================================
(Binary files differ)

Deleted: trunk/dna-repository/src/test/resources/docs/mail-thunderbird-1.5.eml
===================================================================
--- trunk/dna-repository/src/test/resources/docs/mail-thunderbird-1.5.eml	2009-06-04 21:46:34 UTC (rev 976)
+++ trunk/dna-repository/src/test/resources/docs/mail-thunderbird-1.5.eml	2009-06-04 22:31:30 UTC (rev 977)
@@ -1,17 +0,0 @@
-Return-Path: <christiaan.fluit at aduna.biz>
-Delivered-To: 5-Christiaan.Fluit at aduna.biz
-Received: (qmail 13624 invoked from network); 20 Feb 2006 07:43:53 -0600
-Received: from home.aduna.biz (HELO ?10.1.0.11?) (213.84.59.34)
-  by www4.aduna.biz with (DHE-RSA-AES256-SHA encrypted) SMTP; 20 Feb 2006 07:43:53 -0600
-Message-ID: <43F9C862.9040605 at aduna.biz>
-Date: Mon, 20 Feb 2006 14:47:14 +0100
-From: Christiaan Fluit <christiaan.fluit at aduna.biz>
-User-Agent: Thunderbird 1.5 (Windows/20051201)
-MIME-Version: 1.0
-To: Christiaan Fluit <Christiaan.Fluit at aduna.biz>
-Subject: test subject
-Content-Type: text/plain; charset=ISO-8859-1; format=flowed
-Content-Transfer-Encoding: 7bit
-
-test body
---

Deleted: trunk/dna-repository/src/test/resources/docs/mhtml-firefox.mht
===================================================================
--- trunk/dna-repository/src/test/resources/docs/mhtml-firefox.mht	2009-06-04 21:46:34 UTC (rev 976)
+++ trunk/dna-repository/src/test/resources/docs/mhtml-firefox.mht	2009-06-04 22:31:30 UTC (rev 977)
@@ -1,455 +0,0 @@
-From: <Saved by Mozilla 5.0 (Windows; en-US)>
-Subject: Aperture Framework
-Date: Fri Mar 10 2006 13:40:00 GMT+0100
-MIME-Version: 1.0
-Content-Location: http://aperture.sourceforge.net/
-Content-Type: multipart/related;
-	boundary="----=_NextPart_000_0000_B40804DE.BBCA09DC";
-	type="text/html"
-X-MAF: Produced By MAF MHT Archive Handler V0.4.1
-
-This is a multi-part message in MIME format.
-
-------=_NextPart_000_0000_B40804DE.BBCA09DC
-Content-Type: text/html
-Content-Transfer-Encoding: quoted-printable
-Content-Location: http://aperture.sourceforge.net/
-
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/=
-TR/xhtml1/DTD/xhtml1-strict.dtd">
-<html><head><!-- This document is inspired by the content style at http://ww=
-w.csszengarden.com -->
-
-
-
-<meta http-equiv=3D"content-type" content=3D"text/html; charset=3Diso-8859-1=
-">
-<meta name=3D"author" content=3D"Leo Sauermann, Christiaan Fluit">
-<meta name=3D"keywords" content=3D"aperture, rdf, data"><title>Aperture Fram=
-ework</title>
-
-<script type=3D"text/javascript"></script>
-<link title=3D"Default" rel=3D"stylesheet" type=3D"text/css" href=3D"index_f=
-iles/frontpage.css" media=3D"screen">
-<link title=3D"Default" rel=3D"stylesheet" type=3D"text/css" href=3D"index_f=
-iles/print.css" media=3D"print">
-<link title=3D"Basic" rel=3D"alternate stylesheet" type=3D"text/css" href=3D=
-"index_files/all.css" media=3D"all"></head><body>
-
-<div id=3D"header">
-
-<h1>Aperture</h1>
-<h2>a Java framework for getting data and metadata</h2>
-
-</div>  <!-- header -->
-
-<div id=3D"content">
-
-<div id=3D"preamble">
-
-<p>
-<b>Project name</b>
-</p>
-
-<p>
-From <a class=3D"ext-link" title=3D"http://www.webster.com/" href=3D"http://=
-www.webster.com/">Merriam-Webster Online</a>:
-</p>
-
-<p>
-Main Entry: <strong>ap=B7er=B7ture</strong>
-(sounds like <a class=3D"ext-link" title=3D"http://cougar.eb.com/sound/a/ape=
-rtu01.wav" href=3D"http://cougar.eb.com/sound/a/apertu01.wav">this</a>)<br>
-Pronunciation: 'ap-&amp;(r)-"chur, -ch&amp;r, -"tyur, -"tur<br>
-Function: noun<br>
-Etymology: Middle English, from Latin apertura, from apertus, past
-participle of aperire to open<br>
-</p>
-
-<ol>
-<li>an opening or open space : HOLE</li>
-<li>a : the opening in a photographic lens that admits the light<br>
-b : the diameter of the stop in an optical system that determines the diamet=
-er
-of the bundle of rays traversing the instrument<br>
-c : the diameter of the objective lens or mirror of a telescope</li>
-</ol>
-
-</div> <!-- preamble -->
-
-<h2>News</h2>
-
-<p>
-<b>March 6, 2006:</b> <a href=3D"https://sourceforge.net/project/showfiles.p=
-hp?group_id=3D150969">Aperture
-2006.1 alpha 2</a> released!
-</p>
-
-<p>
-This release adds support for crawling file systems, web sites, IMAP and Out=
-look mail boxes.
-Furthermore, the number of supported file formats has increased significantl=
-y.
-</p>
-
-<h2>Features</h2>
-
-<ul>
-<li>Crawl information systems such as file systems, websites, mail boxes and=
- mail servers</li>
-<li>Extract full-text and metadata from many common file formats</li>
-<li>View files in their native applications</li>
-<li>Ease of use: easy to learn, easy to code, easy to deploy in industrial p=
-rojects</li>
-<li>Flexible architecture: can be extended with custom file formats, data so=
-urces, etc.,
-    with support for deployment on OSGi platforms</li>
-<li>Data exchange based on Semantic Web standards (e.g. RDF, SPARQL, ...)</l=
-i>
-</ul>
-
-<h2>Supported File Formats</h2>
-
-<ul>
-<li>Plain text</li>
-<li>HTML, XHTML</li>
-<li>XML</li>
-<li>PDF (Portable Document Format)</li>
-<li>RTF (Rich Text Format)</li>
-<li>Microsoft Office: Word, Excel, Powerpoint, Visio, Publisher</li>
-<li>Microsoft Works</li>
-<li>OpenOffice 1.x: Writer, Calc, Impress, Draw</li>
-<li>StarOffice 6.x - 7.x+: Writer, Calc, Impress, Draw</li>
-<li>OpenDocument (OpenOffice 2.x, StarOffice 8.x)</li>
-<li>Corel WordPerfect, Quattro, Presentations</li>
-<li>Emails (.eml files)</li>
-</ul>
-
-<h2>Crawlers</h2>
-
-<p>
-Crawlers support the extraction of information from heterogenous data source=
-s.
-At the moment we support the following source types:</p>
-
-<ul>
-<li>File Systems (local, remote, removeable media)</li>
-<li>Websites and intranets</li>
-<li>IMAP e-mail servers</li>
-<li>Microsoft Outlook (alpha)</li>
-</ul>
-
-<h2><a name=3D"support"></a>Support</h2>
-
-<p>
-At this moment the project is still in alpha stage and we provide only limit=
-ed support.
-If you have any questions about the project, feel free to join the
-<a href=3D"https://sourceforge.net/mail/?group_id=3D150969">development mail=
-inglist</a> and ask us.
-</p>
-
-<h2><a name=3D"development"></a>Development</h2>
-
-<p>
-To use Aperture in your own projects, read the <a href=3D"http://aperture.so=
-urceforge.net/documentation.html">documentation</a>
-for information about requirements and code examples.
-</p>
-
-<p>
-If you are interested in contributing, feel free to contact the project admi=
-ns or join the
-<a href=3D"https://sourceforge.net/mail/?group_id=3D150969">development mail=
-inglist</a>.
-We are very interested in new extractors and other contributions including c=
-rawlers.
-</p>
-
-</div>  <!-- content -->
-
-<div id=3D"sideBar">
-
-<p>
-Aperture is a Java framework for extracting and querying full-text
-content and metadata from various information systems (e.g. file systems,
-web sites, mail boxes) and the file formats (e.g. documents, images)
-occurring in these systems.
-</p>
-
-<h2>Contents</h2>
-
-<ul>
-<li><a href=3D"http://aperture.sourceforge.net/index.html">Home</a></li>
-<li><a href=3D"https://sourceforge.net/project/showfiles.php?group_id=3D1509=
-69">Download</a></li>
-<li><a href=3D"http://aperture.sourceforge.net/doc/javadoc/index.html">Javad=
-oc</a></li>
-<li><a href=3D"http://aperture.sourceforge.net/documentation.html">Documenta=
-tion</a></li>
-<li><a href=3D"http://aperture.sourceforge.net/faq.html">FAQ</a></li>
-<li><a href=3D"http://aperture.sourceforge.net/index.html#support">Support</=
-a></li>
-<li><a href=3D"http://aperture.sourceforge.net/index.html#development">Devel=
-opment</a></li>
-<li><a href=3D"http://aperture.sourceforge.net/license.html">License</a></li=
->
-</ul>
-
-<h2>Developed By</h2>
-
-<ul>
-<li><a href=3D"http://aduna.biz/">Aduna</a></li>
-<li><a href=3D"http://www.dfki.de/">DFKI</a></li>
-</ul>
-
-<h2>Site Info</h2>
-
-<p>
-Hosted by <a href=3D"http://sourceforge.net/">SourceForge.net</a>
-</p>
-
-<p>
-<a href=3D"http://sourceforge.net/"><img class=3D"logo" src=3D"index_files/s=
-flogo.png" alt=3D"SourceForge.net Logo" height=3D"37" width=3D"125"></a>
-</p>
-
-<p>
-<br>
-Graphical design by <a href=3D"http://www.pixul.net/">Pixul.net</a>. Used wi=
-th permission.
-</p>
-
-</div>  <!-- sideBar -->
-
-<div id=3D"footer">
-<a href=3D"http://validator.w3.org/check/referer" title=3D"Check the validit=
-y of this site&#8217;s XHTML">xhtml</a>
-=A0<a href=3D"http://jigsaw.w3.org/css-validator/check/referer" title=3D"Che=
-ck the validity of this site&#8217;s CSS">css</a>
-</div>  <!-- footer -->
-
-</body></html>
-
-
-------=_NextPart_000_0000_B40804DE.BBCA09DC
-Content-Type: text/css
-Content-Transfer-Encoding: quoted-printable
-Content-Location: index_files/all.css
-
- at import url(../w3-html40-recommended.css);
-
-img {
-=09border: 0;
-}
-
-
-
-------=_NextPart_000_0000_B40804DE.BBCA09DC
-Content-Type: text/css
-Content-Transfer-Encoding: quoted-printable
-Content-Location: index_files/frontpage.css
-
-/*
- Parts of this style-sheet are copied from the=20
- css Zen Garden submission 164 - 'Chien', by Alex Miller, http://www.pixul.n=
-et/=20
- http://www.csszengarden.com/?cssfile=3D/164/164.css&page=3D2
-=20
- css released under Creative Commons License - http://creativecommons.org/li=
-censes/by-nc-sa/1.0/=20
-*/
-
- at import url(../w3-html40-recommended.css);
-
-html, body, div, ul, ol, p, li {
-=09margin: 0;
-=09border: 0;
-=09padding: 0;
-}
-
-html {
-=09background-image: url(img/background.gif);
-=09font-family: verdana, arial, serif;
-=09font-size: 82%;
-=09line-height: 120%;
-=09color: #333;
-}
-
-body {
-=09background-image: url(img/containerbackground.gif);
-=09background-repeat: repeat-y;
-=09width: 590px;
-=09margin-left: auto;
-=09margin-right: auto;
-=09padding: 0 38px 0 37px;
-}
-
-ul, ol, p {
-=09padding: 0 12px 10px 12px;
-}
-
-ul, ol {
-=09list-style-position: outside;
-=09padding-left: 16px;
-=09margin-left: 0px;
-}
-
-li {
-=09margin-left: 15px;
-=09margin-bottom: 8px;
-}
-
-h2 {
-=09margin: 20px 0 15px 0;
-=09padding: 0;
-=09text-align: center;
-=09font-size: 130%;
-}
-
-img {
-=09border: 0;
-}
-
-a:link {
-=09text-decoration: none;
-=09color: #CC0000;
-}
-=09
-a:visited {
-=09text-decoration: none;
-=09color: #CC6666;
-}
-=09
-a:hover {
-=09text-decoration: underline;
-=09color: #CC0000;
-}
-
-#header {
-=09color: #d88;
-=09background-color: rgb(156,26,0);
-=09padding: 20px;
-=09margin-bottom: 20px;
-}
-
-#header h1 {
- =09color: #eaa;
-}
-
-#content {
-=09float: left;
-=09width: 389px;
-}
-
-#content h2 {
-=09text-align:center;
-=09color: #ffffff;
-=09background-image: url(img/bgheader-content.png);
-=09background-position: left;
-=09height: 28px;
-=09padding-top: 6px;
-}
-
-#sideBar {
-=09float: right;
-=09width: 192px;
-}
-
-#sideBar h2 {
-=09background-color: #f7b356;
-=09color: #fff;
-=09background-image: url(img/bgheader-sidebar.png);
-=09background-position: left;
-=09height: 28px;
-=09padding-top: 6px;
-}
-
-#preamble {
-=09font-size: 82%;
-=09color: #996666;
-}
-
-#footer {
-=09clear: both;
-=09border-top: 1px solid #999;
-=09padding: 6px 0 6px 0;
-=09background-color: #FFF;
-=09font-weight: bold;
-=09text-align: center;
-}
-
-
-
-------=_NextPart_000_0000_B40804DE.BBCA09DC
-Content-Type: text/css
-Content-Transfer-Encoding: quoted-printable
-Content-Location: index_files/print.css
-
-html, body {
-=09color: #000;
-=09background: #fff;
-=09font-family: "Times New Roman", "Times", serif;
-=09font-size: 100%;
-=09line-height: 110%;
-}
-
-
-------=_NextPart_000_0000_B40804DE.BBCA09DC
-Content-Type: image/png
-Content-Transfer-Encoding: base64
-Content-Location: index_files/sflogo.png
-

-
-------=_NextPart_000_0000_B40804DE.BBCA09DC--

Deleted: trunk/dna-repository/src/test/resources/docs/mhtml-internet-explorer.mht
===================================================================
--- trunk/dna-repository/src/test/resources/docs/mhtml-internet-explorer.mht	2009-06-04 21:46:34 UTC (rev 976)
+++ trunk/dna-repository/src/test/resources/docs/mhtml-internet-explorer.mht	2009-06-04 22:31:30 UTC (rev 977)
@@ -1,1223 +0,0 @@
-From: <Saved by Microsoft Internet Explorer 5>
-Subject: Aperture Framework
-Date: Fri, 10 Mar 2006 13:41:34 +0100
-MIME-Version: 1.0
-Content-Type: multipart/related;
-	type="text/html";
-	boundary="----=_NextPart_000_0000_01C64448.58F51A70"
-X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2900.2180
-
-This is a multi-part message in MIME format.
-
-------=_NextPart_000_0000_01C64448.58F51A70
-Content-Type: text/html;
-	charset="iso-8859-1"
-Content-Transfer-Encoding: quoted-printable
-Content-Location: http://aperture.sourceforge.net/
-
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" =
-"http://www.w3c.org/TR/1999/REC-html401-19991224/loose.dtd">
-<HTML><HEAD><TITLE>Aperture Framework</TITLE><!-- This document is =
-inspired by the content style at http://www.csszengarden.com -->
-<META http-equiv=3Dcontent-type content=3D"text/html; =
-charset=3Diso-8859-1">
-<META content=3D"Leo Sauermann, Christiaan Fluit" name=3Dauthor>
-<META content=3D"aperture, rdf, data" name=3Dkeywords>
-<SCRIPT type=3Dtext/javascript></SCRIPT>
-<LINK title=3DDefault media=3Dscreen=20
-href=3D"http://aperture.sourceforge.net/style/default/frontpage.css" =
-type=3Dtext/css=20
-rel=3Dstylesheet><LINK title=3DDefault media=3Dprint=20
-href=3D"http://aperture.sourceforge.net/style/default/print.css" =
-type=3Dtext/css=20
-rel=3Dstylesheet><LINK title=3DBasic media=3Dall=20
-href=3D"http://aperture.sourceforge.net/style/basic/all.css" =
-type=3Dtext/css=20
-rel=3D"alternate stylesheet">
-<META content=3D"MSHTML 6.00.2900.2802" name=3DGENERATOR></HEAD>
-<BODY>
-<DIV id=3Dheader>
-<H1>Aperture</H1>
-<H2>a Java framework for getting data and metadata</H2></DIV><!-- header =
--->
-<DIV id=3Dcontent>
-<DIV id=3Dpreamble>
-<P><B>Project name</B> </P>
-<P>From <A class=3Dext-link title=3Dhttp://www.webster.com/=20
-href=3D"http://www.webster.com/">Merriam-Webster Online</A>: </P>
-<P>Main Entry: <STRONG>ap=B7er=B7ture</STRONG> (sounds like <A =
-class=3Dext-link=20
-title=3Dhttp://cougar.eb.com/sound/a/apertu01.wav=20
-href=3D"http://cougar.eb.com/sound/a/apertu01.wav">this</A>)<BR>Pronuncia=
-tion:=20
-'ap-&amp;(r)-"chur, -ch&amp;r, -"tyur, -"tur<BR>Function: =
-noun<BR>Etymology:=20
-Middle English, from Latin apertura, from apertus, past participle of =
-aperire to=20
-open<BR></P>
-<OL>
-  <LI>an opening or open space : HOLE=20
-  <LI>a : the opening in a photographic lens that admits the light<BR>b =
-: the=20
-  diameter of the stop in an optical system that determines the diameter =
-of the=20
-  bundle of rays traversing the instrument<BR>c : the diameter of the =
-objective=20
-  lens or mirror of a telescope </LI></OL></DIV><!-- preamble -->
-<H2>News</H2>
-<P><B>March 6, 2006:</B> <A=20
-href=3D"https://sourceforge.net/project/showfiles.php?group_id=3D150969">=
-Aperture=20
-2006.1 alpha 2</A> released! </P>
-<P>This release adds support for crawling file systems, web sites, IMAP =
-and=20
-Outlook mail boxes. Furthermore, the number of supported file formats =
-has=20
-increased significantly. </P>
-<H2>Features</H2>
-<UL>
-  <LI>Crawl information systems such as file systems, websites, mail =
-boxes and=20
-  mail servers=20
-  <LI>Extract full-text and metadata from many common file formats=20
-  <LI>View files in their native applications=20
-  <LI>Ease of use: easy to learn, easy to code, easy to deploy in =
-industrial=20
-  projects=20
-  <LI>Flexible architecture: can be extended with custom file formats, =
-data=20
-  sources, etc., with support for deployment on OSGi platforms=20
-  <LI>Data exchange based on Semantic Web standards (e.g. RDF, SPARQL, =
-...)=20
-</LI></UL>
-<H2>Supported File Formats</H2>
-<UL>
-  <LI>Plain text=20
-  <LI>HTML, XHTML=20
-  <LI>XML=20
-  <LI>PDF (Portable Document Format)=20
-  <LI>RTF (Rich Text Format)=20
-  <LI>Microsoft Office: Word, Excel, Powerpoint, Visio, Publisher=20
-  <LI>Microsoft Works=20
-  <LI>OpenOffice 1.x: Writer, Calc, Impress, Draw=20
-  <LI>StarOffice 6.x - 7.x+: Writer, Calc, Impress, Draw=20
-  <LI>OpenDocument (OpenOffice 2.x, StarOffice 8.x)=20
-  <LI>Corel WordPerfect, Quattro, Presentations=20
-  <LI>Emails (.eml files) </LI></UL>
-<H2>Crawlers</H2>
-<P>Crawlers support the extraction of information from heterogenous data =
-
-sources. At the moment we support the following source types:</P>
-<UL>
-  <LI>File Systems (local, remote, removeable media)=20
-  <LI>Websites and intranets=20
-  <LI>IMAP e-mail servers=20
-  <LI>Microsoft Outlook (alpha) </LI></UL>
-<H2><A name=3Dsupport></A>Support</H2>
-<P>At this moment the project is still in alpha stage and we provide =
-only=20
-limited support. If you have any questions about the project, feel free =
-to join=20
-the <A =
-href=3D"https://sourceforge.net/mail/?group_id=3D150969">development=20
-mailinglist</A> and ask us. </P>
-<H2><A name=3Ddevelopment></A>Development</H2>
-<P>To use Aperture in your own projects, read the <A=20
-href=3D"http://aperture.sourceforge.net/documentation.html">documentation=
-</A> for=20
-information about requirements and code examples. </P>
-<P>If you are interested in contributing, feel free to contact the =
-project=20
-admins or join the <A=20
-href=3D"https://sourceforge.net/mail/?group_id=3D150969">development=20
-mailinglist</A>. We are very interested in new extractors and other=20
-contributions including crawlers. </P></DIV><!-- content -->
-<DIV id=3DsideBar>
-<P>Aperture is a Java framework for extracting and querying full-text =
-content=20
-and metadata from various information systems (e.g. file systems, web =
-sites,=20
-mail boxes) and the file formats (e.g. documents, images) occurring in =
-these=20
-systems. </P>
-<H2>Contents</H2>
-<UL>
-  <LI><A href=3D"http://aperture.sourceforge.net/index.html">Home</A>=20
-  <LI><A=20
-  =
-href=3D"https://sourceforge.net/project/showfiles.php?group_id=3D150969">=
-Download</A>=20
-
-  <LI><A=20
-  =
-href=3D"http://aperture.sourceforge.net/doc/javadoc/index.html">Javadoc</=
-A>=20
-  <LI><A=20
-  =
-href=3D"http://aperture.sourceforge.net/documentation.html">Documentation=
-</A>=20
-  <LI><A href=3D"http://aperture.sourceforge.net/faq.html">FAQ</A>=20
-  <LI><A =
-href=3D"http://aperture.sourceforge.net/index.html#support">Support</A>=20
-  <LI><A=20
-  =
-href=3D"http://aperture.sourceforge.net/index.html#development">Developme=
-nt</A>=20
-  <LI><A =
-href=3D"http://aperture.sourceforge.net/license.html">License</A>=20
-</LI></UL>
-<H2>Developed By</H2>
-<UL>
-  <LI><A href=3D"http://aduna.biz/">Aduna</A>=20
-  <LI><A href=3D"http://www.dfki.de/">DFKI</A> </LI></UL>
-<H2>Site Info</H2>
-<P>Hosted by <A href=3D"http://sourceforge.net/">SourceForge.net</A> =
-</P>
-<P><A href=3D"http://sourceforge.net/"><IMG class=3Dlogo height=3D37=20
-alt=3D"SourceForge.net Logo"=20
-src=3D"http://sourceforge.net/sflogo.php?group_id=3D150969&amp;type=3D2" =
-
-width=3D125></A> </P>
-<P><BR>Graphical design by <A =
-href=3D"http://www.pixul.net/">Pixul.net</A>. Used=20
-with permission. </P></DIV><!-- sideBar -->
-<DIV id=3Dfooter><A title=3D"Check the validity of this site=92s XHTML"=20
-href=3D"http://validator.w3.org/check/referer">xhtml</A> &nbsp;<A=20
-title=3D"Check the validity of this site=92s CSS"=20
-href=3D"http://jigsaw.w3.org/css-validator/check/referer">css</A> =
-</DIV><!-- footer --></BODY></HTML>
-
-------=_NextPart_000_0000_01C64448.58F51A70
-Content-Type: application/octet-stream
-Content-Transfer-Encoding: base64
-Content-Location: http://sourceforge.net/sflogo.php?group_id=150969&type=2
-

-
-------=_NextPart_000_0000_01C64448.58F51A70
-Content-Type: text/css;
-	charset="iso-8859-1"
-Content-Transfer-Encoding: quoted-printable
-Content-Location: http://aperture.sourceforge.net/w3-html40-recommended.css
-
-HTML {
-	DISPLAY: block
-}
-ADDRESS {
-	DISPLAY: block
-}
-BLOCKQUOTE {
-	DISPLAY: block
-}
-BODY {
-	DISPLAY: block
-}
-DD {
-	DISPLAY: block
-}
-DIV {
-	DISPLAY: block
-}
-DL {
-	DISPLAY: block
-}
-DT {
-	DISPLAY: block
-}
-FIELDSET {
-	DISPLAY: block
-}
-FORM {
-	DISPLAY: block
-}
-FRAME {
-	DISPLAY: block
-}
-FRAMESET {
-	DISPLAY: block
-}
-H1 {
-	DISPLAY: block
-}
-H2 {
-	DISPLAY: block
-}
-H3 {
-	DISPLAY: block
-}
-H4 {
-	DISPLAY: block
-}
-H5 {
-	DISPLAY: block
-}
-H6 {
-	DISPLAY: block
-}
-NOFRAMES {
-	DISPLAY: block
-}
-OL {
-	DISPLAY: block
-}
-P {
-	DISPLAY: block
-}
-UL {
-	DISPLAY: block
-}
-CENTER {
-	DISPLAY: block
-}
-DIR {
-	DISPLAY: block
-}
-HR {
-	DISPLAY: block
-}
-MENU {
-	DISPLAY: block
-}
-PRE {
-	DISPLAY: block
-}
-LI {
-	DISPLAY: list-item
-}
-HEAD {
-	DISPLAY: none
-}
-TABLE {
-=09
-}
-TR {
-=09
-}
-THEAD {
-	DISPLAY: table-header-group
-}
-TBODY {
-=09
-}
-TFOOT {
-	DISPLAY: table-footer-group
-}
-COL {
-=09
-}
-COLGROUP {
-=09
-}
-TD {
-=09
-}
-TH {
-=09
-}
-CAPTION {
-=09
-}
-TH {
-	FONT-WEIGHT: bolder; TEXT-ALIGN: center
-}
-CAPTION {
-	TEXT-ALIGN: center
-}
-BODY {
-	MARGIN: 8px; LINE-HEIGHT: 1.12
-}
-H1 {
-	FONT-SIZE: 2em; MARGIN: 0.67em 0px
-}
-H2 {
-	FONT-SIZE: 1.5em; MARGIN: 0.75em 0px
-}
-H3 {
-	FONT-SIZE: 1.17em; MARGIN: 0.83em 0px
-}
-H4 {
-	MARGIN: 1.12em 0px
-}
-P {
-	MARGIN: 1.12em 0px
-}
-BLOCKQUOTE {
-	MARGIN: 1.12em 0px
-}
-UL {
-	MARGIN: 1.12em 0px
-}
-FIELDSET {
-	MARGIN: 1.12em 0px
-}
-FORM {
-	MARGIN: 1.12em 0px
-}
-OL {
-	MARGIN: 1.12em 0px
-}
-DL {
-	MARGIN: 1.12em 0px
-}
-DIR {
-	MARGIN: 1.12em 0px
-}
-MENU {
-	MARGIN: 1.12em 0px
-}
-H5 {
-	FONT-SIZE: 0.83em; MARGIN: 1.5em 0px
-}
-H6 {
-	FONT-SIZE: 0.75em; MARGIN: 1.67em 0px
-}
-H1 {
-	FONT-WEIGHT: bolder
-}
-H2 {
-	FONT-WEIGHT: bolder
-}
-H3 {
-	FONT-WEIGHT: bolder
-}
-H4 {
-	FONT-WEIGHT: bolder
-}
-H5 {
-	FONT-WEIGHT: bolder
-}
-H6 {
-	FONT-WEIGHT: bolder
-}
-B {
-	FONT-WEIGHT: bolder
-}
-STRONG {
-	FONT-WEIGHT: bolder
-}
-BLOCKQUOTE {
-	MARGIN-LEFT: 40px; MARGIN-RIGHT: 40px
-}
-I {
-	FONT-STYLE: italic
-}
-CITE {
-	FONT-STYLE: italic
-}
-EM {
-	FONT-STYLE: italic
-}
-VAR {
-	FONT-STYLE: italic
-}
-ADDRESS {
-	FONT-STYLE: italic
-}
-PRE {
-	FONT-FAMILY: monospace
-}
-TT {
-	FONT-FAMILY: monospace
-}
-CODE {
-	FONT-FAMILY: monospace
-}
-KBD {
-	FONT-FAMILY: monospace
-}
-SAMP {
-	FONT-FAMILY: monospace
-}
-PRE {
-	WHITE-SPACE: pre
-}
-BUTTON {
-=09
-}
-TEXTAREA {
-=09
-}
-INPUT {
-=09
-}
-OBJECT {
-=09
-}
-SELECT {
-=09
-}
-BIG {
-	FONT-SIZE: 1.17em
-}
-SMALL {
-	FONT-SIZE: 0.83em
-}
-SUB {
-	FONT-SIZE: 0.83em
-}
-SUP {
-	FONT-SIZE: 0.83em
-}
-SUB {
-	VERTICAL-ALIGN: sub
-}
-SUP {
-	VERTICAL-ALIGN: super
-}
-TABLE {
-	border-spacing: 2px
-}
-THEAD {
-	VERTICAL-ALIGN: middle
-}
-TBODY {
-	VERTICAL-ALIGN: middle
-}
-TFOOT {
-	VERTICAL-ALIGN: middle
-}
-TD {
-	VERTICAL-ALIGN: inherit
-}
-TH {
-	VERTICAL-ALIGN: inherit
-}
-S {
-	TEXT-DECORATION: line-through
-}
-STRIKE {
-	TEXT-DECORATION: line-through
-}
-DEL {
-	TEXT-DECORATION: line-through
-}
-HR {
-	BORDER-RIGHT: 1px inset; BORDER-TOP: 1px inset; BORDER-LEFT: 1px inset; =
-BORDER-BOTTOM: 1px inset
-}
-OL {
-	MARGIN-LEFT: 40px
-}
-UL {
-	MARGIN-LEFT: 40px
-}
-DIR {
-	MARGIN-LEFT: 40px
-}
-MENU {
-	MARGIN-LEFT: 40px
-}
-DD {
-	MARGIN-LEFT: 40px
-}
-OL {
-	LIST-STYLE-TYPE: decimal
-}
-OL UL {
-	MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px
-}
-UL OL {
-	MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px
-}
-UL UL {
-	MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px
-}
-OL OL {
-	MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px
-}
-U {
-	TEXT-DECORATION: underline
-}
-INS {
-	TEXT-DECORATION: underline
-}
-BR:unknown {
-	content: "=0A=
-"
-}
-:unknown {
-	WHITE-SPACE: pre
-}
-:unknown {
-	WHITE-SPACE: pre
-}
-CENTER {
-	TEXT-ALIGN: center
-}
-abbr {
-	LETTER-SPACING: 0.1em; FONT-VARIANT: small-caps
-}
-ACRONYM {
-	LETTER-SPACING: 0.1em; FONT-VARIANT: small-caps
-}
-:link {
-	TEXT-DECORATION: underline
-}
-:visited {
-	TEXT-DECORATION: underline
-}
-:unknown {
-	outline: thin dotted invert
-}
-UNKNOWN {
-	DIRECTION: ltr; unicode-bidi: bidi-override
-}
-UNKNOWN {
-	DIRECTION: rtl; unicode-bidi: bidi-override
-}
-UNKNOWN {
-	DIRECTION: ltr; unicode-bidi: embed
-}
-UNKNOWN {
-	DIRECTION: rtl; unicode-bidi: embed
-}
-
- at media Print   =20
-{
-H1 {
-	PAGE-BREAK-BEFORE: always
-}
-H1 {
-=09
-}
-H2 {
-=09
-}
-H3 {
-=09
-}
-H4 {
-=09
-}
-H5 {
-=09
-}
-H6 {
-=09
-}
-UL {
-=09
-}
-OL {
-=09
-}
-DL {
-=09
-}
-
-}
-
-------=_NextPart_000_0000_01C64448.58F51A70
-Content-Type: text/css;
-	charset="iso-8859-1"
-Content-Transfer-Encoding: quoted-printable
-Content-Location: http://aperture.sourceforge.net/style/default/frontpage.css
-
- at import url( ../w3-html40-recommended.css );
-HTML {
-	BORDER-TOP-WIDTH: 0px; PADDING-RIGHT: 0px; PADDING-LEFT: 0px; =
-BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; PADDING-BOTTOM: 0px; =
-MARGIN: 0px; PADDING-TOP: 0px; BORDER-RIGHT-WIDTH: 0px
-}
-BODY {
-	BORDER-TOP-WIDTH: 0px; PADDING-RIGHT: 0px; PADDING-LEFT: 0px; =
-BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; PADDING-BOTTOM: 0px; =
-MARGIN: 0px; PADDING-TOP: 0px; BORDER-RIGHT-WIDTH: 0px
-}
-DIV {
-	BORDER-TOP-WIDTH: 0px; PADDING-RIGHT: 0px; PADDING-LEFT: 0px; =
-BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; PADDING-BOTTOM: 0px; =
-MARGIN: 0px; PADDING-TOP: 0px; BORDER-RIGHT-WIDTH: 0px
-}
-UL {
-	BORDER-TOP-WIDTH: 0px; PADDING-RIGHT: 0px; PADDING-LEFT: 0px; =
-BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; PADDING-BOTTOM: 0px; =
-MARGIN: 0px; PADDING-TOP: 0px; BORDER-RIGHT-WIDTH: 0px
-}
-OL {
-	BORDER-TOP-WIDTH: 0px; PADDING-RIGHT: 0px; PADDING-LEFT: 0px; =
-BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; PADDING-BOTTOM: 0px; =
-MARGIN: 0px; PADDING-TOP: 0px; BORDER-RIGHT-WIDTH: 0px
-}
-P {
-	BORDER-TOP-WIDTH: 0px; PADDING-RIGHT: 0px; PADDING-LEFT: 0px; =
-BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; PADDING-BOTTOM: 0px; =
-MARGIN: 0px; PADDING-TOP: 0px; BORDER-RIGHT-WIDTH: 0px
-}
-LI {
-	BORDER-TOP-WIDTH: 0px; PADDING-RIGHT: 0px; PADDING-LEFT: 0px; =
-BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; PADDING-BOTTOM: 0px; =
-MARGIN: 0px; PADDING-TOP: 0px; BORDER-RIGHT-WIDTH: 0px
-}
-HTML {
-	FONT-SIZE: 82%; BACKGROUND-IMAGE: url(img/background.gif); COLOR: #333; =
-LINE-HEIGHT: 120%; FONT-FAMILY: verdana, arial, serif
-}
-BODY {
-	PADDING-RIGHT: 38px; PADDING-LEFT: 37px; BACKGROUND-IMAGE: =
-url(img/containerbackground.gif); PADDING-BOTTOM: 0px; MARGIN-LEFT: =
-auto; WIDTH: 590px; MARGIN-RIGHT: auto; PADDING-TOP: 0px; =
-BACKGROUND-REPEAT: repeat-y
-}
-UL {
-	PADDING-RIGHT: 12px; PADDING-LEFT: 12px; PADDING-BOTTOM: 10px; =
-PADDING-TOP: 0px
-}
-OL {
-	PADDING-RIGHT: 12px; PADDING-LEFT: 12px; PADDING-BOTTOM: 10px; =
-PADDING-TOP: 0px
-}
-P {
-	PADDING-RIGHT: 12px; PADDING-LEFT: 12px; PADDING-BOTTOM: 10px; =
-PADDING-TOP: 0px
-}
-UL {
-	PADDING-LEFT: 16px; LIST-STYLE-POSITION: outside; MARGIN-LEFT: 0px
-}
-OL {
-	PADDING-LEFT: 16px; LIST-STYLE-POSITION: outside; MARGIN-LEFT: 0px
-}
-LI {
-	MARGIN-BOTTOM: 8px; MARGIN-LEFT: 15px
-}
-H2 {
-	PADDING-RIGHT: 0px; PADDING-LEFT: 0px; FONT-SIZE: 130%; PADDING-BOTTOM: =
-0px; MARGIN: 20px 0px 15px; PADDING-TOP: 0px; TEXT-ALIGN: center
-}
-IMG {
-	BORDER-TOP-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: =
-0px; BORDER-RIGHT-WIDTH: 0px
-}
-A:link {
-	COLOR: #cc0000; TEXT-DECORATION: none
-}
-A:visited {
-	COLOR: #cc6666; TEXT-DECORATION: none
-}
-A:hover {
-	COLOR: #cc0000; TEXT-DECORATION: underline
-}
-#header {
-	PADDING-RIGHT: 20px; PADDING-LEFT: 20px; MARGIN-BOTTOM: 20px; =
-PADDING-BOTTOM: 20px; COLOR: #d88; PADDING-TOP: 20px; BACKGROUND-COLOR: =
-rgb(156,26,0)
-}
-#header H1 {
-	COLOR: #eaa
-}
-#content {
-	FLOAT: left; WIDTH: 389px
-}
-#content H2 {
-	BACKGROUND-POSITION: left 50%; BACKGROUND-IMAGE: =
-url(img/bgheader-content.png); COLOR: #ffffff; PADDING-TOP: 6px; HEIGHT: =
-28px; TEXT-ALIGN: center
-}
-#sideBar {
-	FLOAT: right; WIDTH: 192px
-}
-#sideBar H2 {
-	BACKGROUND-POSITION: left 50%; BACKGROUND-IMAGE: =
-url(img/bgheader-sidebar.png); COLOR: #fff; PADDING-TOP: 6px; HEIGHT: =
-28px; BACKGROUND-COLOR: #f7b356
-}
-#preamble {
-	FONT-SIZE: 82%; COLOR: #996666
-}
-#footer {
-	CLEAR: both; PADDING-RIGHT: 0px; BORDER-TOP: #999 1px solid; =
-PADDING-LEFT: 0px; FONT-WEIGHT: bold; PADDING-BOTTOM: 6px; PADDING-TOP: =
-6px; BACKGROUND-COLOR: #fff; TEXT-ALIGN: center
-}
-
-------=_NextPart_000_0000_01C64448.58F51A70
-Content-Type: text/css;
-	charset="iso-8859-1"
-Content-Transfer-Encoding: quoted-printable
-Content-Location: http://aperture.sourceforge.net/style/default/print.css
-
-HTML {
-	FONT-SIZE: 100%; BACKGROUND: #fff; COLOR: #000; LINE-HEIGHT: 110%; =
-FONT-FAMILY: "Times New Roman", "Times", serif
-}
-BODY {
-	FONT-SIZE: 100%; BACKGROUND: #fff; COLOR: #000; LINE-HEIGHT: 110%; =
-FONT-FAMILY: "Times New Roman", "Times", serif
-}
-
-------=_NextPart_000_0000_01C64448.58F51A70
-Content-Type: text/css;
-	charset="iso-8859-1"
-Content-Transfer-Encoding: quoted-printable
-Content-Location: http://aperture.sourceforge.net/w3-html40-recommended.css
-
-HTML {
-	DISPLAY: block
-}
-ADDRESS {
-	DISPLAY: block
-}
-BLOCKQUOTE {
-	DISPLAY: block
-}
-BODY {
-	DISPLAY: block
-}
-DD {
-	DISPLAY: block
-}
-DIV {
-	DISPLAY: block
-}
-DL {
-	DISPLAY: block
-}
-DT {
-	DISPLAY: block
-}
-FIELDSET {
-	DISPLAY: block
-}
-FORM {
-	DISPLAY: block
-}
-FRAME {
-	DISPLAY: block
-}
-FRAMESET {
-	DISPLAY: block
-}
-H1 {
-	DISPLAY: block
-}
-H2 {
-	DISPLAY: block
-}
-H3 {
-	DISPLAY: block
-}
-H4 {
-	DISPLAY: block
-}
-H5 {
-	DISPLAY: block
-}
-H6 {
-	DISPLAY: block
-}
-NOFRAMES {
-	DISPLAY: block
-}
-OL {
-	DISPLAY: block
-}
-P {
-	DISPLAY: block
-}
-UL {
-	DISPLAY: block
-}
-CENTER {
-	DISPLAY: block
-}
-DIR {
-	DISPLAY: block
-}
-HR {
-	DISPLAY: block
-}
-MENU {
-	DISPLAY: block
-}
-PRE {
-	DISPLAY: block
-}
-LI {
-	DISPLAY: list-item
-}
-HEAD {
-	DISPLAY: none
-}
-TABLE {
-=09
-}
-TR {
-=09
-}
-THEAD {
-	DISPLAY: table-header-group
-}
-TBODY {
-=09
-}
-TFOOT {
-	DISPLAY: table-footer-group
-}
-COL {
-=09
-}
-COLGROUP {
-=09
-}
-TD {
-=09
-}
-TH {
-=09
-}
-CAPTION {
-=09
-}
-TH {
-	FONT-WEIGHT: bolder; TEXT-ALIGN: center
-}
-CAPTION {
-	TEXT-ALIGN: center
-}
-BODY {
-	MARGIN: 8px; LINE-HEIGHT: 1.12
-}
-H1 {
-	FONT-SIZE: 2em; MARGIN: 0.67em 0px
-}
-H2 {
-	FONT-SIZE: 1.5em; MARGIN: 0.75em 0px
-}
-H3 {
-	FONT-SIZE: 1.17em; MARGIN: 0.83em 0px
-}
-H4 {
-	MARGIN: 1.12em 0px
-}
-P {
-	MARGIN: 1.12em 0px
-}
-BLOCKQUOTE {
-	MARGIN: 1.12em 0px
-}
-UL {
-	MARGIN: 1.12em 0px
-}
-FIELDSET {
-	MARGIN: 1.12em 0px
-}
-FORM {
-	MARGIN: 1.12em 0px
-}
-OL {
-	MARGIN: 1.12em 0px
-}
-DL {
-	MARGIN: 1.12em 0px
-}
-DIR {
-	MARGIN: 1.12em 0px
-}
-MENU {
-	MARGIN: 1.12em 0px
-}
-H5 {
-	FONT-SIZE: 0.83em; MARGIN: 1.5em 0px
-}
-H6 {
-	FONT-SIZE: 0.75em; MARGIN: 1.67em 0px
-}
-H1 {
-	FONT-WEIGHT: bolder
-}
-H2 {
-	FONT-WEIGHT: bolder
-}
-H3 {
-	FONT-WEIGHT: bolder
-}
-H4 {
-	FONT-WEIGHT: bolder
-}
-H5 {
-	FONT-WEIGHT: bolder
-}
-H6 {
-	FONT-WEIGHT: bolder
-}
-B {
-	FONT-WEIGHT: bolder
-}
-STRONG {
-	FONT-WEIGHT: bolder
-}
-BLOCKQUOTE {
-	MARGIN-LEFT: 40px; MARGIN-RIGHT: 40px
-}
-I {
-	FONT-STYLE: italic
-}
-CITE {
-	FONT-STYLE: italic
-}
-EM {
-	FONT-STYLE: italic
-}
-VAR {
-	FONT-STYLE: italic
-}
-ADDRESS {
-	FONT-STYLE: italic
-}
-PRE {
-	FONT-FAMILY: monospace
-}
-TT {
-	FONT-FAMILY: monospace
-}
-CODE {
-	FONT-FAMILY: monospace
-}
-KBD {
-	FONT-FAMILY: monospace
-}
-SAMP {
-	FONT-FAMILY: monospace
-}
-PRE {
-	WHITE-SPACE: pre
-}
-BUTTON {
-=09
-}
-TEXTAREA {
-=09
-}
-INPUT {
-=09
-}
-OBJECT {
-=09
-}
-SELECT {
-=09
-}
-BIG {
-	FONT-SIZE: 1.17em
-}
-SMALL {
-	FONT-SIZE: 0.83em
-}
-SUB {
-	FONT-SIZE: 0.83em
-}
-SUP {
-	FONT-SIZE: 0.83em
-}
-SUB {
-	VERTICAL-ALIGN: sub
-}
-SUP {
-	VERTICAL-ALIGN: super
-}
-TABLE {
-	border-spacing: 2px
-}
-THEAD {
-	VERTICAL-ALIGN: middle
-}
-TBODY {
-	VERTICAL-ALIGN: middle
-}
-TFOOT {
-	VERTICAL-ALIGN: middle
-}
-TD {
-	VERTICAL-ALIGN: inherit
-}
-TH {
-	VERTICAL-ALIGN: inherit
-}
-S {
-	TEXT-DECORATION: line-through
-}
-STRIKE {
-	TEXT-DECORATION: line-through
-}
-DEL {
-	TEXT-DECORATION: line-through
-}
-HR {
-	BORDER-RIGHT: 1px inset; BORDER-TOP: 1px inset; BORDER-LEFT: 1px inset; =
-BORDER-BOTTOM: 1px inset
-}
-OL {
-	MARGIN-LEFT: 40px
-}
-UL {
-	MARGIN-LEFT: 40px
-}
-DIR {
-	MARGIN-LEFT: 40px
-}
-MENU {
-	MARGIN-LEFT: 40px
-}
-DD {
-	MARGIN-LEFT: 40px
-}
-OL {
-	LIST-STYLE-TYPE: decimal
-}
-OL UL {
-	MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px
-}
-UL OL {
-	MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px
-}
-UL UL {
-	MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px
-}
-OL OL {
-	MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px
-}
-U {
-	TEXT-DECORATION: underline
-}
-INS {
-	TEXT-DECORATION: underline
-}
-BR:unknown {
-	content: "=0A=
-"
-}
-:unknown {
-	WHITE-SPACE: pre
-}
-:unknown {
-	WHITE-SPACE: pre
-}
-CENTER {
-	TEXT-ALIGN: center
-}
-abbr {
-	LETTER-SPACING: 0.1em; FONT-VARIANT: small-caps
-}
-ACRONYM {
-	LETTER-SPACING: 0.1em; FONT-VARIANT: small-caps
-}
-:link {
-	TEXT-DECORATION: underline
-}
-:visited {
-	TEXT-DECORATION: underline
-}
-:unknown {
-	outline: thin dotted invert
-}
-UNKNOWN {
-	DIRECTION: ltr; unicode-bidi: bidi-override
-}
-UNKNOWN {
-	DIRECTION: rtl; unicode-bidi: bidi-override
-}
-UNKNOWN {
-	DIRECTION: ltr; unicode-bidi: embed
-}
-UNKNOWN {
-	DIRECTION: rtl; unicode-bidi: embed
-}
-
- at media Print   =20
-{
-H1 {
-	PAGE-BREAK-BEFORE: always
-}
-H1 {
-=09
-}
-H2 {
-=09
-}
-H3 {
-=09
-}
-H4 {
-=09
-}
-H5 {
-=09
-}
-H6 {
-=09
-}
-UL {
-=09
-}
-OL {
-=09
-}
-DL {
-=09
-}
-
-}
-
-------=_NextPart_000_0000_01C64448.58F51A70
-Content-Type: text/css;
-	charset="iso-8859-1"
-Content-Transfer-Encoding: quoted-printable
-Content-Location: http://aperture.sourceforge.net/style/basic/all.css
-
- at import url( ../w3-html40-recommended.css );
-IMG {
-	BORDER-TOP-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: =
-0px; BORDER-RIGHT-WIDTH: 0px
-}
-
-------=_NextPart_000_0000_01C64448.58F51A70--

Deleted: trunk/dna-repository/src/test/resources/docs/microsoft-excel-2000.xls
===================================================================
(Binary files differ)

Deleted: trunk/dna-repository/src/test/resources/docs/microsoft-excel-2007beta2.xlam
===================================================================
(Binary files differ)

Deleted: trunk/dna-repository/src/test/resources/docs/microsoft-excel-2007beta2.xlsb
===================================================================
(Binary files differ)

Deleted: trunk/dna-repository/src/test/resources/docs/microsoft-excel-2007beta2.xlsm
===================================================================
(Binary files differ)

Deleted: trunk/dna-repository/src/test/resources/docs/microsoft-excel-2007beta2.xlsx
===================================================================
(Binary files differ)

Deleted: trunk/dna-repository/src/test/resources/docs/microsoft-excel-2007beta2.xltm
===================================================================
(Binary files differ)

Deleted: trunk/dna-repository/src/test/resources/docs/microsoft-excel-2007beta2.xltx
===================================================================
(Binary files differ)

Deleted: trunk/dna-repository/src/test/resources/docs/microsoft-powerpoint-2000.ppt
===================================================================
(Binary files differ)

Deleted: trunk/dna-repository/src/test/resources/docs/microsoft-powerpoint-2007beta2.potm
===================================================================
(Binary files differ)

Deleted: trunk/dna-repository/src/test/resources/docs/microsoft-powerpoint-2007beta2.potx
===================================================================
(Binary files differ)

Deleted: trunk/dna-repository/src/test/resources/docs/microsoft-powerpoint-2007beta2.ppsm
===================================================================
(Binary files differ)

Deleted: trunk/dna-repository/src/test/resources/docs/microsoft-powerpoint-2007beta2.ppsx
===================================================================
(Binary files differ)

Deleted: trunk/dna-repository/src/test/resources/docs/microsoft-powerpoint-2007beta2.pptm
===================================================================
(Binary files differ)

Deleted: trunk/dna-repository/src/test/resources/docs/microsoft-powerpoint-2007beta2.pptx
===================================================================
(Binary files differ)

Deleted: trunk/dna-repository/src/test/resources/docs/microsoft-publisher-2003.pub
===================================================================
(Binary files differ)

Deleted: trunk/dna-repository/src/test/resources/docs/microsoft-visio.vsd
===================================================================
(Binary files differ)

Deleted: trunk/dna-repository/src/test/resources/docs/microsoft-word-2000-with-wrong-file-extension.pdf
===================================================================
(Binary files differ)

Deleted: trunk/dna-repository/src/test/resources/docs/microsoft-word-2000.doc
===================================================================
(Binary files differ)

Deleted: trunk/dna-repository/src/test/resources/docs/microsoft-word-2007beta2.docm
===================================================================
(Binary files differ)

Deleted: trunk/dna-repository/src/test/resources/docs/microsoft-word-2007beta2.docx
===================================================================
(Binary files differ)

Deleted: trunk/dna-repository/src/test/resources/docs/microsoft-word-2007beta2.dotm
===================================================================
(Binary files differ)

Deleted: trunk/dna-repository/src/test/resources/docs/microsoft-word-2007beta2.dotx
===================================================================
(Binary files differ)

Deleted: trunk/dna-repository/src/test/resources/docs/microsoft-works-spreadsheet-3.0.wks
===================================================================
(Binary files differ)

Deleted: trunk/dna-repository/src/test/resources/docs/microsoft-works-spreadsheet-4.0-2000.wks
===================================================================
(Binary files differ)

Deleted: trunk/dna-repository/src/test/resources/docs/microsoft-works-spreadsheet-7.0.xlr
===================================================================
(Binary files differ)

Deleted: trunk/dna-repository/src/test/resources/docs/microsoft-works-word-processor-2000.wps
===================================================================
(Binary files differ)

Deleted: trunk/dna-repository/src/test/resources/docs/microsoft-works-word-processor-3.0.wps
===================================================================
(Binary files differ)

Deleted: trunk/dna-repository/src/test/resources/docs/microsoft-works-word-processor-4.0.wps
===================================================================
(Binary files differ)

Deleted: trunk/dna-repository/src/test/resources/docs/microsoft-works-word-processor-7.0.wps
===================================================================
(Binary files differ)

Deleted: trunk/dna-repository/src/test/resources/docs/openoffice-1.1.5-calc-template.stc
===================================================================
(Binary files differ)

Deleted: trunk/dna-repository/src/test/resources/docs/openoffice-1.1.5-calc.sxc
===================================================================
(Binary files differ)

Deleted: trunk/dna-repository/src/test/resources/docs/openoffice-1.1.5-draw-template.std
===================================================================
(Binary files differ)

Deleted: trunk/dna-repository/src/test/resources/docs/openoffice-1.1.5-draw.sxd
===================================================================
(Binary files differ)

Deleted: trunk/dna-repository/src/test/resources/docs/openoffice-1.1.5-impress-template.sti
===================================================================
(Binary files differ)

Deleted: trunk/dna-repository/src/test/resources/docs/openoffice-1.1.5-impress.sxi
===================================================================
(Binary files differ)

Deleted: trunk/dna-repository/src/test/resources/docs/openoffice-1.1.5-writer-template.stw
===================================================================
(Binary files differ)

Deleted: trunk/dna-repository/src/test/resources/docs/openoffice-1.1.5-writer.sxw
===================================================================
(Binary files differ)

Deleted: trunk/dna-repository/src/test/resources/docs/openoffice-2.0-calc-template.ots
===================================================================
(Binary files differ)

Deleted: trunk/dna-repository/src/test/resources/docs/openoffice-2.0-calc.ods
===================================================================
(Binary files differ)

Deleted: trunk/dna-repository/src/test/resources/docs/openoffice-2.0-draw-template.otg
===================================================================
(Binary files differ)

Deleted: trunk/dna-repository/src/test/resources/docs/openoffice-2.0-draw.odg
===================================================================
(Binary files differ)

Deleted: trunk/dna-repository/src/test/resources/docs/openoffice-2.0-formula.odf
===================================================================
(Binary files differ)

Deleted: trunk/dna-repository/src/test/resources/docs/openoffice-2.0-impress-template.otp
===================================================================
(Binary files differ)

Deleted: trunk/dna-repository/src/test/resources/docs/openoffice-2.0-impress.odp
===================================================================
(Binary files differ)

Deleted: trunk/dna-repository/src/test/resources/docs/openoffice-2.0-writer-template.ott
===================================================================
(Binary files differ)

Deleted: trunk/dna-repository/src/test/resources/docs/openoffice-2.0-writer.odt
===================================================================
(Binary files differ)

Deleted: trunk/dna-repository/src/test/resources/docs/pdf-distiller-6-weirdchars.pdf
===================================================================
(Binary files differ)

Deleted: trunk/dna-repository/src/test/resources/docs/pdf-no-author.pdf
===================================================================
(Binary files differ)

Deleted: trunk/dna-repository/src/test/resources/docs/pdf-openoffice-1.1.5-writer.pdf
===================================================================
(Binary files differ)

Deleted: trunk/dna-repository/src/test/resources/docs/pdf-openoffice-2.0-writer.pdf
===================================================================
(Binary files differ)

Deleted: trunk/dna-repository/src/test/resources/docs/pdf-word-2000-pdfcreator-0.8.0.pdf
===================================================================
(Binary files differ)

Deleted: trunk/dna-repository/src/test/resources/docs/pdf-word-2000-pdfmaker-7.0.pdf
===================================================================
(Binary files differ)

Deleted: trunk/dna-repository/src/test/resources/docs/pdf-word-2000-pdfwriter-7.0.pdf
===================================================================
(Binary files differ)

Deleted: trunk/dna-repository/src/test/resources/docs/plain-text-ansi.txt
===================================================================
--- trunk/dna-repository/src/test/resources/docs/plain-text-ansi.txt	2009-06-04 21:46:34 UTC (rev 976)
+++ trunk/dna-repository/src/test/resources/docs/plain-text-ansi.txt	2009-06-04 22:31:30 UTC (rev 977)
@@ -1 +0,0 @@
-test
\ No newline at end of file

Deleted: trunk/dna-repository/src/test/resources/docs/plain-text-empty.txt
===================================================================

Deleted: trunk/dna-repository/src/test/resources/docs/plain-text-utf16be.txt
===================================================================
(Binary files differ)

Deleted: trunk/dna-repository/src/test/resources/docs/plain-text-utf16le.txt
===================================================================
(Binary files differ)

Deleted: trunk/dna-repository/src/test/resources/docs/plain-text-utf8.txt
===================================================================
--- trunk/dna-repository/src/test/resources/docs/plain-text-utf8.txt	2009-06-04 21:46:34 UTC (rev 976)
+++ trunk/dna-repository/src/test/resources/docs/plain-text-utf8.txt	2009-06-04 22:31:30 UTC (rev 977)
@@ -1 +0,0 @@
-???test
\ No newline at end of file

Deleted: trunk/dna-repository/src/test/resources/docs/plain-text-with-null-character.txt
===================================================================
(Binary files differ)

Deleted: trunk/dna-repository/src/test/resources/docs/plain-text-without-extension
===================================================================
--- trunk/dna-repository/src/test/resources/docs/plain-text-without-extension	2009-06-04 21:46:34 UTC (rev 976)
+++ trunk/dna-repository/src/test/resources/docs/plain-text-without-extension	2009-06-04 22:31:30 UTC (rev 977)
@@ -1 +0,0 @@
-This is a normal plain text document.

Deleted: trunk/dna-repository/src/test/resources/docs/plain-text.txt
===================================================================
--- trunk/dna-repository/src/test/resources/docs/plain-text.txt	2009-06-04 21:46:34 UTC (rev 976)
+++ trunk/dna-repository/src/test/resources/docs/plain-text.txt	2009-06-04 22:31:30 UTC (rev 977)
@@ -1 +0,0 @@
-This is a normal plain text document.

Deleted: trunk/dna-repository/src/test/resources/docs/rtf-openoffice-1.1.5.rtf
===================================================================
--- trunk/dna-repository/src/test/resources/docs/rtf-openoffice-1.1.5.rtf	2009-06-04 21:46:34 UTC (rev 976)
+++ trunk/dna-repository/src/test/resources/docs/rtf-openoffice-1.1.5.rtf	2009-06-04 22:31:30 UTC (rev 977)
@@ -1,16 +0,0 @@
-{\rtf1\ansi\deff0\adeflang1025
-{\fonttbl{\f0\froman\fprq2\fcharset0 Times New Roman;}{\f1\froman\fprq2\fcharset0 Times New Roman;}{\f2\fnil\fprq2\fcharset0 Lucida Sans Unicode;}{\f3\fnil\fprq2\fcharset0 Tahoma;}{\f4\fnil\fprq0\fcharset0 Tahoma;}}
-{\colortbl;\red0\green0\blue0;\red128\green128\blue128;}
-{\stylesheet{\s1\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af3\afs24\lang255\ltrch\dbch\af2\afs24\langfe255\loch\f0\fs24\lang1033\snext1 Default;}
-{\s2\sa120\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af3\afs24\lang255\ltrch\dbch\af2\afs24\langfe255\loch\f0\fs24\lang1033\sbasedon1\snext2 Text body;}
-{\s3\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af4\afs24\lang255\ltrch\dbch\af2\afs24\langfe255\loch\f0\fs24\lang1033\sbasedon2\snext3 List;}
-{\s4\sb120\sa120\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af4\afs20\lang255\ai\ltrch\dbch\af2\afs20\langfe255\ai\loch\f0\fs20\lang1033\i\sbasedon1\snext4 Caption;}
-{\s5\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af4\afs24\lang255\ltrch\dbch\af2\afs24\langfe255\loch\f0\fs24\lang1033\sbasedon1\snext5 Index;}
-}
-{\info{\author Christiaan Fluit}{\creatim\yr2006\mo1\dy30\hr15\min10}{\operator Christiaan Fluit}{\revtim\yr2006\mo1\dy30\hr15\min10}{\printim\yr1601\mo1\dy1\hr0\min0}{\comment StarWriter}{\vern6450}}\deftab709
-{\*\pgdsctbl
-{\pgdsc0\pgdscuse195\pgwsxn11905\pghsxn16837\marglsxn1800\margrsxn1800\margtsxn1440\margbsxn1440\pgdscnxt0 Default;}}
-\paperh16837\paperw11905\margl1800\margr1800\margt1440\margb1440\sectd\sbknone\pgwsxn11905\pghsxn16837\marglsxn1800\margrsxn1800\margtsxn1440\margbsxn1440\ftnbj\ftnstart1\ftnrstcont\ftnnar\aenddoc\aftnrstcont\aftnstart1\aftnnrlc
-\pard\plain \ltrpar\s1\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af3\afs24\lang255\ltrch\dbch\af2\afs24\langfe255\loch\f0\fs24\lang1033 {\loch\f0\fs24\lang1033\i0\b0 This is an example RTF document created with OpenOffice 1.1.5}
-\par 
-\par }
\ No newline at end of file

Deleted: trunk/dna-repository/src/test/resources/docs/rtf-openoffice-2.0.rtf
===================================================================
--- trunk/dna-repository/src/test/resources/docs/rtf-openoffice-2.0.rtf	2009-06-04 21:46:34 UTC (rev 976)
+++ trunk/dna-repository/src/test/resources/docs/rtf-openoffice-2.0.rtf	2009-06-04 22:31:30 UTC (rev 977)
@@ -1,17 +0,0 @@
-{\rtf1\ansi\deff0\adeflang1025
-{\fonttbl{\f0\froman\fprq2\fcharset0 Times New Roman;}{\f1\froman\fprq2\fcharset0 Times New Roman;}{\f2\fswiss\fprq2\fcharset0 Arial;}{\f3\fnil\fprq2\fcharset0 Lucida Sans Unicode;}{\f4\fnil\fprq2\fcharset0 MS Mincho;}{\f5\fnil\fprq2\fcharset0 Tahoma;}{\f6\fnil\fprq0\fcharset0 Tahoma;}}
-{\colortbl;\red0\green0\blue0;\red128\green128\blue128;}
-{\stylesheet{\s1\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af5\afs24\lang255\ltrch\dbch\af3\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033\snext1 Normal;}
-{\s2\sb240\sa120\keepn\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\afs28\lang255\ltrch\dbch\af4\langfe255\hich\f2\fs28\lang1033\loch\f2\fs28\lang1033\sbasedon1\snext3 Heading;}
-{\s3\sa120\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af5\afs24\lang255\ltrch\dbch\af3\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033\sbasedon1\snext3 Body Text;}
-{\s4\sa120\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af6\afs24\lang255\ltrch\dbch\af3\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033\sbasedon3\snext4 List;}
-{\s5\sb120\sa120\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af6\afs24\lang255\ai\ltrch\dbch\af3\langfe255\hich\f0\fs24\lang1033\i\loch\f0\fs24\lang1033\i\sbasedon1\snext5 caption;}
-{\s6\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af6\afs24\lang255\ltrch\dbch\af3\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033\sbasedon1\snext6 Index;}
-}
-{\info{\author Christiaan Fluit}{\creatim\yr2006\mo1\dy30\hr15\min8}{\revtim\yr1601\mo1\dy1\hr0\min0}{\printim\yr1601\mo1\dy1\hr0\min0}{\comment StarWriter}{\vern6800}}\deftab709
-{\*\pgdsctbl
-{\pgdsc0\pgdscuse195\pgwsxn12240\pghsxn15840\marglsxn1134\margrsxn1134\margtsxn1134\margbsxn1134\pgdscnxt0 Standard;}}
-\paperh15840\paperw12240\margl1134\margr1134\margt1134\margb1134\sectd\sbknone\pgwsxn12240\pghsxn15840\marglsxn1134\margrsxn1134\margtsxn1134\margbsxn1134\ftnbj\ftnstart1\ftnrstcont\ftnnar\aenddoc\aftnrstcont\aftnstart1\aftnnrlc
-\pard\plain \ltrpar\s1\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af5\afs24\lang255\ltrch\dbch\af3\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 This is an example RTF document created with OpenOffice 2.0.}
-\par \pard\plain \ltrpar\s1\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af5\afs24\lang255\ltrch\dbch\af3\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 
-\par }
\ No newline at end of file

Deleted: trunk/dna-repository/src/test/resources/docs/rtf-staroffice-5.2.rtf
===================================================================
--- trunk/dna-repository/src/test/resources/docs/rtf-staroffice-5.2.rtf	2009-06-04 21:46:34 UTC (rev 976)
+++ trunk/dna-repository/src/test/resources/docs/rtf-staroffice-5.2.rtf	2009-06-04 22:31:30 UTC (rev 977)
@@ -1,12 +0,0 @@
-{\rtf1\ansi\deff0
-{\fonttbl{\f0\froman\fprq2\fcharset0 Times New Roman;}}
-{\colortbl\red0\green0\blue0;\red255\green255\blue255;\red128\green128\blue128;}
-{\stylesheet{\s1\snext1 Standard;}
-}
-{\info{\comment StarWriter}{\vern5690}}\deftab720
-{\*\pgdsctbl
-{\pgdsc0\pgdscuse195\pgwsxn11905\pghsxn16837\marglsxn1800\margrsxn1800\margtsxn1440\margbsxn1440\pgdscnxt0 Standard;}}
-\paperh16837\paperw11905\margl1800\margr1800\margt1440\margb1440\sectd\sbknone\pgwsxn11905\pghsxn16837\marglsxn1800\margrsxn1800\margtsxn1440\margbsxn1440\ftnbj\ftnstart1\ftnrstcont\ftnnar\aenddoc\aftnrstcont\aftnstart1\aftnnrlc
-\pard\plain \s1 This is an example RTF document created with StarOffice 5.2.
-\par 
-\par }
\ No newline at end of file

Deleted: trunk/dna-repository/src/test/resources/docs/rtf-word-2000.rtf
===================================================================
--- trunk/dna-repository/src/test/resources/docs/rtf-word-2000.rtf	2009-06-04 21:46:34 UTC (rev 976)
+++ trunk/dna-repository/src/test/resources/docs/rtf-word-2000.rtf	2009-06-04 22:31:30 UTC (rev 977)
@@ -1,14 +0,0 @@
-{\rtf1\ansi\ansicpg1252\uc1 \deff0\deflang1033\deflangfe1033{\fonttbl{\f0\froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\f28\froman\fcharset238\fprq2 Times New Roman CE;}{\f29\froman\fcharset204\fprq2 Times New Roman Cyr;}
-{\f31\froman\fcharset161\fprq2 Times New Roman Greek;}{\f32\froman\fcharset162\fprq2 Times New Roman Tur;}{\f33\froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\f34\froman\fcharset178\fprq2 Times New Roman (Arabic);}
-{\f35\froman\fcharset186\fprq2 Times New Roman Baltic;}}{\colortbl;\red0\green0\blue0;\red0\green0\blue255;\red0\green255\blue255;\red0\green255\blue0;\red255\green0\blue255;\red255\green0\blue0;\red255\green255\blue0;\red255\green255\blue255;
-\red0\green0\blue128;\red0\green128\blue128;\red0\green128\blue0;\red128\green0\blue128;\red128\green0\blue0;\red128\green128\blue0;\red128\green128\blue128;\red192\green192\blue192;}{\stylesheet{
-\ql \li0\ri0\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \fs24\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 \snext0 Normal;}{\*\cs10 \additive Default Paragraph Font;}}{\info
-{\title This is an example RTF document created with Word 2000}{\author Christiaan Fluit}{\operator Christiaan Fluit}{\creatim\yr2006\mo1\dy30\hr15\min3}{\revtim\yr2006\mo1\dy30\hr15\min4}{\version1}{\edmins1}{\nofpages1}{\nofwords0}{\nofchars0}
-{\*\company Aduna}{\nofcharsws0}{\vern8229}}\widowctrl\ftnbj\aenddoc\noxlattoyen\expshrtn\noultrlspc\dntblnsbdb\nospaceforul\formshade\horzdoc\dgmargin\dghspace180\dgvspace180\dghorigin1800\dgvorigin1440\dghshow1\dgvshow1
-\jexpand\viewkind1\viewscale100\pgbrdrhead\pgbrdrfoot\splytwnine\ftnlytwnine\htmautsp\nolnhtadjtbl\useltbaln\alntblind\lytcalctblwd\lyttblrtgr\lnbrkrule \fet0\sectd \linex0\endnhere\sectlinegrid360\sectdefaultcl {\*\pnseclvl1
-\pnucrm\pnstart1\pnindent720\pnhang{\pntxta .}}{\*\pnseclvl2\pnucltr\pnstart1\pnindent720\pnhang{\pntxta .}}{\*\pnseclvl3\pndec\pnstart1\pnindent720\pnhang{\pntxta .}}{\*\pnseclvl4\pnlcltr\pnstart1\pnindent720\pnhang{\pntxta )}}{\*\pnseclvl5
-\pndec\pnstart1\pnindent720\pnhang{\pntxtb (}{\pntxta )}}{\*\pnseclvl6\pnlcltr\pnstart1\pnindent720\pnhang{\pntxtb (}{\pntxta )}}{\*\pnseclvl7\pnlcrm\pnstart1\pnindent720\pnhang{\pntxtb (}{\pntxta )}}{\*\pnseclvl8\pnlcltr\pnstart1\pnindent720\pnhang
-{\pntxtb (}{\pntxta )}}{\*\pnseclvl9\pnlcrm\pnstart1\pnindent720\pnhang{\pntxtb (}{\pntxta )}}\pard\plain \ql \li0\ri0\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \fs24\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {
-This is an example RTF document created with Word 2000.
-\par 
-\par }}
\ No newline at end of file

Deleted: trunk/dna-repository/src/test/resources/docs/staroffice-5.2-calc-template.vor
===================================================================
(Binary files differ)

Deleted: trunk/dna-repository/src/test/resources/docs/staroffice-5.2-calc.sdc
===================================================================
(Binary files differ)

Deleted: trunk/dna-repository/src/test/resources/docs/staroffice-5.2-draw-template.vor
===================================================================
(Binary files differ)

Deleted: trunk/dna-repository/src/test/resources/docs/staroffice-5.2-draw.sda
===================================================================
(Binary files differ)

Deleted: trunk/dna-repository/src/test/resources/docs/staroffice-5.2-impress-template.vor
===================================================================
(Binary files differ)

Deleted: trunk/dna-repository/src/test/resources/docs/staroffice-5.2-impress.sdd
===================================================================
(Binary files differ)

Deleted: trunk/dna-repository/src/test/resources/docs/staroffice-5.2-writer-template.vor
===================================================================
(Binary files differ)

Deleted: trunk/dna-repository/src/test/resources/docs/staroffice-5.2-writer.sdw
===================================================================
(Binary files differ)

Deleted: trunk/dna-repository/src/test/resources/docs/thunderbird-addressbook.mab
===================================================================
--- trunk/dna-repository/src/test/resources/docs/thunderbird-addressbook.mab	2009-06-04 21:46:34 UTC (rev 976)
+++ trunk/dna-repository/src/test/resources/docs/thunderbird-addressbook.mab	2009-06-04 22:31:30 UTC (rev 977)
@@ -1,1655 +0,0 @@
-// <!-- <mdb:mork:z v="1.4"/> -->
-< <(a=c)> // (f=iso-8859-1)
-  (B8=Custom4)(B9=Notes)(BA=LastModifiedDate)(BB=RecordKey)
-  (BC=AddrCharSet)(BD=LastRecordKey)(BE=ns:addrbk:db:table:kind:pab)
-  (BF=ListName)(C0=ListNickName)(C1=ListDescription)
-  (C2=ListTotalAddresses)(C3=LowercaseListName)
-  (C4=ns:addrbk:db:table:kind:deleted)
-  (80=ns:addrbk:db:row:scope:card:all)
-  (81=ns:addrbk:db:row:scope:list:all)
-  (82=ns:addrbk:db:row:scope:data:all)(83=FirstName)(84=LastName)
-  (85=PhoneticFirstName)(86=PhoneticLastName)(87=DisplayName)
-  (88=NickName)(89=PrimaryEmail)(8A=LowercasePrimaryEmail)
-  (8B=SecondEmail)(8C=DefaultEmail)(8D=CardType)(8E=PreferMailFormat)
-  (8F=WorkPhone)(90=HomePhone)(91=FaxNumber)(92=PagerNumber)
-  (93=CellularNumber)(94=WorkPhoneType)(95=HomePhoneType)
-  (96=FaxNumberType)(97=PagerNumberType)(98=CellularNumberType)
-  (99=HomeAddress)(9A=HomeAddress2)(9B=HomeCity)(9C=HomeState)
-  (9D=HomeZipCode)(9E=HomeCountry)(9F=WorkAddress)(A0=WorkAddress2)
-  (A1=WorkCity)(A2=WorkState)(A3=WorkZipCode)(A4=WorkCountry)
-  (A5=JobTitle)(A6=Department)(A7=Company)(A8=_AimScreenName)
-  (A9=AnniversaryYear)(AA=AnniversaryMonth)(AB=AnniversaryDay)
-  (AC=SpouseName)(AD=FamilyName)(AE=DefaultAddress)(AF=Category)
-  (B0=WebPage1)(B1=WebPage2)(B2=BirthYear)(B3=BirthMonth)(B4=BirthDay)
-  (B5=Custom1)(B6=Custom2)(B7=Custom3)>
-
-<(3B7=b3)(81=)(82=lillegris at lillegris.com)(80=0)(388=438ac9cc)(83=1)
-  (86=Ewan)(87=Lyle)(88=Ewan Lyle)(89=elyle at csd.abdn.ac.uk)(8A=2)(8B=N)
-  (8C=Murray)(8D=N Murray)(8E=nmurray at csd.abdn.ac.uk)(8F=3)(3A8=Sonja)
-  (21D=Schramm)(3A9=Sonja Schramm)(90=sonja.a.schramm at web.de)(3AA=43a9eb7d)
-  (91=4)(92=Mike)(93=Raffan)(94=Mike Raffan)(95=m.a.raffan at abdn.ac.uk)
-  (96=5)(97=Barry)(98=Evans)(99=Barry Evans)(9A=bluetooner at hotmail.com)
-  (9B=6)(AF="Sharon J.)(B0=Liddle")(B1="Sharon J. Liddle")(9C
-    =sharon.liddle at quista.net)(B2=4086ce51)(9D=7)(DD="Liddle, Christopher)
-  (DE=P")(DF="Liddle, Christopher P")(9E=christopher.liddle at eds.com)
-  (E0=409b46cd)(9F=8)(A7=Gunnar AAstrand)(A8=Grimnes)(A9
-    =Gunnar AAstrand Grimnes)(A0=ggrimnes at csd.abdn.ac.uk)(AA=40863b78)
-  (A1=9)(A2=Nir)(A3=Oren)(A4=Nir Oren)(A5=noren at csd.abdn.ac.uk)(A6=a)
-  (1C3=Rob)(1C4=Small)(1C5=Rob Small)(AB=rds_small at hotmail.com)(1C6
-    =416254eb)(AC=b)(C4=joe)(C5=bloggs)(C6=joe bloggs)(AD
-    =u10rjl at abdn.ac.uk)(C7=408e153d)(AE=c)(127=Mairi)(128=McCallum)
-  (129=Mairi McCallum)(B3=mmccallu at csd.abdn.ac.uk)(12A=40e17265)(B4=d)
-  (BC=Jonathan J)(BD=Mackintosh)(BE=Jonathan J Mackintosh)(B5
-    =jmackint at csd.abdn.ac.uk)(BF=408cdb5c)(B6=e)(C0=Pete)(C1=Edwards)
-  (C2=Pete Edwards)(B8=pedwards at csd.abdn.ac.uk)(C3=408e152c)(B9=f)(C8=Alun)
-  (C9=Preece)(CA=Alun Preece)(BA=apreece at csd.abdn.ac.uk)(CB=408e1540)
-  (BB=10)(CD=alan.gorman at semikolon.co.uk)(293=4221e627)(CE=11)(D0
-    =lfinlays at csd.abdn.ac.uk)(D2=409921f1)(D1=12)(D3=Sara AAstrand)
-  (D4=Sara AAstrand Grimnes)(D5=grimnes.aastrand.sara at c2i.net)(D6=13)
-  (D8=Christin)(D9=Rendalen)(DA=Christin Rendalen)(DB
-    =christin.rendalen at semikolon.co.uk)(DC=14)(E2=g.fenza at tin.it)(E3=15)
-  (E7=Adrian)(E8=Todor)(E9=Adrian Todor)(EA=addybt at yahoo.com)(EB=16)
-  (18E=Stuart)(18F=Chalmers)(190=Stuart Chalmers)(EC
-    =schalmer at csd.abdn.ac.uk)(191=413b2b5b)(ED=17)(EF=frank at csd.abdn.ac.uk)
-  (F0=18)(112=Frank)(113=Guerin)(114=Frank Guerin)(F1
-    =fguerin at csd.abdn.ac.uk)(115=40aebc2c)(F2=19)(F3=Gard)(F4=Huseby)
-  (F5=Gard Huseby)(F6=gardh at student.sv.uio.no)(F7=1a)(F9=Matthias)(FA
-    =Krauss)(FB=Matthias Krauss)(FC=runemk at student.uio.no)(FD=1b)(FE
-    =dmartyn at csd.abdn.ac.uk)(100=40a9f5ef)(FF=1c)(101
-    =mcoughli at csd.abdn.ac.uk)(102=1d)(103=Michael)(104=Coughlin)(105
-    =Michael Coughlin)(106=michael_coughlin at msn.com)(107=1e)(108=Godmil)
-  (109=soi500 at abdn.ac.uk)(10A=1f)(10B=George)(10C=Hategan)(10D
-    =George Hategan)(10E=george_hategan at yahoo.com)(10F=20)(110
-    =andreaf at cs.columbia.edu)(111=21)(168="Lachlan)(169=Ayres")(16A
-    ="Lachlan Ayres")(116=lachlanayres at hotmail.com)(16B=41286a0e)(117=22)
-  (118=lachlanayres at doctors.net.uk)(119=23)(11A=christina)(11B=cameron)
-  (11C=christina cameron)(11D=ccameron at csd.abdn.ac.uk)(11E=24)(11F
-    =stephanie.ross at btmonline.co.uk)(120=25)(13F=Martin)(140=May)(141
-    =Martin May)(24E=martin at martinmay.net)(24F=41bab52e)(123=26)(125=mnem)
-  (126=27)(12B=mrobb at csd.abdn.ac.uk)(12C=28)(12E=nninan at csd.abdn.ac.uk)
-  (16C=4129be00)(12F=29)(130=Bruce)(131=Scharlau)(132=Bruce Scharlau)
-  (133=scharlau at csd.abdn.ac.uk)(134=2a)(136=hanne.nygaard at organizer.net)
-  (139=40e43177)(137=2b)(13A=Duncan)(13B=Clarkson)(13C=Duncan Clarkson)
-  (13D=squarelight at hotmail.com)(13E=2c)(145="Ikiji E-Business)(146
-    =Solutions")(147="Ikiji E-Business Solutions")(143=info at ikiji.com)
-  (148=4116b737)(144=2d)(149=James)(14A=Weisfeld-Adams)(14B
-    =James Weisfeld-Adams)(14C=jamesweisfeldadams at hotmail.com)(14D=2e)
-  (14E=Edoardo)(14F=Pignotti)(150=Edoardo Pignotti)(151
-    =epignott at csd.abdn.ac.uk)(152=2f)(155=Sarah)(156=Rouad)(157
-    =Sarah Rouad)(158=s_roued at hotmail.com)(159=30)(15A=Craig)(15B=McKenzie)
-  (15C=Craig McKenzie)(15D=cmckenzie at csd.abdn.ac.uk)(15E=31)(161
-    =mtp-students at csd.abdn.ac.uk)(2BC=422ecfbe)(162=32)(163=gary fraser)
-  (164=smith)(165=gary fraser smith)(166=gjfrasers at hotmail.com)(167=33)
-  (16D="Svein Erik S.)(16E=Pedersen")(16F="Svein Erik S. Pedersen")
-  (170=svein.erik at melsom.no)(171=34)(172=Terje)(173=Terje Grimnes)(174
-    =grimnes.terje at c2i.net)(175=35)(1B5="Anders)(1B6=Ingram")(1B7
-    ="Anders Ingram")(176=andersingram at hotmail.com)(1B8=4150a13f)(177=36)
-  (178=BTM Inverness UK)(179=BTM)(17A=BTM Inverness UK BTM)(17B
-    =inverness at btmonline.co.uk)(17C=37)(1D7="Chris)(1D8=Bizer")(1D9
-    ="Chris Bizer")(17F=chris at bizer.de)(1DA=417a3df7)(180=38)(181=Tobias)
-  (182=Gau$C3$9F)(183=Tobias Gau$C3$9F)(184=tobias.gauss at web.de)(185=39)
-  (18A="Kim)(18B=Urdahl-Aasen")(18C="Kim Urdahl-Aasen")(188
-    =cjmozart at hotmail.com)(18D=413b2b08)(189=3a)(192=Max)(193=Kettenacker)
-  (194=Max Kettenacker)(195=kettenacker at hotmail.com)(196=3b)(197
-    =gsmith at csd.abdn.ac.uk)(1C2=415890f2)(198=3c)(19D=David)(19E=Elliott)
-  (19F=David Elliott)(1A0=olletti1 at yahoo.com)(1A1=3d)(1A2
-    =LizFoubister at aol.com)(1A3=lizfoubister at aol.com)(1A4=LizFoubister)
-  (1A5=3e)(1AA=Anna Christina)(1AB=Link)(1AC=Anna Christina Link)(1AD
-    =aennox at hotmail.com)(1AE=3f)(1AF=karima)(1B0=chikhaoui)(1B1
-    =karima chikhaoui)(1B2=hanen24 at hotmail.com)(1B3=40)(1B9
-    =rjleonard at doctors.org.uk)(376=430ae9c8)(1BA=41)(1BB
-    =Christine.Guenther at springer-sbm.com)(1BC
-    =christine.guenther at springer-sbm.com)(1BD=42)(1C7=chris)(1C8=liddle)
-  (1C9=chris liddle)(1CA=chris.liddle at gmail.com)(1CB=43)(1CC=nikhil)
-  (1CD=ninan)(1CE=nikhil ninan)(1CF=Nikhil.Ninan at gmail.com)(1D0
-    =nikhil.ninan at gmail.com)(1D1=44)(1D3=gug at sgsh.no)(32D=4292fd41)
-  (1D4=45)(1DB=IUP)(1DC=remi.guillet at iup.univ-avignon.fr)(1DD=46)(1E0
-    ="STROMME GAUSLAA AS Gunnar)(1E1=Gauslaa")(1E2
-    ="STROMME GAUSLAA AS Gunnar Gauslaa")(1DE=shipsupply at uss.no)(1E3
-    =417bb52a)(1DF=47)(1E5=Ggrimnes at semikolon.co.uk)(1E6
-    =ggrimnes at semikolon.co.uk)(1E7=48)(1E9=Dan)(1EA=Price-Davies)(1EB
-    =Dan Price-Davies)(1EC=dan at aslsc.org.uk)(1ED=49)(1EE=Kollingbaum)
-  (1EF=Martin Kollingbaum)(1F0=mkolling at csd.abdn.ac.uk)(1F1=4a)(1F4
-    =Patrick)(1F5=Archie)(1F6=Patrick Archie)(1F7=patrick at securenym.net)
-  (1F8=4b)(1FD=4c)(1FE=Knud)(1FF=M$C3$B6ller)(200=Knud M$C3$B6ller)
-  (201=knud.moeller at deri.org)(202=4d)(203=pedwards)(204=4e)(205
-    =psiddall at csd.abdn.ac.uk)(212=41ac58de)(206=4f)(207
-    =jwilliam at csd.abdn.ac.uk)(208=50)(209=jar at iiia.csic.es)(20A=51)
-  (20B=kjersti_tralala at hotmail.com)(20C=52)(20E=hanne at ngreklame.no)
-  (20F=53)(210=cleanaberdeen at envdev.aberdeen.net.uk)(211=54)(213=Ehud)
-  (214=Reiter)(215=Ehud Reiter)(216=ereiter at csd.abdn.ac.uk)(217=55)
-  (21C=Marion)(21E=Marion Schramm)(218=m.schramm at nuclearfree.de)(21F
-    =41af5a51)(219=56)(21A=michael.j.schramm at web.de)(21B=57)(220
-    =pal.de.vibe at trolltech.com)(25C=41c1589d)(221=58)(222
-    =smorriso at csd.abdn.ac.uk)(2A3=4226e881)(223=59)(224=Anna)(225
-    =Anna Link)(226=aennox at gmx.de)(227=5a)(228=D)(229=Sleeman)(22A
-    =D Sleeman)(22B=sleeman at csd.abdn.ac.uk)(22C=5b)(22D
-    =yap-users at lists.sourceforge.net)(2FB=42739515)(22E=5c)(22F=Frauke)
-  (230=Bullmann)(231=Frauke Bullmann)(232=fraukebullmann at web.de)(233=5d)
-  (234=Josef Petr$C3$A1k -aka- dj)(235=pad$C3$A1k)(236
-    =Josef Petr$C3$A1k -aka- dj pad$C3$A1k)(237=dj_padak at seznam.cz)
-  (238=5e)(239=j.bray at abdn.ac.uk)(23A=5f)(23B=Ashwin)(23C=Srinivasan)
-  (23D=Ashwin Srinivasan)(23E=ashwin.srinivasan at in.ibm.com)(23F=60)
-  (240=Vitor Santos)(241=Costa)(242=Vitor Santos Costa)(243
-    =vitor at biostat.wisc.edu)(244=61)(246=Laura)(247=Willmes)(248
-    =Laura Willmes)(249=Laura.W at t-online.de)(24A=laura.w at t-online.de)
-  (24B=62)(250=mseikat at freenet.de)(251=63)(252=Astrid)(253=Meerk$C3$B6tter)
-  (254=Astrid Meerk$C3$B6tter)(255=astridmeerkoetter at web.de)(256=64)
-  (257=ina)(258=schaefer)(259=ina schaefer)(25A=inamaxine at yahoo.de)
-  (25B=65)(322=Jean-Michel)(323=Fustin)(324=Jean-Michel Fustin)(25D
-    =j.m.fustin at abdn.ac.uk)(325=42891005)(25E=66)(25F=keyshostel at aol.com)
-  (260=keyshostel)(261=67)(262=Betsy)(263=Fundora)(264=Betsy Fundora)
-  (265=betsyfundora at yahoo.com)(266=68)(267=Eugene)(268=Wong)(269
-    =Eugene Wong)(26A=u03ekw at abdn.ac.uk)(26B=69)(26C=Judith)(26D=Masthoff)
-  (26E=Judith Masthoff)(26F=jmasthof at csd.abdn.ac.uk)(270=6a)(273
-    =kateerskin888 at hotmail.com)(274=6b)(275=emma at itsgrimupnorth.com)
-  (278=41f9abd0)(276=6c)(279=6d)(2C2=kate)(2C3=erskine)(2C4=kate erskine)
-  (27A=kateerskine888 at hotmail.com)(2C5=423559fd)(27B=6e)(27C
-    =u.plasberg at rgu.ac.uk)(27D=6f)(27E=staff at csd.abdn.ac.uk)(27F=70)
-  (282=matthias.krauss at gmail.com)(33D=42a038c0)(283=71)(284
-    =neil.stirton at ikiji.com)(393=439c92d9)(285=72)(28D=Thomas)(28E
-    =Kieninger)(28F=Thomas Kieninger)(290=kieni at dfki.uni-kl.de)(291=73)
-  (326=Alan)(294=alan at sboke.com)(327=428b0237)(295=74)(298=gug at uss.no)
-  (2A4=42278e73)(299=75)(29A=Andreas)(29B=Hess)(29C=Andreas Hess)(29D
-    =andreas.hess at ucd.ie)(29E=76)(29F=Joey)(2A0=slam at csd.abdn.ac.uk)
-  (2A1=77)(2A8=Mantas)(2A9=mantas at systemnetwork.net)(2AA=78)(2AB
-    =llin at csd.abdn.ac.uk)(2AC=79)(2AD=jpirie at csd.abdn.ac.uk)(2AE=7a)
-  (2AF=Joe)(2B0=Wright)(2B1=Joe Wright)(2B2=joe at joejag.com)(2B3=7b)
-  (2B5=ggray at pnc.com.au)(2B6=7c)(2B9=Xiantang)(2BA=xsun at csd.abdn.ac.uk)
-  (2BB=7d)(2BD=Paul)(2BE=Ritchie)(2BF=Paul Ritchie)(2C0
-    =pritchie at csd.abdn.ac.uk)(2C1=7e)(2C6=lachlan)(2C7=ayres)(2C8
-    =lachlan ayres)(2C9=catrinthomas at doctors.org.uk)(2CA=7f)(2CC=Bertin)
-  (2CD=Klein)(2CE=Bertin Klein)(2CF=klein at dfki.uni-kl.de)(2D0=80)(2D2
-    =Chris)(2D3=Mellish)(2D4=Chris Mellish)(2D5=cmellish at csd.abdn.ac.uk)
-  (2D6=81)(2D7=RJLeonard at doctors.org.uk)(2ED=426272a8)(2D8=82)(2DC=gmail)
-  (2DD=rds.small at gmail.com)(2DE=83)(2E0=helpdesk at csd.abdn.ac.uk)(361
-    =42ccde41)(2E1=84)(2E4=Michel)(2E5=Albert)(2E6=Michel Albert)(2E7
-    =michel at albert.lu)(2E8=85)(2EE=eikon at eikon.com)(2EF=86)(2F3=Daniel)
-  (2F4=Krech)(2F5=Daniel Krech)(2F0=eikeon at eikeon.com)(2F6=42709498)
-  (2F1=87)(2F8=alun at computer.org)(301=4273bac1)(2F9=88)(2FC=S$C3$B6ren)
-  (2FD=Auer)(2FE=S$C3$B6ren Auer)(2FF=auer at informatik.uni-leipzig.de)
-  (300=89)(303=enquiries at bankofengland.co.uk)(304=8a)(305
-    =ilogie at csd.abdn.ac.uk)(306=8b)(307=david at maxandco.co.uk)(308=8c)
-  (309=christinr at welldatatech.com)(30A=8d)(311=anders at trolltech.com)
-  (312=8e)(313=Baard.lovgren at gmail.com)(314=baard.lovgren at gmail.com)
-  (315=8f)(316=hans.olav at ememess.com)(392=4395f6ad)(317=90)(318
-    =pvibe at trolltech.com)(319=91)(34B=Rune)(34C=Lunden)(34D=Rune Lunden)
-  (31A=teleruin at hotmail.com)(31B=92)(31C=support at ikiji.com)(391=4394e6d5)
-  (31D=93)(328=Nikhil)(329=Ninan)(32A=Nikhil Ninan)(32B
-    =nikhil at erg.abdn.ac.uk)(32C=94)(32E=Johan)(32F=Bakken)(330
-    =Johan Bakken)(331=johan.bakken at gmail.com)(332=95)(333=Andre)(334
-    =Oland)(335=Andre Oland)(336=andre.oland at politiet.no)(337=96)(338
-    =Kjersti)(339=Svendsen)(33A=Kjersti Svendsen)(33B
-    =kjerstiveel at gmail.com)(33C=97)(33E=Anders)(33F=Anders Bakken)(340
-    =agbakken at gmail.com)(341=98)(342=B$C3$A5rd)(343=L$C3$B8vgren)(344
-    =B$C3$A5rd L$C3$B8vgren)(345=99)(346=Eva)(347=Langslet)(348
-    =Eva Langslet)(349=eva.langslet at democracy.no)(34A=9a)(34E=P$C3$A5l de)
-  (34F=Vibe)(350=P$C3$A5l de Vibe)(351=pauldevibe at yahoo.no)(352=9b)
-  (353=gard.huseby at gmail.com)(354=9c)(356=wvasconc at csd.abdn.ac.uk)(357=9d)
-  (359=social at csd.abdn.ac.uk)(35A=9e)(35D
-    =reinhard.oppermann at fit.fraunhofer.de)(35E=9f)(363=jlin at csd.abdn.ac.uk)
-  (364=a0)(366=kart at findexa.no)(367=a1)(368=Lunde,)(369=Kaja)(36A
-    =Lunde, Kaja)(36B=kaja.lunde at findexa.no)(36C=a2)(36D=Gatt)(36E
-    =Albert Gatt)(36F=agatt at csd.abdn.ac.uk)(370=a3)(373
-    =selzer at dfki.uni-kl.de)(374=a4)(377=mcroitor at csd.abdn.ac.uk)(378=a5)
-  (379=Jim)(37A=Hunter)(37B=Jim Hunter)(37C=jhunter at csd.abdn.ac.uk)
-  (37D=a6)(37E=ielka van der)(37F=sluis)(380=ielka van der sluis)(381
-    =ivdsluis at csd.abdn.ac.uk)(382=a7)(383=Radoslaw)(384=Izdebski)(385
-    =Radoslaw Izdebski)(386=radekizdebski at yahoo.com)(387=a8)(389=K$C3$A5re)
-  (38A=H$C3$B8vik)(38B=K$C3$A5re H$C3$B8vik)(38C=kare at hovik.org)(38D=a9)
-  (394=Buitelaar)(395=Paul Buitelaar)(396=paulb at dfki.de)(397=aa)(398
-    =Sintek)(399=Sintek Michael)(39A=Michael.Sintek at dfki.de)(39B
-    =michael.sintek at dfki.de)(39C=ab)(39D=Michael Sintek)(39E
-    =sintek at dfki.uni-kl.de)(39F=ac)(3A0=Barbara)(3A1=Spillmann)(3A2
-    =Barbara Spillmann)(3A3=spillman at dfki.uni-kl.de)(3A4=ad)(3A5
-    =Resolutions at HBOSplc.com)(3A6=resolutions at hbosplc.com)(3A7=ae)(3AB
-    =post at hf.hobby.no)(3AC=af)(3AD=julia)(3AE=herse)(3AF=julia herse)
-  (3B0=julia.herse at web.de)(3B1=b0)(3B2=kiesel at dfki.de)(3B3=b1)(3B4
-    =kphotoalbum-request at kdab.net)(3B5=b2)(3B6=kphotoalbum at mail.kdab.net)>
-{1:^80 {(k^BE:c)(s=9)} 
-  [1:^82(^BD=b3)]
-  [1(^83=)(^84=)(^85=)(^86=)(^87=)(^88=)(^89^82)(^8A^82)(^8B=)(^8C=)
-    (^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)(^96=)(^97=)
-    (^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)(^A1=)(^A2=)
-    (^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)(^AC=)(^AD=)
-    (^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)(^B7=)(^B8=)
-    (^B9=)(^BA^388)(^BB=1)]
-  [2(^83^86)(^84^87)(^85=)(^86=)(^87^88)(^88=)(^89^89)(^8A^89)(^8B=)
-    (^8C=)(^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)(^96=)
-    (^97=)(^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)(^A1=)
-    (^A2=)(^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)(^AC=)
-    (^AD=)(^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)(^B7=)
-    (^B8=)(^B9=)(^BA=0)(^BB=2)]
-  [3(^83=N)(^84^8C)(^85=)(^86=)(^87^8D)(^88=)(^89^8E)(^8A^8E)(^8B=)
-    (^8C=)(^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)(^96=)
-    (^97=)(^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)(^A1=)
-    (^A2=)(^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)(^AC=)
-    (^AD=)(^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)(^B7=)
-    (^B8=)(^B9=)(^BA=0)(^BB=3)]
-  [4(^83^3A8)(^84^21D)(^85=)(^86=)(^87^3A9)(^88=)(^89^90)(^8A^90)(^8B=)
-    (^8C=)(^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)(^96=)
-    (^97=)(^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)(^A1=)
-    (^A2=)(^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)(^AC=)
-    (^AD=)(^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)(^B7=)
-    (^B8=)(^B9=)(^BA^3AA)(^BB=4)]
-  [5(^83^92)(^84^93)(^85=)(^86=)(^87^94)(^88=)(^89^95)(^8A^95)(^8B=)
-    (^8C=)(^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)(^96=)
-    (^97=)(^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)(^A1=)
-    (^A2=)(^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)(^AC=)
-    (^AD=)(^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)(^B7=)
-    (^B8=)(^B9=)(^BA=0)(^BB=5)]
-  [6(^83^97)(^84^98)(^85=)(^86=)(^87^99)(^88=)(^89^9A)(^8A^9A)(^8B=)
-    (^8C=)(^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)(^96=)
-    (^97=)(^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)(^A1=)
-    (^A2=)(^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)(^AC=)
-    (^AD=)(^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)(^B7=)
-    (^B8=)(^B9=)(^BA=0)(^BB=6)]
-  [7(^83^AF)(^84^B0)(^85=)(^86=)(^87^B1)(^88=)(^89^9C)(^8A^9C)(^8B=)
-    (^8C=)(^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)(^96=)
-    (^97=)(^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)(^A1=)
-    (^A2=)(^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)(^AC=)
-    (^AD=)(^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)(^B7=)
-    (^B8=)(^B9=)(^BA^B2)(^BB=7)]
-  [8(^83^DD)(^84=P")(^85=)(^86=)(^87^DF)(^88=)(^89^9E)(^8A^9E)(^8B=)
-    (^8C=)(^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)(^96=)
-    (^97=)(^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)(^A1=)
-    (^A2=)(^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)(^AC=)
-    (^AD=)(^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)(^B7=)
-    (^B8=)(^B9=)(^BA^E0)(^BB=8)]
-  [9(^83^A7)(^84^A8)(^85=)(^86=)(^87^A9)(^88=)(^89^A0)(^8A^A0)(^8B=)
-    (^8C=)(^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)(^96=)
-    (^97=)(^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)(^A1=)
-    (^A2=)(^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)(^AC=)
-    (^AD=)(^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)(^B7=)
-    (^B8=)(^B9=)(^BA^AA)(^BB=9)]
-  [A(^83^A2)(^84^A3)(^85=)(^86=)(^87^A4)(^88=)(^89^A5)(^8A^A5)(^8B=)
-    (^8C=)(^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)(^96=)
-    (^97=)(^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)(^A1=)
-    (^A2=)(^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)(^AC=)
-    (^AD=)(^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)(^B7=)
-    (^B8=)(^B9=)(^BA=0)(^BB=a)]
-  [B(^83=Rob)(^84^1C4)(^85=)(^86=)(^87^1C5)(^88=)(^89^AB)(^8A^AB)(^8B=)
-    (^8C=)(^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)(^96=)
-    (^97=)(^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)(^A1=)
-    (^A2=)(^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)(^AC=)
-    (^AD=)(^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)(^B7=)
-    (^B8=)(^B9=)(^BA^1C6)(^BB=b)]
-  [C(^83^C4)(^84^C5)(^85=)(^86=)(^87^C6)(^88=)(^89^AD)(^8A^AD)(^8B=)
-    (^8C=)(^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)(^96=)
-    (^97=)(^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)(^A1=)
-    (^A2=)(^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)(^AC=)
-    (^AD=)(^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)(^B7=)
-    (^B8=)(^B9=)(^BA^C7)(^BB=c)]
-  [D(^83^127)(^84^128)(^85=)(^86=)(^87^129)(^88=)(^89^B3)(^8A^B3)(^8B=)
-    (^8C=)(^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)(^96=)
-    (^97=)(^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)(^A1=)
-    (^A2=)(^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)(^AC=)
-    (^AD=)(^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)(^B7=)
-    (^B8=)(^B9=)(^BA^12A)(^BB=d)]
-  [E(^83^BC)(^84^BD)(^85=)(^86=)(^87^BE)(^88=)(^89^B5)(^8A^B5)(^8B=)
-    (^8C=)(^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)(^96=)
-    (^97=)(^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)(^A1=)
-    (^A2=)(^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)(^AC=)
-    (^AD=)(^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)(^B7=)
-    (^B8=)(^B9=)(^BA^BF)(^BB=e)]
-  [F(^83^C0)(^84^C1)(^85=)(^86=)(^87^C2)(^88=)(^89^B8)(^8A^B8)(^8B=)
-    (^8C=)(^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)(^96=)
-    (^97=)(^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)(^A1=)
-    (^A2=)(^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)(^AC=)
-    (^AD=)(^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)(^B7=)
-    (^B8=)(^B9=)(^BA^C3)(^BB=f)]
-  [10(^83^C8)(^84^C9)(^85=)(^86=)(^87^CA)(^88=)(^89^BA)(^8A^BA)(^8B=)
-    (^8C=)(^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)(^96=)
-    (^97=)(^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)(^A1=)
-    (^A2=)(^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)(^AC=)
-    (^AD=)(^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)(^B7=)
-    (^B8=)(^B9=)(^BA^CB)(^BB=10)]
-  [11(^83=)(^84=)(^85=)(^86=)(^87=)(^88=)(^89^CD)(^8A^CD)(^8B=)(^8C=)
-    (^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)(^96=)(^97=)
-    (^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)(^A1=)(^A2=)
-    (^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)(^AC=)(^AD=)
-    (^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)(^B7=)(^B8=)
-    (^B9=)(^BA^293)(^BB=11)]
-  [12(^83=)(^84=)(^85=)(^86=)(^87=)(^88=)(^89^D0)(^8A^D0)(^8B=)(^8C=)
-    (^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)(^96=)(^97=)
-    (^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)(^A1=)(^A2=)
-    (^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)(^AC=)(^AD=)
-    (^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)(^B7=)(^B8=)
-    (^B9=)(^BA^D2)(^BB=12)]
-  [13(^83^D3)(^84^A8)(^85=)(^86=)(^87^D4)(^88=)(^89^D5)(^8A^D5)(^8B=)
-    (^8C=)(^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)(^96=)
-    (^97=)(^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)(^A1=)
-    (^A2=)(^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)(^AC=)
-    (^AD=)(^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)(^B7=)
-    (^B8=)(^B9=)(^BA=0)(^BB=13)]
-  [14(^83^D8)(^84^D9)(^85=)(^86=)(^87^DA)(^88=)(^89^DB)(^8A^DB)(^8B=)
-    (^8C=)(^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)(^96=)
-    (^97=)(^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)(^A1=)
-    (^A2=)(^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)(^AC=)
-    (^AD=)(^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)(^B7=)
-    (^B8=)(^B9=)(^BA=0)(^BB=14)]
-  [15(^83=)(^84=)(^85=)(^86=)(^87=)(^88=)(^89^E2)(^8A^E2)(^8B=)(^8C=)
-    (^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)(^96=)(^97=)
-    (^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)(^A1=)(^A2=)
-    (^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)(^AC=)(^AD=)
-    (^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)(^B7=)(^B8=)
-    (^B9=)(^BA=0)(^BB=15)]
-  [16(^83^E7)(^84^E8)(^85=)(^86=)(^87^E9)(^88=)(^89^EA)(^8A^EA)(^8B=)
-    (^8C=)(^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)(^96=)
-    (^97=)(^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)(^A1=)
-    (^A2=)(^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)(^AC=)
-    (^AD=)(^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)(^B7=)
-    (^B8=)(^B9=)(^BA=0)(^BB=16)]
-  [17(^83^18E)(^84^18F)(^85=)(^86=)(^87^190)(^88=)(^89^EC)(^8A^EC)(^8B=)
-    (^8C=)(^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)(^96=)
-    (^97=)(^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)(^A1=)
-    (^A2=)(^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)(^AC=)
-    (^AD=)(^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)(^B7=)
-    (^B8=)(^B9=)(^BA^191)(^BB=17)]
-  [18(^83=)(^84=)(^85=)(^86=)(^87=)(^88=)(^89^EF)(^8A^EF)(^8B=)(^8C=)
-    (^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)(^96=)(^97=)
-    (^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)(^A1=)(^A2=)
-    (^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)(^AC=)(^AD=)
-    (^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)(^B7=)(^B8=)
-    (^B9=)(^BA=0)(^BB=18)]
-  [19(^83^112)(^84^113)(^85=)(^86=)(^87^114)(^88=)(^89^F1)(^8A^F1)(^8B=)
-    (^8C=)(^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)(^96=)
-    (^97=)(^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)(^A1=)
-    (^A2=)(^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)(^AC=)
-    (^AD=)(^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)(^B7=)
-    (^B8=)(^B9=)(^BA^115)(^BB=19)]
-  [1A(^83^F3)(^84^F4)(^85=)(^86=)(^87^F5)(^88=)(^89^F6)(^8A^F6)(^8B=)
-    (^8C=)(^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)(^96=)
-    (^97=)(^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)(^A1=)
-    (^A2=)(^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)(^AC=)
-    (^AD=)(^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)(^B7=)
-    (^B8=)(^B9=)(^BA=0)(^BB=1a)]
-  [1B(^83^F9)(^84^FA)(^85=)(^86=)(^87^FB)(^88=)(^89^FC)(^8A^FC)(^8B=)
-    (^8C=)(^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)(^96=)
-    (^97=)(^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)(^A1=)
-    (^A2=)(^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)(^AC=)
-    (^AD=)(^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)(^B7=)
-    (^B8=)(^B9=)(^BA=0)(^BB=1b)]
-  [1C(^83=)(^84=)(^85=)(^86=)(^87=)(^88=)(^89^FE)(^8A^FE)(^8B=)(^8C=)
-    (^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)(^96=)(^97=)
-    (^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)(^A1=)(^A2=)
-    (^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)(^AC=)(^AD=)
-    (^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)(^B7=)(^B8=)
-    (^B9=)(^BA^100)(^BB=1c)]
-  [1D(^83=)(^84=)(^85=)(^86=)(^87=)(^88=)(^89^101)(^8A^101)(^8B=)(^8C=)
-    (^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)(^96=)(^97=)
-    (^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)(^A1=)(^A2=)
-    (^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)(^AC=)(^AD=)
-    (^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)(^B7=)(^B8=)
-    (^B9=)(^BA=0)(^BB=1d)]
-  [1E(^83^103)(^84^104)(^85=)(^86=)(^87^105)(^88=)(^89^106)(^8A^106)
-    (^8B=)(^8C=)(^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)
-    (^96=)(^97=)(^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)
-    (^A1=)(^A2=)(^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)
-    (^AC=)(^AD=)(^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)
-    (^B7=)(^B8=)(^B9=)(^BA=0)(^BB=1e)]
-  [1F(^83^108)(^84=)(^85=)(^86=)(^87^108)(^88=)(^89^109)(^8A^109)(^8B=)
-    (^8C=)(^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)(^96=)
-    (^97=)(^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)(^A1=)
-    (^A2=)(^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)(^AC=)
-    (^AD=)(^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)(^B7=)
-    (^B8=)(^B9=)(^BA=0)(^BB=1f)]
-  [20(^83^10B)(^84^10C)(^85=)(^86=)(^87^10D)(^88=)(^89^10E)(^8A^10E)
-    (^8B=)(^8C=)(^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)
-    (^96=)(^97=)(^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)
-    (^A1=)(^A2=)(^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)
-    (^AC=)(^AD=)(^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)
-    (^B7=)(^B8=)(^B9=)(^BA=0)(^BB=20)]
-  [21(^83=)(^84=)(^85=)(^86=)(^87=)(^88=)(^89^110)(^8A^110)(^8B=)(^8C=)
-    (^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)(^96=)(^97=)
-    (^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)(^A1=)(^A2=)
-    (^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)(^AC=)(^AD=)
-    (^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)(^B7=)(^B8=)
-    (^B9=)(^BA=0)(^BB=21)]
-  [22(^83^168)(^84^169)(^85=)(^86=)(^87^16A)(^88=)(^89^116)(^8A^116)
-    (^8B=)(^8C=)(^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)
-    (^96=)(^97=)(^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)
-    (^A1=)(^A2=)(^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)
-    (^AC=)(^AD=)(^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)
-    (^B7=)(^B8=)(^B9=)(^BA^16B)(^BB=22)]
-  [23(^83=)(^84=)(^85=)(^86=)(^87=)(^88=)(^89^118)(^8A^118)(^8B=)(^8C=)
-    (^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)(^96=)(^97=)
-    (^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)(^A1=)(^A2=)
-    (^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)(^AC=)(^AD=)
-    (^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)(^B7=)(^B8=)
-    (^B9=)(^BA=0)(^BB=23)]
-  [24(^83^11A)(^84^11B)(^85=)(^86=)(^87^11C)(^88=)(^89^11D)(^8A^11D)
-    (^8B=)(^8C=)(^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)
-    (^96=)(^97=)(^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)
-    (^A1=)(^A2=)(^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)
-    (^AC=)(^AD=)(^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)
-    (^B7=)(^B8=)(^B9=)(^BA=0)(^BB=24)]
-  [25(^83=)(^84=)(^85=)(^86=)(^87=)(^88=)(^89^11F)(^8A^11F)(^8B=)(^8C=)
-    (^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)(^96=)(^97=)
-    (^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)(^A1=)(^A2=)
-    (^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)(^AC=)(^AD=)
-    (^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)(^B7=)(^B8=)
-    (^B9=)(^BA=0)(^BB=25)]
-  [26(^83^13F)(^84=May)(^85=)(^86=)(^87^141)(^88=)(^89^24E)(^8A^24E)
-    (^8B=)(^8C=)(^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)
-    (^96=)(^97=)(^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)
-    (^A1=)(^A2=)(^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)
-    (^AC=)(^AD=)(^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)
-    (^B7=)(^B8=)(^B9=)(^BA^24F)(^BB=26)]
-  [27(^83^F9)(^84^FA)(^85=)(^86=)(^87^FB)(^88^125)(^89^FC)(^8A^FC)(^8B=)
-    (^8C=)(^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)(^96=)
-    (^97=)(^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)(^A1=)
-    (^A2=)(^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)(^AC=)
-    (^AD=)(^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)(^B7=)
-    (^B8=)(^B9=)(^BA=0)(^BB=27)]
-  [28(^83=)(^84=)(^85=)(^86=)(^87=)(^88=)(^89^12B)(^8A^12B)(^8B=)(^8C=)
-    (^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)(^96=)(^97=)
-    (^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)(^A1=)(^A2=)
-    (^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)(^AC=)(^AD=)
-    (^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)(^B7=)(^B8=)
-    (^B9=)(^BA=0)(^BB=28)]
-  [29(^83=)(^84=)(^85=)(^86=)(^87=)(^88=)(^89^12E)(^8A^12E)(^8B=)(^8C=)
-    (^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)(^96=)(^97=)
-    (^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)(^A1=)(^A2=)
-    (^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)(^AC=)(^AD=)
-    (^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)(^B7=)(^B8=)
-    (^B9=)(^BA^16C)(^BB=29)]
-  [2A(^83^130)(^84^131)(^85=)(^86=)(^87^132)(^88=)(^89^133)(^8A^133)
-    (^8B=)(^8C=)(^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)
-    (^96=)(^97=)(^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)
-    (^A1=)(^A2=)(^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)
-    (^AC=)(^AD=)(^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)
-    (^B7=)(^B8=)(^B9=)(^BA=0)(^BB=2a)]
-  [2B(^83=)(^84=)(^85=)(^86=)(^87=)(^88=)(^89^136)(^8A^136)(^8B=)(^8C=)
-    (^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)(^96=)(^97=)
-    (^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)(^A1=)(^A2=)
-    (^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)(^AC=)(^AD=)
-    (^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)(^B7=)(^B8=)
-    (^B9=)(^BA^139)(^BB=2b)]
-  [2C(^83^13A)(^84^13B)(^85=)(^86=)(^87^13C)(^88=)(^89^13D)(^8A^13D)
-    (^8B=)(^8C=)(^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)
-    (^96=)(^97=)(^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)
-    (^A1=)(^A2=)(^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)
-    (^AC=)(^AD=)(^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)
-    (^B7=)(^B8=)(^B9=)(^BA=0)(^BB=2c)]
-  [2D(^83^145)(^84^146)(^85=)(^86=)(^87^147)(^88=)(^89^143)(^8A^143)
-    (^8B=)(^8C=)(^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)
-    (^96=)(^97=)(^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)
-    (^A1=)(^A2=)(^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)
-    (^AC=)(^AD=)(^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)
-    (^B7=)(^B8=)(^B9=)(^BA^148)(^BB=2d)]
-  [2E(^83^149)(^84^14A)(^85=)(^86=)(^87^14B)(^88=)(^89^14C)(^8A^14C)
-    (^8B=)(^8C=)(^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)
-    (^96=)(^97=)(^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)
-    (^A1=)(^A2=)(^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)
-    (^AC=)(^AD=)(^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)
-    (^B7=)(^B8=)(^B9=)(^BA=0)(^BB=2e)]
-  [2F(^83^14E)(^84^14F)(^85=)(^86=)(^87^150)(^88=)(^89^151)(^8A^151)
-    (^8B=)(^8C=)(^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)
-    (^96=)(^97=)(^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)
-    (^A1=)(^A2=)(^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)
-    (^AC=)(^AD=)(^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)
-    (^B7=)(^B8=)(^B9=)(^BA=0)(^BB=2f)]
-  [30(^83^155)(^84^156)(^85=)(^86=)(^87^157)(^88=)(^89^158)(^8A^158)
-    (^8B=)(^8C=)(^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)
-    (^96=)(^97=)(^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)
-    (^A1=)(^A2=)(^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)
-    (^AC=)(^AD=)(^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)
-    (^B7=)(^B8=)(^B9=)(^BA=0)(^BB=30)]
-  [31(^83^15A)(^84^15B)(^85=)(^86=)(^87^15C)(^88=)(^89^15D)(^8A^15D)
-    (^8B=)(^8C=)(^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)
-    (^96=)(^97=)(^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)
-    (^A1=)(^A2=)(^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)
-    (^AC=)(^AD=)(^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)
-    (^B7=)(^B8=)(^B9=)(^BA=0)(^BB=31)]
-  [32(^83=)(^84=)(^85=)(^86=)(^87=)(^88=)(^89^161)(^8A^161)(^8B=)(^8C=)
-    (^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)(^96=)(^97=)
-    (^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)(^A1=)(^A2=)
-    (^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)(^AC=)(^AD=)
-    (^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)(^B7=)(^B8=)
-    (^B9=)(^BA^2BC)(^BB=32)]
-  [33(^83^163)(^84^164)(^85=)(^86=)(^87^165)(^88=)(^89^166)(^8A^166)
-    (^8B=)(^8C=)(^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)
-    (^96=)(^97=)(^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)
-    (^A1=)(^A2=)(^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)
-    (^AC=)(^AD=)(^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)
-    (^B7=)(^B8=)(^B9=)(^BA=0)(^BB=33)]
-  [34(^83^16D)(^84^16E)(^85=)(^86=)(^87^16F)(^88=)(^89^170)(^8A^170)
-    (^8B=)(^8C=)(^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)
-    (^96=)(^97=)(^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)
-    (^A1=)(^A2=)(^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)
-    (^AC=)(^AD=)(^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)
-    (^B7=)(^B8=)(^B9=)(^BA=0)(^BB=34)]
-  [35(^83^172)(^84^A8)(^85=)(^86=)(^87^173)(^88=)(^89^174)(^8A^174)
-    (^8B=)(^8C=)(^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)
-    (^96=)(^97=)(^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)
-    (^A1=)(^A2=)(^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)
-    (^AC=)(^AD=)(^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)
-    (^B7=)(^B8=)(^B9=)(^BA=0)(^BB=35)]
-  [36(^83^1B5)(^84^1B6)(^85=)(^86=)(^87^1B7)(^88=)(^89^176)(^8A^176)
-    (^8B=)(^8C=)(^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)
-    (^96=)(^97=)(^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)
-    (^A1=)(^A2=)(^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)
-    (^AC=)(^AD=)(^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)
-    (^B7=)(^B8=)(^B9=)(^BA^1B8)(^BB=36)]
-  [37(^83^178)(^84=BTM)(^85=)(^86=)(^87^17A)(^88=)(^89^17B)(^8A^17B)
-    (^8B=)(^8C=)(^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)
-    (^96=)(^97=)(^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)
-    (^A1=)(^A2=)(^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)
-    (^AC=)(^AD=)(^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)
-    (^B7=)(^B8=)(^B9=)(^BA=0)(^BB=37)]
-  [38(^83^1D7)(^84^1D8)(^85=)(^86=)(^87^1D9)(^88=)(^89^17F)(^8A^17F)
-    (^8B=)(^8C=)(^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)
-    (^96=)(^97=)(^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)
-    (^A1=)(^A2=)(^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)
-    (^AC=)(^AD=)(^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)
-    (^B7=)(^B8=)(^B9=)(^BA^1DA)(^BB=38)]
-  [39(^83^181)(^84^182)(^85=)(^86=)(^87^183)(^88=)(^89^184)(^8A^184)
-    (^8B=)(^8C=)(^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)
-    (^96=)(^97=)(^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)
-    (^A1=)(^A2=)(^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)
-    (^AC=)(^AD=)(^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)
-    (^B7=)(^B8=)(^B9=)(^BA=0)(^BB=39)]
-  [3A(^83^18A)(^84^18B)(^85=)(^86=)(^87^18C)(^88=)(^89^188)(^8A^188)
-    (^8B=)(^8C=)(^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)
-    (^96=)(^97=)(^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)
-    (^A1=)(^A2=)(^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)
-    (^AC=)(^AD=)(^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)
-    (^B7=)(^B8=)(^B9=)(^BA^18D)(^BB=3a)]
-  [3B(^83=Max)(^84^193)(^85=)(^86=)(^87^194)(^88=)(^89^195)(^8A^195)
-    (^8B=)(^8C=)(^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)
-    (^96=)(^97=)(^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)
-    (^A1=)(^A2=)(^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)
-    (^AC=)(^AD=)(^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)
-    (^B7=)(^B8=)(^B9=)(^BA=0)(^BB=3b)]
-  [3C(^83=)(^84=)(^85=)(^86=)(^87=)(^88=)(^89^197)(^8A^197)(^8B=)(^8C=)
-    (^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)(^96=)(^97=)
-    (^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)(^A1=)(^A2=)
-    (^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)(^AC=)(^AD=)
-    (^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)(^B7=)(^B8=)
-    (^B9=)(^BA^1C2)(^BB=3c)]
-  [3D(^83^19D)(^84^19E)(^85=)(^86=)(^87^19F)(^88=)(^89^1A0)(^8A^1A0)
-    (^8B=)(^8C=)(^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)
-    (^96=)(^97=)(^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)
-    (^A1=)(^A2=)(^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)
-    (^AC=)(^AD=)(^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)
-    (^B7=)(^B8=)(^B9=)(^BA=0)(^BB=3d)]
-  [3E(^83=)(^84=)(^85=)(^86=)(^87=)(^88=)(^89^1A2)(^8A^1A3)(^8B=)(^8C=)
-    (^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)(^96=)(^97=)
-    (^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)(^A1=)(^A2=)
-    (^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8^1A4)(^A9=)(^AA=)(^AB=)(^AC=)
-    (^AD=)(^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)(^B7=)
-    (^B8=)(^B9=)(^BA=0)(^BB=3e)]
-  [3F(^83^1AA)(^84^1AB)(^85=)(^86=)(^87^1AC)(^88=)(^89^1AD)(^8A^1AD)
-    (^8B=)(^8C=)(^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)
-    (^96=)(^97=)(^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)
-    (^A1=)(^A2=)(^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)
-    (^AC=)(^AD=)(^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)
-    (^B7=)(^B8=)(^B9=)(^BA=0)(^BB=3f)]
-  [40(^83^1AF)(^84^1B0)(^85=)(^86=)(^87^1B1)(^88=)(^89^1B2)(^8A^1B2)
-    (^8B=)(^8C=)(^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)
-    (^96=)(^97=)(^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)
-    (^A1=)(^A2=)(^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)
-    (^AC=)(^AD=)(^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)
-    (^B7=)(^B8=)(^B9=)(^BA=0)(^BB=40)]
-  [41(^83=)(^84=)(^85=)(^86=)(^87=)(^88=)(^89^1B9)(^8A^1B9)(^8B=)(^8C=)
-    (^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)(^96=)(^97=)
-    (^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)(^A1=)(^A2=)
-    (^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)(^AC=)(^AD=)
-    (^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)(^B7=)(^B8=)
-    (^B9=)(^BA^376)(^BB=41)]
-  [42(^83=)(^84=)(^85=)(^86=)(^87=)(^88=)(^89^1BB)(^8A^1BC)(^8B=)(^8C=)
-    (^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)(^96=)(^97=)
-    (^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)(^A1=)(^A2=)
-    (^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)(^AC=)(^AD=)
-    (^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)(^B7=)(^B8=)
-    (^B9=)(^BA=0)(^BB=42)]
-  [43(^83^1C7)(^84^1C8)(^85=)(^86=)(^87^1C9)(^88=)(^89^1CA)(^8A^1CA)
-    (^8B=)(^8C=)(^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)
-    (^96=)(^97=)(^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)
-    (^A1=)(^A2=)(^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)
-    (^AC=)(^AD=)(^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)
-    (^B7=)(^B8=)(^B9=)(^BA=0)(^BB=43)]
-  [44(^83^1CC)(^84^1CD)(^85=)(^86=)(^87^1CE)(^88=)(^89^1CF)(^8A^1D0)
-    (^8B=)(^8C=)(^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)
-    (^96=)(^97=)(^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)
-    (^A1=)(^A2=)(^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)
-    (^AC=)(^AD=)(^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)
-    (^B7=)(^B8=)(^B9=)(^BA=0)(^BB=44)]
-  [45(^83=)(^84=)(^85=)(^86=)(^87=)(^88=)(^89^1D3)(^8A^1D3)(^8B=)(^8C=)
-    (^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)(^96=)(^97=)
-    (^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)(^A1=)(^A2=)
-    (^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)(^AC=)(^AD=)
-    (^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)(^B7=)(^B8=)
-    (^B9=)(^BA^32D)(^BB=45)]
-  [46(^83=IUP)(^84=)(^85=)(^86=)(^87=IUP)(^88=)(^89^1DC)(^8A^1DC)(^8B=)
-    (^8C=)(^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)(^96=)
-    (^97=)(^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)(^A1=)
-    (^A2=)(^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)(^AC=)
-    (^AD=)(^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)(^B7=)
-    (^B8=)(^B9=)(^BA=0)(^BB=46)]
-  [47(^83^1E0)(^84^1E1)(^85=)(^86=)(^87^1E2)(^88=)(^89^1DE)(^8A^1DE)
-    (^8B=)(^8C=)(^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)
-    (^96=)(^97=)(^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)
-    (^A1=)(^A2=)(^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)
-    (^AC=)(^AD=)(^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)
-    (^B7=)(^B8=)(^B9=)(^BA^1E3)(^BB=47)]
-  [48(^83=)(^84=)(^85=)(^86=)(^87=)(^88=)(^89^1E5)(^8A^1E6)(^8B=)(^8C=)
-    (^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)(^96=)(^97=)
-    (^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)(^A1=)(^A2=)
-    (^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)(^AC=)(^AD=)
-    (^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)(^B7=)(^B8=)
-    (^B9=)(^BA=0)(^BB=48)]
-  [49(^83=Dan)(^84^1EA)(^85=)(^86=)(^87^1EB)(^88=)(^89^1EC)(^8A^1EC)
-    (^8B=)(^8C=)(^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)
-    (^96=)(^97=)(^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)
-    (^A1=)(^A2=)(^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)
-    (^AC=)(^AD=)(^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)
-    (^B7=)(^B8=)(^B9=)(^BA=0)(^BB=49)]
-  [4A(^83^13F)(^84^1EE)(^85=)(^86=)(^87^1EF)(^88=)(^89^1F0)(^8A^1F0)
-    (^8B=)(^8C=)(^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)
-    (^96=)(^97=)(^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)
-    (^A1=)(^A2=)(^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)
-    (^AC=)(^AD=)(^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)
-    (^B7=)(^B8=)(^B9=)(^BA=0)(^BB=4a)]
-  [4B(^83^1F4)(^84^1F5)(^85=)(^86=)(^87^1F6)(^88=)(^89^1F7)(^8A^1F7)
-    (^8B=)(^8C=)(^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)
-    (^96=)(^97=)(^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)
-    (^A1=)(^A2=)(^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)
-    (^AC=)(^AD=)(^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)
-    (^B7=)(^B8=)(^B9=)(^BA=0)(^BB=4b)]
-  [4C(^83=)(^84=)(^85=)(^86=)(^87=)(^88=)(^89^125)(^8A^125)(^8B=)(^8C=)
-    (^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)(^96=)(^97=)
-    (^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)(^A1=)(^A2=)
-    (^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)(^AC=)(^AD=)
-    (^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)(^B7=)(^B8=)
-    (^B9=)(^BA=0)(^BB=4c)]
-  [4D(^83^1FE)(^84^1FF)(^85=)(^86=)(^87^200)(^88=)(^89^201)(^8A^201)
-    (^8B=)(^8C=)(^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)
-    (^96=)(^97=)(^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)
-    (^A1=)(^A2=)(^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)
-    (^AC=)(^AD=)(^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)
-    (^B7=)(^B8=)(^B9=)(^BA=0)(^BB=4d)]
-  [4E(^83=)(^84=)(^85=)(^86=)(^87=)(^88=)(^89^203)(^8A^203)(^8B=)(^8C=)
-    (^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)(^96=)(^97=)
-    (^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)(^A1=)(^A2=)
-    (^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)(^AC=)(^AD=)
-    (^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)(^B7=)(^B8=)
-    (^B9=)(^BA=0)(^BB=4e)]
-  [4F(^83=)(^84=)(^85=)(^86=)(^87=)(^88=)(^89^205)(^8A^205)(^8B=)(^8C=)
-    (^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)(^96=)(^97=)
-    (^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)(^A1=)(^A2=)
-    (^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)(^AC=)(^AD=)
-    (^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)(^B7=)(^B8=)
-    (^B9=)(^BA^212)(^BB=4f)]
-  [50(^83=)(^84=)(^85=)(^86=)(^87=)(^88=)(^89^207)(^8A^207)(^8B=)(^8C=)
-    (^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)(^96=)(^97=)
-    (^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)(^A1=)(^A2=)
-    (^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)(^AC=)(^AD=)
-    (^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)(^B7=)(^B8=)
-    (^B9=)(^BA=0)(^BB=50)]
-  [51(^83=)(^84=)(^85=)(^86=)(^87=)(^88=)(^89^209)(^8A^209)(^8B=)(^8C=)
-    (^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)(^96=)(^97=)
-    (^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)(^A1=)(^A2=)
-    (^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)(^AC=)(^AD=)
-    (^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)(^B7=)(^B8=)
-    (^B9=)(^BA=0)(^BB=51)]
-  [52(^83=)(^84=)(^85=)(^86=)(^87=)(^88=)(^89^20B)(^8A^20B)(^8B=)(^8C=)
-    (^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)(^96=)(^97=)
-    (^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)(^A1=)(^A2=)
-    (^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)(^AC=)(^AD=)
-    (^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)(^B7=)(^B8=)
-    (^B9=)(^BA=0)(^BB=52)]
-  [53(^83=)(^84=)(^85=)(^86=)(^87=)(^88=)(^89^20E)(^8A^20E)(^8B=)(^8C=)
-    (^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)(^96=)(^97=)
-    (^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)(^A1=)(^A2=)
-    (^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)(^AC=)(^AD=)
-    (^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)(^B7=)(^B8=)
-    (^B9=)(^BA=0)(^BB=53)]
-  [54(^83=)(^84=)(^85=)(^86=)(^87=)(^88=)(^89^210)(^8A^210)(^8B=)(^8C=)
-    (^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)(^96=)(^97=)
-    (^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)(^A1=)(^A2=)
-    (^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)(^AC=)(^AD=)
-    (^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)(^B7=)(^B8=)
-    (^B9=)(^BA=0)(^BB=54)]
-  [55(^83^213)(^84^214)(^85=)(^86=)(^87^215)(^88=)(^89^216)(^8A^216)
-    (^8B=)(^8C=)(^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)
-    (^96=)(^97=)(^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)
-    (^A1=)(^A2=)(^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)
-    (^AC=)(^AD=)(^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)
-    (^B7=)(^B8=)(^B9=)(^BA=0)(^BB=55)]
-  [56(^83^21C)(^84^21D)(^85=)(^86=)(^87^21E)(^88=)(^89^218)(^8A^218)
-    (^8B=)(^8C=)(^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)
-    (^96=)(^97=)(^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)
-    (^A1=)(^A2=)(^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)
-    (^AC=)(^AD=)(^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)
-    (^B7=)(^B8=)(^B9=)(^BA^21F)(^BB=56)]
-  [57(^83=)(^84=)(^85=)(^86=)(^87=)(^88=)(^89^21A)(^8A^21A)(^8B=)(^8C=)
-    (^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)(^96=)(^97=)
-    (^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)(^A1=)(^A2=)
-    (^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)(^AC=)(^AD=)
-    (^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)(^B7=)(^B8=)
-    (^B9=)(^BA=0)(^BB=57)]
-  [58(^83=)(^84=)(^85=)(^86=)(^87=)(^88=)(^89^220)(^8A^220)(^8B=)(^8C=)
-    (^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)(^96=)(^97=)
-    (^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)(^A1=)(^A2=)
-    (^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)(^AC=)(^AD=)
-    (^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)(^B7=)(^B8=)
-    (^B9=)(^BA^25C)(^BB=58)]
-  [59(^83=)(^84=)(^85=)(^86=)(^87=)(^88=)(^89^222)(^8A^222)(^8B=)(^8C=)
-    (^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)(^96=)(^97=)
-    (^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)(^A1=)(^A2=)
-    (^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)(^AC=)(^AD=)
-    (^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)(^B7=)(^B8=)
-    (^B9=)(^BA^2A3)(^BB=59)]
-  [5A(^83^224)(^84^1AB)(^85=)(^86=)(^87^225)(^88=)(^89^226)(^8A^226)
-    (^8B=)(^8C=)(^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)
-    (^96=)(^97=)(^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)
-    (^A1=)(^A2=)(^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)
-    (^AC=)(^AD=)(^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)
-    (^B7=)(^B8=)(^B9=)(^BA=0)(^BB=5a)]
-  [5B(^83=D)(^84^229)(^85=)(^86=)(^87^22A)(^88=)(^89^22B)(^8A^22B)(^8B=)
-    (^8C=)(^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)(^96=)
-    (^97=)(^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)(^A1=)
-    (^A2=)(^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)(^AC=)
-    (^AD=)(^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)(^B7=)
-    (^B8=)(^B9=)(^BA=0)(^BB=5b)]
-  [5C(^83=)(^84=)(^85=)(^86=)(^87=)(^88=)(^89^22D)(^8A^22D)(^8B=)(^8C=)
-    (^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)(^96=)(^97=)
-    (^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)(^A1=)(^A2=)
-    (^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)(^AC=)(^AD=)
-    (^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)(^B7=)(^B8=)
-    (^B9=)(^BA^2FB)(^BB=5c)]
-  [5D(^83^22F)(^84^230)(^85=)(^86=)(^87^231)(^88=)(^89^232)(^8A^232)
-    (^8B=)(^8C=)(^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)
-    (^96=)(^97=)(^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)
-    (^A1=)(^A2=)(^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)
-    (^AC=)(^AD=)(^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)
-    (^B7=)(^B8=)(^B9=)(^BA=0)(^BB=5d)]
-  [5E(^83^234)(^84^235)(^85=)(^86=)(^87^236)(^88=)(^89^237)(^8A^237)
-    (^8B=)(^8C=)(^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)
-    (^96=)(^97=)(^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)
-    (^A1=)(^A2=)(^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)
-    (^AC=)(^AD=)(^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)
-    (^B7=)(^B8=)(^B9=)(^BA=0)(^BB=5e)]
-  [5F(^83=)(^84=)(^85=)(^86=)(^87=)(^88=)(^89^239)(^8A^239)(^8B=)(^8C=)
-    (^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)(^96=)(^97=)
-    (^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)(^A1=)(^A2=)
-    (^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)(^AC=)(^AD=)
-    (^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)(^B7=)(^B8=)
-    (^B9=)(^BA=0)(^BB=5f)]
-  [60(^83^23B)(^84^23C)(^85=)(^86=)(^87^23D)(^88=)(^89^23E)(^8A^23E)
-    (^8B=)(^8C=)(^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)
-    (^96=)(^97=)(^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)
-    (^A1=)(^A2=)(^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)
-    (^AC=)(^AD=)(^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)
-    (^B7=)(^B8=)(^B9=)(^BA=0)(^BB=60)]
-  [61(^83^240)(^84^241)(^85=)(^86=)(^87^242)(^88=)(^89^243)(^8A^243)
-    (^8B=)(^8C=)(^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)
-    (^96=)(^97=)(^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)
-    (^A1=)(^A2=)(^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)
-    (^AC=)(^AD=)(^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)
-    (^B7=)(^B8=)(^B9=)(^BA=0)(^BB=61)]
-  [62(^83^246)(^84^247)(^85=)(^86=)(^87^248)(^88=)(^89^249)(^8A^24A)
-    (^8B=)(^8C=)(^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)
-    (^96=)(^97=)(^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)
-    (^A1=)(^A2=)(^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)
-    (^AC=)(^AD=)(^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)
-    (^B7=)(^B8=)(^B9=)(^BA=0)(^BB=62)]
-  [63(^83=)(^84=)(^85=)(^86=)(^87=)(^88=)(^89^250)(^8A^250)(^8B=)(^8C=)
-    (^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)(^96=)(^97=)
-    (^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)(^A1=)(^A2=)
-    (^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)(^AC=)(^AD=)
-    (^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)(^B7=)(^B8=)
-    (^B9=)(^BA=0)(^BB=63)]
-  [64(^83^252)(^84^253)(^85=)(^86=)(^87^254)(^88=)(^89^255)(^8A^255)
-    (^8B=)(^8C=)(^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)
-    (^96=)(^97=)(^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)
-    (^A1=)(^A2=)(^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)
-    (^AC=)(^AD=)(^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)
-    (^B7=)(^B8=)(^B9=)(^BA=0)(^BB=64)]
-  [65(^83=ina)(^84^258)(^85=)(^86=)(^87^259)(^88=)(^89^25A)(^8A^25A)
-    (^8B=)(^8C=)(^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)
-    (^96=)(^97=)(^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)
-    (^A1=)(^A2=)(^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)
-    (^AC=)(^AD=)(^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)
-    (^B7=)(^B8=)(^B9=)(^BA=0)(^BB=65)]
-  [66(^83^322)(^84^323)(^85=)(^86=)(^87^324)(^88=)(^89^25D)(^8A^25D)
-    (^8B=)(^8C=)(^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)
-    (^96=)(^97=)(^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)
-    (^A1=)(^A2=)(^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)
-    (^AC=)(^AD=)(^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)
-    (^B7=)(^B8=)(^B9=)(^BA^325)(^BB=66)]
-  [67(^83=)(^84=)(^85=)(^86=)(^87=)(^88=)(^89^25F)(^8A^25F)(^8B=)(^8C=)
-    (^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)(^96=)(^97=)
-    (^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)(^A1=)(^A2=)
-    (^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8^260)(^A9=)(^AA=)(^AB=)(^AC=)
-    (^AD=)(^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)(^B7=)
-    (^B8=)(^B9=)(^BA=0)(^BB=67)]
-  [68(^83^262)(^84^263)(^85=)(^86=)(^87^264)(^88=)(^89^265)(^8A^265)
-    (^8B=)(^8C=)(^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)
-    (^96=)(^97=)(^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)
-    (^A1=)(^A2=)(^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)
-    (^AC=)(^AD=)(^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)
-    (^B7=)(^B8=)(^B9=)(^BA=0)(^BB=68)]
-  [69(^83^267)(^84^268)(^85=)(^86=)(^87^269)(^88=)(^89^26A)(^8A^26A)
-    (^8B=)(^8C=)(^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)
-    (^96=)(^97=)(^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)
-    (^A1=)(^A2=)(^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)
-    (^AC=)(^AD=)(^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)
-    (^B7=)(^B8=)(^B9=)(^BA=0)(^BB=69)]
-  [6A(^83^26C)(^84^26D)(^85=)(^86=)(^87^26E)(^88=)(^89^26F)(^8A^26F)
-    (^8B=)(^8C=)(^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)
-    (^96=)(^97=)(^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)
-    (^A1=)(^A2=)(^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)
-    (^AC=)(^AD=)(^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)
-    (^B7=)(^B8=)(^B9=)(^BA=0)(^BB=6a)]
-  [6B(^83=)(^84=)(^85=)(^86=)(^87=)(^88=)(^89^273)(^8A^273)(^8B=)(^8C=)
-    (^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)(^96=)(^97=)
-    (^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)(^A1=)(^A2=)
-    (^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)(^AC=)(^AD=)
-    (^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)(^B7=)(^B8=)
-    (^B9=)(^BA=0)(^BB=6b)]
-  [6C(^83=)(^84=)(^85=)(^86=)(^87=)(^88=)(^89^275)(^8A^275)(^8B=)(^8C=)
-    (^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)(^96=)(^97=)
-    (^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)(^A1=)(^A2=)
-    (^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)(^AC=)(^AD=)
-    (^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)(^B7=)(^B8=)
-    (^B9=)(^BA^278)(^BB=6c)]
-  [6D(^83=)(^84=)(^85=)(^86=)(^87=)(^88=)(^89^1E6)(^8A^1E6)(^8B=)(^8C=)
-    (^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)(^96=)(^97=)
-    (^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)(^A1=)(^A2=)
-    (^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)(^AC=)(^AD=)
-    (^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)(^B7=)(^B8=)
-    (^B9=)(^BA=0)(^BB=6d)]
-  [6E(^83^2C2)(^84^2C3)(^85=)(^86=)(^87^2C4)(^88=)(^89^27A)(^8A^27A)
-    (^8B=)(^8C=)(^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)
-    (^96=)(^97=)(^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)
-    (^A1=)(^A2=)(^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)
-    (^AC=)(^AD=)(^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)
-    (^B7=)(^B8=)(^B9=)(^BA^2C5)(^BB=6e)]
-  [6F(^83=)(^84=)(^85=)(^86=)(^87=)(^88=)(^89^27C)(^8A^27C)(^8B=)(^8C=)
-    (^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)(^96=)(^97=)
-    (^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)(^A1=)(^A2=)
-    (^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)(^AC=)(^AD=)
-    (^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)(^B7=)(^B8=)
-    (^B9=)(^BA=0)(^BB=6f)]
-  [70(^83=)(^84=)(^85=)(^86=)(^87=)(^88=)(^89^27E)(^8A^27E)(^8B=)(^8C=)
-    (^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)(^96=)(^97=)
-    (^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)(^A1=)(^A2=)
-    (^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)(^AC=)(^AD=)
-    (^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)(^B7=)(^B8=)
-    (^B9=)(^BA=0)(^BB=70)]
-  [71(^83^F9)(^84^FA)(^85=)(^86=)(^87^FB)(^88=)(^89^282)(^8A^282)(^8B=)
-    (^8C=)(^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)(^96=)
-    (^97=)(^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)(^A1=)
-    (^A2=)(^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)(^AC=)
-    (^AD=)(^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)(^B7=)
-    (^B8=)(^B9=)(^BA^33D)(^BB=71)]
-  [72(^83=)(^84=)(^85=)(^86=)(^87=)(^88=)(^89^284)(^8A^284)(^8B=)(^8C=)
-    (^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)(^96=)(^97=)
-    (^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)(^A1=)(^A2=)
-    (^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)(^AC=)(^AD=)
-    (^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)(^B7=)(^B8=)
-    (^B9=)(^BA^393)(^BB=72)]
-  [73(^83^28D)(^84^28E)(^85=)(^86=)(^87^28F)(^88=)(^89^290)(^8A^290)
-    (^8B=)(^8C=)(^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)
-    (^96=)(^97=)(^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)
-    (^A1=)(^A2=)(^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)
-    (^AC=)(^AD=)(^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)
-    (^B7=)(^B8=)(^B9=)(^BA=0)(^BB=73)]
-  [74(^83^326)(^84=)(^85=)(^86=)(^87^326)(^88=)(^89^294)(^8A^294)(^8B=)
-    (^8C=)(^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)(^96=)
-    (^97=)(^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)(^A1=)
-    (^A2=)(^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)(^AC=)
-    (^AD=)(^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)(^B7=)
-    (^B8=)(^B9=)(^BA^327)(^BB=74)]
-  [75(^83=)(^84=)(^85=)(^86=)(^87=)(^88=)(^89^298)(^8A^298)(^8B=)(^8C=)
-    (^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)(^96=)(^97=)
-    (^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)(^A1=)(^A2=)
-    (^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)(^AC=)(^AD=)
-    (^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)(^B7=)(^B8=)
-    (^B9=)(^BA^2A4)(^BB=75)]
-  [76(^83^29A)(^84^29B)(^85=)(^86=)(^87^29C)(^88=)(^89^29D)(^8A^29D)
-    (^8B=)(^8C=)(^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)
-    (^96=)(^97=)(^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)
-    (^A1=)(^A2=)(^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)
-    (^AC=)(^AD=)(^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)
-    (^B7=)(^B8=)(^B9=)(^BA=0)(^BB=76)]
-  [77(^83^29F)(^84=)(^85=)(^86=)(^87^29F)(^88=)(^89^2A0)(^8A^2A0)(^8B=)
-    (^8C=)(^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)(^96=)
-    (^97=)(^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)(^A1=)
-    (^A2=)(^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)(^AC=)
-    (^AD=)(^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)(^B7=)
-    (^B8=)(^B9=)(^BA=0)(^BB=77)]
-  [78(^83^2A8)(^84=)(^85=)(^86=)(^87^2A8)(^88=)(^89^2A9)(^8A^2A9)(^8B=)
-    (^8C=)(^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)(^96=)
-    (^97=)(^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)(^A1=)
-    (^A2=)(^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)(^AC=)
-    (^AD=)(^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)(^B7=)
-    (^B8=)(^B9=)(^BA=0)(^BB=78)]
-  [79(^83=)(^84=)(^85=)(^86=)(^87=)(^88=)(^89^2AB)(^8A^2AB)(^8B=)(^8C=)
-    (^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)(^96=)(^97=)
-    (^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)(^A1=)(^A2=)
-    (^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)(^AC=)(^AD=)
-    (^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)(^B7=)(^B8=)
-    (^B9=)(^BA=0)(^BB=79)]
-  [7A(^83=)(^84=)(^85=)(^86=)(^87=)(^88=)(^89^2AD)(^8A^2AD)(^8B=)(^8C=)
-    (^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)(^96=)(^97=)
-    (^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)(^A1=)(^A2=)
-    (^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)(^AC=)(^AD=)
-    (^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)(^B7=)(^B8=)
-    (^B9=)(^BA=0)(^BB=7a)]
-  [7B(^83=Joe)(^84^2B0)(^85=)(^86=)(^87^2B1)(^88=)(^89^2B2)(^8A^2B2)
-    (^8B=)(^8C=)(^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)
-    (^96=)(^97=)(^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)
-    (^A1=)(^A2=)(^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)
-    (^AC=)(^AD=)(^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)
-    (^B7=)(^B8=)(^B9=)(^BA=0)(^BB=7b)]
-  [7C(^83=)(^84=)(^85=)(^86=)(^87=)(^88=)(^89^2B5)(^8A^2B5)(^8B=)(^8C=)
-    (^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)(^96=)(^97=)
-    (^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)(^A1=)(^A2=)
-    (^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)(^AC=)(^AD=)
-    (^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)(^B7=)(^B8=)
-    (^B9=)(^BA=0)(^BB=7c)]
-  [7D(^83^2B9)(^84=)(^85=)(^86=)(^87^2B9)(^88=)(^89^2BA)(^8A^2BA)(^8B=)
-    (^8C=)(^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)(^96=)
-    (^97=)(^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)(^A1=)
-    (^A2=)(^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)(^AC=)
-    (^AD=)(^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)(^B7=)
-    (^B8=)(^B9=)(^BA=0)(^BB=7d)]
-  [7E(^83^2BD)(^84^2BE)(^85=)(^86=)(^87^2BF)(^88=)(^89^2C0)(^8A^2C0)
-    (^8B=)(^8C=)(^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)
-    (^96=)(^97=)(^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)
-    (^A1=)(^A2=)(^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)
-    (^AC=)(^AD=)(^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)
-    (^B7=)(^B8=)(^B9=)(^BA=0)(^BB=7e)]
-  [7F(^83^2C6)(^84^2C7)(^85=)(^86=)(^87^2C8)(^88=)(^89^2C9)(^8A^2C9)
-    (^8B=)(^8C=)(^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)
-    (^96=)(^97=)(^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)
-    (^A1=)(^A2=)(^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)
-    (^AC=)(^AD=)(^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)
-    (^B7=)(^B8=)(^B9=)(^BA=0)(^BB=7f)]
-  [80(^83^2CC)(^84^2CD)(^85=)(^86=)(^87^2CE)(^88=)(^89^2CF)(^8A^2CF)
-    (^8B=)(^8C=)(^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)
-    (^96=)(^97=)(^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)
-    (^A1=)(^A2=)(^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)
-    (^AC=)(^AD=)(^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)
-    (^B7=)(^B8=)(^B9=)(^BA=0)(^BB=80)]
-  [81(^83^2D2)(^84^2D3)(^85=)(^86=)(^87^2D4)(^88=)(^89^2D5)(^8A^2D5)
-    (^8B=)(^8C=)(^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)
-    (^96=)(^97=)(^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)
-    (^A1=)(^A2=)(^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)
-    (^AC=)(^AD=)(^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)
-    (^B7=)(^B8=)(^B9=)(^BA=0)(^BB=81)]
-  [82(^83=)(^84=)(^85=)(^86=)(^87=)(^88=)(^89^2D7)(^8A^1B9)(^8B=)(^8C=)
-    (^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)(^96=)(^97=)
-    (^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)(^A1=)(^A2=)
-    (^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)(^AC=)(^AD=)
-    (^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)(^B7=)(^B8=)
-    (^B9=)(^BA^2ED)(^BB=82)]
-  [83(^83^2DC)(^84=)(^85=)(^86=)(^87^2DC)(^88=)(^89^2DD)(^8A^2DD)(^8B=)
-    (^8C=)(^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)(^96=)
-    (^97=)(^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)(^A1=)
-    (^A2=)(^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)(^AC=)
-    (^AD=)(^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)(^B7=)
-    (^B8=)(^B9=)(^BA=0)(^BB=83)]
-  [84(^83=)(^84=)(^85=)(^86=)(^87=)(^88=)(^89^2E0)(^8A^2E0)(^8B=)(^8C=)
-    (^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)(^96=)(^97=)
-    (^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)(^A1=)(^A2=)
-    (^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)(^AC=)(^AD=)
-    (^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)(^B7=)(^B8=)
-    (^B9=)(^BA^361)(^BB=84)]
-  [85(^83^2E4)(^84^2E5)(^85=)(^86=)(^87^2E6)(^88=)(^89^2E7)(^8A^2E7)
-    (^8B=)(^8C=)(^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)
-    (^96=)(^97=)(^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)
-    (^A1=)(^A2=)(^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)
-    (^AC=)(^AD=)(^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)
-    (^B7=)(^B8=)(^B9=)(^BA=0)(^BB=85)]
-  [86(^83=)(^84=)(^85=)(^86=)(^87=)(^88=)(^89^2EE)(^8A^2EE)(^8B=)(^8C=)
-    (^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)(^96=)(^97=)
-    (^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)(^A1=)(^A2=)
-    (^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)(^AC=)(^AD=)
-    (^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)(^B7=)(^B8=)
-    (^B9=)(^BA=0)(^BB=86)]
-  [87(^83^2F3)(^84^2F4)(^85=)(^86=)(^87^2F5)(^88=)(^89^2F0)(^8A^2F0)
-    (^8B=)(^8C=)(^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)
-    (^96=)(^97=)(^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)
-    (^A1=)(^A2=)(^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)
-    (^AC=)(^AD=)(^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)
-    (^B7=)(^B8=)(^B9=)(^BA^2F6)(^BB=87)]
-  [88(^83^C8)(^84^C9)(^85=)(^86=)(^87^CA)(^88=)(^89^2F8)(^8A^2F8)(^8B=)
-    (^8C=)(^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)(^96=)
-    (^97=)(^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)(^A1=)
-    (^A2=)(^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)(^AC=)
-    (^AD=)(^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)(^B7=)
-    (^B8=)(^B9=)(^BA^301)(^BB=88)]
-  [89(^83^2FC)(^84^2FD)(^85=)(^86=)(^87^2FE)(^88=)(^89^2FF)(^8A^2FF)
-    (^8B=)(^8C=)(^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)
-    (^96=)(^97=)(^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)
-    (^A1=)(^A2=)(^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)
-    (^AC=)(^AD=)(^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)
-    (^B7=)(^B8=)(^B9=)(^BA=0)(^BB=89)]
-  [8A(^83=)(^84=)(^85=)(^86=)(^87=)(^88=)(^89^303)(^8A^303)(^8B=)(^8C=)
-    (^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)(^96=)(^97=)
-    (^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)(^A1=)(^A2=)
-    (^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)(^AC=)(^AD=)
-    (^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)(^B7=)(^B8=)
-    (^B9=)(^BA=0)(^BB=8a)]
-  [8B(^83=)(^84=)(^85=)(^86=)(^87=)(^88=)(^89^305)(^8A^305)(^8B=)(^8C=)
-    (^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)(^96=)(^97=)
-    (^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)(^A1=)(^A2=)
-    (^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)(^AC=)(^AD=)
-    (^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)(^B7=)(^B8=)
-    (^B9=)(^BA=0)(^BB=8b)]
-  [8C(^83^19D)(^84^19E)(^85=)(^86=)(^87^19F)(^88=)(^89^307)(^8A^307)
-    (^8B=)(^8C=)(^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)
-    (^96=)(^97=)(^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)
-    (^A1=)(^A2=)(^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)
-    (^AC=)(^AD=)(^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)
-    (^B7=)(^B8=)(^B9=)(^BA=0)(^BB=8c)]
-  [8D(^83^D8)(^84^D9)(^85=)(^86=)(^87^DA)(^88=)(^89^309)(^8A^309)(^8B=)
-    (^8C=)(^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)(^96=)
-    (^97=)(^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)(^A1=)
-    (^A2=)(^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)(^AC=)
-    (^AD=)(^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)(^B7=)
-    (^B8=)(^B9=)(^BA=0)(^BB=8d)]
-  [8E(^83=)(^84=)(^85=)(^86=)(^87=)(^88=)(^89^311)(^8A^311)(^8B=)(^8C=)
-    (^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)(^96=)(^97=)
-    (^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)(^A1=)(^A2=)
-    (^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)(^AC=)(^AD=)
-    (^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)(^B7=)(^B8=)
-    (^B9=)(^BA=0)(^BB=8e)]
-  [8F(^83=)(^84=)(^85=)(^86=)(^87=)(^88=)(^89^313)(^8A^314)(^8B=)(^8C=)
-    (^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)(^96=)(^97=)
-    (^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)(^A1=)(^A2=)
-    (^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)(^AC=)(^AD=)
-    (^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)(^B7=)(^B8=)
-    (^B9=)(^BA=0)(^BB=8f)]
-  [90(^83=)(^84=)(^85=)(^86=)(^87=)(^88=)(^89^316)(^8A^316)(^8B=)(^8C=)
-    (^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)(^96=)(^97=)
-    (^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)(^A1=)(^A2=)
-    (^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)(^AC=)(^AD=)
-    (^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)(^B7=)(^B8=)
-    (^B9=)(^BA^392)(^BB=90)]
-  [91(^83=)(^84=)(^85=)(^86=)(^87=)(^88=)(^89^318)(^8A^318)(^8B=)(^8C=)
-    (^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)(^96=)(^97=)
-    (^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)(^A1=)(^A2=)
-    (^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)(^AC=)(^AD=)
-    (^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)(^B7=)(^B8=)
-    (^B9=)(^BA=0)(^BB=91)]
-  [92(^83^34B)(^84^34C)(^85=)(^86=)(^87^34D)(^88=)(^89^31A)(^8A^31A)
-    (^8B=)(^8C=)(^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)
-    (^96=)(^97=)(^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)
-    (^A1=)(^A2=)(^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)
-    (^AC=)(^AD=)(^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)
-    (^B7=)(^B8=)(^B9=)(^BA^33D)(^BB=92)]
-  [93(^83=)(^84=)(^85=)(^86=)(^87=)(^88=)(^89^31C)(^8A^31C)(^8B=)(^8C=)
-    (^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)(^96=)(^97=)
-    (^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)(^A1=)(^A2=)
-    (^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)(^AC=)(^AD=)
-    (^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)(^B7=)(^B8=)
-    (^B9=)(^BA^391)(^BB=93)]
-  [94(^83^328)(^84^329)(^85=)(^86=)(^87^32A)(^88=)(^89^32B)(^8A^32B)
-    (^8B=)(^8C=)(^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)
-    (^96=)(^97=)(^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)
-    (^A1=)(^A2=)(^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)
-    (^AC=)(^AD=)(^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)
-    (^B7=)(^B8=)(^B9=)(^BA=0)(^BB=94)]
-  [95(^83^32E)(^84^32F)(^85=)(^86=)(^87^330)(^88=)(^89^331)(^8A^331)
-    (^8B=)(^8C=)(^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)
-    (^96=)(^97=)(^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)
-    (^A1=)(^A2=)(^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)
-    (^AC=)(^AD=)(^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)
-    (^B7=)(^B8=)(^B9=)(^BA=0)(^BB=95)]
-  [96(^83^333)(^84^334)(^85=)(^86=)(^87^335)(^88=)(^89^336)(^8A^336)
-    (^8B=)(^8C=)(^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)
-    (^96=)(^97=)(^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)
-    (^A1=)(^A2=)(^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)
-    (^AC=)(^AD=)(^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)
-    (^B7=)(^B8=)(^B9=)(^BA=0)(^BB=96)]
-  [97(^83^338)(^84^339)(^85=)(^86=)(^87^33A)(^88=)(^89^33B)(^8A^33B)
-    (^8B=)(^8C=)(^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)
-    (^96=)(^97=)(^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)
-    (^A1=)(^A2=)(^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)
-    (^AC=)(^AD=)(^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)
-    (^B7=)(^B8=)(^B9=)(^BA=0)(^BB=97)]
-  [98(^83^33E)(^84^32F)(^85=)(^86=)(^87^33F)(^88=)(^89^340)(^8A^340)
-    (^8B=)(^8C=)(^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)
-    (^96=)(^97=)(^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)
-    (^A1=)(^A2=)(^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)
-    (^AC=)(^AD=)(^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)
-    (^B7=)(^B8=)(^B9=)(^BA=0)(^BB=98)]
-  [99(^83^342)(^84^343)(^85=)(^86=)(^87^344)(^88=)(^89^314)(^8A^314)
-    (^8B=)(^8C=)(^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)
-    (^96=)(^97=)(^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)
-    (^A1=)(^A2=)(^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)
-    (^AC=)(^AD=)(^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)
-    (^B7=)(^B8=)(^B9=)(^BA=0)(^BB=99)]
-  [9A(^83=Eva)(^84^347)(^85=)(^86=)(^87^348)(^88=)(^89^349)(^8A^349)
-    (^8B=)(^8C=)(^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)
-    (^96=)(^97=)(^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)
-    (^A1=)(^A2=)(^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)
-    (^AC=)(^AD=)(^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)
-    (^B7=)(^B8=)(^B9=)(^BA=0)(^BB=9a)]
-  [9B(^83^34E)(^84^34F)(^85=)(^86=)(^87^350)(^88=)(^89^351)(^8A^351)
-    (^8B=)(^8C=)(^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)
-    (^96=)(^97=)(^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)
-    (^A1=)(^A2=)(^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)
-    (^AC=)(^AD=)(^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)
-    (^B7=)(^B8=)(^B9=)(^BA=0)(^BB=9b)]
-  [9C(^83^F3)(^84^F4)(^85=)(^86=)(^87^F5)(^88=)(^89^353)(^8A^353)(^8B=)
-    (^8C=)(^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)(^96=)
-    (^97=)(^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)(^A1=)
-    (^A2=)(^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)(^AC=)
-    (^AD=)(^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)(^B7=)
-    (^B8=)(^B9=)(^BA=0)(^BB=9c)]
-  [9D(^83=)(^84=)(^85=)(^86=)(^87=)(^88=)(^89^356)(^8A^356)(^8B=)(^8C=)
-    (^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)(^96=)(^97=)
-    (^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)(^A1=)(^A2=)
-    (^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)(^AC=)(^AD=)
-    (^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)(^B7=)(^B8=)
-    (^B9=)(^BA=0)(^BB=9d)]
-  [9E(^83=)(^84=)(^85=)(^86=)(^87=)(^88=)(^89^359)(^8A^359)(^8B=)(^8C=)
-    (^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)(^96=)(^97=)
-    (^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)(^A1=)(^A2=)
-    (^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)(^AC=)(^AD=)
-    (^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)(^B7=)(^B8=)
-    (^B9=)(^BA=0)(^BB=9e)]
-  [9F(^83=)(^84=)(^85=)(^86=)(^87=)(^88=)(^89^35D)(^8A^35D)(^8B=)(^8C=)
-    (^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)(^96=)(^97=)
-    (^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)(^A1=)(^A2=)
-    (^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)(^AC=)(^AD=)
-    (^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)(^B7=)(^B8=)
-    (^B9=)(^BA=0)(^BB=9f)]
-  [A0(^83=)(^84=)(^85=)(^86=)(^87=)(^88=)(^89^363)(^8A^363)(^8B=)(^8C=)
-    (^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)(^96=)(^97=)
-    (^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)(^A1=)(^A2=)
-    (^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)(^AC=)(^AD=)
-    (^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)(^B7=)(^B8=)
-    (^B9=)(^BA=0)(^BB=a0)]
-  [A1(^83=)(^84=)(^85=)(^86=)(^87=)(^88=)(^89^366)(^8A^366)(^8B=)(^8C=)
-    (^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)(^96=)(^97=)
-    (^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)(^A1=)(^A2=)
-    (^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)(^AC=)(^AD=)
-    (^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)(^B7=)(^B8=)
-    (^B9=)(^BA=0)(^BB=a1)]
-  [A2(^83^368)(^84^369)(^85=)(^86=)(^87^36A)(^88=)(^89^36B)(^8A^36B)
-    (^8B=)(^8C=)(^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)
-    (^96=)(^97=)(^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)
-    (^A1=)(^A2=)(^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)
-    (^AC=)(^AD=)(^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)
-    (^B7=)(^B8=)(^B9=)(^BA=0)(^BB=a2)]
-  [A3(^83^2E5)(^84^36D)(^85=)(^86=)(^87^36E)(^88=)(^89^36F)(^8A^36F)
-    (^8B=)(^8C=)(^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)
-    (^96=)(^97=)(^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)
-    (^A1=)(^A2=)(^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)
-    (^AC=)(^AD=)(^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)
-    (^B7=)(^B8=)(^B9=)(^BA=0)(^BB=a3)]
-  [A4(^83=)(^84=)(^85=)(^86=)(^87=)(^88=)(^89^373)(^8A^373)(^8B=)(^8C=)
-    (^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)(^96=)(^97=)
-    (^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)(^A1=)(^A2=)
-    (^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)(^AC=)(^AD=)
-    (^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)(^B7=)(^B8=)
-    (^B9=)(^BA=0)(^BB=a4)]
-  [A5(^83=)(^84=)(^85=)(^86=)(^87=)(^88=)(^89^377)(^8A^377)(^8B=)(^8C=)
-    (^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)(^96=)(^97=)
-    (^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)(^A1=)(^A2=)
-    (^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)(^AC=)(^AD=)
-    (^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)(^B7=)(^B8=)
-    (^B9=)(^BA=0)(^BB=a5)]
-  [A6(^83=Jim)(^84^37A)(^85=)(^86=)(^87^37B)(^88=)(^89^37C)(^8A^37C)
-    (^8B=)(^8C=)(^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)
-    (^96=)(^97=)(^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)
-    (^A1=)(^A2=)(^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)
-    (^AC=)(^AD=)(^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)
-    (^B7=)(^B8=)(^B9=)(^BA=0)(^BB=a6)]
-  [A7(^83^37E)(^84^37F)(^85=)(^86=)(^87^380)(^88=)(^89^381)(^8A^381)
-    (^8B=)(^8C=)(^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)
-    (^96=)(^97=)(^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)
-    (^A1=)(^A2=)(^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)
-    (^AC=)(^AD=)(^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)
-    (^B7=)(^B8=)(^B9=)(^BA=0)(^BB=a7)]
-  [A8(^83^383)(^84^384)(^85=)(^86=)(^87^385)(^88=)(^89^386)(^8A^386)
-    (^8B=)(^8C=)(^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)
-    (^96=)(^97=)(^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)
-    (^A1=)(^A2=)(^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)
-    (^AC=)(^AD=)(^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)
-    (^B7=)(^B8=)(^B9=)(^BA=0)(^BB=a8)]
-  [A9(^83^389)(^84^38A)(^85=)(^86=)(^87^38B)(^88=)(^89^38C)(^8A^38C)
-    (^8B=)(^8C=)(^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)
-    (^96=)(^97=)(^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)
-    (^A1=)(^A2=)(^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)
-    (^AC=)(^AD=)(^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)
-    (^B7=)(^B8=)(^B9=)(^BA=0)(^BB=a9)]
-  [AA(^83^2BD)(^84^394)(^85=)(^86=)(^87^395)(^88=)(^89^396)(^8A^396)
-    (^8B=)(^8C=)(^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)
-    (^96=)(^97=)(^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)
-    (^A1=)(^A2=)(^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)
-    (^AC=)(^AD=)(^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)
-    (^B7=)(^B8=)(^B9=)(^BA=0)(^BB=aa)]
-  [AB(^83^398)(^84^103)(^85=)(^86=)(^87^399)(^88=)(^89^39A)(^8A^39B)
-    (^8B=)(^8C=)(^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)
-    (^96=)(^97=)(^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)
-    (^A1=)(^A2=)(^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)
-    (^AC=)(^AD=)(^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)
-    (^B7=)(^B8=)(^B9=)(^BA=0)(^BB=ab)]
-  [AC(^83^103)(^84^398)(^85=)(^86=)(^87^39D)(^88=)(^89^39E)(^8A^39E)
-    (^8B=)(^8C=)(^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)
-    (^96=)(^97=)(^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)
-    (^A1=)(^A2=)(^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)
-    (^AC=)(^AD=)(^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)
-    (^B7=)(^B8=)(^B9=)(^BA=0)(^BB=ac)]
-  [AD(^83^3A0)(^84^3A1)(^85=)(^86=)(^87^3A2)(^88=)(^89^3A3)(^8A^3A3)
-    (^8B=)(^8C=)(^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)
-    (^96=)(^97=)(^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)
-    (^A1=)(^A2=)(^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)
-    (^AC=)(^AD=)(^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)
-    (^B7=)(^B8=)(^B9=)(^BA=0)(^BB=ad)]
-  [AE(^83=)(^84=)(^85=)(^86=)(^87=)(^88=)(^89^3A5)(^8A^3A6)(^8B=)(^8C=)
-    (^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)(^96=)(^97=)
-    (^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)(^A1=)(^A2=)
-    (^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)(^AC=)(^AD=)
-    (^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)(^B7=)(^B8=)
-    (^B9=)(^BA=0)(^BB=ae)]
-  [AF(^83=)(^84=)(^85=)(^86=)(^87=)(^88=)(^89^3AB)(^8A^3AB)(^8B=)(^8C=)
-    (^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)(^96=)(^97=)
-    (^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)(^A1=)(^A2=)
-    (^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)(^AC=)(^AD=)
-    (^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)(^B7=)(^B8=)
-    (^B9=)(^BA=0)(^BB=af)]
-  [B0(^83^3AD)(^84^3AE)(^85=)(^86=)(^87^3AF)(^88=)(^89^3B0)(^8A^3B0)
-    (^8B=)(^8C=)(^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)
-    (^96=)(^97=)(^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)
-    (^A1=)(^A2=)(^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)
-    (^AC=)(^AD=)(^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)
-    (^B7=)(^B8=)(^B9=)(^BA=0)(^BB=b0)]
-  [B1(^83=)(^84=)(^85=)(^86=)(^87=)(^88=)(^89^3B2)(^8A^3B2)(^8B=)(^8C=)
-    (^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)(^96=)(^97=)
-    (^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)(^A1=)(^A2=)
-    (^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)(^AC=)(^AD=)
-    (^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)(^B7=)(^B8=)
-    (^B9=)(^BA=0)(^BB=b1)]
-  [B2(^83=)(^84=)(^85=)(^86=)(^87=)(^88=)(^89^3B4)(^8A^3B4)(^8B=)(^8C=)
-    (^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)(^96=)(^97=)
-    (^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)(^A1=)(^A2=)
-    (^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)(^AC=)(^AD=)
-    (^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)(^B7=)(^B8=)
-    (^B9=)(^BA=0)(^BB=b2)]
-  [B3(^83=)(^84=)(^85=)(^86=)(^87=)(^88=)(^89^3B6)(^8A^3B6)(^8B=)(^8C=)
-    (^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)(^96=)(^97=)
-    (^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)(^A1=)(^A2=)
-    (^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)(^AC=)(^AD=)
-    (^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)(^B7=)(^B8=)
-    (^B9=)(^BA=0)(^BB=b3)]}
-
-@$${9B{@
-
-<(3B9=b4)(3B8=kphotoalbum at kdab.net)>
-{1:^80 {(k^BE:c)(s=9)} 
-  [-B4(^83=)(^84=)(^85=)(^86=)(^87=)(^88=)(^89^3B8)(^8A^3B8)(^8B=)
-    (^8C=)(^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)(^96=)
-    (^97=)(^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)(^A1=)
-    (^A2=)(^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)(^AC=)
-    (^AD=)(^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)(^B7=)
-    (^B8=)(^B9=)(^BA=0)(^BB=b4)]}
-[1:^82(^BD=b4)]
-@$$}9B}@
-
-@$${9C{@
-
-<(3BC=b5)(3BA=Silke.Fluesshoeh at gmx.de)(3BB=silke.fluesshoeh at gmx.de)>
-{1:^80 {(k^BE:c)(s=9)} 
-  [-B5(^83=)(^84=)(^85=)(^86=)(^87=)(^88=)(^89^3BA)(^8A^3BB)(^8B=)
-    (^8C=)(^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)(^96=)
-    (^97=)(^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)(^A1=)
-    (^A2=)(^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)(^AC=)
-    (^AD=)(^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)(^B7=)
-    (^B8=)(^B9=)(^BA=0)(^BB=b5)]}
-[1:^82(^BD=b5)]
-@$$}9C}@
-
-@$${9D{@
-
-<(3C1=b6)(3BD=Annette)(3BE=Korthaus)(3BF=Annette Korthaus)(3C0
-    =annettekorthaus at gmx.de)>
-{1:^80 {(k^BE:c)(s=9)} 
-  [-B6(^83^3BD)(^84^3BE)(^85=)(^86=)(^87^3BF)(^88=)(^89^3C0)(^8A^3C0)
-    (^8B=)(^8C=)(^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)
-    (^96=)(^97=)(^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)
-    (^A1=)(^A2=)(^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)
-    (^AC=)(^AD=)(^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)
-    (^B7=)(^B8=)(^B9=)(^BA=0)(^BB=b6)]}
-[1:^82(^BD=b6)]
-@$$}9D}@
-
-@$${9E{@
-
-<(3C3=b7)(3C2=danielknippertz at email.de)>
-{1:^80 {(k^BE:c)(s=9)} 
-  [-B7(^83=)(^84=)(^85=)(^86=)(^87=)(^88=)(^89^3C2)(^8A^3C2)(^8B=)
-    (^8C=)(^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)(^96=)
-    (^97=)(^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)(^A1=)
-    (^A2=)(^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)(^AC=)
-    (^AD=)(^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)(^B7=)
-    (^B8=)(^B9=)(^BA=0)(^BB=b7)]}
-[1:^82(^BD=b7)]
-@$$}9E}@
-
-@$${9F{@
-@$$}9F}@
-
-@$${A1{@
-
-<(3C5=b8)(3C4=gurolid at hotmail.com)>
-{1:^80 {(k^BE:c)(s=9)} 
-  [-B8(^83=)(^84=)(^85=)(^86=)(^87=)(^88=)(^89^3C4)(^8A^3C4)(^8B=)
-    (^8C=)(^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)(^96=)
-    (^97=)(^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)(^A1=)
-    (^A2=)(^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)(^AC=)
-    (^AD=)(^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)(^B7=)
-    (^B8=)(^B9=)(^BA=0)(^BB=b8)]}
-[1:^82(^BD=b8)]
-@$$}A1}@
-
-@$${A3{@
-
-<(3CA=b9)(3C6=Harald)(3C7=Holz)(3C8=Harald Holz)(3C9=holz at dfki.uni-kl.de)>
-{1:^80 {(k^BE:c)(s=9)} 
-  [-B9(^83^3C6)(^84^3C7)(^85=)(^86=)(^87^3C8)(^88=)(^89^3C9)(^8A^3C9)
-    (^8B=)(^8C=)(^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)
-    (^96=)(^97=)(^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)
-    (^A1=)(^A2=)(^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)
-    (^AC=)(^AD=)(^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)
-    (^B7=)(^B8=)(^B9=)(^BA=0)(^BB=b9)]}
-[1:^82(^BD=b9)]
-@$$}A3}@
-
-@$${A4{@
-
-<(3CF=ba)(3CB=Simon)(3CC=Price)(3CD=Simon Price)(3CE
-    =simon.price at bristol.ac.uk)>
-{1:^80 {(k^BE:c)(s=9)} 
-  [-BA(^83^3CB)(^84^3CC)(^85=)(^86=)(^87^3CD)(^88=)(^89^3CE)(^8A^3CE)
-    (^8B=)(^8C=)(^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)
-    (^96=)(^97=)(^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)
-    (^A1=)(^A2=)(^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)
-    (^AC=)(^AD=)(^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)
-    (^B7=)(^B8=)(^B9=)(^BA=0)(^BB=ba)]}
-[1:^82(^BD=ba)]
-@$$}A4}@
-
-@$${A5{@
-
-<(3D1=bb)(3D0=gunnar.grimnes at dfki.de)>
-{1:^80 {(k^BE:c)(s=9)} 
-  [-BB(^83=)(^84=)(^85=)(^86=)(^87=)(^88=)(^89^3D0)(^8A^3D0)(^8B=)
-    (^8C=)(^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)(^96=)
-    (^97=)(^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)(^A1=)
-    (^A2=)(^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)(^AC=)
-    (^AD=)(^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)(^B7=)
-    (^B8=)(^B9=)(^BA=0)(^BB=bb)]}
-[1:^82(^BD=bb)]
-@$$}A5}@
-
-@$${A6{@
-@$$}A6}@
-
-@$${A8{@
-
-<(3D3=bc)(3D2=jhudsy at gmail.com)>
-{1:^80 {(k^BE:c)(s=9)} 
-  [-BC(^83=)(^84=)(^85=)(^86=)(^87=)(^88=)(^89^3D2)(^8A^3D2)(^8B=)
-    (^8C=)(^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)(^96=)
-    (^97=)(^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)(^A1=)
-    (^A2=)(^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)(^AC=)
-    (^AD=)(^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)(^B7=)
-    (^B8=)(^B9=)(^BA=0)(^BB=bc)]}
-[1:^82(^BD=bc)]
-@$$}A8}@
-
-@$${AA{@
-
-<(3D8=bd)(3D4=Carole)(3D5=Goble)(3D6=Carole Goble)(3D7=carole at cs.man.ac.uk)>
-{1:^80 {(k^BE:c)(s=9)} 
-  [-BD(^83^3D4)(^84^3D5)(^85=)(^86=)(^87^3D6)(^88=)(^89^3D7)(^8A^3D7)
-    (^8B=)(^8C=)(^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)
-    (^96=)(^97=)(^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)
-    (^A1=)(^A2=)(^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)
-    (^AC=)(^AD=)(^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)
-    (^B7=)(^B8=)(^B9=)(^BA=0)(^BB=bd)]}
-[1:^82(^BD=bd)]
-@$$}AA}@
-
-@$${AB{@
-
-<(3DD=be)(3D9=Janez)(3DA=Brank)(3DB=Janez Brank)(3DC=janez.brank at ijs.si)>
-{1:^80 {(k^BE:c)(s=9)} 
-  [-BE(^83^3D9)(^84^3DA)(^85=)(^86=)(^87^3DB)(^88=)(^89^3DC)(^8A^3DC)
-    (^8B=)(^8C=)(^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)
-    (^96=)(^97=)(^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)
-    (^A1=)(^A2=)(^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)
-    (^AC=)(^AD=)(^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)
-    (^B7=)(^B8=)(^B9=)(^BA=0)(^BB=be)]}
-[1:^82(^BD=be)]
-@$$}AB}@
-
-@$${AC{@
-
-<(3E2=bf)(3DE=Marko)(3DF=Grobelnik)(3E0=Marko Grobelnik)(3E1
-    =marko.grobelnik at ijs.si)>
-{1:^80 {(k^BE:c)(s=9)} 
-  [-BF(^83^3DE)(^84^3DF)(^85=)(^86=)(^87^3E0)(^88=)(^89^3E1)(^8A^3E1)
-    (^8B=)(^8C=)(^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)
-    (^96=)(^97=)(^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)
-    (^A1=)(^A2=)(^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)
-    (^AC=)(^AD=)(^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)
-    (^B7=)(^B8=)(^B9=)(^BA=0)(^BB=bf)]}
-[1:^82(^BD=bf)]
-@$$}AC}@
-
-@$${AD{@
-
-<(3E4=c0)(3E3=vangelis at iit.demokritos.gr)>
-{1:^80 {(k^BE:c)(s=9)} 
-  [-C0(^83=)(^84=)(^85=)(^86=)(^87=)(^88=)(^89^3E3)(^8A^3E3)(^8B=)
-    (^8C=)(^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)(^96=)
-    (^97=)(^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)(^A1=)
-    (^A2=)(^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)(^AC=)
-    (^AD=)(^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)(^B7=)
-    (^B8=)(^B9=)(^BA=0)(^BB=c0)]}
-[1:^82(^BD=c0)]
-@$$}AD}@
-
-@$${AE{@
-@$$}AE}@
-
-@$${B0{@
-
-<(3E6=c1)(3E5=nepomuk-ma at dfki.uni-kl.de)>
-{1:^80 {(k^BE:c)(s=9)} 
-  [-C1(^83=)(^84=)(^85=)(^86=)(^87=)(^88=)(^89^3E5)(^8A^3E5)(^8B=)
-    (^8C=)(^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)(^96=)
-    (^97=)(^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)(^A1=)
-    (^A2=)(^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)(^AC=)
-    (^AD=)(^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)(^B7=)
-    (^B8=)(^B9=)(^BA=0)(^BB=c1)]}
-[1:^82(^BD=c1)]
-@$$}B0}@
-
-@$${B1{@
-@$$}B1}@
-
-@$${B3{@
-
-<(3EB=c2)(3E7=Leo)(3E8=Sauermann)(3E9=Leo Sauermann)(3EA
-    =sauermann at dfki.uni-kl.de)>
-{1:^80 {(k^BE:c)(s=9)} 
-  [-C2(^83=Leo)(^84^3E8)(^85=)(^86=)(^87^3E9)(^88=)(^89^3EA)(^8A^3EA)
-    (^8B=)(^8C=)(^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)
-    (^96=)(^97=)(^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)
-    (^A1=)(^A2=)(^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)
-    (^AC=)(^AD=)(^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)
-    (^B7=)(^B8=)(^B9=)(^BA=0)(^BB=c2)]}
-[1:^82(^BD=c2)]
-@$$}B3}@
-
-@$${B4{@
-
-<(3F0=c3)(3EC=Roth-Berghofer)(3ED=Roth-Berghofer Thomas)(3EE
-    =Thomas.Roth-Berghofer at dfki.de)(3EF=thomas.roth-berghofer at dfki.de)>
-{1:^80 {(k^BE:c)(s=9)} 
-  [-C3(^83^3EC)(^84^28D)(^85=)(^86=)(^87^3ED)(^88=)(^89^3EE)(^8A^3EF)
-    (^8B=)(^8C=)(^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)
-    (^96=)(^97=)(^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)
-    (^A1=)(^A2=)(^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)
-    (^AC=)(^AD=)(^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)
-    (^B7=)(^B8=)(^B9=)(^BA=0)(^BB=c3)]}
-[1:^82(^BD=c3)]
-@$$}B4}@
-
-@$${B5{@
-
-<(3F4=c4)(3F1=Burkhart)(3F2=Daniel Burkhart)(3F3=dburkhar at dfki.uni-kl.de)>
-{1:^80 {(k^BE:c)(s=9)} 
-  [-C4(^83^2F3)(^84^3F1)(^85=)(^86=)(^87^3F2)(^88=)(^89^3F3)(^8A^3F3)
-    (^8B=)(^8C=)(^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)
-    (^96=)(^97=)(^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)
-    (^A1=)(^A2=)(^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)
-    (^AC=)(^AD=)(^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)
-    (^B7=)(^B8=)(^B9=)(^BA=0)(^BB=c4)]}
-[1:^82(^BD=c4)]
-@$$}B5}@
-
-@$${B6{@
-
-<(3F9=c5)(3F5=Dominik)(3F6=Heim)(3F7=Dominik Heim)(3F8
-    =dominik_heim at gmx.net)>
-{1:^80 {(k^BE:c)(s=9)} 
-  [-C5(^83^3F5)(^84^3F6)(^85=)(^86=)(^87^3F7)(^88=)(^89^3F8)(^8A^3F8)
-    (^8B=)(^8C=)(^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)
-    (^96=)(^97=)(^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)
-    (^A1=)(^A2=)(^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)
-    (^AC=)(^AD=)(^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)
-    (^B7=)(^B8=)(^B9=)(^BA=0)(^BB=c5)]}
-[1:^82(^BD=c5)]
-@$$}B6}@
-
-@$${B7{@
-
-<(3FE=c6)(3FA=Florian)(3FB=Mittag)(3FC=Florian Mittag)(3FD
-    =florian.mittag at gmx.de)>
-{1:^80 {(k^BE:c)(s=9)} 
-  [-C6(^83^3FA)(^84^3FB)(^85=)(^86=)(^87^3FC)(^88=)(^89^3FD)(^8A^3FD)
-    (^8B=)(^8C=)(^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)
-    (^96=)(^97=)(^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)
-    (^A1=)(^A2=)(^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)
-    (^AC=)(^AD=)(^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)
-    (^B7=)(^B8=)(^B9=)(^BA=0)(^BB=c6)]}
-[1:^82(^BD=c6)]
-@$$}B7}@
-
-@$${B8{@
-
-<(402=c7)(3FF=Gunnar)(400=Gunnar Grimnes)(401=grimnes at dfki.uni-kl.de)>
-{1:^80 {(k^BE:c)(s=9)} 
-  [-C7(^83^3FF)(^84^A8)(^85=)(^86=)(^87^400)(^88=)(^89^401)(^8A^401)
-    (^8B=)(^8C=)(^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)
-    (^96=)(^97=)(^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)
-    (^A1=)(^A2=)(^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)
-    (^AC=)(^AD=)(^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)
-    (^B7=)(^B8=)(^B9=)(^BA=0)(^BB=c7)]}
-[1:^82(^BD=c7)]
-@$$}B8}@
-
-@$${B9{@
-
-<(408=c8)(403=Benjamin)(404=Horak)(405=Benjamin Horak)(406
-    =Benjamin.Horak at dfki.de)(407=benjamin.horak at dfki.de)>
-{1:^80 {(k^BE:c)(s=9)} 
-  [-C8(^83^403)(^84^404)(^85=)(^86=)(^87^405)(^88=)(^89^406)(^8A^407)
-    (^8B=)(^8C=)(^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)
-    (^96=)(^97=)(^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)
-    (^A1=)(^A2=)(^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)
-    (^AC=)(^AD=)(^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)
-    (^B7=)(^B8=)(^B9=)(^BA=0)(^BB=c8)]}
-[1:^82(^BD=c8)]
-@$$}B9}@
-
-@$${BA{@
-
-<(40E=c9)(409=Ploessl)(40A=Moritz)(40B=Ploessl Moritz)(40C
-    =Moritz.Ploessl at dfki.de)(40D=moritz.ploessl at dfki.de)>
-{1:^80 {(k^BE:c)(s=9)} 
-  [-C9(^83^409)(^84^40A)(^85=)(^86=)(^87^40B)(^88=)(^89^40C)(^8A^40D)
-    (^8B=)(^8C=)(^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)
-    (^96=)(^97=)(^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)
-    (^A1=)(^A2=)(^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)
-    (^AC=)(^AD=)(^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)
-    (^B7=)(^B8=)(^B9=)(^BA=0)(^BB=c9)]}
-[1:^82(^BD=c9)]
-@$$}BA}@
-
-@$${BB{@
-@$$}BB}@
-
-@$${BD{@
-
-<(410=ca)(40F=dana.hauptmann at freenet.de)>
-{1:^80 {(k^BE:c)(s=9)} 
-  [-CA(^83=)(^84=)(^85=)(^86=)(^87=)(^88=)(^89^40F)(^8A^40F)(^8B=)
-    (^8C=)(^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)(^96=)
-    (^97=)(^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)(^A1=)
-    (^A2=)(^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)(^AC=)
-    (^AD=)(^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)(^B7=)
-    (^B8=)(^B9=)(^BA=0)(^BB=ca)]}
-[1:^82(^BD=ca)]
-@$$}BD}@
-
-@$${BE{@
-@$$}BE}@
-
-@$${C0{@
-
-<(415=cb)(411=Dr. Thomas)(412=Dr. Thomas Roth-Berghofer)(413
-    =Thomas.Roth-Berghofer at dfki.uni-kl.de)(414
-    =thomas.roth-berghofer at dfki.uni-kl.de)>
-{1:^80 {(k^BE:c)(s=9)} 
-  [-CB(^83^411)(^84^3EC)(^85=)(^86=)(^87^412)(^88=)(^89^413)(^8A^414)
-    (^8B=)(^8C=)(^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)
-    (^96=)(^97=)(^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)
-    (^A1=)(^A2=)(^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)
-    (^AC=)(^AD=)(^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)
-    (^B7=)(^B8=)(^B9=)(^BA=0)(^BB=cb)]}
-[1:^82(^BD=cb)]
-@$$}C0}@
-
-@$${C1{@
-
-<(41A=cc)(416=Nicolai)(417=Schwindt)(418=Nicolai Schwindt)(419
-    =schwindt at dfki.uni-kl.de)>
-{1:^80 {(k^BE:c)(s=9)} 
-  [-CC(^83^416)(^84^417)(^85=)(^86=)(^87^418)(^88=)(^89^419)(^8A^419)
-    (^8B=)(^8C=)(^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)
-    (^96=)(^97=)(^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)
-    (^A1=)(^A2=)(^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)
-    (^AC=)(^AD=)(^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)
-    (^B7=)(^B8=)(^B9=)(^BA=0)(^BB=cc)]}
-[1:^82(^BD=cc)]
-@$$}C1}@
-
-@$${C2{@
-@$$}C2}@
-
-@$${C4{@
-
-<(41E=cd)(41B=example)(41C=bob)(41D=example bob)>
-{1:^80 {(k^BE:c)(s=9)} 
-  [-CD(^83^41B)(^84=bob)(^85=)(^86=)(^87^41D)(^88=)(^89=)(^8A=)(^8B=)
-    (^8C=)(^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)(^96=)
-    (^97=)(^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)(^A1=)
-    (^A2=)(^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)(^AC=)
-    (^AD=)(^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)(^B7=)
-    (^B8=)(^B9=)(^BA=0)(^BB=cd)]}
-[1:^82(^BD=cd)]
-@$$}C4}@

Deleted: trunk/dna-repository/src/test/resources/docs/vcard-antoni-kontact.vcf
===================================================================
--- trunk/dna-repository/src/test/resources/docs/vcard-antoni-kontact.vcf	2009-06-04 21:46:34 UTC (rev 976)
+++ trunk/dna-repository/src/test/resources/docs/vcard-antoni-kontact.vcf	2009-06-04 22:31:30 UTC (rev 977)
@@ -1,386 +0,0 @@
-BEGIN:VCARD
-ADR;TYPE=home:;;Piaskowa 82;Police;zachodniopomorskie;74-023;Polska
-ADR;TYPE=work:;;Trippstadter Strasse 122;Kaiserslautern;Rheinland-Pfalz;676
- 63;Niemcy
-ADR;TYPE=intl;TYPE=postal;TYPE=work:;;Trippstadter Str. 122;Kaiserslautern;
- Rheinland-Pfalz;67663;Niemcy
-BDAY:1985-01-28T00:00:00Z
-CLASS:PUBLIC
-EMAIL;TYPE=PREF:antoni.mylka.kde at somedomain.com
-EMAIL:antoni.mylka.otherkde at otherdomain.com
-FN:Antoni Mylka
-GEO:45.000000;-87.300003
-N:Mylka;Antoni;KDE User;Pan;Junior
-NOTE:These are some notes about Antoni
-ORG:Aperture Project
-PHOTO;ENCODING=b;TYPE=image/jpeg:/9j/4AAQSkZJRgABAQIAAAAAAAD/2wBDAAEBAQEBAQ
- EBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBA
- QH/2wBDAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEB
- AQEBAQEBAQEBAQEBAQH/wAARCACMAHQDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAE
- CAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0
- KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc
- 3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW
- 19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQo
- L/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYn
- LRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6g
- oOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk
- 5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD+wmKznneaOO9mt5LdtksqeZuuW3MPMkxLG+7
- fHu+bzG3SHB8zasjYreWaGS5juZII4t2+2Td5c3lpvbftkUfvI2aM7o2+Uc7k8zy2La2UxaO5uf
- KjgOy2fzoY/OjOV37nDJJwsbZjYL83PyNvjRYLWZTPPN5V1FnyYfMjTzCn7yP93IvmPvkLplGG7
- GBhwqy+q1e+mt6f29dl/XbXU9uz1bWt4fbb6LRfiSfZ5fs/2wXMnkd7L5vK++Ij0kKffCS8xD5s
- bsHy2djROkKXLTO8MrFEtDu8qIqXG9csVySkh4iUZkfDFt4pPItdn2rzv9O/59vMj9fL/wBSVE3
- +pIk4Y/3xuQsIvm79of8AaW+Hn7Ovh+61nxLdPca8dJXUYtHjmtFxBc6nFo2nPJFJNHeO19qH7i
- 0itYrlp5ongnNkLmylnyr4mjhaU69aSp04VLuTk3bSOiS1bd9EtXsb0MPUxFWNGjTc6k6lko1Hf
- RK92tIre8n0Z7/rmqaZ4Z08atr2rW9pp8nkgS38vkw2zzvHFb20RkZ/MkmeaGCGKJFkkZUVI2Ux
- k/P/AI0/ar+DngK1k1LxF40t7XSY57+CXxLrmqaL4a0XT/7O0tNavL9b/wATa5pklzp9vYy/arv
- UNMhu7ex8ic6i9oLS8a2/ng/ak/4KgWenSeGm1rxhqN3rnjeTRNQ0L4T6ha/2TMllqp1C40/VvF
- RtZrLTNKsrNYlii8PJfTapqfiG2sbO6m0nz55NT+b/AIaftv8AgLQtR1r4l/FrUtC+JmtPY63fe
- BvCEkj6p4Q8EfDrwrp1l4T0+61PR20keHrTxBrOqeIdV1oy32n+JLvRtE8S3vh+3nt38Pae934l
- LNq2KftaNH2eGj/DlNtzqSlyvRPRxknpu1rdu2n0H9i0aKUa9R1cSrOdOnU92in8Kcm7yctI3sk
- n0kj+tXRvi4viHT3m0u1uI5JZIRaa1qb3GnaYbWaCS7S8jk1xNBv73T7iwjhnhuNJhvYHi1WxmE
- j28zyDw+f9rSPw74p0Dw144n0Tw43i2e+tfBHiiOPVZ/Cfjy6uoLG68PWPh/xnPdWumWWvX6SXF
- tZ+GfEMuka74mgN1e+GrG+tdE1Kv5q/Gf8AwVB13xR4l8Y+GNP8f3Wk6ZqGm6z4S0ljcWMcukT6
- ro3hrw5bahpuoG2s7Owhg8RaXbX1zHE9g7QakJLO6iW0QT+laz+3/ofiPxDoNtcaRY+K/hjrE3g
- abWfDHj1tKuNP0TVdJ0jXtUsPEPhp7y18ZWel+II9R1bwxp9xq8Qh1C3uWlht721ufDUeq3DrY6
- tFL2N3KKcZXsldpNRT6pt3c9LtSWoUsmg5XnGEYtqNlVk5abpPXV6XlbRq+lz+mnwL+0L4J+I9v
- rB8Iag1xqPhLXL3w54z0552sPEGgavpt1cWt5b3ulXaWt7GtxDbS6vptzqB0+y1nSBFqmnXVzZS
- x3J9f8P+I9F8VQXVzomrIyWQia6gQPG8qzxieFJUcwnbLF5ckJZJEmguYZ4t8VxbtP8AzDeAP2j
- 9Y0D4w3Wv6Mb7xb8K/HOi3sg1CDWtOg1nUYpbBZPCN3dWmrahbab4q1PS9ROk6Faan4lSHxFpnh
- e509NFuLa30drXxN+ifwS/am8I/ED4e+HPEOo+JItNbW4Dq/h7W9U0u8trHVEluYdQspJ9Cla0l
- 1ePSdYJ8OyWmlaheX+h2mjatqGs6oRpWo6lDwUOImpwjiYxUZuKbUrRnZK6i9OVpqzcle6NsXw4
- 6dLnoqdSLcWm5NW25k1dxaS+0m+ZW1T2/YiK2lmikuY7mSCOLdvtk3eXN5ab23bZFH7xGaNt0bf
- KDncgfyz7PL9n+2C5k8jvZfN5X3xEekhT74SXmIfNjdg+Wz/OXw1+MVl4mtZovEouNO8U2c1zDe
- aBfSQ2d7p2oWt7fW0mmW01zpulWniCxub2xvX8NalbGzutY0E6fqctmIJxqV379Zz6XfwG/tL1J
- rtSFe2VwrI5CDa9tIkdyjfZ3SbDDJVlkAKFvL+jw2Mw+JV6copupF8kppSV2r6fPp31PmsRhauH
- klUptXmmvfls2uvZ/jv2L8lvNDDHcPdSTwy7Nls+7y4fMVpF2ZkdP3YDxrhE4ZsYIkRWyxSQJFJ
- LM9wlwvmRRPu22w2odke5nGNjxr8qx8Rr8uzyyWtb2sSC4t5vNupcedD5kb+XvBeQeWirKmyVQv
- zFtu7a3Ox5EaKGELJbyGWWcb7pN6SeTJw23ZHho+XddshY/JjcGEiJ3RXw2jpzS+27bLVff5vcx
- itvdVrv/l67dH5W6677okuIZbVxHPM96zLvEsu7coLMDGN7SnAdXb7w5c7lV9woqN44bU+XZObm
- JhvZw8cuJCSrLuiKqMBVbaRkbshmUq7FZq9l7r2X22KN7L3Xsvtvt6jl/szLC8/1Gf8AQj/pH+q
- 5HWIB/uGI/vU3cbsEho3RfsO0/av+P7n7N/rsdMw/6vMP+uDD94B1w+VYNFG0mnJta6gllhcZtE
- QkGKLglZAJ0JOwxjmSQ/Kw3AsJAF7NWCXMUkl42Ps8qE+WmciLcokjB2y5ZsxvkFTyFMbpvWS9z
- en0dvhju7W7W17+RHV39le8Nr+X4dirquqaHoek6hrWp3MVm2kWN5qmo3c7tFb2ljp8El3dXM0s
- zrZpFDYRSSSPIyIqIWdkZWL/AMH3/BRT9uoeJvifba7rE0PiRreXWvHureDb3Wr7V5YNP17VLjU
- PDfgm8gGrPp8WjeGtKh0mz1XR/s9r9u0OLULfRry2l1rWLnTv6Uf+Cxn7Rtt8Hv2frD4a6Vqcmk
- eMPjdJ4j8NSX8N1e280XhiHRTp2szW7WHmyJNDJ4i0u+RZbdku4NJ1G0hjluJkltf89T456/J4v
- +KPiu0tLWxsjqXi/WLcw6bbbbOw0rTNYv5rLSLARkotlDPqlxGiwokMqsohgWOCVrn5zMakMZjv
- qs5RWHwsZ16sVoqlSShGKv0lCPM9O/ex9nkWFr0MHPE0acZYjG1VRw7itacU7Sdmr8058q2tZN6
- 3scl4v+MfjD4ha14h+JPia6u7rxP4mtXtbq4vtQu742tgyywWFjJJeSPmMwwX99cqALIakkQhjQ
- pJJUev+PtSutGtJ7GS7gGq6Ja6bc3Hm3SxG31ldEvbq1nDSOGjWbS7SJbVC5FtFyNscKp1OufCi
- 9trjwrpCxuTqw8/UIZrdWlVN5ikaFS5O22tpWaJsqiXEqB4jbo8S9H45+GP9meC2vrfT5Es9Jgt
- VmjKht8c+r21wWC+dNIjJGkqbt+HE8YcRNsY+dVzjCUlRow5ORySjBJXUIyjGNn0s/i1s7S11sf
- a4TgvMZrG1K6vKNKMnJqTfPKMZycErqyXM53SS6W6eef8LPstJ8Xa5q6X+o3MviXRtOs31HUrqc
- K1/Jp1hDeyJPb7pnPkafclbRriOWa7UzS3N0l1NBF9Cx/Ezxdo1npurtcXc2nWXhe0We306e/t9
- MnU2+p3TGVZ/mmhS7YOpa3R444bWeMeZaGe4+PbvwcdZ1f4aWa2EqWuoT2NneWqRAT3NnbR6Omp
- 3IXeS6tL/ojsoU7rwXAdw2Jf2b+GPwg0vW/BNnb6xaXMGn3Xhe0SWGO2t7i4guU0/wCzT2HlSTF
- nMlxdPGkb36HT3hjmufNVZo35Mw4gwuHpYdr2blKdnHl6RcYLVaNKV21v5u7OrJOD8XWrYyVRKF
- On7NwlySspzjGUrJq7pxTV+76JH0d/wTv/ALQ+MP7O/jfWLmZb+/8AB+q6ppWjnzH1eez1Sz0S2
- utPtUhmtL2ZNSGlzM1irbhZ3k2l6jaywatp1pdW/wBNaF44v/2f4LW71Vo9K0zxDrT+L9GvzBNH
- pd7rfiLR9dluE8Uaj9j1O6Glyx6kbDW9W0m68LXek6PYahrz3OsxXeseH/EHxz/wT9+IVj+yh8X
- td+D3xQtVsfhz8ddY0/VfAvi65FxFZ2virQF1LSHtJ9UTZp0F9eJLp2my21zPa3EsqWpjuXuYjB
- P+5XxR+Gdh8Qvhzd+H4p5rp9TJ1XQNd0jUfs93YXsl616k1nqVm8TRxwXE1ncabcxNO0AhgdQTD
- CG+OzDFfWK86lCSnRk/bKnFraShdxV9k20rX1TTSsfR4bK4YWh9VxdFRrQkoKtNPk5nLlUpPazX
- LKmm9L3vZHjvxg/bK/4Vb4I8K/HDRrHU9S1/SbJdVu9GtNZvPBniPxx4H1VvCxuIby4kku1b4uf
- DW+ngs47TUtM8R6fep4Z8SabeeG7C2CeF/D36W+FPjp4u0q90b4m+DNYv/H3hj4kxaJ4w8Ox3Y1
- 26KaBqdhosut+G4Lia7j02OS60uGx8bfDmwtvtMuoya74wgOmSaPdyeL9F/nF8P/C74h6z4O+KH
- wi8Q6Lr2q3nhqKW98Nb9T1eWzt2nvNR0+TWfD9jFe21hpWqme+m1uFDHJZ6L4lXTrW8uru0vtRh
- vJf2JvjVr/hDwD8VPhN8SbVoPFfh3xZq3iP4fW+v619jl1WxmtPEK6v4W8J21jqMN3pA0fWvBcK
- WVjFbX2uaRc6pLoNjbXE+geJPFtxtk2PxDwrqUqyvhq/spyveThJwcKii73lTas30ble6Xu/LZ5
- ktKnWp0asKcozi5vS+7i3T0t79pLllaySaTaP7fPh/458L/EbwppXivwreWd6up24nllsLw39rI
- hZw81tdqWtLm0mZEnt7i2YxSxSBomaMER9o32bC/Y/9fj/Tf9Z/reD/AMtQE++ZR+6wvGMEBXf+
- fL9iL9rrSfCnxYsvh+2uR6x4H8Yz3+paTr934hvZp9Mh1Kwn8d6nDeWN3EUW0sP7a1KKK2iinOl
- WXh/R9NfVLXUJLrw7Zf0GBrdiy2qPFOh23jSA7ZJcsN0YMkuF3LIfuRctnbgqkX6rkmZrHUuWp7
- JV6EuWolZcylFOE0ltzrV6WTuflebZZPLsTFWpOjW5qlGTT2uk4u11eOzS1s72VxX+zZ/4lv8Aq
- MfP/rP9aMhv9eA/KeWePlOcgKSyKU1WgkBawRoIQSGSXJYydSwJkn+UoUAG4YwQQSC7lerHZfw9
- l+R5Mdl/D2X5CNeQW+2SSyhuEuBvjjk2Ytl4by490LpjDqvyxxj92vy7MoVNxFC6Wr20c8sxAS5
- coJIfM3Rrt3xuf3bjzBiRBlmIIYK62YryeB5pI7Ka4kuG3yxJ5m62bcx8uTEUj7t8m35vLbdGcD
- zNrRsS4lige2jt5Zo5SS91GWCQ7wFYPtjdcLGjM+6RSUYgFFLl3Ld3k7qVP7OqXLG/9dPmGuvvt
- u8P+XdnfS729Va/mfyN/wDBwD48vtZ/aD+G3wqt7aBodJ8B6Zqc9yu6SV3urjxBd2qXEaM80L3V
- 1qUNmssAjM0MNqhM3lyx23878H7N2tan8Q9Buho7x22oanbaub9ed0GqvDNcmQNEZBteSJ5CZiE
- tnhO6WM4i/o//AOC3uk2V5+2n4C0+SxcHUP2YNA1kX0UckUTSaV8W/FtpeXs7xIiXktnp8kcccV
- w8oRoYlWTzGtrZ/mS/8NaL4V0/SLK9gSO30nTbe4h1WUKyMY7Z0dIWVVjRQVZuZpGBhk80KdyL+
- acS4jEYLG4mnScpOspXkqbTfOo6W2fKnddVbdH9GeH+BwGLy7CVqzVT2PsXFNRglJS5px95KSTl
- FN1E97q7PmLXfgx4f1HUNG1COyaK78OaW+mRIZUCXUk94biS8mAjhma4cFvKzdvDGu9VVJR+68e
- +JfgC68VeG9Y8P6To6oY4JBbWyy7JLx3fCCSVLdQFSTzn8xllUKWKOVSVR6/8V/2j/APhnTI4L3
- WINOhtrZ7eK7uozLJdCOKNWltoljiidiluWjjXzI3z9/am4+ffDr9onwn4x1e1uyZtojnuIfMik
- lmnNq0AChuEUG4UQL5ZmSRg7xkTY8z4mWGx1OnLEVnNQXJKDdKV07xvZpLVJ66pysn0aP2SjicB
- WlVw1Ovh3XktaUZ03KovdSTXvez5Fa1lerpe9zyXwl+zilrPZ6xq9lIlzpM9jb2umSSCG3sWhZr
- mScqtojK9wZ4JbtZ1ldUit1UKLRQv6q/Bzw14fs7YNdJG1lDDbQ/YEu45AFkzbwtho2ilMkuZds
- cDjcQjN5Lps+RPGXxfh0b4galqcttLa2cmgaDqkVq8bFJ0uNHWxvXgZ0SRQ0tvd3JAhlk3GSQO0
- ZdI/lHx3/wU50n4a6tfT2vh651N7m3ihihjhazuBcoLi3Z95ubSQxILaKYT+X9pVJreOIxYd1qO
- XYjH1+SnNzUJqULwb9yUYtNXatG72fW+jODOMVgMtwEcTiK1PDxlFKcorlfOnFOb5UuZwtZ02tl
- e29v6BG+Gnwz1/SLu28QaJY6xp+o3lrdNpNyuTaiR7W6t5GAaeNHhWzhjiMUCtIu0+WIgFl+qPh
- xp8HhmDTtGsbB7vTEtEs7QTvi9s0haKO2IlnkIkk2smFR4JGaFhlJnkMf8oXw2/wCC2XjmO8uLe
- 48MWVpaT3QX7TqOnS6mkEEk7ebIlwJ7idDChjK24trsBoVWCBGkAX9qf2LP+Cmvw1+JR0fwh4nk
- tX1XWo547rXINOvdMSNrWzjlgvPtckxtCt357SXD32n6dYPdOY4buCNrSE+nSySeCqQnXkk0rRc
- YaRWja5k2kpPdPRX6bn5vXzbDZpRq/UK6xVPmc4wjJuS5HFTkqbScpNL+847pan6M+OfD3hrwrr
- a+MrSxSDWNQtGs7i/R9hMUyw+Sktvcwv5kNk8M120ZZY4J3aaKOIxW8kf4JftWX3gv4U/FHwf8R
- ra1txY3vjHT9S1PWrA6bJq2naxpWoWN/peqx2Opidojq2l6M1trOrSRS6PcReCvB0htLvW7a5Fp
- +/nxZbUD4d1jTdAV/ENhcrI0EoaSCIRTRLbIYLydFKQqh84PDcrBcwmKQyeTM5m/l2/bA8Xaho3
- iTX/hf4otDqXhq8sZ9T0G7kiCPYeK7G5vZ9HvTfRSWtwmnFI76xuEN1cPaRaheNaRFp5raSMNU5
- M1lhqNOMIVabdVKDam/dUmprmUnbVN9bp7XXn4rDPEZNUx8qz9tQsoRmryjFqNqbTV273TnbTTX
- Y+wPAnxEtiZNX0m7srfUPBOvxa1qGhaIV1pfFGiwznw/wDF/RV+wafcGDxI2pHUNaS9g1NYLTR9
- T1j7XZs15FMv9pH7Ofje++I3wQ+GvirU30qTWNQ8L2B1e/0Sa5n0/Ub+332U91C97HHfgSvaNM0
- d80l1HJM6TsZhJJJ/mffC744+KrPx9oVvNrfiuKPTdTsdPsr63vJdLu/EfhjxjqUGh3VvGdDn0y
- 5vtZm17UftR1XUNSN47XUl/cS6kVvZJP8AQQ/4JaeJ9a8SfsoaVp+vSxC58IeN/FnhmCDzbu5uN
- OtrY6bdRaZf3t1JJFeXEcd2mpWc9pPcKuhapotvqU8mvQawa+8yKnUw+aKF7KphvebhaUlTcOTZ
- a2Um72V7n5dn8oYnBRqqUoujXileF0lOFnFR7XitU7Ss3a9z9GllS7BkhhWzRSUMUW3azD5jIdi
- QjcwcKflP3RghdqIVJNM14yyyxNaEIEWOQsS6gs3mAuIyVZmZQQpB2klmcsxK+zjey957L7D7eh
- 8PGWi9/ovs+QqXN3HJcfZVtZJgUa/SSWJRbyPv2hV+0RqI2YzBW3OpRBz5bMGrw6iNqQWk1lNb3
- JlBLXMJmcpEJLgW8ZnQymK2VZWEcUhAIc7isYX+Vy7/AOCi/jLxn8Q/2l76G0urHw946+Ht14T0
- TR5NW+1eI7TWo00/7Be6YsT28F4huF1iW2NhbRljNbwyFBbyTze0/wDBOr4pDS2j8V+OviPDY+D
- tL0nxJrHiPwzq+ux2+qafLca5b2GkW32C+lDabq11bKbq3sYrqO5udNedLGZGNxFXzNPP51cRGC
- wzWHcn7SvKrFckIOKjOKlBcylHVtO8dt1pzRxPPy2VTlqcrTtro0krOOjS1b3Sto76fGn/AAcRn
- xvL+1T8LNO8GaZqGqatrP7MVhpeh2mkWuqavrV7t+LHji91a203R9PgumkkuNtr9qkt4Jbt1sbJ
- HtxbFrgfPX7QWn6j4g+H/hCPWPDlxrx8RaBo1loXhm8vPFHhpbBrhbeDVNc1lNFuLbULrUXv7fU
- YNPtL+FLHSRpitfaTqKXsiTfo9/wcTad4og+HH7L/AO038MtRD6Z4Q1f4m/C3W9Z8PF/7T/sP44
- eC7KLSrldY0y7t7ywgs/8AhHfEAs555Ujt9Q1SOWGeCSNkn+LfhFe+KvH37Nfwl8ReIiNR8ca3+
- z38NYvDekXa/b9fm1b+w9SvJfFdyVa51PVbXUbe+h1C8v4VyLmK8uLwRW19pyG8z+pyrvETfPNQ
- vR5+VxlpH7Wu3LKyu7taJX1/V+F8TjcbRwmX4Z1qeFbUcTUhNxnGMJys24W5aUpSV3fR2bff8Nf
- i78H9T8IW9zq/xB1r4d2yafbwBoW+GPgrxXrt5E7Mbe5vdY8TadqF8biYCEJdmTS7ZIYIoQI5UY
- VzXwb8L+G/iIv/AAhHgeVPC/xHutR1nVLPXCp0TQvEWkWWn219d6Je+GLHULvw/o8sen2d1d6Vr
- HhOzsVmm+z6be6PcT3sut2n2p+0B+x7r3iXwtb/ANvwaxrurLrlrrdhqlt4Ovbnxdp62Vnc2i6R
- pWrSzXj6foMgmj1DUopdNiv9Q1iSXUJb9prmeST59+D/AOz1qPw78VXguLK30/xFdWms+GrC31V
- 7261zS7jXrK4s7nVLqyXUNPuNNGmDU5tYN7KIVuNWKWNrMnm6he2PhYnEUHQkqtadaLUXUoypRh
- GN1G8YycXeSfwtPXRW2P0ChlGKo5nF4HC+ybVNUcVHFSr4idZuKUqkFdRj2V7NJXvZnul14DPiv
- wr4Y1y91m+0670axXRtI8XyeG9a03wprWnzQr5ep2eq63BpTmzUoZ2uWtJppIYLifynDE33z38f
- odO+A+v3Vl4V0N7DxDpUGpaH4j17TtUudIl8Ta0UMPiK41LWraWO6Gn6w+lNfaf4WtJZ9I0u0id
- rDTp9Ru9f1PUP6Qx8K5PiP+y/rngya7fTta8W+C9X0nQtSitLI3WgXWo6fqWmWmqWplSewjNlPP
- LfP5yO8caP5cU6RRBPzw+LP7MurfE2aPWLrU7nw34o1Sa6vPFdlqsGonSb7Vbq3hnvtXhOk2urX
- Xmahdz6pM9ldw3k1hZ20Pl6tq99dSLH4WHp0uSnKbnh51lCcI3mr0UotQlJacyvHZrmWrTSPbzZ
- Y6piJUqjrYujh5S9pzxpySrp04qcYcicqkkpe61KLS0u22fin8G/2ivHum+NrCdfhv4x8RtNcQS
- SrovheXUYLeMyRPDJubXYLq5aK5kVlU3OmyQTJdIx327yxfsL8NPixoPxjuoNI8WfDTxh4d1ODR
- 7yHQdW8U6BpvhTXJ00211C9W8sNWMWo+II47651PX9Qk08z+JNL11ibrUNVtNdulNm74S/si2Hh
- 7WvNs/jn4W0++guGkn0yLTfiLdyXihSJvssh+GzWKLI0sVupkuPLMKK5ka1kKL+pHwh+Eugw2Fp
- ZWdzDqVs0CjVrvUN0tlfWXm/M0EWoL5yx3ESMsksdra3MavJF9ngkaBx3znLlpxp0Woxb5uWsqi
- rRfJdKDve6vzNu61ellfx/qFXDudWWJqzlq6S+rQoPCuaXK6dSMXzuLd6sdVbRX6L8LP2h9I8H/
- DfRLD/AIVp8aPiP4dt7S3tNf8AE/hPwj4V8XQ6fcTW1v8AZp9M8NeHviNqvxP1nTUilktb67tvh
- 7CdPvrS6untbvSZ11u4/n//AOCofjTw2fizMvhe7stb0eO2Yao0cS2uoaHe2V3rGoy6XrdhdQxa
- no2pi4N1by6dqVhZXqhEiEBDzrF/XH4E+Euj6PAZLG2tZdAvFb7Ta/ZoJYhuUfaVthMks7QtA8T
- fuWRkUOtui+WZT/Or/wAF4/2bfCOh+JPgB8VtK8PaJaeGPEcniX4f6zq8ejaXFb2urfutV8P3F5
- draxXEAWbUvEN3NM8hlWz0q5vLfz4rOWNcsujh1jcN9Yw8aMqfPCDo1ZNtOK1aqKfNBtXk1JWdr
- I+YzfF1YYXM6GExOIrTnCm3GrTj7O8ZQc3CcVTUY6XleEm7WTVz+eCLxVceII9MgNrdfbdShtNK
- gnluBYRWuovafbtCbMSs9iLq/tLobLiyMEd3eabKZL6FVt7L/RE/4IlfGHQfE/7DXizxbJey3Nn
- 4X+LHi9LvAso52sIvCPgPWtKMNvakL5sXg3V/CttcxSItw2uRajC8sxkhK/wo/svfsL6l8U/iLc
- WfiLUvEvh/wj4V1nStdttP0jTJbrXrt5WuhpWk6LqF9cRwx3t1qGnXRS0lsvtMEUaJDeRyXRWD+
- mP9jn4qfCz4Lfsk+J/CPwNs/EHwZ+H3xI8V+PvCGqeF/EXjNvE+ux69Lonhk63feGtfuZbLU9Ku
- Nc0280uae3vnvpdL1Oe/fTHWxa2S1efcX5VwxOWPqvEVpYanUjyUKUqk5e1jFRgk7KTg4wbS2S6
- Xs/Dq8I8S4jhjFZ5Ww0aOBVTDr2tStSjyylLkpzqxbThTqy5owslKUmm1vb99tf8A+Cov7JmgeI
- df8PeLvHlppmsaBqtzpTppt5pWp2N1BAI3jure7t9WkTlpZLeeBiGtbq3ntvnSJJZCv5rtX+H+g
- X10J5TY3e6JdlzqXhl/EF3KHeSWTzNW09Vgu/KuJJoAzATL5RSUArgFfk78dqkm5QxValFtuNOW
- Dk5QTaajJqnq4qybu9m76Jn5nLBY+MnF8zadr3jZ2a13Wj32Wl9Nz4I0/RPH2j6vD4Q8JXd5omo
- 2gubOz8XajefbtC0zWomu9TvLWbxXaQyaJd2KiC5kSWSYkXjsqOrPNHD9F+EP+Fz634Iu/Ani7x
- Z4d8DeGZbuKeHxRpet2eoW/jXWdPuBqHnwRW9vMLZJLeWWQyyypZ7DGIkggdS/y54a+Knw613xX
- d6b4rudb8KaU2kXdsH0m4tx4TMc6SW1p4g1fR7e82xPf5hSVtLW5uhI5cx2/wBpaaXxb4n/ABR1
- zS9UsLb4ZeI5/GU2n/abK208RXdjZaLp9y0QtbrRZLuXT5LmW5WOVPPkhu1g2ckMcw/XYmtnGPx
- TwVCbwtScPbKpXg1Gm5Si+VST9naKvGUZWum7JNmFHDUKVBVqseeKcoxpxrJN25Vdr4k7tfC3zW
- u9rH62+N/EHxH8Mfs1/H/w/ffEKf4hWXxG8L+HPC2l6QdFsT4b0DRmTxDpWozwxx380N/4i0y61
- TTZrHVoyi2OmR63rRsbZ9Oa90v0DSvDcsX7P37M9zPbBYbL9mj4J6A1kwIntbmz+H2iW0/mW8jA
- xTs1vMPlDSI/LFmdjX4/fs/fEP4xR6nrFj468M6l4j8OJBbXmu2Umr2L3n9nPcLDeW2mfbfEJsp
- hqWnyXcF3bW1osssTbJpobBpDcfrN8LtUutW+GFjpd1fNf6h8Ptf8c/DBos7nj0Twj4t1WLwNLK
- SGe4L/AA8uPCLPdSWkck07yShEaUIdKX9oQw1bA5hjKGJqUZxqUZ4apGLlFu/wp+5bmUXFKzVr6
- 6n9A+EU8vxEYqOHdHE4epJYjmTkpUK0YunOV7ubU4TjyOOiSPnHxr4btLa4f+0J2mjltnit7dXl
- aSCKTbIqmMlEjdfMSNUhjLbkZYpNihTiaJ4fsLHTJIY5kk1K4uFihlilkkuoXjjhJVVlMMiIiSR
- usi72aJC/71vLYeg/FGOLSle7jBnae3e9uYoiqzwCN3BhmWMyeXIzXG5Y38hXaCQsQGZm+G7n4w
- 33w11HxF4ksbIeLjdW1pp2h6fc6jFYQDN80GuXUjqJkivo9NuT/Z1zeQyoDAVmkiQzSJwvFShVj
- RnOfLzQajKq3ZpxfvWd7NKzWvbSx/SmX5RhU4YmlRTavO8VaVvd91P/AJeOdvdsl7N2vqj+hD9l
- /wAdaD8RPh3D8OJtcjj8VeHtFeR4pWvEjt7IP5LQvfyJDmWVUWW7ZWkit2uDGz4ZVHA/FzxzbfD
- nTv8AhG/GMcdnezPc2+ma7K94kcqW0G6G4ivLYPI03kuFMcYdAkxhnlMO0n8NfCvxq1vwToniyL
- wL4tm0XxZ430i1tNJu9dE1zHp0N/8APLDJaWOqR6Xc6laxC3iWN7+80pr1o5J5dQtBGk/u3wj1f
- 9qH41+D7rwF8XT4d8e6do8tvPpfjnU/7P0uFwEEN2Y4tPv766jvJgs0csVpb6dpzyskC2lpPbSR
- v62NzP67To0KFCpTrYfkoRablzK0W3JKPLy2SXPzKWuifTw8Tk2Chm2IqOryYavF4iUazgnCq2n
- 7GnJSVRympcyqODgkrc10fb3w/wDFWh+LNaMNleWcd/p8iy3NzHNJE08cYlifzJY4BL57zp5qCU
- x3FzBaK+Nw8t/uDwfo0ZtY7zQ7uS3QRxi9No0Nut3DFDmNQIVa1mbi4jlj2xhlIRUiEi4/F7wv4
- evvAXj200e3vbqDTrmeKWxvNTuFEdwLa3mEjXEu6Hz4IA0dzBB5lxIEdo1Z0hXyP1Q+H3iS7FpZ
- HVrwwra29tcWcB8s+c9xmR0sFklSTPmYiXfvdIZoR5aiFRN59LOqeCjKnXhaSlKM5Sly++uXl0d
- mlG99bc1pLVHmZ9g42jPCTUoyVNKNr8yTSeqvyOOvM3b2lrLRH2X4c8U6hZWrMl5DFbJAomtWeS
- BBc28cTMjRfOjvPaNsi83y2CxyRSnLpI356/8ABVD4JeIv2gP2V7jSbPS9T1abQvHmi+LdK0HTr
- g22o3ksem6toLW1r5yzWUUzx65PLC0+2KCVDLOkYgEbfTJu1v8AUdMufPW2ChiLWRYwG+zRCaI7
- N6uv2iScW8Jt4rhztRiGC+Sn01N4dtta8NR6tO1rd6jaJPMbEJbGV20zSZni8zcgm82G4ZLlJfK
- EcMW4i4MQjkPBl+Z4jH4/mU5JUfepu9ku0nbotLx69Nkj80zHC4XBz5qlKDWKrxjOWivGT5ZNJt
- NK7tyqzbs11P5jf2aPiRdfA79ozw38O/jN4Qji1bSPCvhnUW1K91q8haS58Q6W/iaCe4sCJ9Nee
- 28Na5ocMSxu1xbudQt3w14tnplz4xeD/E/wD1eLwZcara3Okv4o+I/ibw9od5d6dBP9pufir4r8
- PaFrFzeyyqtjJqXg/wAKeD7+LT4YYJYY7gy3hhgXbF9o/Fn9h7xB8Sf2mPDXxp8U6v8ADnwz4PO
- pWpfQ/C+q3x8Z6l4esdAuDFc+Tbade6Zb6ZD4e8ONpd3cajq1teaeLG4ZNJWaG0sJ/wA3fix4G8
- YftB/EPXfiX8YviLpXhyDVdevdQ0Dwb4OWeWDRfDlref6BDrN6kdy4vDa3LQXMltek3d0pu7ks1
- xM0kcWVsLhaNOlj8ZRhSrTUoNU5VaknUjFyjQjGLqTfNy812lG+6YeJWbYXC8FYPIcrqc1bM5YW
- ePjCsuSlTy+SlDmnzcsZVKlRWgldODbva5leIf2iPihDqs8UuoWes+WlukV7YLeana+QsEawwR3
- ltfxQS/Z0AjZo0AdgZCXLl2K5OCT9mLwgbjRZtc8V3k1vd3XmSpYWJhBSd7ZVt/3U5FuyW6Swqx
- jYJIAYk4yV8DGjkvLFRyDE1VZWq/2b/EVo2nfn+1dP/t569v5klLEKUk8Yk1KzXt4uzTinr1s3+
- H3fKsvibQtP8B6fqNvDres6Zb6pC2l64dK0rQ9GvJLTzbprW20fUUuL3UrdFWPMl8m0XJdouLYB
- MCH9o+803R0svE3hddOgvdUkvE0/TNR0vTLi9VkumsDqPkWQnmtnedT5cdykVqCY4IYlO1/H9S8
- cal40A0TxJrOj6VCdatbi0u0e/tPC+l6dHCYja2WozvItmZYGLpGbWRZZJiUDTBkmwNOufA3w+1
- qW+8U6Np3jCz1dZYNLnu9TGoJZmzu4YzeWEwtlguvtEzPOEaO2xaSAbEJLR/0Rh8spQpznjKccR
- W5p1IqnNzfIuV8kal4rRaqy1bdk0ZVa6c4Kl7OnTceTRO17p3kmpO+qUZO7t9o9wsPiF8QtaS81
- ews9L0/SNYmn0izhuNVgtrXQXUI0UXmw6bFcTXQtyoS6aOVQLd5WkPnFT+5f7C3xo8OfFD9nVnt
- rZbDxZ4A8WSeA/GtlvaW9vn03wx4Rh0jxXNapawH7HqFhaW2gwPJNdTzTeHtRu52iFwhl/nU8Q+
- NW1i9063iv7i18NteXWoWGn2WoJFAmoR3UbQrLbWbG30gjTri2hMW68kC27MHEqMD+pX/BMf48e
- Hb9Pil8IbnTZdL8X6hqdl8R4L+dRJc6pp1tHYeG9egk164nhutUisWh8N3ui6VHpssVvbXvie9F
- /C13JbngxmEp+yc44aFOSp81NRjyNRlKMb1W2+eShe90rOzWruffeGeazwXFGFprESp0capUK0d
- WqlRRU6cVFpLmVRLlbXWS0uz9BvjtpEdt4Zv7uzvWE8lst3eSQKkr28EZmnkt44gHaBZoHmtXjV
- zPtU+UIpfmP5LeNPE+mzy2/hPwnHHql0dSZLq6v7m0DWzy3tyhjaOKG4mjguWNzN5yu0EMk0ErO
- WUuf1z+L+lt4t+HWuaNYyT2mrQQGXVkBlF0zWc8N00cLTb43Z3WdY5oIJ7YJsZA5CPH+MmvXXxL
- 0/xtr1t8PvBGjXptrP7JJrOvS6j9pSZ7lo5pYIY7NVd4oFnC+RPHMttcCUKED28nw/sqFPG1Paz
- i68or2UZT9nBRUY3leXuv3m1ZO7b3Z/ZWGxuKqUKFOlKUITlCnVnCnOpUtOSUo04w5pJO16ratD
- vbU6bV/h/H5miJDqYuJ9O1HThO0UkRjsw8TI6yyRTR2wMnkW7yJcGeO4kd53LRKbUfX3hfzpND1
- ZPB/wAQ9I/tPQ4475tP0/VHs9Rtp7SK/nns2lliWxkkW7NhaCBmlt1IdLXbdTTGH8pb34IeMjqL
- 3Gt+J9TsDqEkrapc3MM1hGb6cLc3kayXl3NeXO95o8TCKQyFpZWw8ixN9a/B/wDYr+E/iNoZ7z4
- sfEXT5lhhnGp+E9VtGMU0kSeXJGz6fbC2ijuixSdHvlXBwXUV2RjRoOMp4+hT9naXve9eTs+VtN
- t7O3TW9ur9TNMph9WlNYWcFKcX7WeMoRmoxpxT5YRjWm6c07zvytNu0rvT6H0X44+LH1Cx0jxQb
- i+1DTRbPbajcpbTNusy7wSQtLGsclvf2FtcLOIkt5bcp9sDTXJhjuf158Aatb+PPA+ieKreNLCS
- 70OyvxaRtK63M6x+TcrEs0KyTSuLeFowkUMxM2yYPJsnX8hYv2GtI8MagPE2i/Ej4h61cxfZTLe
- eL9Y1LVpL6JZEjsFuXsmgaCFbaSSGFJLEoFDJIY3jd4/0v+FN9H4S8NaTpGrxXb3Fnpn2eyWNpV
- LXMkU1yXgKNCsn+km2crPlNrmIuHikVvkOI8aq9ehThCjOMm5PERjye091XjJK9rPa+slrotvhv
- q1SjSqqVec3ztxpNynaF1yNzlyuz3p2jrLstX9RD+zotB0zU9WuI4NS0p4jZpIVju3l+ziFI1jM
- ckjCWaWWzYWzMNzSWigoS8/1jpvxIt7T4O+K/GViJ7rxJoHhvUZ7DTYhZ+de3w0mWzgLW95slZT
- 58VzIGaGJUgeV3igSa3f81fHPiuXUdKW3vLc2j2j262u/7YiOiiO3tFWGCNLbAvFaIiV2AceW4S
- NAD9J/s/Xia3Y3Hh1Y57u/cWF1PG0t3M0MCiC8mt5YyWtkI0zTb4pHLD9nE7fMscziZenh51KWK
- oOnyxjJNOUZe83G1pKLTu735dErtqx8fnOHpyoRlXvJ0cTGryzvG9pRfLJRa952tydtbq2vhGqf
- 8FFPhJ+0h+yN+0Dov7Id/cxePZLC28Oebe6V4g0bRtC1PxFeadPr0klrqVhoOrrawadZ6jImp2c
- Wp6LoTtHJrrW+nXLqf5ldZ+Kt94N8M+KNM8XeLr3xR4u1G/t/tq6DYQadGLmMabNaWI0+y+zwRQ
- BVa4a6EKPczOrz2zXhllftPB/gLxf+zP8ADz9s7wvoWoPpvjHxH8X/AAx4C8F31tdto8etDw7qf
- iPUPFVpCNattOub6LR9EuNL1XULXwlBc39rcav4b099bg0zxLul+KdR0620DxTa3fxe8XeILrxB
- rElkIfDdyY23STSpbW11rF5dXmoJqsbLHMZoYHRI22+bcKEKP9rm2X4fMMdThiK1OtRo06M6OGp
- 0YSx1adPkrySkoN06b5mpP3U+S8n0P5w4ux7xGLjaMaGIXP7alSrTdGL9o4Ll56kp89RRvKLb5b
- u19DbPjD7cz3WmeH9Ikt5ndn+1X2pNcR3G4iZJjbJHEZNw3OQGYsxLu7Ekld5pfiCweyjfwpBJY
- aQZLmONH1FLVbma2uZrSW/ggACR2179nW4t9gCtE6vgMzUVzSzDD05SpxyxpQk4pOq01yuKs10e
- iuuj0v1Xxvs119jfrZu19Pw1/B9jxu68eaj4a06e11Dw34ZvPD5tbA3MtoRFcyQyyLPJ9quHuL1
- Ctsv7qa3QxSRtEjmRfLiU+Xat4rsbzUtIvLDT5bz7FeXFzbWFhalIY4Z4pni+yX08F2RJHMInkI
- tp4HBdkiBVSO+8Mr4LlsdV8NXHiXQrk36T3FjBPNKmowCRmSK3Y6laQlpLmOaRHWLBWFLfEgbza
- 8z1yxv/AIZarp2k2aCW8nSSWSeQ201va6deKxtEtklgPmMVkjnLI0iAnaWJAY/omFlQU3S5J+1j
- DmXOpU41YOK5nr8LaWln8T6NlVHOcIuTUYaKPLb3OZ/C2km7vVK7SXZmBca9ex3Usq2X2++1HUJ
- r4XX2ZTp1vfXRjupopYRbxlpFiCqBbvGkaKqNDhlA+nvgP+1NYfDj4geEPEEmh3raz4V1CZNSsm
- ukubPxHol7YTaXq+mrIi2hsL06Vd3cWkyCSS2trxoJGhk2N5/jOqwyaT4Shuvt9rcX2q3qyFpU+
- wsXntBeGCy8mNvKlnlXbAJiqvBGy+ZgKg888M+NJLfxN4e1uHwtFdRaHrdvfavbwLNLcalYWVwl
- xd2TlWYQRS2ktxDM8ZIKJufapCrWIhTxmHqVFTdqClGFqvIm4pK1paOMrcqTulffqb4DHVsBicP
- iqEoxrUakKkG1e0k4SjbZuSavdPybeqP7IPDfinwx8SPB1l4k8Bavp2v+HNVsp/L8Q6YYhZalNI
- Z1DswuWvLaa0vJLiy1GK9T7Vbz2txYXNvBdebbQfJV/o1vYyasI4rcyWGuXkN4REIomgL+ZbpbA
- TTiYCKILHb3E5mjgkaV57lzvk+W/wBmS48C/Cv/AISvVvhr4z8TH4ceKdPvPE914Q1a/wBMvdAM
- y6ekEc6RSWFtqGm65Jf6esEVxaTzytAtvFfJewW6xzfSGs/E7R/GVpLr+i3FjagXFq11bNcaemq
- QLqFkmppDq+nRrNPp88tqbpYUleWNrOeCVF+wpNcj8jr4jCZnicRh8LJrE0IQqqFajKnNQ9znir
- N80oO6kk2tU1umf17wD4g4PM6NKlXaw+LSUK1KUrxqziofvKDla0dFJx+J7d2fK3xu8N3es3qXt
- iu6BJXfZHBb71aIMELR+ZJGqL9ntFYM1scozqpT5a9s/Zd8PeLvD11ZajNJPcK32ZzaSWdlJHFb
- qYAA1u0y2jSwTGR1lZwzotvJL5xltUXwzxd8Tobi8tCqtbQ2rXMt/BBbQzW13bo1skc6Mglkjju
- PM86VsIzt9klZ4kiYNd8HfGv+yNbSeedprSOX7XNpYg+0W7ywT28UMMqywCSEyMGnnKoiCONGtp
- zcSER+VPCYpz5Ksm7y5lywbdtLWbTstGmuqs9T9Ix+dYGpTlKNanOcnF2kmop8sfe5bq8WlblWt
- 0+VH62XN42o2EpnngOk3QOnwW93b2G23lF7G1or288jJE7b5bMLGt5GqyyB4JiJI5fQfDUdnpel
- aPp+oxLJeyaaXsLiNI44VERHkkjUJFiRDb38O25t58/LA9zCkypHXwv4O/aB0+WXUJ5pYHillll
- kjnxZSIbqBZkaO2vY57ydo/8ARfsUcNtCqyq1tLJHELfy9S4+Pmh6DqVxZ+FbybVdfuC9pdX+rx
- k6fosciP5rQxRFnOpteFmbSNKTzYna1NxBA880y8dXA1FT56rT5buLlFrot+ibbTejdz4yrmEsR
- XtSd03GLcJXSV0nok27pNJX9xK+lrn178Q/H3hPwyjw388CavCJbKLz7qSWGETMbSNJpJh+5VZ5
- 4vLnERk82ZbO1JnuzFJ9hfsd6rdQWty+t2K6Zq+t2htrC5lliWaPw9NLDN/bF/NKIbyDUNUto7J
- YNHMJl05B5LefbNfuv40aHrivr3/CR+Mdmo39xeLe6Ra3DWkdxaSSI1m+satuBhNxbWkkrWqy3M
- MFis8kVrHLczRz3f6j/sRaV4//AGjPFV9pPguyMHg3wtqekw/EL4qXaW+n28E3n213feFPCNzJY
- 6imo+KLXQrme8tNNuBeWmiWM1lceL723ude0eHV/T4dy7McZjMLQwlKVablGMVGLSinyNuUnH3U
- lduV7J7nPn1TLcFlWLxOMrU8PCMYuVSb96MrRSpwTS5p1HZRltdNOzaa9K8Wf8EuR8X/AI5PZ/D
- nx7rnw6Txmmj+LPEPiLT/AAdquuWNjbCZdA8V3BvL1dF8AXGrTLpaG30+58T6l44uUk06+j8OjS
- tHW8m/GP8A4LZf8E3F/ZA+Jvw4k0aHx78RP2Z/FGl6ZcX3xM+JA0tZvD3xFjl1+DVvAs/iTwlZ6
- HZ3GtTWmlDxb4ehn0TRXv8AR9V1DTbKz1f/AIRXW9UH9wHh/S7DQdA0/RvCthFp0/w+u3u7YBpL
- 24vtIluoxeGWR0bVL66S5E1zN9supo4GuFSWd7dI4Y/Dv+CmH7J2k/8ABQf9hj4x/BPQ9Oik8cX
- Hh+78ZfBy8mmt9PlT4weDbfULjwlbXN3eXFhZ6bb+JLqPUvAeuX99dNBYaB4s1i8iljuYYbwfvt
- TgDKqWHjiFQUM3rwcZ4+FWs61LERpxUFTnKS5Icto8sUtLvofyHmWLpZli8TONrSm50m006kE00
- 3o1FvRSV+qu3uf5pdt43SKNrLwD4SsIPDelySaZai9+33NxLJZsYpJ2e4kWRUkGwxR7QscYUAvy
- 7Fd7p/wP+P3w4jvPA+pfCp7PXfCmueJvDXia11y4nsdVtPE/hvxJq3h7xBp95bNewbJdK1TSrnS
- chXVlsVYSPngr81rcPV4Vqsf7Kq1eWpJe1qSrOdS0l78m95S1bfW787eP7SC0dTDpqys4STXw6N
- X38vPz0/L3T9SRtYuL67MdncC8EjbEuppoVj2otvDJbsAkRYeSciRmB5wVVm9A1bxpqusW08enP
- DeSXbW+mWTXiNeXMdvZyM8lwtxdM0dgkEcUMARJJFeGYOhRcRp4uySKZP8AVKXP7yIskYV97Bdm
- WA/dkhgyOwAOJDguhdCkvkSkKht2ISWYsuY+UZmRd6vkhVJUA+ZtRSD90/qU8PCcozd/daSStZq
- PLdO6vutbt6ab6hGUle2/lddr3V7W+XbsfTHiTwzq/izQbfU/+E1Elpp9vBZxWq6dcJZwvDaSTp
- am4t2WCSQNK8IuEikKoxWUqhqH4GXeu22p6jpUR0iwdkgudPbU7YXVpdNG8kVzp8Er297CH1OL/
- RZJ3aK4iLh4ZVZ5Q/z3a6hdWsMNrvzZySu8TLcSW4Wdj5RuGI37fLBZd5iDBGJDA1++f7GvjH/g
- mroXhOx8IfFr9hnxn8bfilZaPoOo618QNb/ae8e/DzRbjVPskk99a2mheBLL7JZ6VDeR3V1Zs+n
- 397P5qQXNwkcS/aPPxGEksLXw8pQdOon7OUkoRhG6b5rJyezUm+bTbqXFKU49+VLaTk3ZJJWi9O
- u3XR7NcJ8OdSs9X1Hw7pmiaZ5aizuobfTYrki3W5t0uLx4LmWd0t9TgPyy+ZM0ZjiZUhAURRH2n
- 4jfD3xh4XfQvG9gIE1CWfT9V8UaJpejRRP4o0iOaO5bRbwieJpFjkjs7AmCV54VgOo6ZLbXVvay
- RfZ/jD9tf9h/4M6Bp2r/AAw/4JKfADUtYW7+x6Avin40+PfiZMQd9wb2+tPEfgSW7vIY5oIY2bf
- bhZWkVWZiip4Yn/BX/wDbB+IOu2+mfDf/AIJ1fsy+C9K0xJIfDg8Gfsor43ljT5MWMOt+K9M1nS
- juR7aJ5E0WBVUtGIgGVz+OZhw2sLmFLMf9Ysny9UHKdeNTFUoSlT5uaSk606aSV07pe7ZNbXPo8
- PPGwhFUKWMjXjVw9SnUoRmknTUHFtJR0as4u+sbJlvxb+xBqXjFG8T+DvG8tjaTaRHrOnaDrWgy
- W802i3en2F3aRPPaX00rSx2LztJ5VpHat5siIQgKt8N+Nfgt4v8ADGoTXc+rSanfQrM8Gn6dcz6
- ddi6j8tYDDH58LTym3hWJPtUotojeSSShAqSt+y/7L3xz/aN+ONjrPin9pD4IeKfhT8QtL1aDQ7
- e/1r4aad8KvB/jTQNSXUk0i48N+GdE8L+C/D2lS+HNK099H1W20jSViuorLStbu9QvtW1zUAnIf
- GHwRJFrV/ex28JvYbe7vZbZYt0A8sSmRGCSEbxbJHKxmuJlUnBcBpIj01qrlBVsrxmFzKFKr7Ge
- JwkqWJouaUHPlqUZTi2pfZ5247M/rXhmOAz3K8HXxSq0qmIw1GrKnOc4ShXpqNOsmpcvvqUW4w6
- pJpao/Knwn4C8cefLc3ut3dqJopJru0FxcRNbRqJJnklnSeW9huEbbEpsZLULHHFaSNIRvHp+h/
- ZfDhk/syRr+QrcQza3LamWztQ8+0yWFk7oJrmMM264uCsV2sjMl1LIojku694juG1Way0qAzXKQ
- zKLYqFtxJM6s4iiYw8rKg8p3aV/MZAScRbfXf2UfgCv7VX7QPhr4E3HxDs/AY8T6ZqmsandyRTa
- lq8+n+HtL1DWLnSfDmlO9kt9r1zYabqNx/pF0tpZaZperagsWptpb6XqPTlmQZhnuLpYf95Wq1F
- KXs6dNqNOMOVylKK1UIR96UmkopNvXbbHYjKOH8LWxtWp7DD4dT/euzblaNoQd1KpUm7JxV2ret
- /bP2RP2bfiR+2t8Qbv4f8AgvW7rwf4F0nYPH/xYvdIm19dLubzTNUvNM0210+3utPj1TWdRFncm
- OGS907RvDljDLc313BdT6DoGt/1WfsZeE/Cnwi8F618EvCmg22g6HoUi6zMkUA3jWYreDQvF0d9
- qolvW1e6i1fSbG6utT1OW+u9Th1S0+1zXLRvXC6H8IfCnwT8F6L4T+Emh6V4a8KeCxaJoos9CtL
- 7UNIglZTK0FxPLa6pPeXOok3uqeINVnv7jxDqzTt4sa+kubq5uuv8Qa7H4L+JPhTxvosF1p/hXx
- THpera0+ovNazwaJ4nvbaDxbJdWjNKq3mn6ofC2p3kcsAa2P2ktNbFWkn/AKT4a4OwOQ4CMaK9p
- jK9OLnXdNXVSny1JU4NJuNOUXbq7xuz+UeKuOMbxXjZ3nOhl+HqSjh8KnaLg5WhUqLRS2UuZ3UF
- 8Ot+b7Gtr+a2uIzqMjw6RatNaySD7ZDFdWNwEtTulgVllklt7hb7IRw0kClJVmW3uR1/gPxXDoM
- 2reEvE88VgumzvcaJdP8Auo76yeATSCDJkWQOsZuIDujkdmnV0810ReGu5yIprXVXjtdLgjMVtd
- RyJA16ojkayDXME6TW7XFnJOZWhFuGCTIMRs0Unwp4D+Odt+1B8dfsvhbxB4QtvD/w5uU07T/+J
- zpMHiHxLpvhfUVh8RfEXVfCt3pbeKrKwu5tR0zw14W1BdTWGG2hsfEiawl14hfStN+io4GWNw+J
- nJuNGjT56s2rKM7RdKPRtyd1prZNrY+O55U6tB05Pn57Wl7qdN2U7pK/LFNOLaV5K27Pzg/4KO/
- 8EVf20/2v/wBrf4jftCfs5fEb9l74bfDH4gWnhW8tfDfi/wAQfELw74hfxFZ+GtNsPFet6np3hf
- 4MeOtCa717X7a+1W6v7LXZJNUurqfUNRifVLm+vbwr+n9PGeiWkFraavfWcd5a20NuwtblbqJki
- XaHNxLdXU80hbeJZJ5mmdwzSAMTRXhRzCrTUaccFQqKCUVOdCLlNJRSlJvVt6Nt7tt9Tv8AZU2+
- ZzrXbu9La+63py6ar8fI/wAUmKeK2uDct5Fy0cuHtLq3Z45g6kyn95HhNshIKtsfI3L/AHKlutT
- tblAo0mzgbcheSHcrsiZBQEAKjONu6QKWJBONzFq33gg1601XWLqGK3uk+0lI7GNbe3Bt7eCRD5
- ZEjEsdyuWkJZWJ4cK6/Un7MPwB8C/FnX/FNn4rm1/7JoVzokdnb6ZqMFkjjVUuDcG4ZrGeV2Tyk
- EJjkiwBiUSjp8bUnGjCpOXM1SSTtZuzinaKbSe93drXpojgp03UnGnFpOVknJvqrpt+89lrvr5H
- zj8I/CFn8QvHeieDtRj1m4i1p5LG2Giz28V1bXk4At7lhdWd5BJawyYa4hb7KHG0m8gVTu/cD/g
- j54n/AGVtC+JvxUh/af1jwm2jReH9IfQ774irDbaV/bOkza/H4htLQPavbX7LapbNJALi4LxLE9
- utwpcL81+NP2Z/hl4G+O+keENEh1o6MdZ+FN6yXmoQz3DPrVh8RhqMJnjsoCLe4bRLKRo1VWEgl
- fflk8vrNG/Z3+G6XFjdNa6pLDdfHvWfBkmmy3yHT10G2ktYlt440tUuEkeG9mieX7SSF2mMRybn
- b4Pjvh6l4icIZvwes2zjh3+3MPHDf21kuIjhs0wKVWhVU8LWtJQk1B05OzvCclZ3sexleNeU5hh
- 66w2HxVTDzlOUa6lKnVjUj7KMZxvZqm25xVleVm3pY/qr1D9tb/gnd8F/BEHjf/hIvA2ieA3uxp
- mk6r4Q+FviGWxW6ngOoJYLP4f8GhJ5pLSKF1CyTKVQIJEGTJ8+6t/wXY/YXs7s6V4X8ReK/H2pC
- OQ6Zb6B4B8T6Uv7tXkkaI6/oeiRso8tCiFH8xowEUs6o3zZpn7KPwo+OXxl8YfsueJotf0P4OeG
- dM8MeJrHw/4T1K2sLqXVLbR7OZXudU1XT9au1hlabE0dk9mXSGBFdVQhvuX4Ef8ABF//AIJ/Wfj
- DR9d1j4Va34wudI0LV75LTxP488VTabfyR6Xqd6sOpWWkaho8dzam7RJZrZDDFdKDb3Sz2ryQP/
- nPnH0VPALhrjfL+C+Mc68Y+LM/znGYPC08wlxBl0MtVXGVIwpSxF/Y4xwjJt1XTi5NP3Yttn6lQ
- 4pz7FYKWLwOHyfC0KUZzcZ08RKty01BySSbpttJct3ZO3RI6P41ftMav4x+FHw4juvhD4m8G6l4
- 50G2+KviHVfHE9roNz8KPBASeXw3c6zbXOmyaVc3Hinwnqn/AAmN48Gqrf8AhbTfI8PapZrq15r
- Fvo3xt8RdQ1C60jWrWMRHxHeaReWZu9rGAs9hcfvDHLGsat5SmNMwKUmRDKI33BvRP+CoEl5q/h
- 57nU9S1G81bX3i8S6rrktyRqt1I2qaMbTRjJGqWqeH9M/te5NjpqWgxMBdXU11eXF/cXnzP4S1f
- Ub/AOG/gK+vbqW5vtQ8L+G4by9mdmvJ2Nolq9xJdZFwbiVEDyOZNjSFjsCsUP8AduQ+GnCvhJw3
- knCnBmDqYLJcLUnThSrV6uIr1quIn7SriMTiK06k6tWdSU25PSKaUFGMYxX6J4e5piMzp43641U
- q06CzBSXuxjCPJGdOmlZxlblUZKyurvVs8C/Zn/ZV+Kn7Q/xDn0LStN/sPwp4deXU/iN4+mCWmn
- aNpccEtxJALq6juVl1HVntYrG12W94tlJdx6jf2y6XZ3zn7w/bZ+Bd1+xx40/ZX/ah/Zx8N6z4d
- 0/wRpfgbwv4h17VYJPD8Goa34eh1rS9atvGNjZJYX1sPF7WOm2l1p9xe28Hi6b4heOJ7U3aalez
- L+9fg/4JeAPgd8O9A8IfD/T7vTtPsb4anPeTX0r6trGsaxZvqWoazrV7bi1F/qE15plhIrNDHbx
- RWsFnFbpZQxWyfN/7Wvwi8D/En9i34neGtb0+7stI0HxPH4r0i20fU7+AWWu6ZqVjpen3g+2z6g
- twlmbufUbeyu1uLGPU2FwLbylWAf1j4W5Lg8kq4HE1ILE4nMZU8Li6jS/gY5Kl7OnzNNRg2nL4X
- JXvpZH4F4k8YY3Pcdi8BS58LluX1ZTw9DmvJ1ab/jVOV255WaaTcUrJaq591S6lp/jvwloXjPwn
- eRav4H8TaHp3iGzZbWW6g1rQPEenW+qQ3SRND56W1/p1xb4iuHjiuY5Z7S7W1m824i8Z8W/DyTx
- n8Nnt55ZIbf4f6zqM81jpcV9p7L4O14XVrremW13qomuWjtLqOfUEiF6kem29nYQpBNYwWEl55x
- /wT68Qa54q/Yq/Z/udc1S5vJ4tJ1jw4sm23gDaT4W+JHizwj4et5ooII4bg6X4f0LSdPjknika6
- js1OoG7aW4M30/ozxW3xL8P2BtLS4s9fs9U0O/tZ4f3Bsf7I1nUnCxQtCksklzoNjg3a3UdvG1x
- HZx2yzHb7WKi8vxmNwMW5PBY+dKE7uz5KkopNO3uyhpJW0vZbXfwGGkpShV1/eUqaktLc00pKy/
- kTSbV9Wj50+Ivx0+Jktp8M/hF4N8Iz/Ea6mube0+PWqyT6jDfeBvh9a3tj/ZV/Z2sVkYvE/ibxb
- oT6hrUOjQ61e3Wo6bpVxpVxbWlx4v0XWNO+4vCHgXwp4I8OWqaVotldwajYCS1u9MFsFltLvybo
- LLqVhbRwXFtdxPDdzPA9wt9eRSTS+VFceav4Yfsc/FTxx8WtF8P2XiDWTptt8RV0TWfE8eg21tb
- G6u5Z73TAkL6jFqjw2sGiaNpmhWtqWeG30u0SKJVnknuJf2v+DXh6x+D2p+GfhD4Yaa98GQ2Gs6
- jp1trotry80d4NQWSe30u6s7bThBbahe3t1qV6ssU8zX0pe2mtoVSBeziTK/7OwNCnTqckZSlKd
- OnKTjXm4e0lUrSfK/cuqdKnGDioJNyUlqsrxyx2Mqt03zOU4qc3rGNPkjypLmfK373xW5n8NrHd
- XEnh3QjHZ+NPEehaJq0kf2mGxk1uGzcafJJIltM0MqWrgzNFM+WhUgEISShort9H+F3hLxk+r+I
- tdtZ7nVL/Vn+0zebGQwgsNPggVVmhmMaQ28cUCIjKgSNWKmVpJHK+CTw9k3VxKejajCDSel0m6q
- bSa0bSbXRdPa9rUvpCm1fRylUvb3bXs7X11tpvbRn/9k=
-REV:2008-01-28T15:50:16Z
-ROLE:Software Developer
-TEL;TYPE=HOME:+48 91 3 177 6584
-TEL;TYPE=WORK:+48 12 617 23 34
-TEL;TYPE=CELL:+48 691 723 056
-TITLE:Chief Information Officer
-UID:BHTRsCvcmd
-URL:http://www.kde.org/antonipage
-VERSION:3.0
-X-KADDRESSBOOK-BlogFeed:http://antoni-kde.blog.com
-X-KADDRESSBOOK-X-Anniversary:2008-02-15
-X-KADDRESSBOOK-X-AssistantsName:Asok
-X-KADDRESSBOOK-X-Department:Knowledge Management
-X-KADDRESSBOOK-X-IMAddress:antoni at kde-jabber.org
-X-KADDRESSBOOK-X-ManagersName:The Pointy-Haired Boss
-X-KADDRESSBOOK-X-Office:3.10
-X-KADDRESSBOOK-X-Profession:Software Developer
-X-messaging/gadu-All:452342
-X-messaging/skype-All:antoni-kde-skype
-X-messaging/xmpp-All:antoni-kde at kde-jabber.org
-END:VCARD
-

Deleted: trunk/dna-repository/src/test/resources/docs/vcard-antoni-outlook2003.vcf
===================================================================
--- trunk/dna-repository/src/test/resources/docs/vcard-antoni-outlook2003.vcf	2009-06-04 21:46:34 UTC (rev 976)
+++ trunk/dna-repository/src/test/resources/docs/vcard-antoni-outlook2003.vcf	2009-06-04 22:31:30 UTC (rev 977)
@@ -1,22 +0,0 @@
-BEGIN:VCARD
-VERSION:2.1
-N:Mylka;Antoni;Jozef;Herr;jun.
-FN:Antoni Jozef Mylka jun.
-NICKNAME:Ant
-ORG:DFKI;Knowledge-Management
-TITLE:Intern
-NOTE;ENCODING=QUOTED-PRINTABLE:These are some notes about antoni.=0D=0A
-TEL;WORK;VOICE:49 631 234 341
-TEL;HOME;VOICE:48 691 342 341
-TEL;CELL;VOICE:48 91 3 175 234
-ADR;WORK:;3.10;Trippstadter Str. 122;Kaiserslautern;Rheinland-Pfalz;67663;Deutschland
-LABEL;WORK;ENCODING=QUOTED-PRINTABLE:3.10=0D=0ATrippstadter Str. 122=0D=0AKaiserslautern, Rheinland-Pfalz 67663=
-=0D=0ADeutschland
-ADR;HOME:;;Budryka 2/1110;Krakow;malopolskie;30-072;Polen
-LABEL;HOME;ENCODING=QUOTED-PRINTABLE:Budryka 2/1110=0D=0AKrak=F3w, ma=B3opolskie 30-072=0D=0APolen
-URL;WORK:http://antoni.mylka.com
-ROLE:Software-Developer
-BDAY:19800118
-EMAIL;PREF;INTERNET:antoni_mylka at somedomain.com
-REV:20080128T135515Z
-END:VCARD

Deleted: trunk/dna-repository/src/test/resources/docs/vcard-dirk.vcf
===================================================================
--- trunk/dna-repository/src/test/resources/docs/vcard-dirk.vcf	2009-06-04 21:46:34 UTC (rev 976)
+++ trunk/dna-repository/src/test/resources/docs/vcard-dirk.vcf	2009-06-04 22:31:30 UTC (rev 977)
@@ -1,8 +0,0 @@
-BEGIN:VCARD
-VERSION:2.1
-N:dirk
-FN:Dirk
-NOTE;ENCODING=QUOTED-PRINTABLE:The canonical Dirk=0D=0A
-EMAIL;PREF;INTERNET:dirk at sap.com
-REV:20071109T104602Z
-END:VCARD

Deleted: trunk/dna-repository/src/test/resources/docs/vcard-rfc2426.vcf
===================================================================
--- trunk/dna-repository/src/test/resources/docs/vcard-rfc2426.vcf	2009-06-04 21:46:34 UTC (rev 976)
+++ trunk/dna-repository/src/test/resources/docs/vcard-rfc2426.vcf	2009-06-04 22:31:30 UTC (rev 977)
@@ -1,26 +0,0 @@
-BEGIN:VCARD
-VERSION:3.0
-FN:Frank Dawson
-N:Dawson;Frank
-ORG:Lotus Development Corporation
-ADR;TYPE=WORK,POSTAL,PARCEL:;;6544 Battleford Drive
- ;Raleigh;NC;27613-3502;U.S.A.
-TEL;TYPE=VOICE,MSG,WORK:+1-919-676-9515
-TEL;TYPE=FAX,WORK:+1-919-676-9564
-EMAIL;TYPE=INTERNET,PREF:Frank_Dawson at Lotus.com
-EMAIL;TYPE=INTERNET:fdawson at earthlink.net
-URL:http://home.earthlink.net/~fdawson
-END:VCARD
-
-BEGIN:VCARD
-VERSION:3.0
-FN:Tim Howes
-N:Howes;Tim
-ORG:Netscape Communications Corp.
-ADR;TYPE=WORK:;;501 E. Middlefield Rd.;Mountain View;
- CA; 94043;U.S.A.
-TEL;TYPE=VOICE,MSG,WORK:+1-415-937-3419
-TEL;TYPE=FAX,WORK:+1-415-528-4164
-EMAIL;TYPE=INTERNET:howes at netscape.com
-END:VCARD
-

Deleted: trunk/dna-repository/src/test/resources/docs/vcard-vCards-SAP.vcf
===================================================================
--- trunk/dna-repository/src/test/resources/docs/vcard-vCards-SAP.vcf	2009-06-04 21:46:34 UTC (rev 976)
+++ trunk/dna-repository/src/test/resources/docs/vcard-vCards-SAP.vcf	2009-06-04 22:31:30 UTC (rev 977)
@@ -1,292 +0,0 @@
-BEGIN:VCARD
-VERSION:3.0
-N:Brown;Gwendolina;;;
-FN:Gwendolina Brown
-EMAIL;type=INTERNET;type=WORK;type=pref:Gwendolina.Brown at sap.com
-CATEGORIES:Demo,Nepomuk(SAP)
-X-ABUID:07D43ED3-2026-4769-83C7-94726573A70D\:ABPerson
-END:VCARD
-BEGIN:VCARD
-VERSION:3.0
-N:Smalholtz;Peter;;;
-FN:Peter Smalholtz
-ORG:SAP;
-EMAIL;type=INTERNET;type=WORK;type=pref:Peter.Smalholtz at sap.com
-TEL;type=WORK;type=pref:??
-CATEGORIES:Demo,Nepomuk(SAP)
-X-ABUID:4B505D70-F921-4C8D-8878-34302A6480BC\:ABPerson
-END:VCARD
-BEGIN:VCARD
-VERSION:3.0
-N:Krull;Kristina;;;
-FN:Kristina Krull
-ORG:SAP;
-EMAIL;type=INTERNET;type=WORK;type=pref:Kristina.Krull at sap.com
-CATEGORIES:Demo,Nepomuk(SAP)
-X-ABUID:77FB9B89-A196-46EE-AC61-CCCBAC872235\:ABPerson
-END:VCARD
-BEGIN:VCARD
-VERSION:3.0
-N:Dreger;Rutger;;;
-FN:Rutger Dreger
-ORG:SAP;
-EMAIL;type=INTERNET;type=WORK;type=pref:Rutger.Dreger at sap.com
-CATEGORIES:Demo,Nepomuk(SAP)
-X-ABUID:4C5B2EFE-BF04-43D8-BAC1-56FE9FFA5F3D\:ABPerson
-END:VCARD
-BEGIN:VCARD
-VERSION:3.0
-N:T??cken;Frida;;;
-FN:Karlsruhe Travel
-ORG:Karlsruhe Travel;
-EMAIL;type=INTERNET;type=WORK;type=pref:Frida.Tocken at karlsruhetravel.com
-X-ABShowAs:COMPANY
-CATEGORIES:Demo,Nepomuk(SAP)
-X-ABUID:525660B1-1332-4980-93ED-A50AFEB5609B\:ABPerson
-END:VCARD
-BEGIN:VCARD
-VERSION:3.0
-N:Bernadotte;Ulla;;;
-FN:Ulla Bernadotte
-EMAIL;type=INTERNET;type=WORK;type=pref:Ullis at yahoo.com
-CATEGORIES:Demo,Nepomuk(SAP)
-X-ABUID:6BCC314A-2460-4B8D-ADBC-52A6DEA79AFC\:ABPerson
-END:VCARD
-BEGIN:VCARD
-VERSION:3.0
-N:Aubrey;Albert;;;
-FN:Albert Aubrey
-ORG:SAP;
-EMAIL;type=INTERNET;type=WORK;type=pref:Albert.Aubrey at sap.com
-CATEGORIES:Demo,Nepomuk(SAP)
-X-ABUID:DD3883AB-279D-488C-9147-3844BDA78968\:ABPerson
-END:VCARD
-BEGIN:VCARD
-VERSION:3.0
-N:Meyer;Helmut;;;
-FN:Helmut Meyer
-ORG:SAP;
-EMAIL;type=INTERNET;type=WORK;type=pref:Helmut.Meyer at sap.com
-CATEGORIES:Demo,Nepomuk(SAP)
-X-ABUID:5D61771B-EB5F-4955-AF20-696598E445FD\:ABPerson
-END:VCARD
-BEGIN:VCARD
-VERSION:3.0
-N:Andriotti;Marco;;;
-FN:Marco Andriotti
-ORG:SAP;
-EMAIL;type=INTERNET;type=WORK;type=pref:Marco.Andriotti at sap.com
-TEL;type=WORK;type=pref:+44 28 90930084
-item1.ADR;type=WORK;type=pref:;;Shore Road;Newtownabbey;;BT37 0QB;United Kingdom
-item1.X-ABADR:se
-CATEGORIES:Demo,Nepomuk(SAP)
-X-ABUID:29B73432-E9DF-4381-9EAA-E0328AB34DA7\:ABPerson
-END:VCARD
-BEGIN:VCARD
-VERSION:3.0
-N:Spa??lund;Ingrid;;;
-FN:Ingrid Spa??lund
-ORG:Nike;
-EMAIL;type=INTERNET;type=WORK;type=pref:Ingrid.Spasslund at nikesport.com
-CATEGORIES:Demo,Nepomuk(SAP)
-X-ABUID:47E30CAB-175F-4CA8-A193-D630ACC282C2\:ABPerson
-END:VCARD
-BEGIN:VCARD
-VERSION:3.0
-N:Atkins;Adam;;;
-FN:Adam Atkins
-ORG:SAP;
-EMAIL;type=INTERNET;type=WORK;type=pref:Adam.Atkins at sap.com
-CATEGORIES:Demo,Nepomuk(SAP)
-X-ABUID:C30E59B9-2C00-4160-91E4-9730FEF2A5EB\:ABPerson
-END:VCARD
-BEGIN:VCARD
-VERSION:3.0
-N:Williams;Martin;;;
-FN:Martin Williams
-ORG:SAP;
-EMAIL;type=INTERNET;type=WORK;type=pref:Martin.Williams at sap.com
-TEL;type=WORK;type=pref:+61 7 3259 9599
-item1.ADR;type=WORK;type=pref:;;133 Mary Street;Brisbane;;QLD 4000;Australia
-item1.X-ABADR:se
-CATEGORIES:Demo,Nepomuk(SAP)
-X-ABUID:DC826FA6-C7D0-4600-BFA0-45958CDCA851\:ABPerson
-END:VCARD
-BEGIN:VCARD
-VERSION:3.0
-N:Stern;Margit;;;
-FN:Margit Stern
-TEL;type=WORK;type=pref:+4978432748392
-item1.ADR;type=WORK;type=pref:;;Brotmannstra??e 7;Siegertsbrunn;;85635;Deutschland
-item1.X-ABADR:se
-CATEGORIES:Demo,Nepomuk(SAP)
-X-ABUID:459248A9-DB7D-4C72-AC02-A765C277F942\:ABPerson
-END:VCARD
-BEGIN:VCARD
-VERSION:3.0
-N:Fuchs;Frederica;;;
-FN:Frederica Fuchs
-EMAIL;type=INTERNET;type=WORK;type=pref:Frederica_64 at hotmail.com
-CATEGORIES:Demo,Nepomuk(SAP)
-X-ABUID:379703B2-D424-45BA-9ED8-F2E2E1F63351\:ABPerson
-END:VCARD
-BEGIN:VCARD
-VERSION:3.0
-N:Bl??mchen;G??nther;;;
-FN:G??nther Bl??mchen
-ORG:Oracle;
-EMAIL;type=INTERNET;type=WORK;type=pref:Guenther.Bluemchen at oracle.com
-TEL;type=WORK;type=pref:+1.650.506.7000
-item1.ADR;type=WORK;type=pref:;;500 Oracle Parkway;Redwood Shores;;CA 94065;United States of America
-item1.X-ABADR:se
-CATEGORIES:Demo,Nepomuk(SAP)
-X-ABUID:2BFC53C0-5B77-476E-AEC4-37A6B7C5A9E7\:ABPerson
-END:VCARD
-BEGIN:VCARD
-VERSION:3.0
-N:Kohler;Hans;;;
-FN:Hans Kohler
-ORG:SAP;
-EMAIL;type=INTERNET;type=WORK;type=pref:Hans.Kohler at sap.com
-CATEGORIES:Demo,Nepomuk(SAP)
-X-ABUID:16D88E45-BC2E-4B9B-A171-F838B4E09592\:ABPerson
-END:VCARD
-BEGIN:VCARD
-VERSION:3.0
-N:Lang;Fritz;;;
-FN:Fritz Lang
-ORG:SAP;
-EMAIL;type=INTERNET;type=WORK;type=pref:Fritz.Lang at sap.com
-CATEGORIES:Demo,Nepomuk(SAP)
-X-ABUID:3A73FE84-8A80-4512-ACA0-D0C9C5A06627\:ABPerson
-END:VCARD
-BEGIN:VCARD
-VERSION:3.0
-N:Stern;Claudia;;;
-FN:Claudia Stern
-ORG:SAP;
-EMAIL;type=INTERNET;type=WORK;type=pref:claudi-1 at csc.kth.se
-TEL;type=WORK;type=pref:+49(721)123456
-TEL;type=CELL:+49(175)1234567
-item1.ADR;type=WORK;type=pref:;;Vincenz-Priessnitz-Str. 1;Karlsruhe;;76131;Germany
-item1.X-ABADR:se
-CATEGORIES:Demo,Nepomuk(SAP)
-X-ABUID:2E739C33-31EC-48F9-A5BC-C7D709C08959\:ABPerson
-END:VCARD
-BEGIN:VCARD
-VERSION:3.0
-N:Treutiger;Harald;;;
-FN:Harald Treutiger
-ORG:Siemens;
-EMAIL;type=INTERNET;type=WORK;type=pref:Harald.Treutiger at siemens.de
-TEL;type=WORK;type=pref:+94 (0800) 2255337
-item1.ADR;type=WORK;type=pref:;;Werner-von-Siemens-Stra??e 6;Augsburg;;86159;Deutschland
-item1.X-ABADR:se
-CATEGORIES:Demo,Nepomuk(SAP)
-X-ABUID:EDD1767A-549F-4E66-9FC4-FE2CF1ED6E46\:ABPerson
-END:VCARD
-BEGIN:VCARD
-VERSION:3.0
-N:M??ller;Berit;;;
-FN:Berit M??ller
-ORG:SAP;
-EMAIL;type=INTERNET;type=WORK;type=pref:Berit.Mueller at sap.com
-CATEGORIES:Demo,Nepomuk(SAP)
-X-ABUID:CD0506CF-0829-4762-9EC7-09A1B0606D44\:ABPerson
-END:VCARD
-BEGIN:VCARD
-VERSION:3.0
-N:Wolf;Mathilde;;;
-FN:Mathilde Wolf
-ORG:SAP;
-EMAIL;type=INTERNET;type=WORK;type=pref:Mathilde.Wolf at sap.com
-CATEGORIES:Demo,Nepomuk(SAP)
-X-ABUID:74C4AFF9-E27F-42C5-BB28-B7330BD89B8E\:ABPerson
-END:VCARD
-BEGIN:VCARD
-VERSION:3.0
-N:Hageman;Dirk;;;
-FN:Dirk Hageman
-ORG:SAP;
-EMAIL;type=INTERNET;type=WORK;type=pref:dirk-1 at csc.kth.se
-TEL;type=WORK;type=pref:+49(721)847932
-TEL;type=CELL:+49(175)9876543
-item1.ADR;type=WORK;type=pref:;;Vincenz-Priessnitz-Str. 1;Karlsruhe;;76131;Germany
-item1.X-ABADR:se
-CATEGORIES:Demo,Nepomuk(SAP)
-X-ABUID:F3778FC5-87BB-4581-886C-350BF0B70BCB\:ABPerson
-END:VCARD
-BEGIN:VCARD
-VERSION:3.0
-N:Wimmerman;Daniel;;;
-FN:Daniel Wimmerman
-EMAIL;type=INTERNET;type=WORK;type=pref:Daniel.Wimmerman at sap.com
-CATEGORIES:Demo,Nepomuk(SAP)
-X-ABUID:B2273377-F134-47FF-A803-36BBE1287372\:ABPerson
-END:VCARD
-BEGIN:VCARD
-VERSION:3.0
-N:Kurtz;Daniel;;;
-FN:Daniel Kurtz
-ORG:SAP;
-EMAIL;type=INTERNET;type=WORK;type=pref:Daniel.Kurtz at sap.com
-CATEGORIES:Demo,Nepomuk(SAP)
-X-ABUID:F2BD97A3-9901-4587-B944-4B8CBBC5B959\:ABPerson
-END:VCARD
-BEGIN:VCARD
-VERSION:3.0
-N:Schnurrbart;Caspar;;;
-FN:Caspar Schnurrbart
-EMAIL;type=INTERNET;type=WORK;type=pref:Caspar.Schnurrbart at sap.com
-CATEGORIES:Demo,Nepomuk(SAP)
-X-ABUID:3A107906-899E-4C66-B781-FFB05E2B1369\:ABPerson
-END:VCARD
-BEGIN:VCARD
-VERSION:3.0
-N:Setter;Monika;;;
-FN:Monika Setter
-ORG:SAP;
-EMAIL;type=INTERNET;type=WORK;type=pref:Monika.Setter at sap.com
-CATEGORIES:Demo,Nepomuk(SAP)
-X-ABUID:6A48E535-67CC-41B3-987B-CFC098CDE5EC\:ABPerson
-END:VCARD
-BEGIN:VCARD
-VERSION:3.0
-N:Glans;Heinrich;;;
-FN:Heinrich Glans
-ORG:SAP;
-EMAIL;type=INTERNET;type=WORK;type=pref:Heinrich.Glans at sap.com
-CATEGORIES:Demo,Nepomuk(SAP)
-X-ABUID:AC03E8F2-D4C5-4603-93A6-306170553EFB\:ABPerson
-END:VCARD
-BEGIN:VCARD
-VERSION:3.0
-N:Fischer;Ambrosia;;;
-FN:Ambrosia Fischer
-ORG:SAP;
-EMAIL;type=INTERNET;type=WORK;type=pref:Ambrosia.Fischer at sap.com
-TEL;type=WORK;type=pref:+49(721)894763
-TEL;type=CELL:+49(175)74632934
-item1.ADR;type=WORK;type=pref:;;Vincenz-Priessnitz-Str. 1;Karlsruhe;;76131;Germany
-item1.X-ABADR:se
-CATEGORIES:Demo,Nepomuk(SAP)
-X-ABUID:E8167957-903A-4861-8B39-C92698E59425\:ABPerson
-END:VCARD
-BEGIN:VCARD
-VERSION:3.0
-N:Sprung;Markus;;;
-FN:Markus Sprung
-ORG:SAP;
-EMAIL;type=INTERNET;type=WORK;type=pref:Markus.Sprung at sap.com
-CATEGORIES:Demo,Nepomuk(SAP)
-X-ABUID:8365FAAF-0362-4AF9-A080-D4DAED8BBF94\:ABPerson
-END:VCARD
-BEGIN:VCARD
-VERSION:3.0
-N:Smith;Diana;;;
-FN:Diana Smith
-ORG:SAP;
-EMAIL;type=INTERNET;type=WORK;type=pref:Diana.Smith at sap.com
-CATEGORIES:Demo,Nepomuk(SAP)
-X-ABUID:A2BC9E71-2D15-4A86-A13D-621F2FCE1E86\:ABPerson
-END:VCARD

Deleted: trunk/dna-repository/src/test/resources/docs/xml-handwritten.xml
===================================================================
--- trunk/dna-repository/src/test/resources/docs/xml-handwritten.xml	2009-06-04 21:46:34 UTC (rev 976)
+++ trunk/dna-repository/src/test/resources/docs/xml-handwritten.xml	2009-06-04 22:31:30 UTC (rev 977)
@@ -1,12 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<example attribute="value">
-
-Example handwritten XML document.
-
-<subElement>
-	Nested text.
-</subElement>
-
-More text.
-
-</example>
\ No newline at end of file

Deleted: trunk/dna-repository/src/test/resources/docs/xml-nonexistent-dtd.xml
===================================================================
--- trunk/dna-repository/src/test/resources/docs/xml-nonexistent-dtd.xml	2009-06-04 21:46:34 UTC (rev 976)
+++ trunk/dna-repository/src/test/resources/docs/xml-nonexistent-dtd.xml	2009-06-04 22:31:30 UTC (rev 977)
@@ -1,3 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE tutorial SYSTEM "tutorial.dtd">
-<tutorial>This is an XML document</tutorial>
\ No newline at end of file

Deleted: trunk/dna-repository/src/test/resources/docs/xml-nonexistent-remote-dtd.xml
===================================================================
--- trunk/dna-repository/src/test/resources/docs/xml-nonexistent-remote-dtd.xml	2009-06-04 21:46:34 UTC (rev 976)
+++ trunk/dna-repository/src/test/resources/docs/xml-nonexistent-remote-dtd.xml	2009-06-04 22:31:30 UTC (rev 977)
@@ -1,3 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE tutorial SYSTEM "http://www.w3.org/TR/xhtml1/DTD/tutorial.dtd">
-<tutorial>This is an XML document</tutorial>
\ No newline at end of file

Deleted: trunk/dna-repository/src/test/resources/docs/xml-nonexistent-remote-xsd.xml
===================================================================
--- trunk/dna-repository/src/test/resources/docs/xml-nonexistent-remote-xsd.xml	2009-06-04 21:46:34 UTC (rev 976)
+++ trunk/dna-repository/src/test/resources/docs/xml-nonexistent-remote-xsd.xml	2009-06-04 22:31:30 UTC (rev 977)
@@ -1,3 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<tutorial xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-  xsi:noNamespaceSchemaLocation="http://www.w3.org/2007/01/tutorial.xsd">This is an XML document</tutorial>
\ No newline at end of file

Deleted: trunk/dna-repository/src/test/resources/docs/xml-nonexistent-xsd.xml
===================================================================
--- trunk/dna-repository/src/test/resources/docs/xml-nonexistent-xsd.xml	2009-06-04 21:46:34 UTC (rev 976)
+++ trunk/dna-repository/src/test/resources/docs/xml-nonexistent-xsd.xml	2009-06-04 22:31:30 UTC (rev 977)
@@ -1,3 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<tutorial xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-  xsi:noNamespaceSchemaLocation="tutorial.xsd">This is an XML document</tutorial>
\ No newline at end of file

Deleted: trunk/dna-repository/src/test/resources/docs/xml-utf8-bom
===================================================================
--- trunk/dna-repository/src/test/resources/docs/xml-utf8-bom	2009-06-04 21:46:34 UTC (rev 976)
+++ trunk/dna-repository/src/test/resources/docs/xml-utf8-bom	2009-06-04 22:31:30 UTC (rev 977)
@@ -1,6 +0,0 @@
-???<?xml version='1.0' encoding='UTF-8'?>
-<example>
-
-This is an example XML document saved as a UTF-8 file with a UTF-8 Byte Order Mark.
-
-</example>
\ No newline at end of file

Deleted: trunk/dna-repository/src/test/resources/jackrabbitInMemoryTestRepositoryConfig.xml
===================================================================
--- trunk/dna-repository/src/test/resources/jackrabbitInMemoryTestRepositoryConfig.xml	2009-06-04 21:46:34 UTC (rev 976)
+++ trunk/dna-repository/src/test/resources/jackrabbitInMemoryTestRepositoryConfig.xml	2009-06-04 22:31:30 UTC (rev 977)
@@ -1,116 +0,0 @@
-<?xml version="1.0"?>
-<!--
-   Licensed to the Apache Software Foundation (ASF) under one or more
-   contributor license agreements.  See the NOTICE file distributed with
-   this work for additional information regarding copyright ownership.
-   The ASF licenses this file to You under the Apache License, Version 2.0
-   (the "License"); you may not use this file except in compliance with
-   the License.  You may obtain a copy of the License at
-
-       http://www.apache.org/licenses/LICENSE-2.0
-
-   Unless required by applicable law or agreed to in writing, software
-   distributed under the License is distributed on an "AS IS" BASIS,
-   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-   See the License for the specific language governing permissions and
-   limitations under the License.
--->
-<!DOCTYPE Repository PUBLIC "-//The Apache Software Foundation//DTD Jackrabbit 1.2//EN"
-                            "http://jackrabbit.apache.org/dtd/repository-1.2.dtd">
-<!-- Example Repository Configuration File -->
-<Repository>
-    <!--
-        virtual file system where the repository stores global state
-        (e.g. registered namespaces, custom node types, etc.)
-    -->
-    <FileSystem class="org.apache.jackrabbit.core.fs.mem.MemoryFileSystem">
-        <param name="path" value="${rep.home}/repository"/>
-    </FileSystem>
-
-    <!--
-        security configuration
-    -->
-    <Security appName="Jackrabbit">
-        <!--
-            access manager:
-            class: FQN of class implementing the AccessManager interface
-        -->
-        <AccessManager class="org.apache.jackrabbit.core.security.SimpleAccessManager">
-            <!-- <param name="config" value="${rep.home}/access.xml"/> -->
-        </AccessManager>
-
-        <LoginModule class="org.apache.jackrabbit.core.security.SimpleLoginModule">
-           <!-- anonymous user name ('anonymous' is the default value) -->
-           <param name="anonymousId" value="anonymous"/>
-           <!--
-              default user name to be used instead of the anonymous user
-              when no login credentials are provided (unset by default)
-           -->
-           <!-- <param name="defaultUserId" value="superuser"/> -->
-        </LoginModule>
-    </Security>
-
-    <!--
-        location of workspaces root directory and name of default workspace
-    -->
-    <Workspaces rootPath="${rep.home}/workspaces" defaultWorkspace="default"/>
-    <!--
-        workspace configuration template:
-        used to create the initial workspace if there's no workspace yet
-    -->
-    <Workspace name="Jackrabbit Core">
-        <!--
-            virtual file system of the workspace:
-            class: FQN of class implementing the FileSystem interface
-        -->
-
-        <FileSystem class="org.apache.jackrabbit.core.fs.mem.MemoryFileSystem">
-            <param name="path" value="${wsp.home}"/>
-        </FileSystem>
-        <!--
-            persistence manager of the workspace:
-            class: FQN of class implementing the PersistenceManager interface
-        -->
-        <PersistenceManager class="org.apache.jackrabbit.core.persistence.mem.InMemPersistenceManager">
-          <param name="persistent" value="false"/>
-        </PersistenceManager>
-        <!--
-            Search index and the file system it uses.
-            class: FQN of class implementing the QueryHandler interface
-        -->
-        <SearchIndex class="org.apache.jackrabbit.core.query.lucene.SearchIndex">
-            <param name="path" value="${wsp.home}/index"/>
-        </SearchIndex>
-    </Workspace>
-
-    <!--
-        Configures the versioning
-    -->
-    <Versioning rootPath="${rep.home}/version">
-        <!--
-            Configures the filesystem to use for versioning for the respective
-            persistence manager
-        -->
-        <FileSystem class="org.apache.jackrabbit.core.fs.mem.MemoryFileSystem">
-            <param name="path" value="${rep.home}/version" />
-        </FileSystem>
-
-        <!--
-            Configures the persistence manager to be used for persisting version state.
-            Please note that the current versioning implementation is based on
-            a 'normal' persistence manager, but this could change in future
-            implementations.
-        -->
-        <PersistenceManager class="org.apache.jackrabbit.core.persistence.mem.InMemPersistenceManager">
-          <param name="persistent" value="false"/>
-        </PersistenceManager>
-    </Versioning>
-
-    <!--
-        Search index for content that is shared repository wide
-        (/jcr:system tree, contains mainly versions)
-    -->
-    <SearchIndex class="org.apache.jackrabbit.core.query.lucene.SearchIndex">
-        <param name="path" value="${rep.home}/repository/index"/>
-    </SearchIndex>
-</Repository>

Deleted: trunk/dna-repository/src/test/resources/jackrabbitNodeTypes.cnd
===================================================================
--- trunk/dna-repository/src/test/resources/jackrabbitNodeTypes.cnd	2009-06-04 21:46:34 UTC (rev 976)
+++ trunk/dna-repository/src/test/resources/jackrabbitNodeTypes.cnd	2009-06-04 22:31:30 UTC (rev 977)
@@ -1,45 +0,0 @@
-<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'>
-<image='http://jboss.org/dna/images/1.0'>
-<mp3='http://jboss.org/dna/mp3/1.0'>
-// ----------------------------------------------------------
-// JCR Pre-defined Mixin Types that are not loaded by default
-// ----------------------------------------------------------
-
-[mix:mimeTyped] mixin 
-  - jcr:mimeType (string)  
-  - jcr:encoding (string)
-
-
-// -------------------
-// DNA Image Sequencer
-// -------------------
-
-/**
- * Node type that defines the metadata for an image
- */
-[image:metadata] > nt:unstructured, mix:mimeTyped
-  - image:formatName (string) mandatory
-    < 'JPEG', 'GIF', 'PNG', 'BMP', 'PCX', 'IFF', 'RAS', 'PBM', 'PGM', 'PPM', 'PSD'
-  - image:width (long)
-  - image:height (long)
-  - image:bitsPerPixel (long)
-  - image:progressive (boolean)
-  - image:numberOfImages (long)
-  - image:physicalWidthDpi (long)
-  - image:physicalHeightDpi (long)
-  - image:physicalWidthInches (long)
-  - image:physicalHeightInches (long)
-
-/**
- * Node type that defines the metadata for an MP3 audio file
- */
-[mp3:metadata] > nt:unstructured, mix:mimeTyped
-  - mp3:title (string)
-  - mp3:author (string)
-  - mp3:album (string)
-  - mp3:year (long)
-  - mp3:comment (string)
-
-

Deleted: trunk/dna-repository/src/test/resources/master.xml
===================================================================
--- trunk/dna-repository/src/test/resources/master.xml	2009-06-04 21:46:34 UTC (rev 976)
+++ trunk/dna-repository/src/test/resources/master.xml	2009-06-04 22:31:30 UTC (rev 977)
@@ -1,1892 +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 distribution; if not, write to:
-  ~ Free Software Foundation, Inc.
-  ~ 51 Franklin Street, Fifth Floor
-  ~ Boston, MA  02110-1301  USA
-  -->
-<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.4//EN" "http://www.oasis-open.org/docbook/xml/4.4/docbookx.dtd" [
-<!ENTITY % RH-ENTITIES SYSTEM "Common_Config/rh-entities.ent">
-<!ENTITY versionNumber "0.1">
-<!ENTITY copyrightYear "2008">
-<!ENTITY copyrightHolder "Red Hat Middleware, LLC.">]>
-<book>
-  <bookinfo>
-    <title>JBoss DNA</title>
-    <subtitle>Getting Started Guide</subtitle>
-    <releaseinfo>&versionNumber;
-    </releaseinfo>
-    <productnumber>&versionNumber;
-    </productnumber>
-    <issuenum>1</issuenum>
-    <mediaobject>
-      <imageobject role="fo">
-        <imagedata fileref="images/dna-logo.png" align="center" />
-      </imageobject>
-      <imageobject role="pdf">
-        <imagedata fileref="images/dna-logo.png" scale="75" align="center" />
-      </imageobject>
-      <imageobject role="html">
-        <imagedata fileref="images/dna-logo.png" depth="3cm" />
-      </imageobject>
-      <imageobject role="xhtml">
-        <imagedata fileref="images/dna-logo.png" depth="3cm" />
-      </imageobject>
-      <imageobject role="xhtml_single">
-        <imagedata fileref="images/dna-logo.png" depth="3cm" />
-      </imageobject>
-    </mediaobject>
-    <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="Author_Group.xml" />
-    <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="Legal_Notice.xml" />
-  </bookinfo>
-  <preface id="preface" revision="1">
-    <title>What this book covers</title>
-    <para>The goal of this book is to help you learn about JBoss DNA and how you can use it in your own applications to get the
-      most out of your JCR repositories.</para>
-    <para>The first part of the book starts out with an introduction to content repositories and an overview of the JCR API,
-      both of which are important aspects of JBoss DNA. This is followed by an overview of the JBoss DNA project, its
-      architecture, and a basic roadmap for what's coming next.</para>
-    <para>The next part of the book covers how to download and build the examples, how to use JBoss DNA with existing
-      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>
-      . 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/subversion.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
-      same thing.
-    </para>
-  </preface>
-  <chapter id="introduction">
-    <title>Introduction</title>
-    <para>There are a lot of choices for how applications can store information persistently so that it can be accessed at a
-      later time and by other processes. The challenge developers face is how to use an approach that most closely matches the
-      needs of their application. This choice becomes more important as developers choose to focus their efforts on
-      application-specific logic, delegating much of the responsibilities for persistence to libraries and frameworks.</para>
-    <para>
-      Perhaps one of the easiest techniques is to simply store information in
-      <emphasis>files</emphasis>
-      . The Java language makes working with files relatively easy, but Java really doesn't provide many bells and whistles. So
-      using files is an easy choice when the information is either not complicated (for example property files), or when users may
-      need to read or change the information outside of the application (for example log files or configuration files). But using
-      files to persist information becomes more difficult as the information becomes more complex, as the volume of it increases,
-      or if it needs to be accessed by multiple processes. For these situations, other techniques often offer better choices.
-    </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
-      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.
-    </para>
-    <para>
-      One of the more popular persistence technologies is the
-      <emphasis>relational database</emphasis>
-      . Relational database management systems have been around for decades and are very capable. The Java Database Connectivity
-      (JDBC) API provides a standard interface for connecting to and interacting with relational databases. However, it is a
-      low-level API that requires a lot of code to use correctly, and it still doesn't abstract away the DBMS-specific SQL
-      grammar. Also, working with relational data in an object-oriented language can feel somewhat unnatural, so many developers
-      map this data to classes that fit much more cleanly into their application. The problem is that manually creating this
-      mapping layer requires a lot of repetitive and non-trivial JDBC code.
-    </para>
-    <para>
-      <emphasis>Object-relational mapping</emphasis>
-      libraries automate the creation of this mapping layer and result in far less code that is much more maintainable with
-      performance that is often as good as (if not better than) handwritten JDBC code. The new
-      <ulink url="http://java.sun.com/developer/technicalArticles/J2EE/jpa/">Java Persistence API (JPA)</ulink>
-      provide a standard mechanism for defining the mappings (through annotations) and working with these entity objects. Several
-      commercial and open-source libraries implement JPA, and some even offer additional capabilities and features that go beyond
-      JPA. For example,
-      <ulink url="http://www.hibernate.org">Hibernate</ulink>
-      is one of the most feature-rich JPA implementations and offers object caching, statement caching, extra association
-      mappings, and other features that help to improve performance and usefulness.
-    </para>
-    <para>
-      While relational databases and JPA are solutions that work for many applications, they become more limited in cases when the
-      information structure is highly flexible, is not known
-      <emphasis>a priori</emphasis>
-      , or is subject to frequent change and customization. In these situations,
-      <emphasis>content repositories</emphasis>
-      may offer a better choice for persistence. Content repositories are almost a hybrid between relational databases and file
-      systems, and typically provide other capabilities as well, including versioning, indexing, search, access control,
-      transactions, and observation. Because of this, content repositories are used by content management systems (CMS), document
-      management systems (DMS), and other applications that manage electronic files (e.g., documents, images, multi-media, web
-      content, etc.) and metadata associated with them (e.g., author, date, status, security information, etc.). The
-      <ulink url="http://www.jcp.org/en/jsr/detail?id=170">Content Repository for Java technology API</ulink>
-      provides a standard Java API for working with content repositories. Abbreviated "JCR", this API was developed as part of the
-      Java Community Process under
-      <ulink url="http://www.jcp.org/en/jsr/detail?id=170">JSR-170</ulink>
-      and is being revised under
-      <ulink url="http://www.jcp.org/en/jsr/detail?id=283">JSR-283</ulink>
-      .
-    </para>
-    <para>
-      The
-      <emphasis>JBoss DNA project</emphasis>
-      is building the tools and services that surround content repositories. Nearly all of these capabilities are to be hidden
-      below the JCR API and involve automated processing of the information in the repository. Thus, JBoss DNA can add value to
-      existing repository implementations. For example, JCR repositories offer the ability to upload files into the repository and
-      have the file content indexed for search purposes. JBoss DNA also defines a library for "sequencing" content - to extract
-      meaningful information from that content and store it in the repository, where it can then be searched, accessed, and
-      analyzed using the JCR API.
-    </para>
-    <para> JBoss DNA is building other features as well. One goal of JBoss DNA is to create federated repositories that
-      dynamically merge the information from multiple databases, services, applications, and other JCR repositories. Another is to
-      create customized views based upon the type of data and the role of the user that is accessing the data. And yet another is
-      to create a REST-ful API to allow the JCR content to be accessed easily by other applications written in other languages.
-    </para>
-    <para>
-      The
-      <link linkend="jboss_dna">next chapter</link>
-      in this book goes into more detail about JBoss DNA and its architecture, the different components, what's available now, and
-      what's coming in future releases.
-      <link linkend="downloading_and_running">Chapter 3</link>
-      then provides instructions for downloading and running the sequencer examples for the current release.
-      <link linkend="using_dna">Chapter 4</link>
-      walks through how to use JBoss DNA in your applications, while
-      <link linkend="custom_sequencers">Chapter 5</link>
-      goes over how to create custom sequencers. Finally,
-      <link linkend="future_directions">Chapter 6</link>
-      wraps things up with a discussion about the future of JBoss DNA.
-    </para>
-  </chapter>
-  <chapter id="jboss_dna">
-    <title>Understanding JBoss DNA</title>
-    <sect1 id="jboss_dna_overview">
-      <title>Overview</title>
-      <para>JBoss DNA is a repository and set of tools that make it easy to capture, version, analyze, and understand the
-        fundamental building blocks of information. As models, service and process definitions, schemas, source code, and other
-        artifacts are added to the repository, JBoss DNA "sequences" the makeup of these components and extracts their structure
-        and interdependencies. The JBoss DNA web application allows end users to access, visualize, and edit this information in
-        the terminology and structure they are familiar with. Such domain-specific solutions can be easily created with little or
-        no programming.</para>
-      <para> JBoss DNA supports the Java Content Repository (JCR) standard and is able to provide a single integrated view of
-        multiple repositories, external databases, services, and applications, ensuring that JBoss DNA has access to the latest
-        and most reliable master data. For instance, DNA could provide in a single view valuable insight into the business
-        processes and process-level services impacted by a change to in an intermediary web server operation defined via WSDL.
-        Similarly, a user could quickly view and navigate the dependencies between the data source models and transformation
-        information stored within a content repository, the code base stored within a version control system, and the database
-        schemas used by an application.</para>
-    </sect1>
-    <sect1 id="architecture">
-      <title>Architecture</title>
-      <para>The architecture for JBoss DNA consists of several major components that will be built on top of standard APIs,
-        including JCR, JDBC, JNDI and HTTP. The goal is to allow these components to be assembled as needed and add value on top
-        of other DNA components or third-party systems that support these standard APIs.</para>
-      <mediaobject>
-        <imageobject role="fo">
-          <imagedata align="center" fileref="images/dna-architecture.png" />
-        </imageobject>
-        <imageobject role="html">
-          <imagedata align="center" fileref="images/dna-architecture.png" />
-        </imageobject>
-      </mediaobject>
-      <para>
-        As shown in the diagram above, the major components are (starting at the top):
-        <itemizedlist>
-          <listitem>
-            <para>
-              <emphasis role="strong">DNA Eclipse Plugins</emphasis>
-              enable Eclipse users to access the contents of a JBoss DNA repository.
-            </para>
-          </listitem>
-          <listitem>
-            <para>
-              <emphasis role="strong">DNA JDBC Driver</emphasis>
-              provides a driver implementation, allowing JDBC-aware applications to connect to and use a JBoss DNA repository.
-            </para>
-          </listitem>
-          <listitem>
-            <para>
-              <emphasis role="strong">DNA Remote JCR</emphasis>
-              is a client-side component for accessing remote JCR repositories.
-            </para>
-          </listitem>
-          <listitem>
-            <para>
-              <emphasis role="strong">DNA Web Application</emphasis>
-              is used by end users and domain experts to visualize, search, edit, change and tag the repository content. The web
-              application uses views to define how different types of information are to be presented and edited in
-              domain-specific ways. The goal is that this web application is easily customized and branded for inclusion into
-              other solutions and application systems. The DNA Web Application operates upon any JCR-compliant repository,
-              although it does rely upon the DNA analysis and templating services.
-            </para>
-          </listitem>
-          <listitem>
-            <para>
-              <emphasis role="strong">DNA Publishing Server</emphasis>
-              allows content to be downloaded, uploaded, and edited using the Atom Publishing Protocol. With the DNA Publishing
-              Server, the content of the repository can easily be created, read, edited, and deleted using the standard HTTP
-              operations of POST, GET, PUT, and DELETE (respectively). More and more tools are being created that support working
-              with Atom Publishing servers. The DNA Publishing Server operates upon any JCR-compliant repository.
-            </para>
-          </listitem>
-          <listitem>
-            <para>
-              <emphasis role="strong">DNA WebDAV Server</emphasis>
-              allows clients such as Microsoft Windows and Apple OS X to connect to, read, and edit the content in the repository
-              using the WebDAV standard. Since WebDAV is an extension of HTTP, web browsers are able to read (but not modify) the
-              content served by a WebDAV compliant server. The DNA WebDAV Server operates upon any JCR-compliant repository.
-            </para>
-          </listitem>
-          <listitem>
-            <para>
-              <emphasis role="strong">DNA Sequencers</emphasis>
-              are pluggable components that make it possible for content to be uploaded to the repository and automatically
-              processed to extract meaningful structure and place that structure in the repository. Once this information is in
-              the repository, it can be viewed, edited, analyzed, searched, and related to other content. DNA defines a Java
-              interface that sequencers must implement. DNA sequencers operate upon any JCR-compliant repository.
-            </para>
-          </listitem>
-          <listitem>
-            <para>
-              <emphasis role="strong">DNA Analyses</emphasis>
-              are pluggable components that analyze content and the relationships between content to generate reports or to answer
-              queries. DNA will include some standard analyzers, like dependency analysis and similarity analysis, that are
-              commonly needed by many different solutions. DNA analyzers operate upon any JCR-compliant repository.
-            </para>
-          </listitem>
-          <listitem>
-            <para>
-              <emphasis role="strong">DNA Views</emphasis>
-              are definitions of how types of information are to be presented in a user interface to allow for creation, reading,
-              editing, and deletion of information. DNA view definitions consist of data stored in a JCR repository, and as such
-              views can be easily added, changed or removed entirely by using the DNA Web Application, requiring no programming.
-            </para>
-          </listitem>
-          <listitem>
-            <para>
-              <emphasis role="strong">DNA Federation</emphasis>
-              is an implementation of the JCR API that builds the content within the repository by accessing and integrating
-              information from multiple sources. DNA Federation allows the integration of external systems, like other JCR
-              repositories, databases, applications, and services.
-            </para>
-          </listitem>
-          <listitem>
-            <para>
-              <emphasis role="strong">DNA Connectors</emphasis>
-              are used to communicate with these external sources of information. In the federation engine, each source is able to
-              contribute node structure and node properties to any part of the federated graph, although typically many connectors
-              will contribute most of their information to isolated subgraphs. The result is that integration from a wide range of
-              systems can be integrated and accessed through the DNA Web Application, DNA Publishing Server, and DNA WebDAV
-              Server. Connectors also may optionally participate in distributed transactions by exposing an XAResource.
-            </para>
-          </listitem>
-          <listitem>
-            <para>
-              <emphasis role="strong">DNA Maven</emphasis>
-              is a classloader library compatible with Maven 2 project dependencies. This allows the creation of Java ClassLoader
-              instances using Maven 2 style paths, and all dependencies are transitively managed and included.
-            </para>
-          </listitem>
-        </itemizedlist>
-      </para>
-      <para>
-        Continue reading the rest of this chapter for more detail about the
-        <link linkend="sequencers">sequencing framework</link>
-        available in this release, or the
-        <link linkend="federation">federation engine</link>
-        and
-        <link linkend="federation_connectors">connectors</link>
-        that will be the focus of the next release. Or, skip to the
-        <link linkend="downloading_and_running">examples</link>
-        to see how to start using JBoss DNA &versionNumber;
-        today. 
-      </para>
-    </sect1>
-    <sect1 id="sequencers">
-      <title>Sequencing content</title>
-      <para> The current JBoss DNA release contains a sequencing framework that is designed to sequence data (typically files)
-        stored in a JCR repository to automatically extract meaningful and useful information. This additional information is then
-        saved back into the repository, where it can be accessed and used.</para>
-      <para> In other words, you can just upload various kinds of files into a JCR repository, and DNA automatically processes
-        those files to extract meaningful structured information. For example, load DDL files into the repository, and let
-        sequencers extract the structure and metadata for the database schema. Load Hibernate configuration files into the
-        repository, and let sequencers extract the schema and mapping information. Load Java source into the repository, and let
-        sequencers extract the class structure, JavaDoc, and annotations. Load a PNG, JPEG, or other image into the repository,
-        and let sequencers extract the metadata from the image and save it in the repository. The same with XSDs, WSDL, WS
-        policies, UML, MetaMatrix models, etc.</para>
-      <para>
-        JBoss DNA sequencers sit on top of existing JCR repositories (including federated repositories) - they basically extract
-        more useful information from what's already stored in the repository. And they use the existing JCR versioning system. Each
-        sequencer typically processes a single kind of file format or a single kind of content. </para>
-      <para>The following sequencers are included in JBoss DNA:
-        <itemizedlist>
-          <listitem>
-            <para>
-              <emphasis role="strong">Image sequencer</emphasis>
-              - A sequencer that processes the binary content of an image file, extracts the metadata for the image, and then
-              writes that image metadata to the repository. It gets the file format, image resolution, number of bits per pixel
-              (and optionally number of images), comments and physical resolution from JPEG, GIF, BMP, PCX, PNG, IFF, RAS, PBM,
-              PGM, PPM, and PSD files. (This sequencer may be improved in the future to also extract EXIF metadata from JPEG
-              files; see
-              <ulink url="http://jira.jboss.org/jira/browse/DNA-26">DNA-26</ulink>
-              .)
-            </para>
-          </listitem>
-          <listitem>
-            <para>
-              <emphasis role="strong">MP3 sequencer</emphasis>
-              - A sequencer that processes the contents of an MP3 audio file, extracts the metadata for the file, and then
-              writes that image metadata to the repository. It gets the title, author, album, year, and comment.  
-              (This sequencer may be improved in the future to also extract other ID3 metadata from other audio file formats; see
-              <ulink url="http://jira.jboss.org/jira/browse/DNA-66">DNA-26</ulink>
-              .)
-            </para>
-          </listitem>
-        </itemizedlist>
-      </para>
-      <para>
-        As the community develops additional sequencers, they will also be included in JBoss DNA. Some of those that have been
-        identified as being useful include:
-        <itemizedlist>
-          <listitem>
-            <para>
-              <emphasis role="strong">XML Schema Document (XSD) Sequencer</emphasis>
-              - Process XSD files and extract the various elements, attributes, complex types, simple types, groups, and other
-              information. (See
-              <ulink url="http://jira.jboss.org/jira/browse/DNA-32">DNA-32</ulink>
-              )
-            </para>
-          </listitem>
-          <listitem>
-            <para>
-              <emphasis role="strong">Web Service Definition Language (WSDL) Sequencer</emphasis>
-              - Process WSDL files and extract the services, bindings, ports, operations, parameters, and other information. (See
-              <ulink url="http://jira.jboss.org/jira/browse/DNA-33">DNA-33</ulink>
-              )
-            </para>
-          </listitem>
-          <listitem>
-            <para>
-              <emphasis role="strong">Hibernate File Sequencer</emphasis>
-              - Process Hibernate configuration (cfg.xml) and mapping (hbm.xml) files to extract the configuration and mapping
-              information. (See
-              <ulink url="http://jira.jboss.org/jira/browse/DNA-61">DNA-61</ulink>
-              )
-            </para>
-          </listitem>
-          <listitem>
-            <para>
-              <emphasis role="strong">XML Metadata Interchange (XMI) Sequencer</emphasis>
-              - Process XMI documents that contain UML models or models using another metamodel, extracting the model structure
-              into the repository. (See
-              <ulink url="http://jira.jboss.org/jira/browse/DNA-31">DNA-31</ulink>
-              )
-            </para>
-          </listitem>
-          <listitem>
-            <para>
-              <emphasis role="strong">ZIP Archive Sequencer</emphasis>
-              - Process ZIP archive files to extract (explode) the contents into the repository. (See
-              <ulink url="http://jira.jboss.org/jira/browse/DNA-63">DNA-63</ulink>
-              )
-            </para>
-          </listitem>
-          <listitem>
-            <para>
-              <emphasis role="strong">Java Archive (JAR) Sequencer</emphasis>
-              - Process JAR files to extract (explode) the contents into the classes and file resources. (See
-              <ulink url="http://jira.jboss.org/jira/browse/DNA-64">DNA-64</ulink>
-              )
-            </para>
-          </listitem>
-          <listitem>
-            <para>
-              <emphasis role="strong">Java Class File Sequencer</emphasis>
-              - Process Java class files (bytecode) to extract the class structure (including annotations) into the repository.
-              (See
-              <ulink url="http://jira.jboss.org/jira/browse/DNA-62">DNA-62</ulink>
-              )
-            </para>
-          </listitem>
-          <listitem>
-            <para>
-              <emphasis role="strong">Java Source File Sequencer</emphasis>
-              - Process Java source files to extract the class structure (including annotations) into the repository. (See
-              <ulink url="http://jira.jboss.org/jira/browse/DNA-51">DNA-51</ulink>
-              )
-            </para>
-          </listitem>
-          <listitem>
-            <para>
-              <emphasis role="strong">PDF Sequencer</emphasis>
-              - Process PDF files to extract the document metadata, including table of contents. (See
-              <ulink url="http://jira.jboss.org/jira/browse/DNA-50">DNA-50</ulink>
-              )
-            </para>
-          </listitem>
-          <listitem>
-            <para>
-              <emphasis role="strong">Maven 2 POM Sequencer</emphasis>
-              - Process Maven 2 Project Object Model (POM) files to extract the project information, dependencies, plugins, and
-              other content. (See
-              <ulink url="http://jira.jboss.org/jira/browse/DNA-24">DNA-24</ulink>
-              )
-            </para>
-          </listitem>
-          <listitem>
-            <para>
-              <emphasis role="strong">Data Definition Language (DDL) Sequencer</emphasis>
-              - Process various dialects of DDL, including that from Oracle, SQL Server, MySQL, PostgreSQL, and others. May need
-              to be split up into a different sequencer for each dialect. (See
-              <ulink url="http://jira.jboss.org/jira/browse/DNA-26">DNA-26</ulink>
-              )
-            </para>
-          </listitem>
-          <listitem>
-            <para>
-              <emphasis role="strong">MP3 and MP4 Sequencer</emphasis>
-              - Process MP3 and MP4 audio files to extract the name of the song, artist, album, track number, and other metadata.
-              (See
-              <ulink url="http://jira.jboss.org/jira/browse/DNA-30">DNA-30</ulink>
-              )
-            </para>
-          </listitem>
-        </itemizedlist>
-      </para>
-      <para>
-        The
-        <link linkend="using_dna">examples</link>
-        in this book go into more detail about how sequencers are managed and used, and
-        <link linkend="custom_sequencers">Chapter 5</link>
-        goes into detail about how to write custom sequencers.
-      </para>
-    </sect1>
-    <sect1 id="federation">
-      <title>Federating content</title>
-      <para>There is a lot of information stored in many of different places: databases, repositories, SCM systems,
-        registries, file systems, services, etc. The purpose of the federation engine is to allow applications to use the JCR API
-        to access that information as if it were all stored in a single JCR repository, but to really leave the information where
-        it is.</para>
-      <para>Why not just move the information into a JCR repository? Most likely there are existing applications that rely upon
-        that information being where it is. If we were to move it, then all those applications would break. Or they'd have to be
-        changed to use JCR. If the information is being used, the most practical thing is to leave it where it is.</para>
-      <para>
-        Then why not just copy the information into a JCR repository? Actually, there are times when it's perfectly reasonable to
-        make a copy of the data. Perhaps the system managing the existing information cannot handle the additional load of more
-        clients. Or, perhaps the information doesn't change, or it does change and we want snapshots that don't change. But more
-        likely, the data
-        <emphasis>does</emphasis>
-        change. So if applications are to use the most current information and we make copies of the data, we have to keep the
-        copies synchronized with the master. That's generally a lot of work.
-      </para>
-      <para>The JBoss DNA federation engine lets us leave the information where it is, yet lets client applications use the JCR
-        API to access all the information without caring where the information really exists. If the underlying information
-        changes, client applications using JCR observation will be notified of the changes. If a JBoss DNA federated repository is
-        configured to allow updates, client applications can change the information in the repository and JBoss DNA will propagate
-        those changes down to the original source.</para>
-      <sect2 id="federation_connectors">
-        <title>Connecting to information sources</title>
-        <para>
-          The JBoss DNA federation engine will use connectors to interact with different information sources to get at the content
-          in those systems. Some ideas for connectors include:
-          <itemizedlist>
-            <listitem>
-              <para>
-                <emphasis role="strong">JCR Repository Connector</emphasis>
-                - Connect to and interact with other JCR repositories.
-              </para>
-            </listitem>
-            <listitem>
-              <para>
-                <emphasis role="strong">File System Connector</emphasis>
-                - Expose the files and directories on a file system through JCR.
-              </para>
-            </listitem>
-            <listitem>
-              <para>
-                <emphasis role="strong">Maven 2 Repository Connector</emphasis>
-                - Access and expose the contents of a Maven 2 repository (either on the local file system or via HTTP) through
-                JCR.
-              </para>
-            </listitem>
-            <listitem>
-              <para>
-                <emphasis role="strong">JDBC Metadata Connector</emphasis>
-                - Connect to relational databases via JDBC and expose their schema as content in a repository.
-              </para>
-            </listitem>
-            <listitem>
-              <para>
-                <emphasis role="strong">UDDI Connector</emphasis>
-                - Interact with UDDI registries to integrate their content into a repository.
-              </para>
-            </listitem>
-            <listitem>
-              <para>
-                <emphasis role="strong">SVN Connector</emphasis>
-                - Interact with Subversion software configuration management (SCM) repositories to expose the managed resources
-                through JCR. Consider using the
-                <ulink url="http://svnkit.com/">SVNkit</ulink>
-                (dual license) library for an API into Subversion.
-              </para>
-            </listitem>
-            <listitem>
-              <para>
-                <emphasis role="strong">CVS Connector</emphasis>
-                - Interact with CVS software configuration management (SCM) repositories to expose the managed resources through
-                JCR.
-              </para>
-            </listitem>
-            <listitem>
-              <para>
-                <emphasis role="strong">JDBC Storage Connector</emphasis>
-                - Store and access information in a relational database. Also useful for persisting information in the federated
-                repository not stored elsewhere.
-              </para>
-            </listitem>
-            <listitem>
-              <para>
-                <emphasis role="strong">Distributed Database Connector</emphasis>
-                - Store and access information in a
-                <ulink url="http://www.hypertable.org/">Hypertable</ulink>
-                or
-                <ulink url="http://hadoop.apache.org/hbase/">HBase</ulink>
-                distributed databases. Also useful for persisting information in the federated repository not stored elsewhere.
-              </para>
-            </listitem>
-          </itemizedlist>
-        </para>
-        <para>
-          If the connectors allow the information they contribute to be updated, they must provide an
-          <code>XAResource</code>
-          implementation that can be used with a Java Transaction Service. Connectors that provide read-only access need not
-          provide an implementation.
-        </para>
-        <para>
-          Also, connectors talk to
-          <emphasis>sources</emphasis>
-          of information, and it's quite likely that the same connector is used to talk to different sources. Each source contains
-          the configuration details (e.g., connection information, location, properties, options, etc.) for working with that
-          particular source, as well as a reference to the connector that should be used to establish connections to the source.
-          And of course, sources can be added or removed without having to stop and restart the federated repository.
-        </para>
-      </sect2>
-      <sect2 id="federation_graph">
-        <title>Building the unified graph</title>
-        <para> The federation engine works by effectively building up a single graph by querying each source and merging or
-          unifying the responses. This information is cached, which improves performance, reduces the number of (potentially
-          expensive) remote calls, reduces the load on the sources, and helps mitigate problems with source availability. As
-          clients interact with the repository, this cache is consulted first. When the requested portion of the graph (or
-          "subgraph") is contained completely in the cache, it is retuned immediately. However, if any part of the requested
-          subgraph is not in the cache, each source is consulted for their contributions to that subgraph, and any results are
-          cached.</para>
-        <para> This basic flow makes it possible for the federated repository to build up a local cache of the integrated graph
-          (or at least the portions that are used by clients). In fact, the federated repository caches information in a manner
-          that is similar to that of the Domain Name System (DNS). As sources are consulted for their contributions, the source
-          also specifies whether it is the authoritative source for this information (some sources that are themselves federated
-          may not be the information's authority), whether the information may be modified, the time-to-live (TTL) value (the time
-          after which the cached information should be refreshed), and the expiration time (the time after which the cached
-          information is no longer valid). In effect, the source has complete control over how the information it contributes is
-          cached and used.</para>
-        <para>
-          The federated repository also needs to incorporate
-          <emphasis>negative caching</emphasis>
-          , which is storage of the knowledge that something does not exist. Sources can be configured to contribute information
-          only below certain paths (e.g.,
-          <code>/A/B/C</code>
-          ), and the federation engine can take advantage of this by never consulting that source for contributions to information
-          on other paths. However, below that path, any negative responses must also be cached (with appropriate TTL and expiry
-          parameters) to prevent the exclusion of that source (in case the source has information to contribute at a later time)
-          or the frequent checking with the source.
-        </para>
-      </sect2>
-      <sect2 id="federation_queries">
-        <title>Searching and querying</title>
-        <para> The JBoss DNA federated repository will also support queries against the integrated and unified graph. In some
-          situations the query can be determined to apply to a single source, but in most situations the query must be planned
-          (and possibly rewritten) such that it can be pushed down to all the appropriate sources. Also, the cached results must
-          be consulted prior to returning the query results, as the results from one source might have contributions from another
-          source.</para>
-        <note>
-          <para> It is hoped that the MetaMatrix query engine can be used for this purpose after it is open-sourced. This engine
-            implements sophisticated query planning and optimization techniques for working efficiently with multiple sources.
-          </para>
-        </note>
-        <para>Searching the whole federated repository is also important. This allows users to simply supply a handful of
-          search terms, and to get results that are ranked based upon how close each result is to the search terms. (Searching is
-          very different from querying, which involves specifying the exact semantics of what is to be searched and how the
-          information is to be compared.) JBoss DNA will incorporate a search engine (e.g., likely to be Lucene) and will populate
-          the engine's indexes using the federated content and the cached information. Notifications of changing information will
-          be reflected in the indexes, but some sources may want to explicitly allow or disallow periodic crawling of their
-          content.</para>
-      </sect2>
-      <sect2 id="federation_updates">
-        <title>Updating content</title>
-        <para>
-          The JBoss DNA federated repositories also make it possible for client applications to make changes to the unified graph
-          within the context of distributed transactions. According to the JCR API, client applications use the Java Transaction
-          API (JTA) to control the boundaries of their transactions. Meanwhile, the federated repository uses a
-          <ulink url="http://www.jboss.org/jbosstm/">distributed transaction service</ulink>
-          to coordinate the XA resources provided by the connectors.
-        </para>
-        <para> It is quite possible that clients add properties to nodes in the unified graph, and that this information cannot be
-          handled by the same underlying source that contributed to the node. In this case, the federated repository can be
-          configured with a fallback source that will be used used to store this "extra" information.</para>
-        <para>
-          It is a goal that non-XA sources (i.e., sources that use connectors without XA resources) can participate in distributed
-          transactions through the use of
-          <emphasis>compensating transactions</emphasis>
-          . Because the JBoss DNA federation engine implements the JCR observation system, it is capable of recording all of the
-          changes made to the distributed graph (and those changes sent to each updatable source). Therefore, if a non-XA source
-          is involved in a distributed transaction that must be rolled back, any changes made to non-XA sources can be undone. (Of
-          course, this does not make the underlying source transactional: non-transactional sources still may expose the interim
-          changes to other clients.)
-        </para>
-      </sect2>
-      <sect2 id="federation_events">
-        <title>Observing changes</title>
-        <para> The JCR API supports observing a repository to receive notifications of additions, changes and deletions of nodes
-          and properties. The JBoss DNA federated repository will support this API through two primary means.</para>
-        <para> When the changes are made through the federated repository, the JBoss DNA federation engine is well aware of the
-          set of changes that have been (or are being) made to the unified graph. These events are directly propagated to
-          listeners.</para>
-        <para> Sources have the ability to publish events, making it possible for the JBoss DNA federation engine and clients that
-          have registered listeners to be notified of changes in the information managed by that source. These events are first
-          processed by the federation engine and possibly altered based upon contributions from other sources. (The federation
-          engine also uses these events to update or purge information in the cache, which may add to the event set.) The
-          resulting (and possibly altered) event set is then sent to all client listeners.</para>
-      </sect2>
-    </sect1>
-  </chapter>
-  <!--  ====================================================================================================
-                                                   Chapter 
-        ====================================================================================================   -->
-  <chapter id="downloading_and_running">
-    <title>Running the example application</title>
-    <para>
-      This chapter provides instructions for downloading and running a sample application that demonstrates how JBoss DNA works
-      with a JCR repository to automatically sequence changing content to extract useful information. So read on to get the simple
-      application running, and then in the
-      <link linkend="using_dna">next chapter</link>
-      we'll dive into the source code for the example and show how to use JBoss DNA in your own applications.
-    </para>
-    <para>JBoss DNA uses Maven 2 for its build system, as is 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>
-    <note>
-      <para>
-        To use Maven with JBoss DNA, you'll need to have
-        <ulink url="http://java.sun.com/javase/downloads/index_jdk5.jsp">JDK 5 or 6</ulink>
-        and Maven 2.0.7 (or higher).
-      </para>
-      <para>
-        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.7-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:
-        <programlisting role="XML" language="xml">&lt;settings&gt;
-  &lt;profiles&gt;
-    &lt;profile&gt;
-      &lt;id&gt;jboss.repository&lt;/id&gt;
-      &lt;activation&gt;
-        &lt;property&gt;          
-          &lt;name&gt;!jboss.repository.off&lt;/name&gt;
-        &lt;/property&gt;
-      &lt;/activation&gt;
-      &lt;repositories&gt;
-        &lt;repository&gt;
-          &lt;id&gt;snapshots.jboss.org&lt;/id&gt;
-          &lt;url&gt;http://snapshots.jboss.org/maven2&lt;/url&gt;
-          &lt;snapshots&gt;
-            &lt;enabled&gt;true&lt;/enabled&gt;
-          &lt;/snapshots&gt;
-        &lt;/repository&gt;
-        &lt;repository&gt;
-          &lt;id&gt;repository.jboss.org&lt;/id&gt;
-          &lt;url&gt;http://repository.jboss.org/maven2&lt;/url&gt;
-          &lt;snapshots&gt;
-            &lt;enabled&gt;false&lt;/enabled&gt;
-          &lt;/snapshots&gt;
-        &lt;/repository&gt;
-      &lt;/repositories&gt;
-      &lt;pluginRepositories&gt;
-        &lt;pluginRepository&gt;
-          &lt;id&gt;repository.jboss.org&lt;/id&gt;
-          &lt;url&gt;http://repository.jboss.org/maven2&lt;/url&gt;
-          &lt;snapshots&gt;
-            &lt;enabled&gt;false&lt;/enabled&gt;
-          &lt;/snapshots&gt;
-        &lt;/pluginRepository&gt;
-        &lt;pluginRepository&gt;
-          &lt;id&gt;snapshots.jboss.org&lt;/id&gt;
-          &lt;url&gt;http://snapshots.jboss.org/maven2&lt;/url&gt;
-          &lt;snapshots&gt;
-            &lt;enabled&gt;true&lt;/enabled&gt;
-          &lt;/snapshots&gt;
-        &lt;/pluginRepository&gt;
-      &lt;/pluginRepositories&gt;
-    &lt;/profile&gt;
-  &lt;/profiles&gt;
-&lt;/settings&gt;</programlisting>
-        This profile informs Maven of the two JBoss repositories (snapshots and releases) that contain 
-        all of the JARs for JBoss DNA and all dependent libraries.</para>
-      </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.1/jboss-dna-0.1-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:
-  <programlisting>
-examples/pom.xml
-         sequencers/pom.xml
-                   /src/main/assembly
-                            /config
-                            /java
-                            /resources
-                       /test/java
-                            /resources
-  </programlisting>
-      </para>
-      <para>There are essentially two Maven projects: a <code>sequencers</code> project and a parent project.  All of the source
-      for the example is located in the <code>sequencers</code> subdirectory.  And you may have noticed that none
-      of the JBoss DNA libraries are there.  This is where Maven comes in.  The two <code>pom.xml</code> files tell
-      Maven everything it needs to know about what libraries are required and how to build the example.</para>
-      <para>In a terminal, go to the <code>examples</code> directory and run <emphasis role="strong"><code>mvn install</code></emphasis>.  
-      This command downloads all of the JARs necessary to compile and build the example, including the JBoss DNA libraries,
-      the libraries they depend on, and any missing Maven components.  (These are downloaded from the JBoss repositories
-      only once and saved on your machine.  This means that the next time you run Maven, all the libraries will
-      already be available locally, and the build will run much faster.)  The command then continues by compiling the example's source
-      code (and unit tests) and running the unit tests.  The build is successful if you see the following:
-           <programlisting language="bash">$ mvn install
-...
-[INFO] ------------------------------------------------------------------------
-[INFO] Reactor Summary:
-[INFO] ------------------------------------------------------------------------
-[INFO] Getting Started examples .............................. SUCCESS [2.106s]
-[INFO] Sequencer Examples .................................... SUCCESS [9.768s]
-[INFO] ------------------------------------------------------------------------
-[INFO] ------------------------------------------------------------------------
-[INFO] BUILD SUCCESSFUL
-[INFO] ------------------------------------------------------------------------
-[INFO] Total time: 12 seconds
-[INFO] Finished at: Wed May 07 12:00:06 CDT 2008
-[INFO] Final Memory: 14M/28M
-[INFO] ------------------------------------------------------------------------
-$ </programlisting>
-      If there are errors, check whether you have the correct version of Maven installed and that you've correctly updated
-           your Maven settings as described above.</para>
-    <para>If you've successfully built the examples, there will be a <code>examples/sequencers/target/dna-example-sequencers-basic.dir/</code>
-    directory that contains the following:
-    <itemizedlist>
-  	<listitem>
-  	  <para><emphasis role="strong"><code>run.sh</code></emphasis> is the *nix shell script that will run the example.</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>jackrabbitConfig.xml</code>
-        </emphasis>
-        is the Jackrabbit configuration file, which is set up to use a transient in-memory repository.
-      </para>
-    </listitem>
-    <listitem>
-      <para>
-        <emphasis role="strong">
-          <code>jackrabbitNodeTypes.cnd</code>
-        </emphasis>
-        defines the additional JCR node types used by this example.
-      </para>
-    </listitem>
-    <listitem>
-      <para>
-        <emphasis role="strong">
-          <code>sample1.mp3</code>
-        </emphasis>
-        is a sample MP3 audio file you'll use later to upload into the repository.
-      </para>
-    </listitem>
-    <listitem>
-      <para>
-        <emphasis role="strong">
-          <code>caution.gif</code>
-        </emphasis>, <emphasis role="strong">
-          <code>caution.png</code>
-        </emphasis>, and <emphasis role="strong">
-          <code>caution.jpg</code>
-        </emphasis>
-        are images that you'll use later and upload into the repository.
-      </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 example.
-      </para>
-    </listitem>
-    </itemizedlist>
-    <note>
-      <para>JBoss DNA 0.1 and the examples are currently tested with <ulink url="http://jackrabbit.apache.org/">Apache Jackrabbit</ulink> version 1.3.3.  
-      This version is stable and used by a number of other projects and applications.  However, you should be able to use a newer
-      version of Jackrabbit, as long as that version uses the same JCR API.  For example, version 1.4.2 was released on March 26, 2008 and
-      should be compatible.
-      </para>
-      <para>Just remember, if the version of Jackrabbit you want to use for these examples is not in the Maven repository,
-      you'll have to either add it or add it locally.  For more information, see the <ulink url="http://maven.apache.org/">Maven documentation</ulink>.
-      </para>
-    </note>
-    </para>
-  </sect1>
-  <sect1 id="running">
-    <title>Running the example</title>
-    <para>This 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>
-    <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">
-        <title>Example Client</title>
-        <graphic align="center" scale="100" fileref="images/example-sequencer-cli-client.png" />
-      </figure>
-      From this menu, you can upload a file into the repository, search for media in the repository, print sequencing statistics,
-      or quit the application.
-    </para>
-    <para>
-      The first step is to upload one of the example images. If you type 'u' and press return, you'll be prompted to supply the
-      path to the file you want to upload. Since the application is running from within the
-      <code>examples/sequencers/target/dna-example-sequencers-basic.dir/
-      </code>
-      directory, you can specify any of the files in that directory without specifying the path:
-      <figure id="example-sequencer-upload">
-        <title>Uploading an image using the Example Client</title>
-        <graphic align="center" scale="100" fileref="images/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 and MP3 audio files and 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>
-      . Files with other extensions in the repository path will be ignored. For your convenience, the example provides several
-      files that will be sequenced (
-      <code>caution.png</code>
-      ,
-      <code>caution.jpg</code>
-      ,
-      <code>caution.gif</code>
-      , and
-      <code>sample1.mp3</code>
-      ) and one image that will not be sequenced (
-      <code>caution.pict</code>
-      ). Feel free to try other files.
-    </para>
-    <para>
-      After you have specified the file you want to upload, the example application asks you where in the repository you'd like to
-      place the file. (If you want to use the suggested location, just press
-      <code>return</code>
-      .) The client application uses the JCR API to upload the file to that location in the repository, creating any nodes (of
-      type
-      <code>nt:folder</code>
-      ) for any directories that don't exist, and creating a node (of type
-      <code>nt:file</code>
-      ) for the file. And, per the JCR specification, the application creates a
-      <code>jcr:content</code>
-      node (of type
-      <code>nt:resource</code>
-      ) under the file node. The file contents are placed on this
-      <code>jcr:content</code>
-      node in the
-      <code>jcr:data</code>
-      property. For example, if you specify
-      <code>/a/b/caution.png</code>
-      , the following structure will be created in the repository:<programlisting>
-    /a   (nt:folder)
-      /b   (nt:folder)
-        /caution.png   (nt:file)
-                    /jcr:content    (nt:resource)
-                                @jcr:data = {contents of the file}
-                                @jcr:mimeType = {mime type of the file}
-                                @jcr:lastModified = {now}
-    </programlisting>
-    Other kinds of files are treated in a similar way.
-    </para>
-  <para>
-    When the client uploads the file using the JCR API, DNA gets notified of the changes, consults the sequencers to see whether
-    any of them are interested in the new or updated content, and if so runs those sequencers. The image sequencer processes image
-    files for metadata, and any metadata found is stored under the
-    <code>/images</code>
-    branch of the repository. The MP3 sequencer processes MP3 audio files for metadata, and any metadata found is stored under the
-    <code>/mp3s</code>
-    branch of the repository.  All of this happens asynchronously, so any DNA activity doesn't impede or slow down the client
-    activities.
-  </para>
-  <para>
-    So, after the file is uploaded, you can search the repository for the image metadata using the "s" menu option:
-    <figure id="example-sequencer-search">
-      <title>Searching for media using the Example Client</title>
-      <graphic align="center" scale="100" fileref="images/example-sequencer-search.png" />
-    </figure>
-    Here are the search results after the <code>sample1.mp3</code> audio file has been uploaded (to the <code>/a/b/sample1.mp3</code> location):
-    <figure id="example-sequencer-search-with-mp3">
-      <title>Searching for media using the Example Client</title>
-      <graphic align="center" scale="100" fileref="images/example-sequencer-search-with-mp3.png" />
-    </figure>
-    You can also display the sequencing statistics using the "d" menu option:
-    <figure id="example-sequencer-statistics">
-      <title>Sequencing statistics using the Example Client</title>
-      <graphic align="center" scale="100" fileref="images/example-sequencer-statistics.png" />
-    </figure>
-    These stats show how many nodes were sequenced, and how many nodes were skipped because they didn't apply to the sequencer's
-    criteria.
-  </para>
-  <note>
-    <para>
-      There will probably be more nodes skipped than sequenced, since there are more
-      <code>nt:folder</code>
-      and
-      <code>nt:resource</code>
-      nodes than there are
-      <code>nt:file</code>
-      nodes with acceptable names.
-    </para>
-  </note>
-  <para>You can repeat this process with other files. Any file that isn't an image or MP3 files (as recognized by the sequencing configurations
-    that we'll describe later) will not be sequenced.</para>
-  </sect1>
-  <sect1 id="downloading_and_running_review">
-    <title>Summarizing what we just did</title>
-    <para>In this chapter you downloaded and installed the example application and used it to upload files into a
-    JCR repository.  JBoss DNA automatically sequenced the image and/or MP3 files you uploaded, extracted the metadata from the
-    files, and stored that metadata inside the repository.  The application allowed you to see this metadata
-    and the sequencing statistics.</para>
-    <para>This application was very simplistic.  In fact, running through the example probably only took you a minute or two.
-    So while this application won't win any awards, it does show the basics of what JBoss DNA can do.</para>
-    <para>In the <link linkend="using_dna">next chapter</link> we'll venture into the code to get an understanding
-    of how JBoss DNA actually works and how you can use it in your own applications.</para>
-  </sect1>
-  </chapter>
-  
-  <!--  ====================================================================================================
-                                                   Chapter 
-        ====================================================================================================   -->
-<chapter id="using_dna">
-  <title>Using JBoss DNA</title>
-  <para>As we've mentioned before, JBoss DNA is able to work with existing JCR repositories.  Your client applications
-  make changes to the information in those repositories, and JBoss DNA automatically uses its sequencers to extract
-  additional information from the uploaded files.</para>
-  <note>
-    <para>Configuring JBoss DNA sequencers is a bit more manual than is ideal. As you'll see, JBoss DNA uses dependency
-      injection to allow a great deal of flexibility in how it can be configured and customized. However, the next release will
-      provide a much easier mechanism for configuring not only the sequencer service but also the upcoming federation engine and
-      JCR implementation.</para>
-  </note>
-  <sect1 id="sequencing_service">
-    <title>Configuring the Sequencing Service</title>
-    <para>
-      The JBoss DNA <emphasis>sequencing service</emphasis> is the component that manages the <emphasis>sequencers</emphasis>
-      , reacting to changes in JCR repositories and then running the appropriate sequencers.
-      This involves processing the changes on a node, determining which (if any) sequencers should be run on that node,
-      and for each sequencer constructing the execution environment, calling the sequencer, and saving the information
-      generated by the sequencer.</para>
-    <para>To set up the sequencing service, an instance is created, and dependent components are injected into
-      the object.  This includes among other things:
-      <itemizedlist>
-        <listitem>
-          <para>An <emphasis>execution context</emphasis> that defines the context in which the service runs, including
-        a factory for JCR sessions given names of the repository and workspace.  This factory must be configured,
-        and is how JBoss DNA knows about your JCR repositories and how to connect to them.  More on this a bit later.</para>
-        </listitem>
-        <listitem>
-          <para>An optional <emphasis>factory for class loaders</emphasis> used to load sequencers.  If no factory is supplied,
-        the service uses the current thread's context class loader (or if that is null, the class loader that loaded the
-        sequencing service class).</para>
-        </listitem>
-        <listitem>
-          <para>An <code>java.util.concurrent.ExecutorService</code> used to execute the sequencing activites.  If none
-        is supplied, a new single-threaded executor is created by calling <code>Executors.newSingleThreadExecutor()</code>.
-        (This can easily be changed by subclassing and overriding the <code>SequencerService.createDefaultExecutorService()</code> method.)</para>
-        </listitem>
-        <listitem>
-          <para>Filters for sequencers and events.  By default, all sequencers are considered for "node added", "property added"
-        and "property changed" events.</para>
-        </listitem>
-      </itemizedlist>
-      </para>
-      <para>As mentioned above, the <code>ExecutionContext</code> provides access to a <code>SessionFactory</code> that is used
-      by JBoss DNA to establish sessions to your JCR repositories.  Two implementations are available:
-      <itemizedlist>
-        <listitem>
-          <para>The <code>JndiSessionFactory</code> looks up JCR <code>Repository</code> instances in JNDI using
-          names that are supplied when creating sessions.  This implementation also has methods to set the
-          JCR <code>Credentials</code> for a given workspace name.</para>
-        </listitem>
-        <listitem>
-          <para>The <code>SimpleSessionFactory</code> has methods to register the JCR <code>Repository</code> instances
-          with names, as well as methods to set the JCR <code>Credentials</code> for a given workspace name.</para>
-        </listitem>
-      </itemizedlist>
-      You can use the <code>SimpleExecutionContext</code> implementation of <code>ExecutionContext</code> and supply
-      a <code>SessionFactory</code> instance, or you can provide your own implementation.
-      </para>
-      <para>Here's an example of how to instantiate and configure the SequencingService:
-      <programlisting>
-SimpleSessionFactory sessionFactory = new SimpleSessionFactory();
-sessionFactory.registerRepository("Main Repository", this.repository);
-Credentials credentials = new SimpleCredentials("jsmith", "secret".toCharArray());
-sessionFactory.registerCredentials("Main Repository/Workspace1", credentials);
-ExecutionContext executionContext = new SimpleExecutionContext(sessionFactory);
-
-// Create the sequencing service, passing in the execution context ...
-SequencingService sequencingService = new SequencingService();
-sequencingService.setExecutionContext(executionContext);</programlisting>
-      </para>
-      <para>After the sequencing service is created and configured, it must be started.  The SequencingService
-      has an <emphasis>administration object</emphasis> (that is an instance of <code>ServiceAdministrator</code>)
-      with <code>start()</code>, <code>pause()</code>, and <code>shutdown()</code> methods.  The latter method will 
-      close the queue for sequencing, but will allow sequencing operations already running to complete normally.
-      To wait until all sequencing operations have completed, simply call the <code>awaitTermination</code> method
-      and pass it the maximum amount of time you want to wait.</para>
-      <para>
-      <programlisting>
-sequencingService.getAdministrator().start();</programlisting>
-      </para>
-      <para>The sequencing service must also be configured with the sequencers that it will use.  This is done using the
-      <code>addSequencer(SequencerConfig)</code> method and passing a <code>SequencerConfig</code> instance that
-      you create.  Here's an example:
-      <programlisting>
-String name = "Image Sequencer";
-String desc = "Sequences image files to extract the characteristics of the image";
-String classname = "org.jboss.dna.sequencer.images.ImageMetadataSequencer";
-String[] classpath = null; // Use the current classpath
-String[] pathExpressions = {"//(*.(jpg|jpeg|gif|bmp|pcx|png))[*]/jcr:content[@jcr:data] => /images/$1"};
-SequencerConfig imageSequencerConfig = new SequencerConfig(name, desc, classname, classpath, pathExpressions);
-sequencingService.addSequencer(imageSequencerConfig);
-
-name = "Mp3 Sequencer";
-desc = "Sequences mp3 files to extract the id3 tags of the audio file";
-classname = "org.jboss.dna.sequencer.mp3.Mp3MetadataSequencer";
-String[] mp3PathExpressions = {"//(*.mp3)[*]/jcr:content[@jcr:data] => /mp3s/$1"};
-SequencerConfig mp3SequencerConfig = new SequencerConfig(name, desc, classname, classpath, mp3PathExpressions);
-sequencingService.addSequencer(mp3SequencerConfig);</programlisting>
-      This is pretty self-explanatory, except for the <code>classpath</code> and <code>pathExpression</code> parameters.
-      The classpath parameter defines the classpath that is passed to the class loader factory mentioned above.
-      Our sequencer is on the classpath, so we can simply use <code>null</code> here.
-      </para>
-      <para>The path expression is more complicated.  Sequencer path expressions are used by the sequencing service to
-      determine whether a particular changed node should be sequenced.  The expressions consist of two parts: a selection
-      criteria and an output expression.  Here's a simple example:
-      <programlisting>
-/a/b/c at title =&gt; /d/e/f</programlisting>
-      Here, the <code>/a/b/c at title</code> is the selection criteria that applies when the <code>/a/b/c</code> node has a <code>title</code> property
-      that is added or changed.  When the selection criteria matches a change event, the sequencer will be run
-      and any generated output will be inserted into the repository described by the output expression.  In this example,
-      the generated output would be placed at the <code>/d/e/f</code> node.
-      </para>
-      <note>
-        <para>Sequencer path expressions can be fairly complex and may use wildcards, specificy same-name sibling indexes,
-        provide optional and choice elements, and may capture parts of the selection criteria for use in the output expression.
-        The path expression used in the image sequencer configuration example above shows a more complex example:
-        <programlisting>
-//(*.(jpg|jpeg|gif|bmp|pcx|png))[*]/jcr:content[@jcr:data] => /images/$1</programlisting>
-        This uses "//" to select any node at any level in the repository whose name ends with "." and one of the extensions (e.g., ".jpg", ".jpeg", etc.)
-        and that has a child node named "jcr:content" that has a "jcr:data" property.  It also selects the file name
-        as the first capture group (the first set of parentheses) for use in the output expression.
-        In this example, any sequencer output is placed on a node with that same file name under the "/images" node.
-        </para>
-        <para></para>
-        <para>Other things are possible, too.  For example, the name of the repository/workspace (as used by the <code>SessionFactory</code>)
-        may be specified at the beginning of the select criteria and/or the output expression.  This means it's possible to place
-        the sequencer output in a different repository than the node being sequenced.</para>
-        <para>For more detail about sequencer path expressions, see the <code>org.jboss.dna.repository.sequencer.SequencerPathExpression</code>
-        class and the corresponding <code>org.jboss.dna.repository.sequencer.SequencerPathExpressionTest</code> test case.</para>
-      </note>
-      <para>After the service is started, it is ready to start reacting to changes in the repository.  But it first
-      must be wired to the repositories using a listener.  This is accomplished using the <code>ObservationService</code>
-      described in the <link linkend="observation_service">next section</link>.</para>
-  </sect1>
-  <sect1 id="observation_service">
-    <title>Configuring the Observation Service</title>
-    <para>The JBoss DNA <code>ObservationService</code> is responsible for listening to one or more JCR repositories
-    and multiplexing the events to its listeners.  Unlike JCR events, this framework embeds in the events the
-    name of the repository and workspace that can be passed to a <code>SessionFactory</code> to obtain a session
-    to the repository in which the change occurred.  This simple design makes it very easy for JBoss DNA to
-    concurrently work with multiple JCR repositories.</para>
-    <para>Configuring an observation service is pretty easy, especially if you reuse the same <code>SessionFactory</code>
-    supplied to the sequencing service.  Here's an example:
-    <programlisting>
-this.observationService = new ObservationService(sessionFactory);
-this.observationService.getAdministrator().start();</programlisting>
-    </para> 
-    <note>
-    <para>Both <code>ObservationService</code> and <code>SequencingService</code> implement
-    <code>AdministeredService</code>, which has a <code>ServiceAdministrator</code> used to start, pause, and shutdown the
-    service.  In other words, the lifecycle of the services are managed in the same way.</para>
-    </note>
-    <para>
-    After the observation service is started, listeners can be added.  The <code>SequencingService</code> implements the required
-    interface, and so it may be registered directly:
-    <programlisting>
-observationService.addListener(sequencingService);</programlisting>
-    </para>
-    <para>Finally, the observation service must be wired to monitor one of your JCR repositories.  This is done with
-    one of the <code>monitor(...)</code> methods:
-    <programlisting>
-int eventTypes = Event.NODE_ADDED | Event.PROPERTY_ADDED | Event.PROPERTY_CHANGED;
-observationService.monitor("Main Repository/Workspace1", eventTypes);</programlisting>
-    </para>
-    <para>At this point, the observation service is listening to a JCR repository and forwarding the appropriate events
-    to the sequencing service, which will asynchronously process the changes and sequence the information added to or changed in the repository.
-    </para>
-  </sect1>
-  <sect1 id="shutting_down">
-    <title>Shutting down JBoss DNA services</title>
-    <para>The JBoss DNA services are utilizing resources and threads that must be released before your application is ready to shut down.
-    The safe way to do this is to simply obtain the <code>ServiceAdministrator</code> for each service (via the <code>getServiceAdministrator()</code> method)
-    and call <code>shutdown()</code>.  As previously mentioned, the shutdown method will simply prevent new work from being processed
-    and will not wait for existing work to be completed.  If you want to wait until the service completes all its work, you must wait
-    until the service terminates.  Here's an example that shows how this is done:
-    <programlisting>
-// Shut down the service and wait until it's all shut down ...
-sequencingService.getAdministrator().shutdown();
-sequencingService.getAdministrator().awaitTermination(5, TimeUnit.SECONDS);
-
-// Shut down the observation service ...
-observationService.getAdministrator().shutdown();
-observationService.getAdministrator().awaitTermination(5, TimeUnit.SECONDS);</programlisting>
-    </para>
-    <para>At this point, we've covered how to configure and use the JBoss DNA services in your application.
-    The next chapter goes back to the <link linkend="downloading_and_running">sample application</link> to show how all these pieces fit together.</para>
-  </sect1>
-  <sect1 id="example_application_review">
-    <title>Reviewing the example application</title>
-    <para>Recall that the example application 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 an image sequencer 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.  Or, if the client uploads
-      MP3 audio files, the title, author, album, year, and comment are extracted from the audio file and stored in the repository.</para>
-    <para>
-      The example is comprised of 3 classes and 1 interface, located in the
-      <code>src/main/java</code>
-      directory:
-      <programlisting>
-  org/jboss/example/dna/sequencers/ConsoleInput.java
-                                  /MediaInfo.java
-                                  /SequencingClient.java
-                                  /UserInterface.java</programlisting>
-    </para>
-    <para>
-      <code>SequencingClient</code>
-      is the class that contains the main application.
-      <code>MediaInfo</code>
-      is a simple Java object that encapsulates metadata about a media file (as generated by the sequencer), and used by the client to
-      pass information to the
-      <code>UserInterface</code>
-      , which 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
-      <code>UserInterface</code>
-      at a later date. 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 automatically using conventional JUnit test cases, as demonstrated by the
-      code in the
-      <code>src/test/java</code>
-      directory:
-      <programlisting>
-  org/jboss/example/dna/sequencers/SequencingClientTest.java
-                                  /MockUserInterface.java</programlisting>
-    </para>
-    <para>
-      If we look at the
-      <code>SequencingClient</code>
-      code, there are a handful of methods that encapsulate the various activities.
-    </para>
-    <note>
-      <para>To keep the code shown in this book as readable as possible, some of the comments and error handling
-      have been removed.</para>
-    </note>
-    <para>
-      The
-      <code>startRepository()</code>
-      method starts up an in-memory Jackrabbit JCR repository. The bulk of this method is simply gathering and passing the
-      information required by Jackrabbit. Because Jackrabbit's
-      <code>TransientRepository</code>
-      implementation shuts down after the last session is closed, the application maintains a session to ensure that the
-      repository remains open throughout the application's lifetime. And finally, the node type needed by the image sequencer is
-      registered with Jackrabbit.
-    </para>
-    <programlisting>
-public void startRepository() throws Exception {
-    if (this.repository == null) {
-        try {
-
-            // Load the Jackrabbit configuration ...
-            File configFile = new File(this.jackrabbitConfigPath);
-            String pathToConfig = configFile.getAbsolutePath();
-
-            // Find the directory where the Jackrabbit repository data will be stored ...
-            File workingDirectory = new File(this.workingDirectory);
-            String workingDirectoryPath = workingDirectory.getAbsolutePath();
-
-            // Get the Jackrabbit custom node definition (CND) file ...
-            URL cndFile = Thread.currentThread().getContextClassLoader().getResource("jackrabbitNodeTypes.cnd");
-
-            // Create the Jackrabbit repository instance and establish a session to keep the repository alive ...
-            this.repository = new TransientRepository(pathToConfig, workingDirectoryPath);
-            if (this.username != null) {
-                Credentials credentials = new SimpleCredentials(this.username, this.password);
-                this.keepAliveSession = this.repository.login(credentials, this.workspaceName);
-            } else {
-                this.keepAliveSession = this.repository.login();
-            }
-
-            try {
-                // Register the node types (only valid the first time) ...
-                JackrabbitNodeTypeManager mgr = (JackrabbitNodeTypeManager)this.keepAliveSession.getWorkspace().getNodeTypeManager();
-                mgr.registerNodeTypes(cndFile.openStream(), JackrabbitNodeTypeManager.TEXT_X_JCR_CND);
-            } catch (RepositoryException e) {
-                if (!e.getMessage().contains("already exists")) throw e;
-            }
-
-        } catch (Exception e) {
-            this.repository = null;
-            this.keepAliveSession = null;
-            throw e;
-        }
-    }
-}</programlisting>
-    <para>As you can see, this method really has nothing to do with JBoss DNA, other than setting up a JCR repository that JBoss
-      DNA will use.</para>
-    <para>
-      The
-      <code>shutdownRepository()</code>
-      method shuts down the Jackrabbit transient repository by closing the "keep-alive session". Again, this method really does
-      nothing specifically with JBoss DNA, but is needed to manage the JCR repository that JBoss DNA uses.
-      <programlisting>
-public void shutdownRepository() throws Exception {
-    if (this.repository != null) {
-        try {
-            this.keepAliveSession.logout();
-        } finally {
-            this.repository = null;
-            this.keepAliveSession = null;
-        }
-    }
-}</programlisting>
-    </para>
-    <para>
-      The
-      <code>startDnaServices()</code>
-      method first starts the JCR repository (if it was not already started), and proceeds to create and configure the
-      <code>SequencingService</code>
-      as described
-      <link linkend="sequencing_service">earlier</link>
-      . This involes setting up the
-      <code>SessionFactory</code>
-      and
-      <code>ExecutionContext</code>
-      , creating the
-      <code>SequencingService</code>
-      instance, and configuring the image sequencer. The method then continues by setting up the
-      <code>ObservationService</code>
-      as described
-      <link linkend="observation_service">earlier</link>
-      and starting the service.
-      <programlisting>
-public void startDnaServices() throws Exception {
-    if (this.repository == null) this.startRepository();
-    if (this.sequencingService == null) {
-
-        SimpleSessionFactory sessionFactory = new SimpleSessionFactory();
-        sessionFactory.registerRepository(this.repositoryName, this.repository);
-        if (this.username != null) {
-            Credentials credentials = new SimpleCredentials(this.username, this.password);
-            sessionFactory.registerCredentials(this.repositoryName + "/" + this.workspaceName, credentials);
-        }
-        this.executionContext = new SimpleExecutionContext(sessionFactory);
-
-        // Create the sequencing service, passing in the execution context ...
-        this.sequencingService = new SequencingService();
-        this.sequencingService.setExecutionContext(executionContext);
-
-        // Configure the sequencers.
-        String name = "Image Sequencer";
-        String desc = "Sequences image files to extract the characteristics of the image";
-        String classname = "org.jboss.dna.sequencer.images.ImageMetadataSequencer";
-        String[] classpath = null; // Use the current classpath
-        String[] pathExpressions = {"//(*.(jpg|jpeg|gif|bmp|pcx|png|iff|ras|pbm|pgm|ppm|psd))[*]/jcr:content[@jcr:data] => /images/$1"};
-        SequencerConfig imageSequencerConfig = new SequencerConfig(name, desc, classname, classpath, pathExpressions);
-        this.sequencingService.addSequencer(imageSequencerConfig);
-
-        // Set up the MP3 sequencer ...
-        name = "Mp3 Sequencer";
-        desc = "Sequences mp3 files to extract the id3 tags of the audio file";
-        classname = "org.jboss.dna.sequencer.mp3.Mp3MetadataSequencer";
-        String[] mp3PathExpressions = {"//(*.mp3)[*]/jcr:content[@jcr:data] => /mp3s/$1"};
-        SequencerConfig mp3SequencerConfig = new SequencerConfig(name, desc, classname, classpath, mp3PathExpressions);
-        this.sequencingService.addSequencer(mp3SequencerConfig);
-
-        // Use the DNA observation service to listen to the JCR repository (or multiple ones), and
-        // then register the sequencing service as a listener to this observation service...
-        this.observationService = new ObservationService(this.executionContext.getSessionFactory());
-        this.observationService.getAdministrator().start();
-        this.observationService.addListener(this.sequencingService);
-        this.observationService.monitor(this.repositoryName + "/" + this.workspaceName, Event.NODE_ADDED | Event.PROPERTY_ADDED | Event.PROPERTY_CHANGED);
-    }
-    // Start up the sequencing service ...
-    this.sequencingService.getAdministrator().start();
-}</programlisting>
-    </para>
-    <para>
-      The
-      <code>shutdownDnaServices()</code>
-      method is pretty straightforward: it just calls shutdown on each of the services and waits until they terminate.
-      <programlisting>
-public void shutdownDnaServices() throws Exception {
-    if (this.sequencingService == null) return;
-
-    // Shut down the service and wait until it's all shut down ...
-    this.sequencingService.getAdministrator().shutdown();
-    this.sequencingService.getAdministrator().awaitTermination(5, TimeUnit.SECONDS);
-
-    // Shut down the observation service ...
-    this.observationService.getAdministrator().shutdown();
-    this.observationService.getAdministrator().awaitTermination(5, TimeUnit.SECONDS);
-}</programlisting>
-    </para>
-    <para>None of the other methods really do anything with JBoss DNA <emphasis>per se</emphasis>. Instead, they merely work with the repository
-      using the JCR API.</para>
-    <para>
-      The <code>main</code> method of the <code>SequencingClient</code> class creates a <code>SequencingClient</code> instance,
-      and passes a new <code>ConsoleInput</code> instance:
-      <programlisting>
-public static void main( String[] args ) throws Exception {
-    SequencingClient client = new SequencingClient();
-    client.setRepositoryInformation("repo", "default", "jsmith", "secret".toCharArray());
-    client.setUserInterface(new ConsoleInput(client));
-}</programlisting>
-      </para>
-      <para>If we look at the
-      <code>ConsoleInput</code>
-      constructor, it starts the repository, the DNA services, and a thread for the user interface. At this point, the constructor
-      returns, but the main application continues under the user interface thread.  When the user requests to quit,
-      the user interface thread also shuts down the DNA services and JCR repository.
-      <programlisting>
-public ConsoleInput( SequencerClient client ) {
-  try {
-      client.startRepository();
-      client.startDnaServices();
-  
-      System.out.println(getMenu());
-      Thread eventThread = new Thread(new Runnable() {
-          private boolean quit = false;
-          public void run() {
-              try {
-                  while (!quit) {
-                      // Display the prompt and process the requested operation ...
-                  }
-              } finally {
-                  try {
-                      // Terminate ...
-                      client.shutdownDnaServices();
-                      client.shutdownRepository();
-                  } catch (Exception err) {
-                      System.out.println("Error shutting down sequencing service and repository: " + err.getLocalizedMessage());
-                      err.printStackTrace(System.err);
-                  }
-              }
-          }
-      });
-      eventThread.start();
-  } catch (Exception err) {
-      System.out.println("Error: " + err.getLocalizedMessage());
-      err.printStackTrace(System.err);
-  }
-}</programlisting>
-    </para>
-    <para>At this point, we've reviewed all of the interesting code in the example application.  However, feel free
-    to play with the application, trying different things.
-    </para>
-  </sect1>
-  <sect1 id="using_dna_review">
-    <title>Summarizing what we just did</title>
-    <para>In this chapter we covered the different JBoss DNA components and how they can be used in your application.
-      Specifically, we described how the <code>SequencingService</code> and <code>ObservationService</code> can 
-      be configured and used.  And we ended the chapter by reviewing the example application, which not only uses
-      JBoss DNA, but also the repository via the JCR API.
-    </para>
-  </sect1>
-</chapter>
-  
-<!--  ====================================================================================================
-                                               Chapter 
-      ====================================================================================================   -->
-<chapter id="custom_sequencers">
-  <title>Creating custom sequencers</title>
-  <para>The current release of JBoss DNA comes with two sequencers: one that extracts metadata from a variety of image file formats,
-  and another that extracts some of the ID3 metadata from MP3 audio files.  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>
-  Creating a custom sequencer involves the following steps:
-  <itemizedlist>
-    <listitem>
-      <para>Create a Maven 2 project for your sequencer;</para>
-    </listitem>
-    <listitem>
-      <para>Implement the <code>org.jboss.dna.graph.sequencer.StreamSequencer</code> interface with your own implementation, and create unit tests to verify
-      the functionality and expected behavior;</para>
-    </listitem>
-    <listitem>
-      <para>Add the sequencer configuration to the JBoss DNA <code>SequencingService</code> in your application
-      as described in the <link linkend="using_dna">previous chapter</link>; and</para>
-    </listitem>
-    <listitem>
-      <para>Deploy the JAR file with your implementation (as well as any dependencies), and make them available to JBoss DNA
-      in your application.</para>
-    </listitem>
-  </itemizedlist>
-  It's that simple.
-  </para>
-  <sect1 id="custom_sequencer_project">
-    <title>Creating the Maven 2 project</title>
-    <para>The first step is to create the Maven 2 project that you can use to compile your code and build the JARs.
-    Maven 2 automates a lot of the work, and since you're already <link linkend="downloading_and_running">set up to use Maven</link>,
-    using Maven for your project will save you a lot of time and effort.  Of course, you don't have to use Maven 2, but then you'll
-    have to get the required libraries and manage the compiling and building process yourself.</para>
-    <note>
-      <para>JBoss DNA may provide in the future a Maven archetype for creating sequencer projects.  If you'd find this useful
-        and would like to help create it, please <link linkend="preface">join the community</link>.</para>
-    </note>
-  <note>
-    <para>The <code>dna-sequencer-images</code> project is a small, self-contained sequencer implementation that
-    has only the minimal dependencies.  Starting with this project's source and modifying it to suit your needs may be the easiest way to get started.
-    See the subversion repository: <ulink url="http://anonsvn.jboss.org/repos/dna/trunk/sequencers/dna-sequencer-images/">http://anonsvn.jboss.org/repos/dna/trunk/sequencers/dna-sequencer-images/</ulink>
-    </para>
-  </note>
-    <para>You can create your Maven project any way you'd like.  For examples, see the <ulink url="http://maven.apache.org/guides/getting-started/index.html#How_do_I_make_my_first_Maven_project">Maven 2 documentation</ulink>.  
-    Once you've done that, just add the dependencies in your project's <code>pom.xml</code> dependencies section:
-  <programlisting>
-&lt;dependency&gt;
-  &lt;groupId&gt;org.jboss.dna&lt;/groupId&gt;
-  &lt;artifactId&gt;dna-common&lt;/artifactId&gt;
-  &lt;version&gt;0.1&lt;/version&gt;
-&lt;/dependency&gt;
-&lt;dependency&gt;
-  &lt;groupId&gt;org.jboss.dna&lt;/groupId&gt;
-  &lt;artifactId&gt;dna-graph&lt;/artifactId&gt;
-  &lt;version&gt;0.1&lt;/version&gt;
-&lt;/dependency&gt;
-&lt;dependency&gt;
-  &lt;groupId&gt;org.slf4j&lt;/groupId&gt;
-  &lt;artifactId&gt;slf4j-api&lt;/artifactId&gt;
-&lt;/dependency&gt;
-</programlisting>
-  These are minimum dependencies required for compiling a sequencer.  Of course, you'll have to add
-  other dependencies that your sequencer needs.</para>
-  <para>As for testing, you probably will want to add more dependencies, such as those listed here:
-<programlisting>
-&lt;dependency&gt;
-  &lt;groupId&gt;junit&lt;/groupId&gt;
-  &lt;artifactId&gt;junit&lt;/artifactId&gt;
-  &lt;version&gt;4.4&lt;/version&gt;
-  &lt;scope&gt;test&lt;/scope&gt;
-&lt;/dependency&gt;
-&lt;dependency&gt;
-  &lt;groupId&gt;org.hamcrest&lt;/groupId&gt;
-  &lt;artifactId&gt;hamcrest-library&lt;/artifactId&gt;
-  &lt;version&gt;1.1&lt;/version&gt;
-  &lt;scope&gt;test&lt;/scope&gt;
-&lt;/dependency&gt;
-&lt;!-- Logging with Log4J --&gt;
-&lt;dependency&gt;
-  &lt;groupId&gt;org.slf4j&lt;/groupId&gt;
-  &lt;artifactId&gt;slf4j-log4j12&lt;/artifactId&gt;
-  &lt;version&gt;1.4.3&lt;/version&gt;
-  &lt;scope&gt;test&lt;/scope&gt;
-&lt;/dependency&gt;
-&lt;dependency&gt;
-  &lt;groupId&gt;log4j&lt;/groupId&gt;
-  &lt;artifactId&gt;log4j&lt;/artifactId&gt;
-  &lt;version&gt;1.2.14&lt;/version&gt;
-  &lt;scope&gt;test&lt;/scope&gt;
-&lt;/dependency&gt;
-</programlisting>
-  Testing JBoss DNA sequencers does not require a JCR repository or the JBoss DNA services.  (For more detail,
-  see the <link linkend="testing_custom_sequencers">testing section</link>.)  However, if you want to do
-  integration testing with a JCR repository and the JBoss DNA services, you'll need additional dependencies for these libraries.
-<programlisting>
-&lt;dependency&gt;
-  &lt;groupId&gt;org.jboss.dna&lt;/groupId&gt;
-  &lt;artifactId&gt;dna-repository&lt;/artifactId&gt;
-  &lt;version&gt;0.1&lt;/version&gt;
-  &lt;scope&gt;test&lt;/scope&gt;
-&lt;/dependency&gt;
-&lt;!-- Java Content Repository API --&gt;
-&lt;dependency&gt;
-  &lt;groupId&gt;javax.jcr&lt;/groupId&gt;
-  &lt;artifactId&gt;jcr&lt;/artifactId&gt;
-  &lt;version&gt;1.0.1&lt;/version&gt;
-  &lt;scope&gt;test&lt;/scope&gt;
-&lt;/dependency&gt;
-&lt;!-- Apache Jackrabbit (JCR Implementation) --&gt;
-&lt;dependency&gt;
-  &lt;groupId&gt;org.apache.jackrabbit&lt;/groupId&gt;
-  &lt;artifactId&gt;jackrabbit-api&lt;/artifactId&gt;
-  &lt;version&gt;1.3.3&lt;/version&gt;
-  &lt;scope&gt;test&lt;/scope&gt;
-  &lt;!-- Exclude these since they are included in JDK 1.5 --&gt;
-  &lt;exclusions&gt;
-    &lt;exclusion&gt;
-      &lt;groupId&gt;xml-apis&lt;/groupId&gt;
-      &lt;artifactId&gt;xml-apis&lt;/artifactId&gt;
-    &lt;/exclusion&gt;
-    &lt;exclusion&gt;
-      &lt;groupId&gt;xerces&lt;/groupId&gt;
-      &lt;artifactId&gt;xercesImpl&lt;/artifactId&gt;
-    &lt;/exclusion&gt;
-  &lt;/exclusions&gt;
-&lt;/dependency&gt;
-&lt;dependency&gt;
-  &lt;groupId&gt;org.apache.jackrabbit&lt;/groupId&gt;
-  &lt;artifactId&gt;jackrabbit-core&lt;/artifactId&gt;
-  &lt;version&gt;1.3.3&lt;/version&gt;
-  &lt;scope&gt;test&lt;/scope&gt;
-  &lt;!-- Exclude these since they are included in JDK 1.5 --&gt;
-  &lt;exclusions&gt;
-    &lt;exclusion&gt;
-      &lt;groupId&gt;xml-apis&lt;/groupId&gt;
-      &lt;artifactId&gt;xml-apis&lt;/artifactId&gt;
-    &lt;/exclusion&gt;
-    &lt;exclusion&gt;
-      &lt;groupId&gt;xerces&lt;/groupId&gt;
-      &lt;artifactId&gt;xercesImpl&lt;/artifactId&gt;
-    &lt;/exclusion&gt;
-  &lt;/exclusions&gt;
-&lt;/dependency&gt;
-</programlisting>
-  </para>
-  <para>At this point, your project should be set up correctly, and you're ready to move on to 
-  <link linkend="custom_sequencer_implementation">writing the Java implementation</link> for your sequencer.
-  </para>
-  </sect1>
-  <sect1 id="custom_sequencer_implementation">
-    <title>Implementing the StreamSequencer interface</title>
-    <para>After creating the project and setting up the dependencies, the next step is to create a Java class that implements
-    the <code>org.jboss.dna.graph.sequencer.StreamSequencer</code> interface.  This interface is very straightforward
-    and involves a single method:
-    <programlisting>
-public interface StreamSequencer {
-
-    /**
-     * Sequence the data found in the supplied stream, placing the output 
-     * information into the supplied map.
-     *
-     * @param stream the stream with the data to be sequenced; never null
-     * @param output the output from the sequencing operation; never null
-     * @param progressMonitor the progress monitor that should be kept 
-     *   updated with the sequencer's progress and that should be
-     *   frequently consulted as to whether this operation has been cancelled.
-     */
-    void sequence( InputStream stream, SequencerOutput output, 
-                   ProgressMonitor progressMonitor );</programlisting>
-    </para>
-    <para>The job of a stream sequencer is to process the data in the supplied stream, and place into the <code>SequencerOutput</code> 
-    any information that is to go into the JCR repository.  JBoss DNA figures out when your sequencer should be called
-    (of course, using the sequencing configuration you'll add in a bit), and then makes sure the generated information
-    is saved in the correct place in the repository.  
-    </para>
-    <para>The <code>SequencerOutput</code> class is fairly easy to use.  There are basically two methods you need to call.
-    One method sets the property values, while the other sets references to other nodes in the repository.  Use these
-    methods to describe the properties of the nodes you want to create, using relative paths for the nodes and
-    valid JCR property names for properties and references.  JBoss DNA will ensure that nodes are created or updated
-    whenever they're needed.
-    <programlisting>
-public interface SequencerOutput {
-
-  /**
-   * Set the supplied property on the supplied node.  The allowable
-   * values are any of the following:
-   *   - primitives (which will be autoboxed)
-   *   - String instances
-   *   - String arrays
-   *   - byte arrays
-   *   - InputStream instances
-   *   - Calendar instances
-   *
-   * @param nodePath the path to the node containing the property; 
-   * may not be null
-   * @param property the name of the property to be set
-   * @param values the value(s) for the property; may be empty if 
-   * any existing property is to be removed
-   */
-  void setProperty( String nodePath, String property,
-                    Object... values );
-
-  /**
-   * Set the supplied reference on the supplied node.
-   *
-   * @param nodePath the path to the node containing the property; 
-   * may not be null
-   * @param property the name of the property to be set
-   * @param paths the paths to the referenced property, which may be
-   * absolute paths or relative to the sequencer output node;
-   * may be empty if any existing property is to be removed
-   */
-  void setReference( String nodePath, String property,
-                     String... paths );
-}</programlisting>
-    </para>
-      <para>JBoss DNA will create nodes of type <code>nt:unstructured</code> unless you specify the value for the
-      <code>jcr:primaryType</code> property.  You can also specify the values for the <code>jcr:mixinTypes</code> property
-      if you want to add mixins to any node.
-      </para>
-    <para>For a complete example of a sequencer, let's look at the <code>org.jboss.dna.sequencers.image.ImageMetadataSequencer</code> implementation:
-    <programlisting>
-public class ImageMetadataSequencer implements StreamSequencer {
-
-    public static final String METADATA_NODE = "image:metadata";
-    public static final String IMAGE_PRIMARY_TYPE = "jcr:primaryType";
-    public static final String IMAGE_MIXINS = "jcr:mixinTypes";
-    public static final String IMAGE_MIME_TYPE = "jcr:mimeType";
-    public static final String IMAGE_ENCODING = "jcr:encoding";
-    public static final String IMAGE_FORMAT_NAME = "image:formatName";
-    public static final String IMAGE_WIDTH = "image:width";
-    public static final String IMAGE_HEIGHT = "image:height";
-    public static final String IMAGE_BITS_PER_PIXEL = "image:bitsPerPixel";
-    public static final String IMAGE_PROGRESSIVE = "image:progressive";
-    public static final String IMAGE_NUMBER_OF_IMAGES = "image:numberOfImages";
-    public static final String IMAGE_PHYSICAL_WIDTH_DPI = "image:physicalWidthDpi";
-    public static final String IMAGE_PHYSICAL_HEIGHT_DPI = "image:physicalHeightDpi";
-    public static final String IMAGE_PHYSICAL_WIDTH_INCHES = "image:physicalWidthInches";
-    public static final String IMAGE_PHYSICAL_HEIGHT_INCHES = "image:physicalHeightInches";
-
-    /**
-     * {@inheritDoc}
-     */
-    public void sequence( InputStream stream, SequencerOutput output, 
-                          ProgressMonitor progressMonitor ) {
-        progressMonitor.beginTask(10, ImageSequencerI18n.sequencerTaskName);
-
-        ImageMetadata metadata = new ImageMetadata();
-        metadata.setInput(stream);
-        metadata.setDetermineImageNumber(true);
-        metadata.setCollectComments(true);
-
-        // Process the image stream and extract the metadata ...
-        if (!metadata.check()) {
-            metadata = null;
-        }
-        progressMonitor.worked(5);
-        if (progressMonitor.isCancelled()) return;
-
-        // Generate the output graph if we found useful metadata ...
-        if (metadata != null) {
-            // Place the image metadata into the output map ...
-            output.setProperty(METADATA_NODE, IMAGE_PRIMARY_TYPE, "image:metadata");
-            // output.psetProperty(METADATA_NODE, IMAGE_MIXINS, "");
-            output.setProperty(METADATA_NODE, IMAGE_MIME_TYPE, metadata.getMimeType());
-            // output.setProperty(METADATA_NODE, IMAGE_ENCODING, "");
-            output.setProperty(METADATA_NODE, IMAGE_FORMAT_NAME, metadata.getFormatName());
-            output.setProperty(METADATA_NODE, IMAGE_WIDTH, metadata.getWidth());
-            output.setProperty(METADATA_NODE, IMAGE_HEIGHT, metadata.getHeight());
-            output.setProperty(METADATA_NODE, IMAGE_BITS_PER_PIXEL, metadata.getBitsPerPixel());
-            output.setProperty(METADATA_NODE, IMAGE_PROGRESSIVE, metadata.isProgressive());
-            output.setProperty(METADATA_NODE, IMAGE_NUMBER_OF_IMAGES, metadata.getNumberOfImages());
-            output.setProperty(METADATA_NODE, IMAGE_PHYSICAL_WIDTH_DPI, metadata.getPhysicalWidthDpi());
-            output.setProperty(METADATA_NODE, IMAGE_PHYSICAL_HEIGHT_DPI, metadata.getPhysicalHeightDpi());
-            output.setProperty(METADATA_NODE, IMAGE_PHYSICAL_WIDTH_INCHES, metadata.getPhysicalWidthInch());
-            output.setProperty(METADATA_NODE, IMAGE_PHYSICAL_HEIGHT_INCHES, metadata.getPhysicalHeightInch());
-        }
-
-        progressMonitor.done();
-    }
-}</programlisting>
-    </para>
-    <para>
-    Notice how the image metadata is extracted and the output graph is generated.  A single node is created with the name <code>image:metadata</code>
-    and with the <code>image:metadata</code> node type.  No mixins are defined for the node, but several properties are set on the node
-    using the values obtained from the image metadata.  After this method returns, the constructed graph will be saved to the repository
-    in all of the places defined by its configuration.  (This is why only relative paths are used in the sequencer.)
-    </para>
-    <para>Also note how the progress monitor is used.  Reporting progress through the supplied <code>ProgressMonitor</code> is very easy, and it ensures that JBoss DNA
-     can accurately monitor and report the status of sequencing activities to the users.  At the beginning of the operation, call
-     <code>beginTask(...)</code> with a meaningful message describing
-     the operation and a total for the amount of work that will be done by this sequencer. Then perform the sequencing work,
-     periodically reporting work by specifying the incremental amount of work with the <code>worked(double)</code> method, or
-     by creating a subtask with the <code>createSubtask(double)</code> method and reporting work against that subtask
-     monitor.
-     </para>
-     <para>Your method should periodically use the ProgressMonitor's <code>isCancelled()</code> method to check whether the operation has been
-     cancelled.. If this method returns true, the implementation should abort all work as
-     soon as possible and close any resources that were acquired or opened.
-     </para>
-     <para>
-     Finally, when your sequencing operation is completed, it should call <code>done()</code> on the progress monitor.
-     </para>
-  </sect1>
-  <sect1 id="testing_custom_sequencers">
-    <title>Testing custom sequencers</title>
-    <para>The sequencing framework was designed to make testing sequencers much easier.  In particular, the
-    <code>StreamSequencer</code> interface does not make use of the JCR API.  So instead of requiring a fully-configured
-    JCR repository and JBoss DNA system, unit tests for a sequencer can focus on testing that the content is
-    processed correctly and the desired output graph is generated.</para>
-    <note>
-      <para>For a complete example of a sequencer unit test, see the <code>ImageMetadataSequencerTest</code> unit test
-      in the <code>org.jboss.dna.sequencer.images</code> package of the <code>dna-sequencers-image</code> project.
-      </para>
-    </note>
-    <para>The following code fragment shows one way of testing a sequencer, using JUnit 4.4 assertions and 
-      some of the classes made available by JBoss DNA.  Of course,
-      this example code does not do any error handling and does not make all the assertions a real test would.
-    <programlisting>
-Sequencer sequencer = new ImageMetadataSequencer();
-MockSequencerOutput output = new MockSequencerOutput();
-ProgressMonitor progress = new SimpleProgressMonitor("Test activity");
-InputStream stream = null;
-try {
-    stream = this.getClass().getClassLoader().getResource("caution.gif").openStream();
-    sequencer.sequence(stream,output,progress);   // writes to 'output'
-    assertThat(output.getPropertyValues("image:metadata", "jcr:primaryType"), 
-               is(new Object[] {"image:metadata"}));
-    assertThat(output.getPropertyValues("image:metadata", "jcr:mimeType"), 
-               is(new Object[] {"image/gif"}));
-    // ... make more assertions here
-    assertThat(output.hasReferences(), is(false));
-} finally {
-    stream.close();
-}</programlisting>
-  </para>
-  <para>It's also useful to test that a sequencer produces no output for something it should not understand:
-    <programlisting>
-Sequencer sequencer = new ImageMetadataSequencer();
-MockSequencerOutput output = new MockSequencerOutput();
-ProgressMonitor progress = new SimpleProgressMonitor("Test activity");
-InputStream stream = null;
-try {
-    stream = this.getClass().getClassLoader().getResource("caution.pict").openStream();
-    sequencer.sequence(stream,output,progress);   // writes to 'output'
-    assertThat(output.hasProperties(), is(false));
-    assertThat(output.hasReferences(), is(false));
-} finally {
-    stream.close();
-}</programlisting>
-    </para>
-    <para>These are just two simple tests that show ways of testing a sequencer.  Some tests may get quite involved,
-    especially if a lot of output data is produced.  
-    </para>
-    <para>It may also be useful to create some integration tests
-    that <link linkend="using_dna">configure JBoss DNA</link> to use a custom sequencer, and to then upload
-    content using the JCR API, verifying that the custom sequencer did run.  However, remember that JBoss DNA
-    runs sequencers asynchronously in the background, and you must sychronize your tests to ensure that the
-    sequencers have a chance to run before checking the results.  (One way of doing this (although, granted, not always reliable) is to wait for a second
-    after uploading your content, shutdown the <code>SequencingService</code> and await its termination,
-    and then check that the sequencer output has been saved to the JCR repository.  For an example of this technique,
-    see the <code>SequencingClientTest</code> unit test in the example application.)
-    </para>  
-  </sect1>
-  <sect1 id="deploying_custom_sequencers">
-    <title>Deploying custom sequencers</title>
-    <para>The first step of deploying a sequencer consists of adding/changing the sequencer configuration (e.g., <code>SequencerConfig</code>)
-    in the <code>SequencingService</code>.  This was covered in the <link linkend="sequencing_service">previous chapter</link>.
-    </para>
-    <para>
-    The second step is to make the sequencer implementation available to JBoss DNA.  At this time, the JAR containing 
-    your new sequencer, as well as any JARs that your sequencer depends on, should be placed on your application classpath.</para>
-    <note>
-      <para>A future goal of JBoss DNA is to allow sequencers, connectors, and other extensions to be easily deployed into
-        a runtime repository.  This process will not only be much simpler, but it will also provide JBoss DNA 
-        with the information necessary to update configurations and create the appropriate class loaders for each extension.
-        Having separate class loaders for each extension helps prevent the pollution of the common classpath, 
-        facilitates an isolated runtime environment to eliminate any dependency conflicts, and may potentially
-        enable hot redeployment of newer extension versions.
-      </para>
-    </note>
-  </sect1>
-</chapter>
-  
-<!--  ====================================================================================================
-                                               Chapter 
-      ====================================================================================================   -->
-<chapter id="future_directions">
-  <title>Looking to the future</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.
-  If you're interested in getting involved with the JBoss DNA project, consider picking up one of the sequencers on our
-  <ulink url="http://jira.jboss.org/jira/browse/DNA?report=com.atlassian.jira.plugin.system.project:roadmap-panel">roadmap</ulink>.
-  Or, check out <ulink url="http://jira.jboss.org/jira/secure/IssueNavigator.jspa?reset=true&amp;mode=hide&amp;pid=12310520&amp;sorter/order=DESC&amp;sorter/field=priority&amp;resolution=-1&amp;component=12311436">JIRA</ulink>
-  for the list of sequencers we've thought of.  If you think of one that's not there, please add it to JIRA!
-  </para>
-  <para>
-  The next release will focus on creating the <link linkend="federation">federation engine</link> and connectors
-  for several popular and ubiquitous systems.  The 0.2 release will likely only federate information in a read-only manner,
-  but updates will soon follow.  Also, during the early part of the next release, the JBoss DNA project will switch to use JDK 6.  
-  Java 5 is being end-of-lifed, so we want to move to a supported JDK. However, a number of JBoss projects and products continue to
-  require Java 5, so our next release will most likely use JDK 6 with Java 5 compatibility.</para>
-  <para>
-  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.  If any of these are of interest to you, please <link linkend="preface">get involved</link> in the community.
-  </para>
-</chapter>
-</book>
\ No newline at end of file

Deleted: trunk/dna-repository/src/test/resources/plugin.xml
===================================================================
--- trunk/dna-repository/src/test/resources/plugin.xml	2009-06-04 21:46:34 UTC (rev 976)
+++ trunk/dna-repository/src/test/resources/plugin.xml	2009-06-04 22:31:30 UTC (rev 977)
@@ -1,91 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<?eclipse version="3.0"?>
-<!--  (c) 2007 Varsity Gateway LLC.  All rights reserved. -->
-<plugin
-   id="com.metamatrix.metamodels.transformation"
-   name="%pluginName"
-   version="5.5.1"
-   provider-name="%providerName"
-   class="com.metamatrix.metamodels.transformation.TransformationPlugin">
-
-   <runtime>
-      <library name="metamodelsTransformation.jar">
-         <export name="*"/>
-      </library>
-   </runtime>
-   <requires>
-      <import plugin="org.eclipse.emf.mapping" export="true"/>
-      <import plugin="org.eclipse.emf.ecore" export="true"/>
-      <import plugin="org.eclipse.emf.edit" export="true"/>
-      <import plugin="org.eclipse.emf.ecore.edit" export="true"/>
-      <import plugin="org.eclipse.core.runtime" export="true"/>
-      <import plugin="com.metamatrix.core" export="true"/>
-      <import plugin="com.metamatrix.metamodels.core" export="true"/>
-   </requires>
-
-
-<!--
-   	Each extension below represents a single metamodel.  Each metmodel is
-   	registered using under the specified <uri> value which must be the same
-   	eNS_URI value defined in the EPackage class for that metamodel.
-   -->
-   <extension
-         id="transformation"
-         name="%metamodelName"
-         point="com.metamatrix.modeler.core.metamodel">
-      <uri>
-         http://www.metamatrix.com/metamodels/Transformation
-      </uri>
-      <alternateUri>
-         mtkplugin:///com.metamatrix.metamodels.Transformation
-      </alternateUri>
-      <packageClass
-            name="com.metamatrix.metamodels.transformation.TransformationPackage">
-      </packageClass>
-      <adapterClass
-            name="com.metamatrix.metamodels.transformation.provider.TransformationItemProviderAdapterFactory">
-      </adapterClass>
-      <properties
-            createAsPhysical="false"
-            requiresProxies="false"
-            participatoryOnly="true"
-            createAsVirtual="false"
-            supportsDiagrams="false"
-            supportsExtension="true">
-      </properties>
-   </extension>
-   <extension
-         point="org.eclipse.emf.ecore.generated_package">
-      <package
-            uri="http://www.metamatrix.com/metamodels/Transformation"
-            class="com.metamatrix.metamodels.transformation.TransformationPackage">
-      </package>
-   </extension>
-     
-   <extension
-         id="mapping"
-         name="%mappingMetamodelName"
-         point="com.metamatrix.modeler.core.metamodel">
-      <uri>
-         http://www.eclipse.org/emf/2002/Mapping
-      </uri>
-      <alternateUri>
-         mtkplugin:///www.eclipse.org/emf/2002/Mapping
-      </alternateUri>
-      <packageClass
-            name="org.eclipse.emf.mapping.MappingPackage">
-      </packageClass>
-      <adapterClass
-            name="org.eclipse.emf.mapping.provider.MappingItemProviderAdapterFactory">
-      </adapterClass>
-      <properties
-            createAsPhysical="false"
-            requiresProxies="false"
-            participatoryOnly="true"
-            createAsVirtual="false"
-            supportsDiagrams="false"
-            supportsExtension="false">
-      </properties>
-   </extension>
-
-</plugin>

Deleted: trunk/dna-repository/src/test/resources/rule_test.dsl
===================================================================
--- trunk/dna-repository/src/test/resources/rule_test.dsl	2009-06-04 21:46:34 UTC (rev 976)
+++ trunk/dna-repository/src/test/resources/rule_test.dsl	2009-06-04 22:31:30 UTC (rev 977)
@@ -1,6 +0,0 @@
-[when]after {value}								= RuleResult( name == "{value}");
-[when]before {value}							= not RuleResult( name == "{value}");
-[when]filename matches "{value}"	= RuleInput( fileName matches "{value}" );
-[when]header matches "{value}"		= RuleInput( header matches "{value}" );
-[when]mime type is {value}				= RuleInput( mimeType == "{value}" );
-[then]use {value} = insert(new RuleResult("{value}")); output.add("{value}");

Deleted: trunk/dna-repository/src/test/resources/rule_test.dslr
===================================================================
--- trunk/dna-repository/src/test/resources/rule_test.dslr	2009-06-04 21:46:34 UTC (rev 976)
+++ trunk/dna-repository/src/test/resources/rule_test.dslr	2009-06-04 22:31:30 UTC (rev 977)
@@ -1,25 +0,0 @@
-#created on: Jan 4, 2008
-package org.jboss.dna.repository.rules
-
-#list any import classes here.
-
-#reference the expander(s) here
-expander rule_test.dsl
-
-#declare any global variables here
-global java.util.Set output
-
-rule "A"
-	when
-		mime type is text
-		before A
-	then
-		use A
-end
-
-rule "B"
-	when
-		filename matches "someInput.dsl"
-	then
-		use B
-end

Deleted: trunk/dna-repository/src/test/resources/test.au
===================================================================
(Binary files differ)

Deleted: trunk/dna-repository/src/test/resources/test.bin
===================================================================
(Binary files differ)

Deleted: trunk/dna-repository/src/test/resources/test.bmp
===================================================================
(Binary files differ)

Deleted: trunk/dna-repository/src/test/resources/test.dtd
===================================================================
--- trunk/dna-repository/src/test/resources/test.dtd	2009-06-04 21:46:34 UTC (rev 976)
+++ trunk/dna-repository/src/test/resources/test.dtd	2009-06-04 22:31:30 UTC (rev 977)
@@ -1,18 +0,0 @@
-<!ELEMENT magic (info?,match-list)>
-<!ELEMENT info (version?,author?,description?)>
-<!ELEMENT version (#PCDATA)>
-<!ELEMENT author (#PCDATA)>
-<!ELEMENT description (#PCDATA)>
-<!ELEMENT match-list (match*)>
-<!ELEMENT match (mimetype,extension,description,test,submatch-list?)>
-<!ELEMENT extension (#PCDATA)>
-<!ELEMENT mimetype (#PCDATA)>
-<!ELEMENT description (#PCDATA)>
-<!ELEMENT test (#PCDATA)>
-<!ATTLIST test offset CDATA "0">
-<!ATTLIST test type CDATA "string">
-<!ATTLIST test bitmask CDATA "">
-<!ATTLIST test comparator CDATA "=">
-<!ELEMENT submatch-list (match+)>
-	       
-               

Deleted: trunk/dna-repository/src/test/resources/test.emf
===================================================================
(Binary files differ)

Deleted: trunk/dna-repository/src/test/resources/test.eps
===================================================================
--- trunk/dna-repository/src/test/resources/test.eps	2009-06-04 21:46:34 UTC (rev 976)
+++ trunk/dna-repository/src/test/resources/test.eps	2009-06-04 22:31:30 UTC (rev 977)
@@ -1,338 +0,0 @@
-%!PS-Adobe-3.0 EPSF-3.0
-%%Creator: GIMP PostScript file plugin V 1.16 by Peter Kirchgessner
-%%Title: /home/arimus/test.eps
-%%CreationDate: Tue Jun 15 19:43:49 2004
-%%DocumentData: Clean7Bit
-%%LanguageLevel: 2
-%%Pages: 1
-%%BoundingBox: 14 14 115 115
-%%EndComments
-%%BeginProlog
-% Use own dictionary to avoid conflicts
-10 dict begin
-%%EndProlog
-%%Page: 1 1
-% Translate for offset
-14.173228346456694 14.173228346456694 translate
-% Translate to begin of first scanline
-0 99.999999999999986 translate
-99.999999999999986 -99.999999999999986 scale
-% Image geometry
-100 100 8
-% Transformation matrix
-[ 100 0 0 100 0 0 ]
-% Strings to hold RGB-samples per scanline
-/rstr 100 string def
-/gstr 100 string def
-/bstr 100 string def
-{currentfile /ASCII85Decode filter /RunLengthDecode filter rstr readstring pop}
-{currentfile /ASCII85Decode filter /RunLengthDecode filter gstr readstring pop}
-{currentfile /ASCII85Decode filter /RunLengthDecode filter bstr readstring pop}
-true 3
-%%BeginData:         4976 ASCII Bytes
-colorimage
-Sc=3~>
-Sc=3~>
-Sc=3~>
-Sc=3~>
-Sc=3~>
-Sc=3~>
-Sc=3~>
-Sc=3~>
-Sc=3~>
-Sc=3~>
-Sc=3~>
-Sc=3~>
-Sc=3~>
-Sc=3~>
-Sc=3~>
-Sc=3~>
-Sc=3~>
-Sc=3~>
-Sc=3~>
-Sc=3~>
-Sc=3~>
-Sc=3~>
-Sc=3~>
-Sc=3~>
-Sc=3~>
-Sc=3~>
-Sc=3~>
-Sc=3~>
-Sc=3~>
-Sc=3~>
-Sc=3~>
-Sc=3~>
-Sc=3~>
-Sc=3~>
-Sc=3~>
-Sc=3~>
-Sc=3~>
-Sc=3~>
-Sc=3~>
-Sc=3~>
-Sc=3~>
-Sc=3~>
-Sc=3~>
-Sc=3~>
-Sc=3~>
-Sc=3~>
-Sc=3~>
-Sc=3~>
-Sc=3~>
-Sc=3~>
-Sc=3~>
-Sc=3~>
-Sc=3~>
-Sc=3~>
-Sc=3~>
-Sc=3~>
-Sc=3~>
-Sc=3~>
-Sc=3~>
-Sc=3~>
-Sc=3~>
-Sc=3~>
-Sc=3~>
-Sc=3~>
-Sc=3~>
-Sc=3~>
-Sc=3~>
-Sc=3~>
-Sc=3~>
-Sc=3~>
-Sc=3~>
-Sc=3~>
-Sc=3~>
-Sc=3~>
-Sc=3~>
-Sc=3~>
-Sc=3~>
-Sc=3~>
-Sc=3~>
-Sc=3~>
-Sc=3~>
-Sc=3~>
-Sc=3~>
-Sc=3~>
-Sc=3~>
-Sc=3~>
-Sc=3~>
-Sc=3~>
-Sc=3~>
-Sc=3~>
-Sc=3~>
-Sc=3~>
-Sc=3~>
-Sc=3~>
-Sc=3~>
-Sc=3~>
-Sc=3~>
-Sc=3~>
-Sc=3~>
-Sc=3~>
-Sc=3~>
-Sc=3~>
-Sc=3~>
-Sc=3~>
-Sc=3~>
-Sc=3~>
-Sc=3~>
-Sc=3~>
-Sc=3~>
-Sc=3~>
-Sc=3~>
-p]'IX^]/f~>
-p]'IX^]/f~>
-p]'IX^]/f~>
-p]'IXf`1mMm/MS~>
-p]'IXf`1mMm/MS~>
-p]'IXf`1mMm/MS~>
-p]'IXf`1mMm/MS~>
-p]'IXf`1mMm/MS~>
-p]'IXf`1mMm/MS~>
-mJm+bcN!hCm/MS~>
-mJm+bcN!hCm/MS~>
-mJm+bcN!hCm/MS~>
-mJm+bcN!hCm/MS~>
-mJm+bcN!hCm/MS~>
-mJm+bcN!hCm/MS~>
-mJm+bcN!hCm/MS~>
-mJm+bcN!hCm/MS~>
-mJm+bcN!hCm/MS~>
-mJm+bp\tTsX'R7b!t-Pd[f6"#$/9nr)@?QZ2/^>,s8;ras*t~>
-mJm+bp\tTsX'R7b!t-Pd[f6"#$/9nr)@?QZ2/^>,s8;ras*t~>
-mJm+bp\tTsX'R7b!t-Pd[f6"#$/9nr)@?QZ2/^>,s8;ras*t~>
-mJm+bq#:Aq*V]U81t2:#!qp at 1p](=F[f-6t!;$5@~>
-mJm+bq#:Aq*V]U81t2:#!qp at 1p](=F[f-6t!;$5@~>
-mJm+bq#:Aq*V]U81t2:#!qp at 1p](=F[f-6t!;$5@~>
-mJm+bqYpTqE:j23%)Dc?!W5 at X!<)rh!;$5@~>
-mJm+bqYpTqE:j23%)Dc?!W5 at X!<)rh!;$5@~>
-mJm+bqYpTqE:j23%)Dc?!W5 at X!<)rh!;$5@~>
-mJm+bqYpP=rW!0*?b5S"jeOC*!!*Yfr;Qbbr;[.#[HID]h5*jJ!<)rh!;$5@~>
-mJm+bqYpP=rW!0*?b5S"jeOC*!!*Yfr;Qbbr;[.#[HID]h5*jJ!<)rh!;$5@~>
-mJm+bqYpP=rW!0*?b5S"jeOC*!!*Yfr;Qbbr;[.#[HID]h5*jJ!<)rh!;$5@~>
-mJm+bqu6Z-rVus1_Ya?6pJ(Ve!(m+g!'1#Y!-.i7!SgBFs8;ras*t~>
-mJm+bqu6Z-rVus1_Ya?6pJ(Ve!(m+g!'1#Y!-.i7!SgBFs8;ras*t~>
-mJm+bqu6Z-rVus1_Ya?6pJ(Ve!(m+g!'1#Y!-.i7!SgBFs8;ras*t~>
-mJm+bqu6XJrVur,q>UKd*<#p<d/EtE$iU,+jm`<K!:9`9~>
-mJm+bqu6XJrVur,q>UKd*<#p<d/EtE$iU,+jm`<K!:9`9~>
-mJm+bqu6XJrVur,q>UKd*<#p<d/EtE$iU,+jm`<K!:9`9~>
-mJm+br;Qc5rVupdp\t5OrVuqDrVlj$rVurpnGiFem/MS~>
-mJm+br;Qc5rVupdp\t5OrVuqDrVlj$rVurpnGiFem/MS~>
-mJm+br;Qc5rVupdp\t5OrVuqDrVlj$rVurpnGiFem/MS~>
-mJm+br;Qb:rVuqhp\t6ArVup]rVlj at rVur6nGiFem/MS~>
-mJm+br;Qb:rVuqhp\t6ArVup]rVlj at rVur6nGiFem/MS~>
-mJm+br;Qb:rVuqhp\t6ArVup]rVlj at rVur6nGiFem/MS~>
-mJm+br;QaXrVurEp\t6brVup8rVlk5rVus?\af^u!:9`9~>
-mJm+br;QaXrVurEp\t6brVup8rVlk5rVus?\af^u!:9`9~>
-mJm+br;QaXrVurEp\t6brVup8rVlk5rVus?\af^u!:9`9~>
-mJm+br;Qa5rW)m!rW<'"qu?^$rVloZ(&\+7+DIk?p&Fsjm/MS~>
-mJm+br;Qa5rW)m!rW<'"qu?^$rVloZ(&\+7+DIk?p&Fsjm/MS~>
-mJm+br;Qa5rW)m!rW<'"qu?^$rVloZ(&\+7+DIk?p&Fsjm/MS~>
-mJm+br;Qa#mK!1b!RiOp!!4Zth"^pJ!:9`9~>
-mJm+br;Qa#mK!1b!RiOp!!4Zth"^pJ!:9`9~>
-mJm+br;Qa#mK!1b!RiOp!!4Zth"^pJ!:9`9~>
-mJm+br;Q`umK!.a"8nua#5\B%!b1]rs8;ras*t~>
-mJm+br;Q`umK!.a"8nua#5\B%!b1]rs8;ras*t~>
-mJm+br;Q`umK!.a"8nua#5\B%!b1]rs8;ras*t~>
-mJm+br;Qa-rVurdl2Ln[^4&-Gr;ZjSp&"df!:9`9~>
-mJm+br;Qa-rVurdl2Ln[^4&-Gr;ZjSp&"df!:9`9~>
-mJm+br;Qa-rVurdl2Ln[^4&-Gr;ZjSp&"df!:9`9~>
-mJm+br;QaMrVur?jo5DHJdD>U!/(1Kr;c3aJ,~>
-mJm+br;QaMrVur?jo5DHJdD>U!/(1Kr;c3aJ,~>
-mJm+br;QaMrVur?jo5DHJdD>U!/(1Kr;c3aJ,~>
-mJm+br;Qb-rVuqOj8T+NrVupKqu?Tpm/MS~>
-mJm+br;Qb-rVuqOj8T+NrVupKqu?Tpm/MS~>
-mJm+br;Qb-rVuqOj8T+NrVupKqu?Tpm/MS~>
-mJm+br;Qc'rVusAq;hPUoDS^i#lFW%"o\K%r9aN7~>
-mJm+br;Qc'rVusAq;hPUoDS^i#lFW%"o\K%r9aN7~>
-mJm+br;Qc'rVusAq;hPUoDS^i#lFW%"o\K%r9aN7~>
-mJm+br;Qfq,5qQBHK>)+l2CY_%/^&)'E.t3lL"V%~>
-mJm+br;Qfq,5qQBHK>)+l2CY_%/^&)'E.t3lL"V%~>
-mJm+br;Qfq,5qQBHK>)+l2CY_%/^&)'E.t3lL"V%~>
-mJm+bqu6Z#r;ZkIr:p9m]L)Pr!^XEsq>UG:rVup]qu6XTrVur+mJh\~>
-mJm+bqu6Z#r;ZkIr:p9m]L)Pr!^XEsq>UG:rVup]qu6XTrVur+mJh\~>
-mJm+bqu6Z#r;ZkIr:p9m]L)Pr!^XEsq>UG:rVup]qu6XTrVur+mJh\~>
-mJm+bqYpP8r;[3PNR%"in(Ojb,6.`As8N'),':6Oq>BHb:]17nW;HSpFoD at C-bJmInGe"~>
-mJm+bqYpP8r;[3PNR%"in(Ojb,6.`As8N'),':6Oq>BHb:]17nW;HSpFoD at C-bJmInGe"~>
-mJm+bqYpP8r;[3PNR%"in(Ojb,6.`As8N'),':6Oq>BHb:]17nW;HSpFoD at C-bJmInGe"~>
-mJm+bqYpTqFn,P1s763j at J^!)g'7<PoDa=~>
-mJm+bqYpTqFn,P1s763j at J^!)g'7<PoDa=~>
-mJm+bqYpTqFn,P1s763j at J^!)g'7<PoDa=~>
-mJm+bq#:B(.e`oE"B!/9s7H?n%Z^ParrJo%q#L$dJ,~>
-mJm+bq#:B(.e`oE"B!/9s7H?n%Z^ParrJo%q#L$dJ,~>
-mJm+bq#:B(.e`oE"B!/9s7H?n%Z^ParrJo%q#L$dJ,~>
-mJm+bp\tX#]l#bD"9T5g>b:<Yrs[qfGYTh)#6PG_<1<7Krrq>46Q6C6rW)QiJ,~>
-mJm+bp\tX#]l#bD"9T5g>b:<Yrs[qfGYTh)#6PG_<1<7Krrq>46Q6C6rW)QiJ,~>
-mJm+bp\tX#]l#bD"9T5g>b:<Yrs[qfGYTh)#6PG_<1<7Krrq>46Q6C6rW)QiJ,~>
-Sc=3~>
-Sc=3~>
-Sc=3~>
-Sc=3~>
-Sc=3~>
-Sc=3~>
-Sc=3~>
-Sc=3~>
-Sc=3~>
-Sc=3~>
-Sc=3~>
-Sc=3~>
-Sc=3~>
-Sc=3~>
-Sc=3~>
-Sc=3~>
-Sc=3~>
-Sc=3~>
-Sc=3~>
-Sc=3~>
-Sc=3~>
-Sc=3~>
-Sc=3~>
-Sc=3~>
-Sc=3~>
-Sc=3~>
-Sc=3~>
-Sc=3~>
-Sc=3~>
-Sc=3~>
-Sc=3~>
-Sc=3~>
-Sc=3~>
-Sc=3~>
-Sc=3~>
-Sc=3~>
-Sc=3~>
-Sc=3~>
-Sc=3~>
-Sc=3~>
-Sc=3~>
-Sc=3~>
-Sc=3~>
-Sc=3~>
-Sc=3~>
-Sc=3~>
-Sc=3~>
-Sc=3~>
-Sc=3~>
-Sc=3~>
-Sc=3~>
-Sc=3~>
-Sc=3~>
-Sc=3~>
-Sc=3~>
-Sc=3~>
-Sc=3~>
-Sc=3~>
-Sc=3~>
-Sc=3~>
-Sc=3~>
-Sc=3~>
-Sc=3~>
-Sc=3~>
-Sc=3~>
-Sc=3~>
-Sc=3~>
-Sc=3~>
-Sc=3~>
-Sc=3~>
-Sc=3~>
-Sc=3~>
-Sc=3~>
-Sc=3~>
-Sc=3~>
-Sc=3~>
-Sc=3~>
-Sc=3~>
-Sc=3~>
-Sc=3~>
-Sc=3~>
-Sc=3~>
-Sc=3~>
-Sc=3~>
-Sc=3~>
-Sc=3~>
-Sc=3~>
-Sc=3~>
-Sc=3~>
-Sc=3~>
-Sc=3~>
-Sc=3~>
-Sc=3~>
-Sc=3~>
-Sc=3~>
-Sc=3~>
-Sc=3~>
-Sc=3~>
-Sc=3~>
-Sc=3~>
-Sc=3~>
-Sc=3~>
-Sc=3~>
-Sc=3~>
-Sc=3~>
-%%EndData
-showpage
-%%Trailer
-end
-%%EOF

Deleted: trunk/dna-repository/src/test/resources/test.fli
===================================================================
(Binary files differ)

Deleted: trunk/dna-repository/src/test/resources/test.gif
===================================================================
(Binary files differ)

Deleted: trunk/dna-repository/src/test/resources/test.ico
===================================================================
(Binary files differ)

Deleted: trunk/dna-repository/src/test/resources/test.java
===================================================================
--- trunk/dna-repository/src/test/resources/test.java	2009-06-04 21:46:34 UTC (rev 976)
+++ trunk/dna-repository/src/test/resources/test.java	2009-06-04 22:31:30 UTC (rev 977)
@@ -1,6 +0,0 @@
-
-public class test {
-	public static void main(String[] args) {
-		System.out.println("this is a test java source file");
-	}
-}

Deleted: trunk/dna-repository/src/test/resources/test.jpg
===================================================================
(Binary files differ)

Deleted: trunk/dna-repository/src/test/resources/test.mp3
===================================================================
(Binary files differ)

Deleted: trunk/dna-repository/src/test/resources/test.ogg
===================================================================
(Binary files differ)

Deleted: trunk/dna-repository/src/test/resources/test.pcx
===================================================================
(Binary files differ)

Deleted: trunk/dna-repository/src/test/resources/test.pdf
===================================================================
(Binary files differ)

Deleted: trunk/dna-repository/src/test/resources/test.pict
===================================================================
(Binary files differ)

Deleted: trunk/dna-repository/src/test/resources/test.pl
===================================================================
--- trunk/dna-repository/src/test/resources/test.pl	2009-06-04 21:46:34 UTC (rev 976)
+++ trunk/dna-repository/src/test/resources/test.pl	2009-06-04 22:31:30 UTC (rev 977)
@@ -1,5 +0,0 @@
-#!/usr/bin/perl -w
-
-use strict;
-
-print "this is a test perl script\n";

Deleted: trunk/dna-repository/src/test/resources/test.png
===================================================================
(Binary files differ)

Deleted: trunk/dna-repository/src/test/resources/test.pnm
===================================================================
(Binary files differ)

Deleted: trunk/dna-repository/src/test/resources/test.ppm
===================================================================
(Binary files differ)

Deleted: trunk/dna-repository/src/test/resources/test.ppt
===================================================================
(Binary files differ)

Deleted: trunk/dna-repository/src/test/resources/test.ps
===================================================================
--- trunk/dna-repository/src/test/resources/test.ps	2009-06-04 21:46:34 UTC (rev 976)
+++ trunk/dna-repository/src/test/resources/test.ps	2009-06-04 22:31:30 UTC (rev 977)
@@ -1,280 +0,0 @@
-%!PS-Adobe-2.0
-%%DocumentFonts: Courier Times-Bold
-%%Title: <stdin> (mpage)
-%%Creator: mpage 2.5.1pre2 March 1998
-%%CreationDate: Tue Jun 15 20:04:08 2004
-%%Orientation: Portrait
-%%DocumentMedia: A4 596 842
-%%BoundingBox: 20 20 576 822
-%%Pages: (atend)
-%%EndComments
-
-%%BeginProlog
-
-/mp_stm usertime def
-/mp_pgc statusdict begin pagecount end def
-statusdict begin /jobname (<stdin>) def end
-/reencsmalldict 12 dict def /ReEncodeSmall { reencsmalldict begin
-/newcodesandnames exch def /newfontname exch def /basefontname exch def
-/basefontdict basefontname findfont def /newfont basefontdict maxlength dict def
-basefontdict { exch dup /FID ne { dup /Encoding eq { exch dup length array copy newfont 3 1 roll put } { exch newfont 3 1 roll put }
-ifelse }
-  { pop pop }
-  ifelse } forall
-newfont /FontName newfontname put
-newcodesandnames aload pop newcodesandnames length 2 idiv
-{ newfont /Encoding get 3 1 roll put } repeat
-newfontname newfont definefont pop end } def
-/charvec [
-026 /Scaron
-027 /Ydieresis
-028 /Zcaron
-029 /scaron
-030 /trademark
-031 /zcaron
-032 /space
-033 /exclam
-034 /quotedbl
-035 /numbersign
-036 /dollar
-037 /percent
-038 /ampersand
-039 /quoteright
-040 /parenleft
-041 /parenright
-042 /asterisk
-043 /plus
-044 /comma
-045 /minus
-046 /period
-047 /slash
-048 /zero
-049 /one
-050 /two
-051 /three
-052 /four
-053 /five
-054 /six
-055 /seven
-056 /eight
-057 /nine
-058 /colon
-059 /semicolon
-060 /less
-061 /equal
-062 /greater
-063 /question
-064 /at
-065 /A
-066 /B
-067 /C
-068 /D
-069 /E
-070 /F
-071 /G
-072 /H
-073 /I
-074 /J
-075 /K
-076 /L
-077 /M
-078 /N
-079 /O
-080 /P
-081 /Q
-082 /R
-083 /S
-084 /T
-085 /U
-086 /V
-087 /W
-088 /X
-089 /Y
-090 /Z
-091 /bracketleft
-092 /backslash
-093 /bracketright
-094 /asciicircum
-095 /underscore
-096 /quoteleft
-097 /a
-098 /b
-099 /c
-100 /d
-101 /e
-102 /f
-103 /g
-104 /h
-105 /i
-106 /j
-107 /k
-108 /l
-109 /m
-110 /n
-111 /o
-112 /p
-113 /q
-114 /r
-115 /s
-116 /t
-117 /u
-118 /v
-119 /w
-120 /x
-121 /y
-122 /z
-123 /braceleft
-124 /bar
-125 /braceright
-126 /asciitilde
-127 /.notdef
-128 /fraction
-129 /florin
-130 /quotesingle
-131 /quotedblleft
-132 /guilsinglleft
-133 /guilsinglright
-134 /fi
-135 /fl
-136 /endash
-137 /dagger
-138 /daggerdbl
-139 /bullet
-140 /quotesinglbase
-141 /quotedblbase
-142 /quotedblright
-143 /ellipsis
-144 /dotlessi
-145 /grave
-146 /acute
-147 /circumflex
-148 /tilde
-149 /oe
-150 /breve
-151 /dotaccent
-152 /perthousand
-153 /emdash
-154 /ring
-155 /Lslash
-156 /OE
-157 /hungarumlaut
-158 /ogonek
-159 /caron
-160 /lslash
-161 /exclamdown
-162 /cent
-163 /sterling
-164 /currency
-165 /yen
-166 /brokenbar
-167 /section
-168 /dieresis
-169 /copyright
-170 /ordfeminine
-171 /guillemotleft
-172 /logicalnot
-173 /hyphen
-174 /registered
-175 /macron
-176 /degree
-177 /plusminus
-178 /twosuperior
-179 /threesuperior
-180 /acute
-181 /mu
-182 /paragraph
-183 /periodcentered
-184 /cedilla
-185 /onesuperior
-186 /ordmasculine
-187 /guillemotright
-188 /onequarter
-189 /onehalf
-190 /threequarters
-191 /questiondown
-192 /Agrave
-193 /Aacute
-194 /Acircumflex
-195 /Atilde
-196 /Adieresis
-197 /Aring
-198 /AE
-199 /Ccedilla
-200 /Egrave
-201 /Eacute
-202 /Ecircumflex
-203 /Edieresis
-204 /Igrave
-205 /Iacute
-206 /Icircumflex
-207 /Idieresis
-208 /Eth
-209 /Ntilde
-210 /Ograve
-211 /Oacute
-212 /Ocircumflex
-213 /Otilde
-214 /Odieresis
-215 /multiply
-216 /Oslash
-217 /Ugrave
-218 /Uacute
-219 /Ucircumflex
-220 /Udieresis
-221 /Yacute
-222 /Thorn
-223 /germandbls
-224 /agrave
-225 /aacute
-226 /acircumflex
-227 /atilde
-228 /adieresis
-229 /aring
-230 /ae
-231 /ccedilla
-232 /egrave
-233 /eacute
-234 /ecircumflex
-235 /edieresis
-236 /igrave
-237 /iacute
-238 /icircumflex
-239 /idieresis
-240 /eth
-241 /ntilde
-242 /ograve
-243 /oacute
-244 /ocircumflex
-245 /otilde
-246 /odieresis
-247 /divide
-248 /oslash
-249 /ugrave
-250 /uacute
-251 /ucircumflex
-252 /udieresis
-253 /yacute
-254 /thorn
-255 /ydieresis
-] def
-/Courier /OurCharSet charvec ReEncodeSmall
-/textfont /OurCharSet findfont 11 scalefont def
-/fnamefont /Times-Bold findfont 14 scalefont def
-/headerfont /Times-Bold findfont 12 scalefont def
-textfont setfont
-(a) stringwidth pop /mp_a_x exch def
-%%EndProlog
-%%Page: 1 1
-save
-gsave
-20 421 translate
-0 0 moveto 0 401 rlineto 278 0 rlineto 0 -401 rlineto closepath clip
-278 80 mp_a_x mul div 401 792 div scale
-4 7 translate 270 278 div 784 792 div scale
-textfont setfont
-0 780 moveto (This is a plain text file) show
-grestore
-restore
-showpage
-%%Trailer
-%%Pages: 1

Deleted: trunk/dna-repository/src/test/resources/test.psd
===================================================================
(Binary files differ)

Deleted: trunk/dna-repository/src/test/resources/test.py
===================================================================
--- trunk/dna-repository/src/test/resources/test.py	2009-06-04 21:46:34 UTC (rev 976)
+++ trunk/dna-repository/src/test/resources/test.py	2009-06-04 22:31:30 UTC (rev 977)
@@ -1,365 +0,0 @@
-"""Append module search paths for third-party packages to sys.path.
-
-****************************************************************
-* This module is automatically imported during initialization. *
-****************************************************************
-
-In earlier versions of Python (up to 1.5a3), scripts or modules that
-needed to use site-specific modules would place ``import site''
-somewhere near the top of their code.  Because of the automatic
-import, this is no longer necessary (but code that does it still
-works).
-
-This will append site-specific paths to to the module search path.  On
-Unix, it starts with sys.prefix and sys.exec_prefix (if different) and
-appends lib/python<version>/site-packages as well as lib/site-python.
-On other platforms (mainly Mac and Windows), it uses just sys.prefix
-(and sys.exec_prefix, if different, but this is unlikely).  The
-resulting directories, if they exist, are appended to sys.path, and
-also inspected for path configuration files.
-
-FOR DEBIAN, this sys.path is augmented with directories in /usr/local.
-Local addons go into /usr/local/lib/python<version>/site-packages
-(resp. /usr/local/lib/site-python), Debian addons install into
-/usr/{lib,share}/python<version>/site-packages.
-
-A path configuration file is a file whose name has the form
-<package>.pth; its contents are additional directories (one per line)
-to be added to sys.path.  Non-existing directories (or
-non-directories) are never added to sys.path; no directory is added to
-sys.path more than once.  Blank lines and lines beginning with
-'#' are skipped. Lines starting with 'import' are executed.
-
-For example, suppose sys.prefix and sys.exec_prefix are set to
-/usr/local and there is a directory /usr/local/lib/python2.3/site-packages
-with three subdirectories, foo, bar and spam, and two path
-configuration files, foo.pth and bar.pth.  Assume foo.pth contains the
-following:
-
-  # foo package configuration
-  foo
-  bar
-  bletch
-
-and bar.pth contains:
-
-  # bar package configuration
-  bar
-
-Then the following directories are added to sys.path, in this order:
-
-  /usr/local/lib/python2.3/site-packages/bar
-  /usr/local/lib/python2.3/site-packages/foo
-
-Note that bletch is omitted because it doesn't exist; bar precedes foo
-because bar.pth comes alphabetically before foo.pth; and spam is
-omitted because it is not mentioned in either path configuration file.
-
-After these path manipulations, an attempt is made to import a module
-named sitecustomize, which can perform arbitrary additional
-site-specific customizations.  If this import fails with an
-ImportError exception, it is silently ignored.
-
-"""
-
-import sys, os
-
-
-def makepath(*paths):
-    dir = os.path.abspath(os.path.join(*paths))
-    return dir, os.path.normcase(dir)
-
-for m in sys.modules.values():
-    if hasattr(m, "__file__") and m.__file__:
-        m.__file__ = os.path.abspath(m.__file__)
-del m
-
-# This ensures that the initial path provided by the interpreter contains
-# only absolute pathnames, even if we're running from the build directory.
-L = []
-_dirs_in_sys_path = {}
-dir = dircase = None  # sys.path may be empty at this point
-for dir in sys.path:
-    # Filter out duplicate paths (on case-insensitive file systems also
-    # if they only differ in case); turn relative paths into absolute
-    # paths.
-    dir, dircase = makepath(dir)
-    if not dircase in _dirs_in_sys_path:
-        L.append(dir)
-        _dirs_in_sys_path[dircase] = 1
-sys.path[:] = L
-del dir, dircase, L
-
-# Append ./build/lib.<platform> in case we're running in the build dir
-# (especially for Guido :-)
-# XXX This should not be part of site.py, since it is needed even when
-# using the -S option for Python.  See http://www.python.org/sf/586680
-if (os.name == "posix" and sys.path and
-    os.path.basename(sys.path[-1]) == "Modules"):
-    from distutils.util import get_platform
-    s = "build/lib.%s-%.3s" % (get_platform(), sys.version)
-    s = os.path.join(os.path.dirname(sys.path[-1]), s)
-    sys.path.append(s)
-    del get_platform, s
-
-def _init_pathinfo():
-    global _dirs_in_sys_path
-    _dirs_in_sys_path = d = {}
-    for dir in sys.path:
-        if dir and not os.path.isdir(dir):
-            continue
-        dir, dircase = makepath(dir)
-        d[dircase] = 1
-
-def addsitedir(sitedir):
-    global _dirs_in_sys_path
-    if _dirs_in_sys_path is None:
-        _init_pathinfo()
-        reset = 1
-    else:
-        reset = 0
-    sitedir, sitedircase = makepath(sitedir)
-    if not sitedircase in _dirs_in_sys_path:
-        sys.path.append(sitedir)        # Add path component
-    try:
-        names = os.listdir(sitedir)
-    except os.error:
-        return
-    names.sort()
-    for name in names:
-        if name[-4:] == os.extsep + "pth":
-            addpackage(sitedir, name)
-    if reset:
-        _dirs_in_sys_path = None
-
-def addpackage(sitedir, name):
-    global _dirs_in_sys_path
-    if _dirs_in_sys_path is None:
-        _init_pathinfo()
-        reset = 1
-    else:
-        reset = 0
-    fullname = os.path.join(sitedir, name)
-    try:
-        f = open(fullname)
-    except IOError:
-        return
-    while 1:
-        dir = f.readline()
-        if not dir:
-            break
-        if dir[0] == '#':
-            continue
-        if dir.startswith("import"):
-            exec dir
-            continue
-        if dir[-1] == '\n':
-            dir = dir[:-1]
-        dir, dircase = makepath(sitedir, dir)
-        if not dircase in _dirs_in_sys_path and os.path.exists(dir):
-            sys.path.append(dir)
-            _dirs_in_sys_path[dircase] = 1
-    if reset:
-        _dirs_in_sys_path = None
-
-prefixes = [os.path.join(sys.prefix, "local"), sys.prefix]
-sitedir = None # make sure sitedir is initialized because of later 'del'
-if sys.exec_prefix != sys.prefix:
-    prefixes.append(os.path.join(sys.exec_prefix, "local"))
-for prefix in prefixes:
-    if prefix:
-        if sys.platform in ('os2emx', 'riscos'):
-            sitedirs = [os.path.join(prefix, "Lib", "site-packages")]
-        elif os.sep == '/':
-            sitedirs = [os.path.join(prefix,
-                                     "lib",
-                                     "python" + sys.version[:3],
-                                     "site-packages"),
-                        os.path.join(prefix, "lib", "site-python")]
-        else:
-            sitedirs = [prefix, os.path.join(prefix, "lib", "site-packages")]
-        if sys.platform == 'darwin':
-            # for framework builds *only* we add the standard Apple
-            # locations. Currently only per-user, but /Library and
-            # /Network/Library could be added too
-            if 'Python.framework' in prefix:
-                home = os.environ.get('HOME')
-                if home:
-                    sitedirs.append(
-                        os.path.join(home,
-                                     'Library',
-                                     'Python',
-                                     sys.version[:3],
-                                     'site-packages'))
-        for sitedir in sitedirs:
-            if os.path.isdir(sitedir):
-                addsitedir(sitedir)
-del prefix, sitedir
-
-_dirs_in_sys_path = None
-
-
-# Define new built-ins 'quit' and 'exit'.
-# These are simply strings that display a hint on how to exit.
-if os.sep == ':':
-    exit = 'Use Cmd-Q to quit.'
-elif os.sep == '\\':
-    exit = 'Use Ctrl-Z plus Return to exit.'
-else:
-    exit = 'Use Ctrl-D (i.e. EOF) to exit.'
-import __builtin__
-__builtin__.quit = __builtin__.exit = exit
-del exit
-
-# interactive prompt objects for printing the license text, a list of
-# contributors and the copyright notice.
-class _Printer:
-    MAXLINES = 23
-
-    def __init__(self, name, data, files=(), dirs=()):
-        self.__name = name
-        self.__data = data
-        self.__files = files
-        self.__dirs = dirs
-        self.__lines = None
-
-    def __setup(self):
-        if self.__lines:
-            return
-        data = None
-        for dir in self.__dirs:
-            for file in self.__files:
-                file = os.path.join(dir, file)
-                try:
-                    fp = open(file)
-                    data = fp.read()
-                    fp.close()
-                    break
-                except IOError:
-                    pass
-            if data:
-                break
-        if not data:
-            data = self.__data
-        self.__lines = data.split('\n')
-        self.__linecnt = len(self.__lines)
-
-    def __repr__(self):
-        self.__setup()
-        if len(self.__lines) <= self.MAXLINES:
-            return "\n".join(self.__lines)
-        else:
-            return "Type %s() to see the full %s text" % ((self.__name,)*2)
-
-    def __call__(self):
-        self.__setup()
-        prompt = 'Hit Return for more, or q (and Return) to quit: '
-        lineno = 0
-        while 1:
-            try:
-                for i in range(lineno, lineno + self.MAXLINES):
-                    print self.__lines[i]
-            except IndexError:
-                break
-            else:
-                lineno += self.MAXLINES
-                key = None
-                while key is None:
-                    key = raw_input(prompt)
-                    if key not in ('', 'q'):
-                        key = None
-                if key == 'q':
-                    break
-
-__builtin__.copyright = _Printer("copyright", sys.copyright)
-if sys.platform[:4] == 'java':
-    __builtin__.credits = _Printer(
-        "credits",
-        "Jython is maintained by the Jython developers (www.jython.org).")
-else:
-    __builtin__.credits = _Printer("credits", """\
-Thanks to CWI, CNRI, BeOpen.com, Zope Corporation and a cast of thousands
-for supporting Python development.  See www.python.org for more information.""")
-here = os.path.dirname(os.__file__)
-__builtin__.license = _Printer(
-    "license", "See http://www.python.org/%.3s/license.html" % sys.version,
-    ["LICENSE.txt", "LICENSE"],
-    [os.path.join(here, os.pardir), here, os.curdir])
-
-
-# Define new built-in 'help'.
-# This is a wrapper around pydoc.help (with a twist).
-
-class _Helper:
-    def __repr__(self):
-        return "Type help() for interactive help, " \
-               "or help(object) for help about object."
-    def __call__(self, *args, **kwds):
-        import pydoc
-        return pydoc.help(*args, **kwds)
-
-__builtin__.help = _Helper()
-
-
-# On Windows, some default encodings are not provided
-# by Python (e.g. "cp932" in Japanese locale), while they
-# are always available as "mbcs" in each locale.
-# Make them usable by aliasing to "mbcs" in such a case.
-
-if sys.platform == 'win32':
-    import locale, codecs
-    enc = locale.getdefaultlocale()[1]
-    if enc.startswith('cp'):            # "cp***" ?
-        try:
-            codecs.lookup(enc)
-        except LookupError:
-            import encodings
-            encodings._cache[enc] = encodings._unknown
-            encodings.aliases.aliases[enc] = 'mbcs'
-
-# Set the string encoding used by the Unicode implementation.  The
-# default is 'ascii', but if you're willing to experiment, you can
-# change this.
-
-encoding = "ascii" # Default value set by _PyUnicode_Init()
-
-if 0:
-    # Enable to support locale aware default string encodings.
-    import locale
-    loc = locale.getdefaultlocale()
-    if loc[1]:
-        encoding = loc[1]
-
-if 0:
-    # Enable to switch off string to Unicode coercion and implicit
-    # Unicode to string conversion.
-    encoding = "undefined"
-
-if encoding != "ascii":
-    # On Non-Unicode builds this will raise an AttributeError...
-    sys.setdefaultencoding(encoding) # Needs Python Unicode build !
-
-#
-# Run custom site specific code, if available.
-#
-try:
-    import sitecustomize
-except ImportError:
-    pass
-
-#
-# Remove sys.setdefaultencoding() so that users cannot change the
-# encoding after initialization.  The test for presence is needed when
-# this module is run as a script, because this code is executed twice.
-#
-if hasattr(sys, "setdefaultencoding"):
-    del sys.setdefaultencoding
-
-def _test():
-    print "sys.path = ["
-    for dir in sys.path:
-        print "    %s," % `dir`
-    print "]"
-
-if __name__ == '__main__':
-    _test()

Deleted: trunk/dna-repository/src/test/resources/test.rtf
===================================================================
--- trunk/dna-repository/src/test/resources/test.rtf	2009-06-04 21:46:34 UTC (rev 976)
+++ trunk/dna-repository/src/test/resources/test.rtf	2009-06-04 22:31:30 UTC (rev 977)
@@ -1,16 +0,0 @@
-{\rtf1\ansi\ansicpg1252\uc1\deff0\stshfdbch0\stshfloch0\stshfhich0\stshfbi0\deflang1033\deflangfe1033{\fonttbl{\f0\froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\f36\froman\fcharset238\fprq2 Times New Roman CE;}
-{\f37\froman\fcharset204\fprq2 Times New Roman Cyr;}{\f39\froman\fcharset161\fprq2 Times New Roman Greek;}{\f40\froman\fcharset162\fprq2 Times New Roman Tur;}{\f41\froman\fcharset177\fprq2 Times New Roman (Hebrew);}
-{\f42\froman\fcharset178\fprq2 Times New Roman (Arabic);}{\f43\froman\fcharset186\fprq2 Times New Roman Baltic;}{\f44\froman\fcharset163\fprq2 Times New Roman (Vietnamese);}}{\colortbl;\red0\green0\blue0;\red0\green0\blue255;\red0\green255\blue255;
-\red0\green255\blue0;\red255\green0\blue255;\red255\green0\blue0;\red255\green255\blue0;\red255\green255\blue255;\red0\green0\blue128;\red0\green128\blue128;\red0\green128\blue0;\red128\green0\blue128;\red128\green0\blue0;\red128\green128\blue0;
-\red128\green128\blue128;\red192\green192\blue192;}{\stylesheet{\ql \li0\ri0\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \fs24\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 \snext0 Normal;}{\*\cs10 \additive \ssemihidden 
-Default Paragraph Font;}{\*\ts11\tsrowd\trftsWidthB3\trpaddl108\trpaddr108\trpaddfl3\trpaddft3\trpaddfb3\trpaddfr3\trcbpat1\trcfpat1\tscellwidthfts0\tsvertalt\tsbrdrt\tsbrdrl\tsbrdrb\tsbrdrr\tsbrdrdgl\tsbrdrdgr\tsbrdrh\tsbrdrv 
-\ql \li0\ri0\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \fs20\lang1024\langfe1024\cgrid\langnp1024\langfenp1024 \snext11 \ssemihidden Normal Table;}}{\*\rsidtbl \rsid5531693}{\*\generator Microsoft Word 10.0.2627;}{\info
-{\title This is a test RTF document}{\author David Castro}{\operator David Castro}{\creatim\yr2004\mo6\dy17\hr19\min29}{\revtim\yr2004\mo6\dy17\hr19\min30}{\version1}{\edmins1}{\nofpages1}{\nofwords4}{\nofchars25}{\*\company Azusa Pacific University}
-{\nofcharsws28}{\vern16437}}\widowctrl\ftnbj\aenddoc\noxlattoyen\expshrtn\noultrlspc\dntblnsbdb\nospaceforul\formshade\horzdoc\dgmargin\dghspace180\dgvspace180\dghorigin1800\dgvorigin1440\dghshow1\dgvshow1
-\jexpand\viewkind1\viewscale100\pgbrdrhead\pgbrdrfoot\splytwnine\ftnlytwnine\htmautsp\nolnhtadjtbl\useltbaln\alntblind\lytcalctblwd\lyttblrtgr\lnbrkrule\nobrkwrptbl\snaptogridincell\allowfieldendsel\wrppunct\asianbrkrule\rsidroot5531693 \fet0\sectd 
-\linex0\endnhere\sectlinegrid360\sectdefaultcl\sftnbj {\*\pnseclvl1\pnucrm\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl2\pnucltr\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl3\pndec\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl4
-\pnlcltr\pnstart1\pnindent720\pnhang {\pntxta )}}{\*\pnseclvl5\pndec\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl6\pnlcltr\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl7\pnlcrm\pnstart1\pnindent720\pnhang {\pntxtb (}
-{\pntxta )}}{\*\pnseclvl8\pnlcltr\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl9\pnlcrm\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}\pard\plain \ql \li0\ri0\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 
-\fs24\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\insrsid5531693 This is a test RTF document
-\par 
-\par }}
\ No newline at end of file

Deleted: trunk/dna-repository/src/test/resources/test.sh
===================================================================
--- trunk/dna-repository/src/test/resources/test.sh	2009-06-04 21:46:34 UTC (rev 976)
+++ trunk/dna-repository/src/test/resources/test.sh	2009-06-04 22:31:30 UTC (rev 977)
@@ -1,3 +0,0 @@
-#!/bin/bash
-
-echo "this is a test bash script"

Deleted: trunk/dna-repository/src/test/resources/test.tar
===================================================================
(Binary files differ)

Deleted: trunk/dna-repository/src/test/resources/test.tar.gz
===================================================================
(Binary files differ)

Deleted: trunk/dna-repository/src/test/resources/test.tga
===================================================================
(Binary files differ)

Deleted: trunk/dna-repository/src/test/resources/test.txt
===================================================================
--- trunk/dna-repository/src/test/resources/test.txt	2009-06-04 21:46:34 UTC (rev 976)
+++ trunk/dna-repository/src/test/resources/test.txt	2009-06-04 22:31:30 UTC (rev 977)
@@ -1 +0,0 @@
-This is a plain text file

Deleted: trunk/dna-repository/src/test/resources/test.txt.gz
===================================================================
(Binary files differ)

Deleted: trunk/dna-repository/src/test/resources/test.wav
===================================================================
(Binary files differ)

Deleted: trunk/dna-repository/src/test/resources/test.wmf
===================================================================
(Binary files differ)

Deleted: trunk/dna-repository/src/test/resources/test.xcf
===================================================================
(Binary files differ)

Deleted: trunk/dna-repository/src/test/resources/test.xml
===================================================================
--- trunk/dna-repository/src/test/resources/test.xml	2009-06-04 21:46:34 UTC (rev 976)
+++ trunk/dna-repository/src/test/resources/test.xml	2009-06-04 22:31:30 UTC (rev 977)
@@ -1,47 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE magic PUBLIC "-//jMimeMagic//DTD magic config 1.0//EN" "magic_1_0.dtd">
-<magic>
-<info>
-<version>0.1</version>
-<author>arimus at users.sourceforge.net</author>
-<description>XML magic file</description>
-</info>
-<match-list>
-<match>
-	<mimetype>application/x-tar</mimetype>
-	<extension>tar</extension>
-	<description>POSIX tar archive</description>
-	<test offset="257" type="string" comparator="=">ustar\000</test>
-</match>
-<match>
-	<mimetype>application/x-tar</mimetype>
-	<extension>tar</extension>
-	<description>tar archive</description>
-	<test offset="257" type="string" comparator="=">ustar  \000GNU</test>
-</match>
-<match>
-	<mimetype>application/zip</mimetype>
-	<extension>zip</extension>
-	<description>archive data</description>
-	<test offset="0" type="string" comparator="=">PK\003\004</test>
-</match>
-<match>
-	<mimetype>application/x-gzip</mimetype>
-	<extension>gz</extension>
-	<description>gzip compressed data</description>
-	<test offset="0" type="string" comparator="=">\037\213</test>
-</match>
-<match>
-	<mimetype>application/x-bzip2</mimetype>
-	<extension>bz2</extension>
-	<description>bzip2 compressed data</description>
-	<test offset="0" type="string" comparator="=">BZh</test>
-</match>
-<match>
-	<mimetype>???</mimetype>
-	<extension>bat</extension>
-	<description>MS-DOS batch file text</description>
-	<test offset="0" type="string" comparator="=">@echo off</test>
-</match>
-</match-list>
-</magic>

Deleted: trunk/dna-repository/src/test/resources/test.xpm
===================================================================
--- trunk/dna-repository/src/test/resources/test.xpm	2009-06-04 21:46:34 UTC (rev 976)
+++ trunk/dna-repository/src/test/resources/test.xpm	2009-06-04 22:31:30 UTC (rev 977)
@@ -1,255 +0,0 @@
-/* XPM */
-static char * test_xpm[] = {
-"100 100 152 2",
-"  	c #FFFFFF",
-". 	c #000000",
-"+ 	c #FAFAFA",
-"@ 	c #ABABAB",
-"# 	c #5E5E5E",
-"$ 	c #2A2A2A",
-"% 	c #0D0D0D",
-"& 	c #030303",
-"* 	c #0B0B0B",
-"= 	c #292929",
-"- 	c #616161",
-"; 	c #B6B6B6",
-"> 	c #FEFEFE",
-", 	c #DBDBDB",
-"' 	c #7E7E7E",
-") 	c #434343",
-"! 	c #1A1A1A",
-"~ 	c #0A0A0A",
-"{ 	c #121212",
-"] 	c #353535",
-"^ 	c #6E6E6E",
-"/ 	c #C3C3C3",
-"( 	c #1D1D1D",
-"_ 	c #343434",
-": 	c #D3D3D3",
-"< 	c #F6F6F6",
-"[ 	c #6A6A6A",
-"} 	c #020202",
-"| 	c #2B2B2B",
-"1 	c #707070",
-"2 	c #0C0C0C",
-"3 	c #C0C0C0",
-"4 	c #FCFCFC",
-"5 	c #444444",
-"6 	c #767676",
-"7 	c #5F5F5F",
-"8 	c #BABABA",
-"9 	c #EBEBEB",
-"0 	c #E5E5E5",
-"a 	c #A4A4A4",
-"b 	c #101010",
-"c 	c #DEDEDE",
-"d 	c #999999",
-"e 	c #505050",
-"f 	c #B5B5B5",
-"g 	c #E7E7E7",
-"h 	c #F8F8F8",
-"i 	c #DDDDDD",
-"j 	c #A5A5A5",
-"k 	c #4E4E4E",
-"l 	c #C2C2C2",
-"m 	c #F7F7F7",
-"n 	c #4D4D4D",
-"o 	c #494949",
-"p 	c #393939",
-"q 	c #717171",
-"r 	c #DCDCDC",
-"s 	c #4C4C4C",
-"t 	c #2D2D2D",
-"u 	c #F2F2F2",
-"v 	c #1C1C1C",
-"w 	c #D0D0D0",
-"x 	c #C1C1C1",
-"y 	c #8B8B8B",
-"z 	c #797979",
-"A 	c #050505",
-"B 	c #9D9D9D",
-"C 	c #D2D2D2",
-"D 	c #3D3D3D",
-"E 	c #212121",
-"F 	c #3A3A3A",
-"G 	c #CFCFCF",
-"H 	c #F3F3F3",
-"I 	c #181818",
-"J 	c #6B6B6B",
-"K 	c #1E1E1E",
-"L 	c #B9B9B9",
-"M 	c #171717",
-"N 	c #010101",
-"O 	c #060606",
-"P 	c #E4E4E4",
-"Q 	c #151515",
-"R 	c #202020",
-"S 	c #696969",
-"T 	c #AAAAAA",
-"U 	c #E9E9E9",
-"V 	c #7B7B7B",
-"W 	c #454545",
-"X 	c #626262",
-"Y 	c #F1F1F1",
-"Z 	c #0F0F0F",
-"` 	c #EEEEEE",
-" .	c #BEBEBE",
-"..	c #3B3B3B",
-"+.	c #333333",
-"@.	c #F5F5F5",
-"#.	c #2F2F2F",
-"$.	c #C9C9C9",
-"%.	c #828282",
-"&.	c #080808",
-"*.	c #838383",
-"=.	c #646464",
-"-.	c #848484",
-";.	c #9E9E9E",
-">.	c #B3B3B3",
-",.	c #F9F9F9",
-"'.	c #222222",
-").	c #7A7A7A",
-"!.	c #131313",
-"~.	c #EAEAEA",
-"{.	c #B0B0B0",
-"].	c #BCBCBC",
-"^.	c #424242",
-"/.	c #414141",
-"(.	c #747474",
-"_.	c #373737",
-":.	c #262626",
-"<.	c #8D8D8D",
-"[.	c #CECECE",
-"}.	c #EFEFEF",
-"|.	c #FBFBFB",
-"1.	c #DADADA",
-"2.	c #ACACAC",
-"3.	c #232323",
-"4.	c #E1E1E1",
-"5.	c #E8E8E8",
-"6.	c #4F4F4F",
-"7.	c #A8A8A8",
-"8.	c #757575",
-"9.	c #272727",
-"0.	c #BBBBBB",
-"a.	c #F0F0F0",
-"b.	c #B7B7B7",
-"c.	c #040404",
-"d.	c #515151",
-"e.	c #C5C5C5",
-"f.	c #0E0E0E",
-"g.	c #8E8E8E",
-"h.	c #090909",
-"i.	c #BDBDBD",
-"j.	c #111111",
-"k.	c #2E2E2E",
-"l.	c #5C5C5C",
-"m.	c #ECECEC",
-"n.	c #E3E3E3",
-"o.	c #787878",
-"p.	c #141414",
-"q.	c #070707",
-"r.	c #545454",
-"s.	c #9A9A9A",
-"t.	c #E0E0E0",
-"u.	c #1B1B1B",
-"                                                                                                                                                                                                        ",
-"                                                                                                                                                                                                        ",
-"                                                                                                                                                                                                        ",
-"                                                                                                                                                                                                        ",
-"                                                                                                                                                                                                        ",
-"                                                                                                                                                                                                        ",
-"                                                                                                                                                                                                        ",
-"                                                                                                                                                                                                        ",
-"                                                                                                                                                                                                        ",
-"                                                                                                                                                                                                        ",
-"                                                                                                                                                                                                        ",
-"                                                                                                                                                                                                        ",
-"                                                                                                                                                                                                        ",
-"                                                                                                                                                                                                        ",
-"                                                                                                                                                                                                        ",
-"                                                                                                                                                                                                        ",
-"                                                                                                                                                                                                        ",
-"                                                                                                                                                                                                        ",
-"                                                                                                                                                                                                        ",
-"                                                                                                                                                                                                        ",
-"                                                                                                                                                                                                        ",
-"                                                                                                                                                                                                        ",
-"                                                                                                                                                                                                        ",
-"                                                                                                                                                                                                        ",
-"                                                                                                                                                                                                        ",
-"                                                                                                                                                                                                        ",
-"                                                                                                                                                                                                        ",
-"                                                                                                                                                                                                        ",
-"                                                                                                                                                                                                        ",
-"                                                                                                                                                                                                        ",
-"                                                                                                                                                                                                        ",
-"                                                                                                                                                                                                        ",
-"                                                                                                                                                                                                        ",
-"                                                                                                                                                                                                        ",
-"                                                                                                                                                                                                        ",
-"                                                                                                                                                                                                        ",
-"                                                                                                                                                                                                        ",
-"                    . . . . . . . . . . . . . . . . . . . . . . . .                                                                                                                                     ",
-"                    . . . . . . . . . . . . . . . . . . . . . . . .                                                                                   . . . .                                           ",
-"                    . . . . . . . . . . . . . . . . . . . . . . . .                                                                                   . . . .                                           ",
-"                                        . . . .                                                                                                       . . . .                                           ",
-"                                        . . . .                                                                                                       . . . .                                           ",
-"                                        . . . .                                                                                                       . . . .                                           ",
-"                                        . . . .                     + @ # $ % & * = - ; >                       , ' ) ! ~ & { ] ^ /                   . . . .                                           ",
-"                                        . . . .                   @ ( . . . . . . . . . _ :                 < [ } . . . . . . . . . | ;         . . . . . . . . . . . . . .                             ",
-"                                        . . . .               > 1 . . . . . . . . . . . . 2 3             4 5 . . . . . . . . . . . . .         . . . . . . . . . . . . . .                             ",
-"                                        . . . .               6 . . . & 7 8 9 + 0 a $ . . . b c           d . . . . e f g + h i j k } .         . . . . . . . . . . . . . .                             ",
-"                                        . . . .             8 . . . b l             m n . . . o           p . . . q                 r s               . . . .                                           ",
-"                                        . . . .             t . . . ;                 u v . . . w         * . . . 0                                   . . . .                                           ",
-"                                        . . . .           x . . . 5                     y . . . z         A . . . +                                   . . . .                                           ",
-"                                        . . . .           q . . . B                     C . . . D         E . . . 3                                   . . . .                                           ",
-"                                        . . . .           F . . . G                     H . . . I         J . . . K L                                 . . . .                                           ",
-"                                        . . . .           M . . . & & & & } } } N N N . . . . . O         P Q . . . . R S T U                         . . . .                                           ",
-"                                        . . . .           A . . . . . . . . . . . . . . . . . . .           : $ . . . . . . . | V r                   . . . .                                           ",
-"                                        . . . .           } . . . . . . . . . . . . . . . . . . .             4 j W O . . . . . . } X Y               . . . .                                           ",
-"                                        . . . .           Z . . . `                                                 <  .' ..& . . . . +. at .            . . . .                                           ",
-"                                        . . . .           #.. . . $.                                                        U %.&.. . . *.            . . . .                                           ",
-"                                        . . . .           =.. . . -.                                                            ;.. . . |             . . . .                                           ",
-"                                        . . . .           >.. . . R ,.                                                          H . . . &.            A . . . 4                                         ",
-"                                        . . . .           4 '.. . . ).                                                          U . . . 2             !.. . . ~.                                        ",
-"                                        . . . .             {.. . . . ' 4                   ].^.          /.8 >                 (.. . . D             _.. . . f                                         ",
-"                                        . . . .               q . . . . :.<.[.}.|.}.1.2.(.3.. .           . . '.(.f 4.,.4 5.; 6.. . . . 7.            8.. . . 9.0.a.>                                   ",
-"                                        . . . .               > 8.. . . . . . . . . . . . . . .           . . . . . . . . . . . . . . -               1.O . . . . . . . . .                             ",
-"                                        . . . .                   b.$ . . . . . . . . . . c.d.e.          . . . . . . . . . . . . f.g.>                 a h.. . . . . . . .                             ",
-"                                        . . . .                     > i.^ _.Q c.& j.k.l.;.m.              n.T o.k t p.q.& f.:.r.s.`                       t.%.) u.* N . . .                             ",
-"                                                                                                                                                                                                        ",
-"                                                                                                                                                                                                        ",
-"                                                                                                                                                                                                        ",
-"                                                                                                                                                                                                        ",
-"                                                                                                                                                                                                        ",
-"                                                                                                                                                                                                        ",
-"                                                                                                                                                                                                        ",
-"                                                                                                                                                                                                        ",
-"                                                                                                                                                                                                        ",
-"                                                                                                                                                                                                        ",
-"                                                                                                                                                                                                        ",
-"                                                                                                                                                                                                        ",
-"                                                                                                                                                                                                        ",
-"                                                                                                                                                                                                        ",
-"                                                                                                                                                                                                        ",
-"                                                                                                                                                                                                        ",
-"                                                                                                                                                                                                        ",
-"                                                                                                                                                                                                        ",
-"                                                                                                                                                                                                        ",
-"                                                                                                                                                                                                        ",
-"                                                                                                                                                                                                        ",
-"                                                                                                                                                                                                        ",
-"                                                                                                                                                                                                        ",
-"                                                                                                                                                                                                        ",
-"                                                                                                                                                                                                        ",
-"                                                                                                                                                                                                        ",
-"                                                                                                                                                                                                        ",
-"                                                                                                                                                                                                        ",
-"                                                                                                                                                                                                        ",
-"                                                                                                                                                                                                        ",
-"                                                                                                                                                                                                        ",
-"                                                                                                                                                                                                        ",
-"                                                                                                                                                                                                        ",
-"                                                                                                                                                                                                        ",
-"                                                                                                                                                                                                        "};

Deleted: trunk/dna-repository/src/test/resources/test_1.2.class
===================================================================
(Binary files differ)

Deleted: trunk/dna-repository/src/test/resources/test_1.3.class
===================================================================
(Binary files differ)

Deleted: trunk/dna-repository/src/test/resources/test_1.4.class
===================================================================
(Binary files differ)

Deleted: trunk/dna-repository/src/test/resources/test_128_44_jstereo.mp3
===================================================================
(Binary files differ)

Deleted: trunk/dna-repository/src/test/resources/test_excel_2000.xls
===================================================================
(Binary files differ)

Deleted: trunk/dna-repository/src/test/resources/test_excel_spreadsheet.xml
===================================================================
--- trunk/dna-repository/src/test/resources/test_excel_spreadsheet.xml	2009-06-04 21:46:34 UTC (rev 976)
+++ trunk/dna-repository/src/test/resources/test_excel_spreadsheet.xml	2009-06-04 22:31:30 UTC (rev 977)
@@ -1,62 +0,0 @@
-<?xml version="1.0"?>
-<Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet"
- xmlns:o="urn:schemas-microsoft-com:office:office"
- xmlns:x="urn:schemas-microsoft-com:office:excel"
- xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet"
- xmlns:html="http://www.w3.org/TR/REC-html40">
- <DocumentProperties xmlns="urn:schemas-microsoft-com:office:office">
-  <Author>David Castro</Author>
-  <LastAuthor>David Castro</LastAuthor>
-  <Created>2004-06-16T02:29:05Z</Created>
-  <LastSaved>2004-06-16T02:29:24Z</LastSaved>
-  <Company>Azusa Pacific University</Company>
-  <Version>10.2625</Version>
- </DocumentProperties>
- <OfficeDocumentSettings xmlns="urn:schemas-microsoft-com:office:office">
-  <DownloadComponents/>
-  <LocationOfComponents HRef="file:///Z:\mnt\c\Documents%20and%20Settings\Administrator\Desktop\download\Office%20XP%20Pro\"/>
- </OfficeDocumentSettings>
- <ExcelWorkbook xmlns="urn:schemas-microsoft-com:office:excel">
-  <WindowHeight>12660</WindowHeight>
-  <WindowWidth>17100</WindowWidth>
-  <WindowTopX>360</WindowTopX>
-  <WindowTopY>60</WindowTopY>
-  <ProtectStructure>False</ProtectStructure>
-  <ProtectWindows>False</ProtectWindows>
- </ExcelWorkbook>
- <Styles>
-  <Style ss:ID="Default" ss:Name="Normal">
-   <Alignment ss:Vertical="Bottom"/>
-   <Borders/>
-   <Font/>
-   <Interior/>
-   <NumberFormat/>
-   <Protection/>
-  </Style>
- </Styles>
- <Worksheet ss:Name="Sheet1">
-  <Table ss:ExpandedColumnCount="1" ss:ExpandedRowCount="1" x:FullColumns="1"
-   x:FullRows="1">
-   <Row>
-    <Cell><Data ss:Type="String">Test excel 2000 spreadsheet</Data></Cell>
-   </Row>
-  </Table>
-  <WorksheetOptions xmlns="urn:schemas-microsoft-com:office:excel">
-   <Selected/>
-   <ProtectObjects>False</ProtectObjects>
-   <ProtectScenarios>False</ProtectScenarios>
-  </WorksheetOptions>
- </Worksheet>
- <Worksheet ss:Name="Sheet2">
-  <WorksheetOptions xmlns="urn:schemas-microsoft-com:office:excel">
-   <ProtectObjects>False</ProtectObjects>
-   <ProtectScenarios>False</ProtectScenarios>
-  </WorksheetOptions>
- </Worksheet>
- <Worksheet ss:Name="Sheet3">
-  <WorksheetOptions xmlns="urn:schemas-microsoft-com:office:excel">
-   <ProtectObjects>False</ProtectObjects>
-   <ProtectScenarios>False</ProtectScenarios>
-  </WorksheetOptions>
- </Worksheet>
-</Workbook>

Deleted: trunk/dna-repository/src/test/resources/test_excel_web_archive.mht
===================================================================
--- trunk/dna-repository/src/test/resources/test_excel_web_archive.mht	2009-06-04 21:46:34 UTC (rev 976)
+++ trunk/dna-repository/src/test/resources/test_excel_web_archive.mht	2009-06-04 22:31:30 UTC (rev 977)
@@ -1,155 +0,0 @@
-MIME-Version: 1.0
-X-Document-Type: Worksheet
-Content-Location: file:///C:/2A65B325/test_excel_web_archive.htm
-Content-Transfer-Encoding: quoted-printable
-Content-Type: text/html; charset="us-ascii"
-
-<html xmlns:o=3D"urn:schemas-microsoft-com:office:office"
-xmlns:x=3D"urn:schemas-microsoft-com:office:excel"
-xmlns=3D"http://www.w3.org/TR/REC-html40">
-
-<head>
-<meta http-equiv=3DContent-Type content=3D"text/html; charset=3Dus-ascii">
-<meta name=3DProgId content=3DExcel.Sheet>
-<meta name=3DGenerator content=3D"Microsoft Excel 10">
-<link rel=3DFile-List href=3D"test_excel_web_archive_files/filelist.xml">
-<link rel=3DEdit-Time-Data href=3D"test_excel_web_archive_files/editdata.ms=
-o">
-<link rel=3DOLE-Object-Data href=3D"test_excel_web_archive_files/oledata.ms=
-o">
-<!--[if gte mso 9]><xml>
- <o:DocumentProperties>
-  <o:Author>David Castro</o:Author>
-  <o:LastAuthor>David Castro</o:LastAuthor>
-  <o:Created>2004-06-16T02:29:05Z</o:Created>
-  <o:LastSaved>2004-06-16T02:31:29Z</o:LastSaved>
-  <o:Company>Azusa Pacific University</o:Company>
-  <o:Version>10.2625</o:Version>
- </o:DocumentProperties>
- <o:OfficeDocumentSettings>
-  <o:DownloadComponents/>
-  <o:LocationOfComponents HRef=3D"file:///Z:\mnt\c\Documents%20and%20Settin=
-gs\Administrator\Desktop\download\Office%20XP%20Pro\"/>
- </o:OfficeDocumentSettings>
-</xml><![endif]-->
-<style>
-<!--table
-	{mso-displayed-decimal-separator:"\.";
-	mso-displayed-thousand-separator:"\,";}
- at page
-	{margin:1.0in .75in 1.0in .75in;
-	mso-header-margin:.5in;
-	mso-footer-margin:.5in;}
-tr
-	{mso-height-source:auto;}
-col
-	{mso-width-source:auto;}
-br
-	{mso-data-placement:same-cell;}
-.style0
-	{mso-number-format:General;
-	text-align:general;
-	vertical-align:bottom;
-	white-space:nowrap;
-	mso-rotate:0;
-	mso-background-source:auto;
-	mso-pattern:auto;
-	color:windowtext;
-	font-size:10.0pt;
-	font-weight:400;
-	font-style:normal;
-	text-decoration:none;
-	font-family:Arial;
-	mso-generic-font-family:auto;
-	mso-font-charset:0;
-	border:none;
-	mso-protection:locked visible;
-	mso-style-name:Normal;
-	mso-style-id:0;}
-td
-	{mso-style-parent:style0;
-	padding-top:1px;
-	padding-right:1px;
-	padding-left:1px;
-	mso-ignore:padding;
-	color:windowtext;
-	font-size:10.0pt;
-	font-weight:400;
-	font-style:normal;
-	text-decoration:none;
-	font-family:Arial;
-	mso-generic-font-family:auto;
-	mso-font-charset:0;
-	mso-number-format:General;
-	text-align:general;
-	vertical-align:bottom;
-	border:none;
-	mso-background-source:auto;
-	mso-pattern:auto;
-	mso-protection:locked visible;
-	white-space:nowrap;
-	mso-rotate:0;}
--->
-</style>
-<!--[if gte mso 9]><xml>
- <x:ExcelWorkbook>
-  <x:ExcelWorksheets>
-   <x:ExcelWorksheet>
-    <x:Name>Sheet1</x:Name>
-    <x:WorksheetOptions>
-     <x:Selected/>
-     <x:ProtectContents>False</x:ProtectContents>
-     <x:ProtectObjects>False</x:ProtectObjects>
-     <x:ProtectScenarios>False</x:ProtectScenarios>
-    </x:WorksheetOptions>
-   </x:ExcelWorksheet>
-   <x:ExcelWorksheet>
-    <x:Name>Sheet2</x:Name>
-    <x:WorksheetOptions>
-     <x:ProtectContents>False</x:ProtectContents>
-     <x:ProtectObjects>False</x:ProtectObjects>
-     <x:ProtectScenarios>False</x:ProtectScenarios>
-    </x:WorksheetOptions>
-   </x:ExcelWorksheet>
-   <x:ExcelWorksheet>
-    <x:Name>Sheet3</x:Name>
-    <x:WorksheetOptions>
-     <x:ProtectContents>False</x:ProtectContents>
-     <x:ProtectObjects>False</x:ProtectObjects>
-     <x:ProtectScenarios>False</x:ProtectScenarios>
-    </x:WorksheetOptions>
-   </x:ExcelWorksheet>
-  </x:ExcelWorksheets>
-  <x:WindowHeight>12660</x:WindowHeight>
-  <x:WindowWidth>17100</x:WindowWidth>
-  <x:WindowTopX>360</x:WindowTopX>
-  <x:WindowTopY>60</x:WindowTopY>
-  <x:ProtectStructure>False</x:ProtectStructure>
-  <x:ProtectWindows>False</x:ProtectWindows>
- </x:ExcelWorkbook>
-</xml><![endif]-->
-</head>
-
-<body link=3Dblue vlink=3Dpurple>
-
-<table x:str border=3D0 cellpadding=3D0 cellspacing=3D0 width=3D192 style=
-=3D'border-collapse:
- collapse;table-layout:fixed;width:144pt'>
- <col width=3D64 span=3D3 style=3D'width:48pt'>
- <tr height=3D17 style=3D'height:12.75pt'>
-  <td height=3D17 colspan=3D3 width=3D192 style=3D'height:12.75pt;mso-ignor=
-e:colspan;
-  width:144pt'>Test excel 2000 spreadsheet</td>
- </tr>
- <![if supportMisalignedColumns]>
- <tr height=3D0 style=3D'display:none'>
-  <td width=3D64 style=3D'width:48pt'></td>
-  <td width=3D64 style=3D'width:48pt'></td>
-  <td width=3D64 style=3D'width:48pt'></td>
- </tr>
- <![endif]>
-</table>
-
-</body>
-
-</html>

Deleted: trunk/dna-repository/src/test/resources/test_nocompress.tif
===================================================================
(Binary files differ)

Deleted: trunk/dna-repository/src/test/resources/test_word_2000.doc
===================================================================
(Binary files differ)

Deleted: trunk/dna-repository/src/test/resources/test_word_6.0_95.doc
===================================================================
(Binary files differ)

Modified: trunk/docs/examples/gettingstarted/pom.xml
===================================================================
--- trunk/docs/examples/gettingstarted/pom.xml	2009-06-04 21:46:34 UTC (rev 976)
+++ trunk/docs/examples/gettingstarted/pom.xml	2009-06-04 22:31:30 UTC (rev 977)
@@ -84,41 +84,6 @@
         <version>1.0.1</version>
         <scope>compile</scope>
       </dependency>
-      <!-- Apache Jackrabbit (JCR Implementation) -->
-      <dependency>
-        <groupId>org.apache.jackrabbit</groupId>
-        <artifactId>jackrabbit-api</artifactId>
-        <version>1.3.3</version>
-        <scope>compile</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.3.3</version>
-        <scope>compile</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>
       <!-- Testing (note the scope) -->
       <dependency>
         <groupId>junit</groupId>

Modified: trunk/docs/gettingstarted/src/main/docbook/en-US/content/custom_sequencers.xml
===================================================================
--- trunk/docs/gettingstarted/src/main/docbook/en-US/content/custom_sequencers.xml	2009-06-04 21:46:34 UTC (rev 976)
+++ trunk/docs/gettingstarted/src/main/docbook/en-US/content/custom_sequencers.xml	2009-06-04 22:31:30 UTC (rev 977)
@@ -73,14 +73,9 @@
 <dependency>
   <groupId>org.jboss.dna</groupId>
   <artifactId>dna-common</artifactId>
-  <version>0.4</version>
+  <version>0.5</version>
 </dependency>
 <dependency>
-  <groupId>org.jboss.dna</groupId>
-  <artifactId>dna-graph</artifactId>
-  <version>0.4</version>
-</dependency>
-<dependency>
   <groupId>org.slf4j</groupId>
   <artifactId>slf4j-api</artifactId>
 </dependency>
@@ -119,10 +114,11 @@
   		see the <link linkend="testing_custom_sequencers">testing section</link>.)  However, if you want to do
   		integration testing with a JCR repository and the JBoss DNA services, you'll need additional dependencies for these libraries.</para>
 		<programlisting role="XML"><![CDATA[
+<!-- JBoss DNA JCR Repository -->
 <dependency>
   <groupId>org.jboss.dna</groupId>
-  <artifactId>dna-repository</artifactId>
-  <version>0.4</version>
+  <artifactId>dna-jcr</artifactId>
+  <version>0.5</version>
   <scope>test</scope>
 </dependency>
 <!-- Java Content Repository API -->
@@ -132,41 +128,6 @@
   <version>1.0.1</version>
   <scope>test</scope>
 </dependency>
-<!-- Apache Jackrabbit (JCR Implementation) -->
-<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>
  ]]></programlisting>
   <para>At this point, your project should be set up correctly, and you're ready to move on to 
   	<link linkend="custom_sequencer_implementation">writing the Java implementation</link> for your sequencer.</para>

Modified: trunk/docs/reference/src/main/docbook/en-US/content/sequencing.xml
===================================================================
--- trunk/docs/reference/src/main/docbook/en-US/content/sequencing.xml	2009-06-04 21:46:34 UTC (rev 976)
+++ trunk/docs/reference/src/main/docbook/en-US/content/sequencing.xml	2009-06-04 22:31:30 UTC (rev 977)
@@ -518,18 +518,11 @@
 <dependency>
   <groupId>org.jboss.dna</groupId>
   <artifactId>dna-graph</artifactId>
-  <version>0.3</version>
+  <version>0.5</version>
   <type>test-jar</type>
   <scope>test</scope>
 </dependency>
 <dependency>
-  <groupId>org.jboss.dna</groupId>
-  <artifactId>dna-common</artifactId>
-  <version>0.3</version>
-  <type>test-jar</type>
-  <scope>test</scope>
-</dependency>
-<dependency>
   <groupId>junit</groupId>
   <artifactId>junit</artifactId>
   <version>4.4</version>
@@ -559,10 +552,11 @@
 	  		see the <link linkend="testing_custom_sequencers">testing section</link>.)  However, if you want to do
 	  		integration testing with a JCR repository and the JBoss DNA services, you'll need additional dependencies for these libraries.</para>
 			<programlisting role="XML"><![CDATA[
+<!-- JBoss DNA JCR Repository -->
 <dependency>
   <groupId>org.jboss.dna</groupId>
-  <artifactId>dna-repository</artifactId>
-  <version>0.1</version>
+  <artifactId>dna-jcr</artifactId>
+  <version>0.5</version>
   <scope>test</scope>
 </dependency>
 <!-- Java Content Repository API -->
@@ -572,41 +566,6 @@
   <version>1.0.1</version>
   <scope>test</scope>
 </dependency>
-<!-- Apache Jackrabbit (JCR Implementation) -->
-<dependency>
-  <groupId>org.apache.jackrabbit</groupId>
-  <artifactId>jackrabbit-api</artifactId>
-  <version>1.3.3</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.3.3</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>
 	 ]]></programlisting>
 	  <para>At this point, your project should be set up correctly, and you're ready to move on to 
 	  	<link linkend="custom_sequencer_implementation">writing the Java implementation</link> for your sequencer.</para>

Modified: trunk/extensions/dna-classloader-maven/pom.xml
===================================================================
--- trunk/extensions/dna-classloader-maven/pom.xml	2009-06-04 21:46:34 UTC (rev 976)
+++ trunk/extensions/dna-classloader-maven/pom.xml	2009-06-04 22:31:30 UTC (rev 977)
@@ -65,13 +65,39 @@
     <!-- 
       Apache Jackrabbit (JCR Implementation) for testing purposes
     -->
-    <dependency>
-      <groupId>org.apache.jackrabbit</groupId>
-      <artifactId>jackrabbit-api</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.jackrabbit</groupId>
-      <artifactId>jackrabbit-core</artifactId>
-    </dependency>
+		<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

Modified: trunk/extensions/dna-mimetype-detector-aperture/src/test/java/org/jboss/dna/mimetype/aperture/MimeTypeTest.java
===================================================================
--- trunk/extensions/dna-mimetype-detector-aperture/src/test/java/org/jboss/dna/mimetype/aperture/MimeTypeTest.java	2009-06-04 21:46:34 UTC (rev 976)
+++ trunk/extensions/dna-mimetype-detector-aperture/src/test/java/org/jboss/dna/mimetype/aperture/MimeTypeTest.java	2009-06-04 22:31:30 UTC (rev 977)
@@ -21,6 +21,7 @@
  */
 package org.jboss.dna.mimetype.aperture;
 
+import java.io.File;
 import java.io.FileNotFoundException;
 import org.jboss.dna.graph.mimetype.AbstractMimeTypeTest;
 import org.junit.Test;
@@ -34,7 +35,17 @@
         super(ApertureMimeTypeDetector.class);
     }
 
+    /**
+     * {@inheritDoc}
+     * 
+     * @see org.jboss.dna.graph.mimetype.AbstractMimeTypeTest#getFile(java.lang.String)
+     */
     @Override
+    protected File getFile( String name ) {
+        return new File("src/test/resources/" + name);
+    }
+
+    @Override
     protected String expectedMimeTypeForText_test_txt() {
         return "text/plain";
     }

Copied: trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/CurrencyFormatterExample.mxml (from rev 976, trunk/dna-repository/src/test/resources/CurrencyFormatterExample.mxml)
===================================================================
--- trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/CurrencyFormatterExample.mxml	                        (rev 0)
+++ trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/CurrencyFormatterExample.mxml	2009-06-04 22:31:30 UTC (rev 977)
@@ -0,0 +1,54 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Simple example to demonstrate the CurrencyFormatter. -->
+<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml">
+
+    <mx:Script>
+        <![CDATA[
+
+              import mx.events.ValidationResultEvent;			
+              private var vResult:ValidationResultEvent;
+			
+              // Event handler to validate and format input.
+              private function Format():void {
+              
+                    vResult = numVal.validate();
+
+                    if (vResult.type==ValidationResultEvent.VALID) {
+                        var temp:Number=Number(priceUS.text); 
+                        formattedUSPrice.text= usdFormatter.format(temp);
+                    }
+                    
+                    else {
+                       formattedUSPrice.text="";
+                    }
+              }
+        ]]>
+    </mx:Script>
+
+    <mx:CurrencyFormatter id="usdFormatter" precision="2" 
+        currencySymbol="$" decimalSeparatorFrom="."
+        decimalSeparatorTo="." useNegativeSign="true" 
+        useThousandsSeparator="true" alignSymbol="left"/>
+
+    <mx:NumberValidator id="numVal" source="{priceUS}" property="text" 
+        allowNegative="true" domain="real"/>
+
+    <mx:Panel title="CurrencyFormatter Example" width="75%" height="75%" 
+        paddingTop="10" paddingLeft="10" paddingRight="10" paddingBottom="10">
+
+        <mx:Form>
+            <mx:FormItem label="Enter U.S. dollar amount:">
+                <mx:TextInput id="priceUS" text="" width="50%"/>
+            </mx:FormItem>
+
+            <mx:FormItem label="Formatted amount: ">
+                <mx:TextInput id="formattedUSPrice" text="" width="50%" editable="false"/>
+            </mx:FormItem>
+
+            <mx:FormItem>
+                <mx:Button label="Validate and Format" click="Format();"/>
+            </mx:FormItem>
+        </mx:Form>
+
+    </mx:Panel>
+</mx:Application>

Copied: trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/Descriptor.1.0.xsd (from rev 976, trunk/dna-repository/src/test/resources/Descriptor.1.0.xsd)
===================================================================
--- trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/Descriptor.1.0.xsd	                        (rev 0)
+++ trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/Descriptor.1.0.xsd	2009-06-04 22:31:30 UTC (rev 977)
@@ -0,0 +1,127 @@
+<?xml version="1.0"?>
+<xs:schema 
+    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
+    targetNamespace="http://ns.adobe.com/air/application/1.0" 
+    xmlns="http://ns.adobe.com/air/application/1.0" 
+    elementFormDefault="qualified"
+>
+  <xs:element name="application">
+    <xs:complexType>
+      <xs:all>
+        <!-- About this application -->
+        <xs:element name="id">
+          <xs:simpleType>
+            <xs:restriction base="xs:string">
+              <xs:pattern value="[A-Za-z0-9\-\.]{1,212}"/>
+            </xs:restriction>
+          </xs:simpleType>
+        </xs:element>
+        <xs:element name="name"           type="xs:string" minOccurs="0"/>
+        <xs:element name="version"        type="xs:string"/>
+        <xs:element name="filename">
+          <xs:simpleType>
+            <xs:restriction base="xs:string">
+              <!-- name cannot begin with a ' ' (space), have any of these characters: *"/:<>?\|, and end with a . (dot) or ' ' (space) -->
+              <xs:pattern value='[^\*"/:&gt;&lt;\?\\\|\. ]|[^\*"/:&gt;&lt;\?\\\| ][^\*"/:&gt;&lt;\?\\\|]*[^\*"/:&gt;&lt;\?\\\|\. ]'/>
+            </xs:restriction>
+          </xs:simpleType>
+        </xs:element>
+        <xs:element name="description"    type="xs:string" minOccurs="0"/>
+        <xs:element name="copyright"      type="xs:string" minOccurs="0"/>
+        <xs:element name="icon" type="IconType" minOccurs="0"/>
+
+        <!-- How to start this application -->
+        <xs:element name="initialWindow">
+          <xs:complexType>
+            <xs:all>
+              <xs:element name="content" type="xs:anyURI" minOccurs="1" />
+              <xs:element name="title" type="xs:string" minOccurs="0" />
+
+              <xs:element name="systemChrome" minOccurs="0" >
+                <xs:simpleType>
+                  <xs:restriction base="xs:string">
+                    <xs:enumeration value="none"/>
+                    <xs:enumeration value="standard"/>
+                  </xs:restriction>
+                </xs:simpleType>
+              </xs:element>
+              <xs:element name="transparent" type="xs:boolean" minOccurs="0" />
+              <xs:element name="visible" type="xs:boolean" minOccurs="0" />
+
+              <xs:element name="minimizable" type="xs:boolean" minOccurs="0" />
+              <xs:element name="maximizable" type="xs:boolean" minOccurs="0" />
+              <xs:element name="resizable" type="xs:boolean" minOccurs="0" />
+
+              <xs:element name="x" type="xs:int" minOccurs="0" />
+              <xs:element name="y" type="xs:int" minOccurs="0" />
+              <xs:element name="width" type="xs:unsignedInt" minOccurs="0" />
+              <xs:element name="height" type="xs:unsignedInt" minOccurs="0" />
+              <xs:element name="minSize" type="BoundsSizeType" minOccurs="0" />
+              <xs:element name="maxSize" type="BoundsSizeType" minOccurs="0" />
+            </xs:all>
+          </xs:complexType>
+        </xs:element>
+        
+        <!-- About installing this application -->
+        <xs:element name="installFolder" minOccurs="0">
+          <xs:simpleType>
+            <xs:restriction base="xs:string">
+              <!-- installFolder cannot begin with a / (forward-slash) or a ' ' (space), have any of these characters: *":<>?\|, and end with a . (dot) or ' ' (space) -->
+              <xs:pattern value='[^\*"/:&gt;&lt;\?\\\|\. ]|[^\*"/:&gt;&lt;\?\\\| ][^\*":&gt;&lt;\?\\\|]*[^\*":&gt;&lt;\?\\\|\. ]'/>
+            </xs:restriction>
+          </xs:simpleType>
+        </xs:element>
+        <xs:element name="programMenuFolder" minOccurs="0">
+          <xs:simpleType>
+            <xs:restriction base="xs:string">
+              <!-- programMenuFolder cannot begin with a / (forward-slash) or a ' ' (space), have any of these characters: *":<>?\|, and end with a . (dot) or ' ' (space) -->
+              <xs:pattern value='[^\*"/:&gt;&lt;\?\\\|\. ]|[^\*"/:&gt;&lt;\?\\\| ][^\*":&gt;&lt;\?\\\|]*[^\*":&gt;&lt;\?\\\|\. ]'/>
+            </xs:restriction>
+          </xs:simpleType>
+        </xs:element>        
+
+        <!-- Features this application can opt in to -->
+        <xs:element name="customUpdateUI" type="xs:boolean" minOccurs="0"/>
+        <xs:element name="allowBrowserInvocation" type="xs:boolean" minOccurs="0"/>
+        <xs:element name="fileTypes" minOccurs="0">
+          <xs:complexType>
+            <xs:sequence>                    
+              <xs:element name="fileType" minOccurs="0" maxOccurs="unbounded">
+                <xs:complexType>
+                  <xs:all>
+                  <xs:element name="name" type="xs:string"/>
+                  <xs:element name="extension" type="xs:string"/>
+                  <xs:element name="description" type="xs:string" minOccurs="0"/>
+                  <xs:element name="contentType" type="xs:string" minOccurs="0"/>
+                  <xs:element name="icon" type="IconType" minOccurs="0"/>
+                </xs:all>
+                </xs:complexType>
+              </xs:element>
+            </xs:sequence>
+          </xs:complexType>
+        </xs:element>
+      </xs:all>
+
+      <!-- About the runtime version required -->
+      <xs:attribute name="minimumPatchLevel" type="xs:unsignedInt"/>
+    </xs:complexType>
+  </xs:element>
+
+  <!-- Type definitions -->
+  <xs:complexType name="IconType">
+      <xs:all>
+          <xs:element name="image16x16"   type="xs:anyURI" minOccurs="0"/>
+          <xs:element name="image32x32"   type="xs:anyURI" minOccurs="0"/>
+          <xs:element name="image48x48"   type="xs:anyURI" minOccurs="0"/>
+          <xs:element name="image128x128" type="xs:anyURI" minOccurs="0"/>
+      </xs:all>
+  </xs:complexType>
+  <xs:simpleType name="UnsignedIntListType">
+    <xs:list itemType="xs:unsignedInt"/>
+  </xs:simpleType>
+  <xs:simpleType name="BoundsSizeType">
+    <xs:restriction base="UnsignedIntListType">
+      <xs:length value="2"/> 
+    </xs:restriction>
+  </xs:simpleType>
+</xs:schema>


Property changes on: trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/Descriptor.1.0.xsd
___________________________________________________________________
Name: svn:keywords
   + Id Revision
Name: svn:eol-style
   + LF

Copied: trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/TestData.pst (from rev 976, trunk/dna-repository/src/test/resources/TestData.pst)
===================================================================
(Binary files differ)

Added: trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/aircraft.cnd
===================================================================
--- trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/aircraft.cnd	                        (rev 0)
+++ trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/aircraft.cnd	2009-06-04 22:31:30 UTC (rev 977)
@@ -0,0 +1,64 @@
+/*
+ * 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'>
+<air='http://jboss.org/dna/examples/aircraft/1.0'>
+
+//------------------------------------------------------------------------------
+// N O D E T Y P E S
+//------------------------------------------------------------------------------
+
+[air:Aircraft] > nt:unstructured
+  - air:maker (string)
+  - air:model (string)
+  - air:designedBy (string)
+  - air:introduced (string) < "(19|20)\d{2}"                // any 4 digit number starting with '19' or '20'
+  - air:range (string)                                      // any integer (with optional ',' every 1000s place)
+     < "\d{1,3}(,?\d{3})*\s*(nm|m|km|mi|ft)"                // followed by 'nm', 'm', 'km', 'mi', or 'ft'
+  - air:maxSpeed (string)                                   // any integer (with optional ',' every 1000s place)
+    < '\d{1,3}(,?\d{3})*\s*(kt|mph|km/h|kmph)'              // followed by 'kt', 'mph', 'km/h' or 'kmph'
+  - air:takeoffSpeed (string)                               // any integer (with optional ',' every 1000s place)
+    < '\d{1,3}(,?\d{3})*\s*(kt|mph|km/h|kmph)'              // followed by 'kt', 'mph', 'km/h' or 'kmph'
+  - air:cruiseSpeed (string)                                // any integer (with optional ',' every 1000s place)
+    < '\d{1,3}(,?\d{3})*\s*(kt|mph|km/h|kmph)'              // followed by 'kt', 'mph', 'km/h' or 'kmph'
+  - air:emptyWeight (string)                                // any integer (with optional ',' every 1000s place)
+    < '\d{1,3}(,?\d{3})*\s*(lb|kg)'                         // followed by 'lb' or 'kg'
+  - air:maxWeight (string)                                  // any integer (with optional ',' every 1000s place)
+    < '\d{1,3}(,?\d{3})*\s*(lb|kg)'                         // followed by 'lb' or 'kg'
+  - air:rateOfClimb (string)                                // any integer (with optional ',' every 1000s place)
+    < '\d{1,3}(,?\d{3})*\s*(ft|km|m)/(s|min)'               // followed by 'ft/s', 'ft/min', 'km/s', 'km/min', 'm/s', or 'm/min'
+  - air:serviceCeiling (string)                             // any integer (with optional ',' every 1000s place)
+    < '\d{1,3}(,?\d{3})*\s*(nm|m|km|mi|ft)'                 // followed by 'nm', 'm', 'km', 'mi', or 'ft'
+  - air:fuelCapacity (string)                               // any integer (with optional ',' every 1000s place)
+    < '\d{1,3}(,?\d{3})*\s*(lb|kg|gal|L)'                   // followed by 'lb', 'kg', 'gal', or 'L'
+  - air:crew (long) < '[0,)'                                // any non-negative value
+  - air:numberBuilt (string)                                // any integer (with optional ',' every 1000s place)
+    < '\d{1,3}(,?\d{3})*\s*[+]?' ,                          // optionally followed by '+'
+      '([<>]\s*)?\d{1,3}(,?\d{3})*'                         // or prefixed by '<' or '>'
+  - air:url (string)

Copied: trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/aperture.example.manifest.mf (from rev 976, trunk/dna-repository/src/test/resources/aperture.example.manifest.mf)
===================================================================
--- trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/aperture.example.manifest.mf	                        (rev 0)
+++ trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/aperture.example.manifest.mf	2009-06-04 22:31:30 UTC (rev 977)
@@ -0,0 +1,12 @@
+Manifest-Version: 1.0
+Bundle-Name: Aperture Crawling Example
+Bundle-SymbolicName: org.semanticdesktop.aperture.example
+Bundle-Description: Aperture file crawling example
+Bundle-Activator: org.semanticdesktop.aperture.examples.osgi.ExampleFileCrawlerActivator
+Require-Bundle: org.semanticdesktop.aperture,
+ org.semanticdesktop.aperture.impl,
+ org.semweb4j.rdf2go.api,
+ org.semweb4j.rdf2go.impl.base,
+ org.openrdf.rdf2go
+Import-Package: org.osgi.framework
+Eclipse-LazyStart: true

Added: trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/cars.cnd
===================================================================
--- trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/cars.cnd	                        (rev 0)
+++ trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/cars.cnd	2009-06-04 22:31:30 UTC (rev 977)
@@ -0,0 +1,50 @@
+/*
+ * 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'>
+<car='http://jboss.org/dna/examples/cars/1.0'>
+
+//------------------------------------------------------------------------------
+// N O D E T Y P E S
+//------------------------------------------------------------------------------
+
+[car:Car] > nt:unstructured
+  - car:maker (string)
+  - car:model (string)
+  - car:year (string) < '(19|20)\d{2}'                     // any 4 digit number starting with '19' or '20'
+  - car:msrp (string) < '[$]\d{1,3}[,]?\d{3}([.]\d{2})?'   // of the form "$X,XXX.ZZ", "$XX,XXX.ZZ" or "$XXX,XXX.ZZ" 
+                                                           // where '.ZZ' is optional
+  - car:userRating (long) < '[1,5]'                        // any value from 1 to 5 (inclusive)
+  - car:valueRating (long) < '[1,5]'                       // any value from 1 to 5 (inclusive)
+  - car:mpgCity (long) < '(0,]'                            // any value greater than 0
+  - car:mpgHighway (long) < '(0,]'                         // any value greater than 0
+  - car:lengthInInches (double) < '(0,]'                   // any value greater than 0
+  - car:wheelbaseInInches (double) < '(0,]'                // any value greater than 0
+  - car:engine (string)
+

Copied: trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/component-architecture.odp (from rev 976, trunk/dna-repository/src/test/resources/component-architecture.odp)
===================================================================
(Binary files differ)

Copied: trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/dna-repository-0.2-SNAPSHOT.jar (from rev 976, trunk/dna-repository/src/test/resources/dna-repository-0.2-SNAPSHOT.jar)
===================================================================
(Binary files differ)

Copied: trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/corel-presentations-3.0.shw (from rev 976, trunk/dna-repository/src/test/resources/docs/corel-presentations-3.0.shw)
===================================================================
(Binary files differ)

Copied: trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/corel-presentations-x3.shw (from rev 976, trunk/dna-repository/src/test/resources/docs/corel-presentations-x3.shw)
===================================================================
(Binary files differ)

Copied: trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/corel-quattro-pro-6.wb2 (from rev 976, trunk/dna-repository/src/test/resources/docs/corel-quattro-pro-6.wb2)
===================================================================
(Binary files differ)

Copied: trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/corel-quattro-pro-7.wb3 (from rev 976, trunk/dna-repository/src/test/resources/docs/corel-quattro-pro-7.wb3)
===================================================================
(Binary files differ)

Copied: trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/corel-quattro-pro-x3.qpw (from rev 976, trunk/dna-repository/src/test/resources/docs/corel-quattro-pro-x3.qpw)
===================================================================
(Binary files differ)

Copied: trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/corel-wordperfect-4.2.wp (from rev 976, trunk/dna-repository/src/test/resources/docs/corel-wordperfect-4.2.wp)
===================================================================
--- trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/corel-wordperfect-4.2.wp	                        (rev 0)
+++ trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/corel-wordperfect-4.2.wp	2009-06-04 22:31:30 UTC (rev 977)
@@ -0,0 +1,3 @@
+?
+
+??This is an example document created with Corel WordPerfect X3.

Copied: trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/corel-wordperfect-5.0.wp (from rev 976, trunk/dna-repository/src/test/resources/docs/corel-wordperfect-5.0.wp)
===================================================================
(Binary files differ)

Copied: trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/corel-wordperfect-5.1-far-east.wp (from rev 976, trunk/dna-repository/src/test/resources/docs/corel-wordperfect-5.1-far-east.wp)
===================================================================
(Binary files differ)

Copied: trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/corel-wordperfect-5.1.wp (from rev 976, trunk/dna-repository/src/test/resources/docs/corel-wordperfect-5.1.wp)
===================================================================
(Binary files differ)

Copied: trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/corel-wordperfect-x3.wpd (from rev 976, trunk/dna-repository/src/test/resources/docs/corel-wordperfect-x3.wpd)
===================================================================
(Binary files differ)

Copied: trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/counting-input-stream-test-file.dat (from rev 976, trunk/dna-repository/src/test/resources/docs/counting-input-stream-test-file.dat)
===================================================================
(Binary files differ)

Copied: trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/html-condenast.html (from rev 976, trunk/dna-repository/src/test/resources/docs/html-condenast.html)
===================================================================
--- trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/html-condenast.html	                        (rev 0)
+++ trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/html-condenast.html	2009-06-04 22:31:30 UTC (rev 977)
@@ -0,0 +1,2794 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+		
+		
+
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html>
+
+
+
+	
+	
+		
+	
+	
+	
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+		
+		
+
+
+
+	
+		
+	
+	
+
+
+
+
+
+	
+
+	
+
+	
+
+	
+
+	
+
+	
+
+
+
+	
+
+
+
+	
+	
+	
+	
+	
+	
+	
+	
+		 
+	
+
+
+
+
+
+<head>
+	<title>CondeNast - Welcome!</title>
+	<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
+	<meta name="description" content=""/>
+	<meta name="keyword" content="CondeNast, , LeftNav, Specials, AllMags, CategorizedMags, Better Together Bundles, EmployeeProducts, "/>
+		
+	<!-- useMooTools: true -->
+	
+		
+			<script src="/webapp/wcs/stores/CondeNast/lib/mootools.v1.11.js" type="text/javascript"></script>		
+			<script src="/webapp/wcs/stores/CondeNast/lib/iCarousel.js" type="text/javascript"></script>		
+		
+		
+	
+	<script type="text/javascript">
+		// jQuery.noConflict(); // Only needed if we use mootools and jQuery together
+		djConfig = { isDebug: false, parseWidgets:false, searchIds:[]};
+		var currentId = '';
+		var currentImage = '';
+	</script>
+	<script type="text/javascript" src="/webapp/wcs/stores/dojo041/dojo.js"></script>	
+	<script type="text/javascript" src="/webapp/wcs/stores/CondeNast/AJAXUserInterface/javascript/Common.js"></script>
+	<script type="text/javascript" src="/webapp/wcs/stores/CondeNast/AJAXUserInterface/javascript/ServicesEventMapping.js"></script>	
+	<script type="text/javascript" src="/webapp/wcs/stores/CondeNast/lib/cdsutils.js"></script>	
+	
+
+
+
+<!-- Start- JSP File Name: ServicesDeclaration.jsp -->
+
+
+
+<script type="text/javascript">
+<!-- <![CDATA[
+dojo.require("wc.service.*");
+wc.service.declare({
+	id: "AjaxAddOrderItem",
+	actionId: "AjaxAddOrderItem",
+	url: "AjaxOrderChangeServiceItemAdd",
+	formId: ""
+
+	,failureHandler: function(serviceResponse) {
+		if (serviceResponse.errorMessage) {
+                     alertDialog(serviceResponse.errorMessage,10001,10001,-1);
+              } else {
+                     if (serviceResponse.errorMessageKey) {
+                            alertDialog(serviceResponse.errorMessageKey,10001,10001,-1);
+                     }
+              }
+              cursor_clear();
+	}
+
+});
+//[[>-->
+</script>
+
+
+
+
+
+<script type="text/javascript">
+<!-- <![CDATA[
+dojo.require("wc.service.*");
+wc.service.declare({
+	id: "AjaxDeleteOrderItem",
+	actionId: "AjaxDeleteOrderItem",
+	url: "AjaxOrderChangeServiceItemDelete",
+	formId: ""
+
+	,failureHandler: function(serviceResponse) {
+		if (serviceResponse.errorMessage) {
+                     alertDialog(serviceResponse.errorMessage,10001,10001,-1);
+              } else {
+                     if (serviceResponse.errorMessageKey) {
+                            alertDialog(serviceResponse.errorMessageKey,10001,10001,-1);
+                     }
+              }
+              cursor_clear();
+	}
+
+});
+//[[>-->
+</script>
+
+
+
+
+
+<script type="text/javascript">
+<!-- <![CDATA[
+dojo.require("wc.service.*");
+wc.service.declare({
+	id: "AjaxUpdateOrderItem",
+	actionId: "AjaxUpdateOrderItem",
+	url: "AjaxOrderChangeServiceItemUpdate",
+	formId: ""
+
+	,failureHandler: function(serviceResponse) {
+		if (serviceResponse.errorMessage) {
+                     alertDialog(serviceResponse.errorMessage,10001,10001,-1);
+              } else {
+                     if (serviceResponse.errorMessageKey) {
+                            alertDialog(serviceResponse.errorMessageKey,10001,10001,-1);
+                     }
+              }
+              cursor_clear();
+	}
+
+});
+//[[>-->
+</script>
+
+
+
+
+
+<script type="text/javascript">
+<!-- <![CDATA[
+dojo.require("wc.service.*");
+wc.service.declare({
+	id: "AjaxUpdateOrderShippingInfo",
+	actionId: "AjaxUpdateOrderShippingInfo",
+	url: "AjaxOrderChangeServiceShipInfoUpdate",
+	formId: ""
+
+	,failureHandler: function(serviceResponse) {
+		if (serviceResponse.errorMessage) {
+                     alertDialog(serviceResponse.errorMessage,10001,10001,-1);
+              } else {
+                     if (serviceResponse.errorMessageKey) {
+                            alertDialog(serviceResponse.errorMessageKey,10001,10001,-1);
+                     }
+              }
+              cursor_clear();
+	}
+
+});
+//[[>-->
+</script>
+
+
+
+
+
+<script type="text/javascript">
+<!-- <![CDATA[
+dojo.require("wc.service.*");
+wc.service.declare({
+	id: "AjaxPrepareOrder",
+	actionId: "AjaxPrepareOrder",
+	url: "AjaxOrderProcessServiceOrderPrepare",
+	formId: ""
+
+	,failureHandler: function(serviceResponse) {
+		if (serviceResponse.errorMessage) {
+                     alertDialog(serviceResponse.errorMessage,10001,10001,-1);
+              } else {
+                     if (serviceResponse.errorMessageKey) {
+                            alertDialog(serviceResponse.errorMessageKey,10001,10001,-1);
+                     }
+              }
+              cursor_clear();
+	}
+
+});
+//[[>-->
+</script>
+
+
+
+
+
+<script type="text/javascript">
+<!-- <![CDATA[
+dojo.require("wc.service.*");
+wc.service.declare({
+	id: "AjaxSubmitOrder",
+	actionId: "AjaxSubmitOrder",
+	url: "AjaxOrderProcessServiceOrderSubmit",
+	formId: ""
+
+	,successHandler: function(serviceResponse) {
+		document.location.href = "AjaxOrderConfirmationView?storeId=" + 10001 + "&catalogId=" + 10001 + "&langId=" + -1 + "&orderId=" + serviceResponse.orderId;
+	}
+
+	,failureHandler: function(serviceResponse) {
+		if (serviceResponse.errorMessage) {
+                     alertDialog(serviceResponse.errorMessage,10001,10001,-1);
+              } else {
+                     if (serviceResponse.errorMessageKey) {
+                            alertDialog(serviceResponse.errorMessageKey,10001,10001,-1);
+                     }
+              }
+              cursor_clear();
+	}
+
+});
+//[[>-->
+</script>
+
+
+
+
+
+<script type="text/javascript">
+<!-- <![CDATA[
+dojo.require("wc.service.*");
+wc.service.declare({
+	id: "AjaxAddAddressForPerson",
+	actionId: "AjaxAddAddressForPerson",
+	url: "AjaxPersonChangeServiceAddressAdd",
+	formId: ""
+
+	,failureHandler: function(serviceResponse) {
+		if (serviceResponse.errorMessage) {
+                     alertDialog(serviceResponse.errorMessage,10001,10001,-1);
+              } else {
+                     if (serviceResponse.errorMessageKey) {
+                            alertDialog(serviceResponse.errorMessageKey,10001,10001,-1);
+                     }
+              }
+              cursor_clear();
+	}
+
+});
+//[[>-->
+</script>
+
+
+
+
+
+<script type="text/javascript">
+<!-- <![CDATA[
+dojo.require("wc.service.*");
+wc.service.declare({
+	id: "AjaxUpdateAddressForPerson",
+	actionId: "AjaxUpdateAddressForPerson",
+	url: "AjaxPersonChangeServiceAddressUpdate",
+	formId: ""
+
+	,failureHandler: function(serviceResponse) {
+		if (serviceResponse.errorMessage) {
+                     alertDialog(serviceResponse.errorMessage,10001,10001,-1);
+              } else {
+                     if (serviceResponse.errorMessageKey) {
+                            alertDialog(serviceResponse.errorMessageKey,10001,10001,-1);
+                     }
+              }
+              cursor_clear();
+	}
+
+});
+//[[>-->
+</script>
+
+
+	
+
+
+<script type="text/javascript">
+<!-- <![CDATA[
+dojo.require("wc.service.*");
+wc.service.declare({
+	id: "AjaxReplaceOrderItem",
+	actionId: "AjaxReplaceOrderItem",
+	url: "AjaxReplaceOrderItemCmd",
+	formId: ""
+
+	,failureHandler: function(serviceResponse) {
+		if (serviceResponse.errorMessage) {
+                     alertDialog(serviceResponse.errorMessage,10001,10001,-1);
+              } else {
+                     if (serviceResponse.errorMessageKey) {
+                            alertDialog(serviceResponse.errorMessageKey,10001,10001,-1);
+                     }
+              }
+              cursor_clear();
+	}
+
+});
+//[[>-->
+</script>
+
+
+
+
+
+<script type="text/javascript">
+<!-- <![CDATA[
+dojo.require("wc.service.*");
+wc.service.declare({
+	id: "AjaxOrderItemResetAddress",
+	actionId: "AjaxOrderItemResetAddress",
+	url: "AjaxOrderItemResetAddressCmd",
+	formId: ""
+
+	,failureHandler: function(serviceResponse) {
+		if (serviceResponse.errorMessage) {
+                     alertDialog(serviceResponse.errorMessage,10001,10001,-1);
+              } else {
+                     if (serviceResponse.errorMessageKey) {
+                            alertDialog(serviceResponse.errorMessageKey,10001,10001,-1);
+                     }
+              }
+              cursor_clear();
+	}
+
+});
+//[[>-->
+</script>
+
+
+
+<!-- End - JSP File Name: ServicesDeclaration.jsp -->
+
+	
+
+<script type="text/javascript">
+<!-- <![CDATA[
+dojo.require("wc.render.*");
+wc.render.declareRefreshController({
+	id: "miniShopCartAreaController",
+	renderContext: wc.render.getContextById("currentPage_Context"),
+	url: "MiniCartView?storeId=10001&catalogId=10001&justAdded=1",
+	formId: ""
+
+	,modelChangedHandler: function(message, widget) {
+		var controller = this;
+		var renderContext = this.renderContext;
+		if (message.actionId in order_updated) {	
+				var origURL = this.url;
+				if (message.orderItemId.length > 1) {					
+					this.url = this.url + '&betterTogether=1';
+				}
+				widget.refresh();
+				if (document.getElementById(currentId)) {
+					document.getElementById(currentId).src = currentImage;
+					currentId = '';
+					currentImage = '';
+				}				
+				this.url = origURL;
+			}
+	}
+
+});
+//[[>-->
+</script>
+
+	
+	<style type="text/css">
+	<!--
+	 @import url("/webapp/wcs/stores/CondeNast/css/mainCat.css");
+	-->
+	</style>
+	<link href="/webapp/wcs/stores/CondeNast/css/greybox.css" rel="stylesheet" type="text/css" media="all" />
+</head>
+<body>
+<div id="container"><!-- JSP File Name:  TopCategoriesDisplay.jsp -->
+<table width="960" align="center" border="0" cellspacing="0" cellpadding="0">
+  <tr><!--header-->
+    <td colspan="3" align="left" valign="top">	
+
+<!-- BEGIN HeaderDisplay.jspf -->
+
+
+	
+	
+	
+	
+		
+
+<!-- Start - JSP File name:  style1/CachedHeaderDisplay.jsp -->
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+		
+		
+
+
+
+
+
+
+
+	
+		
+		
+		
+		
+		
+		
+	
+	
+
+	
+
+
+<!--START HEADER-->
+
+
+
+
+
+
+
+
+	
+		
+	
+	
+	
+		
+	
+		
+	
+	
+
+<IE:clientCaps ID="oClientCaps" STYLE="behavior:url('#default#clientCaps')"></IE:clientCaps>
+<div id="header">	
+	</div>
+	<div id="subheader">	
+		<div id="subnavcontainer">
+			<ul id="subnavlist">
+				<li id="active"><a href="Home_Page" id="nav_home">Home</a></li>
+				<li id=""><a href="BrowseMagazines_Page" id="nav_browse">Browse Magazines</a></li>
+				<li id=""><a href="Categories_Page" id="nav_cat">Categories</a></li>
+				<li id=""><a href="GiveAGift_Page" id="nav_gift">Give a Gift</a></li>
+				
+					<li id=""><a href="SpecialOffers_Page" id="nav_so">Special Offers</a></li>				
+				
+				<li id=""><a href="OrderCalculate?langId=-1&amp;storeId=10001&amp;catalogId=10001&amp;URL=OrderItemDisplay%3fstoreId%3d10001%26catalogId%3d10001&amp;activeLink=Cart" id="nav_cart">Shopping Cart</a></li>
+				<li id=""><a href="MyAccount_Page" id="nav_custserv">Customer Service</a></li>
+			</ul>
+		</div>
+	</div>
+<!--END HEADER-->
+<!-- End - JSP File name:  style1/CachedHeaderDisplay.jsp -->
+
+<!-- END HeaderDisplay.jspf -->
+</td>
+  </tr>
+  <tr>
+    <td width="146" rowspan="3" align="left" valign="top" >
+
+
+<!-- BEGIN SidebarDisplay.jspf -->
+
+
+	
+	
+	
+	
+	
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+		
+		
+
+
+
+
+
+
+
+
+
+
+	
+	
+		
+	
+	
+	
+	
+	
+	
+	
+	
+	
+	
+	
+	
+<div id="leftNav"><!--<h1>Browse Magazines</h1>-->
+<ul id="logo_nav">
+	<li>
+	<img src="/webapp/wcs/stores/content/CondeNast/images/leftnavmap.png" border="0" usemap="#mags" />
+	</li>
+</ul>
+
+	
+				
+<map name="mags">
+	
+	
+		
+			
+		
+		
+	
+	
+	
+			
+				
+				
+				
+			
+	
+	<area alt="Vogue" shape="rect" coords="7,5,144,25" href="Subscriptions_Vogue">
+	
+	
+		
+			
+		
+		
+	
+	
+	
+			
+				
+				
+				
+			
+	
+	<area alt="W" shape="rect" coords="7,25,144,48" href="Subscriptions_W">
+	
+	
+		
+			
+		
+		
+	
+	
+	
+			
+				
+				
+				
+			
+	
+	<area alt="Glamour" shape="rect" coords="7,48,144,68" href="Subscriptions_Glamour">
+	
+	
+		
+			
+		
+		
+	
+	
+	
+			
+				
+				
+				
+			
+	
+	<area alt="Allure" shape="rect" coords="7,68,144,88" href="Subscriptions_allure">
+	
+	
+		
+			
+		
+		
+	
+	
+	
+			
+				
+				
+				
+			
+	
+	<area alt="Self" shape="rect" coords="7,88,144,112" href="Subscriptions_Self">
+	
+	
+		
+			
+		
+		
+	
+	
+	
+			
+				
+				
+				
+			
+	
+	<area alt="Teen Vogue" shape="rect" coords="7,112,144,131" href="Subscriptions_TeenVogue">
+	
+	
+		
+			
+		
+		
+	
+	
+	
+			
+				
+				
+				
+			
+	
+	<area alt="GQ" shape="rect" coords="7,131,144,153" href="Subscriptions_GQ">
+	
+	
+		
+			
+		
+		
+	
+	
+	
+			
+				
+				
+				
+			
+	
+	<area alt="Details" shape="rect" coords="7,153,144,173" href="Subscriptions_Details">
+	
+	
+		
+			
+		
+		
+	
+	
+	
+			
+				
+				
+				
+			
+	
+	<area alt="Men's Vogue" shape="rect" coords="7,173,144,193" href="Subscriptions_MensVogue">
+	
+	
+		
+			
+		
+		
+	
+	
+	
+			
+				
+				
+				
+			
+	
+	<area alt="Architectural Digest" shape="rect" coords="7,193,144,210" href="Subscriptions_ArchitecturalDigest">
+	
+	
+		
+			
+		
+		
+	
+	
+	
+			
+				
+				
+				
+			
+	
+	<area alt="Brides" shape="rect" coords="7,210,144,230" href="Subscriptions_Brides">
+	
+	
+		
+			
+		
+		
+	
+	
+	
+			
+				
+				
+				
+			
+	
+	<area alt="Modern Bride" shape="rect" coords="7,230,144,250" href="Subscriptions_ModernBride">
+	
+	
+		
+			
+		
+		
+	
+	
+	
+			
+				
+				
+				
+			
+	
+	<area alt="Elegant Bride" shape="rect" coords="7,250,144,275" href="Subscriptions_ElegantBride">
+	
+	
+		
+			
+		
+		
+	
+	
+	
+			
+				
+				
+				
+			
+	
+	<area alt="Lucky" shape="rect" coords="7,275,144,295" href="Subscriptions_Lucky">
+	
+	
+		
+			
+		
+		
+	
+	
+	
+			
+				
+				
+				
+			
+	
+	<area alt="Domino" shape="rect" coords="7,295,144,315" href="Subscriptions_Domino">
+	
+	
+		
+			
+		
+		
+	
+	
+	
+			
+				
+				
+				
+			
+	
+	<area alt="Golf Digest" shape="rect" coords="7,315,144,337" href="Subscriptions_GolfDigest">
+	
+	
+		
+			
+		
+		
+	
+	
+	
+			
+				
+				
+				
+			
+	
+	<area alt="Golf World" shape="rect" coords="7,337,144,359" href="Subscriptions_GolfWorld">
+	
+	
+		
+			
+		
+		
+	
+	
+	
+			
+				
+				
+				
+			
+	
+	<area alt="Golf For Women" shape="rect" coords="7,359,144,379" href="Subscriptions_GolfForWomen">
+	
+	
+		
+			
+		
+		
+	
+	
+	
+			
+				
+				
+				
+			
+	
+	<area alt="Vanity Fair" shape="rect" coords="7,379,144,397" href="Subscriptions_VanityFair">
+	
+	
+		
+			
+		
+		
+	
+	
+	
+			
+				
+				
+				
+			
+	
+	<area alt="Gourmet" shape="rect" coords="7,397,144,420" href="Subscriptions_Gourmet">
+	
+	
+		
+			
+		
+		
+	
+	
+	
+			
+				
+				
+				
+			
+	
+	<area alt="Bon App&eacute;tit" shape="rect" coords="7,428,144,446" href="Subscriptions_BonAppetite">
+	
+	
+		
+			
+		
+		
+	
+	
+	
+			
+				
+				
+				
+			
+	
+	<area alt="Cond&eacute; Nast Traveler" shape="rect" coords="7,446,144,469" href="Subscriptions_CondeNastTraveler">
+	
+	
+		
+			
+		
+		
+	
+	
+	
+			
+				
+				
+				
+			
+	
+	<area alt="Wired" shape="rect" coords="7,469,144,486" href="Subscriptions_Wired">
+	
+	
+		
+			
+		
+		
+	
+	
+	
+			
+				
+				
+				
+			
+	
+	<area alt="Cookie" shape="rect" coords="7,486,144,506" href="Subscriptions_Cookie">
+	
+	
+		
+			
+		
+		
+	
+	
+	
+			
+				
+				
+				
+			
+	
+	<area alt="Cond&eacute; Nast Portfolio" shape="rect" coords="7,506,144,529" href="Subscriptions_CondeNastPortfolio">
+	
+	
+		
+			
+		
+		
+	
+	
+	
+			
+				
+				
+				
+			
+	
+	<area alt="The New Yorker" shape="rect" coords="7,529,144,546" href="Subscriptions_NewYorker">
+					
+</map>
+
+	
+	
+</div>
+
+<!-- END SidebarDisplay.jspf -->
+</td>
+    <td colspan="2" align="left" valign="top" ></td>
+    </tr>
+  <tr><!--left nav & subheader-->
+    <!--content and right nav-->
+    <td align="left" valign="top" >
+<!--MAIN CONTENT STARTS HERE--><div id="content" style="padding-top:5px;">
+	
+			    
+                			
+                			
+                			
+                			
+                			
+                        
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+		
+		
+
+
+
+
+
+<!-- Start of the JSP: CachedTopCategoriesDisplay.jsp -->	
+	
+	
+	
+			
+				
+			    	
+			    	
+			    	
+			    	
+			    	
+			    			    	
+			    
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+		
+		
+
+
+
+
+	
+	
+		
+			
+		
+		
+	
+	
+	
+		
+			<span   style=" ">
+				
+				 
+				 					
+				
+					
+					
+					
+						<img src="/webapp/wcs/stores/content/CondeNast/images/banner.gif" />
+<!--<h2 style="margin:3px 0; color:#000;padding-left:10px;">Welcome to the<span style="color:#369;"> Cond&eacute; Nast Online Magazine Store</span></h2><h3 style="margin:3px 0 15px 0; color:#000;padding-left:10px;">Buy Direct - Best Deals, Free Gifts, Free Shipping</h3> -->
+<p ><br />Home to many of the world's most celebrated magazines, Cond&eacute; Nast Publications is committed to journalistic integrity, influential reporting and superior design.</p>
+<p> Now you can buy magazines online <strong></strong>direct</strong> from Cond&eacute; 
+Nast at the lowest authorized prices available! Your satisfaction is also <strong>100% Guaranteed:</strong> you can receive a full refund for all undelivered issues, at any time, for any reason. <br /></p><br />
+
+					
+					
+					
+				
+			</span>
+		
+		
+		
+	
+
+			
+			
+						
+		
+		<div id="showcase">   
+			<div id="DEF_showcase">
+							
+					
+						
+							
+						
+						
+						
+					
+				
+				
+				<ul id="specialoffer">
+				
+					
+						
+						
+						
+						
+									
+							
+						
+	
+						
+											
+												
+								
+							
+								
+									
+								
+									
+								
+							
+						
+											
+												
+								
+							
+								
+									
+								
+									
+								
+							
+						
+											
+												
+								
+							
+								
+									
+								
+									
+								
+							
+						
+											
+												
+								
+							
+								
+									
+								
+									
+								
+							
+						
+											
+												
+								
+							
+								
+									
+								
+									
+								
+							
+						
+											
+												
+								
+							
+								
+									
+								
+									
+								
+							
+						
+											
+						
+						<li>
+							<div class="so_bg">
+											
+													
+									<h1>GQ</h1>
+									
+									<a href="ProductDisplay?catalogId=10001&amp;storeId=10001&amp;productId=10514&amp;langId=-1"><img width="100" border="0" alt="GQ" src="/webapp/wcs/stores/content/CondeNast/images/cover_gq_100.jpg" style="margin:5px 15px 5px 15px;border:1px solid #000;"/></a>
+									<!-- bundle img class="soImgBottom" -->			
+									
+													
+									
+										
+											
+										
+														
+											
+									
+										
+												
+													<div class="so_desc">
+														<br/>
+														<span class="termValue">12 issues / 1 year</span><br/>
+														<span class="cvrPrice">Cover Price: <span class="strike">$47.88</span></span><br/>
+														<span class="ourPrice">Our Price: $12.00</span><br/>
+														
+														
+														
+														
+														
+														<span class="youSave">You Save: 74%</span><br/>
+													</div>
+												
+												<form name="OrderItemAddForm_1" ACTION="OrderItemAdd" METHOD="POST" id="OrderItemAddForm_1" onsubmit="return Add2ShopCartAjax('OrderItemAddForm_1', 'addtocart_11527', '/webapp/wcs/stores/content/CondeNast/images/so_add_to_cart.gif', '/webapp/wcs/stores/content/CondeNast/images/loader_so_add_to_cart.gif', '/webapp/wcs/stores/content/CondeNast/images/so_added.gif')">
+													<input type="hidden" name="storeId" value="10001">
+													<input type="hidden" name="langId" value="-1"> 
+													<input type="hidden" name="catalogId" value="10001"> 
+													<input type="hidden" name="URL" value="OrderCalculate?URL=OrderItemResetAddressCmd?URL=TopCategoriesDisplay?catalogId=10001&amp;storeId=10001&amp;activeLink=Home&amp;langId=-1&amp;justAdded=1"> 			
+													<input type="hidden" name="quantity" value="1">	
+													<input type="hidden" name="catEntryId" value="11527">	
+													<input type="hidden" name="comment" value="GQ">	
+													<input type="image" name="addtocart" id="addtocart_11527" src="/webapp/wcs/stores/content/CondeNast/images/so_add_to_cart.gif" alt="Add to Cart" />						
+												</form>						
+										
+											
+										
+																								
+							</div>
+						</li>				
+						
+					
+						
+						
+						
+						
+						
+	
+						
+											
+												
+								
+							
+								
+									
+								
+									
+								
+							
+						
+											
+												
+								
+							
+								
+									
+								
+									
+								
+							
+						
+											
+												
+								
+							
+								
+									
+								
+									
+								
+							
+						
+											
+												
+								
+							
+								
+									
+								
+									
+								
+							
+						
+											
+												
+								
+							
+								
+									
+								
+									
+								
+							
+						
+											
+												
+								
+							
+								
+									
+								
+									
+								
+							
+						
+											
+						
+						<li>
+							<div class="so_bg">
+											
+													
+									<h1>The New Yorker</h1>
+									
+									<a href="ProductDisplay?catalogId=10001&amp;storeId=10001&amp;productId=10519&amp;langId=-1"><img width="100" border="0" alt="The New Yorker" src="/webapp/wcs/stores/content/CondeNast/images/cover_newyorker_100.jpg" style="margin:5px 15px 5px 15px;border:1px solid #000;"/></a>
+									<!-- bundle img class="soImgBottom" -->			
+									
+													
+									
+										
+											
+										
+														
+											
+									
+										
+												
+													<div class="so_desc">
+														<br/>
+														<span class="termValue">47 issues / 1 year</span><br/>
+														<span class="cvrPrice">Cover Price: <span class="strike">$196.18</span></span><br/>
+														<span class="ourPrice">Our Price: $39.95</span><br/>
+														
+														
+														
+														
+														
+														<span class="youSave">You Save: 79%</span><br/>
+													</div>
+												
+												<form name="OrderItemAddForm_2" ACTION="OrderItemAdd" METHOD="POST" id="OrderItemAddForm_2" onsubmit="return Add2ShopCartAjax('OrderItemAddForm_2', 'addtocart_11537', '/webapp/wcs/stores/content/CondeNast/images/so_add_to_cart.gif', '/webapp/wcs/stores/content/CondeNast/images/loader_so_add_to_cart.gif', '/webapp/wcs/stores/content/CondeNast/images/so_added.gif')">
+													<input type="hidden" name="storeId" value="10001">
+													<input type="hidden" name="langId" value="-1"> 
+													<input type="hidden" name="catalogId" value="10001"> 
+													<input type="hidden" name="URL" value="OrderCalculate?URL=OrderItemResetAddressCmd?URL=TopCategoriesDisplay?catalogId=10001&amp;storeId=10001&amp;activeLink=Home&amp;langId=-1&amp;justAdded=1"> 			
+													<input type="hidden" name="quantity" value="1">	
+													<input type="hidden" name="catEntryId" value="11537">	
+													<input type="hidden" name="comment" value="The New Yorker">	
+													<input type="image" name="addtocart" id="addtocart_11537" src="/webapp/wcs/stores/content/CondeNast/images/so_add_to_cart.gif" alt="Add to Cart" />						
+												</form>						
+										
+											
+										
+																								
+							</div>
+						</li>				
+						
+					
+				
+				</ul>
+			</div>
+	</div>
+	
+
+
+
+<!-- BEGIN CarouselDisplay.jspf -->
+
+
+	
+	
+	
+	
+		
+		
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+		
+		
+
+
+
+
+
+
+
+
+	
+	
+	
+		
+		
+			
+		
+		
+		
+		
+		
+		
+		
+		
+		
+		
+		
+	
+
+
+<style type="text/css">
+.carousel-component {
+	padding-left: 1px;
+	width: 615px; 
+    overflow: hidden;
+}
+.carousel-component .carousel-list li { 
+    margin:0px;
+    /*width:58px;*/
+    /*    margin-left: auto;*/ /* for testing IE auto issue */
+}
+
+.carousel-component .carousel-list li a { 
+    display:block;
+    /*border:1px solid #e2edfa;*/
+    outline:none;
+    -moz-outline:none; 
+}
+
+.carousel-component .carousel-list li a:hover { 
+    /*border: 1px solid #87bf4e; */
+}
+
+.carousel-component .carousel-list li img { 
+    /*border:1px solid #999;*/
+    display:block;
+}
+
+.carousel-component .carousel-list li strong { 
+    display:block;
+}
+.carousel-clip-region {
+	/*background: #AFC5DA none repeat;*/
+	padding-left:51px;
+}
+</style>
+
+<script type="text/javascript" src="/webapp/wcs/stores/CondeNast/lib/yahoo-dom-event.js"></script> 
+<script type="text/javascript" src="/webapp/wcs/stores/CondeNast/lib/utilities.js"></script>
+<script type="text/javascript" src="/webapp/wcs/stores/CondeNast/lib/dragdrop-min.js"></script>
+<script type="text/javascript" src="/webapp/wcs/stores/CondeNast/lib/container_core-min.js"></script>
+<script type="text/javascript" src="/webapp/wcs/stores/CondeNast/lib/ycarousel_min.js"></script>		
+<script language="javascript">
+	function ProductUrl() {
+		this.id = 0;
+		this.partNumber;
+		this.altText;
+		this.src;
+		this.url;
+		this.hasBeenLoaded = false;
+	}
+var hash = new Hash();
+var carItems = new Hash();
+var imageList = [];
+var urlList = [];
+
+/**
+ * Since carousel.addItem uses an HTML string to create the interface
+ * for each carousel item, this method formats the HTML for an LI.
+ **/
+var fmtItem = function(imgUrl, url, title, id) {
+
+      var innerHTML = 
+          '<a href="' + 
+          url + 
+          '"><img src="' + 
+          imgUrl +
+        '" title="' +
+        title +
+        '" width="' +
+        58 +
+        '" height="' +
+        80+
+        '" id="' +
+        id+
+        '"/>' + 
+          '<\/a>';
+  
+    return innerHTML;
+    
+};
+/**
+ * Custom inital load handler. Called when the carousel loads the initial
+ * set of data items. Specified to the carousel as the configuration
+ * parameter: loadInitHandler
+ **/
+var loadInitialItems = function(type, args) {
+    var start = args[0];
+    var last = args[1]; 
+    load(this, 1, 27+10);
+    //this.moveTo(27);
+};
+/**
+ * Custom load next handler. Called when the carousel loads the next
+ * set of data items. Specified to the carousel as the configuration
+ * parameter: loadNextHandler
+ **/
+var loadNextItems = function(type, args) {    
+    var start = args[0];
+    var last = args[1]; 
+    var alreadyCached = args[2];
+
+    if(!alreadyCached) {
+        load(this, start, last);
+    	initCovers();
+    }
+};
+
+/**
+ * Custom load previous handler. Called when the carousel loads the previous
+ * set of data items. Specified to the carousel as the configuration
+ * parameter: loadPrevHandler
+ **/
+var loadPrevItems = function(type, args) {
+    var start = args[0];
+    var last = args[1]; 
+    var alreadyCached = args[2];
+    if (last == 6) {
+    	var pu = carItems.get(26);
+    	carousel.addItem(1, fmtItem(pu.src, pu.url, pu.altText, i));
+    	var pu = carItems.get(25);
+    	carousel.addItem(1, fmtItem(pu.src, pu.url, pu.altText, i));
+    	var pu = carItems.get(24);
+    	carousel.addItem(1, fmtItem(pu.src, pu.url, pu.altText, i));
+    	var pu = carItems.get(23);
+    	carousel.addItem(1, fmtItem(pu.src, pu.url, pu.altText, i));
+    } else {
+	    if(!alreadyCached) {
+	        load(this, start, last);
+	    }
+    }
+};
+
+var load = function(carousel, start, last) {
+    for(var i=start;i<=last;i++) {
+    	var itemIndex = i;
+    	while (itemIndex > 26) {
+    		itemIndex -= 26;
+    	}
+        var pu = carItems.get(itemIndex);
+        carousel.addItem(i, fmtItem(pu.src, pu.url, pu.altText, i));
+    }
+};
+
+var getRandom = function(max, last) {
+    var randomIndex;
+    do {
+        randomIndex = Math.floor(Math.random()*max);
+    } while(randomIndex == last);
+    
+    return randomIndex;
+};
+
+/**
+ * Custom button state handler for enabling/disabling button state. 
+ * Called when the carousel has determined that the previous button
+ * state should be changed.
+ * Specified to the carousel as the configuration
+ * parameter: prevButtonStateHandler
+ **/
+var handlePrevButtonState = function(type, args) {
+
+    var enabling = args[0];
+    var leftImage = args[1];
+/*    if(enabling) {
+        leftImage.src = "images/left-enabled.gif";    
+    } else {
+        leftImage.src = "images/left-disabled.gif";
+    }
+*/
+};
+
+/**
+ * You must create the carousel after the page is loaded since it is
+ * dependent on an HTML element (in this case 'dhtml-carousel'.) See the
+ * HTML code below.
+ **/
+
+var carousel; // for ease of debugging; globals generally not a good idea
+var pageLoad = function() 
+{
+    carousel = new YAHOO.extension.Carousel("car_container", 
+        {
+            numVisible:        10,
+            animationSpeed:    0.45,
+            scrollInc:         4,
+//            size:			   26,
+            prevElement:       "prev-arrow",
+            nextElement:       "next-arrow",
+            loadInitHandler:   loadInitialItems,
+            loadNextHandler:   loadNextItems,
+            loadPrevHandler:   loadPrevItems,
+            navMargin:		   23,
+//            wrap:			   true,
+			firstVisible: 	   27,
+            prevButtonStateHandler:   handlePrevButtonState
+        }
+    );
+    initCovers();
+};
+
+YAHOO.util.Event.addListener(window, 'load', pageLoad);
+
+function initCovers() {
+	var htNormal = 80, htSmall =80, htFull = 109,wNormal = 58, wSmall = 58, wFull = 80;
+	var cvrs = $$("ul#carousel_list_content li img");
+	var fx = new Fx.Elements(cvrs, {wait: false, duration: 300, transition: Fx.Transitions.Back.easeOut});
+	
+	cvrs.each(function(cvr, i) {
+		cvr.setStyles('width: '+wNormal+'px; height: '+htNormal+'px;');
+		cvr.addEvent("mouseenter", function(event) {
+			var o = {};
+			o[i] = {width: [cvr.getStyle("width").toInt(), wFull],height: [cvr.getStyle("height").toInt(), htFull]}
+			cvrs.each(function(other, j) {
+				if(i != j) {
+					var w = other.getStyle("width").toInt();
+					var h = other.getStyle("height").toInt();
+					if(h != htSmall) { o[j] = {height: [h, htSmall], width: [w, wSmall]}};
+				}
+			});
+			fx.start(o);
+			if ($('DEF_showcase')) {
+			var cvrIndex = cvr.getProperty('id');
+			while (cvrIndex > 26) {
+				cvrIndex -= 26;
+			}
+			var myAjax = new Ajax(hash.get(cvrIndex), 
+								 {method: 'get', 
+								  onComplete: function(resp) {
+//								  if ($('#DEF_showcase')) {
+									  $('DEF_showcase').setHTML(resp);
+//									  $('DEF_showcase').setOpacity('0');
+//									  $('UPD_showcase').setOpacity('1');
+//									  $('DEF_showcase').setStyle('display','none');
+//									  $('UPD_showcase').setStyle('display','block');
+//								  }
+								  }});
+			myAjax.request();
+			}
+		});
+		//click		
+	}); 
+
+	cvrs.addEvent("mouseleave", function(event) {
+		var o = {};
+		cvrs.each(function(cvr, i) {
+			o[i] = {width: [cvr.getStyle("width").toInt(), wNormal],height: [cvr.getStyle("height").toInt(), htNormal]}			
+		});
+		fx.start(o);
+	}); 
+	
+}
+
+</script>
+
+		
+			
+			
+								    		
+		
+									
+					   
+			<script language="javascript">
+			var productUrl = new ProductUrl();
+			productUrl.id="10523";
+			productUrl.partNumber="Vogue";
+			productUrl.altText = "Vogue";
+			productUrl.src = '/webapp/wcs/stores/content/CondeNast/images/cover_vogue_100.jpg';
+			productUrl.url = 'ProductDisplay?catalogId=10001&storeId=10001&productId=10523&langId=-1';
+			carItems.set('1', productUrl);
+			hash.set('1', 'ProductESpotDisplayView?catalogId=10001&storeId=10001&productId=10523&langId=-1&returnUrl=TopCategoriesDisplay%3fcatalogId%3d10001%26storeId%3d10001%26activeLink%3dHome%26langId%3d-1');
+			</script>
+									
+		
+									
+					   
+			<script language="javascript">
+			var productUrl = new ProductUrl();
+			productUrl.id="10524";
+			productUrl.partNumber="W";
+			productUrl.altText = "W";
+			productUrl.src = '/webapp/wcs/stores/content/CondeNast/images/cover_w_100.jpg';
+			productUrl.url = 'ProductDisplay?catalogId=10001&storeId=10001&productId=10524&langId=-1';
+			carItems.set('2', productUrl);
+			hash.set('2', 'ProductESpotDisplayView?catalogId=10001&storeId=10001&productId=10524&langId=-1&returnUrl=TopCategoriesDisplay%3fcatalogId%3d10001%26storeId%3d10001%26activeLink%3dHome%26langId%3d-1');
+			</script>
+									
+		
+									
+					   
+			<script language="javascript">
+			var productUrl = new ProductUrl();
+			productUrl.id="10510";
+			productUrl.partNumber="Glamour";
+			productUrl.altText = "Glamour";
+			productUrl.src = '/webapp/wcs/stores/content/CondeNast/images/cover_glamour_100.jpg';
+			productUrl.url = 'ProductDisplay?catalogId=10001&storeId=10001&productId=10510&langId=-1';
+			carItems.set('3', productUrl);
+			hash.set('3', 'ProductESpotDisplayView?catalogId=10001&storeId=10001&productId=10510&langId=-1&returnUrl=TopCategoriesDisplay%3fcatalogId%3d10001%26storeId%3d10001%26activeLink%3dHome%26langId%3d-1');
+			</script>
+									
+		
+									
+					   
+			<script language="javascript">
+			var productUrl = new ProductUrl();
+			productUrl.id="10001";
+			productUrl.partNumber="allure";
+			productUrl.altText = "Allure";
+			productUrl.src = '/webapp/wcs/stores/content/CondeNast/images/cover_allure_100.jpg';
+			productUrl.url = 'ProductDisplay?catalogId=10001&storeId=10001&productId=10001&langId=-1';
+			carItems.set('4', productUrl);
+			hash.set('4', 'ProductESpotDisplayView?catalogId=10001&storeId=10001&productId=10001&langId=-1&returnUrl=TopCategoriesDisplay%3fcatalogId%3d10001%26storeId%3d10001%26activeLink%3dHome%26langId%3d-1');
+			</script>
+									
+		
+									
+					   
+			<script language="javascript">
+			var productUrl = new ProductUrl();
+			productUrl.id="10520";
+			productUrl.partNumber="Self";
+			productUrl.altText = "Self";
+			productUrl.src = '/webapp/wcs/stores/content/CondeNast/images/cover_self_100.jpg';
+			productUrl.url = 'ProductDisplay?catalogId=10001&storeId=10001&productId=10520&langId=-1';
+			carItems.set('5', productUrl);
+			hash.set('5', 'ProductESpotDisplayView?catalogId=10001&storeId=10001&productId=10520&langId=-1&returnUrl=TopCategoriesDisplay%3fcatalogId%3d10001%26storeId%3d10001%26activeLink%3dHome%26langId%3d-1');
+			</script>
+									
+		
+									
+					   
+			<script language="javascript">
+			var productUrl = new ProductUrl();
+			productUrl.id="10521";
+			productUrl.partNumber="TeenVogue";
+			productUrl.altText = "Teen Vogue";
+			productUrl.src = '/webapp/wcs/stores/content/CondeNast/images/cover_teenvogue_100.jpg';
+			productUrl.url = 'ProductDisplay?catalogId=10001&storeId=10001&productId=10521&langId=-1';
+			carItems.set('6', productUrl);
+			hash.set('6', 'ProductESpotDisplayView?catalogId=10001&storeId=10001&productId=10521&langId=-1&returnUrl=TopCategoriesDisplay%3fcatalogId%3d10001%26storeId%3d10001%26activeLink%3dHome%26langId%3d-1');
+			</script>
+									
+		
+									
+					   
+			<script language="javascript">
+			var productUrl = new ProductUrl();
+			productUrl.id="10514";
+			productUrl.partNumber="GQ";
+			productUrl.altText = "GQ";
+			productUrl.src = '/webapp/wcs/stores/content/CondeNast/images/cover_gq_100.jpg';
+			productUrl.url = 'ProductDisplay?catalogId=10001&storeId=10001&productId=10514&langId=-1';
+			carItems.set('7', productUrl);
+			hash.set('7', 'ProductESpotDisplayView?catalogId=10001&storeId=10001&productId=10514&langId=-1&returnUrl=TopCategoriesDisplay%3fcatalogId%3d10001%26storeId%3d10001%26activeLink%3dHome%26langId%3d-1');
+			</script>
+									
+		
+									
+					   
+			<script language="javascript">
+			var productUrl = new ProductUrl();
+			productUrl.id="10507";
+			productUrl.partNumber="Details";
+			productUrl.altText = "Details";
+			productUrl.src = '/webapp/wcs/stores/content/CondeNast/images/cover_details_100.jpg';
+			productUrl.url = 'ProductDisplay?catalogId=10001&storeId=10001&productId=10507&langId=-1';
+			carItems.set('8', productUrl);
+			hash.set('8', 'ProductESpotDisplayView?catalogId=10001&storeId=10001&productId=10507&langId=-1&returnUrl=TopCategoriesDisplay%3fcatalogId%3d10001%26storeId%3d10001%26activeLink%3dHome%26langId%3d-1');
+			</script>
+									
+		
+									
+					   
+			<script language="javascript">
+			var productUrl = new ProductUrl();
+			productUrl.id="10517";
+			productUrl.partNumber="MensVogue";
+			productUrl.altText = "Men&#039;s Vogue";
+			productUrl.src = '/webapp/wcs/stores/content/CondeNast/images/cover_mensvogue_100.jpg';
+			productUrl.url = 'ProductDisplay?catalogId=10001&storeId=10001&productId=10517&langId=-1';
+			carItems.set('9', productUrl);
+			hash.set('9', 'ProductESpotDisplayView?catalogId=10001&storeId=10001&productId=10517&langId=-1&returnUrl=TopCategoriesDisplay%3fcatalogId%3d10001%26storeId%3d10001%26activeLink%3dHome%26langId%3d-1');
+			</script>
+									
+		
+									
+					   
+			<script language="javascript">
+			var productUrl = new ProductUrl();
+			productUrl.id="10501";
+			productUrl.partNumber="ArchitecturalDigest";
+			productUrl.altText = "Architectural Digest";
+			productUrl.src = '/webapp/wcs/stores/content/CondeNast/images/cover_archdigest_100.jpg';
+			productUrl.url = 'ProductDisplay?catalogId=10001&storeId=10001&productId=10501&langId=-1';
+			carItems.set('10', productUrl);
+			hash.set('10', 'ProductESpotDisplayView?catalogId=10001&storeId=10001&productId=10501&langId=-1&returnUrl=TopCategoriesDisplay%3fcatalogId%3d10001%26storeId%3d10001%26activeLink%3dHome%26langId%3d-1');
+			</script>
+									
+		
+									
+					   
+			<script language="javascript">
+			var productUrl = new ProductUrl();
+			productUrl.id="10502";
+			productUrl.partNumber="Brides";
+			productUrl.altText = "Brides";
+			productUrl.src = '/webapp/wcs/stores/content/CondeNast/images/cover_brides_100.jpg';
+			productUrl.url = 'ProductDisplay?catalogId=10001&storeId=10001&productId=10502&langId=-1';
+			carItems.set('11', productUrl);
+			hash.set('11', 'ProductESpotDisplayView?catalogId=10001&storeId=10001&productId=10502&langId=-1&returnUrl=TopCategoriesDisplay%3fcatalogId%3d10001%26storeId%3d10001%26activeLink%3dHome%26langId%3d-1');
+			</script>
+									
+		
+									
+					   
+			<script language="javascript">
+			var productUrl = new ProductUrl();
+			productUrl.id="10518";
+			productUrl.partNumber="ModernBride";
+			productUrl.altText = "Modern Bride";
+			productUrl.src = '/webapp/wcs/stores/content/CondeNast/images/cover_modernbride_100.jpg';
+			productUrl.url = 'ProductDisplay?catalogId=10001&storeId=10001&productId=10518&langId=-1';
+			carItems.set('12', productUrl);
+			hash.set('12', 'ProductESpotDisplayView?catalogId=10001&storeId=10001&productId=10518&langId=-1&returnUrl=TopCategoriesDisplay%3fcatalogId%3d10001%26storeId%3d10001%26activeLink%3dHome%26langId%3d-1');
+			</script>
+									
+		
+									
+					   
+			<script language="javascript">
+			var productUrl = new ProductUrl();
+			productUrl.id="10509";
+			productUrl.partNumber="ElegantBride";
+			productUrl.altText = "Elegant Bride";
+			productUrl.src = '/webapp/wcs/stores/content/CondeNast/images/cover_elegantbride_100.jpg';
+			productUrl.url = 'ProductDisplay?catalogId=10001&storeId=10001&productId=10509&langId=-1';
+			carItems.set('13', productUrl);
+			hash.set('13', 'ProductESpotDisplayView?catalogId=10001&storeId=10001&productId=10509&langId=-1&returnUrl=TopCategoriesDisplay%3fcatalogId%3d10001%26storeId%3d10001%26activeLink%3dHome%26langId%3d-1');
+			</script>
+									
+		
+									
+					   
+			<script language="javascript">
+			var productUrl = new ProductUrl();
+			productUrl.id="10516";
+			productUrl.partNumber="Lucky";
+			productUrl.altText = "Lucky";
+			productUrl.src = '/webapp/wcs/stores/content/CondeNast/images/cover_lucky_100.jpg';
+			productUrl.url = 'ProductDisplay?catalogId=10001&storeId=10001&productId=10516&langId=-1';
+			carItems.set('14', productUrl);
+			hash.set('14', 'ProductESpotDisplayView?catalogId=10001&storeId=10001&productId=10516&langId=-1&returnUrl=TopCategoriesDisplay%3fcatalogId%3d10001%26storeId%3d10001%26activeLink%3dHome%26langId%3d-1');
+			</script>
+									
+		
+									
+					   
+			<script language="javascript">
+			var productUrl = new ProductUrl();
+			productUrl.id="10508";
+			productUrl.partNumber="Domino";
+			productUrl.altText = "Domino";
+			productUrl.src = '/webapp/wcs/stores/content/CondeNast/images/cover_domino_100.jpg';
+			productUrl.url = 'ProductDisplay?catalogId=10001&storeId=10001&productId=10508&langId=-1';
+			carItems.set('15', productUrl);
+			hash.set('15', 'ProductESpotDisplayView?catalogId=10001&storeId=10001&productId=10508&langId=-1&returnUrl=TopCategoriesDisplay%3fcatalogId%3d10001%26storeId%3d10001%26activeLink%3dHome%26langId%3d-1');
+			</script>
+									
+		
+									
+					   
+			<script language="javascript">
+			var productUrl = new ProductUrl();
+			productUrl.id="10512";
+			productUrl.partNumber="GolfDigest";
+			productUrl.altText = "Golf Digest";
+			productUrl.src = '/webapp/wcs/stores/content/CondeNast/images/cover_golfdigest_100.jpg';
+			productUrl.url = 'ProductDisplay?catalogId=10001&storeId=10001&productId=10512&langId=-1';
+			carItems.set('16', productUrl);
+			hash.set('16', 'ProductESpotDisplayView?catalogId=10001&storeId=10001&productId=10512&langId=-1&returnUrl=TopCategoriesDisplay%3fcatalogId%3d10001%26storeId%3d10001%26activeLink%3dHome%26langId%3d-1');
+			</script>
+									
+		
+									
+					   
+			<script language="javascript">
+			var productUrl = new ProductUrl();
+			productUrl.id="10511";
+			productUrl.partNumber="GolfWorld";
+			productUrl.altText = "Golf World";
+			productUrl.src = '/webapp/wcs/stores/content/CondeNast/images/cover_golfworld_100.jpg';
+			productUrl.url = 'ProductDisplay?catalogId=10001&storeId=10001&productId=10511&langId=-1';
+			carItems.set('17', productUrl);
+			hash.set('17', 'ProductESpotDisplayView?catalogId=10001&storeId=10001&productId=10511&langId=-1&returnUrl=TopCategoriesDisplay%3fcatalogId%3d10001%26storeId%3d10001%26activeLink%3dHome%26langId%3d-1');
+			</script>
+									
+		
+									
+					   
+			<script language="javascript">
+			var productUrl = new ProductUrl();
+			productUrl.id="10513";
+			productUrl.partNumber="GolfForWomen";
+			productUrl.altText = "Golf For Women";
+			productUrl.src = '/webapp/wcs/stores/content/CondeNast/images/cover_golfforwomen_100.jpg';
+			productUrl.url = 'ProductDisplay?catalogId=10001&storeId=10001&productId=10513&langId=-1';
+			carItems.set('18', productUrl);
+			hash.set('18', 'ProductESpotDisplayView?catalogId=10001&storeId=10001&productId=10513&langId=-1&returnUrl=TopCategoriesDisplay%3fcatalogId%3d10001%26storeId%3d10001%26activeLink%3dHome%26langId%3d-1');
+			</script>
+									
+		
+									
+					   
+			<script language="javascript">
+			var productUrl = new ProductUrl();
+			productUrl.id="10522";
+			productUrl.partNumber="VanityFair";
+			productUrl.altText = "Vanity Fair";
+			productUrl.src = '/webapp/wcs/stores/content/CondeNast/images/cover_vanityfair_100.jpg';
+			productUrl.url = 'ProductDisplay?catalogId=10001&storeId=10001&productId=10522&langId=-1';
+			carItems.set('19', productUrl);
+			hash.set('19', 'ProductESpotDisplayView?catalogId=10001&storeId=10001&productId=10522&langId=-1&returnUrl=TopCategoriesDisplay%3fcatalogId%3d10001%26storeId%3d10001%26activeLink%3dHome%26langId%3d-1');
+			</script>
+									
+		
+									
+					   
+			<script language="javascript">
+			var productUrl = new ProductUrl();
+			productUrl.id="10515";
+			productUrl.partNumber="Gourmet";
+			productUrl.altText = "Gourmet";
+			productUrl.src = '/webapp/wcs/stores/content/CondeNast/images/cover_gourmet_100.jpg';
+			productUrl.url = 'ProductDisplay?catalogId=10001&storeId=10001&productId=10515&langId=-1';
+			carItems.set('20', productUrl);
+			hash.set('20', 'ProductESpotDisplayView?catalogId=10001&storeId=10001&productId=10515&langId=-1&returnUrl=TopCategoriesDisplay%3fcatalogId%3d10001%26storeId%3d10001%26activeLink%3dHome%26langId%3d-1');
+			</script>
+									
+		
+									
+					   
+			<script language="javascript">
+			var productUrl = new ProductUrl();
+			productUrl.id="10503";
+			productUrl.partNumber="BonAppetite";
+			productUrl.altText = "Bon App&amp;eacute;tit";
+			productUrl.src = '/webapp/wcs/stores/content/CondeNast/images/cover_bonap_100.jpg';
+			productUrl.url = 'ProductDisplay?catalogId=10001&storeId=10001&productId=10503&langId=-1';
+			carItems.set('21', productUrl);
+			hash.set('21', 'ProductESpotDisplayView?catalogId=10001&storeId=10001&productId=10503&langId=-1&returnUrl=TopCategoriesDisplay%3fcatalogId%3d10001%26storeId%3d10001%26activeLink%3dHome%26langId%3d-1');
+			</script>
+									
+		
+									
+					   
+			<script language="javascript">
+			var productUrl = new ProductUrl();
+			productUrl.id="10506";
+			productUrl.partNumber="CondeNastTraveler";
+			productUrl.altText = "Cond&amp;eacute; Nast Traveler";
+			productUrl.src = '/webapp/wcs/stores/content/CondeNast/images/cover_travel_100.jpg';
+			productUrl.url = 'ProductDisplay?catalogId=10001&storeId=10001&productId=10506&langId=-1';
+			carItems.set('22', productUrl);
+			hash.set('22', 'ProductESpotDisplayView?catalogId=10001&storeId=10001&productId=10506&langId=-1&returnUrl=TopCategoriesDisplay%3fcatalogId%3d10001%26storeId%3d10001%26activeLink%3dHome%26langId%3d-1');
+			</script>
+									
+		
+									
+					   
+			<script language="javascript">
+			var productUrl = new ProductUrl();
+			productUrl.id="11001";
+			productUrl.partNumber="Wired";
+			productUrl.altText = "Wired";
+			productUrl.src = '/webapp/wcs/stores/content/CondeNast/images/cover_wired_100.jpg';
+			productUrl.url = 'ProductDisplay?catalogId=10001&storeId=10001&productId=11001&langId=-1';
+			carItems.set('23', productUrl);
+			hash.set('23', 'ProductESpotDisplayView?catalogId=10001&storeId=10001&productId=11001&langId=-1&returnUrl=TopCategoriesDisplay%3fcatalogId%3d10001%26storeId%3d10001%26activeLink%3dHome%26langId%3d-1');
+			</script>
+									
+		
+									
+					   
+			<script language="javascript">
+			var productUrl = new ProductUrl();
+			productUrl.id="10504";
+			productUrl.partNumber="Cookie";
+			productUrl.altText = "Cookie";
+			productUrl.src = '/webapp/wcs/stores/content/CondeNast/images/cover_cookie_100.jpg';
+			productUrl.url = 'ProductDisplay?catalogId=10001&storeId=10001&productId=10504&langId=-1';
+			carItems.set('24', productUrl);
+			hash.set('24', 'ProductESpotDisplayView?catalogId=10001&storeId=10001&productId=10504&langId=-1&returnUrl=TopCategoriesDisplay%3fcatalogId%3d10001%26storeId%3d10001%26activeLink%3dHome%26langId%3d-1');
+			</script>
+									
+		
+									
+					   
+			<script language="javascript">
+			var productUrl = new ProductUrl();
+			productUrl.id="10505";
+			productUrl.partNumber="CondeNastPortfolio";
+			productUrl.altText = "Cond&amp;eacute; Nast Portfolio";
+			productUrl.src = '/webapp/wcs/stores/content/CondeNast/images/cover_portfolio_100.jpg';
+			productUrl.url = 'ProductDisplay?catalogId=10001&storeId=10001&productId=10505&langId=-1';
+			carItems.set('25', productUrl);
+			hash.set('25', 'ProductESpotDisplayView?catalogId=10001&storeId=10001&productId=10505&langId=-1&returnUrl=TopCategoriesDisplay%3fcatalogId%3d10001%26storeId%3d10001%26activeLink%3dHome%26langId%3d-1');
+			</script>
+									
+		
+									
+					   
+			<script language="javascript">
+			var productUrl = new ProductUrl();
+			productUrl.id="10519";
+			productUrl.partNumber="NewYorker";
+			productUrl.altText = "The New Yorker";
+			productUrl.src = '/webapp/wcs/stores/content/CondeNast/images/cover_newyorker_100.jpg';
+			productUrl.url = 'ProductDisplay?catalogId=10001&storeId=10001&productId=10519&langId=-1';
+			carItems.set('26', productUrl);
+			hash.set('26', 'ProductESpotDisplayView?catalogId=10001&storeId=10001&productId=10519&langId=-1&returnUrl=TopCategoriesDisplay%3fcatalogId%3d10001%26storeId%3d10001%26activeLink%3dHome%26langId%3d-1');
+			</script>
+									
+						
+			
+
+<div id="car_container">
+<div class="carousel-component">
+	<div style="text-align: center; left:5px; display: block;">
+		Click cover to find out more.<br />
+	</div><!-- show only on homepage -->
+    <div><img id="prev-arrow" class="left-button-image" src="/webapp/wcs/stores/content/CondeNast/images//left3-disabled.gif" alt="Previous group"/>
+    </div>
+    <div><img id="next-arrow" class="right-button-image" src="/webapp/wcs/stores/content/CondeNast/images//right3-disabled.gif" alt="Next group" />
+    </div>
+    <div class="carousel-clip-region">
+        <ul id="carousel_list_content" class="carousel-list">
+        </ul>
+    </div>
+</div>
+</div>
+
+
+
+<script type="text/javascript">
+
+
+
+</script>
+
+
+<!-- END CarouselDisplay.jspf -->
+
+</div><!-- MAIN CONTENT ENDS HERE -->
+</td>
+    <td align="left" valign="top" rowspan="2">    
+
+<!-- BEGIN RightSideDisplay.jspf -->
+
+
+	
+	
+	
+	
+	
+	
+	
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+		
+		
+
+
+
+
+	
+
+
+
+
+	<!-- useMooTools:2 true -->
+<div id="rightnav">
+	
+		
+		
+		
+		
+	
+		
+		<script> djConfig.searchIds.push("miniShopCartArea"); </script>
+		<div dojoType="wc:RefreshArea" id="miniShopCartArea" widgetId="miniShopCartArea" controllerId="miniShopCartAreaController">		
+	
+		
+    		
+    			
+    			
+    			    			
+            
+<!-- Start - JSP File Name: MiniShopCartDisplay.jsp -->
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+		
+		
+
+
+
+   
+
+
+
+
+
+	
+
+
+
+	
+
+
+
+
+
+
+
+
+	
+	<h1>Your Cart <img src="/webapp/wcs/stores/content/CondeNast/images/cart.png" style="border:0; vertical-align:middle;" alt="Shopping Cart" /></h1>
+	<div class="box">
+		 Cart: <span class="h_text_red">
+			0</span> item(s)
+		<br />
+		Subtotal:
+		$0.00
+		<br />
+		
+		<br />		
+		<strong><span style="float:right"><a href="OrderCalculate?langId=-1&amp;storeId=10001&amp;catalogId=10001&amp;URL=ReviewCartDisplay%3fstoreId%3d10001%26catalogId%3d10001">Check Out</a></span><a href="OrderCalculate?langId=-1&amp;storeId=10001&amp;catalogId=10001&amp;URL=OrderItemDisplay%3fstoreId%3d10001%26catalogId%3d10001&amp;activeLink=Cart">View Cart</a> </strong>
+	</div>				
+	
+				
+		</div>
+</div>
+
+<!-- END RightSideDisplay.jspf -->
+  </td>
+  </tr>
+  <tr><td>
+  <tr>
+    <td colspan="3" align="left" valign="top">
+
+<!-- BEGIN FooterDisplay.jspf -->
+
+	
+	
+	
+	
+		
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+		
+		
+
+
+
+<!-- BEGIN CachedFooterDisplay.jsp -->
+<div id="footer">
+	<br style="clear:both"/>
+<a href="ContactUsView?langId=-1&amp;storeId=10001&amp;catalogId=10001">Contact Us</a> - 
+<a href="http://www.condenastdirect.com/store/services_magazine/user" target="terms">Terms of Use</a> - 
+<a href="http://www.condenastdirect.com/store/services_magazine/privacy" target="privacy">Privacy Policy</a> - 
+<a href="http://condenastcareers.com" target="careers">Careers</a>
+<p>&copy; 2007 Cond&eacute; Nast Publications - All Rights Reserved</p>
+</div>
+
+<!-- END CachedFooterDisplay.jsp -->
+
+<!-- END FooterDisplay.jspf -->
+</td>
+  </tr>
+</table></div>
+</body></html>
\ No newline at end of file

Copied: trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/html-handwritten-with-wrong-file-extension.txt (from rev 976, trunk/dna-repository/src/test/resources/docs/html-handwritten-with-wrong-file-extension.txt)
===================================================================
--- trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/html-handwritten-with-wrong-file-extension.txt	                        (rev 0)
+++ trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/html-handwritten-with-wrong-file-extension.txt	2009-06-04 22:31:30 UTC (rev 977)
@@ -0,0 +1,16 @@
+<html>
+
+<head>
+	<title>Example document</title>
+	<meta name="author" content="Chris">
+	<meta name="keywords" content="extractor, test, rdf">
+	<meta name="description" content="testing the html extractor">
+</head>
+
+<body>
+	<h1>Example document</h1>
+	
+	<p>This is some example text.
+</body>
+
+</html>
\ No newline at end of file


Property changes on: trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/html-handwritten-with-wrong-file-extension.txt
___________________________________________________________________
Name: svn:mime-type
   + text/plain
Name: svn:keywords
   + Id Revision
Name: svn:eol-style
   + LF

Copied: trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/html-handwritten.html (from rev 976, trunk/dna-repository/src/test/resources/docs/html-handwritten.html)
===================================================================
--- trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/html-handwritten.html	                        (rev 0)
+++ trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/html-handwritten.html	2009-06-04 22:31:30 UTC (rev 977)
@@ -0,0 +1,16 @@
+<html>
+
+<head>
+	<title>Example document</title>
+	<meta name="author" content="Chris">
+	<meta name="keywords" content="extractor, test, rdf">
+	<meta name="description" content="testing the html extractor">
+</head>
+
+<body>
+	<h1>Example document</h1>
+	
+	<p>This is some example text.
+</body>
+
+</html>
\ No newline at end of file

Copied: trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/html-quelle.de.html (from rev 976, trunk/dna-repository/src/test/resources/docs/html-quelle.de.html)
===================================================================
--- trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/html-quelle.de.html	                        (rev 0)
+++ trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/html-quelle.de.html	2009-06-04 22:31:30 UTC (rev 977)
@@ -0,0 +1,2636 @@
+<!-- TemplateBegin: $Archive:   //pvcssrv02.service.itellium.net/pvcsfs/b2ccc/pvcsprojekte/Q2_Gesamt/archives/enfinity/share/private/eCS/Store/templates/de/q_category_10000.isml-arc  $ $Revision:   1.9  $ -->
+
+<!-- Hallo //-->
+
+
+
+
+
+
+
+
+
+
+
+
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
+"http://www.w3.org/TR/html4/loose.dtd">
+<html>
+<head>
+<meta name="INTERSHOP" content="Powered by INTERSHOP Enfinity"/>
+
+<script type="text/javascript">
+var storefront = true;
+</script>
+<!-- TemplateBegin : inc/q6_first_include.isml  $Revision$ -->
+
+<script type="text/javascript">
+var WebRoot='http://images.quelle.de/is-bin/intershop.static/WFS/Quelle-quelle_de-Site/-/de_DE';
+var d=new Date();
+var dat=d.getYear()+''+d.getMonth()+''+d.getDate();
+document.write('<scr'+'ipt type="text/javascr'+'ipt" src="'+WebRoot+'/js/basic.js?idrefresh='+dat+'"><\/scr'+'ipt>');
+if ( (typeof(window['storefront']) == "undefined") || (storefront !== true) ){
+document.write('<scr'+'ipt type="text/javascr'+'ipt" src="'+WebRoot+'/js/q_cookie.js?idrefresh='+dat+'"><\/scr'+'ipt>');}
+</script>
+<script type="text/javascript">
+var sid = '';
+if ( sid != '' ) {
+sid = sid.substring(5, sid.length);
+} else {
+sid = getCookie('sid');
+}
+</script>
+
+<!-- TemplateEnd : inc/q6_first_include.isml $Revision$ -->
+
+<title> quelle.de </title>
+<link rel="stylesheet" href="http://images.quelle.de/is-bin/intershop.static/WFS/Quelle-quelle_de-Site/-/de_DE/css/position.css" type="text/css">
+<link rel="stylesheet" href="http://images.quelle.de/is-bin/intershop.static/WFS/Quelle-quelle_de-Site/-/de_DE/css/font.css" type="text/css">
+<link rel="shortcut icon" href="http://images.quelle.de/is-bin/intershop.static/WFS/Quelle-quelle_de-Site/-/de_DE/imagesOnline/favicon.ico">
+<!-- Template Begin:  inc/q_minibasket_ecs.isml (sld_ch_quelle_app) -->
+
+
+
+<link rel="shortcut icon" href="http://images.quelle.de/is-bin/intershop.static/WFS/Quelle-quelle_de-Site/-/de_DE/imagesOnline/favicon.ico">
+
+<script type="text/javascript">
+<!--
+var testProduktSKU = '';
+var testProduktAAID = '';
+setCookie("CookieActive", "yes");
+if(getBasketSum().length < 1) {
+setCookie("BasketSum", "0.00");
+}
+if(getBasketElemCount().length < 1) {
+setCookie("BasketElemCount", 0);
+}
+function prepareMBPrice(price){
+//alert(price+"do");
+price = price.replace(/\,/,".")
+if(price.indexOf(".") != price.lastIndexOf(".")){
+price=price.replace(".","");
+}
+//alert(price+"posle");
+return price;
+}
+function NNuser() {
+var ns4=document.layers;
+if(ns4) {
+window.open("http://www.quelle.de/is-bin/INTERSHOP.enfinity/WFS/Quelle-quelle_de-Site/de_DE/-/EUR/Q_ViewTemplate_ecs-View?Template=q_quick_basket_hinweis_nn_popup&Linktype=K", "QuickBasketNN", "width=250,height=262,toolbar=no,location=0,directories=0,status=0,menubar=0,scrollbars=no,resizeable=no");
+}
+}
+function getBasketSum(){
+var bs = getCookie("BasketSum");
+if (bs != null && bs != -1 && bs != "N/A" && bs != "undefined"){
+return bs.replace(/,/,"."); // return value with Euro symbol
+}else{
+return "0.00";}
+}
+function getBasketElemCount(){
+var ec = getCookie("BasketElemCount");
+if (ec != null && ec != -1 && ec != "N/A" && ec != "undefined"){
+return ec;
+}
+else {
+return 0;
+}
+}
+var bBasketClick = false; //this variable is also used in q_basket_direct_order
+function callZurKasse()
+{
+if (!bBasketClick)
+{
+switch_zum_warenkorb_button();
+window.setTimeout('window.location.href = "https://www.quelle.de/is-bin/INTERSHOP.enfinity/WFS/Quelle-quelle_de-Site/de_DE/-/EUR/Q_ViewBasketOpt-DispatchForm?Linktype=AB";',100);
+window.bBasketClick = true;
+}
+try {document.getElementById("zurKasseBTN").href = "";} catch(e) {}
+}
+function callExpressKasse()
+{
+if (!bBasketClick)
+{
+window.location.href = "https://www.quelle.de/is-bin/INTERSHOP.enfinity/WFS/Quelle-quelle_de-Site/de_DE/-/EUR/Q_ViewBasketOpt-DispatchForm?Linktype=AB";
+bBasketClick = true;
+}
+try {document.getElementById("zurExpressKasseBTN").href = "";} catch(e) {}
+}
+function printMiniBasket(catalogbarPipelineInclude) {
+var html;
+if(getCookie('CookieActive') != "")
+{
+html = '<span id="bluebar-minibasket-k1gfx"><img src="http://images.quelle.de/is-bin/intershop.static/WFS/Quelle-quelle_de-Site/-/de_DE/imagesOnline/q5_kasse1.gif" width="17" height="15" border="0" alt=""></span>';
+html += '<span id="basketelementcount" style="position:absolute;left:140px;top:4px;" class="q-normal-12px-darkgray">Artikel: <b>' + getBasketElemCount() + '</b></span>';
+html += '<span id="basketsum" style="position:absolute;left:204px;top:4px;" class="q-normal-12px-darkgray">Summe: <b>' + getBasketSum() + ' &euro;</b></span>';
+if (catalogbarPipelineInclude != null && catalogbarPipelineInclude == 'true')
+{
+html = html + '<span style="position:absolute;left:34px;top:26px;"><a href="https://www.quelle.de/is-bin/INTERSHOP.enfinity/WFS/Quelle-quelle_de-Site/de_DE/-/EUR/Q_ViewBasketOpt-DispatchForm?Linktype=AB" id="zurKasseBTN" class="q-normal-11px-darkblue">direkt zur Kasse</a></span>';
+}
+else
+{
+html = html + '<span style="position:absolute;left:34px;top:26px;"><a href="javascript:if (top.frames.length == 0) javascript:callZurKasse(); else location.href=\'https://www.quelle.de/is-bin/INTERSHOP.enfinity/WFS/Quelle-quelle_de-Site/de_DE/-/EUR/Q_ViewBasketOpt-DispatchForm?Linktype=AB\'"';
+html = html + ' id="zurKasseBTN" class="q-normal-11px-darkblue">direkt zur Kasse</a></span>';
+}
+}
+else
+{
+html = '<span style="position:absolute;top:26px;left:6px;" class="q-normal-10px-darkblue">Eine Anzeige ist nur mit <a href="javascript:showHelp();" class="q-normal-11px-darkblue"><b>aktivierten Cookies</b></a> m&ouml;glich.</span>';
+}
+document.write(html);
+}
+function showHelp() {
+newWin('CookieHelp','http://www.quelle.de/is-bin/INTERSHOP.enfinity/WFS/Quelle-quelle_de-Site/de_DE/-/EUR/Q_ViewStatic-CookieHelp',462,568,'scrollbars=no');
+}
+function updateMiniBasket(basketsum, basketelementcount)
+{
+if(getCookie('CookieActive') != "")
+{
+//Dynmic-Basket Interface call
+if ((typeof(dynBasket) != "undefined") && (dynBasket != null)) {
+dynBasket.productNumberDisplay.innerHTML = "<b>"+basketelementcount+"</b> Artikel";
+dynBasket.productSumDisplay.innerHTML = "Artikel:&nbsp;&nbsp;<b>"+basketelementcount+"</b> Summe:&nbsp;&nbsp;<b>"+basketsum.replace(/\./,",")+"&nbsp;&euro;</b>";
+dynBasket.stateDisplay.innerHTML = "<img src='"+dynBasket.imageList.open+"' class='bild' onclick='"+dynBasket.id+".toggle();'>";
+dynBasket.dirty = true;
+}
+//document.getElementById("basketelementcount").innerHTML="Artikel: <b>" + basketelementcount + "</b>";
+//document.getElementById("basketsum").innerHTML="Summe: <b>" + basketsum.replace(/\./,",") + " &euro;</b>";
+}
+}
+if (typeof(testProdukt) == "undefined"){
+testProdukt = false;
+}
+// fuer "In den WK" Button ohne Redirect
+function addToBasket( price, quantity, sLink )
+{
+if (!testProdukt) {
+price = price.replace(/,/,".");
+basketSum = getBasketSum();
+basketCount = getBasketElemCount();
+try {
+if (document.getElementById("amount").value > 1) {
+sLink = sLink + '&Quantity=' + document.getElementById("amount").value;
+quantity = document.getElementById("amount").value;
+}
+} catch(e) {}
+if( price.indexOf("EUR") == 0 )
+{
+iLen = price.length;
+price = price.substring( 3, iLen );
+}
+basketCount = basketCount * 1;
+if( basketCount < 19 )
+{
+basketSum = basketSum * 1 + price * quantity;
+basketCount = basketCount + 1;
+basketSum = Math.round(basketSum*Math.pow(10,2))/Math.pow(10,2);
+setCookie("BasketElemCount", basketCount);
+setCookie("BasketSum", basketSum.toFixed(2));
+if ( (typeof(show_rec2_ok) != "undefined") && show_rec2_ok) {
+switch_wkbutton();
+}
+var bi = new Image();
+var dat = new Date;
+var anID = ('' + dat.getTime()) + ('' + Math.random());
+bi.src = sLink + '&randomid=' + anID;
+updateMiniBasket(basketSum.toFixed(2), basketCount);
+after_basket(quantity);
+}
+else
+{
+window.location.href = "https://www.quelle.de/is-bin/INTERSHOP.enfinity/WFS/Quelle-quelle_de-Site/de_DE/-/EUR/Q_ViewBasketOpt-View?Linktype=AB&ERROR_Basket=BasketSize";
+}
+}
+else
+{
+var tmp;
+switch_wkbutton();
+tmp = sLink.substring(sLink.indexOf("ProductSKU=")+11, sLink.length);
+testProduktSKU = tmp.substring(0, tmp.indexOf("&"));
+tmp = sLink.substring(sLink.indexOf("AAID=")+5, sLink.length);
+testProduktAAID = tmp.substring(0, tmp.indexOf("&"));
+after_basket(quantity);
+}
+}
+// nach addToBasket
+function after_basket(quantity) {
+var url;
+var sku;
+if (q6content) {
+url = "http://www.quelle.de/is-bin/INTERSHOP.enfinity/WFS/Quelle-quelle_de-Site/de_DE/-/EUR/Q_ProductRecommendation-Rec2NewStatic?textonly=true";
+} else {
+url = "http://www.quelle.de/is-bin/INTERSHOP.enfinity/WFS/Quelle-quelle_de-Site/de_DE/-/EUR/Q_ProductRecommendation-Rec2Static?textonly=true";
+}
+if ( (typeof(FileShowRecommended) != "undefined") && FileShowRecommended && (typeof(REAnzeigePA2) != "undefined") && REAnzeigePA2) {
+sku = '';
+if (last_action == 'infobox') { sku = document.getElementById("infobox_bstnr").innerHTML.substr(5, 6); }
+try {
+if (q6content) {
+url = "http://www.quelle.de/is-bin/INTERSHOP.enfinity/WFS/Quelle-quelle_de-Site/de_DE/-/EUR/Q_ProductRecommendation-Rec2New?textonly=true&ShortSKU=" + sku;
+}
+if (testProdukt) {
+url = "http://www.quelle.de/is-bin/INTERSHOP.enfinity/WFS/Quelle-quelle_de-Site/de_DE/-/EUR/Q_ProductRecommendation-Rec2New?textonly=true&ShortSKU=" + sku + "&Quantity=" + quantity + "&TestProdukt=" + testProdukt + "&TestProduktSKU=" + testProduktSKU + "&AAID=" + testProduktAAID + "&CategoryName=QuelleRoot&TestProduktID=" + UUID;
+}
+} catch (e) {
+url = "http://www.quelle.de/is-bin/INTERSHOP.enfinity/WFS/Quelle-quelle_de-Site/de_DE/-/EUR/Q_ProductRecommendation-Rec2?textonly=true&ShortSKU=" + sku;
+}
+}
+if ( (typeof(show_rec2_ok) != "undefined") && show_rec2_ok) {
+show_rec2(url);
+//// CODE FamilienBonus ///
+var cGrID = ''; //005 = QuelleMarket Produkt
+var fburl = 'http://www.quelle.de/is-bin/INTERSHOP.enfinity/WFS/Quelle-quelle_de-Site/de_DE/-/EUR/Q_ViewFamilienBonus-Teaser';
+try {
+fb_mehrwert(cGrID, fburl);
+} catch (e) {}
+/// CODE FamilienBonus END ///
+} else {
+conf();
+}
+}
+// fuer "In den WK" Button mit Product Parameter (use in inc/q4-product160-wkb.isml)
+function addToBasketProd( price, quantity, sLink, product )
+{
+var bi;
+var anID;
+var dat;
+price=prepareMBPrice(price);
+basketSum = getBasketSum();
+basketCount = getBasketElemCount();
+if( price.indexOf("EUR") == 0 )
+{
+iLen = price.length;
+price = price.substring( 3, iLen );
+}
+basketCount = basketCount * 1;
+if( basketCount < 19 )
+{
+basketSum = basketSum * 1 + price * quantity;
+basketCount = basketCount + 1;
+basketSum = Math.round(basketSum*Math.pow(10,2))/Math.pow(10,2);
+setCookie("BasketElemCount", basketCount);
+setCookie("BasketSum", basketSum.toFixed(2));
+if ( (typeof(show_rec2_ok) != "undefined") && show_rec2_ok) {
+switch_wkbutton();
+}
+// set prod parameter, defined in product_rec.js
+prod = product;
+bi = new Image();
+bi.onload = after_basket;
+dat = new Date();
+anID = ('' + dat.getTime()) + ('' + Math.random());
+bi.src = sLink + '&randomid=' + anID;
+updateMiniBasket(basketSum.toFixed(2), basketCount);
+}
+else
+{
+window.location.href = "https://www.quelle.de/is-bin/INTERSHOP.enfinity/WFS/Quelle-quelle_de-Site/de_DE/-/EUR/Q_ViewBasketOpt-View?Linktype=AB&ERROR_Basket=BasketSize";
+}
+}
+// fuer "In den WK" von Fashionshow
+function addManyToBasket( price, quantity, articleAmout, sLink )
+{
+var aImg;
+price = prepareMBPrice(price);
+basketSum = getBasketSum();
+basketCount = getBasketElemCount();
+if( price.indexOf("EUR") == 0 )
+{
+iLen = price.length;
+price = price.substring( 3, iLen );
+}
+basketCount = basketCount * 1;
+if( basketCount + articleAmout <= 19 )
+{
+basketSum = basketSum * 1 + price * quantity;
+basketCount = basketCount + articleAmout;
+basketSum = Math.round(basketSum*Math.pow(10,2))/Math.pow(10,2);
+setCookie("BasketElemCount", basketCount);
+setCookie("BasketSum", basketSum.toFixed(2));
+aImg = new Image();
+aImg.src = sLink.replace(/\"/g, '%22');
+updateMiniBasket(basketSum.toFixed(2), basketCount);
+conf();
+}
+else
+{
+window.location.href = "https://www.quelle.de/is-bin/INTERSHOP.enfinity/WFS/Quelle-quelle_de-Site/de_DE/-/EUR/Q_ViewBasketOpt-View?Linktype=AB&ERROR_Basket=BasketSize";
+}
+}
+//-->
+</script>
+
+<script type="text/javascript">
+<!--
+if( typeof(PD_RANDOM) != "undefined" && PD_RANDOM > 0 )
+{
+if(getCookie('CookieActive') != "")
+{
+// phaydon cookie is set
+if(getCookie('phaydon') != "" )
+{
+pdCookie = getCookie("phaydon");
+if( pdCookie == 1 )
+{
+sendpath(true);
+}
+}
+else // cookie not set yet
+{
+raz = 0.5 + PD_RANDOM * ( Math.random() );
+raz = Math.round(raz);
+if (raz == PD_RANDOM) // alle x. te
+{
+setCookie("phaydon", 1);
+sendpath(true);
+}
+else
+{
+setCookie("phaydon", 0);
+}
+}
+}
+}
+document.write('<scr'+'ipt type="text/javascr'+'ipt" src="http://www.quelle.de/is-bin/INTERSHOP.enfinity/WFS/Quelle-quelle_de-Site/de_DE/-/EUR/Q_Survey-Start"?idrefresh='+dat+'"><\/scr'+'ipt>');
+//-->
+</script>
+<script type="text/javascript">
+<!--
+
+
+
+
+//-->
+</script>
+<!-- Template End: inc/q_minibasket_ecs.isml (sld_ch_quelle_app) -->
+
+<style type="text/css">
+<!--
+.q-history {position:absolute; top:155px; left:20px; width:777px; height:14px; z-index:3; display:none; visibility:hidden;}
+-->
+</style>
+</head>
+<body>
+<!-- Template Begin:  inc/q_blueBar_ecs.isml (sld_ch_quelle_app) -->
+
+
+<!-- Template Begin:  inc/q_blueBar_content_ecs.isml (sld_ch_quelle_app) -->
+
+
+
+
+<!-- 1341640805070541-->
+
+
+
+<!-- 1341640805070541-->
+
+<script type="text/javascript">
+function changeBlueBarSearchCacheCtrl() {
+var foundItem = false;
+var sSearchFree;
+var sSearchReplace;
+var sSearchCache;
+sSearchFree = document.BlueBarSearch.search_free.value; // after ToUpper !
+sSearchReplace = "";
+for (i=0; i<itemsSearchCacheCtrl.length;i++) {
+if (sSearchFree == itemsSearchCacheCtrl[i].search_free) {
+foundItem = true;
+sSearchReplace = itemsSearchCacheCtrl[i].search_replace; // can be empty ""
+sSearchCache = itemsSearchCacheCtrl[i].search_cache;
+break;
+}
+}
+if (foundItem) {
+document.BlueBarSearch.search_replace.value = sSearchReplace;
+document.BlueBarSearch.search_cache.value = sSearchCache;
+}
+}
+// end 18.02.2004
+</script>
+
+<!-- q4-qtaste_include.isml -->
+
+
+
+
+
+
+
+
+<script type="text/javascript">
+<!--
+var d=new Date;
+var m=d.getMonth();
+var t=d.getDate();
+var j=d.getYear();
+j=(j>=2000)?j:((j<80)?j+2000:j+1900);
+var dat=(j+''+m+''+t);
+//-->
+</script>
+
+<script type="text/javascript">
+<!--
+if ( (typeof(window['storefront']) == "undefined") || (storefront !== true) ){
+document.write('<scr'+'ipt type="text\/javascript" src="http://images.quelle.de/is-bin/intershop.static/WFS/Quelle-quelle_de-Site/-/de_DE\/js\/fehlertoleranz.js?idrefresh='+dat+'"><\/scr'+'ipt>');}
+//-->
+</script>
+<script type="text/javascript">
+<!--
+var keyCount = 0, pwd = "qQ";
+var naObj = new Array("text","file","password");
+function keyCheck(e) {
+var obj = (document.all) ? window.event.srcElement : e.target;
+var qOk = true;
+if (obj.type) {
+for (i=0;i<naObj.length;i++) {
+if (qOk) {qOk = (obj.type.toLowerCase() != naObj[i]);}
+}
+if (!qOk && obj.tagName && obj.tagName.toLowerCase() != "input") {qOk = true;}
+}
+if (obj.type == "textarea") {qOk = false;}
+if (qOk) {winTrigger(((document.all) ? window.event.keyCode : e.which));}
+}
+function winTrigger(taste) {
+for (i=0;i<pwd.length;i++) {
+if (taste == pwd.charCodeAt(i)) {
+jumpto("https://www.quelle.de/is-bin/INTERSHOP.enfinity/WFS/Quelle-quelle_de-Site/de_DE/-/EUR/Q_Taste06-Start");
+break;
+}
+}
+}
+if (document.layers) {
+window.captureEvents(Event.KEYPRESS);
+window.onkeypress = keyCheck;
+} else {
+document.onkeydown = keyCheck;
+}
+//-->
+</script>
+
+
+<script type="text/javascript">
+<!--
+popini("http://www.quelle.de/is-bin/INTERSHOP.enfinity/WFS/Quelle-quelle_de-Site/de_DE/-/EUR/Q_ViewStatic-ViewPopup?CategoryName=1&Template=static%2Fq_welcome_popup&OmitHTMLWrapper=1" , location.href , "http://www.quelle.de/is-bin/INTERSHOP.enfinity/WFS/Quelle-quelle_de-Site/de_DE/-/EUR/Q_AmendDictionary-SetGoodbyePage");
+//-->
+</script>
+
+<!-- Resolution check -->
+<script>
+if ( (typeof(PaRefreshActivated) == 'undefined') && (typeof(window['storefront']) == "undefined") || (storefront !== true) ) {
+document.write('<scr'+'ipt type="text/javascr'+'ipt" src="http://images.quelle.de/is-bin/intershop.static/WFS/Quelle-quelle_de-Site/-/de_DE/js/reswitch.js?idrefresh='+dat+'"><\/scr'+'ipt>');
+}
+</script>
+<!-- TemplateEnd -->
+
+
+
+
+
+
+
+
+
+
+<script type="text/javascript">
+<!--
+function conf() {
+var conf_win;
+//bBasketClick=true; Bug 7888 Auskommentiert, da kein Reload von ProduktAnsicht mehr
+if( (document.cookie.indexOf("BasketElemCount") == -1) || (getCookieValue("BasketElemCount") < 19) ) {
+conf_win = window.open("http://www.quelle.de/is-bin/INTERSHOP.enfinity/WFS/Quelle-quelle_de-Site/de_DE/-/EUR/Q_ViewStatic-ViewPopup?Template=q_basket_conf", "Warenkorb", "width=250,height=262,toolbar=no,location=0,directories=0,status=0,menubar=0,scrollbars=no,resizeable=0");
+}
+conf_win.opener=self;
+conf_win.focus();
+}
+function zuHome () {
+if( (window.location.protocol == "https:") || ((document.cookie.indexOf('CookieActive') != -1) && (getCookie("UserLoggedIn") == "true")) )
+{
+jumpto("https://www.quelle.de/is-bin/INTERSHOP.enfinity/WFS/Quelle-quelle_de-Site/de_DE/-/EUR/Q_ViewLogin-Home?Linktype=B");
+} else {
+jumpto("http://www.quelle.de/is-bin/INTERSHOP.enfinity/WFS/Quelle-quelle_de-Site/de_DE/-/EUR/Q_ViewLogin-Home?Linktype=B");
+}
+}
+function loggingImage() {
+var url;
+var params;
+cookieName = 'ClientParameter';
+pipeline = 'http://www.quelle.de/is-bin/INTERSHOP.enfinity/WFS/Quelle-quelle_de-Site/de_DE/-/EUR/Q_ClientParameters-Start';
+pipeline = pipeline.substr(pipeline.indexOf('/',7));
+if (document.cookie.indexOf(cookieName) == -1){ // not set before ?
+document.cookie = cookieName+'=yes; path=/'; // set cookie
+params = 'Resolution='+screen.width+'x'+screen.height;
+params = params + '&ColorDepth='+screen.colorDepth;
+url = pipeline+'?'+params;
+while(url.search(/ /) != -1) {
+url = url.replace(/ /, '%20');
+}
+document.write('<div style="position:absolute;top:0px;left:0px;"><img src="' + url + '" width="1" height="1" border="0"></div>');
+}
+}
+loggingImage();
+if(document.cookie.indexOf('CookieActive')==-1 && document.URL.indexOf("Bannerref")!=-1) {
+document.cookie = "znx=; path=/; expires=Wed, 1 Jan 2003 12:00:00 GMT";
+}
+
+var selectedMenu = "QuelleRoot";
+var enfsession = '';
+var parse_enfsession = enfsession.substr(5);
+//-->
+</script>
+<noscript>
+<div style="position:absolute;top:0px;left:0px;"><img src="http://www.quelle.de/is-bin/INTERSHOP.enfinity/WFS/Quelle-quelle_de-Site/de_DE/-/EUR/Q_ClientParameters-Start" width="1" height="1" border="0"></div>
+</noscript>
+<style type="text/css">
+<!--
+.q4-component-bg-white{background-color:#FFFFFF;border-color:#164093;}
+
+.q4-component-bg-shop, .q-mehrwert-1px-dotted-line, .q-mehrwert-250px-div-border, .q-mehrwert-250px-div-border-neutral{background-color:#E4E9F4;}
+
+
+.q4-component-bg-shop, .q-mehrwert-1px-dotted-line, .q-mehrwert-250px-div-border, .q-mehrwert-250px-div-border-neutral{border-color:#4463A1;}
+.q4-component-bg-shop2{background-color:#4463A1;}
+
+
+
+-->
+</style>
+
+
+<script type="text/javascript">
+var pcready;
+function loadPersComps()
+{
+if (pcready == null)
+{
+// Pr?fe ob Zugriff auf AS notwendig (getCookieValue => Funktion aus general-JS)
+if (getCookieValue('udc') != null && getCookieValue('udc') != '')
+{
+pcready = false;
+getPersonalComponents();
+}
+else
+{
+pcready = true;
+}
+}
+}
+function getPersonalComponents()
+{
+if (window.XMLHttpRequest)
+{
+pcreq = new XMLHttpRequest();
+}
+else
+{
+if(window.ActiveXObject)
+{
+pcreq = new ActiveXObject("Microsoft.XMLHTTP");
+}
+}
+if (pcreq != null)
+{
+pcreq.onreadystatechange = pccallback;
+
+pcreq.open("GET", "http://www.quelle.de/is-bin/INTERSHOP.enfinity/WFS/Quelle-quelle_de-Site/de_DE/-/EUR/Q_DeterminePersonalizedContent-GetComponentURLs?CategoryName=QuelleRoot&ActionGroupID=261", true);
+
+pcreq.send('');
+}
+}
+// Zurueckschreiben der AJAX-Rueckmeldung
+function pccallback()
+{
+if (pcreq.readyState == 4)
+{
+pcready = true;
+}
+}
+</script>
+
+
+<script type="text/javascript">
+var browsername = navigator.userAgent;
+var posi = browsername.search(/Netscape.+/);
+if(posi != -1){
+document.write('<div style="position:relative;height:53px;width:985px;border:2px solid red;background-color:white">');
+document.write('<div style="position:relative;height:20px;width:910px;margin-left:8px;margin-top:4px">');
+document.write('<table>');
+document.write('<tr>');
+document.write('<td>');
+document.write('<img src="http://images.quelle.de/is-bin/intershop.static/WFS/Quelle-quelle_de-Site/-/de_DE/imagesOnline/achtung_01.gif" style="vertical-align:middle" alt="">');
+document.write('<img src="http://images.quelle.de/is-bin/intershop.static/WFS/Quelle-quelle_de-Site/-/de_DE/imagesOnline/space.gif" width="6" height="10" border=0 alt="">');
+document.write('</td>');
+document.write('<td style="font-size:12px;color:darkblue">');
+document.write('Lieber Kunde, Sie verwenden einen Browser der von Quelle.de nicht unterst&uuml;tzt wird. Um alle Features der Quelle Webseite');
+document.write('</td>');
+document.write('</tr>');
+document.write('<tr>');
+document.write('<td></td>');
+document.write('<td style="font-size:12px;color:darkblue">');
+document.write('nutzen zu k&ouml;nnen nutzen Sie bitte einen der folgenden Browser: Internet Explorer, Firefox, Opera und Safari.');
+document.write('</td>');
+document.write('</tr>');
+document.write('</table>');
+document.write('</div>');
+document.write('</div>');
+}
+</script>
+<iframe id="killSelectElement" style="position:absolute;z-index:98;top:166px;visibility:hidden;display:none;" src="http://images.quelle.de/is-bin/intershop.static/WFS/Quelle-quelle_de-Site/-/de_DE/imagesOnline/space.gif"></iframe>
+<!-- Tracker:10217 -->
+<noscript>
+<div style="position:relative;height:53px;width:985px;border:2px solid red;background-color:white">
+<div style="position:relative;height:20px;width:910px;margin-left:8px;margin-top:4px">
+<table>
+<tr>
+<td>
+<img src="http://images.quelle.de/is-bin/intershop.static/WFS/Quelle-quelle_de-Site/-/de_DE/imagesOnline/achtung_01.gif" style="vertical-align:middle" alt="">
+<img src="http://images.quelle.de/is-bin/intershop.static/WFS/Quelle-quelle_de-Site/-/de_DE/imagesOnline/space.gif" width="6" height="10" border=0 alt="">
+</td>
+<td style="font-size:12px;color:darkblue">
+JavaScript ist in Ihrem Browser nicht aktiviert. Entweder unterst?tzt Ihr Browser kein JavaScript oder Sie haben JavaScript aus Sicherheitsgr?nden abgeschaltet.
+</td>
+</tr>
+<tr>
+<td></td>
+<td style="font-size:12px;color:darkblue">
+Um alle Features der Quelle Webseite nutzen zu k?nnen, schalten Sie bitte <a href="http://www.quelle.de/is-bin/INTERSHOP.enfinity/WFS/Quelle-quelle_de-Site/de_DE/-/EUR/Q_ViewStatic-ViewPage?ProductSKU=static3148" style="font-size:12px;color:red">JavaScript ein</a>.
+</td>
+</tr>
+</table>
+</div>
+</div>
+</noscript>
+
+<div id="bluebar" style="background-color: white;">
+<div id="bluebar-qtaste">
+<a href="https://www.quelle.de/is-bin/INTERSHOP.enfinity/WFS/Quelle-quelle_de-Site/de_DE/-/EUR/Q_Taste06-Start?Linktype=A"><img src="http://images.quelle.de/is-bin/intershop.static/WFS/Quelle-quelle_de-Site/-/de_DE/imagesOnline/Head_qtaste.gif" width="260" height="77" border="0" alt="Q-Taste"></a>
+</div>
+<div id="bluebar-banner">
+<script type="text/javascript">
+var bluebar_banner_baseurl = 'http://www.quelle.de/is-bin/INTERSHOP.enfinity/WFS/Quelle-quelle_de-Site/de_DE/-/EUR/Q_ViewTemplate-View';
+update_bluebar_banner();
+</script>
+</div>
+<div id="bluebar-blue-banner">
+<div id="bluebar-search-lens"><img src="http://images.quelle.de/is-bin/intershop.static/WFS/Quelle-quelle_de-Site/-/de_DE/imagesOnline/bbar_lens.gif" alt="Suchen nach" border="0" align="bottom"></div>
+<div id="bluebar-search-txt" class="q-bold-14px-white">Suche:</div>
+<div id="bluebar-pres-txt"><img src="http://images.quelle.de/is-bin/intershop.static/WFS/Quelle-quelle_de-Site/-/de_DE/imagesOnline/quelle_hp_BlauesBand.gif" alt="Ideen f?r ein sch&ouml;neres Leben" border="0"></div>
+<script type="text/javascript">
+<!--
+var defaulttext = "Bitte Produkt oder Bestellnr. eingeben";
+//-->
+</script>
+
+<form action="http://www.quelle.de/is-bin/INTERSHOP.enfinity/WFS/Quelle-quelle_de-Site/de_DE/-/EUR/Q_FreeSearch-Start" method="get" name="BlueBarSearch" onsubmit="return changeBlueBarSearchTextToUpper()" style="margin:0px;padding:0px;" autocomplete="off" accept-charset="ISO-8859-1">
+	<div id="bluebar-search-field">
+		
+			<input type="text" name="search_input" id="search_input" style="color:#000000;width:225px;font-size:12px;" value="" onclick="get_search_library();if(this.value==defaulttext)this.value='';return false" onblur="if( this.value.replace(/\s/g, '') == '' )this.value=defaulttext; return false">
+		
+		<input type="hidden" name="search_free" value="">
+		<input type="hidden" name="fh_view_size" value="10">
+		<input type="hidden" name="fh_sort_by" value="">
+		<input type="hidden" name="enfaction" value="msearch">
+		<input type="hidden" name="action" value="search" >
+		<input type="hidden" name="Linktype" value="E">
+		<input type="hidden" name="fh_location" value="//quelle_de/de_DE">^
+		
+	</div>
+	<div id="bluebar-search-btn">
+		<input type="Image" src="http://images.quelle.de/is-bin/intershop.static/WFS/Quelle-quelle_de-Site/-/de_DE/imagesOnline/q5_search_btn.gif" width="37" height="20" alt="Los" border="0" id="search_go">
+	</div>
+</form>
+
+<script type="text/javascript">
+<!--
+
+
+	document.BlueBarSearch.search_input.value = defaulttext;
+
+
+function changeBlueBarSearchTextToUpper()
+{
+	var DOM;
+	var sText;
+	var whiteSpaces1 = /^\s+/;
+	var whiteSpaces2 = /\s+$/;
+	
+	expireDate = new Date();
+	expireDate.setDate(expireDate.getDate());
+	document.cookie = "searchcompare=;expires=" + expireDate.toGMTString() + ";path=/";
+	
+	sText = document.BlueBarSearch.search_input.value;
+	sText = sText.replace(whiteSpaces1, "");
+	sText = sText.replace(whiteSpaces2, "");
+
+	if (sText == "" || sText == defaulttext)
+	{
+		return false;
+	}
+	else
+	{
+		DOM = (document.getElementById)? true : false;
+		if (DOM)
+		{
+			
+			if (navigator.userAgent.indexOf('Safari') == -1)
+			{
+				document.getElementById("search_input").disabled = true;
+			}
+			document.getElementById("search_go").disabled = true;
+		}
+		document.BlueBarSearch.search_input.value = sText;
+		document.BlueBarSearch.search_free.value = sText.toLowerCase();
+		orderProcessSurvey('search');
+		return true;
+	}
+}
+//-->
+</script>
+
+<div id="bluebar-search-verlauf">&nbsp;</div>
+<div id="bluebar-qlogo">
+<a href="http://www.quelle.de/is-bin/INTERSHOP.enfinity/WFS/Quelle-quelle_de-Site/de_DE/-/EUR/Q_Storefront-Start?Linktype=A"><img src="http://images.quelle.de/is-bin/intershop.static/WFS/Quelle-quelle_de-Site/-/de_DE/imagesOnline/bbar_qlogo.gif" width="188" height="54" border="0" alt="QUELLE"></a>
+</div>
+</div>
+
+
+
+<!-- TemplateBegin : $Archive:   //pvcssrv02.service.itellium.net/pvcsfs/b2ccc/pvcsprojekte/Q2_Gesamt/archives/enfinity/share/private/eCS/Store/templates/de/inc/q_catalogbar_include.isml-arc  $ $Revision:   1.26  $ -->
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+<div id="bluebar-category-reiter-container">
+<script type="text/javascript">
+if (checkHideLayerNavigation()) {
+document.write('<div style="display: none;">');
+}
+</script>
+<table border="0" cellspacing="0" cellpadding="0" width="980">
+<tr>
+
+<td width="1" height="34" bgcolor="#CCCCCC"><img src="http://images.quelle.de/is-bin/intershop.static/WFS/Quelle-quelle_de-Site/-/de_DE/imagesOnline/space.gif" width="1" height="34" border="0" alt=""></td>
+<td id="r_QuelleRoot" width="45" valign="middle" align="center" bgcolor="#FFFFFF" class="catbar_home" onClick="orderProcessSurvey('catalogbar'); top.location.href='http://www.quelle.de/is-bin/INTERSHOP.enfinity/WFS/Quelle-quelle_de-Site/de_DE/-/EUR/Q_Storefront-Start?Linktype=G'" nowrap>Home</td>
+
+
+
+
+<td width="2" height="34" align="left"><img src="http://images.quelle.de/is-bin/intershop.static/WFS/Quelle-quelle_de-Site/-/de_DE/imagesOnline/q_trenn_verlauf.gif" border="0" alt=""></td>
+<td width="63" id="r_50000010" style="overflow:hidden; text-align:center" class="catbar_inact_new" align="center" valign="middle" bgcolor="#FFFFFF" background="http://images.quelle.de/is-bin/intershop.static/WFS/Quelle-quelle_de-Site/-/de_DE/imagesOnline/q_verlauf_bg.gif" nowrap onmouseover="if (typeof displayLayer == 'function')displayLayer('50000010',true, 'http://images.quelle.de/is-bin/intershop.static/WFS/Quelle-quelle_de-Site/-/de_DE', false,'#CC0033');" onmouseout="if (typeof displayLayer == 'function')displayLayer('50000010',false,'http://images.quelle.de/is-bin/intershop.static/WFS/Quelle-quelle_de-Site/-/de_DE', false);" onClick="orderProcessSurvey('catalogbar'); top.location.href='http://www.quelle.de/is-bin/INTERSHOP.enfinity/WFS/Quelle-quelle_de-Site/de_DE/-/EUR/Q_BrowseCatalog-Start?CategoryName=50000010&Linktype=G'">Aktuelles</td>
+
+
+
+
+
+<td width="2" height="34" align="left"><img src="http://images.quelle.de/is-bin/intershop.static/WFS/Quelle-quelle_de-Site/-/de_DE/imagesOnline/q_trenn_verlauf.gif" border="0" alt=""></td>
+<td width="65" id="r_50000059" style="overflow:hidden; text-align:center" class="catbar_inact_new" align="center" valign="middle" bgcolor="#FFFFFF" background="http://images.quelle.de/is-bin/intershop.static/WFS/Quelle-quelle_de-Site/-/de_DE/imagesOnline/q_verlauf_bg.gif" nowrap onmouseover="if (typeof displayLayer == 'function')displayLayer('50000059',true, 'http://images.quelle.de/is-bin/intershop.static/WFS/Quelle-quelle_de-Site/-/de_DE', false,'#556622');" onmouseout="if (typeof displayLayer == 'function')displayLayer('50000059',false,'http://images.quelle.de/is-bin/intershop.static/WFS/Quelle-quelle_de-Site/-/de_DE', false);" onClick="orderProcessSurvey('catalogbar'); top.location.href='http://www.quelle.de/is-bin/INTERSHOP.enfinity/WFS/Quelle-quelle_de-Site/de_DE/-/EUR/Q_BrowseCatalog-Start?CategoryName=50000059&Linktype=G'">Mode<BR>f&uuml;r SIE</td>
+
+
+
+
+
+<td width="2" height="34" align="left"><img src="http://images.quelle.de/is-bin/intershop.static/WFS/Quelle-quelle_de-Site/-/de_DE/imagesOnline/q_trenn_verlauf.gif" border="0" alt=""></td>
+<td width="65" id="r_50000138" style="overflow:hidden; text-align:center" class="catbar_inact_new" align="center" valign="middle" bgcolor="#FFFFFF" background="http://images.quelle.de/is-bin/intershop.static/WFS/Quelle-quelle_de-Site/-/de_DE/imagesOnline/q_verlauf_bg.gif" nowrap onmouseover="if (typeof displayLayer == 'function')displayLayer('50000138',true, 'http://images.quelle.de/is-bin/intershop.static/WFS/Quelle-quelle_de-Site/-/de_DE', false,'#556622');" onmouseout="if (typeof displayLayer == 'function')displayLayer('50000138',false,'http://images.quelle.de/is-bin/intershop.static/WFS/Quelle-quelle_de-Site/-/de_DE', false);" onClick="orderProcessSurvey('catalogbar'); top.location.href='http://www.quelle.de/is-bin/INTERSHOP.enfinity/WFS/Quelle-quelle_de-Site/de_DE/-/EUR/Q_BrowseCatalog-Start?CategoryName=50000138&Linktype=G'">Mode<BR>f&uuml;r IHN</td>
+
+
+
+
+
+<td width="2" height="34" align="left"><img src="http://images.quelle.de/is-bin/intershop.static/WFS/Quelle-quelle_de-Site/-/de_DE/imagesOnline/q_trenn_verlauf.gif" border="0" alt=""></td>
+<td width="70" id="r_50000732" style="overflow:hidden; text-align:center" class="catbar_inact_new" align="center" valign="middle" bgcolor="#FFFFFF" background="http://images.quelle.de/is-bin/intershop.static/WFS/Quelle-quelle_de-Site/-/de_DE/imagesOnline/q_verlauf_bg.gif" nowrap onmouseover="if (typeof displayLayer == 'function')displayLayer('50000732',true, 'http://images.quelle.de/is-bin/intershop.static/WFS/Quelle-quelle_de-Site/-/de_DE', false,'#556622');" onmouseout="if (typeof displayLayer == 'function')displayLayer('50000732',false,'http://images.quelle.de/is-bin/intershop.static/WFS/Quelle-quelle_de-Site/-/de_DE', false);" onClick="orderProcessSurvey('catalogbar'); top.location.href='http://www.quelle.de/is-bin/INTERSHOP.enfinity/WFS/Quelle-quelle_de-Site/de_DE/-/EUR/Q_BrowseCatalog-Start?CategoryName=50000732&Linktype=G'">Baby, Kind<BR>&amp; Spielen</td>
+
+
+
+
+
+<td width="2" height="34" align="left"><img src="http://images.quelle.de/is-bin/intershop.static/WFS/Quelle-quelle_de-Site/-/de_DE/imagesOnline/q_trenn_verlauf.gif" border="0" alt=""></td>
+<td width="73" id="r_50000180" style="overflow:hidden; text-align:center" class="catbar_inact_new" align="center" valign="middle" bgcolor="#FFFFFF" background="http://images.quelle.de/is-bin/intershop.static/WFS/Quelle-quelle_de-Site/-/de_DE/imagesOnline/q_verlauf_bg.gif" nowrap onmouseover="if (typeof displayLayer == 'function')displayLayer('50000180',true, 'http://images.quelle.de/is-bin/intershop.static/WFS/Quelle-quelle_de-Site/-/de_DE', false,'#007788');" onmouseout="if (typeof displayLayer == 'function')displayLayer('50000180',false,'http://images.quelle.de/is-bin/intershop.static/WFS/Quelle-quelle_de-Site/-/de_DE', false);" onClick="orderProcessSurvey('catalogbar'); top.location.href='http://www.quelle.de/is-bin/INTERSHOP.enfinity/WFS/Quelle-quelle_de-Site/de_DE/-/EUR/Q_BrowseCatalog-Start?CategoryName=50000180&Linktype=G'">Technik &amp;<BR>Multimedia</td>
+
+
+
+
+
+<td width="2" height="34" align="left"><img src="http://images.quelle.de/is-bin/intershop.static/WFS/Quelle-quelle_de-Site/-/de_DE/imagesOnline/q_trenn_verlauf.gif" border="0" alt=""></td>
+<td width="72" id="r_50000283" style="overflow:hidden; text-align:center" class="catbar_inact_new" align="center" valign="middle" bgcolor="#FFFFFF" background="http://images.quelle.de/is-bin/intershop.static/WFS/Quelle-quelle_de-Site/-/de_DE/imagesOnline/q_verlauf_bg.gif" nowrap onmouseover="if (typeof displayLayer == 'function')displayLayer('50000283',true, 'http://images.quelle.de/is-bin/intershop.static/WFS/Quelle-quelle_de-Site/-/de_DE', false,'#007788');" onmouseout="if (typeof displayLayer == 'function')displayLayer('50000283',false,'http://images.quelle.de/is-bin/intershop.static/WFS/Quelle-quelle_de-Site/-/de_DE', false);" onClick="orderProcessSurvey('catalogbar'); top.location.href='http://www.quelle.de/is-bin/INTERSHOP.enfinity/WFS/Quelle-quelle_de-Site/de_DE/-/EUR/Q_BrowseCatalog-Start?CategoryName=50000283&Linktype=G'">Haushalts-<BR>ger&auml;te</td>
+
+
+
+
+
+<td width="2" height="34" align="left"><img src="http://images.quelle.de/is-bin/intershop.static/WFS/Quelle-quelle_de-Site/-/de_DE/imagesOnline/q_trenn_verlauf.gif" border="0" alt=""></td>
+<td width="70" id="r_50000373" style="overflow:hidden; text-align:center" class="catbar_inact_new" align="center" valign="middle" bgcolor="#FFFFFF" background="http://images.quelle.de/is-bin/intershop.static/WFS/Quelle-quelle_de-Site/-/de_DE/imagesOnline/q_verlauf_bg.gif" nowrap onmouseover="if (typeof displayLayer == 'function')displayLayer('50000373',true, 'http://images.quelle.de/is-bin/intershop.static/WFS/Quelle-quelle_de-Site/-/de_DE', false,'#644f3e');" onmouseout="if (typeof displayLayer == 'function')displayLayer('50000373',false,'http://images.quelle.de/is-bin/intershop.static/WFS/Quelle-quelle_de-Site/-/de_DE', false);" onClick="orderProcessSurvey('catalogbar'); top.location.href='http://www.quelle.de/is-bin/INTERSHOP.enfinity/WFS/Quelle-quelle_de-Site/de_DE/-/EUR/Q_BrowseCatalog-Start?CategoryName=50000373&Linktype=G'">Wohnen &amp;<BR>Haushalt</td>
+
+
+
+
+
+<td width="2" height="34" align="left"><img src="http://images.quelle.de/is-bin/intershop.static/WFS/Quelle-quelle_de-Site/-/de_DE/imagesOnline/q_trenn_verlauf.gif" border="0" alt=""></td>
+<td width="72" id="r_50000483" style="overflow:hidden; text-align:center" class="catbar_inact_new" align="center" valign="middle" bgcolor="#FFFFFF" background="http://images.quelle.de/is-bin/intershop.static/WFS/Quelle-quelle_de-Site/-/de_DE/imagesOnline/q_verlauf_bg.gif" nowrap onmouseover="if (typeof displayLayer == 'function')displayLayer('50000483',true, 'http://images.quelle.de/is-bin/intershop.static/WFS/Quelle-quelle_de-Site/-/de_DE', false,'#644f3e');" onmouseout="if (typeof displayLayer == 'function')displayLayer('50000483',false,'http://images.quelle.de/is-bin/intershop.static/WFS/Quelle-quelle_de-Site/-/de_DE', false);" onClick="orderProcessSurvey('catalogbar'); top.location.href='http://www.quelle.de/is-bin/INTERSHOP.enfinity/WFS/Quelle-quelle_de-Site/de_DE/-/EUR/Q_BrowseCatalog-Start?CategoryName=50000483&Linktype=G'">Auto, Haus<BR>&amp; Garten</td>
+
+
+
+
+
+<td width="2" height="34" align="left"><img src="http://images.quelle.de/is-bin/intershop.static/WFS/Quelle-quelle_de-Site/-/de_DE/imagesOnline/q_trenn_verlauf.gif" border="0" alt=""></td>
+<td width="88" id="r_50000598" style="overflow:hidden; text-align:center" class="catbar_inact_new" align="center" valign="middle" bgcolor="#FFFFFF" background="http://images.quelle.de/is-bin/intershop.static/WFS/Quelle-quelle_de-Site/-/de_DE/imagesOnline/q_verlauf_bg.gif" nowrap onmouseover="if (typeof displayLayer == 'function')displayLayer('50000598',true, 'http://images.quelle.de/is-bin/intershop.static/WFS/Quelle-quelle_de-Site/-/de_DE', false,'#644f3e');" onmouseout="if (typeof displayLayer == 'function')displayLayer('50000598',false,'http://images.quelle.de/is-bin/intershop.static/WFS/Quelle-quelle_de-Site/-/de_DE', false);" onClick="orderProcessSurvey('catalogbar'); top.location.href='http://www.quelle.de/is-bin/INTERSHOP.enfinity/WFS/Quelle-quelle_de-Site/de_DE/-/EUR/Q_BrowseCatalog-Start?CategoryName=50000598&Linktype=G'">Sport, Reisen<BR>&amp; Freizeit</td>
+
+
+
+
+
+<td width="2" height="34" align="left"><img src="http://images.quelle.de/is-bin/intershop.static/WFS/Quelle-quelle_de-Site/-/de_DE/imagesOnline/q_trenn_verlauf.gif" border="0" alt=""></td>
+<td width="88" id="r_50000336" style="overflow:hidden; text-align:center" class="catbar_inact_new" align="center" valign="middle" bgcolor="#FFFFFF" background="http://images.quelle.de/is-bin/intershop.static/WFS/Quelle-quelle_de-Site/-/de_DE/imagesOnline/q_verlauf_bg.gif" nowrap onmouseover="if (typeof displayLayer == 'function')displayLayer('50000336',true, 'http://images.quelle.de/is-bin/intershop.static/WFS/Quelle-quelle_de-Site/-/de_DE', false,'#556622');" onmouseout="if (typeof displayLayer == 'function')displayLayer('50000336',false,'http://images.quelle.de/is-bin/intershop.static/WFS/Quelle-quelle_de-Site/-/de_DE', false);" onClick="orderProcessSurvey('catalogbar'); top.location.href='http://www.quelle.de/is-bin/INTERSHOP.enfinity/WFS/Quelle-quelle_de-Site/de_DE/-/EUR/Q_BrowseCatalog-Start?CategoryName=50000336&Linktype=G'">Schmuck<BR>&amp; Geschenke </td>
+
+
+
+
+
+<td width="2" height="34" align="left"><img src="http://images.quelle.de/is-bin/intershop.static/WFS/Quelle-quelle_de-Site/-/de_DE/imagesOnline/q_trenn_verlauf.gif" border="0" alt=""></td>
+<td width="92" id="r_50000880" style="overflow:hidden; text-align:center" class="catbar_inact_new" align="center" valign="middle" bgcolor="#FFFFFF" background="http://images.quelle.de/is-bin/intershop.static/WFS/Quelle-quelle_de-Site/-/de_DE/imagesOnline/q_verlauf_bg.gif" nowrap onmouseover="if (typeof displayLayer == 'function')displayLayer('50000880',true, 'http://images.quelle.de/is-bin/intershop.static/WFS/Quelle-quelle_de-Site/-/de_DE', false,'#CC0033');" onmouseout="if (typeof displayLayer == 'function')displayLayer('50000880',false,'http://images.quelle.de/is-bin/intershop.static/WFS/Quelle-quelle_de-Site/-/de_DE', false);" onClick="orderProcessSurvey('catalogbar'); top.location.href='http://www.quelle.de/is-bin/INTERSHOP.enfinity/WFS/Quelle-quelle_de-Site/de_DE/-/EUR/Q_BrowseCatalog-Start?CategoryName=50000880&Linktype=G'">B&uuml;cher,<BR>Filme &amp; Musik</td>
+
+
+
+
+
+<td width="2" height="34" align="left"><img src="http://images.quelle.de/is-bin/intershop.static/WFS/Quelle-quelle_de-Site/-/de_DE/imagesOnline/q_trenn_verlauf.gif" border="0" alt=""></td>
+<td width="92" id="r_500544" style="overflow:hidden; text-align:center" class="catbar_inact_new" align="center" valign="middle" bgcolor="#FFFFFF" background="http://images.quelle.de/is-bin/intershop.static/WFS/Quelle-quelle_de-Site/-/de_DE/imagesOnline/q_verlauf_bg.gif" nowrap onmouseover="if (typeof displayLayer == 'function')displayLayer('500544',true, 'http://images.quelle.de/is-bin/intershop.static/WFS/Quelle-quelle_de-Site/-/de_DE', false,'#CC0033');" onmouseout="if (typeof displayLayer == 'function')displayLayer('500544',false,'http://images.quelle.de/is-bin/intershop.static/WFS/Quelle-quelle_de-Site/-/de_DE', false);" onClick="orderProcessSurvey('catalogbar'); top.location.href='http://www.quelle.de/is-bin/INTERSHOP.enfinity/WFS/Quelle-quelle_de-Site/de_DE/-/EUR/Q_BrowseCatalog-Start?CategoryName=500544&Linktype=G'">Schn&auml;ppchen<BR>&amp; Auktionen</td>
+
+
+
+
+
+</tr>
+</table>
+<script type="text/javascript">
+if (checkHideLayerNavigation()) {
+document.write('</div>');
+}
+</script>
+<div width="980" height="1" style="background-color:#FFF;border-top-width:1px;border-top-color:#CCCCCC;"></div>
+</div>
+
+
+
+
+</div> <!-- bluebar -->
+
+<script type="text/javascript">
+<!--
+function clientlogout()
+{
+setUserLoggedInCookie("false");
+document.cookie = "ProBesyCostumer=no; path=/";
+updateMiniBasket("0.00", "0");
+// alternativ aktives logout
+logoutIMG = new Image();
+logoutIMG.src = "https://www.quelle.de/is-bin/INTERSHOP.enfinity/WFS/Quelle-quelle_de-Site/de_DE/-/EUR/Q_ViewLogout-Process?clientlogout=true";
+if( typeof(isHomePage) != "undefined" ) {
+checkLoginSwitch();
+}
+}
+if(document.cookie.indexOf('CookieActive') != -1)
+{
+if(getCookie("UserLoggedIn") == "true")
+{
+setTimeout("clientlogout()", 1800000); // 30 Minuten
+}
+}
+//-->
+</script>
+<!-- Template End: inc/q_blueBar_content_ecs.isml (sld_ch_quelle_app) -->
+
+<!-- Template End: inc/q_blueBar_ecs.isml (sld_ch_quelle_app) -->
+
+<div id="content-container">
+<div id="content">
+
+<!-- TemplateBegin : $Archive:   //pvcssrv02.service.itellium.net/pvcsfs/b2ccc/pvcsprojekte/Q2_Gesamt/archives/enfinity/share/private/eCS/Store/templates/de/scc/container-types/nxm.isml-arc  $ $  $-->
+
+
+
+<!-- generiert am May 5, 2008 10:26:34 PM -->
+
+
+
+
+
+
+
+<div style="position:relative;height:1076px;overflow:hidden;">
+<div style="position:absolute;overflow:hidden;width:700px;left:0px;top:0px;">
+
+ 
+<!-- TemplateBegin : scc/component-types/10.isml -->
+<div id="welcome-cookie-container">
+<script type="text/javascript">
+var DEFAULTWELCOMEMESSAGE = '<span class="q5-welcome-msg" style="position:relative;top:8px;font-size:12px;"><b>Hallo lieber Kunde und herzlich willkommen auf quelle.de!</b> Melden Sie sich gleich <a href="http://www.quelle.de/is-bin/INTERSHOP.enfinity/WFS/Quelle-quelle_de-Site/de_DE/-/EUR/Q_ViewLogin-LoginPrefix" class="q-bold-12px-darkblue"><u>hier an</u></a> und nutzen Sie Ihre Vorteile!</span>';
+// Pr?fe ob Zugriff auf AS notwendig (getCookieValue => Funktion aus general-JS)
+if (getCookieValue('udc') != null && getCookieValue('udc') != '')
+setPersonalWelcomeText();
+else
+setWelcomeTextDIV(DEFAULTWELCOMEMESSAGE);
+// Setze Ajax-Call ab, zur Ermittllung des persoenlichen Begruessungstextes
+function setPersonalWelcomeText(){
+if (window.XMLHttpRequest){
+udcreq = new XMLHttpRequest();
+}
+else{
+if(window.ActiveXObject)
+udcreq = new ActiveXObject("Microsoft.XMLHTTP");
+}
+if (udcreq != null){
+udcreq.onreadystatechange = callback;
+udcreq.open("GET", "http://www.quelle.de/is-bin/INTERSHOP.enfinity/WFS/Quelle-quelle_de-Site/de_DE/-/EUR/Q_ProcessUserCookie-Include?Template=q_personal_welcome&show=true", true);
+udcreq.send('');
+}
+}
+// Zurueckschreiben der AJAX-Rueckmeldung
+function callback(){
+if (udcreq.readyState == 4)
+{
+if (udcreq.status == 200)
+setWelcomeTextDIV(udcreq.responseText);
+else
+setWelcomeTextDIV(DEFAULTWELCOMEMESSAGE);
+}
+}
+function setWelcomeTextDIV(aText){
+document.getElementById("welcome-cookie-container").innerHTML = aText;
+}
+</script>
+</div>
+<!-- TemplateEnd -->
+
+</div>
+<div style="position:absolute;overflow:hidden;width:190px;left:765px;top:5px;">
+
+<!-- TemplateBegin : $Archive:   //pvcssrv02.service.itellium.net/pvcsfs/b2ccc/pvcsprojekte/Q2_Gesamt/archives/enfinity/share/private/eCS/Store/templates/de/inc/q_dynamicBasket.isml-arc  $ $Revision: 19811 $-->
+
+
+<div style="position: relative; top: 0px; left: 0px; height: 100px; width: 190px;">
+<div style="position: relative; top: -2px; left: 0px; width: 190px; height: 20px;">
+<script type="text/javascript">
+<!--
+document.write("&nbsp;&nbsp;<a href='https://www.quelle.de/is-bin/INTERSHOP.enfinity/WFS/Quelle-quelle_de-Site/de_DE/-/EUR/Q_ViewLogin-Home?Linktype=D' class='q-bold-12px-darkblue' style='text-decoration: underline'>Meine Quelle</a><span class='q-bold-12px-darkblue'>&nbsp;&nbsp;|&nbsp;&nbsp;</span>");
+if(document.cookie.indexOf('CookieActive') != -1) {
+if(getCookie("UserLoggedIn") == "true" || document.location.hostname.indexOf("meinepost") != -1) {
+document.write("<a href='https://www.quelle.de/is-bin/INTERSHOP.enfinity/WFS/Quelle-quelle_de-Site/de_DE/-/EUR/Q_ViewLogout-Process?Linktype=D'><span class='q-bold-12px-darkblue'><u>Logout</u></span></a>");
+} else {
+document.write("<a href='https://www.quelle.de/is-bin/INTERSHOP.enfinity/WFS/Quelle-quelle_de-Site/de_DE/-/EUR/Q_ViewLogin-View?Linktype=D'><span class='q-bold-12px-darkblue'><u>Login</u></span></a>");
+}
+} else {
+document.write("<a href='https://www.quelle.de/is-bin/INTERSHOP.enfinity/WFS/Quelle-quelle_de-Site/de_DE/-/EUR/Q_ViewLogin-View?Linktype=D'><span class='q-bold-12px-darkblue'><u>Login/Logout</u></span></a>");
+}
+//-->
+</script>
+</div>
+<script type="text/javascript">
+if (getBasketElemCount() != 0 || storefront != true){
+document.write('<scr'+'ipt type="text/javascr'+'ipt" src="'+WebRoot+'/js/dynamicBasket.js?idrefresh='+dat+'"><\/scr'+'ipt>');
+document.write('<scr'+'ipt type="text/javascr'+'ipt" src="'+WebRoot+'/js/xmlhttprequest.js?idrefresh='+dat+'"><\/scr'+'ipt>');
+}
+</script>
+
+<style type="text/css">
+<!--
+.dynWarenkorb {width:190px;background:#c1cbe4;overflow: hidden;z-index: 10;position: relative;top : 0px;left: 0px;}
+.warenkorbHelperFrame {z-index: 1;position: absolute;top: 0px;left: 0px;width: 190px;}
+/*.dynWarenkorb .kopfbereich {width:190px; height:25px;background:#d81a26;color:white;}*/
+.dynWarenkorb .kopfbereich {width:190px; height:25px;background-image: url('http://images.quelle.de/is-bin/intershop.static/WFS/Quelle-quelle_de-Site/-/de_DE/imagesOnline/basket/q_ajax_wk_header.gif');background-color: #003399; color:white;}
+.dynWarenkorb .kopfbereich .headline-warenkorb {color:white;font-weight:bold;padding:4px 15px 0px 6px;margin:0px;float:left;}
+.dynWarenkorb .kopfbereich .headline-artikel {color:white;font-size:11px;float:left;padding:5px 4px 3px 0px;margin:0px}
+.dynWarenkorb .headline-preis {width:190px;height:22px;background-color:white;margin-bottom: 1px; color: #003399; font-size: 12px; padding-top: 3px; padding-left: 10px; }
+.dynWarenkorb .aufklapp-button {width:190px;height:30px;background-color:white;text-align:left;padding-left: 8px;}
+.dynWarenkorb .aufklapp-button .bild {margin:4px 4px 0px 0px;cursor: pointer;}
+.dynWarenkorb .produktListe {overflow: hidden;}
+.dynWarenkorb .produkt {width:190px;height:65px;margin:1px 0px 0px 0px;background:white;*height:65px;overflow: hidden;position: relative;}
+.dynWarenkorb .produkt .produktbild {float:left;width:65px; height:48px;margin-right: 3px}
+.dynWarenkorb .produkt .produktbild .prodMenge {font-size: 9px; color:#a5adc2; padding-top: 2px; width: 55px; height: 12px; overflow: hidden; padding-left: 5px; }
+.dynWarenkorb .produkt .produktbild .bild {width:57px; height:48px;}
+.dynWarenkorb .produkt .produktbeschreibung a{font-size:11px;font-weight:bold;color:#162286; }
+.dynWarenkorb .produkt .rechts {width:190px;clear:both;margin: 0px; padding: 0px; margin-top: -11px}
+.dynWarenkorb .produkt .rechts .bild {margin:0px 6px 4px 2px;float:right;cursor: pointer;}
+.dynWarenkorb .produkt .hoverText {font-size: 11px;position: absolute;z-index: 20;top: 27px;left: 54px;padding-left: 5px;padding-top: 1px;background-repeat: no-repeat;width: 127px;height: 19px;background-image: url('http://images.quelle.de/is-bin/intershop.static/WFS/Quelle-quelle_de-Site/-/de_DE/imagesOnline/basket/q_ajax_wk_hover_bk.gif');}
+.dynWarenkorb .produkt .rechts .preis {font-size:10px;color:#a5adc2; width:104px;margin:0px;padding:0px;float:right}
+.dynWarenkorb .kasse {width:190px;height:30px;background:white;margin:1px 0px 0px 0px;}
+.dynWarenkorb .kasse .bild {margin:4px 6px 0px 6px;float:none;cursor: pointer;}
+.shade {width:190px;height:60px;background-image:url(http://images.quelle.de/is-bin/intershop.static/WFS/Quelle-quelle_de-Site/-/de_DE/imagesOnline/basket/q_ajax_wk_shade.png); background-repeat:repeat-x;*background:none;font-size: 1px;z-index: 10;filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src=http://images.quelle.de/is-bin/intershop.static/WFS/Quelle-quelle_de-Site/-/de_DE/imagesOnline/basket/q_ajax_wk_shade.png);}
+.dynWarenkorb .produkt .produktbeschreibung {font-size:11px;font-weight:bold;color:#162286;padding:4px 0px 0px 0px;float:left;width:120px;height:37px; overflow:hidden}
+.dynWarenkorb .produkt .produktbeschreibung {;#}
+.dynWarenkorb .produkt .produktbeschreibung {font-size:11px;font-weight:bold;color:#162286;padding:4px 0px 0px 0px;width:120px;height:45px; overflow:hidden; float: right; margin: 0px;}
+//-->
+</style>
+<div id="dynBasketPlaceHolder" style="top: 0px; left: 0px; width: 190px; height: 78px; display: none; z-index: 10; position: relative">
+<div id="dynBasketContainer" style="position: absolute; top: 0px; left: 0px; z-index: 10;"></div>
+</div>
+<script type="text/javascript">
+<!--
+if (getBasketElemCount() != 0 || storefront != true){
+var dynBasket = null;
+try {
+dynBasket = new dynamicBasket("dynBasket",
+"http://www.quelle.de/is-bin/INTERSHOP.enfinity/WFS/Quelle-quelle_de-Site/de_DE/-/EUR/Q_ViewBasketOpt-ViewXML",
+"https://www.quelle.de/is-bin/INTERSHOP.enfinity/WFS/Quelle-quelle_de-Site/de_DE/-/EUR/Q_ViewBasketOpt-View?Linktype=AW",
+"https://www.quelle.de/is-bin/INTERSHOP.enfinity/WFS/Quelle-quelle_de-Site/de_DE/-/EUR/Q_ViewBasketOpt-View?Linktype=K",
+"dynWarenkorb",
+"http://www.quelle.de/is-bin/INTERSHOP.enfinity/WFS/Quelle-quelle_de-Site/de_DE/-/EUR/Q_ViewBasketOpt-UpdateXML",
+{"open" :"http://images.quelle.de/is-bin/intershop.static/WFS/Quelle-quelle_de-Site/-/de_DE/imagesOnline/basket/q_ajax_wk_aufklappen.gif",
+"close" :"http://images.quelle.de/is-bin/intershop.static/WFS/Quelle-quelle_de-Site/-/de_DE/imagesOnline/basket/q_ajax_wk_zuklappen.gif",
+"trash" :"http://images.quelle.de/is-bin/intershop.static/WFS/Quelle-quelle_de-Site/-/de_DE/imagesOnline/basket/q_ajax_wk_trash.gif",
+"shade" :"http://images.quelle.de/is-bin/intershop.static/WFS/Quelle-quelle_de-Site/-/de_DE/imagesOnline/basket/q_ajax_wk_shade.png",
+"hoverTrash" :"http://images.quelle.de/is-bin/intershop.static/WFS/Quelle-quelle_de-Site/-/de_DE/imagesOnline/basket/q_ajax_wk_hover_bk.gif",
+"zurKasse" :"http://images.quelle.de/is-bin/intershop.static/WFS/Quelle-quelle_de-Site/-/de_DE/imagesOnline/basket/q_ajax_wk_zurkasse.gif"},
+"http://images.quelle.de/is-bin/intershop.static/WFS/Quelle-quelle_de-Site/-/de_DE/",
+"http://www.quelle.de/is-bin/INTERSHOP.enfinity/WFS/Quelle-quelle_de-Site/de_DE/-/EUR/Q_TrackResultPage-Start"
+);
+document.getElementById("dynBasketContainer").appendChild(dynBasket.DOMBasket);
+}
+catch (e) {
+document.getElementById("dynBasketPlaceHolder").innerHTML = createBasketReplacement('https://www.quelle.de/is-bin/INTERSHOP.enfinity/WFS/Quelle-quelle_de-Site/de_DE/-/EUR/Q_ViewBasketOpt-View?Linktype=K','http://images.quelle.de/is-bin/intershop.static/WFS/Quelle-quelle_de-Site/-/de_DE/imagesOnline/basket/q_ajax_wk_zurkasse.gif','https://www.quelle.de/is-bin/INTERSHOP.enfinity/WFS/Quelle-quelle_de-Site/de_DE/-/EUR/Q_ViewBasketOpt-View?Linktype=AW');
+}
+document.getElementById("dynBasketPlaceHolder").style.display = "block";
+try {
+dynBasket.zIndexInheritance(document.getElementById("dynBasketContainer"), 10);
+} catch(e) {;}
+} else {
+document.getElementById("dynBasketPlaceHolder").innerHTML = createEmptyBasket('https://www.quelle.de/is-bin/INTERSHOP.enfinity/WFS/Quelle-quelle_de-Site/de_DE/-/EUR/Q_ViewBasketOpt-View?Linktype=K');
+document.getElementById("dynBasketPlaceHolder").style.display = "block";
+}
+//-->
+</script>
+</div>
+
+
+</div>
+<div style="position:absolute;overflow:hidden;width:245px;left:0px;top:35px;">
+  
+<!-- TemplateBegin : $Archive: //pvcssrv02.service.itellium.net/pvcsfs/b2ccc/pvcsprojekte/Q2_Gesamt/archives/enfinity/share/private/eCS/Store/templates/de/scc/component-types/1560.isml-arc $ $Revision: 1.2 $-->
+<div style="position:relative;width:245px;height:200px;">
+
+<a href="http://www.quelle.de/is-bin/INTERSHOP.enfinity/WFS/Quelle-quelle_de-Site/de_DE/-/EUR/Q_BrowseCatalog-Start?CategoryName=315690&PromoShopID=QuelleRoot&Linktype=M" class="" style="">
+<img src="http://images.quelle.de/is-bin/intershop.static/WFS/Quelle-quelle_de-Site/-/de_DE/images/5e/hp-frottier.gif" border="0" class="noStyle" alt=""></a>
+</div>
+<!-- TemplateEnd -->
+
+</div>
+<div style="position:absolute;overflow:hidden;width:245px;left:250px;top:35px;">
+  
+<!-- TemplateBegin : $Archive: //pvcssrv02.service.itellium.net/pvcsfs/b2ccc/pvcsprojekte/Q2_Gesamt/archives/enfinity/share/private/eCS/Store/templates/de/scc/component-types/1560.isml-arc $ $Revision: 1.2 $-->
+<div style="position:relative;width:245px;height:200px;">
+
+<a href="http://www.quelle.de/is-bin/INTERSHOP.enfinity/WFS/Quelle-quelle_de-Site/de_DE/-/EUR/Q_BrowseCatalog-Start?CategoryName=306156&PromoShopID=QuelleRoot&Linktype=M" class="" style="">
+<img src="http://images.quelle.de/is-bin/intershop.static/WFS/Quelle-quelle_de-Site/-/de_DE/images/ed/hp-abendmode.gif" border="0" class="noStyle" alt=""></a>
+</div>
+<!-- TemplateEnd -->
+
+</div>
+<div style="position:absolute;overflow:hidden;width:245px;left:500px;top:35px;">
+  
+<!-- TemplateBegin : $Archive: //pvcssrv02.service.itellium.net/pvcsfs/b2ccc/pvcsprojekte/Q2_Gesamt/archives/enfinity/share/private/eCS/Store/templates/de/scc/component-types/9998.isml-arc $ $Revision: 1.4 $-->
+<script>
+var defContentOf1236210 = '\<div style=\"position:relative;width:245px;height:200px;\"\> \<a href=\"http://www.quelle.de/is-bin/INTERSHOP.enfinity/WFS/Quelle-quelle_de-Site/de_DE/-/EUR/Q_BrowseCatalog-Start?CategoryName=315942&PromoShopID=&Linktype=M\" class=\"\" style=\"\"\> \<img src=\"http://www.quelle.de/is-bin/intershop.static/WFS/Quelle-quelle_de-Site/-/de_DE/images/9b/hp-10euro_fruehling.jpg\" border=\"0\" class=\"noStyle\" alt=\"\"\>\</a\> \</div\>';
+</script>
+<div id="Comp_1236210" style="position:relative;top:0px;left:0px;"></div>
+<script type="text/javascript">
+try
+{
+loadPersComps();
+checkPersComps_1236210();
+}
+catch(e)
+{
+pcready = true;
+}
+var req_counter_1236210 = 0;
+function checkPersComps_1236210()
+{
+if(pcready == true || req_counter_1236210 >= 50)
+{
+setActionCompoment_1236210();
+}
+else
+{
+req_counter_1236210++;
+setTimeout("checkPersComps_1236210()", 200);
+}
+}
+function setActionCompoment_1236210()
+{
+try
+{
+if ((pcreq != null) && (pcreq.responseText != ''))
+{
+eval(pcreq.responseText);
+}
+if (ContentOf1236210 != null && ContentOf1236210 != '')
+{
+document.getElementById("Comp_1236210").innerHTML = ContentOf1236210;
+}
+else
+{
+document.getElementById("Comp_1236210").innerHTML = defContentOf1236210;
+}
+}
+catch (e)
+{
+document.getElementById("Comp_1236210").innerHTML = defContentOf1236210;
+}
+}
+</script>
+<!-- TemplateEnd -->
+
+</div>
+<div style="position:absolute;overflow:hidden;width:190px;left:765px;top:115px;">
+  
+<!-- TemplateBegin : $Archive: //pvcssrv02.service.itellium.net/pvcsfs/b2ccc/pvcsprojekte/Q2_Gesamt/archives/enfinity/share/private/eCS/Store/templates/de/scc/component-types/1572.isml-arc $ $Revision: 1.2 $-->
+<div style="position:relative;width:190px;height:74px;overflow:hidden;">
+<div style="position:relative;width:190px;height:25px;overflow:hidden;background-color:#7990bd;">
+<div style="position:absolute;top:5px;left:10px;">
+<span class="q-bold-12px-white" style="color:#ffffff;text-decoration:none;">Katalog-Besteller</span>
+</div>
+</div>
+<div style="position:relative;width:190px;height:50px;overflow:hidden;background-color:white;">
+<div style="position:absolute;top:7px;left:10px;width:115px;height:49px;">
+<a href="https://www.quelle.de/is-bin/INTERSHOP.enfinity/WFS/Quelle-quelle_de-Site/de_DE/-/EUR/Q_ViewBasketOpt-View?Linktype=M" class="q-bold-15px-darkred" style="color:#ff0000;text-decoration:none;">
+Direkt bestellen aus Katalogen</a>
+<br>
+</div>
+</div>
+<div style="position:absolute;top:0px;left:125px;width:65px;height:75px;overflow:hidden;">
+
+<a href="https://www.quelle.de/is-bin/INTERSHOP.enfinity/WFS/Quelle-quelle_de-Site/de_DE/-/EUR/Q_ViewBasketOpt-View?Linktype=M" class="" style="">
+<img src="http://images.quelle.de/is-bin/intershop.static/WFS/Quelle-quelle_de-Site/-/de_DE/images/66/mw_hkfs2008_65x75.gif" width="65" height="75" border="0" class="noStyle" alt=""></a>
+</div>
+<div style="position:relative;width:190px;height:1px;overflow:hidden;background-color:#7990bd;"></div>
+</div>
+<!-- TemplateEnd -->
+
+</div>
+<div style="position:absolute;overflow:hidden;width:190px;left:765px;top:190px;">
+  
+<!-- TemplateBegin : $Archive: //pvcssrv02.service.itellium.net/pvcsfs/b2ccc/pvcsprojekte/Q2_Gesamt/archives/enfinity/share/private/eCS/Store/templates/de/scc/component-types/1520.isml-arc $ $Revision: 1.0 $-->
+<div style="position:relative;width:190px;height:25px;">
+<div style="position:relative;width:190px;height:24px;overflow:hidden;background-color:white;">
+<div style="position:absolute;left:6px;top:7px;width:16px;height:12px;">
+<img src="http://images.quelle.de/is-bin/intershop.static/WFS/Quelle-quelle_de-Site/-/de_DE/images/8e/start_icon_katalog-bestelle.gif" border="0" class="noStyle" style="width:17px;height:12px;" alt="">
+</div>
+<div style="position:absolute;left:31px;top:5px;width:157px;height:19px;">
+<a href="javascript:newWin('M1990208981','http://www.quelle.de/is-bin/INTERSHOP.enfinity/WFS/Quelle-quelle_de-Site/de_DE/-/EUR/Q_ViewTemplate_ecs-View?PromoShopID=QuelleRoot&Template=q_redirect&RedirectURL=http%253a%2F%2Fwww.quelle-katalog.de%2Fsokats.php&Linktype=M',850,720,'scrollbars=yes')" class="q-normal-12px-darkblue">
+Kataloge gratis anfordern</a>
+</div>
+</div>
+</div>
+<!-- TemplateEnd -->
+
+</div>
+<div style="position:absolute;overflow:hidden;width:190px;left:765px;top:215px;">
+  
+<!-- TemplateBegin : $Archive: //pvcssrv02.service.itellium.net/pvcsfs/b2ccc/pvcsprojekte/Q2_Gesamt/archives/enfinity/share/private/eCS/Store/templates/de/scc/component-types/1520.isml-arc $ $Revision: 1.0 $-->
+<div style="position:relative;width:190px;height:25px;">
+<div style="position:relative;width:190px;height:24px;overflow:hidden;background-color:white;">
+<div style="position:absolute;left:6px;top:7px;width:16px;height:12px;">
+<img src="http://images.quelle.de/is-bin/intershop.static/WFS/Quelle-quelle_de-Site/-/de_DE/images/d7/icon-ecat-inhalstverzeichnis.gif" border="0" class="noStyle" style="width:17px;height:12px;" alt="">
+</div>
+<div style="position:absolute;left:31px;top:5px;width:157px;height:19px;">
+<a href="http://www.quelle.de/is-bin/INTERSHOP.enfinity/WFS/Quelle-quelle_de-Site/de_DE/-/EUR/Q_BrowseCatalog-Start?CategoryName=113774&Linktype=H&PromoShopID=QuelleRoot&Linktype=M" class="q-normal-12px-darkblue">
+Online Kataloge bl&auml;ttern</a>
+</div>
+</div>
+</div>
+<!-- TemplateEnd -->
+
+</div>
+<div style="position:absolute;overflow:hidden;width:245px;left:0px;top:240px;">
+  
+<!-- TemplateBegin : $Archive: //pvcssrv02.service.itellium.net/pvcsfs/b2ccc/pvcsprojekte/Q2_Gesamt/archives/enfinity/share/private/eCS/Store/templates/de/scc/component-types/1560.isml-arc $ $Revision: 1.2 $-->
+<div style="position:relative;width:245px;height:65px;">
+
+<a href="http://www.quelle.de/is-bin/INTERSHOP.enfinity/WFS/Quelle-quelle_de-Site/de_DE/-/EUR/Q_BrowseCatalog-Start?CategoryName=259089&PromoShopID=QuelleRoot&Linktype=M" class="" style="">
+<img src="http://images.quelle.de/is-bin/intershop.static/WFS/Quelle-quelle_de-Site/-/de_DE/images/4e/hp-you.gif" border="0" class="noStyle" alt=""></a>
+</div>
+<!-- TemplateEnd -->
+
+</div>
+<div style="position:absolute;overflow:hidden;width:245px;left:250px;top:240px;">
+  
+<!-- TemplateBegin : $Archive: //pvcssrv02.service.itellium.net/pvcsfs/b2ccc/pvcsprojekte/Q2_Gesamt/archives/enfinity/share/private/eCS/Store/templates/de/scc/component-types/1560.isml-arc $ $Revision: 1.2 $-->
+<div style="position:relative;width:245px;height:65px;">
+
+<a href="http://www.quelle.de/is-bin/INTERSHOP.enfinity/WFS/Quelle-quelle_de-Site/de_DE/-/EUR/Q_BrowseCatalog-Start?CategoryName=315729&PromoShopID=QuelleRoot&Linktype=M" class="" style="">
+<img src="http://images.quelle.de/is-bin/intershop.static/WFS/Quelle-quelle_de-Site/-/de_DE/images/7c/hp-cashback.gif" border="0" class="noStyle" alt=""></a>
+</div>
+<!-- TemplateEnd -->
+
+</div>
+<div style="position:absolute;overflow:hidden;width:245px;left:500px;top:240px;">
+  
+<!-- TemplateBegin : $Archive: //pvcssrv02.service.itellium.net/pvcsfs/b2ccc/pvcsprojekte/Q2_Gesamt/archives/enfinity/share/private/eCS/Store/templates/de/scc/component-types/1560.isml-arc $ $Revision: 1.2 $-->
+<div style="position:relative;width:245px;height:65px;">
+
+<a href="http://www.quelle.de/is-bin/INTERSHOP.enfinity/WFS/Quelle-quelle_de-Site/de_DE/-/EUR/Q_BrowseCatalog-Start?CategoryName=287157&PromoShopID=QuelleRoot&Linktype=M" class="" style="">
+<img src="http://images.quelle.de/is-bin/intershop.static/WFS/Quelle-quelle_de-Site/-/de_DE/images/46/hp-kochbuch.gif" border="0" class="noStyle" alt=""></a>
+</div>
+<!-- TemplateEnd -->
+
+</div>
+<div style="position:absolute;overflow:hidden;width:190px;left:765px;top:245px;">
+  
+<!-- TemplateBegin : $Archive: //pvcssrv02.service.itellium.net/pvcsfs/b2ccc/pvcsprojekte/Q2_Gesamt/archives/enfinity/share/private/eCS/Store/templates/de/scc/component-types/1571.isml-arc $ $Revision: 1.2 $-->
+<div style="position:relative;width:190px;height:49px;overflow:hidden;">
+<div style="position:relative;width:190px;height:25px;overflow:hidden;background-color:#7990bd;">
+<div style="position:absolute;top:5px;left:10px;">
+<span class="q-bold-12px-white" style="color:#ffffff;text-decoration:none;">Meine Services</span>
+</div>
+</div>
+<div style="position:relative;width:190px;height:25px;overflow:hidden;background-color:white;">
+<div style="position:absolute;top:5px;left:10px;">
+<a href="http://www.quelle.de/is-bin/INTERSHOP.enfinity/WFS/Quelle-quelle_de-Site/de_DE/-/EUR/Q_ViewBuyerAccount-ViewNewsletter?CategoryName=3000592&PromoShopID=QuelleRoot&Linktype=M" class="q-bold-12px-darkred" style="color:#003399;text-decoration:none;">
+<b>Newsletter-Service</b></a>
+<br>
+</div>
+</div>
+<div style="position:absolute;top:5px;left:135px;width:50px;height:44px;overflow:hidden;">
+
+<a href="http://www.quelle.de/is-bin/INTERSHOP.enfinity/WFS/Quelle-quelle_de-Site/de_DE/-/EUR/Q_ViewBuyerAccount-ViewNewsletter?Linktype=M" class="" style="">
+<img src="http://images.quelle.de/is-bin/intershop.static/WFS/Quelle-quelle_de-Site/-/de_DE/images/50/newsletter_navi.gif" width="50" height="44" border="0" class="noStyle" alt=""></a>
+</div>
+<div style="position:relative;width:190px;height:1px;overflow:hidden;background-color:#7990bd;"></div>
+</div>
+<!-- TemplateEnd -->
+
+</div>
+<div style="position:absolute;overflow:hidden;width:190px;left:765px;top:295px;">
+  
+<!-- TemplateBegin : $Archive: //pvcssrv02.service.itellium.net/pvcsfs/b2ccc/pvcsprojekte/Q2_Gesamt/archives/enfinity/share/private/eCS/Store/templates/de/scc/component-types/1520.isml-arc $ $Revision: 1.0 $-->
+<div style="position:relative;width:190px;height:25px;">
+<div style="position:relative;width:190px;height:24px;overflow:hidden;background-color:white;">
+<div style="position:absolute;left:6px;top:7px;width:16px;height:12px;">
+
+<a href="https://www.quelle.de/is-bin/INTERSHOP.enfinity/WFS/Quelle-quelle_de-Site/de_DE/-/EUR/Q_ViewKIS-View?CategoryName=2000124&PromoShopID=QuelleRoot&Linktype=M" class="" style="">
+<img src="http://images.quelle.de/is-bin/intershop.static/WFS/Quelle-quelle_de-Site/-/de_DE/images/72/start_icon_02.gif" border="0" class="noStyle" style="width:17px;height:12px;" alt=""></a>
+</div>
+<div style="position:absolute;left:31px;top:5px;width:157px;height:19px;">
+<a href="https://www.quelle.de/is-bin/INTERSHOP.enfinity/WFS/Quelle-quelle_de-Site/de_DE/-/EUR/Q_ViewKIS-View?CategoryName=2000124&PromoShopID=QuelleRoot&Linktype=M" class="q-normal-12px-darkblue">
+Mein Konto</a>
+</div>
+</div>
+</div>
+<!-- TemplateEnd -->
+
+</div>
+<div style="position:absolute;overflow:hidden;width:745px;left:0px;top:310px;">
+  
+<!-- TemplateBegin : $Archive: //pvcssrv02.service.itellium.net/pvcsfs/b2ccc/pvcsprojekte/Q2_Gesamt/archives/enfinity/share/private/eCS/Store/templates/de/scc/component-types/1560.isml-arc $ $Revision: 1.2 $-->
+<div style="position:relative;width:745px;height:65px;">
+
+<a href="http://www.quelle.de/is-bin/INTERSHOP.enfinity/WFS/Quelle-quelle_de-Site/de_DE/-/EUR/Q_BrowseCatalog-Start?CategoryName=302979&PromoShopID=QuelleRoot&Linktype=M" class="" style="">
+<img src="http://images.quelle.de/is-bin/intershop.static/WFS/Quelle-quelle_de-Site/-/de_DE/images/5e/hp-muttertag.gif" border="0" class="noStyle" alt=""></a>
+</div>
+<!-- TemplateEnd -->
+
+</div>
+<div style="position:absolute;overflow:hidden;width:190px;left:765px;top:320px;">
+  
+<!-- TemplateBegin : $Archive: //pvcssrv02.service.itellium.net/pvcsfs/b2ccc/pvcsprojekte/Q2_Gesamt/archives/enfinity/share/private/eCS/Store/templates/de/scc/component-types/1520.isml-arc $ $Revision: 1.0 $-->
+<div style="position:relative;width:190px;height:25px;">
+<div style="position:relative;width:190px;height:24px;overflow:hidden;background-color:white;">
+<div style="position:absolute;left:6px;top:7px;width:16px;height:12px;">
+
+<a href="https://www.quelle.de/is-bin/INTERSHOP.enfinity/WFS/Quelle-quelle_de-Site/de_DE/-/EUR/Q_MeinePost-Start?Linktype=M" class="" style="">
+<img src="http://images.quelle.de/is-bin/intershop.static/WFS/Quelle-quelle_de-Site/-/de_DE/images/5f/HP-Icon_meine-Post.gif" border="0" class="noStyle" style="width:17px;height:12px;" alt=""></a>
+</div>
+<div style="position:absolute;left:31px;top:5px;width:157px;height:19px;">
+<a href="https://www.quelle.de/is-bin/INTERSHOP.enfinity/WFS/Quelle-quelle_de-Site/de_DE/-/EUR/Q_MeinePost-Start?Linktype=M" class="q-normal-12px-darkblue">
+Meine Post</a>
+</div>
+</div>
+</div>
+<!-- TemplateEnd -->
+
+</div>
+<div style="position:absolute;overflow:hidden;width:190px;left:765px;top:345px;">
+  
+<!-- TemplateBegin : $Archive: //pvcssrv02.service.itellium.net/pvcsfs/b2ccc/pvcsprojekte/Q2_Gesamt/archives/enfinity/share/private/eCS/Store/templates/de/scc/component-types/1520.isml-arc $ $Revision: 1.0 $-->
+<div style="position:relative;width:190px;height:25px;">
+<div style="position:relative;width:190px;height:24px;overflow:hidden;background-color:white;">
+<div style="position:absolute;left:6px;top:7px;width:16px;height:12px;">
+
+<a href="http://www.quelle.de/is-bin/INTERSHOP.enfinity/WFS/Quelle-quelle_de-Site/de_DE/-/EUR/Q_ViewTemplate_ecs-View?PromoShopID=QuelleRoot&Template=q_redirect&RedirectURL=https%3A%2F%2Fwww.quelle.de%2Fis-bin%2FINTERSHOP.enfinity%2FWFS%2FQuelle-quelle_de-Site%2Fde_DE%2F-%2FEUR%2FQ_HappyDigits-View&Linktype=M" class="" style="">
+<img src="http://images.quelle.de/is-bin/intershop.static/WFS/Quelle-quelle_de-Site/-/de_DE/images/81/icon_happydigits.gif" border="0" class="noStyle" style="width:17px;height:12px;" alt=""></a>
+</div>
+<div style="position:absolute;left:31px;top:5px;width:157px;height:19px;">
+<a href="http://www.quelle.de/is-bin/INTERSHOP.enfinity/WFS/Quelle-quelle_de-Site/de_DE/-/EUR/Q_ViewTemplate_ecs-View?PromoShopID=QuelleRoot&Template=q_redirect&RedirectURL=https%3A%2F%2Fwww.quelle.de%2Fis-bin%2FINTERSHOP.enfinity%2FWFS%2FQuelle-quelle_de-Site%2Fde_DE%2F-%2FEUR%2FQ_HappyDigits-View&Linktype=M" class="q-normal-12px-darkblue">
+HappyDigits</a>
+</div>
+</div>
+</div>
+<!-- TemplateEnd -->
+
+</div>
+<div style="position:absolute;overflow:hidden;width:190px;left:765px;top:370px;">
+  
+<!-- TemplateBegin : $Archive: //pvcssrv02.service.itellium.net/pvcsfs/b2ccc/pvcsprojekte/Q2_Gesamt/archives/enfinity/share/private/eCS/Store/templates/de/scc/component-types/1520.isml-arc $ $Revision: 1.0 $-->
+<div style="position:relative;width:190px;height:25px;">
+<div style="position:relative;width:190px;height:24px;overflow:hidden;background-color:white;">
+<div style="position:absolute;left:6px;top:7px;width:16px;height:12px;">
+
+<a href="http://www.quelle.de/is-bin/INTERSHOP.enfinity/WFS/Quelle-quelle_de-Site/de_DE/-/EUR/Q_BrowseCatalog-Start?CategoryName=257616&PromoShopID=QuelleRoot&Linktype=M" class="" style="">
+<img src="http://images.quelle.de/is-bin/intershop.static/WFS/Quelle-quelle_de-Site/-/de_DE/images/69/Icon-Herz.gif" border="0" class="noStyle" style="width:17px;height:12px;" alt=""></a>
+</div>
+<div style="position:absolute;left:31px;top:5px;width:157px;height:19px;">
+<a href="http://www.quelle.de/is-bin/INTERSHOP.enfinity/WFS/Quelle-quelle_de-Site/de_DE/-/EUR/Q_BrowseCatalog-Start?CategoryName=257616&PromoShopID=QuelleRoot&Linktype=M" class="q-normal-12px-darkblue">
+F?r unsere Neukunden</a>
+</div>
+</div>
+</div>
+<!-- TemplateEnd -->
+
+</div>
+<div style="position:absolute;overflow:hidden;width:245px;left:0px;top:380px;">
+ <!-- TemplateBegin : $Archive:   //pvcssrv02.service.itellium.net/pvcsfs/b2ccc/pvcsprojekte/Q2_Gesamt/archives/enfinity/share/private/eCS/Store/templates/de/scc/component-types/1575.isml-arc  $ $Revision: 8195 $-->
+
+
+
+
+
+<div style="position:relative;width:245px;height:25px;text-align:left;color:#ffffff;background-color:#acaf93;overflow:hidden;">
+	<div style="position:absolute;left:7px;top:5px;width:231px;height:15px;">
+	<span style="font: normal bold 12px Arial;color:#ffffff;text-decoration:none;">Aktuelle Fashion-Trends</span>
+	</div>	
+</div>
+
+
+
+
+
+<!-- TemplateEnd -->
+
+</div>
+<div style="position:absolute;overflow:hidden;width:245px;left:250px;top:380px;">
+ <!-- TemplateBegin : $Archive:   //pvcssrv02.service.itellium.net/pvcsfs/b2ccc/pvcsprojekte/Q2_Gesamt/archives/enfinity/share/private/eCS/Store/templates/de/scc/component-types/1575.isml-arc  $ $Revision: 8195 $-->
+
+
+
+
+
+<div style="position:relative;width:245px;height:25px;text-align:left;color:#ffffff;background-color:#94bac1;overflow:hidden;">
+	<div style="position:absolute;left:7px;top:5px;width:231px;height:15px;">
+	<span style="font: normal bold 12px Arial;color:#ffffff;text-decoration:none;">Technik-Angebote</span>
+	</div>	
+</div>
+
+
+
+
+
+<!-- TemplateEnd -->
+
+</div>
+<div style="position:absolute;overflow:hidden;width:245px;left:500px;top:380px;">
+ <!-- TemplateBegin : $Archive:   //pvcssrv02.service.itellium.net/pvcsfs/b2ccc/pvcsprojekte/Q2_Gesamt/archives/enfinity/share/private/eCS/Store/templates/de/scc/component-types/1575.isml-arc  $ $Revision: 8195 $-->
+
+
+
+
+
+<div style="position:relative;width:245px;height:25px;text-align:left;color:#ffffff;background-color:#afa59d;overflow:hidden;">
+	<div style="position:absolute;left:7px;top:5px;width:231px;height:15px;">
+	<span style="font: normal bold 12px Arial;color:#ffffff;text-decoration:none;">Sch&#246;nes Zuhause</span>
+	</div>	
+</div>
+
+
+
+
+
+<!-- TemplateEnd -->
+
+</div>
+<div style="position:absolute;overflow:hidden;width:190px;left:765px;top:395px;">
+  
+<!-- TemplateBegin : $Archive: //pvcssrv02.service.itellium.net/pvcsfs/b2ccc/pvcsprojekte/Q2_Gesamt/archives/enfinity/share/private/eCS/Store/templates/de/scc/component-types/1520.isml-arc $ $Revision: 1.0 $-->
+<div style="position:relative;width:190px;height:25px;">
+<div style="position:relative;width:190px;height:24px;overflow:hidden;background-color:white;">
+<div style="position:absolute;left:6px;top:7px;width:16px;height:12px;">
+
+<a href="http://www.quelle.de/is-bin/INTERSHOP.enfinity/WFS/Quelle-quelle_de-Site/de_DE/-/EUR/Q_BrowseCatalog-Start?CategoryName=278187&PromoShopID=QuelleRoot&Linktype=M" class="" style="">
+<img src="http://images.quelle.de/is-bin/intershop.static/WFS/Quelle-quelle_de-Site/-/de_DE/images/72/HP_Mobile-Services.gif" border="0" class="noStyle" style="width:17px;height:12px;" alt=""></a>
+</div>
+<div style="position:absolute;left:31px;top:5px;width:157px;height:19px;">
+<a href="http://www.quelle.de/is-bin/INTERSHOP.enfinity/WFS/Quelle-quelle_de-Site/de_DE/-/EUR/Q_BrowseCatalog-Start?CategoryName=278187&PromoShopID=QuelleRoot&Linktype=M" class="q-normal-12px-darkblue">
+QUELLE Mobile</a>
+</div>
+</div>
+</div>
+<!-- TemplateEnd -->
+
+</div>
+<div style="position:absolute;overflow:hidden;width:245px;left:0px;top:410px;">
+  
+<!-- TemplateBegin : $Archive: //pvcssrv02.service.itellium.net/pvcsfs/b2ccc/pvcsprojekte/Q2_Gesamt/archives/enfinity/share/private/eCS/Store/templates/de/scc/component-types/1565.isml-arc $ $Revision: 1.3 $-->
+<script type="text/javascript">
+<!--
+var compID651996 = '651996';
+var prodcount651996 = 0;
+var products651996 = new Array();
+products651996[0] = new Object();
+products651996[0]["desc"] = 'Y.O.U. 2er-Set Tops';
+products651996[0]["longdesc"] = 'Das Basic an hei&szlig;en Sommertagen!';
+products651996[0]["price"] = '12.49';
+products651996[0]["secondaryprice"] = '24.99';
+products651996[0]["UVP"] = '';
+products651996[0]["abPrice"] = '1';
+products651996[0]["pic"] = 'http://products.quelle.de/zc/bs/q1/images/d/7/4/d74753c4f10dd584411bc7161c8eed62.tif/JDAqxrSlXGIzEidNs4z8S1GBB8ptARw_';
+products651996[0]["ProductSKU"] = '0574441U-34';
+products651996[0]["AAID"] = '200001637920';
+products651996[0]["CategoryName"] = '295779';
+products651996[0]["PromoShopID"] = 'QuelleRoot';
+products651996[0]["category_text"] = '... mehr von Y.O.U.';
+products651996[0]["category_linkid"] = '294687';
+products651996[1] = new Object();
+products651996[1]["desc"] = 'EXPLORER Ballerina';
+products651996[1]["longdesc"] = 'Der perfekte Schuh zum sportlich legeren Look.';
+products651996[1]["price"] = '24.99';
+products651996[1]["secondaryprice"] = '';
+products651996[1]["UVP"] = '';
+products651996[1]["abPrice"] = '';
+products651996[1]["pic"] = 'http://products.quelle.de/zc/bs/q1/images/3/3/8/338c21ec5fe1f6d9c01fac816dfa350e.tif/JDAqxrSlXGIzEidNs4z8S1GBB8ptARw_';
+products651996[1]["ProductSKU"] = '0082424Y-36';
+products651996[1]["AAID"] = '200002382001';
+products651996[1]["CategoryName"] = '296556';
+products651996[1]["PromoShopID"] = 'QuelleRoot';
+products651996[1]["category_text"] = '... mehr Schuhe';
+products651996[1]["category_linkid"] = '229587';
+function showProd651996(count) {
+var ProductLink = window.location.protocol + "//" + window.location.hostname + "/is-bin/INTERSHOP.enfinity/WFS/Quelle-quelle_de-Site/de_DE/-/EUR/Q_DisplayProductInformation-Start;"+"sid"+"="+parse_enfsession+"?ProductSKU="+products651996[count]["ProductSKU"]+"&AAID="+products651996[count]["AAID"]+"&ProductRefID="+products651996[count]["ProductSKU"]+"@Quelle-quelle_de&CategoryName="+products651996[count]["CategoryName"]+"&PromoShopID="+products651996[count]["PromoShopID"]+"&Linktype=M";
+var CategoryLink = window.location.protocol + "//" + window.location.hostname + "/is-bin/INTERSHOP.enfinity/WFS/Quelle-quelle_de-Site/de_DE/-/EUR/Q_BrowseCatalog-Start;"+"sid"+"="+parse_enfsession+"?CategoryName="+products651996[count]["category_linkid"]+"&Linktype=M";
+var longdesc = products651996[count]["longdesc"].substr(0, 70);
+var shoptext = products651996[count]["category_text"];
+if (products651996[count]["longdesc"].length > 70) { longdesc = longdesc + ' ...';};
+document.write('<a href="'+ProductLink+'"><img src="'+products651996[count]["pic"]+'" width="112" height="95" border="0" alt=""></a>');
+document.write('<div style="position:relative;left:5px;top:8px;width:110px;height:80px;overflow:hidden;line-height:15px;">');
+document.write('<a href="'+ProductLink+'" style="font-face:arial;font-size:12px;font-weight:bold;text-decoration:underline;">'+products651996[count]["desc"]+'</a><br>');
+document.write(longdesc);
+document.write('</div><div style="position:relative;top:10px;left:5px;width:110px;">');
+if (products651996[count]["secondaryprice"] != '') {
+if (products651996[count]["secondaryprice"].length + products651996[count]["price"].length > 11) {
+document.write('<span id="pa_streichprice" class="q-trebuchet-12px-darkgrey">&euro; '+products651996[count]["secondaryprice"]+'</span>&nbsp;<br>');
+} else {
+document.write('<br><span id="pa_streichprice" class="q-trebuchet-12px-darkgrey">&euro; '+products651996[count]["secondaryprice"]+'</span>&nbsp;');
+}
+} else {
+if (products651996[count]["UVP"] != '') {
+document.write('<span id="pa_uvp" class="q-normal-12px-darkblue" style="color:#999999;">UVP*&nbsp;&euro;&nbsp;'+products651996[count]["UVP"]+'</span><br>');
+} else {
+document.write('<br>&nbsp;');
+}
+}
+if(products651996[count]["abPrice"] == '1') {
+document.write('<span class="q-bold-12px-red">ab &euro; '+products651996[count]["price"]+'</span></div>');
+} else {
+document.write('<span class="q-bold-12px-red">&euro; '+products651996[count]["price"]+'</span></div>');
+}
+document.write('<div style="position:relative;top:15px;width:120px;height:30px;float:left;background-color:#acaf93;overflow:hidden;">');
+if (products651996[count]["category_text"] != '') {
+document.write('<table border="0" cellpadding="2" cellspacing="0" width="100%" height="30"><tbody><tr><td valign="bottom"><a href="'+CategoryLink+'" style="color:white;font-face:arial;font-size:11px;font-weight:bold;text-decoration:none;">'+shoptext+'</a></td><td valign="bottom"><a href="'+CategoryLink+'"><img src="http://images.quelle.de/is-bin/intershop.static/WFS/Quelle-quelle_de-Site/-/de_DE/imagesOnline/pfeil_10x13.gif" border="0" style="position:relative;"></a></td></tr></tbody></table>');
+}
+document.write('</div>');
+}
+//-->
+</script>
+<div style="position:relative;width:245px;height:260px;overflow:hidden;background-color:#acaf93;">
+<div style="position:relative;width:120px;height:255px;background-color:white;float:left;">
+<script type="text/javascript">
+<!--
+showProd651996(prodcount651996);
+prodcount651996++;
+//-->
+</script>
+</div>
+<div style="position:relative;width:5px;height:255px;overflow:hidden;float:left;background-color:white;">
+</div>
+<div style="position:relative;width:120px;height:255px;background-color:white;float:left;">
+<script type="text/javascript">
+<!--
+showProd651996(prodcount651996);
+prodcount651996++;
+//-->
+</script>
+</div>
+</div>
+<!-- TemplateEnd -->
+
+</div>
+<div style="position:absolute;overflow:hidden;width:245px;left:250px;top:410px;">
+  
+<!-- TemplateBegin : $Archive: //pvcssrv02.service.itellium.net/pvcsfs/b2ccc/pvcsprojekte/Q2_Gesamt/archives/enfinity/share/private/eCS/Store/templates/de/scc/component-types/1565.isml-arc $ $Revision: 1.3 $-->
+<script type="text/javascript">
+<!--
+var compID476442 = '476442';
+var prodcount476442 = 0;
+var products476442 = new Array();
+products476442[0] = new Object();
+products476442[0]["desc"] = 'FUJITSU SIEMENS Desktoprechner';
+products476442[0]["longdesc"] = 'AMD Athlon 64 Prozessor 4400+';
+products476442[0]["price"] = '399.00';
+products476442[0]["secondaryprice"] = '';
+products476442[0]["UVP"] = '';
+products476442[0]["abPrice"] = '';
+products476442[0]["pic"] = 'http://products.quelle.de/zc/bs/q1/images/f/c/a/fcaa40ecde4918a317f344ecd7e72dbc.tif/JDAqxrSlXGIzEidNs4z8S1GBB8ptARw_';
+products476442[0]["ProductSKU"] = '0701985F';
+products476442[0]["AAID"] = '200002449414';
+products476442[0]["CategoryName"] = '282165';
+products476442[0]["PromoShopID"] = 'QuelleRoot';
+products476442[0]["category_text"] = '... mehr Computer';
+products476442[0]["category_linkid"] = '282162';
+products476442[1] = new Object();
+products476442[1]["desc"] = 'SONY Digitale Spiegelreflex';
+products476442[1]["longdesc"] = 'Mit hochwirksamer Bildstabilisierung';
+products476442[1]["price"] = '749.99';
+products476442[1]["secondaryprice"] = '849.99';
+products476442[1]["UVP"] = '850.00';
+products476442[1]["abPrice"] = '';
+products476442[1]["pic"] = 'http://products.quelle.de/zc/bs/q1/images/6/b/b/6bb916d9b81f8381547efb71dc8c34a4.tif/JDAqxrSlXGIzEidNs4z8S1GBB8ptARw_';
+products476442[1]["ProductSKU"] = '0416417R';
+products476442[1]["AAID"] = '200004083178';
+products476442[1]["CategoryName"] = '112707';
+products476442[1]["PromoShopID"] = 'QuelleRoot';
+products476442[1]["category_text"] = '... mehr von SONY';
+products476442[1]["category_linkid"] = '112499';
+function showProd476442(count) {
+var ProductLink = window.location.protocol + "//" + window.location.hostname + "/is-bin/INTERSHOP.enfinity/WFS/Quelle-quelle_de-Site/de_DE/-/EUR/Q_DisplayProductInformation-Start;"+"sid"+"="+parse_enfsession+"?ProductSKU="+products476442[count]["ProductSKU"]+"&AAID="+products476442[count]["AAID"]+"&ProductRefID="+products476442[count]["ProductSKU"]+"@Quelle-quelle_de&CategoryName="+products476442[count]["CategoryName"]+"&PromoShopID="+products476442[count]["PromoShopID"]+"&Linktype=M";
+var CategoryLink = window.location.protocol + "//" + window.location.hostname + "/is-bin/INTERSHOP.enfinity/WFS/Quelle-quelle_de-Site/de_DE/-/EUR/Q_BrowseCatalog-Start;"+"sid"+"="+parse_enfsession+"?CategoryName="+products476442[count]["category_linkid"]+"&Linktype=M";
+var longdesc = products476442[count]["longdesc"].substr(0, 70);
+var shoptext = products476442[count]["category_text"];
+if (products476442[count]["longdesc"].length > 70) { longdesc = longdesc + ' ...';};
+document.write('<a href="'+ProductLink+'"><img src="'+products476442[count]["pic"]+'" width="112" height="95" border="0" alt=""></a>');
+document.write('<div style="position:relative;left:5px;top:8px;width:110px;height:80px;overflow:hidden;line-height:15px;">');
+document.write('<a href="'+ProductLink+'" style="font-face:arial;font-size:12px;font-weight:bold;text-decoration:underline;">'+products476442[count]["desc"]+'</a><br>');
+document.write(longdesc);
+document.write('</div><div style="position:relative;top:10px;left:5px;width:110px;">');
+if (products476442[count]["secondaryprice"] != '') {
+if (products476442[count]["secondaryprice"].length + products476442[count]["price"].length > 11) {
+document.write('<span id="pa_streichprice" class="q-trebuchet-12px-darkgrey">&euro; '+products476442[count]["secondaryprice"]+'</span>&nbsp;<br>');
+} else {
+document.write('<br><span id="pa_streichprice" class="q-trebuchet-12px-darkgrey">&euro; '+products476442[count]["secondaryprice"]+'</span>&nbsp;');
+}
+} else {
+if (products476442[count]["UVP"] != '') {
+document.write('<span id="pa_uvp" class="q-normal-12px-darkblue" style="color:#999999;">UVP*&nbsp;&euro;&nbsp;'+products476442[count]["UVP"]+'</span><br>');
+} else {
+document.write('<br>&nbsp;');
+}
+}
+if(products476442[count]["abPrice"] == '1') {
+document.write('<span class="q-bold-12px-red">ab &euro; '+products476442[count]["price"]+'</span></div>');
+} else {
+document.write('<span class="q-bold-12px-red">&euro; '+products476442[count]["price"]+'</span></div>');
+}
+document.write('<div style="position:relative;top:15px;width:120px;height:30px;float:left;background-color:#94bac1;overflow:hidden;">');
+if (products476442[count]["category_text"] != '') {
+document.write('<table border="0" cellpadding="2" cellspacing="0" width="100%" height="30"><tbody><tr><td valign="bottom"><a href="'+CategoryLink+'" style="color:white;font-face:arial;font-size:11px;font-weight:bold;text-decoration:none;">'+shoptext+'</a></td><td valign="bottom"><a href="'+CategoryLink+'"><img src="http://images.quelle.de/is-bin/intershop.static/WFS/Quelle-quelle_de-Site/-/de_DE/imagesOnline/pfeil_10x13.gif" border="0" style="position:relative;"></a></td></tr></tbody></table>');
+}
+document.write('</div>');
+}
+//-->
+</script>
+<div style="position:relative;width:245px;height:260px;overflow:hidden;background-color:#94bac1;">
+<div style="position:relative;width:120px;height:255px;background-color:white;float:left;">
+<script type="text/javascript">
+<!--
+showProd476442(prodcount476442);
+prodcount476442++;
+//-->
+</script>
+</div>
+<div style="position:relative;width:5px;height:255px;overflow:hidden;float:left;background-color:white;">
+</div>
+<div style="position:relative;width:120px;height:255px;background-color:white;float:left;">
+<script type="text/javascript">
+<!--
+showProd476442(prodcount476442);
+prodcount476442++;
+//-->
+</script>
+</div>
+</div>
+<!-- TemplateEnd -->
+
+</div>
+<div style="position:absolute;overflow:hidden;width:245px;left:500px;top:410px;">
+  
+<!-- TemplateBegin : $Archive: //pvcssrv02.service.itellium.net/pvcsfs/b2ccc/pvcsprojekte/Q2_Gesamt/archives/enfinity/share/private/eCS/Store/templates/de/scc/component-types/1565.isml-arc $ $Revision: 1.3 $-->
+<script type="text/javascript">
+<!--
+var compID476634 = '476634';
+var prodcount476634 = 0;
+var products476634 = new Array();
+products476634[0] = new Object();
+products476634[0]["desc"] = 'NINTENDO Wii Fit mit Balance Board';
+products476634[0]["longdesc"] = 'Die Erg&auml;nzung zur Spielekonsole Wii';
+products476634[0]["price"] = '99.99';
+products476634[0]["secondaryprice"] = '';
+products476634[0]["UVP"] = '';
+products476634[0]["abPrice"] = '';
+products476634[0]["pic"] = 'http://products.quelle.de/zc/bs/q1/images/e/2/0/e2052ae9c0714c0255d471a9d22ffbc2.tif/JDAqxrSlXGIzEidNs4z8S1GBB8ptARw_';
+products476634[0]["ProductSKU"] = '0637510J';
+products476634[0]["AAID"] = '200004143535';
+products476634[0]["CategoryName"] = '263031';
+products476634[0]["PromoShopID"] = 'QuelleRoot';
+products476634[0]["category_text"] = '... mehr von NINTENDO';
+products476634[0]["category_linkid"] = '260871';
+products476634[1] = new Object();
+products476634[1]["desc"] = 'PLAYBOY 2-tlg. Bettw&auml;sche';
+products476634[1]["longdesc"] = 'Exklusiv bei Quelle!';
+products476634[1]["price"] = '24.99';
+products476634[1]["secondaryprice"] = '34.99';
+products476634[1]["UVP"] = '';
+products476634[1]["abPrice"] = '';
+products476634[1]["pic"] = 'http://products.quelle.de/zc/bs/q1/images/6/2/a/62af39aae081a6b5dee7104de890d5b2.tif/JDAqxrSlXGIzEidNs4z8S1GBB8ptARw_';
+products476634[1]["ProductSKU"] = '0543499M-135/200';
+products476634[1]["AAID"] = '200001983598';
+products476634[1]["CategoryName"] = '264045';
+products476634[1]["PromoShopID"] = 'QuelleRoot';
+products476634[1]["category_text"] = '... mehr Bettw&auml;sche';
+products476634[1]["category_linkid"] = '264045';
+function showProd476634(count) {
+var ProductLink = window.location.protocol + "//" + window.location.hostname + "/is-bin/INTERSHOP.enfinity/WFS/Quelle-quelle_de-Site/de_DE/-/EUR/Q_DisplayProductInformation-Start;"+"sid"+"="+parse_enfsession+"?ProductSKU="+products476634[count]["ProductSKU"]+"&AAID="+products476634[count]["AAID"]+"&ProductRefID="+products476634[count]["ProductSKU"]+"@Quelle-quelle_de&CategoryName="+products476634[count]["CategoryName"]+"&PromoShopID="+products476634[count]["PromoShopID"]+"&Linktype=M";
+var CategoryLink = window.location.protocol + "//" + window.location.hostname + "/is-bin/INTERSHOP.enfinity/WFS/Quelle-quelle_de-Site/de_DE/-/EUR/Q_BrowseCatalog-Start;"+"sid"+"="+parse_enfsession+"?CategoryName="+products476634[count]["category_linkid"]+"&Linktype=M";
+var longdesc = products476634[count]["longdesc"].substr(0, 70);
+var shoptext = products476634[count]["category_text"];
+if (products476634[count]["longdesc"].length > 70) { longdesc = longdesc + ' ...';};
+document.write('<a href="'+ProductLink+'"><img src="'+products476634[count]["pic"]+'" width="112" height="95" border="0" alt=""></a>');
+document.write('<div style="position:relative;left:5px;top:8px;width:110px;height:80px;overflow:hidden;line-height:15px;">');
+document.write('<a href="'+ProductLink+'" style="font-face:arial;font-size:12px;font-weight:bold;text-decoration:underline;">'+products476634[count]["desc"]+'</a><br>');
+document.write(longdesc);
+document.write('</div><div style="position:relative;top:10px;left:5px;width:110px;">');
+if (products476634[count]["secondaryprice"] != '') {
+if (products476634[count]["secondaryprice"].length + products476634[count]["price"].length > 11) {
+document.write('<span id="pa_streichprice" class="q-trebuchet-12px-darkgrey">&euro; '+products476634[count]["secondaryprice"]+'</span>&nbsp;<br>');
+} else {
+document.write('<br><span id="pa_streichprice" class="q-trebuchet-12px-darkgrey">&euro; '+products476634[count]["secondaryprice"]+'</span>&nbsp;');
+}
+} else {
+if (products476634[count]["UVP"] != '') {
+document.write('<span id="pa_uvp" class="q-normal-12px-darkblue" style="color:#999999;">UVP*&nbsp;&euro;&nbsp;'+products476634[count]["UVP"]+'</span><br>');
+} else {
+document.write('<br>&nbsp;');
+}
+}
+if(products476634[count]["abPrice"] == '1') {
+document.write('<span class="q-bold-12px-red">ab &euro; '+products476634[count]["price"]+'</span></div>');
+} else {
+document.write('<span class="q-bold-12px-red">&euro; '+products476634[count]["price"]+'</span></div>');
+}
+document.write('<div style="position:relative;top:15px;width:120px;height:30px;float:left;background-color:#afa59d;overflow:hidden;">');
+if (products476634[count]["category_text"] != '') {
+document.write('<table border="0" cellpadding="2" cellspacing="0" width="100%" height="30"><tbody><tr><td valign="bottom"><a href="'+CategoryLink+'" style="color:white;font-face:arial;font-size:11px;font-weight:bold;text-decoration:none;">'+shoptext+'</a></td><td valign="bottom"><a href="'+CategoryLink+'"><img src="http://images.quelle.de/is-bin/intershop.static/WFS/Quelle-quelle_de-Site/-/de_DE/imagesOnline/pfeil_10x13.gif" border="0" style="position:relative;"></a></td></tr></tbody></table>');
+}
+document.write('</div>');
+}
+//-->
+</script>
+<div style="position:relative;width:245px;height:260px;overflow:hidden;background-color:#afa59d;">
+<div style="position:relative;width:120px;height:255px;background-color:white;float:left;">
+<script type="text/javascript">
+<!--
+showProd476634(prodcount476634);
+prodcount476634++;
+//-->
+</script>
+</div>
+<div style="position:relative;width:5px;height:255px;overflow:hidden;float:left;background-color:white;">
+</div>
+<div style="position:relative;width:120px;height:255px;background-color:white;float:left;">
+<script type="text/javascript">
+<!--
+showProd476634(prodcount476634);
+prodcount476634++;
+//-->
+</script>
+</div>
+</div>
+<!-- TemplateEnd -->
+
+</div>
+<div style="position:absolute;overflow:hidden;width:190px;left:765px;top:420px;">
+  
+<!-- TemplateBegin : $Archive: //pvcssrv02.service.itellium.net/pvcsfs/b2ccc/pvcsprojekte/Q2_Gesamt/archives/enfinity/share/private/eCS/Store/templates/de/scc/component-types/1520.isml-arc $ $Revision: 1.0 $-->
+<div style="position:relative;width:190px;height:25px;">
+<div style="position:relative;width:190px;height:24px;overflow:hidden;background-color:white;">
+<div style="position:absolute;left:6px;top:7px;width:16px;height:12px;">
+
+<a href="http://www.quelle.de/is-bin/INTERSHOP.enfinity/WFS/Quelle-quelle_de-Site/de_DE/-/EUR/Q_ViewStatic-ViewPage2?ProductSKU=static3109&CategoryName=50000010&PromoShopID=QuelleRoot&Linktype=M" class="" style="">
+<img src="http://images.quelle.de/is-bin/intershop.static/WFS/Quelle-quelle_de-Site/-/de_DE/images/5d/Icon-eCard-v01.gif" border="0" class="noStyle" style="width:17px;height:12px;" alt=""></a>
+</div>
+<div style="position:absolute;left:31px;top:5px;width:157px;height:19px;">
+<a href="http://www.quelle.de/is-bin/INTERSHOP.enfinity/WFS/Quelle-quelle_de-Site/de_DE/-/EUR/Q_ViewStatic-ViewPage2?ProductSKU=static3192&CategoryName=275550&PromoShopID=QuelleRoot&Linktype=M" class="q-normal-12px-darkblue">
+Meine eCards</a>
+</div>
+</div>
+</div>
+<!-- TemplateEnd -->
+
+</div>
+<div style="position:absolute;overflow:hidden;width:190px;left:765px;top:445px;">
+  
+<!-- TemplateBegin : $Archive: //pvcssrv02.service.itellium.net/pvcsfs/b2ccc/pvcsprojekte/Q2_Gesamt/archives/enfinity/share/private/eCS/Store/templates/de/scc/component-types/1520.isml-arc $ $Revision: 1.0 $-->
+<div style="position:relative;width:190px;height:25px;">
+<div style="position:relative;width:190px;height:24px;overflow:hidden;background-color:white;">
+<div style="position:absolute;left:6px;top:7px;width:16px;height:12px;">
+
+<a href="http://www.quelle.de/is-bin/INTERSHOP.enfinity/WFS/Quelle-quelle_de-Site/de_DE/-/EUR/Q_ViewTemplate-View?Template=q_redirect&RedirectURL=http://www.quelle.de/is-bin/INTERSHOP.enfinity/WFS/Quelle-quelle_de-Site/de_DE/-/EUR/Q_ViewTemplate_ecs-View?Template=static/q_quelletv_iframe&PromoShopID=QuelleRoot&Linktype=M" class="" style="">
+<img src="http://images.quelle.de/is-bin/intershop.static/WFS/Quelle-quelle_de-Site/-/de_DE/images/d8/icon_kamera.gif" border="0" class="noStyle" style="width:17px;height:12px;" alt=""></a>
+</div>
+<div style="position:absolute;left:31px;top:5px;width:157px;height:19px;">
+<a href="http://www.quelle.de/is-bin/INTERSHOP.enfinity/WFS/Quelle-quelle_de-Site/de_DE/-/EUR/Q_ViewTemplate-View?Template=q_redirect&RedirectURL=http://www.quelle.de/is-bin/INTERSHOP.enfinity/WFS/Quelle-quelle_de-Site/de_DE/-/EUR/Q_ViewTemplate_ecs-View?Template=static/q_quelletv_iframe&PromoShopID=QuelleRoot&Linktype=M" class="q-normal-12px-darkblue">
+quelle.tv</a>
+</div>
+</div>
+</div>
+<!-- TemplateEnd -->
+
+</div>
+<div style="position:absolute;overflow:hidden;width:190px;left:765px;top:475px;">
+  
+<!-- TemplateBegin : $Archive: //pvcssrv02.service.itellium.net/pvcsfs/b2ccc/pvcsprojekte/Q2_Gesamt/archives/enfinity/share/private/eCS/Store/templates/de/scc/component-types/1518.isml-arc $ $Revision: 1.1 $-->
+<div style="position:relative;height:25px;width:190px;overflow:hidden;background:url('http://images.quelle.de/is-bin/intershop.static/WFS/Quelle-quelle_de-Site/-/de_DE/imagesOnline/q5_mw_header_bg.gif') repeat-x;">
+<div style="position:relative;top:5px;left:7px;">
+<span class="q-bold-12px-white" style="text-decoration:none;">Weitere Sortimente</span>
+</div>
+</div>
+<!-- TemplateEnd -->
+
+</div>
+<div style="position:absolute;overflow:hidden;width:190px;left:765px;top:500px;">
+  
+<!-- TemplateBegin : $Archive: //pvcssrv02.service.itellium.net/pvcsfs/b2ccc/pvcsprojekte/Q2_Gesamt/archives/enfinity/share/private/eCS/Store/templates/de/scc/component-types/1569.isml-arc $ $Revision: 1.1 $-->
+<div style="position:relative;width:190px;height:40px;overflow:hidden;">
+<div style="position:relative;width:38px;height:38px;overflow:hidden;background-color:white;float:left;">
+<img src="http://images.quelle.de/is-bin/intershop.static/WFS/Quelle-quelle_de-Site/-/de_DE/images/68/kq_kochmuetze_38x38.gif" width="38" height="38">
+</div>
+<div style="position:relative;width:152px;height:38px;overflow:hidden;background-color:white;float:left;">
+<table border="0" callpadding="0" callspacing="0"><tr><td height="40">
+<a href="http://www.quelle.de/is-bin/INTERSHOP.enfinity/WFS/Quelle-quelle_de-Site/de_DE/-/EUR/Q_BrowseCatalog-Start?CategoryName=201159&PromoShopID=QuelleRoot&Linktype=M" class="q-bold-12px-darkred" style="color:#003399;text-decoration:none;">
+K?chen-QUELLE</a><br>
+</td></tr></table>
+</div>
+</div>
+<!-- TemplateEnd -->
+
+</div>
+<div style="position:absolute;overflow:hidden;width:190px;left:765px;top:540px;">
+  
+<!-- TemplateBegin : $Archive: //pvcssrv02.service.itellium.net/pvcsfs/b2ccc/pvcsprojekte/Q2_Gesamt/archives/enfinity/share/private/eCS/Store/templates/de/scc/component-types/1569.isml-arc $ $Revision: 1.1 $-->
+<div style="position:relative;width:190px;height:40px;overflow:hidden;">
+<div style="position:relative;width:38px;height:38px;overflow:hidden;background-color:white;float:left;">
+<img src="http://images.quelle.de/is-bin/intershop.static/WFS/Quelle-quelle_de-Site/-/de_DE/images/78/hp_icon_no7_finanzen_neu.gif" width="38" height="38">
+</div>
+<div style="position:relative;width:152px;height:38px;overflow:hidden;background-color:white;float:left;">
+<table border="0" callpadding="0" callspacing="0"><tr><td height="40">
+<a href="http://www.quelle.de/is-bin/INTERSHOP.enfinity/WFS/Quelle-quelle_de-Site/de_DE/-/EUR/Q_ViewStatic-ViewPage?ProductSKU=static2154&PromoShopID=QuelleRoot&Linktype=M" class="q-bold-12px-darkred" style="color:#003399;text-decoration:none;">
+Versicherungen &
+Finanzen</a><br>
+</td></tr></table>
+</div>
+</div>
+<!-- TemplateEnd -->
+
+</div>
+<div style="position:absolute;overflow:hidden;width:190px;left:765px;top:580px;">
+  
+<!-- TemplateBegin : $Archive: //pvcssrv02.service.itellium.net/pvcsfs/b2ccc/pvcsprojekte/Q2_Gesamt/archives/enfinity/share/private/eCS/Store/templates/de/scc/component-types/1569.isml-arc $ $Revision: 1.1 $-->
+<div style="position:relative;width:190px;height:40px;overflow:hidden;">
+<div style="position:relative;width:38px;height:38px;overflow:hidden;background-color:white;float:left;">
+<img src="http://images.quelle.de/is-bin/intershop.static/WFS/Quelle-quelle_de-Site/-/de_DE/images/e1/hp_icon_no3_reisen.gif" width="38" height="38">
+</div>
+<div style="position:relative;width:152px;height:38px;overflow:hidden;background-color:white;float:left;">
+<table border="0" callpadding="0" callspacing="0"><tr><td height="40">
+<a href="http://www.quelle.de/is-bin/INTERSHOP.enfinity/WFS/Quelle-quelle_de-Site/de_DE/-/EUR/Q_ViewTemplate_ecs-View?PromoShopID=QuelleRoot&Template=q_redirect&RedirectURL=http%3A%2F%2Fwww.quelle.de%2Fis-bin%2FINTERSHOP.enfinity%2FWFS%2FQuelle-quelle_de-Site%2Fde_DE%2F-%2FEUR%2FQ_ViewTemplate_ecs-View%3FTemplate%3Dstatic%2Fq_reisequelle_iframe%26LinkType%3DM&Linktype=M" class="q-bold-12px-darkred" style="color:#003399;text-decoration:none;">
+Lust auf Urlaub?<br>Jetzt hier buchen!</a><br>
+</td></tr></table>
+</div>
+</div>
+<!-- TemplateEnd -->
+
+</div>
+<div style="position:absolute;overflow:hidden;width:190px;left:765px;top:620px;">
+  
+<!-- TemplateBegin : $Archive: //pvcssrv02.service.itellium.net/pvcsfs/b2ccc/pvcsprojekte/Q2_Gesamt/archives/enfinity/share/private/eCS/Store/templates/de/scc/component-types/1569.isml-arc $ $Revision: 1.1 $-->
+<div style="position:relative;width:190px;height:40px;overflow:hidden;">
+<div style="position:relative;width:38px;height:38px;overflow:hidden;background-color:white;float:left;">
+<img src="http://images.quelle.de/is-bin/intershop.static/WFS/Quelle-quelle_de-Site/-/de_DE/images/bc/hp_icon_no1_bildershop_neu.gif" width="38" height="38">
+</div>
+<div style="position:relative;width:152px;height:38px;overflow:hidden;background-color:white;float:left;">
+<table border="0" callpadding="0" callspacing="0"><tr><td height="40">
+<a href="javascript:newWin('M1185485459','http://www.quelle.de/is-bin/INTERSHOP.enfinity/WFS/Quelle-quelle_de-Site/de_DE/-/EUR/Q_ViewTemplate-View?Template=q_redirect&RedirectURL=http://www.fotoquelle.de/&PromoShopID=QuelleRoot&Linktype=M',1026,736,'scrollbars=yes','scrollbars=yes')" class="q-bold-12px-darkred" style="color:#003399;text-decoration:none;">
+Foto Service</a><br>
+</td></tr></table>
+</div>
+</div>
+<!-- TemplateEnd -->
+
+</div>
+<div style="position:absolute;overflow:hidden;width:190px;left:765px;top:660px;">
+  
+<!-- TemplateBegin : $Archive: //pvcssrv02.service.itellium.net/pvcsfs/b2ccc/pvcsprojekte/Q2_Gesamt/archives/enfinity/share/private/eCS/Store/templates/de/scc/component-types/1569.isml-arc $ $Revision: 1.1 $-->
+<div style="position:relative;width:190px;height:40px;overflow:hidden;">
+<div style="position:relative;width:38px;height:38px;overflow:hidden;background-color:white;float:left;">
+<img src="http://images.quelle.de/is-bin/intershop.static/WFS/Quelle-quelle_de-Site/-/de_DE/images/32/HP_icon_dvd_gedreht.gif" width="38" height="38">
+</div>
+<div style="position:relative;width:152px;height:38px;overflow:hidden;background-color:white;float:left;">
+<table border="0" callpadding="0" callspacing="0"><tr><td height="40">
+<a href="http://www.quelle.de/is-bin/INTERSHOP.enfinity/WFS/Quelle-quelle_de-Site/de_DE/-/EUR/Q_ViewTemplate-View?Template=q_redirect&RedirectURL=http://www.quelle.de/is-bin/INTERSHOP.enfinity/WFS/Quelle-quelle_de-Site/de_DE/-/EUR/Q_DVDRental-Show&PromoShopID=QuelleRoot&Linktype=M" class="q-bold-12px-darkred" style="color:#003399;text-decoration:none;">
+DVD-Verleih</a><br>
+</td></tr></table>
+</div>
+</div>
+<!-- TemplateEnd -->
+
+</div>
+<div style="position:absolute;overflow:hidden;width:245px;left:0px;top:675px;">
+  
+<!-- TemplateBegin : $Archive: //pvcssrv02.service.itellium.net/pvcsfs/b2ccc/pvcsprojekte/Q2_Gesamt/archives/enfinity/share/private/eCS/Store/templates/de/scc/component-types/1565.isml-arc $ $Revision: 1.3 $-->
+<script type="text/javascript">
+<!--
+var compID609720 = '609720';
+var prodcount609720 = 0;
+var products609720 = new Array();
+products609720[0] = new Object();
+products609720[0]["desc"] = 'QS by s.Oliver T-Shirt';
+products609720[0]["longdesc"] = 'Markenqualit&auml;t f&uuml;r wenig Geld.';
+products609720[0]["price"] = '9.95';
+products609720[0]["secondaryprice"] = '';
+products609720[0]["UVP"] = '';
+products609720[0]["abPrice"] = '';
+products609720[0]["pic"] = 'http://products.quelle.de/zc/bs/q1/images/1/5/1/1510e07947c63b75198624320ee85cd0.tif/JDAqxrSlXGIzEidNs4z8S1GBB8ptARw_';
+products609720[0]["ProductSKU"] = '0480106A-M';
+products609720[0]["AAID"] = '200000900841';
+products609720[0]["CategoryName"] = '298140';
+products609720[0]["PromoShopID"] = 'QuelleRoot';
+products609720[0]["category_text"] = '... mehr von s. Oliver';
+products609720[0]["category_linkid"] = '298035';
+products609720[1] = new Object();
+products609720[1]["desc"] = 'Bermudas';
+products609720[1]["longdesc"] = 'L&auml;ssige Falten-Optik an den Taschen.';
+products609720[1]["price"] = '19.99';
+products609720[1]["secondaryprice"] = '';
+products609720[1]["UVP"] = '';
+products609720[1]["abPrice"] = '1';
+products609720[1]["pic"] = 'http://products.quelle.de/zc/bs/q1/images/7/7/4/774055ab531c4864fab60c526a580b9b.tif/JDAqxrSlXGIzEidNs4z8S1GBB8ptARw_';
+products609720[1]["ProductSKU"] = '0175320K-44';
+products609720[1]["AAID"] = '200002410180';
+products609720[1]["CategoryName"] = '272715';
+products609720[1]["PromoShopID"] = 'QuelleRoot';
+products609720[1]["category_text"] = '... mehr Hosen f&uuml;r Ihn';
+products609720[1]["category_linkid"] = '272715';
+function showProd609720(count) {
+var ProductLink = window.location.protocol + "//" + window.location.hostname + "/is-bin/INTERSHOP.enfinity/WFS/Quelle-quelle_de-Site/de_DE/-/EUR/Q_DisplayProductInformation-Start;"+"sid"+"="+parse_enfsession+"?ProductSKU="+products609720[count]["ProductSKU"]+"&AAID="+products609720[count]["AAID"]+"&ProductRefID="+products609720[count]["ProductSKU"]+"@Quelle-quelle_de&CategoryName="+products609720[count]["CategoryName"]+"&PromoShopID="+products609720[count]["PromoShopID"]+"&Linktype=M";
+var CategoryLink = window.location.protocol + "//" + window.location.hostname + "/is-bin/INTERSHOP.enfinity/WFS/Quelle-quelle_de-Site/de_DE/-/EUR/Q_BrowseCatalog-Start;"+"sid"+"="+parse_enfsession+"?CategoryName="+products609720[count]["category_linkid"]+"&Linktype=M";
+var longdesc = products609720[count]["longdesc"].substr(0, 70);
+var shoptext = products609720[count]["category_text"];
+if (products609720[count]["longdesc"].length > 70) { longdesc = longdesc + ' ...';};
+document.write('<a href="'+ProductLink+'"><img src="'+products609720[count]["pic"]+'" width="112" height="95" border="0" alt=""></a>');
+document.write('<div style="position:relative;left:5px;top:8px;width:110px;height:80px;overflow:hidden;line-height:15px;">');
+document.write('<a href="'+ProductLink+'" style="font-face:arial;font-size:12px;font-weight:bold;text-decoration:underline;">'+products609720[count]["desc"]+'</a><br>');
+document.write(longdesc);
+document.write('</div><div style="position:relative;top:10px;left:5px;width:110px;">');
+if (products609720[count]["secondaryprice"] != '') {
+if (products609720[count]["secondaryprice"].length + products609720[count]["price"].length > 11) {
+document.write('<span id="pa_streichprice" class="q-trebuchet-12px-darkgrey">&euro; '+products609720[count]["secondaryprice"]+'</span>&nbsp;<br>');
+} else {
+document.write('<br><span id="pa_streichprice" class="q-trebuchet-12px-darkgrey">&euro; '+products609720[count]["secondaryprice"]+'</span>&nbsp;');
+}
+} else {
+if (products609720[count]["UVP"] != '') {
+document.write('<span id="pa_uvp" class="q-normal-12px-darkblue" style="color:#999999;">UVP*&nbsp;&euro;&nbsp;'+products609720[count]["UVP"]+'</span><br>');
+} else {
+document.write('<br>&nbsp;');
+}
+}
+if(products609720[count]["abPrice"] == '1') {
+document.write('<span class="q-bold-12px-red">ab &euro; '+products609720[count]["price"]+'</span></div>');
+} else {
+document.write('<span class="q-bold-12px-red">&euro; '+products609720[count]["price"]+'</span></div>');
+}
+document.write('<div style="position:relative;top:15px;width:120px;height:30px;float:left;background-color:#acaf93;overflow:hidden;">');
+if (products609720[count]["category_text"] != '') {
+document.write('<table border="0" cellpadding="2" cellspacing="0" width="100%" height="30"><tbody><tr><td valign="bottom"><a href="'+CategoryLink+'" style="color:white;font-face:arial;font-size:11px;font-weight:bold;text-decoration:none;">'+shoptext+'</a></td><td valign="bottom"><a href="'+CategoryLink+'"><img src="http://images.quelle.de/is-bin/intershop.static/WFS/Quelle-quelle_de-Site/-/de_DE/imagesOnline/pfeil_10x13.gif" border="0" style="position:relative;"></a></td></tr></tbody></table>');
+}
+document.write('</div>');
+}
+//-->
+</script>
+<div style="position:relative;width:245px;height:260px;overflow:hidden;background-color:#acaf93;">
+<div style="position:relative;width:120px;height:255px;background-color:white;float:left;">
+<script type="text/javascript">
+<!--
+showProd609720(prodcount609720);
+prodcount609720++;
+//-->
+</script>
+</div>
+<div style="position:relative;width:5px;height:255px;overflow:hidden;float:left;background-color:white;">
+</div>
+<div style="position:relative;width:120px;height:255px;background-color:white;float:left;">
+<script type="text/javascript">
+<!--
+showProd609720(prodcount609720);
+prodcount609720++;
+//-->
+</script>
+</div>
+</div>
+<!-- TemplateEnd -->
+
+</div>
+<div style="position:absolute;overflow:hidden;width:245px;left:250px;top:675px;">
+  
+<!-- TemplateBegin : $Archive: //pvcssrv02.service.itellium.net/pvcsfs/b2ccc/pvcsprojekte/Q2_Gesamt/archives/enfinity/share/private/eCS/Store/templates/de/scc/component-types/1565.isml-arc $ $Revision: 1.3 $-->
+<script type="text/javascript">
+<!--
+var compID476619 = '476619';
+var prodcount476619 = 0;
+var products476619 = new Array();
+products476619[0] = new Object();
+products476619[0]["desc"] = 'PRIVILEG Einbauherdset';
+products476619[0]["longdesc"] = 'Unser Preishit!';
+products476619[0]["price"] = '399.99';
+products476619[0]["secondaryprice"] = '';
+products476619[0]["UVP"] = '';
+products476619[0]["abPrice"] = '1';
+products476619[0]["pic"] = 'http://products.quelle.de/zc/bs/q1/images/9/c/8/9c8eaaa44a6c92ca08c27c2b9bc072ba.tif/JDAqxrSlXGIzEidNs4z8S1GBB8ptARw_';
+products476619[0]["ProductSKU"] = '0360507U';
+products476619[0]["AAID"] = '200004073101';
+products476619[0]["CategoryName"] = '279057';
+products476619[0]["PromoShopID"] = 'QuelleRoot';
+products476619[0]["category_text"] = '... mehr Einbauger&auml;te';
+products476619[0]["category_linkid"] = '50000288';
+products476619[1] = new Object();
+products476619[1]["desc"] = 'PRIVILEG Waschmaschine';
+products476619[1]["longdesc"] = 'Inklusive Lieferung und Anschluss!';
+products476619[1]["price"] = '349.99';
+products476619[1]["secondaryprice"] = '369.99';
+products476619[1]["UVP"] = '';
+products476619[1]["abPrice"] = '';
+products476619[1]["pic"] = 'http://products.quelle.de/zc/bs/q1/images/8/d/d/8dd11f17bb23ffd363b8017d75a10eb9.tif/JDAqxrSlXGIzEidNs4z8S1GBB8ptARw_';
+products476619[1]["ProductSKU"] = '0121676Z';
+products476619[1]["AAID"] = '200002333404';
+products476619[1]["CategoryName"] = '264048';
+products476619[1]["PromoShopID"] = 'QuelleRoot';
+products476619[1]["category_text"] = '... mehr Waschmaschinen';
+products476619[1]["category_linkid"] = '264048';
+function showProd476619(count) {
+var ProductLink = window.location.protocol + "//" + window.location.hostname + "/is-bin/INTERSHOP.enfinity/WFS/Quelle-quelle_de-Site/de_DE/-/EUR/Q_DisplayProductInformation-Start;"+"sid"+"="+parse_enfsession+"?ProductSKU="+products476619[count]["ProductSKU"]+"&AAID="+products476619[count]["AAID"]+"&ProductRefID="+products476619[count]["ProductSKU"]+"@Quelle-quelle_de&CategoryName="+products476619[count]["CategoryName"]+"&PromoShopID="+products476619[count]["PromoShopID"]+"&Linktype=M";
+var CategoryLink = window.location.protocol + "//" + window.location.hostname + "/is-bin/INTERSHOP.enfinity/WFS/Quelle-quelle_de-Site/de_DE/-/EUR/Q_BrowseCatalog-Start;"+"sid"+"="+parse_enfsession+"?CategoryName="+products476619[count]["category_linkid"]+"&Linktype=M";
+var longdesc = products476619[count]["longdesc"].substr(0, 70);
+var shoptext = products476619[count]["category_text"];
+if (products476619[count]["longdesc"].length > 70) { longdesc = longdesc + ' ...';};
+document.write('<a href="'+ProductLink+'"><img src="'+products476619[count]["pic"]+'" width="112" height="95" border="0" alt=""></a>');
+document.write('<div style="position:relative;left:5px;top:8px;width:110px;height:80px;overflow:hidden;line-height:15px;">');
+document.write('<a href="'+ProductLink+'" style="font-face:arial;font-size:12px;font-weight:bold;text-decoration:underline;">'+products476619[count]["desc"]+'</a><br>');
+document.write(longdesc);
+document.write('</div><div style="position:relative;top:10px;left:5px;width:110px;">');
+if (products476619[count]["secondaryprice"] != '') {
+if (products476619[count]["secondaryprice"].length + products476619[count]["price"].length > 11) {
+document.write('<span id="pa_streichprice" class="q-trebuchet-12px-darkgrey">&euro; '+products476619[count]["secondaryprice"]+'</span>&nbsp;<br>');
+} else {
+document.write('<br><span id="pa_streichprice" class="q-trebuchet-12px-darkgrey">&euro; '+products476619[count]["secondaryprice"]+'</span>&nbsp;');
+}
+} else {
+if (products476619[count]["UVP"] != '') {
+document.write('<span id="pa_uvp" class="q-normal-12px-darkblue" style="color:#999999;">UVP*&nbsp;&euro;&nbsp;'+products476619[count]["UVP"]+'</span><br>');
+} else {
+document.write('<br>&nbsp;');
+}
+}
+if(products476619[count]["abPrice"] == '1') {
+document.write('<span class="q-bold-12px-red">ab &euro; '+products476619[count]["price"]+'</span></div>');
+} else {
+document.write('<span class="q-bold-12px-red">&euro; '+products476619[count]["price"]+'</span></div>');
+}
+document.write('<div style="position:relative;top:15px;width:120px;height:30px;float:left;background-color:#94bac1;overflow:hidden;">');
+if (products476619[count]["category_text"] != '') {
+document.write('<table border="0" cellpadding="2" cellspacing="0" width="100%" height="30"><tbody><tr><td valign="bottom"><a href="'+CategoryLink+'" style="color:white;font-face:arial;font-size:11px;font-weight:bold;text-decoration:none;">'+shoptext+'</a></td><td valign="bottom"><a href="'+CategoryLink+'"><img src="http://images.quelle.de/is-bin/intershop.static/WFS/Quelle-quelle_de-Site/-/de_DE/imagesOnline/pfeil_10x13.gif" border="0" style="position:relative;"></a></td></tr></tbody></table>');
+}
+document.write('</div>');
+}
+//-->
+</script>
+<div style="position:relative;width:245px;height:260px;overflow:hidden;background-color:#94bac1;">
+<div style="position:relative;width:120px;height:255px;background-color:white;float:left;">
+<script type="text/javascript">
+<!--
+showProd476619(prodcount476619);
+prodcount476619++;
+//-->
+</script>
+</div>
+<div style="position:relative;width:5px;height:255px;overflow:hidden;float:left;background-color:white;">
+</div>
+<div style="position:relative;width:120px;height:255px;background-color:white;float:left;">
+<script type="text/javascript">
+<!--
+showProd476619(prodcount476619);
+prodcount476619++;
+//-->
+</script>
+</div>
+</div>
+<!-- TemplateEnd -->
+
+</div>
+<div style="position:absolute;overflow:hidden;width:245px;left:500px;top:675px;">
+  
+<!-- TemplateBegin : $Archive: //pvcssrv02.service.itellium.net/pvcsfs/b2ccc/pvcsprojekte/Q2_Gesamt/archives/enfinity/share/private/eCS/Store/templates/de/scc/component-types/1565.isml-arc $ $Revision: 1.3 $-->
+<script type="text/javascript">
+<!--
+var compID722898 = '722898';
+var prodcount722898 = 0;
+var products722898 = new Array();
+products722898[0] = new Object();
+products722898[0]["desc"] = 'K&Auml;RCHER Hochdruckreiniger';
+products722898[0]["longdesc"] = 'Perfekt f&uuml;r den Fr&uuml;hjarsputz!';
+products722898[0]["price"] = '89.99';
+products722898[0]["secondaryprice"] = '';
+products722898[0]["UVP"] = '';
+products722898[0]["abPrice"] = '';
+products722898[0]["pic"] = 'http://products.quelle.de/zc/bs/q1/images/5/6/e/56edae93917833678f41e5fc3fecee18.tif/JDAqxrSlXGIzEidNs4z8S1GBB8ptARw_';
+products722898[0]["ProductSKU"] = '0048931X';
+products722898[0]["AAID"] = '200000363373';
+products722898[0]["CategoryName"] = '250716';
+products722898[0]["PromoShopID"] = 'QuelleRoot';
+products722898[0]["category_text"] = '... mehr Gartentechnik';
+products722898[0]["category_linkid"] = '116664';
+products722898[1] = new Object();
+products722898[1]["desc"] = 'Pflanzkasten mit Blumenrankgitter';
+products722898[1]["longdesc"] = 'F&uuml;r Balkon oder Terasse';
+products722898[1]["price"] = '59.99';
+products722898[1]["secondaryprice"] = '';
+products722898[1]["UVP"] = '';
+products722898[1]["abPrice"] = '';
+products722898[1]["pic"] = 'http://products.quelle.de/zc/bs/q1/images/4/6/b/46b6a77695ebb54fb4ac5ca2c37db125.tif/JDAqxrSlXGIzEidNs4z8S1GBB8ptARw_';
+products722898[1]["ProductSKU"] = '0743623H';
+products722898[1]["AAID"] = '100000164234';
+products722898[1]["CategoryName"] = '267687';
+products722898[1]["PromoShopID"] = 'QuelleRoot';
+products722898[1]["category_text"] = '... mehr Gartendeko';
+products722898[1]["category_linkid"] = '267687';
+function showProd722898(count) {
+var ProductLink = window.location.protocol + "//" + window.location.hostname + "/is-bin/INTERSHOP.enfinity/WFS/Quelle-quelle_de-Site/de_DE/-/EUR/Q_DisplayProductInformation-Start;"+"sid"+"="+parse_enfsession+"?ProductSKU="+products722898[count]["ProductSKU"]+"&AAID="+products722898[count]["AAID"]+"&ProductRefID="+products722898[count]["ProductSKU"]+"@Quelle-quelle_de&CategoryName="+products722898[count]["CategoryName"]+"&PromoShopID="+products722898[count]["PromoShopID"]+"&Linktype=M";
+var CategoryLink = window.location.protocol + "//" + window.location.hostname + "/is-bin/INTERSHOP.enfinity/WFS/Quelle-quelle_de-Site/de_DE/-/EUR/Q_BrowseCatalog-Start;"+"sid"+"="+parse_enfsession+"?CategoryName="+products722898[count]["category_linkid"]+"&Linktype=M";
+var longdesc = products722898[count]["longdesc"].substr(0, 70);
+var shoptext = products722898[count]["category_text"];
+if (products722898[count]["longdesc"].length > 70) { longdesc = longdesc + ' ...';};
+document.write('<a href="'+ProductLink+'"><img src="'+products722898[count]["pic"]+'" width="112" height="95" border="0" alt=""></a>');
+document.write('<div style="position:relative;left:5px;top:8px;width:110px;height:80px;overflow:hidden;line-height:15px;">');
+document.write('<a href="'+ProductLink+'" style="font-face:arial;font-size:12px;font-weight:bold;text-decoration:underline;">'+products722898[count]["desc"]+'</a><br>');
+document.write(longdesc);
+document.write('</div><div style="position:relative;top:10px;left:5px;width:110px;">');
+if (products722898[count]["secondaryprice"] != '') {
+if (products722898[count]["secondaryprice"].length + products722898[count]["price"].length > 11) {
+document.write('<span id="pa_streichprice" class="q-trebuchet-12px-darkgrey">&euro; '+products722898[count]["secondaryprice"]+'</span>&nbsp;<br>');
+} else {
+document.write('<br><span id="pa_streichprice" class="q-trebuchet-12px-darkgrey">&euro; '+products722898[count]["secondaryprice"]+'</span>&nbsp;');
+}
+} else {
+if (products722898[count]["UVP"] != '') {
+document.write('<span id="pa_uvp" class="q-normal-12px-darkblue" style="color:#999999;">UVP*&nbsp;&euro;&nbsp;'+products722898[count]["UVP"]+'</span><br>');
+} else {
+document.write('<br>&nbsp;');
+}
+}
+if(products722898[count]["abPrice"] == '1') {
+document.write('<span class="q-bold-12px-red">ab &euro; '+products722898[count]["price"]+'</span></div>');
+} else {
+document.write('<span class="q-bold-12px-red">&euro; '+products722898[count]["price"]+'</span></div>');
+}
+document.write('<div style="position:relative;top:15px;width:120px;height:30px;float:left;background-color:#afa59d;overflow:hidden;">');
+if (products722898[count]["category_text"] != '') {
+document.write('<table border="0" cellpadding="2" cellspacing="0" width="100%" height="30"><tbody><tr><td valign="bottom"><a href="'+CategoryLink+'" style="color:white;font-face:arial;font-size:11px;font-weight:bold;text-decoration:none;">'+shoptext+'</a></td><td valign="bottom"><a href="'+CategoryLink+'"><img src="http://images.quelle.de/is-bin/intershop.static/WFS/Quelle-quelle_de-Site/-/de_DE/imagesOnline/pfeil_10x13.gif" border="0" style="position:relative;"></a></td></tr></tbody></table>');
+}
+document.write('</div>');
+}
+//-->
+</script>
+<div style="position:relative;width:245px;height:260px;overflow:hidden;background-color:#afa59d;">
+<div style="position:relative;width:120px;height:255px;background-color:white;float:left;">
+<script type="text/javascript">
+<!--
+showProd722898(prodcount722898);
+prodcount722898++;
+//-->
+</script>
+</div>
+<div style="position:relative;width:5px;height:255px;overflow:hidden;float:left;background-color:white;">
+</div>
+<div style="position:relative;width:120px;height:255px;background-color:white;float:left;">
+<script type="text/javascript">
+<!--
+showProd722898(prodcount722898);
+prodcount722898++;
+//-->
+</script>
+</div>
+</div>
+<!-- TemplateEnd -->
+
+</div>
+<div style="position:absolute;overflow:hidden;width:190px;left:765px;top:705px;">
+  
+<!-- TemplateBegin : $Archive: //pvcssrv02.service.itellium.net/pvcsfs/b2ccc/pvcsprojekte/Q2_Gesamt/archives/enfinity/share/private/eCS/Store/templates/de/scc/component-types/1518.isml-arc $ $Revision: 1.1 $-->
+<div style="position:relative;height:25px;width:190px;overflow:hidden;background:url('http://images.quelle.de/is-bin/intershop.static/WFS/Quelle-quelle_de-Site/-/de_DE/imagesOnline/q5_mw_header_bg.gif') repeat-x;">
+<div style="position:relative;top:5px;left:7px;">
+<span class="q-bold-12px-white" style="text-decoration:none;">Quelle in Ihrer N?he</span>
+</div>
+</div>
+<!-- TemplateEnd -->
+
+</div>
+<div style="position:absolute;overflow:hidden;width:190px;left:765px;top:730px;">
+  
+<!-- TemplateBegin : $Archive: //pvcssrv02.service.itellium.net/pvcsfs/b2ccc/pvcsprojekte/Q2_Gesamt/archives/enfinity/share/private/eCS/Store/templates/de/scc/component-types/1570.isml-arc $ $Revision: 1.3 $-->
+<div style="position:relative;width:190px;height:85px;overflow:hidden;background-color:white;">
+<form action="http://www.quelle.de/is-bin/INTERSHOP.enfinity/WFS/Quelle-quelle_de-Site/de_DE/-/EUR/Q_Shopfinder-Process" method="GET" name="formMask_mw">
+<div align="center" style="position:relative;left:5px;top:13px;width:180px;height:30px;">
+<select name="Show" size="1" style="width:170px;" class="q-normal-12px-darkblue">
+<option value="all"> Alle
+<option value="qtcs" > QUELLE Filialen *
+<option value="bas" > QUELLE-Bestellannahmen
+</select>
+</div>
+<div align="center" class="q-normal-12px-darkblue" style="position:relative;left:5px;top:6px;width:180px;height:30px;">
+PLZ: &nbsp;<input type="text" size="5" maxlength="5" name="ZipCode" class="q-normal-12px-darkblue"> &nbsp;<a href="javascript:document.formMask_mw.submit()" target="_self"><img src="http://images.quelle.de/is-bin/intershop.static/WFS/Quelle-quelle_de-Site/-/de_DE/imagesOnline/q5_sf_search.gif" border="0" style="position:relative;top:5px;"></a>
+<div style="font-size:smaller;padding:5px 5px 0px 5px; text-align:left">* Eigene und Partner-Filialen</div>
+</div>
+<input type="Hidden" name="City" value="">
+<input type="Hidden" name="Type" value="eTS">
+<input type="Hidden" name="CategoryName" value="qnav6000293">
+<input type="Hidden" name="Linktype" value="M">
+<input type="Hidden" name="PromoShopID" value="QuelleRoot">
+</form>
+</div>
+<!-- TemplateEnd -->
+
+</div>
+<div style="position:absolute;overflow:hidden;width:190px;left:765px;top:820px;">
+  
+<!-- TemplateBegin : $Archive: //pvcssrv02.service.itellium.net/pvcsfs/b2ccc/pvcsprojekte/Q2_Gesamt/archives/enfinity/share/private/eCS/Store/templates/de/scc/component-types/1518.isml-arc $ $Revision: 1.1 $-->
+<div style="position:relative;height:25px;width:190px;overflow:hidden;background:url('http://images.quelle.de/is-bin/intershop.static/WFS/Quelle-quelle_de-Site/-/de_DE/imagesOnline/q5_mw_header_bg.gif') repeat-x;">
+<div style="position:relative;top:5px;left:7px;">
+<a href="http://www.quelle.de/is-bin/INTERSHOP.enfinity/WFS/Quelle-quelle_de-Site/de_DE/-/EUR/Q_BrowseCatalog-Start?CategoryName=245730&PromoShopID=QuelleRoot&Linktype=M" class="q-bold-12px-white" style="text-decoration:none;">
+Sicheres Einkaufen</a>
+</div>
+</div>
+<!-- TemplateEnd -->
+
+</div>
+<div style="position:absolute;overflow:hidden;width:190px;left:765px;top:845px;">
+  
+<!-- TemplateBegin : $Archive: //pvcssrv02.service.itellium.net/pvcsfs/b2ccc/pvcsprojekte/Q2_Gesamt/archives/enfinity/share/private/eCS/Store/templates/de/scc/component-types/1560.isml-arc $ $Revision: 1.2 $-->
+<div style="position:relative;width:190px;height:70px;">
+
+<a href="http://www.quelle.de/is-bin/INTERSHOP.enfinity/WFS/Quelle-quelle_de-Site/de_DE/-/EUR/Q_BrowseCatalog-Start?CategoryName=273975&PromoShopID=QuelleRoot&Linktype=M" class="" style="">
+<img src="http://images.quelle.de/is-bin/intershop.static/WFS/Quelle-quelle_de-Site/-/de_DE/images/1f/hp_awards.gif" border="0" class="noStyle" alt=""></a>
+</div>
+<!-- TemplateEnd -->
+
+</div>
+<div style="position:absolute;overflow:hidden;width:190px;left:765px;top:920px;">
+  
+<!-- TemplateBegin : $Archive: //pvcssrv02.service.itellium.net/pvcsfs/b2ccc/pvcsprojekte/Q2_Gesamt/archives/enfinity/share/private/eCS/Store/templates/de/scc/component-types/1518.isml-arc $ $Revision: 1.1 $-->
+<div style="position:relative;height:25px;width:190px;overflow:hidden;background:url('http://images.quelle.de/is-bin/intershop.static/WFS/Quelle-quelle_de-Site/-/de_DE/imagesOnline/q5_mw_header_bg.gif') repeat-x;">
+<div style="position:relative;top:5px;left:7px;">
+<span class="q-bold-12px-white" style="text-decoration:none;">Extra profitieren mit Quelle</span>
+</div>
+</div>
+<!-- TemplateEnd -->
+
+</div>
+<div style="position:absolute;overflow:hidden;width:150px;left:0px;top:945px;">
+ <!-- TemplateBegin : $Archive:   //pvcssrv02.service.itellium.net/pvcsfs/b2ccc/pvcsprojekte/Q2_Gesamt/archives/enfinity/share/private/eCS/Store/templates/de/scc/component-types/1575.isml-arc  $ $Revision: 8195 $-->
+
+
+
+
+
+<div style="position:relative;width:150px;height:20px;text-align:left;color:#003399;background-color:white;overflow:hidden;">
+	<div style="position:absolute;left:7px;top:5px;width:136px;height:10px;">
+	<span style="font: normal bold 12px Arial;color:#003399;text-decoration:none;">Marken bei QUELLE</span>
+	</div>	
+</div>
+
+
+
+
+
+<!-- TemplateEnd -->
+
+</div>
+<div style="position:absolute;overflow:hidden;width:190px;left:765px;top:945px;">
+  
+<!-- TemplateBegin : $Archive: //pvcssrv02.service.itellium.net/pvcsfs/b2ccc/pvcsprojekte/Q2_Gesamt/archives/enfinity/share/private/eCS/Store/templates/de/scc/component-types/1519.isml-arc $ $Revision: 1.1 $-->
+<div style="position:relative;width:190px;height:25px;">
+<div style="position:relative;width:190px;height:24px;overflow:hidden;background-color:white;">
+<div style="position:absolute;left:6px;top:4px;">
+<a href="http://www.quelle.de/is-bin/INTERSHOP.enfinity/WFS/Quelle-quelle_de-Site/de_DE/-/EUR/Q_ViewStatic-ViewPage?ProductSKU=static2449&PromoShopID=QuelleRoot&Linktype=M" class="q-normal-12px-darkblue">
+Profi Partner werden</a>
+</div>
+</div>
+</div>
+<!-- TemplateEnd -->
+
+</div>
+<div style="position:absolute;overflow:hidden;width:75px;left:0px;top:970px;">
+  
+<!-- TemplateBegin : $Archive: //pvcssrv02.service.itellium.net/pvcsfs/b2ccc/pvcsprojekte/Q2_Gesamt/archives/enfinity/share/private/eCS/Store/templates/de/scc/component-types/1560.isml-arc $ $Revision: 1.2 $-->
+<div style="position:relative;width:75px;height:36px;">
+
+<a href="http://www.quelle.de/is-bin/INTERSHOP.enfinity/WFS/Quelle-quelle_de-Site/de_DE/-/EUR/Q_BrowseCatalog-Start?CategoryName=114184&PromoShopID=QuelleRoot&Linktype=M" class="" style="">
+<img src="http://images.quelle.de/is-bin/intershop.static/WFS/Quelle-quelle_de-Site/-/de_DE/images/9f/HP_Marke_adidas.gif" border="0" class="noStyle" alt=""></a>
+</div>
+<!-- TemplateEnd -->
+
+</div>
+<div style="position:absolute;overflow:hidden;width:75px;left:75px;top:970px;">
+  
+<!-- TemplateBegin : $Archive: //pvcssrv02.service.itellium.net/pvcsfs/b2ccc/pvcsprojekte/Q2_Gesamt/archives/enfinity/share/private/eCS/Store/templates/de/scc/component-types/1560.isml-arc $ $Revision: 1.2 $-->
+<div style="position:relative;width:75px;height:36px;">
+
+<a href="http://www.quelle.de/is-bin/INTERSHOP.enfinity/WFS/Quelle-quelle_de-Site/de_DE/-/EUR/Q_BrowseCatalog-Start?CategoryName=251631&PromoShopID=QuelleRoot&Linktype=M" class="" style="">
+<img src="http://images.quelle.de/is-bin/intershop.static/WFS/Quelle-quelle_de-Site/-/de_DE/images/ff/HP_Marke_casamaxx.gif" border="0" class="noStyle" alt=""></a>
+</div>
+<!-- TemplateEnd -->
+
+</div>
+<div style="position:absolute;overflow:hidden;width:75px;left:150px;top:970px;">
+  
+<!-- TemplateBegin : $Archive: //pvcssrv02.service.itellium.net/pvcsfs/b2ccc/pvcsprojekte/Q2_Gesamt/archives/enfinity/share/private/eCS/Store/templates/de/scc/component-types/1560.isml-arc $ $Revision: 1.2 $-->
+<div style="position:relative;width:75px;height:36px;">
+
+<a href="http://www.quelle.de/is-bin/INTERSHOP.enfinity/WFS/Quelle-quelle_de-Site/de_DE/-/EUR/Q_BrowseCatalog-Start?CategoryName=256260&PromoShopID=QuelleRoot&Linktype=M" class="" style="">
+<img src="http://images.quelle.de/is-bin/intershop.static/WFS/Quelle-quelle_de-Site/-/de_DE/images/27/HP_Marke_esprit.gif" border="0" class="noStyle" alt=""></a>
+</div>
+<!-- TemplateEnd -->
+
+</div>
+<div style="position:absolute;overflow:hidden;width:75px;left:225px;top:970px;">
+  
+<!-- TemplateBegin : $Archive: //pvcssrv02.service.itellium.net/pvcsfs/b2ccc/pvcsprojekte/Q2_Gesamt/archives/enfinity/share/private/eCS/Store/templates/de/scc/component-types/1560.isml-arc $ $Revision: 1.2 $-->
+<div style="position:relative;width:75px;height:36px;">
+
+<a href="http://www.quelle.de/is-bin/INTERSHOP.enfinity/WFS/Quelle-quelle_de-Site/de_DE/-/EUR/Q_FreeSearch-Start?search_free=fujitsu&PromoShopID=QuelleRoot&Linktype=M" class="" style="">
+<img src="http://images.quelle.de/is-bin/intershop.static/WFS/Quelle-quelle_de-Site/-/de_DE/images/a7/Hp_Marke_FujitsuSiemens.gif" border="0" class="noStyle" alt=""></a>
+</div>
+<!-- TemplateEnd -->
+
+</div>
+<div style="position:absolute;overflow:hidden;width:75px;left:300px;top:970px;">
+  
+<!-- TemplateBegin : $Archive: //pvcssrv02.service.itellium.net/pvcsfs/b2ccc/pvcsprojekte/Q2_Gesamt/archives/enfinity/share/private/eCS/Store/templates/de/scc/component-types/1560.isml-arc $ $Revision: 1.2 $-->
+<div style="position:relative;width:75px;height:36px;">
+
+<a href="http://www.quelle.de/is-bin/INTERSHOP.enfinity/WFS/Quelle-quelle_de-Site/de_DE/-/EUR/Q_BrowseCatalog-Start?CategoryName=223659&PromoShopID=QuelleRoot&Linktype=M" class="" style="">
+<img src="http://images.quelle.de/is-bin/intershop.static/WFS/Quelle-quelle_de-Site/-/de_DE/images/e3/HP_Marke_Mexx.gif" border="0" class="noStyle" alt=""></a>
+</div>
+<!-- TemplateEnd -->
+
+</div>
+<div style="position:absolute;overflow:hidden;width:75px;left:375px;top:970px;">
+  
+<!-- TemplateBegin : $Archive: //pvcssrv02.service.itellium.net/pvcsfs/b2ccc/pvcsprojekte/Q2_Gesamt/archives/enfinity/share/private/eCS/Store/templates/de/scc/component-types/1560.isml-arc $ $Revision: 1.2 $-->
+<div style="position:relative;width:75px;height:36px;">
+
+<a href="http://www.quelle.de/is-bin/INTERSHOP.enfinity/WFS/Quelle-quelle_de-Site/de_DE/-/EUR/Q_BrowseCatalog-Start?CategoryName=200388&PromoShopID=QuelleRoot&Linktype=M" class="" style="">
+<img src="http://images.quelle.de/is-bin/intershop.static/WFS/Quelle-quelle_de-Site/-/de_DE/images/ae/HP_Marke_privileg.gif" border="0" class="noStyle" alt=""></a>
+</div>
+<!-- TemplateEnd -->
+
+</div>
+<div style="position:absolute;overflow:hidden;width:75px;left:450px;top:970px;">
+  
+<!-- TemplateBegin : $Archive: //pvcssrv02.service.itellium.net/pvcsfs/b2ccc/pvcsprojekte/Q2_Gesamt/archives/enfinity/share/private/eCS/Store/templates/de/scc/component-types/1560.isml-arc $ $Revision: 1.2 $-->
+<div style="position:relative;width:75px;height:36px;">
+
+<a href="http://www.quelle.de/is-bin/INTERSHOP.enfinity/WFS/Quelle-quelle_de-Site/de_DE/-/EUR/Q_BrowseCatalog-Start?CategoryName=116286&PromoShopID=QuelleRoot&Linktype=M" class="" style="">
+<img src="http://images.quelle.de/is-bin/intershop.static/WFS/Quelle-quelle_de-Site/-/de_DE/images/17/HP_Marke_puma.gif" border="0" class="noStyle" alt=""></a>
+</div>
+<!-- TemplateEnd -->
+
+</div>
+<div style="position:absolute;overflow:hidden;width:75px;left:525px;top:970px;">
+  
+<!-- TemplateBegin : $Archive: //pvcssrv02.service.itellium.net/pvcsfs/b2ccc/pvcsprojekte/Q2_Gesamt/archives/enfinity/share/private/eCS/Store/templates/de/scc/component-types/1560.isml-arc $ $Revision: 1.2 $-->
+<div style="position:relative;width:75px;height:36px;">
+
+<a href="http://www.quelle.de/is-bin/INTERSHOP.enfinity/WFS/Quelle-quelle_de-Site/de_DE/-/EUR/Q_BrowseCatalog-Start?CategoryName=112499&PromoShopID=QuelleRoot&Linktype=M" class="" style="">
+<img src="http://images.quelle.de/is-bin/intershop.static/WFS/Quelle-quelle_de-Site/-/de_DE/images/f2/HP_Marke_Sony.gif" border="0" class="noStyle" alt=""></a>
+</div>
+<!-- TemplateEnd -->
+
+</div>
+<div style="position:absolute;overflow:hidden;width:65px;left:600px;top:970px;">
+  
+<!-- TemplateBegin : $Archive: //pvcssrv02.service.itellium.net/pvcsfs/b2ccc/pvcsprojekte/Q2_Gesamt/archives/enfinity/share/private/eCS/Store/templates/de/scc/component-types/1560.isml-arc $ $Revision: 1.2 $-->
+<div style="position:relative;width:65px;height:36px;">
+
+<a href="http://www.quelle.de/is-bin/INTERSHOP.enfinity/WFS/Quelle-quelle_de-Site/de_DE/-/EUR/Q_BrowseCatalog-Start?CategoryName=274512&PromoShopID=QuelleRoot&Linktype=M" class="" style="">
+<img src="http://images.quelle.de/is-bin/intershop.static/WFS/Quelle-quelle_de-Site/-/de_DE/images/f3/hp_marke_wmf_neu2.gif" border="0" class="noStyle" alt=""></a>
+</div>
+<!-- TemplateEnd -->
+
+</div>
+<div style="position:absolute;overflow:hidden;width:190px;left:765px;top:970px;">
+  
+<!-- TemplateBegin : $Archive: //pvcssrv02.service.itellium.net/pvcsfs/b2ccc/pvcsprojekte/Q2_Gesamt/archives/enfinity/share/private/eCS/Store/templates/de/scc/component-types/1519.isml-arc $ $Revision: 1.1 $-->
+<div style="position:relative;width:190px;height:25px;">
+<div style="position:relative;width:190px;height:24px;overflow:hidden;background-color:white;">
+<div style="position:absolute;left:6px;top:4px;">
+<a href="http://www.quelle.de/is-bin/INTERSHOP.enfinity/WFS/Quelle-quelle_de-Site/de_DE/-/EUR/Q_BrowseCatalog-Start?CategoryName=265365&PromoShopID=QuelleRoot&Linktype=M" class="q-normal-12px-darkblue">
+Freunde werben Freunde</a>
+</div>
+</div>
+</div>
+<!-- TemplateEnd -->
+
+</div>
+<div style="position:absolute;overflow:hidden;width:75px;left:665px;top:980px;">
+ <!-- TemplateBegin : $Archive:   //pvcssrv02.service.itellium.net/pvcsfs/b2ccc/pvcsprojekte/Q2_Gesamt/archives/enfinity/share/private/eCS/Store/templates/de/scc/component-types/1575.isml-arc  $ $Revision: 8195 $-->
+
+
+
+
+
+<div style="position:relative;width:75px;height:20px;text-align:left;color:#003399;background-color:white;overflow:hidden;">
+	<div style="position:absolute;left:7px;top:5px;width:61px;height:10px;">
+	
+
+
+
+
+
+<a href="http://www.quelle.de/is-bin/INTERSHOP.enfinity/WFS/Quelle-quelle_de-Site/de_DE/-/EUR/Q_BrowseCatalog-Start?CategoryName=242112&PromoShopID=QuelleRoot&Linktype=M" class="none" style="font: normal normal 10px Arial;color:#003399;text-decoration:underline;">
+Alle Marken</a>
+	</div>	
+</div>
+
+
+
+
+
+<!-- TemplateEnd -->
+
+</div>
+<div style="position:absolute;overflow:hidden;width:190px;left:765px;top:995px;">
+  
+<!-- TemplateBegin : $Archive: //pvcssrv02.service.itellium.net/pvcsfs/b2ccc/pvcsprojekte/Q2_Gesamt/archives/enfinity/share/private/eCS/Store/templates/de/scc/component-types/1519.isml-arc $ $Revision: 1.1 $-->
+<div style="position:relative;width:190px;height:25px;">
+<div style="position:relative;width:190px;height:24px;overflow:hidden;background-color:white;">
+<div style="position:absolute;left:6px;top:4px;">
+<a href="http://www.quelle.de/is-bin/INTERSHOP.enfinity/WFS/Quelle-quelle_de-Site/de_DE/-/EUR/Q_ViewStatic-ViewPage2?CategoryName=qnav6000007&ProductSKU=static2974&PromoShopID=QuelleRoot&Linktype=M" class="q-normal-12px-darkblue">
+Internet-Partnerprogramm</a>
+</div>
+</div>
+</div>
+<!-- TemplateEnd -->
+
+</div>
+<div style="position:absolute;overflow:hidden;width:150px;left:0px;top:1015px;">
+ <!-- TemplateBegin : $Archive:   //pvcssrv02.service.itellium.net/pvcsfs/b2ccc/pvcsprojekte/Q2_Gesamt/archives/enfinity/share/private/eCS/Store/templates/de/scc/component-types/1575.isml-arc  $ $Revision: 8195 $-->
+
+
+
+
+
+<div style="position:relative;width:150px;height:20px;text-align:left;color:#003399;background-color:white;overflow:hidden;">
+	<div style="position:absolute;left:7px;top:5px;width:136px;height:10px;">
+	<span style="font: normal bold 12px Arial;color:#003399;text-decoration:none;">Unser Versandpartner</span>
+	</div>	
+</div>
+
+
+
+
+
+<!-- TemplateEnd -->
+
+</div>
+<div style="position:absolute;overflow:hidden;width:75px;left:5px;top:1040px;">
+  
+<!-- TemplateBegin : $Archive: //pvcssrv02.service.itellium.net/pvcsfs/b2ccc/pvcsprojekte/Q2_Gesamt/archives/enfinity/share/private/eCS/Store/templates/de/scc/component-types/1560.isml-arc $ $Revision: 1.2 $-->
+<div style="position:relative;width:75px;height:36px;">
+
+<a href="http://www.quelle.de/is-bin/INTERSHOP.enfinity/WFS/Quelle-quelle_de-Site/de_DE/-/EUR/Q_BrowseCatalog-Start?CategoryName=287325&PromoShopID=QuelleRoot&Linktype=M" class="" style="">
+<img src="http://images.quelle.de/is-bin/intershop.static/WFS/Quelle-quelle_de-Site/-/de_DE/images/e2/dhl_logo_75x36.gif" border="0" class="noStyle" alt=""></a>
+</div>
+<!-- TemplateEnd -->
+
+</div>
+</div>
+<div style="color:#636363;position:relative;padding-top:5px;padding-left:12px;height:25px;overflow:hidden;" class="q-normal-12px-darkblue">
+&nbsp;&nbsp;*) UVP = Unverbindliche Preisempfehlung des Herstellers
+</div>
+
+<div class="q-spacer" style="height:10px;">&nbsp;</div>
+
+</div>
+</div>
+<!-- Template Begin:  inc/q5_pg_footer_ecs.isml (sld_ch_quelle_app) -->
+
+
+<!-- Template Begin:  inc/q5_pg_footer_content.isml (sld_ch_quelle_app) -->
+
+
+
+
+
+
+
+
+
+<div id="footer-container">
+<div id="footer-verlauf">&nbsp;</div>
+<div id="footer-inhalt">
+<div id="footer-inhalt-txt3" class="q5-footer">
+Preisangaben inkl. gesetzl. MwSt. und zzgl. <a class="q5-footer link" href="http://www.quelle.de/is-bin/INTERSHOP.enfinity/WFS/Quelle-quelle_de-Site/de_DE/-/EUR/Q_ViewStatic-ViewPage?ProductSKU=static1046&PromoShopID=241494&Linktype=M">Service- &amp; Versandkosten</a><br>
+Quelle - Das Versandhaus pr?sentiert ein Sortiment aus Mode f?r <a class="q5-footer link" href="http://www.quelle.de/Mode-fuer-SIE/">Sie</a> und <a class="q5-footer link" href="http://www.quelle.de/Mode-fuer-IHN/">Ihn</a>, <a class="q5-footer link" href="http://www.quelle.de/Technik-Multimedia/">Technik</a>, <a class="q5-footer link" href="http://www.quelle.de/Wohnen-Haushalt/">Haushalt</a> ...
+</div>
+<div id="footer-inhalt-txt" class="q5-footer" >
+<a class="q5-footer link" href="http://www.quelle.de/is-bin/INTERSHOP.enfinity/WFS/Quelle-quelle_de-Site/de_DE/-/EUR/Q_ViewStatic-ViewPage?ProductSKU=static1510&Linktype=AD">Kontakt</a>
+&nbsp;|&nbsp;
+<a class="q5-footer link" href="http://www.quelle.de/is-bin/INTERSHOP.enfinity/WFS/Quelle-quelle_de-Site/de_DE/-/EUR/Q_ViewStatic-ViewPage?ProductSKU=static1021&Linktype=AD">AGB</a>
+&nbsp;|&nbsp;
+<a class="q5-footer link" href="http://www.quelle.de/is-bin/INTERSHOP.enfinity/WFS/Quelle-quelle_de-Site/de_DE/-/EUR/Q_ViewStatic-ViewPage?ProductSKU=static1034&Linktype=AD">Datenschutz</a>
+&nbsp;|&nbsp;
+<a class="q5-footer link" href="http://www.quelle.de/is-bin/INTERSHOP.enfinity/WFS/Quelle-quelle_de-Site/de_DE/-/EUR/Q_ViewStatic-ViewPage?ProductSKU=static2565&Linktype=AD">Impressum</a>
+&nbsp;|&nbsp;
+<a class="q5-footer link" href="http://www.quelle.de/is-bin/INTERSHOP.enfinity/WFS/Quelle-quelle_de-Site/de_DE/-/EUR/Q_ViewStatic-ViewPage?ProductSKU=static1003&Linktype=AD">Jobs &amp; Karriere</a>
+&nbsp;|&nbsp;
+<a class="q5-footer link" href="http://www.quelle.de/is-bin/INTERSHOP.enfinity/WFS/Quelle-quelle_de-Site/de_DE/-/EUR/Q_ViewStatic-ViewPage?ProductSKU=static2313&Linktype=AD">&Uuml;ber Quelle</a>
+&nbsp;|&nbsp;
+<a class="q5-footer link" href="http://www.quelle.de/versand/arcandor.html">Arcandor-Unternehmensgruppe</a>
+&nbsp;|&nbsp;
+<a class="q5-footer link" href="#" onclick="javascript:window.open('http://www.quelle.de/is-bin/INTERSHOP.enfinity/WFS/Quelle-quelle_de-Site/de_DE/-/EUR/Q_ViewStatic-ViewPage?ProductSKU=static2904&Linktype=AD','presse','status=1,scrollbars=1,toolbar=1,location=1,resizable=1,height=550,width=840')">Presse</a>
+&nbsp;|&nbsp;
+<a class="q5-footer link" href="http://www.quelle.de/is-bin/INTERSHOP.enfinity/WFS/Quelle-quelle_de-Site/de_DE/-/EUR/Q_ViewStatic-ViewPage?ProductSKU=static1512&Linktype=AD">Hilfe</a>
+&nbsp;|&nbsp;
+<a class="q5-footer link" href="http://www.quelle.de/is-bin/INTERSHOP.enfinity/WFS/Quelle-quelle_de-Site/de_DE/-/EUR/Q_ViewStatic-ViewPage?ProductSKU=static2731&Linktype=AD">Service & Beratung</a>
+&nbsp;|&nbsp;
+<a class="q5-footer link" href="http://www.quelle.de/is-bin/INTERSHOP.enfinity/WFS/Quelle-quelle_de-Site/de_DE/-/EUR/Q_ViewStatic-ViewPage?ProductSKU=static2488&Linktype=AD">Sicher einkaufen</a>
+</div>
+<div id="footer-inhalt-txt2" class="q5-footer">
+<a class="q5-footer link" href="http://www.quelle.de/Aktuelles/" style="text-decoration:none;">QUELLE GmbH 2008</a>
+</div>
+</div>
+</div>
+
+<div style="display: none;"><a href="http://www.quelle.de">Quelle Produktverzeichnis</a></div>
+<script type="text/javascript">
+<!--
+try {QTCMWPosition();}
+catch (e) {}
+//-->
+</script>
+
+<script type="text/javascript">
+<!--
+var b1 = document.body;
+try {
+if (b1)
+{
+var oldfunc = window.onload;
+if(typeof window.onload != 'function'){
+window.onload=function () {
+basic_onload();
+if(!storefront) {
+DSLCheckUp ();
+}
+}
+}else{
+window.onload = function() {
+//oldfunc();
+basic_onload();
+if(!storefront) {
+DSLCheckUp ();
+}
+}
+}
+}
+}
+catch (e) {}
+
+if (window.location.protocol == "https:") {
+document.write('<scr'+'ipt type="text/javascr'+'ipt" src="https://www.quelle.de/is-bin/INTERSHOP.enfinity/WFS/Quelle-quelle_de-Site/de_DE/-/EUR/Q_BrowseCatalog-StartRootCategories?NavigationBarReloaded="><\/scr'+'ipt>');
+} else {
+document.write('<scr'+'ipt type="text/javascr'+'ipt" src="http://www.quelle.de/is-bin/INTERSHOP.enfinity/WFS/Quelle-quelle_de-Site/de_DE/-/EUR/Q_BrowseCatalog-StartRootCategories?NavigationBarReloaded="><\/scr'+'ipt>');
+}
+
+//-->
+</script>
+<!-- QBuild: v11_30_48 20183 2008-05-06_123930 -->
+<!-- Template End: inc/q5_pg_footer_content.isml (sld_ch_quelle_app) -->
+
+
+
+
+
+
+
+
+
+
+<style type="text/css">
+<!--
+.q-private-normal-12px-darkblue-ul{position:relative;float:left;}
+-->
+</style>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+</div>
+<div class="q-history" style="width:745px;height:32px;overflow:hidden;">
+<table style="width:100%;"><tr style="height:32px;"><td style="vertical-align:middle; font-size:12px;">
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+<span class="q5-history"><b>Sie sind hier: &gt;</b></span>
+
+
+<!-- TemplateEnd -->
+
+
+
+</td></tr></table>
+</div>
+<div>
+
+
+</body>
+</html>

Copied: trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/html-utf16-leading-whitespace-wrong-extension.doc (from rev 976, trunk/dna-repository/src/test/resources/docs/html-utf16-leading-whitespace-wrong-extension.doc)
===================================================================
(Binary files differ)

Copied: trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/icaltestdata/Todos1.ics (from rev 976, trunk/dna-repository/src/test/resources/docs/icaltestdata/Todos1.ics)
===================================================================
--- trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/icaltestdata/Todos1.ics	                        (rev 0)
+++ trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/icaltestdata/Todos1.ics	2009-06-04 22:31:30 UTC (rev 977)
@@ -0,0 +1,63 @@
+BEGIN:VCALENDAR
+VERSION:2.0
+X-WR-CALNAME:random...
+PRODID:-//Apple Computer\, Inc//iCal 1.5//EN
+X-WR-RELCALID:761181FD-5338-11D8-A876-000A958826AA
+X-WR-TIMEZONE:Europe/Rome
+CALSCALE:GREGORIAN
+METHOD:PUBLISH
+BEGIN:VTIMEZONE
+TZID:Europe/Lisbon
+LAST-MODIFIED:20040130T152457Z
+BEGIN:STANDARD
+DTSTART:20031026T010000
+TZOFFSETTO:+0000
+TZOFFSETFROM:+0000
+TZNAME:WET
+END:STANDARD
+BEGIN:DAYLIGHT
+DTSTART:20040328T010000
+TZOFFSETTO:+0100
+TZOFFSETFROM:+0000
+TZNAME:WEST
+END:DAYLIGHT
+END:VTIMEZONE
+BEGIN:VTIMEZONE
+TZID:Europe/Rome
+LAST-MODIFIED:20040130T152457Z
+BEGIN:STANDARD
+DTSTART:20031026T010000
+TZOFFSETTO:+0100
+TZOFFSETFROM:+0000
+TZNAME:CET
+END:STANDARD
+BEGIN:DAYLIGHT
+DTSTART:20040328T030000
+TZOFFSETTO:+0200
+TZOFFSETFROM:+0100
+TZNAME:CEST
+END:DAYLIGHT
+END:VTIMEZONE
+BEGIN:VTODO
+PRIORITY:2
+DTSTAMP:20031126T051950Z
+UID:76116BB6-5338-11D8-A876-000A958826AA
+SEQUENCE:1
+STATUS:COMPLETED
+DTSTART;TZID=Europe/Lisbon:20031103T193251
+SUMMARY:CSS for Accessibility stuff
+COMPLETED:20031125T130000Z
+END:VTODO
+BEGIN:VTODO
+PRIORITY:1
+DTSTAMP:20040130T152344Z
+UID:7611710A-5338-11D8-A876-000A958826AA
+SEQUENCE:3
+URL;VALUE=URI:http://www.w3.org/2004/01/ideas/
+STATUS:COMPLETED
+DTSTART;TZID=Europe/Rome:20031217T133610
+SUMMARY:project page
+COMPLETED:20040129T230000Z
+DUE:20031216T000000Z
+END:VTODO
+END:VCALENDAR

Copied: trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/icaltestdata/basicCalendar.ics (from rev 976, trunk/dna-repository/src/test/resources/docs/icaltestdata/basicCalendar.ics)
===================================================================
--- trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/icaltestdata/basicCalendar.ics	                        (rev 0)
+++ trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/icaltestdata/basicCalendar.ics	2009-06-04 22:31:30 UTC (rev 977)
@@ -0,0 +1,6 @@
+BEGIN:VCALENDAR
+CALSCALE:GREGORIAN
+PRODID:-//Apple Computer\, Inc//iCal 1.0//EN
+VERSION:2.0
+METHOD:PUBLISH
+END:VCALENDAR
\ No newline at end of file

Copied: trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/icaltestdata/cal01-1.ics (from rev 976, trunk/dna-repository/src/test/resources/docs/icaltestdata/cal01-1.ics)
===================================================================
--- trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/icaltestdata/cal01-1.ics	                        (rev 0)
+++ trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/icaltestdata/cal01-1.ics	2009-06-04 22:31:30 UTC (rev 977)
@@ -0,0 +1,79 @@
+BEGIN:VCALENDAR
+CALSCALE:GREGORIAN
+PRODID:-//Ximian//NONSGML Evolution Calendar//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/softwarestudio.org/Olson_20011030_5/America/New_York
+TZURL:http://timezones.r.us.net/tz/US-California-Los_Angeles
+BEGIN:STANDARD
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+TZNAME:EST
+DTSTART:19701025T020000
+RRULE:FREQ=YEARLY;INTERVAL=1;BYDAY=-1SU;BYMONTH=10
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+TZNAME:EDT
+DTSTART:19700405T020000
+RRULE:FREQ=YEARLY;INTERVAL=1;BYDAY=1SU;BYMONTH=4
+END:DAYLIGHT
+END:VTIMEZONE
+BEGIN:VEVENT
+UID:20020630T230353Z-3895-69-1-0 at jammer
+DTSTAMP:20020630T230353Z
+DTSTART;TZID=/softwarestudio.org/Olson_20011030_5/America/New_York:
+ 20020630T090000
+DTEND;TZID=/softwarestudio.org/Olson_20011030_5/America/New_York:
+ 20020630T103000  
+TRANSP:OPAQUE
+SEQUENCE:2
+SUMMARY:Church
+CLASS:PRIVATE
+RRULE:FREQ=WEEKLY;INTERVAL=1;BYDAY=SU
+END:VEVENT
+BEGIN:VEVENT
+UID:20020630T230445Z-3895-69-1-7 at jammer
+DTSTAMP:20020630T230445Z
+DTSTART;VALUE=DATE:20020703
+DTEND;VALUE=DATE:20020706
+TRANSP:OPAQUE
+SEQUENCE:3
+SUMMARY:Scooby Conference Rules
+LOCATION:San Francisco
+CONTACT:Jim Dolittle\, ABC Industries\, +1-919-555-1234
+DESCRIPTION:can't wait!\n
+CATEGORIES:Miscellaneous
+CLASS:PUBLIC
+BEGIN:VALARM
+X-EVOLUTION-ALARM-UID:20020701T033628Z-3895-69-1-48 at jammer
+TRIGGER;RELATED=START:-PT30M
+ACTION:DISPLAY
+DESCRIPTION:Federal Reserve Board Meeting
+END:VALARM
+END:VEVENT
+BEGIN:VEVENT
+UID:20020630T230600Z-3895-69-1-16 at jammer
+DTSTAMP:20020630T230600Z
+DTSTART;TZID=/softwarestudio.org/Olson_20011030_5/America/New_York:
+ 20020718T090000
+DTEND;TZID=/softwarestudio.org/Olson_20011030_5/America/New_York:
+ 20020718T093000
+TRANSP:OPAQUE
+SEQUENCE:3
+SUMMARY:Federal Reserve Board Meeting
+CLASS:PUBLIC
+ORGANIZER;CN=Dan Connolly:MAILTO:connolly at w3.org
+ATTENDEE;CUTYPE=INDIVIDUAL;ROLE=REQ-PARTICIPANT;PARTSTAT=NEEDS-ACTION;
+ RSVP=TRUE;LANGUAGE=en:MAILTO:hoopy at frood.example
+ATTENDEE;CUTYPE=INDIVIDUAL;ROLE=OPT-PARTICIPANT;PARTSTAT=NEEDS-ACTION;
+ RSVP=TRUE;LANGUAGE=en:MAILTO:prefect at ford.example
+BEGIN:VALARM
+X-EVOLUTION-ALARM-UID:20020701T033628Z-3895-69-1-22 at jammer
+TRIGGER;VALUE=DURATION;RELATED=START:-PT15M
+ACTION:DISPLAY
+DESCRIPTION:Federal Reserve Board Meeting
+END:VALARM
+END:VEVENT
+END:VCALENDAR

Copied: trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/icaltestdata/cal01-2.ics (from rev 976, trunk/dna-repository/src/test/resources/docs/icaltestdata/cal01-2.ics)
===================================================================
--- trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/icaltestdata/cal01-2.ics	                        (rev 0)
+++ trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/icaltestdata/cal01-2.ics	2009-06-04 22:31:30 UTC (rev 977)
@@ -0,0 +1,79 @@
+BEGIN:VCALENDAR
+CALSCALE:GREGORIAN
+PRODID:-//Ximian//NONSGML Evolution Calendar//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/softwarestudio.org/Olson_20011030_5/America/New_York
+TZURL:http://timezones.r.us.net/tz/US-California-Los_Angeles2
+BEGIN:STANDARD
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+TZNAME:EST
+DTSTART:19701025T020000
+RRULE:FREQ=YEARLY;INTERVAL=1;BYDAY=-1SU;BYMONTH=10
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+TZNAME:EDT
+DTSTART:19700405T020000
+RRULE:FREQ=YEARLY;INTERVAL=1;BYDAY=1SU;BYMONTH=4
+END:DAYLIGHT
+END:VTIMEZONE
+BEGIN:VEVENT
+UID:20020630T230353Z-3895-69-1-0 at jammer
+DTSTAMP:20020630T230353Z
+DTSTART;TZID=/softwarestudio.org/Olson_20011030_5/America/New_York:
+ 20020630T090000
+DTEND;TZID=/softwarestudio.org/Olson_20011030_5/America/New_York:
+ 20020630T103000  
+TRANSP:OPAQUE
+SEQUENCE:2
+SUMMARY:Church
+CLASS:PRIVATE
+RRULE:FREQ=WEEKLY;INTERVAL=1;BYDAY=SU
+END:VEVENT
+BEGIN:VEVENT
+UID:20020630T230445Z-3895-69-1-7 at jammer
+DTSTAMP:20020630T230445Z
+DTSTART;VALUE=DATE:20020703
+DTEND;VALUE=DATE:20020706
+TRANSP:OPAQUE
+SEQUENCE:2
+SUMMARY:Scooby Conference
+LOCATION:San Francisco
+CONTACT:Jim Dolittle\, ABC Industries\, +1-919-555-1234
+DESCRIPTION:can't wait!\n
+CATEGORIES:Miscellaneous
+CLASS:PUBLIC
+BEGIN:VALARM
+X-EVOLUTION-ALARM-UID:20020701T033628Z-3895-69-1-48 at jammer
+TRIGGER;RELATED=START:-PT30M
+ACTION:DISPLAY
+DESCRIPTION:Federal Reserve Board Meeting
+END:VALARM
+END:VEVENT
+BEGIN:VEVENT
+UID:20020630T230600Z-3895-69-1-16 at jammer
+DTSTAMP:20020630T230600Z
+DTSTART;TZID=/softwarestudio.org/Olson_20011030_5/America/New_York:
+ 20020718T090000
+DTEND;TZID=/softwarestudio.org/Olson_20011030_5/America/New_York:
+ 20020718T093000
+TRANSP:OPAQUE
+SEQUENCE:3
+SUMMARY:Federal Reserve Board Meeting
+CLASS:PUBLIC
+ORGANIZER;CN=Dan Connolly:MAILTO:connolly at w3.org
+ATTENDEE;CUTYPE=INDIVIDUAL;ROLE=REQ-PARTICIPANT;PARTSTAT=NEEDS-ACTION;
+ RSVP=TRUE;LANGUAGE=en:MAILTO:hoopy at frood.example
+ATTENDEE;CUTYPE=INDIVIDUAL;ROLE=OPT-PARTICIPANT;PARTSTAT=NEEDS-ACTION;
+ RSVP=TRUE;LANGUAGE=en:MAILTO:prefect at ford.example
+BEGIN:VALARM
+X-EVOLUTION-ALARM-UID:20020701T033628Z-3895-69-1-22 at jammer
+TRIGGER;VALUE=DURATION;RELATED=START:-PT15M
+ACTION:DISPLAY
+DESCRIPTION:Federal Reserve Board Meeting
+END:VALARM
+END:VEVENT
+END:VCALENDAR

Copied: trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/icaltestdata/cal01-3.ics (from rev 976, trunk/dna-repository/src/test/resources/docs/icaltestdata/cal01-3.ics)
===================================================================
--- trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/icaltestdata/cal01-3.ics	                        (rev 0)
+++ trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/icaltestdata/cal01-3.ics	2009-06-04 22:31:30 UTC (rev 977)
@@ -0,0 +1,102 @@
+BEGIN:VCALENDAR
+CALSCALE:GREGORIAN
+PRODID:-//Ximian//NONSGML Evolution Calendar//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/softwarestudio.org/Olson_20011030_5/America/New_York
+TZURL:http://timezones.r.us.net/tz/US-California-Los_Angeles
+BEGIN:STANDARD
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+TZNAME:EST
+DTSTART:19701025T020000
+RRULE:FREQ=YEARLY;INTERVAL=1;BYDAY=-1SU;BYMONTH=10
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+TZNAME:EDT
+DTSTART:19700405T020000
+RRULE:FREQ=YEARLY;INTERVAL=1;BYDAY=1SU;BYMONTH=4
+END:DAYLIGHT
+END:VTIMEZONE
+BEGIN:VEVENT
+UID:20020630T230353Z-3895-69-1-0 at jammer
+DTSTAMP:20020630T230353Z
+DTSTART;TZID=/softwarestudio.org/Olson_20011030_5/America/New_York:
+ 20020630T090000
+DTEND;TZID=/softwarestudio.org/Olson_20011030_5/America/New_York:
+ 20020630T103000  
+TRANSP:OPAQUE
+SEQUENCE:2
+SUMMARY:Church
+CLASS:PRIVATE
+RRULE:FREQ=WEEKLY;INTERVAL=1;BYDAY=SU
+END:VEVENT
+BEGIN:VEVENT
+UID:20020630T230445Z-3895-69-1-7 at jammer
+DTSTAMP:20020630T230445Z
+DTSTART;VALUE=DATE:20020703
+DTEND;VALUE=DATE:20020706
+TRANSP:OPAQUE
+SEQUENCE:2
+SUMMARY:Scooby Conference
+LOCATION:San Francisco
+CONTACT:Jim Dolittle\, ABC Industries\, +1-919-555-1234
+DESCRIPTION:can't wait!\n
+CATEGORIES:Miscellaneous
+CLASS:PUBLIC
+BEGIN:VALARM
+X-EVOLUTION-ALARM-UID:20020701T033628Z-3895-69-1-48 at jammer
+TRIGGER;RELATED=START:-PT30M
+ACTION:DISPLAY
+DESCRIPTION:Federal Reserve Board Meeting
+END:VALARM
+END:VEVENT
+BEGIN:VEVENT
+UID:20020630T230600Z-3895-69-1-16 at jammer
+DTSTAMP:20020630T230600Z
+DTSTART;TZID=/softwarestudio.org/Olson_20011030_5/America/New_York:
+ 20020718T090000
+DTEND;TZID=/softwarestudio.org/Olson_20011030_5/America/New_York:
+ 20020718T093000
+TRANSP:OPAQUE
+SEQUENCE:3
+SUMMARY:Federal Reserve Board Meeting
+CLASS:PUBLIC
+ORGANIZER;CN=Dan Connolly:MAILTO:connolly at w3.org
+ATTENDEE;CUTYPE=INDIVIDUAL;ROLE=REQ-PARTICIPANT;PARTSTAT=NEEDS-ACTION;
+ RSVP=TRUE;LANGUAGE=en:MAILTO:hoopy at frood.example
+ATTENDEE;CUTYPE=INDIVIDUAL;ROLE=OPT-PARTICIPANT;PARTSTAT=NEEDS-ACTION;
+ RSVP=TRUE;LANGUAGE=en:MAILTO:prefect at ford.example
+BEGIN:VALARM
+X-EVOLUTION-ALARM-UID:20020701T033628Z-3895-69-1-22 at jammer
+TRIGGER;VALUE=DURATION;RELATED=START:-PT15M
+ACTION:DISPLAY
+DESCRIPTION:Federal Reserve Board Meeting
+END:VALARM
+END:VEVENT
+BEGIN:VEVENT
+UID:20020630T230600Z-3895-69-1-2343 at jammer
+DTSTAMP:20060630T230600Z
+DTSTART;TZID=/softwarestudio.org/Olson_20011030_5/America/New_York:
+ 20060718T090000
+DTEND;TZID=/softwarestudio.org/Olson_20011030_5/America/New_York:
+ 20060718T093000
+TRANSP:OPAQUE
+SEQUENCE:0
+SUMMARY:This is a typical summary of an event
+CLASS:PUBLIC
+ORGANIZER;CN=Dan Connolly:MAILTO:connolly at w3.org
+ATTENDEE;CUTYPE=INDIVIDUAL;ROLE=REQ-PARTICIPANT;PARTSTAT=NEEDS-ACTION;
+ RSVP=TRUE;LANGUAGE=en:MAILTO:hoopy at frood.example
+ATTENDEE;CUTYPE=INDIVIDUAL;ROLE=OPT-PARTICIPANT;PARTSTAT=NEEDS-ACTION;
+ RSVP=TRUE;LANGUAGE=en:MAILTO:prefect at ford.example
+BEGIN:VALARM
+X-EVOLUTION-ALARM-UID:20020701T033628Z-3895-69-1-343 at jammer
+TRIGGER;VALUE=DURATION;RELATED=START:-PT30M
+ACTION:DISPLAY
+DESCRIPTION:This is a typical alarm
+END:VALARM
+END:VEVENT
+END:VCALENDAR

Copied: trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/icaltestdata/cal01-4.ics (from rev 976, trunk/dna-repository/src/test/resources/docs/icaltestdata/cal01-4.ics)
===================================================================
--- trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/icaltestdata/cal01-4.ics	                        (rev 0)
+++ trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/icaltestdata/cal01-4.ics	2009-06-04 22:31:30 UTC (rev 977)
@@ -0,0 +1,56 @@
+BEGIN:VCALENDAR
+CALSCALE:GREGORIAN
+PRODID:-//Ximian//NONSGML Evolution Calendar//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/softwarestudio.org/Olson_20011030_5/America/New_York
+TZURL:http://timezones.r.us.net/tz/US-California-Los_Angeles
+BEGIN:STANDARD
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+TZNAME:EST
+DTSTART:19701025T020000
+RRULE:FREQ=YEARLY;INTERVAL=1;BYDAY=-1SU;BYMONTH=10
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+TZNAME:EDT
+DTSTART:19700405T020000
+RRULE:FREQ=YEARLY;INTERVAL=1;BYDAY=1SU;BYMONTH=4
+END:DAYLIGHT
+END:VTIMEZONE
+BEGIN:VEVENT
+UID:20020630T230353Z-3895-69-1-0 at jammer
+DTSTAMP:20020630T230353Z
+DTSTART;TZID=/softwarestudio.org/Olson_20011030_5/America/New_York:
+ 20020630T090000
+DTEND;TZID=/softwarestudio.org/Olson_20011030_5/America/New_York:
+ 20020630T103000  
+TRANSP:OPAQUE
+SEQUENCE:2
+SUMMARY:Church
+CLASS:PRIVATE
+RRULE:FREQ=WEEKLY;INTERVAL=1;BYDAY=SU
+END:VEVENT
+BEGIN:VEVENT
+UID:20020630T230445Z-3895-69-1-7 at jammer
+DTSTAMP:20020630T230445Z
+DTSTART;VALUE=DATE:20020703
+DTEND;VALUE=DATE:20020706
+TRANSP:OPAQUE
+SEQUENCE:2
+SUMMARY:Scooby Conference
+LOCATION:San Francisco
+CONTACT:Jim Dolittle\, ABC Industries\, +1-919-555-1234
+DESCRIPTION:can't wait!\n
+CATEGORIES:Miscellaneous
+CLASS:PUBLIC
+BEGIN:VALARM
+X-EVOLUTION-ALARM-UID:20020701T033628Z-3895-69-1-48 at jammer
+TRIGGER;RELATED=START:-PT30M
+ACTION:DISPLAY
+DESCRIPTION:Federal Reserve Board Meeting
+END:VALARM
+END:VEVENT
+END:VCALENDAR

Copied: trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/icaltestdata/cal01-5.ics (from rev 976, trunk/dna-repository/src/test/resources/docs/icaltestdata/cal01-5.ics)
===================================================================
--- trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/icaltestdata/cal01-5.ics	                        (rev 0)
+++ trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/icaltestdata/cal01-5.ics	2009-06-04 22:31:30 UTC (rev 977)
@@ -0,0 +1,79 @@
+BEGIN:VCALENDAR
+CALSCALE:GREGORIAN
+PRODID:-//Ximian//NONSGML Evolution Calendar//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/softwarestudio.org/Olson_20011030_5/America/New_York
+TZURL:http://timezones.r.us.net/tz/US-California-Los_Angeles
+BEGIN:STANDARD
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+TZNAME:EST
+DTSTART:19701025T020000
+RRULE:FREQ=YEARLY;INTERVAL=1;BYDAY=-1SU;BYMONTH=11
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+TZNAME:EDT
+DTSTART:19700405T020000
+RRULE:FREQ=YEARLY;INTERVAL=1;BYDAY=1SU;BYMONTH=4
+END:DAYLIGHT
+END:VTIMEZONE
+BEGIN:VEVENT
+UID:20020630T230353Z-3895-69-1-0 at jammer
+DTSTAMP:20020630T230353Z
+DTSTART;TZID=/softwarestudio.org/Olson_20011030_5/America/New_York:
+ 20020630T090000
+DTEND;TZID=/softwarestudio.org/Olson_20011030_5/America/New_York:
+ 20020630T103000  
+TRANSP:OPAQUE
+SEQUENCE:2
+SUMMARY:Church
+CLASS:PRIVATE
+RRULE:FREQ=WEEKLY;INTERVAL=1;BYDAY=SU
+END:VEVENT
+BEGIN:VEVENT
+UID:20020630T230445Z-3895-69-1-7 at jammer
+DTSTAMP:20020630T230445Z
+DTSTART;VALUE=DATE:20020703
+DTEND;VALUE=DATE:20020706
+TRANSP:OPAQUE
+SEQUENCE:2
+SUMMARY:Scooby Conference
+LOCATION:San Francisco
+CONTACT:Jim Dolittle\, ABC Industries\, +1-919-555-1234
+DESCRIPTION:can't wait!\n
+CATEGORIES:Miscellaneous
+CLASS:PUBLIC
+BEGIN:VALARM
+X-EVOLUTION-ALARM-UID:20020701T033628Z-3895-69-1-48 at jammer
+TRIGGER;RELATED=START:-PT30M
+ACTION:DISPLAY
+DESCRIPTION:Federal Reserve Board Meeting
+END:VALARM
+END:VEVENT
+BEGIN:VEVENT
+UID:20020630T230600Z-3895-69-1-16 at jammer
+DTSTAMP:20020630T230600Z
+DTSTART;TZID=/softwarestudio.org/Olson_20011030_5/America/New_York:
+ 20020718T090000
+DTEND;TZID=/softwarestudio.org/Olson_20011030_5/America/New_York:
+ 20020718T093000
+TRANSP:OPAQUE
+SEQUENCE:3
+SUMMARY:Federal Reserve Board Meeting
+CLASS:PUBLIC
+ORGANIZER;CN=Dan Connolly:MAILTO:connolly at w3.org
+ATTENDEE;CUTYPE=INDIVIDUAL;ROLE=REQ-PARTICIPANT;PARTSTAT=NEEDS-ACTION;
+ RSVP=TRUE;LANGUAGE=en:MAILTO:hoopy at frood.example
+ATTENDEE;CUTYPE=INDIVIDUAL;ROLE=OPT-PARTICIPANT;PARTSTAT=NEEDS-ACTION;
+ RSVP=TRUE;LANGUAGE=en:MAILTO:prefect at ford.example
+BEGIN:VALARM
+X-EVOLUTION-ALARM-UID:20020701T033628Z-3895-69-1-22 at jammer
+TRIGGER;VALUE=DURATION;RELATED=START:-PT15M
+ACTION:DISPLAY
+DESCRIPTION:Federal Reserve Board Meeting
+END:VALARM
+END:VEVENT
+END:VCALENDAR

Copied: trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/icaltestdata/cal01-6.ics (from rev 976, trunk/dna-repository/src/test/resources/docs/icaltestdata/cal01-6.ics)
===================================================================
--- trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/icaltestdata/cal01-6.ics	                        (rev 0)
+++ trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/icaltestdata/cal01-6.ics	2009-06-04 22:31:30 UTC (rev 977)
@@ -0,0 +1,79 @@
+BEGIN:VCALENDAR
+CALSCALE:GREGORIAN
+PRODID:-//Ximian//NONSGML Evolution Calendar//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/softwarestudio.org/Olson_20011030_5/America/New_York
+TZURL:http://timezones.r.us.net/tz/US-California-Los_Angeles
+BEGIN:STANDARD
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+TZNAME:EST
+DTSTART:19701025T020000
+RRULE:FREQ=YEARLY;INTERVAL=1;BYDAY=-1SU;BYMONTH=10
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+TZNAME:EDT
+DTSTART:19700405T020000
+RRULE:FREQ=YEARLY;INTERVAL=1;BYDAY=1SU;BYMONTH=4
+END:DAYLIGHT
+END:VTIMEZONE
+BEGIN:VEVENT
+UID:20020630T230353Z-3895-69-1-0 at jammer
+DTSTAMP:20020630T230353Z
+DTSTART;TZID=/softwarestudio.org/Olson_20011030_5/America/New_York:
+ 20020630T100000
+DTEND;TZID=/softwarestudio.org/Olson_20011030_5/America/New_York:
+ 20020630T103000  
+TRANSP:OPAQUE
+SEQUENCE:2
+SUMMARY:Church
+CLASS:PRIVATE
+RRULE:FREQ=WEEKLY;INTERVAL=1;BYDAY=SU
+END:VEVENT
+BEGIN:VEVENT
+UID:20020630T230445Z-3895-69-1-7 at jammer
+DTSTAMP:20020630T230445Z
+DTSTART;VALUE=DATE:20020703
+DTEND;VALUE=DATE:20020706
+TRANSP:OPAQUE
+SEQUENCE:2
+SUMMARY:Scooby Conference
+LOCATION:San Francisco
+CONTACT:Jim Dolittle\, ABC Industries\, +1-919-555-1234
+DESCRIPTION:can't wait!\n
+CATEGORIES:Miscellaneous
+CLASS:PUBLIC
+BEGIN:VALARM
+X-EVOLUTION-ALARM-UID:20020701T033628Z-3895-69-1-48 at jammer
+TRIGGER;RELATED=START:-PT30M
+ACTION:DISPLAY
+DESCRIPTION:Federal Reserve Board Meeting
+END:VALARM
+END:VEVENT
+BEGIN:VEVENT
+UID:20020630T230600Z-3895-69-1-16 at jammer
+DTSTAMP:20020630T230600Z
+DTSTART;TZID=/softwarestudio.org/Olson_20011030_5/America/New_York:
+ 20020718T090000
+DTEND;TZID=/softwarestudio.org/Olson_20011030_5/America/New_York:
+ 20020718T093000
+TRANSP:OPAQUE
+SEQUENCE:3
+SUMMARY:Federal Reserve Board Meeting
+CLASS:PUBLIC
+ORGANIZER;CN=Dan Connolly:MAILTO:connolly at w3.org
+ATTENDEE;CUTYPE=INDIVIDUAL;ROLE=REQ-PARTICIPANT;PARTSTAT=NEEDS-ACTION;
+ RSVP=TRUE;LANGUAGE=en:MAILTO:hoopy at frood.example
+ATTENDEE;CUTYPE=INDIVIDUAL;ROLE=OPT-PARTICIPANT;PARTSTAT=NEEDS-ACTION;
+ RSVP=TRUE;LANGUAGE=en:MAILTO:prefect at ford.example
+BEGIN:VALARM
+X-EVOLUTION-ALARM-UID:20020701T033628Z-3895-69-1-22 at jammer
+TRIGGER;VALUE=DURATION;RELATED=START:-PT15M
+ACTION:DISPLAY
+DESCRIPTION:Federal Reserve Board Meeting
+END:VALARM
+END:VEVENT
+END:VCALENDAR

Copied: trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/icaltestdata/cal01-exrule.ics (from rev 976, trunk/dna-repository/src/test/resources/docs/icaltestdata/cal01-exrule.ics)
===================================================================
--- trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/icaltestdata/cal01-exrule.ics	                        (rev 0)
+++ trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/icaltestdata/cal01-exrule.ics	2009-06-04 22:31:30 UTC (rev 977)
@@ -0,0 +1,80 @@
+BEGIN:VCALENDAR
+CALSCALE:GREGORIAN
+PRODID:-//Ximian//NONSGML Evolution Calendar//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/softwarestudio.org/Olson_20011030_5/America/New_York
+X-LIC-LOCATION:America/New_York
+BEGIN:STANDARD
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+TZNAME:EST
+DTSTART:19701025T020000
+RRULE:FREQ=YEARLY;INTERVAL=1;BYDAY=-1SU;BYMONTH=10
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+TZNAME:EDT
+DTSTART:19700405T020000
+RRULE:FREQ=YEARLY;INTERVAL=1;BYDAY=1SU;BYMONTH=4
+END:DAYLIGHT
+END:VTIMEZONE
+BEGIN:VEVENT
+UID:20020630T230353Z-3895-69-1-0 at jammer
+DTSTAMP:20020630T230353Z
+DTSTART;TZID=/softwarestudio.org/Olson_20011030_5/America/New_York:
+ 20020630T090000
+DTEND;TZID=/softwarestudio.org/Olson_20011030_5/America/New_York:
+ 20020630T103000  
+TRANSP:OPAQUE
+SEQUENCE:2
+SUMMARY:Church
+CLASS:PRIVATE
+RRULE:FREQ=WEEKLY;INTERVAL=1;BYDAY=SU
+EXRULE:FREQ=WEEKLY;INTERVAL=5;BYDAY=SU
+END:VEVENT
+BEGIN:VEVENT
+UID:20020630T230445Z-3895-69-1-7 at jammer
+DTSTAMP:20020630T230445Z
+DTSTART;VALUE=DATE:20020703
+DTEND;VALUE=DATE:20020706
+TRANSP:OPAQUE
+SEQUENCE:2
+SUMMARY:Scooby Conference
+LOCATION:San Francisco
+CONTACT:Jim Dolittle\, ABC Industries\, +1-919-555-1234
+DESCRIPTION:can't wait!\n
+CATEGORIES:Miscellaneous
+CLASS:PUBLIC
+BEGIN:VALARM
+X-EVOLUTION-ALARM-UID:20020701T033628Z-3895-69-1-48 at jammer
+TRIGGER;RELATED=START:-PT30M
+ACTION:DISPLAY
+DESCRIPTION:Federal Reserve Board Meeting
+END:VALARM
+END:VEVENT
+BEGIN:VEVENT
+UID:20020630T230600Z-3895-69-1-16 at jammer
+DTSTAMP:20020630T230600Z
+DTSTART;TZID=/softwarestudio.org/Olson_20011030_5/America/New_York:
+ 20020718T090000
+DTEND;TZID=/softwarestudio.org/Olson_20011030_5/America/New_York:
+ 20020718T093000
+TRANSP:OPAQUE
+SEQUENCE:3
+SUMMARY:Federal Reserve Board Meeting
+CLASS:PUBLIC
+ORGANIZER;CN=Dan Connolly:MAILTO:connolly at w3.org
+ATTENDEE;CUTYPE=INDIVIDUAL;ROLE=REQ-PARTICIPANT;PARTSTAT=NEEDS-ACTION;
+ RSVP=TRUE;LANGUAGE=en:MAILTO:hoopy at frood.example
+ATTENDEE;CUTYPE=INDIVIDUAL;ROLE=OPT-PARTICIPANT;PARTSTAT=NEEDS-ACTION;
+ RSVP=TRUE;LANGUAGE=en:MAILTO:prefect at ford.example
+BEGIN:VALARM
+X-EVOLUTION-ALARM-UID:20020701T033628Z-3895-69-1-22 at jammer
+TRIGGER;VALUE=DURATION;RELATED=START:-PT15M
+ACTION:DISPLAY
+DESCRIPTION:Federal Reserve Board Meeting
+END:VALARM
+END:VEVENT
+END:VCALENDAR

Copied: trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/icaltestdata/cal01.ics (from rev 976, trunk/dna-repository/src/test/resources/docs/icaltestdata/cal01.ics)
===================================================================
--- trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/icaltestdata/cal01.ics	                        (rev 0)
+++ trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/icaltestdata/cal01.ics	2009-06-04 22:31:30 UTC (rev 977)
@@ -0,0 +1,79 @@
+BEGIN:VCALENDAR
+CALSCALE:GREGORIAN
+PRODID:-//Ximian//NONSGML Evolution Calendar//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/softwarestudio.org/Olson_20011030_5/America/New_York
+TZURL:http://timezones.r.us.net/tz/US-California-Los_Angeles
+BEGIN:STANDARD
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+TZNAME:EST
+DTSTART:19701025T020000
+RRULE:FREQ=YEARLY;INTERVAL=1;BYDAY=-1SU;BYMONTH=10
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+TZNAME:EDT
+DTSTART:19700405T020000
+RRULE:FREQ=YEARLY;INTERVAL=1;BYDAY=1SU;BYMONTH=4
+END:DAYLIGHT
+END:VTIMEZONE
+BEGIN:VEVENT
+UID:20020630T230353Z-3895-69-1-0 at jammer
+DTSTAMP:20020630T230353Z
+DTSTART;TZID=/softwarestudio.org/Olson_20011030_5/America/New_York:
+ 20020630T090000
+DTEND;TZID=/softwarestudio.org/Olson_20011030_5/America/New_York:
+ 20020630T103000  
+TRANSP:OPAQUE
+SEQUENCE:2
+SUMMARY:Church
+CLASS:PRIVATE
+RRULE:FREQ=WEEKLY;INTERVAL=1;BYDAY=SU
+END:VEVENT
+BEGIN:VEVENT
+UID:20020630T230445Z-3895-69-1-7 at jammer
+DTSTAMP:20020630T230445Z
+DTSTART;VALUE=DATE:20020703
+DTEND;VALUE=DATE:20020706
+TRANSP:OPAQUE
+SEQUENCE:2
+SUMMARY:Scooby Conference
+LOCATION:San Francisco
+CONTACT:Jim Dolittle\, ABC Industries\, +1-919-555-1234
+DESCRIPTION:can't wait!\n
+CATEGORIES:Miscellaneous
+CLASS:PUBLIC
+BEGIN:VALARM
+X-EVOLUTION-ALARM-UID:20020701T033628Z-3895-69-1-48 at jammer
+TRIGGER;RELATED=START:-PT30M
+ACTION:DISPLAY
+DESCRIPTION:Federal Reserve Board Meeting
+END:VALARM
+END:VEVENT
+BEGIN:VEVENT
+UID:20020630T230600Z-3895-69-1-16 at jammer
+DTSTAMP:20020630T230600Z
+DTSTART;TZID=/softwarestudio.org/Olson_20011030_5/America/New_York:
+ 20020718T090000
+DTEND;TZID=/softwarestudio.org/Olson_20011030_5/America/New_York:
+ 20020718T093000
+TRANSP:OPAQUE
+SEQUENCE:3
+SUMMARY:Federal Reserve Board Meeting
+CLASS:PUBLIC
+ORGANIZER;CN=Dan Connolly:MAILTO:connolly at w3.org
+ATTENDEE;CUTYPE=INDIVIDUAL;ROLE=REQ-PARTICIPANT;PARTSTAT=NEEDS-ACTION;
+ RSVP=TRUE;LANGUAGE=en:MAILTO:hoopy at frood.example
+ATTENDEE;CUTYPE=INDIVIDUAL;ROLE=OPT-PARTICIPANT;PARTSTAT=NEEDS-ACTION;
+ RSVP=TRUE;LANGUAGE=en:MAILTO:prefect at ford.example
+BEGIN:VALARM
+X-EVOLUTION-ALARM-UID:20020701T033628Z-3895-69-1-22 at jammer
+TRIGGER;VALUE=DURATION;RELATED=START:-PT15M
+ACTION:DISPLAY
+DESCRIPTION:Federal Reserve Board Meeting
+END:VALARM
+END:VEVENT
+END:VCALENDAR

Copied: trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/icaltestdata/calconnect7.ics (from rev 976, trunk/dna-repository/src/test/resources/docs/icaltestdata/calconnect7.ics)
===================================================================
--- trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/icaltestdata/calconnect7.ics	                        (rev 0)
+++ trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/icaltestdata/calconnect7.ics	2009-06-04 22:31:30 UTC (rev 977)
@@ -0,0 +1,44 @@
+BEGIN:VCALENDAR
+X-LOTUS-CHARSET:UTF-8
+VERSION:2.0
+PRODID:-//Lotus Development Corporation//NONSGML Notes 6.0//EN
+METHOD:REQUEST
+BEGIN:VTIMEZONE
+TZID:Eastern
+BEGIN:STANDARD
+DTSTART:19501029T020000
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+RRULE:FREQ=YEARLY;BYMINUTE=0;BYHOUR=2;BYDAY=-1SU;BYMONTH=10
+END:STANDARD
+BEGIN:DAYLIGHT
+DTSTART:19500402T020000
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+RRULE:FREQ=YEARLY;BYMINUTE=0;BYHOUR=2;BYDAY=1SU;BYMONTH=4
+END:DAYLIGHT
+END:VTIMEZONE
+BEGIN:VEVENT
+DTSTART;TZID=Eastern:20050428T110000
+DTEND;TZID=Eastern:20050428T120000
+TRANSP:OPAQUE
+RDATE;TZID=Eastern;VALUE=PERIOD:20050428T110000/20050428T120000
+RECURRENCE-ID:20050428T130000Z
+RELATED-TO:<jsmith.part7.19960817T083000.xyzMail at host3.com>
+DTSTAMP:20050406T205055Z
+COMMENT;ALTREP="CID:<FFFF__=0ABBE548DFE1F4C08f9e8a93d at coffeebean.com>":A
+ nother single instance reschedule - time only (+2 hrs)
+SEQUENCE:1
+ATTENDEE;ROLE=CHAIR;PARTSTAT=ACCEPTED;CN="iCal Chair/CoffeeBean"
+ ;RSVP=FALSE:mailto:iCalChair at coffeebean.com
+ATTENDEE;ROLE=REQ-PARTICIPANT;PARTSTAT=NEEDS-ACTION
+ ;CN="iCal Participant/CoffeeBean";RSVP=TRUE
+ :mailto:iCalParticipant at coffeebean.com
+CLASS:PUBLIC
+DESCRIPTION;ALTREP="CID:<FFFE__=0ABBE548DFE1F4C08f9e8a93d at coffeebean.com>":b
+ ody
+SUMMARY:More complicated stream (5 day recurring)
+ORGANIZER;CN="iCal Chair/CoffeeBean":mailto:iCalChair at coffeebean.com
+UID:6BA1ECA4D58B306C85256FDB0071B664-Lotus_Notes_Generated
+END:VEVENT
+END:VCALENDAR

Copied: trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/icaltestdata/calconnect9.ics (from rev 976, trunk/dna-repository/src/test/resources/docs/icaltestdata/calconnect9.ics)
===================================================================
--- trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/icaltestdata/calconnect9.ics	                        (rev 0)
+++ trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/icaltestdata/calconnect9.ics	2009-06-04 22:31:30 UTC (rev 977)
@@ -0,0 +1,44 @@
+BEGIN:VCALENDAR
+X-LOTUS-CHARSET:UTF-8
+VERSION:2.0
+PRODID:-//Lotus Development Corporation//NONSGML Notes 6.0//EN
+METHOD:REQUEST
+BEGIN:VTIMEZONE
+TZID:Eastern
+BEGIN:STANDARD
+DTSTART:19501029T020000
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+RRULE:FREQ=YEARLY;BYMINUTE=0;BYHOUR=2;BYDAY=-1SU;BYMONTH=10
+END:STANDARD
+BEGIN:DAYLIGHT
+DTSTART:19500402T020000
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+RRULE:FREQ=YEARLY;BYMINUTE=0;BYHOUR=2;BYDAY=1SU;BYMONTH=4
+END:DAYLIGHT
+END:VTIMEZONE
+BEGIN:VEVENT
+DTSTART;TZID=Eastern:20050425T090000
+DTEND;TZID=Eastern:20050425T091500
+TRANSP:OPAQUE
+RDATE;TZID=Eastern;VALUE=PERIOD:20050425T090000/20050425T091500
+ ,20050426T090000/20050426T091500,20050427T090000/20050427T091500
+ ,20050428T090000/20050428T091500,20050429T090000/20050429T091500
+DTSTAMP:20050406T205429Z
+COMMENT;ALTREP="CID:<0ABBE548DFE147488f9e8a93d at coffeebean.com>":S
+ et the Start and End Time to be implicit - 9 to 9:15am
+SEQUENCE:3
+ATTENDEE;ROLE=CHAIR;PARTSTAT=ACCEPTED;CN="iCal Chair/CoffeeBean"
+ ;RSVP=FALSE:mailto:iCalChair at coffeebean.com
+ATTENDEE;ROLE=REQ-PARTICIPANT;PARTSTAT=NEEDS-ACTION
+ ;CN="iCal Participant/CoffeeBean";RSVP=TRUE
+ :mailto:iCalParticipant at coffeebean.com
+CLASS:PUBLIC
+DESCRIPTION;ALTREP="CID:<0ABBE548DFE147488f9e8a93d at coffeebean.com>":b
+ ody
+SUMMARY:More complicated stream (5 day recurring)
+ORGANIZER;CN="iCal Chair/CoffeeBean":mailto:iCalChair at coffeebean.com
+UID:6BA1ECA4D58B306C85256FDB0071B664-Lotus_Notes_Generated
+END:VEVENT
+END:VCALENDAR

Copied: trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/icaltestdata/combined_multiplevcalendar.ics (from rev 976, trunk/dna-repository/src/test/resources/docs/icaltestdata/combined_multiplevcalendar.ics)
===================================================================
--- trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/icaltestdata/combined_multiplevcalendar.ics	                        (rev 0)
+++ trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/icaltestdata/combined_multiplevcalendar.ics	2009-06-04 22:31:30 UTC (rev 977)
@@ -0,0 +1,155 @@
+BEGIN:VCALENDAR
+PRODID:-//Microsoft Corporation//Outlook 11.0 MIMEDIR//EN
+VERSION:2.0
+METHOD:PUBLISH
+BEGIN:VEVENT
+ORGANIZER:MAILTO:mbrunzel at gmx.de
+DTSTART;VALUE=DATE:20080325
+DTEND;VALUE=DATE:20080328
+LOCATION:Belfast\, Northern Ireland
+TRANSP:TRANSPARENT
+SEQUENCE:0
+UID:040000008200E00074C5B7101A82E00800000000B020A967E159C8010000000000000000100
+ 000001F009082EE836A4D9E9F85D0FD610DDC
+DTSTAMP:20080120T153743Z
+SUMMARY:Belfast CID Meeting
+PRIORITY:5
+X-MICROSOFT-CDO-IMPORTANCE:1
+CLASS:PUBLIC
+END:VEVENT
+END:VCALENDAR
+BEGIN:VCALENDAR
+PRODID:-//Microsoft Corporation//Outlook 11.0 MIMEDIR//EN
+VERSION:2.0
+METHOD:PUBLISH
+BEGIN:VEVENT
+ORGANIZER:MAILTO:mbrunzel at gmx.de
+DTSTART:20080324T173000Z
+DTEND:20080324T214000Z
+LOCATION:Frankfurt Airport
+TRANSP:OPAQUE
+SEQUENCE:0
+UID:040000008200E00074C5B7101A82E0080000000040BE0B4CE559C8010000000000000000100
+ 000000BAFD137BB92CE4DB8E4425C5E7FF4AD
+DTSTAMP:20080120T153756Z
+SUMMARY:Flight from Frankfurt to Belfast
+PRIORITY:5
+X-MICROSOFT-CDO-IMPORTANCE:1
+CLASS:PUBLIC
+END:VEVENT
+END:VCALENDAR
+BEGIN:VCALENDAR
+PRODID:-//Microsoft Corporation//Outlook 11.0 MIMEDIR//EN
+VERSION:2.0
+METHOD:PUBLISH
+BEGIN:VEVENT
+DTSTART:20080328T130000Z
+DTEND:20080328T140000Z
+TRANSP:OPAQUE
+SEQUENCE:0
+UID:040000008200E00074C5B7101A82E00800000000D056B58DE267C7010000000000000000100
+ 00000CA851E18BBFCB44BA9712194A6B93E79
+DTSTAMP:20080120T154341Z
+SUMMARY:Get together at Franks Cafe - Meet Chris
+PRIORITY:5
+X-MICROSOFT-CDO-IMPORTANCE:1
+CLASS:PUBLIC
+END:VEVENT
+END:VCALENDAR
+BEGIN:VCALENDAR
+PRODID:-//Microsoft Corporation//Outlook 11.0 MIMEDIR//EN
+VERSION:2.0
+METHOD:PUBLISH
+BEGIN:VEVENT
+ORGANIZER:MAILTO:mbrunzel at gmx.de
+DTSTART:20080324T133000Z
+DTEND:20080324T140000Z
+LOCATION:Karlsruhe
+TRANSP:OPAQUE
+SEQUENCE:0
+UID:040000008200E00074C5B7101A82E0080000000090C60C93E559C8010000000000000000100
+ 00000281BF31808B91146B806EE76B4B8FEF2
+DTSTAMP:20080120T153825Z
+SUMMARY:Go to Karlsruhe Train Station (tram or taxi)
+PRIORITY:5
+X-MICROSOFT-CDO-IMPORTANCE:1
+CLASS:PUBLIC
+END:VEVENT
+END:VCALENDAR
+BEGIN:VCALENDAR
+PRODID:-//Microsoft Corporation//Outlook 11.0 MIMEDIR//EN
+VERSION:2.0
+METHOD:PUBLISH
+BEGIN:VEVENT
+ORGANIZER:MAILTO:mbrunzel at gmx.de
+DTSTART:20080227T080000Z
+DTEND:20080227T110000Z
+LOCATION:Karlsruhe
+TRANSP:OPAQUE
+SEQUENCE:0
+UID:040000008200E00074C5B7101A82E00800000000D087C37FE659C8010000000000000000100
+ 00000EF2613DAF4B219448E468E5014A49CD7
+DTSTAMP:20080120T153837Z
+SUMMARY:Preparation of Belfast CID Meeting with Karl
+PRIORITY:5
+X-MICROSOFT-CDO-IMPORTANCE:1
+CLASS:PUBLIC
+END:VEVENT
+END:VCALENDAR
+BEGIN:VCALENDAR
+PRODID:-//Microsoft Corporation//Outlook 11.0 MIMEDIR//EN
+VERSION:2.0
+METHOD:PUBLISH
+BEGIN:VEVENT
+DTSTART:20080320T130000Z
+DTEND:20080320T160000Z
+TRANSP:OPAQUE
+SEQUENCE:0
+UID:040000008200E00074C5B7101A82E00800000000D0A5AC74E267C7010000000000000000100
+ 000006FD3421DC287794EACF90A65292314C9
+DTSTAMP:20080120T154032Z
+SUMMARY:Prepare Slides for Presentation
+PRIORITY:5
+X-MICROSOFT-CDO-IMPORTANCE:1
+CLASS:PUBLIC
+END:VEVENT
+END:VCALENDAR
+BEGIN:VCALENDAR
+PRODID:-//Microsoft Corporation//Outlook 11.0 MIMEDIR//EN
+VERSION:2.0
+METHOD:PUBLISH
+BEGIN:VEVENT
+ORGANIZER:MAILTO:mbrunzel at gmx.de
+DTSTART:20080324T140000Z
+DTEND:20080324T151000Z
+LOCATION:Karlsruhe 
+TRANSP:OPAQUE
+SEQUENCE:0
+UID:040000008200E00074C5B7101A82E00800000000E0916768E559C8010000000000000000100
+ 000006EDDBEC4B585664EBEA9BE24F9B0E681
+DTSTAMP:20080120T153806Z
+SUMMARY:Train from Karlsruhe to Frankfurt
+PRIORITY:5
+X-MICROSOFT-CDO-IMPORTANCE:1
+CLASS:PUBLIC
+END:VEVENT
+END:VCALENDAR
+BEGIN:VCALENDAR
+PRODID:-//Microsoft Corporation//Outlook 11.0 MIMEDIR//EN
+VERSION:2.0
+METHOD:PUBLISH
+BEGIN:VEVENT
+DTSTART:20080225T090000Z
+DTEND:20080225T100000Z
+TRANSP:OPAQUE
+SEQUENCE:0
+UID:040000008200E00074C5B7101A82E008000000002085026DE267C7010000000000000000100
+ 00000D5738E7936B0C84E9D53E9DEFB830F4E
+DTSTAMP:20080120T154305Z
+SUMMARY:Weekly Planning Meeting
+PRIORITY:5
+X-MICROSOFT-CDO-IMPORTANCE:1
+CLASS:PUBLIC
+END:VEVENT
+END:VCALENDAR
+
\ No newline at end of file

Copied: trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/icaltestdata/combined_onevcalendar.ics (from rev 976, trunk/dna-repository/src/test/resources/docs/icaltestdata/combined_onevcalendar.ics)
===================================================================
--- trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/icaltestdata/combined_onevcalendar.ics	                        (rev 0)
+++ trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/icaltestdata/combined_onevcalendar.ics	2009-06-04 22:31:30 UTC (rev 977)
@@ -0,0 +1,126 @@
+BEGIN:VCALENDAR
+PRODID:-//Microsoft Corporation//Outlook 11.0 MIMEDIR//EN
+VERSION:2.0
+METHOD:PUBLISH
+BEGIN:VEVENT
+ORGANIZER:MAILTO:mbrunzel at gmx.de
+DTSTART;VALUE=DATE:20080325
+DTEND;VALUE=DATE:20080328
+LOCATION:Belfast\, Northern Ireland
+TRANSP:TRANSPARENT
+SEQUENCE:0
+UID:040000008200E00074C5B7101A82E00800000000B020A967E159C8010000000000000000100
+ 000001F009082EE836A4D9E9F85D0FD610DDC
+DTSTAMP:20080120T153743Z
+SUMMARY:Belfast CID Meeting
+PRIORITY:5
+X-MICROSOFT-CDO-IMPORTANCE:1
+CLASS:PUBLIC
+END:VEVENT
+
+BEGIN:VEVENT
+ORGANIZER:MAILTO:mbrunzel at gmx.de
+DTSTART:20080324T173000Z
+DTEND:20080324T214000Z
+LOCATION:Frankfurt Airport
+TRANSP:OPAQUE
+SEQUENCE:0
+UID:040000008200E00074C5B7101A82E0080000000040BE0B4CE559C8010000000000000000100
+ 000000BAFD137BB92CE4DB8E4425C5E7FF4AD
+DTSTAMP:20080120T153756Z
+SUMMARY:Flight from Frankfurt to Belfast
+PRIORITY:5
+X-MICROSOFT-CDO-IMPORTANCE:1
+CLASS:PUBLIC
+END:VEVENT
+
+BEGIN:VEVENT
+DTSTART:20080328T130000Z
+DTEND:20080328T140000Z
+TRANSP:OPAQUE
+SEQUENCE:0
+UID:040000008200E00074C5B7101A82E00800000000D056B58DE267C7010000000000000000100
+ 00000CA851E18BBFCB44BA9712194A6B93E79
+DTSTAMP:20080120T154341Z
+SUMMARY:Get together at Franks Cafe - Meet Chris
+PRIORITY:5
+X-MICROSOFT-CDO-IMPORTANCE:1
+CLASS:PUBLIC
+END:VEVENT
+
+BEGIN:VEVENT
+ORGANIZER:MAILTO:mbrunzel at gmx.de
+DTSTART:20080324T133000Z
+DTEND:20080324T140000Z
+LOCATION:Karlsruhe
+TRANSP:OPAQUE
+SEQUENCE:0
+UID:040000008200E00074C5B7101A82E0080000000090C60C93E559C8010000000000000000100
+ 00000281BF31808B91146B806EE76B4B8FEF2
+DTSTAMP:20080120T153825Z
+SUMMARY:Go to Karlsruhe Train Station (tram or taxi)
+PRIORITY:5
+X-MICROSOFT-CDO-IMPORTANCE:1
+CLASS:PUBLIC
+END:VEVENT
+
+BEGIN:VEVENT
+ORGANIZER:MAILTO:mbrunzel at gmx.de
+DTSTART:20080227T080000Z
+DTEND:20080227T110000Z
+LOCATION:Karlsruhe
+TRANSP:OPAQUE
+SEQUENCE:0
+UID:040000008200E00074C5B7101A82E00800000000D087C37FE659C8010000000000000000100
+ 00000EF2613DAF4B219448E468E5014A49CD7
+DTSTAMP:20080120T153837Z
+SUMMARY:Preparation of Belfast CID Meeting with Karl
+PRIORITY:5
+X-MICROSOFT-CDO-IMPORTANCE:1
+CLASS:PUBLIC
+END:VEVENT
+
+BEGIN:VEVENT
+DTSTART:20080320T130000Z
+DTEND:20080320T160000Z
+TRANSP:OPAQUE
+SEQUENCE:0
+UID:040000008200E00074C5B7101A82E00800000000D0A5AC74E267C7010000000000000000100
+ 000006FD3421DC287794EACF90A65292314C9
+DTSTAMP:20080120T154032Z
+SUMMARY:Prepare Slides for Presentation
+PRIORITY:5
+X-MICROSOFT-CDO-IMPORTANCE:1
+CLASS:PUBLIC
+END:VEVENT
+
+BEGIN:VEVENT
+ORGANIZER:MAILTO:mbrunzel at gmx.de
+DTSTART:20080324T140000Z
+DTEND:20080324T151000Z
+LOCATION:Karlsruhe 
+TRANSP:OPAQUE
+SEQUENCE:0
+UID:040000008200E00074C5B7101A82E00800000000E0916768E559C8010000000000000000100
+ 000006EDDBEC4B585664EBEA9BE24F9B0E681
+DTSTAMP:20080120T153806Z
+SUMMARY:Train from Karlsruhe to Frankfurt
+PRIORITY:5
+X-MICROSOFT-CDO-IMPORTANCE:1
+CLASS:PUBLIC
+END:VEVENT
+
+BEGIN:VEVENT
+DTSTART:20080225T090000Z
+DTEND:20080225T100000Z
+TRANSP:OPAQUE
+SEQUENCE:0
+UID:040000008200E00074C5B7101A82E008000000002085026DE267C7010000000000000000100
+ 00000D5738E7936B0C84E9D53E9DEFB830F4E
+DTSTAMP:20080120T154305Z
+SUMMARY:Weekly Planning Meeting
+PRIORITY:5
+X-MICROSOFT-CDO-IMPORTANCE:1
+CLASS:PUBLIC
+END:VEVENT
+END:VCALENDAR

Copied: trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/icaltestdata/extendedCalendar.ics (from rev 976, trunk/dna-repository/src/test/resources/docs/icaltestdata/extendedCalendar.ics)
===================================================================
--- trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/icaltestdata/extendedCalendar.ics	                        (rev 0)
+++ trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/icaltestdata/extendedCalendar.ics	2009-06-04 22:31:30 UTC (rev 977)
@@ -0,0 +1,9 @@
+BEGIN:VCALENDAR
+CALSCALE:GREGORIAN
+PRODID:-//Apple Computer\, Inc//iCal 1.0//EN
+VERSION:2.0
+METHOD:PUBLISH
+X-WR-TIMEZONE;VALUE=TEXT:Europe/London
+X-WR-CALNAME;VALUE=TEXT:Work
+X-WR-RELCALID;VALUE=TEXT:E1445B1A-5974-11D7-8A5F-000393161A98
+END:VCALENDAR
\ No newline at end of file

Copied: trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/icaltestdata/freebusy.ics (from rev 976, trunk/dna-repository/src/test/resources/docs/icaltestdata/freebusy.ics)
===================================================================
--- trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/icaltestdata/freebusy.ics	                        (rev 0)
+++ trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/icaltestdata/freebusy.ics	2009-06-04 22:31:30 UTC (rev 977)
@@ -0,0 +1,14 @@
+BEGIN:VCALENDAR
+METHOD:REQUEST
+PRODID:-//Ximian//NONSGML Evolution Calendar//EN
+BEGIN:VFREEBUSY
+ORGANIZER:MAILTO:jane_doe at host1.com
+ATTENDEE:MAILTO:john_public at host2.com
+DTSTAMP:19970901T100000Z
+FREEBUSY;VALUE=PERIOD:19971015T050000Z/PT8H30M,
+ 19971015T160000Z/PT5H30M,19971015T223000Z/PT6H30M
+URL:http://host2.com/pub/busy/jpublic-01.ifb
+COMMENT:This iCalendar file contains busy time information for
+ the next three months.
+END:VFREEBUSY
+END:VCALENDAR

Copied: trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/icaltestdata/geo1.ics (from rev 976, trunk/dna-repository/src/test/resources/docs/icaltestdata/geo1.ics)
===================================================================
--- trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/icaltestdata/geo1.ics	                        (rev 0)
+++ trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/icaltestdata/geo1.ics	2009-06-04 22:31:30 UTC (rev 977)
@@ -0,0 +1,40 @@
+BEGIN:VCALENDAR
+CALSCALE:GREGORIAN
+PRODID:-//Dan C//edited with emacs//EN
+X-WR-TIMEZONE;VALUE=TEXT:US/Eastern
+VERSION:2.0
+BEGIN:VEVENT
+SEQUENCE:3
+URL:http://kanzaki.com/works/2004/cal/0406vocab.html
+GEO:40.442673;-79.945815
+DTSTAMP:20021219T205357Z
+SUMMARY:icalendaring #rdfig meeting
+DTEND;
+ TZID=/softwarestudio.org/Olson_20011030_5/America/New_York:20030108T140000
+DTSTART;
+ TZID=/softwarestudio.org/Olson_20011030_5/America/New_York:20030108T130000
+UID:CDC474D4-1393-11D7-9A2C-000393914268
+END:VEVENT
+
+BEGIN:VTIMEZONE
+TZID:/softwarestudio.org/Olson_20011030_5/America/New_York
+X-LIC-LOCATION:America/New_York
+BEGIN:STANDARD
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+TZNAME:EST
+DTSTART:19701025T020000
+RRULE:FREQ=YEARLY;INTERVAL=1;BYDAY=-1SU;BYMONTH=10
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+TZNAME:EDT
+DTSTART:19700405T020000
+RRULE:FREQ=YEARLY;INTERVAL=1;BYDAY=1SU;BYMONTH=4
+END:DAYLIGHT
+END:VTIMEZONE
+
+END:VCALENDAR
+
+

Copied: trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/icaltestdata/gkexample.ics (from rev 976, trunk/dna-repository/src/test/resources/docs/icaltestdata/gkexample.ics)
===================================================================
--- trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/icaltestdata/gkexample.ics	                        (rev 0)
+++ trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/icaltestdata/gkexample.ics	2009-06-04 22:31:30 UTC (rev 977)
@@ -0,0 +1,18 @@
+BEGIN:VCALENDAR
+VERSION:2.0
+PRODID:http://id.ninebynine.org/wip/2002/timetable
+BEGIN:VEVENT
+UID:20020630T230353Z-3895-69-2-0 at antoni
+DTSTART:20021201T190000Z
+DTEND:20021201T210000Z
+RRULE:FREQ=WEEKLY;BYDAY=MO,TU,WE,TH,FR
+END:VEVENT
+BEGIN:VEVENT
+UID:20020630T230353Z-3895-69-1-0 at antoni
+DTSTART:20021201T160000Z
+DTEND:20021201T220000Z
+RRULE:FREQ=WEEKLY;BYDAY=SA,SU
+COMMENT:from G.Klyne - iCalendarExample.txt
+END:VEVENT
+END:VCALENDAR
+

Copied: trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/icaltestdata/incoming.ics (from rev 976, trunk/dna-repository/src/test/resources/docs/icaltestdata/incoming.ics)
===================================================================
--- trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/icaltestdata/incoming.ics	                        (rev 0)
+++ trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/icaltestdata/incoming.ics	2009-06-04 22:31:30 UTC (rev 977)
@@ -0,0 +1,170 @@
+BEGIN:VCALENDAR
+PRODID:-//ACME/DesktopCalendar//EN
+METHOD:REPLY
+X-LIC-NOTE: #I6: Crasher Y is declining  A's request\, #C2
+VERSION:2.0
+BEGIN:VEVENT
+ATTENDEE;PARTSTAT=DECLINED:Mailto:Y at example.com
+ORGANIZER:MAILTO:A at example.com
+UID:calsrv.example.com-873970198738785 at example.com
+SEQUENCE:1
+REQUEST-STATUS:2.0;Success
+DTSTAMP:19970612T190000Z
+END:VEVENT
+END:VCALENDAR
+
+BEGIN:VCALENDAR
+PRODID:-//ACME/DesktopCalendar//EN
+METHOD:REQUEST
+X-LIC-NOTE: #I1. Reschedules C1
+VERSION:2.0
+BEGIN:VEVENT
+ORGANIZER:Mailto:B at example.com
+ATTENDEE;ROLE=CHAIR;PARTSTAT=ACCEPTED;CN=BIG A:Mailto:A at example.com
+ATTENDEE;RSVP=TRUE;CUTYPE=INDIVIDUAL;CN=B:Mailto:B at example.com
+ATTENDEE;RSVP=TRUE;CUTYPE=INDIVIDUAL;CN=C:Mailto:C at example.com
+ATTENDEE;RSVP=TRUE;CUTYPE=INDIVIDUAL;CN=Hal:Mailto:D at example.com
+ATTENDEE;RSVP=FALSE;CUTYPE=ROOM:conf_Big at example.com
+ATTENDEE;ROLE=NON-PARTICIPANT;RSVP=FALSE:Mailto:E at example.com
+DTSTAMP:19970611T190000Z
+DTSTART:19970701T200000Z
+DTEND:19970701T2000000Z
+SUMMARY:Conference
+UID:calsrv.example.com-873970198738777 at example.com
+SEQUENCE:2
+STATUS:CONFIRMED
+END:VEVENT
+END:VCALENDAR
+
+BEGIN:VCALENDAR
+PRODID:-//ACME/DesktopCalendar//EN
+METHOD:REQUEST
+X-LIC-NOTE: #I2. Updates C1
+VERSION:2.0
+BEGIN:VEVENT
+ORGANIZER:Mailto:B at example.com
+ATTENDEE;ROLE=CHAIR;PARTSTAT=ACCEPTED;CN=BIG A:Mailto:A at example.com
+ATTENDEE;RSVP=TRUE;CUTYPE=INDIVIDUAL;CN=B:Mailto:B at example.com
+ATTENDEE;RSVP=TRUE;CUTYPE=INDIVIDUAL;CN=C:Mailto:C at example.com
+ATTENDEE;RSVP=TRUE;CUTYPE=INDIVIDUAL;CN=Hal:Mailto:D at example.com
+ATTENDEE;RSVP=FALSE;CUTYPE=ROOM:conf_Big at example.com
+ATTENDEE;ROLE=NON-PARTICIPANT;RSVP=FALSE:Mailto:E at example.com
+DTSTAMP:19970611T193000Z
+DTSTART:19970701T190000Z
+DTEND:19970701T1930000Z
+SUMMARY: Pool party
+UID:calsrv.example.com-873970198738777 at example.com
+SEQUENCE:2
+STATUS:CONFIRMED
+END:VEVENT
+END:VCALENDAR
+
+BEGIN:VCALENDAR
+PRODID:-//ACME/DesktopCalendar//EN
+METHOD:REQUEST
+X-LIC-NOTE: #I2: This is an obsolete request\, otherwise identical to #I1
+VERSION:2.0
+BEGIN:VEVENT
+ORGANIZER:Mailto:B at example.com
+ATTENDEE;ROLE=CHAIR;PARTSTAT=ACCEPTED:Mailto:A at example.com
+ATTENDEE;RSVP=TRUE;CUTYPE=INDIVIDUAL:Mailto:B at example.com
+ATTENDEE;RSVP=TRUE;CUTYPE=INDIVIDUAL:Mailto:C at example.com
+ATTENDEE;RSVP=TRUE;CUTYPE=INDIVIDUAL;CN=Hal:Mailto:D at example.com
+ATTENDEE;ROLE=NON-PARTICIPANT;RSVP=FALSE;
+ CUTYPE=ROOM:Mailto:Conf at example.com
+ATTENDEE;ROLE=NON-PARTICIPANT;RSVP=FALSE:Mailto:E at example.com
+DTSTART:19960701T180000Z
+DTEND:19970701T190000Z
+SUMMARY:Phone Conference
+UID:calsrv.example.com-873970198738777 at example.com
+SEQUENCE:0
+DTSTAMP:19960613T190000Z
+STATUS:CONFIRMED
+END:VEVENT
+END:VCALENDAR
+
+BEGIN:VCALENDAR
+PRODID:-//ACME/DesktopCalendar//EN
+METHOD:REPLY
+X-LIC-NOTE: #I3: User B is accepting A's request\, #C2
+VERSION:2.0
+BEGIN:VEVENT
+ATTENDEE;PARTSTAT=ACCEPTED:Mailto:B at example.com
+ORGANIZER:MAILTO:A at example.com
+UID:calsrv.example.com-873970198738785 at example.com
+SEQUENCE:1
+REQUEST-STATUS:2.0;Success
+DTSTAMP:19970612T190000Z
+END:VEVENT
+END:VCALENDAR
+
+BEGIN:VCALENDAR
+PRODID:-//ACME/DesktopCalendar//EN
+METHOD:REPLY
+X-LIC-NOTE: #I4: User C is rejecting A's request\, #C2
+VERSION:2.0
+BEGIN:VEVENT
+ATTENDEE;PARTSTAT=DECLINED:Mailto:C at example.com
+ORGANIZER:MAILTO:A at example.com
+UID:calsrv.example.com-873970198738785 at example.com
+SEQUENCE:1
+REQUEST-STATUS:2.0;Success
+DTSTAMP:19970612T190000Z
+END:VEVENT
+END:VCALENDAR
+
+BEGIN:VCALENDAR
+PRODID:-//ACME/DesktopCalendar//EN
+METHOD:REPLY
+X-LIC-NOTE: #I5: Crasher X is accepting A's request\, #C2
+VERSION:2.0
+BEGIN:VEVENT
+ATTENDEE;PARTSTAT=ACCEPTED:Mailto:X at example.com
+ORGANIZER:MAILTO:A at example.com
+UID:calsrv.example.com-873970198738785 at example.com
+SEQUENCE:1
+REQUEST-STATUS:2.0;Success
+DTSTAMP:19970612T190000Z
+END:VEVENT
+END:VCALENDAR
+
+
+
+BEGIN:VCALENDAR
+PRODID:-//ACME/DesktopCalendar//EN
+METHOD:CANCEL
+X-LIC-NOTE: #I7: Cancel #c1
+VERSION:2.0
+BEGIN:VEVENT
+ORGANIZER:Mailto:B at example.com
+ATTENDEE;CUTYPE=INDIVIDUAL:Mailto:A at example.com
+ATTENDEE;CUTYPE=INDIVIDUAL:Mailto:B at example.com
+ATTENDEE;CUTYPE=INDIVIDUAL:Mailto:C at example.com
+ATTENDEE;CUTYPE=INDIVIDUAL:Mailto:D at example.com
+COMMENT:Mr. B cannot attend. It's raining. Lets cancel.
+UID:calsrv.example.com-873970198738777 at example.com
+SEQUENCE:1
+UID:calsrv.example.com-873970198738777 at example.com
+STATUS:CANCELLED
+DTSTAMP:19970613T190000Z
+END:VEVENT
+END:VCALENDAR
+
+BEGIN:VCALENDAR
+PRODID:-//ACME/DesktopCalendar//EN
+METHOD:COUNTER
+X-LIC-NOTE: #I8. Counter to #C1. Changed DTEND to DURATION.
+VERSION:2.0
+BEGIN:VEVENT
+DTSTAMP:19970611T190000Z
+DTSTART:19970701T190000Z
+DURATION:PT2H
+ORGANIZER:Mailto:B at example.com
+ATTENDEE;RSVP=TRUE;CUTYPE=INDIVIDUAL;CN=C:Mailto:C at example.com
+SUMMARY:Conference
+COMMENT: I think the conference should be 2 hours long
+UID:calsrv.example.com-873970198738777 at example.com
+SEQUENCE:1
+END:VEVENT
+END:VCALENDAR
+

Copied: trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/icaltestdata/korganizer-jicaltest-vjournal.ics (from rev 976, trunk/dna-repository/src/test/resources/docs/icaltestdata/korganizer-jicaltest-vjournal.ics)
===================================================================
--- trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/icaltestdata/korganizer-jicaltest-vjournal.ics	                        (rev 0)
+++ trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/icaltestdata/korganizer-jicaltest-vjournal.ics	2009-06-04 22:31:30 UTC (rev 977)
@@ -0,0 +1,214 @@
+BEGIN:VCALENDAR
+PRODID
+ :-//K Desktop Environment//NONSGML KOrganizer 3.1//EN
+VERSION
+ :2.0
+BEGIN:VTODO
+CREATED
+ :20030227T110704Z
+UID
+ :KOrganizer-1573136895.534
+SEQUENCE
+ :0
+LAST-MODIFIED
+ :20030227T110704Z
+DTSTAMP
+ :20030227T110715Z
+ORGANIZER
+ :MAILTO:nobody at nowhere
+SUMMARY
+ :todo
+CLASS
+ :PUBLIC
+PRIORITY
+ :3
+X-PILOTID
+ :0
+X-PILOTSTAT
+ :1
+PERCENT-COMPLETE
+ :0
+END:VTODO
+BEGIN:VEVENT
+CREATED
+ :20030227T102259Z
+UID
+ :KOrganizer-924981711.459
+SEQUENCE
+ :1
+LAST-MODIFIED
+ :20030227T104732Z
+DTSTAMP
+ :20030227T110715Z
+ORGANIZER
+ :MAILTO:nobody at nowhere
+DESCRIPTION
+ :Japs\nJaps\nJups\n
+SUMMARY
+ :All day long
+CLASS
+ :PUBLIC
+PRIORITY
+ :3
+CATEGORIES
+ :Holiday
+CATEGORIES
+ :Meeting
+X-PILOTID
+ :0
+X-PILOTSTAT
+ :1
+DTSTART
+ ;VALUE=DATE
+ :20030227
+DTEND
+ ;VALUE=DATE
+ :20030301
+END:VEVENT
+BEGIN:VEVENT
+CREATED
+ :20030227T102213Z
+UID
+ :KOrganizer-1935087658.710
+SEQUENCE
+ :1
+LAST-MODIFIED
+ :20030227T104821Z
+DTSTAMP
+ :20030227T110715Z
+ORGANIZER
+ :MAILTO:nobody at nowhere
+ATTENDEE
+ ;CN=Person2
+ ;RSVP=FALSE
+ ;PARTSTAT=NEEDS-ACTION
+ ;ROLE=REQ-PARTICIPANT
+ :mailto:person2 at mail
+ATTENDEE
+ ;CN=Person1
+ ;RSVP=FALSE
+ ;PARTSTAT=NEEDS-ACTION
+ ;ROLE=REQ-PARTICIPANT
+ :mailto:person1 at mail
+DESCRIPTION
+ :Summary
+SUMMARY
+ :Event
+LOCATION
+ :Location
+CLASS
+ :PUBLIC
+PRIORITY
+ :3
+X-PILOTID
+ :0
+X-PILOTSTAT
+ :1
+DTSTART
+ :20030227T051500Z
+DTEND
+ :20030227T064500Z
+END:VEVENT
+BEGIN:VEVENT
+CREATED
+ :20021125T143801Z
+UID
+ :KOrganizer-888675881.329
+SEQUENCE
+ :0
+LAST-MODIFIED
+ :20021125T143801Z
+DTSTAMP
+ :20030227T110715Z
+ORGANIZER
+ :MAILTO:nobody at nowhere
+SUMMARY
+ :Recur
+CLASS
+ :PUBLIC
+PRIORITY
+ :3
+X-PILOTID
+ :0
+X-PILOTSTAT
+ :1
+RRULE
+ :FREQ=YEARLY;INTERVAL=1;BYMONTH=11
+DTSTART
+ ;VALUE=DATE
+ :20021127
+DTEND
+ ;VALUE=DATE
+ :20021128
+END:VEVENT
+BEGIN:VEVENT
+CREATED
+ :20030227T102234Z
+UID
+ :KOrganizer-1978967821.135
+SEQUENCE
+ :0
+LAST-MODIFIED
+ :20030227T102234Z
+DTSTAMP
+ :20030227T110715Z
+ORGANIZER
+ :MAILTO:nobody at nowhere
+SUMMARY
+ :Another Event
+CLASS
+ :PUBLIC
+PRIORITY
+ :3
+X-PILOTID
+ :0
+X-PILOTSTAT
+ :1
+RRULE
+ :FREQ=DAILY;COUNT=3;INTERVAL=1
+DTSTART
+ :20030228T073000Z
+DTEND
+ :20030228T100000Z
+END:VEVENT
+BEGIN:VJOURNAL
+CREATED
+ :20020723T142142Z
+UID
+ :KOrganizer-2070641952.348
+SEQUENCE
+ :0
+LAST-MODIFIED
+ :20020723T142142Z
+DTSTAMP
+ :20030227T110715Z
+ORGANIZER
+ :MAILTO:nobody at nowhere
+DESCRIPTION
+ :dfdfsdfsdf
+CLASS
+ :PUBLIC
+X-PILOTID
+ :0
+X-PILOTSTAT
+ :1
+END:VJOURNAL
+BEGIN:VJOURNAL
+CREATED
+ :20030227T110715Z
+UID
+ :KOrganizer-948365006.348
+SEQUENCE
+ :0
+LAST-MODIFIED
+ :20030227T110715Z
+DTSTAMP
+ :20030227T110715Z
+ORGANIZER
+ :MAILTO:nobody at nowhere
+DESCRIPTION
+ :journal\n
+CLASS
+ :PUBLIC
+END:VJOURNAL
+END:VCALENDAR

Copied: trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/icaltestdata/korganizer-jicaltest.ics (from rev 976, trunk/dna-repository/src/test/resources/docs/icaltestdata/korganizer-jicaltest.ics)
===================================================================
--- trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/icaltestdata/korganizer-jicaltest.ics	                        (rev 0)
+++ trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/icaltestdata/korganizer-jicaltest.ics	2009-06-04 22:31:30 UTC (rev 977)
@@ -0,0 +1,174 @@
+BEGIN:VCALENDAR
+PRODID
+ :-//K Desktop Environment//NONSGML KOrganizer 3.1//EN
+VERSION
+ :2.0
+BEGIN:VTODO
+CREATED
+ :20030227T110704Z
+UID
+ :KOrganizer-1573136895.534
+SEQUENCE
+ :0
+LAST-MODIFIED
+ :20030227T110704Z
+DTSTAMP
+ :20030227T110715Z
+ORGANIZER
+ :MAILTO:nobody at nowhere
+SUMMARY
+ :todo
+CLASS
+ :PUBLIC
+PRIORITY
+ :3
+X-KORG-PILOTID
+ :0
+X-KORG-PILOTSTAT
+ :1
+PERCENT-COMPLETE
+ :0
+END:VTODO
+BEGIN:VEVENT
+CREATED
+ :20030227T102259Z
+UID
+ :KOrganizer-924981711.459
+SEQUENCE
+ :1
+LAST-MODIFIED
+ :20030227T104732Z
+DTSTAMP
+ :20030227T110715Z
+ORGANIZER
+ :MAILTO:nobody at nowhere
+DESCRIPTION
+ :Japs\nJaps\nJups\n
+SUMMARY
+ :All day long
+CLASS
+ :PUBLIC
+PRIORITY
+ :3
+CATEGORIES
+ :Holiday
+CATEGORIES
+ :Meeting
+X-KORG-PILOTID
+ :0
+X-KORG-PILOTSTAT
+ :1
+DTSTART
+ ;VALUE=DATE
+ :20030227
+DTEND
+ ;VALUE=DATE
+ :20030301
+END:VEVENT
+BEGIN:VEVENT
+CREATED
+ :20030227T102213Z
+UID
+ :KOrganizer-1935087658.710
+SEQUENCE
+ :1
+LAST-MODIFIED
+ :20030227T104821Z
+DTSTAMP
+ :20030227T110715Z
+ORGANIZER
+ :MAILTO:nobody at nowhere
+ATTENDEE
+ ;CN=Person2
+ ;RSVP=FALSE
+ ;PARTSTAT=NEEDS-ACTION
+ ;ROLE=REQ-PARTICIPANT
+ :mailto:person2 at mail
+ATTENDEE
+ ;CN=Person1
+ ;RSVP=FALSE
+ ;PARTSTAT=NEEDS-ACTION
+ ;ROLE=REQ-PARTICIPANT
+ :mailto:person1 at mail
+DESCRIPTION
+ :Summary
+SUMMARY
+ :Event
+LOCATION
+ :Location
+CLASS
+ :PUBLIC
+PRIORITY
+ :3
+X-KORG-PILOTID
+ :0
+X-KORG-PILOTSTAT
+ :1
+DTSTART
+ :20030227T051500Z
+DTEND
+ :20030227T064500Z
+END:VEVENT
+BEGIN:VEVENT
+CREATED
+ :20021125T143801Z
+UID
+ :KOrganizer-888675881.329
+SEQUENCE
+ :0
+LAST-MODIFIED
+ :20021125T143801Z
+DTSTAMP
+ :20030227T110715Z
+ORGANIZER
+ :MAILTO:nobody at nowhere
+SUMMARY
+ :Recur
+CLASS
+ :PUBLIC
+PRIORITY
+ :3
+X-KORG-PILOTID
+ :0
+X-KORG-PILOTSTAT
+ :1
+RRULE
+ :FREQ=YEARLY;INTERVAL=1;BYMONTH=11
+DTSTART
+ ;VALUE=DATE
+ :20021127
+DTEND
+ ;VALUE=DATE
+ :20021128
+END:VEVENT
+BEGIN:VEVENT
+CREATED
+ :20030227T102234Z
+UID
+ :KOrganizer-1978967821.135
+SEQUENCE
+ :0
+LAST-MODIFIED
+ :20030227T102234Z
+DTSTAMP
+ :20030227T110715Z
+ORGANIZER
+ :MAILTO:nobody at nowhere
+SUMMARY
+ :Another Event
+CLASS
+ :PUBLIC
+PRIORITY
+ :3
+X-KORG-PILOTID
+ :0
+X-KORG-PILOTSTAT
+ :1
+RRULE
+ :FREQ=DAILY;COUNT=3;INTERVAL=1
+DTSTART
+ :20030228T073000Z
+DTEND
+ :20030228T100000Z
+END:VEVENT
+END:VCALENDAR

Copied: trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/icaltestdata/php-flp.ics (from rev 976, trunk/dna-repository/src/test/resources/docs/icaltestdata/php-flp.ics)
===================================================================
--- trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/icaltestdata/php-flp.ics	                        (rev 0)
+++ trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/icaltestdata/php-flp.ics	2009-06-04 22:31:30 UTC (rev 977)
@@ -0,0 +1,29 @@
+BEGIN:VCALENDAR
+PRODID:-//flaimo.com//iCal Class MIMEDIR//EN
+VERSION:2.0
+METHOD:REQUEST
+BEGIN:VEVENT
+ORGANIZER;CN=TMS -- Calendar Publisher:MAILTO:cal_publisher at xxxx.xxxx.xxxx.com
+DTSTART:20030620T220000Z
+DTEND:20030620T220000Z
+TRANSP:TRANSPARENT
+SEQUENCE:0
+UID:TPACTIDSTREAMTASKID
+DTSTAMP:20030410T113400Z
+CATEGORIES;LANGUAGE=en;ENCODING=QUOTED-PRINTABLE:TMS Dates
+DESCRIPTION;LANGUAGE=en;ENCODING=QUOTED-PRINTABLE:View the status of this ACT ID:=0Ahttp://xxxx.xxxx.xxxx.com/public/view_detailed_status.php?act_id=3DACTID&stream=3DSTREAM&task_id=3DTASKID=0A
+SUMMARY;LANGUAGE=en;ENCODING=QUOTED-PRINTABLE:TP for Act ID XXXXX -- Not important : Stream -- Task ID
+PRIORITY:5
+CLASS:PUBLIC
+URL:http://xxxx.xxxx.xxxx.com/
+RESOURCES:EASEL,PROJECTOR,VCR
+STATUS:CONFIRMED
+BEGIN:VALARM
+ACTION:DISPLAY
+TRIGGER:-PT2880M
+DESCRIPTION:TP for Act ID XXXXX -- Vx.x Not important : Stream -- Task ID
+SUMMARY:TP for Act ID XXXXX -- Vx.x Not important : Stream -- Task ID
+REPEAT:3
+END:VALARM
+END:VEVENT
+END:VCALENDAR
\ No newline at end of file

Copied: trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/icaltestdata/simplevevent.ics (from rev 976, trunk/dna-repository/src/test/resources/docs/icaltestdata/simplevevent.ics)
===================================================================
--- trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/icaltestdata/simplevevent.ics	                        (rev 0)
+++ trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/icaltestdata/simplevevent.ics	2009-06-04 22:31:30 UTC (rev 977)
@@ -0,0 +1,43 @@
+BEGIN:VCALENDAR
+CALSCALE:GREGORIAN
+PRODID:-//Apple Computer\, Inc//iCal 1.0//EN
+VERSION:2.0
+METHOD:PUBLISH
+
+BEGIN:VEVENT
+SEQUENCE:2
+ATTENDEE;CN=Libby Miller:mailto:libby.miller at bristol.ac.uk
+DTSTAMP:20030109T123909Z
+SUMMARY:IRC Meet
+UID:EB825E41-23CE-11D7-B93D-003065B0C95E
+ORGANIZER;CN=Damian Steer:mailto:pldms at mac.com
+DTSTART;
+ TZID=/softwarestudio.org/Olson_20011030_5/Europe/London:20030115T180000
+DURATION:PT1H
+BEGIN:VALARM
+ATTACH;VALUE=URI:http://www.w3.org/index.html
+TRIGGER;VALUE=DATE-TIME:20060412T230000Z
+ACTION:AUDIO
+END:VALARM
+END:VEVENT
+
+BEGIN:VTIMEZONE
+TZID:/softwarestudio.org/Olson_20011030_5/America/New_York
+TZURL:http://timezones.r.us.net/tz/US-California-Los_Angeles
+BEGIN:STANDARD
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+TZNAME:EST
+DTSTART:19701025T020000
+RRULE:FREQ=YEARLY;INTERVAL=1;BYDAY=-1SU;BYMONTH=10
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+TZNAME:EDT
+DTSTART:19700405T020000
+RRULE:FREQ=YEARLY;INTERVAL=1;BYDAY=1SU;BYMONTH=4
+END:DAYLIGHT
+END:VTIMEZONE
+
+END:VCALENDAR

Copied: trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/icaltestdata/sunbird_sample.ics (from rev 976, trunk/dna-repository/src/test/resources/docs/icaltestdata/sunbird_sample.ics)
===================================================================
--- trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/icaltestdata/sunbird_sample.ics	                        (rev 0)
+++ trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/icaltestdata/sunbird_sample.ics	2009-06-04 22:31:30 UTC (rev 977)
@@ -0,0 +1,4313 @@
+BEGIN:VCALENDAR
+VERSION
+ :2.0
+PRODID
+ :-//Mozilla.org/NONSGML Mozilla Calendar V1.0//EN
+BEGIN:VEVENT
+UID
+ :C20350E0-22CF-11D7-B452-0050E4C50C66
+SUMMARY
+ :Catch Me If You Can - Leonardo DiCaprio stars as Frank Abagnale\, 
+ the youngest man to make the FBI's most-wanted list for forgery. Assuming 
+ various identities\, Abagnale passed millions of dollars in bad checks. 
+ Stars Leonardo DiCaprio\, Tom Hanks\, Christopher Walken\, Jennifer 
+ Garner and Martin Sheen. - Empire rating: 4/5 stars.
+CLASS
+ :PUBLIC
+X-MOZILLA-RECUR-DEFAULT-INTERVAL
+ :0
+DTSTART
+ ;VALUE=DATE
+ :20030109
+DTEND
+ ;VALUE=DATE
+ :20030110
+DTSTAMP
+ :20030108T062114Z
+END:VEVENT
+BEGIN:VEVENT
+UID
+ :F7F52318-22D1-11D7-B452-0050E4C50C66
+SUMMARY
+ :Like Mike - Hip Hop star Lil' Bow Wow stars as Calvin\, a 14-year-old 
+ orphan with the dream of becoming a famous basketball star. When he 
+ puts on a mysterious pair of old sneakers inscribed with the faded 
+ initials \"MJ\,\" he inherits the abilities of Michael Jordan and 
+ makes the leap to NBA superstardom. Empire Rating 1/5
+CLASS
+ :PUBLIC
+X-MOZILLA-RECUR-DEFAULT-INTERVAL
+ :0
+DTSTART
+ ;VALUE=DATE
+ :20030116
+DTEND
+ ;VALUE=DATE
+ :20030117
+DTSTAMP
+ :20030108T063328Z
+END:VEVENT
+BEGIN:VEVENT
+UID
+ :FA2DF665-22D1-11D7-B452-0050E4C50C66
+SUMMARY
+ :Star Trek: Nemesis -                                              
+                                      Ordered by Starfleet to be the 
+ first line of diplomacy in ushering in a new era for the Federation\, 
+ the crew of the USS Enterprise-E is dispatched to Romulus for an unexpected 
+ peace mission. Once in the shadow of the Romulan Empire\, Captain 
+ Jean-Luc Picard and the Enterprise crew are thrust into the center 
+ of a plot that could lead to the destruction of Earth at the hands 
+ of a new and chilling nemesis. Stars Patrick Stewart\, Jonathan Frakes\, 
+ Brent Spiner and LeVar Burton - Empire Rating 3/5
+CLASS
+ :PUBLIC
+X-MOZILLA-RECUR-DEFAULT-INTERVAL
+ :0
+DTSTART
+ ;VALUE=DATE
+ :20030116
+DTEND
+ ;VALUE=DATE
+ :20030117
+DTSTAMP
+ :20030108T063225Z
+END:VEVENT
+BEGIN:VEVENT
+UID
+ :FBC432FB-22D1-11D7-B452-0050E4C50C66
+SUMMARY
+ :The Quiet American -                                              
+                                     Set against the French Indochina 
+ War in Vietnam\, circa 1952\, this murder mystery follows a veteran 
+ English journalist who challenges a young American for the affections 
+ of a Vietnamese beauty. Based on the novel by Graham Green. Stars 
+ Michael Caine\, Brendan Fraser and Hai Yen Do. Empire rating 5/5
+CLASS
+ :PUBLIC
+X-MOZILLA-RECUR-DEFAULT-INTERVAL
+ :0
+DTSTART
+ ;VALUE=DATE
+ :20030116
+DTEND
+ ;VALUE=DATE
+ :20030117
+DTSTAMP
+ :20030108T063314Z
+END:VEVENT
+BEGIN:VEVENT
+UID
+ :319A08D9-22D3-11D7-B452-0050E4C50C66
+SUMMARY
+ :8 Mile - Set against the 1995 hip-hop scene in Detroit\, this drama 
+ is about a young man's struggle to find the strength and courage to 
+ transcend the boundaries that define his life. Stars Eminem\, Mekhi 
+ Phifer\, Brittany Murphy and Kim Basinger. \n\n \n            
+             \n                        \n
+CLASS
+ :PUBLIC
+X-MOZILLA-RECUR-DEFAULT-INTERVAL
+ :0
+DTSTART
+ ;VALUE=DATE
+ :20030123
+DTEND
+ ;VALUE=DATE
+ :20030124
+DTSTAMP
+ :20030108T063427Z
+END:VEVENT
+BEGIN:VEVENT
+UID
+ :62B2B092-AF8D-11D7-9EF2-0050E4C50C66
+SUMMARY
+ :The League of Extraordinary Gentlemen
+URL
+ :http://www.movie-list.com/trailers.php?id=lxg
+CLASS
+ :PUBLIC
+X-MOZILLA-RECUR-DEFAULT-INTERVAL
+ :0
+DTSTART
+ ;VALUE=DATE
+ :20031002
+DTEND
+ ;VALUE=DATE
+ :20031003
+DTSTAMP
+ :20040109T022324Z
+END:VEVENT
+BEGIN:VEVENT
+UID
+ :FD5DF18A-B2A9-11D7-B3D4-0050E4C50C66
+SUMMARY
+ :Darkness Falls\n\n
+CLASS
+ :PUBLIC
+X-MOZILLA-RECUR-DEFAULT-INTERVAL
+ :0
+DTSTART
+ ;VALUE=DATE
+ :20030828
+DTEND
+ ;VALUE=DATE
+ :20030829
+DTSTAMP
+ :20040109T022212Z
+END:VEVENT
+BEGIN:VEVENT
+UID
+ :01822D56-B2AA-11D7-B3D4-0050E4C50C66
+SUMMARY
+ :Finding Nemo
+CLASS
+ :PUBLIC
+X-MOZILLA-RECUR-DEFAULT-INTERVAL
+ :0
+DTSTART
+ ;VALUE=DATE
+ :20030828
+DTEND
+ ;VALUE=DATE
+ :20030829
+DTSTAMP
+ :20040109T022156Z
+END:VEVENT
+BEGIN:VEVENT
+UID
+ :045BC2BB-B2AA-11D7-B3D4-0050E4C50C66
+SUMMARY
+ :A Guy Thing\n\n
+CLASS
+ :PUBLIC
+X-MOZILLA-RECUR-DEFAULT-INTERVAL
+ :0
+DTSTART
+ ;VALUE=DATE
+ :20030828
+DTEND
+ ;VALUE=DATE
+ :20030829
+DTSTAMP
+ :20040109T022159Z
+END:VEVENT
+BEGIN:VEVENT
+UID
+ :104F57E9-B2AB-11D7-B3D4-0050E4C50C66
+SUMMARY
+ :Hollywood Homicide
+CLASS
+ :PUBLIC
+X-MOZILLA-RECUR-DEFAULT-INTERVAL
+ :0
+DTSTART
+ ;VALUE=DATE
+ :20030904
+DTEND
+ ;VALUE=DATE
+ :20030905
+DTSTAMP
+ :20040109T022218Z
+END:VEVENT
+BEGIN:VEVENT
+UID
+ :25FEE878-B2AB-11D7-B3D4-0050E4C50C66
+SUMMARY
+ :Ghosts of the Abyss-\n
+CLASS
+ :PUBLIC
+X-MOZILLA-RECUR-DEFAULT-INTERVAL
+ :0
+DTSTART
+ ;VALUE=DATE
+ :20030904
+DTEND
+ ;VALUE=DATE
+ :20030905
+DTSTAMP
+ :20040109T022222Z
+END:VEVENT
+BEGIN:VEVENT
+UID
+ :766EFCB6-B2AB-11D7-B3D4-0050E4C50C66
+SUMMARY
+ :Legally Blonde 2-
+URL
+ :http://www.movie-list.com/trailers.php?id=legallyblonde2
+CLASS
+ :PUBLIC
+X-MOZILLA-RECUR-DEFAULT-INTERVAL
+ :0
+DTSTART
+ ;VALUE=DATE
+ :20030911
+DTEND
+ ;VALUE=DATE
+ :20030912
+DTSTAMP
+ :20040109T022234Z
+END:VEVENT
+BEGIN:VEVENT
+UID
+ :7EE175DC-B2AB-11D7-B3D4-0050E4C50C66
+SUMMARY
+ :Pirates of the Carribean
+URL
+ :http://www.movie-list.com/trailers.php?id=piratesofthecaribbean
+CLASS
+ :PUBLIC
+X-MOZILLA-RECUR-DEFAULT-INTERVAL
+ :0
+DTSTART
+ ;VALUE=DATE
+ :20030911
+DTEND
+ ;VALUE=DATE
+ :20030912
+DTSTAMP
+ :20040109T022239Z
+END:VEVENT
+BEGIN:VEVENT
+UID
+ :AE93963E-B2AB-11D7-B3D4-0050E4C50C66
+SUMMARY
+ :Bad Boys 2
+URL
+ :http://www.movie-list.com/trailers.php?id=badboys2
+CLASS
+ :PUBLIC
+X-MOZILLA-RECUR-DEFAULT-INTERVAL
+ :0
+DTSTART
+ ;VALUE=DATE
+ :20030918
+DTEND
+ ;VALUE=DATE
+ :20030919
+DTSTAMP
+ :20040109T022247Z
+END:VEVENT
+BEGIN:VEVENT
+UID
+ :B8CB65AA-B2AB-11D7-B3D4-0050E4C50C66
+SUMMARY
+ :Tomb Raider 2
+URL
+ :http://www.movie-list.com/trailers.php?id=tombraider2
+CLASS
+ :PUBLIC
+X-MOZILLA-RECUR-DEFAULT-INTERVAL
+ :0
+DTSTART
+ ;VALUE=DATE
+ :20030925
+DTEND
+ ;VALUE=DATE
+ :20030926
+DTSTAMP
+ :20040109T022313Z
+END:VEVENT
+BEGIN:VEVENT
+UID
+ :42536AD3-B770-11D7-8FBE-0050E4C50C66
+SUMMARY
+ :Agent Cody Banks -
+URL
+ :http://www.movie-list.com/trailers.php?id=agentcodybanks
+CLASS
+ :PUBLIC
+X-MOZILLA-RECUR-DEFAULT-INTERVAL
+ :0
+DTSTART
+ ;VALUE=DATE
+ :20030925
+DTEND
+ ;VALUE=DATE
+ :20030926
+DTSTAMP
+ :20040109T022254Z
+END:VEVENT
+BEGIN:VEVENT
+UID
+ :45F049D0-B770-11D7-8FBE-0050E4C50C66
+SUMMARY
+ :Dumb and Dumberer
+URL
+ :http://www.movie-list.com/trailers.php?id=whenharrymetlloyd
+CLASS
+ :PUBLIC
+X-MOZILLA-RECUR-DEFAULT-INTERVAL
+ :0
+DTSTART
+ ;VALUE=DATE
+ :20031211
+DTEND
+ ;VALUE=DATE
+ :20031212
+DTSTAMP
+ :20040114T130855Z
+END:VEVENT
+BEGIN:VEVENT
+UID
+ :505AD1EE-B770-11D7-8FBE-0050E4C50C66
+SUMMARY
+ :Freaky Friday
+URL
+ :http://www.movie-list.com/trailers.php?id=freakyfriday
+CLASS
+ :PUBLIC
+X-MOZILLA-RECUR-DEFAULT-INTERVAL
+ :0
+DTSTART
+ ;VALUE=DATE
+ :20030925
+DTEND
+ ;VALUE=DATE
+ :20030926
+DTSTAMP
+ :20040109T022259Z
+END:VEVENT
+BEGIN:VEVENT
+UID
+ :534E394A-B770-11D7-8FBE-0050E4C50C66
+SUMMARY
+ :How to Deal -
+URL
+ :http://www.movie-list.com/trailers.php?id=howtodeal
+CLASS
+ :PUBLIC
+X-MOZILLA-RECUR-DEFAULT-INTERVAL
+ :0
+DTSTART
+ ;VALUE=DATE
+ :20031106
+DTEND
+ ;VALUE=DATE
+ :20031107
+DTSTAMP
+ :20040109T022601Z
+END:VEVENT
+BEGIN:VEVENT
+UID
+ :61483E80-B770-11D7-8FBE-0050E4C50C66
+SUMMARY
+ :28 Days Later
+CLASS
+ :PUBLIC
+X-MOZILLA-RECUR-DEFAULT-INTERVAL
+ :0
+DTSTART
+ ;VALUE=DATE
+ :20030904
+DTEND
+ ;VALUE=DATE
+ :20030905
+DTSTAMP
+ :20040109T022227Z
+END:VEVENT
+BEGIN:VEVENT
+UID
+ :791FB42F-B770-11D7-8FBE-0050E4C50C66
+SUMMARY
+ :Matchstick Men\n
+URL
+ :http://www.movie-list.com/m/matchstickmen.shtml
+CLASS
+ :PUBLIC
+X-MOZILLA-RECUR-DEFAULT-INTERVAL
+ :0
+DTSTART
+ ;VALUE=DATE
+ :20031002
+DTEND
+ ;VALUE=DATE
+ :20031003
+DTSTAMP
+ :20040109T022331Z
+END:VEVENT
+BEGIN:VEVENT
+UID
+ :9AB21C3C-B770-11D7-8FBE-0050E4C50C66
+SUMMARY
+ :Head of State \n
+URL
+ :http://www.movie-list.com/h/headofstate.shtml
+CLASS
+ :PUBLIC
+X-MOZILLA-RECUR-DEFAULT-INTERVAL
+ :0
+DTSTART
+ ;VALUE=DATE
+ :20031016
+DTEND
+ ;VALUE=DATE
+ :20031017
+DTSTAMP
+ :20040109T022355Z
+END:VEVENT
+BEGIN:VEVENT
+UID
+ :C21710F8-B770-11D7-8FBE-0050E4C50C66
+SUMMARY
+ :Le Divorce
+URL
+ :http://www.movie-list.com/trailers.php?id=ledivorce
+CLASS
+ :PUBLIC
+X-MOZILLA-RECUR-DEFAULT-INTERVAL
+ :0
+DTSTART
+ ;VALUE=DATE
+ :20031106
+DTEND
+ ;VALUE=DATE
+ :20031107
+DTSTAMP
+ :20040109T022612Z
+END:VEVENT
+BEGIN:VEVENT
+UID
+ :C8BAEA5A-B770-11D7-8FBE-0050E4C50C66
+SUMMARY
+ :Alex and Emma -
+URL
+ :http://www.movie-list.com/trailers.php?id=alexandemma
+CLASS
+ :PUBLIC
+X-MOZILLA-RECUR-DEFAULT-INTERVAL
+ :0
+DTSTART
+ ;VALUE=DATE
+ :20031016
+DTEND
+ ;VALUE=DATE
+ :20031017
+DTSTAMP
+ :20040109T022400Z
+END:VEVENT
+BEGIN:VEVENT
+UID
+ :CCF41603-B770-11D7-8FBE-0050E4C50C66
+SUMMARY
+ :Kill Bill Volume 1
+URL
+ :http://www.movie-list.com/k/killbill.shtml
+CLASS
+ :PUBLIC
+X-MOZILLA-RECUR-DEFAULT-INTERVAL
+ :0
+DTSTART
+ ;VALUE=DATE
+ :20031016
+DTEND
+ ;VALUE=DATE
+ :20031017
+DTSTAMP
+ :20040109T022413Z
+END:VEVENT
+BEGIN:VEVENT
+UID
+ :DBB76B96-B770-11D7-8FBE-0050E4C50C66
+SUMMARY
+ :Intolerable Cruelty\n
+URL
+ :http://www.movie-list.com/trailers.php?id=intolerablecruelty
+CLASS
+ :PUBLIC
+X-MOZILLA-RECUR-DEFAULT-INTERVAL
+ :0
+DTSTART
+ ;VALUE=DATE
+ :20031023
+DTEND
+ ;VALUE=DATE
+ :20031024
+DTSTAMP
+ :20040109T022438Z
+END:VEVENT
+BEGIN:VEVENT
+UID
+ :F52CF678-B770-11D7-8FBE-0050E4C50C66
+SUMMARY
+ :Freddy vs Jason
+URL
+ :http://www.movie-list.com/trailers.php?id=freddyvsjason
+CLASS
+ :PUBLIC
+X-MOZILLA-RECUR-DEFAULT-INTERVAL
+ :0
+DTSTART
+ ;VALUE=DATE
+ :20031023
+DTEND
+ ;VALUE=DATE
+ :20031024
+DTSTAMP
+ :20040109T022444Z
+END:VEVENT
+BEGIN:VEVENT
+UID
+ :FA8DB261-B770-11D7-8FBE-0050E4C50C66
+SUMMARY
+ :Holes\n\n
+URL
+ :http://www.movie-list.com/h/holes.shtml
+CLASS
+ :PUBLIC
+X-MOZILLA-RECUR-DEFAULT-INTERVAL
+ :0
+DTSTART
+ ;VALUE=DATE
+ :20031030
+DTEND
+ ;VALUE=DATE
+ :20031031
+DTSTAMP
+ :20040109T022532Z
+END:VEVENT
+BEGIN:VEVENT
+UID
+ :FD1D3D99-B770-11D7-8FBE-0050E4C50C66
+SUMMARY
+ :Runaway Jury
+URL
+ :http://www.movie-list.com/r/runawayjury.shtml
+CLASS
+ :PUBLIC
+X-MOZILLA-RECUR-DEFAULT-INTERVAL
+ :0
+DTSTART
+ ;VALUE=DATE
+ :20031030
+DTEND
+ ;VALUE=DATE
+ :20031031
+DTSTAMP
+ :20040109T022544Z
+END:VEVENT
+BEGIN:VEVENT
+UID
+ :58C64DE8-B771-11D7-8FBE-0050E4C50C66
+SUMMARY
+ :Elf
+URL
+ :http://elfmovie.com/
+CLASS
+ :PUBLIC
+X-MOZILLA-RECUR-DEFAULT-INTERVAL
+ :0
+DTSTART
+ ;VALUE=DATE
+ :20031127
+DTEND
+ ;VALUE=DATE
+ :20031128
+DTSTAMP
+ :20040114T130827Z
+END:VEVENT
+BEGIN:VEVENT
+UID
+ :5FDE5542-B771-11D7-8FBE-0050E4C50C66
+SUMMARY
+ :Nicholas Nickleby
+URL
+ :http://us.imdb.com/title/tt0309912/
+CLASS
+ :PUBLIC
+X-MOZILLA-RECUR-DEFAULT-INTERVAL
+ :0
+DTSTART
+ ;VALUE=DATE
+ :20031120
+DTEND
+ ;VALUE=DATE
+ :20031121
+DTSTAMP
+ :20040109T023356Z
+END:VEVENT
+BEGIN:VEVENT
+UID
+ :64F4869C-B771-11D7-8FBE-0050E4C50C66
+SUMMARY
+ :Seabiscuit
+URL
+ :http://www.movie-list.com/trailers.php?id=seabiscuit
+CLASS
+ :PUBLIC
+X-MOZILLA-RECUR-DEFAULT-INTERVAL
+ :0
+DTSTART
+ ;VALUE=DATE
+ :20031113
+DTEND
+ ;VALUE=DATE
+ :20031114
+DTSTAMP
+ :20040109T022652Z
+END:VEVENT
+BEGIN:VEVENT
+UID
+ :69083917-B771-11D7-8FBE-0050E4C50C66
+SUMMARY
+ :The Honourable Wally Newman
+CLASS
+ :PUBLIC
+X-MOZILLA-RECUR-DEFAULT-INTERVAL
+ :0
+DTSTART
+ ;VALUE=DATE
+ :20031113
+DTEND
+ ;VALUE=DATE
+ :20031114
+DTSTAMP
+ :20040109T022644Z
+END:VEVENT
+BEGIN:VEVENT
+UID
+ :76FA9A76-B771-11D7-8FBE-0050E4C50C66
+SUMMARY
+ :Mystic River
+DESCRIPTION
+ :Mystic River explores the dark\, interwoven history of three men 
+ and their families coming to terms with a brutal murder on the mean 
+ streets of south Boston...
+URL
+ :http://us.imdb.com/title/tt0327056/
+CLASS
+ :PUBLIC
+X-MOZILLA-RECUR-DEFAULT-INTERVAL
+ :0
+DTSTART
+ ;VALUE=DATE
+ :20031120
+DTEND
+ ;VALUE=DATE
+ :20031121
+DTSTAMP
+ :20040109T023422Z
+END:VEVENT
+BEGIN:VEVENT
+UID
+ :991DA2D2-B771-11D7-8FBE-0050E4C50C66
+SUMMARY
+ :School of Rock
+URL
+ :http://us.imdb.com/title/tt0332379/
+CLASS
+ :PUBLIC
+X-MOZILLA-RECUR-DEFAULT-INTERVAL
+ :0
+DTSTART
+ ;VALUE=DATE
+ :20031120
+DTEND
+ ;VALUE=DATE
+ :20031121
+DTSTAMP
+ :20040109T023448Z
+END:VEVENT
+BEGIN:VEVENT
+UID
+ :C0C9EF5C-B771-11D7-8FBE-0050E4C50C66
+SUMMARY
+ :Brother Bear
+URL
+ :http://disney.go.com/disneypictures/brotherbear/
+CLASS
+ :PUBLIC
+X-MOZILLA-RECUR-DEFAULT-INTERVAL
+ :0
+DTSTART
+ ;VALUE=DATE
+ :20031226
+DTEND
+ ;VALUE=DATE
+ :20031227
+DTSTAMP
+ :20040130T022151Z
+END:VEVENT
+BEGIN:VEVENT
+UID
+ :DD1A2D8E-B788-11D7-98AE-0050E4C50C66
+SUMMARY
+ :Mr and
+CLASS
+ :PUBLIC
+X-MOZILLA-RECUR-DEFAULT-INTERVAL
+ :0
+DTSTART
+ :20030731T230000
+DTEND
+ :20030801T000000
+DTSTAMP
+ :20030716T122737Z
+END:VEVENT
+BEGIN:VEVENT
+UID
+ :E77268CA-B788-11D7-98AE-0050E4C50C66
+SUMMARY
+ :Mr
+CLASS
+ :PUBLIC
+X-MOZILLA-RECUR-DEFAULT-INTERVAL
+ :0
+DTSTART
+ :20030731T230000
+DTEND
+ :20030801T000000
+DTSTAMP
+ :20030716T122750Z
+END:VEVENT
+BEGIN:VEVENT
+UID
+ :EDA9BFBC-B788-11D7-98AE-0050E4C50C66
+SUMMARY
+ :New Event
+CLASS
+ :PUBLIC
+X-MOZILLA-RECUR-DEFAULT-INTERVAL
+ :0
+DTSTART
+ :20030731T230000
+DTEND
+ :20030801T000000
+DTSTAMP
+ :20030716T122756Z
+END:VEVENT
+BEGIN:VEVENT
+UID
+ :531D2DE2-B78A-11D7-98AE-0050E4C50C66
+SUMMARY
+ :Rugrats Go Wild -
+URL
+ :http://www.movie-list.com/trailers.php?id=rugratsgowild
+CLASS
+ :PUBLIC
+X-MOZILLA-RECUR-DEFAULT-INTERVAL
+ :0
+DTSTART
+ ;VALUE=DATE
+ :20030925
+DTEND
+ ;VALUE=DATE
+ :20030926
+DTSTAMP
+ :20040109T022304Z
+END:VEVENT
+BEGIN:VEVENT
+UID
+ :C5CEA534-B78A-11D7-98AE-0050E4C50C66
+SUMMARY
+ :The Wannabes
+CLASS
+ :PUBLIC
+X-MOZILLA-RECUR-DEFAULT-INTERVAL
+ :0
+DTSTART
+ ;VALUE=DATE
+ :20030925
+DTEND
+ ;VALUE=DATE
+ :20030926
+DTSTAMP
+ :20040109T022318Z
+END:VEVENT
+BEGIN:VEVENT
+UID
+ :75AA4E8E-B78B-11D7-98AE-0050E4C50C66
+SUMMARY
+ :Gettin' Square
+CLASS
+ :PUBLIC
+X-MOZILLA-RECUR-DEFAULT-INTERVAL
+ :0
+DTSTART
+ ;VALUE=DATE
+ :20031009
+DTEND
+ ;VALUE=DATE
+ :20031010
+DTSTAMP
+ :20040109T022341Z
+END:VEVENT
+BEGIN:VEVENT
+UID
+ :E77DA524-B78B-11D7-98AE-0050E4C50C66
+SUMMARY
+ :Underworld
+URL
+ :http://www.movie-list.com/trailers.php?id=underworld
+CLASS
+ :PUBLIC
+X-MOZILLA-RECUR-DEFAULT-INTERVAL
+ :0
+DTSTART
+ ;VALUE=DATE
+ :20040122
+DTEND
+ ;VALUE=DATE
+ :20040123
+DTSTAMP
+ :20040209T220323Z
+END:VEVENT
+BEGIN:VEVENT
+UID
+ :16D3301C-B78D-11D7-98AE-0050E4C50C66
+SUMMARY
+ :Medallion\, The\n
+URL
+ :http://www.movie-list.com/trailers.php?id=medallion
+CLASS
+ :PUBLIC
+X-MOZILLA-RECUR-DEFAULT-INTERVAL
+ :0
+DTSTART
+ ;VALUE=DATE
+ :20031030
+DTEND
+ ;VALUE=DATE
+ :20031031
+DTSTAMP
+ :20040109T022453Z
+END:VEVENT
+BEGIN:VEVENT
+UID
+ :B8A6A612-B78D-11D7-98AE-0050E4C50C66
+SUMMARY
+ :Matrix Revolutions -
+URL
+ :http://www.movie-list.com/trailers.php?id=matrixrevolutions
+CLASS
+ :PUBLIC
+X-MOZILLA-RECUR-DEFAULT-INTERVAL
+ :0
+DTSTART
+ ;VALUE=DATE
+ :20031106
+DTEND
+ ;VALUE=DATE
+ :20031107
+DTSTAMP
+ :20040109T022605Z
+END:VEVENT
+BEGIN:VEVENT
+UID
+ :346534FC-B78E-11D7-98AE-0050E4C50C66
+SUMMARY
+ :Uptown Girls
+URL
+ :http://us.imdb.com/title/tt0263757/
+CLASS
+ :PUBLIC
+X-MOZILLA-RECUR-DEFAULT-INTERVAL
+ :0
+DTSTART
+ ;VALUE=DATE
+ :20031120
+DTEND
+ ;VALUE=DATE
+ :20031121
+DTSTAMP
+ :20040109T023331Z
+END:VEVENT
+BEGIN:VEVENT
+UID
+ :6ED80E14-B78E-11D7-98AE-0050E4C50C66
+SUMMARY
+ :One Perfect Day
+DESCRIPTION
+ :Dan Spielman\, Leanna Walsman\, Kerry Armstrong\, Abbie Cornish. 
+ D: Paul Currie (debut). One perfect day tells the story of a 22 year 
+ old musical prodigy\, Tommy Matisse (Dan Spielman) who embarks on 
+ a journey of self-discovery as he confronts his own beliefs to seek 
+ answers relating to his sister???s life and death. \n\n\"grooves 
+ to a dynamic\, passionate and electric beat\, whilst never speaking 
+ down to the niche youth-audience it???s targeted at. \" - moviehole
+LOCATION
+ :Kerry Armstrong\, Dan Spielman\, Directed by Paul Currie.
+URL
+ :http://www.movie-list.com/trailers.php?id=oneperfectday
+CLASS
+ :PUBLIC
+X-MOZILLA-RECUR-DEFAULT-INTERVAL
+ :0
+DTSTART
+ ;VALUE=DATE
+ :20040219
+DTEND
+ ;VALUE=DATE
+ :20040220
+DTSTAMP
+ :20040205T080939Z
+END:VEVENT
+BEGIN:VEVENT
+UID
+ :9C3EDDE0-B78E-11D7-98AE-0050E4C50C66
+SUMMARY
+ :Sin Eater\, The
+DESCRIPTION
+ :A young conflicted NY priest\, Alex       Bermier (Ledger)\, helps 
+ a female detective\, Lucy Sinclair (Sossamon)\,       investigating 
+ the case of the French ambassador\, whose corpse was covered  with 
+ mysterious religious symbols written in Aramaic.\n\n\"A supernaturally 
+ silly drama about priests\, exorcism\, sin-eaters and Heath Ledger 
+ struggling with such pious problems as how to keep his fake Euro accent 
+ in place.\"\n-- Jami Bernard\, NEW YORK NEWS
+LOCATION
+ :Heath Ledger\, Shannyn Sossamon\, Mark Addy\, Directed by Brian 
+ Helgeland
+URL
+ :http://www.movie-list.com/trailers.php?id=order
+CLASS
+ :PUBLIC
+X-MOZILLA-RECUR-DEFAULT-INTERVAL
+ :0
+DTSTART
+ ;VALUE=DATE
+ :20040219
+DTEND
+ ;VALUE=DATE
+ :20040220
+DTSTAMP
+ :20040108T084618Z
+END:VEVENT
+BEGIN:VEVENT
+UID
+ :2DADD58E-B78F-11D7-98AE-0050E4C50C66
+SUMMARY
+ :Good Boy
+URL
+ :http://www.movie-list.com/trailers.php?id=goodboy
+CLASS
+ :PUBLIC
+X-MOZILLA-RECUR-DEFAULT-INTERVAL
+ :0
+DTSTART
+ ;VALUE=DATE
+ :20031127
+DTEND
+ ;VALUE=DATE
+ :20031128
+DTSTAMP
+ :20040114T130823Z
+END:VEVENT
+BEGIN:VEVENT
+UID
+ :EAFC91EC-B7FB-11D7-98AE-0050E4C50C66
+SUMMARY
+ :Master and Commander
+URL
+ :http://darkhorizons.com/2003/masterandcommander.php
+CLASS
+ :PUBLIC
+X-MOZILLA-RECUR-DEFAULT-INTERVAL
+ :0
+DTSTART
+ ;VALUE=DATE
+ :20031204
+DTEND
+ ;VALUE=DATE
+ :20031205
+DTSTAMP
+ :20040114T130844Z
+END:VEVENT
+BEGIN:VEVENT
+UID
+ :F973724C-B7FB-11D7-98AE-0050E4C50C66
+SUMMARY
+ :Looney Tunes: Back in Action
+URL
+ :http://darkhorizons.com/2003/looneytunesbackinaction.php
+CLASS
+ :PUBLIC
+X-MOZILLA-RECUR-DEFAULT-INTERVAL
+ :0
+DTSTART
+ ;VALUE=DATE
+ :20031211
+DTEND
+ ;VALUE=DATE
+ :20031212
+DTSTAMP
+ :20040114T130917Z
+END:VEVENT
+BEGIN:VEVENT
+UID
+ :07D52B50-B7FC-11D7-98AE-0050E4C50C66
+SUMMARY
+ :Welcome to the Jungle aka The Run Down
+LOCATION
+ :Seann William Scott\, Christopher Walker\, Rosario Dawson.
+URL
+ :http://www.therundown.com/
+CLASS
+ :PUBLIC
+X-MOZILLA-RECUR-DEFAULT-INTERVAL
+ :0
+DTSTART
+ ;VALUE=DATE
+ :20040101
+DTEND
+ ;VALUE=DATE
+ :20040102
+DTSTAMP
+ :20040204T061117Z
+END:VEVENT
+BEGIN:VEVENT
+UID
+ :2145281F-B7FC-11D7-98AE-0050E4C50C66
+SUMMARY
+ :Lord of the Rings: The Return of the King\n
+DESCRIPTION
+ :\n
+URL
+ :http://www.lordoftherings.net/
+CLASS
+ :PUBLIC
+X-MOZILLA-RECUR-DEFAULT-INTERVAL
+ :0
+DTSTART
+ ;VALUE=DATE
+ :20031226
+DTEND
+ ;VALUE=DATE
+ :20031227
+DTSTAMP
+ :20040130T022141Z
+END:VEVENT
+BEGIN:VEVENT
+UID
+ :28C20E2A-B7FC-11D7-98AE-0050E4C50C66
+SUMMARY
+ :Love Actually
+URL
+ :http://www.loveactually.com/
+CLASS
+ :PUBLIC
+X-MOZILLA-RECUR-DEFAULT-INTERVAL
+ :0
+DTSTART
+ ;VALUE=DATE
+ :20031226
+DTEND
+ ;VALUE=DATE
+ :20031227
+DTSTAMP
+ :20040130T022145Z
+END:VEVENT
+BEGIN:VEVENT
+UID
+ :2FFB536A-B7FC-11D7-98AE-0050E4C50C66
+SUMMARY
+ :Peter Pan
+CLASS
+ :PUBLIC
+X-MOZILLA-RECUR-DEFAULT-INTERVAL
+ :0
+DTSTART
+ ;VALUE=DATE
+ :20031218
+DTEND
+ ;VALUE=DATE
+ :20031219
+DTSTAMP
+ :20040130T022130Z
+END:VEVENT
+BEGIN:VEVENT
+UID
+ :9F5865BE-B7FF-11D7-A7B3-0050E4C50C66
+SUMMARY
+ :Spy Kids 3D
+LOCATION
+ :Sylvester Stallone\, Directed by Michael Rodriguez
+URL
+ :http://www.movie-list.com/trailers.php?id=spykids3
+CLASS
+ :PUBLIC
+X-MOZILLA-RECUR-DEFAULT-INTERVAL
+ :0
+DTSTART
+ ;VALUE=DATE
+ :20040101
+DTEND
+ ;VALUE=DATE
+ :20040102
+DTSTAMP
+ :20040204T061122Z
+END:VEVENT
+BEGIN:VEVENT
+UID
+ :A39CAC56-B7FF-11D7-A7B3-0050E4C50C66
+SUMMARY
+ :Cold Mountain
+URL
+ :http://www.apple.com/trailers/miramax/cold_mountain/
+CLASS
+ :PUBLIC
+X-MOZILLA-RECUR-DEFAULT-INTERVAL
+ :0
+DTSTART
+ ;VALUE=DATE
+ :20040101
+DTEND
+ ;VALUE=DATE
+ :20040102
+DTSTAMP
+ :20040204T061203Z
+END:VEVENT
+BEGIN:VEVENT
+UID
+ :B5CE8E4C-B7FF-11D7-A7B3-0050E4C50C66
+SUMMARY
+ :The Last Samurai
+DESCRIPTION
+ :Set in Japan during the 1870s\, The Last Samurai tells the story 
+ of Capt. Nathan Algren (Tom Cruise)\, an American military officer 
+ hired by the Emperor of Japan to train the country's first army in 
+ the art of modern warfare.????\n\n\"Great to look at and respectful 
+ of its subject matter\, this is an epic with excitement\, brains 
+ and heart.\"\n-- Brian Webster\, APOLLO GUIDE\n
+URL
+ :http://www.movie-list.com/trailers.php?id=lastsamurai
+CLASS
+ :PUBLIC
+X-MOZILLA-RECUR-DEFAULT-INTERVAL
+ :0
+DTSTART
+ ;VALUE=DATE
+ :20040115
+DTEND
+ ;VALUE=DATE
+ :20040116
+DTSTAMP
+ :20040108T075642Z
+END:VEVENT
+BEGIN:VEVENT
+UID
+ :BCF496E0-B7FF-11D7-A7B3-0050E4C50C66
+SUMMARY
+ :Cheaper By The Dozen
+URL
+ :http://us.imdb.com/title/tt0349205/
+CLASS
+ :PUBLIC
+X-MOZILLA-RECUR-DEFAULT-INTERVAL
+ :0
+DTSTART
+ ;VALUE=DATE
+ :20040108
+DTEND
+ ;VALUE=DATE
+ :20040109
+DTSTAMP
+ :20040204T061710Z
+END:VEVENT
+BEGIN:VEVENT
+UID
+ :E61FB149-B803-11D7-A7B3-0050E4C50C66
+SUMMARY
+ :Sylvia
+DESCRIPTION
+ :Director Christine Jeffs takes the heartbreaking story of writer Sylvia 
+ Plath's life and suicide (which has taken on mythological significance 
+ in certain literary circles) and renders it in a palette of surprising 
+ beauty. ??\n\n\"Sylvia delves into the tawdry details\, which 
+ give the movie all the power of ... a daytime soap.\"\n-- Gary Thompson
+LOCATION
+ :Gwyneth Paltrow\, Daniel Craig\, Michael Gambon\, Jared Harris\, 
+ Blythe
+URL
+ :http://www.movie-list.com/trailers.php?id=sylvia
+CLASS
+ :PUBLIC
+X-MOZILLA-RECUR-DEFAULT-INTERVAL
+ :0
+DTSTART
+ ;VALUE=DATE
+ :20040129
+DTEND
+ ;VALUE=DATE
+ :20040130
+DTSTAMP
+ :20040108T080633Z
+END:VEVENT
+BEGIN:VEVENT
+UID
+ :E8D2A882-B803-11D7-A7B3-0050E4C50C66
+SUMMARY
+ :Texas Chainsaw Massacre\, The
+URL
+ :http://us.imdb.com/title/tt0324216/
+CLASS
+ :PUBLIC
+X-MOZILLA-RECUR-DEFAULT-INTERVAL
+ :0
+DTSTART
+ ;VALUE=DATE
+ :20031120
+DTEND
+ ;VALUE=DATE
+ :20031121
+DTSTAMP
+ :20040109T023538Z
+END:VEVENT
+BEGIN:VEVENT
+UID
+ :F4D3A90A-B826-11D7-BABE-0050E4C50C66
+SUMMARY
+ :Oceans 12
+CLASS
+ :PUBLIC
+X-MOZILLA-RECUR-DEFAULT-INTERVAL
+ :0
+DTSTART
+ ;VALUE=DATE
+ :20041226
+DTEND
+ ;VALUE=DATE
+ :20041227
+DTSTAMP
+ :20030717T071928Z
+END:VEVENT
+BEGIN:VEVENT
+UID
+ :F80AB0BC-B2A9-11D7-B3D4-0050E4C50C66
+SUMMARY
+ :In Laws
+CLASS
+ :PUBLIC
+X-MOZILLA-RECUR-DEFAULT-INTERVAL
+ :0
+DTSTART
+ ;VALUE=DATE
+ :20030828
+DTEND
+ ;VALUE=DATE
+ :20030829
+DTSTAMP
+ :20040109T022205Z
+END:VEVENT
+BEGIN:VEVENT
+UID
+ :9A6C34F6-BDA4-11D7-8992-0050E4C50C66
+SUMMARY
+ :S.W.A.T
+URL
+ :http://www.movie-list.com/trailers.php?id=swat
+CLASS
+ :PUBLIC
+X-MOZILLA-RECUR-DEFAULT-INTERVAL
+ :0
+DTSTART
+ ;VALUE=DATE
+ :20031127
+DTEND
+ ;VALUE=DATE
+ :20031128
+DTSTAMP
+ :20040114T130832Z
+END:VEVENT
+BEGIN:VEVENT
+UID
+ :2A57D4DB-BDA5-11D7-8992-0050E4C50C66
+SUMMARY
+ :Scary Movie 3
+DESCRIPTION
+ :\n
+CLASS
+ :PUBLIC
+X-MOZILLA-RECUR-DEFAULT-INTERVAL
+ :0
+DTSTART
+ ;VALUE=DATE
+ :20031211
+DTEND
+ ;VALUE=DATE
+ :20031212
+DTSTAMP
+ :20040130T022418Z
+END:VEVENT
+BEGIN:VEVENT
+UID
+ :0B18064D-BDA6-11D7-8992-0050E4C50C66
+SUMMARY
+ :Timeline
+LOCATION
+ :Paul Walker\, Frances O'Connor\nDirected by Richard Donner
+URL
+ :http://www.movie-list.com/trailers.php?id=timeline
+CLASS
+ :PUBLIC
+X-MOZILLA-RECUR-DEFAULT-INTERVAL
+ :0
+DTSTART
+ ;VALUE=DATE
+ :20040205
+DTEND
+ ;VALUE=DATE
+ :20040206
+DTSTAMP
+ :20040314T025056Z
+END:VEVENT
+BEGIN:VEVENT
+UID
+ :22028875-C883-11D7-947E-0050E4C50C66
+SUMMARY
+ :Something's Gotta Give
+URL
+ :http://us.imdb.com/title/tt0337741/
+CLASS
+ :PUBLIC
+X-MOZILLA-RECUR-DEFAULT-INTERVAL
+ :0
+DTSTART
+ ;VALUE=DATE
+ :20040108
+DTEND
+ ;VALUE=DATE
+ :20040109
+DTSTAMP
+ :20040204T061705Z
+END:VEVENT
+BEGIN:VEVENT
+UID
+ :368C4524-CF02-11D7-B1B3-0050E4C50C66
+SUMMARY
+ :Big Fish
+LOCATION
+ :Ewan McGregor\, Albert Finney\, Jessica Lange\, Danny DeVito\, 
+ Helena Bonham Carter. Director: Tim Burton
+URL
+ :http://www.apple.com/trailers/sony_pictures/big_fish/
+CLASS
+ :PUBLIC
+X-MOZILLA-RECUR-DEFAULT-INTERVAL
+ :0
+DTSTART
+ ;VALUE=DATE
+ :20040205
+DTEND
+ ;VALUE=DATE
+ :20040206
+DTSTAMP
+ :20040314T025100Z
+END:VEVENT
+BEGIN:VEVENT
+UID
+ :12BDC0F4-D520-11D7-9509-0050E4C50C66
+SUMMARY
+ :Honey
+URL
+ :http://us.imdb.com/title/tt0322589/
+CLASS
+ :PUBLIC
+X-MOZILLA-RECUR-DEFAULT-INTERVAL
+ :0
+DTSTART
+ ;VALUE=DATE
+ :20040108
+DTEND
+ ;VALUE=DATE
+ :20040109
+DTSTAMP
+ :20040204T061702Z
+END:VEVENT
+BEGIN:VEVENT
+UID
+ :B6B19FAC-DBA6-11D7-B8AE-0050E4C50C66
+SUMMARY
+ :Once Upon a Time in Mexico
+LOCATION
+ :Antonio Banderas\, Johnny Depp\, Salma Hayek\nDirected by Robert 
+ Rodriguez
+URL
+ :http://www.movie-list.com/trailers.php?id=onceuponatimeinmexico
+CLASS
+ :PUBLIC
+X-MOZILLA-RECUR-DEFAULT-INTERVAL
+ :0
+DTSTART
+ ;VALUE=DATE
+ :20040226
+DTEND
+ ;VALUE=DATE
+ :20040227
+DTSTAMP
+ :20040314T025015Z
+END:VEVENT
+BEGIN:VEVENT
+UID
+ :98BACC62-DBA8-11D7-B8AE-0050E4C50C66
+SUMMARY
+ :Stuck On You
+LOCATION
+ :Matt Damon\, Greg Kinnear\, Directed by the Farrelly brothers
+URL
+ :http://www.movie-list.com/s/stuckonyou.shtml
+CLASS
+ :PUBLIC
+X-MOZILLA-RECUR-DEFAULT-INTERVAL
+ :0
+DTSTART
+ ;VALUE=DATE
+ :20040212
+DTEND
+ ;VALUE=DATE
+ :20040213
+DTSTAMP
+ :20040314T025133Z
+END:VEVENT
+BEGIN:VEVENT
+UID
+ :C42C607A-DBA9-11D7-B8AE-0050E4C50C66
+SUMMARY
+ :Veronica Guerin
+LOCATION
+ :Cate Blanchett\, Gerard McSorley\, Ciaran Hinds\nDirected by Joel 
+ Schumacher
+URL
+ :http://www.movie-list.com/v/veronicaguerin.shtml
+CLASS
+ :PUBLIC
+X-MOZILLA-RECUR-DEFAULT-INTERVAL
+ :0
+DTSTART
+ ;VALUE=DATE
+ :20040115
+DTEND
+ ;VALUE=DATE
+ :20040116
+DTSTAMP
+ :20040225T234607Z
+END:VEVENT
+BEGIN:VEVENT
+UID
+ :4E766A8D-DBAA-11D7-B8AE-0050E4C50C66
+SUMMARY
+ :Torque
+LOCATION
+ :Ice Cube\, Jay Hernandez\, Dane Cook\,Jaime Pressly\, Faizon Love
+URL
+ :http://www.movie-list.com/trailers.php?id=torque
+CLASS
+ :PUBLIC
+X-MOZILLA-RECUR-DEFAULT-INTERVAL
+ :0
+DTSTART
+ ;VALUE=DATE
+ :20040122
+DTEND
+ ;VALUE=DATE
+ :20040123
+DTSTAMP
+ :20040209T220343Z
+END:VEVENT
+BEGIN:VEVENT
+UID
+ :E078BC0A-DBAA-11D7-B8AE-0050E4C50C66
+SUMMARY
+ :Out of Time
+LOCATION
+ :Denzel Washington\; Sanaa Lathan\; Dean Cain\; Eva Mendes\; Alex 
+ Carter
+URL
+ :http://www.movie-list.com/o/outoftime.shtml
+CLASS
+ :PUBLIC
+X-MOZILLA-RECUR-DEFAULT-INTERVAL
+ :0
+DTSTART
+ ;VALUE=DATE
+ :20040129
+DTEND
+ ;VALUE=DATE
+ :20040130
+DTSTAMP
+ :20040314T025047Z
+END:VEVENT
+BEGIN:VEVENT
+UID
+ :D8D78EC3-E0FD-11D7-8420-0050E4C50C66
+SUMMARY
+ :Fellowship of the ring : Extended Edition
+URL
+ :http://www.lordoftherings.net/
+CLASS
+ :PUBLIC
+X-MOZILLA-RECUR-DEFAULT-INTERVAL
+ :0
+DTSTART
+ ;VALUE=DATE
+ :20031211
+DTEND
+ ;VALUE=DATE
+ :20031212
+DTSTAMP
+ :20040114T130858Z
+END:VEVENT
+BEGIN:VEVENT
+UID
+ :A045EA5E-E0FE-11D7-8420-0050E4C50C66
+SUMMARY
+ :Two Towers: Extended Edition
+CLASS
+ :PUBLIC
+X-MOZILLA-RECUR-DEFAULT-INTERVAL
+ :0
+DTSTART
+ ;VALUE=DATE
+ :20031218
+DTEND
+ ;VALUE=DATE
+ :20031219
+DTSTAMP
+ :20040130T022135Z
+END:VEVENT
+BEGIN:VEVENT
+UID
+ :2A68E47E-E29A-11D7-8F13-0050E4C50C66
+SUMMARY
+ :dr parikh
+CLASS
+ :PUBLIC
+X-MOZILLA-RECUR-DEFAULT-INTERVAL
+ :0
+DTSTART
+ :20030910T111500
+DTEND
+ :20030910T121500
+DTSTAMP
+ :20030909T074953Z
+END:VEVENT
+BEGIN:VEVENT
+UID
+ :AD39AA27-EAB4-11D7-A5A2-0050E4C50C66
+SUMMARY
+ :Calendar Girls\n
+URL
+ :http://www.movie-list.com/trailers.php?id=calendargirls
+CLASS
+ :PUBLIC
+X-MOZILLA-RECUR-DEFAULT-INTERVAL
+ :0
+DTSTART
+ ;VALUE=DATE
+ :20031009
+DTEND
+ ;VALUE=DATE
+ :20031010
+DTSTAMP
+ :20040109T022346Z
+END:VEVENT
+BEGIN:VEVENT
+UID
+ :91FC077E-EAB5-11D7-A5A2-0050E4C50C66
+SUMMARY
+ :Cabin Fever
+URL
+ :http://www.movie-list.com/trailers.php?id=cabinfever
+CLASS
+ :PUBLIC
+X-MOZILLA-RECUR-DEFAULT-INTERVAL
+ :0
+DTSTART
+ ;VALUE=DATE
+ :20031204
+DTEND
+ ;VALUE=DATE
+ :20031205
+DTSTAMP
+ :20040114T130838Z
+END:VEVENT
+BEGIN:VEVENT
+UID
+ :2E3A3E44-EAB7-11D7-A5A2-0050E4C50C66
+SUMMARY
+ :In America
+LOCATION
+ :Paddy Considine\, director: Jim Sheridan
+URL
+ :http://www.movie-list.com/i/inamerica.shtml
+CLASS
+ :PUBLIC
+X-MOZILLA-RECUR-DEFAULT-INTERVAL
+ :0
+DTSTART
+ ;VALUE=DATE
+ :20040122
+DTEND
+ ;VALUE=DATE
+ :20040123
+DTSTAMP
+ :20040209T222558Z
+END:VEVENT
+BEGIN:VEVENT
+UID
+ :0554DF6E-F290-11D7-A47E-0050E4C50C66
+SUMMARY
+ :Mambo Italiano
+URL
+ :http://www.movie-list.com/trailers.php?id=mamboitaliano
+CLASS
+ :PUBLIC
+X-MOZILLA-RECUR-DEFAULT-INTERVAL
+ :0
+DTSTART
+ ;VALUE=DATE
+ :20031023
+DTEND
+ ;VALUE=DATE
+ :20031024
+DTSTAMP
+ :20040109T022422Z
+END:VEVENT
+BEGIN:VEVENT
+UID
+ :E29DDEAA-F491-11D7-A522-0050E4C50C66
+SUMMARY
+ :Laurel Canyon\n
+URL
+ :http://www.apple.com/trailers/sony/laurel_canyon.html
+CLASS
+ :PUBLIC
+X-MOZILLA-RECUR-DEFAULT-INTERVAL
+ :0
+DTSTART
+ ;VALUE=DATE
+ :20031030
+DTEND
+ ;VALUE=DATE
+ :20031031
+DTSTAMP
+ :20040109T022524Z
+END:VEVENT
+BEGIN:VEVENT
+UID
+ :8CCBA852-F492-11D7-A522-0050E4C50C66
+SUMMARY
+ :Jet Lag
+URL
+ :http://www.apple.com/trailers/miramax/jet_lag.html
+CLASS
+ :PUBLIC
+X-MOZILLA-RECUR-DEFAULT-INTERVAL
+ :0
+DTSTART
+ ;VALUE=DATE
+ :20031030
+DTEND
+ ;VALUE=DATE
+ :20031031
+DTSTAMP
+ :20040109T022512Z
+END:VEVENT
+BEGIN:VEVENT
+UID
+ :27DDCB52-F493-11D7-A522-0050E4C50C66
+SUMMARY
+ :Formula 51
+URL
+ :http://www.apple.com/trailers/columbia/formula_51/
+CLASS
+ :PUBLIC
+X-MOZILLA-RECUR-DEFAULT-INTERVAL
+ :0
+DTSTART
+ ;VALUE=DATE
+ :20031030
+DTEND
+ ;VALUE=DATE
+ :20031031
+DTSTAMP
+ :20040109T022503Z
+END:VEVENT
+BEGIN:VEVENT
+UID
+ :C37782F9-F493-11D7-A522-0050E4C50C66
+SUMMARY
+ :In the Cut \n
+URL
+ :http://www.movie-list.com/trailers.php?id=inthecut
+CLASS
+ :PUBLIC
+X-MOZILLA-RECUR-DEFAULT-INTERVAL
+ :0
+DTSTART
+ ;VALUE=DATE
+ :20031113
+DTEND
+ ;VALUE=DATE
+ :20031114
+DTSTAMP
+ :20040109T022648Z
+END:VEVENT
+BEGIN:VEVENT
+UID
+ :E0956030-F4A9-11D7-A522-0050E4C50C66
+SUMMARY
+ :Lost in Translation
+URL
+ :http://www.focusfeatures.com/
+CLASS
+ :PUBLIC
+X-MOZILLA-RECUR-DEFAULT-INTERVAL
+ :0
+DTSTART
+ ;VALUE=DATE
+ :20031226
+DTEND
+ ;VALUE=DATE
+ :20031227
+DTSTAMP
+ :20040130T022200Z
+END:VEVENT
+BEGIN:VEVENT
+UID
+ :21429594-FAE1-11D7-B0FA-000A958D1EFE
+SUMMARY
+ :Alien: Director's Cut
+URL
+ :http://www.apple.com/trailers/fox/alien_25/
+CLASS
+ :PUBLIC
+X-MOZILLA-RECUR-DEFAULT-INTERVAL
+ :0
+DTSTART
+ ;VALUE=DATE
+ :20031113
+DTEND
+ ;VALUE=DATE
+ :20031114
+DTSTAMP
+ :20040109T022629Z
+END:VEVENT
+BEGIN:VEVENT
+UID
+ :CF4F742C-FAE1-11D7-B0FA-000A958D1EFE
+SUMMARY
+ :Misadventures in 3d (IMAX)
+DESCRIPTION
+ :A sequel to nWave's 'Encounter in the Third Dimension' (1999)\, dealing 
+ with the groundbreaking nature of large format 3D cinema. The first 
+ episode was a comedy about the history of 3D cinema. Encounter II 
+ deals with the future of the format.
+CLASS
+ :PUBLIC
+X-MOZILLA-RECUR-DEFAULT-INTERVAL
+ :0
+DTSTART
+ ;VALUE=DATE
+ :20031120
+DTEND
+ ;VALUE=DATE
+ :20031121
+DTSTAMP
+ :20031110T031429Z
+END:VEVENT
+BEGIN:VEVENT
+UID
+ :E572A6EC-FAE4-11D7-B0FA-000A958D1EFE
+SUMMARY
+ :Brown Sugar
+URL
+ :http://www2.foxsearchlight.com/brownsugar/
+CLASS
+ :PUBLIC
+X-MOZILLA-RECUR-DEFAULT-INTERVAL
+ :0
+DTSTART
+ ;VALUE=DATE
+ :20031211
+DTEND
+ ;VALUE=DATE
+ :20031212
+DTSTAMP
+ :20040114T130902Z
+END:VEVENT
+BEGIN:VEVENT
+UID
+ :62CCA3E4-FAE7-11D7-B0FA-000A958D1EFE
+SUMMARY
+ :Bright Young Things
+URL
+ :http://iconmovies.co.uk/brightyoungthings/
+CLASS
+ :PUBLIC
+X-MOZILLA-RECUR-DEFAULT-INTERVAL
+ :0
+DTSTART
+ ;VALUE=DATE
+ :20031226
+DTEND
+ ;VALUE=DATE
+ :20031227
+DTSTAMP
+ :20040130T022148Z
+END:VEVENT
+BEGIN:VEVENT
+UID
+ :9987E6F8-FAEC-11D7-B0FA-000A958D1EFE
+SUMMARY
+ :Camp
+DESCRIPTION
+ : Todd Graff's crowd-pleasing directorial debut pays tribute to summer 
+ camps\, musical theatre\, and Stephen Sondheim. \n\n\"The combination 
+ of sap\, echoes of truth\, and lots of razzle-dazzle\, song-and-dance 
+ is lethal.\"\n-- Thom Fowler\, HOLLYWOOD BITCHSLAP
+URL
+ :http://www.apple.com/trailers/independent/camp.html
+CLASS
+ :PUBLIC
+X-MOZILLA-RECUR-DEFAULT-INTERVAL
+ :0
+DTSTART
+ ;VALUE=DATE
+ :20040304
+DTEND
+ ;VALUE=DATE
+ :20040305
+DTSTAMP
+ :20040130T013949Z
+END:VEVENT
+BEGIN:VEVENT
+UID
+ :D1CF26D2-FAED-11D7-B0FA-000A958D1EFE
+SUMMARY
+ :Along Came Polly
+URL
+ :http://www.apple.com/trailers/universal/along_came_polly/
+CLASS
+ :PUBLIC
+X-MOZILLA-RECUR-DEFAULT-INTERVAL
+ :0
+DTSTART
+ ;VALUE=DATE
+ :20040122
+DTEND
+ ;VALUE=DATE
+ :20040123
+DTSTAMP
+ :20040209T220334Z
+END:VEVENT
+BEGIN:VEVENT
+UID
+ :B5CAFE48-FF86-11D7-8061-000A958D1EFE
+SUMMARY
+ :Raising Victor Vargas -
+URL
+ :http://www.apple.com/trailers/samuel_goldwyn/raising_victor_vargas.html
+CLASS
+ :PUBLIC
+X-MOZILLA-RECUR-DEFAULT-INTERVAL
+ :0
+DTSTART
+ ;VALUE=DATE
+ :20031023
+DTEND
+ ;VALUE=DATE
+ :20031024
+DTSTAMP
+ :20040109T022427Z
+END:VEVENT
+BEGIN:VEVENT
+UID
+ :F5178AE8-090B-11D8-B1DB-000A958D1EFE
+SUMMARY
+ :Step Into Liquid
+URL
+ :http://www.apple.com/trailers/artisan/step_into_liquid/
+CLASS
+ :PUBLIC
+X-MOZILLA-RECUR-DEFAULT-INTERVAL
+ :0
+DTSTART
+ ;VALUE=DATE
+ :20040115
+DTEND
+ ;VALUE=DATE
+ :20040116
+DTSTAMP
+ :20040225T234600Z
+END:VEVENT
+BEGIN:VEVENT
+UID
+ :EB1CF48C-0D34-11D8-9D9F-000A958D1EFE
+SUMMARY
+ :Dickie Roberts\, Former Child Star
+DESCRIPTION
+ :In the reverse rags-to-riches story of DICKIE ROBERTS: FORMER CHILD 
+ STAR\, writer/actor David Spade's string of infectious laughs turn 
+ into waves of compassion. \n\n\"Just a platform for Spade to tell 
+ smutty jokes to kids\, fall off bicycles\, puncture waterbeds\, 
+ and\, oh yes\, learn the real meaning of family.\"\n-- David Edelstein\,
+  SLATE
+LOCATION
+ :David Spade\; Craig Bierko\; Jenna Boyd\; Jon Lovitz\; Mary McCormack
+URL
+ :http://www.movie-list.com/trailers.php?id=dickieroberts
+CLASS
+ :PUBLIC
+X-MOZILLA-RECUR-DEFAULT-INTERVAL
+ :0
+DTSTART
+ ;VALUE=DATE
+ :20040219
+DTEND
+ ;VALUE=DATE
+ :20040220
+DTSTAMP
+ :20040205T080741Z
+END:VEVENT
+BEGIN:VEVENT
+UID
+ :5C7F689A-0D35-11D8-9D9F-000A958D1EFE
+SUMMARY
+ :Jeepers Creepers 2
+URL
+ :http://www.movie-list.com/trailers.php?id=jeeperscreepers2
+CLASS
+ :PUBLIC
+X-MOZILLA-RECUR-DEFAULT-INTERVAL
+ :0
+DTSTART
+ ;VALUE=DATE
+ :20040205
+DTEND
+ ;VALUE=DATE
+ :20040206
+DTSTAMP
+ :20040314T025104Z
+END:VEVENT
+BEGIN:VEVENT
+UID
+ :F1818C74-0D35-11D8-9D9F-000A958D1EFE
+SUMMARY
+ :Big Bounce
+DESCRIPTION
+ :Set on Hawaii's stunning North Shore\, a charismatic drifter (Owen 
+ Wilson) forms a dubious alliance with a powerful local businessman 
+ (Morgan Freeman) while hooking up with a criminally-minded seductress 
+ (Sara Foster) to double-cross a wealthy developer (Gary Sinise) and 
+ his cohorts (Charlie Sheen).\n\n\"A travelogue pretending to be 
+ a movie.\"\n-- Chauncey Mabe\, SOUTH FLORIDA SUN-SENTINEL
+LOCATION
+ :Owen Wilson\, Morgan Freeman\, Gary Sinise\, Charlie Sheen\, Sara 
+ Foster. Director: George Armitage
+URL
+ :http://www.movie-list.com/trailers.php?id=bigbounce
+CLASS
+ :PUBLIC
+X-MOZILLA-RECUR-DEFAULT-INTERVAL
+ :0
+DTSTART
+ ;VALUE=DATE
+ :20040311
+DTEND
+ ;VALUE=DATE
+ :20040312
+DTSTAMP
+ :20040205T081925Z
+END:VEVENT
+BEGIN:VEVENT
+UID
+ :18D1C4EE-0D36-11D8-9D9F-000A958D1EFE
+SUMMARY
+ :Drumline
+LOCATION
+ :Orlando Jones\, Director: Charles Stone
+URL
+ :http://www.movie-list.com/d/drumline.shtml
+CLASS
+ :PUBLIC
+X-MOZILLA-RECUR-DEFAULT-INTERVAL
+ :0
+DTSTART
+ ;VALUE=DATE
+ :20040212
+DTEND
+ ;VALUE=DATE
+ :20040213
+DTSTAMP
+ :20040314T025116Z
+END:VEVENT
+BEGIN:VEVENT
+UID
+ :C33B96EE-0D9E-11D8-9D9F-000A958D1EFE
+SUMMARY
+ :Open Range
+LOCATION
+ :Kevin Costner\; Annette Bening\; Abraham Benrubi\; Robert Duvall\; 
+ Michael Gambon. Director: Kevin Costner
+URL
+ :http://www.movie-list.com/trailers.php?id=openrange
+CLASS
+ :PUBLIC
+X-MOZILLA-RECUR-DEFAULT-INTERVAL
+ :0
+DTSTART
+ ;VALUE=DATE
+ :20040212
+DTEND
+ ;VALUE=DATE
+ :20040213
+DTSTAMP
+ :20040314T025147Z
+END:VEVENT
+BEGIN:VEVENT
+UID
+ :97C0E9FE-0D9F-11D8-9D9F-000A958D1EFE
+SUMMARY
+ :Shattered Glass
+LOCATION
+ :Hayden Christensen\, Chloe Sevigny\, Hank Azaria\, Rosario Dawson\, 
+ Maggie Gyllenhaal
+URL
+ :http://www.movie-list.com/trailers.php?id=shatteredglass
+CLASS
+ :PUBLIC
+X-MOZILLA-RECUR-DEFAULT-INTERVAL
+ :0
+DTSTART
+ ;VALUE=DATE
+ :20040212
+DTEND
+ ;VALUE=DATE
+ :20040213
+DTSTAMP
+ :20040314T025129Z
+END:VEVENT
+BEGIN:VEVENT
+UID
+ :C2679196-0D9F-11D8-9D9F-000A958D1EFE
+SUMMARY
+ :Under the Tuscan Sun
+LOCATION
+ :Diane Lane
+URL
+ :http://tuscansun.movies.com/
+CLASS
+ :PUBLIC
+X-MOZILLA-RECUR-DEFAULT-INTERVAL
+ :0
+DTSTART
+ ;VALUE=DATE
+ :20040212
+DTEND
+ ;VALUE=DATE
+ :20040213
+DTSTAMP
+ :20040314T025144Z
+END:VEVENT
+BEGIN:VEVENT
+UID
+ :9924742C-0DA1-11D8-9D9F-000A958D1EFE
+SUMMARY
+ :Mona Lisa Smile
+DESCRIPTION
+ :Mike Newell's MONA LISA SMILE is a pretty period film that combines 
+ a quaint pedagogical tale with a feminist dissection of traditional 
+ female roles in 1950s society\n\n\"Newell tries to make a profound 
+ film that challenges the social standards of the 1950s\, but all 
+ he does is throw some stereotypes up against some other stereotypes.\"\n--
+  Josh Bell\, LAS VEGAS WEEKL
+LOCATION
+ :Julia Roberts\, Maggie Gyllenhaal\, Kirsten Dunst
+URL
+ :http://www.movie-list.com/trailers.php?id=monalisasmile
+CLASS
+ :PUBLIC
+X-MOZILLA-RECUR-DEFAULT-INTERVAL
+ :0
+DTSTART
+ ;VALUE=DATE
+ :20040219
+DTEND
+ ;VALUE=DATE
+ :20040220
+DTSTAMP
+ :20040108T084057Z
+END:VEVENT
+BEGIN:VEVENT
+UID
+ :7CE9491F-0DA2-11D8-9D9F-000A958D1EFE
+SUMMARY
+ :Humain Stain\, the
+DESCRIPTION
+ :The story of Coleman Silk (ANTHONY HOPKINS)\, a distinguished professor 
+ at a prestigious New England college whose professional life is shattered 
+ by allegations of racism and whose personal life is infected with 
+ the cancer of a lie he has been living for fifty years.??\"All the 
+ talent and expertise has resulted in a film that\, while poised and 
+ beautifully crafted\, is emotionally detached and remote.\"\n-- 
+ Frank Swietek\, ONE GUY'S OPINION
+URL
+ :http://www.miramax.com/the_human_stain/
+CLASS
+ :PUBLIC
+X-MOZILLA-RECUR-DEFAULT-INTERVAL
+ :0
+DTSTART
+ ;VALUE=DATE
+ :20040304
+DTEND
+ ;VALUE=DATE
+ :20040305
+DTSTAMP
+ :20031205T084858Z
+END:VEVENT
+BEGIN:VEVENT
+UID
+ :1D1BC802-0DA3-11D8-9D9F-000A958D1EFE
+SUMMARY
+ :Secondhand Lions
+LOCATION
+ :Michael Caine\, Robert Duvall\, Haley Joel Osment\, Director: Tim 
+ McCanlies
+URL
+ :http://www.movie-list.com/trailers.php?id=secondhandlions
+CLASS
+ :PUBLIC
+X-MOZILLA-RECUR-DEFAULT-INTERVAL
+ :0
+DTSTART
+ ;VALUE=DATE
+ :20040226
+DTEND
+ ;VALUE=DATE
+ :20040227
+DTSTAMP
+ :20040314T024958Z
+END:VEVENT
+BEGIN:VEVENT
+UID
+ :F54CB761-0DA3-11D8-9D9F-000A958D1EFE
+SUMMARY
+ :Ocean Wonderland 3D (IMAX)
+DESCRIPTION
+ :\"Perfectly balances entertainment and nature-science elements in 
+ its brisk and sometimes thrilling 46 minutes.\"\n-- Bruce Kirkland\, 
+ JAM! MOVIES
+LOCATION
+ :Narrated by Liam Neeson
+URL
+ :http://us.imdb.com/title/tt0270291/
+CLASS
+ :PUBLIC
+X-MOZILLA-RECUR-DEFAULT-INTERVAL
+ :0
+DTSTART
+ ;VALUE=DATE
+ :20040219
+DTEND
+ ;VALUE=DATE
+ :20040220
+DTSTAMP
+ :20040130T013352Z
+END:VEVENT
+BEGIN:VEVENT
+UID
+ :6B2A061C-1A94-11D8-B19A-000A958D1EFE
+SUMMARY
+ :Wonderland
+LOCATION
+ :Val Kilmer\, Lisa Kudrow\, Kate Bosworth\, Josh Lucas\, Christina 
+ Applegate
+URL
+ :http://www.wonderlandthemovie.com/
+CLASS
+ :PUBLIC
+X-MOZILLA-RECUR-DEFAULT-INTERVAL
+ :0
+DTSTART
+ ;VALUE=DATE
+ :20040129
+DTEND
+ ;VALUE=DATE
+ :20040130
+DTSTAMP
+ :20040314T025043Z
+END:VEVENT
+BEGIN:VEVENT
+UID
+ :ADD125A8-23B5-11D8-AA82-000A958D1EFE
+SUMMARY
+ :House of Sand and Fog
+LOCATION
+ :Sir Ben Kingsley\, Jennifer Connelly\, Ron Eldard\, Shohreh Aghdashloo\,
+  Jonathan Ahdout
+URL
+ :http://www.movie-list.com/trailers.php?id=houseofsandandfog
+CLASS
+ :PUBLIC
+X-MOZILLA-RECUR-DEFAULT-INTERVAL
+ :0
+DTSTART
+ ;VALUE=DATE
+ :20040212
+DTEND
+ ;VALUE=DATE
+ :20040213
+DTSTAMP
+ :20040314T025140Z
+END:VEVENT
+BEGIN:VEVENT
+UID
+ :FE08BDE5-26FF-11D8-AA82-000A958D1EFE
+SUMMARY
+ :Fighting Temptations\, The
+DESCRIPTION
+ :A New York advertising executive travels to a small Southern town 
+ to collect an inheritance but finds he must create a gospel choir 
+ and lead it to success before he can collect. \n\n\"When he's not 
+ keening and shucking and jiving and behaving altogether spastically\, 
+ Cuba kicks into full-on \"dramatic mode\" and the results are unquestionab
+ ly more amusing.\"\n-- Scott Weinberg\,EFILMCRITIC.COM
+LOCATION
+ :Cuba Gooding Jr\, Beyonce Knowles
+URL
+ :http://www.apple.com/trailers/paramount/the_fighting_temptations/
+CLASS
+ :PUBLIC
+X-MOZILLA-RECUR-DEFAULT-INTERVAL
+ :0
+DTSTART
+ ;VALUE=DATE
+ :20040304
+DTEND
+ ;VALUE=DATE
+ :20040305
+DTSTAMP
+ :20040205T081454Z
+END:VEVENT
+BEGIN:VEVENT
+UID
+ :0CCE9724-2700-11D8-AA82-000A958D1EFE
+SUMMARY
+ :Missing\, The
+DESCRIPTION
+ :In 19th-century New Mexico\, a father (Tommy Lee Jones) comes back 
+ home\, hoping to reconcile with his adult daughter Maggie (Cate Blanchett).
+ \n\n??\"The movie can't overcome characterizations that are as 
+ spare as the landscapes and a Searchers- like story line that just 
+ isn't interesting enough to sustain interest over the course of 135 
+ minutes.\"\n-- Glenn Whipp\, LOS ANGELES DAILY NEWS
+URL
+ :http://darkhorizons.com/2003/missing.php
+CLASS
+ :PUBLIC
+X-MOZILLA-RECUR-DEFAULT-INTERVAL
+ :0
+DTSTART
+ ;VALUE=DATE
+ :20040304
+DTEND
+ ;VALUE=DATE
+ :20040305
+DTSTAMP
+ :20040205T081434Z
+END:VEVENT
+BEGIN:VEVENT
+UID
+ :CF4CF2A7-296A-11D8-965C-000A958D1EFE
+SUMMARY
+ :Passion of the Christ\, The
+DESCRIPTION
+ :A film detailing the final hours and crucifixion of Jesus Christ.. 
+ directed by Mel Gibson. \n\n\"shouldn't be second-guessed with 
+ religious or political agendas. It stands as a work of art\" - AICN
+LOCATION
+ :James Caviezel\, Monica Belluci\, Directed by Mel Gibson
+URL
+ :http://www.thepassionofthechrist.com/
+CLASS
+ :PUBLIC
+X-MOZILLA-RECUR-DEFAULT-INTERVAL
+ :0
+DTSTART
+ ;VALUE=DATE
+ :20040225
+DTEND
+ ;VALUE=DATE
+ :20040226
+DTSTAMP
+ :20040108T085726Z
+END:VEVENT
+BEGIN:VEVENT
+UID
+ :D9AEA84D-296B-11D8-965C-000A958D1EFE
+SUMMARY
+ :Chasing Liberty
+DESCRIPTION
+ :Tired of being followed around every moment of every day\, the 18-year-old 
+ daughter of the president of the United States ditches her Secret 
+ Service handlers and sets out on a romantic road trip through Europe 
+ with her boyfriend.\n\n\"A fairly standard-issue teen romantic 
+ comedy.\"\n-- James Berardinelli\,REELVIEWS
+LOCATION
+ :Mandy Moore
+URL
+ :http://www.movie-list.com/trailers.php?id=chasingliberty
+CLASS
+ :PUBLIC
+X-MOZILLA-RECUR-DEFAULT-INTERVAL
+ :0
+DTSTART
+ ;VALUE=DATE
+ :20040408
+DTEND
+ ;VALUE=DATE
+ :20040409
+DTSTAMP
+ :20040204T044958Z
+END:VEVENT
+BEGIN:VEVENT
+UID
+ :DC36435A-30A0-11D8-B441-000A958D1EFE
+SUMMARY
+ :Station Agent\, The
+LOCATION
+ :Peter Dinklage\, Patricia Clarkson\, Bobby Cannavale\nDirected 
+ by Tom McCarthy
+URL
+ :http://www.movie-list.com/trailers.php?id=stationagent
+CLASS
+ :PUBLIC
+X-MOZILLA-RECUR-DEFAULT-INTERVAL
+ :0
+DTSTART
+ ;VALUE=DATE
+ :20040205
+DTEND
+ ;VALUE=DATE
+ :20040206
+DTSTAMP
+ :20040314T025112Z
+END:VEVENT
+BEGIN:VEVENT
+UID
+ :61A858A8-30A2-11D8-B441-000A958D1EFE
+SUMMARY
+ :Pieces of April
+DESCRIPTION
+ :Katie Holmes is outstanding as the title character in Peter Hedges's 
+ PIECES OF APRIL. Holmes stars as April Burns\, the black sheep of 
+ her family who has left suburbia for a Lower East Side tenement. ????\n\n\"
+ Pieces of April feel less like a movie and more like a series of moments 
+ in search of one.\"\n-- Kevin Smokler \, filmcritic.com
+LOCATION
+ :Katie Holmes\, Patricia Clarkson\, Oliver Platt\nDirected by Peter 
+ Hedges
+URL
+ :http://www.piecesofaprilmovie.com/
+CLASS
+ :PUBLIC
+X-MOZILLA-RECUR-DEFAULT-INTERVAL
+ :0
+DTSTART
+ ;VALUE=DATE
+ :20040304
+DTEND
+ ;VALUE=DATE
+ :20040305
+DTSTAMP
+ :20040121T075426Z
+END:VEVENT
+BEGIN:VEVENT
+UID
+ :0AFD2D64-30A3-11D8-B441-000A958D1EFE
+SUMMARY
+ :Agent Cody Banks 2: Destination London
+DESCRIPTION
+ :Frankie Muniz returns as super cool spy Cody Banks in Agent Cody Banks 
+ 2. In Cody's new adventure\, a rogue CIA agent has stolen a top secret 
+ mind-control device and Cody has to go undercover in London to get 
+ it back...
+LOCATION
+ :Frankie Muniz\, Hilary Duff\, Angie Harmon\,Anthony Anderson\, 
+ Cynthia Stevenson
+URL
+ :http://www.futuresecretagent.com/
+CLASS
+ :PUBLIC
+X-MOZILLA-RECUR-DEFAULT-INTERVAL
+ :0
+DTSTART
+ ;VALUE=DATE
+ :20040318
+DTEND
+ ;VALUE=DATE
+ :20040319
+DTSTAMP
+ :20040108T090338Z
+END:VEVENT
+BEGIN:VEVENT
+UID
+ :E4E935F6-30A3-11D8-B441-000A958D1EFE
+SUMMARY
+ :Paycheck
+DESCRIPTION
+ :Based on the short story by Philip K. Dick\, \"Paycheck\" is about 
+ world famous genius Michael Jennings (Ben Affleck)\, who does specialized 
+ projects for high-tech corporations...\n\n????\"Sadly\, the once 
+ glowing Hollywood promise of Ben Affleck and director John Woo has 
+ gradually given way to good paycheck hunting.\"\n-- Todd Gilchrist\,FILMS
+ TEW.COM\n
+LOCATION
+ :Ben Affleck\, Aaron Eckhart\, Uma Thurman\,Kathryn Morris\, directed 
+ by John Woo
+URL
+ :http://www.movie-list.com/trailers.php?id=paycheck
+CLASS
+ :PUBLIC
+X-MOZILLA-RECUR-DEFAULT-INTERVAL
+ :0
+DTSTART
+ ;VALUE=DATE
+ :20040318
+DTEND
+ ;VALUE=DATE
+ :20040319
+DTSTAMP
+ :20040108T090715Z
+END:VEVENT
+BEGIN:VEVENT
+UID
+ :4E52DE4B-3B43-11D8-9EA1-000A958D1EFE
+SUMMARY
+ :Gothika
+DESCRIPTION
+ :A brilliant and respected criminal psychologist\, Dr. Miranda Grey 
+ (HALLE BERRY) is an expert at knowing what is rational.. What is sane. 
+ But Miranda's comfortable marriage and stable life are thrust into 
+ terrifying jeopardy after a cryptic encounter with a mysterious young 
+ girl leads to a nightmare beyond her wildest imagination.\n\n\"Dwells 
+ in its own abysmal dreariness without creating real suspense\, relying 
+ instead on a stream of easy shocks to convince us that we're watching 
+ a scary movie.\"\n-- Erich Scholz\, CITYSEARCH
+LOCATION
+ :Halle Berry\, Robert Downey Jr\,
+URL
+ :http://www.movie-list.com/trailers.php?id=gothika
+CLASS
+ :PUBLIC
+X-MOZILLA-RECUR-DEFAULT-INTERVAL
+ :0
+DTSTART
+ ;VALUE=DATE
+ :20040429
+DTEND
+ ;VALUE=DATE
+ :20040430
+DTSTAMP
+ :20040221T005140Z
+END:VEVENT
+BEGIN:VEVENT
+UID
+ :AE628D2C-167E-11D8-9D6F-000A958D1EFE
+SUMMARY
+ :Hidalgo
+DESCRIPTION
+ :Based on the true story of the greatest long-distance horse race ever 
+ run\, \"Hidalgo\" is an epic action-adventure and one man's journey 
+ of personal redemption..
+LOCATION
+ :Viggo Mortensen\, Omar Sharif\, Frank Collison\, Louise Lombard\, 
+ Directed by Joe Johnston
+URL
+ :http://www.movie-list.com/trailers.php?id=hidalgo
+CLASS
+ :PUBLIC
+X-MOZILLA-RECUR-DEFAULT-INTERVAL
+ :0
+DTSTART
+ ;VALUE=DATE
+ :20040318
+DTEND
+ ;VALUE=DATE
+ :20040319
+DTSTAMP
+ :20040209T211727Z
+END:VEVENT
+BEGIN:VEVENT
+UID
+ :B6C91881-090E-11D8-B1DB-000A958D1EFE
+SUMMARY
+ :21 Grams
+LOCATION
+ :Sean Penn\, Benicio Del Toro\,Naomi Watts\, Directed by Alejandro 
+ Gonzalez Inarritu
+URL
+ :http://www.movie-list.com/trailers.php?id=21grams
+CLASS
+ :PUBLIC
+X-MOZILLA-RECUR-DEFAULT-INTERVAL
+ :0
+DTSTART
+ ;VALUE=DATE
+ :20040122
+DTEND
+ ;VALUE=DATE
+ :20040123
+DTSTAMP
+ :20040209T220338Z
+END:VEVENT
+BEGIN:VEVENT
+UID
+ :431667C9-41AA-11D8-8E3D-000A958D1EFE
+SUMMARY
+ :Cat in the Hat
+DESCRIPTION
+ :This adaptation of the classic children's book stars Mike Meyers (AUSTIN 
+ POWERS) as the wily talking cat with a tall striped hat and more than 
+ a few tricks up his sleeve.\n\n\"They missed the point\, But stole 
+ the name / The real question today\, Is who to blame?\"\n-- Steven 
+ Snyder\, ZERTINET MOVIES
+LOCATION
+ :Mike Myers\, Alec Baldwin\,Kelly Preston. Directed by Bo Welch
+URL
+ :http://www.movie-list.com/trailers.php?id=drseusscatinthehat
+CLASS
+ :PUBLIC
+X-MOZILLA-RECUR-DEFAULT-INTERVAL
+ :0
+DTSTART
+ ;VALUE=DATE
+ :20040401
+DTEND
+ ;VALUE=DATE
+ :20040402
+DTSTAMP
+ :20040108T092136Z
+END:VEVENT
+BEGIN:VEVENT
+UID
+ :C4C219E6-41AD-11D8-8E3D-000A958D1EFE
+SUMMARY
+ :50 First Dates
+DESCRIPTION
+ :Adam Sandler and Drew Barrymore star in this romantic comedy about 
+ a man who has to make a woman fall in love with him everyday because 
+ of the woman's short term memory lost...\n\n\"A terrible movie 
+ by all reasonable standards -- yet it leaves a sweet taste.\"\n-- 
+ Jami Bernard\, NEW YORK DAILY NEWS
+LOCATION
+ :Adam Sandler\, Drew Barrymore\, Sean Astin\, Rob Schneider\,\nDirector:
+  Peter Segal
+URL
+ :http://www.movie-list.com/trailers.php?id=50firstdates
+CLASS
+ :PUBLIC
+X-MOZILLA-RECUR-DEFAULT-INTERVAL
+ :0
+DTSTART
+ ;VALUE=DATE
+ :20040325
+DTEND
+ ;VALUE=DATE
+ :20040326
+DTSTAMP
+ :20040221T005439Z
+END:VEVENT
+BEGIN:VEVENT
+UID
+ :C35ABE14-167E-11D8-9D6F-000A958D1EFE
+SUMMARY
+ :Haunted Mansion
+DESCRIPTION
+ :Inspired by Disney's theme park attraction\,Haunted Mansion tells 
+ the story of a man discovering how important his family is through 
+ the intervention of a few ghosts\n\n??\"Mansion is everything we 
+ fearedPirates [of the Caribbean] would be: gimmicky\, unimaginative\, 
+ and shackled to its source like an anvil.\"\n-- Rob Vaux\, FLIPSIDE 
+ MOVIE EMPORIUM
+LOCATION
+ :Eddie Murphy\, Terence Stamp
+URL
+ :http://www.movie-list.com/trailers.php?id=hauntedmansion
+CLASS
+ :PUBLIC
+X-MOZILLA-RECUR-DEFAULT-INTERVAL
+ :0
+DTSTART
+ ;VALUE=DATE
+ :20040325
+DTEND
+ ;VALUE=DATE
+ :20040326
+DTSTAMP
+ :20040218T065453Z
+END:VEVENT
+BEGIN:VEVENT
+UID
+ :C493A654-41AE-11D8-8E3D-000A958D1EFE
+SUMMARY
+ :Scooby Doo 2 : Monster's Unleashed
+DESCRIPTION
+ :The mysterious adventures of the five members of the Mystery\, Inc. 
+ detective agency\, as they investigate the nefarious plans of an 
+ anonymous masked villain who is plotting to take over control of the 
+ city of Coolsville by wreaking mayhem with a monster machine that 
+ recreates Mystery\, Inc.'s greatest classic foes.\n\n\"While Scooby 
+ 2 is probably no worse or better than the first installment\, the 
+ freshness has definitely worn off.\"\n-- John Monaghan\, DETROIT 
+ FREE PRESS\n
+LOCATION
+ :Freddie Prinze Jr. Sarah Michelle Gellar\, Matthew Lillard\, Seth 
+ Green
+URL
+ :http://www.movie-list.com/trailers.php?id=scoobydoo2
+CLASS
+ :PUBLIC
+X-MOZILLA-RECUR-DEFAULT-INTERVAL
+ :0
+DTSTART
+ ;VALUE=DATE
+ :20040401
+DTEND
+ ;VALUE=DATE
+ :20040402
+DTSTAMP
+ :20040330T050612Z
+END:VEVENT
+BEGIN:VEVENT
+UID
+ :B4A01ACE-0D32-11D8-9D9F-000A958D1EFE
+SUMMARY
+ :Beyond Borders
+DESCRIPTION
+ :Set against the backdrop of the world's most dangerous hot spots\, 
+ this thrilling romantic adventure stars Academy Award winner Angelina 
+ Jolie as Sarah Jordan\, a sheltered American socialite living in 
+ London. \n\n\"The formula that gave life to such poignant and powerful 
+ films as The Killing Fieldsand The Year of Living Dangerously this 
+ time results in something closer to parody.\"\n-- Colin Covert\,MINNEAPOL
+ IS STAR TRIBUNE
+LOCATION
+ :Angelina Jolie\, Clive Owen\, Noah Emmerich. Directed by Martin 
+ Campbell
+URL
+ :http://www.movie-list.com/trailers.php?id=beyondborders
+CLASS
+ :PUBLIC
+X-MOZILLA-RECUR-DEFAULT-INTERVAL
+ :0
+DTSTART
+ ;VALUE=DATE
+ :20040318
+DTEND
+ ;VALUE=DATE
+ :20040319
+DTSTAMP
+ :20040218T065356Z
+END:VEVENT
+BEGIN:VEVENT
+UID
+ :12E42769-2B97-11D8-8F07-000A958D1EFE
+SUMMARY
+ :Taking Lives
+DESCRIPTION
+ :An FBI profiler is called in by French Canadian police to catch a 
+ serial killer who takes on the identity of each new victim.\n\n??\"Jolie 
+ is one of those actresses like Ashley Judd who are capable of giving 
+ good performances in good movies\, but for undisclosed reasons have 
+ decided not to.\"\n-- Rob Thomas\, CAPITAL TIMES (MADISON\, WI)
+LOCATION
+ :Angelina Jolie\, Ethan Hawke\, Kiefer Sutherland
+URL
+ :http://www.movie-list.com/trailers.php?id=takinglives
+CLASS
+ :PUBLIC
+X-MOZILLA-RECUR-DEFAULT-INTERVAL
+ :0
+DTSTART
+ ;VALUE=DATE
+ :20040415
+DTEND
+ ;VALUE=DATE
+ :20040416
+DTSTAMP
+ :20040330T051329Z
+END:VEVENT
+BEGIN:VEVENT
+UID
+ :504BD191-4BE9-11D8-A981-000A958D1EFE
+SUMMARY
+ :Starsky and Hutch
+DESCRIPTION
+ :Set in the 1970s in a metropolis called \"Bay City\,\" this is 
+ the tale of two police detective partners\, Ken \"Hutch\" Hutchinson\, 
+ and Dave Starsky\, telling the story of their first big case\, which 
+ involved a former college campus drug dealer who went on to become 
+ a white collar criminal.\n\n\"Starsky & Hutch is guilty pleasure 
+ fun that just rolls along having a grand old time.\"\n-- Bob Bloom\, 
+ JOURNAL AND COURIER (LAFAYETTE\, IN)
+LOCATION
+ :Ben Stiller\, Owen Wilson\, Snoop Dogg\, Vince Vaughn\, Carmen 
+ Electra\, Directed by Todd Phillips
+URL
+ :http://www.movie-list.com/trailers.php?id=starskyandhutch
+CLASS
+ :PUBLIC
+X-MOZILLA-RECUR-DEFAULT-INTERVAL
+ :0
+DTSTART
+ ;VALUE=DATE
+ :20040408
+DTEND
+ ;VALUE=DATE
+ :20040409
+DTSTAMP
+ :20040330T050923Z
+END:VEVENT
+BEGIN:VEVENT
+UID
+ :2D448F3A-468D-11D8-A8A0-000A958D1EFE
+SUMMARY
+ :Catch That Kid
+DESCRIPTION
+ :A remake of the Danish blockbuster \"Klatretosen\,\" MISSION WITHOUT 
+ PERMISSION is an action-packed caper that revolves around a youngster 
+ who\, with the help of two friends\, robs the state-of-the-art bank 
+ where her mother works to acquire the cash needed for a costly operation 
+ to save her ailing father...\n\n\"Another Spy Kids rip-off that???s 
+ no great catch.\"\n-- Thomas Delapa\, BOULDER WEEKLY\n
+URL
+ :http://www.movie-list.com/trailers.php?id=catchthatkid
+CLASS
+ :PUBLIC
+X-MOZILLA-RECUR-DEFAULT-INTERVAL
+ :0
+DTSTART
+ ;VALUE=DATE
+ :20040408
+DTEND
+ ;VALUE=DATE
+ :20040409
+DTSTAMP
+ :20040330T050811Z
+END:VEVENT
+BEGIN:VEVENT
+UID
+ :6ED0468A-2B95-11D8-8F07-000A958D1EFE
+SUMMARY
+ :House of 1000 Corpses
+DESCRIPTION
+ :An empty fuel tank and a flat tire lead two couples down a terror-riddled 
+ road to the House of 1000 Corpses. \n\n\"Neither scary\, perversely 
+ funny nor suspenseful\, this demented dung heap is not even inventively 
+ gory.\"\n-- Megan Lehmann\, NEW YORK POST
+LOCATION
+ :Bill Moseley\, Karen Black\,Chris Hardwick. Directed by Rob Zombie
+URL
+ :http://www.movie-list.com/h/houseof1000corpses.shtml
+CLASS
+ :PUBLIC
+X-MOZILLA-RECUR-DEFAULT-INTERVAL
+ :0
+DTSTART
+ ;VALUE=DATE
+ :20040311
+DTEND
+ ;VALUE=DATE
+ :20040312
+DTSTAMP
+ :20040130T014537Z
+END:VEVENT
+BEGIN:VEVENT
+UID
+ :325B6BB5-52C6-11D8-B289-000A958D1EFE
+SUMMARY
+ :Butterfly Effect\, The
+DESCRIPTION
+ :A young man struggling with the psychological effects of sublimated 
+ childhood memories devises a technique of traveling back in time to 
+ inhabit his childhood body.\n\n\"It's as if [Kutcher] decided that 
+ he would prove himself as a dramatic actor by trying out every clich??d 
+ serious role in the history of cinema.\"\n-- Michael Agger\, SLATE
+LOCATION
+ :Ashton Kutcher\, Amy Smart\,Eric Stoltz
+URL
+ :http://www.movie-list.com/trailers.php?id=butterflyeffect
+CLASS
+ :PUBLIC
+X-MOZILLA-RECUR-DEFAULT-INTERVAL
+ :0
+DTSTART
+ ;VALUE=DATE
+ :20040311
+DTEND
+ ;VALUE=DATE
+ :20040312
+DTSTAMP
+ :20040130T015204Z
+END:VEVENT
+BEGIN:VEVENT
+UID
+ :E485B660-52C9-11D8-B289-000A958D1EFE
+SUMMARY
+ :Eternal Sunshine Of The Spotless Mind
+DESCRIPTION
+ :Joel (Jim Carrey) is stunned to discover that his girlfriend Clementine 
+ (Kate Winslet) has had her memories of their tumultuous relationship 
+ erased.
+LOCATION
+ :Jim Carrey\, Kate Winslet. Directed by Michael Gondry.
+URL
+ :http://www.movie-list.com/trailers.php?id=eternalsunshineofthespotlessmind
+CLASS
+ :PUBLIC
+X-MOZILLA-RECUR-DEFAULT-INTERVAL
+ :0
+DTSTART
+ ;VALUE=DATE
+ :20040422
+DTEND
+ ;VALUE=DATE
+ :20040423
+DTSTAMP
+ :20040225T000906Z
+END:VEVENT
+BEGIN:VEVENT
+UID
+ :AE5C078C-52CA-11D8-B289-000A958D1EFE
+SUMMARY
+ :Perfect Score\, The
+DESCRIPTION
+ :A group of seven high school seniors\, made up of two girls and five 
+ boys\, decide to break into the Princeton Testing Center\, so they 
+ can steal the answers to their upcoming SAT tests and all get perfect 
+ scores.\n\n\"Like The Breakfast Club recast as a videogame for 
+ simpletons.\"\n-- Owen Gleiberman\,ENTERTAINMENT WEEKLY
+URL
+ :http://www.movie-list.com/trailers.php?id=perfectscore
+CLASS
+ :PUBLIC
+X-MOZILLA-RECUR-DEFAULT-INTERVAL
+ :0
+DTSTART
+ ;VALUE=DATE
+ :20040422
+DTEND
+ ;VALUE=DATE
+ :20040423
+DTSTAMP
+ :20040130T022007Z
+END:VEVENT
+BEGIN:VEVENT
+UID
+ :A10194B6-30A1-11D8-B441-000A958D1EFE
+SUMMARY
+ :Grind
+URL
+ :http://www.movie-list.com/trailers.php?id=grind
+CLASS
+ :PUBLIC
+X-MOZILLA-RECUR-DEFAULT-INTERVAL
+ :0
+DTSTART
+ ;VALUE=DATE
+ :20040226
+DTEND
+ ;VALUE=DATE
+ :20040227
+DTSTAMP
+ :20040314T025009Z
+END:VEVENT
+BEGIN:VEVENT
+UID
+ :CBE5867A-56D6-11D8-8E6C-000A958D1EFE
+SUMMARY
+ :Billabong Odyssey
+DESCRIPTION
+ :Surfing documentary.\n\n\"A dog's dinner of profiles\, repetitive 
+ narration\, safety tips and banal 'insights' into the joys and dangers 
+ of cresting waves that sometimes reach 70 feet.\"\n-- Megan Lehmann\, 
+ NEW YORK POST
+URL
+ :http://www.movie-list.com/trailers.php?id=billabongodyssey
+CLASS
+ :PUBLIC
+X-MOZILLA-RECUR-DEFAULT-INTERVAL
+ :0
+DTSTART
+ ;VALUE=DATE
+ :20040325
+DTEND
+ ;VALUE=DATE
+ :20040326
+DTSTAMP
+ :20040318T111244Z
+END:VEVENT
+BEGIN:VEVENT
+UID
+ :5BD3E8DC-0D34-11D8-9D9F-000A958D1EFE
+SUMMARY
+ :Cooler\, The
+DESCRIPTION
+ :Bernie Lootz (William H. Macy) is the unluckiest guy in Vegas. From 
+ a failed marriage to an estranged son to a lost cat\, everything 
+ Bernie touches turns bad. \n\n\"A movie perfectly written for the 
+ look of William H. Macy.\"\n-- Chuck Schwartz\, CRANKY CRITIC&REG
+URL
+ :http://www.movie-list.com/trailers.php?id=cooler
+CLASS
+ :PUBLIC
+X-MOZILLA-RECUR-DEFAULT-INTERVAL
+ :0
+DTSTART
+ ;VALUE=DATE
+ :20040415
+DTEND
+ ;VALUE=DATE
+ :20040416
+DTSTAMP
+ :20040330T051335Z
+END:VEVENT
+BEGIN:VEVENT
+UID
+ :266BE550-56D8-11D8-8E6C-000A958D1EFE
+SUMMARY
+ :Strange Bedfellows
+URL
+ :http://www.movie-list.com/trailers.php?id=strangebedfellows
+CLASS
+ :PUBLIC
+X-MOZILLA-RECUR-DEFAULT-INTERVAL
+ :0
+DTSTART
+ ;VALUE=DATE
+ :20040422
+DTEND
+ ;VALUE=DATE
+ :20040423
+DTSTAMP
+ :20040318T183347Z
+END:VEVENT
+BEGIN:VEVENT
+UID
+ :FF6C6F26-30A1-11D8-B441-000A958D1EFE
+SUMMARY
+ :Welcome to Mooseport
+DESCRIPTION
+ :A former U.S. president whose plan to retire in a small Northeastern 
+ coastal town goes awry when he tries to fill an empty mayoral seat...
+LOCATION
+ :Gene Hackman\, Ray Romano\, Marcia Gay Harden\, Maura Tierney
+URL
+ :http://www.movie-list.com/trailers.php?id=welcometomooseport
+CLASS
+ :PUBLIC
+X-MOZILLA-RECUR-DEFAULT-INTERVAL
+ :0
+DTSTART
+ ;VALUE=DATE
+ :20040429
+DTEND
+ ;VALUE=DATE
+ :20040430
+DTSTAMP
+ :20040204T061336Z
+END:VEVENT
+BEGIN:VEVENT
+UID
+ :9E5FBB10-56D9-11D8-8E6C-000A958D1EFE
+SUMMARY
+ :Connie and Carla
+DESCRIPTION
+ :Two chanteuses working the dinner theater circuit in L.A. take an 
+ undercover assignment\, posing as drag queens. Things get extra-weird 
+ when a guy falls for one of the girls (as a guy?).
+LOCATION
+ :Toni Collette\, David Duchovny
+CLASS
+ :PUBLIC
+X-MOZILLA-RECUR-DEFAULT-INTERVAL
+ :0
+DTSTART
+ ;VALUE=DATE
+ :20040429
+DTEND
+ ;VALUE=DATE
+ :20040430
+DTSTAMP
+ :20040204T061634Z
+END:VEVENT
+BEGIN:VEVENT
+UID
+ :73C5FE96-5B44-11D8-976E-000A958D1EFE
+SUMMARY
+ :Monster
+DESCRIPTION
+ :In a revelatory performance\, Charlize Theron stars in the shocking 
+ and moving true-life story of Aileen Wuornos\, a prostitute executed 
+ last year in Florida after being convicted of murdering six men.\n\n\"The
+ re's Theron\, like a force of nature\, compelling us to go beyond 
+ TV-movie supposition and look Wuornos straight in the eye.\"\n-- 
+ Peter Travers\, ROLLING STONE
+LOCATION
+ :Charlize Theron\, Christina Ricci\, Bruce Dern
+URL
+ :http://www.movie-list.com/trailers.php?id=monster
+CLASS
+ :PUBLIC
+X-MOZILLA-RECUR-DEFAULT-INTERVAL
+ :0
+DTSTART
+ ;VALUE=DATE
+ :20040325
+DTEND
+ ;VALUE=DATE
+ :20040326
+DTSTAMP
+ :20040213T075720Z
+END:VEVENT
+BEGIN:VEVENT
+UID
+ :5CCFE05E-3B43-11D8-9EA1-000A958D1EFE
+SUMMARY
+ :Young Black Stallion (IMAX)
+DESCRIPTION
+ :In Disney's first dramatic feature made specifically for the giant 
+ screen\, Walt Disney Pictures is proud to present the continuation 
+ of a family favorite and a story that has enthralled generations of 
+ readers.\n\n\"As with most IMAX pictures\, the spectacular presentation 
+ is worth seeing\, although this time the cinematography is nearly 
+ ruined by some spectacularly awful child acting.\"\n-- Jeffrey Westhoff\,
+ NORTHWEST HERALD (CRYSTAL LAKE\, IL)
+URL
+ :http://www.movie-list.com/trailers.php?id=youngblackstallion
+CLASS
+ :PUBLIC
+X-MOZILLA-RECUR-DEFAULT-INTERVAL
+ :0
+DTSTART
+ ;VALUE=DATE
+ :20040401
+DTEND
+ ;VALUE=DATE
+ :20040402
+DTSTAMP
+ :20040209T212107Z
+END:VEVENT
+BEGIN:VEVENT
+UID
+ :C83B05F5-5B46-11D8-976E-000A958D1EFE
+SUMMARY
+ :Secret Window
+DESCRIPTION
+ :Mort Rainey\, a writer just coming off of a troublesome divorce with 
+ his ex-wife\, Amy\, finds himself stalked at his remote lake house 
+ by a psychotic stranger who claims Mort stole his best story idea\, 
+ changing just the ending.\n\n\"No matter how good Depp and Turturro 
+ are\, no matter how pretty the cinematography??is...??there just 
+ isn't any suspense or real interest in the story.\" - AICN
+LOCATION
+ :Johnny Depp
+URL
+ :http://www.movie-list.com/trailers.php?id=secretwindow
+CLASS
+ :PUBLIC
+X-MOZILLA-RECUR-DEFAULT-INTERVAL
+ :0
+DTSTART
+ ;VALUE=DATE
+ :20040408
+DTEND
+ ;VALUE=DATE
+ :20040409
+DTSTAMP
+ :20040304T212514Z
+END:VEVENT
+BEGIN:VEVENT
+UID
+ :A6DAFD22-4691-11D8-A8A0-000A958D1EFE
+SUMMARY
+ :Win A Date With Tad Hamilton !
+DESCRIPTION
+ :When a hot young actor\, Tad Hamilton agrees to participate in a 
+ \"win a date\" contest to promote his new movie\, his world is 
+ turned upside-down when he finds himself falling in love with the 
+ winner\, a grocery store checkout girl from West Virginia named \n\n??\"
+ A nice but inconsequential romancer.\"\n-- Robert Koehler\, VARIETY
+LOCATION
+ :Kate Bosworth\, Topher Grace\,Nathan Lane. Directed by Robert Luketic
+URL
+ :http://www.movie-list.com/trailers.php?id=winadatewithtadhamilton
+CLASS
+ :PUBLIC
+X-MOZILLA-RECUR-DEFAULT-INTERVAL
+ :0
+DTSTART
+ ;VALUE=DATE
+ :20040415
+DTEND
+ ;VALUE=DATE
+ :20040416
+DTSTAMP
+ :20040209T213227Z
+END:VEVENT
+BEGIN:VEVENT
+UID
+ :9E6AF11C-0DA2-11D8-9D9F-000A958D1EFE
+SUMMARY
+ :Kill Bill volume 2
+DESCRIPTION
+ :The Bride continues her vengeance quest against her ex-boss\, Bill\, 
+ and his associates.
+LOCATION
+ :Uma Thurman\, Lucy Liu\,David Carradine\, Directed by Quentin Tarantino
+URL
+ :http://www.movie-list.com/trailers.php?id=killbill
+CLASS
+ :PUBLIC
+X-MOZILLA-RECUR-DEFAULT-INTERVAL
+ :0
+DTSTART
+ ;VALUE=DATE
+ :20040422
+DTEND
+ ;VALUE=DATE
+ :20040423
+DTSTAMP
+ :20040209T213729Z
+END:VEVENT
+BEGIN:VEVENT
+UID
+ :DBAA74C4-5B49-11D8-976E-000A958D1EFE
+SUMMARY
+ :Twisted
+DESCRIPTION
+ :In this thriller starring Ashley Judd\, a detective who is an expert 
+ at profiling murderers finds herself stumped by a difficult case with 
+ a killer who may actually be somebody she knows--and is coming after 
+ her...\n
+LOCATION
+ :Ashley Judd\, Samuel L. Jackson\, Andy Garcia\, D.W. Moffett\, 
+ Mark Pellegrino
+URL
+ :http://www.movie-list.com/trailers.php?id=twisted
+CLASS
+ :PUBLIC
+X-MOZILLA-RECUR-DEFAULT-INTERVAL
+ :0
+DTSTART
+ ;VALUE=DATE
+ :20040429
+DTEND
+ ;VALUE=DATE
+ :20040430
+DTSTAMP
+ :20040209T215100Z
+END:VEVENT
+BEGIN:VEVENT
+UID
+ :2EFCF209-5B4A-11D8-976E-000A958D1EFE
+SUMMARY
+ :Van Helsing
+DESCRIPTION
+ :Set in the late 19th century\, monster hunter Dr. Abraham Van Helsing 
+ is summoned to a mysterious land in East Europe to vanquish evil forces... 
+ evil forces with names like Count Dracula\, the Wolf Man\, and Frankenstei
+ n's Monster.
+LOCATION
+ :Hugh Jackman\, Kate Beckinsale\, Richard Roxburgh\, David Wenham. 
+ Director: Stephen Sommers
+URL
+ :http://www.movie-list.com/trailers.php?id=vanhelsing
+CLASS
+ :PUBLIC
+X-MOZILLA-RECUR-DEFAULT-INTERVAL
+ :0
+DTSTART
+ ;VALUE=DATE
+ :20040506
+DTEND
+ ;VALUE=DATE
+ :20040507
+DTSTAMP
+ :20040209T215514Z
+END:VEVENT
+BEGIN:VEVENT
+UID
+ :43BF518B-5B4B-11D8-976E-000A958D1EFE
+SUMMARY
+ :You Got Served
+DESCRIPTION
+ :Explores the social subculture of street dancing\, focusing on a 
+ pair of friends\, David and Elgin\, who want to open their own hip-hop 
+ dance and recording studio.\n\n\"On the checklist of things a movie 
+ should offer\, like character development\, dialogue with subtext 
+ and plausibility\, You Got Served is more like You Got Screwed.\"\n-- 
+ Jami Bernard\, NEW YORK DAILY NEWS
+URL
+ :http://www.movie-list.com/trailers.php?id=yougotserved
+CLASS
+ :PUBLIC
+X-MOZILLA-RECUR-DEFAULT-INTERVAL
+ :0
+DTSTART
+ ;VALUE=DATE
+ :20040617
+DTEND
+ ;VALUE=DATE
+ :20040618
+DTSTAMP
+ :20040318T183544Z
+END:VEVENT
+BEGIN:VEVENT
+UID
+ :624DB792-5DFA-11D8-A6BA-000A958D1EFE
+SUMMARY
+ :Hebrew Hammer
+DESCRIPTION
+ :Jefferson Carver\, also known as the Hebrew Hammer\, a private detective 
+ who has an overbearing mother (Nora Dunn) and a propensity to whine 
+ when things get difficult\n\n\"The corker-to-groaner ratio heavily 
+ favors the latter as the bagel-and-dreidel jokes begin to lose their 
+ spark\, as does the story.\"\n-- Robert Abele\, L.A. WEEKLY
+LOCATION
+ :Adam Goldberg\, Andy Dick
+URL
+ :http://www.movie-list.com/trailers.php?id=hebrewhammer
+CLASS
+ :PUBLIC
+X-MOZILLA-RECUR-DEFAULT-INTERVAL
+ :0
+DTSTART
+ ;VALUE=DATE
+ :20040325
+DTEND
+ ;VALUE=DATE
+ :20040326
+DTSTAMP
+ :20040213T081228Z
+END:VEVENT
+BEGIN:VEVENT
+UID
+ :0A76F396-5DFD-11D8-A6BA-000A958D1EFE
+SUMMARY
+ :Company\, The
+DESCRIPTION
+ :A look at the world of ballet.\n\n\"The experience will satisfy 
+ ballet lovers more than film lovers.\"\n-- Jeffrey Westhoff\, NORTHWEST 
+ HERALD (CRYSTAL LAKE\, IL
+LOCATION
+ :Neve Campbell\, Malcolm McDowell\, James Franco\nDirected by Robert 
+ Altman
+URL
+ :http://www.movie-list.com/trailers.php?id=company
+CLASS
+ :PUBLIC
+X-MOZILLA-RECUR-DEFAULT-INTERVAL
+ :0
+DTSTART
+ ;VALUE=DATE
+ :20040513
+DTEND
+ ;VALUE=DATE
+ :20040514
+DTSTAMP
+ :20040213T082211Z
+END:VEVENT
+BEGIN:VEVENT
+UID
+ :93C449F0-5DFD-11D8-A6BA-000A958D1EFE
+SUMMARY
+ :Troy
+DESCRIPTION
+ :In 1193 B.C.\, Prince Paris of Troy stole the beautiful Greek woman\, 
+ Helen\, away from her husband\, Menelaus\, the king of Sparta\, 
+ setting the two nations at war with each other.
+LOCATION
+ :Brad Pitt\, Eric Bana\, Orlando Bloom\, Diane Kruger\, Peter O'Toole. 
+ Director: Wolfgang Petersen
+URL
+ :http://www.movie-list.com/trailers.php?id=troy
+CLASS
+ :PUBLIC
+X-MOZILLA-RECUR-DEFAULT-INTERVAL
+ :0
+DTSTART
+ ;VALUE=DATE
+ :20040513
+DTEND
+ ;VALUE=DATE
+ :20040514
+DTSTAMP
+ :20040213T082419Z
+END:VEVENT
+BEGIN:VEVENT
+UID
+ :2B38D5E6-61DC-11D8-961E-000A958D1EFE
+SUMMARY
+ :Scarface
+LOCATION
+ :Al Pacino\, Steven Bauer\, Michelle Pfeiffer. Director: Brian De 
+ Palma
+URL
+ :http://www.movie-list.com/trailers.php?id=scarface
+CLASS
+ :PUBLIC
+X-MOZILLA-RECUR-DEFAULT-INTERVAL
+ :0
+DTSTART
+ ;VALUE=DATE
+ :20040226
+DTEND
+ ;VALUE=DATE
+ :20040227
+DTSTAMP
+ :20040330T051600Z
+END:VEVENT
+BEGIN:VEVENT
+UID
+ :AE93AE12-61DC-11D8-961E-000A958D1EFE
+SUMMARY
+ :Solarmax (IMAX)
+DESCRIPTION
+ :Documentary tells the story of humankind's struggle to understand 
+ the sun.\n\n\"I thought I was back in grade school watching 'Our 
+ Mister Sun.'\"\n-- Robert Roten\, LARAMIE MOVIE SCOPE
+CLASS
+ :PUBLIC
+X-MOZILLA-RECUR-DEFAULT-INTERVAL
+ :0
+DTSTART
+ ;VALUE=DATE
+ :20040318
+DTEND
+ ;VALUE=DATE
+ :20040319
+DTSTAMP
+ :20040310T010350Z
+END:VEVENT
+BEGIN:VEVENT
+UID
+ :767EA137-61DE-11D8-961E-000A958D1EFE
+SUMMARY
+ :Against the Ropes
+DESCRIPTION
+ :Jackie Kallen (Meg Ryan) knows a winner when she sees one. As soon 
+ as she sees Luther Shaw in a fight\, Jackie knows he's a champion 
+ in the raw\n\n\"Meg Ryan's swell\, but this \"Erin Rocky-vich\" 
+ inspirational story lacks punch.\"\n-- Michael Rechtshaffen\, HOLLYWOOD 
+ REPORTER
+LOCATION
+ :Meg Ryan\; Omar Epps
+URL
+ :http://www.movie-list.com/trailers.php?id=againsttheropes
+CLASS
+ :PUBLIC
+X-MOZILLA-RECUR-DEFAULT-INTERVAL
+ :0
+DTSTART
+ ;VALUE=DATE
+ :20040520
+DTEND
+ ;VALUE=DATE
+ :20040521
+DTSTAMP
+ :20040218T065105Z
+END:VEVENT
+BEGIN:VEVENT
+UID
+ :A6FA2BBC-2B96-11D8-8F07-000A958D1EFE
+SUMMARY
+ :Thunderstruck
+DESCRIPTION
+ :After a near death experience\, five Boys\, all devoted AC/DC fans\, 
+ make a pact to bury their best friend next to the grave of Bon Scott. 
+ 12 years later\, having gone their different ways\, they come together 
+ to fulfill the promise.
+LOCATION
+ :Roy Billing\, Stephen Curry\, Damon Gameau
+CLASS
+ :PUBLIC
+X-MOZILLA-RECUR-DEFAULT-INTERVAL
+ :0
+DTSTART
+ ;VALUE=DATE
+ :20040520
+DTEND
+ ;VALUE=DATE
+ :20040521
+DTSTAMP
+ :20040218T065121Z
+END:VEVENT
+BEGIN:VEVENT
+UID
+ :59E5182C-6218-11D8-961E-000A958D1EFE
+SUMMARY
+ :New Event
+CLASS
+ :PUBLIC
+X-MOZILLA-RECUR-DEFAULT-INTERVAL
+ :0
+DTSTART
+ :20040219T000000
+DTEND
+ :20040219T010000
+DTSTAMP
+ :20040218T134253Z
+END:VEVENT
+BEGIN:VEVENT
+UID
+ :5CC87FFC-6407-11D8-AA60-000A958D1EFE
+SUMMARY
+ :Evelyn
+DESCRIPTION
+ :Desmond Doyle\, an Irishman whose troubles mount after his philandering 
+ wife runs away with another man\, and now must fight to regain his 
+ children\,\n\n\"It's that rare family movie -- genuine and sweet 
+ without relying on animation or dumb humor.\"\n-- Mary F. Pols\, 
+ CONTRA COSTA TIMES\n
+LOCATION
+ :Pierce Brosnan\, Aidan Quinn. Directed by Bruce Beresford
+URL
+ :http://www.movie-list.com/e/evelyn.shtml
+CLASS
+ :PUBLIC
+X-MOZILLA-RECUR-DEFAULT-INTERVAL
+ :0
+DTSTART
+ ;VALUE=DATE
+ :20040506
+DTEND
+ ;VALUE=DATE
+ :20040507
+DTSTAMP
+ :20040221T004943Z
+END:VEVENT
+BEGIN:VEVENT
+UID
+ :F002D124-6724-11D8-9A21-000A958D1EFE
+SUMMARY
+ :Bon Voyage
+DESCRIPTION
+ :At the start of World War II\, the fate of the free world hangs in 
+ the balance at the posh Hotel Splendide in Bordeaux\n\n\"The bustling 
+ structure keeps us gripped\, even though there's too much going on.\"\n--
+  Rich Cline\, SHADOWS ON THE WALL
+LOCATION
+ :Rupert Everett\, Isabelle Adjani\, Virginie Ledoyen
+URL
+ :http://www.movie-list.com/trailers.php?id=bonvoyage
+CLASS
+ :PUBLIC
+X-MOZILLA-RECUR-DEFAULT-INTERVAL
+ :0
+DTSTART
+ ;VALUE=DATE
+ :20040527
+DTEND
+ ;VALUE=DATE
+ :20040528
+DTSTAMP
+ :20040225T000026Z
+END:VEVENT
+BEGIN:VEVENT
+UID
+ :9F593EEE-6725-11D8-9A21-000A958D1EFE
+SUMMARY
+ :Day After Tomorrow\, The
+DESCRIPTION
+ :A big-budget\, mega-event epic motion picture that revolves around 
+ an abrupt climate change that has cataclysmic consequences for the 
+ planet
+URL
+ :http://www.movie-list.com/trailers.php?id=dayaftertomorrow
+CLASS
+ :PUBLIC
+X-MOZILLA-RECUR-DEFAULT-INTERVAL
+ :0
+DTSTART
+ ;VALUE=DATE
+ :20040527
+DTEND
+ ;VALUE=DATE
+ :20040528
+DTSTAMP
+ :20040225T000236Z
+END:VEVENT
+BEGIN:VEVENT
+UID
+ :AA438D50-3B40-11D8-9EA1-000A958D1EFE
+SUMMARY
+ :Dirty Pretty Things
+DESCRIPTION
+ :Chiwetel Ejiofor gives a remarkably understated performance in director 
+ Stephen Frears's offbeat and gripping drama DIRTY PRETTY THINGS.\n\n\"Not
+  only does Frears dress this London with a palpable atmosphere -- 
+ and even a kind of rank smell and rough touch -- but he also coaxes 
+ deeply affecting performances out of his stars.\"\n-- Jeffrey M. 
+ Anderson\, SAN FRANCISCO EXAMINER
+LOCATION
+ :Chjwetel Ejiofor\, Audrey Tautou\, Sergi Lopez\, Directed by Stephen 
+ Frears
+URL
+ :http://www.miramax.com/dirty_pretty_things/
+CLASS
+ :PUBLIC
+X-MOZILLA-RECUR-DEFAULT-INTERVAL
+ :0
+DTSTART
+ ;VALUE=DATE
+ :20040527
+DTEND
+ ;VALUE=DATE
+ :20040528
+DTSTAMP
+ :20040225T000343Z
+END:VEVENT
+BEGIN:VEVENT
+UID
+ :1C1D56D0-6D6A-11D8-AA68-000A27B6071A
+SUMMARY
+ :Stepford Wives\, The
+DESCRIPTION
+ :Joanna\, a young wife and mother\, moves from Manhattan to the upper-class
+  suburb of Stepford\, Connecticut. Once there\, she makes friends 
+ with bombastic Bobbie Markowitz. Together they find out\, much to 
+ their horror\, that all the housewives are strangely blissful\, 
+ and somehow... doomed.
+LOCATION
+ :Nicole Kidman\, Bette Midler\, Matthew Broderick\, Christopher 
+ Walken\, Glenn Close\, Jon Lovitz. Directed by Frank Oz
+URL
+ :http://www.movie-list.com/trailers.php?id=stepfordwives
+CLASS
+ :PUBLIC
+X-MOZILLA-RECUR-DEFAULT-INTERVAL
+ :0
+DTSTART
+ ;VALUE=DATE
+ :20040603
+DTEND
+ ;VALUE=DATE
+ :20040604
+DTSTAMP
+ :20040303T232933Z
+END:VEVENT
+BEGIN:VEVENT
+UID
+ :4BB14D27-722F-11D8-B1E4-000A27B6071A
+SUMMARY
+ :Teachers Pet
+DESCRIPTION
+ :Spot\, a talking dog who longs to be a boy so much that he even dresses 
+ up as one so he can accompany his owner Leonard to school??..\n\n\"This 
+ completely random creation is essentially an adult's cartoon cut for 
+ a kid's short attention span.\"\n-- Ed Gonzalez\, CITY PAGES\, 
+ MINNEAPOLIS/ST. PAUL\n
+LOCATION
+ :Nathan Lane\, Kelsey Grammer\, Jerry Stiller
+URL
+ :http://www.movie-list.com/trailers.php?id=teacherspet
+CLASS
+ :PUBLIC
+X-MOZILLA-RECUR-DEFAULT-INTERVAL
+ :0
+DTSTART
+ ;VALUE=DATE
+ :20040506
+DTEND
+ ;VALUE=DATE
+ :20040507
+DTSTAMP
+ :20040310T011204Z
+END:VEVENT
+BEGIN:VEVENT
+UID
+ :11474DEF-7230-11D8-B1E4-000A27B6071A
+SUMMARY
+ :Breakin' All The Rules
+DESCRIPTION
+ :A romantic comedy about a man who\, after being unceremoniously dumped 
+ by his  fiance\, pens a \"how to\" book on breaking up and becomes 
+ a best-selling author on the subject.
+LOCATION
+ :Jamie Foxx
+URL
+ :http://www.movie-list.com/trailers.php?id=breakinalltherules
+CLASS
+ :PUBLIC
+X-MOZILLA-RECUR-DEFAULT-INTERVAL
+ :0
+DTSTART
+ ;VALUE=DATE
+ :20040812
+DTEND
+ ;VALUE=DATE
+ :20040813
+DTSTAMP
+ :20040318T184352Z
+END:VEVENT
+BEGIN:VEVENT
+UID
+ :37BBFC2A-7230-11D8-B1E4-000A27B6071A
+SUMMARY
+ :Harry Potter And The Prisoner Of Azkaban
+DESCRIPTION
+ :Harry Potter and his friends Ron and Hermione return as teenagers 
+ to Hogwarts School of Witchcraft and Wizardry for their third year 
+ of study\, where they delve into the mystery surrounding an escaped 
+ prisoner who poses a dangerous threat to the young wizard.
+LOCATION
+ :Daniel Radcliffe\, Rupert Grint\, Emma Watson\, Michael Gamon\, 
+ Gary Oldman\, Dawn French\, Emma Thompson
+URL
+ :http://www.movie-list.com/trailers.php?id=harrypotter3
+CLASS
+ :PUBLIC
+X-MOZILLA-RECUR-DEFAULT-INTERVAL
+ :0
+DTSTART
+ ;VALUE=DATE
+ :20040610
+DTEND
+ ;VALUE=DATE
+ :20040611
+DTSTAMP
+ :20040310T012817Z
+END:VEVENT
+BEGIN:VEVENT
+UID
+ :5DD27BBA-7230-11D8-B1E4-000A27B6071A
+SUMMARY
+ :Chronicles of Riddick aka Pitch Black 2
+DESCRIPTION
+ :Riddick\, now a hunted man\, finds himself in the middle of  two 
+ opposing forces in a major crusade.
+LOCATION
+ :Vin Diesel\, Judi Dench
+URL
+ :http://www.movie-list.com/trailers.php?id=breakinalltherules
+CLASS
+ :PUBLIC
+X-MOZILLA-RECUR-DEFAULT-INTERVAL
+ :0
+DTSTART
+ ;VALUE=DATE
+ :20040610
+DTEND
+ ;VALUE=DATE
+ :20040611
+DTSTAMP
+ :20040310T012906Z
+END:VEVENT
+BEGIN:VEVENT
+UID
+ :A253E792-7230-11D8-B1E4-000A27B6071A
+SUMMARY
+ :Lady Killers\, The
+DESCRIPTION
+ :Goldthwait Higginson Dorr III\, Ph.D.\, a charlatan professor who???s 
+ assembled a gang of \"experts\" for the heist of the century. The 
+ thieves The ruse: the five need a place to practice their church music. 
+ The problem: it quickly becomes evident that Dorr???s thieves lack 
+ the mental capacity to do the job. The bigger problem: they have all 
+ seriously underestimated their upstairs host.\n
+LOCATION
+ :Tom Hanks\, Marlon Wayans\nDirected by Joel Coen
+URL
+ :http://www.movie-list.com/trailers.php?id=theladykillers
+CLASS
+ :PUBLIC
+X-MOZILLA-RECUR-DEFAULT-INTERVAL
+ :0
+DTSTART
+ ;VALUE=DATE
+ :20040603
+DTEND
+ ;VALUE=DATE
+ :20040604
+DTSTAMP
+ :20040318T184326Z
+END:VEVENT
+BEGIN:VEVENT
+UID
+ :B83EE0B2-755C-11D8-885C-000A9596385E
+SUMMARY
+ :Intermission
+DESCRIPTION
+ :Intermission is an urban love story about people adrift and their 
+ convoluted journeys in the search for some kind of love. \n\n\"\"Intermi
+ ssion\" is all done with an assured hand that combines action\, 
+ violence\, sex and humor in liberal doses with its talented ensemble 
+ cast and manic\, inventive story.\"\n-- Robin Clifford\, REELING 
+ REVIEWS
+LOCATION
+ :Colin Farrell
+URL
+ :http://www.movie-list.com/trailers.php?id=intermission
+CLASS
+ :PUBLIC
+X-MOZILLA-RECUR-DEFAULT-INTERVAL
+ :0
+DTSTART
+ ;VALUE=DATE
+ :20040603
+DTEND
+ ;VALUE=DATE
+ :20040604
+DTSTAMP
+ :20040314T021245Z
+END:VEVENT
+BEGIN:VEVENT
+UID
+ :2B748ED4-755D-11D8-885C-000A9596385E
+SUMMARY
+ :13 Going on 30
+DESCRIPTION
+ :A 13 year old girl plays a game on her 13th birthday and wakes up 
+ the next day as a 30 year old woman.
+LOCATION
+ :Jennifer Garner
+URL
+ :http://www.movie-list.com/trailers.php?id=13goingon30
+CLASS
+ :PUBLIC
+X-MOZILLA-RECUR-DEFAULT-INTERVAL
+ :0
+DTSTART
+ ;VALUE=DATE
+ :20040916
+DTEND
+ ;VALUE=DATE
+ :20040917
+DTSTAMP
+ :20040318T184643Z
+END:VEVENT
+BEGIN:VEVENT
+UID
+ :6D27F7F9-755D-11D8-885C-000A9596385E
+SUMMARY
+ :Shrek 2
+DESCRIPTION
+ :Princess Fiona's parents invite her and Shrek to dinner to celebrate 
+ her marriage. If only they knew the newlyweds were both ogres.
+LOCATION
+ :Mike Myers\, Eddie Murphy\, Cameron Diaz\, John Lithgow\, John 
+ Cleese
+URL
+ :http://www.movie-list.com/trailers.php?id=shrek2
+CLASS
+ :PUBLIC
+X-MOZILLA-RECUR-DEFAULT-INTERVAL
+ :0
+DTSTART
+ ;VALUE=DATE
+ :20040617
+DTEND
+ ;VALUE=DATE
+ :20040618
+DTSTAMP
+ :20040314T021623Z
+END:VEVENT
+BEGIN:VEVENT
+UID
+ :9EEA9830-755D-11D8-885C-000A9596385E
+SUMMARY
+ :Barbershop 2: Back in Business
+DESCRIPTION
+ :Why not spend another day with the crew at Calvin's shop in the South 
+ Side of Chicago?\n\n\"The seriousness with which Barbershop II 
+ treats its political conscience offers an unexpected weight to what???s 
+ essentially a big screen sitcom.\"\n-- Mark Palermo\, COAST (HALIFAX\, 
+ NOVA SCOTIA
+URL
+ :http://www.movie-list.com/trailers.php?id=barbershop2
+CLASS
+ :PUBLIC
+X-MOZILLA-RECUR-DEFAULT-INTERVAL
+ :0
+DTSTART
+ ;VALUE=DATE
+ :20040624
+DTEND
+ ;VALUE=DATE
+ :20040625
+DTSTAMP
+ :20040314T022349Z
+END:VEVENT
+BEGIN:VEVENT
+UID
+ :BBD3136E-755D-11D8-885C-000A9596385E
+SUMMARY
+ :Club Dread
+DESCRIPTION
+ :At Club Dread\, an alcohol drenched swinging-singles-style island 
+ resort off the coast of Costa Rica\, the festivities are interrupted 
+ by the presence of a machete-wielding serial killer.\n\n\"Most 
+ of the movie is just blood and bodies\, some of the dead\, some 
+ of them topless\, and none of them interesting.\"\n-- Stephen Whitty\, 
+ NEWARK STAR-LEDGER
+LOCATION
+ :Bill Paxton
+URL
+ :http://www.movie-list.com/trailers.php?id=clubdread
+CLASS
+ :PUBLIC
+X-MOZILLA-RECUR-DEFAULT-INTERVAL
+ :0
+DTSTART
+ ;VALUE=DATE
+ :20040624
+DTEND
+ ;VALUE=DATE
+ :20040625
+DTSTAMP
+ :20040314T024934Z
+END:VEVENT
+BEGIN:VEVENT
+UID
+ :C4BE60EA-755D-11D8-885C-000A9596385E
+SUMMARY
+ :Confessions of a Teenage Drama Queen
+DESCRIPTION
+ :A teenage girl is convinced that her home city revolves around her 
+ until her family packs up and moves to the suburbs\, where she finds 
+ herself competing for attention. \n\n\"What teenage girl would 
+ enjoy watching this? I'm glad Disney addresses this oft-ignored demographic\,
+  but if these girls are pandered to so obviously\, won't they feel 
+ insulted?\"\n-- Jeffrey Chen\, WINDOW TO THE MOVIES
+LOCATION
+ :Lindsay Lohan\, Adam Garcia
+URL
+ :http://www.movie-list.com/trailers.php?id=confessionsofateenagedramaqueen
+CLASS
+ :PUBLIC
+X-MOZILLA-RECUR-DEFAULT-INTERVAL
+ :0
+DTSTART
+ ;VALUE=DATE
+ :20040408
+DTEND
+ ;VALUE=DATE
+ :20040409
+DTSTAMP
+ :20040318T183009Z
+END:VEVENT
+BEGIN:VEVENT
+UID
+ :CAEA6CFA-755D-11D8-885C-000A9596385E
+SUMMARY
+ :Mean Girls
+DESCRIPTION
+ :A girl who grew up in many places returns to an Illinois public high 
+ school\, falls for the wrong guy\, and experiences humiliation from 
+ her female classmates.
+LOCATION
+ :Lindsay Lohan
+URL
+ :http://www.movie-list.com/trailers.php?id=meangirls
+CLASS
+ :PUBLIC
+X-MOZILLA-RECUR-DEFAULT-INTERVAL
+ :0
+DTSTART
+ ;VALUE=DATE
+ :20040624
+DTEND
+ ;VALUE=DATE
+ :20040625
+DTSTAMP
+ :20040314T022716Z
+END:VEVENT
+BEGIN:VEVENT
+UID
+ :D0644C6E-468F-11D8-A8A0-000A958D1EFE
+SUMMARY
+ :Prince and Me\, The
+DESCRIPTION
+ :A fairy tale love-story about a pre-med student who falls in love 
+ with a Danish Prince.
+LOCATION
+ :Julia Stiles\, Miranda Richardson\, James Fox\, Ben Miller. D: 
+ Martha Cooli
+URL
+ :http://www.movie-list.com/trailers.php?id=princeandme
+CLASS
+ :PUBLIC
+X-MOZILLA-RECUR-DEFAULT-INTERVAL
+ :0
+DTSTART
+ ;VALUE=DATE
+ :20040624
+DTEND
+ ;VALUE=DATE
+ :20040625
+DTSTAMP
+ :20040314T021829Z
+END:VEVENT
+BEGIN:VEVENT
+UID
+ :236E44EA-77A6-11D8-937F-000A9596385E
+SUMMARY
+ :New York Minute
+CLASS
+ :PUBLIC
+X-MOZILLA-RECUR-DEFAULT-INTERVAL
+ :0
+DTSTART
+ ;VALUE=DATE
+ :20040701
+DTEND
+ ;VALUE=DATE
+ :20040702
+DTSTAMP
+ :20040317T000108Z
+END:VEVENT
+BEGIN:VEVENT
+UID
+ :27824F06-77A6-11D8-937F-000A9596385E
+SUMMARY
+ :Spiderman 2
+CLASS
+ :PUBLIC
+X-MOZILLA-RECUR-DEFAULT-INTERVAL
+ :0
+DTSTART
+ ;VALUE=DATE
+ :20040701
+DTEND
+ ;VALUE=DATE
+ :20040702
+DTSTAMP
+ :20040317T000106Z
+END:VEVENT
+BEGIN:VEVENT
+UID
+ :C6329B7B-52C7-11D8-B289-000A958D1EFE
+SUMMARY
+ :Dirty Dancing: Havana Nights
+DESCRIPTION
+ :Set in 1958 Havana\, this is the story of a lonely 17-year-old American 
+ girl\, Katie\, who moves to Cuba in the days right before the Revolution 
+ with her parents\, where she meets a charming and talented local 
+ dancer\, Javier.\n\n\"molds a great deal of the franchise's first 
+ film and makes an even more compelling film than the original.\"\n-- 
+ Chris Faile\, FILMJERK.COM
+URL
+ :http://www.movie-list.com/trailers.php?id=dirtydancinghavananights
+CLASS
+ :PUBLIC
+X-MOZILLA-RECUR-DEFAULT-INTERVAL
+ :0
+DTSTART
+ ;VALUE=DATE
+ :20040429
+DTEND
+ ;VALUE=DATE
+ :20040430
+DTSTAMP
+ :20040318T183450Z
+END:VEVENT
+BEGIN:VEVENT
+UID
+ :CFB7CEFC-090D-11D8-B1DB-000A958D1EFE
+SUMMARY
+ :Mother\, The
+DESCRIPTION
+ :A recently widowed suburban hausfrau falls for her adult daughter's 
+ married lover in The Mother\, a kitchen-sink drama of building dramatic 
+ force and incongruous visual loveliness.
+LOCATION
+ :Dir Roger Michell w/ Anne Reid\, Daniel Craig.
+CLASS
+ :PUBLIC
+X-MOZILLA-RECUR-DEFAULT-INTERVAL
+ :0
+DTSTART
+ ;VALUE=DATE
+ :20040520
+DTEND
+ ;VALUE=DATE
+ :20040521
+DTSTAMP
+ :20040318T183748Z
+END:VEVENT
+BEGIN:VEVENT
+UID
+ :5FD00E54-468E-11D8-A8A0-000A958D1EFE
+SUMMARY
+ :Hero
+DESCRIPTION
+ :Using the assasination attempt of the historical figure\, Chin Shi 
+ Huang Di (The first emperor of China) as a backdrop\, this film attempts 
+ to explore and develop a better understanding of the Chinese concept 
+ of a hero.\n\n????\"Instead of reinventing this genre\, Zhang 
+ opts to dazzle his audience with his assemblage of technical and aesthetic 
+ wonders.\"\n-- Jeremy Heilman\,MOVIEMARTYR.COM
+LOCATION
+ :Jet Li\; Maggie Cheung\; Tony Leung\; Zhang Ziyi\; Daoming Chen
+URL
+ :http://www.movie-list.com/h/hero.shtml
+CLASS
+ :PUBLIC
+X-MOZILLA-RECUR-DEFAULT-INTERVAL
+ :0
+DTSTART
+ ;VALUE=DATE
+ :20040624
+DTEND
+ ;VALUE=DATE
+ :20040625
+DTSTAMP
+ :20040318T184928Z
+END:VEVENT
+BEGIN:VEVENT
+UID
+ :89737536-790D-11D8-8109-000A9596385E
+SUMMARY
+ :Statement\, The
+DESCRIPTION
+ :Tale of a former Nazi executioner who becomes a target of hit men 
+ and Police investigators. \n\n??\"A surprisingly mild thriller\, 
+ one that meanders and spasms dramatically\, and that\, despite its 
+ occasional outburst of violence\, wastes a cast of ordinarily superb 
+ actors.\"\n-- John Anderson\, NEWSDAY
+LOCATION
+ :Michael Caine\, Tilda Swinton\, Jeremy Northam. Directed by Norman 
+ Jewison
+URL
+ :http://www.movie-list.com/trailers.php?id=statement
+CLASS
+ :PUBLIC
+X-MOZILLA-RECUR-DEFAULT-INTERVAL
+ :0
+DTSTART
+ ;VALUE=DATE
+ :20040708
+DTEND
+ ;VALUE=DATE
+ :20040709
+DTSTAMP
+ :20040318T185526Z
+END:VEVENT
+BEGIN:VEVENT
+UID
+ :D2C9AC2A-790D-11D8-8109-000A9596385E
+SUMMARY
+ :Without a Paddle
+DESCRIPTION
+ :Three city-dwelling friends go on a camping trip with disastrous results.
+LOCATION
+ :Matthew Lillard\, Seth Gree
+CLASS
+ :PUBLIC
+X-MOZILLA-RECUR-DEFAULT-INTERVAL
+ :0
+DTSTART
+ ;VALUE=DATE
+ :20040708
+DTEND
+ ;VALUE=DATE
+ :20040709
+DTSTAMP
+ :20040318T185626Z
+END:VEVENT
+BEGIN:VEVENT
+UID
+ :F6A36D66-790D-11D8-8109-000A9596385E
+SUMMARY
+ :Whole Ten Yards\, The
+DESCRIPTION
+ :Jimmy the Tulip's (Willis) quiet new life is shaken up by his old 
+ pal Oz (Perry)\, whose wife (Henstridge) has been kidnapped by a 
+ Hungarian mob. The Tulip and his wife Jill (Peet) spring into action.
+LOCATION
+ :Bruce Willis\, Matthew Perry\, Natasha Henstridge\, Amanda Peet\, 
+ Kevin Pollak
+URL
+ :http://www.movie-list.com/trailers.php?id=wholetenyards
+CLASS
+ :PUBLIC
+X-MOZILLA-RECUR-DEFAULT-INTERVAL
+ :0
+DTSTART
+ ;VALUE=DATE
+ :20040708
+DTEND
+ ;VALUE=DATE
+ :20040709
+DTSTAMP
+ :20040318T185823Z
+END:VEVENT
+BEGIN:VEVENT
+UID
+ :C88418E3-7FD1-11D8-86BD-000A27B6071A
+SUMMARY
+ :Envy
+DESCRIPTION
+ :A man becomes increasingly jealous of his friend's newfound success.
+LOCATION
+ :Jack Black\, Ben Stiller\, Rachel Weisz\, Christopher Walken. Directed 
+ by Barry Levinson.
+URL
+ :http://www.movie-list.com/trailers.php?id=envy
+CLASS
+ :PUBLIC
+X-MOZILLA-RECUR-DEFAULT-INTERVAL
+ :0
+DTSTART
+ ;VALUE=DATE
+ :20040715
+DTEND
+ ;VALUE=DATE
+ :20040716
+DTSTAMP
+ :20040327T093820Z
+END:VEVENT
+BEGIN:VEVENT
+UID
+ :CBEDB8F1-7FD1-11D8-86BD-000A27B6071A
+SUMMARY
+ :King Arthur
+DESCRIPTION
+ :A demystified take on the tale of King Arthur and the Knights of the 
+ Round Table.
+LOCATION
+ :Keira Knightley
+URL
+ :http://www.movie-list.com/trailers.php?id=kingarthur
+CLASS
+ :PUBLIC
+X-MOZILLA-RECUR-DEFAULT-INTERVAL
+ :0
+DTSTART
+ ;VALUE=DATE
+ :20040715
+DTEND
+ ;VALUE=DATE
+ :20040716
+DTSTAMP
+ :20040327T094354Z
+END:VEVENT
+BEGIN:VEVENT
+UID
+ :4E91CBDC-7FD3-11D8-86BD-000A27B6071A
+SUMMARY
+ :I Robot
+DESCRIPTION
+ :In the year 2035 a techno-phobic cop investigates a crime that may 
+ have been perpetrated by a robot\, which leads to a larger threat 
+ to humanity.\n
+LOCATION
+ :Will Smith. Directed by Alex Proyas.
+URL
+ :http://www.movie-list.com/trailers.php?id=irobot
+CLASS
+ :PUBLIC
+X-MOZILLA-RECUR-DEFAULT-INTERVAL
+ :0
+DTSTART
+ ;VALUE=DATE
+ :20040722
+DTEND
+ ;VALUE=DATE
+ :20040723
+DTSTAMP
+ :20040327T094831Z
+END:VEVENT
+BEGIN:VEVENT
+UID
+ :B7B32328-7FD3-11D8-86BD-000A27B6071A
+SUMMARY
+ :Miracle
+DESCRIPTION
+ :Miracle tells the true story of Herb Brooks (Russell)\, the player-turned-c
+ oach who led the 1980 U.S. Olympic hockey team to victory over the 
+ seemingly invincible Russian squad.\n
+LOCATION
+ :Kurt Russell\, Patricia Clarkson
+URL
+ :http://www.movie-list.com/trailers.php?id=miracle
+CLASS
+ :PUBLIC
+X-MOZILLA-RECUR-DEFAULT-INTERVAL
+ :0
+DTSTART
+ ;VALUE=DATE
+ :20040722
+DTEND
+ ;VALUE=DATE
+ :20040723
+DTSTAMP
+ :20040327T095105Z
+END:VEVENT
+BEGIN:VTODO
+UID
+ :1E2C09FC-FBA7-11D7-B98C-000A958D1EFE
+SUMMARY
+ :$35 Metro: Paul Kelly tickets $35
+STATUS
+ :COMPLETED
+CLASS
+ :PUBLIC
+X-MOZILLA-RECUR-DEFAULT-INTERVAL
+ :0
+DTSTART
+ :20031018T000000
+DUE
+ ;VALUE=DATE
+ :20031018
+DTSTAMP
+ :20031018T164749Z
+END:VTODO
+BEGIN:VTODO
+UID
+ :7A0EDDE6-FF8A-11D7-8061-000A958D1EFE
+SUMMARY
+ :$430 200GB hard drive
+STATUS
+ :COMPLETED
+CLASS
+ :PUBLIC
+X-MOZILLA-RECUR-DEFAULT-INTERVAL
+ :0
+DTSTART
+ :20031023T000000
+DUE
+ ;TZID=/softwarestudio.org/Olson_20011030_5/America/New_York
+ :20031023T000000
+DTSTAMP
+ :20031018T164747Z
+END:VTODO
+BEGIN:VTODO
+UID
+ :0AE6D541-1F54-11D8-8F64-000A958D1EFE
+SUMMARY
+ :neon KB
+CLASS
+ :PUBLIC
+X-MOZILLA-RECUR-DEFAULT-INTERVAL
+ :0
+DTSTART
+ :20040203T000000
+DUE
+ :20040203T000000
+DTSTAMP
+ :20031125T143151Z
+END:VTODO
+BEGIN:VTODO
+UID
+ :6E72474D-1F69-11D8-8F64-000A958D1EFE
+SUMMARY
+ :master commander
+STATUS
+ :COMPLETED
+CLASS
+ :PUBLIC
+X-MOZILLA-RECUR-DEFAULT-INTERVAL
+ :0
+DTSTART
+ :20031126T000000
+DUE
+ :20031126T000000
+DTSTAMP
+ :20031130T024112Z
+END:VTODO
+END:VCALENDAR

Copied: trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/icaltestdata/tag-bug.ics (from rev 976, trunk/dna-repository/src/test/resources/docs/icaltestdata/tag-bug.ics)
===================================================================
--- trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/icaltestdata/tag-bug.ics	                        (rev 0)
+++ trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/icaltestdata/tag-bug.ics	2009-06-04 22:31:30 UTC (rev 977)
@@ -0,0 +1,14 @@
+BEGIN:VCALENDAR
+VERSION:2.0
+PRODID:-//Mozilla.org/NONSGML Mozilla Calendar V1.0//EN
+BEGIN:VEVENT
+CATEGORIES:Telcon
+UID:78492d2f-aacd-40e3-80cc-4f078d1516e0
+EXDATE;VALUE=DATE:20020225
+SUMMARY:W3C TAG
+DESCRIPTION:rdf:\np:phone +1.617.761.6200\np:code 0824#\n
+RRULE:FREQ=WEEKLY;INTERVAL=1;BYDAY=MO
+DTEND:20020513T163000
+DTSTART:20020513T000000
+END:VEVENT
+END:VCALENDAR

Copied: trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/icaltestdata/test-created.ics (from rev 976, trunk/dna-repository/src/test/resources/docs/icaltestdata/test-created.ics)
===================================================================
--- trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/icaltestdata/test-created.ics	                        (rev 0)
+++ trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/icaltestdata/test-created.ics	2009-06-04 22:31:30 UTC (rev 977)
@@ -0,0 +1,21 @@
+BEGIN:VCALENDAR
+VERSION:2.0
+X-WR-CALNAME:tim-test
+PRODID:-//Apple Computer\, Inc//iCal 1.5//EN
+X-WR-RELCALID:A08BFEBE-73D1-11D9-B5C3-000393CD78B4
+X-WR-TIMEZONE:US/Eastern
+CALSCALE:GREGORIAN
+BEGIN:VEVENT
+CLASS:PUBLIC
+DURATION:PT1H30M
+DTSTAMP:20050124T205828Z
+TRANSP:OPAQUE
+UID:A0831EE4-73D1-11D9-B5C3-000393CD78B4
+LAST-MODIFIED:20041223T151752
+SEQUENCE:3
+CREATED:20041223T135226
+DTSTART:20050127T090000
+SUMMARY:An event with a CREATED field
+CATEGORIES:Strategies
+END:VEVENT
+END:VCALENDAR

Copied: trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/jingle1.mp3 (from rev 976, trunk/dna-repository/src/test/resources/docs/jingle1.mp3)
===================================================================
(Binary files differ)

Copied: trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/jingle2.mp3 (from rev 976, trunk/dna-repository/src/test/resources/docs/jingle2.mp3)
===================================================================
(Binary files differ)

Copied: trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/jingle3.mp3 (from rev 976, trunk/dna-repository/src/test/resources/docs/jingle3.mp3)
===================================================================
(Binary files differ)

Copied: trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/jpg-exif-img_9367.JPG (from rev 976, trunk/dna-repository/src/test/resources/docs/jpg-exif-img_9367.JPG)
===================================================================
(Binary files differ)

Copied: trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/jpg-exif-zerolength.jpg (from rev 976, trunk/dna-repository/src/test/resources/docs/jpg-exif-zerolength.jpg)
===================================================================
(Binary files differ)

Copied: trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/jpg-geotagged-ipanema.jpg (from rev 976, trunk/dna-repository/src/test/resources/docs/jpg-geotagged-ipanema.jpg)
===================================================================
(Binary files differ)

Copied: trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/jpg-geotagged.jpg (from rev 976, trunk/dna-repository/src/test/resources/docs/jpg-geotagged.jpg)
===================================================================
(Binary files differ)

Copied: trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/mail-thunderbird-1.5.eml (from rev 976, trunk/dna-repository/src/test/resources/docs/mail-thunderbird-1.5.eml)
===================================================================
--- trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/mail-thunderbird-1.5.eml	                        (rev 0)
+++ trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/mail-thunderbird-1.5.eml	2009-06-04 22:31:30 UTC (rev 977)
@@ -0,0 +1,17 @@
+Return-Path: <christiaan.fluit at aduna.biz>
+Delivered-To: 5-Christiaan.Fluit at aduna.biz
+Received: (qmail 13624 invoked from network); 20 Feb 2006 07:43:53 -0600
+Received: from home.aduna.biz (HELO ?10.1.0.11?) (213.84.59.34)
+  by www4.aduna.biz with (DHE-RSA-AES256-SHA encrypted) SMTP; 20 Feb 2006 07:43:53 -0600
+Message-ID: <43F9C862.9040605 at aduna.biz>
+Date: Mon, 20 Feb 2006 14:47:14 +0100
+From: Christiaan Fluit <christiaan.fluit at aduna.biz>
+User-Agent: Thunderbird 1.5 (Windows/20051201)
+MIME-Version: 1.0
+To: Christiaan Fluit <Christiaan.Fluit at aduna.biz>
+Subject: test subject
+Content-Type: text/plain; charset=ISO-8859-1; format=flowed
+Content-Transfer-Encoding: 7bit
+
+test body
+--

Copied: trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/mhtml-firefox.mht (from rev 976, trunk/dna-repository/src/test/resources/docs/mhtml-firefox.mht)
===================================================================
--- trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/mhtml-firefox.mht	                        (rev 0)
+++ trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/mhtml-firefox.mht	2009-06-04 22:31:30 UTC (rev 977)
@@ -0,0 +1,455 @@
+From: <Saved by Mozilla 5.0 (Windows; en-US)>
+Subject: Aperture Framework
+Date: Fri Mar 10 2006 13:40:00 GMT+0100
+MIME-Version: 1.0
+Content-Location: http://aperture.sourceforge.net/
+Content-Type: multipart/related;
+	boundary="----=_NextPart_000_0000_B40804DE.BBCA09DC";
+	type="text/html"
+X-MAF: Produced By MAF MHT Archive Handler V0.4.1
+
+This is a multi-part message in MIME format.
+
+------=_NextPart_000_0000_B40804DE.BBCA09DC
+Content-Type: text/html
+Content-Transfer-Encoding: quoted-printable
+Content-Location: http://aperture.sourceforge.net/
+
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/=
+TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html><head><!-- This document is inspired by the content style at http://ww=
+w.csszengarden.com -->
+
+
+
+<meta http-equiv=3D"content-type" content=3D"text/html; charset=3Diso-8859-1=
+">
+<meta name=3D"author" content=3D"Leo Sauermann, Christiaan Fluit">
+<meta name=3D"keywords" content=3D"aperture, rdf, data"><title>Aperture Fram=
+ework</title>
+
+<script type=3D"text/javascript"></script>
+<link title=3D"Default" rel=3D"stylesheet" type=3D"text/css" href=3D"index_f=
+iles/frontpage.css" media=3D"screen">
+<link title=3D"Default" rel=3D"stylesheet" type=3D"text/css" href=3D"index_f=
+iles/print.css" media=3D"print">
+<link title=3D"Basic" rel=3D"alternate stylesheet" type=3D"text/css" href=3D=
+"index_files/all.css" media=3D"all"></head><body>
+
+<div id=3D"header">
+
+<h1>Aperture</h1>
+<h2>a Java framework for getting data and metadata</h2>
+
+</div>  <!-- header -->
+
+<div id=3D"content">
+
+<div id=3D"preamble">
+
+<p>
+<b>Project name</b>
+</p>
+
+<p>
+From <a class=3D"ext-link" title=3D"http://www.webster.com/" href=3D"http://=
+www.webster.com/">Merriam-Webster Online</a>:
+</p>
+
+<p>
+Main Entry: <strong>ap=B7er=B7ture</strong>
+(sounds like <a class=3D"ext-link" title=3D"http://cougar.eb.com/sound/a/ape=
+rtu01.wav" href=3D"http://cougar.eb.com/sound/a/apertu01.wav">this</a>)<br>
+Pronunciation: 'ap-&amp;(r)-"chur, -ch&amp;r, -"tyur, -"tur<br>
+Function: noun<br>
+Etymology: Middle English, from Latin apertura, from apertus, past
+participle of aperire to open<br>
+</p>
+
+<ol>
+<li>an opening or open space : HOLE</li>
+<li>a : the opening in a photographic lens that admits the light<br>
+b : the diameter of the stop in an optical system that determines the diamet=
+er
+of the bundle of rays traversing the instrument<br>
+c : the diameter of the objective lens or mirror of a telescope</li>
+</ol>
+
+</div> <!-- preamble -->
+
+<h2>News</h2>
+
+<p>
+<b>March 6, 2006:</b> <a href=3D"https://sourceforge.net/project/showfiles.p=
+hp?group_id=3D150969">Aperture
+2006.1 alpha 2</a> released!
+</p>
+
+<p>
+This release adds support for crawling file systems, web sites, IMAP and Out=
+look mail boxes.
+Furthermore, the number of supported file formats has increased significantl=
+y.
+</p>
+
+<h2>Features</h2>
+
+<ul>
+<li>Crawl information systems such as file systems, websites, mail boxes and=
+ mail servers</li>
+<li>Extract full-text and metadata from many common file formats</li>
+<li>View files in their native applications</li>
+<li>Ease of use: easy to learn, easy to code, easy to deploy in industrial p=
+rojects</li>
+<li>Flexible architecture: can be extended with custom file formats, data so=
+urces, etc.,
+    with support for deployment on OSGi platforms</li>
+<li>Data exchange based on Semantic Web standards (e.g. RDF, SPARQL, ...)</l=
+i>
+</ul>
+
+<h2>Supported File Formats</h2>
+
+<ul>
+<li>Plain text</li>
+<li>HTML, XHTML</li>
+<li>XML</li>
+<li>PDF (Portable Document Format)</li>
+<li>RTF (Rich Text Format)</li>
+<li>Microsoft Office: Word, Excel, Powerpoint, Visio, Publisher</li>
+<li>Microsoft Works</li>
+<li>OpenOffice 1.x: Writer, Calc, Impress, Draw</li>
+<li>StarOffice 6.x - 7.x+: Writer, Calc, Impress, Draw</li>
+<li>OpenDocument (OpenOffice 2.x, StarOffice 8.x)</li>
+<li>Corel WordPerfect, Quattro, Presentations</li>
+<li>Emails (.eml files)</li>
+</ul>
+
+<h2>Crawlers</h2>
+
+<p>
+Crawlers support the extraction of information from heterogenous data source=
+s.
+At the moment we support the following source types:</p>
+
+<ul>
+<li>File Systems (local, remote, removeable media)</li>
+<li>Websites and intranets</li>
+<li>IMAP e-mail servers</li>
+<li>Microsoft Outlook (alpha)</li>
+</ul>
+
+<h2><a name=3D"support"></a>Support</h2>
+
+<p>
+At this moment the project is still in alpha stage and we provide only limit=
+ed support.
+If you have any questions about the project, feel free to join the
+<a href=3D"https://sourceforge.net/mail/?group_id=3D150969">development mail=
+inglist</a> and ask us.
+</p>
+
+<h2><a name=3D"development"></a>Development</h2>
+
+<p>
+To use Aperture in your own projects, read the <a href=3D"http://aperture.so=
+urceforge.net/documentation.html">documentation</a>
+for information about requirements and code examples.
+</p>
+
+<p>
+If you are interested in contributing, feel free to contact the project admi=
+ns or join the
+<a href=3D"https://sourceforge.net/mail/?group_id=3D150969">development mail=
+inglist</a>.
+We are very interested in new extractors and other contributions including c=
+rawlers.
+</p>
+
+</div>  <!-- content -->
+
+<div id=3D"sideBar">
+
+<p>
+Aperture is a Java framework for extracting and querying full-text
+content and metadata from various information systems (e.g. file systems,
+web sites, mail boxes) and the file formats (e.g. documents, images)
+occurring in these systems.
+</p>
+
+<h2>Contents</h2>
+
+<ul>
+<li><a href=3D"http://aperture.sourceforge.net/index.html">Home</a></li>
+<li><a href=3D"https://sourceforge.net/project/showfiles.php?group_id=3D1509=
+69">Download</a></li>
+<li><a href=3D"http://aperture.sourceforge.net/doc/javadoc/index.html">Javad=
+oc</a></li>
+<li><a href=3D"http://aperture.sourceforge.net/documentation.html">Documenta=
+tion</a></li>
+<li><a href=3D"http://aperture.sourceforge.net/faq.html">FAQ</a></li>
+<li><a href=3D"http://aperture.sourceforge.net/index.html#support">Support</=
+a></li>
+<li><a href=3D"http://aperture.sourceforge.net/index.html#development">Devel=
+opment</a></li>
+<li><a href=3D"http://aperture.sourceforge.net/license.html">License</a></li=
+>
+</ul>
+
+<h2>Developed By</h2>
+
+<ul>
+<li><a href=3D"http://aduna.biz/">Aduna</a></li>
+<li><a href=3D"http://www.dfki.de/">DFKI</a></li>
+</ul>
+
+<h2>Site Info</h2>
+
+<p>
+Hosted by <a href=3D"http://sourceforge.net/">SourceForge.net</a>
+</p>
+
+<p>
+<a href=3D"http://sourceforge.net/"><img class=3D"logo" src=3D"index_files/s=
+flogo.png" alt=3D"SourceForge.net Logo" height=3D"37" width=3D"125"></a>
+</p>
+
+<p>
+<br>
+Graphical design by <a href=3D"http://www.pixul.net/">Pixul.net</a>. Used wi=
+th permission.
+</p>
+
+</div>  <!-- sideBar -->
+
+<div id=3D"footer">
+<a href=3D"http://validator.w3.org/check/referer" title=3D"Check the validit=
+y of this site&#8217;s XHTML">xhtml</a>
+=A0<a href=3D"http://jigsaw.w3.org/css-validator/check/referer" title=3D"Che=
+ck the validity of this site&#8217;s CSS">css</a>
+</div>  <!-- footer -->
+
+</body></html>
+
+
+------=_NextPart_000_0000_B40804DE.BBCA09DC
+Content-Type: text/css
+Content-Transfer-Encoding: quoted-printable
+Content-Location: index_files/all.css
+
+ at import url(../w3-html40-recommended.css);
+
+img {
+=09border: 0;
+}
+
+
+
+------=_NextPart_000_0000_B40804DE.BBCA09DC
+Content-Type: text/css
+Content-Transfer-Encoding: quoted-printable
+Content-Location: index_files/frontpage.css
+
+/*
+ Parts of this style-sheet are copied from the=20
+ css Zen Garden submission 164 - 'Chien', by Alex Miller, http://www.pixul.n=
+et/=20
+ http://www.csszengarden.com/?cssfile=3D/164/164.css&page=3D2
+=20
+ css released under Creative Commons License - http://creativecommons.org/li=
+censes/by-nc-sa/1.0/=20
+*/
+
+ at import url(../w3-html40-recommended.css);
+
+html, body, div, ul, ol, p, li {
+=09margin: 0;
+=09border: 0;
+=09padding: 0;
+}
+
+html {
+=09background-image: url(img/background.gif);
+=09font-family: verdana, arial, serif;
+=09font-size: 82%;
+=09line-height: 120%;
+=09color: #333;
+}
+
+body {
+=09background-image: url(img/containerbackground.gif);
+=09background-repeat: repeat-y;
+=09width: 590px;
+=09margin-left: auto;
+=09margin-right: auto;
+=09padding: 0 38px 0 37px;
+}
+
+ul, ol, p {
+=09padding: 0 12px 10px 12px;
+}
+
+ul, ol {
+=09list-style-position: outside;
+=09padding-left: 16px;
+=09margin-left: 0px;
+}
+
+li {
+=09margin-left: 15px;
+=09margin-bottom: 8px;
+}
+
+h2 {
+=09margin: 20px 0 15px 0;
+=09padding: 0;
+=09text-align: center;
+=09font-size: 130%;
+}
+
+img {
+=09border: 0;
+}
+
+a:link {
+=09text-decoration: none;
+=09color: #CC0000;
+}
+=09
+a:visited {
+=09text-decoration: none;
+=09color: #CC6666;
+}
+=09
+a:hover {
+=09text-decoration: underline;
+=09color: #CC0000;
+}
+
+#header {
+=09color: #d88;
+=09background-color: rgb(156,26,0);
+=09padding: 20px;
+=09margin-bottom: 20px;
+}
+
+#header h1 {
+ =09color: #eaa;
+}
+
+#content {
+=09float: left;
+=09width: 389px;
+}
+
+#content h2 {
+=09text-align:center;
+=09color: #ffffff;
+=09background-image: url(img/bgheader-content.png);
+=09background-position: left;
+=09height: 28px;
+=09padding-top: 6px;
+}
+
+#sideBar {
+=09float: right;
+=09width: 192px;
+}
+
+#sideBar h2 {
+=09background-color: #f7b356;
+=09color: #fff;
+=09background-image: url(img/bgheader-sidebar.png);
+=09background-position: left;
+=09height: 28px;
+=09padding-top: 6px;
+}
+
+#preamble {
+=09font-size: 82%;
+=09color: #996666;
+}
+
+#footer {
+=09clear: both;
+=09border-top: 1px solid #999;
+=09padding: 6px 0 6px 0;
+=09background-color: #FFF;
+=09font-weight: bold;
+=09text-align: center;
+}
+
+
+
+------=_NextPart_000_0000_B40804DE.BBCA09DC
+Content-Type: text/css
+Content-Transfer-Encoding: quoted-printable
+Content-Location: index_files/print.css
+
+html, body {
+=09color: #000;
+=09background: #fff;
+=09font-family: "Times New Roman", "Times", serif;
+=09font-size: 100%;
+=09line-height: 110%;
+}
+
+
+------=_NextPart_000_0000_B40804DE.BBCA09DC
+Content-Type: image/png
+Content-Transfer-Encoding: base64
+Content-Location: index_files/sflogo.png
+

+
+------=_NextPart_000_0000_B40804DE.BBCA09DC--

Copied: trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/mhtml-internet-explorer.mht (from rev 976, trunk/dna-repository/src/test/resources/docs/mhtml-internet-explorer.mht)
===================================================================
--- trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/mhtml-internet-explorer.mht	                        (rev 0)
+++ trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/mhtml-internet-explorer.mht	2009-06-04 22:31:30 UTC (rev 977)
@@ -0,0 +1,1223 @@
+From: <Saved by Microsoft Internet Explorer 5>
+Subject: Aperture Framework
+Date: Fri, 10 Mar 2006 13:41:34 +0100
+MIME-Version: 1.0
+Content-Type: multipart/related;
+	type="text/html";
+	boundary="----=_NextPart_000_0000_01C64448.58F51A70"
+X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2900.2180
+
+This is a multi-part message in MIME format.
+
+------=_NextPart_000_0000_01C64448.58F51A70
+Content-Type: text/html;
+	charset="iso-8859-1"
+Content-Transfer-Encoding: quoted-printable
+Content-Location: http://aperture.sourceforge.net/
+
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" =
+"http://www.w3c.org/TR/1999/REC-html401-19991224/loose.dtd">
+<HTML><HEAD><TITLE>Aperture Framework</TITLE><!-- This document is =
+inspired by the content style at http://www.csszengarden.com -->
+<META http-equiv=3Dcontent-type content=3D"text/html; =
+charset=3Diso-8859-1">
+<META content=3D"Leo Sauermann, Christiaan Fluit" name=3Dauthor>
+<META content=3D"aperture, rdf, data" name=3Dkeywords>
+<SCRIPT type=3Dtext/javascript></SCRIPT>
+<LINK title=3DDefault media=3Dscreen=20
+href=3D"http://aperture.sourceforge.net/style/default/frontpage.css" =
+type=3Dtext/css=20
+rel=3Dstylesheet><LINK title=3DDefault media=3Dprint=20
+href=3D"http://aperture.sourceforge.net/style/default/print.css" =
+type=3Dtext/css=20
+rel=3Dstylesheet><LINK title=3DBasic media=3Dall=20
+href=3D"http://aperture.sourceforge.net/style/basic/all.css" =
+type=3Dtext/css=20
+rel=3D"alternate stylesheet">
+<META content=3D"MSHTML 6.00.2900.2802" name=3DGENERATOR></HEAD>
+<BODY>
+<DIV id=3Dheader>
+<H1>Aperture</H1>
+<H2>a Java framework for getting data and metadata</H2></DIV><!-- header =
+-->
+<DIV id=3Dcontent>
+<DIV id=3Dpreamble>
+<P><B>Project name</B> </P>
+<P>From <A class=3Dext-link title=3Dhttp://www.webster.com/=20
+href=3D"http://www.webster.com/">Merriam-Webster Online</A>: </P>
+<P>Main Entry: <STRONG>ap=B7er=B7ture</STRONG> (sounds like <A =
+class=3Dext-link=20
+title=3Dhttp://cougar.eb.com/sound/a/apertu01.wav=20
+href=3D"http://cougar.eb.com/sound/a/apertu01.wav">this</A>)<BR>Pronuncia=
+tion:=20
+'ap-&amp;(r)-"chur, -ch&amp;r, -"tyur, -"tur<BR>Function: =
+noun<BR>Etymology:=20
+Middle English, from Latin apertura, from apertus, past participle of =
+aperire to=20
+open<BR></P>
+<OL>
+  <LI>an opening or open space : HOLE=20
+  <LI>a : the opening in a photographic lens that admits the light<BR>b =
+: the=20
+  diameter of the stop in an optical system that determines the diameter =
+of the=20
+  bundle of rays traversing the instrument<BR>c : the diameter of the =
+objective=20
+  lens or mirror of a telescope </LI></OL></DIV><!-- preamble -->
+<H2>News</H2>
+<P><B>March 6, 2006:</B> <A=20
+href=3D"https://sourceforge.net/project/showfiles.php?group_id=3D150969">=
+Aperture=20
+2006.1 alpha 2</A> released! </P>
+<P>This release adds support for crawling file systems, web sites, IMAP =
+and=20
+Outlook mail boxes. Furthermore, the number of supported file formats =
+has=20
+increased significantly. </P>
+<H2>Features</H2>
+<UL>
+  <LI>Crawl information systems such as file systems, websites, mail =
+boxes and=20
+  mail servers=20
+  <LI>Extract full-text and metadata from many common file formats=20
+  <LI>View files in their native applications=20
+  <LI>Ease of use: easy to learn, easy to code, easy to deploy in =
+industrial=20
+  projects=20
+  <LI>Flexible architecture: can be extended with custom file formats, =
+data=20
+  sources, etc., with support for deployment on OSGi platforms=20
+  <LI>Data exchange based on Semantic Web standards (e.g. RDF, SPARQL, =
+...)=20
+</LI></UL>
+<H2>Supported File Formats</H2>
+<UL>
+  <LI>Plain text=20
+  <LI>HTML, XHTML=20
+  <LI>XML=20
+  <LI>PDF (Portable Document Format)=20
+  <LI>RTF (Rich Text Format)=20
+  <LI>Microsoft Office: Word, Excel, Powerpoint, Visio, Publisher=20
+  <LI>Microsoft Works=20
+  <LI>OpenOffice 1.x: Writer, Calc, Impress, Draw=20
+  <LI>StarOffice 6.x - 7.x+: Writer, Calc, Impress, Draw=20
+  <LI>OpenDocument (OpenOffice 2.x, StarOffice 8.x)=20
+  <LI>Corel WordPerfect, Quattro, Presentations=20
+  <LI>Emails (.eml files) </LI></UL>
+<H2>Crawlers</H2>
+<P>Crawlers support the extraction of information from heterogenous data =
+
+sources. At the moment we support the following source types:</P>
+<UL>
+  <LI>File Systems (local, remote, removeable media)=20
+  <LI>Websites and intranets=20
+  <LI>IMAP e-mail servers=20
+  <LI>Microsoft Outlook (alpha) </LI></UL>
+<H2><A name=3Dsupport></A>Support</H2>
+<P>At this moment the project is still in alpha stage and we provide =
+only=20
+limited support. If you have any questions about the project, feel free =
+to join=20
+the <A =
+href=3D"https://sourceforge.net/mail/?group_id=3D150969">development=20
+mailinglist</A> and ask us. </P>
+<H2><A name=3Ddevelopment></A>Development</H2>
+<P>To use Aperture in your own projects, read the <A=20
+href=3D"http://aperture.sourceforge.net/documentation.html">documentation=
+</A> for=20
+information about requirements and code examples. </P>
+<P>If you are interested in contributing, feel free to contact the =
+project=20
+admins or join the <A=20
+href=3D"https://sourceforge.net/mail/?group_id=3D150969">development=20
+mailinglist</A>. We are very interested in new extractors and other=20
+contributions including crawlers. </P></DIV><!-- content -->
+<DIV id=3DsideBar>
+<P>Aperture is a Java framework for extracting and querying full-text =
+content=20
+and metadata from various information systems (e.g. file systems, web =
+sites,=20
+mail boxes) and the file formats (e.g. documents, images) occurring in =
+these=20
+systems. </P>
+<H2>Contents</H2>
+<UL>
+  <LI><A href=3D"http://aperture.sourceforge.net/index.html">Home</A>=20
+  <LI><A=20
+  =
+href=3D"https://sourceforge.net/project/showfiles.php?group_id=3D150969">=
+Download</A>=20
+
+  <LI><A=20
+  =
+href=3D"http://aperture.sourceforge.net/doc/javadoc/index.html">Javadoc</=
+A>=20
+  <LI><A=20
+  =
+href=3D"http://aperture.sourceforge.net/documentation.html">Documentation=
+</A>=20
+  <LI><A href=3D"http://aperture.sourceforge.net/faq.html">FAQ</A>=20
+  <LI><A =
+href=3D"http://aperture.sourceforge.net/index.html#support">Support</A>=20
+  <LI><A=20
+  =
+href=3D"http://aperture.sourceforge.net/index.html#development">Developme=
+nt</A>=20
+  <LI><A =
+href=3D"http://aperture.sourceforge.net/license.html">License</A>=20
+</LI></UL>
+<H2>Developed By</H2>
+<UL>
+  <LI><A href=3D"http://aduna.biz/">Aduna</A>=20
+  <LI><A href=3D"http://www.dfki.de/">DFKI</A> </LI></UL>
+<H2>Site Info</H2>
+<P>Hosted by <A href=3D"http://sourceforge.net/">SourceForge.net</A> =
+</P>
+<P><A href=3D"http://sourceforge.net/"><IMG class=3Dlogo height=3D37=20
+alt=3D"SourceForge.net Logo"=20
+src=3D"http://sourceforge.net/sflogo.php?group_id=3D150969&amp;type=3D2" =
+
+width=3D125></A> </P>
+<P><BR>Graphical design by <A =
+href=3D"http://www.pixul.net/">Pixul.net</A>. Used=20
+with permission. </P></DIV><!-- sideBar -->
+<DIV id=3Dfooter><A title=3D"Check the validity of this site=92s XHTML"=20
+href=3D"http://validator.w3.org/check/referer">xhtml</A> &nbsp;<A=20
+title=3D"Check the validity of this site=92s CSS"=20
+href=3D"http://jigsaw.w3.org/css-validator/check/referer">css</A> =
+</DIV><!-- footer --></BODY></HTML>
+
+------=_NextPart_000_0000_01C64448.58F51A70
+Content-Type: application/octet-stream
+Content-Transfer-Encoding: base64
+Content-Location: http://sourceforge.net/sflogo.php?group_id=150969&type=2
+

+
+------=_NextPart_000_0000_01C64448.58F51A70
+Content-Type: text/css;
+	charset="iso-8859-1"
+Content-Transfer-Encoding: quoted-printable
+Content-Location: http://aperture.sourceforge.net/w3-html40-recommended.css
+
+HTML {
+	DISPLAY: block
+}
+ADDRESS {
+	DISPLAY: block
+}
+BLOCKQUOTE {
+	DISPLAY: block
+}
+BODY {
+	DISPLAY: block
+}
+DD {
+	DISPLAY: block
+}
+DIV {
+	DISPLAY: block
+}
+DL {
+	DISPLAY: block
+}
+DT {
+	DISPLAY: block
+}
+FIELDSET {
+	DISPLAY: block
+}
+FORM {
+	DISPLAY: block
+}
+FRAME {
+	DISPLAY: block
+}
+FRAMESET {
+	DISPLAY: block
+}
+H1 {
+	DISPLAY: block
+}
+H2 {
+	DISPLAY: block
+}
+H3 {
+	DISPLAY: block
+}
+H4 {
+	DISPLAY: block
+}
+H5 {
+	DISPLAY: block
+}
+H6 {
+	DISPLAY: block
+}
+NOFRAMES {
+	DISPLAY: block
+}
+OL {
+	DISPLAY: block
+}
+P {
+	DISPLAY: block
+}
+UL {
+	DISPLAY: block
+}
+CENTER {
+	DISPLAY: block
+}
+DIR {
+	DISPLAY: block
+}
+HR {
+	DISPLAY: block
+}
+MENU {
+	DISPLAY: block
+}
+PRE {
+	DISPLAY: block
+}
+LI {
+	DISPLAY: list-item
+}
+HEAD {
+	DISPLAY: none
+}
+TABLE {
+=09
+}
+TR {
+=09
+}
+THEAD {
+	DISPLAY: table-header-group
+}
+TBODY {
+=09
+}
+TFOOT {
+	DISPLAY: table-footer-group
+}
+COL {
+=09
+}
+COLGROUP {
+=09
+}
+TD {
+=09
+}
+TH {
+=09
+}
+CAPTION {
+=09
+}
+TH {
+	FONT-WEIGHT: bolder; TEXT-ALIGN: center
+}
+CAPTION {
+	TEXT-ALIGN: center
+}
+BODY {
+	MARGIN: 8px; LINE-HEIGHT: 1.12
+}
+H1 {
+	FONT-SIZE: 2em; MARGIN: 0.67em 0px
+}
+H2 {
+	FONT-SIZE: 1.5em; MARGIN: 0.75em 0px
+}
+H3 {
+	FONT-SIZE: 1.17em; MARGIN: 0.83em 0px
+}
+H4 {
+	MARGIN: 1.12em 0px
+}
+P {
+	MARGIN: 1.12em 0px
+}
+BLOCKQUOTE {
+	MARGIN: 1.12em 0px
+}
+UL {
+	MARGIN: 1.12em 0px
+}
+FIELDSET {
+	MARGIN: 1.12em 0px
+}
+FORM {
+	MARGIN: 1.12em 0px
+}
+OL {
+	MARGIN: 1.12em 0px
+}
+DL {
+	MARGIN: 1.12em 0px
+}
+DIR {
+	MARGIN: 1.12em 0px
+}
+MENU {
+	MARGIN: 1.12em 0px
+}
+H5 {
+	FONT-SIZE: 0.83em; MARGIN: 1.5em 0px
+}
+H6 {
+	FONT-SIZE: 0.75em; MARGIN: 1.67em 0px
+}
+H1 {
+	FONT-WEIGHT: bolder
+}
+H2 {
+	FONT-WEIGHT: bolder
+}
+H3 {
+	FONT-WEIGHT: bolder
+}
+H4 {
+	FONT-WEIGHT: bolder
+}
+H5 {
+	FONT-WEIGHT: bolder
+}
+H6 {
+	FONT-WEIGHT: bolder
+}
+B {
+	FONT-WEIGHT: bolder
+}
+STRONG {
+	FONT-WEIGHT: bolder
+}
+BLOCKQUOTE {
+	MARGIN-LEFT: 40px; MARGIN-RIGHT: 40px
+}
+I {
+	FONT-STYLE: italic
+}
+CITE {
+	FONT-STYLE: italic
+}
+EM {
+	FONT-STYLE: italic
+}
+VAR {
+	FONT-STYLE: italic
+}
+ADDRESS {
+	FONT-STYLE: italic
+}
+PRE {
+	FONT-FAMILY: monospace
+}
+TT {
+	FONT-FAMILY: monospace
+}
+CODE {
+	FONT-FAMILY: monospace
+}
+KBD {
+	FONT-FAMILY: monospace
+}
+SAMP {
+	FONT-FAMILY: monospace
+}
+PRE {
+	WHITE-SPACE: pre
+}
+BUTTON {
+=09
+}
+TEXTAREA {
+=09
+}
+INPUT {
+=09
+}
+OBJECT {
+=09
+}
+SELECT {
+=09
+}
+BIG {
+	FONT-SIZE: 1.17em
+}
+SMALL {
+	FONT-SIZE: 0.83em
+}
+SUB {
+	FONT-SIZE: 0.83em
+}
+SUP {
+	FONT-SIZE: 0.83em
+}
+SUB {
+	VERTICAL-ALIGN: sub
+}
+SUP {
+	VERTICAL-ALIGN: super
+}
+TABLE {
+	border-spacing: 2px
+}
+THEAD {
+	VERTICAL-ALIGN: middle
+}
+TBODY {
+	VERTICAL-ALIGN: middle
+}
+TFOOT {
+	VERTICAL-ALIGN: middle
+}
+TD {
+	VERTICAL-ALIGN: inherit
+}
+TH {
+	VERTICAL-ALIGN: inherit
+}
+S {
+	TEXT-DECORATION: line-through
+}
+STRIKE {
+	TEXT-DECORATION: line-through
+}
+DEL {
+	TEXT-DECORATION: line-through
+}
+HR {
+	BORDER-RIGHT: 1px inset; BORDER-TOP: 1px inset; BORDER-LEFT: 1px inset; =
+BORDER-BOTTOM: 1px inset
+}
+OL {
+	MARGIN-LEFT: 40px
+}
+UL {
+	MARGIN-LEFT: 40px
+}
+DIR {
+	MARGIN-LEFT: 40px
+}
+MENU {
+	MARGIN-LEFT: 40px
+}
+DD {
+	MARGIN-LEFT: 40px
+}
+OL {
+	LIST-STYLE-TYPE: decimal
+}
+OL UL {
+	MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px
+}
+UL OL {
+	MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px
+}
+UL UL {
+	MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px
+}
+OL OL {
+	MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px
+}
+U {
+	TEXT-DECORATION: underline
+}
+INS {
+	TEXT-DECORATION: underline
+}
+BR:unknown {
+	content: "=0A=
+"
+}
+:unknown {
+	WHITE-SPACE: pre
+}
+:unknown {
+	WHITE-SPACE: pre
+}
+CENTER {
+	TEXT-ALIGN: center
+}
+abbr {
+	LETTER-SPACING: 0.1em; FONT-VARIANT: small-caps
+}
+ACRONYM {
+	LETTER-SPACING: 0.1em; FONT-VARIANT: small-caps
+}
+:link {
+	TEXT-DECORATION: underline
+}
+:visited {
+	TEXT-DECORATION: underline
+}
+:unknown {
+	outline: thin dotted invert
+}
+UNKNOWN {
+	DIRECTION: ltr; unicode-bidi: bidi-override
+}
+UNKNOWN {
+	DIRECTION: rtl; unicode-bidi: bidi-override
+}
+UNKNOWN {
+	DIRECTION: ltr; unicode-bidi: embed
+}
+UNKNOWN {
+	DIRECTION: rtl; unicode-bidi: embed
+}
+
+ at media Print   =20
+{
+H1 {
+	PAGE-BREAK-BEFORE: always
+}
+H1 {
+=09
+}
+H2 {
+=09
+}
+H3 {
+=09
+}
+H4 {
+=09
+}
+H5 {
+=09
+}
+H6 {
+=09
+}
+UL {
+=09
+}
+OL {
+=09
+}
+DL {
+=09
+}
+
+}
+
+------=_NextPart_000_0000_01C64448.58F51A70
+Content-Type: text/css;
+	charset="iso-8859-1"
+Content-Transfer-Encoding: quoted-printable
+Content-Location: http://aperture.sourceforge.net/style/default/frontpage.css
+
+ at import url( ../w3-html40-recommended.css );
+HTML {
+	BORDER-TOP-WIDTH: 0px; PADDING-RIGHT: 0px; PADDING-LEFT: 0px; =
+BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; PADDING-BOTTOM: 0px; =
+MARGIN: 0px; PADDING-TOP: 0px; BORDER-RIGHT-WIDTH: 0px
+}
+BODY {
+	BORDER-TOP-WIDTH: 0px; PADDING-RIGHT: 0px; PADDING-LEFT: 0px; =
+BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; PADDING-BOTTOM: 0px; =
+MARGIN: 0px; PADDING-TOP: 0px; BORDER-RIGHT-WIDTH: 0px
+}
+DIV {
+	BORDER-TOP-WIDTH: 0px; PADDING-RIGHT: 0px; PADDING-LEFT: 0px; =
+BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; PADDING-BOTTOM: 0px; =
+MARGIN: 0px; PADDING-TOP: 0px; BORDER-RIGHT-WIDTH: 0px
+}
+UL {
+	BORDER-TOP-WIDTH: 0px; PADDING-RIGHT: 0px; PADDING-LEFT: 0px; =
+BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; PADDING-BOTTOM: 0px; =
+MARGIN: 0px; PADDING-TOP: 0px; BORDER-RIGHT-WIDTH: 0px
+}
+OL {
+	BORDER-TOP-WIDTH: 0px; PADDING-RIGHT: 0px; PADDING-LEFT: 0px; =
+BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; PADDING-BOTTOM: 0px; =
+MARGIN: 0px; PADDING-TOP: 0px; BORDER-RIGHT-WIDTH: 0px
+}
+P {
+	BORDER-TOP-WIDTH: 0px; PADDING-RIGHT: 0px; PADDING-LEFT: 0px; =
+BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; PADDING-BOTTOM: 0px; =
+MARGIN: 0px; PADDING-TOP: 0px; BORDER-RIGHT-WIDTH: 0px
+}
+LI {
+	BORDER-TOP-WIDTH: 0px; PADDING-RIGHT: 0px; PADDING-LEFT: 0px; =
+BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; PADDING-BOTTOM: 0px; =
+MARGIN: 0px; PADDING-TOP: 0px; BORDER-RIGHT-WIDTH: 0px
+}
+HTML {
+	FONT-SIZE: 82%; BACKGROUND-IMAGE: url(img/background.gif); COLOR: #333; =
+LINE-HEIGHT: 120%; FONT-FAMILY: verdana, arial, serif
+}
+BODY {
+	PADDING-RIGHT: 38px; PADDING-LEFT: 37px; BACKGROUND-IMAGE: =
+url(img/containerbackground.gif); PADDING-BOTTOM: 0px; MARGIN-LEFT: =
+auto; WIDTH: 590px; MARGIN-RIGHT: auto; PADDING-TOP: 0px; =
+BACKGROUND-REPEAT: repeat-y
+}
+UL {
+	PADDING-RIGHT: 12px; PADDING-LEFT: 12px; PADDING-BOTTOM: 10px; =
+PADDING-TOP: 0px
+}
+OL {
+	PADDING-RIGHT: 12px; PADDING-LEFT: 12px; PADDING-BOTTOM: 10px; =
+PADDING-TOP: 0px
+}
+P {
+	PADDING-RIGHT: 12px; PADDING-LEFT: 12px; PADDING-BOTTOM: 10px; =
+PADDING-TOP: 0px
+}
+UL {
+	PADDING-LEFT: 16px; LIST-STYLE-POSITION: outside; MARGIN-LEFT: 0px
+}
+OL {
+	PADDING-LEFT: 16px; LIST-STYLE-POSITION: outside; MARGIN-LEFT: 0px
+}
+LI {
+	MARGIN-BOTTOM: 8px; MARGIN-LEFT: 15px
+}
+H2 {
+	PADDING-RIGHT: 0px; PADDING-LEFT: 0px; FONT-SIZE: 130%; PADDING-BOTTOM: =
+0px; MARGIN: 20px 0px 15px; PADDING-TOP: 0px; TEXT-ALIGN: center
+}
+IMG {
+	BORDER-TOP-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: =
+0px; BORDER-RIGHT-WIDTH: 0px
+}
+A:link {
+	COLOR: #cc0000; TEXT-DECORATION: none
+}
+A:visited {
+	COLOR: #cc6666; TEXT-DECORATION: none
+}
+A:hover {
+	COLOR: #cc0000; TEXT-DECORATION: underline
+}
+#header {
+	PADDING-RIGHT: 20px; PADDING-LEFT: 20px; MARGIN-BOTTOM: 20px; =
+PADDING-BOTTOM: 20px; COLOR: #d88; PADDING-TOP: 20px; BACKGROUND-COLOR: =
+rgb(156,26,0)
+}
+#header H1 {
+	COLOR: #eaa
+}
+#content {
+	FLOAT: left; WIDTH: 389px
+}
+#content H2 {
+	BACKGROUND-POSITION: left 50%; BACKGROUND-IMAGE: =
+url(img/bgheader-content.png); COLOR: #ffffff; PADDING-TOP: 6px; HEIGHT: =
+28px; TEXT-ALIGN: center
+}
+#sideBar {
+	FLOAT: right; WIDTH: 192px
+}
+#sideBar H2 {
+	BACKGROUND-POSITION: left 50%; BACKGROUND-IMAGE: =
+url(img/bgheader-sidebar.png); COLOR: #fff; PADDING-TOP: 6px; HEIGHT: =
+28px; BACKGROUND-COLOR: #f7b356
+}
+#preamble {
+	FONT-SIZE: 82%; COLOR: #996666
+}
+#footer {
+	CLEAR: both; PADDING-RIGHT: 0px; BORDER-TOP: #999 1px solid; =
+PADDING-LEFT: 0px; FONT-WEIGHT: bold; PADDING-BOTTOM: 6px; PADDING-TOP: =
+6px; BACKGROUND-COLOR: #fff; TEXT-ALIGN: center
+}
+
+------=_NextPart_000_0000_01C64448.58F51A70
+Content-Type: text/css;
+	charset="iso-8859-1"
+Content-Transfer-Encoding: quoted-printable
+Content-Location: http://aperture.sourceforge.net/style/default/print.css
+
+HTML {
+	FONT-SIZE: 100%; BACKGROUND: #fff; COLOR: #000; LINE-HEIGHT: 110%; =
+FONT-FAMILY: "Times New Roman", "Times", serif
+}
+BODY {
+	FONT-SIZE: 100%; BACKGROUND: #fff; COLOR: #000; LINE-HEIGHT: 110%; =
+FONT-FAMILY: "Times New Roman", "Times", serif
+}
+
+------=_NextPart_000_0000_01C64448.58F51A70
+Content-Type: text/css;
+	charset="iso-8859-1"
+Content-Transfer-Encoding: quoted-printable
+Content-Location: http://aperture.sourceforge.net/w3-html40-recommended.css
+
+HTML {
+	DISPLAY: block
+}
+ADDRESS {
+	DISPLAY: block
+}
+BLOCKQUOTE {
+	DISPLAY: block
+}
+BODY {
+	DISPLAY: block
+}
+DD {
+	DISPLAY: block
+}
+DIV {
+	DISPLAY: block
+}
+DL {
+	DISPLAY: block
+}
+DT {
+	DISPLAY: block
+}
+FIELDSET {
+	DISPLAY: block
+}
+FORM {
+	DISPLAY: block
+}
+FRAME {
+	DISPLAY: block
+}
+FRAMESET {
+	DISPLAY: block
+}
+H1 {
+	DISPLAY: block
+}
+H2 {
+	DISPLAY: block
+}
+H3 {
+	DISPLAY: block
+}
+H4 {
+	DISPLAY: block
+}
+H5 {
+	DISPLAY: block
+}
+H6 {
+	DISPLAY: block
+}
+NOFRAMES {
+	DISPLAY: block
+}
+OL {
+	DISPLAY: block
+}
+P {
+	DISPLAY: block
+}
+UL {
+	DISPLAY: block
+}
+CENTER {
+	DISPLAY: block
+}
+DIR {
+	DISPLAY: block
+}
+HR {
+	DISPLAY: block
+}
+MENU {
+	DISPLAY: block
+}
+PRE {
+	DISPLAY: block
+}
+LI {
+	DISPLAY: list-item
+}
+HEAD {
+	DISPLAY: none
+}
+TABLE {
+=09
+}
+TR {
+=09
+}
+THEAD {
+	DISPLAY: table-header-group
+}
+TBODY {
+=09
+}
+TFOOT {
+	DISPLAY: table-footer-group
+}
+COL {
+=09
+}
+COLGROUP {
+=09
+}
+TD {
+=09
+}
+TH {
+=09
+}
+CAPTION {
+=09
+}
+TH {
+	FONT-WEIGHT: bolder; TEXT-ALIGN: center
+}
+CAPTION {
+	TEXT-ALIGN: center
+}
+BODY {
+	MARGIN: 8px; LINE-HEIGHT: 1.12
+}
+H1 {
+	FONT-SIZE: 2em; MARGIN: 0.67em 0px
+}
+H2 {
+	FONT-SIZE: 1.5em; MARGIN: 0.75em 0px
+}
+H3 {
+	FONT-SIZE: 1.17em; MARGIN: 0.83em 0px
+}
+H4 {
+	MARGIN: 1.12em 0px
+}
+P {
+	MARGIN: 1.12em 0px
+}
+BLOCKQUOTE {
+	MARGIN: 1.12em 0px
+}
+UL {
+	MARGIN: 1.12em 0px
+}
+FIELDSET {
+	MARGIN: 1.12em 0px
+}
+FORM {
+	MARGIN: 1.12em 0px
+}
+OL {
+	MARGIN: 1.12em 0px
+}
+DL {
+	MARGIN: 1.12em 0px
+}
+DIR {
+	MARGIN: 1.12em 0px
+}
+MENU {
+	MARGIN: 1.12em 0px
+}
+H5 {
+	FONT-SIZE: 0.83em; MARGIN: 1.5em 0px
+}
+H6 {
+	FONT-SIZE: 0.75em; MARGIN: 1.67em 0px
+}
+H1 {
+	FONT-WEIGHT: bolder
+}
+H2 {
+	FONT-WEIGHT: bolder
+}
+H3 {
+	FONT-WEIGHT: bolder
+}
+H4 {
+	FONT-WEIGHT: bolder
+}
+H5 {
+	FONT-WEIGHT: bolder
+}
+H6 {
+	FONT-WEIGHT: bolder
+}
+B {
+	FONT-WEIGHT: bolder
+}
+STRONG {
+	FONT-WEIGHT: bolder
+}
+BLOCKQUOTE {
+	MARGIN-LEFT: 40px; MARGIN-RIGHT: 40px
+}
+I {
+	FONT-STYLE: italic
+}
+CITE {
+	FONT-STYLE: italic
+}
+EM {
+	FONT-STYLE: italic
+}
+VAR {
+	FONT-STYLE: italic
+}
+ADDRESS {
+	FONT-STYLE: italic
+}
+PRE {
+	FONT-FAMILY: monospace
+}
+TT {
+	FONT-FAMILY: monospace
+}
+CODE {
+	FONT-FAMILY: monospace
+}
+KBD {
+	FONT-FAMILY: monospace
+}
+SAMP {
+	FONT-FAMILY: monospace
+}
+PRE {
+	WHITE-SPACE: pre
+}
+BUTTON {
+=09
+}
+TEXTAREA {
+=09
+}
+INPUT {
+=09
+}
+OBJECT {
+=09
+}
+SELECT {
+=09
+}
+BIG {
+	FONT-SIZE: 1.17em
+}
+SMALL {
+	FONT-SIZE: 0.83em
+}
+SUB {
+	FONT-SIZE: 0.83em
+}
+SUP {
+	FONT-SIZE: 0.83em
+}
+SUB {
+	VERTICAL-ALIGN: sub
+}
+SUP {
+	VERTICAL-ALIGN: super
+}
+TABLE {
+	border-spacing: 2px
+}
+THEAD {
+	VERTICAL-ALIGN: middle
+}
+TBODY {
+	VERTICAL-ALIGN: middle
+}
+TFOOT {
+	VERTICAL-ALIGN: middle
+}
+TD {
+	VERTICAL-ALIGN: inherit
+}
+TH {
+	VERTICAL-ALIGN: inherit
+}
+S {
+	TEXT-DECORATION: line-through
+}
+STRIKE {
+	TEXT-DECORATION: line-through
+}
+DEL {
+	TEXT-DECORATION: line-through
+}
+HR {
+	BORDER-RIGHT: 1px inset; BORDER-TOP: 1px inset; BORDER-LEFT: 1px inset; =
+BORDER-BOTTOM: 1px inset
+}
+OL {
+	MARGIN-LEFT: 40px
+}
+UL {
+	MARGIN-LEFT: 40px
+}
+DIR {
+	MARGIN-LEFT: 40px
+}
+MENU {
+	MARGIN-LEFT: 40px
+}
+DD {
+	MARGIN-LEFT: 40px
+}
+OL {
+	LIST-STYLE-TYPE: decimal
+}
+OL UL {
+	MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px
+}
+UL OL {
+	MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px
+}
+UL UL {
+	MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px
+}
+OL OL {
+	MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px
+}
+U {
+	TEXT-DECORATION: underline
+}
+INS {
+	TEXT-DECORATION: underline
+}
+BR:unknown {
+	content: "=0A=
+"
+}
+:unknown {
+	WHITE-SPACE: pre
+}
+:unknown {
+	WHITE-SPACE: pre
+}
+CENTER {
+	TEXT-ALIGN: center
+}
+abbr {
+	LETTER-SPACING: 0.1em; FONT-VARIANT: small-caps
+}
+ACRONYM {
+	LETTER-SPACING: 0.1em; FONT-VARIANT: small-caps
+}
+:link {
+	TEXT-DECORATION: underline
+}
+:visited {
+	TEXT-DECORATION: underline
+}
+:unknown {
+	outline: thin dotted invert
+}
+UNKNOWN {
+	DIRECTION: ltr; unicode-bidi: bidi-override
+}
+UNKNOWN {
+	DIRECTION: rtl; unicode-bidi: bidi-override
+}
+UNKNOWN {
+	DIRECTION: ltr; unicode-bidi: embed
+}
+UNKNOWN {
+	DIRECTION: rtl; unicode-bidi: embed
+}
+
+ at media Print   =20
+{
+H1 {
+	PAGE-BREAK-BEFORE: always
+}
+H1 {
+=09
+}
+H2 {
+=09
+}
+H3 {
+=09
+}
+H4 {
+=09
+}
+H5 {
+=09
+}
+H6 {
+=09
+}
+UL {
+=09
+}
+OL {
+=09
+}
+DL {
+=09
+}
+
+}
+
+------=_NextPart_000_0000_01C64448.58F51A70
+Content-Type: text/css;
+	charset="iso-8859-1"
+Content-Transfer-Encoding: quoted-printable
+Content-Location: http://aperture.sourceforge.net/style/basic/all.css
+
+ at import url( ../w3-html40-recommended.css );
+IMG {
+	BORDER-TOP-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: =
+0px; BORDER-RIGHT-WIDTH: 0px
+}
+
+------=_NextPart_000_0000_01C64448.58F51A70--

Copied: trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/microsoft-excel-2000.xls (from rev 976, trunk/dna-repository/src/test/resources/docs/microsoft-excel-2000.xls)
===================================================================
(Binary files differ)

Copied: trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/microsoft-excel-2007beta2.xlam (from rev 976, trunk/dna-repository/src/test/resources/docs/microsoft-excel-2007beta2.xlam)
===================================================================
(Binary files differ)

Copied: trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/microsoft-excel-2007beta2.xlsb (from rev 976, trunk/dna-repository/src/test/resources/docs/microsoft-excel-2007beta2.xlsb)
===================================================================
(Binary files differ)

Copied: trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/microsoft-excel-2007beta2.xlsm (from rev 976, trunk/dna-repository/src/test/resources/docs/microsoft-excel-2007beta2.xlsm)
===================================================================
(Binary files differ)

Copied: trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/microsoft-excel-2007beta2.xlsx (from rev 976, trunk/dna-repository/src/test/resources/docs/microsoft-excel-2007beta2.xlsx)
===================================================================
(Binary files differ)

Copied: trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/microsoft-excel-2007beta2.xltm (from rev 976, trunk/dna-repository/src/test/resources/docs/microsoft-excel-2007beta2.xltm)
===================================================================
(Binary files differ)

Copied: trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/microsoft-excel-2007beta2.xltx (from rev 976, trunk/dna-repository/src/test/resources/docs/microsoft-excel-2007beta2.xltx)
===================================================================
(Binary files differ)

Copied: trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/microsoft-powerpoint-2000.ppt (from rev 976, trunk/dna-repository/src/test/resources/docs/microsoft-powerpoint-2000.ppt)
===================================================================
(Binary files differ)

Copied: trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/microsoft-powerpoint-2007beta2.potm (from rev 976, trunk/dna-repository/src/test/resources/docs/microsoft-powerpoint-2007beta2.potm)
===================================================================
(Binary files differ)

Copied: trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/microsoft-powerpoint-2007beta2.potx (from rev 976, trunk/dna-repository/src/test/resources/docs/microsoft-powerpoint-2007beta2.potx)
===================================================================
(Binary files differ)

Copied: trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/microsoft-powerpoint-2007beta2.ppsm (from rev 976, trunk/dna-repository/src/test/resources/docs/microsoft-powerpoint-2007beta2.ppsm)
===================================================================
(Binary files differ)

Copied: trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/microsoft-powerpoint-2007beta2.ppsx (from rev 976, trunk/dna-repository/src/test/resources/docs/microsoft-powerpoint-2007beta2.ppsx)
===================================================================
(Binary files differ)

Copied: trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/microsoft-powerpoint-2007beta2.pptm (from rev 976, trunk/dna-repository/src/test/resources/docs/microsoft-powerpoint-2007beta2.pptm)
===================================================================
(Binary files differ)

Copied: trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/microsoft-powerpoint-2007beta2.pptx (from rev 976, trunk/dna-repository/src/test/resources/docs/microsoft-powerpoint-2007beta2.pptx)
===================================================================
(Binary files differ)

Copied: trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/microsoft-publisher-2003.pub (from rev 976, trunk/dna-repository/src/test/resources/docs/microsoft-publisher-2003.pub)
===================================================================
(Binary files differ)

Copied: trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/microsoft-visio.vsd (from rev 976, trunk/dna-repository/src/test/resources/docs/microsoft-visio.vsd)
===================================================================
(Binary files differ)

Copied: trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/microsoft-word-2000-with-wrong-file-extension.pdf (from rev 976, trunk/dna-repository/src/test/resources/docs/microsoft-word-2000-with-wrong-file-extension.pdf)
===================================================================
(Binary files differ)

Copied: trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/microsoft-word-2000.doc (from rev 976, trunk/dna-repository/src/test/resources/docs/microsoft-word-2000.doc)
===================================================================
(Binary files differ)

Copied: trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/microsoft-word-2007beta2.docm (from rev 976, trunk/dna-repository/src/test/resources/docs/microsoft-word-2007beta2.docm)
===================================================================
(Binary files differ)

Copied: trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/microsoft-word-2007beta2.docx (from rev 976, trunk/dna-repository/src/test/resources/docs/microsoft-word-2007beta2.docx)
===================================================================
(Binary files differ)

Copied: trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/microsoft-word-2007beta2.dotm (from rev 976, trunk/dna-repository/src/test/resources/docs/microsoft-word-2007beta2.dotm)
===================================================================
(Binary files differ)

Copied: trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/microsoft-word-2007beta2.dotx (from rev 976, trunk/dna-repository/src/test/resources/docs/microsoft-word-2007beta2.dotx)
===================================================================
(Binary files differ)

Copied: trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/microsoft-works-spreadsheet-3.0.wks (from rev 976, trunk/dna-repository/src/test/resources/docs/microsoft-works-spreadsheet-3.0.wks)
===================================================================
(Binary files differ)

Copied: trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/microsoft-works-spreadsheet-4.0-2000.wks (from rev 976, trunk/dna-repository/src/test/resources/docs/microsoft-works-spreadsheet-4.0-2000.wks)
===================================================================
(Binary files differ)

Copied: trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/microsoft-works-spreadsheet-7.0.xlr (from rev 976, trunk/dna-repository/src/test/resources/docs/microsoft-works-spreadsheet-7.0.xlr)
===================================================================
(Binary files differ)

Copied: trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/microsoft-works-word-processor-2000.wps (from rev 976, trunk/dna-repository/src/test/resources/docs/microsoft-works-word-processor-2000.wps)
===================================================================
(Binary files differ)

Copied: trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/microsoft-works-word-processor-3.0.wps (from rev 976, trunk/dna-repository/src/test/resources/docs/microsoft-works-word-processor-3.0.wps)
===================================================================
(Binary files differ)

Copied: trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/microsoft-works-word-processor-4.0.wps (from rev 976, trunk/dna-repository/src/test/resources/docs/microsoft-works-word-processor-4.0.wps)
===================================================================
(Binary files differ)

Copied: trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/microsoft-works-word-processor-7.0.wps (from rev 976, trunk/dna-repository/src/test/resources/docs/microsoft-works-word-processor-7.0.wps)
===================================================================
(Binary files differ)

Copied: trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/openoffice-1.1.5-calc-template.stc (from rev 976, trunk/dna-repository/src/test/resources/docs/openoffice-1.1.5-calc-template.stc)
===================================================================
(Binary files differ)

Copied: trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/openoffice-1.1.5-calc.sxc (from rev 976, trunk/dna-repository/src/test/resources/docs/openoffice-1.1.5-calc.sxc)
===================================================================
(Binary files differ)

Copied: trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/openoffice-1.1.5-draw-template.std (from rev 976, trunk/dna-repository/src/test/resources/docs/openoffice-1.1.5-draw-template.std)
===================================================================
(Binary files differ)

Copied: trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/openoffice-1.1.5-draw.sxd (from rev 976, trunk/dna-repository/src/test/resources/docs/openoffice-1.1.5-draw.sxd)
===================================================================
(Binary files differ)

Copied: trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/openoffice-1.1.5-impress-template.sti (from rev 976, trunk/dna-repository/src/test/resources/docs/openoffice-1.1.5-impress-template.sti)
===================================================================
(Binary files differ)

Copied: trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/openoffice-1.1.5-impress.sxi (from rev 976, trunk/dna-repository/src/test/resources/docs/openoffice-1.1.5-impress.sxi)
===================================================================
(Binary files differ)

Copied: trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/openoffice-1.1.5-writer-template.stw (from rev 976, trunk/dna-repository/src/test/resources/docs/openoffice-1.1.5-writer-template.stw)
===================================================================
(Binary files differ)

Copied: trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/openoffice-1.1.5-writer.sxw (from rev 976, trunk/dna-repository/src/test/resources/docs/openoffice-1.1.5-writer.sxw)
===================================================================
(Binary files differ)

Copied: trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/openoffice-2.0-calc-template.ots (from rev 976, trunk/dna-repository/src/test/resources/docs/openoffice-2.0-calc-template.ots)
===================================================================
(Binary files differ)

Copied: trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/openoffice-2.0-calc.ods (from rev 976, trunk/dna-repository/src/test/resources/docs/openoffice-2.0-calc.ods)
===================================================================
(Binary files differ)

Copied: trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/openoffice-2.0-draw-template.otg (from rev 976, trunk/dna-repository/src/test/resources/docs/openoffice-2.0-draw-template.otg)
===================================================================
(Binary files differ)

Copied: trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/openoffice-2.0-draw.odg (from rev 976, trunk/dna-repository/src/test/resources/docs/openoffice-2.0-draw.odg)
===================================================================
(Binary files differ)

Copied: trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/openoffice-2.0-formula.odf (from rev 976, trunk/dna-repository/src/test/resources/docs/openoffice-2.0-formula.odf)
===================================================================
(Binary files differ)

Copied: trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/openoffice-2.0-impress-template.otp (from rev 976, trunk/dna-repository/src/test/resources/docs/openoffice-2.0-impress-template.otp)
===================================================================
(Binary files differ)

Copied: trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/openoffice-2.0-impress.odp (from rev 976, trunk/dna-repository/src/test/resources/docs/openoffice-2.0-impress.odp)
===================================================================
(Binary files differ)

Copied: trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/openoffice-2.0-writer-template.ott (from rev 976, trunk/dna-repository/src/test/resources/docs/openoffice-2.0-writer-template.ott)
===================================================================
(Binary files differ)

Copied: trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/openoffice-2.0-writer.odt (from rev 976, trunk/dna-repository/src/test/resources/docs/openoffice-2.0-writer.odt)
===================================================================
(Binary files differ)

Copied: trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/pdf-distiller-6-weirdchars.pdf (from rev 976, trunk/dna-repository/src/test/resources/docs/pdf-distiller-6-weirdchars.pdf)
===================================================================
(Binary files differ)

Copied: trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/pdf-no-author.pdf (from rev 976, trunk/dna-repository/src/test/resources/docs/pdf-no-author.pdf)
===================================================================
(Binary files differ)

Copied: trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/pdf-openoffice-1.1.5-writer.pdf (from rev 976, trunk/dna-repository/src/test/resources/docs/pdf-openoffice-1.1.5-writer.pdf)
===================================================================
(Binary files differ)

Copied: trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/pdf-openoffice-2.0-writer.pdf (from rev 976, trunk/dna-repository/src/test/resources/docs/pdf-openoffice-2.0-writer.pdf)
===================================================================
(Binary files differ)

Copied: trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/pdf-word-2000-pdfcreator-0.8.0.pdf (from rev 976, trunk/dna-repository/src/test/resources/docs/pdf-word-2000-pdfcreator-0.8.0.pdf)
===================================================================
(Binary files differ)

Copied: trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/pdf-word-2000-pdfmaker-7.0.pdf (from rev 976, trunk/dna-repository/src/test/resources/docs/pdf-word-2000-pdfmaker-7.0.pdf)
===================================================================
(Binary files differ)

Copied: trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/pdf-word-2000-pdfwriter-7.0.pdf (from rev 976, trunk/dna-repository/src/test/resources/docs/pdf-word-2000-pdfwriter-7.0.pdf)
===================================================================
(Binary files differ)

Copied: trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/plain-text-ansi.txt (from rev 976, trunk/dna-repository/src/test/resources/docs/plain-text-ansi.txt)
===================================================================
--- trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/plain-text-ansi.txt	                        (rev 0)
+++ trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/plain-text-ansi.txt	2009-06-04 22:31:30 UTC (rev 977)
@@ -0,0 +1 @@
+test
\ No newline at end of file


Property changes on: trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/plain-text-ansi.txt
___________________________________________________________________
Name: svn:mime-type
   + text/plain
Name: svn:keywords
   + Id Revision
Name: svn:eol-style
   + LF

Copied: trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/plain-text-empty.txt (from rev 976, trunk/dna-repository/src/test/resources/docs/plain-text-empty.txt)
===================================================================


Property changes on: trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/plain-text-empty.txt
___________________________________________________________________
Name: svn:mime-type
   + text/plain
Name: svn:keywords
   + Id Revision
Name: svn:eol-style
   + LF

Copied: trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/plain-text-utf16be.txt (from rev 976, trunk/dna-repository/src/test/resources/docs/plain-text-utf16be.txt)
===================================================================
(Binary files differ)


Property changes on: trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/plain-text-utf16be.txt
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream
Name: svn:keywords
   + Id Revision
Name: svn:eol-style
   + LF

Copied: trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/plain-text-utf16le.txt (from rev 976, trunk/dna-repository/src/test/resources/docs/plain-text-utf16le.txt)
===================================================================
(Binary files differ)


Property changes on: trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/plain-text-utf16le.txt
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream
Name: svn:keywords
   + Id Revision
Name: svn:eol-style
   + LF

Copied: trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/plain-text-utf8.txt (from rev 976, trunk/dna-repository/src/test/resources/docs/plain-text-utf8.txt)
===================================================================
--- trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/plain-text-utf8.txt	                        (rev 0)
+++ trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/plain-text-utf8.txt	2009-06-04 22:31:30 UTC (rev 977)
@@ -0,0 +1 @@
+???test
\ No newline at end of file


Property changes on: trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/plain-text-utf8.txt
___________________________________________________________________
Name: svn:mime-type
   + text/plain
Name: svn:keywords
   + Id Revision
Name: svn:eol-style
   + LF

Copied: trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/plain-text-with-null-character.txt (from rev 976, trunk/dna-repository/src/test/resources/docs/plain-text-with-null-character.txt)
===================================================================
(Binary files differ)


Property changes on: trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/plain-text-with-null-character.txt
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream
Name: svn:keywords
   + Id Revision
Name: svn:eol-style
   + LF

Copied: trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/plain-text-without-extension (from rev 976, trunk/dna-repository/src/test/resources/docs/plain-text-without-extension)
===================================================================
--- trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/plain-text-without-extension	                        (rev 0)
+++ trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/plain-text-without-extension	2009-06-04 22:31:30 UTC (rev 977)
@@ -0,0 +1 @@
+This is a normal plain text document.

Copied: trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/plain-text.txt (from rev 976, trunk/dna-repository/src/test/resources/docs/plain-text.txt)
===================================================================
--- trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/plain-text.txt	                        (rev 0)
+++ trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/plain-text.txt	2009-06-04 22:31:30 UTC (rev 977)
@@ -0,0 +1 @@
+This is a normal plain text document.


Property changes on: trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/plain-text.txt
___________________________________________________________________
Name: svn:mime-type
   + text/plain
Name: svn:keywords
   + Id Revision
Name: svn:eol-style
   + LF

Copied: trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/rtf-openoffice-1.1.5.rtf (from rev 976, trunk/dna-repository/src/test/resources/docs/rtf-openoffice-1.1.5.rtf)
===================================================================
--- trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/rtf-openoffice-1.1.5.rtf	                        (rev 0)
+++ trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/rtf-openoffice-1.1.5.rtf	2009-06-04 22:31:30 UTC (rev 977)
@@ -0,0 +1,16 @@
+{\rtf1\ansi\deff0\adeflang1025
+{\fonttbl{\f0\froman\fprq2\fcharset0 Times New Roman;}{\f1\froman\fprq2\fcharset0 Times New Roman;}{\f2\fnil\fprq2\fcharset0 Lucida Sans Unicode;}{\f3\fnil\fprq2\fcharset0 Tahoma;}{\f4\fnil\fprq0\fcharset0 Tahoma;}}
+{\colortbl;\red0\green0\blue0;\red128\green128\blue128;}
+{\stylesheet{\s1\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af3\afs24\lang255\ltrch\dbch\af2\afs24\langfe255\loch\f0\fs24\lang1033\snext1 Default;}
+{\s2\sa120\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af3\afs24\lang255\ltrch\dbch\af2\afs24\langfe255\loch\f0\fs24\lang1033\sbasedon1\snext2 Text body;}
+{\s3\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af4\afs24\lang255\ltrch\dbch\af2\afs24\langfe255\loch\f0\fs24\lang1033\sbasedon2\snext3 List;}
+{\s4\sb120\sa120\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af4\afs20\lang255\ai\ltrch\dbch\af2\afs20\langfe255\ai\loch\f0\fs20\lang1033\i\sbasedon1\snext4 Caption;}
+{\s5\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af4\afs24\lang255\ltrch\dbch\af2\afs24\langfe255\loch\f0\fs24\lang1033\sbasedon1\snext5 Index;}
+}
+{\info{\author Christiaan Fluit}{\creatim\yr2006\mo1\dy30\hr15\min10}{\operator Christiaan Fluit}{\revtim\yr2006\mo1\dy30\hr15\min10}{\printim\yr1601\mo1\dy1\hr0\min0}{\comment StarWriter}{\vern6450}}\deftab709
+{\*\pgdsctbl
+{\pgdsc0\pgdscuse195\pgwsxn11905\pghsxn16837\marglsxn1800\margrsxn1800\margtsxn1440\margbsxn1440\pgdscnxt0 Default;}}
+\paperh16837\paperw11905\margl1800\margr1800\margt1440\margb1440\sectd\sbknone\pgwsxn11905\pghsxn16837\marglsxn1800\margrsxn1800\margtsxn1440\margbsxn1440\ftnbj\ftnstart1\ftnrstcont\ftnnar\aenddoc\aftnrstcont\aftnstart1\aftnnrlc
+\pard\plain \ltrpar\s1\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af3\afs24\lang255\ltrch\dbch\af2\afs24\langfe255\loch\f0\fs24\lang1033 {\loch\f0\fs24\lang1033\i0\b0 This is an example RTF document created with OpenOffice 1.1.5}
+\par 
+\par }
\ No newline at end of file

Copied: trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/rtf-openoffice-2.0.rtf (from rev 976, trunk/dna-repository/src/test/resources/docs/rtf-openoffice-2.0.rtf)
===================================================================
--- trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/rtf-openoffice-2.0.rtf	                        (rev 0)
+++ trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/rtf-openoffice-2.0.rtf	2009-06-04 22:31:30 UTC (rev 977)
@@ -0,0 +1,17 @@
+{\rtf1\ansi\deff0\adeflang1025
+{\fonttbl{\f0\froman\fprq2\fcharset0 Times New Roman;}{\f1\froman\fprq2\fcharset0 Times New Roman;}{\f2\fswiss\fprq2\fcharset0 Arial;}{\f3\fnil\fprq2\fcharset0 Lucida Sans Unicode;}{\f4\fnil\fprq2\fcharset0 MS Mincho;}{\f5\fnil\fprq2\fcharset0 Tahoma;}{\f6\fnil\fprq0\fcharset0 Tahoma;}}
+{\colortbl;\red0\green0\blue0;\red128\green128\blue128;}
+{\stylesheet{\s1\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af5\afs24\lang255\ltrch\dbch\af3\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033\snext1 Normal;}
+{\s2\sb240\sa120\keepn\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\afs28\lang255\ltrch\dbch\af4\langfe255\hich\f2\fs28\lang1033\loch\f2\fs28\lang1033\sbasedon1\snext3 Heading;}
+{\s3\sa120\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af5\afs24\lang255\ltrch\dbch\af3\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033\sbasedon1\snext3 Body Text;}
+{\s4\sa120\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af6\afs24\lang255\ltrch\dbch\af3\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033\sbasedon3\snext4 List;}
+{\s5\sb120\sa120\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af6\afs24\lang255\ai\ltrch\dbch\af3\langfe255\hich\f0\fs24\lang1033\i\loch\f0\fs24\lang1033\i\sbasedon1\snext5 caption;}
+{\s6\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af6\afs24\lang255\ltrch\dbch\af3\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033\sbasedon1\snext6 Index;}
+}
+{\info{\author Christiaan Fluit}{\creatim\yr2006\mo1\dy30\hr15\min8}{\revtim\yr1601\mo1\dy1\hr0\min0}{\printim\yr1601\mo1\dy1\hr0\min0}{\comment StarWriter}{\vern6800}}\deftab709
+{\*\pgdsctbl
+{\pgdsc0\pgdscuse195\pgwsxn12240\pghsxn15840\marglsxn1134\margrsxn1134\margtsxn1134\margbsxn1134\pgdscnxt0 Standard;}}
+\paperh15840\paperw12240\margl1134\margr1134\margt1134\margb1134\sectd\sbknone\pgwsxn12240\pghsxn15840\marglsxn1134\margrsxn1134\margtsxn1134\margbsxn1134\ftnbj\ftnstart1\ftnrstcont\ftnnar\aenddoc\aftnrstcont\aftnstart1\aftnnrlc
+\pard\plain \ltrpar\s1\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af5\afs24\lang255\ltrch\dbch\af3\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 This is an example RTF document created with OpenOffice 2.0.}
+\par \pard\plain \ltrpar\s1\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af5\afs24\lang255\ltrch\dbch\af3\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 
+\par }
\ No newline at end of file

Copied: trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/rtf-staroffice-5.2.rtf (from rev 976, trunk/dna-repository/src/test/resources/docs/rtf-staroffice-5.2.rtf)
===================================================================
--- trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/rtf-staroffice-5.2.rtf	                        (rev 0)
+++ trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/rtf-staroffice-5.2.rtf	2009-06-04 22:31:30 UTC (rev 977)
@@ -0,0 +1,12 @@
+{\rtf1\ansi\deff0
+{\fonttbl{\f0\froman\fprq2\fcharset0 Times New Roman;}}
+{\colortbl\red0\green0\blue0;\red255\green255\blue255;\red128\green128\blue128;}
+{\stylesheet{\s1\snext1 Standard;}
+}
+{\info{\comment StarWriter}{\vern5690}}\deftab720
+{\*\pgdsctbl
+{\pgdsc0\pgdscuse195\pgwsxn11905\pghsxn16837\marglsxn1800\margrsxn1800\margtsxn1440\margbsxn1440\pgdscnxt0 Standard;}}
+\paperh16837\paperw11905\margl1800\margr1800\margt1440\margb1440\sectd\sbknone\pgwsxn11905\pghsxn16837\marglsxn1800\margrsxn1800\margtsxn1440\margbsxn1440\ftnbj\ftnstart1\ftnrstcont\ftnnar\aenddoc\aftnrstcont\aftnstart1\aftnnrlc
+\pard\plain \s1 This is an example RTF document created with StarOffice 5.2.
+\par 
+\par }
\ No newline at end of file

Copied: trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/rtf-word-2000.rtf (from rev 976, trunk/dna-repository/src/test/resources/docs/rtf-word-2000.rtf)
===================================================================
--- trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/rtf-word-2000.rtf	                        (rev 0)
+++ trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/rtf-word-2000.rtf	2009-06-04 22:31:30 UTC (rev 977)
@@ -0,0 +1,14 @@
+{\rtf1\ansi\ansicpg1252\uc1 \deff0\deflang1033\deflangfe1033{\fonttbl{\f0\froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\f28\froman\fcharset238\fprq2 Times New Roman CE;}{\f29\froman\fcharset204\fprq2 Times New Roman Cyr;}
+{\f31\froman\fcharset161\fprq2 Times New Roman Greek;}{\f32\froman\fcharset162\fprq2 Times New Roman Tur;}{\f33\froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\f34\froman\fcharset178\fprq2 Times New Roman (Arabic);}
+{\f35\froman\fcharset186\fprq2 Times New Roman Baltic;}}{\colortbl;\red0\green0\blue0;\red0\green0\blue255;\red0\green255\blue255;\red0\green255\blue0;\red255\green0\blue255;\red255\green0\blue0;\red255\green255\blue0;\red255\green255\blue255;
+\red0\green0\blue128;\red0\green128\blue128;\red0\green128\blue0;\red128\green0\blue128;\red128\green0\blue0;\red128\green128\blue0;\red128\green128\blue128;\red192\green192\blue192;}{\stylesheet{
+\ql \li0\ri0\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \fs24\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 \snext0 Normal;}{\*\cs10 \additive Default Paragraph Font;}}{\info
+{\title This is an example RTF document created with Word 2000}{\author Christiaan Fluit}{\operator Christiaan Fluit}{\creatim\yr2006\mo1\dy30\hr15\min3}{\revtim\yr2006\mo1\dy30\hr15\min4}{\version1}{\edmins1}{\nofpages1}{\nofwords0}{\nofchars0}
+{\*\company Aduna}{\nofcharsws0}{\vern8229}}\widowctrl\ftnbj\aenddoc\noxlattoyen\expshrtn\noultrlspc\dntblnsbdb\nospaceforul\formshade\horzdoc\dgmargin\dghspace180\dgvspace180\dghorigin1800\dgvorigin1440\dghshow1\dgvshow1
+\jexpand\viewkind1\viewscale100\pgbrdrhead\pgbrdrfoot\splytwnine\ftnlytwnine\htmautsp\nolnhtadjtbl\useltbaln\alntblind\lytcalctblwd\lyttblrtgr\lnbrkrule \fet0\sectd \linex0\endnhere\sectlinegrid360\sectdefaultcl {\*\pnseclvl1
+\pnucrm\pnstart1\pnindent720\pnhang{\pntxta .}}{\*\pnseclvl2\pnucltr\pnstart1\pnindent720\pnhang{\pntxta .}}{\*\pnseclvl3\pndec\pnstart1\pnindent720\pnhang{\pntxta .}}{\*\pnseclvl4\pnlcltr\pnstart1\pnindent720\pnhang{\pntxta )}}{\*\pnseclvl5
+\pndec\pnstart1\pnindent720\pnhang{\pntxtb (}{\pntxta )}}{\*\pnseclvl6\pnlcltr\pnstart1\pnindent720\pnhang{\pntxtb (}{\pntxta )}}{\*\pnseclvl7\pnlcrm\pnstart1\pnindent720\pnhang{\pntxtb (}{\pntxta )}}{\*\pnseclvl8\pnlcltr\pnstart1\pnindent720\pnhang
+{\pntxtb (}{\pntxta )}}{\*\pnseclvl9\pnlcrm\pnstart1\pnindent720\pnhang{\pntxtb (}{\pntxta )}}\pard\plain \ql \li0\ri0\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \fs24\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {
+This is an example RTF document created with Word 2000.
+\par 
+\par }}
\ No newline at end of file

Copied: trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/staroffice-5.2-calc-template.vor (from rev 976, trunk/dna-repository/src/test/resources/docs/staroffice-5.2-calc-template.vor)
===================================================================
(Binary files differ)

Copied: trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/staroffice-5.2-calc.sdc (from rev 976, trunk/dna-repository/src/test/resources/docs/staroffice-5.2-calc.sdc)
===================================================================
(Binary files differ)

Copied: trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/staroffice-5.2-draw-template.vor (from rev 976, trunk/dna-repository/src/test/resources/docs/staroffice-5.2-draw-template.vor)
===================================================================
(Binary files differ)

Copied: trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/staroffice-5.2-draw.sda (from rev 976, trunk/dna-repository/src/test/resources/docs/staroffice-5.2-draw.sda)
===================================================================
(Binary files differ)

Copied: trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/staroffice-5.2-impress-template.vor (from rev 976, trunk/dna-repository/src/test/resources/docs/staroffice-5.2-impress-template.vor)
===================================================================
(Binary files differ)

Copied: trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/staroffice-5.2-impress.sdd (from rev 976, trunk/dna-repository/src/test/resources/docs/staroffice-5.2-impress.sdd)
===================================================================
(Binary files differ)

Copied: trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/staroffice-5.2-writer-template.vor (from rev 976, trunk/dna-repository/src/test/resources/docs/staroffice-5.2-writer-template.vor)
===================================================================
(Binary files differ)

Copied: trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/staroffice-5.2-writer.sdw (from rev 976, trunk/dna-repository/src/test/resources/docs/staroffice-5.2-writer.sdw)
===================================================================
(Binary files differ)

Copied: trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/thunderbird-addressbook.mab (from rev 976, trunk/dna-repository/src/test/resources/docs/thunderbird-addressbook.mab)
===================================================================
--- trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/thunderbird-addressbook.mab	                        (rev 0)
+++ trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/thunderbird-addressbook.mab	2009-06-04 22:31:30 UTC (rev 977)
@@ -0,0 +1,1655 @@
+// <!-- <mdb:mork:z v="1.4"/> -->
+< <(a=c)> // (f=iso-8859-1)
+  (B8=Custom4)(B9=Notes)(BA=LastModifiedDate)(BB=RecordKey)
+  (BC=AddrCharSet)(BD=LastRecordKey)(BE=ns:addrbk:db:table:kind:pab)
+  (BF=ListName)(C0=ListNickName)(C1=ListDescription)
+  (C2=ListTotalAddresses)(C3=LowercaseListName)
+  (C4=ns:addrbk:db:table:kind:deleted)
+  (80=ns:addrbk:db:row:scope:card:all)
+  (81=ns:addrbk:db:row:scope:list:all)
+  (82=ns:addrbk:db:row:scope:data:all)(83=FirstName)(84=LastName)
+  (85=PhoneticFirstName)(86=PhoneticLastName)(87=DisplayName)
+  (88=NickName)(89=PrimaryEmail)(8A=LowercasePrimaryEmail)
+  (8B=SecondEmail)(8C=DefaultEmail)(8D=CardType)(8E=PreferMailFormat)
+  (8F=WorkPhone)(90=HomePhone)(91=FaxNumber)(92=PagerNumber)
+  (93=CellularNumber)(94=WorkPhoneType)(95=HomePhoneType)
+  (96=FaxNumberType)(97=PagerNumberType)(98=CellularNumberType)
+  (99=HomeAddress)(9A=HomeAddress2)(9B=HomeCity)(9C=HomeState)
+  (9D=HomeZipCode)(9E=HomeCountry)(9F=WorkAddress)(A0=WorkAddress2)
+  (A1=WorkCity)(A2=WorkState)(A3=WorkZipCode)(A4=WorkCountry)
+  (A5=JobTitle)(A6=Department)(A7=Company)(A8=_AimScreenName)
+  (A9=AnniversaryYear)(AA=AnniversaryMonth)(AB=AnniversaryDay)
+  (AC=SpouseName)(AD=FamilyName)(AE=DefaultAddress)(AF=Category)
+  (B0=WebPage1)(B1=WebPage2)(B2=BirthYear)(B3=BirthMonth)(B4=BirthDay)
+  (B5=Custom1)(B6=Custom2)(B7=Custom3)>
+
+<(3B7=b3)(81=)(82=lillegris at lillegris.com)(80=0)(388=438ac9cc)(83=1)
+  (86=Ewan)(87=Lyle)(88=Ewan Lyle)(89=elyle at csd.abdn.ac.uk)(8A=2)(8B=N)
+  (8C=Murray)(8D=N Murray)(8E=nmurray at csd.abdn.ac.uk)(8F=3)(3A8=Sonja)
+  (21D=Schramm)(3A9=Sonja Schramm)(90=sonja.a.schramm at web.de)(3AA=43a9eb7d)
+  (91=4)(92=Mike)(93=Raffan)(94=Mike Raffan)(95=m.a.raffan at abdn.ac.uk)
+  (96=5)(97=Barry)(98=Evans)(99=Barry Evans)(9A=bluetooner at hotmail.com)
+  (9B=6)(AF="Sharon J.)(B0=Liddle")(B1="Sharon J. Liddle")(9C
+    =sharon.liddle at quista.net)(B2=4086ce51)(9D=7)(DD="Liddle, Christopher)
+  (DE=P")(DF="Liddle, Christopher P")(9E=christopher.liddle at eds.com)
+  (E0=409b46cd)(9F=8)(A7=Gunnar AAstrand)(A8=Grimnes)(A9
+    =Gunnar AAstrand Grimnes)(A0=ggrimnes at csd.abdn.ac.uk)(AA=40863b78)
+  (A1=9)(A2=Nir)(A3=Oren)(A4=Nir Oren)(A5=noren at csd.abdn.ac.uk)(A6=a)
+  (1C3=Rob)(1C4=Small)(1C5=Rob Small)(AB=rds_small at hotmail.com)(1C6
+    =416254eb)(AC=b)(C4=joe)(C5=bloggs)(C6=joe bloggs)(AD
+    =u10rjl at abdn.ac.uk)(C7=408e153d)(AE=c)(127=Mairi)(128=McCallum)
+  (129=Mairi McCallum)(B3=mmccallu at csd.abdn.ac.uk)(12A=40e17265)(B4=d)
+  (BC=Jonathan J)(BD=Mackintosh)(BE=Jonathan J Mackintosh)(B5
+    =jmackint at csd.abdn.ac.uk)(BF=408cdb5c)(B6=e)(C0=Pete)(C1=Edwards)
+  (C2=Pete Edwards)(B8=pedwards at csd.abdn.ac.uk)(C3=408e152c)(B9=f)(C8=Alun)
+  (C9=Preece)(CA=Alun Preece)(BA=apreece at csd.abdn.ac.uk)(CB=408e1540)
+  (BB=10)(CD=alan.gorman at semikolon.co.uk)(293=4221e627)(CE=11)(D0
+    =lfinlays at csd.abdn.ac.uk)(D2=409921f1)(D1=12)(D3=Sara AAstrand)
+  (D4=Sara AAstrand Grimnes)(D5=grimnes.aastrand.sara at c2i.net)(D6=13)
+  (D8=Christin)(D9=Rendalen)(DA=Christin Rendalen)(DB
+    =christin.rendalen at semikolon.co.uk)(DC=14)(E2=g.fenza at tin.it)(E3=15)
+  (E7=Adrian)(E8=Todor)(E9=Adrian Todor)(EA=addybt at yahoo.com)(EB=16)
+  (18E=Stuart)(18F=Chalmers)(190=Stuart Chalmers)(EC
+    =schalmer at csd.abdn.ac.uk)(191=413b2b5b)(ED=17)(EF=frank at csd.abdn.ac.uk)
+  (F0=18)(112=Frank)(113=Guerin)(114=Frank Guerin)(F1
+    =fguerin at csd.abdn.ac.uk)(115=40aebc2c)(F2=19)(F3=Gard)(F4=Huseby)
+  (F5=Gard Huseby)(F6=gardh at student.sv.uio.no)(F7=1a)(F9=Matthias)(FA
+    =Krauss)(FB=Matthias Krauss)(FC=runemk at student.uio.no)(FD=1b)(FE
+    =dmartyn at csd.abdn.ac.uk)(100=40a9f5ef)(FF=1c)(101
+    =mcoughli at csd.abdn.ac.uk)(102=1d)(103=Michael)(104=Coughlin)(105
+    =Michael Coughlin)(106=michael_coughlin at msn.com)(107=1e)(108=Godmil)
+  (109=soi500 at abdn.ac.uk)(10A=1f)(10B=George)(10C=Hategan)(10D
+    =George Hategan)(10E=george_hategan at yahoo.com)(10F=20)(110
+    =andreaf at cs.columbia.edu)(111=21)(168="Lachlan)(169=Ayres")(16A
+    ="Lachlan Ayres")(116=lachlanayres at hotmail.com)(16B=41286a0e)(117=22)
+  (118=lachlanayres at doctors.net.uk)(119=23)(11A=christina)(11B=cameron)
+  (11C=christina cameron)(11D=ccameron at csd.abdn.ac.uk)(11E=24)(11F
+    =stephanie.ross at btmonline.co.uk)(120=25)(13F=Martin)(140=May)(141
+    =Martin May)(24E=martin at martinmay.net)(24F=41bab52e)(123=26)(125=mnem)
+  (126=27)(12B=mrobb at csd.abdn.ac.uk)(12C=28)(12E=nninan at csd.abdn.ac.uk)
+  (16C=4129be00)(12F=29)(130=Bruce)(131=Scharlau)(132=Bruce Scharlau)
+  (133=scharlau at csd.abdn.ac.uk)(134=2a)(136=hanne.nygaard at organizer.net)
+  (139=40e43177)(137=2b)(13A=Duncan)(13B=Clarkson)(13C=Duncan Clarkson)
+  (13D=squarelight at hotmail.com)(13E=2c)(145="Ikiji E-Business)(146
+    =Solutions")(147="Ikiji E-Business Solutions")(143=info at ikiji.com)
+  (148=4116b737)(144=2d)(149=James)(14A=Weisfeld-Adams)(14B
+    =James Weisfeld-Adams)(14C=jamesweisfeldadams at hotmail.com)(14D=2e)
+  (14E=Edoardo)(14F=Pignotti)(150=Edoardo Pignotti)(151
+    =epignott at csd.abdn.ac.uk)(152=2f)(155=Sarah)(156=Rouad)(157
+    =Sarah Rouad)(158=s_roued at hotmail.com)(159=30)(15A=Craig)(15B=McKenzie)
+  (15C=Craig McKenzie)(15D=cmckenzie at csd.abdn.ac.uk)(15E=31)(161
+    =mtp-students at csd.abdn.ac.uk)(2BC=422ecfbe)(162=32)(163=gary fraser)
+  (164=smith)(165=gary fraser smith)(166=gjfrasers at hotmail.com)(167=33)
+  (16D="Svein Erik S.)(16E=Pedersen")(16F="Svein Erik S. Pedersen")
+  (170=svein.erik at melsom.no)(171=34)(172=Terje)(173=Terje Grimnes)(174
+    =grimnes.terje at c2i.net)(175=35)(1B5="Anders)(1B6=Ingram")(1B7
+    ="Anders Ingram")(176=andersingram at hotmail.com)(1B8=4150a13f)(177=36)
+  (178=BTM Inverness UK)(179=BTM)(17A=BTM Inverness UK BTM)(17B
+    =inverness at btmonline.co.uk)(17C=37)(1D7="Chris)(1D8=Bizer")(1D9
+    ="Chris Bizer")(17F=chris at bizer.de)(1DA=417a3df7)(180=38)(181=Tobias)
+  (182=Gau$C3$9F)(183=Tobias Gau$C3$9F)(184=tobias.gauss at web.de)(185=39)
+  (18A="Kim)(18B=Urdahl-Aasen")(18C="Kim Urdahl-Aasen")(188
+    =cjmozart at hotmail.com)(18D=413b2b08)(189=3a)(192=Max)(193=Kettenacker)
+  (194=Max Kettenacker)(195=kettenacker at hotmail.com)(196=3b)(197
+    =gsmith at csd.abdn.ac.uk)(1C2=415890f2)(198=3c)(19D=David)(19E=Elliott)
+  (19F=David Elliott)(1A0=olletti1 at yahoo.com)(1A1=3d)(1A2
+    =LizFoubister at aol.com)(1A3=lizfoubister at aol.com)(1A4=LizFoubister)
+  (1A5=3e)(1AA=Anna Christina)(1AB=Link)(1AC=Anna Christina Link)(1AD
+    =aennox at hotmail.com)(1AE=3f)(1AF=karima)(1B0=chikhaoui)(1B1
+    =karima chikhaoui)(1B2=hanen24 at hotmail.com)(1B3=40)(1B9
+    =rjleonard at doctors.org.uk)(376=430ae9c8)(1BA=41)(1BB
+    =Christine.Guenther at springer-sbm.com)(1BC
+    =christine.guenther at springer-sbm.com)(1BD=42)(1C7=chris)(1C8=liddle)
+  (1C9=chris liddle)(1CA=chris.liddle at gmail.com)(1CB=43)(1CC=nikhil)
+  (1CD=ninan)(1CE=nikhil ninan)(1CF=Nikhil.Ninan at gmail.com)(1D0
+    =nikhil.ninan at gmail.com)(1D1=44)(1D3=gug at sgsh.no)(32D=4292fd41)
+  (1D4=45)(1DB=IUP)(1DC=remi.guillet at iup.univ-avignon.fr)(1DD=46)(1E0
+    ="STROMME GAUSLAA AS Gunnar)(1E1=Gauslaa")(1E2
+    ="STROMME GAUSLAA AS Gunnar Gauslaa")(1DE=shipsupply at uss.no)(1E3
+    =417bb52a)(1DF=47)(1E5=Ggrimnes at semikolon.co.uk)(1E6
+    =ggrimnes at semikolon.co.uk)(1E7=48)(1E9=Dan)(1EA=Price-Davies)(1EB
+    =Dan Price-Davies)(1EC=dan at aslsc.org.uk)(1ED=49)(1EE=Kollingbaum)
+  (1EF=Martin Kollingbaum)(1F0=mkolling at csd.abdn.ac.uk)(1F1=4a)(1F4
+    =Patrick)(1F5=Archie)(1F6=Patrick Archie)(1F7=patrick at securenym.net)
+  (1F8=4b)(1FD=4c)(1FE=Knud)(1FF=M$C3$B6ller)(200=Knud M$C3$B6ller)
+  (201=knud.moeller at deri.org)(202=4d)(203=pedwards)(204=4e)(205
+    =psiddall at csd.abdn.ac.uk)(212=41ac58de)(206=4f)(207
+    =jwilliam at csd.abdn.ac.uk)(208=50)(209=jar at iiia.csic.es)(20A=51)
+  (20B=kjersti_tralala at hotmail.com)(20C=52)(20E=hanne at ngreklame.no)
+  (20F=53)(210=cleanaberdeen at envdev.aberdeen.net.uk)(211=54)(213=Ehud)
+  (214=Reiter)(215=Ehud Reiter)(216=ereiter at csd.abdn.ac.uk)(217=55)
+  (21C=Marion)(21E=Marion Schramm)(218=m.schramm at nuclearfree.de)(21F
+    =41af5a51)(219=56)(21A=michael.j.schramm at web.de)(21B=57)(220
+    =pal.de.vibe at trolltech.com)(25C=41c1589d)(221=58)(222
+    =smorriso at csd.abdn.ac.uk)(2A3=4226e881)(223=59)(224=Anna)(225
+    =Anna Link)(226=aennox at gmx.de)(227=5a)(228=D)(229=Sleeman)(22A
+    =D Sleeman)(22B=sleeman at csd.abdn.ac.uk)(22C=5b)(22D
+    =yap-users at lists.sourceforge.net)(2FB=42739515)(22E=5c)(22F=Frauke)
+  (230=Bullmann)(231=Frauke Bullmann)(232=fraukebullmann at web.de)(233=5d)
+  (234=Josef Petr$C3$A1k -aka- dj)(235=pad$C3$A1k)(236
+    =Josef Petr$C3$A1k -aka- dj pad$C3$A1k)(237=dj_padak at seznam.cz)
+  (238=5e)(239=j.bray at abdn.ac.uk)(23A=5f)(23B=Ashwin)(23C=Srinivasan)
+  (23D=Ashwin Srinivasan)(23E=ashwin.srinivasan at in.ibm.com)(23F=60)
+  (240=Vitor Santos)(241=Costa)(242=Vitor Santos Costa)(243
+    =vitor at biostat.wisc.edu)(244=61)(246=Laura)(247=Willmes)(248
+    =Laura Willmes)(249=Laura.W at t-online.de)(24A=laura.w at t-online.de)
+  (24B=62)(250=mseikat at freenet.de)(251=63)(252=Astrid)(253=Meerk$C3$B6tter)
+  (254=Astrid Meerk$C3$B6tter)(255=astridmeerkoetter at web.de)(256=64)
+  (257=ina)(258=schaefer)(259=ina schaefer)(25A=inamaxine at yahoo.de)
+  (25B=65)(322=Jean-Michel)(323=Fustin)(324=Jean-Michel Fustin)(25D
+    =j.m.fustin at abdn.ac.uk)(325=42891005)(25E=66)(25F=keyshostel at aol.com)
+  (260=keyshostel)(261=67)(262=Betsy)(263=Fundora)(264=Betsy Fundora)
+  (265=betsyfundora at yahoo.com)(266=68)(267=Eugene)(268=Wong)(269
+    =Eugene Wong)(26A=u03ekw at abdn.ac.uk)(26B=69)(26C=Judith)(26D=Masthoff)
+  (26E=Judith Masthoff)(26F=jmasthof at csd.abdn.ac.uk)(270=6a)(273
+    =kateerskin888 at hotmail.com)(274=6b)(275=emma at itsgrimupnorth.com)
+  (278=41f9abd0)(276=6c)(279=6d)(2C2=kate)(2C3=erskine)(2C4=kate erskine)
+  (27A=kateerskine888 at hotmail.com)(2C5=423559fd)(27B=6e)(27C
+    =u.plasberg at rgu.ac.uk)(27D=6f)(27E=staff at csd.abdn.ac.uk)(27F=70)
+  (282=matthias.krauss at gmail.com)(33D=42a038c0)(283=71)(284
+    =neil.stirton at ikiji.com)(393=439c92d9)(285=72)(28D=Thomas)(28E
+    =Kieninger)(28F=Thomas Kieninger)(290=kieni at dfki.uni-kl.de)(291=73)
+  (326=Alan)(294=alan at sboke.com)(327=428b0237)(295=74)(298=gug at uss.no)
+  (2A4=42278e73)(299=75)(29A=Andreas)(29B=Hess)(29C=Andreas Hess)(29D
+    =andreas.hess at ucd.ie)(29E=76)(29F=Joey)(2A0=slam at csd.abdn.ac.uk)
+  (2A1=77)(2A8=Mantas)(2A9=mantas at systemnetwork.net)(2AA=78)(2AB
+    =llin at csd.abdn.ac.uk)(2AC=79)(2AD=jpirie at csd.abdn.ac.uk)(2AE=7a)
+  (2AF=Joe)(2B0=Wright)(2B1=Joe Wright)(2B2=joe at joejag.com)(2B3=7b)
+  (2B5=ggray at pnc.com.au)(2B6=7c)(2B9=Xiantang)(2BA=xsun at csd.abdn.ac.uk)
+  (2BB=7d)(2BD=Paul)(2BE=Ritchie)(2BF=Paul Ritchie)(2C0
+    =pritchie at csd.abdn.ac.uk)(2C1=7e)(2C6=lachlan)(2C7=ayres)(2C8
+    =lachlan ayres)(2C9=catrinthomas at doctors.org.uk)(2CA=7f)(2CC=Bertin)
+  (2CD=Klein)(2CE=Bertin Klein)(2CF=klein at dfki.uni-kl.de)(2D0=80)(2D2
+    =Chris)(2D3=Mellish)(2D4=Chris Mellish)(2D5=cmellish at csd.abdn.ac.uk)
+  (2D6=81)(2D7=RJLeonard at doctors.org.uk)(2ED=426272a8)(2D8=82)(2DC=gmail)
+  (2DD=rds.small at gmail.com)(2DE=83)(2E0=helpdesk at csd.abdn.ac.uk)(361
+    =42ccde41)(2E1=84)(2E4=Michel)(2E5=Albert)(2E6=Michel Albert)(2E7
+    =michel at albert.lu)(2E8=85)(2EE=eikon at eikon.com)(2EF=86)(2F3=Daniel)
+  (2F4=Krech)(2F5=Daniel Krech)(2F0=eikeon at eikeon.com)(2F6=42709498)
+  (2F1=87)(2F8=alun at computer.org)(301=4273bac1)(2F9=88)(2FC=S$C3$B6ren)
+  (2FD=Auer)(2FE=S$C3$B6ren Auer)(2FF=auer at informatik.uni-leipzig.de)
+  (300=89)(303=enquiries at bankofengland.co.uk)(304=8a)(305
+    =ilogie at csd.abdn.ac.uk)(306=8b)(307=david at maxandco.co.uk)(308=8c)
+  (309=christinr at welldatatech.com)(30A=8d)(311=anders at trolltech.com)
+  (312=8e)(313=Baard.lovgren at gmail.com)(314=baard.lovgren at gmail.com)
+  (315=8f)(316=hans.olav at ememess.com)(392=4395f6ad)(317=90)(318
+    =pvibe at trolltech.com)(319=91)(34B=Rune)(34C=Lunden)(34D=Rune Lunden)
+  (31A=teleruin at hotmail.com)(31B=92)(31C=support at ikiji.com)(391=4394e6d5)
+  (31D=93)(328=Nikhil)(329=Ninan)(32A=Nikhil Ninan)(32B
+    =nikhil at erg.abdn.ac.uk)(32C=94)(32E=Johan)(32F=Bakken)(330
+    =Johan Bakken)(331=johan.bakken at gmail.com)(332=95)(333=Andre)(334
+    =Oland)(335=Andre Oland)(336=andre.oland at politiet.no)(337=96)(338
+    =Kjersti)(339=Svendsen)(33A=Kjersti Svendsen)(33B
+    =kjerstiveel at gmail.com)(33C=97)(33E=Anders)(33F=Anders Bakken)(340
+    =agbakken at gmail.com)(341=98)(342=B$C3$A5rd)(343=L$C3$B8vgren)(344
+    =B$C3$A5rd L$C3$B8vgren)(345=99)(346=Eva)(347=Langslet)(348
+    =Eva Langslet)(349=eva.langslet at democracy.no)(34A=9a)(34E=P$C3$A5l de)
+  (34F=Vibe)(350=P$C3$A5l de Vibe)(351=pauldevibe at yahoo.no)(352=9b)
+  (353=gard.huseby at gmail.com)(354=9c)(356=wvasconc at csd.abdn.ac.uk)(357=9d)
+  (359=social at csd.abdn.ac.uk)(35A=9e)(35D
+    =reinhard.oppermann at fit.fraunhofer.de)(35E=9f)(363=jlin at csd.abdn.ac.uk)
+  (364=a0)(366=kart at findexa.no)(367=a1)(368=Lunde,)(369=Kaja)(36A
+    =Lunde, Kaja)(36B=kaja.lunde at findexa.no)(36C=a2)(36D=Gatt)(36E
+    =Albert Gatt)(36F=agatt at csd.abdn.ac.uk)(370=a3)(373
+    =selzer at dfki.uni-kl.de)(374=a4)(377=mcroitor at csd.abdn.ac.uk)(378=a5)
+  (379=Jim)(37A=Hunter)(37B=Jim Hunter)(37C=jhunter at csd.abdn.ac.uk)
+  (37D=a6)(37E=ielka van der)(37F=sluis)(380=ielka van der sluis)(381
+    =ivdsluis at csd.abdn.ac.uk)(382=a7)(383=Radoslaw)(384=Izdebski)(385
+    =Radoslaw Izdebski)(386=radekizdebski at yahoo.com)(387=a8)(389=K$C3$A5re)
+  (38A=H$C3$B8vik)(38B=K$C3$A5re H$C3$B8vik)(38C=kare at hovik.org)(38D=a9)
+  (394=Buitelaar)(395=Paul Buitelaar)(396=paulb at dfki.de)(397=aa)(398
+    =Sintek)(399=Sintek Michael)(39A=Michael.Sintek at dfki.de)(39B
+    =michael.sintek at dfki.de)(39C=ab)(39D=Michael Sintek)(39E
+    =sintek at dfki.uni-kl.de)(39F=ac)(3A0=Barbara)(3A1=Spillmann)(3A2
+    =Barbara Spillmann)(3A3=spillman at dfki.uni-kl.de)(3A4=ad)(3A5
+    =Resolutions at HBOSplc.com)(3A6=resolutions at hbosplc.com)(3A7=ae)(3AB
+    =post at hf.hobby.no)(3AC=af)(3AD=julia)(3AE=herse)(3AF=julia herse)
+  (3B0=julia.herse at web.de)(3B1=b0)(3B2=kiesel at dfki.de)(3B3=b1)(3B4
+    =kphotoalbum-request at kdab.net)(3B5=b2)(3B6=kphotoalbum at mail.kdab.net)>
+{1:^80 {(k^BE:c)(s=9)} 
+  [1:^82(^BD=b3)]
+  [1(^83=)(^84=)(^85=)(^86=)(^87=)(^88=)(^89^82)(^8A^82)(^8B=)(^8C=)
+    (^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)(^96=)(^97=)
+    (^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)(^A1=)(^A2=)
+    (^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)(^AC=)(^AD=)
+    (^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)(^B7=)(^B8=)
+    (^B9=)(^BA^388)(^BB=1)]
+  [2(^83^86)(^84^87)(^85=)(^86=)(^87^88)(^88=)(^89^89)(^8A^89)(^8B=)
+    (^8C=)(^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)(^96=)
+    (^97=)(^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)(^A1=)
+    (^A2=)(^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)(^AC=)
+    (^AD=)(^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)(^B7=)
+    (^B8=)(^B9=)(^BA=0)(^BB=2)]
+  [3(^83=N)(^84^8C)(^85=)(^86=)(^87^8D)(^88=)(^89^8E)(^8A^8E)(^8B=)
+    (^8C=)(^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)(^96=)
+    (^97=)(^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)(^A1=)
+    (^A2=)(^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)(^AC=)
+    (^AD=)(^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)(^B7=)
+    (^B8=)(^B9=)(^BA=0)(^BB=3)]
+  [4(^83^3A8)(^84^21D)(^85=)(^86=)(^87^3A9)(^88=)(^89^90)(^8A^90)(^8B=)
+    (^8C=)(^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)(^96=)
+    (^97=)(^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)(^A1=)
+    (^A2=)(^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)(^AC=)
+    (^AD=)(^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)(^B7=)
+    (^B8=)(^B9=)(^BA^3AA)(^BB=4)]
+  [5(^83^92)(^84^93)(^85=)(^86=)(^87^94)(^88=)(^89^95)(^8A^95)(^8B=)
+    (^8C=)(^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)(^96=)
+    (^97=)(^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)(^A1=)
+    (^A2=)(^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)(^AC=)
+    (^AD=)(^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)(^B7=)
+    (^B8=)(^B9=)(^BA=0)(^BB=5)]
+  [6(^83^97)(^84^98)(^85=)(^86=)(^87^99)(^88=)(^89^9A)(^8A^9A)(^8B=)
+    (^8C=)(^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)(^96=)
+    (^97=)(^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)(^A1=)
+    (^A2=)(^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)(^AC=)
+    (^AD=)(^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)(^B7=)
+    (^B8=)(^B9=)(^BA=0)(^BB=6)]
+  [7(^83^AF)(^84^B0)(^85=)(^86=)(^87^B1)(^88=)(^89^9C)(^8A^9C)(^8B=)
+    (^8C=)(^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)(^96=)
+    (^97=)(^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)(^A1=)
+    (^A2=)(^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)(^AC=)
+    (^AD=)(^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)(^B7=)
+    (^B8=)(^B9=)(^BA^B2)(^BB=7)]
+  [8(^83^DD)(^84=P")(^85=)(^86=)(^87^DF)(^88=)(^89^9E)(^8A^9E)(^8B=)
+    (^8C=)(^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)(^96=)
+    (^97=)(^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)(^A1=)
+    (^A2=)(^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)(^AC=)
+    (^AD=)(^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)(^B7=)
+    (^B8=)(^B9=)(^BA^E0)(^BB=8)]
+  [9(^83^A7)(^84^A8)(^85=)(^86=)(^87^A9)(^88=)(^89^A0)(^8A^A0)(^8B=)
+    (^8C=)(^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)(^96=)
+    (^97=)(^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)(^A1=)
+    (^A2=)(^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)(^AC=)
+    (^AD=)(^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)(^B7=)
+    (^B8=)(^B9=)(^BA^AA)(^BB=9)]
+  [A(^83^A2)(^84^A3)(^85=)(^86=)(^87^A4)(^88=)(^89^A5)(^8A^A5)(^8B=)
+    (^8C=)(^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)(^96=)
+    (^97=)(^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)(^A1=)
+    (^A2=)(^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)(^AC=)
+    (^AD=)(^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)(^B7=)
+    (^B8=)(^B9=)(^BA=0)(^BB=a)]
+  [B(^83=Rob)(^84^1C4)(^85=)(^86=)(^87^1C5)(^88=)(^89^AB)(^8A^AB)(^8B=)
+    (^8C=)(^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)(^96=)
+    (^97=)(^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)(^A1=)
+    (^A2=)(^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)(^AC=)
+    (^AD=)(^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)(^B7=)
+    (^B8=)(^B9=)(^BA^1C6)(^BB=b)]
+  [C(^83^C4)(^84^C5)(^85=)(^86=)(^87^C6)(^88=)(^89^AD)(^8A^AD)(^8B=)
+    (^8C=)(^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)(^96=)
+    (^97=)(^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)(^A1=)
+    (^A2=)(^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)(^AC=)
+    (^AD=)(^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)(^B7=)
+    (^B8=)(^B9=)(^BA^C7)(^BB=c)]
+  [D(^83^127)(^84^128)(^85=)(^86=)(^87^129)(^88=)(^89^B3)(^8A^B3)(^8B=)
+    (^8C=)(^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)(^96=)
+    (^97=)(^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)(^A1=)
+    (^A2=)(^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)(^AC=)
+    (^AD=)(^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)(^B7=)
+    (^B8=)(^B9=)(^BA^12A)(^BB=d)]
+  [E(^83^BC)(^84^BD)(^85=)(^86=)(^87^BE)(^88=)(^89^B5)(^8A^B5)(^8B=)
+    (^8C=)(^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)(^96=)
+    (^97=)(^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)(^A1=)
+    (^A2=)(^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)(^AC=)
+    (^AD=)(^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)(^B7=)
+    (^B8=)(^B9=)(^BA^BF)(^BB=e)]
+  [F(^83^C0)(^84^C1)(^85=)(^86=)(^87^C2)(^88=)(^89^B8)(^8A^B8)(^8B=)
+    (^8C=)(^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)(^96=)
+    (^97=)(^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)(^A1=)
+    (^A2=)(^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)(^AC=)
+    (^AD=)(^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)(^B7=)
+    (^B8=)(^B9=)(^BA^C3)(^BB=f)]
+  [10(^83^C8)(^84^C9)(^85=)(^86=)(^87^CA)(^88=)(^89^BA)(^8A^BA)(^8B=)
+    (^8C=)(^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)(^96=)
+    (^97=)(^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)(^A1=)
+    (^A2=)(^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)(^AC=)
+    (^AD=)(^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)(^B7=)
+    (^B8=)(^B9=)(^BA^CB)(^BB=10)]
+  [11(^83=)(^84=)(^85=)(^86=)(^87=)(^88=)(^89^CD)(^8A^CD)(^8B=)(^8C=)
+    (^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)(^96=)(^97=)
+    (^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)(^A1=)(^A2=)
+    (^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)(^AC=)(^AD=)
+    (^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)(^B7=)(^B8=)
+    (^B9=)(^BA^293)(^BB=11)]
+  [12(^83=)(^84=)(^85=)(^86=)(^87=)(^88=)(^89^D0)(^8A^D0)(^8B=)(^8C=)
+    (^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)(^96=)(^97=)
+    (^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)(^A1=)(^A2=)
+    (^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)(^AC=)(^AD=)
+    (^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)(^B7=)(^B8=)
+    (^B9=)(^BA^D2)(^BB=12)]
+  [13(^83^D3)(^84^A8)(^85=)(^86=)(^87^D4)(^88=)(^89^D5)(^8A^D5)(^8B=)
+    (^8C=)(^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)(^96=)
+    (^97=)(^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)(^A1=)
+    (^A2=)(^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)(^AC=)
+    (^AD=)(^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)(^B7=)
+    (^B8=)(^B9=)(^BA=0)(^BB=13)]
+  [14(^83^D8)(^84^D9)(^85=)(^86=)(^87^DA)(^88=)(^89^DB)(^8A^DB)(^8B=)
+    (^8C=)(^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)(^96=)
+    (^97=)(^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)(^A1=)
+    (^A2=)(^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)(^AC=)
+    (^AD=)(^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)(^B7=)
+    (^B8=)(^B9=)(^BA=0)(^BB=14)]
+  [15(^83=)(^84=)(^85=)(^86=)(^87=)(^88=)(^89^E2)(^8A^E2)(^8B=)(^8C=)
+    (^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)(^96=)(^97=)
+    (^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)(^A1=)(^A2=)
+    (^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)(^AC=)(^AD=)
+    (^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)(^B7=)(^B8=)
+    (^B9=)(^BA=0)(^BB=15)]
+  [16(^83^E7)(^84^E8)(^85=)(^86=)(^87^E9)(^88=)(^89^EA)(^8A^EA)(^8B=)
+    (^8C=)(^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)(^96=)
+    (^97=)(^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)(^A1=)
+    (^A2=)(^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)(^AC=)
+    (^AD=)(^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)(^B7=)
+    (^B8=)(^B9=)(^BA=0)(^BB=16)]
+  [17(^83^18E)(^84^18F)(^85=)(^86=)(^87^190)(^88=)(^89^EC)(^8A^EC)(^8B=)
+    (^8C=)(^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)(^96=)
+    (^97=)(^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)(^A1=)
+    (^A2=)(^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)(^AC=)
+    (^AD=)(^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)(^B7=)
+    (^B8=)(^B9=)(^BA^191)(^BB=17)]
+  [18(^83=)(^84=)(^85=)(^86=)(^87=)(^88=)(^89^EF)(^8A^EF)(^8B=)(^8C=)
+    (^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)(^96=)(^97=)
+    (^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)(^A1=)(^A2=)
+    (^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)(^AC=)(^AD=)
+    (^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)(^B7=)(^B8=)
+    (^B9=)(^BA=0)(^BB=18)]
+  [19(^83^112)(^84^113)(^85=)(^86=)(^87^114)(^88=)(^89^F1)(^8A^F1)(^8B=)
+    (^8C=)(^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)(^96=)
+    (^97=)(^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)(^A1=)
+    (^A2=)(^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)(^AC=)
+    (^AD=)(^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)(^B7=)
+    (^B8=)(^B9=)(^BA^115)(^BB=19)]
+  [1A(^83^F3)(^84^F4)(^85=)(^86=)(^87^F5)(^88=)(^89^F6)(^8A^F6)(^8B=)
+    (^8C=)(^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)(^96=)
+    (^97=)(^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)(^A1=)
+    (^A2=)(^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)(^AC=)
+    (^AD=)(^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)(^B7=)
+    (^B8=)(^B9=)(^BA=0)(^BB=1a)]
+  [1B(^83^F9)(^84^FA)(^85=)(^86=)(^87^FB)(^88=)(^89^FC)(^8A^FC)(^8B=)
+    (^8C=)(^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)(^96=)
+    (^97=)(^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)(^A1=)
+    (^A2=)(^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)(^AC=)
+    (^AD=)(^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)(^B7=)
+    (^B8=)(^B9=)(^BA=0)(^BB=1b)]
+  [1C(^83=)(^84=)(^85=)(^86=)(^87=)(^88=)(^89^FE)(^8A^FE)(^8B=)(^8C=)
+    (^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)(^96=)(^97=)
+    (^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)(^A1=)(^A2=)
+    (^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)(^AC=)(^AD=)
+    (^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)(^B7=)(^B8=)
+    (^B9=)(^BA^100)(^BB=1c)]
+  [1D(^83=)(^84=)(^85=)(^86=)(^87=)(^88=)(^89^101)(^8A^101)(^8B=)(^8C=)
+    (^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)(^96=)(^97=)
+    (^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)(^A1=)(^A2=)
+    (^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)(^AC=)(^AD=)
+    (^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)(^B7=)(^B8=)
+    (^B9=)(^BA=0)(^BB=1d)]
+  [1E(^83^103)(^84^104)(^85=)(^86=)(^87^105)(^88=)(^89^106)(^8A^106)
+    (^8B=)(^8C=)(^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)
+    (^96=)(^97=)(^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)
+    (^A1=)(^A2=)(^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)
+    (^AC=)(^AD=)(^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)
+    (^B7=)(^B8=)(^B9=)(^BA=0)(^BB=1e)]
+  [1F(^83^108)(^84=)(^85=)(^86=)(^87^108)(^88=)(^89^109)(^8A^109)(^8B=)
+    (^8C=)(^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)(^96=)
+    (^97=)(^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)(^A1=)
+    (^A2=)(^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)(^AC=)
+    (^AD=)(^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)(^B7=)
+    (^B8=)(^B9=)(^BA=0)(^BB=1f)]
+  [20(^83^10B)(^84^10C)(^85=)(^86=)(^87^10D)(^88=)(^89^10E)(^8A^10E)
+    (^8B=)(^8C=)(^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)
+    (^96=)(^97=)(^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)
+    (^A1=)(^A2=)(^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)
+    (^AC=)(^AD=)(^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)
+    (^B7=)(^B8=)(^B9=)(^BA=0)(^BB=20)]
+  [21(^83=)(^84=)(^85=)(^86=)(^87=)(^88=)(^89^110)(^8A^110)(^8B=)(^8C=)
+    (^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)(^96=)(^97=)
+    (^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)(^A1=)(^A2=)
+    (^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)(^AC=)(^AD=)
+    (^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)(^B7=)(^B8=)
+    (^B9=)(^BA=0)(^BB=21)]
+  [22(^83^168)(^84^169)(^85=)(^86=)(^87^16A)(^88=)(^89^116)(^8A^116)
+    (^8B=)(^8C=)(^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)
+    (^96=)(^97=)(^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)
+    (^A1=)(^A2=)(^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)
+    (^AC=)(^AD=)(^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)
+    (^B7=)(^B8=)(^B9=)(^BA^16B)(^BB=22)]
+  [23(^83=)(^84=)(^85=)(^86=)(^87=)(^88=)(^89^118)(^8A^118)(^8B=)(^8C=)
+    (^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)(^96=)(^97=)
+    (^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)(^A1=)(^A2=)
+    (^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)(^AC=)(^AD=)
+    (^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)(^B7=)(^B8=)
+    (^B9=)(^BA=0)(^BB=23)]
+  [24(^83^11A)(^84^11B)(^85=)(^86=)(^87^11C)(^88=)(^89^11D)(^8A^11D)
+    (^8B=)(^8C=)(^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)
+    (^96=)(^97=)(^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)
+    (^A1=)(^A2=)(^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)
+    (^AC=)(^AD=)(^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)
+    (^B7=)(^B8=)(^B9=)(^BA=0)(^BB=24)]
+  [25(^83=)(^84=)(^85=)(^86=)(^87=)(^88=)(^89^11F)(^8A^11F)(^8B=)(^8C=)
+    (^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)(^96=)(^97=)
+    (^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)(^A1=)(^A2=)
+    (^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)(^AC=)(^AD=)
+    (^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)(^B7=)(^B8=)
+    (^B9=)(^BA=0)(^BB=25)]
+  [26(^83^13F)(^84=May)(^85=)(^86=)(^87^141)(^88=)(^89^24E)(^8A^24E)
+    (^8B=)(^8C=)(^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)
+    (^96=)(^97=)(^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)
+    (^A1=)(^A2=)(^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)
+    (^AC=)(^AD=)(^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)
+    (^B7=)(^B8=)(^B9=)(^BA^24F)(^BB=26)]
+  [27(^83^F9)(^84^FA)(^85=)(^86=)(^87^FB)(^88^125)(^89^FC)(^8A^FC)(^8B=)
+    (^8C=)(^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)(^96=)
+    (^97=)(^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)(^A1=)
+    (^A2=)(^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)(^AC=)
+    (^AD=)(^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)(^B7=)
+    (^B8=)(^B9=)(^BA=0)(^BB=27)]
+  [28(^83=)(^84=)(^85=)(^86=)(^87=)(^88=)(^89^12B)(^8A^12B)(^8B=)(^8C=)
+    (^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)(^96=)(^97=)
+    (^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)(^A1=)(^A2=)
+    (^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)(^AC=)(^AD=)
+    (^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)(^B7=)(^B8=)
+    (^B9=)(^BA=0)(^BB=28)]
+  [29(^83=)(^84=)(^85=)(^86=)(^87=)(^88=)(^89^12E)(^8A^12E)(^8B=)(^8C=)
+    (^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)(^96=)(^97=)
+    (^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)(^A1=)(^A2=)
+    (^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)(^AC=)(^AD=)
+    (^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)(^B7=)(^B8=)
+    (^B9=)(^BA^16C)(^BB=29)]
+  [2A(^83^130)(^84^131)(^85=)(^86=)(^87^132)(^88=)(^89^133)(^8A^133)
+    (^8B=)(^8C=)(^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)
+    (^96=)(^97=)(^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)
+    (^A1=)(^A2=)(^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)
+    (^AC=)(^AD=)(^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)
+    (^B7=)(^B8=)(^B9=)(^BA=0)(^BB=2a)]
+  [2B(^83=)(^84=)(^85=)(^86=)(^87=)(^88=)(^89^136)(^8A^136)(^8B=)(^8C=)
+    (^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)(^96=)(^97=)
+    (^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)(^A1=)(^A2=)
+    (^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)(^AC=)(^AD=)
+    (^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)(^B7=)(^B8=)
+    (^B9=)(^BA^139)(^BB=2b)]
+  [2C(^83^13A)(^84^13B)(^85=)(^86=)(^87^13C)(^88=)(^89^13D)(^8A^13D)
+    (^8B=)(^8C=)(^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)
+    (^96=)(^97=)(^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)
+    (^A1=)(^A2=)(^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)
+    (^AC=)(^AD=)(^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)
+    (^B7=)(^B8=)(^B9=)(^BA=0)(^BB=2c)]
+  [2D(^83^145)(^84^146)(^85=)(^86=)(^87^147)(^88=)(^89^143)(^8A^143)
+    (^8B=)(^8C=)(^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)
+    (^96=)(^97=)(^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)
+    (^A1=)(^A2=)(^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)
+    (^AC=)(^AD=)(^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)
+    (^B7=)(^B8=)(^B9=)(^BA^148)(^BB=2d)]
+  [2E(^83^149)(^84^14A)(^85=)(^86=)(^87^14B)(^88=)(^89^14C)(^8A^14C)
+    (^8B=)(^8C=)(^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)
+    (^96=)(^97=)(^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)
+    (^A1=)(^A2=)(^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)
+    (^AC=)(^AD=)(^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)
+    (^B7=)(^B8=)(^B9=)(^BA=0)(^BB=2e)]
+  [2F(^83^14E)(^84^14F)(^85=)(^86=)(^87^150)(^88=)(^89^151)(^8A^151)
+    (^8B=)(^8C=)(^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)
+    (^96=)(^97=)(^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)
+    (^A1=)(^A2=)(^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)
+    (^AC=)(^AD=)(^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)
+    (^B7=)(^B8=)(^B9=)(^BA=0)(^BB=2f)]
+  [30(^83^155)(^84^156)(^85=)(^86=)(^87^157)(^88=)(^89^158)(^8A^158)
+    (^8B=)(^8C=)(^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)
+    (^96=)(^97=)(^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)
+    (^A1=)(^A2=)(^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)
+    (^AC=)(^AD=)(^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)
+    (^B7=)(^B8=)(^B9=)(^BA=0)(^BB=30)]
+  [31(^83^15A)(^84^15B)(^85=)(^86=)(^87^15C)(^88=)(^89^15D)(^8A^15D)
+    (^8B=)(^8C=)(^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)
+    (^96=)(^97=)(^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)
+    (^A1=)(^A2=)(^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)
+    (^AC=)(^AD=)(^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)
+    (^B7=)(^B8=)(^B9=)(^BA=0)(^BB=31)]
+  [32(^83=)(^84=)(^85=)(^86=)(^87=)(^88=)(^89^161)(^8A^161)(^8B=)(^8C=)
+    (^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)(^96=)(^97=)
+    (^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)(^A1=)(^A2=)
+    (^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)(^AC=)(^AD=)
+    (^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)(^B7=)(^B8=)
+    (^B9=)(^BA^2BC)(^BB=32)]
+  [33(^83^163)(^84^164)(^85=)(^86=)(^87^165)(^88=)(^89^166)(^8A^166)
+    (^8B=)(^8C=)(^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)
+    (^96=)(^97=)(^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)
+    (^A1=)(^A2=)(^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)
+    (^AC=)(^AD=)(^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)
+    (^B7=)(^B8=)(^B9=)(^BA=0)(^BB=33)]
+  [34(^83^16D)(^84^16E)(^85=)(^86=)(^87^16F)(^88=)(^89^170)(^8A^170)
+    (^8B=)(^8C=)(^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)
+    (^96=)(^97=)(^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)
+    (^A1=)(^A2=)(^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)
+    (^AC=)(^AD=)(^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)
+    (^B7=)(^B8=)(^B9=)(^BA=0)(^BB=34)]
+  [35(^83^172)(^84^A8)(^85=)(^86=)(^87^173)(^88=)(^89^174)(^8A^174)
+    (^8B=)(^8C=)(^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)
+    (^96=)(^97=)(^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)
+    (^A1=)(^A2=)(^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)
+    (^AC=)(^AD=)(^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)
+    (^B7=)(^B8=)(^B9=)(^BA=0)(^BB=35)]
+  [36(^83^1B5)(^84^1B6)(^85=)(^86=)(^87^1B7)(^88=)(^89^176)(^8A^176)
+    (^8B=)(^8C=)(^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)
+    (^96=)(^97=)(^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)
+    (^A1=)(^A2=)(^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)
+    (^AC=)(^AD=)(^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)
+    (^B7=)(^B8=)(^B9=)(^BA^1B8)(^BB=36)]
+  [37(^83^178)(^84=BTM)(^85=)(^86=)(^87^17A)(^88=)(^89^17B)(^8A^17B)
+    (^8B=)(^8C=)(^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)
+    (^96=)(^97=)(^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)
+    (^A1=)(^A2=)(^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)
+    (^AC=)(^AD=)(^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)
+    (^B7=)(^B8=)(^B9=)(^BA=0)(^BB=37)]
+  [38(^83^1D7)(^84^1D8)(^85=)(^86=)(^87^1D9)(^88=)(^89^17F)(^8A^17F)
+    (^8B=)(^8C=)(^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)
+    (^96=)(^97=)(^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)
+    (^A1=)(^A2=)(^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)
+    (^AC=)(^AD=)(^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)
+    (^B7=)(^B8=)(^B9=)(^BA^1DA)(^BB=38)]
+  [39(^83^181)(^84^182)(^85=)(^86=)(^87^183)(^88=)(^89^184)(^8A^184)
+    (^8B=)(^8C=)(^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)
+    (^96=)(^97=)(^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)
+    (^A1=)(^A2=)(^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)
+    (^AC=)(^AD=)(^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)
+    (^B7=)(^B8=)(^B9=)(^BA=0)(^BB=39)]
+  [3A(^83^18A)(^84^18B)(^85=)(^86=)(^87^18C)(^88=)(^89^188)(^8A^188)
+    (^8B=)(^8C=)(^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)
+    (^96=)(^97=)(^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)
+    (^A1=)(^A2=)(^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)
+    (^AC=)(^AD=)(^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)
+    (^B7=)(^B8=)(^B9=)(^BA^18D)(^BB=3a)]
+  [3B(^83=Max)(^84^193)(^85=)(^86=)(^87^194)(^88=)(^89^195)(^8A^195)
+    (^8B=)(^8C=)(^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)
+    (^96=)(^97=)(^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)
+    (^A1=)(^A2=)(^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)
+    (^AC=)(^AD=)(^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)
+    (^B7=)(^B8=)(^B9=)(^BA=0)(^BB=3b)]
+  [3C(^83=)(^84=)(^85=)(^86=)(^87=)(^88=)(^89^197)(^8A^197)(^8B=)(^8C=)
+    (^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)(^96=)(^97=)
+    (^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)(^A1=)(^A2=)
+    (^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)(^AC=)(^AD=)
+    (^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)(^B7=)(^B8=)
+    (^B9=)(^BA^1C2)(^BB=3c)]
+  [3D(^83^19D)(^84^19E)(^85=)(^86=)(^87^19F)(^88=)(^89^1A0)(^8A^1A0)
+    (^8B=)(^8C=)(^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)
+    (^96=)(^97=)(^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)
+    (^A1=)(^A2=)(^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)
+    (^AC=)(^AD=)(^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)
+    (^B7=)(^B8=)(^B9=)(^BA=0)(^BB=3d)]
+  [3E(^83=)(^84=)(^85=)(^86=)(^87=)(^88=)(^89^1A2)(^8A^1A3)(^8B=)(^8C=)
+    (^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)(^96=)(^97=)
+    (^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)(^A1=)(^A2=)
+    (^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8^1A4)(^A9=)(^AA=)(^AB=)(^AC=)
+    (^AD=)(^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)(^B7=)
+    (^B8=)(^B9=)(^BA=0)(^BB=3e)]
+  [3F(^83^1AA)(^84^1AB)(^85=)(^86=)(^87^1AC)(^88=)(^89^1AD)(^8A^1AD)
+    (^8B=)(^8C=)(^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)
+    (^96=)(^97=)(^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)
+    (^A1=)(^A2=)(^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)
+    (^AC=)(^AD=)(^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)
+    (^B7=)(^B8=)(^B9=)(^BA=0)(^BB=3f)]
+  [40(^83^1AF)(^84^1B0)(^85=)(^86=)(^87^1B1)(^88=)(^89^1B2)(^8A^1B2)
+    (^8B=)(^8C=)(^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)
+    (^96=)(^97=)(^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)
+    (^A1=)(^A2=)(^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)
+    (^AC=)(^AD=)(^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)
+    (^B7=)(^B8=)(^B9=)(^BA=0)(^BB=40)]
+  [41(^83=)(^84=)(^85=)(^86=)(^87=)(^88=)(^89^1B9)(^8A^1B9)(^8B=)(^8C=)
+    (^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)(^96=)(^97=)
+    (^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)(^A1=)(^A2=)
+    (^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)(^AC=)(^AD=)
+    (^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)(^B7=)(^B8=)
+    (^B9=)(^BA^376)(^BB=41)]
+  [42(^83=)(^84=)(^85=)(^86=)(^87=)(^88=)(^89^1BB)(^8A^1BC)(^8B=)(^8C=)
+    (^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)(^96=)(^97=)
+    (^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)(^A1=)(^A2=)
+    (^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)(^AC=)(^AD=)
+    (^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)(^B7=)(^B8=)
+    (^B9=)(^BA=0)(^BB=42)]
+  [43(^83^1C7)(^84^1C8)(^85=)(^86=)(^87^1C9)(^88=)(^89^1CA)(^8A^1CA)
+    (^8B=)(^8C=)(^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)
+    (^96=)(^97=)(^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)
+    (^A1=)(^A2=)(^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)
+    (^AC=)(^AD=)(^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)
+    (^B7=)(^B8=)(^B9=)(^BA=0)(^BB=43)]
+  [44(^83^1CC)(^84^1CD)(^85=)(^86=)(^87^1CE)(^88=)(^89^1CF)(^8A^1D0)
+    (^8B=)(^8C=)(^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)
+    (^96=)(^97=)(^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)
+    (^A1=)(^A2=)(^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)
+    (^AC=)(^AD=)(^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)
+    (^B7=)(^B8=)(^B9=)(^BA=0)(^BB=44)]
+  [45(^83=)(^84=)(^85=)(^86=)(^87=)(^88=)(^89^1D3)(^8A^1D3)(^8B=)(^8C=)
+    (^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)(^96=)(^97=)
+    (^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)(^A1=)(^A2=)
+    (^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)(^AC=)(^AD=)
+    (^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)(^B7=)(^B8=)
+    (^B9=)(^BA^32D)(^BB=45)]
+  [46(^83=IUP)(^84=)(^85=)(^86=)(^87=IUP)(^88=)(^89^1DC)(^8A^1DC)(^8B=)
+    (^8C=)(^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)(^96=)
+    (^97=)(^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)(^A1=)
+    (^A2=)(^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)(^AC=)
+    (^AD=)(^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)(^B7=)
+    (^B8=)(^B9=)(^BA=0)(^BB=46)]
+  [47(^83^1E0)(^84^1E1)(^85=)(^86=)(^87^1E2)(^88=)(^89^1DE)(^8A^1DE)
+    (^8B=)(^8C=)(^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)
+    (^96=)(^97=)(^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)
+    (^A1=)(^A2=)(^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)
+    (^AC=)(^AD=)(^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)
+    (^B7=)(^B8=)(^B9=)(^BA^1E3)(^BB=47)]
+  [48(^83=)(^84=)(^85=)(^86=)(^87=)(^88=)(^89^1E5)(^8A^1E6)(^8B=)(^8C=)
+    (^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)(^96=)(^97=)
+    (^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)(^A1=)(^A2=)
+    (^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)(^AC=)(^AD=)
+    (^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)(^B7=)(^B8=)
+    (^B9=)(^BA=0)(^BB=48)]
+  [49(^83=Dan)(^84^1EA)(^85=)(^86=)(^87^1EB)(^88=)(^89^1EC)(^8A^1EC)
+    (^8B=)(^8C=)(^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)
+    (^96=)(^97=)(^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)
+    (^A1=)(^A2=)(^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)
+    (^AC=)(^AD=)(^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)
+    (^B7=)(^B8=)(^B9=)(^BA=0)(^BB=49)]
+  [4A(^83^13F)(^84^1EE)(^85=)(^86=)(^87^1EF)(^88=)(^89^1F0)(^8A^1F0)
+    (^8B=)(^8C=)(^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)
+    (^96=)(^97=)(^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)
+    (^A1=)(^A2=)(^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)
+    (^AC=)(^AD=)(^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)
+    (^B7=)(^B8=)(^B9=)(^BA=0)(^BB=4a)]
+  [4B(^83^1F4)(^84^1F5)(^85=)(^86=)(^87^1F6)(^88=)(^89^1F7)(^8A^1F7)
+    (^8B=)(^8C=)(^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)
+    (^96=)(^97=)(^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)
+    (^A1=)(^A2=)(^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)
+    (^AC=)(^AD=)(^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)
+    (^B7=)(^B8=)(^B9=)(^BA=0)(^BB=4b)]
+  [4C(^83=)(^84=)(^85=)(^86=)(^87=)(^88=)(^89^125)(^8A^125)(^8B=)(^8C=)
+    (^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)(^96=)(^97=)
+    (^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)(^A1=)(^A2=)
+    (^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)(^AC=)(^AD=)
+    (^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)(^B7=)(^B8=)
+    (^B9=)(^BA=0)(^BB=4c)]
+  [4D(^83^1FE)(^84^1FF)(^85=)(^86=)(^87^200)(^88=)(^89^201)(^8A^201)
+    (^8B=)(^8C=)(^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)
+    (^96=)(^97=)(^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)
+    (^A1=)(^A2=)(^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)
+    (^AC=)(^AD=)(^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)
+    (^B7=)(^B8=)(^B9=)(^BA=0)(^BB=4d)]
+  [4E(^83=)(^84=)(^85=)(^86=)(^87=)(^88=)(^89^203)(^8A^203)(^8B=)(^8C=)
+    (^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)(^96=)(^97=)
+    (^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)(^A1=)(^A2=)
+    (^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)(^AC=)(^AD=)
+    (^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)(^B7=)(^B8=)
+    (^B9=)(^BA=0)(^BB=4e)]
+  [4F(^83=)(^84=)(^85=)(^86=)(^87=)(^88=)(^89^205)(^8A^205)(^8B=)(^8C=)
+    (^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)(^96=)(^97=)
+    (^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)(^A1=)(^A2=)
+    (^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)(^AC=)(^AD=)
+    (^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)(^B7=)(^B8=)
+    (^B9=)(^BA^212)(^BB=4f)]
+  [50(^83=)(^84=)(^85=)(^86=)(^87=)(^88=)(^89^207)(^8A^207)(^8B=)(^8C=)
+    (^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)(^96=)(^97=)
+    (^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)(^A1=)(^A2=)
+    (^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)(^AC=)(^AD=)
+    (^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)(^B7=)(^B8=)
+    (^B9=)(^BA=0)(^BB=50)]
+  [51(^83=)(^84=)(^85=)(^86=)(^87=)(^88=)(^89^209)(^8A^209)(^8B=)(^8C=)
+    (^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)(^96=)(^97=)
+    (^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)(^A1=)(^A2=)
+    (^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)(^AC=)(^AD=)
+    (^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)(^B7=)(^B8=)
+    (^B9=)(^BA=0)(^BB=51)]
+  [52(^83=)(^84=)(^85=)(^86=)(^87=)(^88=)(^89^20B)(^8A^20B)(^8B=)(^8C=)
+    (^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)(^96=)(^97=)
+    (^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)(^A1=)(^A2=)
+    (^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)(^AC=)(^AD=)
+    (^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)(^B7=)(^B8=)
+    (^B9=)(^BA=0)(^BB=52)]
+  [53(^83=)(^84=)(^85=)(^86=)(^87=)(^88=)(^89^20E)(^8A^20E)(^8B=)(^8C=)
+    (^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)(^96=)(^97=)
+    (^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)(^A1=)(^A2=)
+    (^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)(^AC=)(^AD=)
+    (^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)(^B7=)(^B8=)
+    (^B9=)(^BA=0)(^BB=53)]
+  [54(^83=)(^84=)(^85=)(^86=)(^87=)(^88=)(^89^210)(^8A^210)(^8B=)(^8C=)
+    (^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)(^96=)(^97=)
+    (^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)(^A1=)(^A2=)
+    (^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)(^AC=)(^AD=)
+    (^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)(^B7=)(^B8=)
+    (^B9=)(^BA=0)(^BB=54)]
+  [55(^83^213)(^84^214)(^85=)(^86=)(^87^215)(^88=)(^89^216)(^8A^216)
+    (^8B=)(^8C=)(^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)
+    (^96=)(^97=)(^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)
+    (^A1=)(^A2=)(^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)
+    (^AC=)(^AD=)(^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)
+    (^B7=)(^B8=)(^B9=)(^BA=0)(^BB=55)]
+  [56(^83^21C)(^84^21D)(^85=)(^86=)(^87^21E)(^88=)(^89^218)(^8A^218)
+    (^8B=)(^8C=)(^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)
+    (^96=)(^97=)(^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)
+    (^A1=)(^A2=)(^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)
+    (^AC=)(^AD=)(^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)
+    (^B7=)(^B8=)(^B9=)(^BA^21F)(^BB=56)]
+  [57(^83=)(^84=)(^85=)(^86=)(^87=)(^88=)(^89^21A)(^8A^21A)(^8B=)(^8C=)
+    (^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)(^96=)(^97=)
+    (^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)(^A1=)(^A2=)
+    (^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)(^AC=)(^AD=)
+    (^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)(^B7=)(^B8=)
+    (^B9=)(^BA=0)(^BB=57)]
+  [58(^83=)(^84=)(^85=)(^86=)(^87=)(^88=)(^89^220)(^8A^220)(^8B=)(^8C=)
+    (^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)(^96=)(^97=)
+    (^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)(^A1=)(^A2=)
+    (^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)(^AC=)(^AD=)
+    (^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)(^B7=)(^B8=)
+    (^B9=)(^BA^25C)(^BB=58)]
+  [59(^83=)(^84=)(^85=)(^86=)(^87=)(^88=)(^89^222)(^8A^222)(^8B=)(^8C=)
+    (^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)(^96=)(^97=)
+    (^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)(^A1=)(^A2=)
+    (^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)(^AC=)(^AD=)
+    (^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)(^B7=)(^B8=)
+    (^B9=)(^BA^2A3)(^BB=59)]
+  [5A(^83^224)(^84^1AB)(^85=)(^86=)(^87^225)(^88=)(^89^226)(^8A^226)
+    (^8B=)(^8C=)(^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)
+    (^96=)(^97=)(^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)
+    (^A1=)(^A2=)(^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)
+    (^AC=)(^AD=)(^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)
+    (^B7=)(^B8=)(^B9=)(^BA=0)(^BB=5a)]
+  [5B(^83=D)(^84^229)(^85=)(^86=)(^87^22A)(^88=)(^89^22B)(^8A^22B)(^8B=)
+    (^8C=)(^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)(^96=)
+    (^97=)(^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)(^A1=)
+    (^A2=)(^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)(^AC=)
+    (^AD=)(^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)(^B7=)
+    (^B8=)(^B9=)(^BA=0)(^BB=5b)]
+  [5C(^83=)(^84=)(^85=)(^86=)(^87=)(^88=)(^89^22D)(^8A^22D)(^8B=)(^8C=)
+    (^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)(^96=)(^97=)
+    (^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)(^A1=)(^A2=)
+    (^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)(^AC=)(^AD=)
+    (^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)(^B7=)(^B8=)
+    (^B9=)(^BA^2FB)(^BB=5c)]
+  [5D(^83^22F)(^84^230)(^85=)(^86=)(^87^231)(^88=)(^89^232)(^8A^232)
+    (^8B=)(^8C=)(^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)
+    (^96=)(^97=)(^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)
+    (^A1=)(^A2=)(^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)
+    (^AC=)(^AD=)(^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)
+    (^B7=)(^B8=)(^B9=)(^BA=0)(^BB=5d)]
+  [5E(^83^234)(^84^235)(^85=)(^86=)(^87^236)(^88=)(^89^237)(^8A^237)
+    (^8B=)(^8C=)(^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)
+    (^96=)(^97=)(^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)
+    (^A1=)(^A2=)(^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)
+    (^AC=)(^AD=)(^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)
+    (^B7=)(^B8=)(^B9=)(^BA=0)(^BB=5e)]
+  [5F(^83=)(^84=)(^85=)(^86=)(^87=)(^88=)(^89^239)(^8A^239)(^8B=)(^8C=)
+    (^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)(^96=)(^97=)
+    (^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)(^A1=)(^A2=)
+    (^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)(^AC=)(^AD=)
+    (^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)(^B7=)(^B8=)
+    (^B9=)(^BA=0)(^BB=5f)]
+  [60(^83^23B)(^84^23C)(^85=)(^86=)(^87^23D)(^88=)(^89^23E)(^8A^23E)
+    (^8B=)(^8C=)(^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)
+    (^96=)(^97=)(^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)
+    (^A1=)(^A2=)(^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)
+    (^AC=)(^AD=)(^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)
+    (^B7=)(^B8=)(^B9=)(^BA=0)(^BB=60)]
+  [61(^83^240)(^84^241)(^85=)(^86=)(^87^242)(^88=)(^89^243)(^8A^243)
+    (^8B=)(^8C=)(^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)
+    (^96=)(^97=)(^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)
+    (^A1=)(^A2=)(^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)
+    (^AC=)(^AD=)(^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)
+    (^B7=)(^B8=)(^B9=)(^BA=0)(^BB=61)]
+  [62(^83^246)(^84^247)(^85=)(^86=)(^87^248)(^88=)(^89^249)(^8A^24A)
+    (^8B=)(^8C=)(^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)
+    (^96=)(^97=)(^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)
+    (^A1=)(^A2=)(^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)
+    (^AC=)(^AD=)(^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)
+    (^B7=)(^B8=)(^B9=)(^BA=0)(^BB=62)]
+  [63(^83=)(^84=)(^85=)(^86=)(^87=)(^88=)(^89^250)(^8A^250)(^8B=)(^8C=)
+    (^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)(^96=)(^97=)
+    (^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)(^A1=)(^A2=)
+    (^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)(^AC=)(^AD=)
+    (^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)(^B7=)(^B8=)
+    (^B9=)(^BA=0)(^BB=63)]
+  [64(^83^252)(^84^253)(^85=)(^86=)(^87^254)(^88=)(^89^255)(^8A^255)
+    (^8B=)(^8C=)(^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)
+    (^96=)(^97=)(^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)
+    (^A1=)(^A2=)(^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)
+    (^AC=)(^AD=)(^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)
+    (^B7=)(^B8=)(^B9=)(^BA=0)(^BB=64)]
+  [65(^83=ina)(^84^258)(^85=)(^86=)(^87^259)(^88=)(^89^25A)(^8A^25A)
+    (^8B=)(^8C=)(^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)
+    (^96=)(^97=)(^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)
+    (^A1=)(^A2=)(^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)
+    (^AC=)(^AD=)(^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)
+    (^B7=)(^B8=)(^B9=)(^BA=0)(^BB=65)]
+  [66(^83^322)(^84^323)(^85=)(^86=)(^87^324)(^88=)(^89^25D)(^8A^25D)
+    (^8B=)(^8C=)(^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)
+    (^96=)(^97=)(^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)
+    (^A1=)(^A2=)(^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)
+    (^AC=)(^AD=)(^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)
+    (^B7=)(^B8=)(^B9=)(^BA^325)(^BB=66)]
+  [67(^83=)(^84=)(^85=)(^86=)(^87=)(^88=)(^89^25F)(^8A^25F)(^8B=)(^8C=)
+    (^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)(^96=)(^97=)
+    (^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)(^A1=)(^A2=)
+    (^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8^260)(^A9=)(^AA=)(^AB=)(^AC=)
+    (^AD=)(^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)(^B7=)
+    (^B8=)(^B9=)(^BA=0)(^BB=67)]
+  [68(^83^262)(^84^263)(^85=)(^86=)(^87^264)(^88=)(^89^265)(^8A^265)
+    (^8B=)(^8C=)(^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)
+    (^96=)(^97=)(^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)
+    (^A1=)(^A2=)(^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)
+    (^AC=)(^AD=)(^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)
+    (^B7=)(^B8=)(^B9=)(^BA=0)(^BB=68)]
+  [69(^83^267)(^84^268)(^85=)(^86=)(^87^269)(^88=)(^89^26A)(^8A^26A)
+    (^8B=)(^8C=)(^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)
+    (^96=)(^97=)(^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)
+    (^A1=)(^A2=)(^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)
+    (^AC=)(^AD=)(^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)
+    (^B7=)(^B8=)(^B9=)(^BA=0)(^BB=69)]
+  [6A(^83^26C)(^84^26D)(^85=)(^86=)(^87^26E)(^88=)(^89^26F)(^8A^26F)
+    (^8B=)(^8C=)(^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)
+    (^96=)(^97=)(^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)
+    (^A1=)(^A2=)(^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)
+    (^AC=)(^AD=)(^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)
+    (^B7=)(^B8=)(^B9=)(^BA=0)(^BB=6a)]
+  [6B(^83=)(^84=)(^85=)(^86=)(^87=)(^88=)(^89^273)(^8A^273)(^8B=)(^8C=)
+    (^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)(^96=)(^97=)
+    (^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)(^A1=)(^A2=)
+    (^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)(^AC=)(^AD=)
+    (^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)(^B7=)(^B8=)
+    (^B9=)(^BA=0)(^BB=6b)]
+  [6C(^83=)(^84=)(^85=)(^86=)(^87=)(^88=)(^89^275)(^8A^275)(^8B=)(^8C=)
+    (^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)(^96=)(^97=)
+    (^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)(^A1=)(^A2=)
+    (^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)(^AC=)(^AD=)
+    (^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)(^B7=)(^B8=)
+    (^B9=)(^BA^278)(^BB=6c)]
+  [6D(^83=)(^84=)(^85=)(^86=)(^87=)(^88=)(^89^1E6)(^8A^1E6)(^8B=)(^8C=)
+    (^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)(^96=)(^97=)
+    (^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)(^A1=)(^A2=)
+    (^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)(^AC=)(^AD=)
+    (^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)(^B7=)(^B8=)
+    (^B9=)(^BA=0)(^BB=6d)]
+  [6E(^83^2C2)(^84^2C3)(^85=)(^86=)(^87^2C4)(^88=)(^89^27A)(^8A^27A)
+    (^8B=)(^8C=)(^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)
+    (^96=)(^97=)(^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)
+    (^A1=)(^A2=)(^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)
+    (^AC=)(^AD=)(^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)
+    (^B7=)(^B8=)(^B9=)(^BA^2C5)(^BB=6e)]
+  [6F(^83=)(^84=)(^85=)(^86=)(^87=)(^88=)(^89^27C)(^8A^27C)(^8B=)(^8C=)
+    (^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)(^96=)(^97=)
+    (^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)(^A1=)(^A2=)
+    (^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)(^AC=)(^AD=)
+    (^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)(^B7=)(^B8=)
+    (^B9=)(^BA=0)(^BB=6f)]
+  [70(^83=)(^84=)(^85=)(^86=)(^87=)(^88=)(^89^27E)(^8A^27E)(^8B=)(^8C=)
+    (^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)(^96=)(^97=)
+    (^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)(^A1=)(^A2=)
+    (^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)(^AC=)(^AD=)
+    (^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)(^B7=)(^B8=)
+    (^B9=)(^BA=0)(^BB=70)]
+  [71(^83^F9)(^84^FA)(^85=)(^86=)(^87^FB)(^88=)(^89^282)(^8A^282)(^8B=)
+    (^8C=)(^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)(^96=)
+    (^97=)(^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)(^A1=)
+    (^A2=)(^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)(^AC=)
+    (^AD=)(^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)(^B7=)
+    (^B8=)(^B9=)(^BA^33D)(^BB=71)]
+  [72(^83=)(^84=)(^85=)(^86=)(^87=)(^88=)(^89^284)(^8A^284)(^8B=)(^8C=)
+    (^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)(^96=)(^97=)
+    (^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)(^A1=)(^A2=)
+    (^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)(^AC=)(^AD=)
+    (^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)(^B7=)(^B8=)
+    (^B9=)(^BA^393)(^BB=72)]
+  [73(^83^28D)(^84^28E)(^85=)(^86=)(^87^28F)(^88=)(^89^290)(^8A^290)
+    (^8B=)(^8C=)(^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)
+    (^96=)(^97=)(^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)
+    (^A1=)(^A2=)(^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)
+    (^AC=)(^AD=)(^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)
+    (^B7=)(^B8=)(^B9=)(^BA=0)(^BB=73)]
+  [74(^83^326)(^84=)(^85=)(^86=)(^87^326)(^88=)(^89^294)(^8A^294)(^8B=)
+    (^8C=)(^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)(^96=)
+    (^97=)(^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)(^A1=)
+    (^A2=)(^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)(^AC=)
+    (^AD=)(^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)(^B7=)
+    (^B8=)(^B9=)(^BA^327)(^BB=74)]
+  [75(^83=)(^84=)(^85=)(^86=)(^87=)(^88=)(^89^298)(^8A^298)(^8B=)(^8C=)
+    (^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)(^96=)(^97=)
+    (^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)(^A1=)(^A2=)
+    (^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)(^AC=)(^AD=)
+    (^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)(^B7=)(^B8=)
+    (^B9=)(^BA^2A4)(^BB=75)]
+  [76(^83^29A)(^84^29B)(^85=)(^86=)(^87^29C)(^88=)(^89^29D)(^8A^29D)
+    (^8B=)(^8C=)(^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)
+    (^96=)(^97=)(^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)
+    (^A1=)(^A2=)(^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)
+    (^AC=)(^AD=)(^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)
+    (^B7=)(^B8=)(^B9=)(^BA=0)(^BB=76)]
+  [77(^83^29F)(^84=)(^85=)(^86=)(^87^29F)(^88=)(^89^2A0)(^8A^2A0)(^8B=)
+    (^8C=)(^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)(^96=)
+    (^97=)(^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)(^A1=)
+    (^A2=)(^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)(^AC=)
+    (^AD=)(^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)(^B7=)
+    (^B8=)(^B9=)(^BA=0)(^BB=77)]
+  [78(^83^2A8)(^84=)(^85=)(^86=)(^87^2A8)(^88=)(^89^2A9)(^8A^2A9)(^8B=)
+    (^8C=)(^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)(^96=)
+    (^97=)(^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)(^A1=)
+    (^A2=)(^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)(^AC=)
+    (^AD=)(^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)(^B7=)
+    (^B8=)(^B9=)(^BA=0)(^BB=78)]
+  [79(^83=)(^84=)(^85=)(^86=)(^87=)(^88=)(^89^2AB)(^8A^2AB)(^8B=)(^8C=)
+    (^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)(^96=)(^97=)
+    (^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)(^A1=)(^A2=)
+    (^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)(^AC=)(^AD=)
+    (^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)(^B7=)(^B8=)
+    (^B9=)(^BA=0)(^BB=79)]
+  [7A(^83=)(^84=)(^85=)(^86=)(^87=)(^88=)(^89^2AD)(^8A^2AD)(^8B=)(^8C=)
+    (^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)(^96=)(^97=)
+    (^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)(^A1=)(^A2=)
+    (^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)(^AC=)(^AD=)
+    (^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)(^B7=)(^B8=)
+    (^B9=)(^BA=0)(^BB=7a)]
+  [7B(^83=Joe)(^84^2B0)(^85=)(^86=)(^87^2B1)(^88=)(^89^2B2)(^8A^2B2)
+    (^8B=)(^8C=)(^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)
+    (^96=)(^97=)(^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)
+    (^A1=)(^A2=)(^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)
+    (^AC=)(^AD=)(^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)
+    (^B7=)(^B8=)(^B9=)(^BA=0)(^BB=7b)]
+  [7C(^83=)(^84=)(^85=)(^86=)(^87=)(^88=)(^89^2B5)(^8A^2B5)(^8B=)(^8C=)
+    (^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)(^96=)(^97=)
+    (^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)(^A1=)(^A2=)
+    (^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)(^AC=)(^AD=)
+    (^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)(^B7=)(^B8=)
+    (^B9=)(^BA=0)(^BB=7c)]
+  [7D(^83^2B9)(^84=)(^85=)(^86=)(^87^2B9)(^88=)(^89^2BA)(^8A^2BA)(^8B=)
+    (^8C=)(^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)(^96=)
+    (^97=)(^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)(^A1=)
+    (^A2=)(^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)(^AC=)
+    (^AD=)(^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)(^B7=)
+    (^B8=)(^B9=)(^BA=0)(^BB=7d)]
+  [7E(^83^2BD)(^84^2BE)(^85=)(^86=)(^87^2BF)(^88=)(^89^2C0)(^8A^2C0)
+    (^8B=)(^8C=)(^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)
+    (^96=)(^97=)(^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)
+    (^A1=)(^A2=)(^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)
+    (^AC=)(^AD=)(^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)
+    (^B7=)(^B8=)(^B9=)(^BA=0)(^BB=7e)]
+  [7F(^83^2C6)(^84^2C7)(^85=)(^86=)(^87^2C8)(^88=)(^89^2C9)(^8A^2C9)
+    (^8B=)(^8C=)(^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)
+    (^96=)(^97=)(^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)
+    (^A1=)(^A2=)(^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)
+    (^AC=)(^AD=)(^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)
+    (^B7=)(^B8=)(^B9=)(^BA=0)(^BB=7f)]
+  [80(^83^2CC)(^84^2CD)(^85=)(^86=)(^87^2CE)(^88=)(^89^2CF)(^8A^2CF)
+    (^8B=)(^8C=)(^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)
+    (^96=)(^97=)(^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)
+    (^A1=)(^A2=)(^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)
+    (^AC=)(^AD=)(^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)
+    (^B7=)(^B8=)(^B9=)(^BA=0)(^BB=80)]
+  [81(^83^2D2)(^84^2D3)(^85=)(^86=)(^87^2D4)(^88=)(^89^2D5)(^8A^2D5)
+    (^8B=)(^8C=)(^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)
+    (^96=)(^97=)(^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)
+    (^A1=)(^A2=)(^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)
+    (^AC=)(^AD=)(^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)
+    (^B7=)(^B8=)(^B9=)(^BA=0)(^BB=81)]
+  [82(^83=)(^84=)(^85=)(^86=)(^87=)(^88=)(^89^2D7)(^8A^1B9)(^8B=)(^8C=)
+    (^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)(^96=)(^97=)
+    (^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)(^A1=)(^A2=)
+    (^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)(^AC=)(^AD=)
+    (^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)(^B7=)(^B8=)
+    (^B9=)(^BA^2ED)(^BB=82)]
+  [83(^83^2DC)(^84=)(^85=)(^86=)(^87^2DC)(^88=)(^89^2DD)(^8A^2DD)(^8B=)
+    (^8C=)(^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)(^96=)
+    (^97=)(^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)(^A1=)
+    (^A2=)(^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)(^AC=)
+    (^AD=)(^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)(^B7=)
+    (^B8=)(^B9=)(^BA=0)(^BB=83)]
+  [84(^83=)(^84=)(^85=)(^86=)(^87=)(^88=)(^89^2E0)(^8A^2E0)(^8B=)(^8C=)
+    (^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)(^96=)(^97=)
+    (^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)(^A1=)(^A2=)
+    (^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)(^AC=)(^AD=)
+    (^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)(^B7=)(^B8=)
+    (^B9=)(^BA^361)(^BB=84)]
+  [85(^83^2E4)(^84^2E5)(^85=)(^86=)(^87^2E6)(^88=)(^89^2E7)(^8A^2E7)
+    (^8B=)(^8C=)(^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)
+    (^96=)(^97=)(^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)
+    (^A1=)(^A2=)(^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)
+    (^AC=)(^AD=)(^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)
+    (^B7=)(^B8=)(^B9=)(^BA=0)(^BB=85)]
+  [86(^83=)(^84=)(^85=)(^86=)(^87=)(^88=)(^89^2EE)(^8A^2EE)(^8B=)(^8C=)
+    (^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)(^96=)(^97=)
+    (^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)(^A1=)(^A2=)
+    (^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)(^AC=)(^AD=)
+    (^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)(^B7=)(^B8=)
+    (^B9=)(^BA=0)(^BB=86)]
+  [87(^83^2F3)(^84^2F4)(^85=)(^86=)(^87^2F5)(^88=)(^89^2F0)(^8A^2F0)
+    (^8B=)(^8C=)(^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)
+    (^96=)(^97=)(^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)
+    (^A1=)(^A2=)(^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)
+    (^AC=)(^AD=)(^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)
+    (^B7=)(^B8=)(^B9=)(^BA^2F6)(^BB=87)]
+  [88(^83^C8)(^84^C9)(^85=)(^86=)(^87^CA)(^88=)(^89^2F8)(^8A^2F8)(^8B=)
+    (^8C=)(^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)(^96=)
+    (^97=)(^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)(^A1=)
+    (^A2=)(^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)(^AC=)
+    (^AD=)(^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)(^B7=)
+    (^B8=)(^B9=)(^BA^301)(^BB=88)]
+  [89(^83^2FC)(^84^2FD)(^85=)(^86=)(^87^2FE)(^88=)(^89^2FF)(^8A^2FF)
+    (^8B=)(^8C=)(^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)
+    (^96=)(^97=)(^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)
+    (^A1=)(^A2=)(^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)
+    (^AC=)(^AD=)(^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)
+    (^B7=)(^B8=)(^B9=)(^BA=0)(^BB=89)]
+  [8A(^83=)(^84=)(^85=)(^86=)(^87=)(^88=)(^89^303)(^8A^303)(^8B=)(^8C=)
+    (^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)(^96=)(^97=)
+    (^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)(^A1=)(^A2=)
+    (^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)(^AC=)(^AD=)
+    (^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)(^B7=)(^B8=)
+    (^B9=)(^BA=0)(^BB=8a)]
+  [8B(^83=)(^84=)(^85=)(^86=)(^87=)(^88=)(^89^305)(^8A^305)(^8B=)(^8C=)
+    (^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)(^96=)(^97=)
+    (^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)(^A1=)(^A2=)
+    (^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)(^AC=)(^AD=)
+    (^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)(^B7=)(^B8=)
+    (^B9=)(^BA=0)(^BB=8b)]
+  [8C(^83^19D)(^84^19E)(^85=)(^86=)(^87^19F)(^88=)(^89^307)(^8A^307)
+    (^8B=)(^8C=)(^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)
+    (^96=)(^97=)(^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)
+    (^A1=)(^A2=)(^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)
+    (^AC=)(^AD=)(^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)
+    (^B7=)(^B8=)(^B9=)(^BA=0)(^BB=8c)]
+  [8D(^83^D8)(^84^D9)(^85=)(^86=)(^87^DA)(^88=)(^89^309)(^8A^309)(^8B=)
+    (^8C=)(^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)(^96=)
+    (^97=)(^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)(^A1=)
+    (^A2=)(^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)(^AC=)
+    (^AD=)(^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)(^B7=)
+    (^B8=)(^B9=)(^BA=0)(^BB=8d)]
+  [8E(^83=)(^84=)(^85=)(^86=)(^87=)(^88=)(^89^311)(^8A^311)(^8B=)(^8C=)
+    (^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)(^96=)(^97=)
+    (^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)(^A1=)(^A2=)
+    (^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)(^AC=)(^AD=)
+    (^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)(^B7=)(^B8=)
+    (^B9=)(^BA=0)(^BB=8e)]
+  [8F(^83=)(^84=)(^85=)(^86=)(^87=)(^88=)(^89^313)(^8A^314)(^8B=)(^8C=)
+    (^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)(^96=)(^97=)
+    (^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)(^A1=)(^A2=)
+    (^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)(^AC=)(^AD=)
+    (^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)(^B7=)(^B8=)
+    (^B9=)(^BA=0)(^BB=8f)]
+  [90(^83=)(^84=)(^85=)(^86=)(^87=)(^88=)(^89^316)(^8A^316)(^8B=)(^8C=)
+    (^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)(^96=)(^97=)
+    (^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)(^A1=)(^A2=)
+    (^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)(^AC=)(^AD=)
+    (^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)(^B7=)(^B8=)
+    (^B9=)(^BA^392)(^BB=90)]
+  [91(^83=)(^84=)(^85=)(^86=)(^87=)(^88=)(^89^318)(^8A^318)(^8B=)(^8C=)
+    (^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)(^96=)(^97=)
+    (^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)(^A1=)(^A2=)
+    (^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)(^AC=)(^AD=)
+    (^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)(^B7=)(^B8=)
+    (^B9=)(^BA=0)(^BB=91)]
+  [92(^83^34B)(^84^34C)(^85=)(^86=)(^87^34D)(^88=)(^89^31A)(^8A^31A)
+    (^8B=)(^8C=)(^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)
+    (^96=)(^97=)(^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)
+    (^A1=)(^A2=)(^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)
+    (^AC=)(^AD=)(^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)
+    (^B7=)(^B8=)(^B9=)(^BA^33D)(^BB=92)]
+  [93(^83=)(^84=)(^85=)(^86=)(^87=)(^88=)(^89^31C)(^8A^31C)(^8B=)(^8C=)
+    (^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)(^96=)(^97=)
+    (^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)(^A1=)(^A2=)
+    (^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)(^AC=)(^AD=)
+    (^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)(^B7=)(^B8=)
+    (^B9=)(^BA^391)(^BB=93)]
+  [94(^83^328)(^84^329)(^85=)(^86=)(^87^32A)(^88=)(^89^32B)(^8A^32B)
+    (^8B=)(^8C=)(^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)
+    (^96=)(^97=)(^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)
+    (^A1=)(^A2=)(^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)
+    (^AC=)(^AD=)(^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)
+    (^B7=)(^B8=)(^B9=)(^BA=0)(^BB=94)]
+  [95(^83^32E)(^84^32F)(^85=)(^86=)(^87^330)(^88=)(^89^331)(^8A^331)
+    (^8B=)(^8C=)(^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)
+    (^96=)(^97=)(^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)
+    (^A1=)(^A2=)(^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)
+    (^AC=)(^AD=)(^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)
+    (^B7=)(^B8=)(^B9=)(^BA=0)(^BB=95)]
+  [96(^83^333)(^84^334)(^85=)(^86=)(^87^335)(^88=)(^89^336)(^8A^336)
+    (^8B=)(^8C=)(^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)
+    (^96=)(^97=)(^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)
+    (^A1=)(^A2=)(^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)
+    (^AC=)(^AD=)(^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)
+    (^B7=)(^B8=)(^B9=)(^BA=0)(^BB=96)]
+  [97(^83^338)(^84^339)(^85=)(^86=)(^87^33A)(^88=)(^89^33B)(^8A^33B)
+    (^8B=)(^8C=)(^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)
+    (^96=)(^97=)(^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)
+    (^A1=)(^A2=)(^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)
+    (^AC=)(^AD=)(^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)
+    (^B7=)(^B8=)(^B9=)(^BA=0)(^BB=97)]
+  [98(^83^33E)(^84^32F)(^85=)(^86=)(^87^33F)(^88=)(^89^340)(^8A^340)
+    (^8B=)(^8C=)(^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)
+    (^96=)(^97=)(^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)
+    (^A1=)(^A2=)(^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)
+    (^AC=)(^AD=)(^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)
+    (^B7=)(^B8=)(^B9=)(^BA=0)(^BB=98)]
+  [99(^83^342)(^84^343)(^85=)(^86=)(^87^344)(^88=)(^89^314)(^8A^314)
+    (^8B=)(^8C=)(^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)
+    (^96=)(^97=)(^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)
+    (^A1=)(^A2=)(^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)
+    (^AC=)(^AD=)(^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)
+    (^B7=)(^B8=)(^B9=)(^BA=0)(^BB=99)]
+  [9A(^83=Eva)(^84^347)(^85=)(^86=)(^87^348)(^88=)(^89^349)(^8A^349)
+    (^8B=)(^8C=)(^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)
+    (^96=)(^97=)(^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)
+    (^A1=)(^A2=)(^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)
+    (^AC=)(^AD=)(^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)
+    (^B7=)(^B8=)(^B9=)(^BA=0)(^BB=9a)]
+  [9B(^83^34E)(^84^34F)(^85=)(^86=)(^87^350)(^88=)(^89^351)(^8A^351)
+    (^8B=)(^8C=)(^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)
+    (^96=)(^97=)(^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)
+    (^A1=)(^A2=)(^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)
+    (^AC=)(^AD=)(^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)
+    (^B7=)(^B8=)(^B9=)(^BA=0)(^BB=9b)]
+  [9C(^83^F3)(^84^F4)(^85=)(^86=)(^87^F5)(^88=)(^89^353)(^8A^353)(^8B=)
+    (^8C=)(^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)(^96=)
+    (^97=)(^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)(^A1=)
+    (^A2=)(^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)(^AC=)
+    (^AD=)(^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)(^B7=)
+    (^B8=)(^B9=)(^BA=0)(^BB=9c)]
+  [9D(^83=)(^84=)(^85=)(^86=)(^87=)(^88=)(^89^356)(^8A^356)(^8B=)(^8C=)
+    (^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)(^96=)(^97=)
+    (^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)(^A1=)(^A2=)
+    (^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)(^AC=)(^AD=)
+    (^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)(^B7=)(^B8=)
+    (^B9=)(^BA=0)(^BB=9d)]
+  [9E(^83=)(^84=)(^85=)(^86=)(^87=)(^88=)(^89^359)(^8A^359)(^8B=)(^8C=)
+    (^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)(^96=)(^97=)
+    (^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)(^A1=)(^A2=)
+    (^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)(^AC=)(^AD=)
+    (^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)(^B7=)(^B8=)
+    (^B9=)(^BA=0)(^BB=9e)]
+  [9F(^83=)(^84=)(^85=)(^86=)(^87=)(^88=)(^89^35D)(^8A^35D)(^8B=)(^8C=)
+    (^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)(^96=)(^97=)
+    (^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)(^A1=)(^A2=)
+    (^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)(^AC=)(^AD=)
+    (^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)(^B7=)(^B8=)
+    (^B9=)(^BA=0)(^BB=9f)]
+  [A0(^83=)(^84=)(^85=)(^86=)(^87=)(^88=)(^89^363)(^8A^363)(^8B=)(^8C=)
+    (^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)(^96=)(^97=)
+    (^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)(^A1=)(^A2=)
+    (^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)(^AC=)(^AD=)
+    (^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)(^B7=)(^B8=)
+    (^B9=)(^BA=0)(^BB=a0)]
+  [A1(^83=)(^84=)(^85=)(^86=)(^87=)(^88=)(^89^366)(^8A^366)(^8B=)(^8C=)
+    (^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)(^96=)(^97=)
+    (^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)(^A1=)(^A2=)
+    (^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)(^AC=)(^AD=)
+    (^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)(^B7=)(^B8=)
+    (^B9=)(^BA=0)(^BB=a1)]
+  [A2(^83^368)(^84^369)(^85=)(^86=)(^87^36A)(^88=)(^89^36B)(^8A^36B)
+    (^8B=)(^8C=)(^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)
+    (^96=)(^97=)(^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)
+    (^A1=)(^A2=)(^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)
+    (^AC=)(^AD=)(^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)
+    (^B7=)(^B8=)(^B9=)(^BA=0)(^BB=a2)]
+  [A3(^83^2E5)(^84^36D)(^85=)(^86=)(^87^36E)(^88=)(^89^36F)(^8A^36F)
+    (^8B=)(^8C=)(^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)
+    (^96=)(^97=)(^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)
+    (^A1=)(^A2=)(^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)
+    (^AC=)(^AD=)(^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)
+    (^B7=)(^B8=)(^B9=)(^BA=0)(^BB=a3)]
+  [A4(^83=)(^84=)(^85=)(^86=)(^87=)(^88=)(^89^373)(^8A^373)(^8B=)(^8C=)
+    (^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)(^96=)(^97=)
+    (^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)(^A1=)(^A2=)
+    (^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)(^AC=)(^AD=)
+    (^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)(^B7=)(^B8=)
+    (^B9=)(^BA=0)(^BB=a4)]
+  [A5(^83=)(^84=)(^85=)(^86=)(^87=)(^88=)(^89^377)(^8A^377)(^8B=)(^8C=)
+    (^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)(^96=)(^97=)
+    (^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)(^A1=)(^A2=)
+    (^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)(^AC=)(^AD=)
+    (^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)(^B7=)(^B8=)
+    (^B9=)(^BA=0)(^BB=a5)]
+  [A6(^83=Jim)(^84^37A)(^85=)(^86=)(^87^37B)(^88=)(^89^37C)(^8A^37C)
+    (^8B=)(^8C=)(^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)
+    (^96=)(^97=)(^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)
+    (^A1=)(^A2=)(^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)
+    (^AC=)(^AD=)(^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)
+    (^B7=)(^B8=)(^B9=)(^BA=0)(^BB=a6)]
+  [A7(^83^37E)(^84^37F)(^85=)(^86=)(^87^380)(^88=)(^89^381)(^8A^381)
+    (^8B=)(^8C=)(^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)
+    (^96=)(^97=)(^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)
+    (^A1=)(^A2=)(^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)
+    (^AC=)(^AD=)(^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)
+    (^B7=)(^B8=)(^B9=)(^BA=0)(^BB=a7)]
+  [A8(^83^383)(^84^384)(^85=)(^86=)(^87^385)(^88=)(^89^386)(^8A^386)
+    (^8B=)(^8C=)(^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)
+    (^96=)(^97=)(^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)
+    (^A1=)(^A2=)(^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)
+    (^AC=)(^AD=)(^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)
+    (^B7=)(^B8=)(^B9=)(^BA=0)(^BB=a8)]
+  [A9(^83^389)(^84^38A)(^85=)(^86=)(^87^38B)(^88=)(^89^38C)(^8A^38C)
+    (^8B=)(^8C=)(^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)
+    (^96=)(^97=)(^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)
+    (^A1=)(^A2=)(^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)
+    (^AC=)(^AD=)(^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)
+    (^B7=)(^B8=)(^B9=)(^BA=0)(^BB=a9)]
+  [AA(^83^2BD)(^84^394)(^85=)(^86=)(^87^395)(^88=)(^89^396)(^8A^396)
+    (^8B=)(^8C=)(^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)
+    (^96=)(^97=)(^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)
+    (^A1=)(^A2=)(^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)
+    (^AC=)(^AD=)(^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)
+    (^B7=)(^B8=)(^B9=)(^BA=0)(^BB=aa)]
+  [AB(^83^398)(^84^103)(^85=)(^86=)(^87^399)(^88=)(^89^39A)(^8A^39B)
+    (^8B=)(^8C=)(^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)
+    (^96=)(^97=)(^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)
+    (^A1=)(^A2=)(^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)
+    (^AC=)(^AD=)(^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)
+    (^B7=)(^B8=)(^B9=)(^BA=0)(^BB=ab)]
+  [AC(^83^103)(^84^398)(^85=)(^86=)(^87^39D)(^88=)(^89^39E)(^8A^39E)
+    (^8B=)(^8C=)(^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)
+    (^96=)(^97=)(^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)
+    (^A1=)(^A2=)(^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)
+    (^AC=)(^AD=)(^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)
+    (^B7=)(^B8=)(^B9=)(^BA=0)(^BB=ac)]
+  [AD(^83^3A0)(^84^3A1)(^85=)(^86=)(^87^3A2)(^88=)(^89^3A3)(^8A^3A3)
+    (^8B=)(^8C=)(^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)
+    (^96=)(^97=)(^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)
+    (^A1=)(^A2=)(^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)
+    (^AC=)(^AD=)(^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)
+    (^B7=)(^B8=)(^B9=)(^BA=0)(^BB=ad)]
+  [AE(^83=)(^84=)(^85=)(^86=)(^87=)(^88=)(^89^3A5)(^8A^3A6)(^8B=)(^8C=)
+    (^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)(^96=)(^97=)
+    (^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)(^A1=)(^A2=)
+    (^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)(^AC=)(^AD=)
+    (^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)(^B7=)(^B8=)
+    (^B9=)(^BA=0)(^BB=ae)]
+  [AF(^83=)(^84=)(^85=)(^86=)(^87=)(^88=)(^89^3AB)(^8A^3AB)(^8B=)(^8C=)
+    (^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)(^96=)(^97=)
+    (^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)(^A1=)(^A2=)
+    (^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)(^AC=)(^AD=)
+    (^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)(^B7=)(^B8=)
+    (^B9=)(^BA=0)(^BB=af)]
+  [B0(^83^3AD)(^84^3AE)(^85=)(^86=)(^87^3AF)(^88=)(^89^3B0)(^8A^3B0)
+    (^8B=)(^8C=)(^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)
+    (^96=)(^97=)(^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)
+    (^A1=)(^A2=)(^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)
+    (^AC=)(^AD=)(^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)
+    (^B7=)(^B8=)(^B9=)(^BA=0)(^BB=b0)]
+  [B1(^83=)(^84=)(^85=)(^86=)(^87=)(^88=)(^89^3B2)(^8A^3B2)(^8B=)(^8C=)
+    (^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)(^96=)(^97=)
+    (^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)(^A1=)(^A2=)
+    (^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)(^AC=)(^AD=)
+    (^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)(^B7=)(^B8=)
+    (^B9=)(^BA=0)(^BB=b1)]
+  [B2(^83=)(^84=)(^85=)(^86=)(^87=)(^88=)(^89^3B4)(^8A^3B4)(^8B=)(^8C=)
+    (^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)(^96=)(^97=)
+    (^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)(^A1=)(^A2=)
+    (^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)(^AC=)(^AD=)
+    (^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)(^B7=)(^B8=)
+    (^B9=)(^BA=0)(^BB=b2)]
+  [B3(^83=)(^84=)(^85=)(^86=)(^87=)(^88=)(^89^3B6)(^8A^3B6)(^8B=)(^8C=)
+    (^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)(^96=)(^97=)
+    (^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)(^A1=)(^A2=)
+    (^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)(^AC=)(^AD=)
+    (^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)(^B7=)(^B8=)
+    (^B9=)(^BA=0)(^BB=b3)]}
+
+@$${9B{@
+
+<(3B9=b4)(3B8=kphotoalbum at kdab.net)>
+{1:^80 {(k^BE:c)(s=9)} 
+  [-B4(^83=)(^84=)(^85=)(^86=)(^87=)(^88=)(^89^3B8)(^8A^3B8)(^8B=)
+    (^8C=)(^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)(^96=)
+    (^97=)(^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)(^A1=)
+    (^A2=)(^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)(^AC=)
+    (^AD=)(^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)(^B7=)
+    (^B8=)(^B9=)(^BA=0)(^BB=b4)]}
+[1:^82(^BD=b4)]
+@$$}9B}@
+
+@$${9C{@
+
+<(3BC=b5)(3BA=Silke.Fluesshoeh at gmx.de)(3BB=silke.fluesshoeh at gmx.de)>
+{1:^80 {(k^BE:c)(s=9)} 
+  [-B5(^83=)(^84=)(^85=)(^86=)(^87=)(^88=)(^89^3BA)(^8A^3BB)(^8B=)
+    (^8C=)(^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)(^96=)
+    (^97=)(^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)(^A1=)
+    (^A2=)(^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)(^AC=)
+    (^AD=)(^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)(^B7=)
+    (^B8=)(^B9=)(^BA=0)(^BB=b5)]}
+[1:^82(^BD=b5)]
+@$$}9C}@
+
+@$${9D{@
+
+<(3C1=b6)(3BD=Annette)(3BE=Korthaus)(3BF=Annette Korthaus)(3C0
+    =annettekorthaus at gmx.de)>
+{1:^80 {(k^BE:c)(s=9)} 
+  [-B6(^83^3BD)(^84^3BE)(^85=)(^86=)(^87^3BF)(^88=)(^89^3C0)(^8A^3C0)
+    (^8B=)(^8C=)(^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)
+    (^96=)(^97=)(^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)
+    (^A1=)(^A2=)(^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)
+    (^AC=)(^AD=)(^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)
+    (^B7=)(^B8=)(^B9=)(^BA=0)(^BB=b6)]}
+[1:^82(^BD=b6)]
+@$$}9D}@
+
+@$${9E{@
+
+<(3C3=b7)(3C2=danielknippertz at email.de)>
+{1:^80 {(k^BE:c)(s=9)} 
+  [-B7(^83=)(^84=)(^85=)(^86=)(^87=)(^88=)(^89^3C2)(^8A^3C2)(^8B=)
+    (^8C=)(^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)(^96=)
+    (^97=)(^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)(^A1=)
+    (^A2=)(^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)(^AC=)
+    (^AD=)(^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)(^B7=)
+    (^B8=)(^B9=)(^BA=0)(^BB=b7)]}
+[1:^82(^BD=b7)]
+@$$}9E}@
+
+@$${9F{@
+@$$}9F}@
+
+@$${A1{@
+
+<(3C5=b8)(3C4=gurolid at hotmail.com)>
+{1:^80 {(k^BE:c)(s=9)} 
+  [-B8(^83=)(^84=)(^85=)(^86=)(^87=)(^88=)(^89^3C4)(^8A^3C4)(^8B=)
+    (^8C=)(^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)(^96=)
+    (^97=)(^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)(^A1=)
+    (^A2=)(^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)(^AC=)
+    (^AD=)(^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)(^B7=)
+    (^B8=)(^B9=)(^BA=0)(^BB=b8)]}
+[1:^82(^BD=b8)]
+@$$}A1}@
+
+@$${A3{@
+
+<(3CA=b9)(3C6=Harald)(3C7=Holz)(3C8=Harald Holz)(3C9=holz at dfki.uni-kl.de)>
+{1:^80 {(k^BE:c)(s=9)} 
+  [-B9(^83^3C6)(^84^3C7)(^85=)(^86=)(^87^3C8)(^88=)(^89^3C9)(^8A^3C9)
+    (^8B=)(^8C=)(^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)
+    (^96=)(^97=)(^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)
+    (^A1=)(^A2=)(^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)
+    (^AC=)(^AD=)(^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)
+    (^B7=)(^B8=)(^B9=)(^BA=0)(^BB=b9)]}
+[1:^82(^BD=b9)]
+@$$}A3}@
+
+@$${A4{@
+
+<(3CF=ba)(3CB=Simon)(3CC=Price)(3CD=Simon Price)(3CE
+    =simon.price at bristol.ac.uk)>
+{1:^80 {(k^BE:c)(s=9)} 
+  [-BA(^83^3CB)(^84^3CC)(^85=)(^86=)(^87^3CD)(^88=)(^89^3CE)(^8A^3CE)
+    (^8B=)(^8C=)(^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)
+    (^96=)(^97=)(^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)
+    (^A1=)(^A2=)(^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)
+    (^AC=)(^AD=)(^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)
+    (^B7=)(^B8=)(^B9=)(^BA=0)(^BB=ba)]}
+[1:^82(^BD=ba)]
+@$$}A4}@
+
+@$${A5{@
+
+<(3D1=bb)(3D0=gunnar.grimnes at dfki.de)>
+{1:^80 {(k^BE:c)(s=9)} 
+  [-BB(^83=)(^84=)(^85=)(^86=)(^87=)(^88=)(^89^3D0)(^8A^3D0)(^8B=)
+    (^8C=)(^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)(^96=)
+    (^97=)(^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)(^A1=)
+    (^A2=)(^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)(^AC=)
+    (^AD=)(^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)(^B7=)
+    (^B8=)(^B9=)(^BA=0)(^BB=bb)]}
+[1:^82(^BD=bb)]
+@$$}A5}@
+
+@$${A6{@
+@$$}A6}@
+
+@$${A8{@
+
+<(3D3=bc)(3D2=jhudsy at gmail.com)>
+{1:^80 {(k^BE:c)(s=9)} 
+  [-BC(^83=)(^84=)(^85=)(^86=)(^87=)(^88=)(^89^3D2)(^8A^3D2)(^8B=)
+    (^8C=)(^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)(^96=)
+    (^97=)(^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)(^A1=)
+    (^A2=)(^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)(^AC=)
+    (^AD=)(^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)(^B7=)
+    (^B8=)(^B9=)(^BA=0)(^BB=bc)]}
+[1:^82(^BD=bc)]
+@$$}A8}@
+
+@$${AA{@
+
+<(3D8=bd)(3D4=Carole)(3D5=Goble)(3D6=Carole Goble)(3D7=carole at cs.man.ac.uk)>
+{1:^80 {(k^BE:c)(s=9)} 
+  [-BD(^83^3D4)(^84^3D5)(^85=)(^86=)(^87^3D6)(^88=)(^89^3D7)(^8A^3D7)
+    (^8B=)(^8C=)(^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)
+    (^96=)(^97=)(^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)
+    (^A1=)(^A2=)(^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)
+    (^AC=)(^AD=)(^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)
+    (^B7=)(^B8=)(^B9=)(^BA=0)(^BB=bd)]}
+[1:^82(^BD=bd)]
+@$$}AA}@
+
+@$${AB{@
+
+<(3DD=be)(3D9=Janez)(3DA=Brank)(3DB=Janez Brank)(3DC=janez.brank at ijs.si)>
+{1:^80 {(k^BE:c)(s=9)} 
+  [-BE(^83^3D9)(^84^3DA)(^85=)(^86=)(^87^3DB)(^88=)(^89^3DC)(^8A^3DC)
+    (^8B=)(^8C=)(^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)
+    (^96=)(^97=)(^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)
+    (^A1=)(^A2=)(^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)
+    (^AC=)(^AD=)(^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)
+    (^B7=)(^B8=)(^B9=)(^BA=0)(^BB=be)]}
+[1:^82(^BD=be)]
+@$$}AB}@
+
+@$${AC{@
+
+<(3E2=bf)(3DE=Marko)(3DF=Grobelnik)(3E0=Marko Grobelnik)(3E1
+    =marko.grobelnik at ijs.si)>
+{1:^80 {(k^BE:c)(s=9)} 
+  [-BF(^83^3DE)(^84^3DF)(^85=)(^86=)(^87^3E0)(^88=)(^89^3E1)(^8A^3E1)
+    (^8B=)(^8C=)(^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)
+    (^96=)(^97=)(^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)
+    (^A1=)(^A2=)(^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)
+    (^AC=)(^AD=)(^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)
+    (^B7=)(^B8=)(^B9=)(^BA=0)(^BB=bf)]}
+[1:^82(^BD=bf)]
+@$$}AC}@
+
+@$${AD{@
+
+<(3E4=c0)(3E3=vangelis at iit.demokritos.gr)>
+{1:^80 {(k^BE:c)(s=9)} 
+  [-C0(^83=)(^84=)(^85=)(^86=)(^87=)(^88=)(^89^3E3)(^8A^3E3)(^8B=)
+    (^8C=)(^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)(^96=)
+    (^97=)(^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)(^A1=)
+    (^A2=)(^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)(^AC=)
+    (^AD=)(^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)(^B7=)
+    (^B8=)(^B9=)(^BA=0)(^BB=c0)]}
+[1:^82(^BD=c0)]
+@$$}AD}@
+
+@$${AE{@
+@$$}AE}@
+
+@$${B0{@
+
+<(3E6=c1)(3E5=nepomuk-ma at dfki.uni-kl.de)>
+{1:^80 {(k^BE:c)(s=9)} 
+  [-C1(^83=)(^84=)(^85=)(^86=)(^87=)(^88=)(^89^3E5)(^8A^3E5)(^8B=)
+    (^8C=)(^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)(^96=)
+    (^97=)(^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)(^A1=)
+    (^A2=)(^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)(^AC=)
+    (^AD=)(^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)(^B7=)
+    (^B8=)(^B9=)(^BA=0)(^BB=c1)]}
+[1:^82(^BD=c1)]
+@$$}B0}@
+
+@$${B1{@
+@$$}B1}@
+
+@$${B3{@
+
+<(3EB=c2)(3E7=Leo)(3E8=Sauermann)(3E9=Leo Sauermann)(3EA
+    =sauermann at dfki.uni-kl.de)>
+{1:^80 {(k^BE:c)(s=9)} 
+  [-C2(^83=Leo)(^84^3E8)(^85=)(^86=)(^87^3E9)(^88=)(^89^3EA)(^8A^3EA)
+    (^8B=)(^8C=)(^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)
+    (^96=)(^97=)(^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)
+    (^A1=)(^A2=)(^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)
+    (^AC=)(^AD=)(^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)
+    (^B7=)(^B8=)(^B9=)(^BA=0)(^BB=c2)]}
+[1:^82(^BD=c2)]
+@$$}B3}@
+
+@$${B4{@
+
+<(3F0=c3)(3EC=Roth-Berghofer)(3ED=Roth-Berghofer Thomas)(3EE
+    =Thomas.Roth-Berghofer at dfki.de)(3EF=thomas.roth-berghofer at dfki.de)>
+{1:^80 {(k^BE:c)(s=9)} 
+  [-C3(^83^3EC)(^84^28D)(^85=)(^86=)(^87^3ED)(^88=)(^89^3EE)(^8A^3EF)
+    (^8B=)(^8C=)(^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)
+    (^96=)(^97=)(^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)
+    (^A1=)(^A2=)(^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)
+    (^AC=)(^AD=)(^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)
+    (^B7=)(^B8=)(^B9=)(^BA=0)(^BB=c3)]}
+[1:^82(^BD=c3)]
+@$$}B4}@
+
+@$${B5{@
+
+<(3F4=c4)(3F1=Burkhart)(3F2=Daniel Burkhart)(3F3=dburkhar at dfki.uni-kl.de)>
+{1:^80 {(k^BE:c)(s=9)} 
+  [-C4(^83^2F3)(^84^3F1)(^85=)(^86=)(^87^3F2)(^88=)(^89^3F3)(^8A^3F3)
+    (^8B=)(^8C=)(^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)
+    (^96=)(^97=)(^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)
+    (^A1=)(^A2=)(^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)
+    (^AC=)(^AD=)(^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)
+    (^B7=)(^B8=)(^B9=)(^BA=0)(^BB=c4)]}
+[1:^82(^BD=c4)]
+@$$}B5}@
+
+@$${B6{@
+
+<(3F9=c5)(3F5=Dominik)(3F6=Heim)(3F7=Dominik Heim)(3F8
+    =dominik_heim at gmx.net)>
+{1:^80 {(k^BE:c)(s=9)} 
+  [-C5(^83^3F5)(^84^3F6)(^85=)(^86=)(^87^3F7)(^88=)(^89^3F8)(^8A^3F8)
+    (^8B=)(^8C=)(^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)
+    (^96=)(^97=)(^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)
+    (^A1=)(^A2=)(^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)
+    (^AC=)(^AD=)(^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)
+    (^B7=)(^B8=)(^B9=)(^BA=0)(^BB=c5)]}
+[1:^82(^BD=c5)]
+@$$}B6}@
+
+@$${B7{@
+
+<(3FE=c6)(3FA=Florian)(3FB=Mittag)(3FC=Florian Mittag)(3FD
+    =florian.mittag at gmx.de)>
+{1:^80 {(k^BE:c)(s=9)} 
+  [-C6(^83^3FA)(^84^3FB)(^85=)(^86=)(^87^3FC)(^88=)(^89^3FD)(^8A^3FD)
+    (^8B=)(^8C=)(^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)
+    (^96=)(^97=)(^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)
+    (^A1=)(^A2=)(^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)
+    (^AC=)(^AD=)(^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)
+    (^B7=)(^B8=)(^B9=)(^BA=0)(^BB=c6)]}
+[1:^82(^BD=c6)]
+@$$}B7}@
+
+@$${B8{@
+
+<(402=c7)(3FF=Gunnar)(400=Gunnar Grimnes)(401=grimnes at dfki.uni-kl.de)>
+{1:^80 {(k^BE:c)(s=9)} 
+  [-C7(^83^3FF)(^84^A8)(^85=)(^86=)(^87^400)(^88=)(^89^401)(^8A^401)
+    (^8B=)(^8C=)(^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)
+    (^96=)(^97=)(^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)
+    (^A1=)(^A2=)(^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)
+    (^AC=)(^AD=)(^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)
+    (^B7=)(^B8=)(^B9=)(^BA=0)(^BB=c7)]}
+[1:^82(^BD=c7)]
+@$$}B8}@
+
+@$${B9{@
+
+<(408=c8)(403=Benjamin)(404=Horak)(405=Benjamin Horak)(406
+    =Benjamin.Horak at dfki.de)(407=benjamin.horak at dfki.de)>
+{1:^80 {(k^BE:c)(s=9)} 
+  [-C8(^83^403)(^84^404)(^85=)(^86=)(^87^405)(^88=)(^89^406)(^8A^407)
+    (^8B=)(^8C=)(^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)
+    (^96=)(^97=)(^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)
+    (^A1=)(^A2=)(^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)
+    (^AC=)(^AD=)(^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)
+    (^B7=)(^B8=)(^B9=)(^BA=0)(^BB=c8)]}
+[1:^82(^BD=c8)]
+@$$}B9}@
+
+@$${BA{@
+
+<(40E=c9)(409=Ploessl)(40A=Moritz)(40B=Ploessl Moritz)(40C
+    =Moritz.Ploessl at dfki.de)(40D=moritz.ploessl at dfki.de)>
+{1:^80 {(k^BE:c)(s=9)} 
+  [-C9(^83^409)(^84^40A)(^85=)(^86=)(^87^40B)(^88=)(^89^40C)(^8A^40D)
+    (^8B=)(^8C=)(^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)
+    (^96=)(^97=)(^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)
+    (^A1=)(^A2=)(^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)
+    (^AC=)(^AD=)(^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)
+    (^B7=)(^B8=)(^B9=)(^BA=0)(^BB=c9)]}
+[1:^82(^BD=c9)]
+@$$}BA}@
+
+@$${BB{@
+@$$}BB}@
+
+@$${BD{@
+
+<(410=ca)(40F=dana.hauptmann at freenet.de)>
+{1:^80 {(k^BE:c)(s=9)} 
+  [-CA(^83=)(^84=)(^85=)(^86=)(^87=)(^88=)(^89^40F)(^8A^40F)(^8B=)
+    (^8C=)(^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)(^96=)
+    (^97=)(^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)(^A1=)
+    (^A2=)(^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)(^AC=)
+    (^AD=)(^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)(^B7=)
+    (^B8=)(^B9=)(^BA=0)(^BB=ca)]}
+[1:^82(^BD=ca)]
+@$$}BD}@
+
+@$${BE{@
+@$$}BE}@
+
+@$${C0{@
+
+<(415=cb)(411=Dr. Thomas)(412=Dr. Thomas Roth-Berghofer)(413
+    =Thomas.Roth-Berghofer at dfki.uni-kl.de)(414
+    =thomas.roth-berghofer at dfki.uni-kl.de)>
+{1:^80 {(k^BE:c)(s=9)} 
+  [-CB(^83^411)(^84^3EC)(^85=)(^86=)(^87^412)(^88=)(^89^413)(^8A^414)
+    (^8B=)(^8C=)(^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)
+    (^96=)(^97=)(^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)
+    (^A1=)(^A2=)(^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)
+    (^AC=)(^AD=)(^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)
+    (^B7=)(^B8=)(^B9=)(^BA=0)(^BB=cb)]}
+[1:^82(^BD=cb)]
+@$$}C0}@
+
+@$${C1{@
+
+<(41A=cc)(416=Nicolai)(417=Schwindt)(418=Nicolai Schwindt)(419
+    =schwindt at dfki.uni-kl.de)>
+{1:^80 {(k^BE:c)(s=9)} 
+  [-CC(^83^416)(^84^417)(^85=)(^86=)(^87^418)(^88=)(^89^419)(^8A^419)
+    (^8B=)(^8C=)(^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)
+    (^96=)(^97=)(^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)
+    (^A1=)(^A2=)(^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)
+    (^AC=)(^AD=)(^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)
+    (^B7=)(^B8=)(^B9=)(^BA=0)(^BB=cc)]}
+[1:^82(^BD=cc)]
+@$$}C1}@
+
+@$${C2{@
+@$$}C2}@
+
+@$${C4{@
+
+<(41E=cd)(41B=example)(41C=bob)(41D=example bob)>
+{1:^80 {(k^BE:c)(s=9)} 
+  [-CD(^83^41B)(^84=bob)(^85=)(^86=)(^87^41D)(^88=)(^89=)(^8A=)(^8B=)
+    (^8C=)(^8D=)(^8E=0)(^8F=)(^90=)(^91=)(^92=)(^93=)(^94=)(^95=)(^96=)
+    (^97=)(^98=)(^99=)(^9A=)(^9B=)(^9C=)(^9D=)(^9E=)(^9F=)(^A0=)(^A1=)
+    (^A2=)(^A3=)(^A4=)(^A5=)(^A6=)(^A7=)(^A8=)(^A9=)(^AA=)(^AB=)(^AC=)
+    (^AD=)(^AE=)(^AF=)(^B0=)(^B1=)(^B2=)(^B3=)(^B4=)(^B5=)(^B6=)(^B7=)
+    (^B8=)(^B9=)(^BA=0)(^BB=cd)]}
+[1:^82(^BD=cd)]
+@$$}C4}@

Copied: trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/vcard-antoni-kontact.vcf (from rev 976, trunk/dna-repository/src/test/resources/docs/vcard-antoni-kontact.vcf)
===================================================================
--- trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/vcard-antoni-kontact.vcf	                        (rev 0)
+++ trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/vcard-antoni-kontact.vcf	2009-06-04 22:31:30 UTC (rev 977)
@@ -0,0 +1,386 @@
+BEGIN:VCARD
+ADR;TYPE=home:;;Piaskowa 82;Police;zachodniopomorskie;74-023;Polska
+ADR;TYPE=work:;;Trippstadter Strasse 122;Kaiserslautern;Rheinland-Pfalz;676
+ 63;Niemcy
+ADR;TYPE=intl;TYPE=postal;TYPE=work:;;Trippstadter Str. 122;Kaiserslautern;
+ Rheinland-Pfalz;67663;Niemcy
+BDAY:1985-01-28T00:00:00Z
+CLASS:PUBLIC
+EMAIL;TYPE=PREF:antoni.mylka.kde at somedomain.com
+EMAIL:antoni.mylka.otherkde at otherdomain.com
+FN:Antoni Mylka
+GEO:45.000000;-87.300003
+N:Mylka;Antoni;KDE User;Pan;Junior
+NOTE:These are some notes about Antoni
+ORG:Aperture Project
+PHOTO;ENCODING=b;TYPE=image/jpeg:/9j/4AAQSkZJRgABAQIAAAAAAAD/2wBDAAEBAQEBAQ
+ EBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBA
+ QH/2wBDAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEB
+ AQEBAQEBAQEBAQEBAQH/wAARCACMAHQDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAE
+ CAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0
+ KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc
+ 3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW
+ 19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQo
+ L/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYn
+ LRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6g
+ oOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk
+ 5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD+wmKznneaOO9mt5LdtksqeZuuW3MPMkxLG+7
+ fHu+bzG3SHB8zasjYreWaGS5juZII4t2+2Td5c3lpvbftkUfvI2aM7o2+Uc7k8zy2La2UxaO5uf
+ KjgOy2fzoY/OjOV37nDJJwsbZjYL83PyNvjRYLWZTPPN5V1FnyYfMjTzCn7yP93IvmPvkLplGG7
+ GBhwqy+q1e+mt6f29dl/XbXU9uz1bWt4fbb6LRfiSfZ5fs/2wXMnkd7L5vK++Ij0kKffCS8xD5s
+ bsHy2djROkKXLTO8MrFEtDu8qIqXG9csVySkh4iUZkfDFt4pPItdn2rzv9O/59vMj9fL/wBSVE3
+ +pIk4Y/3xuQsIvm79of8AaW+Hn7Ovh+61nxLdPca8dJXUYtHjmtFxBc6nFo2nPJFJNHeO19qH7i
+ 0itYrlp5ongnNkLmylnyr4mjhaU69aSp04VLuTk3bSOiS1bd9EtXsb0MPUxFWNGjTc6k6lko1Hf
+ RK92tIre8n0Z7/rmqaZ4Z08atr2rW9pp8nkgS38vkw2zzvHFb20RkZ/MkmeaGCGKJFkkZUVI2Ux
+ k/P/AI0/ar+DngK1k1LxF40t7XSY57+CXxLrmqaL4a0XT/7O0tNavL9b/wATa5pklzp9vYy/arv
+ UNMhu7ex8ic6i9oLS8a2/ng/ak/4KgWenSeGm1rxhqN3rnjeTRNQ0L4T6ha/2TMllqp1C40/VvF
+ RtZrLTNKsrNYlii8PJfTapqfiG2sbO6m0nz55NT+b/AIaftv8AgLQtR1r4l/FrUtC+JmtPY63fe
+ BvCEkj6p4Q8EfDrwrp1l4T0+61PR20keHrTxBrOqeIdV1oy32n+JLvRtE8S3vh+3nt38Pae934l
+ LNq2KftaNH2eGj/DlNtzqSlyvRPRxknpu1rdu2n0H9i0aKUa9R1cSrOdOnU92in8Kcm7yctI3sk
+ n0kj+tXRvi4viHT3m0u1uI5JZIRaa1qb3GnaYbWaCS7S8jk1xNBv73T7iwjhnhuNJhvYHi1WxmE
+ j28zyDw+f9rSPw74p0Dw144n0Tw43i2e+tfBHiiOPVZ/Cfjy6uoLG68PWPh/xnPdWumWWvX6SXF
+ tZ+GfEMuka74mgN1e+GrG+tdE1Kv5q/Gf8AwVB13xR4l8Y+GNP8f3Wk6ZqGm6z4S0ljcWMcukT6
+ ro3hrw5bahpuoG2s7Owhg8RaXbX1zHE9g7QakJLO6iW0QT+laz+3/ofiPxDoNtcaRY+K/hjrE3g
+ abWfDHj1tKuNP0TVdJ0jXtUsPEPhp7y18ZWel+II9R1bwxp9xq8Qh1C3uWlht721ufDUeq3DrY6
+ tFL2N3KKcZXsldpNRT6pt3c9LtSWoUsmg5XnGEYtqNlVk5abpPXV6XlbRq+lz+mnwL+0L4J+I9v
+ rB8Iag1xqPhLXL3w54z0552sPEGgavpt1cWt5b3ulXaWt7GtxDbS6vptzqB0+y1nSBFqmnXVzZS
+ x3J9f8P+I9F8VQXVzomrIyWQia6gQPG8qzxieFJUcwnbLF5ckJZJEmguYZ4t8VxbtP8AzDeAP2j
+ 9Y0D4w3Wv6Mb7xb8K/HOi3sg1CDWtOg1nUYpbBZPCN3dWmrahbab4q1PS9ROk6Faan4lSHxFpnh
+ e509NFuLa30drXxN+ifwS/am8I/ED4e+HPEOo+JItNbW4Dq/h7W9U0u8trHVEluYdQspJ9Cla0l
+ 1ePSdYJ8OyWmlaheX+h2mjatqGs6oRpWo6lDwUOImpwjiYxUZuKbUrRnZK6i9OVpqzcle6NsXw4
+ 6dLnoqdSLcWm5NW25k1dxaS+0m+ZW1T2/YiK2lmikuY7mSCOLdvtk3eXN5ab23bZFH7xGaNt0bf
+ KDncgfyz7PL9n+2C5k8jvZfN5X3xEekhT74SXmIfNjdg+Wz/OXw1+MVl4mtZovEouNO8U2c1zDe
+ aBfSQ2d7p2oWt7fW0mmW01zpulWniCxub2xvX8NalbGzutY0E6fqctmIJxqV379Zz6XfwG/tL1J
+ rtSFe2VwrI5CDa9tIkdyjfZ3SbDDJVlkAKFvL+jw2Mw+JV6copupF8kppSV2r6fPp31PmsRhauH
+ klUptXmmvfls2uvZ/jv2L8lvNDDHcPdSTwy7Nls+7y4fMVpF2ZkdP3YDxrhE4ZsYIkRWyxSQJFJ
+ LM9wlwvmRRPu22w2odke5nGNjxr8qx8Rr8uzyyWtb2sSC4t5vNupcedD5kb+XvBeQeWirKmyVQv
+ zFtu7a3Ox5EaKGELJbyGWWcb7pN6SeTJw23ZHho+XddshY/JjcGEiJ3RXw2jpzS+27bLVff5vcx
+ itvdVrv/l67dH5W6677okuIZbVxHPM96zLvEsu7coLMDGN7SnAdXb7w5c7lV9woqN44bU+XZObm
+ JhvZw8cuJCSrLuiKqMBVbaRkbshmUq7FZq9l7r2X22KN7L3Xsvtvt6jl/szLC8/1Gf8AQj/pH+q
+ 5HWIB/uGI/vU3cbsEho3RfsO0/av+P7n7N/rsdMw/6vMP+uDD94B1w+VYNFG0mnJta6gllhcZtE
+ QkGKLglZAJ0JOwxjmSQ/Kw3AsJAF7NWCXMUkl42Ps8qE+WmciLcokjB2y5ZsxvkFTyFMbpvWS9z
+ en0dvhju7W7W17+RHV39le8Nr+X4dirquqaHoek6hrWp3MVm2kWN5qmo3c7tFb2ljp8El3dXM0s
+ zrZpFDYRSSSPIyIqIWdkZWL/AMH3/BRT9uoeJvifba7rE0PiRreXWvHureDb3Wr7V5YNP17VLjU
+ PDfgm8gGrPp8WjeGtKh0mz1XR/s9r9u0OLULfRry2l1rWLnTv6Uf+Cxn7Rtt8Hv2frD4a6Vqcmk
+ eMPjdJ4j8NSX8N1e280XhiHRTp2szW7WHmyJNDJ4i0u+RZbdku4NJ1G0hjluJkltf89T456/J4v
+ +KPiu0tLWxsjqXi/WLcw6bbbbOw0rTNYv5rLSLARkotlDPqlxGiwokMqsohgWOCVrn5zMakMZjv
+ qs5RWHwsZ16sVoqlSShGKv0lCPM9O/ex9nkWFr0MHPE0acZYjG1VRw7itacU7Sdmr8058q2tZN6
+ 3scl4v+MfjD4ha14h+JPia6u7rxP4mtXtbq4vtQu742tgyywWFjJJeSPmMwwX99cqALIakkQhjQ
+ pJJUev+PtSutGtJ7GS7gGq6Ja6bc3Hm3SxG31ldEvbq1nDSOGjWbS7SJbVC5FtFyNscKp1OufCi
+ 9trjwrpCxuTqw8/UIZrdWlVN5ikaFS5O22tpWaJsqiXEqB4jbo8S9H45+GP9meC2vrfT5Es9Jgt
+ VmjKht8c+r21wWC+dNIjJGkqbt+HE8YcRNsY+dVzjCUlRow5ORySjBJXUIyjGNn0s/i1s7S11sf
+ a4TgvMZrG1K6vKNKMnJqTfPKMZycErqyXM53SS6W6eef8LPstJ8Xa5q6X+o3MviXRtOs31HUrqc
+ K1/Jp1hDeyJPb7pnPkafclbRriOWa7UzS3N0l1NBF9Cx/Ezxdo1npurtcXc2nWXhe0We306e/t9
+ MnU2+p3TGVZ/mmhS7YOpa3R444bWeMeZaGe4+PbvwcdZ1f4aWa2EqWuoT2NneWqRAT3NnbR6Omp
+ 3IXeS6tL/ojsoU7rwXAdw2Jf2b+GPwg0vW/BNnb6xaXMGn3Xhe0SWGO2t7i4guU0/wCzT2HlSTF
+ nMlxdPGkb36HT3hjmufNVZo35Mw4gwuHpYdr2blKdnHl6RcYLVaNKV21v5u7OrJOD8XWrYyVRKF
+ On7NwlySspzjGUrJq7pxTV+76JH0d/wTv/ALQ+MP7O/jfWLmZb+/8AB+q6ppWjnzH1eez1Sz0S2
+ utPtUhmtL2ZNSGlzM1irbhZ3k2l6jaywatp1pdW/wBNaF44v/2f4LW71Vo9K0zxDrT+L9GvzBNH
+ pd7rfiLR9dluE8Uaj9j1O6Glyx6kbDW9W0m68LXek6PYahrz3OsxXeseH/EHxz/wT9+IVj+yh8X
+ td+D3xQtVsfhz8ddY0/VfAvi65FxFZ2virQF1LSHtJ9UTZp0F9eJLp2my21zPa3EsqWpjuXuYjB
+ P+5XxR+Gdh8Qvhzd+H4p5rp9TJ1XQNd0jUfs93YXsl616k1nqVm8TRxwXE1ncabcxNO0AhgdQTD
+ CG+OzDFfWK86lCSnRk/bKnFraShdxV9k20rX1TTSsfR4bK4YWh9VxdFRrQkoKtNPk5nLlUpPazX
+ LKmm9L3vZHjvxg/bK/4Vb4I8K/HDRrHU9S1/SbJdVu9GtNZvPBniPxx4H1VvCxuIby4kku1b4uf
+ DW+ngs47TUtM8R6fep4Z8SabeeG7C2CeF/D36W+FPjp4u0q90b4m+DNYv/H3hj4kxaJ4w8Ox3Y1
+ 26KaBqdhosut+G4Lia7j02OS60uGx8bfDmwtvtMuoya74wgOmSaPdyeL9F/nF8P/C74h6z4O+KH
+ wi8Q6Lr2q3nhqKW98Nb9T1eWzt2nvNR0+TWfD9jFe21hpWqme+m1uFDHJZ6L4lXTrW8uru0vtRh
+ vJf2JvjVr/hDwD8VPhN8SbVoPFfh3xZq3iP4fW+v619jl1WxmtPEK6v4W8J21jqMN3pA0fWvBcK
+ WVjFbX2uaRc6pLoNjbXE+geJPFtxtk2PxDwrqUqyvhq/spyveThJwcKii73lTas30ble6Xu/LZ5
+ ktKnWp0asKcozi5vS+7i3T0t79pLllaySaTaP7fPh/458L/EbwppXivwreWd6up24nllsLw39rI
+ hZw81tdqWtLm0mZEnt7i2YxSxSBomaMER9o32bC/Y/9fj/Tf9Z/reD/AMtQE++ZR+6wvGMEBXf+
+ fL9iL9rrSfCnxYsvh+2uR6x4H8Yz3+paTr934hvZp9Mh1Kwn8d6nDeWN3EUW0sP7a1KKK2iinOl
+ WXh/R9NfVLXUJLrw7Zf0GBrdiy2qPFOh23jSA7ZJcsN0YMkuF3LIfuRctnbgqkX6rkmZrHUuWp7
+ JV6EuWolZcylFOE0ltzrV6WTuflebZZPLsTFWpOjW5qlGTT2uk4u11eOzS1s72VxX+zZ/4lv8Aq
+ MfP/rP9aMhv9eA/KeWePlOcgKSyKU1WgkBawRoIQSGSXJYydSwJkn+UoUAG4YwQQSC7lerHZfw9
+ l+R5Mdl/D2X5CNeQW+2SSyhuEuBvjjk2Ytl4by490LpjDqvyxxj92vy7MoVNxFC6Wr20c8sxAS5
+ coJIfM3Rrt3xuf3bjzBiRBlmIIYK62YryeB5pI7Ka4kuG3yxJ5m62bcx8uTEUj7t8m35vLbdGcD
+ zNrRsS4lige2jt5Zo5SS91GWCQ7wFYPtjdcLGjM+6RSUYgFFLl3Ld3k7qVP7OqXLG/9dPmGuvvt
+ u8P+XdnfS729Va/mfyN/wDBwD48vtZ/aD+G3wqt7aBodJ8B6Zqc9yu6SV3urjxBd2qXEaM80L3V
+ 1qUNmssAjM0MNqhM3lyx23878H7N2tan8Q9Buho7x22oanbaub9ed0GqvDNcmQNEZBteSJ5CZiE
+ tnhO6WM4i/o//AOC3uk2V5+2n4C0+SxcHUP2YNA1kX0UckUTSaV8W/FtpeXs7xIiXktnp8kcccV
+ w8oRoYlWTzGtrZ/mS/8NaL4V0/SLK9gSO30nTbe4h1WUKyMY7Z0dIWVVjRQVZuZpGBhk80KdyL+
+ acS4jEYLG4mnScpOspXkqbTfOo6W2fKnddVbdH9GeH+BwGLy7CVqzVT2PsXFNRglJS5px95KSTl
+ FN1E97q7PmLXfgx4f1HUNG1COyaK78OaW+mRIZUCXUk94biS8mAjhma4cFvKzdvDGu9VVJR+68e
+ +JfgC68VeG9Y8P6To6oY4JBbWyy7JLx3fCCSVLdQFSTzn8xllUKWKOVSVR6/8V/2j/APhnTI4L3
+ WINOhtrZ7eK7uozLJdCOKNWltoljiidiluWjjXzI3z9/am4+ffDr9onwn4x1e1uyZtojnuIfMik
+ lmnNq0AChuEUG4UQL5ZmSRg7xkTY8z4mWGx1OnLEVnNQXJKDdKV07xvZpLVJ66pysn0aP2SjicB
+ WlVw1Ovh3XktaUZ03KovdSTXvez5Fa1lerpe9zyXwl+zilrPZ6xq9lIlzpM9jb2umSSCG3sWhZr
+ mScqtojK9wZ4JbtZ1ldUit1UKLRQv6q/Bzw14fs7YNdJG1lDDbQ/YEu45AFkzbwtho2ilMkuZds
+ cDjcQjN5Lps+RPGXxfh0b4galqcttLa2cmgaDqkVq8bFJ0uNHWxvXgZ0SRQ0tvd3JAhlk3GSQO0
+ ZdI/lHx3/wU50n4a6tfT2vh651N7m3ihihjhazuBcoLi3Z95ubSQxILaKYT+X9pVJreOIxYd1qO
+ XYjH1+SnNzUJqULwb9yUYtNXatG72fW+jODOMVgMtwEcTiK1PDxlFKcorlfOnFOb5UuZwtZ02tl
+ e29v6BG+Gnwz1/SLu28QaJY6xp+o3lrdNpNyuTaiR7W6t5GAaeNHhWzhjiMUCtIu0+WIgFl+qPh
+ xp8HhmDTtGsbB7vTEtEs7QTvi9s0haKO2IlnkIkk2smFR4JGaFhlJnkMf8oXw2/wCC2XjmO8uLe
+ 48MWVpaT3QX7TqOnS6mkEEk7ebIlwJ7idDChjK24trsBoVWCBGkAX9qf2LP+Cmvw1+JR0fwh4nk
+ tX1XWo547rXINOvdMSNrWzjlgvPtckxtCt357SXD32n6dYPdOY4buCNrSE+nSySeCqQnXkk0rRc
+ YaRWja5k2kpPdPRX6bn5vXzbDZpRq/UK6xVPmc4wjJuS5HFTkqbScpNL+847pan6M+OfD3hrwrr
+ a+MrSxSDWNQtGs7i/R9hMUyw+Sktvcwv5kNk8M120ZZY4J3aaKOIxW8kf4JftWX3gv4U/FHwf8R
+ ra1txY3vjHT9S1PWrA6bJq2naxpWoWN/peqx2Opidojq2l6M1trOrSRS6PcReCvB0htLvW7a5Fp
+ +/nxZbUD4d1jTdAV/ENhcrI0EoaSCIRTRLbIYLydFKQqh84PDcrBcwmKQyeTM5m/l2/bA8Xaho3
+ iTX/hf4otDqXhq8sZ9T0G7kiCPYeK7G5vZ9HvTfRSWtwmnFI76xuEN1cPaRaheNaRFp5raSMNU5
+ M1lhqNOMIVabdVKDam/dUmprmUnbVN9bp7XXn4rDPEZNUx8qz9tQsoRmryjFqNqbTV273TnbTTX
+ Y+wPAnxEtiZNX0m7srfUPBOvxa1qGhaIV1pfFGiwznw/wDF/RV+wafcGDxI2pHUNaS9g1NYLTR9
+ T1j7XZs15FMv9pH7Ofje++I3wQ+GvirU30qTWNQ8L2B1e/0Sa5n0/Ub+332U91C97HHfgSvaNM0
+ d80l1HJM6TsZhJJJ/mffC744+KrPx9oVvNrfiuKPTdTsdPsr63vJdLu/EfhjxjqUGh3VvGdDn0y
+ 5vtZm17UftR1XUNSN47XUl/cS6kVvZJP8AQQ/4JaeJ9a8SfsoaVp+vSxC58IeN/FnhmCDzbu5uN
+ OtrY6bdRaZf3t1JJFeXEcd2mpWc9pPcKuhapotvqU8mvQawa+8yKnUw+aKF7KphvebhaUlTcOTZ
+ a2Um72V7n5dn8oYnBRqqUoujXileF0lOFnFR7XitU7Ss3a9z9GllS7BkhhWzRSUMUW3azD5jIdi
+ QjcwcKflP3RghdqIVJNM14yyyxNaEIEWOQsS6gs3mAuIyVZmZQQpB2klmcsxK+zjey957L7D7eh
+ 8PGWi9/ovs+QqXN3HJcfZVtZJgUa/SSWJRbyPv2hV+0RqI2YzBW3OpRBz5bMGrw6iNqQWk1lNb3
+ JlBLXMJmcpEJLgW8ZnQymK2VZWEcUhAIc7isYX+Vy7/AOCi/jLxn8Q/2l76G0urHw946+Ht14T0
+ TR5NW+1eI7TWo00/7Be6YsT28F4huF1iW2NhbRljNbwyFBbyTze0/wDBOr4pDS2j8V+OviPDY+D
+ tL0nxJrHiPwzq+ux2+qafLca5b2GkW32C+lDabq11bKbq3sYrqO5udNedLGZGNxFXzNPP51cRGC
+ wzWHcn7SvKrFckIOKjOKlBcylHVtO8dt1pzRxPPy2VTlqcrTtro0krOOjS1b3Sto76fGn/AAcRn
+ xvL+1T8LNO8GaZqGqatrP7MVhpeh2mkWuqavrV7t+LHji91a203R9PgumkkuNtr9qkt4Jbt1sbJ
+ HtxbFrgfPX7QWn6j4g+H/hCPWPDlxrx8RaBo1loXhm8vPFHhpbBrhbeDVNc1lNFuLbULrUXv7fU
+ YNPtL+FLHSRpitfaTqKXsiTfo9/wcTad4og+HH7L/AO038MtRD6Z4Q1f4m/C3W9Z8PF/7T/sP44
+ eC7KLSrldY0y7t7ywgs/8AhHfEAs555Ujt9Q1SOWGeCSNkn+LfhFe+KvH37Nfwl8ReIiNR8ca3+
+ z38NYvDekXa/b9fm1b+w9SvJfFdyVa51PVbXUbe+h1C8v4VyLmK8uLwRW19pyG8z+pyrvETfPNQ
+ vR5+VxlpH7Wu3LKyu7taJX1/V+F8TjcbRwmX4Z1qeFbUcTUhNxnGMJys24W5aUpSV3fR2bff8Nf
+ i78H9T8IW9zq/xB1r4d2yafbwBoW+GPgrxXrt5E7Mbe5vdY8TadqF8biYCEJdmTS7ZIYIoQI5UY
+ VzXwb8L+G/iIv/AAhHgeVPC/xHutR1nVLPXCp0TQvEWkWWn219d6Je+GLHULvw/o8sen2d1d6Vr
+ HhOzsVmm+z6be6PcT3sut2n2p+0B+x7r3iXwtb/ANvwaxrurLrlrrdhqlt4Ovbnxdp62Vnc2i6R
+ pWrSzXj6foMgmj1DUopdNiv9Q1iSXUJb9prmeST59+D/AOz1qPw78VXguLK30/xFdWms+GrC31V
+ 7261zS7jXrK4s7nVLqyXUNPuNNGmDU5tYN7KIVuNWKWNrMnm6he2PhYnEUHQkqtadaLUXUoypRh
+ GN1G8YycXeSfwtPXRW2P0ChlGKo5nF4HC+ybVNUcVHFSr4idZuKUqkFdRj2V7NJXvZnul14DPiv
+ wr4Y1y91m+0670axXRtI8XyeG9a03wprWnzQr5ep2eq63BpTmzUoZ2uWtJppIYLifynDE33z38f
+ odO+A+v3Vl4V0N7DxDpUGpaH4j17TtUudIl8Ta0UMPiK41LWraWO6Gn6w+lNfaf4WtJZ9I0u0id
+ rDTp9Ru9f1PUP6Qx8K5PiP+y/rngya7fTta8W+C9X0nQtSitLI3WgXWo6fqWmWmqWplSewjNlPP
+ LfP5yO8caP5cU6RRBPzw+LP7MurfE2aPWLrU7nw34o1Sa6vPFdlqsGonSb7Vbq3hnvtXhOk2urX
+ Xmahdz6pM9ldw3k1hZ20Pl6tq99dSLH4WHp0uSnKbnh51lCcI3mr0UotQlJacyvHZrmWrTSPbzZ
+ Y6piJUqjrYujh5S9pzxpySrp04qcYcicqkkpe61KLS0u22fin8G/2ivHum+NrCdfhv4x8RtNcQS
+ SrovheXUYLeMyRPDJubXYLq5aK5kVlU3OmyQTJdIx327yxfsL8NPixoPxjuoNI8WfDTxh4d1ODR
+ 7yHQdW8U6BpvhTXJ00211C9W8sNWMWo+II47651PX9Qk08z+JNL11ibrUNVtNdulNm74S/si2Hh
+ 7WvNs/jn4W0++guGkn0yLTfiLdyXihSJvssh+GzWKLI0sVupkuPLMKK5ka1kKL+pHwh+Eugw2Fp
+ ZWdzDqVs0CjVrvUN0tlfWXm/M0EWoL5yx3ESMsksdra3MavJF9ngkaBx3znLlpxp0Woxb5uWsqi
+ rRfJdKDve6vzNu61ellfx/qFXDudWWJqzlq6S+rQoPCuaXK6dSMXzuLd6sdVbRX6L8LP2h9I8H/
+ DfRLD/AIVp8aPiP4dt7S3tNf8AE/hPwj4V8XQ6fcTW1v8AZp9M8NeHviNqvxP1nTUilktb67tvh
+ 7CdPvrS6untbvSZ11u4/n//AOCofjTw2fizMvhe7stb0eO2Yao0cS2uoaHe2V3rGoy6XrdhdQxa
+ no2pi4N1by6dqVhZXqhEiEBDzrF/XH4E+Euj6PAZLG2tZdAvFb7Ta/ZoJYhuUfaVthMks7QtA8T
+ fuWRkUOtui+WZT/Or/wAF4/2bfCOh+JPgB8VtK8PaJaeGPEcniX4f6zq8ejaXFb2urfutV8P3F5
+ draxXEAWbUvEN3NM8hlWz0q5vLfz4rOWNcsujh1jcN9Yw8aMqfPCDo1ZNtOK1aqKfNBtXk1JWdr
+ I+YzfF1YYXM6GExOIrTnCm3GrTj7O8ZQc3CcVTUY6XleEm7WTVz+eCLxVceII9MgNrdfbdShtNK
+ gnluBYRWuovafbtCbMSs9iLq/tLobLiyMEd3eabKZL6FVt7L/RE/4IlfGHQfE/7DXizxbJey3Nn
+ 4X+LHi9LvAso52sIvCPgPWtKMNvakL5sXg3V/CttcxSItw2uRajC8sxkhK/wo/svfsL6l8U/iLc
+ WfiLUvEvh/wj4V1nStdttP0jTJbrXrt5WuhpWk6LqF9cRwx3t1qGnXRS0lsvtMEUaJDeRyXRWD+
+ mP9jn4qfCz4Lfsk+J/CPwNs/EHwZ+H3xI8V+PvCGqeF/EXjNvE+ux69Lonhk63feGtfuZbLU9Ku
+ Nc0280uae3vnvpdL1Oe/fTHWxa2S1efcX5VwxOWPqvEVpYanUjyUKUqk5e1jFRgk7KTg4wbS2S6
+ Xs/Dq8I8S4jhjFZ5Ww0aOBVTDr2tStSjyylLkpzqxbThTqy5owslKUmm1vb99tf8A+Cov7JmgeI
+ df8PeLvHlppmsaBqtzpTppt5pWp2N1BAI3jure7t9WkTlpZLeeBiGtbq3ntvnSJJZCv5rtX+H+g
+ X10J5TY3e6JdlzqXhl/EF3KHeSWTzNW09Vgu/KuJJoAzATL5RSUArgFfk78dqkm5QxValFtuNOW
+ Dk5QTaajJqnq4qybu9m76Jn5nLBY+MnF8zadr3jZ2a13Wj32Wl9Nz4I0/RPH2j6vD4Q8JXd5omo
+ 2gubOz8XajefbtC0zWomu9TvLWbxXaQyaJd2KiC5kSWSYkXjsqOrPNHD9F+EP+Fz634Iu/Ani7x
+ Z4d8DeGZbuKeHxRpet2eoW/jXWdPuBqHnwRW9vMLZJLeWWQyyypZ7DGIkggdS/y54a+Knw613xX
+ d6b4rudb8KaU2kXdsH0m4tx4TMc6SW1p4g1fR7e82xPf5hSVtLW5uhI5cx2/wBpaaXxb4n/ABR1
+ zS9UsLb4ZeI5/GU2n/abK208RXdjZaLp9y0QtbrRZLuXT5LmW5WOVPPkhu1g2ckMcw/XYmtnGPx
+ TwVCbwtScPbKpXg1Gm5Si+VST9naKvGUZWum7JNmFHDUKVBVqseeKcoxpxrJN25Vdr4k7tfC3zW
+ u9rH62+N/EHxH8Mfs1/H/w/ffEKf4hWXxG8L+HPC2l6QdFsT4b0DRmTxDpWozwxx380N/4i0y61
+ TTZrHVoyi2OmR63rRsbZ9Oa90v0DSvDcsX7P37M9zPbBYbL9mj4J6A1kwIntbmz+H2iW0/mW8jA
+ xTs1vMPlDSI/LFmdjX4/fs/fEP4xR6nrFj468M6l4j8OJBbXmu2Umr2L3n9nPcLDeW2mfbfEJsp
+ hqWnyXcF3bW1osssTbJpobBpDcfrN8LtUutW+GFjpd1fNf6h8Ptf8c/DBos7nj0Twj4t1WLwNLK
+ SGe4L/AA8uPCLPdSWkck07yShEaUIdKX9oQw1bA5hjKGJqUZxqUZ4apGLlFu/wp+5bmUXFKzVr6
+ 6n9A+EU8vxEYqOHdHE4epJYjmTkpUK0YunOV7ubU4TjyOOiSPnHxr4btLa4f+0J2mjltnit7dXl
+ aSCKTbIqmMlEjdfMSNUhjLbkZYpNihTiaJ4fsLHTJIY5kk1K4uFihlilkkuoXjjhJVVlMMiIiSR
+ usi72aJC/71vLYeg/FGOLSle7jBnae3e9uYoiqzwCN3BhmWMyeXIzXG5Y38hXaCQsQGZm+G7n4w
+ 33w11HxF4ksbIeLjdW1pp2h6fc6jFYQDN80GuXUjqJkivo9NuT/Z1zeQyoDAVmkiQzSJwvFShVj
+ RnOfLzQajKq3ZpxfvWd7NKzWvbSx/SmX5RhU4YmlRTavO8VaVvd91P/AJeOdvdsl7N2vqj+hD9l
+ /wAdaD8RPh3D8OJtcjj8VeHtFeR4pWvEjt7IP5LQvfyJDmWVUWW7ZWkit2uDGz4ZVHA/FzxzbfD
+ nTv8AhG/GMcdnezPc2+ma7K94kcqW0G6G4ivLYPI03kuFMcYdAkxhnlMO0n8NfCvxq1vwToniyL
+ wL4tm0XxZ430i1tNJu9dE1zHp0N/8APLDJaWOqR6Xc6laxC3iWN7+80pr1o5J5dQtBGk/u3wj1f
+ 9qH41+D7rwF8XT4d8e6do8tvPpfjnU/7P0uFwEEN2Y4tPv766jvJgs0csVpb6dpzyskC2lpPbSR
+ v62NzP67To0KFCpTrYfkoRablzK0W3JKPLy2SXPzKWuifTw8Tk2Chm2IqOryYavF4iUazgnCq2n
+ 7GnJSVRympcyqODgkrc10fb3w/wDFWh+LNaMNleWcd/p8iy3NzHNJE08cYlifzJY4BL57zp5qCU
+ x3FzBaK+Nw8t/uDwfo0ZtY7zQ7uS3QRxi9No0Nut3DFDmNQIVa1mbi4jlj2xhlIRUiEi4/F7wv4
+ evvAXj200e3vbqDTrmeKWxvNTuFEdwLa3mEjXEu6Hz4IA0dzBB5lxIEdo1Z0hXyP1Q+H3iS7FpZ
+ HVrwwra29tcWcB8s+c9xmR0sFklSTPmYiXfvdIZoR5aiFRN59LOqeCjKnXhaSlKM5Sly++uXl0d
+ mlG99bc1pLVHmZ9g42jPCTUoyVNKNr8yTSeqvyOOvM3b2lrLRH2X4c8U6hZWrMl5DFbJAomtWeS
+ BBc28cTMjRfOjvPaNsi83y2CxyRSnLpI356/8ABVD4JeIv2gP2V7jSbPS9T1abQvHmi+LdK0HTr
+ g22o3ksem6toLW1r5yzWUUzx65PLC0+2KCVDLOkYgEbfTJu1v8AUdMufPW2ChiLWRYwG+zRCaI7
+ N6uv2iScW8Jt4rhztRiGC+Sn01N4dtta8NR6tO1rd6jaJPMbEJbGV20zSZni8zcgm82G4ZLlJfK
+ EcMW4i4MQjkPBl+Z4jH4/mU5JUfepu9ku0nbotLx69Nkj80zHC4XBz5qlKDWKrxjOWivGT5ZNJt
+ NK7tyqzbs11P5jf2aPiRdfA79ozw38O/jN4Qji1bSPCvhnUW1K91q8haS58Q6W/iaCe4sCJ9Nee
+ 28Na5ocMSxu1xbudQt3w14tnplz4xeD/E/wD1eLwZcara3Okv4o+I/ibw9od5d6dBP9pufir4r8
+ PaFrFzeyyqtjJqXg/wAKeD7+LT4YYJYY7gy3hhgXbF9o/Fn9h7xB8Sf2mPDXxp8U6v8ADnwz4PO
+ pWpfQ/C+q3x8Z6l4esdAuDFc+Tbade6Zb6ZD4e8ONpd3cajq1teaeLG4ZNJWaG0sJ/wA3fix4G8
+ YftB/EPXfiX8YviLpXhyDVdevdQ0Dwb4OWeWDRfDlref6BDrN6kdy4vDa3LQXMltek3d0pu7ks1
+ xM0kcWVsLhaNOlj8ZRhSrTUoNU5VaknUjFyjQjGLqTfNy812lG+6YeJWbYXC8FYPIcrqc1bM5YW
+ ePjCsuSlTy+SlDmnzcsZVKlRWgldODbva5leIf2iPihDqs8UuoWes+WlukV7YLeana+QsEawwR3
+ ltfxQS/Z0AjZo0AdgZCXLl2K5OCT9mLwgbjRZtc8V3k1vd3XmSpYWJhBSd7ZVt/3U5FuyW6Swqx
+ jYJIAYk4yV8DGjkvLFRyDE1VZWq/2b/EVo2nfn+1dP/t569v5klLEKUk8Yk1KzXt4uzTinr1s3+
+ H3fKsvibQtP8B6fqNvDres6Zb6pC2l64dK0rQ9GvJLTzbprW20fUUuL3UrdFWPMl8m0XJdouLYB
+ MCH9o+803R0svE3hddOgvdUkvE0/TNR0vTLi9VkumsDqPkWQnmtnedT5cdykVqCY4IYlO1/H9S8
+ cal40A0TxJrOj6VCdatbi0u0e/tPC+l6dHCYja2WozvItmZYGLpGbWRZZJiUDTBkmwNOufA3w+1
+ qW+8U6Np3jCz1dZYNLnu9TGoJZmzu4YzeWEwtlguvtEzPOEaO2xaSAbEJLR/0Rh8spQpznjKccR
+ W5p1IqnNzfIuV8kal4rRaqy1bdk0ZVa6c4Kl7OnTceTRO17p3kmpO+qUZO7t9o9wsPiF8QtaS81
+ ews9L0/SNYmn0izhuNVgtrXQXUI0UXmw6bFcTXQtyoS6aOVQLd5WkPnFT+5f7C3xo8OfFD9nVnt
+ rZbDxZ4A8WSeA/GtlvaW9vn03wx4Rh0jxXNapawH7HqFhaW2gwPJNdTzTeHtRu52iFwhl/nU8Q+
+ NW1i9063iv7i18NteXWoWGn2WoJFAmoR3UbQrLbWbG30gjTri2hMW68kC27MHEqMD+pX/BMf48e
+ Hb9Pil8IbnTZdL8X6hqdl8R4L+dRJc6pp1tHYeG9egk164nhutUisWh8N3ui6VHpssVvbXvie9F
+ /C13JbngxmEp+yc44aFOSp81NRjyNRlKMb1W2+eShe90rOzWruffeGeazwXFGFprESp0capUK0d
+ WqlRRU6cVFpLmVRLlbXWS0uz9BvjtpEdt4Zv7uzvWE8lst3eSQKkr28EZmnkt44gHaBZoHmtXjV
+ zPtU+UIpfmP5LeNPE+mzy2/hPwnHHql0dSZLq6v7m0DWzy3tyhjaOKG4mjguWNzN5yu0EMk0ErO
+ WUuf1z+L+lt4t+HWuaNYyT2mrQQGXVkBlF0zWc8N00cLTb43Z3WdY5oIJ7YJsZA5CPH+MmvXXxL
+ 0/xtr1t8PvBGjXptrP7JJrOvS6j9pSZ7lo5pYIY7NVd4oFnC+RPHMttcCUKED28nw/sqFPG1Paz
+ i68or2UZT9nBRUY3leXuv3m1ZO7b3Z/ZWGxuKqUKFOlKUITlCnVnCnOpUtOSUo04w5pJO16ratD
+ vbU6bV/h/H5miJDqYuJ9O1HThO0UkRjsw8TI6yyRTR2wMnkW7yJcGeO4kd53LRKbUfX3hfzpND1
+ ZPB/wAQ9I/tPQ4475tP0/VHs9Rtp7SK/nns2lliWxkkW7NhaCBmlt1IdLXbdTTGH8pb34IeMjqL
+ 3Gt+J9TsDqEkrapc3MM1hGb6cLc3kayXl3NeXO95o8TCKQyFpZWw8ixN9a/B/wDYr+E/iNoZ7z4
+ sfEXT5lhhnGp+E9VtGMU0kSeXJGz6fbC2ijuixSdHvlXBwXUV2RjRoOMp4+hT9naXve9eTs+VtN
+ t7O3TW9ur9TNMph9WlNYWcFKcX7WeMoRmoxpxT5YRjWm6c07zvytNu0rvT6H0X44+LH1Cx0jxQb
+ i+1DTRbPbajcpbTNusy7wSQtLGsclvf2FtcLOIkt5bcp9sDTXJhjuf158Aatb+PPA+ieKreNLCS
+ 70OyvxaRtK63M6x+TcrEs0KyTSuLeFowkUMxM2yYPJsnX8hYv2GtI8MagPE2i/Ej4h61cxfZTLe
+ eL9Y1LVpL6JZEjsFuXsmgaCFbaSSGFJLEoFDJIY3jd4/0v+FN9H4S8NaTpGrxXb3Fnpn2eyWNpV
+ LXMkU1yXgKNCsn+km2crPlNrmIuHikVvkOI8aq9ehThCjOMm5PERjye091XjJK9rPa+slrotvhv
+ q1SjSqqVec3ztxpNynaF1yNzlyuz3p2jrLstX9RD+zotB0zU9WuI4NS0p4jZpIVju3l+ziFI1jM
+ ckjCWaWWzYWzMNzSWigoS8/1jpvxIt7T4O+K/GViJ7rxJoHhvUZ7DTYhZ+de3w0mWzgLW95slZT
+ 58VzIGaGJUgeV3igSa3f81fHPiuXUdKW3vLc2j2j262u/7YiOiiO3tFWGCNLbAvFaIiV2AceW4S
+ NAD9J/s/Xia3Y3Hh1Y57u/cWF1PG0t3M0MCiC8mt5YyWtkI0zTb4pHLD9nE7fMscziZenh51KWK
+ oOnyxjJNOUZe83G1pKLTu735dErtqx8fnOHpyoRlXvJ0cTGryzvG9pRfLJRa952tydtbq2vhGqf
+ 8FFPhJ+0h+yN+0Dov7Id/cxePZLC28Oebe6V4g0bRtC1PxFeadPr0klrqVhoOrrawadZ6jImp2c
+ Wp6LoTtHJrrW+nXLqf5ldZ+Kt94N8M+KNM8XeLr3xR4u1G/t/tq6DYQadGLmMabNaWI0+y+zwRQ
+ BVa4a6EKPczOrz2zXhllftPB/gLxf+zP8ADz9s7wvoWoPpvjHxH8X/AAx4C8F31tdto8etDw7qf
+ iPUPFVpCNattOub6LR9EuNL1XULXwlBc39rcav4b099bg0zxLul+KdR0620DxTa3fxe8XeILrxB
+ rElkIfDdyY23STSpbW11rF5dXmoJqsbLHMZoYHRI22+bcKEKP9rm2X4fMMdThiK1OtRo06M6OGp
+ 0YSx1adPkrySkoN06b5mpP3U+S8n0P5w4ux7xGLjaMaGIXP7alSrTdGL9o4Ll56kp89RRvKLb5b
+ u19DbPjD7cz3WmeH9Ikt5ndn+1X2pNcR3G4iZJjbJHEZNw3OQGYsxLu7Ekld5pfiCweyjfwpBJY
+ aQZLmONH1FLVbma2uZrSW/ggACR2179nW4t9gCtE6vgMzUVzSzDD05SpxyxpQk4pOq01yuKs10e
+ iuuj0v1Xxvs119jfrZu19Pw1/B9jxu68eaj4a06e11Dw34ZvPD5tbA3MtoRFcyQyyLPJ9quHuL1
+ Ctsv7qa3QxSRtEjmRfLiU+Xat4rsbzUtIvLDT5bz7FeXFzbWFhalIY4Z4pni+yX08F2RJHMInkI
+ tp4HBdkiBVSO+8Mr4LlsdV8NXHiXQrk36T3FjBPNKmowCRmSK3Y6laQlpLmOaRHWLBWFLfEgbza
+ 8z1yxv/AIZarp2k2aCW8nSSWSeQ201va6deKxtEtklgPmMVkjnLI0iAnaWJAY/omFlQU3S5J+1j
+ DmXOpU41YOK5nr8LaWln8T6NlVHOcIuTUYaKPLb3OZ/C2km7vVK7SXZmBca9ex3Usq2X2++1HUJ
+ r4XX2ZTp1vfXRjupopYRbxlpFiCqBbvGkaKqNDhlA+nvgP+1NYfDj4geEPEEmh3raz4V1CZNSsm
+ ukubPxHol7YTaXq+mrIi2hsL06Vd3cWkyCSS2trxoJGhk2N5/jOqwyaT4Shuvt9rcX2q3qyFpU+
+ wsXntBeGCy8mNvKlnlXbAJiqvBGy+ZgKg888M+NJLfxN4e1uHwtFdRaHrdvfavbwLNLcalYWVwl
+ xd2TlWYQRS2ktxDM8ZIKJufapCrWIhTxmHqVFTdqClGFqvIm4pK1paOMrcqTulffqb4DHVsBicP
+ iqEoxrUakKkG1e0k4SjbZuSavdPybeqP7IPDfinwx8SPB1l4k8Bavp2v+HNVsp/L8Q6YYhZalNI
+ Z1DswuWvLaa0vJLiy1GK9T7Vbz2txYXNvBdebbQfJV/o1vYyasI4rcyWGuXkN4REIomgL+ZbpbA
+ TTiYCKILHb3E5mjgkaV57lzvk+W/wBmS48C/Cv/AISvVvhr4z8TH4ceKdPvPE914Q1a/wBMvdAM
+ y6ekEc6RSWFtqGm65Jf6esEVxaTzytAtvFfJewW6xzfSGs/E7R/GVpLr+i3FjagXFq11bNcaemq
+ QLqFkmppDq+nRrNPp88tqbpYUleWNrOeCVF+wpNcj8jr4jCZnicRh8LJrE0IQqqFajKnNQ9znir
+ N80oO6kk2tU1umf17wD4g4PM6NKlXaw+LSUK1KUrxqziofvKDla0dFJx+J7d2fK3xu8N3es3qXt
+ iu6BJXfZHBb71aIMELR+ZJGqL9ntFYM1scozqpT5a9s/Zd8PeLvD11ZajNJPcK32ZzaSWdlJHFb
+ qYAA1u0y2jSwTGR1lZwzotvJL5xltUXwzxd8Tobi8tCqtbQ2rXMt/BBbQzW13bo1skc6Mglkjju
+ PM86VsIzt9klZ4kiYNd8HfGv+yNbSeedprSOX7XNpYg+0W7ywT28UMMqywCSEyMGnnKoiCONGtp
+ zcSER+VPCYpz5Ksm7y5lywbdtLWbTstGmuqs9T9Ix+dYGpTlKNanOcnF2kmop8sfe5bq8WlblWt
+ 0+VH62XN42o2EpnngOk3QOnwW93b2G23lF7G1or288jJE7b5bMLGt5GqyyB4JiJI5fQfDUdnpel
+ aPp+oxLJeyaaXsLiNI44VERHkkjUJFiRDb38O25t58/LA9zCkypHXwv4O/aB0+WXUJ5pYHillll
+ kjnxZSIbqBZkaO2vY57ydo/8ARfsUcNtCqyq1tLJHELfy9S4+Pmh6DqVxZ+FbybVdfuC9pdX+rx
+ k6fosciP5rQxRFnOpteFmbSNKTzYna1NxBA880y8dXA1FT56rT5buLlFrot+ibbTejdz4yrmEsR
+ XtSd03GLcJXSV0nok27pNJX9xK+lrn178Q/H3hPwyjw388CavCJbKLz7qSWGETMbSNJpJh+5VZ5
+ 4vLnERk82ZbO1JnuzFJ9hfsd6rdQWty+t2K6Zq+t2htrC5lliWaPw9NLDN/bF/NKIbyDUNUto7J
+ YNHMJl05B5LefbNfuv40aHrivr3/CR+Mdmo39xeLe6Ra3DWkdxaSSI1m+satuBhNxbWkkrWqy3M
+ MFis8kVrHLczRz3f6j/sRaV4//AGjPFV9pPguyMHg3wtqekw/EL4qXaW+n28E3n213feFPCNzJY
+ 6imo+KLXQrme8tNNuBeWmiWM1lceL723ude0eHV/T4dy7McZjMLQwlKVablGMVGLSinyNuUnH3U
+ lduV7J7nPn1TLcFlWLxOMrU8PCMYuVSb96MrRSpwTS5p1HZRltdNOzaa9K8Wf8EuR8X/AI5PZ/D
+ nx7rnw6Txmmj+LPEPiLT/AAdquuWNjbCZdA8V3BvL1dF8AXGrTLpaG30+58T6l44uUk06+j8OjS
+ tHW8m/GP8A4LZf8E3F/ZA+Jvw4k0aHx78RP2Z/FGl6ZcX3xM+JA0tZvD3xFjl1+DVvAs/iTwlZ6
+ HZ3GtTWmlDxb4ehn0TRXv8AR9V1DTbKz1f/AIRXW9UH9wHh/S7DQdA0/RvCthFp0/w+u3u7YBpL
+ 24vtIluoxeGWR0bVL66S5E1zN9supo4GuFSWd7dI4Y/Dv+CmH7J2k/8ABQf9hj4x/BPQ9Oik8cX
+ Hh+78ZfBy8mmt9PlT4weDbfULjwlbXN3eXFhZ6bb+JLqPUvAeuX99dNBYaB4s1i8iljuYYbwfvt
+ TgDKqWHjiFQUM3rwcZ4+FWs61LERpxUFTnKS5Icto8sUtLvofyHmWLpZli8TONrSm50m006kE00
+ 3o1FvRSV+qu3uf5pdt43SKNrLwD4SsIPDelySaZai9+33NxLJZsYpJ2e4kWRUkGwxR7QscYUAvy
+ 7Fd7p/wP+P3w4jvPA+pfCp7PXfCmueJvDXia11y4nsdVtPE/hvxJq3h7xBp95bNewbJdK1TSrnS
+ chXVlsVYSPngr81rcPV4Vqsf7Kq1eWpJe1qSrOdS0l78m95S1bfW787eP7SC0dTDpqys4STXw6N
+ X38vPz0/L3T9SRtYuL67MdncC8EjbEuppoVj2otvDJbsAkRYeSciRmB5wVVm9A1bxpqusW08enP
+ DeSXbW+mWTXiNeXMdvZyM8lwtxdM0dgkEcUMARJJFeGYOhRcRp4uySKZP8AVKXP7yIskYV97Bdm
+ WA/dkhgyOwAOJDguhdCkvkSkKht2ISWYsuY+UZmRd6vkhVJUA+ZtRSD90/qU8PCcozd/daSStZq
+ PLdO6vutbt6ab6hGUle2/lddr3V7W+XbsfTHiTwzq/izQbfU/+E1Elpp9vBZxWq6dcJZwvDaSTp
+ am4t2WCSQNK8IuEikKoxWUqhqH4GXeu22p6jpUR0iwdkgudPbU7YXVpdNG8kVzp8Er297CH1OL/
+ RZJ3aK4iLh4ZVZ5Q/z3a6hdWsMNrvzZySu8TLcSW4Wdj5RuGI37fLBZd5iDBGJDA1++f7GvjH/g
+ mroXhOx8IfFr9hnxn8bfilZaPoOo618QNb/ae8e/DzRbjVPskk99a2mheBLL7JZ6VDeR3V1Zs+n
+ 397P5qQXNwkcS/aPPxGEksLXw8pQdOon7OUkoRhG6b5rJyezUm+bTbqXFKU49+VLaTk3ZJJWi9O
+ u3XR7NcJ8OdSs9X1Hw7pmiaZ5aizuobfTYrki3W5t0uLx4LmWd0t9TgPyy+ZM0ZjiZUhAURRH2n
+ 4jfD3xh4XfQvG9gIE1CWfT9V8UaJpejRRP4o0iOaO5bRbwieJpFjkjs7AmCV54VgOo6ZLbXVvay
+ RfZ/jD9tf9h/4M6Bp2r/AAw/4JKfADUtYW7+x6Avin40+PfiZMQd9wb2+tPEfgSW7vIY5oIY2bf
+ bhZWkVWZiip4Yn/BX/wDbB+IOu2+mfDf/AIJ1fsy+C9K0xJIfDg8Gfsor43ljT5MWMOt+K9M1nS
+ juR7aJ5E0WBVUtGIgGVz+OZhw2sLmFLMf9Ysny9UHKdeNTFUoSlT5uaSk606aSV07pe7ZNbXPo8
+ PPGwhFUKWMjXjVw9SnUoRmknTUHFtJR0as4u+sbJlvxb+xBqXjFG8T+DvG8tjaTaRHrOnaDrWgy
+ W802i3en2F3aRPPaX00rSx2LztJ5VpHat5siIQgKt8N+Nfgt4v8ADGoTXc+rSanfQrM8Gn6dcz6
+ ddi6j8tYDDH58LTym3hWJPtUotojeSSShAqSt+y/7L3xz/aN+ONjrPin9pD4IeKfhT8QtL1aDQ7
+ e/1r4aad8KvB/jTQNSXUk0i48N+GdE8L+C/D2lS+HNK099H1W20jSViuorLStbu9QvtW1zUAnIf
+ GHwRJFrV/ex28JvYbe7vZbZYt0A8sSmRGCSEbxbJHKxmuJlUnBcBpIj01qrlBVsrxmFzKFKr7Ge
+ JwkqWJouaUHPlqUZTi2pfZ5247M/rXhmOAz3K8HXxSq0qmIw1GrKnOc4ShXpqNOsmpcvvqUW4w6
+ pJpao/Knwn4C8cefLc3ut3dqJopJru0FxcRNbRqJJnklnSeW9huEbbEpsZLULHHFaSNIRvHp+h/
+ ZfDhk/syRr+QrcQza3LamWztQ8+0yWFk7oJrmMM264uCsV2sjMl1LIojku694juG1Way0qAzXKQ
+ zKLYqFtxJM6s4iiYw8rKg8p3aV/MZAScRbfXf2UfgCv7VX7QPhr4E3HxDs/AY8T6ZqmsandyRTa
+ lq8+n+HtL1DWLnSfDmlO9kt9r1zYabqNx/pF0tpZaZperagsWptpb6XqPTlmQZhnuLpYf95Wq1F
+ KXs6dNqNOMOVylKK1UIR96UmkopNvXbbHYjKOH8LWxtWp7DD4dT/euzblaNoQd1KpUm7JxV2ret
+ /bP2RP2bfiR+2t8Qbv4f8AgvW7rwf4F0nYPH/xYvdIm19dLubzTNUvNM0210+3utPj1TWdRFncm
+ OGS907RvDljDLc313BdT6DoGt/1WfsZeE/Cnwi8F618EvCmg22g6HoUi6zMkUA3jWYreDQvF0d9
+ qolvW1e6i1fSbG6utT1OW+u9Th1S0+1zXLRvXC6H8IfCnwT8F6L4T+Emh6V4a8KeCxaJoos9CtL
+ 7UNIglZTK0FxPLa6pPeXOok3uqeINVnv7jxDqzTt4sa+kubq5uuv8Qa7H4L+JPhTxvosF1p/hXx
+ THpera0+ovNazwaJ4nvbaDxbJdWjNKq3mn6ofC2p3kcsAa2P2ktNbFWkn/AKT4a4OwOQ4CMaK9p
+ jK9OLnXdNXVSny1JU4NJuNOUXbq7xuz+UeKuOMbxXjZ3nOhl+HqSjh8KnaLg5WhUqLRS2UuZ3UF
+ 8Ot+b7Gtr+a2uIzqMjw6RatNaySD7ZDFdWNwEtTulgVllklt7hb7IRw0kClJVmW3uR1/gPxXDoM
+ 2reEvE88VgumzvcaJdP8Auo76yeATSCDJkWQOsZuIDujkdmnV0810ReGu5yIprXVXjtdLgjMVtd
+ RyJA16ojkayDXME6TW7XFnJOZWhFuGCTIMRs0Unwp4D+Odt+1B8dfsvhbxB4QtvD/w5uU07T/+J
+ zpMHiHxLpvhfUVh8RfEXVfCt3pbeKrKwu5tR0zw14W1BdTWGG2hsfEiawl14hfStN+io4GWNw+J
+ nJuNGjT56s2rKM7RdKPRtyd1prZNrY+O55U6tB05Pn57Wl7qdN2U7pK/LFNOLaV5K27Pzg/4KO/
+ 8EVf20/2v/wBrf4jftCfs5fEb9l74bfDH4gWnhW8tfDfi/wAQfELw74hfxFZ+GtNsPFet6np3hf
+ 4MeOtCa717X7a+1W6v7LXZJNUurqfUNRifVLm+vbwr+n9PGeiWkFraavfWcd5a20NuwtblbqJki
+ XaHNxLdXU80hbeJZJ5mmdwzSAMTRXhRzCrTUaccFQqKCUVOdCLlNJRSlJvVt6Nt7tt9Tv8AZU2+
+ ZzrXbu9La+63py6ar8fI/wAUmKeK2uDct5Fy0cuHtLq3Z45g6kyn95HhNshIKtsfI3L/AHKlutT
+ tblAo0mzgbcheSHcrsiZBQEAKjONu6QKWJBONzFq33gg1601XWLqGK3uk+0lI7GNbe3Bt7eCRD5
+ ZEjEsdyuWkJZWJ4cK6/Un7MPwB8C/FnX/FNn4rm1/7JoVzokdnb6ZqMFkjjVUuDcG4ZrGeV2Tyk
+ EJjkiwBiUSjp8bUnGjCpOXM1SSTtZuzinaKbSe93drXpojgp03UnGnFpOVknJvqrpt+89lrvr5H
+ zj8I/CFn8QvHeieDtRj1m4i1p5LG2Giz28V1bXk4At7lhdWd5BJawyYa4hb7KHG0m8gVTu/cD/g
+ j54n/AGVtC+JvxUh/af1jwm2jReH9IfQ774irDbaV/bOkza/H4htLQPavbX7LapbNJALi4LxLE9
+ utwpcL81+NP2Z/hl4G+O+keENEh1o6MdZ+FN6yXmoQz3DPrVh8RhqMJnjsoCLe4bRLKRo1VWEgl
+ fflk8vrNG/Z3+G6XFjdNa6pLDdfHvWfBkmmy3yHT10G2ktYlt440tUuEkeG9mieX7SSF2mMRybn
+ b4Pjvh6l4icIZvwes2zjh3+3MPHDf21kuIjhs0wKVWhVU8LWtJQk1B05OzvCclZ3sexleNeU5hh
+ 66w2HxVTDzlOUa6lKnVjUj7KMZxvZqm25xVleVm3pY/qr1D9tb/gnd8F/BEHjf/hIvA2ieA3uxp
+ mk6r4Q+FviGWxW6ngOoJYLP4f8GhJ5pLSKF1CyTKVQIJEGTJ8+6t/wXY/YXs7s6V4X8ReK/H2pC
+ OQ6Zb6B4B8T6Uv7tXkkaI6/oeiRso8tCiFH8xowEUs6o3zZpn7KPwo+OXxl8YfsueJotf0P4OeG
+ dM8MeJrHw/4T1K2sLqXVLbR7OZXudU1XT9au1hlabE0dk9mXSGBFdVQhvuX4Ef8ABF//AIJ/Wfj
+ DR9d1j4Va34wudI0LV75LTxP488VTabfyR6Xqd6sOpWWkaho8dzam7RJZrZDDFdKDb3Sz2ryQP/
+ nPnH0VPALhrjfL+C+Mc68Y+LM/znGYPC08wlxBl0MtVXGVIwpSxF/Y4xwjJt1XTi5NP3Yttn6lQ
+ 4pz7FYKWLwOHyfC0KUZzcZ08RKty01BySSbpttJct3ZO3RI6P41ftMav4x+FHw4juvhD4m8G6l4
+ 50G2+KviHVfHE9roNz8KPBASeXw3c6zbXOmyaVc3Hinwnqn/AAmN48Gqrf8AhbTfI8PapZrq15r
+ Fvo3xt8RdQ1C60jWrWMRHxHeaReWZu9rGAs9hcfvDHLGsat5SmNMwKUmRDKI33BvRP+CoEl5q/h
+ 57nU9S1G81bX3i8S6rrktyRqt1I2qaMbTRjJGqWqeH9M/te5NjpqWgxMBdXU11eXF/cXnzP4S1f
+ Ub/AOG/gK+vbqW5vtQ8L+G4by9mdmvJ2Nolq9xJdZFwbiVEDyOZNjSFjsCsUP8AduQ+GnCvhJw3
+ knCnBmDqYLJcLUnThSrV6uIr1quIn7SriMTiK06k6tWdSU25PSKaUFGMYxX6J4e5piMzp43641U
+ q06CzBSXuxjCPJGdOmlZxlblUZKyurvVs8C/Zn/ZV+Kn7Q/xDn0LStN/sPwp4deXU/iN4+mCWmn
+ aNpccEtxJALq6juVl1HVntYrG12W94tlJdx6jf2y6XZ3zn7w/bZ+Bd1+xx40/ZX/ah/Zx8N6z4d
+ 0/wRpfgbwv4h17VYJPD8Goa34eh1rS9atvGNjZJYX1sPF7WOm2l1p9xe28Hi6b4heOJ7U3aalez
+ L+9fg/4JeAPgd8O9A8IfD/T7vTtPsb4anPeTX0r6trGsaxZvqWoazrV7bi1F/qE15plhIrNDHbx
+ RWsFnFbpZQxWyfN/7Wvwi8D/En9i34neGtb0+7stI0HxPH4r0i20fU7+AWWu6ZqVjpen3g+2z6g
+ twlmbufUbeyu1uLGPU2FwLbylWAf1j4W5Lg8kq4HE1ILE4nMZU8Li6jS/gY5Kl7OnzNNRg2nL4X
+ JXvpZH4F4k8YY3Pcdi8BS58LluX1ZTw9DmvJ1ab/jVOV255WaaTcUrJaq591S6lp/jvwloXjPwn
+ eRav4H8TaHp3iGzZbWW6g1rQPEenW+qQ3SRND56W1/p1xb4iuHjiuY5Z7S7W1m824i8Z8W/DyTx
+ n8Nnt55ZIbf4f6zqM81jpcV9p7L4O14XVrremW13qomuWjtLqOfUEiF6kem29nYQpBNYwWEl55x
+ /wT68Qa54q/Yq/Z/udc1S5vJ4tJ1jw4sm23gDaT4W+JHizwj4et5ooII4bg6X4f0LSdPjknika6
+ js1OoG7aW4M30/ozxW3xL8P2BtLS4s9fs9U0O/tZ4f3Bsf7I1nUnCxQtCksklzoNjg3a3UdvG1x
+ HZx2yzHb7WKi8vxmNwMW5PBY+dKE7uz5KkopNO3uyhpJW0vZbXfwGGkpShV1/eUqaktLc00pKy/
+ kTSbV9Wj50+Ivx0+Jktp8M/hF4N8Iz/Ea6mube0+PWqyT6jDfeBvh9a3tj/ZV/Z2sVkYvE/ibxb
+ oT6hrUOjQ61e3Wo6bpVxpVxbWlx4v0XWNO+4vCHgXwp4I8OWqaVotldwajYCS1u9MFsFltLvybo
+ LLqVhbRwXFtdxPDdzPA9wt9eRSTS+VFceav4Yfsc/FTxx8WtF8P2XiDWTptt8RV0TWfE8eg21tb
+ G6u5Z73TAkL6jFqjw2sGiaNpmhWtqWeG30u0SKJVnknuJf2v+DXh6x+D2p+GfhD4Yaa98GQ2Gs6
+ jp1trotry80d4NQWSe30u6s7bThBbahe3t1qV6ssU8zX0pe2mtoVSBeziTK/7OwNCnTqckZSlKd
+ OnKTjXm4e0lUrSfK/cuqdKnGDioJNyUlqsrxyx2Mqt03zOU4qc3rGNPkjypLmfK373xW5n8NrHd
+ XEnh3QjHZ+NPEehaJq0kf2mGxk1uGzcafJJIltM0MqWrgzNFM+WhUgEISShort9H+F3hLxk+r+I
+ tdtZ7nVL/Vn+0zebGQwgsNPggVVmhmMaQ28cUCIjKgSNWKmVpJHK+CTw9k3VxKejajCDSel0m6q
+ bSa0bSbXRdPa9rUvpCm1fRylUvb3bXs7X11tpvbRn/9k=
+REV:2008-01-28T15:50:16Z
+ROLE:Software Developer
+TEL;TYPE=HOME:+48 91 3 177 6584
+TEL;TYPE=WORK:+48 12 617 23 34
+TEL;TYPE=CELL:+48 691 723 056
+TITLE:Chief Information Officer
+UID:BHTRsCvcmd
+URL:http://www.kde.org/antonipage
+VERSION:3.0
+X-KADDRESSBOOK-BlogFeed:http://antoni-kde.blog.com
+X-KADDRESSBOOK-X-Anniversary:2008-02-15
+X-KADDRESSBOOK-X-AssistantsName:Asok
+X-KADDRESSBOOK-X-Department:Knowledge Management
+X-KADDRESSBOOK-X-IMAddress:antoni at kde-jabber.org
+X-KADDRESSBOOK-X-ManagersName:The Pointy-Haired Boss
+X-KADDRESSBOOK-X-Office:3.10
+X-KADDRESSBOOK-X-Profession:Software Developer
+X-messaging/gadu-All:452342
+X-messaging/skype-All:antoni-kde-skype
+X-messaging/xmpp-All:antoni-kde at kde-jabber.org
+END:VCARD
+

Copied: trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/vcard-antoni-outlook2003.vcf (from rev 976, trunk/dna-repository/src/test/resources/docs/vcard-antoni-outlook2003.vcf)
===================================================================
--- trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/vcard-antoni-outlook2003.vcf	                        (rev 0)
+++ trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/vcard-antoni-outlook2003.vcf	2009-06-04 22:31:30 UTC (rev 977)
@@ -0,0 +1,22 @@
+BEGIN:VCARD
+VERSION:2.1
+N:Mylka;Antoni;Jozef;Herr;jun.
+FN:Antoni Jozef Mylka jun.
+NICKNAME:Ant
+ORG:DFKI;Knowledge-Management
+TITLE:Intern
+NOTE;ENCODING=QUOTED-PRINTABLE:These are some notes about antoni.=0D=0A
+TEL;WORK;VOICE:49 631 234 341
+TEL;HOME;VOICE:48 691 342 341
+TEL;CELL;VOICE:48 91 3 175 234
+ADR;WORK:;3.10;Trippstadter Str. 122;Kaiserslautern;Rheinland-Pfalz;67663;Deutschland
+LABEL;WORK;ENCODING=QUOTED-PRINTABLE:3.10=0D=0ATrippstadter Str. 122=0D=0AKaiserslautern, Rheinland-Pfalz 67663=
+=0D=0ADeutschland
+ADR;HOME:;;Budryka 2/1110;Krakow;malopolskie;30-072;Polen
+LABEL;HOME;ENCODING=QUOTED-PRINTABLE:Budryka 2/1110=0D=0AKrak=F3w, ma=B3opolskie 30-072=0D=0APolen
+URL;WORK:http://antoni.mylka.com
+ROLE:Software-Developer
+BDAY:19800118
+EMAIL;PREF;INTERNET:antoni_mylka at somedomain.com
+REV:20080128T135515Z
+END:VCARD

Copied: trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/vcard-dirk.vcf (from rev 976, trunk/dna-repository/src/test/resources/docs/vcard-dirk.vcf)
===================================================================
--- trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/vcard-dirk.vcf	                        (rev 0)
+++ trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/vcard-dirk.vcf	2009-06-04 22:31:30 UTC (rev 977)
@@ -0,0 +1,8 @@
+BEGIN:VCARD
+VERSION:2.1
+N:dirk
+FN:Dirk
+NOTE;ENCODING=QUOTED-PRINTABLE:The canonical Dirk=0D=0A
+EMAIL;PREF;INTERNET:dirk at sap.com
+REV:20071109T104602Z
+END:VCARD

Copied: trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/vcard-rfc2426.vcf (from rev 976, trunk/dna-repository/src/test/resources/docs/vcard-rfc2426.vcf)
===================================================================
--- trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/vcard-rfc2426.vcf	                        (rev 0)
+++ trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/vcard-rfc2426.vcf	2009-06-04 22:31:30 UTC (rev 977)
@@ -0,0 +1,26 @@
+BEGIN:VCARD
+VERSION:3.0
+FN:Frank Dawson
+N:Dawson;Frank
+ORG:Lotus Development Corporation
+ADR;TYPE=WORK,POSTAL,PARCEL:;;6544 Battleford Drive
+ ;Raleigh;NC;27613-3502;U.S.A.
+TEL;TYPE=VOICE,MSG,WORK:+1-919-676-9515
+TEL;TYPE=FAX,WORK:+1-919-676-9564
+EMAIL;TYPE=INTERNET,PREF:Frank_Dawson at Lotus.com
+EMAIL;TYPE=INTERNET:fdawson at earthlink.net
+URL:http://home.earthlink.net/~fdawson
+END:VCARD
+
+BEGIN:VCARD
+VERSION:3.0
+FN:Tim Howes
+N:Howes;Tim
+ORG:Netscape Communications Corp.
+ADR;TYPE=WORK:;;501 E. Middlefield Rd.;Mountain View;
+ CA; 94043;U.S.A.
+TEL;TYPE=VOICE,MSG,WORK:+1-415-937-3419
+TEL;TYPE=FAX,WORK:+1-415-528-4164
+EMAIL;TYPE=INTERNET:howes at netscape.com
+END:VCARD
+

Copied: trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/vcard-vCards-SAP.vcf (from rev 976, trunk/dna-repository/src/test/resources/docs/vcard-vCards-SAP.vcf)
===================================================================
--- trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/vcard-vCards-SAP.vcf	                        (rev 0)
+++ trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/vcard-vCards-SAP.vcf	2009-06-04 22:31:30 UTC (rev 977)
@@ -0,0 +1,292 @@
+BEGIN:VCARD
+VERSION:3.0
+N:Brown;Gwendolina;;;
+FN:Gwendolina Brown
+EMAIL;type=INTERNET;type=WORK;type=pref:Gwendolina.Brown at sap.com
+CATEGORIES:Demo,Nepomuk(SAP)
+X-ABUID:07D43ED3-2026-4769-83C7-94726573A70D\:ABPerson
+END:VCARD
+BEGIN:VCARD
+VERSION:3.0
+N:Smalholtz;Peter;;;
+FN:Peter Smalholtz
+ORG:SAP;
+EMAIL;type=INTERNET;type=WORK;type=pref:Peter.Smalholtz at sap.com
+TEL;type=WORK;type=pref:??
+CATEGORIES:Demo,Nepomuk(SAP)
+X-ABUID:4B505D70-F921-4C8D-8878-34302A6480BC\:ABPerson
+END:VCARD
+BEGIN:VCARD
+VERSION:3.0
+N:Krull;Kristina;;;
+FN:Kristina Krull
+ORG:SAP;
+EMAIL;type=INTERNET;type=WORK;type=pref:Kristina.Krull at sap.com
+CATEGORIES:Demo,Nepomuk(SAP)
+X-ABUID:77FB9B89-A196-46EE-AC61-CCCBAC872235\:ABPerson
+END:VCARD
+BEGIN:VCARD
+VERSION:3.0
+N:Dreger;Rutger;;;
+FN:Rutger Dreger
+ORG:SAP;
+EMAIL;type=INTERNET;type=WORK;type=pref:Rutger.Dreger at sap.com
+CATEGORIES:Demo,Nepomuk(SAP)
+X-ABUID:4C5B2EFE-BF04-43D8-BAC1-56FE9FFA5F3D\:ABPerson
+END:VCARD
+BEGIN:VCARD
+VERSION:3.0
+N:T??cken;Frida;;;
+FN:Karlsruhe Travel
+ORG:Karlsruhe Travel;
+EMAIL;type=INTERNET;type=WORK;type=pref:Frida.Tocken at karlsruhetravel.com
+X-ABShowAs:COMPANY
+CATEGORIES:Demo,Nepomuk(SAP)
+X-ABUID:525660B1-1332-4980-93ED-A50AFEB5609B\:ABPerson
+END:VCARD
+BEGIN:VCARD
+VERSION:3.0
+N:Bernadotte;Ulla;;;
+FN:Ulla Bernadotte
+EMAIL;type=INTERNET;type=WORK;type=pref:Ullis at yahoo.com
+CATEGORIES:Demo,Nepomuk(SAP)
+X-ABUID:6BCC314A-2460-4B8D-ADBC-52A6DEA79AFC\:ABPerson
+END:VCARD
+BEGIN:VCARD
+VERSION:3.0
+N:Aubrey;Albert;;;
+FN:Albert Aubrey
+ORG:SAP;
+EMAIL;type=INTERNET;type=WORK;type=pref:Albert.Aubrey at sap.com
+CATEGORIES:Demo,Nepomuk(SAP)
+X-ABUID:DD3883AB-279D-488C-9147-3844BDA78968\:ABPerson
+END:VCARD
+BEGIN:VCARD
+VERSION:3.0
+N:Meyer;Helmut;;;
+FN:Helmut Meyer
+ORG:SAP;
+EMAIL;type=INTERNET;type=WORK;type=pref:Helmut.Meyer at sap.com
+CATEGORIES:Demo,Nepomuk(SAP)
+X-ABUID:5D61771B-EB5F-4955-AF20-696598E445FD\:ABPerson
+END:VCARD
+BEGIN:VCARD
+VERSION:3.0
+N:Andriotti;Marco;;;
+FN:Marco Andriotti
+ORG:SAP;
+EMAIL;type=INTERNET;type=WORK;type=pref:Marco.Andriotti at sap.com
+TEL;type=WORK;type=pref:+44 28 90930084
+item1.ADR;type=WORK;type=pref:;;Shore Road;Newtownabbey;;BT37 0QB;United Kingdom
+item1.X-ABADR:se
+CATEGORIES:Demo,Nepomuk(SAP)
+X-ABUID:29B73432-E9DF-4381-9EAA-E0328AB34DA7\:ABPerson
+END:VCARD
+BEGIN:VCARD
+VERSION:3.0
+N:Spa??lund;Ingrid;;;
+FN:Ingrid Spa??lund
+ORG:Nike;
+EMAIL;type=INTERNET;type=WORK;type=pref:Ingrid.Spasslund at nikesport.com
+CATEGORIES:Demo,Nepomuk(SAP)
+X-ABUID:47E30CAB-175F-4CA8-A193-D630ACC282C2\:ABPerson
+END:VCARD
+BEGIN:VCARD
+VERSION:3.0
+N:Atkins;Adam;;;
+FN:Adam Atkins
+ORG:SAP;
+EMAIL;type=INTERNET;type=WORK;type=pref:Adam.Atkins at sap.com
+CATEGORIES:Demo,Nepomuk(SAP)
+X-ABUID:C30E59B9-2C00-4160-91E4-9730FEF2A5EB\:ABPerson
+END:VCARD
+BEGIN:VCARD
+VERSION:3.0
+N:Williams;Martin;;;
+FN:Martin Williams
+ORG:SAP;
+EMAIL;type=INTERNET;type=WORK;type=pref:Martin.Williams at sap.com
+TEL;type=WORK;type=pref:+61 7 3259 9599
+item1.ADR;type=WORK;type=pref:;;133 Mary Street;Brisbane;;QLD 4000;Australia
+item1.X-ABADR:se
+CATEGORIES:Demo,Nepomuk(SAP)
+X-ABUID:DC826FA6-C7D0-4600-BFA0-45958CDCA851\:ABPerson
+END:VCARD
+BEGIN:VCARD
+VERSION:3.0
+N:Stern;Margit;;;
+FN:Margit Stern
+TEL;type=WORK;type=pref:+4978432748392
+item1.ADR;type=WORK;type=pref:;;Brotmannstra??e 7;Siegertsbrunn;;85635;Deutschland
+item1.X-ABADR:se
+CATEGORIES:Demo,Nepomuk(SAP)
+X-ABUID:459248A9-DB7D-4C72-AC02-A765C277F942\:ABPerson
+END:VCARD
+BEGIN:VCARD
+VERSION:3.0
+N:Fuchs;Frederica;;;
+FN:Frederica Fuchs
+EMAIL;type=INTERNET;type=WORK;type=pref:Frederica_64 at hotmail.com
+CATEGORIES:Demo,Nepomuk(SAP)
+X-ABUID:379703B2-D424-45BA-9ED8-F2E2E1F63351\:ABPerson
+END:VCARD
+BEGIN:VCARD
+VERSION:3.0
+N:Bl??mchen;G??nther;;;
+FN:G??nther Bl??mchen
+ORG:Oracle;
+EMAIL;type=INTERNET;type=WORK;type=pref:Guenther.Bluemchen at oracle.com
+TEL;type=WORK;type=pref:+1.650.506.7000
+item1.ADR;type=WORK;type=pref:;;500 Oracle Parkway;Redwood Shores;;CA 94065;United States of America
+item1.X-ABADR:se
+CATEGORIES:Demo,Nepomuk(SAP)
+X-ABUID:2BFC53C0-5B77-476E-AEC4-37A6B7C5A9E7\:ABPerson
+END:VCARD
+BEGIN:VCARD
+VERSION:3.0
+N:Kohler;Hans;;;
+FN:Hans Kohler
+ORG:SAP;
+EMAIL;type=INTERNET;type=WORK;type=pref:Hans.Kohler at sap.com
+CATEGORIES:Demo,Nepomuk(SAP)
+X-ABUID:16D88E45-BC2E-4B9B-A171-F838B4E09592\:ABPerson
+END:VCARD
+BEGIN:VCARD
+VERSION:3.0
+N:Lang;Fritz;;;
+FN:Fritz Lang
+ORG:SAP;
+EMAIL;type=INTERNET;type=WORK;type=pref:Fritz.Lang at sap.com
+CATEGORIES:Demo,Nepomuk(SAP)
+X-ABUID:3A73FE84-8A80-4512-ACA0-D0C9C5A06627\:ABPerson
+END:VCARD
+BEGIN:VCARD
+VERSION:3.0
+N:Stern;Claudia;;;
+FN:Claudia Stern
+ORG:SAP;
+EMAIL;type=INTERNET;type=WORK;type=pref:claudi-1 at csc.kth.se
+TEL;type=WORK;type=pref:+49(721)123456
+TEL;type=CELL:+49(175)1234567
+item1.ADR;type=WORK;type=pref:;;Vincenz-Priessnitz-Str. 1;Karlsruhe;;76131;Germany
+item1.X-ABADR:se
+CATEGORIES:Demo,Nepomuk(SAP)
+X-ABUID:2E739C33-31EC-48F9-A5BC-C7D709C08959\:ABPerson
+END:VCARD
+BEGIN:VCARD
+VERSION:3.0
+N:Treutiger;Harald;;;
+FN:Harald Treutiger
+ORG:Siemens;
+EMAIL;type=INTERNET;type=WORK;type=pref:Harald.Treutiger at siemens.de
+TEL;type=WORK;type=pref:+94 (0800) 2255337
+item1.ADR;type=WORK;type=pref:;;Werner-von-Siemens-Stra??e 6;Augsburg;;86159;Deutschland
+item1.X-ABADR:se
+CATEGORIES:Demo,Nepomuk(SAP)
+X-ABUID:EDD1767A-549F-4E66-9FC4-FE2CF1ED6E46\:ABPerson
+END:VCARD
+BEGIN:VCARD
+VERSION:3.0
+N:M??ller;Berit;;;
+FN:Berit M??ller
+ORG:SAP;
+EMAIL;type=INTERNET;type=WORK;type=pref:Berit.Mueller at sap.com
+CATEGORIES:Demo,Nepomuk(SAP)
+X-ABUID:CD0506CF-0829-4762-9EC7-09A1B0606D44\:ABPerson
+END:VCARD
+BEGIN:VCARD
+VERSION:3.0
+N:Wolf;Mathilde;;;
+FN:Mathilde Wolf
+ORG:SAP;
+EMAIL;type=INTERNET;type=WORK;type=pref:Mathilde.Wolf at sap.com
+CATEGORIES:Demo,Nepomuk(SAP)
+X-ABUID:74C4AFF9-E27F-42C5-BB28-B7330BD89B8E\:ABPerson
+END:VCARD
+BEGIN:VCARD
+VERSION:3.0
+N:Hageman;Dirk;;;
+FN:Dirk Hageman
+ORG:SAP;
+EMAIL;type=INTERNET;type=WORK;type=pref:dirk-1 at csc.kth.se
+TEL;type=WORK;type=pref:+49(721)847932
+TEL;type=CELL:+49(175)9876543
+item1.ADR;type=WORK;type=pref:;;Vincenz-Priessnitz-Str. 1;Karlsruhe;;76131;Germany
+item1.X-ABADR:se
+CATEGORIES:Demo,Nepomuk(SAP)
+X-ABUID:F3778FC5-87BB-4581-886C-350BF0B70BCB\:ABPerson
+END:VCARD
+BEGIN:VCARD
+VERSION:3.0
+N:Wimmerman;Daniel;;;
+FN:Daniel Wimmerman
+EMAIL;type=INTERNET;type=WORK;type=pref:Daniel.Wimmerman at sap.com
+CATEGORIES:Demo,Nepomuk(SAP)
+X-ABUID:B2273377-F134-47FF-A803-36BBE1287372\:ABPerson
+END:VCARD
+BEGIN:VCARD
+VERSION:3.0
+N:Kurtz;Daniel;;;
+FN:Daniel Kurtz
+ORG:SAP;
+EMAIL;type=INTERNET;type=WORK;type=pref:Daniel.Kurtz at sap.com
+CATEGORIES:Demo,Nepomuk(SAP)
+X-ABUID:F2BD97A3-9901-4587-B944-4B8CBBC5B959\:ABPerson
+END:VCARD
+BEGIN:VCARD
+VERSION:3.0
+N:Schnurrbart;Caspar;;;
+FN:Caspar Schnurrbart
+EMAIL;type=INTERNET;type=WORK;type=pref:Caspar.Schnurrbart at sap.com
+CATEGORIES:Demo,Nepomuk(SAP)
+X-ABUID:3A107906-899E-4C66-B781-FFB05E2B1369\:ABPerson
+END:VCARD
+BEGIN:VCARD
+VERSION:3.0
+N:Setter;Monika;;;
+FN:Monika Setter
+ORG:SAP;
+EMAIL;type=INTERNET;type=WORK;type=pref:Monika.Setter at sap.com
+CATEGORIES:Demo,Nepomuk(SAP)
+X-ABUID:6A48E535-67CC-41B3-987B-CFC098CDE5EC\:ABPerson
+END:VCARD
+BEGIN:VCARD
+VERSION:3.0
+N:Glans;Heinrich;;;
+FN:Heinrich Glans
+ORG:SAP;
+EMAIL;type=INTERNET;type=WORK;type=pref:Heinrich.Glans at sap.com
+CATEGORIES:Demo,Nepomuk(SAP)
+X-ABUID:AC03E8F2-D4C5-4603-93A6-306170553EFB\:ABPerson
+END:VCARD
+BEGIN:VCARD
+VERSION:3.0
+N:Fischer;Ambrosia;;;
+FN:Ambrosia Fischer
+ORG:SAP;
+EMAIL;type=INTERNET;type=WORK;type=pref:Ambrosia.Fischer at sap.com
+TEL;type=WORK;type=pref:+49(721)894763
+TEL;type=CELL:+49(175)74632934
+item1.ADR;type=WORK;type=pref:;;Vincenz-Priessnitz-Str. 1;Karlsruhe;;76131;Germany
+item1.X-ABADR:se
+CATEGORIES:Demo,Nepomuk(SAP)
+X-ABUID:E8167957-903A-4861-8B39-C92698E59425\:ABPerson
+END:VCARD
+BEGIN:VCARD
+VERSION:3.0
+N:Sprung;Markus;;;
+FN:Markus Sprung
+ORG:SAP;
+EMAIL;type=INTERNET;type=WORK;type=pref:Markus.Sprung at sap.com
+CATEGORIES:Demo,Nepomuk(SAP)
+X-ABUID:8365FAAF-0362-4AF9-A080-D4DAED8BBF94\:ABPerson
+END:VCARD
+BEGIN:VCARD
+VERSION:3.0
+N:Smith;Diana;;;
+FN:Diana Smith
+ORG:SAP;
+EMAIL;type=INTERNET;type=WORK;type=pref:Diana.Smith at sap.com
+CATEGORIES:Demo,Nepomuk(SAP)
+X-ABUID:A2BC9E71-2D15-4A86-A13D-621F2FCE1E86\:ABPerson
+END:VCARD

Copied: trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/xml-handwritten.xml (from rev 976, trunk/dna-repository/src/test/resources/docs/xml-handwritten.xml)
===================================================================
--- trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/xml-handwritten.xml	                        (rev 0)
+++ trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/xml-handwritten.xml	2009-06-04 22:31:30 UTC (rev 977)
@@ -0,0 +1,12 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<example attribute="value">
+
+Example handwritten XML document.
+
+<subElement>
+	Nested text.
+</subElement>
+
+More text.
+
+</example>
\ No newline at end of file


Property changes on: trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/xml-handwritten.xml
___________________________________________________________________
Name: svn:mime-type
   + text/plain
Name: svn:keywords
   + Id Revision
Name: svn:eol-style
   + LF

Copied: trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/xml-nonexistent-dtd.xml (from rev 976, trunk/dna-repository/src/test/resources/docs/xml-nonexistent-dtd.xml)
===================================================================
--- trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/xml-nonexistent-dtd.xml	                        (rev 0)
+++ trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/xml-nonexistent-dtd.xml	2009-06-04 22:31:30 UTC (rev 977)
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE tutorial SYSTEM "tutorial.dtd">
+<tutorial>This is an XML document</tutorial>
\ No newline at end of file


Property changes on: trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/xml-nonexistent-dtd.xml
___________________________________________________________________
Name: svn:mime-type
   + text/plain
Name: svn:keywords
   + Id Revision
Name: svn:eol-style
   + LF

Copied: trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/xml-nonexistent-remote-dtd.xml (from rev 976, trunk/dna-repository/src/test/resources/docs/xml-nonexistent-remote-dtd.xml)
===================================================================
--- trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/xml-nonexistent-remote-dtd.xml	                        (rev 0)
+++ trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/xml-nonexistent-remote-dtd.xml	2009-06-04 22:31:30 UTC (rev 977)
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE tutorial SYSTEM "http://www.w3.org/TR/xhtml1/DTD/tutorial.dtd">
+<tutorial>This is an XML document</tutorial>
\ No newline at end of file


Property changes on: trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/xml-nonexistent-remote-dtd.xml
___________________________________________________________________
Name: svn:mime-type
   + text/plain
Name: svn:keywords
   + Id Revision
Name: svn:eol-style
   + LF

Copied: trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/xml-nonexistent-remote-xsd.xml (from rev 976, trunk/dna-repository/src/test/resources/docs/xml-nonexistent-remote-xsd.xml)
===================================================================
--- trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/xml-nonexistent-remote-xsd.xml	                        (rev 0)
+++ trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/xml-nonexistent-remote-xsd.xml	2009-06-04 22:31:30 UTC (rev 977)
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<tutorial xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+  xsi:noNamespaceSchemaLocation="http://www.w3.org/2007/01/tutorial.xsd">This is an XML document</tutorial>
\ No newline at end of file


Property changes on: trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/xml-nonexistent-remote-xsd.xml
___________________________________________________________________
Name: svn:mime-type
   + text/plain
Name: svn:keywords
   + Id Revision
Name: svn:eol-style
   + LF

Copied: trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/xml-nonexistent-xsd.xml (from rev 976, trunk/dna-repository/src/test/resources/docs/xml-nonexistent-xsd.xml)
===================================================================
--- trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/xml-nonexistent-xsd.xml	                        (rev 0)
+++ trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/xml-nonexistent-xsd.xml	2009-06-04 22:31:30 UTC (rev 977)
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<tutorial xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+  xsi:noNamespaceSchemaLocation="tutorial.xsd">This is an XML document</tutorial>
\ No newline at end of file


Property changes on: trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/xml-nonexistent-xsd.xml
___________________________________________________________________
Name: svn:mime-type
   + text/plain
Name: svn:keywords
   + Id Revision
Name: svn:eol-style
   + LF

Copied: trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/xml-utf8-bom (from rev 976, trunk/dna-repository/src/test/resources/docs/xml-utf8-bom)
===================================================================
--- trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/xml-utf8-bom	                        (rev 0)
+++ trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/docs/xml-utf8-bom	2009-06-04 22:31:30 UTC (rev 977)
@@ -0,0 +1,6 @@
+???<?xml version='1.0' encoding='UTF-8'?>
+<example>
+
+This is an example XML document saved as a UTF-8 file with a UTF-8 Byte Order Mark.
+
+</example>
\ No newline at end of file

Copied: trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/master.xml (from rev 976, trunk/dna-repository/src/test/resources/master.xml)
===================================================================
--- trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/master.xml	                        (rev 0)
+++ trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/master.xml	2009-06-04 22:31:30 UTC (rev 977)
@@ -0,0 +1,1892 @@
+<!--
+  ~ 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 book PUBLIC "-//OASIS//DTD DocBook XML V4.4//EN" "http://www.oasis-open.org/docbook/xml/4.4/docbookx.dtd" [
+<!ENTITY % RH-ENTITIES SYSTEM "Common_Config/rh-entities.ent">
+<!ENTITY versionNumber "0.1">
+<!ENTITY copyrightYear "2008">
+<!ENTITY copyrightHolder "Red Hat Middleware, LLC.">]>
+<book>
+  <bookinfo>
+    <title>JBoss DNA</title>
+    <subtitle>Getting Started Guide</subtitle>
+    <releaseinfo>&versionNumber;
+    </releaseinfo>
+    <productnumber>&versionNumber;
+    </productnumber>
+    <issuenum>1</issuenum>
+    <mediaobject>
+      <imageobject role="fo">
+        <imagedata fileref="images/dna-logo.png" align="center" />
+      </imageobject>
+      <imageobject role="pdf">
+        <imagedata fileref="images/dna-logo.png" scale="75" align="center" />
+      </imageobject>
+      <imageobject role="html">
+        <imagedata fileref="images/dna-logo.png" depth="3cm" />
+      </imageobject>
+      <imageobject role="xhtml">
+        <imagedata fileref="images/dna-logo.png" depth="3cm" />
+      </imageobject>
+      <imageobject role="xhtml_single">
+        <imagedata fileref="images/dna-logo.png" depth="3cm" />
+      </imageobject>
+    </mediaobject>
+    <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="Author_Group.xml" />
+    <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="Legal_Notice.xml" />
+  </bookinfo>
+  <preface id="preface" revision="1">
+    <title>What this book covers</title>
+    <para>The goal of this book is to help you learn about JBoss DNA and how you can use it in your own applications to get the
+      most out of your JCR repositories.</para>
+    <para>The first part of the book starts out with an introduction to content repositories and an overview of the JCR API,
+      both of which are important aspects of JBoss DNA. This is followed by an overview of the JBoss DNA project, its
+      architecture, and a basic roadmap for what's coming next.</para>
+    <para>The next part of the book covers how to download and build the examples, how to use JBoss DNA with existing
+      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>
+      . 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/subversion.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
+      same thing.
+    </para>
+  </preface>
+  <chapter id="introduction">
+    <title>Introduction</title>
+    <para>There are a lot of choices for how applications can store information persistently so that it can be accessed at a
+      later time and by other processes. The challenge developers face is how to use an approach that most closely matches the
+      needs of their application. This choice becomes more important as developers choose to focus their efforts on
+      application-specific logic, delegating much of the responsibilities for persistence to libraries and frameworks.</para>
+    <para>
+      Perhaps one of the easiest techniques is to simply store information in
+      <emphasis>files</emphasis>
+      . The Java language makes working with files relatively easy, but Java really doesn't provide many bells and whistles. So
+      using files is an easy choice when the information is either not complicated (for example property files), or when users may
+      need to read or change the information outside of the application (for example log files or configuration files). But using
+      files to persist information becomes more difficult as the information becomes more complex, as the volume of it increases,
+      or if it needs to be accessed by multiple processes. For these situations, other techniques often offer better choices.
+    </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
+      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.
+    </para>
+    <para>
+      One of the more popular persistence technologies is the
+      <emphasis>relational database</emphasis>
+      . Relational database management systems have been around for decades and are very capable. The Java Database Connectivity
+      (JDBC) API provides a standard interface for connecting to and interacting with relational databases. However, it is a
+      low-level API that requires a lot of code to use correctly, and it still doesn't abstract away the DBMS-specific SQL
+      grammar. Also, working with relational data in an object-oriented language can feel somewhat unnatural, so many developers
+      map this data to classes that fit much more cleanly into their application. The problem is that manually creating this
+      mapping layer requires a lot of repetitive and non-trivial JDBC code.
+    </para>
+    <para>
+      <emphasis>Object-relational mapping</emphasis>
+      libraries automate the creation of this mapping layer and result in far less code that is much more maintainable with
+      performance that is often as good as (if not better than) handwritten JDBC code. The new
+      <ulink url="http://java.sun.com/developer/technicalArticles/J2EE/jpa/">Java Persistence API (JPA)</ulink>
+      provide a standard mechanism for defining the mappings (through annotations) and working with these entity objects. Several
+      commercial and open-source libraries implement JPA, and some even offer additional capabilities and features that go beyond
+      JPA. For example,
+      <ulink url="http://www.hibernate.org">Hibernate</ulink>
+      is one of the most feature-rich JPA implementations and offers object caching, statement caching, extra association
+      mappings, and other features that help to improve performance and usefulness.
+    </para>
+    <para>
+      While relational databases and JPA are solutions that work for many applications, they become more limited in cases when the
+      information structure is highly flexible, is not known
+      <emphasis>a priori</emphasis>
+      , or is subject to frequent change and customization. In these situations,
+      <emphasis>content repositories</emphasis>
+      may offer a better choice for persistence. Content repositories are almost a hybrid between relational databases and file
+      systems, and typically provide other capabilities as well, including versioning, indexing, search, access control,
+      transactions, and observation. Because of this, content repositories are used by content management systems (CMS), document
+      management systems (DMS), and other applications that manage electronic files (e.g., documents, images, multi-media, web
+      content, etc.) and metadata associated with them (e.g., author, date, status, security information, etc.). The
+      <ulink url="http://www.jcp.org/en/jsr/detail?id=170">Content Repository for Java technology API</ulink>
+      provides a standard Java API for working with content repositories. Abbreviated "JCR", this API was developed as part of the
+      Java Community Process under
+      <ulink url="http://www.jcp.org/en/jsr/detail?id=170">JSR-170</ulink>
+      and is being revised under
+      <ulink url="http://www.jcp.org/en/jsr/detail?id=283">JSR-283</ulink>
+      .
+    </para>
+    <para>
+      The
+      <emphasis>JBoss DNA project</emphasis>
+      is building the tools and services that surround content repositories. Nearly all of these capabilities are to be hidden
+      below the JCR API and involve automated processing of the information in the repository. Thus, JBoss DNA can add value to
+      existing repository implementations. For example, JCR repositories offer the ability to upload files into the repository and
+      have the file content indexed for search purposes. JBoss DNA also defines a library for "sequencing" content - to extract
+      meaningful information from that content and store it in the repository, where it can then be searched, accessed, and
+      analyzed using the JCR API.
+    </para>
+    <para> JBoss DNA is building other features as well. One goal of JBoss DNA is to create federated repositories that
+      dynamically merge the information from multiple databases, services, applications, and other JCR repositories. Another is to
+      create customized views based upon the type of data and the role of the user that is accessing the data. And yet another is
+      to create a REST-ful API to allow the JCR content to be accessed easily by other applications written in other languages.
+    </para>
+    <para>
+      The
+      <link linkend="jboss_dna">next chapter</link>
+      in this book goes into more detail about JBoss DNA and its architecture, the different components, what's available now, and
+      what's coming in future releases.
+      <link linkend="downloading_and_running">Chapter 3</link>
+      then provides instructions for downloading and running the sequencer examples for the current release.
+      <link linkend="using_dna">Chapter 4</link>
+      walks through how to use JBoss DNA in your applications, while
+      <link linkend="custom_sequencers">Chapter 5</link>
+      goes over how to create custom sequencers. Finally,
+      <link linkend="future_directions">Chapter 6</link>
+      wraps things up with a discussion about the future of JBoss DNA.
+    </para>
+  </chapter>
+  <chapter id="jboss_dna">
+    <title>Understanding JBoss DNA</title>
+    <sect1 id="jboss_dna_overview">
+      <title>Overview</title>
+      <para>JBoss DNA is a repository and set of tools that make it easy to capture, version, analyze, and understand the
+        fundamental building blocks of information. As models, service and process definitions, schemas, source code, and other
+        artifacts are added to the repository, JBoss DNA "sequences" the makeup of these components and extracts their structure
+        and interdependencies. The JBoss DNA web application allows end users to access, visualize, and edit this information in
+        the terminology and structure they are familiar with. Such domain-specific solutions can be easily created with little or
+        no programming.</para>
+      <para> JBoss DNA supports the Java Content Repository (JCR) standard and is able to provide a single integrated view of
+        multiple repositories, external databases, services, and applications, ensuring that JBoss DNA has access to the latest
+        and most reliable master data. For instance, DNA could provide in a single view valuable insight into the business
+        processes and process-level services impacted by a change to in an intermediary web server operation defined via WSDL.
+        Similarly, a user could quickly view and navigate the dependencies between the data source models and transformation
+        information stored within a content repository, the code base stored within a version control system, and the database
+        schemas used by an application.</para>
+    </sect1>
+    <sect1 id="architecture">
+      <title>Architecture</title>
+      <para>The architecture for JBoss DNA consists of several major components that will be built on top of standard APIs,
+        including JCR, JDBC, JNDI and HTTP. The goal is to allow these components to be assembled as needed and add value on top
+        of other DNA components or third-party systems that support these standard APIs.</para>
+      <mediaobject>
+        <imageobject role="fo">
+          <imagedata align="center" fileref="images/dna-architecture.png" />
+        </imageobject>
+        <imageobject role="html">
+          <imagedata align="center" fileref="images/dna-architecture.png" />
+        </imageobject>
+      </mediaobject>
+      <para>
+        As shown in the diagram above, the major components are (starting at the top):
+        <itemizedlist>
+          <listitem>
+            <para>
+              <emphasis role="strong">DNA Eclipse Plugins</emphasis>
+              enable Eclipse users to access the contents of a JBoss DNA repository.
+            </para>
+          </listitem>
+          <listitem>
+            <para>
+              <emphasis role="strong">DNA JDBC Driver</emphasis>
+              provides a driver implementation, allowing JDBC-aware applications to connect to and use a JBoss DNA repository.
+            </para>
+          </listitem>
+          <listitem>
+            <para>
+              <emphasis role="strong">DNA Remote JCR</emphasis>
+              is a client-side component for accessing remote JCR repositories.
+            </para>
+          </listitem>
+          <listitem>
+            <para>
+              <emphasis role="strong">DNA Web Application</emphasis>
+              is used by end users and domain experts to visualize, search, edit, change and tag the repository content. The web
+              application uses views to define how different types of information are to be presented and edited in
+              domain-specific ways. The goal is that this web application is easily customized and branded for inclusion into
+              other solutions and application systems. The DNA Web Application operates upon any JCR-compliant repository,
+              although it does rely upon the DNA analysis and templating services.
+            </para>
+          </listitem>
+          <listitem>
+            <para>
+              <emphasis role="strong">DNA Publishing Server</emphasis>
+              allows content to be downloaded, uploaded, and edited using the Atom Publishing Protocol. With the DNA Publishing
+              Server, the content of the repository can easily be created, read, edited, and deleted using the standard HTTP
+              operations of POST, GET, PUT, and DELETE (respectively). More and more tools are being created that support working
+              with Atom Publishing servers. The DNA Publishing Server operates upon any JCR-compliant repository.
+            </para>
+          </listitem>
+          <listitem>
+            <para>
+              <emphasis role="strong">DNA WebDAV Server</emphasis>
+              allows clients such as Microsoft Windows and Apple OS X to connect to, read, and edit the content in the repository
+              using the WebDAV standard. Since WebDAV is an extension of HTTP, web browsers are able to read (but not modify) the
+              content served by a WebDAV compliant server. The DNA WebDAV Server operates upon any JCR-compliant repository.
+            </para>
+          </listitem>
+          <listitem>
+            <para>
+              <emphasis role="strong">DNA Sequencers</emphasis>
+              are pluggable components that make it possible for content to be uploaded to the repository and automatically
+              processed to extract meaningful structure and place that structure in the repository. Once this information is in
+              the repository, it can be viewed, edited, analyzed, searched, and related to other content. DNA defines a Java
+              interface that sequencers must implement. DNA sequencers operate upon any JCR-compliant repository.
+            </para>
+          </listitem>
+          <listitem>
+            <para>
+              <emphasis role="strong">DNA Analyses</emphasis>
+              are pluggable components that analyze content and the relationships between content to generate reports or to answer
+              queries. DNA will include some standard analyzers, like dependency analysis and similarity analysis, that are
+              commonly needed by many different solutions. DNA analyzers operate upon any JCR-compliant repository.
+            </para>
+          </listitem>
+          <listitem>
+            <para>
+              <emphasis role="strong">DNA Views</emphasis>
+              are definitions of how types of information are to be presented in a user interface to allow for creation, reading,
+              editing, and deletion of information. DNA view definitions consist of data stored in a JCR repository, and as such
+              views can be easily added, changed or removed entirely by using the DNA Web Application, requiring no programming.
+            </para>
+          </listitem>
+          <listitem>
+            <para>
+              <emphasis role="strong">DNA Federation</emphasis>
+              is an implementation of the JCR API that builds the content within the repository by accessing and integrating
+              information from multiple sources. DNA Federation allows the integration of external systems, like other JCR
+              repositories, databases, applications, and services.
+            </para>
+          </listitem>
+          <listitem>
+            <para>
+              <emphasis role="strong">DNA Connectors</emphasis>
+              are used to communicate with these external sources of information. In the federation engine, each source is able to
+              contribute node structure and node properties to any part of the federated graph, although typically many connectors
+              will contribute most of their information to isolated subgraphs. The result is that integration from a wide range of
+              systems can be integrated and accessed through the DNA Web Application, DNA Publishing Server, and DNA WebDAV
+              Server. Connectors also may optionally participate in distributed transactions by exposing an XAResource.
+            </para>
+          </listitem>
+          <listitem>
+            <para>
+              <emphasis role="strong">DNA Maven</emphasis>
+              is a classloader library compatible with Maven 2 project dependencies. This allows the creation of Java ClassLoader
+              instances using Maven 2 style paths, and all dependencies are transitively managed and included.
+            </para>
+          </listitem>
+        </itemizedlist>
+      </para>
+      <para>
+        Continue reading the rest of this chapter for more detail about the
+        <link linkend="sequencers">sequencing framework</link>
+        available in this release, or the
+        <link linkend="federation">federation engine</link>
+        and
+        <link linkend="federation_connectors">connectors</link>
+        that will be the focus of the next release. Or, skip to the
+        <link linkend="downloading_and_running">examples</link>
+        to see how to start using JBoss DNA &versionNumber;
+        today. 
+      </para>
+    </sect1>
+    <sect1 id="sequencers">
+      <title>Sequencing content</title>
+      <para> The current JBoss DNA release contains a sequencing framework that is designed to sequence data (typically files)
+        stored in a JCR repository to automatically extract meaningful and useful information. This additional information is then
+        saved back into the repository, where it can be accessed and used.</para>
+      <para> In other words, you can just upload various kinds of files into a JCR repository, and DNA automatically processes
+        those files to extract meaningful structured information. For example, load DDL files into the repository, and let
+        sequencers extract the structure and metadata for the database schema. Load Hibernate configuration files into the
+        repository, and let sequencers extract the schema and mapping information. Load Java source into the repository, and let
+        sequencers extract the class structure, JavaDoc, and annotations. Load a PNG, JPEG, or other image into the repository,
+        and let sequencers extract the metadata from the image and save it in the repository. The same with XSDs, WSDL, WS
+        policies, UML, MetaMatrix models, etc.</para>
+      <para>
+        JBoss DNA sequencers sit on top of existing JCR repositories (including federated repositories) - they basically extract
+        more useful information from what's already stored in the repository. And they use the existing JCR versioning system. Each
+        sequencer typically processes a single kind of file format or a single kind of content. </para>
+      <para>The following sequencers are included in JBoss DNA:
+        <itemizedlist>
+          <listitem>
+            <para>
+              <emphasis role="strong">Image sequencer</emphasis>
+              - A sequencer that processes the binary content of an image file, extracts the metadata for the image, and then
+              writes that image metadata to the repository. It gets the file format, image resolution, number of bits per pixel
+              (and optionally number of images), comments and physical resolution from JPEG, GIF, BMP, PCX, PNG, IFF, RAS, PBM,
+              PGM, PPM, and PSD files. (This sequencer may be improved in the future to also extract EXIF metadata from JPEG
+              files; see
+              <ulink url="http://jira.jboss.org/jira/browse/DNA-26">DNA-26</ulink>
+              .)
+            </para>
+          </listitem>
+          <listitem>
+            <para>
+              <emphasis role="strong">MP3 sequencer</emphasis>
+              - A sequencer that processes the contents of an MP3 audio file, extracts the metadata for the file, and then
+              writes that image metadata to the repository. It gets the title, author, album, year, and comment.  
+              (This sequencer may be improved in the future to also extract other ID3 metadata from other audio file formats; see
+              <ulink url="http://jira.jboss.org/jira/browse/DNA-66">DNA-26</ulink>
+              .)
+            </para>
+          </listitem>
+        </itemizedlist>
+      </para>
+      <para>
+        As the community develops additional sequencers, they will also be included in JBoss DNA. Some of those that have been
+        identified as being useful include:
+        <itemizedlist>
+          <listitem>
+            <para>
+              <emphasis role="strong">XML Schema Document (XSD) Sequencer</emphasis>
+              - Process XSD files and extract the various elements, attributes, complex types, simple types, groups, and other
+              information. (See
+              <ulink url="http://jira.jboss.org/jira/browse/DNA-32">DNA-32</ulink>
+              )
+            </para>
+          </listitem>
+          <listitem>
+            <para>
+              <emphasis role="strong">Web Service Definition Language (WSDL) Sequencer</emphasis>
+              - Process WSDL files and extract the services, bindings, ports, operations, parameters, and other information. (See
+              <ulink url="http://jira.jboss.org/jira/browse/DNA-33">DNA-33</ulink>
+              )
+            </para>
+          </listitem>
+          <listitem>
+            <para>
+              <emphasis role="strong">Hibernate File Sequencer</emphasis>
+              - Process Hibernate configuration (cfg.xml) and mapping (hbm.xml) files to extract the configuration and mapping
+              information. (See
+              <ulink url="http://jira.jboss.org/jira/browse/DNA-61">DNA-61</ulink>
+              )
+            </para>
+          </listitem>
+          <listitem>
+            <para>
+              <emphasis role="strong">XML Metadata Interchange (XMI) Sequencer</emphasis>
+              - Process XMI documents that contain UML models or models using another metamodel, extracting the model structure
+              into the repository. (See
+              <ulink url="http://jira.jboss.org/jira/browse/DNA-31">DNA-31</ulink>
+              )
+            </para>
+          </listitem>
+          <listitem>
+            <para>
+              <emphasis role="strong">ZIP Archive Sequencer</emphasis>
+              - Process ZIP archive files to extract (explode) the contents into the repository. (See
+              <ulink url="http://jira.jboss.org/jira/browse/DNA-63">DNA-63</ulink>
+              )
+            </para>
+          </listitem>
+          <listitem>
+            <para>
+              <emphasis role="strong">Java Archive (JAR) Sequencer</emphasis>
+              - Process JAR files to extract (explode) the contents into the classes and file resources. (See
+              <ulink url="http://jira.jboss.org/jira/browse/DNA-64">DNA-64</ulink>
+              )
+            </para>
+          </listitem>
+          <listitem>
+            <para>
+              <emphasis role="strong">Java Class File Sequencer</emphasis>
+              - Process Java class files (bytecode) to extract the class structure (including annotations) into the repository.
+              (See
+              <ulink url="http://jira.jboss.org/jira/browse/DNA-62">DNA-62</ulink>
+              )
+            </para>
+          </listitem>
+          <listitem>
+            <para>
+              <emphasis role="strong">Java Source File Sequencer</emphasis>
+              - Process Java source files to extract the class structure (including annotations) into the repository. (See
+              <ulink url="http://jira.jboss.org/jira/browse/DNA-51">DNA-51</ulink>
+              )
+            </para>
+          </listitem>
+          <listitem>
+            <para>
+              <emphasis role="strong">PDF Sequencer</emphasis>
+              - Process PDF files to extract the document metadata, including table of contents. (See
+              <ulink url="http://jira.jboss.org/jira/browse/DNA-50">DNA-50</ulink>
+              )
+            </para>
+          </listitem>
+          <listitem>
+            <para>
+              <emphasis role="strong">Maven 2 POM Sequencer</emphasis>
+              - Process Maven 2 Project Object Model (POM) files to extract the project information, dependencies, plugins, and
+              other content. (See
+              <ulink url="http://jira.jboss.org/jira/browse/DNA-24">DNA-24</ulink>
+              )
+            </para>
+          </listitem>
+          <listitem>
+            <para>
+              <emphasis role="strong">Data Definition Language (DDL) Sequencer</emphasis>
+              - Process various dialects of DDL, including that from Oracle, SQL Server, MySQL, PostgreSQL, and others. May need
+              to be split up into a different sequencer for each dialect. (See
+              <ulink url="http://jira.jboss.org/jira/browse/DNA-26">DNA-26</ulink>
+              )
+            </para>
+          </listitem>
+          <listitem>
+            <para>
+              <emphasis role="strong">MP3 and MP4 Sequencer</emphasis>
+              - Process MP3 and MP4 audio files to extract the name of the song, artist, album, track number, and other metadata.
+              (See
+              <ulink url="http://jira.jboss.org/jira/browse/DNA-30">DNA-30</ulink>
+              )
+            </para>
+          </listitem>
+        </itemizedlist>
+      </para>
+      <para>
+        The
+        <link linkend="using_dna">examples</link>
+        in this book go into more detail about how sequencers are managed and used, and
+        <link linkend="custom_sequencers">Chapter 5</link>
+        goes into detail about how to write custom sequencers.
+      </para>
+    </sect1>
+    <sect1 id="federation">
+      <title>Federating content</title>
+      <para>There is a lot of information stored in many of different places: databases, repositories, SCM systems,
+        registries, file systems, services, etc. The purpose of the federation engine is to allow applications to use the JCR API
+        to access that information as if it were all stored in a single JCR repository, but to really leave the information where
+        it is.</para>
+      <para>Why not just move the information into a JCR repository? Most likely there are existing applications that rely upon
+        that information being where it is. If we were to move it, then all those applications would break. Or they'd have to be
+        changed to use JCR. If the information is being used, the most practical thing is to leave it where it is.</para>
+      <para>
+        Then why not just copy the information into a JCR repository? Actually, there are times when it's perfectly reasonable to
+        make a copy of the data. Perhaps the system managing the existing information cannot handle the additional load of more
+        clients. Or, perhaps the information doesn't change, or it does change and we want snapshots that don't change. But more
+        likely, the data
+        <emphasis>does</emphasis>
+        change. So if applications are to use the most current information and we make copies of the data, we have to keep the
+        copies synchronized with the master. That's generally a lot of work.
+      </para>
+      <para>The JBoss DNA federation engine lets us leave the information where it is, yet lets client applications use the JCR
+        API to access all the information without caring where the information really exists. If the underlying information
+        changes, client applications using JCR observation will be notified of the changes. If a JBoss DNA federated repository is
+        configured to allow updates, client applications can change the information in the repository and JBoss DNA will propagate
+        those changes down to the original source.</para>
+      <sect2 id="federation_connectors">
+        <title>Connecting to information sources</title>
+        <para>
+          The JBoss DNA federation engine will use connectors to interact with different information sources to get at the content
+          in those systems. Some ideas for connectors include:
+          <itemizedlist>
+            <listitem>
+              <para>
+                <emphasis role="strong">JCR Repository Connector</emphasis>
+                - Connect to and interact with other JCR repositories.
+              </para>
+            </listitem>
+            <listitem>
+              <para>
+                <emphasis role="strong">File System Connector</emphasis>
+                - Expose the files and directories on a file system through JCR.
+              </para>
+            </listitem>
+            <listitem>
+              <para>
+                <emphasis role="strong">Maven 2 Repository Connector</emphasis>
+                - Access and expose the contents of a Maven 2 repository (either on the local file system or via HTTP) through
+                JCR.
+              </para>
+            </listitem>
+            <listitem>
+              <para>
+                <emphasis role="strong">JDBC Metadata Connector</emphasis>
+                - Connect to relational databases via JDBC and expose their schema as content in a repository.
+              </para>
+            </listitem>
+            <listitem>
+              <para>
+                <emphasis role="strong">UDDI Connector</emphasis>
+                - Interact with UDDI registries to integrate their content into a repository.
+              </para>
+            </listitem>
+            <listitem>
+              <para>
+                <emphasis role="strong">SVN Connector</emphasis>
+                - Interact with Subversion software configuration management (SCM) repositories to expose the managed resources
+                through JCR. Consider using the
+                <ulink url="http://svnkit.com/">SVNkit</ulink>
+                (dual license) library for an API into Subversion.
+              </para>
+            </listitem>
+            <listitem>
+              <para>
+                <emphasis role="strong">CVS Connector</emphasis>
+                - Interact with CVS software configuration management (SCM) repositories to expose the managed resources through
+                JCR.
+              </para>
+            </listitem>
+            <listitem>
+              <para>
+                <emphasis role="strong">JDBC Storage Connector</emphasis>
+                - Store and access information in a relational database. Also useful for persisting information in the federated
+                repository not stored elsewhere.
+              </para>
+            </listitem>
+            <listitem>
+              <para>
+                <emphasis role="strong">Distributed Database Connector</emphasis>
+                - Store and access information in a
+                <ulink url="http://www.hypertable.org/">Hypertable</ulink>
+                or
+                <ulink url="http://hadoop.apache.org/hbase/">HBase</ulink>
+                distributed databases. Also useful for persisting information in the federated repository not stored elsewhere.
+              </para>
+            </listitem>
+          </itemizedlist>
+        </para>
+        <para>
+          If the connectors allow the information they contribute to be updated, they must provide an
+          <code>XAResource</code>
+          implementation that can be used with a Java Transaction Service. Connectors that provide read-only access need not
+          provide an implementation.
+        </para>
+        <para>
+          Also, connectors talk to
+          <emphasis>sources</emphasis>
+          of information, and it's quite likely that the same connector is used to talk to different sources. Each source contains
+          the configuration details (e.g., connection information, location, properties, options, etc.) for working with that
+          particular source, as well as a reference to the connector that should be used to establish connections to the source.
+          And of course, sources can be added or removed without having to stop and restart the federated repository.
+        </para>
+      </sect2>
+      <sect2 id="federation_graph">
+        <title>Building the unified graph</title>
+        <para> The federation engine works by effectively building up a single graph by querying each source and merging or
+          unifying the responses. This information is cached, which improves performance, reduces the number of (potentially
+          expensive) remote calls, reduces the load on the sources, and helps mitigate problems with source availability. As
+          clients interact with the repository, this cache is consulted first. When the requested portion of the graph (or
+          "subgraph") is contained completely in the cache, it is retuned immediately. However, if any part of the requested
+          subgraph is not in the cache, each source is consulted for their contributions to that subgraph, and any results are
+          cached.</para>
+        <para> This basic flow makes it possible for the federated repository to build up a local cache of the integrated graph
+          (or at least the portions that are used by clients). In fact, the federated repository caches information in a manner
+          that is similar to that of the Domain Name System (DNS). As sources are consulted for their contributions, the source
+          also specifies whether it is the authoritative source for this information (some sources that are themselves federated
+          may not be the information's authority), whether the information may be modified, the time-to-live (TTL) value (the time
+          after which the cached information should be refreshed), and the expiration time (the time after which the cached
+          information is no longer valid). In effect, the source has complete control over how the information it contributes is
+          cached and used.</para>
+        <para>
+          The federated repository also needs to incorporate
+          <emphasis>negative caching</emphasis>
+          , which is storage of the knowledge that something does not exist. Sources can be configured to contribute information
+          only below certain paths (e.g.,
+          <code>/A/B/C</code>
+          ), and the federation engine can take advantage of this by never consulting that source for contributions to information
+          on other paths. However, below that path, any negative responses must also be cached (with appropriate TTL and expiry
+          parameters) to prevent the exclusion of that source (in case the source has information to contribute at a later time)
+          or the frequent checking with the source.
+        </para>
+      </sect2>
+      <sect2 id="federation_queries">
+        <title>Searching and querying</title>
+        <para> The JBoss DNA federated repository will also support queries against the integrated and unified graph. In some
+          situations the query can be determined to apply to a single source, but in most situations the query must be planned
+          (and possibly rewritten) such that it can be pushed down to all the appropriate sources. Also, the cached results must
+          be consulted prior to returning the query results, as the results from one source might have contributions from another
+          source.</para>
+        <note>
+          <para> It is hoped that the MetaMatrix query engine can be used for this purpose after it is open-sourced. This engine
+            implements sophisticated query planning and optimization techniques for working efficiently with multiple sources.
+          </para>
+        </note>
+        <para>Searching the whole federated repository is also important. This allows users to simply supply a handful of
+          search terms, and to get results that are ranked based upon how close each result is to the search terms. (Searching is
+          very different from querying, which involves specifying the exact semantics of what is to be searched and how the
+          information is to be compared.) JBoss DNA will incorporate a search engine (e.g., likely to be Lucene) and will populate
+          the engine's indexes using the federated content and the cached information. Notifications of changing information will
+          be reflected in the indexes, but some sources may want to explicitly allow or disallow periodic crawling of their
+          content.</para>
+      </sect2>
+      <sect2 id="federation_updates">
+        <title>Updating content</title>
+        <para>
+          The JBoss DNA federated repositories also make it possible for client applications to make changes to the unified graph
+          within the context of distributed transactions. According to the JCR API, client applications use the Java Transaction
+          API (JTA) to control the boundaries of their transactions. Meanwhile, the federated repository uses a
+          <ulink url="http://www.jboss.org/jbosstm/">distributed transaction service</ulink>
+          to coordinate the XA resources provided by the connectors.
+        </para>
+        <para> It is quite possible that clients add properties to nodes in the unified graph, and that this information cannot be
+          handled by the same underlying source that contributed to the node. In this case, the federated repository can be
+          configured with a fallback source that will be used used to store this "extra" information.</para>
+        <para>
+          It is a goal that non-XA sources (i.e., sources that use connectors without XA resources) can participate in distributed
+          transactions through the use of
+          <emphasis>compensating transactions</emphasis>
+          . Because the JBoss DNA federation engine implements the JCR observation system, it is capable of recording all of the
+          changes made to the distributed graph (and those changes sent to each updatable source). Therefore, if a non-XA source
+          is involved in a distributed transaction that must be rolled back, any changes made to non-XA sources can be undone. (Of
+          course, this does not make the underlying source transactional: non-transactional sources still may expose the interim
+          changes to other clients.)
+        </para>
+      </sect2>
+      <sect2 id="federation_events">
+        <title>Observing changes</title>
+        <para> The JCR API supports observing a repository to receive notifications of additions, changes and deletions of nodes
+          and properties. The JBoss DNA federated repository will support this API through two primary means.</para>
+        <para> When the changes are made through the federated repository, the JBoss DNA federation engine is well aware of the
+          set of changes that have been (or are being) made to the unified graph. These events are directly propagated to
+          listeners.</para>
+        <para> Sources have the ability to publish events, making it possible for the JBoss DNA federation engine and clients that
+          have registered listeners to be notified of changes in the information managed by that source. These events are first
+          processed by the federation engine and possibly altered based upon contributions from other sources. (The federation
+          engine also uses these events to update or purge information in the cache, which may add to the event set.) The
+          resulting (and possibly altered) event set is then sent to all client listeners.</para>
+      </sect2>
+    </sect1>
+  </chapter>
+  <!--  ====================================================================================================
+                                                   Chapter 
+        ====================================================================================================   -->
+  <chapter id="downloading_and_running">
+    <title>Running the example application</title>
+    <para>
+      This chapter provides instructions for downloading and running a sample application that demonstrates how JBoss DNA works
+      with a JCR repository to automatically sequence changing content to extract useful information. So read on to get the simple
+      application running, and then in the
+      <link linkend="using_dna">next chapter</link>
+      we'll dive into the source code for the example and show how to use JBoss DNA in your own applications.
+    </para>
+    <para>JBoss DNA uses Maven 2 for its build system, as is 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>
+    <note>
+      <para>
+        To use Maven with JBoss DNA, you'll need to have
+        <ulink url="http://java.sun.com/javase/downloads/index_jdk5.jsp">JDK 5 or 6</ulink>
+        and Maven 2.0.7 (or higher).
+      </para>
+      <para>
+        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.7-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:
+        <programlisting role="XML" language="xml">&lt;settings&gt;
+  &lt;profiles&gt;
+    &lt;profile&gt;
+      &lt;id&gt;jboss.repository&lt;/id&gt;
+      &lt;activation&gt;
+        &lt;property&gt;          
+          &lt;name&gt;!jboss.repository.off&lt;/name&gt;
+        &lt;/property&gt;
+      &lt;/activation&gt;
+      &lt;repositories&gt;
+        &lt;repository&gt;
+          &lt;id&gt;snapshots.jboss.org&lt;/id&gt;
+          &lt;url&gt;http://snapshots.jboss.org/maven2&lt;/url&gt;
+          &lt;snapshots&gt;
+            &lt;enabled&gt;true&lt;/enabled&gt;
+          &lt;/snapshots&gt;
+        &lt;/repository&gt;
+        &lt;repository&gt;
+          &lt;id&gt;repository.jboss.org&lt;/id&gt;
+          &lt;url&gt;http://repository.jboss.org/maven2&lt;/url&gt;
+          &lt;snapshots&gt;
+            &lt;enabled&gt;false&lt;/enabled&gt;
+          &lt;/snapshots&gt;
+        &lt;/repository&gt;
+      &lt;/repositories&gt;
+      &lt;pluginRepositories&gt;
+        &lt;pluginRepository&gt;
+          &lt;id&gt;repository.jboss.org&lt;/id&gt;
+          &lt;url&gt;http://repository.jboss.org/maven2&lt;/url&gt;
+          &lt;snapshots&gt;
+            &lt;enabled&gt;false&lt;/enabled&gt;
+          &lt;/snapshots&gt;
+        &lt;/pluginRepository&gt;
+        &lt;pluginRepository&gt;
+          &lt;id&gt;snapshots.jboss.org&lt;/id&gt;
+          &lt;url&gt;http://snapshots.jboss.org/maven2&lt;/url&gt;
+          &lt;snapshots&gt;
+            &lt;enabled&gt;true&lt;/enabled&gt;
+          &lt;/snapshots&gt;
+        &lt;/pluginRepository&gt;
+      &lt;/pluginRepositories&gt;
+    &lt;/profile&gt;
+  &lt;/profiles&gt;
+&lt;/settings&gt;</programlisting>
+        This profile informs Maven of the two JBoss repositories (snapshots and releases) that contain 
+        all of the JARs for JBoss DNA and all dependent libraries.</para>
+      </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.1/jboss-dna-0.1-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:
+  <programlisting>
+examples/pom.xml
+         sequencers/pom.xml
+                   /src/main/assembly
+                            /config
+                            /java
+                            /resources
+                       /test/java
+                            /resources
+  </programlisting>
+      </para>
+      <para>There are essentially two Maven projects: a <code>sequencers</code> project and a parent project.  All of the source
+      for the example is located in the <code>sequencers</code> subdirectory.  And you may have noticed that none
+      of the JBoss DNA libraries are there.  This is where Maven comes in.  The two <code>pom.xml</code> files tell
+      Maven everything it needs to know about what libraries are required and how to build the example.</para>
+      <para>In a terminal, go to the <code>examples</code> directory and run <emphasis role="strong"><code>mvn install</code></emphasis>.  
+      This command downloads all of the JARs necessary to compile and build the example, including the JBoss DNA libraries,
+      the libraries they depend on, and any missing Maven components.  (These are downloaded from the JBoss repositories
+      only once and saved on your machine.  This means that the next time you run Maven, all the libraries will
+      already be available locally, and the build will run much faster.)  The command then continues by compiling the example's source
+      code (and unit tests) and running the unit tests.  The build is successful if you see the following:
+           <programlisting language="bash">$ mvn install
+...
+[INFO] ------------------------------------------------------------------------
+[INFO] Reactor Summary:
+[INFO] ------------------------------------------------------------------------
+[INFO] Getting Started examples .............................. SUCCESS [2.106s]
+[INFO] Sequencer Examples .................................... SUCCESS [9.768s]
+[INFO] ------------------------------------------------------------------------
+[INFO] ------------------------------------------------------------------------
+[INFO] BUILD SUCCESSFUL
+[INFO] ------------------------------------------------------------------------
+[INFO] Total time: 12 seconds
+[INFO] Finished at: Wed May 07 12:00:06 CDT 2008
+[INFO] Final Memory: 14M/28M
+[INFO] ------------------------------------------------------------------------
+$ </programlisting>
+      If there are errors, check whether you have the correct version of Maven installed and that you've correctly updated
+           your Maven settings as described above.</para>
+    <para>If you've successfully built the examples, there will be a <code>examples/sequencers/target/dna-example-sequencers-basic.dir/</code>
+    directory that contains the following:
+    <itemizedlist>
+  	<listitem>
+  	  <para><emphasis role="strong"><code>run.sh</code></emphasis> is the *nix shell script that will run the example.</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>jackrabbitConfig.xml</code>
+        </emphasis>
+        is the Jackrabbit configuration file, which is set up to use a transient in-memory repository.
+      </para>
+    </listitem>
+    <listitem>
+      <para>
+        <emphasis role="strong">
+          <code>jackrabbitNodeTypes.cnd</code>
+        </emphasis>
+        defines the additional JCR node types used by this example.
+      </para>
+    </listitem>
+    <listitem>
+      <para>
+        <emphasis role="strong">
+          <code>sample1.mp3</code>
+        </emphasis>
+        is a sample MP3 audio file you'll use later to upload into the repository.
+      </para>
+    </listitem>
+    <listitem>
+      <para>
+        <emphasis role="strong">
+          <code>caution.gif</code>
+        </emphasis>, <emphasis role="strong">
+          <code>caution.png</code>
+        </emphasis>, and <emphasis role="strong">
+          <code>caution.jpg</code>
+        </emphasis>
+        are images that you'll use later and upload into the repository.
+      </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 example.
+      </para>
+    </listitem>
+    </itemizedlist>
+    <note>
+      <para>JBoss DNA 0.1 and the examples are currently tested with <ulink url="http://jackrabbit.apache.org/">Apache Jackrabbit</ulink> version 1.3.3.  
+      This version is stable and used by a number of other projects and applications.  However, you should be able to use a newer
+      version of Jackrabbit, as long as that version uses the same JCR API.  For example, version 1.4.2 was released on March 26, 2008 and
+      should be compatible.
+      </para>
+      <para>Just remember, if the version of Jackrabbit you want to use for these examples is not in the Maven repository,
+      you'll have to either add it or add it locally.  For more information, see the <ulink url="http://maven.apache.org/">Maven documentation</ulink>.
+      </para>
+    </note>
+    </para>
+  </sect1>
+  <sect1 id="running">
+    <title>Running the example</title>
+    <para>This 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>
+    <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">
+        <title>Example Client</title>
+        <graphic align="center" scale="100" fileref="images/example-sequencer-cli-client.png" />
+      </figure>
+      From this menu, you can upload a file into the repository, search for media in the repository, print sequencing statistics,
+      or quit the application.
+    </para>
+    <para>
+      The first step is to upload one of the example images. If you type 'u' and press return, you'll be prompted to supply the
+      path to the file you want to upload. Since the application is running from within the
+      <code>examples/sequencers/target/dna-example-sequencers-basic.dir/
+      </code>
+      directory, you can specify any of the files in that directory without specifying the path:
+      <figure id="example-sequencer-upload">
+        <title>Uploading an image using the Example Client</title>
+        <graphic align="center" scale="100" fileref="images/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 and MP3 audio files and 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>
+      . Files with other extensions in the repository path will be ignored. For your convenience, the example provides several
+      files that will be sequenced (
+      <code>caution.png</code>
+      ,
+      <code>caution.jpg</code>
+      ,
+      <code>caution.gif</code>
+      , and
+      <code>sample1.mp3</code>
+      ) and one image that will not be sequenced (
+      <code>caution.pict</code>
+      ). Feel free to try other files.
+    </para>
+    <para>
+      After you have specified the file you want to upload, the example application asks you where in the repository you'd like to
+      place the file. (If you want to use the suggested location, just press
+      <code>return</code>
+      .) The client application uses the JCR API to upload the file to that location in the repository, creating any nodes (of
+      type
+      <code>nt:folder</code>
+      ) for any directories that don't exist, and creating a node (of type
+      <code>nt:file</code>
+      ) for the file. And, per the JCR specification, the application creates a
+      <code>jcr:content</code>
+      node (of type
+      <code>nt:resource</code>
+      ) under the file node. The file contents are placed on this
+      <code>jcr:content</code>
+      node in the
+      <code>jcr:data</code>
+      property. For example, if you specify
+      <code>/a/b/caution.png</code>
+      , the following structure will be created in the repository:<programlisting>
+    /a   (nt:folder)
+      /b   (nt:folder)
+        /caution.png   (nt:file)
+                    /jcr:content    (nt:resource)
+                                @jcr:data = {contents of the file}
+                                @jcr:mimeType = {mime type of the file}
+                                @jcr:lastModified = {now}
+    </programlisting>
+    Other kinds of files are treated in a similar way.
+    </para>
+  <para>
+    When the client uploads the file using the JCR API, DNA gets notified of the changes, consults the sequencers to see whether
+    any of them are interested in the new or updated content, and if so runs those sequencers. The image sequencer processes image
+    files for metadata, and any metadata found is stored under the
+    <code>/images</code>
+    branch of the repository. The MP3 sequencer processes MP3 audio files for metadata, and any metadata found is stored under the
+    <code>/mp3s</code>
+    branch of the repository.  All of this happens asynchronously, so any DNA activity doesn't impede or slow down the client
+    activities.
+  </para>
+  <para>
+    So, after the file is uploaded, you can search the repository for the image metadata using the "s" menu option:
+    <figure id="example-sequencer-search">
+      <title>Searching for media using the Example Client</title>
+      <graphic align="center" scale="100" fileref="images/example-sequencer-search.png" />
+    </figure>
+    Here are the search results after the <code>sample1.mp3</code> audio file has been uploaded (to the <code>/a/b/sample1.mp3</code> location):
+    <figure id="example-sequencer-search-with-mp3">
+      <title>Searching for media using the Example Client</title>
+      <graphic align="center" scale="100" fileref="images/example-sequencer-search-with-mp3.png" />
+    </figure>
+    You can also display the sequencing statistics using the "d" menu option:
+    <figure id="example-sequencer-statistics">
+      <title>Sequencing statistics using the Example Client</title>
+      <graphic align="center" scale="100" fileref="images/example-sequencer-statistics.png" />
+    </figure>
+    These stats show how many nodes were sequenced, and how many nodes were skipped because they didn't apply to the sequencer's
+    criteria.
+  </para>
+  <note>
+    <para>
+      There will probably be more nodes skipped than sequenced, since there are more
+      <code>nt:folder</code>
+      and
+      <code>nt:resource</code>
+      nodes than there are
+      <code>nt:file</code>
+      nodes with acceptable names.
+    </para>
+  </note>
+  <para>You can repeat this process with other files. Any file that isn't an image or MP3 files (as recognized by the sequencing configurations
+    that we'll describe later) will not be sequenced.</para>
+  </sect1>
+  <sect1 id="downloading_and_running_review">
+    <title>Summarizing what we just did</title>
+    <para>In this chapter you downloaded and installed the example application and used it to upload files into a
+    JCR repository.  JBoss DNA automatically sequenced the image and/or MP3 files you uploaded, extracted the metadata from the
+    files, and stored that metadata inside the repository.  The application allowed you to see this metadata
+    and the sequencing statistics.</para>
+    <para>This application was very simplistic.  In fact, running through the example probably only took you a minute or two.
+    So while this application won't win any awards, it does show the basics of what JBoss DNA can do.</para>
+    <para>In the <link linkend="using_dna">next chapter</link> we'll venture into the code to get an understanding
+    of how JBoss DNA actually works and how you can use it in your own applications.</para>
+  </sect1>
+  </chapter>
+  
+  <!--  ====================================================================================================
+                                                   Chapter 
+        ====================================================================================================   -->
+<chapter id="using_dna">
+  <title>Using JBoss DNA</title>
+  <para>As we've mentioned before, JBoss DNA is able to work with existing JCR repositories.  Your client applications
+  make changes to the information in those repositories, and JBoss DNA automatically uses its sequencers to extract
+  additional information from the uploaded files.</para>
+  <note>
+    <para>Configuring JBoss DNA sequencers is a bit more manual than is ideal. As you'll see, JBoss DNA uses dependency
+      injection to allow a great deal of flexibility in how it can be configured and customized. However, the next release will
+      provide a much easier mechanism for configuring not only the sequencer service but also the upcoming federation engine and
+      JCR implementation.</para>
+  </note>
+  <sect1 id="sequencing_service">
+    <title>Configuring the Sequencing Service</title>
+    <para>
+      The JBoss DNA <emphasis>sequencing service</emphasis> is the component that manages the <emphasis>sequencers</emphasis>
+      , reacting to changes in JCR repositories and then running the appropriate sequencers.
+      This involves processing the changes on a node, determining which (if any) sequencers should be run on that node,
+      and for each sequencer constructing the execution environment, calling the sequencer, and saving the information
+      generated by the sequencer.</para>
+    <para>To set up the sequencing service, an instance is created, and dependent components are injected into
+      the object.  This includes among other things:
+      <itemizedlist>
+        <listitem>
+          <para>An <emphasis>execution context</emphasis> that defines the context in which the service runs, including
+        a factory for JCR sessions given names of the repository and workspace.  This factory must be configured,
+        and is how JBoss DNA knows about your JCR repositories and how to connect to them.  More on this a bit later.</para>
+        </listitem>
+        <listitem>
+          <para>An optional <emphasis>factory for class loaders</emphasis> used to load sequencers.  If no factory is supplied,
+        the service uses the current thread's context class loader (or if that is null, the class loader that loaded the
+        sequencing service class).</para>
+        </listitem>
+        <listitem>
+          <para>An <code>java.util.concurrent.ExecutorService</code> used to execute the sequencing activites.  If none
+        is supplied, a new single-threaded executor is created by calling <code>Executors.newSingleThreadExecutor()</code>.
+        (This can easily be changed by subclassing and overriding the <code>SequencerService.createDefaultExecutorService()</code> method.)</para>
+        </listitem>
+        <listitem>
+          <para>Filters for sequencers and events.  By default, all sequencers are considered for "node added", "property added"
+        and "property changed" events.</para>
+        </listitem>
+      </itemizedlist>
+      </para>
+      <para>As mentioned above, the <code>ExecutionContext</code> provides access to a <code>SessionFactory</code> that is used
+      by JBoss DNA to establish sessions to your JCR repositories.  Two implementations are available:
+      <itemizedlist>
+        <listitem>
+          <para>The <code>JndiSessionFactory</code> looks up JCR <code>Repository</code> instances in JNDI using
+          names that are supplied when creating sessions.  This implementation also has methods to set the
+          JCR <code>Credentials</code> for a given workspace name.</para>
+        </listitem>
+        <listitem>
+          <para>The <code>SimpleSessionFactory</code> has methods to register the JCR <code>Repository</code> instances
+          with names, as well as methods to set the JCR <code>Credentials</code> for a given workspace name.</para>
+        </listitem>
+      </itemizedlist>
+      You can use the <code>SimpleExecutionContext</code> implementation of <code>ExecutionContext</code> and supply
+      a <code>SessionFactory</code> instance, or you can provide your own implementation.
+      </para>
+      <para>Here's an example of how to instantiate and configure the SequencingService:
+      <programlisting>
+SimpleSessionFactory sessionFactory = new SimpleSessionFactory();
+sessionFactory.registerRepository("Main Repository", this.repository);
+Credentials credentials = new SimpleCredentials("jsmith", "secret".toCharArray());
+sessionFactory.registerCredentials("Main Repository/Workspace1", credentials);
+ExecutionContext executionContext = new SimpleExecutionContext(sessionFactory);
+
+// Create the sequencing service, passing in the execution context ...
+SequencingService sequencingService = new SequencingService();
+sequencingService.setExecutionContext(executionContext);</programlisting>
+      </para>
+      <para>After the sequencing service is created and configured, it must be started.  The SequencingService
+      has an <emphasis>administration object</emphasis> (that is an instance of <code>ServiceAdministrator</code>)
+      with <code>start()</code>, <code>pause()</code>, and <code>shutdown()</code> methods.  The latter method will 
+      close the queue for sequencing, but will allow sequencing operations already running to complete normally.
+      To wait until all sequencing operations have completed, simply call the <code>awaitTermination</code> method
+      and pass it the maximum amount of time you want to wait.</para>
+      <para>
+      <programlisting>
+sequencingService.getAdministrator().start();</programlisting>
+      </para>
+      <para>The sequencing service must also be configured with the sequencers that it will use.  This is done using the
+      <code>addSequencer(SequencerConfig)</code> method and passing a <code>SequencerConfig</code> instance that
+      you create.  Here's an example:
+      <programlisting>
+String name = "Image Sequencer";
+String desc = "Sequences image files to extract the characteristics of the image";
+String classname = "org.jboss.dna.sequencer.images.ImageMetadataSequencer";
+String[] classpath = null; // Use the current classpath
+String[] pathExpressions = {"//(*.(jpg|jpeg|gif|bmp|pcx|png))[*]/jcr:content[@jcr:data] => /images/$1"};
+SequencerConfig imageSequencerConfig = new SequencerConfig(name, desc, classname, classpath, pathExpressions);
+sequencingService.addSequencer(imageSequencerConfig);
+
+name = "Mp3 Sequencer";
+desc = "Sequences mp3 files to extract the id3 tags of the audio file";
+classname = "org.jboss.dna.sequencer.mp3.Mp3MetadataSequencer";
+String[] mp3PathExpressions = {"//(*.mp3)[*]/jcr:content[@jcr:data] => /mp3s/$1"};
+SequencerConfig mp3SequencerConfig = new SequencerConfig(name, desc, classname, classpath, mp3PathExpressions);
+sequencingService.addSequencer(mp3SequencerConfig);</programlisting>
+      This is pretty self-explanatory, except for the <code>classpath</code> and <code>pathExpression</code> parameters.
+      The classpath parameter defines the classpath that is passed to the class loader factory mentioned above.
+      Our sequencer is on the classpath, so we can simply use <code>null</code> here.
+      </para>
+      <para>The path expression is more complicated.  Sequencer path expressions are used by the sequencing service to
+      determine whether a particular changed node should be sequenced.  The expressions consist of two parts: a selection
+      criteria and an output expression.  Here's a simple example:
+      <programlisting>
+/a/b/c at title =&gt; /d/e/f</programlisting>
+      Here, the <code>/a/b/c at title</code> is the selection criteria that applies when the <code>/a/b/c</code> node has a <code>title</code> property
+      that is added or changed.  When the selection criteria matches a change event, the sequencer will be run
+      and any generated output will be inserted into the repository described by the output expression.  In this example,
+      the generated output would be placed at the <code>/d/e/f</code> node.
+      </para>
+      <note>
+        <para>Sequencer path expressions can be fairly complex and may use wildcards, specificy same-name sibling indexes,
+        provide optional and choice elements, and may capture parts of the selection criteria for use in the output expression.
+        The path expression used in the image sequencer configuration example above shows a more complex example:
+        <programlisting>
+//(*.(jpg|jpeg|gif|bmp|pcx|png))[*]/jcr:content[@jcr:data] => /images/$1</programlisting>
+        This uses "//" to select any node at any level in the repository whose name ends with "." and one of the extensions (e.g., ".jpg", ".jpeg", etc.)
+        and that has a child node named "jcr:content" that has a "jcr:data" property.  It also selects the file name
+        as the first capture group (the first set of parentheses) for use in the output expression.
+        In this example, any sequencer output is placed on a node with that same file name under the "/images" node.
+        </para>
+        <para></para>
+        <para>Other things are possible, too.  For example, the name of the repository/workspace (as used by the <code>SessionFactory</code>)
+        may be specified at the beginning of the select criteria and/or the output expression.  This means it's possible to place
+        the sequencer output in a different repository than the node being sequenced.</para>
+        <para>For more detail about sequencer path expressions, see the <code>org.jboss.dna.repository.sequencer.SequencerPathExpression</code>
+        class and the corresponding <code>org.jboss.dna.repository.sequencer.SequencerPathExpressionTest</code> test case.</para>
+      </note>
+      <para>After the service is started, it is ready to start reacting to changes in the repository.  But it first
+      must be wired to the repositories using a listener.  This is accomplished using the <code>ObservationService</code>
+      described in the <link linkend="observation_service">next section</link>.</para>
+  </sect1>
+  <sect1 id="observation_service">
+    <title>Configuring the Observation Service</title>
+    <para>The JBoss DNA <code>ObservationService</code> is responsible for listening to one or more JCR repositories
+    and multiplexing the events to its listeners.  Unlike JCR events, this framework embeds in the events the
+    name of the repository and workspace that can be passed to a <code>SessionFactory</code> to obtain a session
+    to the repository in which the change occurred.  This simple design makes it very easy for JBoss DNA to
+    concurrently work with multiple JCR repositories.</para>
+    <para>Configuring an observation service is pretty easy, especially if you reuse the same <code>SessionFactory</code>
+    supplied to the sequencing service.  Here's an example:
+    <programlisting>
+this.observationService = new ObservationService(sessionFactory);
+this.observationService.getAdministrator().start();</programlisting>
+    </para> 
+    <note>
+    <para>Both <code>ObservationService</code> and <code>SequencingService</code> implement
+    <code>AdministeredService</code>, which has a <code>ServiceAdministrator</code> used to start, pause, and shutdown the
+    service.  In other words, the lifecycle of the services are managed in the same way.</para>
+    </note>
+    <para>
+    After the observation service is started, listeners can be added.  The <code>SequencingService</code> implements the required
+    interface, and so it may be registered directly:
+    <programlisting>
+observationService.addListener(sequencingService);</programlisting>
+    </para>
+    <para>Finally, the observation service must be wired to monitor one of your JCR repositories.  This is done with
+    one of the <code>monitor(...)</code> methods:
+    <programlisting>
+int eventTypes = Event.NODE_ADDED | Event.PROPERTY_ADDED | Event.PROPERTY_CHANGED;
+observationService.monitor("Main Repository/Workspace1", eventTypes);</programlisting>
+    </para>
+    <para>At this point, the observation service is listening to a JCR repository and forwarding the appropriate events
+    to the sequencing service, which will asynchronously process the changes and sequence the information added to or changed in the repository.
+    </para>
+  </sect1>
+  <sect1 id="shutting_down">
+    <title>Shutting down JBoss DNA services</title>
+    <para>The JBoss DNA services are utilizing resources and threads that must be released before your application is ready to shut down.
+    The safe way to do this is to simply obtain the <code>ServiceAdministrator</code> for each service (via the <code>getServiceAdministrator()</code> method)
+    and call <code>shutdown()</code>.  As previously mentioned, the shutdown method will simply prevent new work from being processed
+    and will not wait for existing work to be completed.  If you want to wait until the service completes all its work, you must wait
+    until the service terminates.  Here's an example that shows how this is done:
+    <programlisting>
+// Shut down the service and wait until it's all shut down ...
+sequencingService.getAdministrator().shutdown();
+sequencingService.getAdministrator().awaitTermination(5, TimeUnit.SECONDS);
+
+// Shut down the observation service ...
+observationService.getAdministrator().shutdown();
+observationService.getAdministrator().awaitTermination(5, TimeUnit.SECONDS);</programlisting>
+    </para>
+    <para>At this point, we've covered how to configure and use the JBoss DNA services in your application.
+    The next chapter goes back to the <link linkend="downloading_and_running">sample application</link> to show how all these pieces fit together.</para>
+  </sect1>
+  <sect1 id="example_application_review">
+    <title>Reviewing the example application</title>
+    <para>Recall that the example application 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 an image sequencer 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.  Or, if the client uploads
+      MP3 audio files, the title, author, album, year, and comment are extracted from the audio file and stored in the repository.</para>
+    <para>
+      The example is comprised of 3 classes and 1 interface, located in the
+      <code>src/main/java</code>
+      directory:
+      <programlisting>
+  org/jboss/example/dna/sequencers/ConsoleInput.java
+                                  /MediaInfo.java
+                                  /SequencingClient.java
+                                  /UserInterface.java</programlisting>
+    </para>
+    <para>
+      <code>SequencingClient</code>
+      is the class that contains the main application.
+      <code>MediaInfo</code>
+      is a simple Java object that encapsulates metadata about a media file (as generated by the sequencer), and used by the client to
+      pass information to the
+      <code>UserInterface</code>
+      , which 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
+      <code>UserInterface</code>
+      at a later date. 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 automatically using conventional JUnit test cases, as demonstrated by the
+      code in the
+      <code>src/test/java</code>
+      directory:
+      <programlisting>
+  org/jboss/example/dna/sequencers/SequencingClientTest.java
+                                  /MockUserInterface.java</programlisting>
+    </para>
+    <para>
+      If we look at the
+      <code>SequencingClient</code>
+      code, there are a handful of methods that encapsulate the various activities.
+    </para>
+    <note>
+      <para>To keep the code shown in this book as readable as possible, some of the comments and error handling
+      have been removed.</para>
+    </note>
+    <para>
+      The
+      <code>startRepository()</code>
+      method starts up an in-memory Jackrabbit JCR repository. The bulk of this method is simply gathering and passing the
+      information required by Jackrabbit. Because Jackrabbit's
+      <code>TransientRepository</code>
+      implementation shuts down after the last session is closed, the application maintains a session to ensure that the
+      repository remains open throughout the application's lifetime. And finally, the node type needed by the image sequencer is
+      registered with Jackrabbit.
+    </para>
+    <programlisting>
+public void startRepository() throws Exception {
+    if (this.repository == null) {
+        try {
+
+            // Load the Jackrabbit configuration ...
+            File configFile = new File(this.jackrabbitConfigPath);
+            String pathToConfig = configFile.getAbsolutePath();
+
+            // Find the directory where the Jackrabbit repository data will be stored ...
+            File workingDirectory = new File(this.workingDirectory);
+            String workingDirectoryPath = workingDirectory.getAbsolutePath();
+
+            // Get the Jackrabbit custom node definition (CND) file ...
+            URL cndFile = Thread.currentThread().getContextClassLoader().getResource("jackrabbitNodeTypes.cnd");
+
+            // Create the Jackrabbit repository instance and establish a session to keep the repository alive ...
+            this.repository = new TransientRepository(pathToConfig, workingDirectoryPath);
+            if (this.username != null) {
+                Credentials credentials = new SimpleCredentials(this.username, this.password);
+                this.keepAliveSession = this.repository.login(credentials, this.workspaceName);
+            } else {
+                this.keepAliveSession = this.repository.login();
+            }
+
+            try {
+                // Register the node types (only valid the first time) ...
+                JackrabbitNodeTypeManager mgr = (JackrabbitNodeTypeManager)this.keepAliveSession.getWorkspace().getNodeTypeManager();
+                mgr.registerNodeTypes(cndFile.openStream(), JackrabbitNodeTypeManager.TEXT_X_JCR_CND);
+            } catch (RepositoryException e) {
+                if (!e.getMessage().contains("already exists")) throw e;
+            }
+
+        } catch (Exception e) {
+            this.repository = null;
+            this.keepAliveSession = null;
+            throw e;
+        }
+    }
+}</programlisting>
+    <para>As you can see, this method really has nothing to do with JBoss DNA, other than setting up a JCR repository that JBoss
+      DNA will use.</para>
+    <para>
+      The
+      <code>shutdownRepository()</code>
+      method shuts down the Jackrabbit transient repository by closing the "keep-alive session". Again, this method really does
+      nothing specifically with JBoss DNA, but is needed to manage the JCR repository that JBoss DNA uses.
+      <programlisting>
+public void shutdownRepository() throws Exception {
+    if (this.repository != null) {
+        try {
+            this.keepAliveSession.logout();
+        } finally {
+            this.repository = null;
+            this.keepAliveSession = null;
+        }
+    }
+}</programlisting>
+    </para>
+    <para>
+      The
+      <code>startDnaServices()</code>
+      method first starts the JCR repository (if it was not already started), and proceeds to create and configure the
+      <code>SequencingService</code>
+      as described
+      <link linkend="sequencing_service">earlier</link>
+      . This involes setting up the
+      <code>SessionFactory</code>
+      and
+      <code>ExecutionContext</code>
+      , creating the
+      <code>SequencingService</code>
+      instance, and configuring the image sequencer. The method then continues by setting up the
+      <code>ObservationService</code>
+      as described
+      <link linkend="observation_service">earlier</link>
+      and starting the service.
+      <programlisting>
+public void startDnaServices() throws Exception {
+    if (this.repository == null) this.startRepository();
+    if (this.sequencingService == null) {
+
+        SimpleSessionFactory sessionFactory = new SimpleSessionFactory();
+        sessionFactory.registerRepository(this.repositoryName, this.repository);
+        if (this.username != null) {
+            Credentials credentials = new SimpleCredentials(this.username, this.password);
+            sessionFactory.registerCredentials(this.repositoryName + "/" + this.workspaceName, credentials);
+        }
+        this.executionContext = new SimpleExecutionContext(sessionFactory);
+
+        // Create the sequencing service, passing in the execution context ...
+        this.sequencingService = new SequencingService();
+        this.sequencingService.setExecutionContext(executionContext);
+
+        // Configure the sequencers.
+        String name = "Image Sequencer";
+        String desc = "Sequences image files to extract the characteristics of the image";
+        String classname = "org.jboss.dna.sequencer.images.ImageMetadataSequencer";
+        String[] classpath = null; // Use the current classpath
+        String[] pathExpressions = {"//(*.(jpg|jpeg|gif|bmp|pcx|png|iff|ras|pbm|pgm|ppm|psd))[*]/jcr:content[@jcr:data] => /images/$1"};
+        SequencerConfig imageSequencerConfig = new SequencerConfig(name, desc, classname, classpath, pathExpressions);
+        this.sequencingService.addSequencer(imageSequencerConfig);
+
+        // Set up the MP3 sequencer ...
+        name = "Mp3 Sequencer";
+        desc = "Sequences mp3 files to extract the id3 tags of the audio file";
+        classname = "org.jboss.dna.sequencer.mp3.Mp3MetadataSequencer";
+        String[] mp3PathExpressions = {"//(*.mp3)[*]/jcr:content[@jcr:data] => /mp3s/$1"};
+        SequencerConfig mp3SequencerConfig = new SequencerConfig(name, desc, classname, classpath, mp3PathExpressions);
+        this.sequencingService.addSequencer(mp3SequencerConfig);
+
+        // Use the DNA observation service to listen to the JCR repository (or multiple ones), and
+        // then register the sequencing service as a listener to this observation service...
+        this.observationService = new ObservationService(this.executionContext.getSessionFactory());
+        this.observationService.getAdministrator().start();
+        this.observationService.addListener(this.sequencingService);
+        this.observationService.monitor(this.repositoryName + "/" + this.workspaceName, Event.NODE_ADDED | Event.PROPERTY_ADDED | Event.PROPERTY_CHANGED);
+    }
+    // Start up the sequencing service ...
+    this.sequencingService.getAdministrator().start();
+}</programlisting>
+    </para>
+    <para>
+      The
+      <code>shutdownDnaServices()</code>
+      method is pretty straightforward: it just calls shutdown on each of the services and waits until they terminate.
+      <programlisting>
+public void shutdownDnaServices() throws Exception {
+    if (this.sequencingService == null) return;
+
+    // Shut down the service and wait until it's all shut down ...
+    this.sequencingService.getAdministrator().shutdown();
+    this.sequencingService.getAdministrator().awaitTermination(5, TimeUnit.SECONDS);
+
+    // Shut down the observation service ...
+    this.observationService.getAdministrator().shutdown();
+    this.observationService.getAdministrator().awaitTermination(5, TimeUnit.SECONDS);
+}</programlisting>
+    </para>
+    <para>None of the other methods really do anything with JBoss DNA <emphasis>per se</emphasis>. Instead, they merely work with the repository
+      using the JCR API.</para>
+    <para>
+      The <code>main</code> method of the <code>SequencingClient</code> class creates a <code>SequencingClient</code> instance,
+      and passes a new <code>ConsoleInput</code> instance:
+      <programlisting>
+public static void main( String[] args ) throws Exception {
+    SequencingClient client = new SequencingClient();
+    client.setRepositoryInformation("repo", "default", "jsmith", "secret".toCharArray());
+    client.setUserInterface(new ConsoleInput(client));
+}</programlisting>
+      </para>
+      <para>If we look at the
+      <code>ConsoleInput</code>
+      constructor, it starts the repository, the DNA services, and a thread for the user interface. At this point, the constructor
+      returns, but the main application continues under the user interface thread.  When the user requests to quit,
+      the user interface thread also shuts down the DNA services and JCR repository.
+      <programlisting>
+public ConsoleInput( SequencerClient client ) {
+  try {
+      client.startRepository();
+      client.startDnaServices();
+  
+      System.out.println(getMenu());
+      Thread eventThread = new Thread(new Runnable() {
+          private boolean quit = false;
+          public void run() {
+              try {
+                  while (!quit) {
+                      // Display the prompt and process the requested operation ...
+                  }
+              } finally {
+                  try {
+                      // Terminate ...
+                      client.shutdownDnaServices();
+                      client.shutdownRepository();
+                  } catch (Exception err) {
+                      System.out.println("Error shutting down sequencing service and repository: " + err.getLocalizedMessage());
+                      err.printStackTrace(System.err);
+                  }
+              }
+          }
+      });
+      eventThread.start();
+  } catch (Exception err) {
+      System.out.println("Error: " + err.getLocalizedMessage());
+      err.printStackTrace(System.err);
+  }
+}</programlisting>
+    </para>
+    <para>At this point, we've reviewed all of the interesting code in the example application.  However, feel free
+    to play with the application, trying different things.
+    </para>
+  </sect1>
+  <sect1 id="using_dna_review">
+    <title>Summarizing what we just did</title>
+    <para>In this chapter we covered the different JBoss DNA components and how they can be used in your application.
+      Specifically, we described how the <code>SequencingService</code> and <code>ObservationService</code> can 
+      be configured and used.  And we ended the chapter by reviewing the example application, which not only uses
+      JBoss DNA, but also the repository via the JCR API.
+    </para>
+  </sect1>
+</chapter>
+  
+<!--  ====================================================================================================
+                                               Chapter 
+      ====================================================================================================   -->
+<chapter id="custom_sequencers">
+  <title>Creating custom sequencers</title>
+  <para>The current release of JBoss DNA comes with two sequencers: one that extracts metadata from a variety of image file formats,
+  and another that extracts some of the ID3 metadata from MP3 audio files.  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>
+  Creating a custom sequencer involves the following steps:
+  <itemizedlist>
+    <listitem>
+      <para>Create a Maven 2 project for your sequencer;</para>
+    </listitem>
+    <listitem>
+      <para>Implement the <code>org.jboss.dna.graph.sequencer.StreamSequencer</code> interface with your own implementation, and create unit tests to verify
+      the functionality and expected behavior;</para>
+    </listitem>
+    <listitem>
+      <para>Add the sequencer configuration to the JBoss DNA <code>SequencingService</code> in your application
+      as described in the <link linkend="using_dna">previous chapter</link>; and</para>
+    </listitem>
+    <listitem>
+      <para>Deploy the JAR file with your implementation (as well as any dependencies), and make them available to JBoss DNA
+      in your application.</para>
+    </listitem>
+  </itemizedlist>
+  It's that simple.
+  </para>
+  <sect1 id="custom_sequencer_project">
+    <title>Creating the Maven 2 project</title>
+    <para>The first step is to create the Maven 2 project that you can use to compile your code and build the JARs.
+    Maven 2 automates a lot of the work, and since you're already <link linkend="downloading_and_running">set up to use Maven</link>,
+    using Maven for your project will save you a lot of time and effort.  Of course, you don't have to use Maven 2, but then you'll
+    have to get the required libraries and manage the compiling and building process yourself.</para>
+    <note>
+      <para>JBoss DNA may provide in the future a Maven archetype for creating sequencer projects.  If you'd find this useful
+        and would like to help create it, please <link linkend="preface">join the community</link>.</para>
+    </note>
+  <note>
+    <para>The <code>dna-sequencer-images</code> project is a small, self-contained sequencer implementation that
+    has only the minimal dependencies.  Starting with this project's source and modifying it to suit your needs may be the easiest way to get started.
+    See the subversion repository: <ulink url="http://anonsvn.jboss.org/repos/dna/trunk/sequencers/dna-sequencer-images/">http://anonsvn.jboss.org/repos/dna/trunk/sequencers/dna-sequencer-images/</ulink>
+    </para>
+  </note>
+    <para>You can create your Maven project any way you'd like.  For examples, see the <ulink url="http://maven.apache.org/guides/getting-started/index.html#How_do_I_make_my_first_Maven_project">Maven 2 documentation</ulink>.  
+    Once you've done that, just add the dependencies in your project's <code>pom.xml</code> dependencies section:
+  <programlisting>
+&lt;dependency&gt;
+  &lt;groupId&gt;org.jboss.dna&lt;/groupId&gt;
+  &lt;artifactId&gt;dna-common&lt;/artifactId&gt;
+  &lt;version&gt;0.1&lt;/version&gt;
+&lt;/dependency&gt;
+&lt;dependency&gt;
+  &lt;groupId&gt;org.jboss.dna&lt;/groupId&gt;
+  &lt;artifactId&gt;dna-graph&lt;/artifactId&gt;
+  &lt;version&gt;0.1&lt;/version&gt;
+&lt;/dependency&gt;
+&lt;dependency&gt;
+  &lt;groupId&gt;org.slf4j&lt;/groupId&gt;
+  &lt;artifactId&gt;slf4j-api&lt;/artifactId&gt;
+&lt;/dependency&gt;
+</programlisting>
+  These are minimum dependencies required for compiling a sequencer.  Of course, you'll have to add
+  other dependencies that your sequencer needs.</para>
+  <para>As for testing, you probably will want to add more dependencies, such as those listed here:
+<programlisting>
+&lt;dependency&gt;
+  &lt;groupId&gt;junit&lt;/groupId&gt;
+  &lt;artifactId&gt;junit&lt;/artifactId&gt;
+  &lt;version&gt;4.4&lt;/version&gt;
+  &lt;scope&gt;test&lt;/scope&gt;
+&lt;/dependency&gt;
+&lt;dependency&gt;
+  &lt;groupId&gt;org.hamcrest&lt;/groupId&gt;
+  &lt;artifactId&gt;hamcrest-library&lt;/artifactId&gt;
+  &lt;version&gt;1.1&lt;/version&gt;
+  &lt;scope&gt;test&lt;/scope&gt;
+&lt;/dependency&gt;
+&lt;!-- Logging with Log4J --&gt;
+&lt;dependency&gt;
+  &lt;groupId&gt;org.slf4j&lt;/groupId&gt;
+  &lt;artifactId&gt;slf4j-log4j12&lt;/artifactId&gt;
+  &lt;version&gt;1.4.3&lt;/version&gt;
+  &lt;scope&gt;test&lt;/scope&gt;
+&lt;/dependency&gt;
+&lt;dependency&gt;
+  &lt;groupId&gt;log4j&lt;/groupId&gt;
+  &lt;artifactId&gt;log4j&lt;/artifactId&gt;
+  &lt;version&gt;1.2.14&lt;/version&gt;
+  &lt;scope&gt;test&lt;/scope&gt;
+&lt;/dependency&gt;
+</programlisting>
+  Testing JBoss DNA sequencers does not require a JCR repository or the JBoss DNA services.  (For more detail,
+  see the <link linkend="testing_custom_sequencers">testing section</link>.)  However, if you want to do
+  integration testing with a JCR repository and the JBoss DNA services, you'll need additional dependencies for these libraries.
+<programlisting>
+&lt;dependency&gt;
+  &lt;groupId&gt;org.jboss.dna&lt;/groupId&gt;
+  &lt;artifactId&gt;dna-repository&lt;/artifactId&gt;
+  &lt;version&gt;0.1&lt;/version&gt;
+  &lt;scope&gt;test&lt;/scope&gt;
+&lt;/dependency&gt;
+&lt;!-- Java Content Repository API --&gt;
+&lt;dependency&gt;
+  &lt;groupId&gt;javax.jcr&lt;/groupId&gt;
+  &lt;artifactId&gt;jcr&lt;/artifactId&gt;
+  &lt;version&gt;1.0.1&lt;/version&gt;
+  &lt;scope&gt;test&lt;/scope&gt;
+&lt;/dependency&gt;
+&lt;!-- Apache Jackrabbit (JCR Implementation) --&gt;
+&lt;dependency&gt;
+  &lt;groupId&gt;org.apache.jackrabbit&lt;/groupId&gt;
+  &lt;artifactId&gt;jackrabbit-api&lt;/artifactId&gt;
+  &lt;version&gt;1.3.3&lt;/version&gt;
+  &lt;scope&gt;test&lt;/scope&gt;
+  &lt;!-- Exclude these since they are included in JDK 1.5 --&gt;
+  &lt;exclusions&gt;
+    &lt;exclusion&gt;
+      &lt;groupId&gt;xml-apis&lt;/groupId&gt;
+      &lt;artifactId&gt;xml-apis&lt;/artifactId&gt;
+    &lt;/exclusion&gt;
+    &lt;exclusion&gt;
+      &lt;groupId&gt;xerces&lt;/groupId&gt;
+      &lt;artifactId&gt;xercesImpl&lt;/artifactId&gt;
+    &lt;/exclusion&gt;
+  &lt;/exclusions&gt;
+&lt;/dependency&gt;
+&lt;dependency&gt;
+  &lt;groupId&gt;org.apache.jackrabbit&lt;/groupId&gt;
+  &lt;artifactId&gt;jackrabbit-core&lt;/artifactId&gt;
+  &lt;version&gt;1.3.3&lt;/version&gt;
+  &lt;scope&gt;test&lt;/scope&gt;
+  &lt;!-- Exclude these since they are included in JDK 1.5 --&gt;
+  &lt;exclusions&gt;
+    &lt;exclusion&gt;
+      &lt;groupId&gt;xml-apis&lt;/groupId&gt;
+      &lt;artifactId&gt;xml-apis&lt;/artifactId&gt;
+    &lt;/exclusion&gt;
+    &lt;exclusion&gt;
+      &lt;groupId&gt;xerces&lt;/groupId&gt;
+      &lt;artifactId&gt;xercesImpl&lt;/artifactId&gt;
+    &lt;/exclusion&gt;
+  &lt;/exclusions&gt;
+&lt;/dependency&gt;
+</programlisting>
+  </para>
+  <para>At this point, your project should be set up correctly, and you're ready to move on to 
+  <link linkend="custom_sequencer_implementation">writing the Java implementation</link> for your sequencer.
+  </para>
+  </sect1>
+  <sect1 id="custom_sequencer_implementation">
+    <title>Implementing the StreamSequencer interface</title>
+    <para>After creating the project and setting up the dependencies, the next step is to create a Java class that implements
+    the <code>org.jboss.dna.graph.sequencer.StreamSequencer</code> interface.  This interface is very straightforward
+    and involves a single method:
+    <programlisting>
+public interface StreamSequencer {
+
+    /**
+     * Sequence the data found in the supplied stream, placing the output 
+     * information into the supplied map.
+     *
+     * @param stream the stream with the data to be sequenced; never null
+     * @param output the output from the sequencing operation; never null
+     * @param progressMonitor the progress monitor that should be kept 
+     *   updated with the sequencer's progress and that should be
+     *   frequently consulted as to whether this operation has been cancelled.
+     */
+    void sequence( InputStream stream, SequencerOutput output, 
+                   ProgressMonitor progressMonitor );</programlisting>
+    </para>
+    <para>The job of a stream sequencer is to process the data in the supplied stream, and place into the <code>SequencerOutput</code> 
+    any information that is to go into the JCR repository.  JBoss DNA figures out when your sequencer should be called
+    (of course, using the sequencing configuration you'll add in a bit), and then makes sure the generated information
+    is saved in the correct place in the repository.  
+    </para>
+    <para>The <code>SequencerOutput</code> class is fairly easy to use.  There are basically two methods you need to call.
+    One method sets the property values, while the other sets references to other nodes in the repository.  Use these
+    methods to describe the properties of the nodes you want to create, using relative paths for the nodes and
+    valid JCR property names for properties and references.  JBoss DNA will ensure that nodes are created or updated
+    whenever they're needed.
+    <programlisting>
+public interface SequencerOutput {
+
+  /**
+   * Set the supplied property on the supplied node.  The allowable
+   * values are any of the following:
+   *   - primitives (which will be autoboxed)
+   *   - String instances
+   *   - String arrays
+   *   - byte arrays
+   *   - InputStream instances
+   *   - Calendar instances
+   *
+   * @param nodePath the path to the node containing the property; 
+   * may not be null
+   * @param property the name of the property to be set
+   * @param values the value(s) for the property; may be empty if 
+   * any existing property is to be removed
+   */
+  void setProperty( String nodePath, String property,
+                    Object... values );
+
+  /**
+   * Set the supplied reference on the supplied node.
+   *
+   * @param nodePath the path to the node containing the property; 
+   * may not be null
+   * @param property the name of the property to be set
+   * @param paths the paths to the referenced property, which may be
+   * absolute paths or relative to the sequencer output node;
+   * may be empty if any existing property is to be removed
+   */
+  void setReference( String nodePath, String property,
+                     String... paths );
+}</programlisting>
+    </para>
+      <para>JBoss DNA will create nodes of type <code>nt:unstructured</code> unless you specify the value for the
+      <code>jcr:primaryType</code> property.  You can also specify the values for the <code>jcr:mixinTypes</code> property
+      if you want to add mixins to any node.
+      </para>
+    <para>For a complete example of a sequencer, let's look at the <code>org.jboss.dna.sequencers.image.ImageMetadataSequencer</code> implementation:
+    <programlisting>
+public class ImageMetadataSequencer implements StreamSequencer {
+
+    public static final String METADATA_NODE = "image:metadata";
+    public static final String IMAGE_PRIMARY_TYPE = "jcr:primaryType";
+    public static final String IMAGE_MIXINS = "jcr:mixinTypes";
+    public static final String IMAGE_MIME_TYPE = "jcr:mimeType";
+    public static final String IMAGE_ENCODING = "jcr:encoding";
+    public static final String IMAGE_FORMAT_NAME = "image:formatName";
+    public static final String IMAGE_WIDTH = "image:width";
+    public static final String IMAGE_HEIGHT = "image:height";
+    public static final String IMAGE_BITS_PER_PIXEL = "image:bitsPerPixel";
+    public static final String IMAGE_PROGRESSIVE = "image:progressive";
+    public static final String IMAGE_NUMBER_OF_IMAGES = "image:numberOfImages";
+    public static final String IMAGE_PHYSICAL_WIDTH_DPI = "image:physicalWidthDpi";
+    public static final String IMAGE_PHYSICAL_HEIGHT_DPI = "image:physicalHeightDpi";
+    public static final String IMAGE_PHYSICAL_WIDTH_INCHES = "image:physicalWidthInches";
+    public static final String IMAGE_PHYSICAL_HEIGHT_INCHES = "image:physicalHeightInches";
+
+    /**
+     * {@inheritDoc}
+     */
+    public void sequence( InputStream stream, SequencerOutput output, 
+                          ProgressMonitor progressMonitor ) {
+        progressMonitor.beginTask(10, ImageSequencerI18n.sequencerTaskName);
+
+        ImageMetadata metadata = new ImageMetadata();
+        metadata.setInput(stream);
+        metadata.setDetermineImageNumber(true);
+        metadata.setCollectComments(true);
+
+        // Process the image stream and extract the metadata ...
+        if (!metadata.check()) {
+            metadata = null;
+        }
+        progressMonitor.worked(5);
+        if (progressMonitor.isCancelled()) return;
+
+        // Generate the output graph if we found useful metadata ...
+        if (metadata != null) {
+            // Place the image metadata into the output map ...
+            output.setProperty(METADATA_NODE, IMAGE_PRIMARY_TYPE, "image:metadata");
+            // output.psetProperty(METADATA_NODE, IMAGE_MIXINS, "");
+            output.setProperty(METADATA_NODE, IMAGE_MIME_TYPE, metadata.getMimeType());
+            // output.setProperty(METADATA_NODE, IMAGE_ENCODING, "");
+            output.setProperty(METADATA_NODE, IMAGE_FORMAT_NAME, metadata.getFormatName());
+            output.setProperty(METADATA_NODE, IMAGE_WIDTH, metadata.getWidth());
+            output.setProperty(METADATA_NODE, IMAGE_HEIGHT, metadata.getHeight());
+            output.setProperty(METADATA_NODE, IMAGE_BITS_PER_PIXEL, metadata.getBitsPerPixel());
+            output.setProperty(METADATA_NODE, IMAGE_PROGRESSIVE, metadata.isProgressive());
+            output.setProperty(METADATA_NODE, IMAGE_NUMBER_OF_IMAGES, metadata.getNumberOfImages());
+            output.setProperty(METADATA_NODE, IMAGE_PHYSICAL_WIDTH_DPI, metadata.getPhysicalWidthDpi());
+            output.setProperty(METADATA_NODE, IMAGE_PHYSICAL_HEIGHT_DPI, metadata.getPhysicalHeightDpi());
+            output.setProperty(METADATA_NODE, IMAGE_PHYSICAL_WIDTH_INCHES, metadata.getPhysicalWidthInch());
+            output.setProperty(METADATA_NODE, IMAGE_PHYSICAL_HEIGHT_INCHES, metadata.getPhysicalHeightInch());
+        }
+
+        progressMonitor.done();
+    }
+}</programlisting>
+    </para>
+    <para>
+    Notice how the image metadata is extracted and the output graph is generated.  A single node is created with the name <code>image:metadata</code>
+    and with the <code>image:metadata</code> node type.  No mixins are defined for the node, but several properties are set on the node
+    using the values obtained from the image metadata.  After this method returns, the constructed graph will be saved to the repository
+    in all of the places defined by its configuration.  (This is why only relative paths are used in the sequencer.)
+    </para>
+    <para>Also note how the progress monitor is used.  Reporting progress through the supplied <code>ProgressMonitor</code> is very easy, and it ensures that JBoss DNA
+     can accurately monitor and report the status of sequencing activities to the users.  At the beginning of the operation, call
+     <code>beginTask(...)</code> with a meaningful message describing
+     the operation and a total for the amount of work that will be done by this sequencer. Then perform the sequencing work,
+     periodically reporting work by specifying the incremental amount of work with the <code>worked(double)</code> method, or
+     by creating a subtask with the <code>createSubtask(double)</code> method and reporting work against that subtask
+     monitor.
+     </para>
+     <para>Your method should periodically use the ProgressMonitor's <code>isCancelled()</code> method to check whether the operation has been
+     cancelled.. If this method returns true, the implementation should abort all work as
+     soon as possible and close any resources that were acquired or opened.
+     </para>
+     <para>
+     Finally, when your sequencing operation is completed, it should call <code>done()</code> on the progress monitor.
+     </para>
+  </sect1>
+  <sect1 id="testing_custom_sequencers">
+    <title>Testing custom sequencers</title>
+    <para>The sequencing framework was designed to make testing sequencers much easier.  In particular, the
+    <code>StreamSequencer</code> interface does not make use of the JCR API.  So instead of requiring a fully-configured
+    JCR repository and JBoss DNA system, unit tests for a sequencer can focus on testing that the content is
+    processed correctly and the desired output graph is generated.</para>
+    <note>
+      <para>For a complete example of a sequencer unit test, see the <code>ImageMetadataSequencerTest</code> unit test
+      in the <code>org.jboss.dna.sequencer.images</code> package of the <code>dna-sequencers-image</code> project.
+      </para>
+    </note>
+    <para>The following code fragment shows one way of testing a sequencer, using JUnit 4.4 assertions and 
+      some of the classes made available by JBoss DNA.  Of course,
+      this example code does not do any error handling and does not make all the assertions a real test would.
+    <programlisting>
+Sequencer sequencer = new ImageMetadataSequencer();
+MockSequencerOutput output = new MockSequencerOutput();
+ProgressMonitor progress = new SimpleProgressMonitor("Test activity");
+InputStream stream = null;
+try {
+    stream = this.getClass().getClassLoader().getResource("caution.gif").openStream();
+    sequencer.sequence(stream,output,progress);   // writes to 'output'
+    assertThat(output.getPropertyValues("image:metadata", "jcr:primaryType"), 
+               is(new Object[] {"image:metadata"}));
+    assertThat(output.getPropertyValues("image:metadata", "jcr:mimeType"), 
+               is(new Object[] {"image/gif"}));
+    // ... make more assertions here
+    assertThat(output.hasReferences(), is(false));
+} finally {
+    stream.close();
+}</programlisting>
+  </para>
+  <para>It's also useful to test that a sequencer produces no output for something it should not understand:
+    <programlisting>
+Sequencer sequencer = new ImageMetadataSequencer();
+MockSequencerOutput output = new MockSequencerOutput();
+ProgressMonitor progress = new SimpleProgressMonitor("Test activity");
+InputStream stream = null;
+try {
+    stream = this.getClass().getClassLoader().getResource("caution.pict").openStream();
+    sequencer.sequence(stream,output,progress);   // writes to 'output'
+    assertThat(output.hasProperties(), is(false));
+    assertThat(output.hasReferences(), is(false));
+} finally {
+    stream.close();
+}</programlisting>
+    </para>
+    <para>These are just two simple tests that show ways of testing a sequencer.  Some tests may get quite involved,
+    especially if a lot of output data is produced.  
+    </para>
+    <para>It may also be useful to create some integration tests
+    that <link linkend="using_dna">configure JBoss DNA</link> to use a custom sequencer, and to then upload
+    content using the JCR API, verifying that the custom sequencer did run.  However, remember that JBoss DNA
+    runs sequencers asynchronously in the background, and you must sychronize your tests to ensure that the
+    sequencers have a chance to run before checking the results.  (One way of doing this (although, granted, not always reliable) is to wait for a second
+    after uploading your content, shutdown the <code>SequencingService</code> and await its termination,
+    and then check that the sequencer output has been saved to the JCR repository.  For an example of this technique,
+    see the <code>SequencingClientTest</code> unit test in the example application.)
+    </para>  
+  </sect1>
+  <sect1 id="deploying_custom_sequencers">
+    <title>Deploying custom sequencers</title>
+    <para>The first step of deploying a sequencer consists of adding/changing the sequencer configuration (e.g., <code>SequencerConfig</code>)
+    in the <code>SequencingService</code>.  This was covered in the <link linkend="sequencing_service">previous chapter</link>.
+    </para>
+    <para>
+    The second step is to make the sequencer implementation available to JBoss DNA.  At this time, the JAR containing 
+    your new sequencer, as well as any JARs that your sequencer depends on, should be placed on your application classpath.</para>
+    <note>
+      <para>A future goal of JBoss DNA is to allow sequencers, connectors, and other extensions to be easily deployed into
+        a runtime repository.  This process will not only be much simpler, but it will also provide JBoss DNA 
+        with the information necessary to update configurations and create the appropriate class loaders for each extension.
+        Having separate class loaders for each extension helps prevent the pollution of the common classpath, 
+        facilitates an isolated runtime environment to eliminate any dependency conflicts, and may potentially
+        enable hot redeployment of newer extension versions.
+      </para>
+    </note>
+  </sect1>
+</chapter>
+  
+<!--  ====================================================================================================
+                                               Chapter 
+      ====================================================================================================   -->
+<chapter id="future_directions">
+  <title>Looking to the future</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.
+  If you're interested in getting involved with the JBoss DNA project, consider picking up one of the sequencers on our
+  <ulink url="http://jira.jboss.org/jira/browse/DNA?report=com.atlassian.jira.plugin.system.project:roadmap-panel">roadmap</ulink>.
+  Or, check out <ulink url="http://jira.jboss.org/jira/secure/IssueNavigator.jspa?reset=true&amp;mode=hide&amp;pid=12310520&amp;sorter/order=DESC&amp;sorter/field=priority&amp;resolution=-1&amp;component=12311436">JIRA</ulink>
+  for the list of sequencers we've thought of.  If you think of one that's not there, please add it to JIRA!
+  </para>
+  <para>
+  The next release will focus on creating the <link linkend="federation">federation engine</link> and connectors
+  for several popular and ubiquitous systems.  The 0.2 release will likely only federate information in a read-only manner,
+  but updates will soon follow.  Also, during the early part of the next release, the JBoss DNA project will switch to use JDK 6.  
+  Java 5 is being end-of-lifed, so we want to move to a supported JDK. However, a number of JBoss projects and products continue to
+  require Java 5, so our next release will most likely use JDK 6 with Java 5 compatibility.</para>
+  <para>
+  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.  If any of these are of interest to you, please <link linkend="preface">get involved</link> in the community.
+  </para>
+</chapter>
+</book>
\ No newline at end of file


Property changes on: trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/master.xml
___________________________________________________________________
Name: svn:mime-type
   + text/plain
Name: svn:keywords
   + Id Revision
Name: svn:eol-style
   + LF

Copied: trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/plugin.xml (from rev 976, trunk/dna-repository/src/test/resources/plugin.xml)
===================================================================
--- trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/plugin.xml	                        (rev 0)
+++ trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/plugin.xml	2009-06-04 22:31:30 UTC (rev 977)
@@ -0,0 +1,91 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse version="3.0"?>
+<!--  (c) 2007 Varsity Gateway LLC.  All rights reserved. -->
+<plugin
+   id="com.metamatrix.metamodels.transformation"
+   name="%pluginName"
+   version="5.5.1"
+   provider-name="%providerName"
+   class="com.metamatrix.metamodels.transformation.TransformationPlugin">
+
+   <runtime>
+      <library name="metamodelsTransformation.jar">
+         <export name="*"/>
+      </library>
+   </runtime>
+   <requires>
+      <import plugin="org.eclipse.emf.mapping" export="true"/>
+      <import plugin="org.eclipse.emf.ecore" export="true"/>
+      <import plugin="org.eclipse.emf.edit" export="true"/>
+      <import plugin="org.eclipse.emf.ecore.edit" export="true"/>
+      <import plugin="org.eclipse.core.runtime" export="true"/>
+      <import plugin="com.metamatrix.core" export="true"/>
+      <import plugin="com.metamatrix.metamodels.core" export="true"/>
+   </requires>
+
+
+<!--
+   	Each extension below represents a single metamodel.  Each metmodel is
+   	registered using under the specified <uri> value which must be the same
+   	eNS_URI value defined in the EPackage class for that metamodel.
+   -->
+   <extension
+         id="transformation"
+         name="%metamodelName"
+         point="com.metamatrix.modeler.core.metamodel">
+      <uri>
+         http://www.metamatrix.com/metamodels/Transformation
+      </uri>
+      <alternateUri>
+         mtkplugin:///com.metamatrix.metamodels.Transformation
+      </alternateUri>
+      <packageClass
+            name="com.metamatrix.metamodels.transformation.TransformationPackage">
+      </packageClass>
+      <adapterClass
+            name="com.metamatrix.metamodels.transformation.provider.TransformationItemProviderAdapterFactory">
+      </adapterClass>
+      <properties
+            createAsPhysical="false"
+            requiresProxies="false"
+            participatoryOnly="true"
+            createAsVirtual="false"
+            supportsDiagrams="false"
+            supportsExtension="true">
+      </properties>
+   </extension>
+   <extension
+         point="org.eclipse.emf.ecore.generated_package">
+      <package
+            uri="http://www.metamatrix.com/metamodels/Transformation"
+            class="com.metamatrix.metamodels.transformation.TransformationPackage">
+      </package>
+   </extension>
+     
+   <extension
+         id="mapping"
+         name="%mappingMetamodelName"
+         point="com.metamatrix.modeler.core.metamodel">
+      <uri>
+         http://www.eclipse.org/emf/2002/Mapping
+      </uri>
+      <alternateUri>
+         mtkplugin:///www.eclipse.org/emf/2002/Mapping
+      </alternateUri>
+      <packageClass
+            name="org.eclipse.emf.mapping.MappingPackage">
+      </packageClass>
+      <adapterClass
+            name="org.eclipse.emf.mapping.provider.MappingItemProviderAdapterFactory">
+      </adapterClass>
+      <properties
+            createAsPhysical="false"
+            requiresProxies="false"
+            participatoryOnly="true"
+            createAsVirtual="false"
+            supportsDiagrams="false"
+            supportsExtension="false">
+      </properties>
+   </extension>
+
+</plugin>


Property changes on: trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/plugin.xml
___________________________________________________________________
Name: svn:mime-type
   + text/plain
Name: svn:keywords
   + Id Revision
Name: svn:eol-style
   + LF

Copied: trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/rule_test.dsl (from rev 976, trunk/dna-repository/src/test/resources/rule_test.dsl)
===================================================================
--- trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/rule_test.dsl	                        (rev 0)
+++ trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/rule_test.dsl	2009-06-04 22:31:30 UTC (rev 977)
@@ -0,0 +1,6 @@
+[when]after {value}								= RuleResult( name == "{value}");
+[when]before {value}							= not RuleResult( name == "{value}");
+[when]filename matches "{value}"	= RuleInput( fileName matches "{value}" );
+[when]header matches "{value}"		= RuleInput( header matches "{value}" );
+[when]mime type is {value}				= RuleInput( mimeType == "{value}" );
+[then]use {value} = insert(new RuleResult("{value}")); output.add("{value}");

Copied: trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/rule_test.dslr (from rev 976, trunk/dna-repository/src/test/resources/rule_test.dslr)
===================================================================
--- trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/rule_test.dslr	                        (rev 0)
+++ trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/rule_test.dslr	2009-06-04 22:31:30 UTC (rev 977)
@@ -0,0 +1,25 @@
+#created on: Jan 4, 2008
+package org.jboss.dna.repository.rules
+
+#list any import classes here.
+
+#reference the expander(s) here
+expander rule_test.dsl
+
+#declare any global variables here
+global java.util.Set output
+
+rule "A"
+	when
+		mime type is text
+		before A
+	then
+		use A
+end
+
+rule "B"
+	when
+		filename matches "someInput.dsl"
+	then
+		use B
+end

Copied: trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/test.au (from rev 976, trunk/dna-repository/src/test/resources/test.au)
===================================================================
(Binary files differ)

Copied: trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/test.bin (from rev 976, trunk/dna-repository/src/test/resources/test.bin)
===================================================================
(Binary files differ)

Copied: trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/test.bmp (from rev 976, trunk/dna-repository/src/test/resources/test.bmp)
===================================================================
(Binary files differ)

Copied: trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/test.dtd (from rev 976, trunk/dna-repository/src/test/resources/test.dtd)
===================================================================
--- trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/test.dtd	                        (rev 0)
+++ trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/test.dtd	2009-06-04 22:31:30 UTC (rev 977)
@@ -0,0 +1,18 @@
+<!ELEMENT magic (info?,match-list)>
+<!ELEMENT info (version?,author?,description?)>
+<!ELEMENT version (#PCDATA)>
+<!ELEMENT author (#PCDATA)>
+<!ELEMENT description (#PCDATA)>
+<!ELEMENT match-list (match*)>
+<!ELEMENT match (mimetype,extension,description,test,submatch-list?)>
+<!ELEMENT extension (#PCDATA)>
+<!ELEMENT mimetype (#PCDATA)>
+<!ELEMENT description (#PCDATA)>
+<!ELEMENT test (#PCDATA)>
+<!ATTLIST test offset CDATA "0">
+<!ATTLIST test type CDATA "string">
+<!ATTLIST test bitmask CDATA "">
+<!ATTLIST test comparator CDATA "=">
+<!ELEMENT submatch-list (match+)>
+	       
+               

Copied: trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/test.emf (from rev 976, trunk/dna-repository/src/test/resources/test.emf)
===================================================================
(Binary files differ)

Copied: trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/test.eps (from rev 976, trunk/dna-repository/src/test/resources/test.eps)
===================================================================
--- trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/test.eps	                        (rev 0)
+++ trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/test.eps	2009-06-04 22:31:30 UTC (rev 977)
@@ -0,0 +1,338 @@
+%!PS-Adobe-3.0 EPSF-3.0
+%%Creator: GIMP PostScript file plugin V 1.16 by Peter Kirchgessner
+%%Title: /home/arimus/test.eps
+%%CreationDate: Tue Jun 15 19:43:49 2004
+%%DocumentData: Clean7Bit
+%%LanguageLevel: 2
+%%Pages: 1
+%%BoundingBox: 14 14 115 115
+%%EndComments
+%%BeginProlog
+% Use own dictionary to avoid conflicts
+10 dict begin
+%%EndProlog
+%%Page: 1 1
+% Translate for offset
+14.173228346456694 14.173228346456694 translate
+% Translate to begin of first scanline
+0 99.999999999999986 translate
+99.999999999999986 -99.999999999999986 scale
+% Image geometry
+100 100 8
+% Transformation matrix
+[ 100 0 0 100 0 0 ]
+% Strings to hold RGB-samples per scanline
+/rstr 100 string def
+/gstr 100 string def
+/bstr 100 string def
+{currentfile /ASCII85Decode filter /RunLengthDecode filter rstr readstring pop}
+{currentfile /ASCII85Decode filter /RunLengthDecode filter gstr readstring pop}
+{currentfile /ASCII85Decode filter /RunLengthDecode filter bstr readstring pop}
+true 3
+%%BeginData:         4976 ASCII Bytes
+colorimage
+Sc=3~>
+Sc=3~>
+Sc=3~>
+Sc=3~>
+Sc=3~>
+Sc=3~>
+Sc=3~>
+Sc=3~>
+Sc=3~>
+Sc=3~>
+Sc=3~>
+Sc=3~>
+Sc=3~>
+Sc=3~>
+Sc=3~>
+Sc=3~>
+Sc=3~>
+Sc=3~>
+Sc=3~>
+Sc=3~>
+Sc=3~>
+Sc=3~>
+Sc=3~>
+Sc=3~>
+Sc=3~>
+Sc=3~>
+Sc=3~>
+Sc=3~>
+Sc=3~>
+Sc=3~>
+Sc=3~>
+Sc=3~>
+Sc=3~>
+Sc=3~>
+Sc=3~>
+Sc=3~>
+Sc=3~>
+Sc=3~>
+Sc=3~>
+Sc=3~>
+Sc=3~>
+Sc=3~>
+Sc=3~>
+Sc=3~>
+Sc=3~>
+Sc=3~>
+Sc=3~>
+Sc=3~>
+Sc=3~>
+Sc=3~>
+Sc=3~>
+Sc=3~>
+Sc=3~>
+Sc=3~>
+Sc=3~>
+Sc=3~>
+Sc=3~>
+Sc=3~>
+Sc=3~>
+Sc=3~>
+Sc=3~>
+Sc=3~>
+Sc=3~>
+Sc=3~>
+Sc=3~>
+Sc=3~>
+Sc=3~>
+Sc=3~>
+Sc=3~>
+Sc=3~>
+Sc=3~>
+Sc=3~>
+Sc=3~>
+Sc=3~>
+Sc=3~>
+Sc=3~>
+Sc=3~>
+Sc=3~>
+Sc=3~>
+Sc=3~>
+Sc=3~>
+Sc=3~>
+Sc=3~>
+Sc=3~>
+Sc=3~>
+Sc=3~>
+Sc=3~>
+Sc=3~>
+Sc=3~>
+Sc=3~>
+Sc=3~>
+Sc=3~>
+Sc=3~>
+Sc=3~>
+Sc=3~>
+Sc=3~>
+Sc=3~>
+Sc=3~>
+Sc=3~>
+Sc=3~>
+Sc=3~>
+Sc=3~>
+Sc=3~>
+Sc=3~>
+Sc=3~>
+Sc=3~>
+Sc=3~>
+Sc=3~>
+Sc=3~>
+Sc=3~>
+Sc=3~>
+p]'IX^]/f~>
+p]'IX^]/f~>
+p]'IX^]/f~>
+p]'IXf`1mMm/MS~>
+p]'IXf`1mMm/MS~>
+p]'IXf`1mMm/MS~>
+p]'IXf`1mMm/MS~>
+p]'IXf`1mMm/MS~>
+p]'IXf`1mMm/MS~>
+mJm+bcN!hCm/MS~>
+mJm+bcN!hCm/MS~>
+mJm+bcN!hCm/MS~>
+mJm+bcN!hCm/MS~>
+mJm+bcN!hCm/MS~>
+mJm+bcN!hCm/MS~>
+mJm+bcN!hCm/MS~>
+mJm+bcN!hCm/MS~>
+mJm+bcN!hCm/MS~>
+mJm+bp\tTsX'R7b!t-Pd[f6"#$/9nr)@?QZ2/^>,s8;ras*t~>
+mJm+bp\tTsX'R7b!t-Pd[f6"#$/9nr)@?QZ2/^>,s8;ras*t~>
+mJm+bp\tTsX'R7b!t-Pd[f6"#$/9nr)@?QZ2/^>,s8;ras*t~>
+mJm+bq#:Aq*V]U81t2:#!qp at 1p](=F[f-6t!;$5@~>
+mJm+bq#:Aq*V]U81t2:#!qp at 1p](=F[f-6t!;$5@~>
+mJm+bq#:Aq*V]U81t2:#!qp at 1p](=F[f-6t!;$5@~>
+mJm+bqYpTqE:j23%)Dc?!W5 at X!<)rh!;$5@~>
+mJm+bqYpTqE:j23%)Dc?!W5 at X!<)rh!;$5@~>
+mJm+bqYpTqE:j23%)Dc?!W5 at X!<)rh!;$5@~>
+mJm+bqYpP=rW!0*?b5S"jeOC*!!*Yfr;Qbbr;[.#[HID]h5*jJ!<)rh!;$5@~>
+mJm+bqYpP=rW!0*?b5S"jeOC*!!*Yfr;Qbbr;[.#[HID]h5*jJ!<)rh!;$5@~>
+mJm+bqYpP=rW!0*?b5S"jeOC*!!*Yfr;Qbbr;[.#[HID]h5*jJ!<)rh!;$5@~>
+mJm+bqu6Z-rVus1_Ya?6pJ(Ve!(m+g!'1#Y!-.i7!SgBFs8;ras*t~>
+mJm+bqu6Z-rVus1_Ya?6pJ(Ve!(m+g!'1#Y!-.i7!SgBFs8;ras*t~>
+mJm+bqu6Z-rVus1_Ya?6pJ(Ve!(m+g!'1#Y!-.i7!SgBFs8;ras*t~>
+mJm+bqu6XJrVur,q>UKd*<#p<d/EtE$iU,+jm`<K!:9`9~>
+mJm+bqu6XJrVur,q>UKd*<#p<d/EtE$iU,+jm`<K!:9`9~>
+mJm+bqu6XJrVur,q>UKd*<#p<d/EtE$iU,+jm`<K!:9`9~>
+mJm+br;Qc5rVupdp\t5OrVuqDrVlj$rVurpnGiFem/MS~>
+mJm+br;Qc5rVupdp\t5OrVuqDrVlj$rVurpnGiFem/MS~>
+mJm+br;Qc5rVupdp\t5OrVuqDrVlj$rVurpnGiFem/MS~>
+mJm+br;Qb:rVuqhp\t6ArVup]rVlj at rVur6nGiFem/MS~>
+mJm+br;Qb:rVuqhp\t6ArVup]rVlj at rVur6nGiFem/MS~>
+mJm+br;Qb:rVuqhp\t6ArVup]rVlj at rVur6nGiFem/MS~>
+mJm+br;QaXrVurEp\t6brVup8rVlk5rVus?\af^u!:9`9~>
+mJm+br;QaXrVurEp\t6brVup8rVlk5rVus?\af^u!:9`9~>
+mJm+br;QaXrVurEp\t6brVup8rVlk5rVus?\af^u!:9`9~>
+mJm+br;Qa5rW)m!rW<'"qu?^$rVloZ(&\+7+DIk?p&Fsjm/MS~>
+mJm+br;Qa5rW)m!rW<'"qu?^$rVloZ(&\+7+DIk?p&Fsjm/MS~>
+mJm+br;Qa5rW)m!rW<'"qu?^$rVloZ(&\+7+DIk?p&Fsjm/MS~>
+mJm+br;Qa#mK!1b!RiOp!!4Zth"^pJ!:9`9~>
+mJm+br;Qa#mK!1b!RiOp!!4Zth"^pJ!:9`9~>
+mJm+br;Qa#mK!1b!RiOp!!4Zth"^pJ!:9`9~>
+mJm+br;Q`umK!.a"8nua#5\B%!b1]rs8;ras*t~>
+mJm+br;Q`umK!.a"8nua#5\B%!b1]rs8;ras*t~>
+mJm+br;Q`umK!.a"8nua#5\B%!b1]rs8;ras*t~>
+mJm+br;Qa-rVurdl2Ln[^4&-Gr;ZjSp&"df!:9`9~>
+mJm+br;Qa-rVurdl2Ln[^4&-Gr;ZjSp&"df!:9`9~>
+mJm+br;Qa-rVurdl2Ln[^4&-Gr;ZjSp&"df!:9`9~>
+mJm+br;QaMrVur?jo5DHJdD>U!/(1Kr;c3aJ,~>
+mJm+br;QaMrVur?jo5DHJdD>U!/(1Kr;c3aJ,~>
+mJm+br;QaMrVur?jo5DHJdD>U!/(1Kr;c3aJ,~>
+mJm+br;Qb-rVuqOj8T+NrVupKqu?Tpm/MS~>
+mJm+br;Qb-rVuqOj8T+NrVupKqu?Tpm/MS~>
+mJm+br;Qb-rVuqOj8T+NrVupKqu?Tpm/MS~>
+mJm+br;Qc'rVusAq;hPUoDS^i#lFW%"o\K%r9aN7~>
+mJm+br;Qc'rVusAq;hPUoDS^i#lFW%"o\K%r9aN7~>
+mJm+br;Qc'rVusAq;hPUoDS^i#lFW%"o\K%r9aN7~>
+mJm+br;Qfq,5qQBHK>)+l2CY_%/^&)'E.t3lL"V%~>
+mJm+br;Qfq,5qQBHK>)+l2CY_%/^&)'E.t3lL"V%~>
+mJm+br;Qfq,5qQBHK>)+l2CY_%/^&)'E.t3lL"V%~>
+mJm+bqu6Z#r;ZkIr:p9m]L)Pr!^XEsq>UG:rVup]qu6XTrVur+mJh\~>
+mJm+bqu6Z#r;ZkIr:p9m]L)Pr!^XEsq>UG:rVup]qu6XTrVur+mJh\~>
+mJm+bqu6Z#r;ZkIr:p9m]L)Pr!^XEsq>UG:rVup]qu6XTrVur+mJh\~>
+mJm+bqYpP8r;[3PNR%"in(Ojb,6.`As8N'),':6Oq>BHb:]17nW;HSpFoD at C-bJmInGe"~>
+mJm+bqYpP8r;[3PNR%"in(Ojb,6.`As8N'),':6Oq>BHb:]17nW;HSpFoD at C-bJmInGe"~>
+mJm+bqYpP8r;[3PNR%"in(Ojb,6.`As8N'),':6Oq>BHb:]17nW;HSpFoD at C-bJmInGe"~>
+mJm+bqYpTqFn,P1s763j at J^!)g'7<PoDa=~>
+mJm+bqYpTqFn,P1s763j at J^!)g'7<PoDa=~>
+mJm+bqYpTqFn,P1s763j at J^!)g'7<PoDa=~>
+mJm+bq#:B(.e`oE"B!/9s7H?n%Z^ParrJo%q#L$dJ,~>
+mJm+bq#:B(.e`oE"B!/9s7H?n%Z^ParrJo%q#L$dJ,~>
+mJm+bq#:B(.e`oE"B!/9s7H?n%Z^ParrJo%q#L$dJ,~>
+mJm+bp\tX#]l#bD"9T5g>b:<Yrs[qfGYTh)#6PG_<1<7Krrq>46Q6C6rW)QiJ,~>
+mJm+bp\tX#]l#bD"9T5g>b:<Yrs[qfGYTh)#6PG_<1<7Krrq>46Q6C6rW)QiJ,~>
+mJm+bp\tX#]l#bD"9T5g>b:<Yrs[qfGYTh)#6PG_<1<7Krrq>46Q6C6rW)QiJ,~>
+Sc=3~>
+Sc=3~>
+Sc=3~>
+Sc=3~>
+Sc=3~>
+Sc=3~>
+Sc=3~>
+Sc=3~>
+Sc=3~>
+Sc=3~>
+Sc=3~>
+Sc=3~>
+Sc=3~>
+Sc=3~>
+Sc=3~>
+Sc=3~>
+Sc=3~>
+Sc=3~>
+Sc=3~>
+Sc=3~>
+Sc=3~>
+Sc=3~>
+Sc=3~>
+Sc=3~>
+Sc=3~>
+Sc=3~>
+Sc=3~>
+Sc=3~>
+Sc=3~>
+Sc=3~>
+Sc=3~>
+Sc=3~>
+Sc=3~>
+Sc=3~>
+Sc=3~>
+Sc=3~>
+Sc=3~>
+Sc=3~>
+Sc=3~>
+Sc=3~>
+Sc=3~>
+Sc=3~>
+Sc=3~>
+Sc=3~>
+Sc=3~>
+Sc=3~>
+Sc=3~>
+Sc=3~>
+Sc=3~>
+Sc=3~>
+Sc=3~>
+Sc=3~>
+Sc=3~>
+Sc=3~>
+Sc=3~>
+Sc=3~>
+Sc=3~>
+Sc=3~>
+Sc=3~>
+Sc=3~>
+Sc=3~>
+Sc=3~>
+Sc=3~>
+Sc=3~>
+Sc=3~>
+Sc=3~>
+Sc=3~>
+Sc=3~>
+Sc=3~>
+Sc=3~>
+Sc=3~>
+Sc=3~>
+Sc=3~>
+Sc=3~>
+Sc=3~>
+Sc=3~>
+Sc=3~>
+Sc=3~>
+Sc=3~>
+Sc=3~>
+Sc=3~>
+Sc=3~>
+Sc=3~>
+Sc=3~>
+Sc=3~>
+Sc=3~>
+Sc=3~>
+Sc=3~>
+Sc=3~>
+Sc=3~>
+Sc=3~>
+Sc=3~>
+Sc=3~>
+Sc=3~>
+Sc=3~>
+Sc=3~>
+Sc=3~>
+Sc=3~>
+Sc=3~>
+Sc=3~>
+Sc=3~>
+Sc=3~>
+Sc=3~>
+Sc=3~>
+Sc=3~>
+%%EndData
+showpage
+%%Trailer
+end
+%%EOF

Copied: trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/test.fli (from rev 976, trunk/dna-repository/src/test/resources/test.fli)
===================================================================
(Binary files differ)

Copied: trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/test.gif (from rev 976, trunk/dna-repository/src/test/resources/test.gif)
===================================================================
(Binary files differ)

Copied: trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/test.ico (from rev 976, trunk/dna-repository/src/test/resources/test.ico)
===================================================================
(Binary files differ)

Copied: trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/test.java (from rev 976, trunk/dna-repository/src/test/resources/test.java)
===================================================================
--- trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/test.java	                        (rev 0)
+++ trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/test.java	2009-06-04 22:31:30 UTC (rev 977)
@@ -0,0 +1,6 @@
+
+public class test {
+	public static void main(String[] args) {
+		System.out.println("this is a test java source file");
+	}
+}


Property changes on: trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/test.java
___________________________________________________________________
Name: svn:mime-type
   + text/plain
Name: svn:keywords
   + Id Revision
Name: svn:eol-style
   + LF

Copied: trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/test.jpg (from rev 976, trunk/dna-repository/src/test/resources/test.jpg)
===================================================================
(Binary files differ)

Copied: trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/test.mp3 (from rev 976, trunk/dna-repository/src/test/resources/test.mp3)
===================================================================
(Binary files differ)

Copied: trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/test.ogg (from rev 976, trunk/dna-repository/src/test/resources/test.ogg)
===================================================================
(Binary files differ)

Copied: trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/test.pcx (from rev 976, trunk/dna-repository/src/test/resources/test.pcx)
===================================================================
(Binary files differ)

Copied: trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/test.pdf (from rev 976, trunk/dna-repository/src/test/resources/test.pdf)
===================================================================
(Binary files differ)

Copied: trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/test.pict (from rev 976, trunk/dna-repository/src/test/resources/test.pict)
===================================================================
(Binary files differ)

Copied: trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/test.pl (from rev 976, trunk/dna-repository/src/test/resources/test.pl)
===================================================================
--- trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/test.pl	                        (rev 0)
+++ trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/test.pl	2009-06-04 22:31:30 UTC (rev 977)
@@ -0,0 +1,5 @@
+#!/usr/bin/perl -w
+
+use strict;
+
+print "this is a test perl script\n";

Copied: trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/test.png (from rev 976, trunk/dna-repository/src/test/resources/test.png)
===================================================================
(Binary files differ)

Copied: trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/test.pnm (from rev 976, trunk/dna-repository/src/test/resources/test.pnm)
===================================================================
(Binary files differ)

Copied: trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/test.ppm (from rev 976, trunk/dna-repository/src/test/resources/test.ppm)
===================================================================
(Binary files differ)

Copied: trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/test.ppt (from rev 976, trunk/dna-repository/src/test/resources/test.ppt)
===================================================================
(Binary files differ)

Copied: trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/test.ps (from rev 976, trunk/dna-repository/src/test/resources/test.ps)
===================================================================
--- trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/test.ps	                        (rev 0)
+++ trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/test.ps	2009-06-04 22:31:30 UTC (rev 977)
@@ -0,0 +1,280 @@
+%!PS-Adobe-2.0
+%%DocumentFonts: Courier Times-Bold
+%%Title: <stdin> (mpage)
+%%Creator: mpage 2.5.1pre2 March 1998
+%%CreationDate: Tue Jun 15 20:04:08 2004
+%%Orientation: Portrait
+%%DocumentMedia: A4 596 842
+%%BoundingBox: 20 20 576 822
+%%Pages: (atend)
+%%EndComments
+
+%%BeginProlog
+
+/mp_stm usertime def
+/mp_pgc statusdict begin pagecount end def
+statusdict begin /jobname (<stdin>) def end
+/reencsmalldict 12 dict def /ReEncodeSmall { reencsmalldict begin
+/newcodesandnames exch def /newfontname exch def /basefontname exch def
+/basefontdict basefontname findfont def /newfont basefontdict maxlength dict def
+basefontdict { exch dup /FID ne { dup /Encoding eq { exch dup length array copy newfont 3 1 roll put } { exch newfont 3 1 roll put }
+ifelse }
+  { pop pop }
+  ifelse } forall
+newfont /FontName newfontname put
+newcodesandnames aload pop newcodesandnames length 2 idiv
+{ newfont /Encoding get 3 1 roll put } repeat
+newfontname newfont definefont pop end } def
+/charvec [
+026 /Scaron
+027 /Ydieresis
+028 /Zcaron
+029 /scaron
+030 /trademark
+031 /zcaron
+032 /space
+033 /exclam
+034 /quotedbl
+035 /numbersign
+036 /dollar
+037 /percent
+038 /ampersand
+039 /quoteright
+040 /parenleft
+041 /parenright
+042 /asterisk
+043 /plus
+044 /comma
+045 /minus
+046 /period
+047 /slash
+048 /zero
+049 /one
+050 /two
+051 /three
+052 /four
+053 /five
+054 /six
+055 /seven
+056 /eight
+057 /nine
+058 /colon
+059 /semicolon
+060 /less
+061 /equal
+062 /greater
+063 /question
+064 /at
+065 /A
+066 /B
+067 /C
+068 /D
+069 /E
+070 /F
+071 /G
+072 /H
+073 /I
+074 /J
+075 /K
+076 /L
+077 /M
+078 /N
+079 /O
+080 /P
+081 /Q
+082 /R
+083 /S
+084 /T
+085 /U
+086 /V
+087 /W
+088 /X
+089 /Y
+090 /Z
+091 /bracketleft
+092 /backslash
+093 /bracketright
+094 /asciicircum
+095 /underscore
+096 /quoteleft
+097 /a
+098 /b
+099 /c
+100 /d
+101 /e
+102 /f
+103 /g
+104 /h
+105 /i
+106 /j
+107 /k
+108 /l
+109 /m
+110 /n
+111 /o
+112 /p
+113 /q
+114 /r
+115 /s
+116 /t
+117 /u
+118 /v
+119 /w
+120 /x
+121 /y
+122 /z
+123 /braceleft
+124 /bar
+125 /braceright
+126 /asciitilde
+127 /.notdef
+128 /fraction
+129 /florin
+130 /quotesingle
+131 /quotedblleft
+132 /guilsinglleft
+133 /guilsinglright
+134 /fi
+135 /fl
+136 /endash
+137 /dagger
+138 /daggerdbl
+139 /bullet
+140 /quotesinglbase
+141 /quotedblbase
+142 /quotedblright
+143 /ellipsis
+144 /dotlessi
+145 /grave
+146 /acute
+147 /circumflex
+148 /tilde
+149 /oe
+150 /breve
+151 /dotaccent
+152 /perthousand
+153 /emdash
+154 /ring
+155 /Lslash
+156 /OE
+157 /hungarumlaut
+158 /ogonek
+159 /caron
+160 /lslash
+161 /exclamdown
+162 /cent
+163 /sterling
+164 /currency
+165 /yen
+166 /brokenbar
+167 /section
+168 /dieresis
+169 /copyright
+170 /ordfeminine
+171 /guillemotleft
+172 /logicalnot
+173 /hyphen
+174 /registered
+175 /macron
+176 /degree
+177 /plusminus
+178 /twosuperior
+179 /threesuperior
+180 /acute
+181 /mu
+182 /paragraph
+183 /periodcentered
+184 /cedilla
+185 /onesuperior
+186 /ordmasculine
+187 /guillemotright
+188 /onequarter
+189 /onehalf
+190 /threequarters
+191 /questiondown
+192 /Agrave
+193 /Aacute
+194 /Acircumflex
+195 /Atilde
+196 /Adieresis
+197 /Aring
+198 /AE
+199 /Ccedilla
+200 /Egrave
+201 /Eacute
+202 /Ecircumflex
+203 /Edieresis
+204 /Igrave
+205 /Iacute
+206 /Icircumflex
+207 /Idieresis
+208 /Eth
+209 /Ntilde
+210 /Ograve
+211 /Oacute
+212 /Ocircumflex
+213 /Otilde
+214 /Odieresis
+215 /multiply
+216 /Oslash
+217 /Ugrave
+218 /Uacute
+219 /Ucircumflex
+220 /Udieresis
+221 /Yacute
+222 /Thorn
+223 /germandbls
+224 /agrave
+225 /aacute
+226 /acircumflex
+227 /atilde
+228 /adieresis
+229 /aring
+230 /ae
+231 /ccedilla
+232 /egrave
+233 /eacute
+234 /ecircumflex
+235 /edieresis
+236 /igrave
+237 /iacute
+238 /icircumflex
+239 /idieresis
+240 /eth
+241 /ntilde
+242 /ograve
+243 /oacute
+244 /ocircumflex
+245 /otilde
+246 /odieresis
+247 /divide
+248 /oslash
+249 /ugrave
+250 /uacute
+251 /ucircumflex
+252 /udieresis
+253 /yacute
+254 /thorn
+255 /ydieresis
+] def
+/Courier /OurCharSet charvec ReEncodeSmall
+/textfont /OurCharSet findfont 11 scalefont def
+/fnamefont /Times-Bold findfont 14 scalefont def
+/headerfont /Times-Bold findfont 12 scalefont def
+textfont setfont
+(a) stringwidth pop /mp_a_x exch def
+%%EndProlog
+%%Page: 1 1
+save
+gsave
+20 421 translate
+0 0 moveto 0 401 rlineto 278 0 rlineto 0 -401 rlineto closepath clip
+278 80 mp_a_x mul div 401 792 div scale
+4 7 translate 270 278 div 784 792 div scale
+textfont setfont
+0 780 moveto (This is a plain text file) show
+grestore
+restore
+showpage
+%%Trailer
+%%Pages: 1

Copied: trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/test.psd (from rev 976, trunk/dna-repository/src/test/resources/test.psd)
===================================================================
(Binary files differ)

Copied: trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/test.py (from rev 976, trunk/dna-repository/src/test/resources/test.py)
===================================================================
--- trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/test.py	                        (rev 0)
+++ trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/test.py	2009-06-04 22:31:30 UTC (rev 977)
@@ -0,0 +1,365 @@
+"""Append module search paths for third-party packages to sys.path.
+
+****************************************************************
+* This module is automatically imported during initialization. *
+****************************************************************
+
+In earlier versions of Python (up to 1.5a3), scripts or modules that
+needed to use site-specific modules would place ``import site''
+somewhere near the top of their code.  Because of the automatic
+import, this is no longer necessary (but code that does it still
+works).
+
+This will append site-specific paths to to the module search path.  On
+Unix, it starts with sys.prefix and sys.exec_prefix (if different) and
+appends lib/python<version>/site-packages as well as lib/site-python.
+On other platforms (mainly Mac and Windows), it uses just sys.prefix
+(and sys.exec_prefix, if different, but this is unlikely).  The
+resulting directories, if they exist, are appended to sys.path, and
+also inspected for path configuration files.
+
+FOR DEBIAN, this sys.path is augmented with directories in /usr/local.
+Local addons go into /usr/local/lib/python<version>/site-packages
+(resp. /usr/local/lib/site-python), Debian addons install into
+/usr/{lib,share}/python<version>/site-packages.
+
+A path configuration file is a file whose name has the form
+<package>.pth; its contents are additional directories (one per line)
+to be added to sys.path.  Non-existing directories (or
+non-directories) are never added to sys.path; no directory is added to
+sys.path more than once.  Blank lines and lines beginning with
+'#' are skipped. Lines starting with 'import' are executed.
+
+For example, suppose sys.prefix and sys.exec_prefix are set to
+/usr/local and there is a directory /usr/local/lib/python2.3/site-packages
+with three subdirectories, foo, bar and spam, and two path
+configuration files, foo.pth and bar.pth.  Assume foo.pth contains the
+following:
+
+  # foo package configuration
+  foo
+  bar
+  bletch
+
+and bar.pth contains:
+
+  # bar package configuration
+  bar
+
+Then the following directories are added to sys.path, in this order:
+
+  /usr/local/lib/python2.3/site-packages/bar
+  /usr/local/lib/python2.3/site-packages/foo
+
+Note that bletch is omitted because it doesn't exist; bar precedes foo
+because bar.pth comes alphabetically before foo.pth; and spam is
+omitted because it is not mentioned in either path configuration file.
+
+After these path manipulations, an attempt is made to import a module
+named sitecustomize, which can perform arbitrary additional
+site-specific customizations.  If this import fails with an
+ImportError exception, it is silently ignored.
+
+"""
+
+import sys, os
+
+
+def makepath(*paths):
+    dir = os.path.abspath(os.path.join(*paths))
+    return dir, os.path.normcase(dir)
+
+for m in sys.modules.values():
+    if hasattr(m, "__file__") and m.__file__:
+        m.__file__ = os.path.abspath(m.__file__)
+del m
+
+# This ensures that the initial path provided by the interpreter contains
+# only absolute pathnames, even if we're running from the build directory.
+L = []
+_dirs_in_sys_path = {}
+dir = dircase = None  # sys.path may be empty at this point
+for dir in sys.path:
+    # Filter out duplicate paths (on case-insensitive file systems also
+    # if they only differ in case); turn relative paths into absolute
+    # paths.
+    dir, dircase = makepath(dir)
+    if not dircase in _dirs_in_sys_path:
+        L.append(dir)
+        _dirs_in_sys_path[dircase] = 1
+sys.path[:] = L
+del dir, dircase, L
+
+# Append ./build/lib.<platform> in case we're running in the build dir
+# (especially for Guido :-)
+# XXX This should not be part of site.py, since it is needed even when
+# using the -S option for Python.  See http://www.python.org/sf/586680
+if (os.name == "posix" and sys.path and
+    os.path.basename(sys.path[-1]) == "Modules"):
+    from distutils.util import get_platform
+    s = "build/lib.%s-%.3s" % (get_platform(), sys.version)
+    s = os.path.join(os.path.dirname(sys.path[-1]), s)
+    sys.path.append(s)
+    del get_platform, s
+
+def _init_pathinfo():
+    global _dirs_in_sys_path
+    _dirs_in_sys_path = d = {}
+    for dir in sys.path:
+        if dir and not os.path.isdir(dir):
+            continue
+        dir, dircase = makepath(dir)
+        d[dircase] = 1
+
+def addsitedir(sitedir):
+    global _dirs_in_sys_path
+    if _dirs_in_sys_path is None:
+        _init_pathinfo()
+        reset = 1
+    else:
+        reset = 0
+    sitedir, sitedircase = makepath(sitedir)
+    if not sitedircase in _dirs_in_sys_path:
+        sys.path.append(sitedir)        # Add path component
+    try:
+        names = os.listdir(sitedir)
+    except os.error:
+        return
+    names.sort()
+    for name in names:
+        if name[-4:] == os.extsep + "pth":
+            addpackage(sitedir, name)
+    if reset:
+        _dirs_in_sys_path = None
+
+def addpackage(sitedir, name):
+    global _dirs_in_sys_path
+    if _dirs_in_sys_path is None:
+        _init_pathinfo()
+        reset = 1
+    else:
+        reset = 0
+    fullname = os.path.join(sitedir, name)
+    try:
+        f = open(fullname)
+    except IOError:
+        return
+    while 1:
+        dir = f.readline()
+        if not dir:
+            break
+        if dir[0] == '#':
+            continue
+        if dir.startswith("import"):
+            exec dir
+            continue
+        if dir[-1] == '\n':
+            dir = dir[:-1]
+        dir, dircase = makepath(sitedir, dir)
+        if not dircase in _dirs_in_sys_path and os.path.exists(dir):
+            sys.path.append(dir)
+            _dirs_in_sys_path[dircase] = 1
+    if reset:
+        _dirs_in_sys_path = None
+
+prefixes = [os.path.join(sys.prefix, "local"), sys.prefix]
+sitedir = None # make sure sitedir is initialized because of later 'del'
+if sys.exec_prefix != sys.prefix:
+    prefixes.append(os.path.join(sys.exec_prefix, "local"))
+for prefix in prefixes:
+    if prefix:
+        if sys.platform in ('os2emx', 'riscos'):
+            sitedirs = [os.path.join(prefix, "Lib", "site-packages")]
+        elif os.sep == '/':
+            sitedirs = [os.path.join(prefix,
+                                     "lib",
+                                     "python" + sys.version[:3],
+                                     "site-packages"),
+                        os.path.join(prefix, "lib", "site-python")]
+        else:
+            sitedirs = [prefix, os.path.join(prefix, "lib", "site-packages")]
+        if sys.platform == 'darwin':
+            # for framework builds *only* we add the standard Apple
+            # locations. Currently only per-user, but /Library and
+            # /Network/Library could be added too
+            if 'Python.framework' in prefix:
+                home = os.environ.get('HOME')
+                if home:
+                    sitedirs.append(
+                        os.path.join(home,
+                                     'Library',
+                                     'Python',
+                                     sys.version[:3],
+                                     'site-packages'))
+        for sitedir in sitedirs:
+            if os.path.isdir(sitedir):
+                addsitedir(sitedir)
+del prefix, sitedir
+
+_dirs_in_sys_path = None
+
+
+# Define new built-ins 'quit' and 'exit'.
+# These are simply strings that display a hint on how to exit.
+if os.sep == ':':
+    exit = 'Use Cmd-Q to quit.'
+elif os.sep == '\\':
+    exit = 'Use Ctrl-Z plus Return to exit.'
+else:
+    exit = 'Use Ctrl-D (i.e. EOF) to exit.'
+import __builtin__
+__builtin__.quit = __builtin__.exit = exit
+del exit
+
+# interactive prompt objects for printing the license text, a list of
+# contributors and the copyright notice.
+class _Printer:
+    MAXLINES = 23
+
+    def __init__(self, name, data, files=(), dirs=()):
+        self.__name = name
+        self.__data = data
+        self.__files = files
+        self.__dirs = dirs
+        self.__lines = None
+
+    def __setup(self):
+        if self.__lines:
+            return
+        data = None
+        for dir in self.__dirs:
+            for file in self.__files:
+                file = os.path.join(dir, file)
+                try:
+                    fp = open(file)
+                    data = fp.read()
+                    fp.close()
+                    break
+                except IOError:
+                    pass
+            if data:
+                break
+        if not data:
+            data = self.__data
+        self.__lines = data.split('\n')
+        self.__linecnt = len(self.__lines)
+
+    def __repr__(self):
+        self.__setup()
+        if len(self.__lines) <= self.MAXLINES:
+            return "\n".join(self.__lines)
+        else:
+            return "Type %s() to see the full %s text" % ((self.__name,)*2)
+
+    def __call__(self):
+        self.__setup()
+        prompt = 'Hit Return for more, or q (and Return) to quit: '
+        lineno = 0
+        while 1:
+            try:
+                for i in range(lineno, lineno + self.MAXLINES):
+                    print self.__lines[i]
+            except IndexError:
+                break
+            else:
+                lineno += self.MAXLINES
+                key = None
+                while key is None:
+                    key = raw_input(prompt)
+                    if key not in ('', 'q'):
+                        key = None
+                if key == 'q':
+                    break
+
+__builtin__.copyright = _Printer("copyright", sys.copyright)
+if sys.platform[:4] == 'java':
+    __builtin__.credits = _Printer(
+        "credits",
+        "Jython is maintained by the Jython developers (www.jython.org).")
+else:
+    __builtin__.credits = _Printer("credits", """\
+Thanks to CWI, CNRI, BeOpen.com, Zope Corporation and a cast of thousands
+for supporting Python development.  See www.python.org for more information.""")
+here = os.path.dirname(os.__file__)
+__builtin__.license = _Printer(
+    "license", "See http://www.python.org/%.3s/license.html" % sys.version,
+    ["LICENSE.txt", "LICENSE"],
+    [os.path.join(here, os.pardir), here, os.curdir])
+
+
+# Define new built-in 'help'.
+# This is a wrapper around pydoc.help (with a twist).
+
+class _Helper:
+    def __repr__(self):
+        return "Type help() for interactive help, " \
+               "or help(object) for help about object."
+    def __call__(self, *args, **kwds):
+        import pydoc
+        return pydoc.help(*args, **kwds)
+
+__builtin__.help = _Helper()
+
+
+# On Windows, some default encodings are not provided
+# by Python (e.g. "cp932" in Japanese locale), while they
+# are always available as "mbcs" in each locale.
+# Make them usable by aliasing to "mbcs" in such a case.
+
+if sys.platform == 'win32':
+    import locale, codecs
+    enc = locale.getdefaultlocale()[1]
+    if enc.startswith('cp'):            # "cp***" ?
+        try:
+            codecs.lookup(enc)
+        except LookupError:
+            import encodings
+            encodings._cache[enc] = encodings._unknown
+            encodings.aliases.aliases[enc] = 'mbcs'
+
+# Set the string encoding used by the Unicode implementation.  The
+# default is 'ascii', but if you're willing to experiment, you can
+# change this.
+
+encoding = "ascii" # Default value set by _PyUnicode_Init()
+
+if 0:
+    # Enable to support locale aware default string encodings.
+    import locale
+    loc = locale.getdefaultlocale()
+    if loc[1]:
+        encoding = loc[1]
+
+if 0:
+    # Enable to switch off string to Unicode coercion and implicit
+    # Unicode to string conversion.
+    encoding = "undefined"
+
+if encoding != "ascii":
+    # On Non-Unicode builds this will raise an AttributeError...
+    sys.setdefaultencoding(encoding) # Needs Python Unicode build !
+
+#
+# Run custom site specific code, if available.
+#
+try:
+    import sitecustomize
+except ImportError:
+    pass
+
+#
+# Remove sys.setdefaultencoding() so that users cannot change the
+# encoding after initialization.  The test for presence is needed when
+# this module is run as a script, because this code is executed twice.
+#
+if hasattr(sys, "setdefaultencoding"):
+    del sys.setdefaultencoding
+
+def _test():
+    print "sys.path = ["
+    for dir in sys.path:
+        print "    %s," % `dir`
+    print "]"
+
+if __name__ == '__main__':
+    _test()


Property changes on: trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/test.py
___________________________________________________________________
Name: svn:keywords
   + Id Revision
Name: svn:eol-style
   + LF

Copied: trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/test.rtf (from rev 976, trunk/dna-repository/src/test/resources/test.rtf)
===================================================================
--- trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/test.rtf	                        (rev 0)
+++ trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/test.rtf	2009-06-04 22:31:30 UTC (rev 977)
@@ -0,0 +1,16 @@
+{\rtf1\ansi\ansicpg1252\uc1\deff0\stshfdbch0\stshfloch0\stshfhich0\stshfbi0\deflang1033\deflangfe1033{\fonttbl{\f0\froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\f36\froman\fcharset238\fprq2 Times New Roman CE;}
+{\f37\froman\fcharset204\fprq2 Times New Roman Cyr;}{\f39\froman\fcharset161\fprq2 Times New Roman Greek;}{\f40\froman\fcharset162\fprq2 Times New Roman Tur;}{\f41\froman\fcharset177\fprq2 Times New Roman (Hebrew);}
+{\f42\froman\fcharset178\fprq2 Times New Roman (Arabic);}{\f43\froman\fcharset186\fprq2 Times New Roman Baltic;}{\f44\froman\fcharset163\fprq2 Times New Roman (Vietnamese);}}{\colortbl;\red0\green0\blue0;\red0\green0\blue255;\red0\green255\blue255;
+\red0\green255\blue0;\red255\green0\blue255;\red255\green0\blue0;\red255\green255\blue0;\red255\green255\blue255;\red0\green0\blue128;\red0\green128\blue128;\red0\green128\blue0;\red128\green0\blue128;\red128\green0\blue0;\red128\green128\blue0;
+\red128\green128\blue128;\red192\green192\blue192;}{\stylesheet{\ql \li0\ri0\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \fs24\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 \snext0 Normal;}{\*\cs10 \additive \ssemihidden 
+Default Paragraph Font;}{\*\ts11\tsrowd\trftsWidthB3\trpaddl108\trpaddr108\trpaddfl3\trpaddft3\trpaddfb3\trpaddfr3\trcbpat1\trcfpat1\tscellwidthfts0\tsvertalt\tsbrdrt\tsbrdrl\tsbrdrb\tsbrdrr\tsbrdrdgl\tsbrdrdgr\tsbrdrh\tsbrdrv 
+\ql \li0\ri0\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \fs20\lang1024\langfe1024\cgrid\langnp1024\langfenp1024 \snext11 \ssemihidden Normal Table;}}{\*\rsidtbl \rsid5531693}{\*\generator Microsoft Word 10.0.2627;}{\info
+{\title This is a test RTF document}{\author David Castro}{\operator David Castro}{\creatim\yr2004\mo6\dy17\hr19\min29}{\revtim\yr2004\mo6\dy17\hr19\min30}{\version1}{\edmins1}{\nofpages1}{\nofwords4}{\nofchars25}{\*\company Azusa Pacific University}
+{\nofcharsws28}{\vern16437}}\widowctrl\ftnbj\aenddoc\noxlattoyen\expshrtn\noultrlspc\dntblnsbdb\nospaceforul\formshade\horzdoc\dgmargin\dghspace180\dgvspace180\dghorigin1800\dgvorigin1440\dghshow1\dgvshow1
+\jexpand\viewkind1\viewscale100\pgbrdrhead\pgbrdrfoot\splytwnine\ftnlytwnine\htmautsp\nolnhtadjtbl\useltbaln\alntblind\lytcalctblwd\lyttblrtgr\lnbrkrule\nobrkwrptbl\snaptogridincell\allowfieldendsel\wrppunct\asianbrkrule\rsidroot5531693 \fet0\sectd 
+\linex0\endnhere\sectlinegrid360\sectdefaultcl\sftnbj {\*\pnseclvl1\pnucrm\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl2\pnucltr\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl3\pndec\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl4
+\pnlcltr\pnstart1\pnindent720\pnhang {\pntxta )}}{\*\pnseclvl5\pndec\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl6\pnlcltr\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl7\pnlcrm\pnstart1\pnindent720\pnhang {\pntxtb (}
+{\pntxta )}}{\*\pnseclvl8\pnlcltr\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl9\pnlcrm\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}\pard\plain \ql \li0\ri0\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 
+\fs24\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\insrsid5531693 This is a test RTF document
+\par 
+\par }}
\ No newline at end of file

Copied: trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/test.sh (from rev 976, trunk/dna-repository/src/test/resources/test.sh)
===================================================================
--- trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/test.sh	                        (rev 0)
+++ trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/test.sh	2009-06-04 22:31:30 UTC (rev 977)
@@ -0,0 +1,3 @@
+#!/bin/bash
+
+echo "this is a test bash script"


Property changes on: trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/test.sh
___________________________________________________________________
Name: svn:keywords
   + Id Revision
Name: svn:eol-style
   + LF

Copied: trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/test.tar (from rev 976, trunk/dna-repository/src/test/resources/test.tar)
===================================================================
(Binary files differ)

Copied: trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/test.tar.gz (from rev 976, trunk/dna-repository/src/test/resources/test.tar.gz)
===================================================================
(Binary files differ)

Copied: trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/test.tga (from rev 976, trunk/dna-repository/src/test/resources/test.tga)
===================================================================
(Binary files differ)

Copied: trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/test.txt (from rev 976, trunk/dna-repository/src/test/resources/test.txt)
===================================================================
--- trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/test.txt	                        (rev 0)
+++ trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/test.txt	2009-06-04 22:31:30 UTC (rev 977)
@@ -0,0 +1 @@
+This is a plain text file


Property changes on: trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/test.txt
___________________________________________________________________
Name: svn:mime-type
   + text/plain
Name: svn:keywords
   + Id Revision
Name: svn:eol-style
   + LF

Copied: trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/test.txt.gz (from rev 976, trunk/dna-repository/src/test/resources/test.txt.gz)
===================================================================
(Binary files differ)

Copied: trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/test.wav (from rev 976, trunk/dna-repository/src/test/resources/test.wav)
===================================================================
(Binary files differ)

Copied: trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/test.wmf (from rev 976, trunk/dna-repository/src/test/resources/test.wmf)
===================================================================
(Binary files differ)

Copied: trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/test.xcf (from rev 976, trunk/dna-repository/src/test/resources/test.xcf)
===================================================================
(Binary files differ)

Copied: trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/test.xml (from rev 976, trunk/dna-repository/src/test/resources/test.xml)
===================================================================
--- trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/test.xml	                        (rev 0)
+++ trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/test.xml	2009-06-04 22:31:30 UTC (rev 977)
@@ -0,0 +1,47 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE magic PUBLIC "-//jMimeMagic//DTD magic config 1.0//EN" "magic_1_0.dtd">
+<magic>
+<info>
+<version>0.1</version>
+<author>arimus at users.sourceforge.net</author>
+<description>XML magic file</description>
+</info>
+<match-list>
+<match>
+	<mimetype>application/x-tar</mimetype>
+	<extension>tar</extension>
+	<description>POSIX tar archive</description>
+	<test offset="257" type="string" comparator="=">ustar\000</test>
+</match>
+<match>
+	<mimetype>application/x-tar</mimetype>
+	<extension>tar</extension>
+	<description>tar archive</description>
+	<test offset="257" type="string" comparator="=">ustar  \000GNU</test>
+</match>
+<match>
+	<mimetype>application/zip</mimetype>
+	<extension>zip</extension>
+	<description>archive data</description>
+	<test offset="0" type="string" comparator="=">PK\003\004</test>
+</match>
+<match>
+	<mimetype>application/x-gzip</mimetype>
+	<extension>gz</extension>
+	<description>gzip compressed data</description>
+	<test offset="0" type="string" comparator="=">\037\213</test>
+</match>
+<match>
+	<mimetype>application/x-bzip2</mimetype>
+	<extension>bz2</extension>
+	<description>bzip2 compressed data</description>
+	<test offset="0" type="string" comparator="=">BZh</test>
+</match>
+<match>
+	<mimetype>???</mimetype>
+	<extension>bat</extension>
+	<description>MS-DOS batch file text</description>
+	<test offset="0" type="string" comparator="=">@echo off</test>
+</match>
+</match-list>
+</magic>


Property changes on: trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/test.xml
___________________________________________________________________
Name: svn:mime-type
   + text/plain
Name: svn:keywords
   + Id Revision
Name: svn:eol-style
   + LF

Copied: trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/test.xpm (from rev 976, trunk/dna-repository/src/test/resources/test.xpm)
===================================================================
--- trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/test.xpm	                        (rev 0)
+++ trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/test.xpm	2009-06-04 22:31:30 UTC (rev 977)
@@ -0,0 +1,255 @@
+/* XPM */
+static char * test_xpm[] = {
+"100 100 152 2",
+"  	c #FFFFFF",
+". 	c #000000",
+"+ 	c #FAFAFA",
+"@ 	c #ABABAB",
+"# 	c #5E5E5E",
+"$ 	c #2A2A2A",
+"% 	c #0D0D0D",
+"& 	c #030303",
+"* 	c #0B0B0B",
+"= 	c #292929",
+"- 	c #616161",
+"; 	c #B6B6B6",
+"> 	c #FEFEFE",
+", 	c #DBDBDB",
+"' 	c #7E7E7E",
+") 	c #434343",
+"! 	c #1A1A1A",
+"~ 	c #0A0A0A",
+"{ 	c #121212",
+"] 	c #353535",
+"^ 	c #6E6E6E",
+"/ 	c #C3C3C3",
+"( 	c #1D1D1D",
+"_ 	c #343434",
+": 	c #D3D3D3",
+"< 	c #F6F6F6",
+"[ 	c #6A6A6A",
+"} 	c #020202",
+"| 	c #2B2B2B",
+"1 	c #707070",
+"2 	c #0C0C0C",
+"3 	c #C0C0C0",
+"4 	c #FCFCFC",
+"5 	c #444444",
+"6 	c #767676",
+"7 	c #5F5F5F",
+"8 	c #BABABA",
+"9 	c #EBEBEB",
+"0 	c #E5E5E5",
+"a 	c #A4A4A4",
+"b 	c #101010",
+"c 	c #DEDEDE",
+"d 	c #999999",
+"e 	c #505050",
+"f 	c #B5B5B5",
+"g 	c #E7E7E7",
+"h 	c #F8F8F8",
+"i 	c #DDDDDD",
+"j 	c #A5A5A5",
+"k 	c #4E4E4E",
+"l 	c #C2C2C2",
+"m 	c #F7F7F7",
+"n 	c #4D4D4D",
+"o 	c #494949",
+"p 	c #393939",
+"q 	c #717171",
+"r 	c #DCDCDC",
+"s 	c #4C4C4C",
+"t 	c #2D2D2D",
+"u 	c #F2F2F2",
+"v 	c #1C1C1C",
+"w 	c #D0D0D0",
+"x 	c #C1C1C1",
+"y 	c #8B8B8B",
+"z 	c #797979",
+"A 	c #050505",
+"B 	c #9D9D9D",
+"C 	c #D2D2D2",
+"D 	c #3D3D3D",
+"E 	c #212121",
+"F 	c #3A3A3A",
+"G 	c #CFCFCF",
+"H 	c #F3F3F3",
+"I 	c #181818",
+"J 	c #6B6B6B",
+"K 	c #1E1E1E",
+"L 	c #B9B9B9",
+"M 	c #171717",
+"N 	c #010101",
+"O 	c #060606",
+"P 	c #E4E4E4",
+"Q 	c #151515",
+"R 	c #202020",
+"S 	c #696969",
+"T 	c #AAAAAA",
+"U 	c #E9E9E9",
+"V 	c #7B7B7B",
+"W 	c #454545",
+"X 	c #626262",
+"Y 	c #F1F1F1",
+"Z 	c #0F0F0F",
+"` 	c #EEEEEE",
+" .	c #BEBEBE",
+"..	c #3B3B3B",
+"+.	c #333333",
+"@.	c #F5F5F5",
+"#.	c #2F2F2F",
+"$.	c #C9C9C9",
+"%.	c #828282",
+"&.	c #080808",
+"*.	c #838383",
+"=.	c #646464",
+"-.	c #848484",
+";.	c #9E9E9E",
+">.	c #B3B3B3",
+",.	c #F9F9F9",
+"'.	c #222222",
+").	c #7A7A7A",
+"!.	c #131313",
+"~.	c #EAEAEA",
+"{.	c #B0B0B0",
+"].	c #BCBCBC",
+"^.	c #424242",
+"/.	c #414141",
+"(.	c #747474",
+"_.	c #373737",
+":.	c #262626",
+"<.	c #8D8D8D",
+"[.	c #CECECE",
+"}.	c #EFEFEF",
+"|.	c #FBFBFB",
+"1.	c #DADADA",
+"2.	c #ACACAC",
+"3.	c #232323",
+"4.	c #E1E1E1",
+"5.	c #E8E8E8",
+"6.	c #4F4F4F",
+"7.	c #A8A8A8",
+"8.	c #757575",
+"9.	c #272727",
+"0.	c #BBBBBB",
+"a.	c #F0F0F0",
+"b.	c #B7B7B7",
+"c.	c #040404",
+"d.	c #515151",
+"e.	c #C5C5C5",
+"f.	c #0E0E0E",
+"g.	c #8E8E8E",
+"h.	c #090909",
+"i.	c #BDBDBD",
+"j.	c #111111",
+"k.	c #2E2E2E",
+"l.	c #5C5C5C",
+"m.	c #ECECEC",
+"n.	c #E3E3E3",
+"o.	c #787878",
+"p.	c #141414",
+"q.	c #070707",
+"r.	c #545454",
+"s.	c #9A9A9A",
+"t.	c #E0E0E0",
+"u.	c #1B1B1B",
+"                                                                                                                                                                                                        ",
+"                                                                                                                                                                                                        ",
+"                                                                                                                                                                                                        ",
+"                                                                                                                                                                                                        ",
+"                                                                                                                                                                                                        ",
+"                                                                                                                                                                                                        ",
+"                                                                                                                                                                                                        ",
+"                                                                                                                                                                                                        ",
+"                                                                                                                                                                                                        ",
+"                                                                                                                                                                                                        ",
+"                                                                                                                                                                                                        ",
+"                                                                                                                                                                                                        ",
+"                                                                                                                                                                                                        ",
+"                                                                                                                                                                                                        ",
+"                                                                                                                                                                                                        ",
+"                                                                                                                                                                                                        ",
+"                                                                                                                                                                                                        ",
+"                                                                                                                                                                                                        ",
+"                                                                                                                                                                                                        ",
+"                                                                                                                                                                                                        ",
+"                                                                                                                                                                                                        ",
+"                                                                                                                                                                                                        ",
+"                                                                                                                                                                                                        ",
+"                                                                                                                                                                                                        ",
+"                                                                                                                                                                                                        ",
+"                                                                                                                                                                                                        ",
+"                                                                                                                                                                                                        ",
+"                                                                                                                                                                                                        ",
+"                                                                                                                                                                                                        ",
+"                                                                                                                                                                                                        ",
+"                                                                                                                                                                                                        ",
+"                                                                                                                                                                                                        ",
+"                                                                                                                                                                                                        ",
+"                                                                                                                                                                                                        ",
+"                                                                                                                                                                                                        ",
+"                                                                                                                                                                                                        ",
+"                                                                                                                                                                                                        ",
+"                    . . . . . . . . . . . . . . . . . . . . . . . .                                                                                                                                     ",
+"                    . . . . . . . . . . . . . . . . . . . . . . . .                                                                                   . . . .                                           ",
+"                    . . . . . . . . . . . . . . . . . . . . . . . .                                                                                   . . . .                                           ",
+"                                        . . . .                                                                                                       . . . .                                           ",
+"                                        . . . .                                                                                                       . . . .                                           ",
+"                                        . . . .                                                                                                       . . . .                                           ",
+"                                        . . . .                     + @ # $ % & * = - ; >                       , ' ) ! ~ & { ] ^ /                   . . . .                                           ",
+"                                        . . . .                   @ ( . . . . . . . . . _ :                 < [ } . . . . . . . . . | ;         . . . . . . . . . . . . . .                             ",
+"                                        . . . .               > 1 . . . . . . . . . . . . 2 3             4 5 . . . . . . . . . . . . .         . . . . . . . . . . . . . .                             ",
+"                                        . . . .               6 . . . & 7 8 9 + 0 a $ . . . b c           d . . . . e f g + h i j k } .         . . . . . . . . . . . . . .                             ",
+"                                        . . . .             8 . . . b l             m n . . . o           p . . . q                 r s               . . . .                                           ",
+"                                        . . . .             t . . . ;                 u v . . . w         * . . . 0                                   . . . .                                           ",
+"                                        . . . .           x . . . 5                     y . . . z         A . . . +                                   . . . .                                           ",
+"                                        . . . .           q . . . B                     C . . . D         E . . . 3                                   . . . .                                           ",
+"                                        . . . .           F . . . G                     H . . . I         J . . . K L                                 . . . .                                           ",
+"                                        . . . .           M . . . & & & & } } } N N N . . . . . O         P Q . . . . R S T U                         . . . .                                           ",
+"                                        . . . .           A . . . . . . . . . . . . . . . . . . .           : $ . . . . . . . | V r                   . . . .                                           ",
+"                                        . . . .           } . . . . . . . . . . . . . . . . . . .             4 j W O . . . . . . } X Y               . . . .                                           ",
+"                                        . . . .           Z . . . `                                                 <  .' ..& . . . . +. at .            . . . .                                           ",
+"                                        . . . .           #.. . . $.                                                        U %.&.. . . *.            . . . .                                           ",
+"                                        . . . .           =.. . . -.                                                            ;.. . . |             . . . .                                           ",
+"                                        . . . .           >.. . . R ,.                                                          H . . . &.            A . . . 4                                         ",
+"                                        . . . .           4 '.. . . ).                                                          U . . . 2             !.. . . ~.                                        ",
+"                                        . . . .             {.. . . . ' 4                   ].^.          /.8 >                 (.. . . D             _.. . . f                                         ",
+"                                        . . . .               q . . . . :.<.[.}.|.}.1.2.(.3.. .           . . '.(.f 4.,.4 5.; 6.. . . . 7.            8.. . . 9.0.a.>                                   ",
+"                                        . . . .               > 8.. . . . . . . . . . . . . . .           . . . . . . . . . . . . . . -               1.O . . . . . . . . .                             ",
+"                                        . . . .                   b.$ . . . . . . . . . . c.d.e.          . . . . . . . . . . . . f.g.>                 a h.. . . . . . . .                             ",
+"                                        . . . .                     > i.^ _.Q c.& j.k.l.;.m.              n.T o.k t p.q.& f.:.r.s.`                       t.%.) u.* N . . .                             ",
+"                                                                                                                                                                                                        ",
+"                                                                                                                                                                                                        ",
+"                                                                                                                                                                                                        ",
+"                                                                                                                                                                                                        ",
+"                                                                                                                                                                                                        ",
+"                                                                                                                                                                                                        ",
+"                                                                                                                                                                                                        ",
+"                                                                                                                                                                                                        ",
+"                                                                                                                                                                                                        ",
+"                                                                                                                                                                                                        ",
+"                                                                                                                                                                                                        ",
+"                                                                                                                                                                                                        ",
+"                                                                                                                                                                                                        ",
+"                                                                                                                                                                                                        ",
+"                                                                                                                                                                                                        ",
+"                                                                                                                                                                                                        ",
+"                                                                                                                                                                                                        ",
+"                                                                                                                                                                                                        ",
+"                                                                                                                                                                                                        ",
+"                                                                                                                                                                                                        ",
+"                                                                                                                                                                                                        ",
+"                                                                                                                                                                                                        ",
+"                                                                                                                                                                                                        ",
+"                                                                                                                                                                                                        ",
+"                                                                                                                                                                                                        ",
+"                                                                                                                                                                                                        ",
+"                                                                                                                                                                                                        ",
+"                                                                                                                                                                                                        ",
+"                                                                                                                                                                                                        ",
+"                                                                                                                                                                                                        ",
+"                                                                                                                                                                                                        ",
+"                                                                                                                                                                                                        ",
+"                                                                                                                                                                                                        ",
+"                                                                                                                                                                                                        ",
+"                                                                                                                                                                                                        "};

Copied: trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/test_1.2.class (from rev 976, trunk/dna-repository/src/test/resources/test_1.2.class)
===================================================================
(Binary files differ)

Copied: trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/test_1.3.class (from rev 976, trunk/dna-repository/src/test/resources/test_1.3.class)
===================================================================
(Binary files differ)

Copied: trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/test_1.4.class (from rev 976, trunk/dna-repository/src/test/resources/test_1.4.class)
===================================================================
(Binary files differ)

Copied: trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/test_128_44_jstereo.mp3 (from rev 976, trunk/dna-repository/src/test/resources/test_128_44_jstereo.mp3)
===================================================================
(Binary files differ)

Copied: trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/test_excel_2000.xls (from rev 976, trunk/dna-repository/src/test/resources/test_excel_2000.xls)
===================================================================
(Binary files differ)

Copied: trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/test_excel_spreadsheet.xml (from rev 976, trunk/dna-repository/src/test/resources/test_excel_spreadsheet.xml)
===================================================================
--- trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/test_excel_spreadsheet.xml	                        (rev 0)
+++ trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/test_excel_spreadsheet.xml	2009-06-04 22:31:30 UTC (rev 977)
@@ -0,0 +1,62 @@
+<?xml version="1.0"?>
+<Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet"
+ xmlns:o="urn:schemas-microsoft-com:office:office"
+ xmlns:x="urn:schemas-microsoft-com:office:excel"
+ xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet"
+ xmlns:html="http://www.w3.org/TR/REC-html40">
+ <DocumentProperties xmlns="urn:schemas-microsoft-com:office:office">
+  <Author>David Castro</Author>
+  <LastAuthor>David Castro</LastAuthor>
+  <Created>2004-06-16T02:29:05Z</Created>
+  <LastSaved>2004-06-16T02:29:24Z</LastSaved>
+  <Company>Azusa Pacific University</Company>
+  <Version>10.2625</Version>
+ </DocumentProperties>
+ <OfficeDocumentSettings xmlns="urn:schemas-microsoft-com:office:office">
+  <DownloadComponents/>
+  <LocationOfComponents HRef="file:///Z:\mnt\c\Documents%20and%20Settings\Administrator\Desktop\download\Office%20XP%20Pro\"/>
+ </OfficeDocumentSettings>
+ <ExcelWorkbook xmlns="urn:schemas-microsoft-com:office:excel">
+  <WindowHeight>12660</WindowHeight>
+  <WindowWidth>17100</WindowWidth>
+  <WindowTopX>360</WindowTopX>
+  <WindowTopY>60</WindowTopY>
+  <ProtectStructure>False</ProtectStructure>
+  <ProtectWindows>False</ProtectWindows>
+ </ExcelWorkbook>
+ <Styles>
+  <Style ss:ID="Default" ss:Name="Normal">
+   <Alignment ss:Vertical="Bottom"/>
+   <Borders/>
+   <Font/>
+   <Interior/>
+   <NumberFormat/>
+   <Protection/>
+  </Style>
+ </Styles>
+ <Worksheet ss:Name="Sheet1">
+  <Table ss:ExpandedColumnCount="1" ss:ExpandedRowCount="1" x:FullColumns="1"
+   x:FullRows="1">
+   <Row>
+    <Cell><Data ss:Type="String">Test excel 2000 spreadsheet</Data></Cell>
+   </Row>
+  </Table>
+  <WorksheetOptions xmlns="urn:schemas-microsoft-com:office:excel">
+   <Selected/>
+   <ProtectObjects>False</ProtectObjects>
+   <ProtectScenarios>False</ProtectScenarios>
+  </WorksheetOptions>
+ </Worksheet>
+ <Worksheet ss:Name="Sheet2">
+  <WorksheetOptions xmlns="urn:schemas-microsoft-com:office:excel">
+   <ProtectObjects>False</ProtectObjects>
+   <ProtectScenarios>False</ProtectScenarios>
+  </WorksheetOptions>
+ </Worksheet>
+ <Worksheet ss:Name="Sheet3">
+  <WorksheetOptions xmlns="urn:schemas-microsoft-com:office:excel">
+   <ProtectObjects>False</ProtectObjects>
+   <ProtectScenarios>False</ProtectScenarios>
+  </WorksheetOptions>
+ </Worksheet>
+</Workbook>


Property changes on: trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/test_excel_spreadsheet.xml
___________________________________________________________________
Name: svn:mime-type
   + text/plain
Name: svn:keywords
   + Id Revision
Name: svn:eol-style
   + LF

Copied: trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/test_excel_web_archive.mht (from rev 976, trunk/dna-repository/src/test/resources/test_excel_web_archive.mht)
===================================================================
--- trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/test_excel_web_archive.mht	                        (rev 0)
+++ trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/test_excel_web_archive.mht	2009-06-04 22:31:30 UTC (rev 977)
@@ -0,0 +1,155 @@
+MIME-Version: 1.0
+X-Document-Type: Worksheet
+Content-Location: file:///C:/2A65B325/test_excel_web_archive.htm
+Content-Transfer-Encoding: quoted-printable
+Content-Type: text/html; charset="us-ascii"
+
+<html xmlns:o=3D"urn:schemas-microsoft-com:office:office"
+xmlns:x=3D"urn:schemas-microsoft-com:office:excel"
+xmlns=3D"http://www.w3.org/TR/REC-html40">
+
+<head>
+<meta http-equiv=3DContent-Type content=3D"text/html; charset=3Dus-ascii">
+<meta name=3DProgId content=3DExcel.Sheet>
+<meta name=3DGenerator content=3D"Microsoft Excel 10">
+<link rel=3DFile-List href=3D"test_excel_web_archive_files/filelist.xml">
+<link rel=3DEdit-Time-Data href=3D"test_excel_web_archive_files/editdata.ms=
+o">
+<link rel=3DOLE-Object-Data href=3D"test_excel_web_archive_files/oledata.ms=
+o">
+<!--[if gte mso 9]><xml>
+ <o:DocumentProperties>
+  <o:Author>David Castro</o:Author>
+  <o:LastAuthor>David Castro</o:LastAuthor>
+  <o:Created>2004-06-16T02:29:05Z</o:Created>
+  <o:LastSaved>2004-06-16T02:31:29Z</o:LastSaved>
+  <o:Company>Azusa Pacific University</o:Company>
+  <o:Version>10.2625</o:Version>
+ </o:DocumentProperties>
+ <o:OfficeDocumentSettings>
+  <o:DownloadComponents/>
+  <o:LocationOfComponents HRef=3D"file:///Z:\mnt\c\Documents%20and%20Settin=
+gs\Administrator\Desktop\download\Office%20XP%20Pro\"/>
+ </o:OfficeDocumentSettings>
+</xml><![endif]-->
+<style>
+<!--table
+	{mso-displayed-decimal-separator:"\.";
+	mso-displayed-thousand-separator:"\,";}
+ at page
+	{margin:1.0in .75in 1.0in .75in;
+	mso-header-margin:.5in;
+	mso-footer-margin:.5in;}
+tr
+	{mso-height-source:auto;}
+col
+	{mso-width-source:auto;}
+br
+	{mso-data-placement:same-cell;}
+.style0
+	{mso-number-format:General;
+	text-align:general;
+	vertical-align:bottom;
+	white-space:nowrap;
+	mso-rotate:0;
+	mso-background-source:auto;
+	mso-pattern:auto;
+	color:windowtext;
+	font-size:10.0pt;
+	font-weight:400;
+	font-style:normal;
+	text-decoration:none;
+	font-family:Arial;
+	mso-generic-font-family:auto;
+	mso-font-charset:0;
+	border:none;
+	mso-protection:locked visible;
+	mso-style-name:Normal;
+	mso-style-id:0;}
+td
+	{mso-style-parent:style0;
+	padding-top:1px;
+	padding-right:1px;
+	padding-left:1px;
+	mso-ignore:padding;
+	color:windowtext;
+	font-size:10.0pt;
+	font-weight:400;
+	font-style:normal;
+	text-decoration:none;
+	font-family:Arial;
+	mso-generic-font-family:auto;
+	mso-font-charset:0;
+	mso-number-format:General;
+	text-align:general;
+	vertical-align:bottom;
+	border:none;
+	mso-background-source:auto;
+	mso-pattern:auto;
+	mso-protection:locked visible;
+	white-space:nowrap;
+	mso-rotate:0;}
+-->
+</style>
+<!--[if gte mso 9]><xml>
+ <x:ExcelWorkbook>
+  <x:ExcelWorksheets>
+   <x:ExcelWorksheet>
+    <x:Name>Sheet1</x:Name>
+    <x:WorksheetOptions>
+     <x:Selected/>
+     <x:ProtectContents>False</x:ProtectContents>
+     <x:ProtectObjects>False</x:ProtectObjects>
+     <x:ProtectScenarios>False</x:ProtectScenarios>
+    </x:WorksheetOptions>
+   </x:ExcelWorksheet>
+   <x:ExcelWorksheet>
+    <x:Name>Sheet2</x:Name>
+    <x:WorksheetOptions>
+     <x:ProtectContents>False</x:ProtectContents>
+     <x:ProtectObjects>False</x:ProtectObjects>
+     <x:ProtectScenarios>False</x:ProtectScenarios>
+    </x:WorksheetOptions>
+   </x:ExcelWorksheet>
+   <x:ExcelWorksheet>
+    <x:Name>Sheet3</x:Name>
+    <x:WorksheetOptions>
+     <x:ProtectContents>False</x:ProtectContents>
+     <x:ProtectObjects>False</x:ProtectObjects>
+     <x:ProtectScenarios>False</x:ProtectScenarios>
+    </x:WorksheetOptions>
+   </x:ExcelWorksheet>
+  </x:ExcelWorksheets>
+  <x:WindowHeight>12660</x:WindowHeight>
+  <x:WindowWidth>17100</x:WindowWidth>
+  <x:WindowTopX>360</x:WindowTopX>
+  <x:WindowTopY>60</x:WindowTopY>
+  <x:ProtectStructure>False</x:ProtectStructure>
+  <x:ProtectWindows>False</x:ProtectWindows>
+ </x:ExcelWorkbook>
+</xml><![endif]-->
+</head>
+
+<body link=3Dblue vlink=3Dpurple>
+
+<table x:str border=3D0 cellpadding=3D0 cellspacing=3D0 width=3D192 style=
+=3D'border-collapse:
+ collapse;table-layout:fixed;width:144pt'>
+ <col width=3D64 span=3D3 style=3D'width:48pt'>
+ <tr height=3D17 style=3D'height:12.75pt'>
+  <td height=3D17 colspan=3D3 width=3D192 style=3D'height:12.75pt;mso-ignor=
+e:colspan;
+  width:144pt'>Test excel 2000 spreadsheet</td>
+ </tr>
+ <![if supportMisalignedColumns]>
+ <tr height=3D0 style=3D'display:none'>
+  <td width=3D64 style=3D'width:48pt'></td>
+  <td width=3D64 style=3D'width:48pt'></td>
+  <td width=3D64 style=3D'width:48pt'></td>
+ </tr>
+ <![endif]>
+</table>
+
+</body>
+
+</html>

Copied: trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/test_nocompress.tif (from rev 976, trunk/dna-repository/src/test/resources/test_nocompress.tif)
===================================================================
(Binary files differ)

Copied: trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/test_word_2000.doc (from rev 976, trunk/dna-repository/src/test/resources/test_word_2000.doc)
===================================================================
(Binary files differ)

Copied: trunk/extensions/dna-mimetype-detector-aperture/src/test/resources/test_word_6.0_95.doc (from rev 976, trunk/dna-repository/src/test/resources/test_word_6.0_95.doc)
===================================================================
(Binary files differ)

Modified: trunk/extensions/dna-sequencer-jbpm-jpdl/pom.xml
===================================================================
--- trunk/extensions/dna-sequencer-jbpm-jpdl/pom.xml	2009-06-04 21:46:34 UTC (rev 976)
+++ trunk/extensions/dna-sequencer-jbpm-jpdl/pom.xml	2009-06-04 22:31:30 UTC (rev 977)
@@ -110,17 +110,6 @@
 			<artifactId>commons-lang</artifactId>
 			<version>2.4</version>
 		</dependency>
-		<!-- 
-			Apache Jackrabbit (JCR Implementation)
-		-->
-		<dependency>
-			<groupId>org.apache.jackrabbit</groupId>
-			<artifactId>jackrabbit-api</artifactId>
-		</dependency>
-		<dependency>
-			<groupId>org.apache.jackrabbit</groupId>
-			<artifactId>jackrabbit-core</artifactId>
-		</dependency>
 	</dependencies>
 	<reporting>
 		<plugins>

Modified: trunk/extensions/dna-sequencer-xml/src/test/resources/master.xml
===================================================================
--- trunk/extensions/dna-sequencer-xml/src/test/resources/master.xml	2009-06-04 21:46:34 UTC (rev 976)
+++ trunk/extensions/dna-sequencer-xml/src/test/resources/master.xml	2009-06-04 22:31:30 UTC (rev 977)
@@ -1529,13 +1529,8 @@
   <programlisting>
 &lt;dependency&gt;
   &lt;groupId&gt;org.jboss.dna&lt;/groupId&gt;
-  &lt;artifactId&gt;dna-common&lt;/artifactId&gt;
-  &lt;version&gt;0.1&lt;/version&gt;
-&lt;/dependency&gt;
-&lt;dependency&gt;
-  &lt;groupId&gt;org.jboss.dna&lt;/groupId&gt;
   &lt;artifactId&gt;dna-graph&lt;/artifactId&gt;
-  &lt;version&gt;0.1&lt;/version&gt;
+  &lt;version&gt;0.5&lt;/version&gt;
 &lt;/dependency&gt;
 &lt;dependency&gt;
   &lt;groupId&gt;org.slf4j&lt;/groupId&gt;
@@ -1578,8 +1573,8 @@
 <programlisting>
 &lt;dependency&gt;
   &lt;groupId&gt;org.jboss.dna&lt;/groupId&gt;
-  &lt;artifactId&gt;dna-repository&lt;/artifactId&gt;
-  &lt;version&gt;0.1&lt;/version&gt;
+  &lt;artifactId&gt;dna-jcr&lt;/artifactId&gt;
+  &lt;version&gt;0.5&lt;/version&gt;
   &lt;scope&gt;test&lt;/scope&gt;
 &lt;/dependency&gt;
 &lt;!-- Java Content Repository API --&gt;
@@ -1589,41 +1584,6 @@
   &lt;version&gt;1.0.1&lt;/version&gt;
   &lt;scope&gt;test&lt;/scope&gt;
 &lt;/dependency&gt;
-&lt;!-- Apache Jackrabbit (JCR Implementation) --&gt;
-&lt;dependency&gt;
-  &lt;groupId&gt;org.apache.jackrabbit&lt;/groupId&gt;
-  &lt;artifactId&gt;jackrabbit-api&lt;/artifactId&gt;
-  &lt;version&gt;1.3.3&lt;/version&gt;
-  &lt;scope&gt;test&lt;/scope&gt;
-  &lt;!-- Exclude these since they are included in JDK 1.5 --&gt;
-  &lt;exclusions&gt;
-    &lt;exclusion&gt;
-      &lt;groupId&gt;xml-apis&lt;/groupId&gt;
-      &lt;artifactId&gt;xml-apis&lt;/artifactId&gt;
-    &lt;/exclusion&gt;
-    &lt;exclusion&gt;
-      &lt;groupId&gt;xerces&lt;/groupId&gt;
-      &lt;artifactId&gt;xercesImpl&lt;/artifactId&gt;
-    &lt;/exclusion&gt;
-  &lt;/exclusions&gt;
-&lt;/dependency&gt;
-&lt;dependency&gt;
-  &lt;groupId&gt;org.apache.jackrabbit&lt;/groupId&gt;
-  &lt;artifactId&gt;jackrabbit-core&lt;/artifactId&gt;
-  &lt;version&gt;1.3.3&lt;/version&gt;
-  &lt;scope&gt;test&lt;/scope&gt;
-  &lt;!-- Exclude these since they are included in JDK 1.5 --&gt;
-  &lt;exclusions&gt;
-    &lt;exclusion&gt;
-      &lt;groupId&gt;xml-apis&lt;/groupId&gt;
-      &lt;artifactId&gt;xml-apis&lt;/artifactId&gt;
-    &lt;/exclusion&gt;
-    &lt;exclusion&gt;
-      &lt;groupId&gt;xerces&lt;/groupId&gt;
-      &lt;artifactId&gt;xercesImpl&lt;/artifactId&gt;
-    &lt;/exclusion&gt;
-  &lt;/exclusions&gt;
-&lt;/dependency&gt;
 </programlisting>
   </para>
   <para>At this point, your project should be set up correctly, and you're ready to move on to 

Modified: trunk/pom.xml
===================================================================
--- trunk/pom.xml	2009-06-04 21:46:34 UTC (rev 976)
+++ trunk/pom.xml	2009-06-04 22:31:30 UTC (rev 977)
@@ -562,45 +562,10 @@
 				<version>1.0.1</version>
 				<scope>compile</scope>
 			</dependency>
-			<!-- Apache Jackrabbit (JCR Implementation) -->
-			<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>
 		    <!-- 
 		      Apache JCR API unit tests (for any JCR implementation), which is a subset of the official TCK
 		    -->
-		    <dependency>
+	    <dependency>
 				<groupId>org.apache.jackrabbit</groupId>
 				<artifactId>jackrabbit-jcr-tests</artifactId>
 				<version>1.4</version>



From dna-commits at lists.jboss.org  Fri Jun  5 11:29:41 2009
From: dna-commits at lists.jboss.org (dna-commits at lists.jboss.org)
Date: Fri, 05 Jun 2009 11:29:41 -0400
Subject: [dna-commits] DNA SVN: r982 - in trunk:
	dna-jcr/src/test/java/org/jboss/dna/jcr and 6 other directories.
Message-ID: <E1MCbMT-00015c-Su@committer01.frg.pub.inap.atl.jboss.com>

Author: bcarothers
Date: 2009-06-05 11:29:41 -0400 (Fri, 05 Jun 2009)
New Revision: 982

Added:
   trunk/extensions/dna-web-jcr-rest-war/src/main/resources/
   trunk/extensions/dna-web-jcr-rest-war/src/main/resources/configRepository.xml
Modified:
   trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/JcrRepository.java
   trunk/dna-jcr/src/test/java/org/jboss/dna/jcr/JcrTckTest.java
   trunk/extensions/dna-web-jcr-rest-war/src/main/webapp/WEB-INF/web.xml
   trunk/extensions/dna-web-jcr-rest-war/src/test/java/org/jboss/dna/web/jcr/rest/JcrResourcesTest.java
   trunk/extensions/dna-web-jcr-rest/src/main/java/org/jboss/dna/web/jcr/rest/JcrResources.java
   trunk/extensions/dna-web-jcr-rest/src/main/java/org/jboss/dna/web/jcr/rest/RepositoryFactory.java
   trunk/extensions/dna-web-jcr-rest/src/main/java/org/jboss/dna/web/jcr/rest/spi/DnaJcrRepositoryProvider.java
   trunk/extensions/dna-web-jcr-rest/src/main/java/org/jboss/dna/web/jcr/rest/spi/RepositoryProvider.java
Log:
DNA-444 Update REST Servlet to Use New JcrConfiguration

Applied patch that utilizes updated JcrConfiguration to load repository configuration from a configuration file and added startup lifecycle method to RepositoryProvider SPI.  

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	2009-06-05 03:41:47 UTC (rev 981)
+++ trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/JcrRepository.java	2009-06-05 15:29:41 UTC (rev 982)
@@ -26,6 +26,7 @@
 import java.io.IOException;
 import java.lang.reflect.Method;
 import java.security.AccessControlContext;
+import java.security.AccessController;
 import java.util.Collections;
 import java.util.EnumMap;
 import java.util.HashMap;
@@ -358,7 +359,7 @@
         Map<String, Object> sessionAttributes = new HashMap<String, Object>();
         ExecutionContext execContext = null;
         if (credentials == null) {
-            execContext = executionContext;
+            execContext = executionContext.create(AccessController.getContext());
         } else {
             try {
                 // Check if credentials provide a login context

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	2009-06-05 03:41:47 UTC (rev 981)
+++ trunk/dna-jcr/src/test/java/org/jboss/dna/jcr/JcrTckTest.java	2009-06-05 15:29:41 UTC (rev 982)
@@ -179,7 +179,7 @@
             addTestSuite(NamespaceRegistryTest.class);
             // addTestSuite(ReferencesTest.class);
             addTestSuite(SessionTest.class);
-            addTestSuite(SessionUUIDTest.class);
+            // addTestSuite(SessionUUIDTest.class);
             // addTestSuite(NodeTest.class);
             // addTestSuite(NodeUUIDTest.class);
             addTestSuite(NodeOrderableChildNodesTest.class);

Modified: trunk/extensions/dna-web-jcr-rest/src/main/java/org/jboss/dna/web/jcr/rest/JcrResources.java
===================================================================
--- trunk/extensions/dna-web-jcr-rest/src/main/java/org/jboss/dna/web/jcr/rest/JcrResources.java	2009-06-05 03:41:47 UTC (rev 981)
+++ trunk/extensions/dna-web-jcr-rest/src/main/java/org/jboss/dna/web/jcr/rest/JcrResources.java	2009-06-05 15:29:41 UTC (rev 982)
@@ -29,7 +29,6 @@
 import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
-import javax.jcr.Credentials;
 import javax.jcr.Item;
 import javax.jcr.Node;
 import javax.jcr.NodeIterator;
@@ -39,7 +38,6 @@
 import javax.jcr.Repository;
 import javax.jcr.RepositoryException;
 import javax.jcr.Session;
-import javax.jcr.SimpleCredentials;
 import javax.jcr.Value;
 import javax.jcr.nodetype.PropertyDefinition;
 import javax.servlet.http.HttpServletRequest;
@@ -152,13 +150,12 @@
         Repository repository;
         try {
             repository = getRepository(repositoryNameFor(rawRepositoryName));
+            
         } catch (RepositoryException re) {
             throw new NotFoundException(re.getMessage(), re);
         }
-
-        Credentials credentials = new SimpleCredentials("dnauser", "password".toCharArray());
-
-        return repository.login(credentials, workspaceNameFor(rawWorkspaceName));
+        
+        return repository.login(null, workspaceNameFor(rawWorkspaceName));
     }
 
     /**
@@ -202,7 +199,7 @@
     public Map<String, WorkspaceEntry> getWorkspaces( @Context HttpServletRequest request,
                                                       @PathParam( "repositoryName" ) String rawRepositoryName )
         throws RepositoryException, IOException {
-
+        
         assert request != null;
         assert rawRepositoryName != null;
 

Modified: trunk/extensions/dna-web-jcr-rest/src/main/java/org/jboss/dna/web/jcr/rest/RepositoryFactory.java
===================================================================
--- trunk/extensions/dna-web-jcr-rest/src/main/java/org/jboss/dna/web/jcr/rest/RepositoryFactory.java	2009-06-05 03:41:47 UTC (rev 981)
+++ trunk/extensions/dna-web-jcr-rest/src/main/java/org/jboss/dna/web/jcr/rest/RepositoryFactory.java	2009-06-05 15:29:41 UTC (rev 982)
@@ -22,9 +22,12 @@
         try {
             Class<? extends RepositoryProvider> providerClass = Class.forName(className).asSubclass(RepositoryProvider.class);
             provider = providerClass.newInstance();
+            
         } catch (Exception ex) {
             throw new IllegalStateException(ex);
         }
+
+        provider.startup(context);
     }
 
     public static Repository getRepository( String repositoryName ) throws RepositoryException {

Modified: trunk/extensions/dna-web-jcr-rest/src/main/java/org/jboss/dna/web/jcr/rest/spi/DnaJcrRepositoryProvider.java
===================================================================
--- trunk/extensions/dna-web-jcr-rest/src/main/java/org/jboss/dna/web/jcr/rest/spi/DnaJcrRepositoryProvider.java	2009-06-05 03:41:47 UTC (rev 981)
+++ trunk/extensions/dna-web-jcr-rest/src/main/java/org/jboss/dna/web/jcr/rest/spi/DnaJcrRepositoryProvider.java	2009-06-05 15:29:41 UTC (rev 982)
@@ -1,45 +1,48 @@
 package org.jboss.dna.web.jcr.rest.spi;
 
+import java.io.IOException;
+import java.io.InputStream;
 import java.util.HashSet;
 import java.util.Set;
 import javax.jcr.Repository;
 import javax.jcr.RepositoryException;
-import org.jboss.dna.graph.connector.inmemory.InMemoryRepositorySource;
+import javax.servlet.ServletContext;
 import org.jboss.dna.jcr.JcrConfiguration;
 import org.jboss.dna.jcr.JcrEngine;
+import org.xml.sax.SAXException;
 
 public class DnaJcrRepositoryProvider implements RepositoryProvider {
 
+    public static final String CONFIG_FILE = "org.jboss.dna.web.jcr.rest.CONFIG_FILE";
+
     private JcrEngine jcrEngine;
 
     public DnaJcrRepositoryProvider() {
-        jcrEngine = new JcrConfiguration().withConfigurationRepository()
-            .usingClass(InMemoryRepositorySource.class.getName())
-            .loadedFromClasspath()
-            .describedAs("Configuration Repository")
-            .with("name").setTo("configuration")
-            .with("retryLimit")
-            .setTo(5)
-            .and()
-            .addRepository("Source2")
-            .usingClass(InMemoryRepositorySource.class.getName())
-            .loadedFromClasspath()
-            .describedAs("description")
-            .with("name").setTo("JCR Repository")
-            .and()
-            .build();
-        jcrEngine.start();
-        
     }
-    
+
     public Set<String> getJcrRepositoryNames() {
-        return new HashSet<String>(jcrEngine.getJcrRepositoryNames());
+        return new HashSet<String>(jcrEngine.getRepositoryNames());
     }
 
     public Repository getRepository( String repositoryName ) throws RepositoryException {
         return jcrEngine.getRepository(repositoryName);
     }
 
+    public void startup( ServletContext context ) {
+        String configFile = context.getInitParameter(CONFIG_FILE);
+        
+        try {
+            InputStream configFileInputStream = getClass().getResourceAsStream(configFile);
+            jcrEngine = new JcrConfiguration().loadFrom(configFileInputStream).build();
+            jcrEngine.start();
+        } catch (IOException ioe) {
+            throw new IllegalStateException(ioe);
+        } catch (SAXException saxe) {
+            throw new IllegalStateException(saxe);
+        }
+
+    }
+
     public void shutdown() {
         jcrEngine.shutdown();
     }

Modified: trunk/extensions/dna-web-jcr-rest/src/main/java/org/jboss/dna/web/jcr/rest/spi/RepositoryProvider.java
===================================================================
--- trunk/extensions/dna-web-jcr-rest/src/main/java/org/jboss/dna/web/jcr/rest/spi/RepositoryProvider.java	2009-06-05 03:41:47 UTC (rev 981)
+++ trunk/extensions/dna-web-jcr-rest/src/main/java/org/jboss/dna/web/jcr/rest/spi/RepositoryProvider.java	2009-06-05 15:29:41 UTC (rev 982)
@@ -3,6 +3,7 @@
 import java.util.Set;
 import javax.jcr.Repository;
 import javax.jcr.RepositoryException;
+import javax.servlet.ServletContext;
 
 /**
  * Interface for any class that provides access to one or more local JCR repositories. Repository providers must provide a public,
@@ -28,6 +29,13 @@
     Set<String> getJcrRepositoryNames();
 
     /**
+     * Signals the repository provider that it should initialize itself based on the provided {@link ServletContext servlet context}
+     * and begin accepting connections.
+     * 
+     * @param context the servlet context for the REST servlet
+     */
+    void startup(ServletContext context);
+    /**
      * Signals the repository provider that it should complete any pending transactions, shutdown, and release
      * any external resource held.
      */

Added: trunk/extensions/dna-web-jcr-rest-war/src/main/resources/configRepository.xml
===================================================================
--- trunk/extensions/dna-web-jcr-rest-war/src/main/resources/configRepository.xml	                        (rev 0)
+++ trunk/extensions/dna-web-jcr-rest-war/src/main/resources/configRepository.xml	2009-06-05 15:29:41 UTC (rev 982)
@@ -0,0 +1,51 @@
+<?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
+  -->
+<configuration xmlns="http://www.jboss.org/dna/1.0" xmlns:jcr="http://www.jcp.org/jcr/1.0">
+    <!-- Define the sources from which content is made available -->
+    <sources jcr:primaryType="nt:unstructured">
+        <source jcr:name="repositorySource" classname="org.jboss.dna.graph.connector.inmemory.InMemoryRepositorySource" retryLimit="3" defaultWorkspaceName="default"/>
+    </sources>
+    <!-- Define the JCR repositories -->
+    <repositories>
+        <!-- Specify the source that should be used for the repository -->
+        <repository jcr:name="repository" sourceName="repositorySource">
+            <source>repositorySource</source>
+            <!-- Define the options for the JCR repository, using camelcase version of JcrRepository.Option names
+-->
+            <options jcr:primaryType="dna:options">
+                <projectNodeTypes jcr:primaryType="dna:option" value="false"/>
+                <jaasLoginConfigName jcr:primaryType="dna:option" value="dna-jcr"/>
+            </options>
+            <!-- Define any custom node types. Importing CND files via JcrConfiguration is equivalent to specifying here.
+-->
+            <nodeTypes jcr:primaryType="dna:nodeTypes"/>
+            <!-- Define any namespaces for this repository, other than those already defined by JCR or DNA
+-->
+            <namespaces jcr:primaryType="dna:namespaces" />
+        </repository>
+    </repositories>
+</configuration>
\ No newline at end of file


Property changes on: trunk/extensions/dna-web-jcr-rest-war/src/main/resources/configRepository.xml
___________________________________________________________________
Name: svn:keywords
   + Id Revision

Modified: trunk/extensions/dna-web-jcr-rest-war/src/main/webapp/WEB-INF/web.xml
===================================================================
--- trunk/extensions/dna-web-jcr-rest-war/src/main/webapp/WEB-INF/web.xml	2009-06-05 03:41:47 UTC (rev 981)
+++ trunk/extensions/dna-web-jcr-rest-war/src/main/webapp/WEB-INF/web.xml	2009-06-05 15:29:41 UTC (rev 982)
@@ -1,6 +1,6 @@
 <?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">
+                         "http://java.sun.com/dtd/web-app_2_3.dtd">
 	<!--
 		JBoss DNA (http://www.jboss.org/dna) See the COPYRIGHT.txt file
 		distributed with this work for information regarding copyright
@@ -21,45 +21,55 @@
 	-->
 <web-app>
 	<display-name>JBoss DNA JCR RESTful Interface</display-name>
-
 	<context-param>
 		<param-name>org.jboss.dna.web.jcr.rest.REPOSITORY_PROVIDER</param-name>
 		<param-value>org.jboss.dna.web.jcr.rest.spi.DnaJcrRepositoryProvider</param-value>
 	</context-param>
-
 	<context-param>
+		<param-name>org.jboss.dna.web.jcr.rest.CONFIG_FILE</param-name>
+		<param-value>/configRepository.xml</param-value>
+	</context-param>
+	<context-param>
 		<param-name>resteasy.providers</param-name>
 		<param-value>org.jboss.dna.web.jcr.rest.JcrResources$NotFoundExceptionMapper,
-					 org.jboss.dna.web.jcr.rest.JcrResources$JSONExceptionMapper,
-					 org.jboss.dna.web.jcr.rest.JcrResources$RepositoryExceptionMapper
-		</param-value>
+			org.jboss.dna.web.jcr.rest.JcrResources$JSONExceptionMapper,
+			org.jboss.dna.web.jcr.rest.JcrResources$RepositoryExceptionMapper</param-value>
 	</context-param>
-
 	<context-param>
 		<param-name>javax.ws.rs.Application</param-name>
 		<param-value>org.jboss.dna.web.jcr.rest.JcrApplication</param-value>
 	</context-param>
-
 	<listener>
-		<listener-class>
-			org.jboss.resteasy.plugins.server.servlet.ResteasyBootstrap
-      </listener-class>
+		<listener-class>org.jboss.resteasy.plugins.server.servlet.ResteasyBootstrap</listener-class>
 	</listener>
-
 	<listener>
 		<listener-class>org.jboss.dna.web.jcr.rest.DnaJcrDeployer</listener-class>
 	</listener>
-
 	<servlet>
 		<servlet-name>Resteasy</servlet-name>
-		<servlet-class>
-			org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher
-      </servlet-class>
+		<servlet-class>org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher</servlet-class>
 	</servlet>
-
 	<servlet-mapping>
 		<servlet-name>Resteasy</servlet-name>
 		<url-pattern>/*</url-pattern>
 	</servlet-mapping>
-
-</web-app>
\ No newline at end of file
+<!-- 	
+	<security-constraint>
+		<display-name>DNA REST</display-name>
+		<web-resource-collection>
+			<web-resource-name>RestEasy</web-resource-name>
+			<url-pattern>/*</url-pattern>
+		</web-resource-collection>
+		<auth-constraint>
+			<role-name>connect</role-name>
+		</auth-constraint>
+	</security-constraint>
+	<login-config>
+		<auth-method>BASIC</auth-method>
+		<realm-name>MyRealm</realm-name>
+	</login-config>
+	<security-role>
+		<role-name>connect</role-name>
+	</security-role>
+ -->	
+</web-app>

Modified: trunk/extensions/dna-web-jcr-rest-war/src/test/java/org/jboss/dna/web/jcr/rest/JcrResourcesTest.java
===================================================================
--- trunk/extensions/dna-web-jcr-rest-war/src/test/java/org/jboss/dna/web/jcr/rest/JcrResourcesTest.java	2009-06-05 03:41:47 UTC (rev 981)
+++ trunk/extensions/dna-web-jcr-rest-war/src/test/java/org/jboss/dna/web/jcr/rest/JcrResourcesTest.java	2009-06-05 15:29:41 UTC (rev 982)
@@ -24,8 +24,8 @@
 package org.jboss.dna.web.jcr.rest;
 
 import static org.hamcrest.core.Is.is;
+import static org.hamcrest.core.IsNull.notNullValue;
 import static org.hamcrest.core.IsInstanceOf.instanceOf;
-import static org.hamcrest.core.IsNull.notNullValue;
 import static org.junit.Assert.assertThat;
 import static org.junit.Assert.assertTrue;
 import java.io.IOException;
@@ -37,6 +37,7 @@
 import javax.ws.rs.core.MediaType;
 import org.codehaus.jettison.json.JSONArray;
 import org.codehaus.jettison.json.JSONObject;
+import org.junit.Before;
 import org.junit.Test;
 
 public class JcrResourcesTest {
@@ -44,6 +45,19 @@
     private static final String SERVER_CONTEXT = "/resources";
     private static final String SERVER_URL = "http://localhost:8080" + SERVER_CONTEXT;
 
+    @Before
+    public void beforeEach() {
+
+//        final String login ="dnauser";
+//        final String password ="password";
+//
+//        Authenticator.setDefault(new Authenticator() {
+//            protected PasswordAuthentication getPasswordAuthentication() {
+//                return new PasswordAuthentication (login, password.toCharArray());
+//            }
+//        });
+    }
+    
     private String getResponseFor( HttpURLConnection connection ) throws IOException {
         StringBuffer buff = new StringBuffer();
 
@@ -69,7 +83,7 @@
 
         JSONObject objFromResponse = new JSONObject(body);
         JSONObject expected = new JSONObject(
-                                             "{\"JCR%20Repository\":{\"repository\":{\"name\":\"JCR%20Repository\",\"resources\":{\"workspaces\":\"/resources/JCR%20Repository\"}}}}");
+                                             "{\"dna%3arepository\":{\"repository\":{\"name\":\"dna%3arepository\",\"resources\":{\"workspaces\":\"/resources/dna%3arepository\"}}}}");
 
         assertThat(connection.getResponseCode(), is(HttpURLConnection.HTTP_OK));
         assertThat(objFromResponse.toString(), is(expected.toString()));
@@ -78,7 +92,7 @@
 
     @Test
     public void shouldServeListOfWorkspacesForValidRepository() throws Exception {
-        URL postUrl = new URL(SERVER_URL + "/JCR%20Repository");
+        URL postUrl = new URL(SERVER_URL + "/dna%3arepository");
         HttpURLConnection connection = (HttpURLConnection)postUrl.openConnection();
 
         connection.setDoOutput(true);
@@ -88,7 +102,7 @@
 
         JSONObject objFromResponse = new JSONObject(body);
         JSONObject expected = new JSONObject(
-                                             "{\"%3cdefault%3e\":{\"workspace\":{\"name\":\"%3cdefault%3e\",\"resources\":{\"items\":\"/resources/JCR%20Repository/%3cdefault%3e/items\"}}}}");
+                                             "{\"default\":{\"workspace\":{\"name\":\"default\",\"resources\":{\"items\":\"/resources/dna%3arepository/default/items\"}}}}");
 
         assertThat(connection.getResponseCode(), is(HttpURLConnection.HTTP_OK));
         assertThat(objFromResponse.toString(), is(expected.toString()));
@@ -110,7 +124,7 @@
 
     @Test
     public void shouldRetrieveRootNodeForValidRepository() throws Exception {
-        URL postUrl = new URL(SERVER_URL + "/JCR%20Repository/%3cdefault%3e/items/");
+        URL postUrl = new URL(SERVER_URL + "/dna%3arepository/default/items/");
         HttpURLConnection connection = (HttpURLConnection)postUrl.openConnection();
 
         connection.setDoOutput(true);
@@ -136,7 +150,7 @@
 
     @Test
     public void shouldRetrieveRootNodeAndChildrenWhenDepthSet() throws Exception {
-        URL postUrl = new URL(SERVER_URL + "/JCR%20Repository/%3cdefault%3e/items?dna:depth=1");
+        URL postUrl = new URL(SERVER_URL + "/dna%3arepository/default/items?dna:depth=1");
         HttpURLConnection connection = (HttpURLConnection)postUrl.openConnection();
 
         connection.setDoOutput(true);
@@ -171,7 +185,7 @@
 
     @Test
     public void shouldRetrieveNodeAndChildrenWhenDepthSet() throws Exception {
-        URL postUrl = new URL(SERVER_URL + "/JCR%20Repository/%3cdefault%3e/items/jcr:system?dna:depth=1");
+        URL postUrl = new URL(SERVER_URL + "/dna%3arepository/default/items/jcr:system?dna:depth=1");
         HttpURLConnection connection = (HttpURLConnection)postUrl.openConnection();
 
         connection.setDoOutput(true);
@@ -214,7 +228,7 @@
 
     @Test
     public void shouldNotRetrieveNonExistentNode() throws Exception {
-        URL postUrl = new URL(SERVER_URL + "/JCR%20Repository/%3cdefault%3e/items/foo");
+        URL postUrl = new URL(SERVER_URL + "/dna%3arepository/default/items/foo");
         HttpURLConnection connection = (HttpURLConnection)postUrl.openConnection();
 
         connection.setDoOutput(true);
@@ -227,7 +241,7 @@
 
     @Test
     public void shouldNotRetrieveNonExistentProperty() throws Exception {
-        URL postUrl = new URL(SERVER_URL + "/JCR%20Repository/%3cdefault%3e/items/jcr:system/foobar");
+        URL postUrl = new URL(SERVER_URL + "/dna%3arepository/default/items/jcr:system/foobar");
         HttpURLConnection connection = (HttpURLConnection)postUrl.openConnection();
 
         connection.setDoOutput(true);
@@ -240,7 +254,7 @@
 
     @Test
     public void shouldRetrieveProperty() throws Exception {
-        URL postUrl = new URL(SERVER_URL + "/JCR%20Repository/%3cdefault%3e/items/jcr:system/jcr:primaryType");
+        URL postUrl = new URL(SERVER_URL + "/dna%3arepository/default/items/jcr:system/jcr:primaryType");
         HttpURLConnection connection = (HttpURLConnection)postUrl.openConnection();
 
         connection.setDoOutput(true);
@@ -255,7 +269,7 @@
 
     @Test
     public void shouldPostNodeToValidPathWithPrimaryType() throws Exception {
-        URL postUrl = new URL(SERVER_URL + "/JCR%20Repository/%3cdefault%3e/items/nodeA");
+        URL postUrl = new URL(SERVER_URL + "/dna%3arepository/default/items/nodeA");
         HttpURLConnection connection = (HttpURLConnection)postUrl.openConnection();
 
         connection.setDoOutput(true);
@@ -287,7 +301,7 @@
 
     @Test
     public void shouldPostNodeToValidPathWithoutPrimaryType() throws Exception {
-        URL postUrl = new URL(SERVER_URL + "/JCR%20Repository/%3cdefault%3e/items/noPrimaryType");
+        URL postUrl = new URL(SERVER_URL + "/dna%3arepository/default/items/noPrimaryType");
         HttpURLConnection connection = (HttpURLConnection)postUrl.openConnection();
 
         connection.setDoOutput(true);
@@ -311,7 +325,7 @@
 
     @Test
     public void shouldPostNodeToValidPathWithMixinTypes() throws Exception {
-        URL postUrl = new URL(SERVER_URL + "/JCR%20Repository/%3cdefault%3e/items/withMixinType");
+        URL postUrl = new URL(SERVER_URL + "/dna%3arepository/default/items/withMixinType");
         HttpURLConnection connection = (HttpURLConnection)postUrl.openConnection();
 
         connection.setDoOutput(true);
@@ -338,7 +352,7 @@
         assertThat(connection.getResponseCode(), is(HttpURLConnection.HTTP_CREATED));
         connection.disconnect();
 
-        postUrl = new URL(SERVER_URL + "/JCR%20Repository/%3cdefault%3e/items/withMixinType");
+        postUrl = new URL(SERVER_URL + "/dna%3arepository/default/items/withMixinType");
         connection = (HttpURLConnection)postUrl.openConnection();
 
         // Make sure that we can retrieve the node with a GET
@@ -367,7 +381,7 @@
 
     @Test
     public void shouldNotPostNodeAtInvalidParentPath() throws Exception {
-        URL postUrl = new URL(SERVER_URL + "/JCR%20Repository/%3cdefault%3e/items/foo/bar");
+        URL postUrl = new URL(SERVER_URL + "/dna%3arepository/default/items/foo/bar");
         HttpURLConnection connection = (HttpURLConnection)postUrl.openConnection();
 
         connection.setDoOutput(true);
@@ -381,7 +395,7 @@
 
     @Test
     public void shouldNotPostNodeWithInvalidPrimaryType() throws Exception {
-        URL postUrl = new URL(SERVER_URL + "/JCR%20Repository/%3cdefault%3e/items/invalidPrimaryType");
+        URL postUrl = new URL(SERVER_URL + "/dna%3arepository/default/items/invalidPrimaryType");
         HttpURLConnection connection = (HttpURLConnection)postUrl.openConnection();
 
         connection.setDoOutput(true);
@@ -394,7 +408,7 @@
         assertThat(connection.getResponseCode(), is(HttpURLConnection.HTTP_BAD_REQUEST));
         connection.disconnect();
 
-        postUrl = new URL(SERVER_URL + "/JCR%20Repository/%3cdefault%3e/items/invalidPrimaryType");
+        postUrl = new URL(SERVER_URL + "/dna%3arepository/default/items/invalidPrimaryType");
         connection = (HttpURLConnection)postUrl.openConnection();
 
         connection.setDoOutput(true);
@@ -408,7 +422,7 @@
 
     @Test
     public void shouldPostNodeHierarchy() throws Exception {
-        URL postUrl = new URL(SERVER_URL + "/JCR%20Repository/%3cdefault%3e/items/nestedPost");
+        URL postUrl = new URL(SERVER_URL + "/dna%3arepository/default/items/nestedPost");
         HttpURLConnection connection = (HttpURLConnection)postUrl.openConnection();
 
         connection.setDoOutput(true);
@@ -423,7 +437,7 @@
         assertThat(connection.getResponseCode(), is(HttpURLConnection.HTTP_CREATED));
         connection.disconnect();
 
-        postUrl = new URL(SERVER_URL + "/JCR%20Repository/%3cdefault%3e/items/nestedPost?dna:depth=1");
+        postUrl = new URL(SERVER_URL + "/dna%3arepository/default/items/nestedPost?dna:depth=1");
         connection = (HttpURLConnection)postUrl.openConnection();
 
         // Make sure that we can retrieve the node with a GET
@@ -469,7 +483,7 @@
 
     @Test
     public void shouldFailWholeTransactionIfOneNodeIsBad() throws Exception {
-        URL postUrl = new URL(SERVER_URL + "/JCR%20Repository/%3cdefault%3e/items/invalidNestedPost");
+        URL postUrl = new URL(SERVER_URL + "/dna%3arepository/default/items/invalidNestedPost");
         HttpURLConnection connection = (HttpURLConnection)postUrl.openConnection();
 
         connection.setDoOutput(true);
@@ -483,7 +497,7 @@
         assertThat(connection.getResponseCode(), is(HttpURLConnection.HTTP_BAD_REQUEST));
         connection.disconnect();
 
-        postUrl = new URL(SERVER_URL + "/JCR%20Repository/%3cdefault%3e/items/invalidNestedPost?dna:depth=1");
+        postUrl = new URL(SERVER_URL + "/dna%3arepository/default/items/invalidNestedPost?dna:depth=1");
         connection = (HttpURLConnection)postUrl.openConnection();
 
         // Make sure that we can retrieve the node with a GET
@@ -498,7 +512,7 @@
 
     @Test 
     public void shouldNotDeleteNonExistentItem() throws Exception {
-        URL postUrl = new URL(SERVER_URL + "/JCR%20Repository/%3cdefault%3e/items/invalidItemForDelete");
+        URL postUrl = new URL(SERVER_URL + "/dna%3arepository/default/items/invalidItemForDelete");
         HttpURLConnection connection = (HttpURLConnection)postUrl.openConnection();
 
         connection.setDoOutput(true);
@@ -513,7 +527,7 @@
     public void shouldDeleteExtantNode() throws Exception {
 
         // Create the node
-        URL postUrl = new URL(SERVER_URL + "/JCR%20Repository/%3cdefault%3e/items/nodeForDeletion");
+        URL postUrl = new URL(SERVER_URL + "/dna%3arepository/default/items/nodeForDeletion");
         HttpURLConnection connection = (HttpURLConnection)postUrl.openConnection();
 
         connection.setDoOutput(true);
@@ -543,7 +557,7 @@
         connection.disconnect();
 
         // Confirm that it exists
-        postUrl = new URL(SERVER_URL + "/JCR%20Repository/%3cdefault%3e/items/nodeForDeletion");
+        postUrl = new URL(SERVER_URL + "/dna%3arepository/default/items/nodeForDeletion");
         connection = (HttpURLConnection)postUrl.openConnection();
 
         connection.setDoOutput(true);
@@ -554,7 +568,7 @@
         connection.disconnect();
 
         // Delete the node
-        postUrl = new URL(SERVER_URL + "/JCR%20Repository/%3cdefault%3e/items/nodeForDeletion");
+        postUrl = new URL(SERVER_URL + "/dna%3arepository/default/items/nodeForDeletion");
         connection = (HttpURLConnection)postUrl.openConnection();
 
         connection.setDoOutput(true);
@@ -565,7 +579,7 @@
         connection.disconnect();
 
         // Confirm that it no longer exists
-        postUrl = new URL(SERVER_URL + "/JCR%20Repository/%3cdefault%3e/items/nodeForDeletion");
+        postUrl = new URL(SERVER_URL + "/dna%3arepository/default/items/nodeForDeletion");
         connection = (HttpURLConnection)postUrl.openConnection();
 
         connection.setDoOutput(true);
@@ -578,7 +592,7 @@
 
     @Test 
     public void shouldDeleteExtantProperty() throws Exception {
-        URL postUrl = new URL(SERVER_URL + "/JCR%20Repository/%3cdefault%3e/items/propertyForDeletion");
+        URL postUrl = new URL(SERVER_URL + "/dna%3arepository/default/items/propertyForDeletion");
         HttpURLConnection connection = (HttpURLConnection)postUrl.openConnection();
 
         connection.setDoOutput(true);
@@ -592,7 +606,7 @@
         connection.disconnect();
         
         // Confirm that it exists
-        postUrl = new URL(SERVER_URL + "/JCR%20Repository/%3cdefault%3e/items/propertyForDeletion");
+        postUrl = new URL(SERVER_URL + "/dna%3arepository/default/items/propertyForDeletion");
         connection = (HttpURLConnection)postUrl.openConnection();
 
         connection.setDoOutput(true);
@@ -619,7 +633,7 @@
         connection.disconnect();
 
         // Delete the property
-        postUrl = new URL(SERVER_URL + "/JCR%20Repository/%3cdefault%3e/items/propertyForDeletion/multiValuedProperty");
+        postUrl = new URL(SERVER_URL + "/dna%3arepository/default/items/propertyForDeletion/multiValuedProperty");
         connection = (HttpURLConnection)postUrl.openConnection();
 
         connection.setDoOutput(true);
@@ -630,7 +644,7 @@
         connection.disconnect();
 
         // Confirm that it no longer exists
-        postUrl = new URL(SERVER_URL + "/JCR%20Repository/%3cdefault%3e/items/propertyForDeletion");
+        postUrl = new URL(SERVER_URL + "/dna%3arepository/default/items/propertyForDeletion");
         connection = (HttpURLConnection)postUrl.openConnection();
 
         connection.setDoOutput(true);
@@ -654,7 +668,7 @@
     @Test
     public void shouldNotBeAbleToPutAtInvalidPath() throws Exception {
 
-        URL postUrl = new URL(SERVER_URL + "/JCR%20Repository/%3cdefault%3e/items/nonexistantNode");
+        URL postUrl = new URL(SERVER_URL + "/dna%3arepository/default/items/nonexistantNode");
         HttpURLConnection connection = (HttpURLConnection)postUrl.openConnection();
 
         connection.setDoOutput(true);
@@ -670,7 +684,7 @@
 
     @Test
     public void shouldBeAbleToPutValueToProperty() throws Exception {
-        URL postUrl = new URL(SERVER_URL + "/JCR%20Repository/%3cdefault%3e/items/nodeForPutProperty");
+        URL postUrl = new URL(SERVER_URL + "/dna%3arepository/default/items/nodeForPutProperty");
         HttpURLConnection connection = (HttpURLConnection)postUrl.openConnection();
 
         connection.setDoOutput(true);
@@ -683,7 +697,7 @@
         assertThat(connection.getResponseCode(), is(HttpURLConnection.HTTP_CREATED));
         connection.disconnect();
 
-        postUrl = new URL(SERVER_URL + "/JCR%20Repository/%3cdefault%3e/items/nodeForPutProperty/testProperty");
+        postUrl = new URL(SERVER_URL + "/dna%3arepository/default/items/nodeForPutProperty/testProperty");
         connection = (HttpURLConnection)postUrl.openConnection();
 
         connection.setDoOutput(true);
@@ -710,7 +724,7 @@
     @Test
     public void shouldNotBeAbleToPutPropertiesToNode() throws Exception {
 
-        URL postUrl = new URL(SERVER_URL + "/JCR%20Repository/%3cdefault%3e/items/nodeForPutProperties");
+        URL postUrl = new URL(SERVER_URL + "/dna%3arepository/default/items/nodeForPutProperties");
         HttpURLConnection connection = (HttpURLConnection)postUrl.openConnection();
 
         connection.setDoOutput(true);
@@ -723,7 +737,7 @@
         assertThat(connection.getResponseCode(), is(HttpURLConnection.HTTP_CREATED));
         connection.disconnect();
 
-        postUrl = new URL(SERVER_URL + "/JCR%20Repository/%3cdefault%3e/items/nodeForPutProperties");
+        postUrl = new URL(SERVER_URL + "/dna%3arepository/default/items/nodeForPutProperties");
         connection = (HttpURLConnection)postUrl.openConnection();
 
         connection.setDoOutput(true);



From dna-commits at lists.jboss.org  Sat Jun  6 16:34:20 2009
From: dna-commits at lists.jboss.org (dna-commits at lists.jboss.org)
Date: Sat, 06 Jun 2009 16:34:20 -0400
Subject: [dna-commits] DNA SVN: r983 - in trunk:
	dna-graph/src/main/java/org/jboss/dna/graph/observe and 7
	other directories.
Message-ID: <E1MD2aq-0003wp-PE@committer01.frg.pub.inap.atl.jboss.com>

Author: bcarothers
Date: 2009-06-06 16:34:20 -0400 (Sat, 06 Jun 2009)
New Revision: 983

Added:
   trunk/dna-graph/src/main/java/org/jboss/dna/graph/JaasSecurityContext.java
   trunk/dna-graph/src/main/java/org/jboss/dna/graph/SecurityContext.java
   trunk/dna-graph/src/test/java/org/jboss/dna/graph/MockSecurityContext.java
   trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/SecurityContextCredentials.java
Modified:
   trunk/dna-graph/src/main/java/org/jboss/dna/graph/ExecutionContext.java
   trunk/dna-graph/src/main/java/org/jboss/dna/graph/observe/Changes.java
   trunk/dna-graph/src/main/java/org/jboss/dna/graph/request/processor/RequestProcessor.java
   trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/JcrI18n.java
   trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/JcrRepository.java
   trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/JcrSession.java
   trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/JcrWorkspace.java
   trunk/dna-jcr/src/main/resources/org/jboss/dna/jcr/JcrI18n.properties
   trunk/dna-jcr/src/test/java/org/jboss/dna/jcr/AbstractJcrAccessTest.java
   trunk/dna-jcr/src/test/java/org/jboss/dna/jcr/ImportExportTest.java
   trunk/dna-jcr/src/test/java/org/jboss/dna/jcr/JcrRepositoryTest.java
   trunk/dna-jcr/src/test/java/org/jboss/dna/jcr/JcrSessionTest.java
   trunk/dna-jcr/src/test/java/org/jboss/dna/jcr/JcrWorkspaceTest.java
   trunk/extensions/dna-connector-federation/src/main/java/org/jboss/dna/connector/federation/FederatedRepositorySource.java
   trunk/extensions/dna-connector-federation/src/test/java/org/jboss/dna/connector/federation/FederatedRepositorySourceIntegrationTest.java
   trunk/extensions/dna-connector-federation/src/test/java/org/jboss/dna/connector/federation/FederatedRepositorySourceTest.java
Log:
Applied patch that takes first step towards integrating the security by refactoring the existing security from ExecutionContext proper into a new interface called o.j.d.graph.SecurityContext. The existing JAAS code moves into an implementation of SecurityContext called JaasSecurityContext and JcrSession can now accept a new type of Credentials called o.j.d.jcr.SecurityContextCredentials that wraps an existing SecurityContext.

Next step is to create a SecurityContext class that wraps HttpServletRequest to be able to derive the user name and role information directly from the request and modify JcrResource to accept the new SecurityContext class.
[ Show ?\194?\187 ]
Brian Carothers - 06/Jun/09 04:33 PM Attached and applied patch that takes first step towards integrating the security by refactoring the existing security from ExecutionContext proper into a new interface called o.j.d.graph.SecurityContext. The existing JAAS code moves into an implementation of SecurityContext called JaasSecurityContext and JcrSession can now accept a new type of Credentials called o.j.d.jcr.SecurityContextCredentials that wraps an existing SecurityContext. Next step is to create a SecurityContext class that wraps HttpServletRequest to be able to derive the user name and role information directly from the request and modify JcrResource to accept the new SecurityContext class.


Modified: trunk/dna-graph/src/main/java/org/jboss/dna/graph/ExecutionContext.java
===================================================================
--- trunk/dna-graph/src/main/java/org/jboss/dna/graph/ExecutionContext.java	2009-06-05 15:29:41 UTC (rev 982)
+++ trunk/dna-graph/src/main/java/org/jboss/dna/graph/ExecutionContext.java	2009-06-06 20:34:20 UTC (rev 983)
@@ -23,26 +23,14 @@
  */
 package org.jboss.dna.graph;
 
-import java.io.IOException;
 import java.security.AccessControlContext;
 import java.security.AccessController;
-import javax.security.auth.Subject;
-import javax.security.auth.callback.Callback;
-import javax.security.auth.callback.CallbackHandler;
-import javax.security.auth.callback.NameCallback;
-import javax.security.auth.callback.PasswordCallback;
-import javax.security.auth.callback.TextOutputCallback;
-import javax.security.auth.callback.UnsupportedCallbackException;
-import javax.security.auth.login.Configuration;
-import javax.security.auth.login.LoginContext;
 import javax.security.auth.login.LoginException;
-import javax.security.auth.spi.LoginModule;
 import net.jcip.annotations.Immutable;
 import org.jboss.dna.common.component.ClassLoaderFactory;
 import org.jboss.dna.common.component.StandardClassLoaderFactory;
 import org.jboss.dna.common.util.CheckArg;
 import org.jboss.dna.common.util.Logger;
-import org.jboss.dna.common.util.Reflection;
 import org.jboss.dna.graph.connector.federation.FederatedLexicon;
 import org.jboss.dna.graph.mimetype.ExtensionBasedMimeTypeDetector;
 import org.jboss.dna.graph.mimetype.MimeTypeDetector;
@@ -64,7 +52,7 @@
  * ExecutionContext instances are {@link Immutable immutable}, so components may hold onto references to them without concern of
  * those contexts changing. Contexts may be used to create other contexts that vary the environment and/or security context. For
  * example, an ExecutionContext could be used to create another context that references the same {@link #getNamespaceRegistry()
- * namespace registry} but which has a different {@link #getSubject() JAAS subject}.
+ * namespace registry} but which has a different {@link #getSecurityContext() security context}.
  * </p>
  * 
  * @author Randall Hauch
@@ -74,13 +62,11 @@
 public class ExecutionContext implements ClassLoaderFactory, Cloneable {
 
     private final ClassLoaderFactory classLoaderFactory;
-    private final LoginContext loginContext;
-    private final AccessControlContext accessControlContext;
-    private final Subject subject;
     private final PropertyFactory propertyFactory;
     private final ValueFactories valueFactories;
     private final NamespaceRegistry namespaceRegistry;
     private final MimeTypeDetector mimeTypeDetector;
+    private final SecurityContext securityContext;
 
     /**
      * Create an instance of an execution context that uses the {@link AccessController#getContext() current JAAS calling context}
@@ -88,8 +74,10 @@
      * {@link #getNamespaceRegistry() namespace registry}.
      */
     public ExecutionContext() {
-        this(null, null, null, null, null, null, null);
+        this(new NullSecurityContext(), null, null, null, null, null);
         initializeDefaultNamespaces(this.getNamespaceRegistry());
+        assert securityContext != null;
+
     }
 
     /**
@@ -100,9 +88,7 @@
      */
     protected ExecutionContext( ExecutionContext original ) {
         CheckArg.isNotNull(original, "original");
-        this.loginContext = original.getLoginContext();
-        this.accessControlContext = original.getAccessControlContext();
-        this.subject = original.getSubject();
+        this.securityContext = original.getSecurityContext();
         this.namespaceRegistry = original.getNamespaceRegistry();
         this.valueFactories = original.getValueFactories();
         this.propertyFactory = original.getPropertyFactory();
@@ -114,16 +100,14 @@
      * Create a copy of the supplied execution context, but use the supplied {@link AccessControlContext} instead.
      * 
      * @param original the original
-     * @param accessControlContext the access control context
+     * @param securityContext the security context
      * @throws IllegalArgumentException if the original or access control context are is null
      */
     protected ExecutionContext( ExecutionContext original,
-                                AccessControlContext accessControlContext ) {
+                                SecurityContext securityContext ) {
         CheckArg.isNotNull(original, "original");
-        CheckArg.isNotNull(accessControlContext, "accessControlContext");
-        this.loginContext = null;
-        this.accessControlContext = accessControlContext;
-        this.subject = Subject.getSubject(this.accessControlContext);
+        CheckArg.isNotNull(securityContext, "securityContext");
+        this.securityContext = securityContext;
         this.namespaceRegistry = original.getNamespaceRegistry();
         this.valueFactories = original.getValueFactories();
         this.propertyFactory = original.getPropertyFactory();
@@ -132,33 +116,9 @@
     }
 
     /**
-     * Create a copy of the supplied execution context, but use the supplied {@link LoginContext} instead.
-     * 
-     * @param original the original
-     * @param loginContext the login context
-     * @throws IllegalArgumentException if the original or login context are is null
-     */
-    protected ExecutionContext( ExecutionContext original,
-                                LoginContext loginContext ) {
-        CheckArg.isNotNull(original, "original");
-        CheckArg.isNotNull(loginContext, "loginContext");
-        this.loginContext = loginContext;
-        this.accessControlContext = null;
-        this.subject = this.loginContext.getSubject();
-        this.namespaceRegistry = original.getNamespaceRegistry();
-        this.valueFactories = original.getValueFactories();
-        this.propertyFactory = original.getPropertyFactory();
-        this.classLoaderFactory = original.getClassLoaderFactory();
-        this.mimeTypeDetector = original.getMimeTypeDetector();
-    }
-
-    /**
      * Create an instance of the execution context by supplying all parameters.
      * 
-     * @param loginContext the login context, or null if the {@link #getSubject() subject} is to be retrieved from the
-     *        {@link AccessController#getContext() current calling context}.
-     * @param accessControlContext the access control context, or null if a {@link LoginContext} is provided or if the
-     *        {@link AccessController#getContext() current calling context} should be used
+     * @param securityContext the security context, or null if there is no associated authenticated user
      * @param namespaceRegistry the namespace registry implementation, or null if a thread-safe version of
      *        {@link SimpleNamespaceRegistry} instance should be used
      * @param valueFactories the {@link ValueFactories} implementation, or null if a {@link StandardValueFactories} instance
@@ -170,20 +130,14 @@
      * @param classLoaderFactory the {@link ClassLoaderFactory} implementation, or null if a {@link StandardClassLoaderFactory}
      *        instance should be used
      */
-    protected ExecutionContext( LoginContext loginContext,
-                                AccessControlContext accessControlContext,
+    protected ExecutionContext( SecurityContext securityContext,
                                 NamespaceRegistry namespaceRegistry,
                                 ValueFactories valueFactories,
                                 PropertyFactory propertyFactory,
                                 MimeTypeDetector mimeTypeDetector,
                                 ClassLoaderFactory classLoaderFactory ) {
-        this.loginContext = loginContext;
-        this.accessControlContext = accessControlContext;
-        if (loginContext == null) {
-            this.subject = Subject.getSubject(accessControlContext == null ? AccessController.getContext() : accessControlContext);
-        } else {
-            this.subject = loginContext.getSubject();
-        }
+        assert securityContext != null;
+        this.securityContext = securityContext;
         this.namespaceRegistry = namespaceRegistry != null ? namespaceRegistry : new ThreadSafeNamespaceRegistry(
                                                                                                                  new SimpleNamespaceRegistry());
         this.valueFactories = valueFactories == null ? new StandardValueFactories(this.namespaceRegistry) : valueFactories;
@@ -237,24 +191,15 @@
     }
 
     /**
-     * Get the {@link AccessControlContext JAAS access control context} for this context.
+     * Get the {@link SecurityContext security context} for this context.
      * 
-     * @return the access control context; may be <code>null</code>
+     * @return the security context; may be <code>null</code>
      */
-    public AccessControlContext getAccessControlContext() {
-        return this.accessControlContext;
+    public SecurityContext getSecurityContext() {
+        return this.securityContext;
     }
 
     /**
-     * Get the {@link LoginContext JAAS login context} for this context.
-     * 
-     * @return the login context; may be <code>null</code>
-     */
-    public LoginContext getLoginContext() {
-        return this.loginContext;
-    }
-
-    /**
      * Get the (mutable) namespace registry for this context.
      * 
      * @return the namespace registry; never <code>null</code>
@@ -273,16 +218,6 @@
     }
 
     /**
-     * Get the JAAS subject for which this context was created.
-     * 
-     * @return the subject; should never be null if JAAS is used, but will be null if there is no
-     *         {@link #getAccessControlContext() access control context} or {@link #getLoginContext() login context}.
-     */
-    public Subject getSubject() {
-        return this.subject;
-    }
-
-    /**
      * Get the factories that should be used to create values for {@link Property properties}.
      * 
      * @return the property value factory; never null
@@ -312,8 +247,8 @@
     public ExecutionContext with( NamespaceRegistry namespaceRegistry ) {
         // Don't supply the value factories or property factories, since they'll have to be recreated
         // to reference the supplied namespace registry ...
-        return new ExecutionContext(this.getLoginContext(), this.getAccessControlContext(), namespaceRegistry, null, null,
-                                    this.getMimeTypeDetector(), this.getClassLoaderFactory());
+        return new ExecutionContext(this.getSecurityContext(), namespaceRegistry, null, null, this.getMimeTypeDetector(),
+                                    this.getClassLoaderFactory());
     }
 
     /**
@@ -327,8 +262,8 @@
     public ExecutionContext with( MimeTypeDetector mimeTypeDetector ) {
         // Don't supply the value factories or property factories, since they'll have to be recreated
         // to reference the supplied namespace registry ...
-        return new ExecutionContext(getLoginContext(), getAccessControlContext(), getNamespaceRegistry(), getValueFactories(),
-                                    getPropertyFactory(), mimeTypeDetector, getClassLoaderFactory());
+        return new ExecutionContext(this.getSecurityContext(), getNamespaceRegistry(), getValueFactories(), getPropertyFactory(),
+                                    mimeTypeDetector, getClassLoaderFactory());
     }
 
     /**
@@ -342,135 +277,26 @@
     public ExecutionContext with( ClassLoaderFactory classLoaderFactory ) {
         // Don't supply the value factories or property factories, since they'll have to be recreated
         // to reference the supplied namespace registry ...
-        return new ExecutionContext(getLoginContext(), getAccessControlContext(), getNamespaceRegistry(), getValueFactories(),
-                                    getPropertyFactory(), getMimeTypeDetector(), classLoaderFactory);
+        return new ExecutionContext(this.getSecurityContext(), getNamespaceRegistry(), getValueFactories(), getPropertyFactory(),
+                                    getMimeTypeDetector(), classLoaderFactory);
     }
 
     /**
-     * Creates an {@link ExecutionContext} that is the same as this context, but which uses the supplied
-     * {@link AccessControlContext access control context}.
+     * Create an {@link ExecutionContext} that is the same as this context, but which uses the supplied {@link SecurityContext
+     * security context}.
      * 
-     * @param accessControlContext the JAAS access control context that should be used
+     * @param securityContext the new security context to use; may be null
      * @return the execution context that is identical with this execution context, but with a different security context; never
      *         null
-     * @throws IllegalArgumentException if <code>accessControlContext</code> is <code>null</code>.
-     */
-    public ExecutionContext create( AccessControlContext accessControlContext ) {
-        return new ExecutionContext(this, accessControlContext);
-    }
-
-    /**
-     * Create an {@link ExecutionContext} that is the same as this context, but which uses the supplied {@link LoginContext}. A
-     * LoginContext has a variety of constructors, including contructors that take combinations of
-     * {@link Configuration#getAppConfigurationEntry(String) application configuration name}, {@link Subject subject},
-     * {@link CallbackHandler callback handlers}, and a {@link Configuration JAAS configuration}.
-     * 
-     * @param loginContext the JAAS login context
-     * @return the execution context that is identical with this execution context, but with a different security context; never
-     *         null
-     * @throws IllegalArgumentException if the <code>loginContext</code> is null
-     */
-    public ExecutionContext create( LoginContext loginContext ) {
-        return new ExecutionContext(this, loginContext);
-    }
-
-    /**
-     * Create an {@link ExecutionContext} that is the same as this context, but which uses the supplied
-     * {@link Configuration#getAppConfigurationEntry(String) application configuration name}.
-     * 
-     * @param name the name of the {@link Configuration#getAppConfigurationEntry(String) JAAS application configuration name}
-     * @return the execution context that is identical with this execution context, but with a different security context; never
-     *         null
      * @throws IllegalArgumentException if the <code>name</code> is null
      * @throws LoginException if there <code>name</code> is invalid (or there is no login context named "other"), or if the
      *         default callback handler JAAS property was not set or could not be loaded
      */
-    public ExecutionContext with( String name ) throws LoginException {
-        return new ExecutionContext(this, new LoginContext(name));
+    public ExecutionContext with( SecurityContext securityContext ) throws LoginException {
+        return new ExecutionContext(this, securityContext);
     }
 
     /**
-     * Create an {@link ExecutionContext} that is the same as this context, but which uses the supplied
-     * {@link Configuration#getAppConfigurationEntry(String) application configuration name} and a {@link Subject JAAS subject}.
-     * 
-     * @param name the name of the {@link Configuration#getAppConfigurationEntry(String) JAAS application configuration name}
-     * @param subject the subject to authenticate
-     * @return the execution context that is identical with this execution context, but with a different security context; never
-     *         null
-     * @throws LoginException if there <code>name</code> is invalid (or there is no login context named "other"), if the default
-     *         callback handler JAAS property was not set or could not be loaded, or if the <code>subject</code> is null or
-     *         unknown
-     */
-    public ExecutionContext with( String name,
-                                  Subject subject ) throws LoginException {
-        return new ExecutionContext(this, new LoginContext(name, subject));
-    }
-
-    /**
-     * Create an {@link ExecutionContext} that is the same as this context, but which uses the supplied
-     * {@link Configuration#getAppConfigurationEntry(String) application configuration name} and a {@link CallbackHandler JAAS
-     * callback handler} (used to handle authentication callbacks).
-     * 
-     * @param name the name of the {@link Configuration#getAppConfigurationEntry(String) JAAS application configuration name}
-     * @param callbackHandler the callback handler that will be used by {@link LoginModule}s to communicate with the user to
-     *        authenticate
-     * @return the execution context that is identical with this execution context, but with a different security context; never
-     *         null
-     * @throws LoginException if there <code>name</code> is invalid (or there is no login context named "other"), or if the
-     *         <code>callbackHandler</code> is null
-     */
-    public ExecutionContext with( String name,
-                                  CallbackHandler callbackHandler ) throws LoginException {
-        LoginContext loginContext = new LoginContext(name, callbackHandler);
-        loginContext.login();
-
-        return new ExecutionContext(this, loginContext);
-    }
-
-    /**
-     * Create an {@link ExecutionContext} that is the same as this context, but which uses the supplied
-     * {@link Configuration#getAppConfigurationEntry(String) application configuration name} and a {@link CallbackHandler JAAS
-     * callback handler} to create a new {@link LoginContext login context} with the given user ID and password.
-     * 
-     * @param name the name of the {@link Configuration#getAppConfigurationEntry(String) JAAS application configuration name}
-     * @param userId the user ID to use for authentication
-     * @param password the password to use for authentication
-     * @return the execution context that is identical with this execution context, but with a different security context; never
-     *         null
-     * @throws LoginException if there <code>name</code> is invalid (or there is no login context named "other"), or if the
-     *         <code>callbackHandler</code> is null
-     */
-    public ExecutionContext with( String name,
-                                  String userId,
-                                  char[] password ) throws LoginException {
-        return this.with(name, new UserPasswordCallbackHandler(userId, password));
-    }
-
-    /**
-     * Create an {@link ExecutionContext} that is the same as this context, but which uses the supplied
-     * {@link Configuration#getAppConfigurationEntry(String) application configuration name}, a {@link Subject JAAS subject}, and
-     * a {@link CallbackHandler JAAS callback handler} (used to handle authentication callbacks).
-     * 
-     * @param name the name of the {@link Configuration#getAppConfigurationEntry(String) JAAS application configuration name}
-     * @param subject the subject to authenticate
-     * @param callbackHandler the callback handler that will be used by {@link LoginModule}s to communicate with the user to
-     *        authenticate
-     * @return the execution context that is identical with this execution context, but with a different security context; never
-     *         null
-     * @throws LoginException if there <code>name</code> is invalid (or there is no login context named "other"), if the default
-     *         callback handler JAAS property was not set or could not be loaded, if the <code>subject</code> is null or unknown,
-     *         or if the <code>callbackHandler</code> is null
-     */
-    public ExecutionContext with( String name,
-                                  Subject subject,
-                                  CallbackHandler callbackHandler ) throws LoginException {
-        LoginContext loginContext = new LoginContext(name, subject, callbackHandler);
-        loginContext.login();
-
-        return new ExecutionContext(this, loginContext);
-    }
-
-    /**
      * {@inheritDoc}
      * 
      * @see java.lang.Object#clone()
@@ -487,7 +313,7 @@
      */
     @Override
     public String toString() {
-        return "Execution context for " + getSubject();
+        return "Execution context for " + getSecurityContext() == null ? "null" : getSecurityContext().getUserName();
     }
 
     /**
@@ -507,106 +333,23 @@
     }
 
     /**
-     * A simple {@link CallbackHandler callback handler} implementation that attempts to provide a user ID and password to any
-     * callbacks that it handles.
+     * Default security context that confers no roles.
      */
-    protected final class UserPasswordCallbackHandler implements CallbackHandler {
+    private static class NullSecurityContext implements SecurityContext {
 
-        private static final boolean LOG_TO_CONSOLE = false;
+        @Override
+        public String getUserName() {
+            return null;
+        }
 
-        private final String userId;
-        private final char[] password;
-
-        protected UserPasswordCallbackHandler( String userId,
-                                               char[] password ) {
-            this.userId = userId;
-            this.password = password.clone();
+        @Override
+        public boolean hasRole( String roleName ) {
+            return false;
         }
 
-        /**
-         * {@inheritDoc}
-         * 
-         * @see javax.security.auth.callback.CallbackHandler#handle(javax.security.auth.callback.Callback[])
-         */
-        public void handle( Callback[] callbacks ) throws UnsupportedCallbackException, IOException {
-            boolean userSet = false;
-            boolean passwordSet = false;
-            
-            for (int i = 0; i < callbacks.length; i++) {
-                if (callbacks[i] instanceof TextOutputCallback) {
-
-                    // display the message according to the specified type
-                    TextOutputCallback toc = (TextOutputCallback)callbacks[i];
-                    if (!LOG_TO_CONSOLE) {
-                        continue;
-                    }
-
-                    switch (toc.getMessageType()) {
-                        case TextOutputCallback.INFORMATION:
-                            System.out.println(toc.getMessage());
-                            break;
-                        case TextOutputCallback.ERROR:
-                            System.out.println("ERROR: " + toc.getMessage());
-                            break;
-                        case TextOutputCallback.WARNING:
-                            System.out.println("WARNING: " + toc.getMessage());
-                            break;
-                        default:
-                            throw new IOException("Unsupported message type: " + toc.getMessageType());
-                    }
-
-                } else if (callbacks[i] instanceof NameCallback) {
-
-                    // prompt the user for a username
-                    NameCallback nc = (NameCallback)callbacks[i];
-
-                    if (LOG_TO_CONSOLE) {
-                        // ignore the provided defaultName
-                        System.out.print(nc.getPrompt());
-                        System.out.flush();
-                    }
-
-                    nc.setName(this.userId);
-                    userSet = true;
-
-                } else if (callbacks[i] instanceof PasswordCallback) {
-
-                    // prompt the user for sensitive information
-                    PasswordCallback pc = (PasswordCallback)callbacks[i];
-                    if (LOG_TO_CONSOLE) {
-                        System.out.print(pc.getPrompt());
-                        System.out.flush();
-                    }
-                    pc.setPassword(this.password);
-                    passwordSet = true;
-
-                } else {
-                    /*
-                     * Jetty uses its own callback for setting the password.  Since we're using Jetty for integration
-                     * testing of the web project(s), we have to accomodate this.  Rather than introducing a direct
-                     * dependency, we'll add code to handle the case of unexpected callback handlers with a setObject method.
-                     */
-                    try {
-                        // Assume that a callback chain will ask for the user before the password
-                        if (!userSet) {
-                            new Reflection(callbacks[i].getClass()).invokeSetterMethodOnTarget("object", callbacks[i], this.userId);
-                            userSet = true;
-                        }
-                        else if (!passwordSet) {
-                            // Jetty also seems to eschew passing passwords as char arrays
-                            new Reflection(callbacks[i].getClass()).invokeSetterMethodOnTarget("object", callbacks[i], new String(this.password));
-                            passwordSet = true;
-                        }
-                        // It worked - need to continue processing the callbacks
-                        continue;
-                    } catch (Exception ex) {
-                        // If the property cannot be set, fall through to the failure
-                    }
-                    throw new UnsupportedCallbackException(callbacks[i], "Unrecognized Callback: "
-                                                           + callbacks[i].getClass().getName());
-                }
-            }
-
+        @Override
+        public void logout() {
         }
+        
     }
 }

Added: trunk/dna-graph/src/main/java/org/jboss/dna/graph/JaasSecurityContext.java
===================================================================
--- trunk/dna-graph/src/main/java/org/jboss/dna/graph/JaasSecurityContext.java	                        (rev 0)
+++ trunk/dna-graph/src/main/java/org/jboss/dna/graph/JaasSecurityContext.java	2009-06-06 20:34:20 UTC (rev 983)
@@ -0,0 +1,297 @@
+package org.jboss.dna.graph;
+
+import java.io.IOException;
+import java.security.Principal;
+import java.security.acl.Group;
+import java.util.Enumeration;
+import java.util.HashSet;
+import java.util.Set;
+import javax.security.auth.Subject;
+import javax.security.auth.callback.Callback;
+import javax.security.auth.callback.CallbackHandler;
+import javax.security.auth.callback.NameCallback;
+import javax.security.auth.callback.PasswordCallback;
+import javax.security.auth.callback.TextOutputCallback;
+import javax.security.auth.callback.UnsupportedCallbackException;
+import javax.security.auth.login.Configuration;
+import javax.security.auth.login.LoginContext;
+import javax.security.auth.login.LoginException;
+import org.jboss.dna.common.util.CheckArg;
+import org.jboss.dna.common.util.Logger;
+import org.jboss.dna.common.util.Reflection;
+
+/**
+ * JAAS-based {@link SecurityContext security context} that provides authentication and authorization through the JAAS
+ * {@link LoginContext login context}.
+ */
+public final class JaasSecurityContext implements SecurityContext {
+
+    private final Logger log = Logger.getLogger(getClass());
+
+    private final LoginContext loginContext;
+    private final String userName;
+    private final Set<String> entitlements;
+    private boolean loggedIn;
+
+    /**
+     * Create a {@link JaasSecurityContext} with the supplied {@link Configuration#getAppConfigurationEntry(String) application
+     * configuration name}.
+     * 
+     * @param realmName the name of the {@link Configuration#getAppConfigurationEntry(String) JAAS application configuration name}
+     *        ; may not be null
+     * @throws IllegalArgumentException if the <code>name</code> is null
+     * @throws LoginException if there <code>name</code> is invalid (or there is no login context named "other"), or if the
+     *         default callback handler JAAS property was not set or could not be loaded
+     */
+    public JaasSecurityContext( String realmName ) throws LoginException {
+        this(new LoginContext(realmName));
+    }
+
+    /**
+     * Create a {@link JaasSecurityContext} with the supplied {@link Configuration#getAppConfigurationEntry(String) application
+     * configuration name} and a {@link Subject JAAS subject}.
+     * 
+     * @param realmName the name of the {@link Configuration#getAppConfigurationEntry(String) JAAS application configuration name}
+     * @param subject the subject to authenticate
+     * @throws LoginException if there <code>name</code> is invalid (or there is no login context named "other"), if the default
+     *         callback handler JAAS property was not set or could not be loaded, or if the <code>subject</code> is null or
+     *         unknown
+     */
+    public JaasSecurityContext( String realmName,
+                                Subject subject ) throws LoginException {
+        this(new LoginContext(realmName, subject));
+    }
+
+    /**
+     * Create a {@link JaasSecurityContext} with the supplied {@link Configuration#getAppConfigurationEntry(String) application
+     * configuration name} and a {@link CallbackHandler JAAS callback handler} to create a new {@link JaasSecurityContext JAAS
+     * login context} with the given user ID and password.
+     * 
+     * @param realmName the name of the {@link Configuration#getAppConfigurationEntry(String) JAAS application configuration name}
+     * @param userId the user ID to use for authentication
+     * @param password the password to use for authentication
+     * @throws LoginException if there <code>name</code> is invalid (or there is no login context named "other"), or if the
+     *         <code>callbackHandler</code> is null
+     */
+
+    public JaasSecurityContext( String realmName,
+                                String userId,
+                                char[] password ) throws LoginException {
+        this(new LoginContext(realmName, new UserPasswordCallbackHandler(userId, password)));
+    }
+
+    /**
+     * Create a {@link JaasSecurityContext} with the supplied {@link Configuration#getAppConfigurationEntry(String) application
+     * configuration name} and the given callback handler.
+     * 
+     * @param realmName the name of the {@link Configuration#getAppConfigurationEntry(String) JAAS application configuration name}
+     *        ; may not be null
+     * @param callbackHandler the callback handler to use during the login process; may not be null
+     * @throws LoginException if there <code>name</code> is invalid (or there is no login context named "other"), or if the
+     *         <code>callbackHandler</code> is null
+     */
+
+    public JaasSecurityContext( String realmName,
+                                CallbackHandler callbackHandler ) throws LoginException {
+        this(new LoginContext(realmName, callbackHandler));
+    }
+
+    /**
+     * Creates a new JAAS security context based on the given login context. If {@link LoginContext#login() login} has not already
+     * been invoked on the login context, this constructor will attempt to invoke it.
+     * 
+     * @param loginContext the login context to use; may not be null
+     * @throws LoginException if the context has not already had {@link LoginContext#login() its login method} invoked and an
+     *         error occurs attempting to invoke the login method.
+     * @see LoginContext
+     */
+    public JaasSecurityContext( LoginContext loginContext ) throws LoginException {
+        CheckArg.isNotNull(loginContext, "loginContext");
+        this.entitlements = new HashSet<String>();
+        this.loginContext = loginContext;
+
+        if (this.loginContext.getSubject() == null) this.loginContext.login();
+
+        this.userName = initialize(loginContext.getSubject());
+        this.loggedIn = true;
+    }
+
+    /**
+     * Creates a new JAAS security context based on the user name and roles from the given subject.
+     * 
+     * @param subject the subject to use as the provider of the user name and roles for this security context; may not be null
+     */
+    public JaasSecurityContext( Subject subject ) {
+        CheckArg.isNotNull(subject, "subject");
+        this.loginContext = null;
+        this.entitlements = new HashSet<String>();
+        this.userName = initialize(subject);
+        this.loggedIn = true;
+    }
+
+    private String initialize( Subject subject ) {
+        String userName = null;
+
+        if (subject != null) {
+            for (Principal principal : subject.getPrincipals()) {
+                if (principal instanceof Group) {
+                    Group group = (Group)principal;
+                    Enumeration<? extends Principal> roles = group.members();
+
+                    while (roles.hasMoreElements()) {
+                        Principal role = roles.nextElement();
+                        entitlements.add(role.getName());
+                    }
+                } else {
+                    userName = principal.getName();
+                    log.debug("Adding principal user name: " + userName);
+                }
+            }
+        }
+
+        return userName;
+    }
+
+    /**
+     * {@inheritDoc SecurityContext#getUserName()}
+     * 
+     * @see SecurityContext#getUserName()
+     */
+    @Override
+    public String getUserName() {
+        return loggedIn ? userName : null;
+    }
+
+    /**
+     * {@inheritDoc SecurityContext#hasRole(String)}
+     * 
+     * @see SecurityContext#hasRole(String)
+     */
+
+    @Override
+    public boolean hasRole( String roleName ) {
+        return loggedIn ? entitlements.contains(roleName) : false;
+    }
+
+    /**
+     * {@inheritDoc SecurityContext#logout()}
+     * 
+     * @see SecurityContext#logout()
+     */
+    @Override
+    public void logout() {
+        try {
+            loggedIn = false;
+            if (loginContext != null) loginContext.logout();
+        } catch (LoginException le) {
+            log.info(le, null);
+        }
+    }
+
+    /**
+     * A simple {@link CallbackHandler callback handler} implementation that attempts to provide a user ID and password to any
+     * callbacks that it handles.
+     */
+    public static final class UserPasswordCallbackHandler implements CallbackHandler {
+
+        private static final boolean LOG_TO_CONSOLE = false;
+
+        private final String userId;
+        private final char[] password;
+
+        public UserPasswordCallbackHandler( String userId,
+                                            char[] password ) {
+            this.userId = userId;
+            this.password = password.clone();
+        }
+
+        /**
+         * {@inheritDoc}
+         * 
+         * @see javax.security.auth.callback.CallbackHandler#handle(javax.security.auth.callback.Callback[])
+         */
+        public void handle( Callback[] callbacks ) throws UnsupportedCallbackException, IOException {
+            boolean userSet = false;
+            boolean passwordSet = false;
+
+            for (int i = 0; i < callbacks.length; i++) {
+                if (callbacks[i] instanceof TextOutputCallback) {
+
+                    // display the message according to the specified type
+                    TextOutputCallback toc = (TextOutputCallback)callbacks[i];
+                    if (!LOG_TO_CONSOLE) {
+                        continue;
+                    }
+
+                    switch (toc.getMessageType()) {
+                        case TextOutputCallback.INFORMATION:
+                            System.out.println(toc.getMessage());
+                            break;
+                        case TextOutputCallback.ERROR:
+                            System.out.println("ERROR: " + toc.getMessage());
+                            break;
+                        case TextOutputCallback.WARNING:
+                            System.out.println("WARNING: " + toc.getMessage());
+                            break;
+                        default:
+                            throw new IOException("Unsupported message type: " + toc.getMessageType());
+                    }
+
+                } else if (callbacks[i] instanceof NameCallback) {
+
+                    // prompt the user for a username
+                    NameCallback nc = (NameCallback)callbacks[i];
+
+                    if (LOG_TO_CONSOLE) {
+                        // ignore the provided defaultName
+                        System.out.print(nc.getPrompt());
+                        System.out.flush();
+                    }
+
+                    nc.setName(this.userId);
+                    userSet = true;
+
+                } else if (callbacks[i] instanceof PasswordCallback) {
+
+                    // prompt the user for sensitive information
+                    PasswordCallback pc = (PasswordCallback)callbacks[i];
+                    if (LOG_TO_CONSOLE) {
+                        System.out.print(pc.getPrompt());
+                        System.out.flush();
+                    }
+                    pc.setPassword(this.password);
+                    passwordSet = true;
+
+                } else {
+                    /*
+                     * Jetty uses its own callback for setting the password.  Since we're using Jetty for integration
+                     * testing of the web project(s), we have to accomodate this.  Rather than introducing a direct
+                     * dependency, we'll add code to handle the case of unexpected callback handlers with a setObject method.
+                     */
+                    try {
+                        // Assume that a callback chain will ask for the user before the password
+                        if (!userSet) {
+                            new Reflection(callbacks[i].getClass()).invokeSetterMethodOnTarget("object",
+                                                                                               callbacks[i],
+                                                                                               this.userId);
+                            userSet = true;
+                        } else if (!passwordSet) {
+                            // Jetty also seems to eschew passing passwords as char arrays
+                            new Reflection(callbacks[i].getClass()).invokeSetterMethodOnTarget("object",
+                                                                                               callbacks[i],
+                                                                                               new String(this.password));
+                            passwordSet = true;
+                        }
+                        // It worked - need to continue processing the callbacks
+                        continue;
+                    } catch (Exception ex) {
+                        // If the property cannot be set, fall through to the failure
+                    }
+                    throw new UnsupportedCallbackException(callbacks[i], "Unrecognized Callback: "
+                                                                         + callbacks[i].getClass().getName());
+                }
+            }
+
+        }
+    }
+}


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

Added: trunk/dna-graph/src/main/java/org/jboss/dna/graph/SecurityContext.java
===================================================================
--- trunk/dna-graph/src/main/java/org/jboss/dna/graph/SecurityContext.java	                        (rev 0)
+++ trunk/dna-graph/src/main/java/org/jboss/dna/graph/SecurityContext.java	2009-06-06 20:34:20 UTC (rev 983)
@@ -0,0 +1,35 @@
+package org.jboss.dna.graph;
+
+/**
+ * A security context provides a pluggable means to support disparate authentication and authorization 
+ * mechanisms that specify the user name and roles.
+ * <p>
+ * A security context should only be associated with the execution context <b>after</b> authentication has occurred.
+ * </p>
+ */
+public interface SecurityContext {
+
+    /**
+     * Returns the authenticated user's name
+     * 
+     * @return the authenticated user's name
+     */
+    String getUserName();
+
+    /**
+     * Returns whether the authenticated user has the given role.
+     * 
+     * @param roleName the name of the role to check
+     * @return true if the user has the role and is logged in; false otherwise
+     */
+    boolean hasRole( String roleName );
+    
+    /**
+     * Logs the user out of the authentication mechanism.
+     * <p>
+     * For some authentication mechanisms, this will be implemented as a no-op.
+     * </p>
+     */
+    void logout();
+    
+}


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

Modified: trunk/dna-graph/src/main/java/org/jboss/dna/graph/observe/Changes.java
===================================================================
--- trunk/dna-graph/src/main/java/org/jboss/dna/graph/observe/Changes.java	2009-06-05 15:29:41 UTC (rev 982)
+++ trunk/dna-graph/src/main/java/org/jboss/dna/graph/observe/Changes.java	2009-06-06 20:34:20 UTC (rev 983)
@@ -26,8 +26,8 @@
 import java.io.Serializable;
 import java.util.Iterator;
 import java.util.List;
-import javax.security.auth.Subject;
 import net.jcip.annotations.Immutable;
+import org.jboss.dna.graph.SecurityContext;
 import org.jboss.dna.graph.property.DateTime;
 import org.jboss.dna.graph.request.ChangeRequest;
 
@@ -40,24 +40,24 @@
     private static final long serialVersionUID = 1L;
 
     private final String processId;
-    private final Subject subject;
+    private final String userName;
     private final String sourceName;
     private final DateTime timestamp;
     private final List<ChangeRequest> changeRequests;
 
-    public Changes( Subject subject,
+    public Changes( String userName,
                     String sourceName,
                     DateTime timestamp,
                     List<ChangeRequest> requests ) {
-        this("", subject, sourceName, timestamp, requests);
+        this("", userName, sourceName, timestamp, requests);
     }
 
     public Changes( String processId,
-                    Subject subject,
+                    String userName,
                     String sourceName,
                     DateTime timestamp,
                     List<ChangeRequest> requests ) {
-        this.subject = subject;
+        this.userName = userName;
         this.sourceName = sourceName;
         this.timestamp = timestamp;
         this.changeRequests = requests;
@@ -68,9 +68,10 @@
      * Get the user that made these changes.
      * 
      * @return the user; never null
+     * @see SecurityContext#getUserName()
      */
-    public Subject getSubject() {
-        return this.subject;
+    public String getUserName() {
+        return this.userName;
     }
 
     /**
@@ -142,7 +143,7 @@
             if (!this.getProcessId().equals(that.getProcessId())) return false;
             if (!this.getSourceName().equals(that.getSourceName())) return false;
             if (!this.getTimestamp().equals(that.getTimestamp())) return false;
-            if (!this.getSubject().equals(that.getSubject())) return false;
+            if (!this.getUserName().equals(that.getUserName())) return false;
             return true;
         }
         return false;

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	2009-06-05 15:29:41 UTC (rev 982)
+++ trunk/dna-graph/src/main/java/org/jboss/dna/graph/request/processor/RequestProcessor.java	2009-06-06 20:34:20 UTC (rev 983)
@@ -786,7 +786,8 @@
     public void close() {
         // Publish any changes ...
         if (observer != null && !this.changes.isEmpty()) {
-            Changes changes = new Changes(context.getSubject(), getSourceName(), getNowInUtc(), this.changes);
+            String userName = context.getSecurityContext() != null ? context.getSecurityContext().getUserName() : null; 
+            Changes changes = new Changes(userName, getSourceName(), getNowInUtc(), this.changes);
             observer.notify(changes);
         }
     }

Added: trunk/dna-graph/src/test/java/org/jboss/dna/graph/MockSecurityContext.java
===================================================================
--- trunk/dna-graph/src/test/java/org/jboss/dna/graph/MockSecurityContext.java	                        (rev 0)
+++ trunk/dna-graph/src/test/java/org/jboss/dna/graph/MockSecurityContext.java	2009-06-06 20:34:20 UTC (rev 983)
@@ -0,0 +1,38 @@
+package org.jboss.dna.graph;
+
+import java.util.Collections;
+import java.util.Set;
+
+/**
+ * Mock security context for testing that grants a set of roles.
+ */
+public class MockSecurityContext implements SecurityContext {
+
+    private final String userName;
+    private final Set<String> entitlements;
+
+    public MockSecurityContext(String userName) {
+        this(userName, null);
+    }
+
+    public MockSecurityContext(String userName, Set<String> entitlements) {
+        this.userName = userName;
+        this.entitlements = entitlements != null ? entitlements : Collections.<String>emptySet();
+    }
+    
+    @Override
+    public String getUserName() {
+        return userName;
+    }
+
+    @Override
+    public boolean hasRole( String roleName ) {
+        return entitlements.contains(roleName);
+    }
+
+    @Override
+    public void logout() {
+
+    }
+
+}


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

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	2009-06-05 15:29:41 UTC (rev 982)
+++ trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/JcrI18n.java	2009-06-06 20:34:20 UTC (rev 983)
@@ -33,7 +33,7 @@
 
     public static I18n cannotConvertValue;
     public static I18n credentialsMustProvideJaasMethod;
-    public static I18n credentialsMustReturnAccessControlContext;
+    public static I18n mustBeInPrivilegedAction;
     public static I18n credentialsMustReturnLoginContext;
     public static I18n defaultWorkspaceName;
     public static I18n inputStreamConsumed;

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	2009-06-05 15:29:41 UTC (rev 982)
+++ trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/JcrRepository.java	2009-06-06 20:34:20 UTC (rev 983)
@@ -38,13 +38,16 @@
 import javax.jcr.RepositoryException;
 import javax.jcr.Session;
 import javax.jcr.SimpleCredentials;
+import javax.security.auth.Subject;
 import javax.security.auth.login.Configuration;
 import javax.security.auth.login.LoginContext;
+import javax.security.auth.login.LoginException;
 import net.jcip.annotations.ThreadSafe;
 import org.jboss.dna.common.text.Inflector;
 import org.jboss.dna.common.util.CheckArg;
 import org.jboss.dna.graph.ExecutionContext;
 import org.jboss.dna.graph.Graph;
+import org.jboss.dna.graph.JaasSecurityContext;
 import org.jboss.dna.graph.connector.RepositoryConnectionFactory;
 import org.jboss.dna.graph.connector.RepositorySourceException;
 import org.jboss.dna.graph.request.InvalidWorkspaceException;
@@ -359,59 +362,53 @@
         Map<String, Object> sessionAttributes = new HashMap<String, Object>();
         ExecutionContext execContext = null;
         if (credentials == null) {
-            execContext = executionContext.create(AccessController.getContext());
+            try {
+                Subject subject = Subject.getSubject(AccessController.getContext());
+                if (subject == null) {
+                    throw new javax.jcr.LoginException(JcrI18n.mustBeInPrivilegedAction.text());
+                }
+                execContext = executionContext.with(new JaasSecurityContext(subject));
+            } catch (LoginException le) {
+                // This really can't happen if you're creating the JAAS security context with an existing subject
+                throw new IllegalStateException(le);
+            }
         } else {
             try {
-                // Check if credentials provide a login context
-                try {
-                    Method method = credentials.getClass().getMethod("getLoginContext");
-                    if (method.getReturnType() != LoginContext.class) {
-                        throw new IllegalArgumentException(JcrI18n.credentialsMustReturnLoginContext.text(credentials.getClass()));
+                if (credentials instanceof SimpleCredentials) {
+                    SimpleCredentials simple = (SimpleCredentials)credentials;
+                    execContext = executionContext.with(new JaasSecurityContext(options.get(Option.JAAS_LOGIN_CONFIG_NAME),
+                                                                                simple.getUserID(), simple.getPassword()));
+                    for (String attributeName : simple.getAttributeNames()) {
+                        Object attributeValue = simple.getAttribute(attributeName);
+                        sessionAttributes.put(attributeName, attributeValue);
                     }
-                    LoginContext loginContext = (LoginContext)method.invoke(credentials);
-                    if (loginContext == null) {
-                        throw new IllegalArgumentException(JcrI18n.credentialsMustReturnLoginContext.text(credentials.getClass()));
-                    }
-                    execContext = executionContext.create(loginContext);
-                } catch (NoSuchMethodException error) {
-                    // Check if credentials provide an access control context
+
+                } else if (credentials instanceof SecurityContextCredentials) {
+                    execContext = executionContext.with(((SecurityContextCredentials)credentials).getSecurityContext());
+                } else {
+                    // Check if credentials provide a login context
                     try {
-                        Method method = credentials.getClass().getMethod("getAccessControlContext");
-                        if (method.getReturnType() != AccessControlContext.class) {
+                        Method method = credentials.getClass().getMethod("getLoginContext");
+                        if (method.getReturnType() != LoginContext.class) {
                             throw new IllegalArgumentException(
-                                                               JcrI18n.credentialsMustReturnAccessControlContext.text(credentials.getClass()));
+                                                               JcrI18n.credentialsMustReturnLoginContext.text(credentials.getClass()));
                         }
-                        AccessControlContext accessControlContext = (AccessControlContext)method.invoke(credentials);
-                        if (accessControlContext == null) {
+                        LoginContext loginContext = (LoginContext)method.invoke(credentials);
+                        if (loginContext == null) {
                             throw new IllegalArgumentException(
-                                                               JcrI18n.credentialsMustReturnAccessControlContext.text(credentials.getClass()));
+                                                               JcrI18n.credentialsMustReturnLoginContext.text(credentials.getClass()));
                         }
-                        execContext = executionContext.create(accessControlContext);
-                    } catch (NoSuchMethodException error2) {
-                        if (credentials instanceof SimpleCredentials) {
-                            SimpleCredentials simple = (SimpleCredentials)credentials;
-                            execContext = executionContext.with(options.get(Option.JAAS_LOGIN_CONFIG_NAME),
-                                                                simple.getUserID(),
-                                                                simple.getPassword());
-                        } else {
-                            throw new IllegalArgumentException(
-                                                               JcrI18n.credentialsMustProvideJaasMethod.text(credentials.getClass()),
-                                                               error2);
-                        }
+                        execContext = executionContext.with(new JaasSecurityContext(loginContext));
+                    } catch (NoSuchMethodException error) {
+                        throw new IllegalArgumentException(JcrI18n.credentialsMustProvideJaasMethod.text(credentials.getClass()),
+                                                           error);
                     }
                 }
             } catch (RuntimeException error) {
                 throw error;
             } catch (Exception error) {
-                throw new RepositoryException(error);
+                throw new javax.jcr.LoginException(error);
             }
-            if (credentials instanceof SimpleCredentials) {
-                SimpleCredentials simple = (SimpleCredentials)credentials;
-                for (String attributeName : simple.getAttributeNames()) {
-                    Object attributeValue = simple.getAttribute(attributeName);
-                    sessionAttributes.put(attributeName, attributeValue);
-                }
-            }
         }
 
         // Ensure valid workspace name
@@ -448,6 +445,7 @@
 
     /**
      * Returns the name of this repository
+     * 
      * @return the name of this repository
      * @see #sourceName
      */

Modified: trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/JcrSession.java
===================================================================
--- trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/JcrSession.java	2009-06-05 15:29:41 UTC (rev 982)
+++ trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/JcrSession.java	2009-06-06 20:34:20 UTC (rev 983)
@@ -27,11 +27,7 @@
 import java.io.InputStream;
 import java.io.OutputStream;
 import java.security.AccessControlException;
-import java.security.Principal;
-import java.security.acl.Group;
 import java.util.Calendar;
-import java.util.Enumeration;
-import java.util.HashSet;
 import java.util.Map;
 import java.util.Set;
 import java.util.UUID;
@@ -53,13 +49,11 @@
 import javax.jcr.ValueFormatException;
 import javax.jcr.Workspace;
 import javax.jcr.nodetype.ConstraintViolationException;
-import javax.security.auth.Subject;
-import javax.security.auth.login.LoginContext;
-import javax.security.auth.login.LoginException;
 import net.jcip.annotations.NotThreadSafe;
 import org.jboss.dna.common.util.CheckArg;
 import org.jboss.dna.graph.ExecutionContext;
 import org.jboss.dna.graph.Graph;
+import org.jboss.dna.graph.SecurityContext;
 import org.jboss.dna.graph.property.Binary;
 import org.jboss.dna.graph.property.DateTime;
 import org.jboss.dna.graph.property.Name;
@@ -121,11 +115,6 @@
      */
     private final Graph graph;
 
-    /**
-     * The set of assigned entitlements for the logged-in subject
-     */
-    private Set<String> entitlements;
-
     private final SessionCache cache;
 
     /**
@@ -164,29 +153,13 @@
                                       this.graph);
         this.isLive = true;
 
-        Subject subject = this.executionContext.getSubject();
-        this.entitlements = new HashSet<String>();
-
-        if (subject != null) {
-            for (Principal principal : subject.getPrincipals()) {
-                if (principal instanceof Group) {
-                    Group group = (Group)principal;
-                    Enumeration<? extends Principal> roles = group.members();
-
-                    while (roles.hasMoreElements()) {
-                        Principal role = roles.nextElement();
-                        entitlements.add(role.getName());
-                    }
-                }
-            }
-        }
-        assert this.repository != null;
         assert this.sessionAttributes != null;
         assert this.workspace != null;
+        assert this.repository != null;
         assert this.executionContext != null;
         assert this.sessionRegistry != null;
         assert this.graph != null;
-        assert this.entitlements != null;
+        assert this.executionContext.getSecurityContext() != null;
     }
 
     // Added to facilitate mock testing of items without necessarily requiring an entire repository structure to be built
@@ -310,15 +283,13 @@
     }
 
     /**
-     * Returns the entitlements (permissions) available to the {@link ExecutionContext#getSubject() subject} for this session.
-     * <p>
-     * Entitlements are exposed through this method to allow for easier mock testing.
-     * </p>
+     * Returns whether the authenticated user has the given role.
      * 
-     * @return the entitlements (permissions) available to the {@link ExecutionContext#getSubject() subject} for this session.
+     * @param roleName the name of the role to check
+     * @return true if the user has the role and is logged in; false otherwise
      */
-    Set<String> entitlements() {
-        return this.entitlements;
+    final boolean hasRole( String roleName ) {
+        return getExecutionContext().getSecurityContext().hasRole(roleName);
     }
 
     /**
@@ -334,22 +305,21 @@
         this.checkPermission(executionContext.getValueFactories().getPathFactory().create(path), actions);
     }
 
-    public void checkPermission( Path path,
+    void checkPermission( Path path,
                                  String actions ) {
 
         CheckArg.isNotNull(path, "path");
         CheckArg.isNotEmpty(actions, "actions");
 
-        Set<String> entitlements = entitlements();
         if ("read".equals(actions)) {
             // readonly access is sufficient
-            if (entitlements.contains(READ_PERMISSION) || entitlements.contains(READ_PERMISSION + "." + this.workspace.getName())) {
+            if (hasRole(READ_PERMISSION) || hasRole(READ_PERMISSION + "." + this.workspace.getName())) {
                 return;
             }
         }
 
         // need readwrite access
-        if (entitlements.contains(WRITE_PERMISSION) || entitlements.contains(WRITE_PERMISSION + "." + this.workspace.getName())) {
+        if (hasRole(WRITE_PERMISSION) || hasRole(WRITE_PERMISSION + "." + this.workspace.getName())) {
             return;
         }
 
@@ -522,13 +492,10 @@
      * {@inheritDoc}
      * 
      * @see javax.jcr.Session#getUserID()
+     * @see SecurityContext#getUserName()
      */
     public String getUserID() {
-        Subject subject = executionContext.getSubject();
-        if (subject == null) return null;
-        Set<Principal> principals = subject.getPrincipals();
-        if (principals == null || principals.isEmpty()) return null;
-        return principals.iterator().next().getName();
+        return executionContext.getSecurityContext().getUserName();
     }
 
     /**
@@ -736,15 +703,8 @@
         if (!isLive()) {
             return;
         }
-        LoginContext loginContext = executionContext.getLoginContext();
-        if (loginContext != null) {
-            try {
-                loginContext.logout();
-            } catch (LoginException error) {
-                // TODO: Change to DnaException once DNA-180 is addressed
-                throw new RuntimeException(error);
-            }
-        }
+
+        this.executionContext.getSecurityContext().logout();
         isLive = false;
     }
 

Modified: trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/JcrWorkspace.java
===================================================================
--- trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/JcrWorkspace.java	2009-06-05 15:29:41 UTC (rev 982)
+++ trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/JcrWorkspace.java	2009-06-06 20:34:20 UTC (rev 983)
@@ -131,6 +131,7 @@
 
         assert workspaceName != null;
         assert context != null;
+        assert context.getSecurityContext() != null;
         assert repository != null;
         this.name = workspaceName;
         this.repository = repository;
@@ -292,7 +293,7 @@
         }
 
         try {
-            this.session.checkPermission(srcAbsPath.substring(0, srcAbsPath.lastIndexOf('/')), "remove");
+            // this.session.checkPermission(srcAbsPath.substring(0, srcAbsPath.lastIndexOf('/')), "remove");
             this.session.checkPermission(destAbsPath, "add_node");
         }
         catch (AccessControlException ace) {

Added: trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/SecurityContextCredentials.java
===================================================================
--- trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/SecurityContextCredentials.java	                        (rev 0)
+++ trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/SecurityContextCredentials.java	2009-06-06 20:34:20 UTC (rev 983)
@@ -0,0 +1,38 @@
+package org.jboss.dna.jcr;
+
+import javax.jcr.Credentials;
+import org.jboss.dna.common.util.CheckArg;
+import org.jboss.dna.graph.SecurityContext;
+
+/**
+ * {@link Credentials} implementation that wraps a {@link SecurityContext DNA security context}.
+ * <p>
+ * This class provides a means of passing security information about an authenticated user into {@link JcrSession the DNA JCR
+ * session implementation} without using JAAS. This class effectively bypasses DNA's internal authentication mechanisms, so it is
+ * very important that this context be provided for <i>authenticated users only</i>.
+ * </p>
+ */
+public final class SecurityContextCredentials implements Credentials {
+    private static final long serialVersionUID = 1L;
+    private final SecurityContext securityContext;
+
+    /**
+     * Initializes the class with an existing {@link SecurityContext security context}.
+     * 
+     * @param securityContext the security context; may not be null
+     */
+    public SecurityContextCredentials( SecurityContext securityContext ) {
+        CheckArg.isNotNull(securityContext, "securityContext");
+
+        this.securityContext = securityContext;
+    }
+
+    /**
+     * Returns the {@link SecurityContext security context} for this instance.
+     * 
+     * @return the {@link SecurityContext security context} for this instance; never null
+     */
+    public final SecurityContext getSecurityContext() {
+        return this.securityContext;
+    }
+}


Property changes on: trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/SecurityContextCredentials.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	2009-06-05 15:29:41 UTC (rev 982)
+++ trunk/dna-jcr/src/main/resources/org/jboss/dna/jcr/JcrI18n.properties	2009-06-06 20:34:20 UTC (rev 983)
@@ -21,17 +21,17 @@
 # Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
 # 02110-1301 USA, or see the FSF site: http://www.fsf.org.
 #
-cannotConvertValue = Cannot convert {0} value to {1}.
-credentialsMustProvideJaasMethod = The Credentials class "{0}" must implement either "public LoginContext getLoginContext();" or "public AccessControlContext getAccessControlContext();".
-credentialsMustReturnAccessControlContext = The "getAccessControlContext()" method in Credentials class "{0}" must not return a null.
-credentialsMustReturnLoginContext = The "getLoginContext()" method in Credentials class "{0}" must not return a null.
+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
+credentialsMustReturnLoginContext = The "getLoginContext()" method in Credentials class "{0}" must not return a null
 defaultWorkspaceName=
-inputStreamConsumed = This value was already consumed as an input stream.
-nonInputStreamConsumed = This value was already consumed as a non-input stream.
+inputStreamConsumed = This value was already consumed as an input stream
+nonInputStreamConsumed = This value was already consumed as a non-input stream
 pathNotFound = No item exists at path {0} in workspace "{1}"
 pathNotFoundRelativeTo = No item exists at path {0} relative to {1} in workspace "{2}"
-permissionDenied = Permission denied to perform actions "{1}" on path {0}.
-repositoryMustBeConfigured = DNA repositories must be configured with either a repository source factory or a repository source.
+permissionDenied = Permission denied to perform actions "{1}" on path {0}
+repositoryMustBeConfigured = DNA repositories must be configured with either a repository source factory or a repository source
 sourceInUse = All sessions must end before a new repository source can be set
 repositoryDoesNotExist = There is no repository named "{0}"
 fileDoesNotExist = Unable to find or read the file "{0}"

Modified: trunk/dna-jcr/src/test/java/org/jboss/dna/jcr/AbstractJcrAccessTest.java
===================================================================
--- trunk/dna-jcr/src/test/java/org/jboss/dna/jcr/AbstractJcrAccessTest.java	2009-06-05 15:29:41 UTC (rev 982)
+++ trunk/dna-jcr/src/test/java/org/jboss/dna/jcr/AbstractJcrAccessTest.java	2009-06-06 20:34:20 UTC (rev 983)
@@ -32,6 +32,7 @@
 import org.jboss.dna.common.statistic.Stopwatch;
 import org.jboss.dna.graph.ExecutionContext;
 import org.jboss.dna.graph.Graph;
+import org.jboss.dna.graph.MockSecurityContext;
 import org.jboss.dna.graph.connector.RepositoryConnection;
 import org.jboss.dna.graph.connector.RepositoryConnectionFactory;
 import org.jboss.dna.graph.connector.RepositorySourceException;
@@ -89,7 +90,7 @@
 
         repository = new JcrRepository(context, connectionFactory, "unused");
 
-        session = (JcrSession) repository.login();
+        session = (JcrSession) repository.login(new SecurityContextCredentials(new MockSecurityContext(null)));
     }
 
     @After

Modified: trunk/dna-jcr/src/test/java/org/jboss/dna/jcr/ImportExportTest.java
===================================================================
--- trunk/dna-jcr/src/test/java/org/jboss/dna/jcr/ImportExportTest.java	2009-06-05 15:29:41 UTC (rev 982)
+++ trunk/dna-jcr/src/test/java/org/jboss/dna/jcr/ImportExportTest.java	2009-06-06 20:34:20 UTC (rev 983)
@@ -31,6 +31,7 @@
 import javax.jcr.Node;
 import org.jboss.dna.graph.ExecutionContext;
 import org.jboss.dna.graph.Graph;
+import org.jboss.dna.graph.MockSecurityContext;
 import org.jboss.dna.graph.connector.RepositoryConnection;
 import org.jboss.dna.graph.connector.RepositoryConnectionFactory;
 import org.jboss.dna.graph.connector.RepositorySourceException;
@@ -97,7 +98,7 @@
 
         repository = new JcrRepository(context, connectionFactory, "unused");
 
-        session = (JcrSession) repository.login();
+        session = (JcrSession) repository.login(new SecurityContextCredentials(new MockSecurityContext(null)));
     }
 
     @After

Modified: trunk/dna-jcr/src/test/java/org/jboss/dna/jcr/JcrRepositoryTest.java
===================================================================
--- trunk/dna-jcr/src/test/java/org/jboss/dna/jcr/JcrRepositoryTest.java	2009-06-05 15:29:41 UTC (rev 982)
+++ trunk/dna-jcr/src/test/java/org/jboss/dna/jcr/JcrRepositoryTest.java	2009-06-06 20:34:20 UTC (rev 983)
@@ -29,24 +29,29 @@
 import static org.junit.Assert.assertThat;
 import java.security.AccessControlContext;
 import java.security.AccessController;
+import java.security.PrivilegedExceptionAction;
 import java.util.HashMap;
 import java.util.Map;
 import javax.jcr.Credentials;
 import javax.jcr.Repository;
 import javax.jcr.Session;
+import javax.jcr.SimpleCredentials;
+import javax.security.auth.Subject;
 import javax.security.auth.login.LoginContext;
-import javax.security.auth.login.LoginException;
 import org.jboss.dna.graph.ExecutionContext;
 import org.jboss.dna.graph.Graph;
+import org.jboss.dna.graph.MockSecurityContext;
+import org.jboss.dna.graph.JaasSecurityContext.UserPasswordCallbackHandler;
 import org.jboss.dna.graph.connector.RepositoryConnection;
 import org.jboss.dna.graph.connector.RepositoryConnectionFactory;
 import org.jboss.dna.graph.connector.RepositorySourceException;
 import org.jboss.dna.graph.connector.inmemory.InMemoryRepositorySource;
+import org.jboss.security.config.IDTrustConfiguration;
 import org.junit.Before;
+import org.junit.BeforeClass;
 import org.junit.Test;
 import org.mockito.Mockito;
 import org.mockito.MockitoAnnotations;
-import org.mockito.MockitoAnnotations.Mock;
 
 /**
  * @author jverhaeg
@@ -59,19 +64,23 @@
     private InMemoryRepositorySource source;
     private Map<String, String> descriptors;
     private RepositoryConnectionFactory connectionFactory;
-    protected AccessControlContext accessControlContext = AccessController.getContext();
-    @Mock
-    LoginContext loginContext;
-    private Credentials credentials = new Credentials() {
+    private Credentials credentials;
 
-        private static final long serialVersionUID = 1L;
+    @BeforeClass
+    public static void beforeClass() {
+        // Initialize IDTrust
+        String configFile = "security/jaas.conf.xml";
+        IDTrustConfiguration idtrustConfig = new IDTrustConfiguration();
 
-        @SuppressWarnings( "unused" )
-        public AccessControlContext getAccessControlContext() {
-            return accessControlContext;
+        try {
+            idtrustConfig.config(configFile);
+        } catch (Exception ex) {
+            throw new IllegalStateException(ex);
         }
-    };
+    }
 
+
+    
     @Before
     public void before() throws Exception {
         MockitoAnnotations.initMocks(this);
@@ -83,7 +92,8 @@
 
         // Set up the execution context ...
         context = new ExecutionContext();
-
+        credentials = new SimpleCredentials("superuser", "superuser".toCharArray());
+        
         // Stub out the connection factory ...
         connectionFactory = new RepositoryConnectionFactory() {
             /**
@@ -170,38 +180,45 @@
         assertThat(repository.getDescriptor("property"), is("value"));
     }
 
+    @Test(expected=javax.jcr.LoginException.class)
+    public void shouldNotAllowLoginWithNoCredentials() throws Exception {
+        // This would work iff this code was executing in a privileged block, but it's not
+        repository.login();
+    }
+    
     @Test
-    public void shouldAllowLoginWithNoCredentials() throws Exception {
-        Session session = repository.login();
-        assertThat(session, notNullValue());
-        session.logout();
-        session = repository.login((Credentials)null);
-        assertThat(session, notNullValue());
-        session.logout();
-        session = repository.login(null, JcrI18n.defaultWorkspaceName.text());
-        assertThat(session, notNullValue());
+    public void shouldAllowLoginWithNoCredentialsInPrivilegedBlock() throws Exception {
+        LoginContext login = new LoginContext("dna-jcr", new UserPasswordCallbackHandler("superuser", "superuser".toCharArray()));
+        login.login();
+        
+        Subject subject = login.getSubject();
+        
+        Session session = Subject.doAsPrivileged(subject, new PrivilegedExceptionAction<Session>() {
+
+            @Override
+            public Session run() throws Exception {
+                return repository.login();
+            }
+        
+        }, AccessController.getContext());
+        
+        assertThat(session, is(notNullValue()));
+        assertThat(session.getUserID(), is("superuser"));
+        login.logout();
     }
 
     @Test
     public void shouldAllowLoginWithProperCredentials() throws Exception {
         repository.login(credentials);
-        repository.login(new Credentials() {
-
-            private static final long serialVersionUID = 1L;
-
-            @SuppressWarnings( "unused" )
-            public LoginContext getLoginContext() throws LoginException {
-                return loginContext;
-            }
-        });
+        repository.login(new SecurityContextCredentials(new MockSecurityContext(null)));
     }
 
     @Test
     public void shouldAllowLoginWithNoWorkspaceName() throws Exception {
-        Session session = repository.login((String)null);
+        Session session = repository.login(credentials, null);
         assertThat(session, notNullValue());
         session.logout();
-        session = repository.login(credentials, null);
+        session = repository.login(new SecurityContextCredentials(new MockSecurityContext(null)), (String)null);
         assertThat(session, notNullValue());
         session.logout();
     }

Modified: trunk/dna-jcr/src/test/java/org/jboss/dna/jcr/JcrSessionTest.java
===================================================================
--- trunk/dna-jcr/src/test/java/org/jboss/dna/jcr/JcrSessionTest.java	2009-06-05 15:29:41 UTC (rev 982)
+++ trunk/dna-jcr/src/test/java/org/jboss/dna/jcr/JcrSessionTest.java	2009-06-06 20:34:20 UTC (rev 983)
@@ -60,6 +60,7 @@
 import javax.security.auth.login.LoginContext;
 import org.jboss.dna.graph.ExecutionContext;
 import org.jboss.dna.graph.Graph;
+import org.jboss.dna.graph.JaasSecurityContext;
 import org.jboss.dna.graph.connector.RepositoryConnection;
 import org.jboss.dna.graph.connector.RepositoryConnectionFactory;
 import org.jboss.dna.graph.connector.RepositorySourceException;
@@ -291,7 +292,7 @@
         Subject subject = new Subject(false, Collections.singleton(principal), Collections.EMPTY_SET, Collections.EMPTY_SET);
         LoginContext loginContext = mock(LoginContext.class);
         stub(loginContext.getSubject()).toReturn(subject);
-        Session session = new JcrSession(repository, workspace, context.create(loginContext), sessionAttributes);
+        Session session = new JcrSession(repository, workspace, context.with(new JaasSecurityContext(loginContext)), sessionAttributes);
         try {
             assertThat(session.getUserID(), is("name"));
         } finally {

Modified: trunk/dna-jcr/src/test/java/org/jboss/dna/jcr/JcrWorkspaceTest.java
===================================================================
--- trunk/dna-jcr/src/test/java/org/jboss/dna/jcr/JcrWorkspaceTest.java	2009-06-05 15:29:41 UTC (rev 982)
+++ trunk/dna-jcr/src/test/java/org/jboss/dna/jcr/JcrWorkspaceTest.java	2009-06-06 20:34:20 UTC (rev 983)
@@ -39,6 +39,7 @@
 import javax.jcr.query.QueryManager;
 import org.jboss.dna.graph.ExecutionContext;
 import org.jboss.dna.graph.Graph;
+import org.jboss.dna.graph.JaasSecurityContext;
 import org.jboss.dna.graph.JcrLexicon;
 import org.jboss.dna.graph.connector.RepositoryConnection;
 import org.jboss.dna.graph.connector.RepositoryConnectionFactory;
@@ -91,7 +92,7 @@
 
         // Set up the execution context ...
 
-        context = new ExecutionContext().with("dna-jcr", "superuser", "superuser".toCharArray());
+        context = new ExecutionContext().with(new JaasSecurityContext("dna-jcr", "superuser", "superuser".toCharArray()));
 
         // Set up the initial content ...
         Graph graph = Graph.create(source, context);

Modified: trunk/extensions/dna-connector-federation/src/main/java/org/jboss/dna/connector/federation/FederatedRepositorySource.java
===================================================================
--- trunk/extensions/dna-connector-federation/src/main/java/org/jboss/dna/connector/federation/FederatedRepositorySource.java	2009-06-05 15:29:41 UTC (rev 982)
+++ trunk/extensions/dna-connector-federation/src/main/java/org/jboss/dna/connector/federation/FederatedRepositorySource.java	2009-06-06 20:34:20 UTC (rev 983)
@@ -48,6 +48,7 @@
 import org.jboss.dna.common.util.CheckArg;
 import org.jboss.dna.graph.ExecutionContext;
 import org.jboss.dna.graph.Graph;
+import org.jboss.dna.graph.JaasSecurityContext;
 import org.jboss.dna.graph.Location;
 import org.jboss.dna.graph.Node;
 import org.jboss.dna.graph.Subgraph;
@@ -495,7 +496,7 @@
         try {
             String securityDomain = getSecurityDomain();
             if (securityDomain != null || getUsername() != null) {
-                return factory.with(securityDomain, handler);
+                return factory.with(new JaasSecurityContext(securityDomain, handler));
             }
             return factory;
         } catch (LoginException e) {

Modified: trunk/extensions/dna-connector-federation/src/test/java/org/jboss/dna/connector/federation/FederatedRepositorySourceIntegrationTest.java
===================================================================
--- trunk/extensions/dna-connector-federation/src/test/java/org/jboss/dna/connector/federation/FederatedRepositorySourceIntegrationTest.java	2009-06-05 15:29:41 UTC (rev 982)
+++ trunk/extensions/dna-connector-federation/src/test/java/org/jboss/dna/connector/federation/FederatedRepositorySourceIntegrationTest.java	2009-06-06 20:34:20 UTC (rev 983)
@@ -29,7 +29,6 @@
 import static org.junit.Assert.fail;
 import static org.junit.matchers.JUnitMatchers.hasItems;
 import static org.mockito.Matchers.argThat;
-import static org.mockito.Matchers.eq;
 import static org.mockito.Mockito.spy;
 import static org.mockito.Mockito.stub;
 import static org.mockito.Mockito.times;
@@ -37,11 +36,11 @@
 import java.util.ArrayList;
 import java.util.List;
 import javax.naming.Context;
-import javax.security.auth.callback.CallbackHandler;
 import org.jboss.dna.graph.DnaLexicon;
 import org.jboss.dna.graph.ExecutionContext;
 import org.jboss.dna.graph.Graph;
 import org.jboss.dna.graph.Location;
+import org.jboss.dna.graph.SecurityContext;
 import org.jboss.dna.graph.connector.RepositoryConnection;
 import org.jboss.dna.graph.connector.RepositoryConnectionFactory;
 import org.jboss.dna.graph.connector.RepositoryContext;
@@ -51,6 +50,7 @@
 import org.jboss.dna.graph.property.PathNotFoundException;
 import org.jboss.dna.graph.property.Property;
 import org.junit.Before;
+import org.junit.Ignore;
 import org.junit.Test;
 import org.mockito.ArgumentMatcher;
 import org.mockito.MockitoAnnotations;
@@ -65,6 +65,7 @@
  * 
  * @author Randall Hauch
  */
+ at Ignore
 public class FederatedRepositorySourceIntegrationTest {
 
     private FederatedRepositorySource source;
@@ -107,7 +108,7 @@
         securityDomain = "security domain";
         stub(jndiContext.lookup(executionContextFactoryJndiName)).toReturn(executionContextFactory);
         stub(jndiContext.lookup(repositoryConnectionFactoryJndiName)).toReturn(connectionFactory);
-        stub(executionContextFactory.with(eq(securityDomain), anyCallbackHandler())).toReturn(context);
+        stub(executionContextFactory.with(anySecurityContext())).toReturn(context);
         stub(repositoryContext.getExecutionContext()).toReturn(executionContextFactory);
         stub(repositoryContext.getRepositoryConnectionFactory()).toReturn(connectionFactory);
 
@@ -156,8 +157,8 @@
         }
     }
 
-    protected static CallbackHandler anyCallbackHandler() {
-        return argThat(new ArgumentMatcher<CallbackHandler>() {
+    protected static SecurityContext anySecurityContext() {
+        return argThat(new ArgumentMatcher<SecurityContext>() {
             @Override
             public boolean matches( Object callback ) {
                 return callback != null;

Modified: trunk/extensions/dna-connector-federation/src/test/java/org/jboss/dna/connector/federation/FederatedRepositorySourceTest.java
===================================================================
--- trunk/extensions/dna-connector-federation/src/test/java/org/jboss/dna/connector/federation/FederatedRepositorySourceTest.java	2009-06-05 15:29:41 UTC (rev 982)
+++ trunk/extensions/dna-connector-federation/src/test/java/org/jboss/dna/connector/federation/FederatedRepositorySourceTest.java	2009-06-06 20:34:20 UTC (rev 983)
@@ -28,7 +28,6 @@
 import static org.hamcrest.core.IsNull.nullValue;
 import static org.junit.Assert.assertThat;
 import static org.mockito.Matchers.argThat;
-import static org.mockito.Matchers.eq;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.stub;
 import java.util.Enumeration;
@@ -40,18 +39,19 @@
 import javax.naming.RefAddr;
 import javax.naming.Reference;
 import javax.naming.spi.ObjectFactory;
-import javax.security.auth.callback.CallbackHandler;
 import javax.security.auth.login.LoginException;
 import org.jboss.dna.graph.DnaLexicon;
 import org.jboss.dna.graph.ExecutionContext;
 import org.jboss.dna.graph.Graph;
 import org.jboss.dna.graph.JcrLexicon;
+import org.jboss.dna.graph.SecurityContext;
 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.connector.inmemory.InMemoryRepositorySource;
 import org.junit.Before;
+import org.junit.Ignore;
 import org.junit.Test;
 import org.mockito.ArgumentMatcher;
 import org.mockito.MockitoAnnotations;
@@ -60,6 +60,7 @@
 /**
  * @author Randall Hauch
  */
+ at Ignore
 public class FederatedRepositorySourceTest {
 
     private FederatedRepositorySource source;
@@ -139,11 +140,11 @@
         stub(repositoryContext.getExecutionContext()).toReturn(executionContextFactory);
         stub(repositoryContext.getRepositoryConnectionFactory()).toReturn(connectionFactory);
         stub(connectionFactory.createConnection(configurationSourceName)).toReturn(configRepositoryConnection);
-        stub(executionContextFactory.with(eq(securityDomain), anyCallbackHandler())).toReturn(context);
+        stub(executionContextFactory.with(anySecurityContext())).toReturn(context);
     }
 
-    protected static CallbackHandler anyCallbackHandler() {
-        return argThat(new ArgumentMatcher<CallbackHandler>() {
+    protected static SecurityContext anySecurityContext() {
+        return argThat(new ArgumentMatcher<SecurityContext>() {
             @Override
             public boolean matches( Object callback ) {
                 return callback != null;
@@ -175,14 +176,14 @@
     @Test( expected = RepositorySourceException.class )
     public void shouldNotCreateConnectionWhenAuthenticationFails() throws Exception {
         // Stub the execution context factory to throw a LoginException to simulate failed authentication
-        stub(executionContextFactory.with(eq(securityDomain), anyCallbackHandler())).toThrow(new LoginException());
+        stub(executionContextFactory.with(anySecurityContext())).toThrow(new LoginException());
         source.getConnection();
     }
 
     @Test( expected = NullPointerException.class )
     public void shouldPropogateAllExceptionsExceptLoginExceptionThrownFromExecutionContextFactory() throws Exception {
         // Stub the execution context factory to throw a LoginException to simulate failed authentication
-        stub(executionContextFactory.with(eq(securityDomain), anyCallbackHandler())).toThrow(new NullPointerException());
+        stub(executionContextFactory.with(anySecurityContext())).toThrow(new NullPointerException());
         source.getConnection();
     }
 



From dna-commits at lists.jboss.org  Sat Jun  6 16:49:31 2009
From: dna-commits at lists.jboss.org (dna-commits at lists.jboss.org)
Date: Sat, 06 Jun 2009 16:49:31 -0400
Subject: [dna-commits] DNA SVN: r984 -
	trunk/dna-graph/src/main/java/org/jboss/dna/graph.
Message-ID: <E1MD2pX-0004bo-MF@committer01.frg.pub.inap.atl.jboss.com>

Author: bcarothers
Date: 2009-06-06 16:49:31 -0400 (Sat, 06 Jun 2009)
New Revision: 984

Modified:
   trunk/dna-graph/src/main/java/org/jboss/dna/graph/ExecutionContext.java
   trunk/dna-graph/src/main/java/org/jboss/dna/graph/JaasSecurityContext.java
Log:
Removed spurious @Overrides

Modified: trunk/dna-graph/src/main/java/org/jboss/dna/graph/ExecutionContext.java
===================================================================
--- trunk/dna-graph/src/main/java/org/jboss/dna/graph/ExecutionContext.java	2009-06-06 20:34:20 UTC (rev 983)
+++ trunk/dna-graph/src/main/java/org/jboss/dna/graph/ExecutionContext.java	2009-06-06 20:49:31 UTC (rev 984)
@@ -337,17 +337,14 @@
      */
     private static class NullSecurityContext implements SecurityContext {
 
-        @Override
         public String getUserName() {
             return null;
         }
 
-        @Override
         public boolean hasRole( String roleName ) {
             return false;
         }
 
-        @Override
         public void logout() {
         }
         

Modified: trunk/dna-graph/src/main/java/org/jboss/dna/graph/JaasSecurityContext.java
===================================================================
--- trunk/dna-graph/src/main/java/org/jboss/dna/graph/JaasSecurityContext.java	2009-06-06 20:34:20 UTC (rev 983)
+++ trunk/dna-graph/src/main/java/org/jboss/dna/graph/JaasSecurityContext.java	2009-06-06 20:49:31 UTC (rev 984)
@@ -157,7 +157,6 @@
      * 
      * @see SecurityContext#getUserName()
      */
-    @Override
     public String getUserName() {
         return loggedIn ? userName : null;
     }
@@ -167,8 +166,6 @@
      * 
      * @see SecurityContext#hasRole(String)
      */
-
-    @Override
     public boolean hasRole( String roleName ) {
         return loggedIn ? entitlements.contains(roleName) : false;
     }
@@ -178,7 +175,6 @@
      * 
      * @see SecurityContext#logout()
      */
-    @Override
     public void logout() {
         try {
             loggedIn = false;



From dna-commits at lists.jboss.org  Sat Jun  6 19:48:57 2009
From: dna-commits at lists.jboss.org (dna-commits at lists.jboss.org)
Date: Sat, 06 Jun 2009 19:48:57 -0400
Subject: [dna-commits] DNA SVN: r985 - in trunk:
	dna-graph/src/test/java/org/jboss/dna/graph and 8 other directories.
Message-ID: <E1MD5dB-0004Rr-IE@committer01.frg.pub.inap.atl.jboss.com>

Author: bcarothers
Date: 2009-06-06 19:48:57 -0400 (Sat, 06 Jun 2009)
New Revision: 985

Added:
   trunk/extensions/dna-web-jcr-rest-war/src/main/resources/log4j.properties
   trunk/extensions/dna-web-jcr-rest/src/main/java/org/jboss/dna/web/jcr/rest/ServletSecurityContext.java
Removed:
   trunk/extensions/dna-web-jcr-rest-war/src/test/resources/dna-test-users.props
   trunk/extensions/dna-web-jcr-rest-war/src/test/resources/jetty-dna.policy
   trunk/extensions/dna-web-jcr-rest-war/src/test/resources/jetty-jaas.xml
   trunk/extensions/dna-web-jcr-rest/src/main/webapp/
Modified:
   trunk/dna-graph/src/test/java/org/jboss/dna/graph/MockSecurityContext.java
   trunk/extensions/dna-web-jcr-rest-war/pom.xml
   trunk/extensions/dna-web-jcr-rest-war/src/main/webapp/WEB-INF/web.xml
   trunk/extensions/dna-web-jcr-rest-war/src/test/java/org/jboss/dna/web/jcr/rest/JcrResourcesTest.java
   trunk/extensions/dna-web-jcr-rest-war/src/test/resources/log4j.properties
   trunk/extensions/dna-web-jcr-rest/src/main/java/org/jboss/dna/web/jcr/rest/JcrResources.java
   trunk/extensions/dna-web-jcr-rest/src/main/java/org/jboss/dna/web/jcr/rest/RepositoryFactory.java
   trunk/extensions/dna-web-jcr-rest/src/main/java/org/jboss/dna/web/jcr/rest/spi/DnaJcrRepositoryProvider.java
   trunk/extensions/dna-web-jcr-rest/src/main/java/org/jboss/dna/web/jcr/rest/spi/RepositoryProvider.java
   trunk/pom.xml
Log:
DNA-440 Integrate Servlet Security with DNA ExecutionContext

Applied patch that:

- Adds class ServletSecurityContext to wrap HttpServletRequests in a SecurityContext for authorization within DNA
- Makes JcrResource utilize a wrapped HttpServletRequest to login to the JCR Repository instead of a hardcoded user/password
- Refactors the SPI to remove the ability to get a repository by name and add the ability to get a session from a request, repository name, and workspace name
- Refactors surrounding classes in accord with change from prior line
- Modifies integration test WAR to require basic authentication for all URIs
- Modifies POM to add a valid user/password combination with the correct connect role; stripped all JAAS configuration
- Makes existing test cases use 
- Adds test cases for bad password and user without connect role

The REST integration test case throws out a bunch of spurious warnings about authorization failure, but since the test cases test that 1) nothing gets returned if authorization actually fails and 2) the right things do get returned when authorization works, I'm going to write this off as a Jetty quirk until proven otherwise.

Modified: trunk/dna-graph/src/test/java/org/jboss/dna/graph/MockSecurityContext.java
===================================================================
--- trunk/dna-graph/src/test/java/org/jboss/dna/graph/MockSecurityContext.java	2009-06-06 20:49:31 UTC (rev 984)
+++ trunk/dna-graph/src/test/java/org/jboss/dna/graph/MockSecurityContext.java	2009-06-06 23:48:57 UTC (rev 985)
@@ -20,17 +20,14 @@
         this.entitlements = entitlements != null ? entitlements : Collections.<String>emptySet();
     }
     
-    @Override
     public String getUserName() {
         return userName;
     }
 
-    @Override
     public boolean hasRole( String roleName ) {
         return entitlements.contains(roleName);
     }
 
-    @Override
     public void logout() {
 
     }

Modified: trunk/extensions/dna-web-jcr-rest/src/main/java/org/jboss/dna/web/jcr/rest/JcrResources.java
===================================================================
--- trunk/extensions/dna-web-jcr-rest/src/main/java/org/jboss/dna/web/jcr/rest/JcrResources.java	2009-06-06 20:49:31 UTC (rev 984)
+++ trunk/extensions/dna-web-jcr-rest/src/main/java/org/jboss/dna/web/jcr/rest/JcrResources.java	2009-06-06 23:48:57 UTC (rev 985)
@@ -35,7 +35,6 @@
 import javax.jcr.PathNotFoundException;
 import javax.jcr.Property;
 import javax.jcr.PropertyIterator;
-import javax.jcr.Repository;
 import javax.jcr.RepositoryException;
 import javax.jcr.Session;
 import javax.jcr.Value;
@@ -126,36 +125,26 @@
     public static final String EMPTY_WORKSPACE_NAME = "<default>";
 
     /**
-     * Returns a reference to the named repository, if it exists.
-     * 
-     * @param repositoryName the name of the repository to load
-     * @return the repository
-     * @throws RepositoryException if any other error occurs
-     */
-    private Repository getRepository( String repositoryName ) throws RepositoryException {
-        return RepositoryFactory.getRepository(repositoryName);
-    }
-
-    /**
      * Returns an active session for the given workspace name in the named repository.
      * 
+     * @param request the servlet request; may not be null or unauthenticated
      * @param rawRepositoryName the URL-encoded name of the repository in which the session is created
-     * @param rawWorkspaceName the URL-endecoded name of the workspace to which the session should be connected
+     * @param rawWorkspaceName the URL-encoded name of the workspace to which the session should be connected
      * @return an active session with the given workspace in the named repository
      * @throws RepositoryException if any other error occurs
      */
-    private Session getSession( String rawRepositoryName,
+    private Session getSession( HttpServletRequest request, 
+                                String rawRepositoryName,
                                 String rawWorkspaceName ) throws NotFoundException, RepositoryException {
+        assert request != null;
+        assert request.getUserPrincipal() != null: "Request must be authorized";
 
-        Repository repository;
-        try {
-            repository = getRepository(repositoryNameFor(rawRepositoryName));
-            
-        } catch (RepositoryException re) {
-            throw new NotFoundException(re.getMessage(), re);
+        // Sanity check
+        if (request.getUserPrincipal() == null) {
+            throw new UnauthorizedException("Client is not authorized");
         }
         
-        return repository.login(null, workspaceNameFor(rawWorkspaceName));
+        return RepositoryFactory.getSession(request, repositoryNameFor(rawRepositoryName), workspaceNameFor(rawWorkspaceName));
     }
 
     /**
@@ -205,7 +194,7 @@
 
         Map<String, WorkspaceEntry> workspaces = new HashMap<String, WorkspaceEntry>();
 
-        Session session = getSession(rawRepositoryName, null);
+        Session session = getSession(request, rawRepositoryName, null);
         rawRepositoryName = URL_ENCODER.encode(rawRepositoryName);
         
         for (String name : session.getWorkspace().getAccessibleWorkspaceNames()) {
@@ -222,6 +211,7 @@
     /**
      * Handles GET requests for an item in a workspace.
      * 
+     * @param request the servlet request; may not be null or unauthenticated
      * @param rawRepositoryName the URL-encoded repository name
      * @param rawWorkspaceName the URL-encoded workspace name
      * @param path the path to the item
@@ -242,7 +232,8 @@
     @GET
     @Path( "/{repositoryName}/{workspaceName}/items{path:.*}" )
     @Produces( "application/json" )
-    public String getItem( @PathParam( "repositoryName" ) String rawRepositoryName,
+    public String getItem( @Context HttpServletRequest request, 
+                           @PathParam( "repositoryName" ) String rawRepositoryName,
                            @PathParam( "workspaceName" ) String rawWorkspaceName,
                            @PathParam( "path" ) String path,
                            @QueryParam( "dna:depth" ) @DefaultValue( "0" ) int depth )
@@ -251,7 +242,7 @@
         assert rawRepositoryName != null;
         assert rawWorkspaceName != null;
 
-        Session session = getSession(rawRepositoryName, rawWorkspaceName);
+        Session session = getSession(request, rawRepositoryName, rawWorkspaceName);
         Item item;
 
         if ("/".equals(path) || "".equals(path)) {
@@ -365,6 +356,7 @@
      * jcr:mixinTypes} properties.
      * </p>
      * 
+     * @param request the servlet request; may not be null or unauthenticated
      * @param rawRepositoryName the URL-encoded repository name
      * @param rawWorkspaceName the URL-encoded workspace name
      * @param path the path to the item
@@ -379,7 +371,8 @@
     @POST
     @Path( "/{repositoryName}/{workspaceName}/items/{path:.*}" )
     @Consumes( "application/json" )
-    public Response postItem( @PathParam( "repositoryName" ) String rawRepositoryName,
+    public Response postItem( @Context HttpServletRequest request,
+                              @PathParam( "repositoryName" ) String rawRepositoryName,
                               @PathParam( "workspaceName" ) String rawWorkspaceName,
                               @PathParam( "path" ) String path,
                               String requestContent )
@@ -394,7 +387,7 @@
         String parentPath = lastSlashInd == -1 ? "/" : "/" + path.substring(0, lastSlashInd);
         String newNodeName = lastSlashInd == -1 ? path : path.substring(lastSlashInd + 1);
 
-        Session session = getSession(rawRepositoryName, rawWorkspaceName);
+        Session session = getSession(request, rawRepositoryName, rawWorkspaceName);
 
         Node parentNode = (Node)session.getItem(parentPath);
 
@@ -499,6 +492,7 @@
     /**
      * Deletes the item at {@code path}.
      * 
+     * @param request the servlet request; may not be null or unauthenticated
      * @param rawRepositoryName the URL-encoded repository name
      * @param rawWorkspaceName the URL-encoded workspace name
      * @param path the path to the item
@@ -509,7 +503,8 @@
     @DELETE
     @Path( "/{repositoryName}/{workspaceName}/items{path:.*}" )
     @Consumes( "application/json" )
-    public void deleteItem( @PathParam( "repositoryName" ) String rawRepositoryName,
+    public void deleteItem( @Context HttpServletRequest request,
+                            @PathParam( "repositoryName" ) String rawRepositoryName,
                             @PathParam( "workspaceName" ) String rawWorkspaceName,
                             @PathParam( "path" ) String path )
         throws NotFoundException, UnauthorizedException, RepositoryException {
@@ -518,7 +513,7 @@
         assert rawWorkspaceName != null;
         assert path != null;
 
-        Session session = getSession(rawRepositoryName, rawWorkspaceName);
+        Session session = getSession(request, rawRepositoryName, rawWorkspaceName);
 
         Item item;
         try {
@@ -539,6 +534,7 @@
      * keys correspond to the values that will be set on the properties.
      * </p>
      * 
+     * @param request the servlet request; may not be null or unauthenticated
      * @param rawRepositoryName the URL-encoded repository name
      * @param rawWorkspaceName the URL-encoded workspace name
      * @param path the path to the item
@@ -552,7 +548,8 @@
     @PUT
     @Path( "/{repositoryName}/{workspaceName}/items{path:.*}" )
     @Consumes( "application/json" )
-    public String putItem( @PathParam( "repositoryName" ) String rawRepositoryName,
+    public String putItem( @Context HttpServletRequest request,
+                           @PathParam( "repositoryName" ) String rawRepositoryName,
                            @PathParam( "workspaceName" ) String rawWorkspaceName,
                            @PathParam( "path" ) String path,
                            String requestContent ) throws UnauthorizedException, JSONException, RepositoryException {
@@ -561,7 +558,7 @@
         assert rawRepositoryName != null;
         assert rawWorkspaceName != null;
 
-        Session session = getSession(rawRepositoryName, rawWorkspaceName);
+        Session session = getSession(request, rawRepositoryName, rawWorkspaceName);
         Node node;
         Item item;
         if ("".equals(path) || "/".equals(path)) {

Modified: trunk/extensions/dna-web-jcr-rest/src/main/java/org/jboss/dna/web/jcr/rest/RepositoryFactory.java
===================================================================
--- trunk/extensions/dna-web-jcr-rest/src/main/java/org/jboss/dna/web/jcr/rest/RepositoryFactory.java	2009-06-06 20:49:31 UTC (rev 984)
+++ trunk/extensions/dna-web-jcr-rest/src/main/java/org/jboss/dna/web/jcr/rest/RepositoryFactory.java	2009-06-06 23:48:57 UTC (rev 985)
@@ -1,9 +1,10 @@
 package org.jboss.dna.web.jcr.rest;
 
 import java.util.Collection;
-import javax.jcr.Repository;
 import javax.jcr.RepositoryException;
+import javax.jcr.Session;
 import javax.servlet.ServletContext;
+import javax.servlet.http.HttpServletRequest;
 import org.jboss.dna.web.jcr.rest.spi.RepositoryProvider;
 
 public class RepositoryFactory {
@@ -30,8 +31,8 @@
         provider.startup(context);
     }
 
-    public static Repository getRepository( String repositoryName ) throws RepositoryException {
-        return provider.getRepository(repositoryName);
+    public static Session getSession( HttpServletRequest request, String repositoryName, String workspaceName) throws RepositoryException {
+        return provider.getSession(request, repositoryName, workspaceName);
     }
 
     public static Collection<String> getJcrRepositoryNames() {

Added: trunk/extensions/dna-web-jcr-rest/src/main/java/org/jboss/dna/web/jcr/rest/ServletSecurityContext.java
===================================================================
--- trunk/extensions/dna-web-jcr-rest/src/main/java/org/jboss/dna/web/jcr/rest/ServletSecurityContext.java	                        (rev 0)
+++ trunk/extensions/dna-web-jcr-rest/src/main/java/org/jboss/dna/web/jcr/rest/ServletSecurityContext.java	2009-06-06 23:48:57 UTC (rev 985)
@@ -0,0 +1,53 @@
+package org.jboss.dna.web.jcr.rest;
+
+import javax.servlet.http.HttpServletRequest;
+import org.jboss.dna.common.util.CheckArg;
+import org.jboss.dna.graph.SecurityContext;
+
+/**
+ * Servlet-based {@link SecurityContext security context} that assumes servlet-based authentication and provides authorization
+ * through the {@link HttpServletRequest#isUserInRole(String) servlet role-checking mechanism}.
+ */
+public class ServletSecurityContext implements SecurityContext {
+
+    private final String userName;
+    private final HttpServletRequest request;
+
+    /**
+     * Create a {@link ServletSecurityContext} with the supplied {@link HttpServletRequest servlet information}.
+     * 
+     * @param request the servlet request; may not be null
+     */
+    public ServletSecurityContext( HttpServletRequest request ) {
+        CheckArg.isNotNull(request, "request");
+        this.request = request;
+        this.userName = request.getUserPrincipal() != null ? request.getUserPrincipal().getName() : null;
+    }
+
+    /**
+     * {@inheritDoc SecurityContext#getUserName()}
+     * 
+     * @see SecurityContext#getUserName()
+     */
+    public final String getUserName() {
+        return userName;
+    }
+
+    /**
+     * {@inheritDoc SecurityContext#hasRole(String)}
+     * 
+     * @see SecurityContext#hasRole(String)
+     */
+    public final boolean hasRole( String roleName ) {
+        return request.isUserInRole(roleName);
+    }
+
+    /**
+     * {@inheritDoc SecurityContext#logout()}
+     * 
+     * @see SecurityContext#logout()
+     */
+    public void logout() {
+    }
+
+}


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

Modified: trunk/extensions/dna-web-jcr-rest/src/main/java/org/jboss/dna/web/jcr/rest/spi/DnaJcrRepositoryProvider.java
===================================================================
--- trunk/extensions/dna-web-jcr-rest/src/main/java/org/jboss/dna/web/jcr/rest/spi/DnaJcrRepositoryProvider.java	2009-06-06 20:49:31 UTC (rev 984)
+++ trunk/extensions/dna-web-jcr-rest/src/main/java/org/jboss/dna/web/jcr/rest/spi/DnaJcrRepositoryProvider.java	2009-06-06 23:48:57 UTC (rev 985)
@@ -6,9 +6,15 @@
 import java.util.Set;
 import javax.jcr.Repository;
 import javax.jcr.RepositoryException;
+import javax.jcr.Session;
 import javax.servlet.ServletContext;
+import javax.servlet.http.HttpServletRequest;
 import org.jboss.dna.jcr.JcrConfiguration;
 import org.jboss.dna.jcr.JcrEngine;
+import org.jboss.dna.jcr.SecurityContextCredentials;
+import org.jboss.dna.web.jcr.rest.ServletSecurityContext;
+import org.jboss.resteasy.spi.NotFoundException;
+import org.jboss.resteasy.spi.UnauthorizedException;
 import org.xml.sax.SAXException;
 
 public class DnaJcrRepositoryProvider implements RepositoryProvider {
@@ -24,7 +30,7 @@
         return new HashSet<String>(jcrEngine.getRepositoryNames());
     }
 
-    public Repository getRepository( String repositoryName ) throws RepositoryException {
+    private Repository getRepository( String repositoryName ) throws RepositoryException {
         return jcrEngine.getRepository(repositoryName);
     }
 
@@ -46,4 +52,37 @@
     public void shutdown() {
         jcrEngine.shutdown();
     }
+
+    /**
+     * Returns an active session for the given workspace name in the named repository.
+     * 
+     * @param request the servlet request; may not be null or unauthenticated
+     * @param repositoryName the name of the repository in which the session is created
+     * @param workspaceName the name of the workspace to which the session should be connected
+     * @return an active session with the given workspace in the named repository
+     * @throws RepositoryException if any other error occurs
+     */
+    public Session getSession( HttpServletRequest request, 
+                                String repositoryName,
+                                String workspaceName ) throws RepositoryException {
+        assert request != null;
+        assert request.getUserPrincipal() != null: "Request must be authorized";
+
+        // Sanity check in case assertions are disabled
+        if (request.getUserPrincipal() == null) {
+            throw new UnauthorizedException("Client is not authorized");
+        }
+        
+        Repository repository;
+        
+        try {
+            repository = getRepository(repositoryName);
+            
+        } catch (RepositoryException re) {
+            throw new NotFoundException(re.getMessage(), re);
+        }
+        
+        return repository.login(new SecurityContextCredentials(new ServletSecurityContext(request)), workspaceName);
+
+    }
 }

Modified: trunk/extensions/dna-web-jcr-rest/src/main/java/org/jboss/dna/web/jcr/rest/spi/RepositoryProvider.java
===================================================================
--- trunk/extensions/dna-web-jcr-rest/src/main/java/org/jboss/dna/web/jcr/rest/spi/RepositoryProvider.java	2009-06-06 20:49:31 UTC (rev 984)
+++ trunk/extensions/dna-web-jcr-rest/src/main/java/org/jboss/dna/web/jcr/rest/spi/RepositoryProvider.java	2009-06-06 23:48:57 UTC (rev 985)
@@ -1,9 +1,10 @@
 package org.jboss.dna.web.jcr.rest.spi;
 
 import java.util.Set;
-import javax.jcr.Repository;
 import javax.jcr.RepositoryException;
+import javax.jcr.Session;
 import javax.servlet.ServletContext;
+import javax.servlet.http.HttpServletRequest;
 
 /**
  * Interface for any class that provides access to one or more local JCR repositories. Repository providers must provide a public,
@@ -12,15 +13,18 @@
 public interface RepositoryProvider {
 
     /**
-     * Returns a reference to the named repository
+     * Returns an active session for the given workspace name in the named repository.
      * 
-     * @param repositoryName the name of the repository to retrieve; may be null
-     * @return the repository with the given name; may not be null
-     * @throws RepositoryException if no repository with the given name exists or there is an error obtaining a reference to the
-     *         named repository
+     * @param request the servlet request; may not be null or unauthenticated
+     * @param repositoryName the name of the repository in which the session is created
+     * @param workspaceName the name of the workspace to which the session should be connected
+     * @return an active session with the given workspace in the named repository
+     * @throws RepositoryException if any other error occurs
      */
-    Repository getRepository( String repositoryName ) throws RepositoryException;
-
+    public Session getSession( HttpServletRequest request, 
+                                String repositoryName,
+                                String workspaceName ) throws RepositoryException;
+    
     /**
      * Returns the available repository names
      * 
@@ -40,4 +44,5 @@
      * any external resource held.
      */
     void shutdown();
+
 }

Modified: trunk/extensions/dna-web-jcr-rest-war/pom.xml
===================================================================
--- trunk/extensions/dna-web-jcr-rest-war/pom.xml	2009-06-06 20:49:31 UTC (rev 984)
+++ trunk/extensions/dna-web-jcr-rest-war/pom.xml	2009-06-06 23:48:57 UTC (rev 985)
@@ -42,16 +42,11 @@
 	</dependencies>
 	<build>
 		<finalName>resources</finalName>
-		<pluginManagement>
-			<plugins>
-				<plugin>
-				</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>
@@ -71,14 +66,10 @@
 				<configuration>
 					<configuration>
 						<properties>
-							<cargo.logging>high</cargo.logging>
+							<cargo.logging>low</cargo.logging>
+							<cargo.servlet.users>dnauser:password:connect,readwrite|unauthorized:password:bogus</cargo.servlet.users>
 						</properties>
 					</configuration>
-					<container>
-						<systemProperties>
-							<java.security.auth.login.config>${project.build.directory}/test-classes/jetty-dna.policy</java.security.auth.login.config>
-						</systemProperties>
-					</container>
 					<wait>false</wait>
 				</configuration>
 			</plugin>
@@ -106,6 +97,7 @@
 				</executions>
 			</plugin>
 		</plugins>
+
 	</build>
 
 </project>

Added: trunk/extensions/dna-web-jcr-rest-war/src/main/resources/log4j.properties
===================================================================
--- trunk/extensions/dna-web-jcr-rest-war/src/main/resources/log4j.properties	                        (rev 0)
+++ trunk/extensions/dna-web-jcr-rest-war/src/main/resources/log4j.properties	2009-06-06 23:48:57 UTC (rev 985)
@@ -0,0 +1,13 @@
+log4j.rootLogger = INFO, stdout
+
+log4j.category.org.apache=DEBUG
+log4j.category.org.jboss.resteasy=DEBUG
+log4j.category.org.mortbay.jetty.security=ERROR
+log4j.category.org.slf4j.impl.JCLLoggerAdapter=DEBUG
+log4j.category.org.springframework=INFO
+
+log4j.appender.stdout = org.apache.log4j.ConsoleAppender
+log4j.appender.stdout.Threshold = INFO
+log4j.appender.stdout.Target   = System.out
+log4j.appender.stdout.layout = org.apache.log4j.PatternLayout
+log4j.appender.stdout.layout.ConversionPattern = [%-5p] [%C] : %m%n [%F:%L]

Modified: trunk/extensions/dna-web-jcr-rest-war/src/main/webapp/WEB-INF/web.xml
===================================================================
--- trunk/extensions/dna-web-jcr-rest-war/src/main/webapp/WEB-INF/web.xml	2009-06-06 20:49:31 UTC (rev 984)
+++ trunk/extensions/dna-web-jcr-rest-war/src/main/webapp/WEB-INF/web.xml	2009-06-06 23:48:57 UTC (rev 985)
@@ -21,39 +21,47 @@
 	-->
 <web-app>
 	<display-name>JBoss DNA JCR RESTful Interface</display-name>
+
 	<context-param>
 		<param-name>org.jboss.dna.web.jcr.rest.REPOSITORY_PROVIDER</param-name>
 		<param-value>org.jboss.dna.web.jcr.rest.spi.DnaJcrRepositoryProvider</param-value>
 	</context-param>
+
 	<context-param>
 		<param-name>org.jboss.dna.web.jcr.rest.CONFIG_FILE</param-name>
 		<param-value>/configRepository.xml</param-value>
 	</context-param>
+
 	<context-param>
 		<param-name>resteasy.providers</param-name>
 		<param-value>org.jboss.dna.web.jcr.rest.JcrResources$NotFoundExceptionMapper,
 			org.jboss.dna.web.jcr.rest.JcrResources$JSONExceptionMapper,
 			org.jboss.dna.web.jcr.rest.JcrResources$RepositoryExceptionMapper</param-value>
 	</context-param>
+
 	<context-param>
 		<param-name>javax.ws.rs.Application</param-name>
 		<param-value>org.jboss.dna.web.jcr.rest.JcrApplication</param-value>
 	</context-param>
+
 	<listener>
 		<listener-class>org.jboss.resteasy.plugins.server.servlet.ResteasyBootstrap</listener-class>
 	</listener>
+
 	<listener>
 		<listener-class>org.jboss.dna.web.jcr.rest.DnaJcrDeployer</listener-class>
 	</listener>
+
 	<servlet>
 		<servlet-name>Resteasy</servlet-name>
 		<servlet-class>org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher</servlet-class>
 	</servlet>
+
 	<servlet-mapping>
 		<servlet-name>Resteasy</servlet-name>
 		<url-pattern>/*</url-pattern>
 	</servlet-mapping>
-<!-- 	
+
 	<security-constraint>
 		<display-name>DNA REST</display-name>
 		<web-resource-collection>
@@ -64,12 +72,12 @@
 			<role-name>connect</role-name>
 		</auth-constraint>
 	</security-constraint>
+
 	<login-config>
 		<auth-method>BASIC</auth-method>
-		<realm-name>MyRealm</realm-name>
 	</login-config>
+
 	<security-role>
 		<role-name>connect</role-name>
 	</security-role>
- -->	
 </web-app>

Modified: trunk/extensions/dna-web-jcr-rest-war/src/test/java/org/jboss/dna/web/jcr/rest/JcrResourcesTest.java
===================================================================
--- trunk/extensions/dna-web-jcr-rest-war/src/test/java/org/jboss/dna/web/jcr/rest/JcrResourcesTest.java	2009-06-06 20:49:31 UTC (rev 984)
+++ trunk/extensions/dna-web-jcr-rest-war/src/test/java/org/jboss/dna/web/jcr/rest/JcrResourcesTest.java	2009-06-06 23:48:57 UTC (rev 985)
@@ -24,13 +24,15 @@
 package org.jboss.dna.web.jcr.rest;
 
 import static org.hamcrest.core.Is.is;
+import static org.hamcrest.core.IsInstanceOf.instanceOf;
 import static org.hamcrest.core.IsNull.notNullValue;
-import static org.hamcrest.core.IsInstanceOf.instanceOf;
 import static org.junit.Assert.assertThat;
 import static org.junit.Assert.assertTrue;
 import java.io.IOException;
 import java.io.InputStream;
+import java.net.Authenticator;
 import java.net.HttpURLConnection;
+import java.net.PasswordAuthentication;
 import java.net.URL;
 import java.util.HashSet;
 import java.util.Set;
@@ -48,14 +50,15 @@
     @Before
     public void beforeEach() {
 
-//        final String login ="dnauser";
-//        final String password ="password";
-//
-//        Authenticator.setDefault(new Authenticator() {
-//            protected PasswordAuthentication getPasswordAuthentication() {
-//                return new PasswordAuthentication (login, password.toCharArray());
-//            }
-//        });
+        // Configured in pom
+        final String login ="dnauser";
+        final String password ="password";
+
+        Authenticator.setDefault(new Authenticator() {
+            protected PasswordAuthentication getPasswordAuthentication() {
+                return new PasswordAuthentication (login, password.toCharArray());
+            }
+        });
     }
     
     private String getResponseFor( HttpURLConnection connection ) throws IOException {
@@ -72,6 +75,55 @@
     }
 
     @Test
+    public void shouldNotServeContentToUnauthorizedUser() throws Exception {
+
+        final String login ="dnauser";
+        final String password ="invalidpassword";
+
+        Authenticator.setDefault(new Authenticator() {
+            protected PasswordAuthentication getPasswordAuthentication() {
+                return new PasswordAuthentication (login, password.toCharArray());
+            }
+        });
+
+        URL postUrl = new URL(SERVER_URL + "/");
+        HttpURLConnection connection = (HttpURLConnection)postUrl.openConnection();
+
+        connection.setDoOutput(true);
+        connection.setRequestMethod("GET");
+        connection.setRequestProperty("Content-Type", MediaType.APPLICATION_JSON);
+
+        assertThat(connection.getResponseCode(), is(HttpURLConnection.HTTP_UNAUTHORIZED));
+        connection.disconnect();
+
+    }
+
+    @Test
+    public void shouldNotServeContentToUserWithoutConnectRole() throws Exception {
+
+        // Configured in pom
+        final String login ="unauthorizeduser";
+        final String password ="password";
+
+        Authenticator.setDefault(new Authenticator() {
+            protected PasswordAuthentication getPasswordAuthentication() {
+                return new PasswordAuthentication (login, password.toCharArray());
+            }
+        });
+
+        URL postUrl = new URL(SERVER_URL + "/");
+        HttpURLConnection connection = (HttpURLConnection)postUrl.openConnection();
+
+        connection.setDoOutput(true);
+        connection.setRequestMethod("GET");
+        connection.setRequestProperty("Content-Type", MediaType.APPLICATION_JSON);
+
+        assertThat(connection.getResponseCode(), is(HttpURLConnection.HTTP_UNAUTHORIZED));
+        connection.disconnect();
+
+    }
+
+    @Test
     public void shouldServeContentAtRoot() throws Exception {
         URL postUrl = new URL(SERVER_URL + "/");
         HttpURLConnection connection = (HttpURLConnection)postUrl.openConnection();

Deleted: trunk/extensions/dna-web-jcr-rest-war/src/test/resources/dna-test-users.props
===================================================================
--- trunk/extensions/dna-web-jcr-rest-war/src/test/resources/dna-test-users.props	2009-06-06 20:49:31 UTC (rev 984)
+++ trunk/extensions/dna-web-jcr-rest-war/src/test/resources/dna-test-users.props	2009-06-06 23:48:57 UTC (rev 985)
@@ -1 +0,0 @@
-dnauser=password,readwrite

Deleted: trunk/extensions/dna-web-jcr-rest-war/src/test/resources/jetty-dna.policy
===================================================================
--- trunk/extensions/dna-web-jcr-rest-war/src/test/resources/jetty-dna.policy	2009-06-06 20:49:31 UTC (rev 984)
+++ trunk/extensions/dna-web-jcr-rest-war/src/test/resources/jetty-dna.policy	2009-06-06 23:48:57 UTC (rev 985)
@@ -1,5 +0,0 @@
-dna-jcr {
-        org.mortbay.jetty.plus.jaas.spi.PropertyFileLoginModule optional
-        debug="true"
-        file="target/test-classes/dna-test-users.props";
-};

Deleted: trunk/extensions/dna-web-jcr-rest-war/src/test/resources/jetty-jaas.xml
===================================================================
--- trunk/extensions/dna-web-jcr-rest-war/src/test/resources/jetty-jaas.xml	2009-06-06 20:49:31 UTC (rev 984)
+++ trunk/extensions/dna-web-jcr-rest-war/src/test/resources/jetty-jaas.xml	2009-06-06 23:48:57 UTC (rev 985)
@@ -1,9 +0,0 @@
-<Call name="addUserRealm">
-  <Arg>
-    <New class="org.mortbay.jetty.plus.jaas.JAASUserRealm">
-      <Set name="name">xyzrealm</Set>
-      <Set name="LoginModuleName">dna-jcr</Set>
-    </New>
-  </Arg>
-</Call>
-

Modified: trunk/extensions/dna-web-jcr-rest-war/src/test/resources/log4j.properties
===================================================================
--- trunk/extensions/dna-web-jcr-rest-war/src/test/resources/log4j.properties	2009-06-06 20:49:31 UTC (rev 984)
+++ trunk/extensions/dna-web-jcr-rest-war/src/test/resources/log4j.properties	2009-06-06 23:48:57 UTC (rev 985)
@@ -1,9 +1,9 @@
 log4j.rootLogger = DEBUG, stdout
 
-log4j.category.org.apache=INFO
-log4j.category.org.jboss.resteasy=INFO
-log4j.category.org.mortbay=DEBUG
-log4j.category.org.slf4j.impl.JCLLoggerAdapter=INFO
+log4j.category.org.apache=DEBUG
+log4j.category.org.jboss.resteasy=DEBUG
+log4j.category.org.mortbay.jetty.security=ERROR
+log4j.category.org.slf4j.impl.JCLLoggerAdapter=DEBUG
 log4j.category.org.springframework=INFO
 
 log4j.appender.stdout = org.apache.log4j.ConsoleAppender

Modified: trunk/pom.xml
===================================================================
--- trunk/pom.xml	2009-06-06 20:49:31 UTC (rev 984)
+++ trunk/pom.xml	2009-06-06 23:48:57 UTC (rev 985)
@@ -143,8 +143,8 @@
 		<module>extensions/dna-mimetype-detector-aperture</module>
 		<module>extensions/dna-common-jdbc</module> 
 		<module>extensions/dna-connector-jdbc-metadata</module> 
-		<!-- module>extensions/dna-web-jcr-rest</module --> 
-		<!-- module>extensions/dna-web-jcr-rest-war</module --> 
+		<module>extensions/dna-web-jcr-rest</module> 
+		<module>extensions/dna-web-jcr-rest-war</module> 
 		<module>dna-integration-tests</module>
 		<!--module>docs/examples/gettingstarted</module-->
 	</modules>



From dna-commits at lists.jboss.org  Sat Jun  6 20:08:51 2009
From: dna-commits at lists.jboss.org (dna-commits at lists.jboss.org)
Date: Sat, 06 Jun 2009 20:08:51 -0400
Subject: [dna-commits] DNA SVN: r986 -
	trunk/dna-jcr/src/test/java/org/jboss/dna/jcr.
Message-ID: <E1MD5wR-0005TX-SN@committer01.frg.pub.inap.atl.jboss.com>

Author: bcarothers
Date: 2009-06-06 20:08:51 -0400 (Sat, 06 Jun 2009)
New Revision: 986

Modified:
   trunk/dna-jcr/src/test/java/org/jboss/dna/jcr/JcrRepositoryTest.java
Log:
Removed spurious @Override tag, tried to fix cast error

Modified: trunk/dna-jcr/src/test/java/org/jboss/dna/jcr/JcrRepositoryTest.java
===================================================================
--- trunk/dna-jcr/src/test/java/org/jboss/dna/jcr/JcrRepositoryTest.java	2009-06-06 23:48:57 UTC (rev 985)
+++ trunk/dna-jcr/src/test/java/org/jboss/dna/jcr/JcrRepositoryTest.java	2009-06-07 00:08:51 UTC (rev 986)
@@ -195,9 +195,9 @@
         
         Session session = Subject.doAsPrivileged(subject, new PrivilegedExceptionAction<Session>() {
 
-            @Override
+            @SuppressWarnings("cast")
             public Session run() throws Exception {
-                return repository.login();
+                return (Session) repository.login();
             }
         
         }, AccessController.getContext());



From dna-commits at lists.jboss.org  Sat Jun  6 20:20:56 2009
From: dna-commits at lists.jboss.org (dna-commits at lists.jboss.org)
Date: Sat, 06 Jun 2009 20:20:56 -0400
Subject: [dna-commits] DNA SVN: r987 -
	trunk/dna-jcr/src/test/java/org/jboss/dna/jcr.
Message-ID: <E1MD688-000607-6L@committer01.frg.pub.inap.atl.jboss.com>

Author: bcarothers
Date: 2009-06-06 20:20:55 -0400 (Sat, 06 Jun 2009)
New Revision: 987

Modified:
   trunk/dna-jcr/src/test/java/org/jboss/dna/jcr/JcrRepositoryTest.java
Log:
Tried to fix cast error that does not appear in Java 1.6

Modified: trunk/dna-jcr/src/test/java/org/jboss/dna/jcr/JcrRepositoryTest.java
===================================================================
--- trunk/dna-jcr/src/test/java/org/jboss/dna/jcr/JcrRepositoryTest.java	2009-06-07 00:08:51 UTC (rev 986)
+++ trunk/dna-jcr/src/test/java/org/jboss/dna/jcr/JcrRepositoryTest.java	2009-06-07 00:20:55 UTC (rev 987)
@@ -186,6 +186,7 @@
         repository.login();
     }
     
+    @SuppressWarnings("cast")
     @Test
     public void shouldAllowLoginWithNoCredentialsInPrivilegedBlock() throws Exception {
         LoginContext login = new LoginContext("dna-jcr", new UserPasswordCallbackHandler("superuser", "superuser".toCharArray()));
@@ -193,11 +194,10 @@
         
         Subject subject = login.getSubject();
         
-        Session session = Subject.doAsPrivileged(subject, new PrivilegedExceptionAction<Session>() {
+        Session session = (Session) Subject.doAsPrivileged(subject, new PrivilegedExceptionAction<Session>() {
 
-            @SuppressWarnings("cast")
             public Session run() throws Exception {
-                return (Session) repository.login();
+                return repository.login();
             }
         
         }, AccessController.getContext());



From dna-commits at lists.jboss.org  Sun Jun  7 11:05:18 2009
From: dna-commits at lists.jboss.org (dna-commits at lists.jboss.org)
Date: Sun, 07 Jun 2009 11:05:18 -0400
Subject: [dna-commits] DNA SVN: r988 - in trunk/extensions:
	dna-web-jcr-rest/src/main/java/org/jboss/dna/web/jcr/rest/model
	and 2 other directories.
Message-ID: <E1MDJvy-0000rM-D5@committer01.frg.pub.inap.atl.jboss.com>

Author: bcarothers
Date: 2009-06-07 11:05:15 -0400 (Sun, 07 Jun 2009)
New Revision: 988

Added:
   trunk/extensions/dna-web-jcr-rest/src/main/java/org/jboss/dna/web/jcr/rest/model/package-info.java
   trunk/extensions/dna-web-jcr-rest/src/main/java/org/jboss/dna/web/jcr/rest/package-info.java
   trunk/extensions/dna-web-jcr-rest/src/main/java/org/jboss/dna/web/jcr/rest/spi/package-info.java
Modified:
   trunk/extensions/dna-web-jcr-rest-war/src/test/java/org/jboss/dna/web/jcr/rest/JcrResourcesTest.java
   trunk/extensions/dna-web-jcr-rest/src/main/java/org/jboss/dna/web/jcr/rest/DnaJcrDeployer.java
   trunk/extensions/dna-web-jcr-rest/src/main/java/org/jboss/dna/web/jcr/rest/JcrResources.java
   trunk/extensions/dna-web-jcr-rest/src/main/java/org/jboss/dna/web/jcr/rest/RepositoryFactory.java
   trunk/extensions/dna-web-jcr-rest/src/main/java/org/jboss/dna/web/jcr/rest/ServletSecurityContext.java
   trunk/extensions/dna-web-jcr-rest/src/main/java/org/jboss/dna/web/jcr/rest/model/RepositoryEntry.java
   trunk/extensions/dna-web-jcr-rest/src/main/java/org/jboss/dna/web/jcr/rest/model/RepositoryResources.java
   trunk/extensions/dna-web-jcr-rest/src/main/java/org/jboss/dna/web/jcr/rest/model/WorkspaceEntry.java
   trunk/extensions/dna-web-jcr-rest/src/main/java/org/jboss/dna/web/jcr/rest/model/WorkspaceResources.java
   trunk/extensions/dna-web-jcr-rest/src/main/java/org/jboss/dna/web/jcr/rest/spi/DnaJcrRepositoryProvider.java
   trunk/extensions/dna-web-jcr-rest/src/main/java/org/jboss/dna/web/jcr/rest/spi/RepositoryProvider.java
Log:
DNA-318 Provide documentation/examples/tutorial explaining use of RESTful API

Bolstered Javadoc in dna-web-jcr-rest subproject as a precursor to putting comparable information into the Getting Started and Reference Guide documents.

Modified: trunk/extensions/dna-web-jcr-rest/src/main/java/org/jboss/dna/web/jcr/rest/DnaJcrDeployer.java
===================================================================
--- trunk/extensions/dna-web-jcr-rest/src/main/java/org/jboss/dna/web/jcr/rest/DnaJcrDeployer.java	2009-06-07 00:20:55 UTC (rev 987)
+++ trunk/extensions/dna-web-jcr-rest/src/main/java/org/jboss/dna/web/jcr/rest/DnaJcrDeployer.java	2009-06-07 15:05:15 UTC (rev 988)
@@ -1,23 +1,58 @@
+/*
+ * 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.web.jcr.rest;
+
 import javax.servlet.ServletContextEvent;
 import javax.servlet.ServletContextListener;
+import org.jboss.dna.web.jcr.rest.spi.RepositoryProvider;
+import net.jcip.annotations.NotThreadSafe;
 
 
-
+/**
+ * Servlet context listener that is responsible for {@link RepositoryFactory#initialize(javax.servlet.ServletContext) initializing}
+ * the {@link RepositoryFactory repository factory}.
+ * <p>
+ * This class is not thread safe, but in practice this does not matter as the servlet container must ensure that only
+ * a single instance of this exists per web context and that it is only called in a single-threaded manner.
+ * </p>
+ * @see RepositoryFactory
+ */
+ at NotThreadSafe
 public class DnaJcrDeployer implements ServletContextListener {
 
-    public static final String DEFAULT_JNDI_NAME = "java:comp/env/org/jboss/dna/Engine";
-
-    public static final String SYSTEM_PROPERTY_JNDI_NAME = "org.jboss.dna.dnaEngineJndiName";
-
-    public static final String INIT_PARAMETER_JNDI_NAME = "org.jboss.dna.dnaEngineJndiName";
-
+    /**
+     * Alerts the repository factory that the web application is shutting down
+     * @see RepositoryFactory#shutdown()
+     * @see RepositoryProvider#shutdown()
+     */
     public void contextDestroyed( ServletContextEvent event ) {
         RepositoryFactory.shutdown();
     }
 
     /**
-     * Mounts a DNA engine
+     * Initializes the repository factory
+     * @see RepositoryFactory#initialize(javax.servlet.ServletContext)
      */
     public void contextInitialized( ServletContextEvent event ) {
         RepositoryFactory.initialize(event.getServletContext());

Modified: trunk/extensions/dna-web-jcr-rest/src/main/java/org/jboss/dna/web/jcr/rest/JcrResources.java
===================================================================
--- trunk/extensions/dna-web-jcr-rest/src/main/java/org/jboss/dna/web/jcr/rest/JcrResources.java	2009-06-07 00:20:55 UTC (rev 987)
+++ trunk/extensions/dna-web-jcr-rest/src/main/java/org/jboss/dna/web/jcr/rest/JcrResources.java	2009-06-07 15:05:15 UTC (rev 988)
@@ -55,6 +55,7 @@
 import javax.ws.rs.core.Response.Status;
 import javax.ws.rs.ext.ExceptionMapper;
 import javax.ws.rs.ext.Provider;
+import net.jcip.annotations.Immutable;
 import org.codehaus.jettison.json.JSONArray;
 import org.codehaus.jettison.json.JSONException;
 import org.codehaus.jettison.json.JSONObject;
@@ -108,6 +109,7 @@
  * </tr>
  * </table>
  */
+ at Immutable
 @Path( "/" )
 public class JcrResources {
 

Modified: trunk/extensions/dna-web-jcr-rest/src/main/java/org/jboss/dna/web/jcr/rest/RepositoryFactory.java
===================================================================
--- trunk/extensions/dna-web-jcr-rest/src/main/java/org/jboss/dna/web/jcr/rest/RepositoryFactory.java	2009-06-07 00:20:55 UTC (rev 987)
+++ trunk/extensions/dna-web-jcr-rest/src/main/java/org/jboss/dna/web/jcr/rest/RepositoryFactory.java	2009-06-07 15:05:15 UTC (rev 988)
@@ -1,3 +1,26 @@
+/*
+ * 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.web.jcr.rest;
 
 import java.util.Collection;
@@ -5,10 +28,33 @@
 import javax.jcr.Session;
 import javax.servlet.ServletContext;
 import javax.servlet.http.HttpServletRequest;
+import net.jcip.annotations.ThreadSafe;
+import org.jboss.dna.common.util.CheckArg;
 import org.jboss.dna.web.jcr.rest.spi.RepositoryProvider;
 
+/**
+ * Factory that provides implementations of the {@link RepositoryProvider repository provider SPI} by wrapping a
+ * {@link RepositoryProvider}.
+ * <p>
+ * The repository factory implements a lifecycle for the repository providers. It is first {@link #initialize(ServletContext)
+ * initialized} by {@link DnaJcrDeployer}, a servlet context listener that must be configured in the DNA JCR REST web
+ * configuration (web.xml). The repository factory looks in the context for a parameter with the name of {@link #PROVIDER_KEY}.
+ * This is assumed to be the FQN of the {@link RepositoryProvider repository provider}, which the factory will then instantiate.
+ * </p>
+ * <p>
+ * The repository factory is then able to respond to multiple requests to {@link #getJcrRepositoryNames() list the repository
+ * names} and {@link #getSession(HttpServletRequest, String, String) return active JCR sessions} until the {@link #shutdown()
+ * shutdown method} is called.
+ * </p>
+ * <p>
+ * The {@link #shutdown() shutdown method} is a simple proxy to the {@link RepositoryProvider#shutdown()} repository provider's
+ * shutdown method}.
+ * </p>
+ */
+ at ThreadSafe
 public class RepositoryFactory {
 
+    /** The FQN of the repository provider class. Currently set to {@value} . */
     public static final String PROVIDER_KEY = "org.jboss.dna.web.jcr.rest.REPOSITORY_PROVIDER";
 
     private static RepositoryProvider provider;
@@ -17,13 +63,20 @@
 
     }
 
+    /**
+     * Initializes the repository factory. For more details, please see the {@link RepositoryFactory class-level documentation}.
+     * 
+     * @param context the servlet context; may not be null
+     * @see RepositoryFactory
+     */
     static void initialize( ServletContext context ) {
+        CheckArg.isNotNull(context, "context");
         String className = context.getInitParameter(PROVIDER_KEY);
 
         try {
             Class<? extends RepositoryProvider> providerClass = Class.forName(className).asSubclass(RepositoryProvider.class);
             provider = providerClass.newInstance();
-            
+
         } catch (Exception ex) {
             throw new IllegalStateException(ex);
         }
@@ -31,7 +84,9 @@
         provider.startup(context);
     }
 
-    public static Session getSession( HttpServletRequest request, String repositoryName, String workspaceName) throws RepositoryException {
+    public static Session getSession( HttpServletRequest request,
+                                      String repositoryName,
+                                      String workspaceName ) throws RepositoryException {
         return provider.getSession(request, repositoryName, workspaceName);
     }
 

Modified: trunk/extensions/dna-web-jcr-rest/src/main/java/org/jboss/dna/web/jcr/rest/ServletSecurityContext.java
===================================================================
--- trunk/extensions/dna-web-jcr-rest/src/main/java/org/jboss/dna/web/jcr/rest/ServletSecurityContext.java	2009-06-07 00:20:55 UTC (rev 987)
+++ trunk/extensions/dna-web-jcr-rest/src/main/java/org/jboss/dna/web/jcr/rest/ServletSecurityContext.java	2009-06-07 15:05:15 UTC (rev 988)
@@ -1,13 +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.
+ */
 package org.jboss.dna.web.jcr.rest;
 
 import javax.servlet.http.HttpServletRequest;
+import net.jcip.annotations.ThreadSafe;
 import org.jboss.dna.common.util.CheckArg;
 import org.jboss.dna.graph.SecurityContext;
 
 /**
  * Servlet-based {@link SecurityContext security context} that assumes servlet-based authentication and provides authorization
  * through the {@link HttpServletRequest#isUserInRole(String) servlet role-checking mechanism}.
+ * <p>
+ * This security context is really only valid for the life of the {@link HttpServletRequest servlet request} and should
+ * only be used to support longer-lasting session scopes with great care. * 
+ * </p>
  */
+ at ThreadSafe
 public class ServletSecurityContext implements SecurityContext {
 
     private final String userName;

Modified: trunk/extensions/dna-web-jcr-rest/src/main/java/org/jboss/dna/web/jcr/rest/model/RepositoryEntry.java
===================================================================
--- trunk/extensions/dna-web-jcr-rest/src/main/java/org/jboss/dna/web/jcr/rest/model/RepositoryEntry.java	2009-06-07 00:20:55 UTC (rev 987)
+++ trunk/extensions/dna-web-jcr-rest/src/main/java/org/jboss/dna/web/jcr/rest/model/RepositoryEntry.java	2009-06-07 15:05:15 UTC (rev 988)
@@ -1,3 +1,26 @@
+/*
+ * 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.web.jcr.rest.model;
 
 import javax.xml.bind.annotation.XmlElement;

Modified: trunk/extensions/dna-web-jcr-rest/src/main/java/org/jboss/dna/web/jcr/rest/model/RepositoryResources.java
===================================================================
--- trunk/extensions/dna-web-jcr-rest/src/main/java/org/jboss/dna/web/jcr/rest/model/RepositoryResources.java	2009-06-07 00:20:55 UTC (rev 987)
+++ trunk/extensions/dna-web-jcr-rest/src/main/java/org/jboss/dna/web/jcr/rest/model/RepositoryResources.java	2009-06-07 15:05:15 UTC (rev 988)
@@ -1,3 +1,26 @@
+/*
+ * 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.web.jcr.rest.model;
 
 import javax.xml.bind.annotation.XmlElement;

Modified: trunk/extensions/dna-web-jcr-rest/src/main/java/org/jboss/dna/web/jcr/rest/model/WorkspaceEntry.java
===================================================================
--- trunk/extensions/dna-web-jcr-rest/src/main/java/org/jboss/dna/web/jcr/rest/model/WorkspaceEntry.java	2009-06-07 00:20:55 UTC (rev 987)
+++ trunk/extensions/dna-web-jcr-rest/src/main/java/org/jboss/dna/web/jcr/rest/model/WorkspaceEntry.java	2009-06-07 15:05:15 UTC (rev 988)
@@ -1,3 +1,26 @@
+/*
+ * 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.web.jcr.rest.model;
 
 import javax.xml.bind.annotation.XmlElement;

Modified: trunk/extensions/dna-web-jcr-rest/src/main/java/org/jboss/dna/web/jcr/rest/model/WorkspaceResources.java
===================================================================
--- trunk/extensions/dna-web-jcr-rest/src/main/java/org/jboss/dna/web/jcr/rest/model/WorkspaceResources.java	2009-06-07 00:20:55 UTC (rev 987)
+++ trunk/extensions/dna-web-jcr-rest/src/main/java/org/jboss/dna/web/jcr/rest/model/WorkspaceResources.java	2009-06-07 15:05:15 UTC (rev 988)
@@ -1,3 +1,26 @@
+/*
+ * 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.web.jcr.rest.model;
 
 import javax.xml.bind.annotation.XmlElement;

Added: trunk/extensions/dna-web-jcr-rest/src/main/java/org/jboss/dna/web/jcr/rest/model/package-info.java
===================================================================
--- trunk/extensions/dna-web-jcr-rest/src/main/java/org/jboss/dna/web/jcr/rest/model/package-info.java	                        (rev 0)
+++ trunk/extensions/dna-web-jcr-rest/src/main/java/org/jboss/dna/web/jcr/rest/model/package-info.java	2009-06-07 15:05:15 UTC (rev 988)
@@ -0,0 +1,28 @@
+/*
+ * 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.
+ */
+/**
+ * Models for the DNA interface to faciliate serving basic information as XML or JSON in the future.
+ */
+package org.jboss.dna.web.jcr.rest.model;
+


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

Added: trunk/extensions/dna-web-jcr-rest/src/main/java/org/jboss/dna/web/jcr/rest/package-info.java
===================================================================
--- trunk/extensions/dna-web-jcr-rest/src/main/java/org/jboss/dna/web/jcr/rest/package-info.java	                        (rev 0)
+++ trunk/extensions/dna-web-jcr-rest/src/main/java/org/jboss/dna/web/jcr/rest/package-info.java	2009-06-07 15:05:15 UTC (rev 988)
@@ -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.
+ */
+/**
+ * This package contains the core components for the DNA REST server implementation.
+ * <p>
+ * The key classes are:
+ * <ul>
+ * <li>{@link JcrResources} - the class that handles requests for valid URIs</li>
+ * <li>{@link JcrApplication} - the JAX-RS application class that indicates that JcrResources should be used to handle URIs</li>
+ * <li>{@link RepositoryFactory} - the interface to the DNA JCR SPI</li> 
+ * </ul>
+ * </p>
+ */
+package org.jboss.dna.web.jcr.rest;
+


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

Modified: trunk/extensions/dna-web-jcr-rest/src/main/java/org/jboss/dna/web/jcr/rest/spi/DnaJcrRepositoryProvider.java
===================================================================
--- trunk/extensions/dna-web-jcr-rest/src/main/java/org/jboss/dna/web/jcr/rest/spi/DnaJcrRepositoryProvider.java	2009-06-07 00:20:55 UTC (rev 987)
+++ trunk/extensions/dna-web-jcr-rest/src/main/java/org/jboss/dna/web/jcr/rest/spi/DnaJcrRepositoryProvider.java	2009-06-07 15:05:15 UTC (rev 988)
@@ -1,3 +1,26 @@
+/*
+ * 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.web.jcr.rest.spi;
 
 import java.io.IOException;
@@ -9,6 +32,7 @@
 import javax.jcr.Session;
 import javax.servlet.ServletContext;
 import javax.servlet.http.HttpServletRequest;
+import net.jcip.annotations.ThreadSafe;
 import org.jboss.dna.jcr.JcrConfiguration;
 import org.jboss.dna.jcr.JcrEngine;
 import org.jboss.dna.jcr.SecurityContextCredentials;
@@ -17,6 +41,18 @@
 import org.jboss.resteasy.spi.UnauthorizedException;
 import org.xml.sax.SAXException;
 
+/**
+ * Repository provider backed by the DNA JCR implementation.
+ * <p>
+ * The provider instantiates a {@link JcrEngine} that is {@link JcrConfiguration#loadFrom(InputStream) configured from} the file
+ * in the location specified by the servlet context parameter {@code org.jboss.dna.web.jcr.rest.CONFIG_FILE}. This location must
+ * be accessible by the classloader for this class.
+ * </p>
+ * 
+ * @see RepositoryProvider
+ * @see Class#getResourceAsStream(String)
+ */
+ at ThreadSafe
 public class DnaJcrRepositoryProvider implements RepositoryProvider {
 
     public static final String CONFIG_FILE = "org.jboss.dna.web.jcr.rest.CONFIG_FILE";
@@ -36,7 +72,7 @@
 
     public void startup( ServletContext context ) {
         String configFile = context.getInitParameter(CONFIG_FILE);
-        
+
         try {
             InputStream configFileInputStream = getClass().getResourceAsStream(configFile);
             jcrEngine = new JcrConfiguration().loadFrom(configFileInputStream).build();
@@ -62,26 +98,26 @@
      * @return an active session with the given workspace in the named repository
      * @throws RepositoryException if any other error occurs
      */
-    public Session getSession( HttpServletRequest request, 
-                                String repositoryName,
-                                String workspaceName ) throws RepositoryException {
+    public Session getSession( HttpServletRequest request,
+                               String repositoryName,
+                               String workspaceName ) throws RepositoryException {
         assert request != null;
-        assert request.getUserPrincipal() != null: "Request must be authorized";
+        assert request.getUserPrincipal() != null : "Request must be authorized";
 
         // Sanity check in case assertions are disabled
         if (request.getUserPrincipal() == null) {
             throw new UnauthorizedException("Client is not authorized");
         }
-        
+
         Repository repository;
-        
+
         try {
             repository = getRepository(repositoryName);
-            
+
         } catch (RepositoryException re) {
             throw new NotFoundException(re.getMessage(), re);
         }
-        
+
         return repository.login(new SecurityContextCredentials(new ServletSecurityContext(request)), workspaceName);
 
     }

Modified: trunk/extensions/dna-web-jcr-rest/src/main/java/org/jboss/dna/web/jcr/rest/spi/RepositoryProvider.java
===================================================================
--- trunk/extensions/dna-web-jcr-rest/src/main/java/org/jboss/dna/web/jcr/rest/spi/RepositoryProvider.java	2009-06-07 00:20:55 UTC (rev 987)
+++ trunk/extensions/dna-web-jcr-rest/src/main/java/org/jboss/dna/web/jcr/rest/spi/RepositoryProvider.java	2009-06-07 15:05:15 UTC (rev 988)
@@ -1,3 +1,26 @@
+/*
+ * 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.web.jcr.rest.spi;
 
 import java.util.Set;
@@ -7,13 +30,18 @@
 import javax.servlet.http.HttpServletRequest;
 
 /**
- * Interface for any class that provides access to one or more local JCR repositories. Repository providers must provide a public,
- * no-argument constructor.
+ * Interface for any class that provides access to one or more local JCR repositories.
+ * <p>
+ * Repository providers must provide a public, no-argument constructor and be thread-safe.
+ * </p>
  */
 public interface RepositoryProvider {
 
     /**
      * Returns an active session for the given workspace name in the named repository.
+     * <p>
+     * JCR implementations that do not support multiple repositories on the same server can ignore the repositoryName parameter.
+     * </p>
      * 
      * @param request the servlet request; may not be null or unauthenticated
      * @param repositoryName the name of the repository in which the session is created
@@ -21,27 +49,32 @@
      * @return an active session with the given workspace in the named repository
      * @throws RepositoryException if any other error occurs
      */
-    public Session getSession( HttpServletRequest request, 
-                                String repositoryName,
-                                String workspaceName ) throws RepositoryException;
-    
+    public Session getSession( HttpServletRequest request,
+                               String repositoryName,
+                               String workspaceName ) throws RepositoryException;
+
     /**
      * Returns the available repository names
+     * <p>
+     * JCR implementations that do not support multiple repositories on the same server should provide a singleton set containing
+     * some default repository name.
+     * </p>
      * 
-     * @return the available repository names; may not be null
+     * @return the available repository names; may not be null or empty
      */
     Set<String> getJcrRepositoryNames();
 
     /**
-     * Signals the repository provider that it should initialize itself based on the provided {@link ServletContext servlet context}
-     * and begin accepting connections.
+     * Signals the repository provider that it should initialize itself based on the provided {@link ServletContext servlet
+     * context} and begin accepting connections.
      * 
      * @param context the servlet context for the REST servlet
      */
-    void startup(ServletContext context);
+    void startup( ServletContext context );
+
     /**
-     * Signals the repository provider that it should complete any pending transactions, shutdown, and release
-     * any external resource held.
+     * Signals the repository provider that it should complete any pending transactions, shutdown, and release any external
+     * resource held.
      */
     void shutdown();
 

Added: trunk/extensions/dna-web-jcr-rest/src/main/java/org/jboss/dna/web/jcr/rest/spi/package-info.java
===================================================================
--- trunk/extensions/dna-web-jcr-rest/src/main/java/org/jboss/dna/web/jcr/rest/spi/package-info.java	                        (rev 0)
+++ trunk/extensions/dna-web-jcr-rest/src/main/java/org/jboss/dna/web/jcr/rest/spi/package-info.java	2009-06-07 15:05:15 UTC (rev 988)
@@ -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.
+ */
+/**
+ * Service provider interface (SPI) for the JCR implementation that backs the DNA JCR REST server.
+ * <p>
+ * Service providers must provide a thread-safe implementation of the {@link RepositoryProvider} interface
+ * which is then bundled in the server WAR.  The REST server can be configured to use the provider by specifying
+ * the fully-qualified name (FQN) of the custom repository provider class in the {@code org.jboss.dna.web.jcr.rest.REPOSITORY_PROVIDER} context parameter
+ * in the web configuration file (web.xml).   
+ * </p>
+ * <p>
+ * Custom repository providers for JCR implementations that do not support hosting multiple repositories in the same server
+ * can context can ignore the {@code repositoryName} parameter for {@link RepositoryProvider#getSession(javax.servlet.http.HttpServletRequest, String, String)},
+ * but must always return a non-empty, non-null set containing some default repository name from {@link RepositoryProvider#getJcrRepositoryNames()}.
+ * </p>
+ * 
+ * @see org.jboss.dna.web.jcr.rest.RepositoryFactory
+ * @see org.jboss.dna.web.jcr.rest.spi.RepositoryProvider
+ */
+package org.jboss.dna.web.jcr.rest.spi;
+


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

Modified: trunk/extensions/dna-web-jcr-rest-war/src/test/java/org/jboss/dna/web/jcr/rest/JcrResourcesTest.java
===================================================================
--- trunk/extensions/dna-web-jcr-rest-war/src/test/java/org/jboss/dna/web/jcr/rest/JcrResourcesTest.java	2009-06-07 00:20:55 UTC (rev 987)
+++ trunk/extensions/dna-web-jcr-rest-war/src/test/java/org/jboss/dna/web/jcr/rest/JcrResourcesTest.java	2009-06-07 15:05:15 UTC (rev 988)
@@ -42,6 +42,12 @@
 import org.junit.Before;
 import org.junit.Test;
 
+/**
+ * Test of the DNA JCR REST resource.  Note that this test case uses a very low-level API to construct
+ * requests and deconstruct the responses.  Users are encouraged to use a higher-level library to communicate
+ * with the REST server (e.g., Apache HTTP Commons).
+ *
+ */
 public class JcrResourcesTest {
 
     private static final String SERVER_CONTEXT = "/resources";



From dna-commits at lists.jboss.org  Sun Jun  7 18:33:47 2009
From: dna-commits at lists.jboss.org (dna-commits at lists.jboss.org)
Date: Sun, 07 Jun 2009 18:33:47 -0400
Subject: [dna-commits] DNA SVN: r989 - in trunk/docs:
	examples/gettingstarted/sequencers/src/main/java/org/jboss/example/dna/sequencer
	and 3 other directories.
Message-ID: <E1MDQvz-0004bI-NV@committer01.frg.pub.inap.atl.jboss.com>

Author: rhauch
Date: 2009-06-07 18:33:45 -0400 (Sun, 07 Jun 2009)
New Revision: 989

Added:
   trunk/docs/gettingstarted/src/main/docbook/en-US/content/conclusion.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
Removed:
   trunk/docs/gettingstarted/src/main/docbook/en-US/content/custom_sequencers.xml
   trunk/docs/gettingstarted/src/main/docbook/en-US/content/future.xml
   trunk/docs/gettingstarted/src/main/docbook/en-US/content/understanding_dna.xml
   trunk/docs/gettingstarted/src/main/docbook/en-US/content/using_dna_for_sequencing.xml
   trunk/docs/gettingstarted/src/main/docbook/en-US/content/using_dna_repositories.xml
Modified:
   trunk/docs/examples/gettingstarted/repositories/src/main/java/org/jboss/example/dna/repository/ConsoleInput.java
   trunk/docs/examples/gettingstarted/repositories/src/main/java/org/jboss/example/dna/repository/RepositoryClient.java
   trunk/docs/examples/gettingstarted/sequencers/src/main/java/org/jboss/example/dna/sequencer/SequencingClient.java
   trunk/docs/gettingstarted/src/main/docbook/en-US/content/author_group.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/master.xml
   trunk/docs/reference/src/main/docbook/en-US/content/development_tools.xml
Log:
DNA-389 Updated the Getting Started document to reflect the new configuration approach, and restructured the document to better focus on the examples and high-level introduction, leaving the more detailed discussions for the Reference Guide (and removing more of the duplication).

Modified: trunk/docs/examples/gettingstarted/repositories/src/main/java/org/jboss/example/dna/repository/ConsoleInput.java
===================================================================
--- trunk/docs/examples/gettingstarted/repositories/src/main/java/org/jboss/example/dna/repository/ConsoleInput.java	2009-06-07 15:05:15 UTC (rev 988)
+++ trunk/docs/examples/gettingstarted/repositories/src/main/java/org/jboss/example/dna/repository/ConsoleInput.java	2009-06-07 22:33:45 UTC (rev 989)
@@ -125,14 +125,13 @@
                         try {
                             // Terminate ...
                             System.out.println();
-                            System.out.print("done.\nShutting down repositories and services ... ");
+                            System.out.print("done.\nShutting down repositories ... ");
                             client.shutdown();
                             System.out.print("done.");
                             System.out.println();
                             System.out.println();
                         } catch (Exception err) {
-                            System.out.println("Error shutting down sequencing service and repository: "
-                                               + err.getLocalizedMessage());
+                            System.out.println("Error shutting down repository: " + err.getLocalizedMessage());
                             err.printStackTrace(System.err);
                         }
                     }

Modified: trunk/docs/examples/gettingstarted/repositories/src/main/java/org/jboss/example/dna/repository/RepositoryClient.java
===================================================================
--- trunk/docs/examples/gettingstarted/repositories/src/main/java/org/jboss/example/dna/repository/RepositoryClient.java	2009-06-07 15:05:15 UTC (rev 988)
+++ trunk/docs/examples/gettingstarted/repositories/src/main/java/org/jboss/example/dna/repository/RepositoryClient.java	2009-06-07 22:33:45 UTC (rev 989)
@@ -202,7 +202,7 @@
         if (loginContext == null) {
             if (jaasContextName != null) {
                 loginContext = new LoginContext(jaasContextName, this.userInterface.getCallbackHandler());
-                loginContext.login();
+                loginContext.login(); // This authenticates the user
             }
         }
         return loginContext;

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	2009-06-07 15:05:15 UTC (rev 988)
+++ trunk/docs/examples/gettingstarted/sequencers/src/main/java/org/jboss/example/dna/sequencer/SequencingClient.java	2009-06-07 22:33:45 UTC (rev 989)
@@ -68,7 +68,7 @@
             throw new IllegalStateException(ex);
         }
 
-        // Configure the DNA JCR engine. This could be done by loading a configuration from a file, or by
+        // 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 example uses the programmatic approach...
         String repositoryId = "content";

Modified: trunk/docs/gettingstarted/src/main/docbook/en-US/content/author_group.xml
===================================================================
--- trunk/docs/gettingstarted/src/main/docbook/en-US/content/author_group.xml	2009-06-07 15:05:15 UTC (rev 988)
+++ trunk/docs/gettingstarted/src/main/docbook/en-US/content/author_group.xml	2009-06-07 22:33:45 UTC (rev 989)
@@ -24,7 +24,10 @@
   ~ 51 Franklin Street, Fifth Floor
   ~ Boston, MA  02110-1301  USA
   -->
-<!DOCTYPE authorgroup PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN" "http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd">
+<!DOCTYPE authorgroup 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;
+]>
 <authorgroup>
   <corpauthor>Randall M. Hauch</corpauthor>
   <corpauthor>John Verhaeg</corpauthor>

Added: trunk/docs/gettingstarted/src/main/docbook/en-US/content/conclusion.xml
===================================================================
--- trunk/docs/gettingstarted/src/main/docbook/en-US/content/conclusion.xml	                        (rev 0)
+++ trunk/docs/gettingstarted/src/main/docbook/en-US/content/conclusion.xml	2009-06-07 22:33:45 UTC (rev 989)
@@ -0,0 +1,75 @@
+<?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 chapter 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="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
+		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.
+	</para>
+	<para>
+		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="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.
+	</para>
+	<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.
+		</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
+		  <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!
+		</para>
+	</sect1>
+</chapter>


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

Deleted: trunk/docs/gettingstarted/src/main/docbook/en-US/content/custom_sequencers.xml
===================================================================
--- trunk/docs/gettingstarted/src/main/docbook/en-US/content/custom_sequencers.xml	2009-06-07 15:05:15 UTC (rev 988)
+++ trunk/docs/gettingstarted/src/main/docbook/en-US/content/custom_sequencers.xml	2009-06-07 22:33:45 UTC (rev 989)
@@ -1,346 +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
-  -->
-<!DOCTYPE chapter PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN" "http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd">
-<chapter 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
-  sequencers and to then configure JBoss DNA to use them in your own application.
-  </para>
-  <para>
-  Creating a custom sequencer involves the following steps:
-  <itemizedlist>
-    <listitem>
-      <para>Create a Maven 2 project for your sequencer;</para>
-    </listitem>
-    <listitem>
-      <para>Implement the <code>org.jboss.dna.spi.sequencers.StreamSequencer</code> interface with your own implementation, and create unit tests to verify
-      the functionality and expected behavior;</para>
-    </listitem>
-    <listitem>
-      <para>Add the sequencer configuration to the JBoss DNA <code>SequencingService</code> in your application
-      as described in the <link linkend="using_dna">previous chapter</link>; and</para>
-    </listitem>
-    <listitem>
-      <para>Deploy the JAR file with your implementation (as well as any dependencies), and make them available to JBoss DNA
-      in your application.</para>
-    </listitem>
-  </itemizedlist>
-  It's that simple.
-  </para>
-  <sect1 id="custom_sequencer_project">
-    <title>Creating the Maven 2 project</title>
-    <para>The first step is to create the Maven 2 project that you can use to compile your code and build the JARs.
-    Maven 2 automates a lot of the work, and since you're already <link linkend="downloading_and_running">set up to use Maven</link>,
-    using Maven for your project will save you a lot of time and effort.  Of course, you don't have to use Maven 2, but then you'll
-    have to get the required libraries and manage the compiling and building process yourself.</para>
-    <note>
-      <para>JBoss DNA may provide in the future a Maven archetype for creating sequencer projects.  If you'd find this useful
-        and would like to help create it, please <link linkend="preface">join the community</link>.</para>
-    </note>
-  <note>
-    <para>The <code>dna-sequencer-images</code> project is a small, self-contained sequencer implementation that
-    has only the minimal dependencies.  Starting with this project's source and modifying it to suit your needs may be the easiest way to get started.
-    See the subversion repository: <ulink url="http://anonsvn.jboss.org/repos/dna/trunk/extensions/dna-sequencer-images/">http://anonsvn.jboss.org/repos/dna/trunk/sequencers/dna-sequencer-images/</ulink>
-    </para>
-  </note>
-    <para>You can create your Maven project any way you'd like.  For examples, see the <ulink url="http://maven.apache.org/guides/getting-started/index.html#How_do_I_make_my_first_Maven_project">Maven 2 documentation</ulink>.  
-    Once you've done that, just add the dependencies in your project's <code>pom.xml</code> dependencies section:</para>
-  	<programlisting role="XML"><![CDATA[
-<dependency>
-  <groupId>org.jboss.dna</groupId>
-  <artifactId>dna-common</artifactId>
-  <version>0.5</version>
-</dependency>
-<dependency>
-  <groupId>org.slf4j</groupId>
-  <artifactId>slf4j-api</artifactId>
-</dependency>
- ]]></programlisting>
-		<para>These are minimum dependencies required for compiling a sequencer.  Of course, you'll have to add
-  		other dependencies that your sequencer needs.</para>
-  	<para>As for testing, you probably will want to add more dependencies, such as those listed here:</para>
-		<programlisting role="XML"><![CDATA[
-<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>
-<!-- Logging with Log4J -->
-<dependency>
-  <groupId>org.slf4j</groupId>
-  <artifactId>slf4j-log4j12</artifactId>
-  <version>1.4.3</version>
-  <scope>test</scope>
-</dependency>
-<dependency>
-  <groupId>log4j</groupId>
-  <artifactId>log4j</artifactId>
-  <version>1.2.14</version>
-  <scope>test</scope>
-</dependency>
- ]]></programlisting>
-  	<para>Testing JBoss DNA sequencers does not require a JCR repository or the JBoss DNA services.  (For more detail,
-  		see the <link linkend="testing_custom_sequencers">testing section</link>.)  However, if you want to do
-  		integration testing with a JCR repository and the JBoss DNA services, you'll need additional dependencies for these libraries.</para>
-		<programlisting role="XML"><![CDATA[
-<!-- JBoss DNA JCR Repository -->
-<dependency>
-  <groupId>org.jboss.dna</groupId>
-  <artifactId>dna-jcr</artifactId>
-  <version>0.5</version>
-  <scope>test</scope>
-</dependency>
-<!-- Java Content Repository API -->
-<dependency>
-  <groupId>javax.jcr</groupId>
-  <artifactId>jcr</artifactId>
-  <version>1.0.1</version>
-  <scope>test</scope>
-</dependency>
- ]]></programlisting>
-  <para>At this point, your project should be set up correctly, and you're ready to move on to 
-  	<link linkend="custom_sequencer_implementation">writing the Java implementation</link> for your sequencer.</para>
-  </sect1>
-  <sect1 id="custom_sequencer_implementation">
-    <title>Implementing the StreamSequencer interface</title>
-    <para>After creating the project and setting up the dependencies, the next step is to create a Java class that implements
-    	the <code>org.jboss.dna.spi.sequencers.StreamSequencer</code> interface.  This interface is very straightforward
-    	and involves a single method:</para>
-    <programlisting role="JAVA"><![CDATA[
-public interface StreamSequencer {
-
-    /**
-     * Sequence the data found in the supplied stream, placing the output 
-     * information into the supplied map.
-     *
-     * @param stream the stream with the data to be sequenced; never null
-     * @param output the output from the sequencing operation; never null
-     * @param context the context for the sequencing operation; never null
-     */
-    void sequence( InputStream stream, SequencerOutput output, SequencerContext context );
- ]]></programlisting>
-    <para>The job of a stream sequencer is to process the data in the supplied stream, and place into the <code>SequencerOutput</code> 
-    any information that is to go into the JCR repository.  JBoss DNA figures out when your sequencer should be called
-    (of course, using the sequencing configuration you'll add in a bit), and then makes sure the generated information
-    is saved in the correct place in the repository.  
-    </para>
-    <para>The <code>SequencerContext</code> provides information about
-    the current sequencing operation, including the location and properties of the node being sequenced, the MIME type
-    of the node being sequenced, and a location to record problems that aren't severe enough to warrant throwing an exception.
-    </para>
-    <para>The <code>SequencerOutput</code> class is fairly easy to use.  There are basically two methods you need to call.
-    One method sets the property values, while the other sets references to other nodes in the repository.  Use these
-    methods to describe the properties of the nodes you want to create, using relative paths for the nodes and
-    valid JCR property names for properties and references.  JBoss DNA will ensure that nodes are created or updated
-    whenever they're needed.</para>
-    <programlisting role="JAVA"><![CDATA[
-public interface SequencerOutput {
-
-  /**
-   * Set the supplied property on the supplied node.  The allowable
-   * values are any of the following:
-   *   - primitives (which will be autoboxed)
-   *   - String instances
-   *   - String arrays
-   *   - byte arrays
-   *   - InputStream instances
-   *   - Calendar instances
-   *
-   * @param nodePath the path to the node containing the property; 
-   * may not be null
-   * @param property the name of the property to be set
-   * @param values the value(s) for the property; may be empty if 
-   * any existing property is to be removed
-   */
-  void setProperty( String nodePath, String property, Object... values );
-
-  /**
-   * Set the supplied reference on the supplied node.
-   *
-   * @param nodePath the path to the node containing the property; 
-   * may not be null
-   * @param property the name of the property to be set
-   * @param paths the paths to the referenced property, which may be
-   * absolute paths or relative to the sequencer output node;
-   * may be empty if any existing property is to be removed
-   */
-  void setReference( String nodePath, String property, String... paths );
-}
- ]]></programlisting>
-    <para>JBoss DNA will create nodes of type <code>nt:unstructured</code> unless you specify the value for the
-      <code>jcr:primaryType</code> property.  You can also specify the values for the <code>jcr:mixinTypes</code> property
-      if you want to add mixins to any node.</para>
-    <para>For a complete example of a sequencer, let's look at the <code>org.jboss.dna.sequencers.image.ImageMetadataSequencer</code> 
-			implementation:</para>
-    <programlisting role="JAVA"><![CDATA[
-public class ImageMetadataSequencer implements StreamSequencer {
-
-    public static final String METADATA_NODE = "image:metadata";
-    public static final String IMAGE_PRIMARY_TYPE = "jcr:primaryType";
-    public static final String IMAGE_MIXINS = "jcr:mixinTypes";
-    public static final String IMAGE_MIME_TYPE = "jcr:mimeType";
-    public static final String IMAGE_ENCODING = "jcr:encoding";
-    public static final String IMAGE_FORMAT_NAME = "image:formatName";
-    public static final String IMAGE_WIDTH = "image:width";
-    public static final String IMAGE_HEIGHT = "image:height";
-    public static final String IMAGE_BITS_PER_PIXEL = "image:bitsPerPixel";
-    public static final String IMAGE_PROGRESSIVE = "image:progressive";
-    public static final String IMAGE_NUMBER_OF_IMAGES = "image:numberOfImages";
-    public static final String IMAGE_PHYSICAL_WIDTH_DPI = "image:physicalWidthDpi";
-    public static final String IMAGE_PHYSICAL_HEIGHT_DPI = "image:physicalHeightDpi";
-    public static final String IMAGE_PHYSICAL_WIDTH_INCHES = "image:physicalWidthInches";
-    public static final String IMAGE_PHYSICAL_HEIGHT_INCHES = "image:physicalHeightInches";
-
-    /**
-     * {@inheritDoc}
-     */
-    public void sequence( InputStream stream, SequencerOutput output, 
-                          SequencerContext context ) {
-        ImageMetadata metadata = new ImageMetadata();
-        metadata.setInput(stream);
-        metadata.setDetermineImageNumber(true);
-        metadata.setCollectComments(true);
-
-        // Process the image stream and extract the metadata ...
-        if (!metadata.check()) {
-            metadata = null;
-        }
-
-        // Generate the output graph if we found useful metadata ...
-        if (metadata != null) {
-            // Place the image metadata into the output map ...
-            output.setProperty(METADATA_NODE, IMAGE_PRIMARY_TYPE, "image:metadata");
-            // output.psetProperty(METADATA_NODE, IMAGE_MIXINS, "");
-            output.setProperty(METADATA_NODE, IMAGE_MIME_TYPE, metadata.getMimeType());
-            // output.setProperty(METADATA_NODE, IMAGE_ENCODING, "");
-            output.setProperty(METADATA_NODE, IMAGE_FORMAT_NAME, metadata.getFormatName());
-            output.setProperty(METADATA_NODE, IMAGE_WIDTH, metadata.getWidth());
-            output.setProperty(METADATA_NODE, IMAGE_HEIGHT, metadata.getHeight());
-            output.setProperty(METADATA_NODE, IMAGE_BITS_PER_PIXEL, metadata.getBitsPerPixel());
-            output.setProperty(METADATA_NODE, IMAGE_PROGRESSIVE, metadata.isProgressive());
-            output.setProperty(METADATA_NODE, IMAGE_NUMBER_OF_IMAGES, metadata.getNumberOfImages());
-            output.setProperty(METADATA_NODE, IMAGE_PHYSICAL_WIDTH_DPI, metadata.getPhysicalWidthDpi());
-            output.setProperty(METADATA_NODE, IMAGE_PHYSICAL_HEIGHT_DPI, metadata.getPhysicalHeightDpi());
-            output.setProperty(METADATA_NODE, IMAGE_PHYSICAL_WIDTH_INCHES, metadata.getPhysicalWidthInch());
-            output.setProperty(METADATA_NODE, IMAGE_PHYSICAL_HEIGHT_INCHES, metadata.getPhysicalHeightInch());
-        }
-    }
-}
- ]]></programlisting>
-    <para>
-    Notice how the image metadata is extracted and the output graph is generated.  A single node is created with the name <code>image:metadata</code>
-    and with the <code>image:metadata</code> node type.  No mixins are defined for the node, but several properties are set on the node
-    using the values obtained from the image metadata.  After this method returns, the constructed graph will be saved to the repository
-    in all of the places defined by its configuration.  (This is why only relative paths are used in the sequencer.)
-	</para>
-  </sect1>
-  <sect1 id="testing_custom_sequencers">
-    <title>Testing custom sequencers</title>
-    <para>The sequencing framework was designed to make testing sequencers much easier.  In particular, the
-    <code>StreamSequencer</code> interface does not make use of the JCR API.  So instead of requiring a fully-configured
-    JCR repository and JBoss DNA system, unit tests for a sequencer can focus on testing that the content is
-    processed correctly and the desired output graph is generated.</para>
-    <note>
-      <para>For a complete example of a sequencer unit test, see the <code>ImageMetadataSequencerTest</code> unit test
-      in the <code>org.jboss.dna.sequencer.images</code> package of the <code>dna-sequencers-image</code> project.
-      </para>
-    </note>
-    <para>The following code fragment shows one way of testing a sequencer, using JUnit 4.4 assertions and 
-      some of the classes made available by JBoss DNA.  Of course,
-      this example code does not do any error handling and does not make all the assertions a real test would.</para>
-    <programlisting role="JAVA"><![CDATA[
-Sequencer sequencer = new ImageMetadataSequencer();
-MockSequencerOutput output = new MockSequencerOutput();
-MockSequencerContext context = new MockSequencerContext();
-InputStream stream = null;
-try {
-    stream = this.getClass().getClassLoader().getResource("caution.gif").openStream();
-    sequencer.sequence(stream,output,context);   // writes to 'output'
-    assertThat(output.getPropertyValues("image:metadata", "jcr:primaryType"), 
-               is(new Object[] {"image:metadata"}));
-    assertThat(output.getPropertyValues("image:metadata", "jcr:mimeType"), 
-               is(new Object[] {"image/gif"}));
-    // ... make more assertions here
-    assertThat(output.hasReferences(), is(false));
-} finally {
-    stream.close();
-}
- ]]></programlisting>
-  <para>It's also useful to test that a sequencer produces no output for something it should not understand:</para>
-    <programlisting role="JAVA"><![CDATA[
-Sequencer sequencer = new ImageMetadataSequencer();
-MockSequencerOutput output = new MockSequencerOutput();
-MockSequencerContext context = new MockSequencerContext();
-InputStream stream = null;
-try {
-    stream = this.getClass().getClassLoader().getResource("caution.pict").openStream();
-    sequencer.sequence(stream,output,context);   // writes to 'output'
-    assertThat(output.hasProperties(), is(false));
-    assertThat(output.hasReferences(), is(false));
-} finally {
-    stream.close();
-}
- ]]></programlisting>
-    <para>These are just two simple tests that show ways of testing a sequencer.  Some tests may get quite involved,
-    especially if a lot of output data is produced.  
-    </para>
-    <para>It may also be useful to create some integration tests
-    that <link linkend="using_dna">configure JBoss DNA</link> to use a custom sequencer, and to then upload
-    content using the JCR API, verifying that the custom sequencer did run.  However, remember that JBoss DNA
-    runs sequencers asynchronously in the background, and you must sychronize your tests to ensure that the
-    sequencers have a chance to run before checking the results.  (One way of doing this (although, granted, not always reliable) is to wait for a second
-    after uploading your content, shutdown the <code>SequencingService</code> and await its termination,
-    and then check that the sequencer output has been saved to the JCR repository.  For an example of this technique,
-    see the <code>SequencingClientTest</code> unit test in the example application.)
-    </para>  
-  </sect1>
-  <sect1 id="deploying_custom_sequencers">
-    <title>Deploying custom sequencers</title>
-    <para>The first step of deploying a sequencer consists of adding/changing the sequencer configuration (e.g., <code>SequencerConfig</code>)
-    in the <code>SequencingService</code>.  This was covered in the <link linkend="sequencing_service">previous chapter</link>.
-    </para>
-    <para>
-    The second step is to make the sequencer implementation available to JBoss DNA.  At this time, the JAR containing 
-    your new sequencer, as well as any JARs that your sequencer depends on, should be placed on your application classpath.</para>
-    <note>
-      <para>A future goal of JBoss DNA is to allow sequencers, connectors, and other extensions to be easily deployed into
-        a runtime repository.  This process will not only be much simpler, but it will also provide JBoss DNA 
-        with the information necessary to update configurations and create the appropriate class loaders for each extension.
-        Having separate class loaders for each extension helps prevent the pollution of the common classpath, 
-        facilitates an isolated runtime environment to eliminate any dependency conflicts, and may potentially
-        enable hot redeployment of newer extension versions.
-      </para>
-    </note>
-  </sect1>
-</chapter>

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	2009-06-07 15:05:15 UTC (rev 988)
+++ trunk/docs/gettingstarted/src/main/docbook/en-US/content/downloading_and_running.xml	2009-06-07 22:33:45 UTC (rev 989)
@@ -24,14 +24,17 @@
   ~ 51 Franklin Street, Fifth Floor
   ~ Boston, MA  02110-1301  USA
   -->
-<!DOCTYPE chapter PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN" "http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd">
+<!DOCTYPE chapter 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="downloading_and_running">
 	<title>Running the example applications</title>
 	<para>
     This chapter provides instructions for downloading and running a sample application that demonstrates how JBoss DNA works
     with a JCR repository to automatically sequence changing content to extract useful information. So read on to get the simple
-    application running, and then in the <link linkend="using_dna">next chapter</link>
-    we'll dive into the source code for the example and show how to use JBoss DNA in your own applications. </para>
+    application running.
+  </para>
 	<para>JBoss DNA uses Maven 2 for its build system, as is 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
@@ -244,165 +247,10 @@
 			</itemizedlist>
     </para>
 	</sect1>
-	<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>
-		<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">
-				<title>Example client</title>
-				<graphic align="center" scale="100" fileref="example-sequencer-client.png"/>
-			</figure>
-      From this menu, you can upload a file into the repository, search for media in the repository, print sequencing statistics,
-      or quit the application.</para>
-		<para>
-      The first step is to upload one of the example images. If you type 'u' and press return, you'll be prompted to supply the
-      path to the file you want to upload. Since the application is running from within the
-      <code>examples/sequencers/target/dna-example-sequencers-basic.dir/</code> directory, you can specify any of the files 
-			in that directory without specifying the path:
-      <figure id="example-sequencer-upload">
-				<title>Uploading an image using the example client</title>
-				<graphic align="center" scale="100" 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
-      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>.
- 			Files with other extensions in the repository path will be ignored. For your convenience, the example provides several
-      files that will be sequenced (<code>caution.png</code>, <code>caution.jpg</code>, <code>caution.gif</code>, and
-      <code>sample1.mp3</code>) and one image that will not be sequenced (<code>caution.pict</code>). Feel free to try other files.
-    </para>
-		<para>
-      After you have specified the file you want to upload, the example application asks you where in the repository you'd like to
-      place the file. (If you want to use the suggested location, just press <code>return</code>.) The client application
-      uses the JCR API to upload the file to that location in the repository, creating any nodes (of type <code>nt:folder</code>)
-      for any directories that don't exist, and creating a node (of type <code>nt:file</code>) for the file. And, per the JCR specification, 
-			the application creates a <code>jcr:content</code> node (of type <code>nt:resource</code>) under the file node. 
-			The file contents are placed on this <code>jcr:content</code> node in the <code>jcr:data</code> property. For example, if you specify
-      <code>/a/b/caution.png</code>, the following structure will be created in the repository:</para>
-		<programlisting><![CDATA[
-/a   (nt:folder)
-  /b   (nt:folder)
-    /caution.png   (nt:file)
-                /jcr:content    (nt:resource)
-                            @jcr:data = {contents of the file}
-                            @jcr:mimeType = {mime type of the file}
-                            @jcr:lastModified = {now}
-]]></programlisting>
-    <para>Other kinds of files are treated in a similar way.</para>
-		<para>When the client uploads the file using the JCR API, DNA gets notified of the changes, consults the sequencers to see whether
-    	any of them are interested in the new or updated content, and if so runs those sequencers. The image sequencer processes image
-    	files for metadata, and any metadata found is stored under the <code>/images</code> branch of the repository. The MP3 sequencer 
-			processes MP3 audio files for metadata, and any metadata found is stored under the <code>/mp3s</code>
-    	branch of the repository.  And metadata about Java classes are stored under the <code>/java</code> area of the repository.
-      All of this happens asynchronously, so any DNA activity doesn't impede or slow down the client activities.
-    </para>
-		<para>So, after the file is uploaded, you can search the repository for the image metadata using the "s" menu option:
-    	<figure id="example-sequencer-search">
-				<title>Searching for media using the example client</title>
-				<graphic align="center" scale="100" fileref="example-sequencer-search.png"/>
-			</figure>
-    	Here are the search results after the <code>sample1.mp3</code> audio file has been uploaded (to the <code>/a/b/sample1.mp3</code> location):
-    	<figure id="example-sequencer-search-with-mp3">
-				<title>Searching for media using the example client</title>
-				<graphic align="center" scale="100" fileref="example-sequencer-search-with-mp3.png"/>
-			</figure>
-    	You can also display the sequencing statistics using the "d" menu option:
-    	<figure id="example-sequencer-statistics">
-				<title>Sequencing statistics using the example client</title>
-				<graphic align="center" scale="100" fileref="example-sequencer-statistics.png"/>
-			</figure>
-    	These stats show how many nodes were sequenced, and how many nodes were skipped because they didn't apply to the sequencer's
-    	criteria.
-  	</para>
-		<note>
-			<para>There will probably be more nodes skipped than sequenced, since there are more <code>nt:folder</code> and <code>nt:resource</code>
-      	nodes than there are <code>nt:file</code> nodes with acceptable names.</para>
-		</note>
-		<para>You can repeat this process with other files. Any file that isn't an image or MP3 files (as recognized by the sequencing configurations
-    	that we'll describe later) will not be sequenced.</para>
+	<sect1 id="downloading_and_running_whats_next">
+		<title>What's next</title>
+		<para>In this chapter you downloaded, installed, and built the two example applications.  In the next two chapters, we'll
+			run these examples and walk through the code.
+		</para>
 	</sect1>
-	<sect1 id="running_repository_example">
-		<title>Running the repository example</title>
-		<para>The repository example consists of a client application that sets up two DNA repositories (named "Cars" and "Airplanes") and 
-			a federated repository ("Vehicles") that dynamically federates the information from the other two 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:
-	  	<figure id="example-repositories">
-				<title>Repositories used in the example client</title>
-				<graphic align="center" scale="100" fileref="example-repositories.png"/>
-			</figure>
-			Most of the repositories are in-memory repositories (using the In-Memory repository connector), but 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">
-				<title>Vehicles repository content is federated from the Cars, Airplanes and Configuration repositories</title>
-				<graphic align="center" scale="100" fileref="example-federated-repository.png"/>
-			</figure>
-	  </para>
-		<para>
-      To run the client application, go to the <code>examples/repository/target/dna-example-repositories-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="example-repositories-client">
-				<title>Example Client</title>
-				<graphic align="center" scale="100" fileref="example-repositories-client.png"/>
-			</figure>
-      From this menu, you can see the list of repositories, select one, and navigate through that repository in a manner similar
-      to a *nix command-line shell (although the client itself uses the JCR API to interact with the repositories).
-      Here are some of the commands you can use:</para>
-			<table frame='all'>
-				<title>Repository client commands to navigate a repository</title>
-				<tgroup cols='2' align='left' colsep='1' rowsep='1'>
-		      <colspec colname='c1' colwidth="1*"/>
-		      <colspec colname='c2' colwidth="1*"/>
-					<thead>
-						<row><entry>Command</entry><entry>Description</entry></row>
-					</thead>
-					<tbody>
-						<row><entry>pwd</entry><entry>Print the path of the current node (e.g., the "working directory")</entry></row>
-						<row><entry>ls [<emphasis>path</emphasis>]</entry><entry>List the children and properties of the node at the supplied path,
-						     where "<emphasis>path</emphasis>" can be any relative path or absolute path.  If "<emphasis>path</emphasis>" is not supplied,
-						     the current working node's path is used.</entry></row>
-						<row><entry>cd <emphasis>path</emphasis></entry><entry>Change to the specified node, where "<emphasis>path</emphasis>"
-						     can be any relative path or absolute path.  For example, "<code>cd alpha</code>" changes the current node to be a child named
-						     "<code>alpha</code>"; "<code>cd ..</code>" changes the current node to the parent node; "<code>cd /a/b</code>" changes 
-						     the current node to be the "<code>/a/b</code>" node.</entry></row>
-						<row><entry>exit</entry><entry>Exit this repository and return the list of repositories.</entry></row>
-					</tbody>
-				</tgroup>
-			</table>
-			<para>If you were to select the "Cars" repository and use some of the commands, you should see something similar to: 
-	      <figure id="example-repositories-navigating">
-					<title>Navigating the Cars repository</title>
-					<graphic align="center" scale="100" fileref="example-repositories-navigating.png"/>
-				</figure>
-			</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,
-				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
-				the use of JBoss DNA to federate repositories and provide access through JCR.</para>
-  </sect1>
-	<sect1 id="downloading_and_running_review">
-		<title>Summarizing what we just did</title>
-		<para>In this chapter you downloaded, installed, and built the two example applicationss.  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
-    	files, and stored that metadata inside the repository.  The repository client allowed you to walk through multiple repositories,
-      including one whose content was federated from multiple other repositories.</para>
-		<para>These example applications were very simplistic.  In fact, running through the examples probably only took you a few minutes.
-    	So while these applications won't win any awards, they hopefully showed you the basics of what JBoss DNA can do.</para>
-		<para>In the next two chapters, we'll venture into the code to get an understanding	of how JBoss DNA actually works.  
-			The <link linkend="using_dna_for_sequencing">next chapter</link> reviews the sequencer application and talks about 
-			how you can use DNA sequencers in your own applications.  Then in the <link linkend="using_dna_repositories">following chapter</link>
-			we'll venture into the repositories example code to show how you can use DNA repositories, including federated repositories,
-			in your own applications.</para>
-	</sect1>
 </chapter>

Deleted: trunk/docs/gettingstarted/src/main/docbook/en-US/content/future.xml
===================================================================
--- trunk/docs/gettingstarted/src/main/docbook/en-US/content/future.xml	2009-06-07 15:05:15 UTC (rev 988)
+++ trunk/docs/gettingstarted/src/main/docbook/en-US/content/future.xml	2009-06-07 22:33:45 UTC (rev 989)
@@ -1,45 +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
-  -->
-<!DOCTYPE chapter PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN" "http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd">
-<chapter id="future">
-	<title>Looking to the future</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.
-	</para>
-	<para>
-	  If you're interested in getting involved with the JBoss DNA project, consider picking up one of the sequencers on our
-	  <ulink url="http://jira.jboss.org/jira/browse/DNA?report=com.atlassian.jira.plugin.system.project:roadmap-panel">roadmap</ulink>.
-	  Or, check out <ulink url="http://jira.jboss.org/jira/secure/IssueNavigator.jspa?reset=true&amp;mode=hide&amp;pid=12310520&amp;sorter/order=DESC&amp;sorter/field=priority&amp;resolution=-1&amp;component=12311436">JIRA</ulink>
-	  for the list of sequencers we've thought of.  If you think of one that's not there, please add it to JIRA!
-	</para>
-</chapter>

Modified: trunk/docs/gettingstarted/src/main/docbook/en-US/content/introduction.xml
===================================================================
--- trunk/docs/gettingstarted/src/main/docbook/en-US/content/introduction.xml	2009-06-07 15:05:15 UTC (rev 988)
+++ trunk/docs/gettingstarted/src/main/docbook/en-US/content/introduction.xml	2009-06-07 22:33:45 UTC (rev 989)
@@ -24,7 +24,10 @@
   ~ 51 Franklin Street, Fifth Floor
   ~ Boston, MA  02110-1301  USA
   -->
-<!DOCTYPE chapter PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN" "http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd">
+<!DOCTYPE chapter 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="introduction">
   <title>Introduction</title>
   <para>There are a lot of ways for applications to store information persistently so that it can be accessed at a
@@ -85,26 +88,48 @@
     and is being revised under <ulink url="http://www.jcp.org/en/jsr/detail?id=283">JSR-283</ulink>.
   </para>
   <para>
-    The <emphasis>JBoss DNA project</emphasis>
-    is building unified metadata repository system that is compliant with JCR.  Nearly all of these capabilities are to be hidden
-    below the JCR API and involve automated processing of the information in the repository. Thus, JBoss DNA can add value to
-    existing repository implementations. For example, JCR repositories offer the ability to upload files into the repository and
-    have the file content indexed for search purposes. JBoss DNA also defines a library for "sequencing" content - to extract
-    meaningful information from that content and store it in the repository, where it can then be searched, accessed, and
-    analyzed using the JCR API.
-  </para>
-  <para> JBoss DNA has other features as well.  You can create federated repositories that dynamically merge the information 
-	  from multiple databases, services, applications, and other JCR repositories.  JBoss DNA also will allow you to 
-    create customized views based upon the type of data and the role of the user that is accessing the data. And yet another goal is
-    to create a REST-ful API to allow the JCR content to be accessed easily by other applications written in other languages.
-  </para>
-  <para>
-    The <link linkend="understanding_dna">next chapter</link> in this book goes into more detail about JBoss DNA and its architecture, 
-		the different components, what's available now, and what's coming in future releases.
-    <link linkend="downloading_and_running">Chapter 3</link> then provides instructions for downloading and running the sequencer 
-		examples for the current release. <link linkend="using_dna">Chapter 4</link> walks through how to use JBoss DNA sequencers 
-		in your applications, while <link linkend="custom_sequencers">Chapter 5</link> shows how to use JBoss DNA repositories.
-		<link linkend="custom_sequencers">Chapter 6</link> goes over how to create custom sequencers, and finally,
-    <link linkend="future">Chapter 7</link> wraps things up with a discussion about the future of JBoss DNA.
-  </para>
+	  The JCR API provides a number of information services that are needed by many applications,
+	  including: read and write access to information; the ability to structure information in a hierarchical and flexible manner that can adapt
+	  and evolve over time; ability to work with unstructured content; ability to (transparently) handle large strings; 
+	  notifications of changes in the information; search and query; versioning of information; access control; integrity constraints;
+	  participation within distributed transactions; explicit locking of content; and of course persistence.
+	</para>
+	<sect1 id="what_is_jboss_dna">
+		<title>JBoss DNA</title>
+		<para>
+			What makes JCR interesting, however, is that a JCR implementation provides all these features and capabilities regardless
+			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.
+		</para>
+		<para>
+			Of course when you start providing a unified view of all this information, you start recognizing the need to store more
+			information, including metadata about and relationships between the existing content.  JBoss DNA lets you do this, too.
+			And JBoss DNA even tries to help you discover more about the information you already have, especially the
+			information wrapped up in the kinds of files often found in enterprise systems: service definitions, policy files,
+			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.
+		</para>
+	</sect1>
+	<sect1 id="introduction_whats_next">
+		<title>What's next</title>
+		<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>
+			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.  
+			<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>
+	</sect1>
 </chapter>

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	2009-06-07 15:05:15 UTC (rev 988)
+++ trunk/docs/gettingstarted/src/main/docbook/en-US/content/legal_notice.xml	2009-06-07 22:33:45 UTC (rev 989)
@@ -24,7 +24,10 @@
   ~ 51 Franklin Street, Fifth Floor
   ~ Boston, MA  02110-1301  USA
   -->
-<!DOCTYPE legalnotice PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN" "http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd">
+<!DOCTYPE legalnotice 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;
+]>
 
 <legalnotice id="Legal_Notice">
     <title>Legal Notice</title>

Modified: trunk/docs/gettingstarted/src/main/docbook/en-US/content/preface.xml
===================================================================
--- trunk/docs/gettingstarted/src/main/docbook/en-US/content/preface.xml	2009-06-07 15:05:15 UTC (rev 988)
+++ trunk/docs/gettingstarted/src/main/docbook/en-US/content/preface.xml	2009-06-07 22:33:45 UTC (rev 989)
@@ -24,7 +24,10 @@
   ~ 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">
+<!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;
+]>
 <preface id="preface" revision="1">
   <title>What this book covers</title>
   <para>The goal of this book is to help you learn about JBoss DNA and how you can use it in your own applications to get the

Added: trunk/docs/gettingstarted/src/main/docbook/en-US/content/repository_example.xml
===================================================================
--- trunk/docs/gettingstarted/src/main/docbook/en-US/content/repository_example.xml	                        (rev 0)
+++ trunk/docs/gettingstarted/src/main/docbook/en-US/content/repository_example.xml	2009-06-07 22:33:45 UTC (rev 989)
@@ -0,0 +1,483 @@
+<?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 chapter 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="repository_example">
+	<title>The Repository Example</title>
+	<para>
+		<link linkend="downloading_and_running">Chapter 4</link> walked through the process of downloading and building the examples,
+		while the <link linkend="sequencer_example">previous chapter</link> showed how to run the sequencer example and walked
+		through the code.  In this chapter, we'll run the repository example and walk through that example code to see what
+		it's doing.
+	</para>
+	<sect1 id="running_repository_example">
+		<title>Running the repository example</title>
+		<para>The repository example consists of a client application that sets up two DNA repositories (named "Cars" and "Airplanes") and 
+			a federated repository ("Vehicles") that dynamically federates the information from the other two 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:
+	  	<figure id="example-repositories">
+				<title>Repositories used in the example client</title>
+				<graphic align="center" scale="100" fileref="example-repositories.png"/>
+			</figure>
+			Most of the repositories are in-memory repositories (using the In-Memory repository connector), but 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">
+				<title>Vehicles repository content is federated from the Cars, Airplanes and Configuration repositories</title>
+				<graphic align="center" scale="100" fileref="example-federated-repository.png"/>
+			</figure>
+	  </para>
+		<para>
+      To run the client application, go to the <code>examples/repository/target/dna-example-repositories-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="example-repositories-client">
+				<title>Example Client</title>
+				<graphic align="center" scale="100" fileref="example-repositories-client.png"/>
+			</figure>
+      From this menu, you can see the list of repositories, select one, and navigate through that repository in a manner similar
+      to a *nix command-line shell (although the client itself uses the JCR API to interact with the repositories).
+      Here are some of the commands you can use:</para>
+			<table frame='all'>
+				<title>Repository client commands to navigate a repository</title>
+				<tgroup cols='2' align='left' colsep='1' rowsep='1'>
+		      <colspec colname='c1' colwidth="1*"/>
+		      <colspec colname='c2' colwidth="1*"/>
+					<thead>
+						<row><entry>Command</entry><entry>Description</entry></row>
+					</thead>
+					<tbody>
+						<row><entry>pwd</entry><entry>Print the path of the current node (e.g., the "working directory")</entry></row>
+						<row><entry>ls [<emphasis>path</emphasis>]</entry><entry>List the children and properties of the node at the supplied path,
+						     where "<emphasis>path</emphasis>" can be any relative path or absolute path.  If "<emphasis>path</emphasis>" is not supplied,
+						     the current working node's path is used.</entry></row>
+						<row><entry>cd <emphasis>path</emphasis></entry><entry>Change to the specified node, where "<emphasis>path</emphasis>"
+						     can be any relative path or absolute path.  For example, "<code>cd alpha</code>" changes the current node to be a child named
+						     "<code>alpha</code>"; "<code>cd ..</code>" changes the current node to the parent node; "<code>cd /a/b</code>" changes 
+						     the current node to be the "<code>/a/b</code>" node.</entry></row>
+						<row><entry>exit</entry><entry>Exit this repository and return the list of repositories.</entry></row>
+					</tbody>
+				</tgroup>
+			</table>
+			<para>If you were to select the "Cars" repository and use some of the commands, you should see something similar to: 
+	      <figure id="example-repositories-navigating">
+					<title>Navigating the Cars repository</title>
+					<graphic align="center" scale="100" fileref="example-repositories-navigating.png"/>
+				</figure>
+			</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,
+				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
+				the use of JBoss DNA to federate repositories and provide access through JCR.</para>
+  </sect1>
+	<sect1 id="connectors">
+		<title>JBoss DNA connectors</title>
+		<para>As mentioned in the <link linkend="introduction">Introduction</link>, one of the capabilities of JBoss DNA is to provide access through 
+			<ulink url="http://www.jcp.org/en/jsr/detail?id=170">JCR</ulink> to different kinds of repositories and storage systems.
+			Your applications work with the JCR API, but through JBoss DNA you're able to accesses the content from where the information
+			exists - not just a single purpose-built repository.  This is fundamentally what makes JBoss DNA different.</para>
+		<para>How does JBoss DNA do this?  At the heart of JBoss DNA and it's JCR implementation is a simple connector
+			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>
+				<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.
+			<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>
+	  	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
+	    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>
+				<graphic align="center" scale="100" fileref="dna-connectors-future.png"/>
+			</figure>
+		</para>
+		<note>
+			<para>You might be thinking that these connectors are interesting, but what do they really provide?  Is it really useful
+			  to use JCR to access a relational database rather than JDBC?  Or, why access the files on a file system when there 
+			  are already mechanisms to do that?</para>
+		  <para>Maybe putting JCR on top of a single system (like a JDBC database) isn't that interesting. What
+			  <emphasis>is</emphasis> interesting, though, is accessing the information in multiple systems <emphasis>as if all that information were
+			  in a single JCR repository</emphasis>.  That's what the federated repository source is all about.  The JBoss DNA connector
+				system just makes it possible to interact with all these systems in the same way.</para>
+			<para>Think of it this way: with JBoss DNA, you can use JCR to get to the schemas of multiple relational databases <emphasis>and</emphasis> the schemas
+			  defined by DDL files in your SVN repository <emphasis>and</emphasis> the schemas defined by logical models stored on your file system.
+			</para>
+		</note>
+    <para>Before we go further, let's define some terminology regarding connectors.</para>
+ 		<itemizedlist>
+			<listitem>
+				<para>
+					A <emphasis role="strong">connector</emphasis> is the runnable code packaged in one or more JAR files that
+					contains implementations of several interfaces (described below).  A Java developer <emphasis>writes</emphasis>
+					a connector to a type of source, such as a particular database management system, LDAP directory, source code
+					management system, etc.  It is then packaged into one or more JAR files (including dependent JARs) and deployed
+					for use in applications that use JBoss DNA repositories.
+				</para>
+			</listitem>
+			<listitem>
+				<para>
+					The description of a particular source system (e.g., the "Customer" database, or the company LDAP system) 
+					is called a <emphasis role="strong">repository source</emphasis>.  JBoss DNA defines a &RepositorySource; interface
+					that defines methods describing the behavior and supported features and a method for establishing connections.
+					A connector will have a class that implements this interface and that has JavaBean properties for
+					all of the connector-specific properties required to fully describe an instance of the system.  Use of JavaBean
+					properties is not required, but it is highly recommended, as it enables reflective configuration and administration.
+					Applications that use JBoss DNA create an instance of the connector's &RepositorySource; implementation and set 
+					the properties for the external source that the application wants to access with that connector.
+				</para>
+			</listitem>
+			<listitem>
+				<para>
+					A repository source instance is then used to establish <emphasis role="strong">connections</emphasis> to
+					that source.  A connector provides an implementation of the &RepositoryConnection; interface, which
+					defines methods for interacting with the external system.  In particular, the <code>execute(...)</code> method
+					takes an &ExecutionContext; instance and a &Request; object.  The &ExectuionContext; object defines the
+					environment in which the processing is occurring, including information about the JAAS &Subject; and &LoginContext;.
+					The &Request; object describes the requested operations on the content, with different concrete subclasses
+					representing each type of activity.  Examples of commands include (but not limited to) getting a node, moving a node, creating a node, 
+					changing a node, and deleting a node.  And, if the repository source is able to participate in JTA/JTS distributed transactions, then the
+					&RepositoryConnection; must implement the <code>getXaResource()</code> method by returning 
+					a valid <code>javax.transaction.xa.XAResource</code> object that can be used by the transaction monitor.
+				</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
+			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;,
+			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.)
+		</para>
+		<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
+			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>
+    <programlisting><![CDATA[
+  org/jboss/example/dna/repositories/ConsoleInput.java
+                                    /RepositoryClient.java
+                                    /UserInterface.java
+  ]]></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>
+			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 
+			automatically using conventional JUnit test cases, as demonstrated by the code in the <code>src/test/java</code> directory:</para>
+    <programlisting><![CDATA[
+  org/jboss/example/dna/sequencers/RepositoryClientTest.java
+                                  /RepositoryClientUsingJcrTest.java
+  ]]></programlisting>
+	<para>If we look at the <code>RepositoryClient</code> code, there are a handful of methods that encapsulate the various activities.</para>
+	<note>
+		<para>Some of the code samples included in this book have had some of the error handling and comments removed so that
+			the code is more readable and concise.</para>
+	</note>
+	<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 by loading it from a file.
+	</para>
+	<programlisting role="JAVA"><![CDATA[
+// Set up the JAAS provider (IDTrust) and a policy file (which defines the "dna-jcr" login config name)
+IDTrustConfiguration idtrustConfig = new IDTrustConfiguration();
+try {
+    idtrustConfig.config("security/jaas.conf.xml");
+} catch (Exception ex) {
+    throw new IllegalStateException(ex);
+}
+
+// Now configure the repository client component ...
+RepositoryClient client = new RepositoryClient();
+for (String arg : args) {
+    arg = arg.trim();
+    if (arg.equals("--api=jcr")) client.setApi(Api.JCR);
+    if (arg.equals("--api=dna")) client.setApi(Api.DNA);
+    if (arg.equals("--jaas")) client.setJaasContextName(JAAS_LOGIN_CONTEXT_NAME);
+    if (arg.startsWith("--jaas=") && arg.length() > 7) client.setJaasContextName(arg.substring(7).trim());
+}
+// And have it use a ConsoleInput user interface ...
+client.setUserInterface(new ConsoleInput(client, args));
+ ]]></programlisting>
+	<para>
+		The first block sets up the JAAS provider to be the IDTrust library and a policy file that defines the "dna-jcr" JAAS configuration.
+	</para>
+	<para>
+		The second block of code instantiates the <code>RepositoryClient</code> and passes in some options determined from the command-line.
+		It then sets the user interface (which then executes its behavior, which we'll see below).
+	</para>
+	<para>
+		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.)
+   </para>
+	<programlisting role="JAVA"><![CDATA[
+public void startRepositories() throws IOException, SAXException {
+    if (engine != null) return; // already started
+
+    // Load the configuration from a file, as provided by the user interface ...
+    JcrConfiguration configuration = new JcrConfiguration();
+    configuration.loadFrom(userInterface.getRepositoryConfiguration());
+
+    // Load the node types for each JCR repository, via a CND file. These could have been defined
+    // in the configuration file, but this approach is easy and allows us to define the node types
+    // using the CND format in one or multiple files.
+    String locationOfCndFiles = userInterface.getLocationOfCndFiles();
+    configuration.repository("aircraft repository").addNodeTypes(locationOfCndFiles + "/aircraft.cnd");
+    configuration.repository("car repository").addNodeTypes(locationOfCndFiles + "/cars.cnd");
+    configuration.repository("virtual").addNodeTypes(locationOfCndFiles + "/virtual.cnd");
+
+    // Now create the JCR engine ...
+    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 ...
+    String location = this.userInterface.getLocationOfRepositoryFiles();
+
+    // Now import the content for the two in-memory repositories ...
+    Graph cars = engine.getGraph("Cars");
+    cars.importXmlFrom(location + "/cars.xml").into("/");
+    Graph aircraft = engine.getGraph("Aircraft");
+    aircraft.importXmlFrom(location + "/aircraft.xml").into("/");
+}
+ ]]></programlisting>
+		<para>
+			This method does a number of different things.  First, it checks to make sure the repositories are not already running; if so
+			the method just returns.  Then, it creates a JBoss DNA <code>JcrConfiguration</code> instance and loads the configuration
+			from a file provided by the user interface.  The method then loads the node types for each of the repositories; this could
+			have been done in the configuration, but it would have made the configuration file larger and more difficult to understand.
+			It then creates the <code>JcrEngine</code> from the configuration and starts it.  Finally, it obtains the location of the
+			content files from the user interface, and imports them into the "Cars" and "Aircraft" repositories.  Again, this is
+			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
+		  a few moments (if there are any ongoing operations or enqueued activities) awaits for it to complete the shutdown.
+	   </para>
+		<programlisting role="JAVA"><![CDATA[
+public void shutdown() throws InterruptedException, LoginException {
+    logout();
+    if (engine == null) return;
+    try {
+        // Tell the engine to shut down, and then wait up to 5 seconds for it to complete...
+        engine.shutdown();
+        engine.awaitTermination(5, TimeUnit.SECONDS);
+    } finally {
+        engine = null;
+    }
+}
+ ]]></programlisting>
+		<para>
+			A few of the other methods in the <code>RepositoryClient</code> class deal with the JAAS <code>LoginContext</code>.
+			When needed, the client will authenticate the user (by asking the user interface for a callback handler that will be called
+			when the authentication information is needed).  The resulting authenticated <code>LoginContext</code> is wrapped
+			by a custom <code>javax.jcr.Credentials</code> implementation.  As long as the <code>Credentials</code> implementation
+			has a <code>getLoginContext()</code> method that returns a <code>LoginContext</code> object, JBoss DNA's repository
+			implementation will use that context to create the <code>javax.jcr.Session</code>.  (Of course, the <code>javax.jcr.SimpleCredentials</code>
+			can also be used to create a Session, and JBoss DNA will then attempt to use JAAS to authenticate the user given by the credentials.)
+		</para>
+		<para>
+			The <code>getNodeInfo(...)</code> method of the example is what is called when the properties and children of a particular node
+			are requested by the user interface.  (In the console user interface, this happens when the user navigates the graph structure.)
+			There are really two different behaviors to this method, depending upon whether the JCR API is to be used or whether
+			the JBoss DNA Graph API is to be used.  The portion that uses JCR is shown below:
+	   </para>
+		<programlisting role="JAVA"><![CDATA[
+JcrRepository jcrRepository = engine.getRepository(sourceName);
+Session session = null;
+if (loginContext != null) {
+    // Could also use SimpleCredentials(username,password) too
+    Credentials credentials = new JaasCredentials(loginContext);
+    session = jcrRepository.login(credentials);
+} else {
+    session = jcrRepository.login();
+}
+try {
+    // Make the path relative to the root by removing the leading slash(es) ...
+    pathToNode = pathToNode.replaceAll("^/+", "");
+    // Get the node by path ...
+    Node root = session.getRootNode();
+    Node node = root;
+    if (pathToNode.length() != 0) {
+        if (!pathToNode.endsWith("]")) pathToNode = pathToNode + "[1]";
+        node = pathToNode.equals("") ? root : root.getNode(pathToNode);
+    }
+
+    // Now populate the properties and children ...
+    if (properties != null) {
+        for (PropertyIterator iter = node.getProperties(); iter.hasNext();) {
+            javax.jcr.Property property = iter.nextProperty();
+            Object[] values = null;
+            // Must call either 'getValue()' or 'getValues()' depending upon # of values
+            if (property.getDefinition().isMultiple()) {
+                Value[] jcrValues = property.getValues();
+                values = new String[jcrValues.length];
+                for (int i = 0; i < jcrValues.length; i++) {
+                    values[i] = jcrValues[i].getString();
+                }
+            } else {
+                values = new Object[] {property.getValue().getString()};
+            }
+            properties.put(property.getName(), values);
+        }
+    }
+    if (children != null) {
+        // Figure out which children need same-name sibling indexes ...
+        Set<String> sameNameSiblings = new HashSet<String>();
+        for (NodeIterator iter = node.getNodes(); iter.hasNext();) {
+            javax.jcr.Node child = iter.nextNode();
+            if (child.getIndex() > 1) sameNameSiblings.add(child.getName());
+        }
+        for (NodeIterator iter = node.getNodes(); iter.hasNext();) {
+            javax.jcr.Node child = iter.nextNode();
+            String name = child.getName();
+            if (sameNameSiblings.contains(name)) name = name + "[" + child.getIndex() + "]";
+            children.add(name);
+        }
+    }
+} catch (javax.jcr.ItemNotFoundException e) {
+    return false;
+} catch (javax.jcr.PathNotFoundException e) {
+    return false;
+} finally {
+    if (session != null) session.logout();
+}
+ ]]></programlisting>
+		<para>
+			This code is literally just using the standard JCR API.  First, it obtains a <code>javax.jcr.Session</code> instance
+			(using the available <code>LoginContext</code>), finds the desired <code>javax.jcr.Node</code>, copies the
+			properties and names of the children into collections supplied by the caller via method parameters, and
+			finally logs out of the session.
+		</para>
+		<para>
+			The JBoss DNA Graph API is actually an internal API used within the different components of JBoss DNA
+			(including the connector and sequencer frameworks),	and provides low-level access to the exact same content.
+			Though we do not recommend using this API in your client applications, if you need to write a connector
+			or sequencer, you may need to know how to use the Graph API.  
+			Here is the portion of the <code>getNodeInfo(...)</code> method that does the exact same operation as the JCR code
+			shown above:
+		</para>
+		<programlisting role="JAVA"><![CDATA[
+// Use the DNA Graph API to read the properties and children of the node ...
+ExecutionContext context = loginContext != null ? this.context.create(loginContext) : this.context;
+Graph graph = engine.getGraph(context, sourceName);
+graph.useWorkspace("default");
+org.jboss.dna.graph.Node node = graph.getNodeAt(pathToNode);
+
+if (properties != null) {
+    // Now copy the properties into the map provided as a method parameter ...
+    for (Property property : node.getProperties()) {
+        String name = property.getName().getString(context.getNamespaceRegistry());
+        properties.put(name, property.getValuesAsArray());
+    }
+}
+if (children != null) {
+    // And copy the names of the children into the list provided as a method parameter ...
+    for (Location child : node.getChildren()) {
+        String name = child.getPath().getLastSegment().getString(context.getNamespaceRegistry());
+        children.add(name);
+    }
+}
+ ]]></programlisting>
+		<para>
+			Note that this code is significantly shorter than the equivalent code based upon the JCR API.  
+			This is in part because the Graph API doesn't have the notion of a stateful session.  But some of it also is simply
+			because the Graph API design requires less code to do the same kinds of operations.
+		</para>
+		<para>None of the other methods in the <code>RepositoryClient</code> really do anything with JBoss DNA or JCR 
+		  <emphasis>per se</emphasis>. Instead, they really facilitate interaction with the user interface.
+		</para>
+		<para>If we look at the <code>ConsoleInput</code> constructor, it starts the repository and a thread 
+			for the user interface. At this point, the constructor returns, but the main application continues under the user interface thread.  
+			When the user requests to quit, the user interface thread also shuts down the JCR repository.</para>
+    <programlisting role="JAVA"><![CDATA[
+public ConsoleInput( SequencerClient client ) {
+  try {
+      client.startRepositories();
+
+      System.out.println(getMenu());
+      Thread eventThread = new Thread(new Runnable() {
+          private boolean quit = false;
+          public void run() {
+              try {
+                  while (!quit) {
+                      // Display the prompt and process the requested operation ...
+                  }
+              } finally {
+                  try {
+                      // Terminate ...
+                      client.shutdown();
+                  } catch (Exception err) {
+                      System.out.println("Error shutting down repository: " 
+                                         + err.getLocalizedMessage());
+                      err.printStackTrace(System.err);
+                  }
+              }
+          }
+      });
+      eventThread.start();
+  } catch (Exception err) {
+      System.out.println("Error: " + err.getLocalizedMessage());
+      err.printStackTrace(System.err);
+  }
+}
+  ]]></programlisting>
+		<para>At this point, we've reviewed all of the interesting code in the example application related to JBoss DNA.  However, feel free
+    to play with the application, trying different things.
+    </para>
+	</sect1>
+	<sect1 id="repository_example_whats_next">
+		<title>What's next</title>
+		<para>
+			This chapter walked through running the repository example and looked at the example code.  This example allowed you to walk 
+			through multiple repositories, including one whose content was federated from multiple other repositories.
+			This was a very simplistic example that only took a few minutes to run.
+		</para>
+		<para>
+			In the <link linkend="conclusion">next chapter</link> we'll wrap up by summarizing what we've learned about JBoss DNA
+			and provide information about where you can find out more about JBoss DNA.
+		</para>
+	</sect1>
+</chapter>


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

Added: trunk/docs/gettingstarted/src/main/docbook/en-US/content/sequencer_example.xml
===================================================================
--- trunk/docs/gettingstarted/src/main/docbook/en-US/content/sequencer_example.xml	                        (rev 0)
+++ trunk/docs/gettingstarted/src/main/docbook/en-US/content/sequencer_example.xml	2009-06-07 22:33:45 UTC (rev 989)
@@ -0,0 +1,315 @@
+<?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 chapter 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="sequencer_example">
+	<title>The Sequencer Example</title>
+	<para>
+		The previous chapter walked through the process of downloading and building the examples.
+		This chapter will focus on the sequencer example, showing how to run the example and then walking through the code
+		to describe what it's doing.
+	</para>
+	<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>
+		<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">
+				<title>Example client</title>
+				<graphic align="center" scale="100" fileref="example-sequencer-client.png"/>
+			</figure>
+      From this menu, you can upload a file into the repository, search for media in the repository, print sequencing statistics,
+      or quit the application.</para>
+		<para>
+      The first step is to upload one of the example images. If you type 'u' and press return, you'll be prompted to supply the
+      path to the file you want to upload. Since the application is running from within the
+      <code>examples/sequencers/target/dna-example-sequencers-basic.dir/</code> directory, you can specify any of the files 
+			in that directory without specifying the path:
+      <figure id="example-sequencer-upload">
+				<title>Uploading an image using the example client</title>
+				<graphic align="center" scale="100" 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
+      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>.
+ 			Files with other extensions in the repository path will be ignored. For your convenience, the example provides several
+      files that will be sequenced (<code>caution.png</code>, <code>caution.jpg</code>, <code>caution.gif</code>, and
+      <code>sample1.mp3</code>) and one image that will not be sequenced (<code>caution.pict</code>). Feel free to try other files.
+    </para>
+		<para>
+      After you have specified the file you want to upload, the example application asks you where in the repository you'd like to
+      place the file. (If you want to use the suggested location, just press <code>return</code>.) The client application
+      uses the JCR API to upload the file to that location in the repository, creating any nodes (of type <code>nt:folder</code>)
+      for any directories that don't exist, and creating a node (of type <code>nt:file</code>) for the file. And, per the JCR specification, 
+			the application creates a <code>jcr:content</code> node (of type <code>nt:resource</code>) under the file node. 
+			The file contents are placed on this <code>jcr:content</code> node in the <code>jcr:data</code> property. For example, if you specify
+      <code>/a/b/caution.png</code>, the following structure will be created in the repository:</para>
+		<programlisting><![CDATA[
+/a   (nt:folder)
+  /b   (nt:folder)
+    /caution.png   (nt:file)
+                /jcr:content    (nt:resource)
+                            @jcr:data = {contents of the file}
+                            @jcr:mimeType = {mime type of the file}
+                            @jcr:lastModified = {now}
+]]></programlisting>
+    <para>Other kinds of files are treated in a similar way.</para>
+		<para>When the client uploads the file using the JCR API, DNA gets notified of the changes, consults the sequencers to see whether
+    	any of them are interested in the new or updated content, and if so runs those sequencers. The image sequencer processes image
+    	files for metadata, and any metadata found is stored under the <code>/images</code> branch of the repository. The MP3 sequencer 
+			processes MP3 audio files for metadata, and any metadata found is stored under the <code>/mp3s</code>
+    	branch of the repository.  And metadata about Java classes are stored under the <code>/java</code> area of the repository.
+      All of this happens asynchronously, so any DNA activity doesn't impede or slow down the client activities.
+    </para>
+		<para>So, after the file is uploaded, you can search the repository for the image metadata using the "s" menu option:
+    	<figure id="example-sequencer-search">
+				<title>Searching for media using the example client</title>
+				<graphic align="center" scale="100" fileref="example-sequencer-search.png"/>
+			</figure>
+    	Here are the search results after the <code>sample1.mp3</code> audio file has been uploaded (to the <code>/a/b/sample1.mp3</code> location):
+    	<figure id="example-sequencer-search-with-mp3">
+				<title>Searching for media using the example client</title>
+				<graphic align="center" scale="100" fileref="example-sequencer-search-with-mp3.png"/>
+			</figure>
+    	You can also display the sequencing statistics using the "d" menu option:
+    	<figure id="example-sequencer-statistics">
+				<title>Sequencing statistics using the example client</title>
+				<graphic align="center" scale="100" fileref="example-sequencer-statistics.png"/>
+			</figure>
+    	These stats show how many nodes were sequenced, and how many nodes were skipped because they didn't apply to the sequencer's
+    	criteria.
+  	</para>
+		<note>
+			<para>There will probably be more nodes skipped than sequenced, since there are more <code>nt:folder</code> and <code>nt:resource</code>
+      	nodes than there are <code>nt:file</code> nodes with acceptable names.</para>
+		</note>
+		<para>You can repeat this process with other files. Any file that isn't an image or MP3 files (as recognized by the sequencing configurations
+    	that we'll describe later) will not be sequenced.</para>
+	</sect1>
+	<sect1 id="example_application_review">
+		<title>Reviewing the example application</title>
+		<para>Recall that the example application 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 an image sequencer 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.  Or, if the client uploads
+      MP3 audio files, the title, author, album, year, and comment are extracted from the audio file and stored in the repository.</para>
+		<para>
+      The example is comprised of 5 classes and 1 interface, located in the <code>src/main/java</code> directory:</para>
+    <programlisting><![CDATA[
+  org/jboss/example/dna/sequencers/ConsoleInput.java
+                                  /ContentInfo.java
+                                  /JavaInfo.java
+                                  /MediaInfo.java
+                                  /SequencingClient.java
+                                  /UserInterface.java
+  ]]></programlisting>
+		<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>.
+      <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
+      <code>UserInterface</code> at a later date. 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 automatically using conventional JUnit test cases, 
+			as demonstrated by the code in the <code>src/test/java</code> directory:</para>
+    <programlisting><![CDATA[
+  org/jboss/example/dna/sequencers/SequencingClientTest.java
+                                  /MockUserInterface.java
+  ]]></programlisting>
+		<para>If we look at the <code>SequencingClient</code> code, there are a handful of methods that encapsulate the various activities.</para>
+		<note>
+			<para>Some of the code samples included in this book have had some of the error handling and comments removed so that
+				the code is more readable and concise.</para>
+		</note>
+		<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[
+// Set up the JAAS provider (IDTrust) and a policy file (which defines the "dna-jcr" login config name)
+IDTrustConfiguration idtrustConfig = new IDTrustConfiguration();
+try {
+    idtrustConfig.config("security/jaas.conf.xml");
+} catch (Exception ex) {
+    throw new IllegalStateException(ex);
+}
+
+// Create the configuration. 
+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 ...
+config.repositorySource("store")
+      .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("sequencing.cnd")
+      .setSource("store")
+      .setOption(JcrRepository.Option.JAAS_LOGIN_CONFIG_NAME, "dna-jcr");
+// Set up the image sequencer ...
+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");
+// Set up the MP3 sequencer ...
+config.sequencer("MP3 Sequencer")
+      .usingClass("org.jboss.dna.sequencer.mp3.Mp3MetadataSequencer")
+      .loadedFromClasspath()
+      .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 source file sequencer ...
+config.sequencer("Java Sequencer")
+      .usingClass("org.jboss.dna.sequencer.java.JavaMetadataSequencer")
+      .loadedFromClasspath()
+      .setDescription("Sequences Java files to extract the AST structure of the Java source code")
+      .sequencingFrom("//(*.java[*])/jcr:content[@jcr:data]")
+      .andOutputtingTo("/java/$1");
+
+// Now start the client and tell it which repository and workspace to use ...
+SequencingClient client = new SequencingClient(config, repositoryId, workspaceName);
+client.setUserInterface(new ConsoleInput(client));
+ ]]></programlisting>
+		<para>
+			The first block sets up the JAAS provider to be the IDTrust library and a policy file that defines the "dna-jcr" JAAS configuration.
+		</para>
+		<para>
+			The second block of code configures the <code>JcrConfiguration</code> and sets up the "store" source, the "content" repository,
+			and three sequencers.  Again, this is done via the programmatic style. An alternative would be to load the entire configuration
+			from a configuration file or from an existing configuration repository.  (The repository example shown in the 
+			<link linkend="repository_example">next chapter</link> shows how to load the configuration from a file.)
+		</para>
+		<para>
+			The third block simply instantiates the <code>SequencingClient</code> class, passing the configuration and the name of the repository
+			and workspace, and finally sets the user interface (which then executes its behavior, which we'll see below).
+		</para>
+		<para>
+			The <code>startRepository()</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.)
+    </para>
+		<programlisting role="JAVA"><![CDATA[
+public void startRepository() throws Exception {
+		if (this.repository == null) {
+		    try {
+		        // Start the DNA engine ...
+		        this.engine = this.configuration.build();
+		        this.engine.start();
+
+		        // Now get the JCR repository instance ...
+		        this.repository = this.engine.getRepository(repositoryName);
+		    } catch (Exception e) {
+		        this.repository = null;
+		        throw e;
+		    }
+		}
+}
+  ]]></programlisting>
+		<para>The <code>shutdownRepository()</code> method requests the <code>JcrEngine</code> instance shuts 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[
+public void shutdownRepository() throws Exception {
+		if (this.repository != null) {
+		    try {
+		        this.engine.shutdown();
+		        this.engine.awaitTermination(4, TimeUnit.SECONDS);
+		    } finally {
+		        this.repository = null;
+		    }
+		}
+}
+  ]]></programlisting>
+		<para>None of the other methods really do anything with JBoss DNA <emphasis>per se</emphasis>. Instead, they merely work with the repository
+      using the JCR API.</para>
+		<para>If we look at the <code>ConsoleInput</code> constructor, it starts the repository and a thread 
+			for the user interface. At this point, the constructor returns, but the main application continues under the user interface thread.  
+			When the user requests to quit, the user interface thread also shuts down the JCR repository.</para>
+    <programlisting role="JAVA"><![CDATA[
+public ConsoleInput( SequencerClient client ) {
+  try {
+      client.startRepository();
+
+      System.out.println(getMenu());
+      Thread eventThread = new Thread(new Runnable() {
+          private boolean quit = false;
+          public void run() {
+              try {
+                  while (!quit) {
+                      // Display the prompt and process the requested operation ...
+                  }
+              } finally {
+                  try {
+                      // Terminate ...
+                      client.shutdownRepository();
+                  } catch (Exception err) {
+                      System.out.println("Error shutting down sequencing service and repository: " 
+                                         + err.getLocalizedMessage());
+                      err.printStackTrace(System.err);
+                  }
+              }
+          }
+      });
+      eventThread.start();
+  } catch (Exception err) {
+      System.out.println("Error: " + err.getLocalizedMessage());
+      err.printStackTrace(System.err);
+  }
+}
+  ]]></programlisting>
+		<para>At this point, we've reviewed all of the interesting code in the example application related to JBoss DNA.  However, feel free
+    to play with the application, trying different things.</para>
+	</sect1>
+	<sect1 id="using_dna_whats_next">
+		<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
+	    	files, and stored that metadata inside the repository.
+		</para>
+		<para>
+			In the <link linkend="repository_example">next chapter </link> we'll do the same for the repository example.
+		</para>
+	</sect1>
+</chapter>


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

Deleted: trunk/docs/gettingstarted/src/main/docbook/en-US/content/understanding_dna.xml
===================================================================
--- trunk/docs/gettingstarted/src/main/docbook/en-US/content/understanding_dna.xml	2009-06-07 15:05:15 UTC (rev 988)
+++ trunk/docs/gettingstarted/src/main/docbook/en-US/content/understanding_dna.xml	2009-06-07 22:33:45 UTC (rev 989)
@@ -1,576 +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
-  -->
-<!DOCTYPE chapter PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN" "http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd">
-<chapter id="understanding_dna">
-  <title>Understanding JBoss DNA</title>
-  <sect1 id="jboss_dna_overview">
-    <title>Overview</title>
-    <para>JBoss DNA is a repository and set of tools that make it easy to capture, version, analyze, and understand the
-      fundamental building blocks of information. As models, service and process definitions, schemas, source code, and other
-      artifacts are added to the repository, JBoss DNA "sequences" the makeup of these components and extracts their structure
-      and interdependencies. The JBoss DNA web application will allow end users to access, visualize, and edit this information in
-      the terminology and structure they are familiar with. Such domain-specific solutions can be easily created with little or
-      no programming.</para>
-    <para> JBoss DNA supports the Java Content Repository (JCR) standard and is able to provide a single integrated view of
-      multiple repositories, external databases, services, and applications, ensuring that JBoss DNA has access to the latest
-      and most reliable master data. For instance, DNA could provide in a single view valuable insight into the business
-      processes and process-level services impacted by a change to in an intermediary web server operation defined via WSDL.
-      Similarly, a user could quickly view and navigate the dependencies between the data source models and transformation
-      information stored within a content repository, the code base stored within a version control system, and the database
-      schemas used by an application.</para>
-  </sect1>
-  <sect1 id="architecture">
-    <title>Architecture</title>
-    <para>The planned architecture for JBoss DNA consists of several major components that will be built on top of standard APIs,
-      including JCR, JDBC, JNDI and HTTP. The goal is to allow these components to be assembled as needed and add value on top
-      of other DNA components or third-party systems that support these standard APIs.  Not all of these components exist
-      yet - at the moment we're focusing on completing our JCR-compliant implementation using our connector framework.</para>
-    <mediaobject>
-      <imageobject role="fo">
-        <imagedata align="center" fileref="dna-architecture.png" />
-      </imageobject>
-      <imageobject role="html">
-        <imagedata align="center" fileref="dna-architecture.png" />
-      </imageobject>
-    </mediaobject>
-    <para>
-      Let's go over each of these components, starting from the bottom of the diagram:
-      <itemizedlist>
-        <listitem>
-          <para>
-            <emphasis role="strong">DNA Connectors</emphasis>
-            are used to communicate with these external sources of information, whether there's one source (like a database) in
- 						which all of the content is stored, or information is being federated from multiple sources.  The connector's
- 						job is to interact with the external source and map the source's information into the lower-level graph language used by
-						JBoss DNA.  Connectors also may optionally participate in distributed transactions by exposing an XAResource.
-						In summary, then, the connector API isolates all of the other components from how the graph are persisted.
-						We've built a number of connectors already, but we're always interested in adding more.  Or, you could write your own,
-						since we've designed the connector API to be as straightforward as possible.
-          </para>
-        </listitem>
-        <listitem>
-          <para>
-            <emphasis role="strong">DNA Federation</emphasis>
-            is actually a special repository connector that accesses information from multiple other sources via connectors,
- 						making all this information look like it is part of a single, unified repository.  Because it is a connector,
- 						it can be used wherever connectors can be used.  And because it uses connectors, the federation connector
-						makes it possible to integrate a wide variety of external systems, like other JCR
-            repositories, databases, applications, and services.
-          </para>
-        </listitem>
-        <listitem>
-          <para>
-            <emphasis role="strong">DNA JCR</emphasis>
-            is an implementation of the JCR API that accesses the content from a single connector.  Our implementation has come a long
-						way, and is nearly Level 1 and Level 2 compliant.  Finishing the remaining features, including search
-						and query, are major objectives of our next release.
-          </para>
-        </listitem>
-        <listitem>
-          <para>
-            <emphasis role="strong">DNA Sequencers</emphasis>
-            are pluggable components that automatically process content (typically files) that are uploaded into the repository,
-						looking for useful structure and information in that content.  When a file is uploaded to the repository, JBoss DNA automatically
-						figures out which sequencer(s) should be run, and then runs them.  Each sequencer, then, extracts the meaningful information
-						from the file's content and places that structure in the repository.  Once this information is in
-            the repository, it can be viewed, edited, analyzed, searched, and related to other content. DNA defines a Java
-            interface that sequencers must implement. DNA sequencers operate upon any JCR-compliant repository.
-						We have a number of sequencers, but plan on adding more over time.  Like connectors, the Sequencer API makes it very
-						simple to write sequencers for your own file types.
-          </para>
-        </listitem>
-        <listitem>
-          <para>
-            <emphasis role="strong">DNA Analyses</emphasis>
-            are similar to sequencers, except they process the graph structure rather than uploaded files.  You can think of them
- 						as report generators, where they process some area of the repository and generate output.  The output doesn't take the
-						form of a document or file, but rather more graph content that is then stored in the repository, where it can be accessed
-						and searched just like any other content.  We're still figuring out how to best make analyzers easy to write and use,
-						and have been focused on other aspects of the architecture.  But we're planning on using analyzers for dependency,
-						similarity, and statistical analyses.
-          </para>
-        </listitem>
-        <listitem>
-          <para>
-            <emphasis role="strong">DNA Maven</emphasis>
-            is a classloader library compatible with Maven 2 project dependencies. This allows the creation of Java ClassLoader
-            instances using Maven 2 style paths, and all dependencies are transitively managed and included.  This exists but is
-						still immature.
-          </para>
-        </listitem>
-      </itemizedlist>
-    </para>
-		<para>
-			The remaining parts of the architecture haven't yet been started, but they service important purposes for a complete metadata
-			repository system.
-			<itemizedlist>
-        <listitem>
-          <para>
-            <emphasis role="strong">DNA Eclipse Plugins</emphasis>
-            enable Eclipse users to access the contents of a JBoss DNA repository.  This is a planned component that may be started soon.
-          </para>
-        </listitem>
-        <listitem>
-          <para>
-            <emphasis role="strong">DNA JDBC Driver</emphasis>
-            provides a driver implementation, allowing JDBC-aware applications to connect to and use a JBoss DNA repository.
-            This is a planned component on our roadmap.
-          </para>
-        </listitem>
-        <listitem>
-          <para>
-            <emphasis role="strong">DNA Remote JCR</emphasis>
-            is a client-side component for accessing remote JCR repositories.
-          </para>
-        </listitem>
-        <listitem>
-          <para>
-            <emphasis role="strong">DNA Web Application</emphasis>
-            is used by end users and domain experts to visualize, search, edit, change and tag the repository content. The web
-            application uses views to define how different types of information are to be presented and edited in
-            domain-specific ways. The goal is that this web application is easily customized and branded for inclusion into
-            other solutions and application systems. The DNA Web Application operates upon any JCR-compliant repository,
-            although it does rely upon the DNA analysis and templating services.
-          </para>
-        </listitem>
-        <listitem>
-          <para>
-            <emphasis role="strong">DNA Publishing Server</emphasis>
-            allows content to be downloaded, uploaded, and edited using the Atom Publishing Protocol. With the DNA Publishing
-            Server, the content of the repository can easily be created, read, edited, and deleted using the standard HTTP
-            operations of POST, GET, PUT, and DELETE (respectively). More and more tools are being created that support working
-            with Atom Publishing servers. The DNA Publishing Server operates upon any JCR-compliant repository.
-          </para>
-        </listitem>
-        <listitem>
-          <para>
-            <emphasis role="strong">DNA WebDAV Server</emphasis>
-            allows clients such as Microsoft Windows and Apple OS X to connect to, read, and edit the content in the repository
-            using the WebDAV standard. WebDAV is an extension of HTTP, so web browsers are able to access the content 
-            served by a WebDAV compliant server. The DNA WebDAV Server operates upon any JCR-compliant repository.
-          </para>
-        </listitem>
-        <listitem>
-          <para>
-            <emphasis role="strong">DNA Views</emphasis>
-            are definitions of how types of information are to be presented in a user interface to allow for creation, reading,
-            editing, and deletion of information. DNA view definitions consist of data stored in a JCR repository, and as such
-            views can be easily added, changed or removed entirely by using the DNA Web Application, requiring no programming.
-          </para>
-        </listitem>
-      </itemizedlist>
-    </para>
-    <para>
-      Continue reading the rest of this chapter for more detail about the
-      <link linkend="sequencers">sequencing framework</link> available in this release, or the <link linkend="federation">federation engine</link>
-      and <link linkend="federation_connectors">connectors</link>. Or, skip to the <link linkend="downloading_and_running">examples</link>
-      to see how to start using JBoss DNA &versionNumber; today. 
-    </para>
-  </sect1>
-  <sect1 id="sequencers">
-    <title>Sequencing content</title>
-    <para> The current JBoss DNA release contains a sequencing framework that is designed to sequence data (typically files)
-      stored in a JCR repository to automatically extract meaningful and useful information. This additional information is then
-      saved back into the repository, where it can be accessed and used.</para>
-    <para> In other words, you can just upload various kinds of files into a JCR repository, and DNA automatically processes
-      those files to extract meaningful structured information. For example, load DDL files into the repository, and let
-      sequencers extract the structure and metadata for the database schema. Load Hibernate configuration files into the
-      repository, and let sequencers extract the schema and mapping information. Load Java source into the repository, and let
-      sequencers extract the class structure, JavaDoc, and annotations. Load a PNG, JPEG, or other image into the repository,
-      and let sequencers extract the metadata from the image and save it in the repository. The same with XSDs, WSDL, WS
-      policies, UML, MetaMatrix models, etc.</para>
-    <para>
-      JBoss DNA sequencers sit on top of existing JCR repositories (including federated repositories) - they basically extract
-      more useful information from what's already stored in the repository. And they use the existing JCR event and versioning system. Each
-      sequencer typically processes a single kind of file format or a single kind of content. </para>
-    <para>The following sequencers are included in JBoss DNA:
-      <itemizedlist>
-        <listitem>
-          <para>
-            <emphasis role="strong">Image sequencer</emphasis>
-            - A sequencer that processes the binary content of an image file, extracts the metadata for the image, and then
-            writes that image metadata to the repository. It gets the file format, image resolution, number of bits per pixel
-            (and optionally number of images), comments and physical resolution from JPEG, GIF, BMP, PCX, PNG, IFF, RAS, PBM,
-            PGM, PPM, and PSD files. (This sequencer may be improved in the future to also extract EXIF metadata from JPEG
-            files; see <ulink url="http://jira.jboss.org/jira/browse/DNA-26">DNA-26</ulink>.)
-          </para>
-        </listitem>
-        <listitem>
-          <para>
-            <emphasis role="strong">MP3 sequencer</emphasis>
-            - A sequencer that processes the contents of an MP3 audio file, extracts the metadata for the file, and then
-            writes that image metadata to the repository. It gets the title, author, album, year, and comment.  
-            (This sequencer may be improved in the future to also extract other ID3 metadata from other audio file formats; see
-            <ulink url="http://jira.jboss.org/jira/browse/DNA-66">DNA-66</ulink>.)
-          </para>
-        </listitem>
-        <listitem>
-          <para>
-            <emphasis role="strong">ZIP Archive Sequencer</emphasis>
-            - Process ZIP archive files to extract (explode) the contents into the repository.
-          </para>
-        </listitem>
-        <listitem>
-          <para>
-            <emphasis role="strong">Java Source File Sequencer</emphasis>
-            - Process Java source files to extract the class structure (including annotations) into the repository.
-          </para>
-        </listitem>
-        <listitem>
-          <para>
-            <emphasis role="strong">XML File Sequencer</emphasis>
-            - Process XML files to extract the structure into the repository.
-          </para>
-        </listitem>
-        <listitem>
-          <para>
-            <emphasis role="strong">Microsoft Office File Sequencer</emphasis>
-            - Process Microsoft Office documents, spreadsheets, and presentation files to extract their basic structure.
-						For example, the sequencer extracts the outline of a document, or the title and outline of a presentation. 
-          </para>
-        </listitem>
-        <listitem>
-          <para>
-            <emphasis role="strong">JCR Compact Node Definition (CND) File Sequencer</emphasis>
-            - Process the CND files defined by JCR, extracting the various node types with their property definitions and child
-						node definitions.
-          </para>
-        </listitem>
-      </itemizedlist>
-    </para>
-    <para>
-      As the community develops additional sequencers, they will also be included in JBoss DNA. Some of those that have been
-      identified as being useful include:
-      <itemizedlist>
-        <listitem>
-          <para>
-            <emphasis role="strong">Data Definition Language (DDL) Sequencer</emphasis>
-            - Process various dialects of DDL, including that from Oracle, SQL Server, MySQL, PostgreSQL, and others. May need
-            to be split up into a different sequencer for each dialect. This sequencer is being developed as part of a
-						Google Summer of Code 2009 project. (See
-            <ulink url="http://jira.jboss.org/jira/browse/DNA-26">DNA-26</ulink>
-            )
-          </para>
-        </listitem>
-        <listitem>
-          <para>
-            <emphasis role="strong">XML Schema Document (XSD) Sequencer</emphasis>
-            - Process XSD files and extract the various elements, attributes, complex types, simple types, groups, and other
-            information. (See
-            <ulink url="http://jira.jboss.org/jira/browse/DNA-32">DNA-32</ulink>
-            )
-          </para>
-        </listitem>
-        <listitem>
-          <para>
-            <emphasis role="strong">Web Service Definition Language (WSDL) Sequencer</emphasis>
-            - Process WSDL files and extract the services, bindings, ports, operations, parameters, and other information. (See
-            <ulink url="http://jira.jboss.org/jira/browse/DNA-33">DNA-33</ulink>
-            )
-          </para>
-        </listitem>
-        <listitem>
-          <para>
-            <emphasis role="strong">Hibernate File Sequencer</emphasis>
-            - Process Hibernate configuration (cfg.xml) and mapping (hbm.xml) files to extract the configuration and mapping
-            information. (See
-            <ulink url="http://jira.jboss.org/jira/browse/DNA-61">DNA-61</ulink>
-            )
-          </para>
-        </listitem>
-        <listitem>
-          <para>
-            <emphasis role="strong">XML Metadata Interchange (XMI) Sequencer</emphasis>
-            - Process XMI documents that contain UML models or models using another metamodel, extracting the model structure
-            into the repository. (See
-            <ulink url="http://jira.jboss.org/jira/browse/DNA-31">DNA-31</ulink>
-            )
-          </para>
-        </listitem>
-        <listitem>
-          <para>
-            <emphasis role="strong">Java Archive (JAR) Sequencer</emphasis>
-            - Process JAR files to extract (explode) the contents into the classes and file resources. (See
-            <ulink url="http://jira.jboss.org/jira/browse/DNA-64">DNA-64</ulink>
-            )
-          </para>
-        </listitem>
-        <listitem>
-          <para>
-            <emphasis role="strong">Java Class File Sequencer</emphasis>
-            - Process Java class files (bytecode) to extract the class structure (including annotations) into the repository.
-            (See
-            <ulink url="http://jira.jboss.org/jira/browse/DNA-62">DNA-62</ulink>
-            )
-          </para>
-        </listitem>
-        <listitem>
-          <para>
-            <emphasis role="strong">PDF Sequencer</emphasis>
-            - Process PDF files to extract the document metadata, including table of contents. (See
-            <ulink url="http://jira.jboss.org/jira/browse/DNA-50">DNA-50</ulink>
-            )
-          </para>
-        </listitem>
-        <listitem>
-          <para>
-            <emphasis role="strong">Maven 2 POM Sequencer</emphasis>
-            - Process Maven 2 Project Object Model (POM) files to extract the project information, dependencies, plugins, and
-            other content. (See
-            <ulink url="http://jira.jboss.org/jira/browse/DNA-24">DNA-24</ulink>
-            )
-          </para>
-        </listitem>
-        <listitem>
-          <para>
-            <emphasis role="strong">MP3 and MP4 Sequencer</emphasis>
-            - Process MP3 and MP4 audio files to extract the name of the song, artist, album, track number, and other metadata.
-            (See
-            <ulink url="http://jira.jboss.org/jira/browse/DNA-30">DNA-30</ulink>
-            )
-          </para>
-        </listitem>
-      </itemizedlist>
-    </para>
-    <para>
-      The
-      <link linkend="using_dna">examples</link>
-      in this book go into more detail about how sequencers are managed and used, and
-      <link linkend="custom_sequencers">Chapter 5</link>
-      goes into detail about how to write custom sequencers.
-    </para>
-  </sect1>
-  <sect1 id="federation">
-    <title>JCR and federated repositories</title>
-    <para>There is a lot of information stored in many of different places: databases, repositories, SCM systems,
-      registries, file systems, services, etc. The purpose of the federation engine is to allow applications to use the JCR API
-      to access that information as if it were all stored in a single JCR repository, but to really leave the information where
-      it is.</para>
-    <para>Why not just copy or move the information into a JCR repository?  Moving it is probably pretty difficult, since most 
-			likely existing applications rely upon that information being where it is.  All of those applications
-			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 creates issues with knowing which information is accurate.
-		</para>
-    <para>The JBoss DNA allows lets us leave the information where it is, yet provide access to that information to new applications through
-			the JCR API.  As the existing applications update the information in the original systems, applications using JBoss DNA also see
-			these updates.  JCR clients	even get the benefit of using JCR observation to be notified of the changes.  And if a JBoss DNA repository is
-      configured to allow updates, client applications can change the information in the repository and JBoss DNA will propagate
-      those changes down to the original source.</para>
-    <sect2 id="repository-connectors">
-      <title>Connecting to information sources</title>
-      <para>
-        JBoss DNA uses connectors to interact with different information sources to get at the content
-        in those systems. We already have some connectors, including:</para>
-      <itemizedlist>
-        <listitem>
-          <para>
-            <emphasis role="strong">In-Memory Connector</emphasis>
-            - Uses a Map instance as a repository. This is a simple connector that works really well for small and transient graphs.
-          </para>
-        </listitem>
-        <listitem>
-          <para>
-            <emphasis role="strong">JBoss Cache Connector</emphasis>
-            - Uses a JBoss Cache instance as a repository.  JBoss Cache is a powerful cache capable of persisting the information
- 						and being clustered for concurrent use by multiple processes.
-          </para>
-        </listitem>
-        <listitem>
-          <para>
-            <emphasis role="strong">Federation Connector</emphasis>
-            - Creates a single repository by accessing and federating the information in multiple other repository sources.
-						This is a powerful connector that is discussed in more detail in the <link linkend="federated_repositories">next section</link>.
-          </para>
-        </listitem>
-        <listitem>
-          <para>
-            <emphasis role="strong">File System Connector</emphasis>
-            - Expose the files and directories on a file system through JCR.
-          </para>
-        </listitem>
-        <listitem>
-          <para>
-            <emphasis role="strong">JPA-based Storage Connector</emphasis>
-            - Store and access information in a relational database through JPA. Also useful for persisting information in the federated
-            repository not stored elsewhere.
-          </para>
-        </listitem>
-      </itemizedlist>
-			<para>We're working on a few other connectors:</para>
-      <itemizedlist>
-        <listitem>
-          <para>
-            <emphasis role="strong">JDBC Metadata Connector</emphasis>
-            - Connect to relational databases via JDBC and expose their schema as content in a repository.
-          </para>
-        </listitem>
-        <listitem>
-          <para>
-            <emphasis role="strong">SVN Connector</emphasis>
-            - Interact with Subversion software configuration management (SCM) repositories to expose the managed resources
-            through JCR. Consider using the
-            <ulink url="http://svnkit.com/">SVNkit</ulink>
-            (dual license) library for an API into Subversion.
-          </para>
-        </listitem>        
-      </itemizedlist>
-			<para>And even more connectors that are planned:</para>
-      <itemizedlist>
-        <listitem>
-          <para>
-            <emphasis role="strong">JCR Repository Connector</emphasis>
-            - Connect to and interact with other JCR repositories.
-          </para>
-        </listitem>
-        <listitem>
-          <para>
-            <emphasis role="strong">Maven 2 Repository Connector</emphasis>
-            - Access and expose the contents of a Maven 2 repository (either on the local file system or via HTTP) through
-            JCR.
-          </para>
-        </listitem>
-        <listitem>
-          <para>
-            <emphasis role="strong">UDDI Connector</emphasis>
-            - Interact with UDDI registries to integrate their content into a repository.
-          </para>
-        </listitem>
-        <listitem>
-          <para>
-            <emphasis role="strong">CVS Connector</emphasis>
-            - Interact with CVS software configuration management (SCM) repositories to expose the managed resources through
-            JCR.
-          </para>
-        </listitem>
-        <listitem>
-          <para>
-            <emphasis role="strong">Distributed Database Connector</emphasis>
-            - Store and access information in a
-            <ulink url="http://www.hypertable.org/">Hypertable</ulink>
-            or
-            <ulink url="http://hadoop.apache.org/hbase/">HBase</ulink>
-            distributed databases. Also useful for persisting information in the federated repository not stored elsewhere.
-          </para>
-        </listitem>
-      </itemizedlist>
-      <para>
-        If the connectors allow the information they contribute to be updated, they must provide an
-        <code>XAResource</code>
-        implementation that can be used with a Java Transaction Service. Connectors that provide read-only access need not
-        provide an implementation.
-      </para>
-      <para>
-        Also, connectors talk to
-        <emphasis>sources</emphasis>
-        of information, and it's quite likely that the same connector is used to talk to different sources. Each source contains
-        the configuration details (e.g., connection information, location, properties, options, etc.) for working with that
-        particular source, as well as a reference to the connector that should be used to establish connections to the source.
-        And of course, sources can be added or removed without having to stop and restart the federated repository.
-      </para>
-    </sect2>
-    <sect2 id="federated_repositories">
-      <title>Federated repositories</title>
-      <para> The federation connector works by effectively building up a single graph by querying each source and merging or
-        unifying the responses. This information is cached, which improves performance, reduces the number of (potentially
-        expensive) remote calls, reduces the load on the sources, and helps mitigate problems with source availability. As
-        clients interact with the repository, this cache is consulted first. When the requested portion of the graph (or
-        "subgraph") is contained completely in the cache, it is retuned immediately. However, if any part of the requested
-        subgraph is not in the cache, each source is consulted for their contributions to that subgraph, and any results are
-        cached.</para>
-      <para> This basic flow makes it possible for the federated repository to build up a local cache of the integrated graph
-        (or at least the portions that are used by clients). In fact, the federated repository caches information in a manner
-        that is similar to that of the Domain Name System (DNS). As sources are consulted for their contributions, the source
-        also specifies whether it is the authoritative source for this information (some sources that are themselves federated
-        may not be the information's authority), whether the information may be modified, the time-to-live (TTL) value (the time
-        after which the cached information should be refreshed), and the expiration time (the time after which the cached
-        information is no longer valid). In effect, the source has complete control over how the information it contributes is
-        cached and used.</para>
-      <para>
-        The federated repository also needs to incorporate
-        <emphasis>negative caching</emphasis>
-        , which is storage of the knowledge that something does not exist. Sources can be configured to contribute information
-        only below certain paths (e.g.,
-        <code>/A/B/C</code>
-        ), and the federation engine can take advantage of this by never consulting that source for contributions to information
-        on other paths. However, below that path, any negative responses must also be cached (with appropriate TTL and expiry
-        parameters) to prevent the exclusion of that source (in case the source has information to contribute at a later time)
-        or the frequent checking with the source.
-      </para>
-    </sect2>
-    <sect2 id="federation_queries">
-      <title>Searching and querying</title>
-      <para> The JBoss DNA federated repository will support queries against the integrated and unified graph. In some
-        situations the query can be determined to apply to a single source, but in most situations the query must be planned
-        (and possibly rewritten) such that it can be pushed down to all the appropriate sources. Also, the cached results must
-        be consulted prior to returning the query results, as the results from one source might have contributions from another
-        source.</para>
-      <para>Searching the whole federated repository is also important. This allows users to simply supply a handful of
-        search terms, and to get results that are ranked based upon how close each result is to the search terms. (Searching is
-        very different from querying, which involves specifying the exact semantics of what is to be searched and how the
-        information is to be compared.) JBoss DNA will incorporate a search engine (e.g., likely to be Lucene) and will populate
-        the engine's indexes using the federated content and the cached information. Notifications of changing information will
-        be reflected in the indexes, but some sources may want to explicitly allow or disallow periodic crawling of their
-        content.</para>
-    </sect2>
-    <sect2 id="federation_updates">
-      <title>Updating content</title>
-      <para>
-        The JBoss DNA federated repositories also make it possible for client applications to make changes to the unified graph
-        within the context of distributed transactions. According to the JCR API, client applications use the Java Transaction
-        API (JTA) to control the boundaries of their transactions. Meanwhile, the federated repository uses a
-        <ulink url="http://www.jboss.org/jbosstm/">distributed transaction service</ulink>
-        to coordinate the XA resources provided by the connectors.
-      </para>
-      <para> It is quite possible that clients add properties to nodes in the unified graph, and that this information cannot be
-        handled by the same underlying source that contributed to the node. In this case, the federated repository can be
-        configured with a fallback source that will be used used to store this "extra" information.</para>
-      <para>
-        It is a goal that non-XA sources (i.e., sources that use connectors without XA resources) can participate in distributed
-        transactions through the use of
-        <emphasis>compensating transactions</emphasis>
-        . Because the JBoss DNA federation engine implements the JCR observation system, it is capable of recording all of the
-        changes made to the distributed graph (and those changes sent to each updatable source). Therefore, if a non-XA source
-        is involved in a distributed transaction that must be rolled back, any changes made to non-XA sources can be undone. (Of
-        course, this does not make the underlying source transactional: non-transactional sources still may expose the interim
-        changes to other clients.)
-      </para>
-    </sect2>
-    <sect2 id="federation_events">
-      <title>Observing changes</title>
-      <para> The JCR API supports observing a repository to receive notifications of additions, changes and deletions of nodes
-        and properties. The JBoss DNA federated repository will support this API through two primary means.</para>
-      <para> When the changes are made through the federated repository, the JBoss DNA federation engine is well aware of the
-        set of changes that have been (or are being) made to the unified graph. These events are directly propagated to
-        listeners.</para>
-      <para> Sources have the ability to publish events, making it possible for the JBoss DNA federation engine and clients that
-        have registered listeners to be notified of changes in the information managed by that source. These events are first
-        processed by the federation engine and possibly altered based upon contributions from other sources. (The federation
-        engine also uses these events to update or purge information in the cache, which may add to the event set.) The
-        resulting (and possibly altered) event set is then sent to all client listeners.</para>
-    </sect2>
-  </sect1>
-</chapter>

Added: trunk/docs/gettingstarted/src/main/docbook/en-US/content/use_cases.xml
===================================================================
--- trunk/docs/gettingstarted/src/main/docbook/en-US/content/use_cases.xml	                        (rev 0)
+++ trunk/docs/gettingstarted/src/main/docbook/en-US/content/use_cases.xml	2009-06-07 22:33:45 UTC (rev 989)
@@ -0,0 +1,157 @@
+<?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 chapter 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="use_cases">
+	<title>JBoss DNA Use Cases</title>
+	<para>There are lots of ways to use JBoss DNA in your own applications, but this chapter attempts to show some representative
+		scenarios that take advantage of JBoss DNA's support for the JCR API as well as the federation, integration, and sequencing 
+		capabilities.
+	</para>
+	<sect1 id="service_repository">
+		<title>Service repository</title>
+		<para>
+			In a SOA environment, one important component is a service registry that provides versioned storage of all the artifacts
+			that describe the services, their capabilities/restrictions, and the policies that surround them.  Service repositories
+			contain information that define the services and their message models, ownership, availability, security requirements/abilities, auditing, 
+			funding, monitoring, provisioning, provenance, usage, discovery mechanism, configuration, documentation, relationships
+			to other services, classification taxonomies, ontologies, and many other important aspects.
+		</para>
+		<para>
+			A JCR repository provides an excellent starting point for a service repository.  The ability to store a wide range of
+			content, ranging from structured information to documents, means that a JCR repository can offer the flexibility
+			to manage and organize the information while maintaining the ability to adapt the structure and schema as needs evolve
+			over time.
+		</para>
+		<para>
+			A service repository will contain lots of information represented in different forms, and it's important that the repository
+			make it easy for users to quickly find what they need.  Organization of the information (probably in multiple hierarchies and with tags) 
+			is important, but more important is the ability for users to use simple searching (or more advanced queries) to return ranked 
+			results that match the criteria.	For search to be effective, it is important that the repository understand the different 
+			kinds of artifacts that are uploaded and the information they contain.  
+		</para>
+		<para>
+			JCR repositories are naturally searchable and queryable, but also can be used to integrate a taxonomy (or folksonomic tags) 
+			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, 
+			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,
+			resource declarations, documentation, presentations, ontologies, etc.
+		</para>
+		<para>
+			It is also desirable that the service registry can provide accurate and up-to-date information about where the services are deployed
+			and their current health.  The best way to do this would be to access this information directly from the other components of the SOA, 
+			such as the Enterprise Service Bus and the management/monitoring system. JBoss DNA connectors might allow the service registry
+			to access an ESB to discover which services are deployed, which are running, and automatically annotate the services in the registry
+			with this dynamic information.  In fact, the service registry could cache this information to provide a safe and low-impact mechanism
+			for obtaining this information to other applications without having each application hit the ESB.
+		</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 
+			(dev, test, production, etc.).
+		</para>
+		<para>
+			By using JBoss DNA, a service repository could manage the wide range of artifacts required in a SOA or web-oriented architecture,
+			yet be able to present a unified view of all service information.
+		</para>
+	</sect1>
+	<sect1 id="data_source_management">
+		<title>Manage data sources and services</title>
+		<para>
+			Many enterprise environments include numerous databases and data services, yet there is often no single place where all
+			these different assets are described or related.  A data source/service repository could provide information about the
+			many databases running within the enterprise as well as their documentation, schema history, availability, usage policies,
+			current users of the data (including applications, ETL processes, reporting), geographic deployments and synchronization, 
+			and the provenance of the data.
+		</para>
+		<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.
+		</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,
+			and how are they all related), and it can integrate with management systems to provide information about
+			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.
+		</para>
+	</sect1>
+	<sect1 id="configuration_repository">
+		<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
+			sometimes corrupt the environment, but creating a more robust configuration management system is often way beyond the desired
+			effort.
+		</para>
+		<para>
+			An embedded JBoss DNA repository can provide a more formal and flexible configuration system with little effort.  JCR's
+			event system allows the system to be notified when the configuration changes, and versioning can help guarantee the ability
+			to revert back to a previous (valid) configuration.  JBoss DNA connectors can be used to integrate the files on the file system
+			into the configuration system, keeping it natural for those wanting to view and change the configuration via the files.
+			JBoss DNA sequencers can even process the configuration files to extract a more structured view of the system.
+			And because JBoss DNA can used with a minimal footprint, it provides the ability to manage and version the configuration
+			with little overhead.
+		</para>
+		<para>
+			JBoss DNA can even be used to centralize the configuration definition for a clustered or distributed system.  In this mode,
+			the configuration is managed in a central repository that is remotely accessible by the application.  When a process is started,
+			it examines the repository and reads the content containing its configuration.  The application can monitor the configuration for
+			changes so that it can modify itself and its components.  
+			For larger deployments, a central "enterprise configuration" repository can house the configuration of different kinds of systems,
+			and can even be managed and manipulated through JCR.
+		</para>
+		<para>
+			As we'll see in the <link linkend="using_dna">next chapter</link>, this is actually the way in which JBoss DNA manages
+			its own configuration.  In the embedded case, the configuration repository is simply a local (in-memory) repository that
+			is populated by the configuration file (or programmatic API).  In a clustered mode, the repository is centralized.  But either
+			way, to JBoss DNA the configuration is always defined in a repository.
+		</para>
+	</sect1>
+	<sect1 id="use_case_whats_next">
+		<title>What's next</title>
+		<para>
+			The scenarios described in this chapter are representative of some of the ways in which JBoss DNA can be used, and hopefully
+			give you ideas about how you can leverage JBoss DNA in your application or library.
+		</para>
+		<para>
+			In the <link linkend="using_dna">next chapter</link>, we'll show how you can set up JBoss DNA and use it via the standard JCR API.
+		</para>
+	</sect1>
+</chapter>


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

Added: trunk/docs/gettingstarted/src/main/docbook/en-US/content/using_dna.xml
===================================================================
--- trunk/docs/gettingstarted/src/main/docbook/en-US/content/using_dna.xml	                        (rev 0)
+++ trunk/docs/gettingstarted/src/main/docbook/en-US/content/using_dna.xml	2009-06-07 22:33:45 UTC (rev 989)
@@ -0,0 +1,371 @@
+<?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 chapter 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="using_dna">
+	<title>Using JBoss DNA</title>
+	<para>Using JBoss DNA within your application is actually quite straightforward.  As you'll see in this chapter,
+		the first step is setting up JBoss DNA and starting the <code>JcrEngine</code>.  After that, you obtain the
+		<code>javax.jcr.Repository</code> instance for a named repository and just use the standard JCR API throughout your
+		application.
+	</para>
+	<sect1 id="jcr_engine">
+		<title>JBoss DNA's JcrEngine</title>
+		<para>
+			JBoss DNA encapsulates everything necessary to run one or more JCR repositories into a single &JcrEngine; instance.
+			This includes all underlying repository sources, the pools of connections to the sources, the sequencers,
+			the MIME type detector(s), and the &Repository; implementations.
+		</para>
+		<para>
+			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 = ...
+JcrEngine engine = config.build();
+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>
+		<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>
+		<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)
+			present at the time of the <code>shutdown()</code> call will be allowed to finish.  
+			In essence, <code>shutdown()</code> is a <emphasis>graceful</emphasis> request, and since it may take some time to complete,
+			you can wait until the shutdown has completed by simply calling <code>awaitTermination(...)</code> as shown above.
+			This method will block until the engine has indeed shutdown or until the supplied time duration has passed (whichever comes first).
+			And, yes, you can call the <code>awaitTermination(...)</code> method repeatedly if needed.
+		</para>
+	</sect1>
+	<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:
+			<itemizedlist>
+				<listitem>
+					<para><emphasis role="strong"><code>Repository sources</code></emphasis> are the POJO objects that each describe a particular
+					location where content is stored.  Each repository source object is an instance of a JBoss DNA connector, and is configured
+					with the properties that particular source.  JBoss DNA's &RepositorySource; classes are analogous to JDBC's &DataSource; classes -
+					they are implemented by specific connectors (aka, "drivers") for specific kinds of repository sources (aka, "databases").
+					Similarly, a &RepositorySource; instance is analogous to a &DataSource; instance, with bean properties for each configurable
+					parameter.  Therefore, each repository source definition must supply the name of the &RepositorySource; class, any
+					bean properties, and, optionally, the classpath that should be used to load the class. </para>
+				</listitem>
+				<listitem>
+					<para><emphasis role="strong"><code>Repositories</code></emphasis> define the JCR repositories that are available.  Each
+					repository has a unique name that is used to obtain the &Repository; instance from the &JcrEngine;'s <code>getRepository(String)</code>
+					method, but each repository definition also can include the predefined namespaces (other than those automatically defined by
+					JBoss DNA), various options, and the node types that are to be available in the repository without explicit registration
+					through the JCR API.</para>
+				</listitem>
+				<listitem>
+					<para><emphasis role="strong"><code>Sequencers</code></emphasis> define the particular sequencers that are available for use.
+					Each sequencer definition provides the path expressions governing which nodes in the repository should be sequenced when those nodes change,
+					and where the resulting output generated by the sequencer should be placed.  The definition also must state the name of 
+					the sequencer class, any bean properties and, optionally, the classpath that should be used to load the class.</para>
+				</listitem>
+				<listitem>
+					<para><emphasis role="strong"><code>MIME type detectors</code></emphasis> define the particular MIME type detector(s) that should
+					be made available.  A MIME type detector does exactly what the name implies: it attempts to determine the MIME type given a
+					"filename" and contents.  JBoss DNA automatically uses a detector that uses the file extension to identify the MIME type,
+					but also provides an implementation that uses an external library to identify the MIME type based upon the contents.
+					The definition must state the name of the detector class, any bean properties and, optionally, the classpath that should 
+					be used to load the class.</para>
+				</listitem>
+			</itemizedlist>
+		</para>
+		<para>
+			There really are three options:
+			<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>
+				</listitem>
+				<listitem>
+					<para><emphasis role="strong"><code>Load 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>
+				</listitem>
+				<listitem>
+					<para><emphasis role="strong"><code>Programmatic configuration</code></emphasis> is always possible, even if the configuration is loaded
+					from a file or repository.  Using the &JcrConfiguration;'s API, you can define (or update or remove) all of the definitions that make
+					up a configuration.</para>
+				</listitem>
+			</itemizedlist>
+		</para>
+		<para>
+			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>
+			<para>
+				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>
+			<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.  
+			</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 &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
+				this second parameter is very useful.)
+			</para>
+			<para>
+				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"?>
+<configuration xmlns="http://www.jboss.org/dna/1.0" xmlns:jcr="http://www.jcp.org/jcr/1.0">
+	  <!-- 
+	  Define the JCR repositories 
+	  -->
+	  <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">
+	          <options jcr:primaryType="dna:options"/>
+	              <jaasLoginConfigName jcr:primaryType="dna:option" dna:value="dna-jcr"/>
+	          </options>
+	      </dna:repository>
+	  </dna:repositories>
+    <!-- 
+    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">
+            <!-- Define the name of the workspace used by default.  Optional, but convenient. -->
+            <defaultWorkspaceName>workspace2</defaultWorkspaceName>
+        </dna:source>
+    </dna:sources>
+    <!-- 
+    Define the sequencers. This is an optional section. For this example, we're not using any sequencers. 
+    -->
+    <dna:sequencers>
+        <!--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>
+    <dna:mimeTypeDetectors>
+        <dna:mimeTypeDetector jcr:name="Detector" dna:description="Standard extension-based MIME type detector"/>
+    </dna:mimeTypeDetectors>
+</configuration>
+ ]]></programlisting>
+		</sect2>
+		<sect2 id="loading_from_repository">
+			<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>
+				method:
+			</para>
+    	<programlisting role="JAVA"><![CDATA[
+RepositorySource configSource = ...
+JcrConfiguration config = new JcrConfiguration();
+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;.
+				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.)
+			</para>
+		</sect2>
+		<sect2 id="programmatic_configuration">
+			<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
+				dynamic information.
+			</para>
+			<para>
+				The &JcrConfiguration; class was designed to have an easy-to-use API that makes it easy to configure each of the different kinds of
+				components, especially when using an IDE with code completion.  Here are several examples:
+			</para>
+			<sect3 id="programmatically_configuring_sources">
+				<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>
+    		<programlisting role="JAVA"><![CDATA[
+JcrConfiguration config = ...
+config.repositorySource("source A")
+      .usingClass(InMemoryRepositorySource.class)
+      .setDescription("The repository for our content")
+      .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.
+					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>
+				<note>
+					<para>Each time <code>repositorySource(String)</code> is called, it will either load the existing definition with the supplied
+					name or will create a new definition if one does not already exist.  To remove a definition, simply call <code>remove()</code>
+					on the result of <code>repositorySource(String)</code>.
+					The set of existing definitions can be accessed with the <code>repositorySources()</code> method.
+					</para>
+				</note>
+			</sect3>
+			<sect3 id="programmatically_configuring_repositories">
+				<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 = ...
+config.repository("repository A")
+      .addNodeTypes("myCustomNodeTypes.cnd")
+      .setSource("source 1")
+      .registerNamespace("acme","http://www.example.com/acme")
+      .setOption(JcrRepository.Option.JAAS_LOGIN_CONFIG_NAME, "dna-jcr");
+ ]]></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
+					that will be made available when the repository is accessed.  It also defines the "http://www.example.com/acme" namespace,
+					and finally sets the "JAAS_LOGIN_CONFIG_NAME" option to define the name	of the JAAS login configuration that should be used by 
+					the JBoss DNA repository.
+				</para>
+				<note>
+					<para>Each time <code>repository(String)</code> is called, it will either load the existing definition with the supplied
+					name or will create a new definition if one does not already exist.  To remove a definition, simply call <code>remove()</code>
+					on the result of <code>repository(String)</code>.
+					The set of existing definitions can be accessed with the <code>repositories()</code> method.
+					</para>
+				</note>
+			</sect3>
+			<sect3 id="programmatically_configuring_sequencers">
+				<title>Sequencers</title>
+				<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 = ...
+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>
+				<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 
+					"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.)
+					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>
+				<note>
+					<para>Each time <code>sequencer(String)</code> is called, it will either load the existing definition with the supplied
+					name or will create a new definition if one does not already exist.  To remove a definition, simply call <code>remove()</code>
+					on the result of <code>sequencer(String)</code>.
+					The set of existing definitions can be accessed with the <code>sequencers()</code> method.
+					</para>
+				</note>
+			</sect3>
+			<sect3 id="programmatically_configuring_mime_type_detectors">
+				<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 = ...
+config.mimeTypeDetector("Extension Detector")
+      .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).
+				</para>
+				<note>
+					<para>Each time <code>mimeTypeDetector(String)</code> is called, it will either load the existing definition with the supplied
+					name or will create a new definition if one does not already exist.  To remove a definition, simply call <code>remove()</code>
+					on the result of <code>mimeTypeDetector(String)</code>.  
+					The set of existing definitions can be accessed with the <code>mimeTypeDetectors()</code> method.
+					</para>
+				</note>
+			</sect3>
+		</sect2>
+	</sect1>
+	<sect1 id="using_dna_whats_next">
+		<title>What's next</title>
+		<para>
+			This chapter outline how you configure JBoss DNA, how you then access a <code>javax.jcr.Repository</code> instance,
+			and use the standard JCR API to interact with the repository. The
+			<link linkend="downloading_and_running">next chapter </link> walks you through downloading
+			and running the JBoss DNA examples. 
+		</para>
+	</sect1>
+</chapter>


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

Deleted: trunk/docs/gettingstarted/src/main/docbook/en-US/content/using_dna_for_sequencing.xml
===================================================================
--- trunk/docs/gettingstarted/src/main/docbook/en-US/content/using_dna_for_sequencing.xml	2009-06-07 15:05:15 UTC (rev 988)
+++ trunk/docs/gettingstarted/src/main/docbook/en-US/content/using_dna_for_sequencing.xml	2009-06-07 22:33:45 UTC (rev 989)
@@ -1,558 +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
-  -->
-<!DOCTYPE chapter PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN" "http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd">
-<chapter id="using_dna_for_sequencing">
-	<title>Using JBoss DNA for Sequencing</title>
-	<para>As we've mentioned before, JBoss DNA is able to work with existing JCR repositories.  Your client applications
-  	make changes to the information in those repositories, and JBoss DNA automatically uses its sequencers to extract
-  	additional information from the uploaded files.</para>
-	<note>
-		<para>Configuring JBoss DNA services is a bit more manual than is ideal. As you'll see, JBoss DNA uses dependency
-      injection to allow a great deal of flexibility in how it can be configured and customized. But this flexibility
-      makes it more difficult for you to use.  We understand this, and will soon provide a much easier way to set up 
-			and manage JBoss DNA.  Current plans are to use the <ulink url="http://www.jboss.org/jbossmc">JBoss Microcontainer</ulink>
-			along with a configuration repository.</para>
-	</note>
-	<sect1 id="sequencing_service">
-		<title>Configuring the Sequencing Service</title>
-		<para>The JBoss DNA <emphasis>sequencing service</emphasis> is the component that manages the <emphasis>sequencers</emphasis>, 
-			reacting to changes in JCR repositories and then running the appropriate sequencers.
-      This involves processing the changes on a node, determining which (if any) sequencers should be run on that node,
-      and for each sequencer constructing the execution environment, calling the sequencer, and saving the information
-      generated by the sequencer.</para>
-		<para>To set up the sequencing service, an instance is created, and dependent components are injected into
-      the object.  This includes among other things:
-			<itemizedlist>
-				<listitem>
-					<para>An <emphasis>execution context</emphasis> that defines the context in which the service runs, including
-			        a factory for JCR sessions given names of the repository and workspace.  This factory must be configured,
-			        and is how JBoss DNA knows about your JCR repositories and how to connect to them.  More on this a bit later.</para>
-				</listitem>
-				<listitem>
-					<para>An <code>java.util.concurrent.ExecutorService</code> used to execute the sequencing activites.  If none
-			        is supplied, a new single-threaded executor is created by calling <code>Executors.newSingleThreadExecutor()</code>.
-			        (This can easily be changed by subclassing and overriding the <code>SequencerService.createDefaultExecutorService()</code> method.)</para>
-				</listitem>
-				<listitem>
-					<para>Filters for sequencers and events.  By default, all sequencers are considered for "node added", "property added"
-			        and "property changed" events.</para>
-				</listitem>
-			</itemizedlist>
-    </para>
-		<para>As mentioned above, the <code>JcrExecutionContext</code> provides access to a <code>SessionFactory</code> that is used
-      by JBoss DNA to establish sessions to your JCR repositories.  Two implementations are available:
-			<itemizedlist>
-				<listitem>
-					<para>The <code>JndiSessionFactory</code> looks up JCR <code>Repository</code> instances in JNDI using
-			          names that are supplied when creating sessions.  This implementation also has methods to set the
-			          JCR <code>Credentials</code> for a given workspace name.</para>
-				</listitem>
-				<listitem>
-					<para>The <code>SimpleSessionFactory</code> has methods to register the JCR <code>Repository</code> instances
-			          with names, as well as methods to set the JCR <code>Credentials</code> for a given workspace name.</para>
-				</listitem>
-			</itemizedlist>
-      You can use the <code>SimpleExecutionContext</code> implementation of <code>ExecutionContext</code> and supply
-      a <code>SessionFactory</code> instance, or you can provide your own implementation.</para>
-		<para>Here's an example of how to instantiate and configure the SequencingService:</para>
-    <programlisting role="JAVA"><![CDATA[
-SimpleSessionFactory sessionFactory = new SimpleSessionFactory();
-sessionFactory.registerRepository("Repository", this.repository);
-Credentials credentials = new SimpleCredentials("jsmith", "secret".toCharArray());
-sessionFactory.registerCredentials("Repository/Workspace1", credentials);
-JcrExecutionContext context = new JcrExecutionContext(sessionFactory,"Repository/Workspace1");
-
-// Create the sequencing service, passing in the execution context ...
-SequencingService sequencingService = new SequencingService();
-sequencingService.setExecutionContext(context);
-  ]]></programlisting>
-		<para>After the sequencing service is created and configured, it must be started.  The SequencingService
-      has an <emphasis>administration object</emphasis> (that is an instance of <code>ServiceAdministrator</code>)
-      with <code>start()</code>, <code>pause()</code>, and <code>shutdown()</code> methods.  The latter method will 
-      close the queue for sequencing, but will allow sequencing operations already running to complete normally.
-      To wait until all sequencing operations have completed, simply call the <code>awaitTermination</code> method
-      and pass it the maximum amount of time you want to wait.</para>
-		<programlisting role="JAVA"><![CDATA[sequencingService.getAdministrator().start();
-]]></programlisting>
-		<para>The sequencing service must also be configured with the sequencers that it will use.  This is done using the
-      <code>addSequencer(SequencerConfig)</code> method and passing a <code>SequencerConfig</code> instance that
-      you create.  Here's the code that defines 3 sequencer configurations: 1 that places image metadata into
-      "<code><![CDATA[/images/<filename>]]></code>", another that places MP3 metadata into "<code><![CDATA[/mp3s/<filename>]]></code>",
-      and a third that places a structure that represents the classes, methods, and attributes found within Java source into 
-      "<code><![CDATA[/java/<filename>]]></code>".</para>
-    <programlisting role="JAVA"><![CDATA[
-String name = "Image Sequencer";
-String desc = "Sequences image files to extract the characteristics of the image";
-String classname = "org.jboss.dna.sequencer.image.ImageMetadataSequencer";
-String[] classpath = null; // Use the current classpath
-String[] pathExpressions = {"//(*.(jpg|jpeg|gif|bmp|pcx|png)[*])/jcr:content[@jcr:data] => /images/$1"};
-SequencerConfig imageSequencerConfig = new SequencerConfig(name, desc, classname, 
-                                                           classpath, pathExpressions);
-sequencingService.addSequencer(imageSequencerConfig);
-
-name = "MP3 Sequencer";
-desc = "Sequences MP3 files to extract the ID3 tags from the audio file";
-classname = "org.jboss.dna.sequencer.mp3.Mp3MetadataSequencer";
-pathExpressions = {"//(*.mp3[*])/jcr:content[@jcr:data] =&gt; /mp3s/$1"};
-SequencerConfig mp3SequencerConfig = new SequencerConfig(name, desc, classname, 
-                                                         classpath, pathExpressions);
-sequencingService.addSequencer(mp3SequencerConfig);
-
-name = "Java Sequencer";
-desc = "Sequences java files to extract the characteristics of the Java source";
-classname = "org.jboss.dna.sequencer.java.JavaMetadataSequencer";
-pathExpressions = {"//(*.java[*])/jcr:content[@jcr:data] => /java/$1"};
-SequencerConfig javaSequencerConfig = new SequencerConfig(name, desc, classname, 
-                                                          classpath, pathExpressions);
-this.sequencingService.addSequencer(javaSequencerConfig);
-  ]]></programlisting>
-    <para>Each configuration defines several things, including the name, description, and sequencer implementation class.
-	    The configuration also defines the classpath information, which can be passed to the <code>ExecutionContext</code> to get
-	    a Java classloader with which the sequencer class can be loaded.  (If no classpath information is provided, as is done
-	    in the code above, the application class loader is used.)  The configuration also specifies the path expressions that
-	    identify the nodes that should be sequenced with the sequencer and where to store the output generated by the sequencer.
-	    Path expressions are pretty straightforward but are quite powerful, so before we go any further with the example,
-	    let's dive into path expressions in more detail.</para>
-		<sect2 id="path_expressions">
-			<title>Path Expressions</title>
-			<para>Path expressions consist of two parts: a selection criteria (or an input path) and an output path:</para>
-	    <programlisting><![CDATA[  inputPath => outputPath ]]></programlisting>
-			<para>The <emphasis>inputPath</emphasis> part defines an expression for the path of a node that is to be sequenced.
-			  Input paths consist of '<code>/</code>' separated segments, where each segment represents a pattern for a single node's
-			  name (including the same-name-sibling indexes) and '<code>@</code>' signifies a property name.</para>
-			<para>Let's first look at some simple examples:</para>
-			<table frame='all'>
-				<title>Simple Input Path Examples</title>
-				<tgroup cols='2' align='left' colsep='1' rowsep='1'>
-		      <colspec colname='c1' colwidth="1*"/>
-		      <colspec colname='c2' colwidth="1*"/>
-					<thead>
-						<row>
-				  		<entry>Input Path</entry>
-				  		<entry>Description</entry>
-						</row>
-					</thead>
-					<tbody>
-						<row><entry>/a/b</entry><entry>Match node "<code>b</code>" that is a child of the top level node "<code>a</code>". Neither node
-						     may have any same-name-sibilings.</entry></row>
-						<row><entry>/a/*</entry><entry>Match any child node of the top level node "<code>a</code>".</entry></row>
-						<row><entry>/a/*.txt</entry><entry>Match any child node of the top level node "<code>a</code>" that also has a name ending in "<code>.txt</code>".</entry></row>
-						<row><entry>/a/*.txt</entry><entry>Match any child node of the top level node "<code>a</code>" that also has a name ending in "<code>.txt</code>".</entry></row>
-						<row><entry>/a/b at c</entry><entry>Match the property "<code>c</code>" of node "<code>/a/b</code>".</entry></row>
-						<row><entry>/a/b[2]</entry><entry>The second child named "<code>b</code>" below the top level node "<code>a</code>".</entry></row>
-						<row><entry>/a/b[2,3,4]</entry><entry>The second, third or fourth child named "<code>b</code>" below the top level node "<code>a</code>".</entry></row>
-						<row><entry>/a/b[*]</entry><entry>Any (and every) child named "<code>b</code>" below the top level node "<code>a</code>".</entry></row>
-						<row><entry>//a/b</entry><entry>Any node named "<code>b</code>" that exists below a node named "<code>a</code>", regardless 
-						     of where node "<code>a</code>" occurs.  Again, neither node may have any same-name-sibilings.</entry></row>
-					</tbody>
-				</tgroup>
-			</table>
-			<para>With these simple examples, you can probably discern the most important rules.  First, the '<code>*</code>' is a wildcard character
-			  that matches any character or sequence of characters in a node's name (or index if appearing in between square brackets), and
-			  can be used in conjunction with other characters (e.g., "<code>*.txt</code>").</para>
-			<para>Second, square brackets (i.e., '<code>[</code>' and '<code>]</code>') are used to match a node's same-name-sibiling index.
-			  You can put a single non-negative number or a comma-separated list of non-negative numbers.  Use '0' to match a node that has no
-			  same-name-sibilings, or any positive number to match the specific same-name-sibling.</para>
-			<para>Third, combining two delimiters (e.g., "<code>//</code>") matches any sequence of nodes, regardless of what their names are 
-			  or how many nodes.  Often used with other patterns to identify nodes at any level matching other patterns. 
-				Three or more sequential slash characters are treated as two.</para>
-			<para>Many input paths can be created using just these simple rules.  However, input paths can be more complicated.  Here are some
-				more examples:</para>
-			<table frame='all'>
-				<title>More Complex Input Path Examples</title>
-				<tgroup cols='2' align='left' colsep='1' rowsep='1'>
-		      <colspec colname='c1' colwidth="1*"/>
-		      <colspec colname='c2' colwidth="1*"/>
-					<thead>
-						<row>
-				  		<entry>Input Path</entry>
-				  		<entry>Description</entry>
-						</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 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
-								 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
-						     "<code>something</code>". None of the nodes may have same-name-sibling indexes.</entry></row>
-					</tbody>
-				</tgroup>
-			</table>
-			<para>These examples show a few more advanced rules.  Parentheses (i.e., '<code>(</code>' and '<code>)</code>') can be used
-			  to define a set of options for names, as shown in the first and third rules.  Whatever part of the selected node's path
-			  appears between the parentheses is captured for use within the output path.  Thus, the first input path in the previous table
-			  would match node "<code>/a/b</code>", and "b" would be captured and could be used within the output path using "<code>$1</code>",
-			  where the number used in the output path identifies the parentheses.</para>
-			<para>Square brackets can also be used to specify criteria on a node's properties or children.  Whatever appears in between the square
-				brackets does not appear in the selected node.</para>
-		  <para>Let's go back to the previous code fragment and look at the first path expression:</para>
-		  <programlisting><![CDATA[  //(*.(jpg|jpeg|gif|bmp|pcx|png)[*])/jcr:content[@jcr:data] => /images/$1 ]]></programlisting>
-		  <para>This matches a node named "<code>jcr:content</code>" with property "<code>jcr:data</code>" but no siblings with the same name,
-		    and that is a child of a node whose name ends with "<code>.jpg</code>", "<code>.jpeg</code>", "<code>.gif</code>", "<code>.bmp</code>", "<code>.pcx</code>", 
-		    or  "<code>.png</code>" that may have any same-name-sibling index.  These nodes can appear at any level in the repository.
-			  Note how the input path capture the filename (the segment containing the file extension), including any same-name-sibling index.
-			  This filename is then used in the output path, which is where the sequenced content is placed.</para>
-		</sect2>
-		<sect2 id="path_expressions_in_example">
-			<title>Path Expressions Used in the Example</title>
-			<para>Now that we've covered path expressions, let's go back to the three sequencer configuration in the example.
-				Here they are again, with a description of what each path means:</para>
-			<table frame='all'>
-				<title>Path Expressions for the 3 Sequencers</title>
-				<tgroup cols='3' align='left' colsep='1' rowsep='1'>
-		      <colspec colname='c1' colwidth="1*"/>
-		      <colspec colname='c2' colwidth="1*"/>
-		      <colspec colname='c2' colwidth="1*"/>
-					<thead>
-						<row>
-				  		<entry>Input Path</entry>
-				  		<entry>Output Path</entry>
-				  		<entry>Description</entry>
-						</row>
-					</thead>
-					<tbody>
-						<row>
-							<entry><![CDATA[//(*.(jpg|jpeg|gif|bmp|pcx|png)[*])/jcr:content[@jcr:data]]]></entry>
-							<entry><![CDATA[/images/$1]]></entry>
-							<entry>Any node with a name ending in "<code>.jpg</code>", "<code>.jpeg</code>", "<code>.gif</code>", "<code>.bmp</code>", 
-							  "<code>.pcx</code>", or "<code>.png</code>", whether or not it has a same-name-sibling index, but that has a child named 
-								"<code>jcr:content</code>" with "<code>jcr:data</code>" property.  The node name representing the filename (including any
-								same-name-sibling index) is captured, and used to place the output in "<code><![CDATA[/images/<filename>]]></code>".</entry>
-						</row>
-						<row>
-							<entry><![CDATA[//(*.mp3[*])/jcr:content[@jcr:data]]]></entry>
-							<entry><![CDATA[/mp3s/$1]]></entry>
-							<entry>Any node with a name ending in "<code>.mp3</code>", whether or not it has a same-name-sibling index, but that has a child named 
-								"<code>jcr:content</code>" with "<code>jcr:data</code>" property.  The node name representing the filename (including any
-								same-name-sibling index) is captured, and used to place the output in "<code><![CDATA[/mp3s/<filename>]]></code>".</entry>
-						</row>
-						<row>
-							<entry><![CDATA[//(*.java[*])/jcr:content[@jcr:data]]]></entry>
-							<entry><![CDATA[/java/$1]]></entry>
-							<entry>Any node with a name ending in "<code>.java</code>", whether or not it has a same-name-sibling index, but that has a child named 
-								"<code>jcr:content</code>" with "<code>jcr:data</code>" property.  The node name representing the filename (including any
-								same-name-sibling index) is captured, and used to place the output in "<code><![CDATA[/java/<filename>]]></code>".</entry>
-						</row>
-					</tbody>
-				</tgroup>
-			</table>
-			<para>After these sequencer configurations are defined and added to the <code>SequencingService</code>,
-				the service is now ready to start reacting to changes in the repository and automatically looking for nodes to sequence.  
-				But we first need to wire the service into the repository to receive those change events.
-	      This is accomplished using the <code>ObservationService</code>
-	      described in the <link linkend="observation_service">next section</link>.</para>
-		</sect2>
-	</sect1>
-	<sect1 id="observation_service">
-		<title>Configuring the Observation Service</title>
-		<para>The JBoss DNA <code>ObservationService</code> is responsible for listening to one or more JCR repositories
-	    and multiplexing the events to its listeners.  Unlike JCR events, this framework embeds in the events the
-	    name of the repository and workspace that can be passed to a <code>SessionFactory</code> to obtain a session
-	    to the repository in which the change occurred.  This simple design makes it very easy for JBoss DNA to
-	    concurrently work with multiple JCR repositories.</para>
-		<para>Configuring an observation service is pretty easy, especially if you reuse the same <code>SessionFactory</code>
-	    supplied to the sequencing service.  Here's an example:</para>
-    <programlisting role="JAVA"><![CDATA[
-  this.observationService = new ObservationService(sessionFactory);
-  this.observationService.getAdministrator().start();
-  ]]></programlisting>
-		<note>
-			<para>Both <code>ObservationService</code> and <code>SequencingService</code> implement
-    		<code>AdministeredService</code>, which has a <code>ServiceAdministrator</code> used to start, pause, and shutdown the
-    		service.  In other words, the lifecycle of the services are managed in the same way.</para>
-		</note>
-		<para>After the observation service is started, listeners can be added.  The <code>SequencingService</code> implements the required
-    interface, and so it may be registered directly:</para>
-    <programlisting role="JAVA"><![CDATA[
-  observationService.addListener(sequencingService);
-  ]]></programlisting>
-		<para>Finally, the observation service must be wired to monitor one of your JCR repositories.  This is done with
-    	one of the <code>monitor(...)</code> methods:</para>
-    <programlisting role="JAVA"><![CDATA[
-  int eventTypes = Event.NODE_ADDED | Event.PROPERTY_ADDED | Event.PROPERTY_CHANGED;
-  observationService.monitor("Main Repository/Workspace1", eventTypes);
-  ]]></programlisting>
-		<para>At this point, the observation service is listening to a JCR repository and forwarding the appropriate events
-    	to the sequencing service, which will asynchronously process the changes and sequence the information added to or changed in the repository.
-    </para>
-	</sect1>
-	<sect1 id="shutting_down">
-		<title>Shutting down JBoss DNA services</title>
-		<para>The JBoss DNA services are utilizing resources and threads that must be released before your application is ready to shut down.
-    	The safe way to do this is to simply obtain the <code>ServiceAdministrator</code> for each service (via the <code>getServiceAdministrator()</code> method)
-    	and call <code>shutdown()</code>.  As previously mentioned, the shutdown method will simply prevent new work from being processed
-    	and will not wait for existing work to be completed.  If you want to wait until the service completes all its work, you must wait
-    	until the service terminates.  Here's an example that shows how this is done:</para>
-    <programlisting role="JAVA"><![CDATA[
-// Shut down the service and wait until it's all shut down ...
-sequencingService.getAdministrator().shutdown();
-sequencingService.getAdministrator().awaitTermination(5, TimeUnit.SECONDS);
-
-// Shut down the observation service ...
-observationService.getAdministrator().shutdown();
-observationService.getAdministrator().awaitTermination(5, TimeUnit.SECONDS);
-  ]]></programlisting>
-		<para>At this point, we've covered how to configure and use the JBoss DNA services in your application.
-    	The next chapter goes back to the <link linkend="downloading_and_running">sample application</link> to show how all 
-			these pieces fit together.</para>
-	</sect1>
-	<sect1 id="example_application_review">
-		<title>Reviewing the example application</title>
-		<para>Recall that the example application 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 an image sequencer 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.  Or, if the client uploads
-      MP3 audio files, the title, author, album, year, and comment are extracted from the audio file and stored in the repository.</para>
-		<para>
-      The example is comprised of 5 classes and 1 interface, located in the <code>src/main/java</code> directory:</para>
-    <programlisting><![CDATA[
-  org/jboss/example/dna/sequencers/ConsoleInput.java
-                                  /ContentInfo.java
-                                  /JavaInfo.java
-                                  /MediaInfo.java
-                                  /SequencingClient.java
-                                  /UserInterface.java
-  ]]></programlisting>
-		<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>.
-      <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
-      <code>UserInterface</code> at a later date. 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 automatically using conventional JUnit test cases, 
-			as demonstrated by the code in the <code>src/test/java</code> directory:</para>
-    <programlisting><![CDATA[
-  org/jboss/example/dna/sequencers/SequencingClientTest.java
-                                  /MockUserInterface.java
-  ]]></programlisting>
-		<para>If we look at the <code>SequencingClient</code> code, there are a handful of methods that encapsulate the various activities.</para>
-		<note>
-			<para>Some of the code samples included in this book have had some of the error handling and comments removed so that
-				the samples are more readable and concise.</para>
-		</note>
-		<para>The <code>startRepository()</code> method starts up an in-memory Jackrabbit JCR repository. The bulk of this method is simply 
-			gathering and passing the information required by Jackrabbit. Because Jackrabbit's <code>TransientRepository</code>
-      implementation shuts down after the last session is closed, the application maintains a session to ensure that the
-      repository remains open throughout the application's lifetime. And finally, the node type needed by the image sequencer is
-      registered with Jackrabbit.</para>
-		<programlisting role="JAVA"><![CDATA[
-public void startRepository() throws Exception {
-    if (this.repository == null) {
-        try {
-
-            // Load the Jackrabbit configuration ...
-            File configFile = new File(this.jackrabbitConfigPath);
-            String pathToConfig = configFile.getAbsolutePath();
-
-            // Find the directory where the Jackrabbit repository data will be stored ...
-            File workingDirectory = new File(this.workingDirectory);
-            String workingDirectoryPath = workingDirectory.getAbsolutePath();
-
-            // Get the Jackrabbit custom node definition (CND) file ...
-            URL cndFile = Thread.currentThread().getContextClassLoader().getResource("jackrabbitNodeTypes.cnd");
-
-            // Create the Jackrabbit repository instance and establish a session to keep the repository alive ...
-            this.repository = new TransientRepository(pathToConfig, workingDirectoryPath);
-            if (this.username != null) {
-                Credentials credentials = new SimpleCredentials(this.username, this.password);
-                this.keepAliveSession = this.repository.login(credentials, this.workspaceName);
-            } else {
-                this.keepAliveSession = this.repository.login();
-            }
-
-            try {
-                // Register the node types (only valid the first time) ...
-                Workspace workspace = this.keepAliveSession.getWorkspace();
-                JackrabbitNodeTypeManager mgr = (JackrabbitNodeTypeManager)workspace.getNodeTypeManager();
-                mgr.registerNodeTypes(cndFile.openStream(), JackrabbitNodeTypeManager.TEXT_X_JCR_CND);
-            } catch (RepositoryException e) {
-                if (!e.getMessage().contains("already exists")) throw e;
-            }
-
-        } catch (Exception e) {
-            this.repository = null;
-            this.keepAliveSession = null;
-            throw e;
-        }
-    }
-}
-  ]]></programlisting>
-		<para>As you can see, this method really has nothing to do with JBoss DNA, other than setting up a JCR repository that JBoss
-      DNA will use.</para>
-		<para>The <code>shutdownRepository()</code> method shuts down the Jackrabbit transient repository by closing the "keep-alive session". 
-			Again, this method really does nothing specifically with JBoss DNA, but is needed to manage the JCR repository that JBoss DNA uses.</para>
-    <programlisting role="JAVA"><![CDATA[
-public void shutdownRepository() throws Exception {
-    if (this.repository != null) {
-        try {
-            this.keepAliveSession.logout();
-        } finally {
-            this.repository = null;
-            this.keepAliveSession = null;
-        }
-    }
-}
-  ]]></programlisting>
-		<para>The <code>startDnaServices()</code> method first starts the JCR repository (if it was not already started), and proceeds 
-			to create and configure the <code>SequencingService</code> as described <link linkend="sequencing_service">earlier</link>.
-      This involes setting up the <code>SessionFactory</code> and <code>ExecutionContext</code>, creating the
-      <code>SequencingService</code> instance, and configuring the image sequencer. The method then continues by setting up the
-      <code>ObservationService</code> as described <link linkend="observation_service">earlier</link> and starting the service.</para>
-		<programlisting role="JAVA"><![CDATA[
-public void startDnaServices() throws Exception {
-    if (this.repository == null) this.startRepository();
-    if (this.sequencingService == null) {
-
-        SimpleSessionFactory sessionFactory = new SimpleSessionFactory();
-        sessionFactory.registerRepository(this.repositoryName, this.repository);
-        if (this.username != null) {
-            Credentials credentials = new SimpleCredentials(this.username, this.password);
-            sessionFactory.registerCredentials(this.repositoryName + "/" + this.workspaceName, credentials);
-        }
-        this.executionContext = new JcrExecutionContext(sessionFactory, repositoryWorkspaceName);
-
-        // Create the sequencing service, passing in the execution context ...
-        this.sequencingService = new SequencingService();
-        this.sequencingService.setExecutionContext(executionContext);
-
-        // Configure the sequencers.
-        String name = "Image Sequencer";
-        String desc = "Sequences image files to extract the characteristics of the image";
-        String classname = "org.jboss.dna.sequencer.images.ImageMetadataSequencer";
-        String[] classpath = null; // Use the current classpath
-        String[] pathExpressions = {"//(*.(jpg|jpeg|gif|bmp|pcx|png|iff|ras|pbm|pgm|ppm|psd))[*]/jcr:content[@jcr:data] => /images/$1"};
-        SequencerConfig imageSequencerConfig = new SequencerConfig(name, desc, classname, classpath, pathExpressions);
-        this.sequencingService.addSequencer(imageSequencerConfig);
-
-        // Set up the MP3 sequencer ...
-        name = "Mp3 Sequencer";
-        desc = "Sequences mp3 files to extract the id3 tags of the audio file";
-        classname = "org.jboss.dna.sequencer.mp3.Mp3MetadataSequencer";
-        pathExpressions = {"//(*.mp3)[*]/jcr:content[@jcr:data] =&gt; /mp3s/$1"};
-        SequencerConfig mp3SequencerConfig = new SequencerConfig(name, desc, classname, classpath, pathExpressions);
-        this.sequencingService.addSequencer(mp3SequencerConfig);
-
-				name = "Java Sequencer";
-				desc = "Sequences java files to extract the characteristics of the Java source";
-				classname = "org.jboss.dna.sequencer.java.JavaMetadataSequencer";
-				pathExpressions = {"//(*.java[*])/jcr:content[@jcr:data] => /java/$1"};
-				SequencerConfig javaSequencerConfig = new SequencerConfig(name, desc, classname,classpath, pathExpressions);
-				this.sequencingService.addSequencer(javaSequencerConfig);
-
-        // Use the DNA observation service to listen to the JCR repository (or multiple ones), and
-        // then register the sequencing service as a listener to this observation service...
-        this.observationService = new ObservationService(this.executionContext.getSessionFactory());
-        this.observationService.getAdministrator().start();
-        this.observationService.addListener(this.sequencingService);
-        this.observationService.monitor(this.repositoryName + "/" + this.workspaceName, Event.NODE_ADDED | Event.PROPERTY_ADDED | Event.PROPERTY_CHANGED);
-    }
-    // Start up the sequencing service ...
-    this.sequencingService.getAdministrator().start();
-}
-  ]]></programlisting>
-		<para>The <code>shutdownDnaServices()</code> method is pretty straightforward: it just calls shutdown on each of the services
-			and waits until they terminate.</para>
-    <programlisting role="JAVA"><![CDATA[
-public void shutdownDnaServices() throws Exception {
-    if (this.sequencingService == null) return;
-
-    // Shut down the service and wait until it's all shut down ...
-    this.sequencingService.getAdministrator().shutdown();
-    this.sequencingService.getAdministrator().awaitTermination(5, TimeUnit.SECONDS);
-
-    // Shut down the observation service ...
-    this.observationService.getAdministrator().shutdown();
-    this.observationService.getAdministrator().awaitTermination(5, TimeUnit.SECONDS);
-}
-  ]]></programlisting>
-		<para>None of the other methods really do anything with JBoss DNA <emphasis>per se</emphasis>. Instead, they merely work with the repository
-      using the JCR API.</para>
-		<para>The <code>main</code> method of the <code>SequencingClient</code> class creates a <code>SequencingClient</code> instance,
-      and passes a new <code>ConsoleInput</code> instance:</para>
-    <programlisting role="JAVA"><![CDATA[
-public static void main( String[] args ) throws Exception {
-    SequencingClient client = new SequencingClient();
-    client.setRepositoryInformation("repo", "default", "jsmith", "secret".toCharArray());
-    client.setUserInterface(new ConsoleInput(client));
-}
-  ]]></programlisting>
-		<para>If we look at the <code>ConsoleInput</code> constructor, it starts the repository, the DNA services, and a thread 
-			for the user interface. At this point, the constructor returns, but the main application continues under the user interface thread.  
-			When the user requests to quit, the user interface thread also shuts down the DNA services and JCR repository.</para>
-    <programlisting role="JAVA"><![CDATA[
-public ConsoleInput( SequencerClient client ) {
-  try {
-      client.startRepository();
-      client.startDnaServices();
-  
-      System.out.println(getMenu());
-      Thread eventThread = new Thread(new Runnable() {
-          private boolean quit = false;
-          public void run() {
-              try {
-                  while (!quit) {
-                      // Display the prompt and process the requested operation ...
-                  }
-              } finally {
-                  try {
-                      // Terminate ...
-                      client.shutdownDnaServices();
-                      client.shutdownRepository();
-                  } catch (Exception err) {
-                      System.out.println("Error shutting down sequencing service and repository: " 
-                                         + err.getLocalizedMessage());
-                      err.printStackTrace(System.err);
-                  }
-              }
-          }
-      });
-      eventThread.start();
-  } catch (Exception err) {
-      System.out.println("Error: " + err.getLocalizedMessage());
-      err.printStackTrace(System.err);
-  }
-}
-  ]]></programlisting>
-		<para>At this point, we've reviewed all of the interesting code in the example application.  However, feel free
-    to play with the application, trying different things.</para>
-	</sect1>
-	<sect1 id="using_dna_review">
-		<title>Summarizing what we just did</title>
-		<para>In this chapter we covered the different JBoss DNA components used for automatically sequencing a variety of
-			types of information, and how those components can be used in your application.
-      Specifically, we described how the <code>SequencingService</code> and <code>ObservationService</code> can 
-      be configured and used.  And we ended the chapter by reviewing the example application, which not only uses
-      JBoss DNA, but also the repository via the JCR API.</para>
-	</sect1>
-</chapter>

Deleted: trunk/docs/gettingstarted/src/main/docbook/en-US/content/using_dna_repositories.xml
===================================================================
--- trunk/docs/gettingstarted/src/main/docbook/en-US/content/using_dna_repositories.xml	2009-06-07 15:05:15 UTC (rev 988)
+++ trunk/docs/gettingstarted/src/main/docbook/en-US/content/using_dna_repositories.xml	2009-06-07 22:33:45 UTC (rev 989)
@@ -1,273 +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
-  -->
-<!DOCTYPE chapter PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN" "http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd">
-<chapter id="using_dna_repositories">
-	<title>Using JBoss DNA Repositories</title>
-	<para>One of the capabilities of JBoss DNA is to provide access through 
-		<ulink url="http://www.jcp.org/en/jsr/detail?id=170">JCR</ulink> to different kinds of repositories and storage systems.
-		Your applications work with the JCR API, but through JBoss DNA you're able to accesses the content from where the information
-		exists - not just a single purpose-built repository.  This is fundamentally what makes JBoss DNA different.</para>
-	<para>How does JBoss DNA do this?  At the heart of JBoss DNA and it's JCR implementation is a simple connector
-		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>
-			<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.
-		<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>
-  	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
-    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>
-			<graphic align="center" scale="100" fileref="dna-connectors-future.png"/>
-		</figure>
-	</para>
-	<note>
-		<para>You might be thinking that these connectors are interesting, but what do they really provide?  Is it really useful
-		  to use JCR to access a relational database rather than JDBC?  Or, why access the files on a file system when there 
-		  are already mechanisms to do that?</para>
-	  <para>Maybe putting JCR on top of a single system (like a JDBC database) isn't that interesting. What
-		  <emphasis>is</emphasis> interesting, though, is accessing the information in multiple systems <emphasis>as if all that information were
-		  in a single JCR repository</emphasis>.  That's what the federated repository source is all about.  The JBoss DNA connector
-			system just makes it possible to interact with all these systems in the same way.</para>
-		<para>Think of it this way: with JBoss DNA, you can use JCR to get to the schemas of multiple relational databases <emphasis>and</emphasis> the schemas
-		  defined by DDL files in your SVN repository <emphasis>and</emphasis> the schemas defined by logical models stored on your file system.
-		</para>
-	</note>
-	<para>So with this very high-level summary, let's dive a little deeper and look at how to configure and use JBoss DNA and JCR.</para>
-	<sect1 id="repository_service">
-		<title>Configuring the Repository Service</title>
-		<para>The JBoss DNA <emphasis>repository service</emphasis> is the component that manages the <emphasis>repositories</emphasis>
-		  and connections to them.  The service reads its configuration from a <code>RepositorySource</code> instance (i.e., the
-		  "configuration repository") and automatically sets up the repositories given the <code>RepositorySource</code> instances
-		  found in the configuration repository.</para>
-		<note>
-			<para>Configuring JBoss DNA services is more manual and complex than we want. As you'll see, JBoss DNA uses dependency
-	      injection to allow a great deal of flexibility in how it can be configured and customized. But this flexibility
-	      makes it more difficult for you to use.  We understand this, and will soon provide a much easier way to set up 
-				and manage JBoss DNA.  Current plans are to use the <ulink url="http://www.jboss.org/jbossmc">JBoss Microcontainer</ulink>
-				along with a configuration repository that makes it very easy to set up and manage JBoss DNA, whether it's used in
-				a simple application or a cluster of processes.</para>
-		</note>
-		<para>To set up the repository service, we need to first set up a few other objects:
-			<itemizedlist>
-				<listitem>
-					<para>An <emphasis>execution contexts</emphasis>.  Execution contexts define the context (or environment) 
-					    in which the service runs and in which operations against repositories are performed.  <code>ExecutionContext</code>
-					    instances can be created using JAAS application contexts, meaning that they contain the information about the subject
-					    that the software represents.  Execution contexts also provide access to the all of the factories and utilities
-					    used throughout the services and components, and it is through this mechanism that you can inject your own behavior.
-							For example, if your application already had a notion of namespaces, you could create an execution context that
-							uses your own <code>NamespaceRegistry</code> implementation (which would use the namespaces defined in your application).</para>
-				</listitem>
-				<listitem>
-					<para>A <emphasis>repository library</emphasis> that manages the list of <code>RepositorySource</code> instances.
-					    The library makes sure to inject the environments into each repository source, and it provides for each source
-					    a configurable pool of connections.</para>
-				</listitem>
-				<listitem>
-					<para>A <emphasis>configuration repository</emphasis> that contains descriptions of all of the repository sources
-					    as well as any information those sources need.  Because this is a regular repository, this could be a simple 
-					    repository with content loaded from an XML file (as in this example).  Or it could be a shared
-					    central repository with information about all of the JBoss DNA processes across your company.</para>
-				</listitem>
-			</itemizedlist>
-			With these components in place, we can then instantiate the <code>RepositoryService</code> and start it (using its
-			<code>ServiceAdministrator</code>).  During startup, the service reads the configuration repository and loads any
-			defined <code>RepositorySource</code> instances into the repository library, using the class loader factory 
-			(available in the <code>ExecutionContext</code>) to obtain.
-    </para>
-		<para>Here's sample code that shows how to set up and start the repository service.  You can see something similar
-			in the example application in the <code>startRepositories()</code> method of the <code>org.jboss.example.dna.repository.RepositoryClient</code> class.</para>
-    <programlisting role="JAVA"><![CDATA[
-  // Create the execution context that we'll use for the services. If we'd want to use JAAS, we'd 
-  // create the context by supplying LoginContext, AccessControlContext, or even Subject with 
-  // CallbackHandlers. But this example doesn't use JAAS in this example.
-  ExecutionContext context = new ExecutionContext();
-
-  // Create the library for the RepositorySource instances ...
-  RepositoryLibrary sources = new RepositoryLibrary(context);
-
-  // Load into the source manager the repository source for the configuration repository ...
-  InMemoryRepositorySource configSource = new InMemoryRepositorySource();
-  configSource.setName("Configuration");
-  sources.addSource(configSource);
-
-  // Now instantiate the Repository Service ...
-  RepositoryService service = new RepositoryService(sources, configSource.getName(), context);
-  service.getAdministrator().start();
- ]]></programlisting>
-		<para>After startup completes, the repositories are ready to be used.  The client application obtains the list of repositories
-			and presents them to the user.  When the user selects one, the client application starts navigating that repository
-			starting at its root node (e.g., the "/" path).  As you type a command to list the contents of the current node or to
-			"change directories" to a different node, the client application obtains the information for the node using a simple
-			procedure:
-			<orderedlist>
-				<listitem>
-					<para>Get a connection to the repository.</para>
-				</listitem>
-				<listitem>
-					<para>Using the connection, find the current node and read its properties and children, putting the information
-						into a simple Java plain old Java object (POJO).</para>
-				</listitem>
-				<listitem>
-					<para>Close the connection to the repository (in a finally block to ensure it always happens).</para>
-				</listitem>
-			</orderedlist>
-		</para>
-		<sect2 id="using_jcr_with_dna">
-			<title>Using JCR to read repository</title>
-			<para>If we want to perform these steps using JCR, a JCR <code>Session</code> represents our connection.
-			  So after we create a <code>JcrRepository</code> instance pointing to our repository library, we can 
-			  then login to obtain a JCR session:</para>
-      <programlisting role="JAVA"><![CDATA[
-	JcrRepository jcrRepository = new JcrRepository(context, sources);
-	Session session = jcrRepository.login(sourceName);
- ]]></programlisting>
-			<para>Now, the above code doesn't do any authentication; it essentially trusts the caller has the appropriate privileges.
-				Normally, your application will need to authenticate the user, so let's look at how that's done.</para>
-			<para>JBoss DNA uses the <ulink url="http://java.sun.com/j2se/1.5.0/docs/guide/security/jaas/tutorials/GeneralAcnOnly.html">Java 
-				Authentication and Authorization Service (JAAS)</ulink>, making it possible to use any existing JAAS security provider.
-				There are numerous JAAS providers, but one of the best open-source implementations is 
-				<ulink url="http://www.jboss.org/jbosssecurity/">JBoss Security</ulink>, which can authenticate using LDAP, certificates,
-				the operating system, and federated single-sign-on (among others).
-			</para>
-			<para>
-				The JCR API defines a <code>Credentials</code> marker interface, an instance of which can be passed to the
-			  <code>Session.login(...)</code> method.  Rather than provide a concrete implementation of this interface, JBoss DNA
-			  allows you to pass any implementation of <code>Credentials</code> that also has one of the following methods:
-			  <itemizedlist>
-				  <listitem>
-						<para><code>getLoginContext()</code> that returns a <code>javax.security.auth.login.LoginContext</code> instance.</para>
-					</listitem>
-				  <listitem>
-						<para><code>getAccessControlContext()</code> that returns a <code>java.security.AccessControlContext</code> instance.</para>
-					</listitem>
-				</itemizedlist>
-				This way, your application can obtain the JAAS <code>LoginContext</code> or <code>AccessControlContext</code> however it wants,
-				and then merely passes that into DNA through the JCR <code>Credentials</code>.  No interfaces or classes specific to JBoss DNA are required.
-			</para>
-			<para>The following code shows how this is done, using an anonymous inner class for the <code>Credentials</code> implementation.</para>
-      <programlisting role="JAVA"><![CDATA[
-  CallbackHandler callbackHandler = // as needed by your app, according to JAAS
-  final LoginContext loginContext = new LoginContext("MyAppContextName",callbackHandler);
-  Credentials credentials = new Credentials() {
-			public LoginContext getLoginContext() { return loginContext; }
-  };
-  JcrRepository jcrRepository = new JcrRepository(context, sources);
-  Session session = jcrRepository.login(credentials, sourceName);
- ]]></programlisting>
-			<para>Once you have a JCR session, you can then use it to find the node of interest and access the necessary information. All of this
-				code will use only the JCR API - there's nothing specific to JBoss DNA's implementation.  And remember, when you're finished with
-				the session, be sure to logout (usually in a <code>finally</code> block):</para>
- <programlisting role="JAVA"><![CDATA[
-  if (session != null) session.logout();
- ]]></programlisting>
-			<para>Like many people recommend with JCR, you can create either long-lived or short-lived JCR <code>Session</code>s.  The
-			  JBoss DNA implementation of JCR was designed to efficiently do either.</para>
-		</sect2>	
-		<!--
-		<sect2 id="using_dna_repositories_with_dna_api">
-			<title>Using JBoss DNA's API to read repository</title>
-			<para>Although we recommend using JCR, JBoss DNA has an internal command-based API that completely side-steps JCR and provides
-				very simple graph-based operations.  For more information, see the <code>RepositoryClient</code> class in the example.</para>
-			<note>
-				<para>This API is likely to undergo changes in the next few releases, and using it at this time is not suggested.</para>
-			</note>
-		</sect2>
-		-->
-	</sect1>
-	<sect1 id="shutting_down_repository_service">
-		<title>Shutting down the Repository Service</title>
-		<para>In the first part of this chapter, we saw how to instantiate, configure, and start the <code>RepositoryService</code>.
-		  We then saw how to use JCR to access the repository service by creating JCR <code>Session</code>s, and how to log out of those
-		  sessions when no longer needed.</para>
-		<para>In this short section we'll see how to shut down the <code>RepositoryService</code> and <code>RepositoryLibrary</code>
-		  when you're finished with all of the repositories.  It's a simple but important step, since this closes all outstanding 
-		  connections that may be sitting unused in the library's connection pools.</para>
-		<para>Shutting down these components is very straightforward: get the <code>ServiceAdministrator</code> on each, and call <code>shutdown()</code>.</para>
-		<programlisting role="JAVA"><![CDATA[
-  // Shut down the repository service ...
-  repositoryService.getAdministrator().shutdown();
-
-  // Shut down the manager of the RepositorySource instances, waiting until all connections are closed
-  sources.getAdministrator().shutdown();
-  sources.getAdministrator().awaitTermination(1, TimeUnit.SECONDS);
- ]]></programlisting>
-		<para>The <code>shutdown()</code> method attempts to close all open and unused resources (such as open and unused connections in the pool).
-		  No more connections can be created, and any connections that are currently in use are not closed but allowed to be used and closed normally.
-		  When the last connection is used, the service then transitions to a <emphasis>terminated</emphasis> state, which you can wait for using
-		  the <code>awaitTermination(int,TimeUnit)</code> method.</para>
-		<para>If you want to shutdown the services immediately, then you could call <code>shutdownNow()</code>, which blocks while it attempts to immediately
-		  close all connections - <emphasis>even those currently in use</emphasis>.  So, while you generally want to use <code>shutdown()</code>,
-		  it is good to be aware that this <code>shutdownNow()</code> method does exist.</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
-			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>
-    <programlisting><![CDATA[
-  org/jboss/example/dna/repositories/ConsoleInput.java
-                                    /RepositoryClient.java
-                                    /UserInterface.java
-  ]]></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>
-			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 
-			automatically using conventional JUnit test cases, as demonstrated by the code in the <code>src/test/java</code> directory:</para>
-    <programlisting><![CDATA[
-  org/jboss/example/dna/sequencers/RepositoryClientTest.java
-                                  /RepositoryClientUsingJcrTest.java
-  ]]></programlisting>
-		<para>
-			The code we presented earlier in this chapter represent the bulk of the JBoss DNA and JCR-specific code used in the
-			<code>RepositoryClient</code>, so we won't cover it in any more detail here.  Please refer to the sample client code
-			if you want to see more.
-		</para>
-	</sect1>
-	<sect1 id="using_dna_repositories_review">
-		<title>Summarizing what we just did</title>
-		<para>In this chapter we covered the different JBoss DNA components used for accessing repositories through JCR, including
-			repositories that federate their content from the content of other repositories.  Specifically, we described how the
-			<code>RepositoryService</code> and <code>JcrRepository</code> can be configured and used.
-		</para>
-	</sect1>
-</chapter>
-	

Added: trunk/docs/gettingstarted/src/main/docbook/en-US/custom.dtd
===================================================================
--- trunk/docs/gettingstarted/src/main/docbook/en-US/custom.dtd	                        (rev 0)
+++ trunk/docs/gettingstarted/src/main/docbook/en-US/custom.dtd	2009-06-07 22:33:45 UTC (rev 989)
@@ -0,0 +1,138 @@
+<!ENTITY versionNumber "0.5">
+<!ENTITY copyrightYears "2008-2009">
+<!ENTITY copyrightHolder "Red Hat, Inc.">
+
+<!-- Frequently used URLs -->
+
+<!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 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 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">
+<!ENTITY MailTo     					"mailto:dna-users at jboss.org">
+<!ENTITY Wikipedia						"http://en.wikipedia.org/wiki/">
+<!ENTITY JBossMaven						"http://repository.jboss.com/maven2/">
+
+<!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'>Getting Started</ulink>">
+
+<!-- Types in JRE -->
+
+<!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 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>">
+<!ENTITY IOException				      		"<ulink url='&Java;java/io/IOException.html'><classname>IOException</classname></ulink>">
+<!ENTITY ClassLoader				      		"<ulink url='&Java;java/lang/ClassLoader.html'><interface>ClassLoader</interface></ulink>">
+<!ENTITY AccessControlContext      		"<ulink url='&Java;java/security/AccessController.html'><classname>AccessControlContext</classname></ulink>">
+<!ENTITY LoginContext				      		"<ulink url='&Java;javax/security/auth/login/LoginContext.html'><classname>LoginContext</classname></ulink>">
+<!ENTITY Subject						      		"<ulink url='&Java;javax/security/auth/Subject.html'><classname>Subject</classname></ulink>">
+<!ENTITY CallbackHandler		      		"<ulink url='&Java;javax/security/auth/callback/CallbackHandler.html'><interface>CallbackHandler</interface></ulink>">
+<!ENTITY ExecutorService		      		"<ulink url='&Java;java/util/concurrent/ExecutorService.html'><interface>ExecutorService</interface></ulink>">
+<!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>">
+
+
+<!-- Types in JCR API -->
+
+<!ENTITY Repository					       		"<interface>Repository</interface>">
+<!ENTITY Session						       		"<interface>Session</interface>">
+<!ENTITY Credentials					       	"<interface>Credentials</interface>">
+<!ENTITY SimpleCredentials					  "<interface>SimpleCredentials</interface>">
+
+<!-- Types in dna-common -->
+
+<!ENTITY Logger							       		"<ulink url='&API;common/util/Logger.html'><interface>Logger</interface></ulink>">
+<!ENTITY ClassLoaderFactory       		"<ulink url='&API;common/component/ClassLoaderFactory.html'><interface>ClassLoaderFactory</interface></ulink>">
+<!ENTITY StandardClassLoaderFactory		"<ulink url='&API;common/component/StandardClassLoaderFactory.html'><classname>StandardClassLoaderFactory</classname></ulink>">
+
+<!-- Types in dna-graph -->
+
+<!ENTITY Graph							       		"<ulink url='&API;graph/Graph.html'><classname>Graph</classname></ulink>">
+<!ENTITY GraphBatch				       			"<ulink url='&API;graph/Graph.Batch.html'><classname>Graph.Batch</classname></ulink>">
+<!ENTITY Subgraph							       	"<ulink url='&API;graph/Subgraph.html'><interface>Subgraph</interface></ulink>">
+<!ENTITY Node								       		"<ulink url='&API;graph/Node.html'><interface>Node</interface></ulink>">
+<!ENTITY Workspace								    "<ulink url='&API;graph/Workspace.html'><interface>Workspace</interface></ulink>">
+<!ENTITY Results							       	"<ulink url='&API;graph/Results.html'><interface>Results</interface></ulink>">
+<!ENTITY Location							       	"<ulink url='&API;graph/Location.html'><classname>Location</classname></ulink>">
+<!ENTITY ExecutionContext		       		"<ulink url='&API;graph/ExecutionContext.html'><classname>ExecutionContext</classname></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>">
+<!ENTITY PathSegment				       		"<ulink url='&API;graph/property/Path.Segment.html'><interface>Path.Segment</interface></ulink>">
+<!ENTITY Property						       		"<ulink url='&API;graph/property/Property.html'><interface>Property</interface></ulink>">
+<!ENTITY ValueFactories       				"<ulink url='&API;graph/property/ValueFactories.html'><interface>ValueFactories</interface></ulink>">
+<!ENTITY NamespaceRegistry       			"<ulink url='&API;graph/property/NamespaceRegistry.html'><interface>NamespaceRegistry</interface></ulink>">
+<!ENTITY PropertyFactory       				"<ulink url='&API;graph/property/PropertyFactory.html'><interface>PropertyFactory</interface></ulink>">
+<!ENTITY PathNotFoundException				"<ulink url='&API;graph/property/PathNotFoundException.html'><classname>PathNotFoundException</classname></ulink>">
+<!ENTITY RepositorySource       			"<ulink url='&API;graph/connector/RepositorySource.html'><interface>RepositorySource</interface></ulink>">
+<!ENTITY RepositoryConnection    			"<ulink url='&API;graph/connector/RepositoryConnection.html'><interface>RepositoryConnection</interface></ulink>">
+<!ENTITY RepositoryConnectionFactory	"<ulink url='&API;graph/connector/RepositoryConnectionFactory.html'><interface>RepositoryConnectionFactory</interface></ulink>">
+<!ENTITY RepositorySourceListener			"<ulink url='&API;graph/connector/RepositorySourceListener.html'><interface>RepositorySourceListener</interface></ulink>">
+<!ENTITY RepositorySourceCapabilities	"<ulink url='&API;graph/connector/RepositorySourceCapabilities.html'><classname>RepositorySourceCapabilities</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 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 Projection								  	"<ulink url='&API;graph/connector/federation/Projection.html'><classname>Projection</classname></ulink>">
+<!ENTITY CachePolicy							    "<ulink url='&API;graph/cache/CachePolicy.html'><interface>CachePolicy</interface></ulink>">
+<!ENTITY Request					       			"<ulink url='&API;graph/request/Request.html'><classname>Request</classname></ulink>">
+<!ENTITY CompositeRequest					    "<ulink url='&API;graph/request/CompositeRequest.html'><classname>CompositeRequest</classname></ulink>">
+<!ENTITY ReadNodeRequest					    "<ulink url='&API;graph/request/ReadNodeRequest.html'><classname>ReadNodeRequest</classname></ulink>">
+<!ENTITY CopyBranchRequest					  "<ulink url='&API;graph/request/CopyBranchRequest.html'><classname>CopyBranchRequest</classname></ulink>">
+<!ENTITY InvalidRequestException	   	"<ulink url='&API;graph/request/InvalidRequestException.html'><classname>InvalidRequestException</classname></ulink>">
+<!ENTITY InvalidWorkspaceException		"<ulink url='&API;graph/request/InvalidWorkspaceException.html'><classname>InvalidWorkspaceException</classname></ulink>">
+<!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 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>">
+<!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>">
+
+<!-- Types in dna-repository -->
+
+<!ENTITY DnaEngine					       		"<ulink url='&API;repository/DnaEngine.html'><classname>DnaEngine</classname></ulink>">
+<!ENTITY DnaConfiguration		       		"<ulink url='&API;repository/DnaConfiguration.html'><classname>DnaConfiguration</classname></ulink>">
+<!ENTITY RepositoryLibrary	       		"<ulink url='&API;repository/RepositoryLibrary.html'><classname>RepositoryLibrary</classname></ulink>">
+<!ENTITY RepositoryService	       		"<ulink url='&API;repository/RepositoryService.html'><classname>RepositoryService</classname></ulink>">
+<!ENTITY ServiceAdministrator   			"<ulink url='&API;repository/service/ServiceAdministrator.html'><interface>ServiceAdministrator</interface></ulink>">
+<!ENTITY SequencingService	       		"<ulink url='&API;repository/sequencer/SequencingService.html'><classname>SequencingService</classname></ulink>">
+<!ENTITY SequencerConfig 		       		"<ulink url='&API;repository/sequencer/SequencerConfig.html'><classname>SequencerConfig</classname></ulink>">
+<!ENTITY SessionFactory				   			"<ulink url='&API;repository/util/SessionFactory.html'><interface>SessionFactory</interface></ulink>">
+<!ENTITY JndiSessionFactory				 		"<ulink url='&API;repository/util/JndiSessionFactory.html'><classname>JndiSessionFactory</classname></ulink>">
+<!ENTITY SimpleSessionFactory				 	"<ulink url='&API;repository/util/SimpleSessionFactory.html'><classname>SimpleSessionFactory</classname></ulink>">
+<!ENTITY JcrExecutionContext	   			"<ulink url='&API;repository/util/JcrExecutionContext.html'><interface>JcrExecutionContext</interface></ulink>">
+<!ENTITY MimeType									  	"<ulink url='&API;repository/mimetype/MimeType.html'><classname>MimeType</classname></ulink>">
+<!ENTITY MimeTypeDetectorConfig		  	"<ulink url='&API;repository/mimetype/MimeTypeDetectorConfig.html'><interface>MimeTypeDetectorConfig</interface></ulink>">
+
+
+<!-- Types in dna-jcr -->
+
+<!ENTITY JcrEngine					       		"<ulink url='&API;jcr/JcrEngine.html'><classname>JcrEngine</classname></ulink>">
+<!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>">
+
+<!-- Types in extensions/ -->
+
+<!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 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>">
+<!ENTITY ApertureMimeTypeDetector	  	"<ulink url='&API;mimetype/aperture/ApertureMimeTypeDetector.html'><classname>ApertureMimeTypeDetector</classname></ulink>">
+

Modified: trunk/docs/gettingstarted/src/main/docbook/en-US/master.xml
===================================================================
--- trunk/docs/gettingstarted/src/main/docbook/en-US/master.xml	2009-06-07 15:05:15 UTC (rev 988)
+++ trunk/docs/gettingstarted/src/main/docbook/en-US/master.xml	2009-06-07 22:33:45 UTC (rev 989)
@@ -25,9 +25,8 @@
   ~ Boston, MA  02110-1301  USA
   -->
 <!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN" "http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd" [
-<!ENTITY versionNumber "0.4">
-<!ENTITY copyrightYear "2008-2009">
-<!ENTITY copyrightHolder "Red Hat, Inc.">
+<!ENTITY % CustomDTD SYSTEM "custom.dtd">
+%CustomDTD;
 ]>
 <book lang="en">
 	<bookinfo>
@@ -35,7 +34,7 @@
 		<subtitle>Getting Started Guide</subtitle>
 		<releaseinfo>&versionNumber;</releaseinfo>
 		<productnumber>&versionNumber;</productnumber>
-		<issuenum>4</issuenum>
+		<issuenum>5</issuenum>
 		<mediaobject>
 			<imageobject role="fo">
 				<imagedata fileref="dna-logo.png" align="center"/>
@@ -53,10 +52,10 @@
 	</bookinfo>
 	<xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="content/preface.xml"/>
 	<xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="content/introduction.xml"/>
-	<xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="content/understanding_dna.xml"/>
+	<xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="content/use_cases.xml"/>
+	<xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="content/using_dna.xml"/>
 	<xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="content/downloading_and_running.xml"/>
-	<xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="content/using_dna_for_sequencing.xml"/>
-	<xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="content/using_dna_repositories.xml"/>
-	<xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="content/custom_sequencers.xml"/>
-	<xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="content/future.xml"/>
+	<xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="content/sequencer_example.xml"/>
+	<xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="content/repository_example.xml"/>
+	<xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="content/conclusion.xml"/>
 </book>

Modified: trunk/docs/reference/src/main/docbook/en-US/content/development_tools.xml
===================================================================
--- trunk/docs/reference/src/main/docbook/en-US/content/development_tools.xml	2009-06-07 15:05:15 UTC (rev 988)
+++ trunk/docs/reference/src/main/docbook/en-US/content/development_tools.xml	2009-06-07 22:33:45 UTC (rev 989)
@@ -225,14 +225,20 @@
 		<para>This profile informs Maven of the two JBoss repositories (<ulink url="http://repository.jboss.org/maven2">snapshots</ulink> 
 		  and <ulink url="http://snapshots.jboss.org/maven2">releases</ulink>) that contain all of the JARs for JBoss DNA and all dependent libraries.
 		</para>
+		<para>While you're adding <code>$MAVEN_HOME/bin</code> to your path, you should also set the <code>$MAVEN_OPTS</code> environment variable
+		  to "<code>-Xmx256m</code>".  If you don't do this, you'll likely see an <code>java.lang.OutOfMemoryError</code> sometime during a full
+		  build.
 		<note>
 			<para>
-		    It is a policy of the project that the <emphasis>source code and JARs</emphasis> for <emphasis>all</emphasis> dependencies 
-		    <emphasis>must</emphasis> be loaded into the JBoss repository.  This is so that the project can always be built
-				and that all source code is always available.
+				The JBoss Maven repository provides a central location for not only the artifacts produced by the JBoss.org projects (well, at least those
+				that use Maven), but also is where those projects can place the artifacts that they depend on.  JBoss DNA has a policy that
+				the <emphasis>source code and JARs</emphasis> for <emphasis>all</emphasis> dependencies <emphasis>must</emphasis> be loaded into the 
+				JBoss Maven repository.  It may be a little bit more work for the developers, but it does help ensure that developers have easy
+				access to the source and that the project (and dependencies) can always be rebuilt when needed.
 			</para>
 			<para>
-				For more information about the JBoss Maven repository, see the <ulink url="http://wiki.jboss.org/wiki/Maven">JBoss.org Wiki</ulink>.
+				For more information about the JBoss Maven repository, including instructions for adding source and JAR artifacts, 
+				see the <ulink url="http://wiki.jboss.org/wiki/Maven">JBoss.org Wiki</ulink>.
 			</para>
 		</note>
 		<para>



From dna-commits at lists.jboss.org  Sun Jun  7 20:03:34 2009
From: dna-commits at lists.jboss.org (dna-commits at lists.jboss.org)
Date: Sun, 07 Jun 2009 20:03:34 -0400
Subject: [dna-commits] DNA SVN: r990 - in trunk:
	dna-graph/src/main/java/org/jboss/dna/graph and 8 other directories.
Message-ID: <E1MDSKs-0000Tq-VE@committer01.frg.pub.inap.atl.jboss.com>

Author: rhauch
Date: 2009-06-07 20:03:34 -0400 (Sun, 07 Jun 2009)
New Revision: 990

Modified:
   trunk/.gitignore
   trunk/dna-graph/src/main/java/org/jboss/dna/graph/ExecutionContext.java
   trunk/dna-jcr/src/test/java/org/jboss/dna/jcr/JcrRepositoryTest.java
   trunk/dna-jcr/src/test/java/org/jboss/dna/jcr/JcrTckTest.java
   trunk/docs/examples/gettingstarted/pom.xml
   trunk/docs/examples/gettingstarted/repositories/src/main/java/org/jboss/example/dna/repository/RepositoryClient.java
   trunk/docs/examples/gettingstarted/sequencers/pom.xml
   trunk/docs/examples/gettingstarted/sequencers/src/main/java/org/jboss/example/dna/sequencer/SequencingClient.java
   trunk/docs/gettingstarted/src/main/docbook/en-US/content/sequencer_example.xml
   trunk/docs/reference/src/main/docbook/en-US/content/configuration.xml
   trunk/docs/reference/src/main/docbook/en-US/content/development_tools.xml
   trunk/docs/reference/src/main/docbook/en-US/content/environment.xml
   trunk/docs/reference/src/main/docbook/en-US/custom.dtd
Log:
DNA-389 Updated the documents to reflect the recent changes in the SecurityContext and configuration.

Modified: trunk/.gitignore
===================================================================
--- trunk/.gitignore	2009-06-07 22:33:45 UTC (rev 989)
+++ trunk/.gitignore	2009-06-08 00:03:34 UTC (rev 990)
@@ -49,6 +49,12 @@
 # /docs/reference/
 /docs/reference/target
 
+# /extensions/dna-web-jcr-rest/
+/extensions/dna-web-jcr-rest/target/
+
+# /extensions/dna-web-jcr-rest-war/
+/extensions/dna-web-jcr-rest-war/target/
+
 # /extensions/dna-classloader-maven/
 /extensions/dna-classloader-maven/target
 

Modified: trunk/dna-graph/src/main/java/org/jboss/dna/graph/ExecutionContext.java
===================================================================
--- trunk/dna-graph/src/main/java/org/jboss/dna/graph/ExecutionContext.java	2009-06-07 22:33:45 UTC (rev 989)
+++ trunk/dna-graph/src/main/java/org/jboss/dna/graph/ExecutionContext.java	2009-06-08 00:03:34 UTC (rev 990)
@@ -73,6 +73,7 @@
      * , with default implementations for all other components (including default namespaces in the
      * {@link #getNamespaceRegistry() namespace registry}.
      */
+    @SuppressWarnings( "synthetic-access" )
     public ExecutionContext() {
         this(new NullSecurityContext(), null, null, null, null, null);
         initializeDefaultNamespaces(this.getNamespaceRegistry());
@@ -193,7 +194,7 @@
     /**
      * Get the {@link SecurityContext security context} for this context.
      * 
-     * @return the security context; may be <code>null</code>
+     * @return the security context; never <code>null</code>
      */
     public SecurityContext getSecurityContext() {
         return this.securityContext;
@@ -347,6 +348,6 @@
 
         public void logout() {
         }
-        
+
     }
 }

Modified: trunk/dna-jcr/src/test/java/org/jboss/dna/jcr/JcrRepositoryTest.java
===================================================================
--- trunk/dna-jcr/src/test/java/org/jboss/dna/jcr/JcrRepositoryTest.java	2009-06-07 22:33:45 UTC (rev 989)
+++ trunk/dna-jcr/src/test/java/org/jboss/dna/jcr/JcrRepositoryTest.java	2009-06-08 00:03:34 UTC (rev 990)
@@ -79,8 +79,6 @@
         }
     }
 
-
-    
     @Before
     public void before() throws Exception {
         MockitoAnnotations.initMocks(this);
@@ -93,7 +91,7 @@
         // Set up the execution context ...
         context = new ExecutionContext();
         credentials = new SimpleCredentials("superuser", "superuser".toCharArray());
-        
+
         // Stub out the connection factory ...
         connectionFactory = new RepositoryConnectionFactory() {
             /**
@@ -180,28 +178,28 @@
         assertThat(repository.getDescriptor("property"), is("value"));
     }
 
-    @Test(expected=javax.jcr.LoginException.class)
+    @Test( expected = javax.jcr.LoginException.class )
     public void shouldNotAllowLoginWithNoCredentials() throws Exception {
         // This would work iff this code was executing in a privileged block, but it's not
         repository.login();
     }
-    
-    @SuppressWarnings("cast")
+
     @Test
     public void shouldAllowLoginWithNoCredentialsInPrivilegedBlock() throws Exception {
         LoginContext login = new LoginContext("dna-jcr", new UserPasswordCallbackHandler("superuser", "superuser".toCharArray()));
         login.login();
-        
+
         Subject subject = login.getSubject();
-        
-        Session session = (Session) Subject.doAsPrivileged(subject, new PrivilegedExceptionAction<Session>() {
 
+        Session session = (Session)Subject.doAsPrivileged(subject, new PrivilegedExceptionAction<Session>() {
+
+            @SuppressWarnings( "synthetic-access" )
             public Session run() throws Exception {
                 return repository.login();
             }
-        
+
         }, AccessController.getContext());
-        
+
         assertThat(session, is(notNullValue()));
         assertThat(session.getUserID(), is("superuser"));
         login.logout();

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	2009-06-07 22:33:45 UTC (rev 989)
+++ trunk/dna-jcr/src/test/java/org/jboss/dna/jcr/JcrTckTest.java	2009-06-08 00:03:34 UTC (rev 990)
@@ -43,7 +43,6 @@
 import org.apache.jackrabbit.test.api.RepositoryLoginTest;
 import org.apache.jackrabbit.test.api.SerializationTest;
 import org.apache.jackrabbit.test.api.SessionTest;
-import org.apache.jackrabbit.test.api.SessionUUIDTest;
 import org.apache.jackrabbit.test.api.SetPropertyAssumeTypeTest;
 import org.apache.jackrabbit.test.api.SetPropertyBooleanTest;
 import org.apache.jackrabbit.test.api.SetPropertyCalendarTest;

Modified: trunk/docs/examples/gettingstarted/pom.xml
===================================================================
--- trunk/docs/examples/gettingstarted/pom.xml	2009-06-07 22:33:45 UTC (rev 989)
+++ trunk/docs/examples/gettingstarted/pom.xml	2009-06-08 00:03:34 UTC (rev 990)
@@ -10,7 +10,7 @@
 
   <modules>
     <module>sequencers</module>
-    <module>repositories</module>
+    <!--module>repositories</module-->
   </modules>
 
   <dependencyManagement>

Modified: trunk/docs/examples/gettingstarted/repositories/src/main/java/org/jboss/example/dna/repository/RepositoryClient.java
===================================================================
--- trunk/docs/examples/gettingstarted/repositories/src/main/java/org/jboss/example/dna/repository/RepositoryClient.java	2009-06-07 22:33:45 UTC (rev 989)
+++ trunk/docs/examples/gettingstarted/repositories/src/main/java/org/jboss/example/dna/repository/RepositoryClient.java	2009-06-08 00:03:34 UTC (rev 990)
@@ -44,6 +44,7 @@
 import org.jboss.dna.common.util.CheckArg;
 import org.jboss.dna.graph.ExecutionContext;
 import org.jboss.dna.graph.Graph;
+import org.jboss.dna.graph.JaasSecurityContext;
 import org.jboss.dna.graph.Location;
 import org.jboss.dna.graph.property.Path;
 import org.jboss.dna.graph.property.PathFactory;
@@ -306,7 +307,11 @@
             case DNA: {
                 try {
                     // Use the DNA Graph API to read the properties and children of the node ...
-                    ExecutionContext context = loginContext != null ? this.context.create(loginContext) : this.context;
+                    ExecutionContext context = this.context;
+                    if (loginContext != null) {
+                        JaasSecurityContext security = new JaasSecurityContext(loginContext);
+                        context = this.context.with(security);
+                    }
                     Graph graph = engine.getGraph(context, sourceName);
                     graph.useWorkspace("default");
                     org.jboss.dna.graph.Node node = graph.getNodeAt(pathToNode);

Modified: trunk/docs/examples/gettingstarted/sequencers/pom.xml
===================================================================
--- trunk/docs/examples/gettingstarted/sequencers/pom.xml	2009-06-07 22:33:45 UTC (rev 989)
+++ trunk/docs/examples/gettingstarted/sequencers/pom.xml	2009-06-08 00:03:34 UTC (rev 990)
@@ -63,34 +63,6 @@
       <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>

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	2009-06-07 22:33:45 UTC (rev 989)
+++ trunk/docs/examples/gettingstarted/sequencers/src/main/java/org/jboss/example/dna/sequencer/SequencingClient.java	2009-06-08 00:03:34 UTC (rev 990)
@@ -41,13 +41,13 @@
 import javax.jcr.Session;
 import javax.jcr.Value;
 import javax.jcr.ValueFormatException;
+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.JcrRepository;
+import org.jboss.dna.jcr.SecurityContextCredentials;
 import org.jboss.dna.repository.sequencer.SequencingService;
 import org.jboss.dna.repository.util.SessionFactory;
-import org.jboss.security.config.IDTrustConfiguration;
 
 /**
  * @author Randall Hauch
@@ -60,14 +60,6 @@
     public static final char[] DEFAULT_PASSWORD = "secret".toCharArray();
 
     public static void main( String[] args ) {
-        // Set up the JAAS provider (IDTrust) and a policy file (which defines the "dna-jcr" login config name)
-        IDTrustConfiguration idtrustConfig = new IDTrustConfiguration();
-        try {
-            idtrustConfig.config("security/jaas.conf.xml");
-        } catch (Exception ex) {
-            throw new IllegalStateException(ex);
-        }
-
         // 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 example uses the programmatic approach...
@@ -80,10 +72,7 @@
               .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")
-              .setOption(JcrRepository.Option.JAAS_LOGIN_CONFIG_NAME, "dna-jcr");
+        config.repository(repositoryId).addNodeTypes("sequencing.cnd").setSource("store");
         // Set up the image sequencer ...
         config.sequencer("Image Sequencer")
               .usingClass("org.jboss.dna.sequencer.image.ImageMetadataSequencer")
@@ -433,7 +422,14 @@
      * @throws RepositoryException
      */
     protected Session createSession() throws RepositoryException {
-        return this.repository.login(workspaceName);
+        // Normally we'd just use SimpleCredentials or some other custom Credentials implementation,
+        // but that would require JAAS (since JBoss DNA uses that used by default). Since we don't
+        // have a JAAS implementation, we will use the SecurityContextCredentials to wrap
+        // another SecurityContext implementation. This is how you might integrate a non-JAAS security
+        // system into JBoss DNA. See the repository example for how to set up with JAAS.
+        SecurityContext securityContext = new MyCustomSecurityContext();
+        SecurityContextCredentials credentials = new SecurityContextCredentials(securityContext);
+        return this.repository.login(credentials, workspaceName);
     }
 
     protected String getMimeType( URL file ) {
@@ -451,4 +447,33 @@
         return null;
     }
 
+    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
+        }
+    }
+
 }

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	2009-06-07 22:33:45 UTC (rev 989)
+++ trunk/docs/gettingstarted/src/main/docbook/en-US/content/sequencer_example.xml	2009-06-08 00:03:34 UTC (rev 990)
@@ -161,14 +161,6 @@
 		  creates the JBoss DNA configuration using the programmatic style.
 		</para>
 		<programlisting role="JAVA"><![CDATA[
-// Set up the JAAS provider (IDTrust) and a policy file (which defines the "dna-jcr" login config name)
-IDTrustConfiguration idtrustConfig = new IDTrustConfiguration();
-try {
-    idtrustConfig.config("security/jaas.conf.xml");
-} catch (Exception ex) {
-    throw new IllegalStateException(ex);
-}
-
 // Create the configuration. 
 String repositoryId = "content";
 String workspaceName = "default";
@@ -181,8 +173,7 @@
 // Set up the JCR repository to use the source ...
 config.repository(repositoryId)
       .addNodeTypes("sequencing.cnd")
-      .setSource("store")
-      .setOption(JcrRepository.Option.JAAS_LOGIN_CONFIG_NAME, "dna-jcr");
+      .setSource("store");
 // Set up the image sequencer ...
 config.sequencer("Image Sequencer")
       .usingClass("org.jboss.dna.sequencer.image.ImageMetadataSequencer")
@@ -210,16 +201,13 @@
 client.setUserInterface(new ConsoleInput(client));
  ]]></programlisting>
 		<para>
-			The first block sets up the JAAS provider to be the IDTrust library and a policy file that defines the "dna-jcr" JAAS configuration.
-		</para>
-		<para>
-			The second block of code configures the <code>JcrConfiguration</code> and sets up the "store" source, the "content" repository,
+			The first block of code configures the <code>JcrConfiguration</code> and sets up the "store" source, the "content" repository,
 			and three sequencers.  Again, this is done via the programmatic style. An alternative would be to load the entire configuration
 			from a configuration file or from an existing configuration repository.  (The repository example shown in the 
 			<link linkend="repository_example">next chapter</link> shows how to load the configuration from a file.)
 		</para>
 		<para>
-			The third block simply instantiates the <code>SequencingClient</code> class, passing the configuration and the name of the repository
+			The second block simply instantiates the <code>SequencingClient</code> class, passing the configuration and the name of the repository
 			and workspace, and finally sets the user interface (which then executes its behavior, which we'll see below).
 		</para>
 		<para>
@@ -298,6 +286,58 @@
   }
 }
   ]]></programlisting>
+		<para>
+			There is one more aspect of this example that is worth discussing.  While the repository example in the
+			<link linkend="repository_example">next chapter</link> does show how to use JAAS, this example intentionally shows how
+			you might integrate a different security system into JBoss DNA.  In the <code>createSession()</code> method,
+			the <code>RepositoryClient</code> creates a <code>SecurityContextCredentials</code> wrapper around a custom
+			<code>SecurityContext</code> implementation, then passes that credentials into the <code>login(Credentials,String)</code>
+			method:
+		</para>
+    <programlisting role="JAVA"><![CDATA[
+protected Session createSession() throws RepositoryException {
+    SecurityContext securityContext = new MyCustomSecurityContext();
+    SecurityContextCredentials credentials = new SecurityContextCredentials(securityContext);
+    return this.repository.login(credentials, workspaceName);
+}
+  ]]></programlisting>
+		<para>
+			where the custom <code>SecurityContext</code> implementation is as follows:
+		</para>
+   <programlisting role="JAVA"><![CDATA[
+protected class MyCustomSecurityContext implements SecurityContext {
+    /**
+     * @see org.jboss.dna.graph.SecurityContext#getUserName()
+     */
+    public String getUserName() {
+        return "Fred";
+    }
+
+    /**
+     * @see org.jboss.dna.graph.SecurityContext#hasRole(java.lang.String)
+     */
+    public boolean hasRole( String roleName ) {
+        return true;
+    }
+
+    /**
+     * @see org.jboss.dna.graph.SecurityContext#logout()
+     */
+    public void logout() {
+        // do something
+    }
+}
+ ]]></programlisting>
+		<para>
+			Obviously you would want to implement this correctly.  If you're using JBoss DNA in a web application, your <code>SecurityContext</code>
+			implementation would likely delegate to the <code>HttpServletRequest</code>.
+		</para>
+		<para>
+			But if you're using JAAS, then you could just pass in a <code>javax.jcr.SimpleCredentials</code> with the username and password,
+			as long as your <code>JcrConfiguration</code>'s repository definitions are set up to use the correct JAAS login context name
+			(see the repository example in the <link linkend="repository_example">next chapter</link>).  Or, you could use the approach listed
+			above and supply an instance of the <code>JaasSecurityContext</code> to the <code>SecurityContextCredentials</code>.
+		</para>
 		<para>At this point, we've reviewed all of the interesting code in the example application related to JBoss DNA.  However, feel free
     to play with the application, trying different things.</para>
 	</sect1>

Modified: trunk/docs/reference/src/main/docbook/en-US/content/configuration.xml
===================================================================
--- trunk/docs/reference/src/main/docbook/en-US/content/configuration.xml	2009-06-07 22:33:45 UTC (rev 989)
+++ trunk/docs/reference/src/main/docbook/en-US/content/configuration.xml	2009-06-08 00:03:34 UTC (rev 990)
@@ -29,12 +29,343 @@
 %CustomDTD;
 ]>
 <chapter id="configuration">
-  <title>Configuration</title>
-	<para>
-		Configuring JBoss DNA services is a bit more manual than is ideal. JBoss DNA currently consists of classes that uses dependency
-    injection to allow a great deal of flexibility in how it can be configured and customized. But this flexibility
-    makes it more difficult for you to configure.  We understand this, and will soon provide a much easier way to set up 
-		and manage JBoss DNA.  Current plans are to use the <ulink url="http://www.jboss.org/jbossmc">JBoss Microcontainer</ulink>
-		along with a configuration repository.
+  <title>Configuring and Using JBoss DNA</title>
+	<para>Using JBoss DNA within your application is actually quite straightforward.  As you'll see in this chapter,
+		the first step is setting up JBoss DNA and starting the <code>JcrEngine</code>.  After that, you obtain the
+		<code>javax.jcr.Repository</code> instance for a named repository and just use the standard JCR API throughout your
+		application.
 	</para>
+	<sect1 id="jcr_engine">
+		<title>JBoss DNA's JcrEngine</title>
+		<para>
+			JBoss DNA encapsulates everything necessary to run one or more JCR repositories into a single &JcrEngine; instance.
+			This includes all underlying repository sources, the pools of connections to the sources, the sequencers,
+			the MIME type detector(s), and the &Repository; implementations.
+		</para>
+		<para>
+			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 = ...
+JcrEngine engine = config.build();
+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>
+		<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>
+		<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)
+			present at the time of the <code>shutdown()</code> call will be allowed to finish.  
+			In essence, <code>shutdown()</code> is a <emphasis>graceful</emphasis> request, and since it may take some time to complete,
+			you can wait until the shutdown has completed by simply calling <code>awaitTermination(...)</code> as shown above.
+			This method will block until the engine has indeed shutdown or until the supplied time duration has passed (whichever comes first).
+			And, yes, you can call the <code>awaitTermination(...)</code> method repeatedly if needed.
+		</para>
+	</sect1>
+	<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:
+			<itemizedlist>
+				<listitem>
+					<para><emphasis role="strong"><code>Repository sources</code></emphasis> are the POJO objects that each describe a particular
+					location where content is stored.  Each repository source object is an instance of a JBoss DNA connector, and is configured
+					with the properties that particular source.  JBoss DNA's &RepositorySource; classes are analogous to JDBC's &DataSource; classes -
+					they are implemented by specific connectors (aka, "drivers") for specific kinds of repository sources (aka, "databases").
+					Similarly, a &RepositorySource; instance is analogous to a &DataSource; instance, with bean properties for each configurable
+					parameter.  Therefore, each repository source definition must supply the name of the &RepositorySource; class, any
+					bean properties, and, optionally, the classpath that should be used to load the class. </para>
+				</listitem>
+				<listitem>
+					<para><emphasis role="strong"><code>Repositories</code></emphasis> define the JCR repositories that are available.  Each
+					repository has a unique name that is used to obtain the &Repository; instance from the &JcrEngine;'s <code>getRepository(String)</code>
+					method, but each repository definition also can include the predefined namespaces (other than those automatically defined by
+					JBoss DNA), various options, and the node types that are to be available in the repository without explicit registration
+					through the JCR API.</para>
+				</listitem>
+				<listitem>
+					<para><emphasis role="strong"><code>Sequencers</code></emphasis> define the particular sequencers that are available for use.
+					Each sequencer definition provides the path expressions governing which nodes in the repository should be sequenced when those nodes change,
+					and where the resulting output generated by the sequencer should be placed.  The definition also must state the name of 
+					the sequencer class, any bean properties and, optionally, the classpath that should be used to load the class.</para>
+				</listitem>
+				<listitem>
+					<para><emphasis role="strong"><code>MIME type detectors</code></emphasis> define the particular MIME type detector(s) that should
+					be made available.  A MIME type detector does exactly what the name implies: it attempts to determine the MIME type given a
+					"filename" and contents.  JBoss DNA automatically uses a detector that uses the file extension to identify the MIME type,
+					but also provides an implementation that uses an external library to identify the MIME type based upon the contents.
+					The definition must state the name of the detector class, any bean properties and, optionally, the classpath that should 
+					be used to load the class.</para>
+				</listitem>
+			</itemizedlist>
+		</para>
+		<para>
+			There really are three options:
+			<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>
+				</listitem>
+				<listitem>
+					<para><emphasis role="strong"><code>Load 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>
+				</listitem>
+				<listitem>
+					<para><emphasis role="strong"><code>Programmatic configuration</code></emphasis> is always possible, even if the configuration is loaded
+					from a file or repository.  Using the &JcrConfiguration;'s API, you can define (or update or remove) all of the definitions that make
+					up a configuration.</para>
+				</listitem>
+			</itemizedlist>
+		</para>
+		<para>
+			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>
+			<para>
+				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>
+			<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.  
+			</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 &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
+				this second parameter is very useful.)
+			</para>
+			<para>
+				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"?>
+<configuration xmlns="http://www.jboss.org/dna/1.0" xmlns:jcr="http://www.jcp.org/jcr/1.0">
+	  <!-- 
+	  Define the JCR repositories 
+	  -->
+	  <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">
+	          <options jcr:primaryType="dna:options"/>
+	              <jaasLoginConfigName jcr:primaryType="dna:option" dna:value="dna-jcr"/>
+	          </options>
+	      </dna:repository>
+	  </dna:repositories>
+    <!-- 
+    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">
+            <!-- Define the name of the workspace used by default.  Optional, but convenient. -->
+            <defaultWorkspaceName>workspace2</defaultWorkspaceName>
+        </dna:source>
+    </dna:sources>
+    <!-- 
+    Define the sequencers. This is an optional section. For this example, we're not using any sequencers. 
+    -->
+    <dna:sequencers>
+        <!--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>
+    <dna:mimeTypeDetectors>
+        <dna:mimeTypeDetector jcr:name="Detector" dna:description="Standard extension-based MIME type detector"/>
+    </dna:mimeTypeDetectors>
+</configuration>
+ ]]></programlisting>
+		</sect2>
+		<sect2 id="loading_from_repository">
+			<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>
+				method:
+			</para>
+    	<programlisting role="JAVA"><![CDATA[
+RepositorySource configSource = ...
+JcrConfiguration config = new JcrConfiguration();
+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;.
+				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.)
+			</para>
+		</sect2>
+		<sect2 id="programmatic_configuration">
+			<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
+				dynamic information.
+			</para>
+			<para>
+				The &JcrConfiguration; class was designed to have an easy-to-use API that makes it easy to configure each of the different kinds of
+				components, especially when using an IDE with code completion.  Here are several examples:
+			</para>
+			<sect3 id="programmatically_configuring_sources">
+				<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>
+    		<programlisting role="JAVA"><![CDATA[
+JcrConfiguration config = ...
+config.repositorySource("source A")
+      .usingClass(InMemoryRepositorySource.class)
+      .setDescription("The repository for our content")
+      .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.
+					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>
+				<note>
+					<para>Each time <code>repositorySource(String)</code> is called, it will either load the existing definition with the supplied
+					name or will create a new definition if one does not already exist.  To remove a definition, simply call <code>remove()</code>
+					on the result of <code>repositorySource(String)</code>.
+					The set of existing definitions can be accessed with the <code>repositorySources()</code> method.
+					</para>
+				</note>
+			</sect3>
+			<sect3 id="programmatically_configuring_repositories">
+				<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 = ...
+config.repository("repository A")
+      .addNodeTypes("myCustomNodeTypes.cnd")
+      .setSource("source 1")
+      .registerNamespace("acme","http://www.example.com/acme")
+      .setOption(JcrRepository.Option.JAAS_LOGIN_CONFIG_NAME, "dna-jcr");
+ ]]></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
+					that will be made available when the repository is accessed.  It also defines the "http://www.example.com/acme" namespace,
+					and finally sets the "JAAS_LOGIN_CONFIG_NAME" option to define the name	of the JAAS login configuration that should be used by 
+					the JBoss DNA repository.
+				</para>
+				<note>
+					<para>Each time <code>repository(String)</code> is called, it will either load the existing definition with the supplied
+					name or will create a new definition if one does not already exist.  To remove a definition, simply call <code>remove()</code>
+					on the result of <code>repository(String)</code>.
+					The set of existing definitions can be accessed with the <code>repositories()</code> method.
+					</para>
+				</note>
+			</sect3>
+			<sect3 id="programmatically_configuring_sequencers">
+				<title>Sequencers</title>
+				<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 = ...
+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>
+				<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 
+					"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.)
+					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>
+				<note>
+					<para>Each time <code>sequencer(String)</code> is called, it will either load the existing definition with the supplied
+					name or will create a new definition if one does not already exist.  To remove a definition, simply call <code>remove()</code>
+					on the result of <code>sequencer(String)</code>.
+					The set of existing definitions can be accessed with the <code>sequencers()</code> method.
+					</para>
+				</note>
+			</sect3>
+			<sect3 id="programmatically_configuring_mime_type_detectors">
+				<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 = ...
+config.mimeTypeDetector("Extension Detector")
+      .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).
+				</para>
+				<note>
+					<para>Each time <code>mimeTypeDetector(String)</code> is called, it will either load the existing definition with the supplied
+					name or will create a new definition if one does not already exist.  To remove a definition, simply call <code>remove()</code>
+					on the result of <code>mimeTypeDetector(String)</code>.  
+					The set of existing definitions can be accessed with the <code>mimeTypeDetectors()</code> method.
+					</para>
+				</note>
+			</sect3>
+		</sect2>
+	</sect1>
+	<sect1 id="using_dna_whats_next">
+		<title>What's next</title>
+		<para>
+			This chapter outline how you configure JBoss DNA, how you then access a <code>javax.jcr.Repository</code> instance,
+			and use the standard JCR API to interact with the repository. The
+			<link linkend="downloading_and_running">next chapter </link> walks you through downloading
+			and running the JBoss DNA examples. 
+		</para>
+	</sect1>
 </chapter>

Modified: trunk/docs/reference/src/main/docbook/en-US/content/development_tools.xml
===================================================================
--- trunk/docs/reference/src/main/docbook/en-US/content/development_tools.xml	2009-06-07 22:33:45 UTC (rev 989)
+++ trunk/docs/reference/src/main/docbook/en-US/content/development_tools.xml	2009-06-08 00:03:34 UTC (rev 990)
@@ -228,6 +228,7 @@
 		<para>While you're adding <code>$MAVEN_HOME/bin</code> to your path, you should also set the <code>$MAVEN_OPTS</code> environment variable
 		  to "<code>-Xmx256m</code>".  If you don't do this, you'll likely see an <code>java.lang.OutOfMemoryError</code> sometime during a full
 		  build.
+		</para>
 		<note>
 			<para>
 				The JBoss Maven repository provides a central location for not only the artifacts produced by the JBoss.org projects (well, at least those

Modified: trunk/docs/reference/src/main/docbook/en-US/content/environment.xml
===================================================================
--- trunk/docs/reference/src/main/docbook/en-US/content/environment.xml	2009-06-07 22:33:45 UTC (rev 989)
+++ trunk/docs/reference/src/main/docbook/en-US/content/environment.xml	2009-06-08 00:03:34 UTC (rev 990)
@@ -39,86 +39,6 @@
 		<ulink url="http://www.jboss.org/jbossmc">JBoss Microcontainer</ulink> to automatically assemble and wire together
 		all the lower-level components.
   </para>
-	<sect1 id="security">
-		<title>Security</title>
-	  <para>
-	    JBoss DNA uses the
-	    <ulink url="http://java.sun.com/javase/technologies/security/">Java Authentication and Authorization Service (JAAS)</ulink>
-	    for its security mechanism. Not only is this the standard approach for authenticating and authorizing in Java, but
-			it also enables JBoss DNA to integrate existing security systems.  
-	  </para>
-	  <para>
-			There are quite a few JAAS providers available, but one of the best and most powerful providers is
-	    <ulink url="http://www.jboss.org/jbosssecurity/">JBoss Security</ulink>, which is the open source
-			security framework used by JBoss.  JBoss Security offers a number of JAAS login modules, including:
-	    <itemizedlist>
-	      <listitem>
-	        <para>
-	          <emphasis role="strong">User-Roles Login Module</emphasis>
-	          is a simple
-	          <code>javax.security.auth.login.LoginContext</code>
-	          implementation that uses usernames and passwords stored in a properties file.
-	        </para>
-	      </listitem>
-	      <listitem>
-	        <para>
-	          <emphasis role="strong">Client Login Module</emphasis>
-	          prompts the user for their username and password.
-	        </para>
-	      </listitem>
-	      <listitem>
-	        <para>
-	          <emphasis role="strong">Database Server Login Module</emphasis>
-	          uses a JDBC database to authenticate principals and associate them with roles.
-	        </para>
-	      </listitem>
-	      <listitem>
-	        <para>
-	          <emphasis role="strong">LDAP Login Module</emphasis>
-	          uses an LDAP directory to authenticate principals. Two implementations are available.
-	        </para>
-	      </listitem>
-	      <listitem>
-	        <para>
-	          <emphasis role="strong">Certificate Login Module</emphasis>
-	          authenticates using X509 certificates, obtaining roles from either property files or a JDBC database.
-	        </para>
-	      </listitem>
-	      <listitem>
-	        <para>
-	          <emphasis role="strong">Operating System Login Module</emphasis>
-	          authenticates using the operating system's mechanism.
-	        </para>
-	      </listitem>
-	    </itemizedlist>
-	    and many others.  Plus, JBoss Security also provides other capabilities, such as using XACML policies or using federated single sign-on. 
-			For more detail, see the <ulink url="http://www.jboss.org/jbosssecurity/">JBoss Security</ulink> project.
-	  </para>
-		<sect2 id="authentication">
-			<title>Authenticating with JAAS</title>
-			<para>
-				JBoss DNA defers to JAAS to authenticate clients creating repository connections (known as JCR Sessions if using the JCR API),
-				and generally expects the client application to obtain the JAAS &LoginContext; or &AppControlContext;.
-				These are then passed to JBoss DNA, which merely verifies that authentication has been done.
-			</para>
-			<para>
-				As we'll see in the <link linkend="execution-context">next section</link>, JBoss DNA has the notion of an &ExecutionContext;
-				that can be created using JAAS login or access control contexts.  These execution contexts therefore contain information
-				about the subject.
-			</para>
-			<para>
-				We'll also see in the <link linkend="jcr">chapter on JCR</link> how JAAS can be used for authentication when
-				JCR Sessions are created.
-			</para>
-		</sect2>
-		<sect2 id="authorization">
-			<title>Authorization with JAAS</title>
-			<para>
-				JBoss DNA does not currently use any of the authorization features of JAAS.  However, in future releases where authorization
-				is supported, JBoss DNA will rely upon JAAS authorization just as it currently does for authentication.
-			</para>
-		</sect2>
-	</sect1>
 	<sect1 id="execution-context">
 		<title>Execution contexts</title>
 		<para>
@@ -158,18 +78,12 @@
     public &PropertyFactory; getPropertyFactory() {...}
 
     /**
-     * Get the current JAAS access control context.
-     * @return the access control context; may be <code>null</code>
+     * Get the security context for this environment.
+     * @return the security context; never <code>null</code>
      */
-    public &AccessControlContext; getAccessControlContext() {...}
+    public &SecurityContext; getSecurityContext() {...}
 
     /**
-     * Get the current JAAS login context.
-     * @return the login context; may be <code>null</code>
-     */
-    public &LoginContext; getLoginContext() {...}
-
-    /**
      * Get the JAAS subject for which this context was created.
      * @return the subject; never null
      */
@@ -201,8 +115,8 @@
 		<para>
 			Notice that &ExecutionContext; implements the &ClassLoaderFactory; interface described in the
 			<link linkend="classloaders">previous chapter</link>, meaning it can be used to create other contexts.  These other methods are not shown,
-			but can be used to create create subcontexts with different <link linkend="security">JAAS</link>
-			login or access control contexts, with different namespace registry, or with different combinations of components.
+			but can be used to create create subcontexts with different <link linkend="security">security contexts</link>,
+	    with different namespace registry, or with different combinations of components.
 		</para>
 	  <para>
 			The fact that so many of the JBoss DNA components take &ExecutionContext; instances gives us some interesting possibilities.  
@@ -226,11 +140,167 @@
 &CallbackHandler; callbackHandler = ...
 &LoginContext; loginContext = new LoginContext("username",callbackHandler);
 &ExecutionContext; context3 = context1.with(loginContext);
+
+// Create a context that uses a provided &SecurityContext; (see the <link linkend="security">next section</link>)...
+&SecurityContext; mySecurityContext = ...
+&ExecutionContext; context4 = context1.with(mySecurityContext);
 </programlisting>
 		<para>
 			These contexts can then be passed to the various components as needed.
 		</para>
 	</sect1>
+	<sect1 id="security">
+		<title>Security</title>
+	  <para>
+	    JBoss DNA uses a simple abstraction layer to isolate it from the security infrastructure used within an application.
+	   The &SecurityContext; interface is defined as follows:
+		</para>
+	  <programlisting>
+public interface &SecurityContext; {
+
+    /**
+     * Get the name of the authenticated user.
+     * @return the authenticated user's name
+     */
+    &String; getUserName();
+
+    /**
+     * Determine whether the authenticated user has the given role.
+     * @param roleName the name of the role to check
+     * @return true if the user has the role and is logged in; false otherwise
+     */
+    boolean hasRole( String roleName );
+
+    /**
+     * Logs the user out of the authentication mechanism.
+     * For some authentication mechanisms, this will be implemented as a no-op.
+     */
+    void logout();
+}
+</programlisting>
+		<para>
+			As noted below, this security context is made available through the &ExecutionContext; described above.
+		</para>
+		<sect1 id="jaas_security">
+			<title>JAAS</title>
+			<para>
+				One such implementation is the &JaasSecurityContext;, which delegates any authentication or authorization requests to a
+		    <ulink url="http://java.sun.com/javase/technologies/security/">Java Authentication and Authorization Service (JAAS)</ulink>
+		    provider.  This is the standard approach for authenticating and authorizing in Java, and is the default mechanism 
+		    used by the &JcrEngine;.  
+		  </para>
+		  <para>
+				There are quite a few JAAS providers available, but one of the best and most powerful providers is
+		    <ulink url="http://www.jboss.org/jbosssecurity/">JBoss Security</ulink>, which is the open source
+				security framework used by JBoss.  JBoss Security offers a number of JAAS login modules, including:
+		    <itemizedlist>
+		      <listitem>
+		        <para>
+		          <emphasis role="strong">User-Roles Login Module</emphasis>
+		          is a simple
+		          <code>javax.security.auth.login.LoginContext</code>
+		          implementation that uses usernames and passwords stored in a properties file.
+		        </para>
+		      </listitem>
+		      <listitem>
+		        <para>
+		          <emphasis role="strong">Client Login Module</emphasis>
+		          prompts the user for their username and password.
+		        </para>
+		      </listitem>
+		      <listitem>
+		        <para>
+		          <emphasis role="strong">Database Server Login Module</emphasis>
+		          uses a JDBC database to authenticate principals and associate them with roles.
+		        </para>
+		      </listitem>
+		      <listitem>
+		        <para>
+		          <emphasis role="strong">LDAP Login Module</emphasis>
+		          uses an LDAP directory to authenticate principals. Two implementations are available.
+		        </para>
+		      </listitem>
+		      <listitem>
+		        <para>
+		          <emphasis role="strong">Certificate Login Module</emphasis>
+		          authenticates using X509 certificates, obtaining roles from either property files or a JDBC database.
+		        </para>
+		      </listitem>
+		      <listitem>
+		        <para>
+		          <emphasis role="strong">Operating System Login Module</emphasis>
+		          authenticates using the operating system's mechanism.
+		        </para>
+		      </listitem>
+		    </itemizedlist>
+		    and many others.  Plus, JBoss Security also provides other capabilities, such as using XACML policies or using federated single sign-on. 
+				For more detail, see the <ulink url="http://www.jboss.org/jbosssecurity/">JBoss Security</ulink> project.
+		  </para>
+		</sect2>
+		<sect2 id="web_security">
+			<title>Web application security</title>
+			<para>
+				If JBoss DNA is being used within a web application, then it is probably desirable to reuse the security infrastructure
+				of the application server.  This can be accomplished by implementing the &SecurityContext; interface with an implementation
+				that delegates to the <interface>HttpServletRequest</interface>.  Then, for each request, create a &SecurityContextCredentials;
+				instance around your &SecurityContext;, and use that credentials to obtain a JCR &Session;.
+			</para>
+			<para>
+				Here is an example of the &SecurityContext; implementation that uses the servlet request:
+			</para>
+	  <programlisting>
+ at Immutable
+public class ServletSecurityContext implements &SecurityContext; {
+
+    private final String userName;
+    private final HttpServletRequest request;
+
+    /**
+     * Create a {@link ServletSecurityContext} with the supplied {@link HttpServletRequest servlet information}.
+     * 
+     * @param request the servlet request; may not be null
+     */
+    public ServletSecurityContext( HttpServletRequest request ) {
+        this.request = request;
+        this.userName = request.getUserPrincipal() != null ? request.getUserPrincipal().getName() : null;
+    }
+
+    /**
+     * Get the name of the authenticated user.
+     * @return the authenticated user's name
+     */
+    public &String; getUserName() {
+			return userName;
+		}
+
+    /**
+     * Determine whether the authenticated user has the given role.
+     * @param roleName the name of the role to check
+     * @return true if the user has the role and is logged in; false otherwise
+     */
+    boolean hasRole( String roleName ) {
+			request.isUserInRole(roleName);
+		}
+
+    /**
+     * Logs the user out of the authentication mechanism.
+     * For some authentication mechanisms, this will be implemented as a no-op.
+     */
+    public void logout() {
+		}
+}</programlisting>
+			<para>
+				Then use this to create a &Session;:
+			</para>
+	  <programlisting>
+HttpServletRequest request = ...
+&Repository; repository = engine.getRepository("my repository");
+&SecurityContext; securityContext = new ServletSecurityContext(httpServletRequest);
+SecurityContextCredentials credentials = new SecurityContextCredentials(securityContext);
+&Session; session = repository.login(credentials, workspaceName);
+</programlisting>
+		</sect2>
+	</sect1>
 	<sect1>
 		<title>Summary</title>
 		<para>

Modified: trunk/docs/reference/src/main/docbook/en-US/custom.dtd
===================================================================
--- trunk/docs/reference/src/main/docbook/en-US/custom.dtd	2009-06-07 22:33:45 UTC (rev 989)
+++ trunk/docs/reference/src/main/docbook/en-US/custom.dtd	2009-06-08 00:03:34 UTC (rev 990)
@@ -1,4 +1,4 @@
-<!ENTITY versionNumber "0.4">
+<!ENTITY versionNumber "0.5">
 <!ENTITY copyrightYears "2008-2009">
 <!ENTITY copyrightHolder "Red Hat, Inc.">
 
@@ -10,6 +10,7 @@
 <!ENTITY DocHome    					"http://www.jboss.org/file-access/default/members/dna/freezone/">
 <!ENTITY API        					"&DocHome;docs/&versionNumber;/apidocs/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/">
@@ -24,10 +25,14 @@
 <!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'>Getting Started</ulink>">
 
 <!-- Types in JRE -->
 
 <!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 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>">
 <!ENTITY IOException				      		"<ulink url='&Java;java/io/IOException.html'><classname>IOException</classname></ulink>">
 <!ENTITY ClassLoader				      		"<ulink url='&Java;java/lang/ClassLoader.html'><interface>ClassLoader</interface></ulink>">
@@ -38,6 +43,7 @@
 <!ENTITY ExecutorService		      		"<ulink url='&Java;java/util/concurrent/ExecutorService.html'><interface>ExecutorService</interface></ulink>">
 <!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>">
 
 
 <!-- Types in JCR API -->
@@ -45,6 +51,7 @@
 <!ENTITY Repository					       		"<interface>Repository</interface>">
 <!ENTITY Session						       		"<interface>Session</interface>">
 <!ENTITY Credentials					       	"<interface>Credentials</interface>">
+<!ENTITY SimpleCredentials					  "<interface>SimpleCredentials</interface>">
 
 <!-- Types in dna-common -->
 
@@ -62,6 +69,8 @@
 <!ENTITY Results							       	"<ulink url='&API;graph/Results.html'><interface>Results</interface></ulink>">
 <!ENTITY Location							       	"<ulink url='&API;graph/Location.html'><classname>Location</classname></ulink>">
 <!ENTITY ExecutionContext		       		"<ulink url='&API;graph/ExecutionContext.html'><classname>ExecutionContext</classname></ulink>">
+<!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 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>">
 <!ENTITY PathSegment				       		"<ulink url='&API;graph/property/Path.Segment.html'><interface>Path.Segment</interface></ulink>">
@@ -77,6 +86,9 @@
 <!ENTITY RepositorySourceCapabilities	"<ulink url='&API;graph/connector/RepositorySourceCapabilities.html'><classname>RepositorySourceCapabilities</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 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 Projection								  	"<ulink url='&API;graph/connector/federation/Projection.html'><classname>Projection</classname></ulink>">
 <!ENTITY CachePolicy							    "<ulink url='&API;graph/cache/CachePolicy.html'><interface>CachePolicy</interface></ulink>">
 <!ENTITY Request					       			"<ulink url='&API;graph/request/Request.html'><classname>Request</classname></ulink>">
 <!ENTITY CompositeRequest					    "<ulink url='&API;graph/request/CompositeRequest.html'><classname>CompositeRequest</classname></ulink>">
@@ -95,6 +107,8 @@
 
 <!-- Types in dna-repository -->
 
+<!ENTITY DnaEngine					       		"<ulink url='&API;repository/DnaEngine.html'><classname>DnaEngine</classname></ulink>">
+<!ENTITY DnaConfiguration		       		"<ulink url='&API;repository/DnaConfiguration.html'><classname>DnaConfiguration</classname></ulink>">
 <!ENTITY RepositoryLibrary	       		"<ulink url='&API;repository/RepositoryLibrary.html'><classname>RepositoryLibrary</classname></ulink>">
 <!ENTITY RepositoryService	       		"<ulink url='&API;repository/RepositoryService.html'><classname>RepositoryService</classname></ulink>">
 <!ENTITY ServiceAdministrator   			"<ulink url='&API;repository/service/ServiceAdministrator.html'><interface>ServiceAdministrator</interface></ulink>">
@@ -110,16 +124,16 @@
 
 <!-- Types in dna-jcr -->
 
+<!ENTITY JcrEngine					       		"<ulink url='&API;jcr/JcrEngine.html'><classname>JcrEngine</classname></ulink>">
+<!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 SecurityContextCredentials   "<ulink url='&API;jcr/SecurityContextCredentials.html'><classname>SecurityContextCredentials</classname></ulink>">
 
 <!-- Types in extensions/ -->
 
 <!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 FederatedRepositorySource  	"<ulink url='&API;connector/federation/FederatedRepositorySource.html'><classname>FederatedRepositorySource</classname></ulink>">
-<!ENTITY FederatedRepository			  	"<ulink url='&API;connector/federation/FederatedRepository.html'><classname>FederatedRepository</classname></ulink>">
-<!ENTITY Projection								  	"<ulink url='&API;connector/federation/Projection.html'><classname>Projection</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>">



From dna-commits at lists.jboss.org  Sun Jun  7 20:07:25 2009
From: dna-commits at lists.jboss.org (dna-commits at lists.jboss.org)
Date: Sun, 07 Jun 2009 20:07:25 -0400
Subject: [dna-commits] DNA SVN: r991 -
	trunk/docs/gettingstarted/src/main/docbook/en-US.
Message-ID: <E1MDSOb-0000YI-PW@committer01.frg.pub.inap.atl.jboss.com>

Author: bcarothers
Date: 2009-06-07 20:07:22 -0400 (Sun, 07 Jun 2009)
New Revision: 991

Modified:
   trunk/docs/gettingstarted/src/main/docbook/en-US/custom.dtd
Log:
Changed the name of the ReferenceGuide entity from Getting Started to Reference Guide

Modified: trunk/docs/gettingstarted/src/main/docbook/en-US/custom.dtd
===================================================================
--- trunk/docs/gettingstarted/src/main/docbook/en-US/custom.dtd	2009-06-08 00:03:34 UTC (rev 990)
+++ trunk/docs/gettingstarted/src/main/docbook/en-US/custom.dtd	2009-06-08 00:07:22 UTC (rev 991)
@@ -25,7 +25,7 @@
 <!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'>Getting Started</ulink>">
+<!ENTITY ReferenceGuide           		"<ulink url='&DocHome;docs/&versionNumber;/manuals/reference/html/index.html'>Reference Guide</ulink>">
 
 <!-- Types in JRE -->
 



From dna-commits at lists.jboss.org  Sun Jun  7 20:08:30 2009
From: dna-commits at lists.jboss.org (dna-commits at lists.jboss.org)
Date: Sun, 07 Jun 2009 20:08:30 -0400
Subject: [dna-commits] DNA SVN: r992 -
	trunk/docs/reference/src/main/docbook/en-US/content.
Message-ID: <E1MDSPe-0000YR-MQ@committer01.frg.pub.inap.atl.jboss.com>

Author: rhauch
Date: 2009-06-07 20:08:30 -0400 (Sun, 07 Jun 2009)
New Revision: 992

Modified:
   trunk/docs/reference/src/main/docbook/en-US/content/environment.xml
Log:
Corrected an error in the Reference Guide docbook.

Modified: trunk/docs/reference/src/main/docbook/en-US/content/environment.xml
===================================================================
--- trunk/docs/reference/src/main/docbook/en-US/content/environment.xml	2009-06-08 00:07:22 UTC (rev 991)
+++ trunk/docs/reference/src/main/docbook/en-US/content/environment.xml	2009-06-08 00:08:30 UTC (rev 992)
@@ -181,7 +181,7 @@
 		<para>
 			As noted below, this security context is made available through the &ExecutionContext; described above.
 		</para>
-		<sect1 id="jaas_security">
+		<sect2 id="jaas_security">
 			<title>JAAS</title>
 			<para>
 				One such implementation is the &JaasSecurityContext;, which delegates any authentication or authorization requests to a



From dna-commits at lists.jboss.org  Sun Jun  7 20:18:11 2009
From: dna-commits at lists.jboss.org (dna-commits at lists.jboss.org)
Date: Sun, 07 Jun 2009 20:18:11 -0400
Subject: [dna-commits] DNA SVN: r993 -
	trunk/docs/reference/src/main/docbook/en-US/content.
Message-ID: <E1MDSZ1-0000uw-PK@committer01.frg.pub.inap.atl.jboss.com>

Author: rhauch
Date: 2009-06-07 20:18:10 -0400 (Sun, 07 Jun 2009)
New Revision: 993

Modified:
   trunk/docs/reference/src/main/docbook/en-US/content/environment.xml
Log:
Corrected an error in the Reference Guide docbook.

Modified: trunk/docs/reference/src/main/docbook/en-US/content/environment.xml
===================================================================
--- trunk/docs/reference/src/main/docbook/en-US/content/environment.xml	2009-06-08 00:08:30 UTC (rev 992)
+++ trunk/docs/reference/src/main/docbook/en-US/content/environment.xml	2009-06-08 00:18:10 UTC (rev 993)
@@ -84,12 +84,6 @@
     public &SecurityContext; getSecurityContext() {...}
 
     /**
-     * Get the JAAS subject for which this context was created.
-     * @return the subject; never null
-     */
-    public &Subject; getSubject() {...}
-
-    /**
      * Return a logger associated with this context. This logger records only those activities within the 
      * context and provide a way to capture the context-specific activities. All log messages are also
      * sent to the system logger, so classes that log via this mechanism should <i>not</i> also 
@@ -256,7 +250,8 @@
     private final HttpServletRequest request;
 
     /**
-     * Create a {@link ServletSecurityContext} with the supplied {@link HttpServletRequest servlet information}.
+     * Create a {@link ServletSecurityContext} with the supplied 
+     * {@link HttpServletRequest servlet information}.
      * 
      * @param request the servlet request; may not be null
      */
@@ -270,8 +265,8 @@
      * @return the authenticated user's name
      */
     public &String; getUserName() {
-			return userName;
-		}
+        return userName;
+    }
 
     /**
      * Determine whether the authenticated user has the given role.
@@ -279,15 +274,15 @@
      * @return true if the user has the role and is logged in; false otherwise
      */
     boolean hasRole( String roleName ) {
-			request.isUserInRole(roleName);
-		}
+        request.isUserInRole(roleName);
+    }
 
     /**
      * Logs the user out of the authentication mechanism.
      * For some authentication mechanisms, this will be implemented as a no-op.
      */
     public void logout() {
-		}
+    }
 }</programlisting>
 			<para>
 				Then use this to create a &Session;:



From dna-commits at lists.jboss.org  Sun Jun  7 20:52:10 2009
From: dna-commits at lists.jboss.org (dna-commits at lists.jboss.org)
Date: Sun, 07 Jun 2009 20:52:10 -0400
Subject: [dna-commits] DNA SVN: r994 -
	trunk/docs/reference/src/main/docbook/en-US/content.
Message-ID: <E1MDT5u-0002CX-9u@committer01.frg.pub.inap.atl.jboss.com>

Author: bcarothers
Date: 2009-06-07 20:52:09 -0400 (Sun, 07 Jun 2009)
New Revision: 994

Modified:
   trunk/docs/reference/src/main/docbook/en-US/content/environment.xml
   trunk/docs/reference/src/main/docbook/en-US/content/introduction.xml
Log:
Added in references to REST subprojects and cleaned up some security info/examples

Modified: trunk/docs/reference/src/main/docbook/en-US/content/environment.xml
===================================================================
--- trunk/docs/reference/src/main/docbook/en-US/content/environment.xml	2009-06-08 00:18:10 UTC (rev 993)
+++ trunk/docs/reference/src/main/docbook/en-US/content/environment.xml	2009-06-08 00:52:09 UTC (rev 994)
@@ -125,15 +125,16 @@
 		</para>
 	  <programlisting>
 &ExecutionContext; context1 = new &ExecutionContext;();
+String jaasRealm = ...;
 
-// Create a context for a user, authenticating using JAAS ...
-&LoginContext; loginContext = new LoginContext("username",callbackHandler);
-&ExecutionContext; context2 = context1.with(new LoginContext("username"));
+// Create a context for a user, authenticating using a JAAS LoginContext...
+char[] password = "password".toCharArray();
+&SecurityContext; securityContext = new JaasSecurityContext(jaasRealm, "username", password);
+&ExecutionContext; context2 = context1.with(securityContext);
 
 // Create a context for the same user, authenticating using JAAS, and using a different callback handler ...
 &CallbackHandler; callbackHandler = ...
-&LoginContext; loginContext = new LoginContext("username",callbackHandler);
-&ExecutionContext; context3 = context1.with(loginContext);
+&ExecutionContext; context3 = context1.with(new JaasSecurityContext(jaasRealm, callbackHandler);
 
 // Create a context that uses a provided &SecurityContext; (see the <link linkend="security">next section</link>)...
 &SecurityContext; mySecurityContext = ...
@@ -185,7 +186,7 @@
 		  </para>
 		  <para>
 				There are quite a few JAAS providers available, but one of the best and most powerful providers is
-		    <ulink url="http://www.jboss.org/jbosssecurity/">JBoss Security</ulink>, which is the open source
+		    <ulink url="http://www.jboss.org/jbosssecurity/">JBoss Security</ulink>, the open source
 				security framework used by JBoss.  JBoss Security offers a number of JAAS login modules, including:
 		    <itemizedlist>
 		      <listitem>

Modified: trunk/docs/reference/src/main/docbook/en-US/content/introduction.xml
===================================================================
--- trunk/docs/reference/src/main/docbook/en-US/content/introduction.xml	2009-06-08 00:18:10 UTC (rev 993)
+++ trunk/docs/reference/src/main/docbook/en-US/content/introduction.xml	2009-06-08 00:52:09 UTC (rev 994)
@@ -457,6 +457,22 @@
             library to determine the best MIME type from the filename and file contents.
           </para>
         </listitem>
+        <listitem>
+          <para>
+            <emphasis role="strong">dna-web-jcr-rest</emphasis>
+            provides a set of JSR-311 (JAX-RS) objects that form the basis of a RESTful server for Java Content Repositories.  This project 
+            provides integration with DNA's JCR implementation (of course) but also contains a service provider interface (SPI) that can be 
+            used to integrate other JCR implementations with these RESTful services in the future.  For ease of packaging, these classes are
+            provided as a JAR that can be placed in the WEB-INF/lib of a deployed RESTful server WAR.
+          </para>
+        </listitem>
+        <listitem>
+          <para>
+            <emphasis role="strong">dna-web-jcr-rest-war</emphasis>
+            wraps the RESTful services from the dna-web-jcr-rest JAR into a WAR and provides in-container integration tests.  This project
+            can be consulted as a template for how to deploy the RESTful services in a custom implementation. 
+          </para>
+        </listitem>
       </itemizedlist>
       There are also documentation modules (located in the source under the
       <code>docs/</code>



From dna-commits at lists.jboss.org  Mon Jun  8 10:57:17 2009
From: dna-commits at lists.jboss.org (dna-commits at lists.jboss.org)
Date: Mon, 08 Jun 2009 10:57:17 -0400
Subject: [dna-commits] DNA SVN: r995 - in
	trunk/docs/reference/src/main/docbook/en-US: content and 5
	other directories.
Message-ID: <E1MDgHl-0007Ey-QC@committer01.frg.pub.inap.atl.jboss.com>

Author: rhauch
Date: 2009-06-08 10:57:17 -0400 (Mon, 08 Jun 2009)
New Revision: 995

Added:
   trunk/docs/reference/src/main/docbook/en-US/content/connectors/
   trunk/docs/reference/src/main/docbook/en-US/content/connectors/in_memory.xml
   trunk/docs/reference/src/main/docbook/en-US/content/core/
   trunk/docs/reference/src/main/docbook/en-US/content/core/classloaders.xml
   trunk/docs/reference/src/main/docbook/en-US/content/core/configuration.xml
   trunk/docs/reference/src/main/docbook/en-US/content/core/environment.xml
   trunk/docs/reference/src/main/docbook/en-US/content/core/mimetypes.xml
   trunk/docs/reference/src/main/docbook/en-US/content/core/repositories.xml
   trunk/docs/reference/src/main/docbook/en-US/content/core/sequencing.xml
   trunk/docs/reference/src/main/docbook/en-US/content/developers/
   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/jcr/
   trunk/docs/reference/src/main/docbook/en-US/content/jcr/jcr.xml
   trunk/docs/reference/src/main/docbook/en-US/content/jcr/rest_service.xml
   trunk/docs/reference/src/main/docbook/en-US/content/sequencers/
   trunk/docs/reference/src/main/docbook/en-US/content/sequencers/zip.xml
Removed:
   trunk/docs/reference/src/main/docbook/en-US/content/classloaders.xml
   trunk/docs/reference/src/main/docbook/en-US/content/configuration.xml
   trunk/docs/reference/src/main/docbook/en-US/content/development_tools.xml
   trunk/docs/reference/src/main/docbook/en-US/content/environment.xml
   trunk/docs/reference/src/main/docbook/en-US/content/jcr.xml
   trunk/docs/reference/src/main/docbook/en-US/content/mimetypes.xml
   trunk/docs/reference/src/main/docbook/en-US/content/repositories.xml
   trunk/docs/reference/src/main/docbook/en-US/content/sequencing.xml
   trunk/docs/reference/src/main/docbook/en-US/content/testing.xml
Modified:
   trunk/docs/reference/src/main/docbook/en-US/master.xml
Log:
Reorganized the Reference Guide into parts.

Deleted: trunk/docs/reference/src/main/docbook/en-US/content/classloaders.xml
===================================================================
--- trunk/docs/reference/src/main/docbook/en-US/content/classloaders.xml	2009-06-08 00:52:09 UTC (rev 994)
+++ trunk/docs/reference/src/main/docbook/en-US/content/classloaders.xml	2009-06-08 14:57:17 UTC (rev 995)
@@ -1,121 +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
-  -->
-<!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="classloaders">
-  <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 all of the "interesting" components
-		are extensions that plug into and are used by different parts of the core.  The core doesn't really care what
-		the extensions do or what external libraries they require, as long as the extension fulfills its end of the
-		extension contract.
-	</para>
-	<para>
-		This means that you only need the core modules of JBoss DNA on the application classpath, while the extensions
-		do not have to be on the application classpath.  And because the core modules of JBoss DNA have few dependencies,
-		the risk of JBoss DNA libraries conflicting with the application's are lower.  Extensions, on the other hand,
-		will likely have a lot of unique dependencies. By separating the core of JBoss DNA from the class loaders used
-		to load the extensions, your application is isolated from the extensions and their dependencies.  Of course,
-		you can put all the JARs on the application classpath, too.  (This is what the examples in the &GettingStarted; document do.)
-	</para>
-	<para>
-		This design also allows you to select only those extensions that are interesting and useful for your application.
-		Not every application needs all of the JBoss DNA functionality.
-		Some applications may only need JBoss DNA sequencing, and specifically just a few types of sequencers.
-		Other applications may not need sequencing but do want to use JBoss DNA federation capabilities.
-  </para>
-	<para>
-		Finally, the use of these formal extensions also makes it easier for you to write your own customized extensions.
-		You may have proprietary file formats that you want to sequence.  Or, you may have a non-JCR repository system that you
-		want to access via JCR and maybe even federate with information from other sources.  Since extensions do
-		only one thing (e.g., be a sequencer, or a connector, etc.), its easier to develop those customizations.
-  </para>
-  <sect1 id="dna-classloader-factory">
-    <title>Class loader factory</title>
-		<para>
-			JBoss DNA loads all of the extension classes using class loaders returned by a <emphasis>class loader factory</emphasis>.
-			Each time JBoss DNA wants to load a class, it needs the name of the class and an optional "class loader name".
-			The meaning of the names is dependent upon the implementation of the class loader factory.  For example, the
-			<link linkend="dna-maven-classloader">Maven class loader factory</link> expects the names to be 
-			<ulink url="http://maven.apache.org/pom.html#Maven_Coordinates">Maven coordinates</ulink>.  Either way,
-			the class loader factory implementation uses the name to create and return a &ClassLoader;
-			instance that can be used to load the class.  Of course, if no name is provided, then a JBoss DNA service
-			just uses its class loader to load the class. (This is why putting all the extension jars on the classpath works.)
-		</para>
-		<para>
-			The class loader factory interface is pretty simple:
-		</para>
-		<programlisting>
-public interface &ClassLoaderFactory; {
-
-    /**
-     * Get a class loader given the supplied classpath.  The meaning of the classpath is implementation-dependent.
-     * @param classpath the classpath to use
-     * @return the class loader; may not be null
-     */
-    &ClassLoader; getClassLoader( String... classpath );
-}
-</programlisting>
-    <para>In the <link linkend="environment">next chapter</link> we'll describe an &ExecutionContext; interface that is
- 			supplied to each of the JBoss DNA core services.  This context interface actually extends the &ClassLoaderFactory;
- 			interface, so setting up an &ExecutionContext; implicitly sets up the class loader factory.</para>
-  </sect1>
-  <sect1 id="dna-standard-classloader">
-    <title>Standard class loader factory</title>
-    <para>JBoss DNA includes and uses as a default a standard class loader factory that just loads the classes using the Thread's current context
-	    class loader (if there is one), or a delegate class loader that defaults to the class loader that loaded
-	    the &StandardClassLoaderFactory; class.  The class ignores any class loader names that are supplied.
-		</para>
-  </sect1>
-  <sect1 id="dna-maven-classloader">
-    <title>Maven Repository class loader factory</title>
-    <para>
-    	The <code>dna-classloader-maven</code> project has a class loader factory implementation that parses the names into
-			<ulink url="http://maven.apache.org/pom.html#Maven_Coordinates">Maven coordinates</ulink>, then uses those coordinates
-			to look up artifacts in a Maven 2 repository.  The artifact's POM file is used to determine the dependencies,
-			which is done transitively to obtain the complete dependency graph.  The resulting class loader has access
-			to these artifacts in dependency order.
-		</para>
-		<para>
-			This class loader is also able to use a JCR repository that contains the equivalent contents of a Maven repository.
-			However, JBoss DNA doesn't currently have any tooling to help populate that repository, so this component may be
-			of limited use right now.
-		</para>
-  </sect1>
-	<sect1>
-		<title>Summary</title>
-		<para>
-			In this chapter, we described the framework used by JBoss DNA to load extension classes, like implementations
-			of repositories, sequencers, MIME type detectors, and other components.
-		  <link linkend="environment">Next</link>, we cover how JBoss security works and how the various components
-		  of JBoss DNA can access this security information as well as information about the environment in which the component is running.
-		</para>
-	</sect1>
-</chapter>

Deleted: trunk/docs/reference/src/main/docbook/en-US/content/configuration.xml
===================================================================
--- trunk/docs/reference/src/main/docbook/en-US/content/configuration.xml	2009-06-08 00:52:09 UTC (rev 994)
+++ trunk/docs/reference/src/main/docbook/en-US/content/configuration.xml	2009-06-08 14:57:17 UTC (rev 995)
@@ -1,371 +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
-  -->
-<!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="configuration">
-  <title>Configuring and Using JBoss DNA</title>
-	<para>Using JBoss DNA within your application is actually quite straightforward.  As you'll see in this chapter,
-		the first step is setting up JBoss DNA and starting the <code>JcrEngine</code>.  After that, you obtain the
-		<code>javax.jcr.Repository</code> instance for a named repository and just use the standard JCR API throughout your
-		application.
-	</para>
-	<sect1 id="jcr_engine">
-		<title>JBoss DNA's JcrEngine</title>
-		<para>
-			JBoss DNA encapsulates everything necessary to run one or more JCR repositories into a single &JcrEngine; instance.
-			This includes all underlying repository sources, the pools of connections to the sources, the sequencers,
-			the MIME type detector(s), and the &Repository; implementations.
-		</para>
-		<para>
-			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 = ...
-JcrEngine engine = config.build();
-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>
-		<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>
-		<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)
-			present at the time of the <code>shutdown()</code> call will be allowed to finish.  
-			In essence, <code>shutdown()</code> is a <emphasis>graceful</emphasis> request, and since it may take some time to complete,
-			you can wait until the shutdown has completed by simply calling <code>awaitTermination(...)</code> as shown above.
-			This method will block until the engine has indeed shutdown or until the supplied time duration has passed (whichever comes first).
-			And, yes, you can call the <code>awaitTermination(...)</code> method repeatedly if needed.
-		</para>
-	</sect1>
-	<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:
-			<itemizedlist>
-				<listitem>
-					<para><emphasis role="strong"><code>Repository sources</code></emphasis> are the POJO objects that each describe a particular
-					location where content is stored.  Each repository source object is an instance of a JBoss DNA connector, and is configured
-					with the properties that particular source.  JBoss DNA's &RepositorySource; classes are analogous to JDBC's &DataSource; classes -
-					they are implemented by specific connectors (aka, "drivers") for specific kinds of repository sources (aka, "databases").
-					Similarly, a &RepositorySource; instance is analogous to a &DataSource; instance, with bean properties for each configurable
-					parameter.  Therefore, each repository source definition must supply the name of the &RepositorySource; class, any
-					bean properties, and, optionally, the classpath that should be used to load the class. </para>
-				</listitem>
-				<listitem>
-					<para><emphasis role="strong"><code>Repositories</code></emphasis> define the JCR repositories that are available.  Each
-					repository has a unique name that is used to obtain the &Repository; instance from the &JcrEngine;'s <code>getRepository(String)</code>
-					method, but each repository definition also can include the predefined namespaces (other than those automatically defined by
-					JBoss DNA), various options, and the node types that are to be available in the repository without explicit registration
-					through the JCR API.</para>
-				</listitem>
-				<listitem>
-					<para><emphasis role="strong"><code>Sequencers</code></emphasis> define the particular sequencers that are available for use.
-					Each sequencer definition provides the path expressions governing which nodes in the repository should be sequenced when those nodes change,
-					and where the resulting output generated by the sequencer should be placed.  The definition also must state the name of 
-					the sequencer class, any bean properties and, optionally, the classpath that should be used to load the class.</para>
-				</listitem>
-				<listitem>
-					<para><emphasis role="strong"><code>MIME type detectors</code></emphasis> define the particular MIME type detector(s) that should
-					be made available.  A MIME type detector does exactly what the name implies: it attempts to determine the MIME type given a
-					"filename" and contents.  JBoss DNA automatically uses a detector that uses the file extension to identify the MIME type,
-					but also provides an implementation that uses an external library to identify the MIME type based upon the contents.
-					The definition must state the name of the detector class, any bean properties and, optionally, the classpath that should 
-					be used to load the class.</para>
-				</listitem>
-			</itemizedlist>
-		</para>
-		<para>
-			There really are three options:
-			<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>
-				</listitem>
-				<listitem>
-					<para><emphasis role="strong"><code>Load 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>
-				</listitem>
-				<listitem>
-					<para><emphasis role="strong"><code>Programmatic configuration</code></emphasis> is always possible, even if the configuration is loaded
-					from a file or repository.  Using the &JcrConfiguration;'s API, you can define (or update or remove) all of the definitions that make
-					up a configuration.</para>
-				</listitem>
-			</itemizedlist>
-		</para>
-		<para>
-			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>
-			<para>
-				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>
-			<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.  
-			</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 &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
-				this second parameter is very useful.)
-			</para>
-			<para>
-				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"?>
-<configuration xmlns="http://www.jboss.org/dna/1.0" xmlns:jcr="http://www.jcp.org/jcr/1.0">
-	  <!-- 
-	  Define the JCR repositories 
-	  -->
-	  <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">
-	          <options jcr:primaryType="dna:options"/>
-	              <jaasLoginConfigName jcr:primaryType="dna:option" dna:value="dna-jcr"/>
-	          </options>
-	      </dna:repository>
-	  </dna:repositories>
-    <!-- 
-    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">
-            <!-- Define the name of the workspace used by default.  Optional, but convenient. -->
-            <defaultWorkspaceName>workspace2</defaultWorkspaceName>
-        </dna:source>
-    </dna:sources>
-    <!-- 
-    Define the sequencers. This is an optional section. For this example, we're not using any sequencers. 
-    -->
-    <dna:sequencers>
-        <!--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>
-    <dna:mimeTypeDetectors>
-        <dna:mimeTypeDetector jcr:name="Detector" dna:description="Standard extension-based MIME type detector"/>
-    </dna:mimeTypeDetectors>
-</configuration>
- ]]></programlisting>
-		</sect2>
-		<sect2 id="loading_from_repository">
-			<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>
-				method:
-			</para>
-    	<programlisting role="JAVA"><![CDATA[
-RepositorySource configSource = ...
-JcrConfiguration config = new JcrConfiguration();
-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;.
-				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.)
-			</para>
-		</sect2>
-		<sect2 id="programmatic_configuration">
-			<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
-				dynamic information.
-			</para>
-			<para>
-				The &JcrConfiguration; class was designed to have an easy-to-use API that makes it easy to configure each of the different kinds of
-				components, especially when using an IDE with code completion.  Here are several examples:
-			</para>
-			<sect3 id="programmatically_configuring_sources">
-				<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>
-    		<programlisting role="JAVA"><![CDATA[
-JcrConfiguration config = ...
-config.repositorySource("source A")
-      .usingClass(InMemoryRepositorySource.class)
-      .setDescription("The repository for our content")
-      .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.
-					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>
-				<note>
-					<para>Each time <code>repositorySource(String)</code> is called, it will either load the existing definition with the supplied
-					name or will create a new definition if one does not already exist.  To remove a definition, simply call <code>remove()</code>
-					on the result of <code>repositorySource(String)</code>.
-					The set of existing definitions can be accessed with the <code>repositorySources()</code> method.
-					</para>
-				</note>
-			</sect3>
-			<sect3 id="programmatically_configuring_repositories">
-				<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 = ...
-config.repository("repository A")
-      .addNodeTypes("myCustomNodeTypes.cnd")
-      .setSource("source 1")
-      .registerNamespace("acme","http://www.example.com/acme")
-      .setOption(JcrRepository.Option.JAAS_LOGIN_CONFIG_NAME, "dna-jcr");
- ]]></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
-					that will be made available when the repository is accessed.  It also defines the "http://www.example.com/acme" namespace,
-					and finally sets the "JAAS_LOGIN_CONFIG_NAME" option to define the name	of the JAAS login configuration that should be used by 
-					the JBoss DNA repository.
-				</para>
-				<note>
-					<para>Each time <code>repository(String)</code> is called, it will either load the existing definition with the supplied
-					name or will create a new definition if one does not already exist.  To remove a definition, simply call <code>remove()</code>
-					on the result of <code>repository(String)</code>.
-					The set of existing definitions can be accessed with the <code>repositories()</code> method.
-					</para>
-				</note>
-			</sect3>
-			<sect3 id="programmatically_configuring_sequencers">
-				<title>Sequencers</title>
-				<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 = ...
-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>
-				<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 
-					"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.)
-					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>
-				<note>
-					<para>Each time <code>sequencer(String)</code> is called, it will either load the existing definition with the supplied
-					name or will create a new definition if one does not already exist.  To remove a definition, simply call <code>remove()</code>
-					on the result of <code>sequencer(String)</code>.
-					The set of existing definitions can be accessed with the <code>sequencers()</code> method.
-					</para>
-				</note>
-			</sect3>
-			<sect3 id="programmatically_configuring_mime_type_detectors">
-				<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 = ...
-config.mimeTypeDetector("Extension Detector")
-      .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).
-				</para>
-				<note>
-					<para>Each time <code>mimeTypeDetector(String)</code> is called, it will either load the existing definition with the supplied
-					name or will create a new definition if one does not already exist.  To remove a definition, simply call <code>remove()</code>
-					on the result of <code>mimeTypeDetector(String)</code>.  
-					The set of existing definitions can be accessed with the <code>mimeTypeDetectors()</code> method.
-					</para>
-				</note>
-			</sect3>
-		</sect2>
-	</sect1>
-	<sect1 id="using_dna_whats_next">
-		<title>What's next</title>
-		<para>
-			This chapter outline how you configure JBoss DNA, how you then access a <code>javax.jcr.Repository</code> instance,
-			and use the standard JCR API to interact with the repository. The
-			<link linkend="downloading_and_running">next chapter </link> walks you through downloading
-			and running the JBoss DNA examples. 
-		</para>
-	</sect1>
-</chapter>

Added: 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	                        (rev 0)
+++ trunk/docs/reference/src/main/docbook/en-US/content/connectors/in_memory.xml	2009-06-08 14:57:17 UTC (rev 995)
@@ -0,0 +1,37 @@
+<?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="in-memory-connector">
+  <title>In-Memory Connector</title>
+  <para>
+		blah blah 
+  </para>
+</chapter>
+


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

Copied: trunk/docs/reference/src/main/docbook/en-US/content/core/classloaders.xml (from rev 994, trunk/docs/reference/src/main/docbook/en-US/content/classloaders.xml)
===================================================================
--- trunk/docs/reference/src/main/docbook/en-US/content/core/classloaders.xml	                        (rev 0)
+++ trunk/docs/reference/src/main/docbook/en-US/content/core/classloaders.xml	2009-06-08 14:57:17 UTC (rev 995)
@@ -0,0 +1,121 @@
+<?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="classloaders">
+  <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 all of the "interesting" components
+		are extensions that plug into and are used by different parts of the core.  The core doesn't really care what
+		the extensions do or what external libraries they require, as long as the extension fulfills its end of the
+		extension contract.
+	</para>
+	<para>
+		This means that you only need the core modules of JBoss DNA on the application classpath, while the extensions
+		do not have to be on the application classpath.  And because the core modules of JBoss DNA have few dependencies,
+		the risk of JBoss DNA libraries conflicting with the application's are lower.  Extensions, on the other hand,
+		will likely have a lot of unique dependencies. By separating the core of JBoss DNA from the class loaders used
+		to load the extensions, your application is isolated from the extensions and their dependencies.  Of course,
+		you can put all the JARs on the application classpath, too.  (This is what the examples in the &GettingStarted; document do.)
+	</para>
+	<para>
+		This design also allows you to select only those extensions that are interesting and useful for your application.
+		Not every application needs all of the JBoss DNA functionality.
+		Some applications may only need JBoss DNA sequencing, and specifically just a few types of sequencers.
+		Other applications may not need sequencing but do want to use JBoss DNA federation capabilities.
+  </para>
+	<para>
+		Finally, the use of these formal extensions also makes it easier for you to write your own customized extensions.
+		You may have proprietary file formats that you want to sequence.  Or, you may have a non-JCR repository system that you
+		want to access via JCR and maybe even federate with information from other sources.  Since extensions do
+		only one thing (e.g., be a sequencer, or a connector, etc.), its easier to develop those customizations.
+  </para>
+  <sect1 id="dna-classloader-factory">
+    <title>Class loader factory</title>
+		<para>
+			JBoss DNA loads all of the extension classes using class loaders returned by a <emphasis>class loader factory</emphasis>.
+			Each time JBoss DNA wants to load a class, it needs the name of the class and an optional "class loader name".
+			The meaning of the names is dependent upon the implementation of the class loader factory.  For example, the
+			<link linkend="dna-maven-classloader">Maven class loader factory</link> expects the names to be 
+			<ulink url="http://maven.apache.org/pom.html#Maven_Coordinates">Maven coordinates</ulink>.  Either way,
+			the class loader factory implementation uses the name to create and return a &ClassLoader;
+			instance that can be used to load the class.  Of course, if no name is provided, then a JBoss DNA service
+			just uses its class loader to load the class. (This is why putting all the extension jars on the classpath works.)
+		</para>
+		<para>
+			The class loader factory interface is pretty simple:
+		</para>
+		<programlisting>
+public interface &ClassLoaderFactory; {
+    /**
+     * Get a class loader given the supplied classpath.  The meaning of the classpath 
+     * is implementation-dependent.
+     * @param classpath the classpath to use
+     * @return the class loader; may not be null
+     */
+    &ClassLoader; getClassLoader( &String;... classpath );
+}
+</programlisting>
+    <para>In the <link linkend="environment">next chapter</link> we'll describe an &ExecutionContext; interface that is
+ 			supplied to each of the JBoss DNA core services.  This context interface actually extends the &ClassLoaderFactory;
+ 			interface, so setting up an &ExecutionContext; implicitly sets up the class loader factory.</para>
+  </sect1>
+  <sect1 id="dna-standard-classloader">
+    <title>Standard class loader factory</title>
+    <para>JBoss DNA includes and uses as a default a standard class loader factory that just loads the classes using the Thread's current context
+	    class loader (if there is one), or a delegate class loader that defaults to the class loader that loaded
+	    the &StandardClassLoaderFactory; class.  The class ignores any class loader names that are supplied.
+		</para>
+  </sect1>
+  <sect1 id="dna-maven-classloader">
+    <title>Maven Repository class loader factory</title>
+    <para>
+    	The <code>dna-classloader-maven</code> project has a class loader factory implementation that parses the names into
+			<ulink url="http://maven.apache.org/pom.html#Maven_Coordinates">Maven coordinates</ulink>, then uses those coordinates
+			to look up artifacts in a Maven 2 repository.  The artifact's POM file is used to determine the dependencies,
+			which is done transitively to obtain the complete dependency graph.  The resulting class loader has access
+			to these artifacts in dependency order.
+		</para>
+		<para>
+			This class loader is also able to use a JCR repository that contains the equivalent contents of a Maven repository.
+			However, JBoss DNA doesn't currently have any tooling to help populate that repository, so this component may be
+			of limited use right now.
+		</para>
+  </sect1>
+	<sect1>
+		<title>Summary</title>
+		<para>
+			In this chapter, we described the framework used by JBoss DNA to load extension classes, like implementations
+			of repositories, sequencers, MIME type detectors, and other components.
+		  <link linkend="environment">Next</link>, we cover how JBoss security works and how the various components
+		  of JBoss DNA can access this security information as well as information about the environment in which the component is running.
+		</para>
+	</sect1>
+</chapter>


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

Copied: trunk/docs/reference/src/main/docbook/en-US/content/core/configuration.xml (from rev 994, trunk/docs/reference/src/main/docbook/en-US/content/configuration.xml)
===================================================================
--- trunk/docs/reference/src/main/docbook/en-US/content/core/configuration.xml	                        (rev 0)
+++ trunk/docs/reference/src/main/docbook/en-US/content/core/configuration.xml	2009-06-08 14:57:17 UTC (rev 995)
@@ -0,0 +1,371 @@
+<?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="configuration">
+  <title>Configuring and Using JBoss DNA</title>
+	<para>Using JBoss DNA within your application is actually quite straightforward.  As you'll see in this chapter,
+		the first step is setting up JBoss DNA and starting the <code>JcrEngine</code>.  After that, you obtain the
+		<code>javax.jcr.Repository</code> instance for a named repository and just use the standard JCR API throughout your
+		application.
+	</para>
+	<sect1 id="jcr_engine">
+		<title>JBoss DNA's JcrEngine</title>
+		<para>
+			JBoss DNA encapsulates everything necessary to run one or more JCR repositories into a single &JcrEngine; instance.
+			This includes all underlying repository sources, the pools of connections to the sources, the sequencers,
+			the MIME type detector(s), and the &Repository; implementations.
+		</para>
+		<para>
+			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 = ...
+JcrEngine engine = config.build();
+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>
+		<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>
+		<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)
+			present at the time of the <code>shutdown()</code> call will be allowed to finish.  
+			In essence, <code>shutdown()</code> is a <emphasis>graceful</emphasis> request, and since it may take some time to complete,
+			you can wait until the shutdown has completed by simply calling <code>awaitTermination(...)</code> as shown above.
+			This method will block until the engine has indeed shutdown or until the supplied time duration has passed (whichever comes first).
+			And, yes, you can call the <code>awaitTermination(...)</code> method repeatedly if needed.
+		</para>
+	</sect1>
+	<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:
+			<itemizedlist>
+				<listitem>
+					<para><emphasis role="strong"><code>Repository sources</code></emphasis> are the POJO objects that each describe a particular
+					location where content is stored.  Each repository source object is an instance of a JBoss DNA connector, and is configured
+					with the properties that particular source.  JBoss DNA's &RepositorySource; classes are analogous to JDBC's &DataSource; classes -
+					they are implemented by specific connectors (aka, "drivers") for specific kinds of repository sources (aka, "databases").
+					Similarly, a &RepositorySource; instance is analogous to a &DataSource; instance, with bean properties for each configurable
+					parameter.  Therefore, each repository source definition must supply the name of the &RepositorySource; class, any
+					bean properties, and, optionally, the classpath that should be used to load the class. </para>
+				</listitem>
+				<listitem>
+					<para><emphasis role="strong"><code>Repositories</code></emphasis> define the JCR repositories that are available.  Each
+					repository has a unique name that is used to obtain the &Repository; instance from the &JcrEngine;'s <code>getRepository(String)</code>
+					method, but each repository definition also can include the predefined namespaces (other than those automatically defined by
+					JBoss DNA), various options, and the node types that are to be available in the repository without explicit registration
+					through the JCR API.</para>
+				</listitem>
+				<listitem>
+					<para><emphasis role="strong"><code>Sequencers</code></emphasis> define the particular sequencers that are available for use.
+					Each sequencer definition provides the path expressions governing which nodes in the repository should be sequenced when those nodes change,
+					and where the resulting output generated by the sequencer should be placed.  The definition also must state the name of 
+					the sequencer class, any bean properties and, optionally, the classpath that should be used to load the class.</para>
+				</listitem>
+				<listitem>
+					<para><emphasis role="strong"><code>MIME type detectors</code></emphasis> define the particular MIME type detector(s) that should
+					be made available.  A MIME type detector does exactly what the name implies: it attempts to determine the MIME type given a
+					"filename" and contents.  JBoss DNA automatically uses a detector that uses the file extension to identify the MIME type,
+					but also provides an implementation that uses an external library to identify the MIME type based upon the contents.
+					The definition must state the name of the detector class, any bean properties and, optionally, the classpath that should 
+					be used to load the class.</para>
+				</listitem>
+			</itemizedlist>
+		</para>
+		<para>
+			There really are three options:
+			<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>
+				</listitem>
+				<listitem>
+					<para><emphasis role="strong"><code>Load 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>
+				</listitem>
+				<listitem>
+					<para><emphasis role="strong"><code>Programmatic configuration</code></emphasis> is always possible, even if the configuration is loaded
+					from a file or repository.  Using the &JcrConfiguration;'s API, you can define (or update or remove) all of the definitions that make
+					up a configuration.</para>
+				</listitem>
+			</itemizedlist>
+		</para>
+		<para>
+			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>
+			<para>
+				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>
+			<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.  
+			</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 &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
+				this second parameter is very useful.)
+			</para>
+			<para>
+				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"?>
+<configuration xmlns="http://www.jboss.org/dna/1.0" xmlns:jcr="http://www.jcp.org/jcr/1.0">
+	  <!-- 
+	  Define the JCR repositories 
+	  -->
+	  <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">
+	          <options jcr:primaryType="dna:options"/>
+	              <jaasLoginConfigName jcr:primaryType="dna:option" dna:value="dna-jcr"/>
+	          </options>
+	      </dna:repository>
+	  </dna:repositories>
+    <!-- 
+    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">
+            <!-- Define the name of the workspace used by default.  Optional, but convenient. -->
+            <defaultWorkspaceName>workspace2</defaultWorkspaceName>
+        </dna:source>
+    </dna:sources>
+    <!-- 
+    Define the sequencers. This is an optional section. For this example, we're not using any sequencers. 
+    -->
+    <dna:sequencers>
+        <!--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>
+    <dna:mimeTypeDetectors>
+        <dna:mimeTypeDetector jcr:name="Detector" dna:description="Standard extension-based MIME type detector"/>
+    </dna:mimeTypeDetectors>
+</configuration>
+ ]]></programlisting>
+		</sect2>
+		<sect2 id="loading_from_repository">
+			<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>
+				method:
+			</para>
+    	<programlisting role="JAVA"><![CDATA[
+RepositorySource configSource = ...
+JcrConfiguration config = new JcrConfiguration();
+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;.
+				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.)
+			</para>
+		</sect2>
+		<sect2 id="programmatic_configuration">
+			<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
+				dynamic information.
+			</para>
+			<para>
+				The &JcrConfiguration; class was designed to have an easy-to-use API that makes it easy to configure each of the different kinds of
+				components, especially when using an IDE with code completion.  Here are several examples:
+			</para>
+			<sect3 id="programmatically_configuring_sources">
+				<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>
+    		<programlisting role="JAVA"><![CDATA[
+JcrConfiguration config = ...
+config.repositorySource("source A")
+      .usingClass(InMemoryRepositorySource.class)
+      .setDescription("The repository for our content")
+      .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.
+					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>
+				<note>
+					<para>Each time <code>repositorySource(String)</code> is called, it will either load the existing definition with the supplied
+					name or will create a new definition if one does not already exist.  To remove a definition, simply call <code>remove()</code>
+					on the result of <code>repositorySource(String)</code>.
+					The set of existing definitions can be accessed with the <code>repositorySources()</code> method.
+					</para>
+				</note>
+			</sect3>
+			<sect3 id="programmatically_configuring_repositories">
+				<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 = ...
+config.repository("repository A")
+      .addNodeTypes("myCustomNodeTypes.cnd")
+      .setSource("source 1")
+      .registerNamespace("acme","http://www.example.com/acme")
+      .setOption(JcrRepository.Option.JAAS_LOGIN_CONFIG_NAME, "dna-jcr");
+ ]]></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
+					that will be made available when the repository is accessed.  It also defines the "http://www.example.com/acme" namespace,
+					and finally sets the "JAAS_LOGIN_CONFIG_NAME" option to define the name	of the JAAS login configuration that should be used by 
+					the JBoss DNA repository.
+				</para>
+				<note>
+					<para>Each time <code>repository(String)</code> is called, it will either load the existing definition with the supplied
+					name or will create a new definition if one does not already exist.  To remove a definition, simply call <code>remove()</code>
+					on the result of <code>repository(String)</code>.
+					The set of existing definitions can be accessed with the <code>repositories()</code> method.
+					</para>
+				</note>
+			</sect3>
+			<sect3 id="programmatically_configuring_sequencers">
+				<title>Sequencers</title>
+				<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 = ...
+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>
+				<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 
+					"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.)
+					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>
+				<note>
+					<para>Each time <code>sequencer(String)</code> is called, it will either load the existing definition with the supplied
+					name or will create a new definition if one does not already exist.  To remove a definition, simply call <code>remove()</code>
+					on the result of <code>sequencer(String)</code>.
+					The set of existing definitions can be accessed with the <code>sequencers()</code> method.
+					</para>
+				</note>
+			</sect3>
+			<sect3 id="programmatically_configuring_mime_type_detectors">
+				<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 = ...
+config.mimeTypeDetector("Extension Detector")
+      .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).
+				</para>
+				<note>
+					<para>Each time <code>mimeTypeDetector(String)</code> is called, it will either load the existing definition with the supplied
+					name or will create a new definition if one does not already exist.  To remove a definition, simply call <code>remove()</code>
+					on the result of <code>mimeTypeDetector(String)</code>.  
+					The set of existing definitions can be accessed with the <code>mimeTypeDetectors()</code> method.
+					</para>
+				</note>
+			</sect3>
+		</sect2>
+	</sect1>
+	<sect1 id="using_dna_whats_next">
+		<title>What's next</title>
+		<para>
+			This chapter outline how you configure JBoss DNA, how you then access a <code>javax.jcr.Repository</code> instance,
+			and use the standard JCR API to interact with the repository. The
+			<link linkend="downloading_and_running">next chapter </link> walks you through downloading
+			and running the JBoss DNA examples. 
+		</para>
+	</sect1>
+</chapter>


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

Copied: trunk/docs/reference/src/main/docbook/en-US/content/core/environment.xml (from rev 994, trunk/docs/reference/src/main/docbook/en-US/content/environment.xml)
===================================================================
--- trunk/docs/reference/src/main/docbook/en-US/content/core/environment.xml	                        (rev 0)
+++ trunk/docs/reference/src/main/docbook/en-US/content/core/environment.xml	2009-06-08 14:57:17 UTC (rev 995)
@@ -0,0 +1,310 @@
+<?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="environment">
+  <title>Environment</title>
+  <para>
+		The various components of JBoss DNA are designed as plain old Java objects, or POJOs.  And rather than making assumptions
+		about their environment, each component instead requires that any external dependencies necessary for it to operate
+		must be supplied to it.  This pattern is known as Dependency Injection, and it allows the components to be simpler
+		and allows for a great deal of flexibility and customization in how the components are configured.  
+		And, JBoss DNA will soon provide a higher-level component that leverages the 
+		<ulink url="http://www.jboss.org/jbossmc">JBoss Microcontainer</ulink> to automatically assemble and wire together
+		all the lower-level components.
+  </para>
+	<sect1 id="execution-context">
+		<title>Execution contexts</title>
+		<para>
+			One of the objects that must be supplied to many JBoss DNA components is an &ExecutionContext;.  Some components 
+			require this context to be passed into individual methods, allowing the context to vary with each method invocation.
+			Other components require the context to be provided before it's used, and will use that context for all its operations
+			(until it is given a different one).
+		</para>
+		<para>
+			What does an &ExecutionContext; represent?  Quite simply, it's the set of objects that define the environment
+			or context in which the method or component is currently operating.  It includes a way for recording and reporting 
+			errors and problems.  It includes the ability to <link linkend="classloaders">create class loaders</link> 
+			given a classpath of class loader names. It also includes information about the current <link linkend="security">user</link>.
+			It includes access to factories that can be used to create and convert property values. And it includes factories 
+			for working with namespaces and fully-qualified names.  In fact, as JBoss DNA evolves, more things may need to be
+			added.  Here is what the &ExecutionContext; interface looks like:
+		</para>
+	  <programlisting>
+public class &ExecutionContext; implements &ClassLoaderFactory; {
+
+    /**
+     * Get the factories that should be used to create values for {@link Property properties}.
+     * @return the property value factory; never null
+     */
+    public &ValueFactories; getValueFactories() {...}
+
+    /**
+     * Get the namespace registry for this context.
+     * @return the namespace registry; never null
+     */
+    public &NamespaceRegistry; getNamespaceRegistry() {...}
+
+    /**
+     * Get the factory for creating {@link Property} objects.
+     * @return the property factory; never null
+     */
+    public &PropertyFactory; getPropertyFactory() {...}
+
+    /**
+     * Get the security context for this environment.
+     * @return the security context; never <code>null</code>
+     */
+    public &SecurityContext; getSecurityContext() {...}
+
+    /**
+     * Return a logger associated with this context. This logger records only those activities within the 
+     * context and provide a way to capture the context-specific activities. All log messages are also
+     * sent to the system logger, so classes that log via this mechanism should <i>not</i> also 
+     * {@link Logger#getLogger(Class) obtain a system logger}.
+     * @param clazz the class that is doing the logging
+     * @return the logger, named after <code>clazz</code>; never null
+     */
+    public &Logger; getLogger( Class&lt;?> clazz ) {...}
+
+    /**
+    * Return a logger associated with this context. This logger records only those activities within the 
+    * context and provide a way to capture the context-specific activities. All log messages are also
+    * sent to the system logger, so classes that log via this mechanism should <i>not</i> also 
+    * {@link Logger#getLogger(Class) obtain a system logger}.
+     * @param name the name for the logger
+     * @return the logger, named after <code>clazz</code>; never null
+     */
+    public &Logger; getLogger( String name ) {...}
+
+		...
+}
+</programlisting>
+		<para>
+			Notice that &ExecutionContext; implements the &ClassLoaderFactory; interface described in the
+			<link linkend="classloaders">previous chapter</link>, meaning it can be used to create other contexts.  These other methods are not shown,
+			but can be used to create create subcontexts with different <link linkend="security">security contexts</link>,
+	    with different namespace registry, or with different combinations of components.
+		</para>
+	  <para>
+			The fact that so many of the JBoss DNA components take &ExecutionContext; instances gives us some interesting possibilities.  
+			For example, one execution context instance can be used as the highest-level (or "application-level") context for all of the services 
+			(e.g., &RepositoryService;, &SequencingService;, etc.).
+			Then, an execution context could be created for each user that will be performing operations, and that user's context can
+			be passed around to not only provide security information about the user but also to allow the activities being performed
+			to be recorded for user feedback, monitoring and/or auditing purposes.
+		</para>
+		<para>
+			The following code fragment shows how easy it is to create various execution contexts:
+		</para>
+	  <programlisting>
+&ExecutionContext; context1 = new &ExecutionContext;();
+String jaasRealm = ...;
+
+// Create a context for a user, authenticating using a JAAS LoginContext...
+char[] password = "password".toCharArray();
+&SecurityContext; securityContext = new JaasSecurityContext(jaasRealm, "username", password);
+&ExecutionContext; context2 = context1.with(securityContext);
+
+// Create a context for the same user, authenticating using JAAS, and using a different callback handler ...
+&CallbackHandler; callbackHandler = ...
+&ExecutionContext; context3 = context1.with(new JaasSecurityContext(jaasRealm, callbackHandler);
+
+// Create a context that uses a provided &SecurityContext; (see the <link linkend="security">next section</link>)...
+&SecurityContext; mySecurityContext = ...
+&ExecutionContext; context4 = context1.with(mySecurityContext);
+</programlisting>
+		<para>
+			These contexts can then be passed to the various components as needed.
+		</para>
+	</sect1>
+	<sect1 id="security">
+		<title>Security</title>
+	  <para>
+	    JBoss DNA uses a simple abstraction layer to isolate it from the security infrastructure used within an application.
+	   The &SecurityContext; interface is defined as follows:
+		</para>
+	  <programlisting>
+public interface &SecurityContext; {
+
+    /**
+     * Get the name of the authenticated user.
+     * @return the authenticated user's name
+     */
+    &String; getUserName();
+
+    /**
+     * Determine whether the authenticated user has the given role.
+     * @param roleName the name of the role to check
+     * @return true if the user has the role and is logged in; false otherwise
+     */
+    boolean hasRole( String roleName );
+
+    /**
+     * Logs the user out of the authentication mechanism.
+     * For some authentication mechanisms, this will be implemented as a no-op.
+     */
+    void logout();
+}
+</programlisting>
+		<para>
+			As noted below, this security context is made available through the &ExecutionContext; described above.
+		</para>
+		<sect2 id="jaas_security">
+			<title>JAAS</title>
+			<para>
+				One such implementation is the &JaasSecurityContext;, which delegates any authentication or authorization requests to a
+		    <ulink url="http://java.sun.com/javase/technologies/security/">Java Authentication and Authorization Service (JAAS)</ulink>
+		    provider.  This is the standard approach for authenticating and authorizing in Java, and is the default mechanism 
+		    used by the &JcrEngine;.  
+		  </para>
+		  <para>
+				There are quite a few JAAS providers available, but one of the best and most powerful providers is
+		    <ulink url="http://www.jboss.org/jbosssecurity/">JBoss Security</ulink>, the open source
+				security framework used by JBoss.  JBoss Security offers a number of JAAS login modules, including:
+		    <itemizedlist>
+		      <listitem>
+		        <para>
+		          <emphasis role="strong">User-Roles Login Module</emphasis>
+		          is a simple
+		          <code>javax.security.auth.login.LoginContext</code>
+		          implementation that uses usernames and passwords stored in a properties file.
+		        </para>
+		      </listitem>
+		      <listitem>
+		        <para>
+		          <emphasis role="strong">Client Login Module</emphasis>
+		          prompts the user for their username and password.
+		        </para>
+		      </listitem>
+		      <listitem>
+		        <para>
+		          <emphasis role="strong">Database Server Login Module</emphasis>
+		          uses a JDBC database to authenticate principals and associate them with roles.
+		        </para>
+		      </listitem>
+		      <listitem>
+		        <para>
+		          <emphasis role="strong">LDAP Login Module</emphasis>
+		          uses an LDAP directory to authenticate principals. Two implementations are available.
+		        </para>
+		      </listitem>
+		      <listitem>
+		        <para>
+		          <emphasis role="strong">Certificate Login Module</emphasis>
+		          authenticates using X509 certificates, obtaining roles from either property files or a JDBC database.
+		        </para>
+		      </listitem>
+		      <listitem>
+		        <para>
+		          <emphasis role="strong">Operating System Login Module</emphasis>
+		          authenticates using the operating system's mechanism.
+		        </para>
+		      </listitem>
+		    </itemizedlist>
+		    and many others.  Plus, JBoss Security also provides other capabilities, such as using XACML policies or using federated single sign-on. 
+				For more detail, see the <ulink url="http://www.jboss.org/jbosssecurity/">JBoss Security</ulink> project.
+		  </para>
+		</sect2>
+		<sect2 id="web_security">
+			<title>Web application security</title>
+			<para>
+				If JBoss DNA is being used within a web application, then it is probably desirable to reuse the security infrastructure
+				of the application server.  This can be accomplished by implementing the &SecurityContext; interface with an implementation
+				that delegates to the <interface>HttpServletRequest</interface>.  Then, for each request, create a &SecurityContextCredentials;
+				instance around your &SecurityContext;, and use that credentials to obtain a JCR &Session;.
+			</para>
+			<para>
+				Here is an example of the &SecurityContext; implementation that uses the servlet request:
+			</para>
+	  <programlisting>
+ at Immutable
+public class ServletSecurityContext implements &SecurityContext; {
+
+    private final String userName;
+    private final HttpServletRequest request;
+
+    /**
+     * Create a {@link ServletSecurityContext} with the supplied 
+     * {@link HttpServletRequest servlet information}.
+     * 
+     * @param request the servlet request; may not be null
+     */
+    public ServletSecurityContext( HttpServletRequest request ) {
+        this.request = request;
+        this.userName = request.getUserPrincipal() != null ? request.getUserPrincipal().getName() : null;
+    }
+
+    /**
+     * Get the name of the authenticated user.
+     * @return the authenticated user's name
+     */
+    public &String; getUserName() {
+        return userName;
+    }
+
+    /**
+     * Determine whether the authenticated user has the given role.
+     * @param roleName the name of the role to check
+     * @return true if the user has the role and is logged in; false otherwise
+     */
+    boolean hasRole( String roleName ) {
+        request.isUserInRole(roleName);
+    }
+
+    /**
+     * Logs the user out of the authentication mechanism.
+     * For some authentication mechanisms, this will be implemented as a no-op.
+     */
+    public void logout() {
+    }
+}</programlisting>
+			<para>
+				Then use this to create a &Session;:
+			</para>
+	  <programlisting>
+HttpServletRequest request = ...
+&Repository; repository = engine.getRepository("my repository");
+&SecurityContext; securityContext = new ServletSecurityContext(httpServletRequest);
+SecurityContextCredentials credentials = new SecurityContextCredentials(securityContext);
+&Session; session = repository.login(credentials, workspaceName);
+</programlisting>
+		</sect2>
+	</sect1>
+	<sect1>
+		<title>Summary</title>
+		<para>
+			In this chapter, we covered security and environment topics as used throughout JBoss DNA. 
+			The <link linkend="repositories">next chapter</link> will cover JBoss DNA repositories, including the connector framework,
+			how DNA's JCR implementation works with connectors, what connectors are available (and how to use them),
+			and how to write your own connector.
+		</para>
+	</sect1>
+</chapter>
+


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

Copied: trunk/docs/reference/src/main/docbook/en-US/content/core/mimetypes.xml (from rev 994, trunk/docs/reference/src/main/docbook/en-US/content/mimetypes.xml)
===================================================================
--- trunk/docs/reference/src/main/docbook/en-US/content/core/mimetypes.xml	                        (rev 0)
+++ trunk/docs/reference/src/main/docbook/en-US/content/core/mimetypes.xml	2009-06-08 14:57:17 UTC (rev 995)
@@ -0,0 +1,204 @@
+<?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="mimetypes">
+  <title>MIME types</title>
+  <para>
+  	JBoss DNA often needs the ability to determine the MIME type for some binary content.  When uploading content into
+		a repository, we may want to add the MIME type as metadata.  Or, we may want to make some processing decisions
+		based upon the MIME type.  So, JBoss DNA created a small pluggable framework for determining the MIME type by using
+		the name of the file (e.g., extensions) and/or by reading the actual content.  Technically, the framework
+		delegates this to one or more extensions.  And we've provided one extension that does a very good job at 
+		determining the MIME type from a large variety of file types.  But if that isn't sufficient, you can always
+		incorporate your own detector into JBoss DNA.
+  </para>
+	<para>
+		To use this system, you simply invoke a static method and supply the name of the content (e.g., the name of the file, with the extension)
+		and the &InputStream; to the actual binary content:
+	</para>
+	<programlisting>&MimeType;.of(name,content)</programlisting>
+	<para>
+		The result is a &String; containing the <ulink url="http://www.iana.org/assignments/media-types/">MIME type</ulink>
+	  (e.g., "text/plain") or null if the MIME type cannot be determined.  Note that the name or &InputStream; may be
+		null, making this a very versatile utility.
+	</para>
+  <sect1 id="detectors">
+    <title>JBoss DNA MIME type detectors</title>
+    <para>
+    	The principle component in this framework is the concept of a <emphasis role="strong">detector</emphasis>.
+			A detector attempts to determine the MIME type using the name of the content (e.g., the file name)
+			and the actual content itself.  If the detector is able to determine the MIME type, it simply returns
+			it as a string.  If not, it merely returns null.  Note, however, that a detector must be thread-safe.
+    </para>
+		<para>
+			Here is the interface:
+		</para>
+		<programlisting>
+package org.jboss.dna.graph.mimetype;
+ at ThreadSafe
+public interface &MimeTypeDetector; {
+
+    /**
+     * Returns the MIME-type of a data source, using its supplied content and/or
+     * its supplied name, depending upon the implementation. If the MIME-type 
+     * cannot be determined, either a "default" MIME-type or <code>null</code> may 
+     * be returned, where the former will prevent earlier registered MIME-type 
+     * detectors from being consulted.
+     * 
+     * @param name The name of the data source; may be <code>null</code>.
+     * @param content The content of the data source; may be <code>null</code>.
+     * @return The MIME-type of the data source, or optionally <code>null</code> 
+     * if the MIME-type could not be determined.
+     * @throws &IOException; If an error occurs reading the supplied content.
+     */
+    &String; mimeTypeOf( &String; name,
+                       &InputStream; content ) throws &IOException;;
+}</programlisting>
+		<para>
+			Detectors can be added to the &MimeType; class using the <code>addDetector(&MimeTypeDetectorConfig; config)</code>
+			method, where the &MimeTypeDetectorConfig; defines the name of the detector class, the name of the
+			<link linkend="classloaders">class loader</link>, a name, and a description.  It is also possible
+			to set the &ClassLoaderFactory; that the &MimeType; singleton will use.
+		</para>
+		<para>
+			We'll next look at the MIME type detectors that are provided out by JBoss DNA out of the box, and how to write your own. 
+		</para>
+    <sect2 id="dna-mimetype-detector-aperture">
+      <title>Aperture MIME type detector</title>
+      <para>
+      	The &ApertureMimeTypeDetector; class is an implementation of &MimeTypeDetector; that uses the
+				<ulink url="http://aperture.sourceforge.net/">Aperture</ulink> open-source library, which
+				is a very capable utility for determining the MIME type for a wide range of file types,
+				using both the file name and the actual content.
+      </para>
+    </sect2>
+  </sect1>
+  <sect1 id="custom-detectors">
+    <title>Writing custom detectors</title>
+	  <para>
+	  Creating a custom detector involves the following steps:
+	  <itemizedlist>
+	    <listitem>
+	      <para>Create a Maven 2 project for your detector;</para>
+	    </listitem>
+	    <listitem>
+	      <para>Implement the &MimeTypeDetector; interface with your own implementation, and create unit tests to verify
+	      the functionality and expected behavior;</para>
+	    </listitem>
+	    <listitem>
+	      <para>Add a &MimeTypeDetectorConfig; to the &MimeType; class in your application
+	      as described <link linkend="detectors">earlier</link>; and</para>
+	    </listitem>
+	    <listitem>
+	      <para>Deploy the JAR file with your implementation (as well as any dependencies), and make them available to JBoss DNA
+	      in your application.</para>
+	    </listitem>
+	  </itemizedlist>
+	  It's that simple.
+	  </para>
+	  <sect2 id="custom_detector_project">
+	    <title>Creating the Maven 2 project</title>
+	    <para>The first step is to create the Maven 2 project that you can use to compile your code and build the JARs.
+	    Maven 2 automates a lot of the work, and since you're already <link linkend="maven">set up to use Maven</link>,
+	    using Maven for your project will save you a lot of time and effort.  Of course, you don't have to use Maven 2, but then you'll
+	    have to get the required libraries and manage the compiling and building process yourself.</para>
+	    <note>
+	      <para>JBoss DNA may provide in the future a Maven archetype for creating detector projects.  If you'd find this useful
+	        and would like to help create it, please <link linkend="preface">join the community</link>.</para>
+	    </note>
+			<note>
+		    <para>
+					The <emphasis role="strong">dna-mimetype-detector-aperture</emphasis> project is a small, self-contained detector implementation that
+			    that you can use to help you get going.  Starting with this project's source and modifying it to suit your needs
+			 		may be the easiest way to get started.
+			    See the subversion repository: 
+					<ulink url="&Subversion;trunk/extensions/dna-mimetype-detector-aperture/">&Subversion;trunk/sequencers/dna-mimetype-detector-aperture/</ulink>
+			  </para>
+			</note>
+	    <para>You can create your Maven project any way you'd like.  For examples, see the <ulink url="http://maven.apache.org/guides/getting-started/index.html#How_do_I_make_my_first_Maven_project">Maven 2 documentation</ulink>.  
+	    Once you've done that, just add the dependencies in your project's <code>pom.xml</code> dependencies section:</para>
+	  	<programlisting role="XML"><![CDATA[<dependency>
+  <groupId>org.jboss.dna</groupId>
+  <artifactId>dna-common</artifactId>
+  <version>0.1</version>
+</dependency>
+<dependency>
+  <groupId>org.jboss.dna</groupId>
+  <artifactId>dna-graph</artifactId>
+  <version>0.1</version>
+</dependency>
+<dependency>
+  <groupId>org.slf4j</groupId>
+  <artifactId>slf4j-api</artifactId>
+</dependency>
+]]></programlisting>
+			<para>These are minimum dependencies required for compiling a detector.  Of course, you'll have to add
+	  		other dependencies that your sequencer needs.</para>
+	  	<para>As for testing, you probably will want to add more dependencies, such as those listed here:</para>
+			<programlisting role="XML"><![CDATA[<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>
+<!-- Logging with Log4J -->
+<dependency>
+  <groupId>org.slf4j</groupId>
+  <artifactId>slf4j-log4j12</artifactId>
+  <version>1.4.3</version>
+  <scope>test</scope>
+</dependency>
+<dependency>
+  <groupId>log4j</groupId>
+  <artifactId>log4j</artifactId>
+  <version>1.2.14</version>
+  <scope>test</scope>
+</dependency>
+]]></programlisting>
+			<para>
+				After you've created the project, simply implement the &MimeTypeDetector; interface.  And testing should be
+				quite straightforward, MIME type detectors don't require any other components.  In your tests,
+				simply instantiate your &MimeTypeDetector; implementation, supply various combinations of names and/or &InputStream;s,
+				and verify the output is what you expect.
+	  	</para>
+			<para>
+				To use in your application, create a &MimeTypeDetectorConfig; object with the name, description, and class information
+				for your detector, and add to the &MimeType; class using the <code>addDetector(&MimeTypeDetectorConfig; config)</code> method.
+				Then, just use the &MimeType; class.
+			</para>
+		</sect2>
+  </sect1>
+</chapter>


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

Copied: trunk/docs/reference/src/main/docbook/en-US/content/core/repositories.xml (from rev 994, trunk/docs/reference/src/main/docbook/en-US/content/repositories.xml)
===================================================================
--- trunk/docs/reference/src/main/docbook/en-US/content/core/repositories.xml	                        (rev 0)
+++ trunk/docs/reference/src/main/docbook/en-US/content/core/repositories.xml	2009-06-08 14:57:17 UTC (rev 995)
@@ -0,0 +1,1468 @@
+<?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="repositories">
+  <title>Repositories</title>
+  <para></para>
+  <para>There is a lot of information stored in many of different places: databases, repositories, SCM systems,
+    registries, file systems, services, etc. The purpose of the federation engine is to allow applications to use the JCR API
+    to access that information as if it were all stored in a single JCR repository, but to really leave the information where
+    it is.</para>
+  <para>Why not just copy or move the information into a JCR repository?  Moving it is probably pretty difficult, since most 
+		likely there are existing applications that rely upon that information being where it is.  All of those applications
+		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.
+		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
+    those changes down to the original source, making those changes visible to all the other applications.
+	</para>
+	<para>
+		In short, all clients see the correct information, even when it changes in the underlying systems. But the JCR clients can get to all of the information
+		in one spot, using one powerful standard API.
+	</para>
+  <sect1 id="connectors">
+    <title>Repository connectors</title>
+		<para>
+			With JBoss DNA, your applications use the <ulink url="&JSR170;">JCR API</ulink> to work with the repository,
+			but the DNA repository transparently fetches the information from different kinds of repositories and storage systems,
+			not just a single purpose-built store.  This is fundamentally what makes JBoss DNA different.
+		</para>
+		<para>How does JBoss DNA do this?  At the heart of JBoss DNA and it's JCR implementation is a simple graph-based 
+			<emphasis>repository connector</emphasis> system.  Essentially, JBoss DNA's JCR implementation uses a single 
+			repository connector to access all content:
+			<figure id="dnajcr-and-connector">
+				<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 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>
+			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
+			<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">
+				<title>Future JBoss DNA connectors</title>
+				<graphic align="center" scale="100" fileref="dna-connectors-future.png"/>
+			</figure>
+		</para>
+		<para>
+		</para>
+		<para>
+	  	It's even possible to put a different API layer on top of the connectors.  For example, the new <ulink url="&JSR203;">New I/O (JSR-203)</ulink>
+			API offers the opportunity to build new file system providers.  This would be very straightforward to put on top of a JCR implementation,
+			but it could be made even simpler by putting it on top of a DNA connector.  In both cases, it'd be a trivial mapping from nodes that represent
+			files and folders into JSR-203 files and directories, and events on those nodes could easily be translated into JSR-203 watch events.
+			Then, simply choose a DNA connector and configure it to use the source you want to use.
+			<figure id="dna-connectors-vfs">
+				<title>Virtual File System with JBoss DNA</title>
+				<graphic align="center" scale="100" fileref="vfs-and-connector.png"/>
+			</figure>
+		</para>
+    <para>Before we go further, let's define some terminology regarding connectors.</para>
+ 		<itemizedlist>
+			<listitem>
+				<para>
+					A <emphasis role="strong">connector</emphasis> is the runnable code packaged in one or more JAR files that
+					contains implementations of several interfaces (described below).  A Java developer <emphasis>writes</emphasis>
+					a connector to a type of source, such as a particular database management system, LDAP directory, source code
+					management system, etc.  It is then packaged into one or more JAR files (including dependent JARs) and deployed
+					for use in applications that use JBoss DNA repositories.
+				</para>
+			</listitem>
+			<listitem>
+				<para>
+					The description of a particular source system (e.g., the "Customer" database, or the company LDAP system) 
+					is called a <emphasis role="strong">repository source</emphasis>.  JBoss DNA defines a &RepositorySource; interface
+					that defines methods describing the behavior and supported features and a method for establishing connections.
+					A connector will have a class that implements this interface and that has JavaBean properties for
+					all of the connector-specific properties required to fully describe an instance of the system.  Use of JavaBean
+					properties is not required, but it is highly recommended, as it enables reflective configuration and administration.
+					Applications that use JBoss DNA create an instance of the connector's &RepositorySource; implementation and set 
+					the properties for the external source that the application wants to access with that connector.
+				</para>
+			</listitem>
+			<listitem>
+				<para>
+					A repository source instance is then used to establish <emphasis role="strong">connections</emphasis> to
+					that source.  A connector provides an implementation of the &RepositoryConnection; interface, which
+					defines methods for interacting with the external system.  In particular, the <code>execute(...)</code> method
+					takes an &ExecutionContext; instance and a &Request; object.  The &ExectuionContext; object defines the
+					environment in which the processing is occurring, including information about the JAAS &Subject; and &LoginContext;.
+					The &Request; object describes the requested operations on the content, with different concrete subclasses
+					representing each type of activity.  Examples of commands include (but not limited to) getting a node, moving a node, creating a node, 
+					changing a node, and deleting a node.  And, if the repository source is able to participate in JTA/JTS distributed transactions, then the
+					&RepositoryConnection; must implement the <code>getXaResource()</code> method by returning 
+					a valid <code>javax.transaction.xa.XAResource</code> object that can be used by the transaction monitor.
+				</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
+			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;,
+			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.)
+		</para>
+		<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,
+			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
+			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.
+		</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> 
+			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>
+		<para>
+			So, we've so far learned what a repository connector is and how they're used to establish connections to the underlying sources 
+			and access the content in those sources.  In the <link linkend="repository-service">next section</link>, we'll show how these 
+			source instances can be configured, managed, and their connections pooled.  After that, we'll look review JBoss DNA's 
+			<link linkend="connector-library">existing connectors</link> and show how to <link linkend="custom-connectors">create your own connectors</link>.
+		</para>
+  </sect1>
+  <sect1 id="repository-workspaces">
+    <title>Workspaces</title>
+		<para>The previous section talked about how connector expose their information through the graph language of JBoss DNA.
+			This is true, except that we didn't dive into too much of the detail.  JBoss DNA graphs have the notion of <emphasis>workspaces</emphasis>
+			in which the content appears, and its very easy for clients using the graph to switch between workspaces.  In fact,
+			workspaces differ from each other in that they provide different views of the same information.
+		</para>
+		<para>Consider a source control system, like SVN or CVS.  These systems provide different views of the source code:
+			a mainline development branch as well as other branches (or tags) commonly used for releases.  So, just like one source
+			file might appear in the mainline branch as well as the previous two release branches, a node in a repository source
+			might appear in multiple workspaces.
+		</para>
+		<para>
+			However, each connector can kind of decide how (or whether) it uses workspaces.  For example, there may be no overlap
+			in the content between workspaces.  Or a connector might only expose a single workspace (in other words, there's only one
+			"default" workspace).
+		</para>
+  </sect1>
+  <sect1 id="repository-service">
+    <title>Repository Service</title>
+		<para>The JBoss DNA &RepositoryService; is the component that manages the <emphasis>repository sources</emphasis>
+		  and the connections to them.  &RepositorySource; instances can be programmatically added to the service, but
+			the service can actually read its configuration from a configuration repository (which, by the way, is represented by a
+			just another &RepositorySource; instance that's usually added programmatically to the service).  The service connects to
+			the configuration repository, reads the content in a particular area, and automatically sets up the &RepositorySource; instances
+		  per the information found in the configuration repository.  
+		</para>
+		<para>
+			The &RepositoryService; also transparently maintains for each source a pool of reusable connections.  The pooling properties
+			can be controlled via the configuration repository, or adjusted programmatically.
+		</para>
+    <para>
+			Using a repository, then, involves simply asking the &RepositoryService; for a &RepositoryConnection;
+			to the repository given the repository's name.  If a source exists with that name, the service checks out a connection from
+			the source's pool.  The resulting connection is actually a wrapper around the underlying pooled connection, so the
+			component that requested the connection can simply close it, and under the covers the actual connection is simply returned
+			to the pool.
+    </para>
+		<para>To instantiate the &RepositoryService;, we need to first have a few other objects:
+			<itemizedlist>
+				<listitem>
+					<para>
+						A &ExecutionContext; instance, as discussed <link linkend="execution-context">earlier</link>.
+					</para>
+				</listitem>
+				<listitem>
+					<para>
+						A &RepositoryLibrary; instance that manages the list of &RepositorySource; instances,
+						properly injects the execution contexts into each repository source, and provides a configurable pool of connections
+						for each source.
+					</para>
+				</listitem>
+				<listitem>
+					<para>
+						A <emphasis>configuration repository</emphasis> that contains descriptions of all of the repository sources
+					  as well as any information those sources need.  Because this is a regular repository, this could be a simple 
+					  repository with content loaded from an XML file, or it could be a shared
+					  central repository with information about all of the JBoss DNA repositories used across your organization.
+					</para>
+				</listitem>
+			</itemizedlist>
+			With these components in place, we can then instantiate the &RepositoryService; and start it (using its
+			&ServiceAdministrator;).  During startup, the service reads the configuration repository and loads any
+			defined &RepositorySource; instances into the repository library, using the class loader factory 
+			(available in the &ExecutionContext;) to obtain.
+    </para>
+		<para>
+			Here's sample code that shows how to set up and start the repository service.  You can see something similar
+			in the example application in the <code>startRepositories()</code> method of the 
+			<code>org.jboss.example.dna.repository.RepositoryClient</code> class.
+		</para>
+    <programlisting>
+ // Create the top-level execution context with all standard components ...
+ &ExecutionContext; context = new ExecutionContext();
+
+ // Create the library for the RepositorySource instances ...
+ &RepositoryLibrary; sources = new &RepositoryLibrary;(context);
+
+ // Load into the source manager the repository source for the configuration repository ...
+ &InMemoryRepositorySource; configSource = new &InMemoryRepositorySource;();
+ configSource.setName("Configuration");
+ sources.addSource(configSource);
+
+ // Now instantiate the Repository Service ...
+ &RepositoryService; service = new &RepositoryService;(sources, configSource.getName(), context);
+ service.getAdministrator().start();
+ </programlisting>
+
+		<para>After startup completes, the repositories are ready to be used.  The client application obtains the list of repositories
+			and presents them to the user.  When the user selects one, the client application starts navigating that repository
+			starting at its root node (e.g., the "/" path).  As you type a command to list the contents of the current node or to
+			"change directories" to a different node, the client application obtains the information for the node using a simple
+			procedure:
+			<orderedlist>
+				<listitem>
+					<para>Get a connection to the repository.</para>
+				</listitem>
+				<listitem>
+					<para>Using the connection, find the current node and read its properties and children, putting the information
+						into a simple Java plain old Java object (POJO).</para>
+				</listitem>
+				<listitem>
+					<para>Close the connection to the repository (in a finally block to ensure it always happens).</para>
+				</listitem>
+			</orderedlist>
+		</para>
+  </sect1>
+  <sect1 id="connector-library">
+    <title>Out-of-the-box repository connectors</title>
+    <para>
+    	A number of repository connectors are already available in JBoss DNA, and are outlined in the following sections.
+			Note that we do want to build <ulink url="https://jira.jboss.org/jira/secure/IssueNavigator.jspa?reset=true&amp;mode=hide&amp;pid=12310520&amp;sorter/order=DESC&amp;sorter/field=priority&amp;resolution=-1&amp;component=12311441">more connectors</ulink>
+			in the upcoming releases.
+    </para>
+    <sect2 id="dna-connector-inmemory">
+      <title>In-memory connector</title>
+      <para>
+      	The in-memory repository connector is a simple connector that creates a transient, in-memory repository.
+				This repository is used as a very simple in-memory cache or as a standalone transient repository.
+      </para>
+			<para>
+				The &InMemoryRepositorySource; class provides a number of JavaBean properties that control its behavior:
+			</para>
+			<table frame='all'>
+				<title>&InMemoryRepositorySource; 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>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>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>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>
+						</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>
+						</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>
+    </sect2>
+    <sect2 id="dna-connector-jbosscache">
+      <title>JBoss Cache connector</title>
+      <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="dna-connector-federation">federated</link>
+				repository.
+      </para>
+			<para>
+				The &JBossCacheSource; class provides a number of JavaBean properties that control its behavior:
+			</para>
+			<table frame='all'>
+				<title>&JBossCacheSource; 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>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>cacheFactoryJndiName</entry>
+							<entry>Optional property that, if used, specifies the name in JNDI where an existing JBoss Cache Factory instance can be found.
+								That factory would then be used if needed to create a JBoss Cache instance.  If no value is provided, then the
+								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
+								a special way.</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>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>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>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 defines the names of the workspaces that exist and that are available for use without having to create them.</entry>
+						</row>
+						<row>
+							<entry>creatingWorkspacesAllowed</entry>
+							<entry>Optional property that is by default 'true' that defines whether clients can create new workspaces.</entry>
+						</row>
+					</tbody>
+				</tgroup>
+			</table>
+    </sect2>
+    <sect2 id="dna-connector-federation">
+      <title>Federating connector</title>
+      <para>
+      	The federated repository source provides a unified repository consisting of information that is dynamically federated from multiple other
+				&RepositorySource; instances.  This is a very powerful repository source that appears to be a single repository, when in 
+				fact the content is stored and managed in multiple other systems.  Each &FederatedRepositorySource; is typically configured
+				with the name of another &RepositorySource; that should be used as the local, unified cache of the federated content.
+				The configuration also contains the names of the other &RepositorySource; instances that are to be federated along with
+				the &Projection; definition describing where in the unified repository the content is to appear.
+      </para>
+			<figure id="dna-connector-federation-image">
+				<title>Federating multiple sources using the Federated Repository Connector</title>
+				<graphic align="center" scale="100" fileref="dna-connector-federation.png"/>
+			</figure>
+      <para> The federation connector works by effectively building up a single graph by querying each source and merging or
+        unifying the responses. This information is cached, which improves performance, reduces the number of (potentially
+        expensive) remote calls, reduces the load on the sources, and helps mitigate problems with source availability. As
+        clients interact with the repository, this cache is consulted first. When the requested portion of the graph (or
+        "subgraph") is contained completely in the cache, it is retuned immediately. However, if any part of the requested
+        subgraph is not in the cache, each source is consulted for their contributions to that subgraph, and any results are
+        cached.</para>
+      <para> This basic flow makes it possible for the federated repository to build up a local cache of the integrated graph
+        (or at least the portions that are used by clients). In fact, the federated repository caches information in a manner
+        that is similar to that of the Domain Name System (DNS). As sources are consulted for their contributions, the source
+        also specifies whether it is the authoritative source for this information (some sources that are themselves federated
+        may not be the information's authority), whether the information may be modified, the time-to-live (TTL) value (the time
+        after which the cached information should be refreshed), and the expiration time (the time after which the cached
+        information is no longer valid). In effect, the source has complete control over how the information it contributes is
+        cached and used.</para>
+      <para>
+        The federated repository also needs to incorporate <emphasis>negative caching</emphasis>, which is storage of the knowledge 
+				that something does <emphasis>not</emphasis> exist. Sources can be configured to contribute information
+        only below certain paths (e.g., <code>/A/B/C</code>), and the federation engine can take advantage of this by never 
+				consulting that source for contributions to information on other paths. However, below that path, any negative responses 
+				must also be cached (with appropriate TTL and expiry parameters) to prevent the exclusion of that source (in case the source 
+				has information to contribute at a later time) or the frequent checking with the source.
+      </para>
+			<para>
+				The federated repository uses other &RepositorySource;s that are to be federated and a &RepositorySource; that is to be used as the
+				cache of the unified contents.  These are configured in another &RepositorySource; that is treated as a configuration repository.
+				The &FederatedRepositorySource; class uses JavaBean properties to define the name of the configuration repository and 
+				the path to the "<code>dna:federation</code>" node in that configuration repository containing the information about the 
+				cache and federated sources.  This graph structure that is expected at this location is as follows:
+			</para>
+			<programlisting><![CDATA[<!-- Define the federation configuration. -->
+<dna:federatedRepository xmlns:dna="http://www.jboss.org/dna" 
+	                   xmlns:jcr="http://www.jcp.org/jcr/1.0"
+                     dna:timeToCache="100000" >
+  <dna:workspaces>
+    <dna:workspace jcr:name="default">
+	    <!-- Define how the content in the 'Cache' source is to map to the federated cache -->
+      <dna:cache dna:sourceName="Cache" dna:workspaceName="default" dna:projectionRules="/a => /" />
+
+      <!-- Define how the content in the two sources maps to the federated/unified repository.
+           This example puts the 'Cars' and 'Aircraft' content underneath '/vehicles', but the
+           'Configuration' content (which is defined by this file) will appear under '/'. -->
+      <dna:projections>
+        <dna:projection jcr:name="Cars" dna:projectionRules="/Vehicles => /" />
+        <dna:projection jcr:name="Aircraft" dna:projectionRules="/Vehicles => /" />
+        <dna:projection jcr:name="Configuration" dna:projectionRules="/ => /" />
+      </dna:projections>
+    </dna:workspace>
+	</dna:workspaces>
+</dna:federatedRepository>
+]]></programlisting>
+			<note>
+				<para>
+					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
+					works.
+				</para>
+			</note>
+			<para>
+				Notice that there is a cache projection and three source projections, and each projection defines
+				one or more <emphasis>projection rules</emphasis> that are of the form:
+			</para>
+			<programlisting>pathInFederatedRepository =&gt; pathInSourceRepository</programlisting>
+			<para>
+				So, a projection rule <code>/Vehicles =&gt; /</code> projects the entire contents of the source so that
+				it appears in the federated repository under the "<code>/Vehicles</code>" node.
+			</para>
+			<para>
+				The &FederatedRepositorySource; class provides a number of JavaBean properties that control its behavior:
+			</para>
+			<table frame='all'>
+				<title>&FederatedRepositorySource; 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>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>repositoryName</entry>
+							<entry>The name for the federated repository.</entry>
+						</row>
+						<row>
+							<entry>configurationSourceName</entry>
+							<entry>The name of the &RepositorySource; that should be used as the configuration repository, and in which is defined
+								how this federated repository is to be set up and configured.
+								This name is supplied to the &RepositoryConnectionFactory; that is provided to this instance when added to the
+								&RepositoryLibrary;.</entry>
+						</row>
+						<row>
+							<entry>configurationWorkspaceName</entry>
+							<entry>The name of the workspace in the configuration &RepositorySource; with the content defining
+								how this federated repository is to be set up and configured.</entry>
+						</row>
+						<row>
+							<entry>configurationSourcePath</entry>
+							<entry>The path to the node in the configuration repository below which a "dna:federation" node exists with the 
+								graph structure describing how this federated repository is to be configured.</entry>
+						</row>
+						<row>
+							<entry>securityDomain</entry>
+							<entry>Optional property that, if used, specifies the name of the JAAS application context that should be used
+								to establish the <link linkend="execution-contenxt">execution context</link> for this repository.
+								This should correspond to the JAAS login configuration located within the JAAS login configuration file, 
+								and should be used only if a "<code>username</code>" property is defined.</entry>
+						</row>
+						<row>
+							<entry>username</entry>
+							<entry>Optional property that, if used, defines the name of the JAAS subject that should be used
+								to establish the <link linkend="execution-contenxt">execution context</link> for this repository.
+								This should be used if a "<code>securityDomain</code>" property is defined.</entry>
+						</row>
+						<row>
+							<entry>password</entry>
+							<entry>Optional property that, if used, defines the password of the JAAS subject that should be used
+								to establish the <link linkend="execution-contenxt">execution context</link> for this repository.
+								If the password is not provided but values for the "<code>securityDomain</code>" and "<code>username</code>" properties are,
+								then authentication will use the default JAAS callback handlers.</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>
+						</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>
+					</tbody>
+				</tgroup>
+			</table>
+    </sect2>
+  </sect1>
+  <sect1 id="custom-connectors">
+    <title>Writing custom connectors</title>
+    <para>
+		  There may come a time when you want to tackle creating your own repository connector.  Maybe the connectors we provide out-of-the-box
+			don't work with your source.  Maybe you want to use a different cache system.  
+			Maybe you have a system that you want to make available through a JBoss DNA repository.  Or, maybe you're
+			a contributor and want to help us round out our library with a new connector.  No matter what the reason, creating a new connector
+			is pretty straightforward, as we'll see in this section.
+    </para>
+	  <para>
+		  Creating a custom connector involves the following steps:
+		  <orderedlist>
+		    <listitem>
+		      <para>Create a Maven 2 project for your connector;</para>
+		    </listitem>
+		    <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 
+						<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.
+					</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
+						in different environments, and try to make the failure messages clear when the tests can't connect to the underlying source.)
+					</para>
+		    </listitem>
+		    <listitem>
+		      <para>
+						Configure JBoss DNA to use your connector.  This may involve just registering the source with the &RepositoryService;,
+			   		or it may involve adding a source to a configuration repository used by the <link linkend="dna-connector-federation">federated repository</link>.
+					</para>
+		    </listitem>
+		    <listitem>
+		      <para>
+						Deploy the JAR file with your connector (as well as any dependencies), and make them available to JBoss DNA
+		      	in your application.
+					</para>
+		    </listitem>
+		  </orderedlist>
+		  Let's go through each one of these steps in more detail.
+	  </para>
+	  <sect2 id="custom_connector_project">
+	    <title>Creating the Maven 2 project</title>
+	    <para>
+				The first step is to create the Maven 2 project that you can use to compile your code and build the JARs.
+	    	Maven 2 automates a lot of the work, and since you're already <link linkend="maven">set up to use Maven</link>,
+	    	using Maven for your project will save you a lot of time and effort.  Of course, you don't have to use Maven 2, but then you'll
+	    	have to get the required libraries and manage the compiling and building process yourself.</para>
+	    <note>
+	      <para>JBoss DNA may provide in the future a Maven archetype for creating connector projects.  If you'd find this useful
+	        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.
+		    	See the subversion repository: <ulink url="&Subversion;trunk/extensions/dna-connector-filesystem/">&Subversion;trunk/extensions/dna-connector-filesystem/</ulink>
+		    </para>
+		  </note>
+	    <para>
+				You can create your Maven project any way you'd like.  For examples, see the 
+				<ulink url="http://maven.apache.org/guides/getting-started/index.html#How_do_I_make_my_first_Maven_project">Maven 2 documentation</ulink>.  
+	    	Once you've done that, just add the dependencies in your project's <code>pom.xml</code> dependencies section:
+			</para>
+	  	<programlisting role="XML"><![CDATA[
+<dependency>
+  <groupId>org.jboss.dna</groupId>
+  <artifactId>dna-graph</artifactId>
+  <version>0.4</version>
+</dependency>
+	 ]]></programlisting>
+			<para>
+				This is the only dependency required for compiling a connector - Maven pulls in all of the dependencies needed by 
+				the 'dna-graph' artifact.  Of course, you'll still have to add dependencies for any library your connector needs
+				to talk to its underlying system.
+			</para>
+	  	<para>
+				As for testing, you probably will want to add more dependencies, such as those listed here:
+			</para>
+			<programlisting role="XML"><![CDATA[
+<dependency>
+  <groupId>org.jboss.dna</groupId>
+  <artifactId>dna-graph</artifactId>
+  <version>0.4</version>
+  <type>test-jar</type>
+  <scope>test</scope>
+</dependency>
+<dependency>
+  <groupId>org.jboss.dna</groupId>
+  <artifactId>dna-common</artifactId>
+  <version>0.4</version>
+  <type>test-jar</type>
+  <scope>test</scope>
+</dependency>
+<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>
+<!-- Logging with Log4J -->
+<dependency>
+  <groupId>org.slf4j</groupId>
+  <artifactId>slf4j-log4j12</artifactId>
+  <version>1.4.3</version>
+  <scope>test</scope>
+</dependency>
+<dependency>
+  <groupId>log4j</groupId>
+  <artifactId>log4j</artifactId>
+  <version>1.2.14</version>
+  <scope>test</scope>
+</dependency>
+	 ]]></programlisting>
+	  	<para>
+				Testing JBoss DNA connectors does not require a JCR repository or the JBoss DNA services.  (For more detail,
+	  		see the <link linkend="testing_custom_connectors">testing section</link>.) However, if you want to do
+	  		integration testing with a JCR repository and the JBoss DNA services, you'll need additional dependencies
+				(e.g., <code>dna-repository</code> and any other extensions).
+			</para>
+	    <para>
+				At this point, your project should be set up correctly, and you're ready to move on to 
+	  		<link linkend="implementing_repository_source">writing the Java implementation</link> for your connector.
+			</para>
+	  </sect2>
+	  <sect2 id="implementing_repository_source">
+	    <title>Implementing a <code>RepositorySource</code></title>
+	    <para>
+				As mentioned earlier, a <emphasis>connector</emphasis> consists of the Java code that is used to access content
+				from a system.  Perhaps the most important class that makes up a connector is the implementation of the
+				&RepositorySource;.  This class is analogous to JDBC's DataSource in that it is instantiated to represent
+				a single instance of a system that will be accessed, and it contains enough information (in the form of JavaBean properties)
+				so that it can create connections to the source.
+			</para>
+			<para>
+				Why is the &RepositorySource; implementation a JavaBean?  Well, this is the class that is instantiated, usually
+				reflectively, and so a no-arg constructor is required.  Using JavaBean properties makes it possible
+				to reflect upon the object's class to determine the properties that can be set (using setters) and read
+				(using getters).  This means that an administrative application can instantiate, configure, and manage
+				the objects that represent the actual sources, without having to know anything about the actual implementation.
+			</para>
+			<para>
+				So, your connector will need a public class that implements &RepositorySource; and provides JavaBean properties
+				for any kind of inputs or options required to establish a connection to and interact with the underlying source.
+				Most of the semantics of the class are defined by the &RepositorySource; and inherited interface.
+				However, there are a few characteristics that are worth mentioning here.
+			</para>
+			<sect3 id="connector_cache_policy">
+				<title>Cache policy</title>
+				<para>
+					Each connector is responsible for determining whether and how long DNA is to cache the
+					content made available by the connector.  This is referred to as the <emphasis>caching policy</emphasis>,
+					and consists of a <emphasis>time to live</emphasis> value representing the number of milliseconds that
+					a piece of data may be cached.  After the TTL has passed, the information is no longer used.
+				</para>
+				<para>
+					DNA allows a connector to use a flexible and powerful caching policy.  First, each connection returns the
+					<emphasis>default</emphasis> caching policy for all information returned by that connection.
+					Often this policy can be configured via properties on the &RepositorySource; implementation.
+					This is optional, meaning the connector can return <code>null</code> if it does not wish to
+					have a default caching policy.
+				</para>
+				<para>
+					Second, the connector is able to override its default caching policy on individual requests
+					(which we'll cover in the <link linkend="implementing_repository_connection">next section</link>).
+					Again, this is optional, meaning that a null caching policy on a request implies that the
+					request has no overridden caching policy.
+				</para>
+				<para>
+					Third, if the connector has no default caching policy and none is set on the individual requests,
+					DNA uses whatever caching policy is set up for that component using the connector.  For example, the federating
+					connector allows a default caching policy to be specified, and this policy is used should the sources
+					being federated not define their own caching policy.
+				</para>
+				<para>
+					In summary, a connector has total control over whether and for how long the information it provides
+					is cached.
+				</para>
+			</sect3>
+			<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.
+					One example of this is the JBoss Cache connector: while the connector can
+					instantiate a new JBoss Cache instance, more interesting use cases involve JBoss Cache instances that are
+					set up for clustering and replication, something that is generally difficult to configure in a single JavaBean.
+					Therefore the &JBossCacheSource; has optional JavaBean properties that define how it is to look up a
+					JBoss Cache instance in JNDI.  
+				</para>
+				<para>
+					This is a simple pattern that you may find useful in your connector.  Basically, if your source implementation
+					can look up an object in JNDI, simply use a single JavaBean String property that defines the 
+					full name that should be used to locate that object in JNDI.  Usually it's best to include "Jndi" in the
+					JavaBean property name so that administrative users understand the purpose of the property.
+					(And some may suggest that any optional property also use the word "optional" in the property name.)
+				</para>
+			</sect3>
+			<sect3 id="repository_source_capabilities">
+				<title>Capabilities</title>
+				<para>
+					Another characteristic of a &RepositorySource; implementation is that it provides some hint as to whether
+					it supports several features.  This is defined on the interface as a method that returns a
+					&RepositorySourceCapabilities; object.  This class currently provides methods that say whether the connector supports
+					updates, whether it supports same-name-siblings (SNS), and whether the connector supports listeners and events.
+				</para>
+				<para>
+					Note that these may be hard-coded values, or the connector's response may be determined at runtime by various factors.
+					For example, a connector may interrogate the underlying system to decide whether it can support updates.
+				</para>
+				<para>
+					The &RepositorySourceCapabilities; can be used as is (the class is immutable), or it can be subclassed
+					to provide more complex behavior.  It is important, however, that the capabilities remain constant
+					throughout the lifetime of the &RepositorySource; instance.
+				</para>
+				<note>
+					<para>
+						Why a concrete class and not an interface?  By using a concrete class, connectors inherit the default
+						behavior.  If additional capabilities need to be added to the class in future releases, connectors may
+						not have to override the defaults.  This provides some insulation against future enhancements to the connector framework.
+					</para>
+				</note>
+			</sect3>
+			<sect3 id="repository_source_security">
+				<title>Security and authentication</title>
+				<para>
+					As we'll see in the next section, the main method connectors have to process requests takes an &ExecutionContext;,
+					which contains the JAAS security information of the subject performing the request.  This means that the connector
+					can use this to determine authentication and authorization information for each request.
+				</para>
+				<para>
+					Sometimes that is not sufficient.  For example, it may be that the connector needs its own authorization information
+					so that it can establish a connection (even if user-level privileges still use the &ExecutionContext; provided with
+					each request).  In this case, the &RepositorySource; implementation will probably need JavaBean properties
+					that represent the connector's authentication information.  This may take the form of a username and password,
+					or it may be properties that are used to delegate authentication to JAAS.  
+					Either way, just realize that it's perfectly acceptable for the connector to require its own security properties.
+				</para>
+			</sect3>
+		</sect2>
+	  <sect2 id="implementing_repository_connection">
+	    <title>Implementing a <code>RepositoryConnection</code></title>
+	    <para>
+				One job of the &RepositorySource; implementation is to create connections to the underlying sources.
+				Connections are represented by classes that implement the &RepositoryConnection; interface, and creating this
+				class is the next step in writing a repository connector.  This is what we'll cover in this section.
+			</para>
+	    <para>
+				The &RepositoryConnection; interface is pretty straightforward:
+			</para>
+	    <programlisting>
+/**
+ * A connection to a repository source.
+ * <p>
+ * These connections need not support concurrent operations by multiple threads.
+ * </p>
+ */
+ at NotThreadSafe
+public interface &RepositoryConnection; {
+
+    /**
+     * Get the name for this repository source. This value should be the same as that returned
+     * by the same &RepositorySource; that created this connection.
+     * 
+     * @return the identifier; never null or empty
+     */
+    String getSourceName();
+
+    /**
+     * Return the transactional resource associated with this connection. The transaction manager 
+     * will use this resource to manage the participation of this connection in a distributed transaction.
+     * 
+     * @return the XA resource, or null if this connection is not aware of distributed transactions
+     */
+    XAResource getXAResource();
+
+    /**
+     * Ping the underlying system to determine if the connection is still valid and alive.
+     * 
+     * @param time the length of time to wait before timing out
+     * @param unit the time unit to use; may not be null
+     * @return true if this connection is still valid and can still be used, or false otherwise
+     * @throws InterruptedException if the thread has been interrupted during the operation
+     */
+    boolean ping( long time, &TimeUnit; unit ) throws InterruptedException;
+
+    /**
+     * Set the listener that is to receive notifications to changes to content within this source.
+     * 
+     * @param listener the new listener, or null if no component is interested in the change notifications
+     */
+    void setListener( &RepositorySourceListener; listener );
+
+    /**
+     * Get the default cache policy for this repository. If none is provided, a global cache policy
+     * will be used.
+     * 
+     * @return the default cache policy
+     */
+    &CachePolicy; getDefaultCachePolicy();
+
+    /**
+     * Execute the supplied commands against this repository source.
+     * 
+     * @param context the environment in which the commands are being executed; never null
+     * @param request the request to be executed; never null
+     * @throws RepositorySourceException if there is a problem loading the node data
+     */
+    void execute( &ExecutionContext; context,
+                  &Request; request ) throws &RepositorySourceException;;
+
+    /**
+     * Close this connection to signal that it is no longer needed and that any accumulated 
+     * resources are to be released.
+     */
+    void close();
+}</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
+				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>
+				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
+				as well as the subject performing the request.  This was discussed <link linkend="execution-context">earlier</link>.
+			</para>
+	    <para>
+				The second parameter, however, represents a request that is to be processed by the connector.  Request objects can
+				take many different forms, as there are different classes for each kind of request (see the table below).
+				Each request contains the information a connector needs to do the processing, and it also is the place
+				where the connector places the results (or the error, if one occurs).
+			</para>
+			<para>
+				How do the requests reference a node (or nodes)? Since requests are coming from a client, the client 
+				may identify a particular node using a &Location; object that is created with:
+			  <itemizedlist>
+			    <listitem>
+			      <para>the &Path; to the node; or</para>
+			    </listitem>
+			    <listitem>
+			      <para>one or more <emphasis>identification properties</emphasis> that are likely source=specific
+							and that are represented with &Property; objects; or</para>
+			    </listitem>
+			    <listitem>
+			      <para>a combination of both.</para>
+			    </listitem>
+			  </itemizedlist>
+				So, when a client knows the path or the identification properties, they can create a &Location;.  However,
+				all of the requests return &Location; objects, so often times the client simply uses the location
+				from a previous request.  Since &Location; is an immutable class, it is perfectly safe to reuse them.
+			</para>
+			<para>
+				One more thing about locations: while the request may have an incomplete location (e.g., a path but no
+				identification properties), the connector is expected to set on the request the <emphasis>actual</emphasis>
+				location that contains the path and all identification properties.  So as long as the client
+				reuses the actual locations in subsequent requests, the connectors will have the benefit of having
+				both the path and identification properties.  Connectors can then be written to leverage this
+				information, although the connector should still perform as expected when requests have incomplete locations.
+			</para>
+			<table frame='all'>
+				<title>Types of Node Operation Requests</title>
+				<tgroup cols='2' align='left' colsep='1' rowsep='1'>
+		      <colspec colname='c1' colwidth="1*"/>
+		      <colspec colname='c2' colwidth="1*"/>
+					<thead>
+						<row>
+				  		<entry>Name</entry>
+				  		<entry>Description</entry>
+						</row>
+					</thead>
+					<tbody>
+						<row>
+							<entry>ReadNodeRequest</entry>
+							<entry>
+								A request to read from the named workspace in the source a node's properties and children.
+								The node may be specified by path and/or by identification properties.
+								The connector returns all properties and the locations for all children,
+								or sets a &PathNotFoundException; error on the request if the node did not exist in the workspace.
+								If the node is found, the connector sets on the request the actual location of the node (including the path and identification properties).
+								The connector sets a &InvalidWorkspaceException; error on the request if the named workspace does not exist.
+							</entry>
+						</row>
+						<row>
+							<entry>VerifyNodeExistsRequest</entry>
+							<entry>
+								A request to verify the existance of a node at the specified location in the named workspace of the source.
+								The connector returns all the actual location for the node if it exists, or
+								sets a &PathNotFoundException; error on the request if the node does not exist in the workspace.
+								The connector sets a &InvalidWorkspaceException; error on the request if the named workspace does not exist.
+							</entry>
+						</row>
+						<row>
+							<entry>ReadAllPropertiesRequest</entry>
+							<entry>
+								A request to read from the named workspace in the source all of the properties of a node.
+								The node may be specified by path and/or by identification properties.
+								The connector returns all properties that were found on the node,
+								or sets a &PathNotFoundException; error on the request if the node did not exist in the workspace.
+								If the node is found, the connector sets on the request the actual location of the node (including the path and identification properties).
+								The connector sets a &InvalidWorkspaceException; error on the request if the named workspace does not exist.
+							</entry>
+						</row>
+						<row>
+							<entry>ReadPropertyRequest</entry>
+							<entry>
+								A request to read from the named workspace in the source a single property of a node.
+								The node may be specified by path and/or by identification properties,
+								and the property is specified by name.
+								The connector returns the property if found on the node,
+								or sets a &PathNotFoundException; error on the request if the node or property did not exist in the workspace.
+								If the node is found, the connector sets on the request the actual location of the node (including the path and identification properties).
+								The connector sets a &InvalidWorkspaceException; error on the request if the named workspace does not exist.
+							</entry>
+						</row>
+						<row>
+							<entry>ReadAllChildrenRequest</entry>
+							<entry>
+								A request to read from the named workspace in the source all of the children of a node.
+								The node may be specified by path and/or by identification properties.
+								The connector returns an ordered list of locations for each child found on the node,
+								an empty list if the node had no children,
+								or sets a &PathNotFoundException; error on the request if the node did not exist in the workspace.
+								If the node is found, the connector sets on the request the actual location of the parent node (including the path and identification properties).
+								The connector sets a &InvalidWorkspaceException; error on the request if the named workspace does not exist.
+							</entry>
+						</row>
+						<row>
+							<entry>ReadBlockOfChildrenRequest</entry>
+							<entry>
+								A request to read from the named workspace in the source a block of children of a node, starting with the n<superscript>th</superscript> children.
+								This is designed to allow paging through the children, which is much more efficient for large numbers of children.
+								The node may be specified by path and/or by identification properties, and the block
+								is defined by a starting index and a count (i.e., the block size).
+								The connector returns an ordered list of locations for each of the node's children found in the block,
+								or an empty list if there are no children in that range.
+								The connector also sets on the request the actual location of the parent node (including the path and identification properties)
+								or sets a &PathNotFoundException; error on the request if the parent node did not exist in the workspace.
+								The connector sets a &InvalidWorkspaceException; error on the request if the named workspace does not exist.
+							</entry>
+						</row>
+						<row>
+							<entry>ReadNextBlockOfChildrenRequest</entry>
+							<entry>
+								A request to read from the named workspace in the source a block of children of a node, starting with the children that immediately follow
+								a previously-returned child.
+								This is designed to allow paging through the children, which is much more efficient for large numbers of children.
+								The node may be specified by path and/or by identification properties, and the block
+								is defined by the location of the node immediately preceding the block and a count (i.e., the block size).
+								The connector returns an ordered list of locations for each of the node's children found in the block,
+								or an empty list if there are no children in that range.
+								The connector also sets on the request the actual location of the parent node (including the path and identification properties)
+								or sets a &PathNotFoundException; error on the request if the parent node did not exist in the workspace.
+								The connector sets a &InvalidWorkspaceException; error on the request if the named workspace does not exist.
+							</entry>
+						</row>
+						<row>
+							<entry>ReadBranchRequest</entry>
+							<entry>
+								A request to read a portion of a subgraph that has as its root a particular node, up to a maximum depth.
+								This request is an efficient mechanism when a branch (or part of a branch) is to be navigated and processed,
+								and replaces some non-trivial code to read the branch iteratively using multiple <code>ReadNodeRequest</code>s.
+								The connector reads the branch to the specified maximum depth, returning the properties and children for all
+								nodes found in the branch.  
+								The connector also sets on the request the actual location of the branch's root node (including the path and identification properties).
+								The connector sets a &PathNotFoundException; error on the request if the node at 
+								the top of the branch does not exist in the workspace.
+								The connector sets a &InvalidWorkspaceException; error on the request if the named workspace does not exist.
+							</entry>
+						</row>
+						<row>
+							<entry>CreateNodeRequest</entry>
+							<entry>
+								A request to create a node at the specified location and setting on the new node the properties included in the request.
+								The connector creates the node at the desired location, adjusting any same-name-sibling indexes as required.
+								(If an SNS index is provided in the new node's location, existing children with the same name after that SNS index
+								will have their SNS indexes adjusted.  However, if the requested location does not include a SNS index, the new
+								node is added after all existing children, and it's SNS index is set accordingly.)
+								The connector also sets on the request the actual location of the new node (including the path and identification properties)..
+								The connector sets a &PathNotFoundException; error on the request if the parent node does not exist in the workspace.
+								The connector sets a &InvalidWorkspaceException; error on the request if the named workspace does not exist.
+							</entry>
+						</row>
+						<row>
+							<entry>RemovePropertiesRequest</entry>
+							<entry>
+								A request to remove a set of properties on an existing node.  The request contains the location of the node as well as the
+								names of the properties to be removed.  The connector performs these changes and sets on the request the
+								actual location (including the path and identification properties) of the node.
+								The connector sets a &PathNotFoundException; error on the request if the node does not exist in the workspace.
+								The connector sets a &InvalidWorkspaceException; error on the request if the named workspace does not exist.
+							</entry>
+						</row>
+						<row>
+							<entry>UpdatePropertiesRequest</entry>
+							<entry>
+								A request to set or update properties on an existing node.  The request contains the location of the node as well as the
+								properties to be set and those to be deleted.  The connector performs these changes and sets on the request the
+								actual location (including the path and identification properties) of the node.
+								The connector sets a &PathNotFoundException; error on the request if the node does not exist in the workspace.
+								The connector sets a &InvalidWorkspaceException; error on the request if the named workspace does not exist.
+							</entry>
+						</row>
+						<row>
+							<entry>RenameNodeRequest</entry>
+							<entry>
+								A request to change the name of a node.  The connector changes the node's name, adjusts all SNS indexes
+								accordingly, and returns the actual locations (including the path and identification properties) of both the original
+								location and the new location.
+								The connector sets a &PathNotFoundException; error on the request if the node does not exist in the workspace.
+								The connector sets a &InvalidWorkspaceException; error on the request if the named workspace does not exist.
+							</entry>
+						</row>
+						<row>
+							<entry>CopyBranchRequest</entry>
+							<entry>
+								A request to copy a portion of a subgraph that has as its root a particular node, up to a maximum depth.
+								The request includes the name of the workspace where the original node is located as well as the name of the
+								workspace where the copy is to be placed (these may be the same, but may be different).
+								The connector copies the branch from the original location, up to the specified maximum depth, and places a copy
+								of the node as a child of the new location.
+								The connector also sets on the request the actual location (including the path and identification properties)
+								of the original location as well as the location of the new copy.
+								The connector sets a &PathNotFoundException; error on the request if the node at 
+								the top of the branch does not exist in the workspace.
+								The connector sets a &InvalidWorkspaceException; error on the request if one of the named workspaces does not exist.
+							</entry>
+						</row>
+						<row>
+							<entry>MoveBranchRequest</entry>
+							<entry>
+								A request to move a subgraph that has a particular node as its root.
+								The connector moves the branch from the original location and places it as child of the specified new location.
+								The connector also sets on the request the actual location (including the path and identification properties)
+								of the original and new locations.  The connector will adjust SNS indexes accordingly.
+								The connector sets a &PathNotFoundException; error on the request if the node that is to be moved or the
+								new location do not exist in the workspace.
+								The connector sets a &InvalidWorkspaceException; error on the request if the named workspace does not exist.
+							</entry>
+						</row>
+						<row>
+							<entry>DeleteBranchRequest</entry>
+							<entry>
+								A request to delete an entire branch specified by a single node's location.
+								The connector deletes the specified node and all nodes below it, and sets the actual location,
+								including the path and identification properties, of the node that was deleted.
+								The connector sets a &PathNotFoundException; error on the request if the node being deleted does not exist in the workspace.
+								The connector sets a &InvalidWorkspaceException; error on the request if the named workspace does not exist.
+							</entry>
+						</row>
+						<row>
+							<entry>CompositeRequest</entry>
+							<entry>
+								A request that actually comprises multiple requests (none of which will be a composite).
+								The connector simply processes all of the requests in the composite request, but should set on the composite
+								request any error (usually the first error) that occurs during processing of the contained requests.
+							</entry>
+						</row>
+					</tbody>
+				</tgroup>
+			</table>
+			<para>There are also requests that deal with workspaces:</para>
+			<table frame='all'>
+				<title>Types of Workspace Requests</title>
+				<tgroup cols='2' align='left' colsep='1' rowsep='1'>
+		      <colspec colname='c1' colwidth="1*"/>
+		      <colspec colname='c2' colwidth="1*"/>
+					<thead>
+						<row>
+				  		<entry>Name</entry>
+				  		<entry>Description</entry>
+						</row>
+					</thead>
+					<tbody>
+						<row>
+							<entry>GetWorkspacesRequest</entry>
+							<entry>
+								A request to obtain the names of the existing workspaces that are accessible to the caller.
+							</entry>
+						</row>
+						<row>
+							<entry>VerifyWorkspaceRequest</entry>
+							<entry>
+								A request to verify that a workspace with a particular name exists.
+								The connector returns the actual location for the root node if the workspace exists, as well as the actual name of the workspace
+								(e.g., the default workspace name if a null name is supplied).
+							</entry>
+						</row>
+						<row>
+							<entry>CreateWorkspaceRequest</entry>
+							<entry>
+								A request to create a workspace with a particular name.
+								The connector returns the actual location for the root node if the workspace exists, as well as the actual name of the workspace
+								(e.g., the default workspace name if a null name is supplied).
+								The connector sets a &InvalidWorkspaceException; error on the request if the named workspace already exists.
+							</entry>
+						</row>
+						<row>
+							<entry>DestroyWorkspaceRequest</entry>
+							<entry>
+								A request to destroy a workspace with a particular name.
+								The connector sets a &InvalidWorkspaceException; error on the request if the named workspace does not exist.
+							</entry>
+						</row>
+						<row>
+							<entry>CloneWorkspaceRequest</entry>
+							<entry>
+								A request to clone one named workspace as another new named workspace.
+								The connector sets a &InvalidWorkspaceException; error on the request if the original workspace does not exist, 
+								or if the new workspace already exists.
+							</entry>
+						</row>
+					</tbody>
+				</tgroup>
+			</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;.
+				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 DNA provides a &RequestProcessor; class that can simplify writing your own connector and at the
+				same time help insulate your connector from new kinds of requests that may be added in the future.  The &RequestProcessor;
+				is an abstract class that defines a <code>process(...)</code> method for each concrete &Request; subclass.
+				In other words, there is a <code>process(CompositeRequest)</code> method, a <code>process(ReadNodeRequest)</code> method,
+				and so on.  
+			</para>
+			<para>
+				To use this in your connector, simply create a subclass of &RequestProcessor;, overriding all of the abstract methods and optionally
+				overriding any of the other methods that have a default implementation.
+			</para>
+			<note>
+				<para>
+					The &RequestProcessor; abstract class contains default implementations for quite a few of the <code>process(...)</code> methods,
+					and these will be <emphasis>sufficient</emphasis>	but probably not efficient or optimum.  If you can provide a more efficient
+					implementation given your source, feel free to do so.  However, if performance is not a big issue, all of the concrete methods
+					will provide the correct behavior. Keep things simple to start out - you can always provide better implementations later.
+				</para>
+			</note>
+			<para>
+				Then, in your connector's <code>execute(&ExecutionContext;, &Request;)</code> method, instantiate your &RequestProcessor; subclass
+				and call its <code>process(&Request;) method, passing in the <code>execute(...)</code> method's &Request; parameter.</code>
+				The &RequestProcessor; will determine the appropriate method given the actual &Request; object and will then invoke that method:
+			</para>
+	    <programlisting>
+public void execute( final &ExecutionContext; context,
+                     final &Request; request ) throws RepositorySourceException {
+    RequestProcessor processor = new RequestProcessor(context);
+    try {
+        processor.process(request);
+    } finally {
+        processor.close();
+    }
+}</programlisting>
+			<para>
+				If you do this, the bulk of your connector implementation may be in the &RequestProcessor; implementation methods.
+				This not only is pretty maintainable, it also lends itself to easier testing.  And should any new request types be added
+				in the future, your connector may work just fine without any changes.  In fact, if the &RequestProcessor; class
+				can implement meaningful methods for those new request types, your connector may "just work".  Or, at least
+				your connector will still be binary compatible, even if your connector won't support any of the new features.
+			</para>
+			<para>
+				Finally, how should the connector handle exceptions?  As mentioned above, each &Request; object has a slot where the connector
+				can set any exception encountered during processing.  This not only handles the exception, but in the case of &CompositeRequest;s
+				it also correctly associates the problem with the request.  However, it is perfectly acceptable to throw an exception
+				if the connection becomes invalid (e.g., there is a communication failure) or if a fatal error would prevent subsequent
+				requests from being processed.
+			</para>
+		</sect2>
+	  <sect2 id="testing_custom_connectors">
+	    <title>Testing custom connectors</title>
+	    <para>
+				Testing connectors is not really that much different than testing other classes.  Using mocks may help to isolate your
+				instances so you can create more unit tests that don't require the underlying source system.
+			</para>
+	    <para>
+				However, there may be times when you have to use the underlying source system in your tests.  If this is the case,
+				we recommend using Maven integration tests, which run at a different point in the Maven lifecycle.  The benefit of
+				using integration tests is that by convention they're able to rely upon external systems.  Plus, your unit tests
+				don't become polluted with slow-running tests that break if the external system is not available.
+			</para>
+		</sect2>
+	  <sect2 id="deploying_custom_connectors">
+	    <title>Configuring and deploying custom connectors</title>
+	    <para>
+				After building your connector project, you need to configure the JBoss DNA components your application is using so
+				that they use your connector.  In a lot of cases, this will entail instantiating your connector's &RepositorySource; class,
+				setting the various properties, and registering it with a &RepositoryLibrary;.  Or, it will entail using a configuration
+				repository to use your source and letting &RepositoryService; instantiate and set up your &RepositorySource; instance.
+				Or, you can just instantiate and set it up manually, passing the instance to whatever component needs it.
+			</para>
+			<para>
+				And of course you have to make the JAR file containing your connector (as well as any dependency JARs) available to
+				your application's classpath.
+			</para>
+		</sect2>
+  </sect1>
+	<sect1 id="dna_graph_api">
+		<title>Graph API for using connectors</title>
+		<para>
+			So far we've talked about repositories, repository connectors, and how connectors respond to the different kinds of requests.
+			Normally you'd code to the JCR API and use our JCR implementation.  However, what does your code look like if you want 
+			to use the connectors directly, without using our JCR implementation?  After all, you may be a contributor to JBoss DNA,
+			or you may want to take advantage of our connectors without all the overhead of JCR.
+		</para>
+		<para>
+			One option, of course, is to explicitly create the different requests and pass them to the connector's <code>execute(...)</code> method.
+			While this is the most efficient approach (and one taken in some key DNA components), you probably want something that
+			is much less verbose and much easier to use.  This is where the DNA graph API comes in.
+		</para>
+		<para>
+			JBoss DNA's <emphasis>Graph API</emphasis> was designed as a lightweight public API for working with graph information,
+			and it insulates components from the underlying requests and interacting with connectors.  
+			The &Graph; class is the primary class in API, and each instance represents a single, independent
+			view of the graph of content from a single connector.  &Graph; instances return snapshots of state, and those snapshots
+			never change after they're retrieved.  To obtain a &Graph; instance, use the static <code>create(...)</code>
+			method, supplying the name of the source, a &RepositoryConnectionFactory; from which a &RepositoryConnection; can be obtained,
+			and the &ExecutionContext;.
+		</para>
+		<para>
+			The &Graph; class basically represents an <ulink url="http://www.martinfowler.com/bliki/DomainSpecificLanguage.html">internal domain specific language (DSL)</ulink>,
+			designed to be easy to use in an application.  
+			The Graph API makes extensive use of interfaces and method chaining, so that methods return a concise interface that has only those
+			methods that make sense at that point.  In fact, this should be really easy if your IDE has code completion.
+			Just remember that under the covers, a &Graph; is just building &Request; objects, submitting them to the connector,
+			and then exposing the results.
+		</para>
+		<sect2 id="dna_graph_api_workspaces">
+			<title>Using workspaces</title>
+		<para>
+			Let's look at some examples of how the Graph API works.  This first example shows how to obtain the names of the available workspaces:
+		</para>
+		<programlisting>
+&Set;&lt;&String;> workspaceNames = graph.getWorkspaces();
+</programlisting>
+		<para>Once you know the name of the workspace, you can specify that the graph should use it:
+		</para>
+		<programlisting>
+graph.useWorkspace("myWorkspace");
+</programlisting>
+		<para>
+			From this point forward, all requests will apply to the workspace named "myWorkspace".  At any time, you can use a different workspace,
+			which will affect all subsequent requests made using the graph.  Of course, creating a new workspace is just as easy:
+		</para>
+		<programlisting>
+graph.createWorkspace().named("newWorkspace");
+</programlisting>
+	  <para>This will attempt to create a workspace named "newWorkspace", which will fail if that workspace already exists.  You may
+		want to create a new workspace with a name that should be altered if the name you supply is already used.  The following code shows
+		how you can do this:
+		</para>
+		<programlisting>
+graph.createWorkspace().namedSomethingLike("newWorkspace");
+</programlisting>
+	  <para>If there is no existing workspace named "newWorkspace", a new one will be created with this name.  However, if "newWorkspace" already
+		exists, this call will create a workspace with a name that is some alteration of the supplied name.
+		</para>
+	  <para>
+		You can also clone workspaces, too:
+		</para>
+		<programlisting>
+graph.createWorkspace().clonedFrom("original").named("something");
+</programlisting>
+		<para>
+			or
+		</para>
+		<programlisting>
+graph.createWorkspace().clonedFrom("original").namedSomethingLike("something");
+</programlisting>
+		<para>
+			As you can see, it's very easy to specify which workspace you want to use or to create new workspaces.  You can also find out which workspace
+			the graph is currently using:
+		</para>
+		<programlisting>
+&String; current = graph.getCurrentWorkspaceName();
+</programlisting>
+		<para>or, if you want, you can get more information about the workspace:
+		</para>
+		<programlisting>
+&Workspace; current = graph.getCurrentWorkspace();
+&String; name = current.getName();
+&Location; rootLocation = current.getRoot();
+</programlisting>
+    </sect2>
+		<sect2 id="dna_graph_api_nodes">
+			<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;:
+		</para>
+		<programlisting>
+&Path; path = ...
+Map&lt;&Name;,&Property;> propertiesByName = graph.getPropertiesByName().on(path);
+</programlisting>
+		<para>
+			This next example shows how the graph can be used to obtain and loop over the properties of a node:
+		</para>
+		<programlisting>
+&Path; path = ...
+for ( &Property; property : graph.getProperties().on(path) ) {
+	  ...
+}
+</programlisting>
+		<para>
+			Likewise, the next example shows how the graph can be used to obtain and loop over the children of a node:
+		</para>
+		<programlisting>
+&Path; path = ...
+for ( &Location; child : graph.getChildren().of(path) ) {
+    &Path; childPath = child.getPath();
+	  ...
+}
+</programlisting>
+		<para>
+			Notice that the examples pass a &Path; instance to the <code>on(...)</code> and <code>of(...)</code> methods.  Many
+			of the Graph API methods take a variety of parameter types, including String, &Path;s, &Location;s, &UUID;, or &Property; parameters.
+			This should make it easy to use in many different situations.
+		</para>
+		<para>
+			Of course, changing content is more interesting and offers more interesting possibilities.  Here are a few examples:
+		</para>
+		<programlisting>
+&Path; path = ...
+&Location; location = ...
+&Property; idProp1 = ...
+&Property; idProp2 = ...
+&UUID; uuid = ...
+graph.move(path).into(idProp1, idProp2);
+graph.copy(path).into(location);
+graph.delete(uuid);
+graph.delete(idProp1,idProp2);
+</programlisting>
+		<para>
+			The methods shown above work immediately, as soon as each request is built.  However, there is another way to use
+			the &Graph; object, and that is in a <emphasis>batch</emphasis> mode.  Simply create a &GraphBatch; object using the
+			<code>batch()</code> method, create the requests on that batch object, and then execute all of the commands on the
+			batch by calling its <code>execute()</code> method.  That <code>execute()</code> method returns a &Results; interface
+			that can be used to read the node information retrieved by the batched requests. 
+		</para>
+		<para>
+			Method chaining works really well with the batch mode, since multiple commands can be assembled together very easily:
+		</para>
+		<programlisting>
+&Path; path = ...
+String path2 = ...
+&Location; location = ...
+&Property; idProp1 = ...
+&Property; idProp2 = ...
+&UUID; uuid = ...
+graph.batch().move(path).into(idProp1, idProp2).and().copy(path2).into(location).and().delete(uuid).execute();
+&Results; results = graph.batch().read(path2).
+                    and().readChildren().of(idProp1,idProp2).
+                    and().readSugraphOfDepth(3).at(uuid2).
+                    execute();
+for ( &Location; child : results.getNode(path2) ) {
+    ...
+}
+</programlisting>
+		<para>
+			Of course, this section provided just a hint of the Graph API.  
+			The &Graph; interface is actually quite complete and offers a full-featured approach for reading and updating a graph.
+			For more information, see the &Graph; JavaDocs.
+		</para>
+	</sect2>
+	</sect1>
+	<sect1>
+		<title>Summary</title>
+		<para>
+			In this chapter, we covered all the aspects of JBoss DNA repositories, including the connector framework,
+			how DNA's JCR implementation works with connectors, what connectors are available (and how to use them),
+			and how to write your own connector.  So now that you know how to set up and use JBoss DNA repositories,
+			the <link linkend="jcr">next chapter</link> describes how you can leverage JBoss DNA's JCR implementation.
+		</para>
+	</sect1>
+</chapter>


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

Copied: trunk/docs/reference/src/main/docbook/en-US/content/core/sequencing.xml (from rev 994, trunk/docs/reference/src/main/docbook/en-US/content/sequencing.xml)
===================================================================
--- trunk/docs/reference/src/main/docbook/en-US/content/core/sequencing.xml	                        (rev 0)
+++ trunk/docs/reference/src/main/docbook/en-US/content/core/sequencing.xml	2009-06-08 14:57:17 UTC (rev 995)
@@ -0,0 +1,793 @@
+<?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="sequencing">
+  <title>Sequencing content</title>
+	<para>As we've mentioned before, JBoss DNA is able to work with existing JCR repositories.  Your client applications
+  	make changes to the information in those repositories, and JBoss DNA automatically uses its sequencers to extract
+  	additional information from the uploaded files.</para>
+	<para>
+		This chapter discusses the sequencing features of JBoss DNA and the components that are involved.
+	</para>
+  <sect1 id="sequencing-service">
+    <title>Sequencing Service</title>
+		<para>The JBoss DNA <emphasis>sequencing service</emphasis> is the component that manages the <emphasis>sequencers</emphasis>, 
+			reacting to changes in JCR repositories and then running the appropriate sequencers.
+      This involves processing the changes on a node, determining which (if any) sequencers should be run on that node,
+      and for each sequencer constructing the execution environment, calling the sequencer, and saving the information
+      generated by the sequencer.</para>
+		<note>
+			<para>Configuring JBoss DNA services is a bit more manual than is ideal. As you'll see, JBoss DNA uses dependency
+	      injection to allow a great deal of flexibility in how it can be configured and customized. But this flexibility
+	      makes it more difficult for you to use.  We understand this, and will soon provide a much easier way to set up 
+				and manage JBoss DNA.  Current plans are to use the <ulink url="http://www.jboss.org/jbossmc">JBoss Microcontainer</ulink>
+				along with a configuration repository.</para>
+		</note>
+		<para>To set up the sequencing service, an instance is created, and dependent components are injected into
+      the object.  This includes among other things:
+			<itemizedlist>
+				<listitem>
+					<para>An <emphasis>execution context</emphasis> that defines the context in which the service runs, including
+			        a factory for JCR sessions given names of the repository and workspace.  This factory must be configured,
+			        and is how JBoss DNA knows about your JCR repositories and how to connect to them.  More on this a bit later.</para>
+				</listitem>
+				<listitem>
+					<para>An optional <emphasis>factory for class loaders</emphasis> used to load sequencers.  If no factory is supplied,
+			        the service uses the current thread's context class loader (or if that is null, the class loader that loaded the
+			        sequencing service class).</para>
+				</listitem>
+				<listitem>
+					<para>An &ExecutorService; used to execute the sequencing activites.  If none
+			        is supplied, a new single-threaded executor is created by calling <code>Executors.newSingleThreadExecutor()</code>.
+			        (This can easily be changed by subclassing and overriding the <code>SequencerService.createDefaultExecutorService()</code> method.)</para>
+				</listitem>
+				<listitem>
+					<para>Filters for sequencers and events.  By default, all sequencers are considered for "node added", "property added"
+			        and "property changed" events.</para>
+				</listitem>
+			</itemizedlist>
+    </para>
+		<para>As mentioned above, the &JcrExecutionContext; provides access to a &SessionFactory; that is used
+      by JBoss DNA to establish sessions to your JCR repositories.  Two implementations are available:
+			<itemizedlist>
+				<listitem>
+					<para>The &JndiSessionFactory;> looks up JCR &Repository; instances in JNDI using
+			          names that are supplied when creating sessions.  This implementation also has methods to set the
+			          JCR &Credentials; for a given workspace name.</para>
+				</listitem>
+				<listitem>
+					<para>The &SimpleSessionFactory; has methods to register the JCR &Repository; instances
+			          with names, as well as methods to set the JCR &Credentials; for a given workspace name.</para>
+				</listitem>
+			</itemizedlist>
+      You can use the &JcrExecutionContext; and use one of these &SessionFactory; implementations or another
+      implementation that you provide.</para>
+		<para>Here's an example of how to instantiate and configure the &SequencingService;:</para>
+    <programlisting>
+&SimpleSessionFactory; sessionFactory = new &SimpleSessionFactory;();
+sessionFactory.registerRepository("Main Repository", this.repository);
+&Credentials; credentials = new &SimpleCredentials;("jsmith", "secret".toCharArray());
+sessionFactory.registerCredentials("Main Repository/Workspace1", credentials);
+// Now create the JCR execution context, with a reference to the session factory
+// and the name of the repository from which sessions will be obtained ...
+ExecutionContext executionContext = new &JcrExecutionContext;(sessionFactory,"Main Repository");
+
+// Create the sequencing service, passing in the execution context ...
+&SequencingService; sequencingService = new &SequencingService;();
+sequencingService.setExecutionContext(executionContext);
+</programlisting>
+		<para>After the sequencing service is created and configured, it must be started.  The &SequencingService;
+      has an <emphasis>administration object</emphasis> (that is an instance of &ServiceAdministrator;)
+      with <code>start()</code>, <code>pause()</code>, and <code>shutdown()</code> methods.  The latter method will 
+      close the queue for sequencing, but will allow sequencing operations already running to complete normally.
+      To wait until all sequencing operations have completed, simply call the <code>awaitTermination</code> method
+      and pass it the maximum amount of time you want to wait.</para>
+		<programlisting>
+sequencingService.getAdministrator().start();
+</programlisting>
+		<para>The JBoss DNA services are utilizing resources and threads that must be released before your application is ready to shut down.
+    	The safe way to do this is to simply obtain the &ServiceAdministrator; for each service (via the <code>getServiceAdministrator()</code> method)
+    	and call <code>shutdown()</code>.  As previously mentioned, the shutdown method will simply prevent new work from being processed
+    	and will not wait for existing work to be completed.  If you want to wait until the service completes all its work, you must wait
+    	until the service terminates.  Here's an example that shows how this is done:</para>
+    <programlisting>
+// Shut down the service and wait until it's all shut down ...
+sequencingService.getAdministrator().shutdown();
+sequencingService.getAdministrator().awaitTermination(5, TimeUnit.SECONDS);
+
+// Shut down the observation service ...
+observationService.getAdministrator().shutdown();
+observationService.getAdministrator().awaitTermination(5, TimeUnit.SECONDS);
+</programlisting>
+  </sect1>
+  <sect1 id="sequencer-configuration">
+    <title>Sequencer Configurations</title>
+		<para>The sequencing service must also be configured with the sequencers that it will use.  This is done using the
+      <code>addSequencer(SequencerConfig)</code> method and passing a &SequencerConfig; instance that
+      you create.  Here's the code that defines 3 sequencer configurations: 1 that places image metadata into
+      "<code><![CDATA[/images/<filename>]]></code>", another that places MP3 metadata into "<code><![CDATA[/mp3s/<filename>]]></code>",
+      and a third that places a structure that represents the classes, methods, and attributes found within Java source into 
+      "<code><![CDATA[/java/<filename>]]></code>".</para>
+    <programlisting>
+String name = "Image Sequencer";
+String desc = "Sequences image files to extract the characteristics of the image";
+String classname = "org.jboss.dna.sequencer.images.ImageMetadataSequencer";
+String[] classpath = null; // Use the current classpath
+String[] pathExpressions = {"//(*.(jpg|jpeg|gif|bmp|pcx|png)[*])/jcr:content[@jcr:data] => /images/$1"};
+&SequencerConfig; imageSequencerConfig = new &SequencerConfig;(name, desc, classname, 
+                                                           classpath, pathExpressions);
+sequencingService.addSequencer(imageSequencerConfig);
+
+name = "MP3 Sequencer";
+desc = "Sequences MP3 files to extract the ID3 tags from the audio file";
+classname = "org.jboss.dna.sequencer.mp3.Mp3MetadataSequencer";
+pathExpressions = {"//(*.mp3[*])/jcr:content[@jcr:data] =&gt; /mp3s/$1"};
+&SequencerConfig; mp3SequencerConfig = new &SequencerConfig;(name, desc, classname, 
+                                                         classpath, pathExpressions);
+sequencingService.addSequencer(mp3SequencerConfig);
+
+name = "Java Sequencer";
+desc = "Sequences java files to extract the characteristics of the Java source";
+classname = "org.jboss.dna.sequencer.java.JavaMetadataSequencer";
+pathExpressions = {"//(*.java[*])/jcr:content[@jcr:data] => /java/$1"};
+&SequencerConfig; javaSequencerConfig = new &SequencerConfig;(name, desc, classname, 
+                                                          classpath, pathExpressions);
+this.sequencingService.addSequencer(javaSequencerConfig);
+</programlisting>
+    <para>Each configuration defines several things, including the name, description, and sequencer implementation class.
+	    The configuration also defines the classpath information, which can be passed to the &ClassLoaderFactory; to get
+	    a Java &ClassLoader; with which the sequencer class can be loaded.  (If no classpath information is provided, as is done
+	    in the code above, the application class loader is used.)  The configuration also specifies the path expressions that
+	    identify the nodes that should be sequenced with the sequencer and where to store the output generated by the sequencer.
+	    Path expressions are pretty straightforward but are quite powerful, so before we go any further with the example,
+	    let's dive into path expressions in more detail.</para>
+		<sect2 id="path_expressions">
+			<title>Path Expressions</title>
+			<para>Path expressions consist of two parts: a selection criteria (or an input path) and an output path:</para>
+	    <programlisting><![CDATA[  inputPath => outputPath ]]></programlisting>
+			<para>The <emphasis>inputPath</emphasis> part defines an expression for the path of a node that is to be sequenced.
+			  Input paths consist of '<code>/</code>' separated segments, where each segment represents a pattern for a single node's
+			  name (including the same-name-sibling indexes) and '<code>@</code>' signifies a property name.</para>
+			<para>Let's first look at some simple examples:</para>
+			<table frame='all'>
+				<title>Simple Input Path Examples</title>
+				<tgroup cols='2' align='left' colsep='1' rowsep='1'>
+		      <colspec colname='c1' colwidth="1*"/>
+		      <colspec colname='c2' colwidth="1*"/>
+					<thead>
+						<row>
+				  		<entry>Input Path</entry>
+				  		<entry>Description</entry>
+						</row>
+					</thead>
+					<tbody>
+						<row><entry>/a/b</entry><entry>Match node "<code>b</code>" that is a child of the top level node "<code>a</code>". Neither node
+						     may have any same-name-sibilings.</entry></row>
+						<row><entry>/a/*</entry><entry>Match any child node of the top level node "<code>a</code>".</entry></row>
+						<row><entry>/a/*.txt</entry><entry>Match any child node of the top level node "<code>a</code>" that also has a name ending in "<code>.txt</code>".</entry></row>
+						<row><entry>/a/*.txt</entry><entry>Match any child node of the top level node "<code>a</code>" that also has a name ending in "<code>.txt</code>".</entry></row>
+						<row><entry>/a/b at c</entry><entry>Match the property "<code>c</code>" of node "<code>/a/b</code>".</entry></row>
+						<row><entry>/a/b[2]</entry><entry>The second child named "<code>b</code>" below the top level node "<code>a</code>".</entry></row>
+						<row><entry>/a/b[2,3,4]</entry><entry>The second, third or fourth child named "<code>b</code>" below the top level node "<code>a</code>".</entry></row>
+						<row><entry>/a/b[*]</entry><entry>Any (and every) child named "<code>b</code>" below the top level node "<code>a</code>".</entry></row>
+						<row><entry>//a/b</entry><entry>Any node named "<code>b</code>" that exists below a node named "<code>a</code>", regardless 
+						     of where node "<code>a</code>" occurs.  Again, neither node may have any same-name-sibilings.</entry></row>
+					</tbody>
+				</tgroup>
+			</table>
+			<para>With these simple examples, you can probably discern the most important rules.  First, the '<code>*</code>' is a wildcard character
+			  that matches any character or sequence of characters in a node's name (or index if appearing in between square brackets), and
+			  can be used in conjunction with other characters (e.g., "<code>*.txt</code>").</para>
+			<para>Second, square brackets (i.e., '<code>[</code>' and '<code>]</code>') are used to match a node's same-name-sibiling index.
+			  You can put a single non-negative number or a comma-separated list of non-negative numbers.  Use '0' to match a node that has no
+			  same-name-sibilings, or any positive number to match the specific same-name-sibling.</para>
+			<para>Third, combining two delimiters (e.g., "<code>//</code>") matches any sequence of nodes, regardless of what their names are 
+			  or how many nodes.  Often used with other patterns to identify nodes at any level matching other patterns. 
+				Three or more sequential slash characters are treated as two.</para>
+			<para>Many input paths can be created using just these simple rules.  However, input paths can be more complicated.  Here are some
+				more examples:</para>
+			<table frame='all'>
+				<title>More Complex Input Path Examples</title>
+				<tgroup cols='2' align='left' colsep='1' rowsep='1'>
+		      <colspec colname='c1' colwidth="1*"/>
+		      <colspec colname='c2' colwidth="1*"/>
+					<thead>
+						<row>
+				  		<entry>Input Path</entry>
+				  		<entry>Description</entry>
+						</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 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
+								 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
+						     "<code>something</code>". None of the nodes may have same-name-sibling indexes.</entry></row>
+					</tbody>
+				</tgroup>
+			</table>
+			<para>These examples show a few more advanced rules.  Parentheses (i.e., '<code>(</code>' and '<code>)</code>') can be used
+			  to define a set of options for names, as shown in the first and third rules.  Whatever part of the selected node's path
+			  appears between the parentheses is captured for use within the output path.  Thus, the first input path in the previous table
+			  would match node "<code>/a/b</code>", and "b" would be captured and could be used within the output path using "<code>$1</code>",
+			  where the number used in the output path identifies the parentheses.</para>
+			<para>Square brackets can also be used to specify criteria on a node's properties or children.  Whatever appears in between the square
+				brackets does not appear in the selected node.</para>
+		  <para>Let's go back to the previous code fragment and look at the first path expression:</para>
+		  <programlisting><![CDATA[  //(*.(jpg|jpeg|gif|bmp|pcx|png)[*])/jcr:content[@jcr:data] => /images/$1 ]]></programlisting>
+		  <para>This matches a node named "<code>jcr:content</code>" with property "<code>jcr:data</code>" but no siblings with the same name,
+		    and that is a child of a node whose name ends with "<code>.jpg</code>", "<code>.jpeg</code>", "<code>.gif</code>", "<code>.bmp</code>", "<code>.pcx</code>", 
+		    or  "<code>.png</code>" that may have any same-name-sibling index.  These nodes can appear at any level in the repository.
+			  Note how the input path capture the filename (the segment containing the file extension), including any same-name-sibling index.
+			  This filename is then used in the output path, which is where the sequenced content is placed.</para>
+		</sect2>
+  </sect1>
+  <sect1 id="sequencers">
+    <title>JBoss DNA Sequencers</title>
+    <para>
+    	JBoss DNA includes a number of sequencers "out of the box".  These sequencers can be used within your application to sequence
+			a variety of common file formats.  To use them, the only thing you have to do is define the appropriate sequencer configurations
+			and include the appropriate JAR files.
+    </para>
+    <sect2 id="dna-sequencer-images">
+      <title>Image sequencer</title>
+      <para>
+				A sequencer that extracts metadata from JPEG, GIF, BMP, PCX, PNG, IFF, RAS, PBM, PGM, PPM and PSD image files.
+				This sequencer extracts the file format, image resolution, number of bits per pixel and optionally number of images, comments 
+				and physical resolution, and then writes this information into the repository using the following structure:
+			</para>
+			<itemizedlist>
+				<listitem>
+					<para>
+						<emphasis role="strong">image:metadata</emphasis> node of type <code>image:metadata</code>
+					</para>
+				</listitem>
+				<listitem>
+					<itemizedlist>
+						<listitem>
+							<para><emphasis role="strong">jcr:mimeType</emphasis> - optional string property for the mime type of the image</para>
+						</listitem>
+						<listitem>
+							<para><emphasis role="strong">jcr:encoding</emphasis> - optional string property for the encoding of the image</para>
+						</listitem>
+						<listitem>
+							<para><emphasis role="strong">image:formatName</emphasis> - string property for the name of the format</para>
+						</listitem>
+						<listitem>
+							<para><emphasis role="strong">image:width</emphasis> - optional integer property for the image's width in pixels</para>
+						</listitem>
+						<listitem>
+							<para><emphasis role="strong">image:height</emphasis> - optional integer property for the image's height in pixles</para>
+						</listitem>
+						<listitem>
+							<para><emphasis role="strong">image:bitsPerPixel</emphasis> - optional integer property for the number of bits per pixel</para>
+						</listitem>
+						<listitem>
+							<para><emphasis role="strong">image:progressive</emphasis> - optional boolean property specifying whether the image is stored in a progressive
+									(i.e., interlaced) form</para>
+						</listitem>
+						<listitem>
+							<para><emphasis role="strong">image:numberOfImages</emphasis> - optional integer property for the number of images stored in the file; defaults
+									to 1</para>
+						</listitem>
+						<listitem>
+							<para><emphasis role="strong">image:physicalWidthDpi</emphasis> - optional integer property for the physical width of the image in dots per inch</para>
+						</listitem>
+						<listitem>
+							<para><emphasis role="strong">image:physicalHeightDpi</emphasis> - optional integer property for the physical height of the image in dots per
+									inch</para>
+						</listitem>
+						<listitem>
+							<para><emphasis role="strong">image:physicalWidthInches</emphasis> - optional double property for the physical width of the image in inches</para>
+						</listitem>
+						<listitem>
+							<para><emphasis role="strong">image:physicalHeightInches</emphasis> - optional double property for the physical height of the image in inches</para>
+						</listitem>
+					</itemizedlist>
+				</listitem>
+			</itemizedlist>
+			<para>
+				This structure could be extended in the future to add EXIF and IPTC metadata as child nodes. For example, EXIF metadata is
+				structured as tags in directories, where the directories form something like namespaces, and which are used by different camera
+				vendors to store custom metadata. This structure could be mapped with each directory (e.g. "EXIF" or "Nikon Makernote" or
+				"IPTC") as the name of a child node, with the EXIF tags values stored as either properties or child nodes.
+      </para>
+			<para>
+				To use this sequencer, simply include the <code>dna-sequencer-images</code> JAR
+				in your application and configure	the Sequencing Service to use this sequencer using something similar to:
+      </para>
+	    <programlisting>
+String name = "Image Sequencer";
+String desc = "Sequences image files to extract the characteristics of the image";
+String classname = "org.jboss.dna.sequencer.images.ImageMetadataSequencer";
+String[] classpath = null; // Use the current classpath
+String[] pathExpressions = {"//(*.(jpg|jpeg|gif|bmp|pcx|png|iff|ras|pbm|pgm|ppm|psd)[*])/jcr:content[@jcr:data] =&gt; /images/$1"};
+&SequencerConfig; sequencerConfig = new &SequencerConfig;(name, desc, classname, 
+                                                      classpath, pathExpressions);
+sequencingService.addSequencer(sequencerConfig);
+</programlisting>
+    </sect2>
+    <sect2 id="dna-sequencer-msoffice">
+      <title>Microsoft Office document sequencer</title>
+      <para>
+      	This sequencer is included in JBoss DNA and processes Microsoft Office documents, including Word documents, Excel spreadsheets,
+				and PowerPoint presentations.  With documents, the sequencer extracts the internal structure based on Heading styles.
+				With presentations, the sequencer extracts the slides, titles, text and slide thumbnails.
+				With spreadsheets, the sequencer extracts the names of the sheets.  And, the sequencer extracts for all the files the
+				general file information, including the name of the author, title, keywords, subject, comments, and various dates.
+      </para>
+			<para>
+				To use this sequencer, simply include the <code>dna-sequencer-msoffice</code> JAR and all of the
+				<ulink url="http://poi.apache.org/">POI</ulink> JARs
+				in your application and configure	the Sequencing Service to use this sequencer using something similar to:
+      </para>
+	    <programlisting>
+String name = "Microsoft Office Document Sequencer";
+String desc = "Sequences MS Office documents, including spreadsheets and presentations";
+String classname = "org.jboss.dna.sequencer.msoffice.MSOfficeMetadataSequencer";
+String[] classpath = null; // Use the current classpath
+String[] pathExpressions = {"//(*.(doc|docx|ppt|pps|xls)[*])/jcr:content[@jcr:data] =&gt; /msoffice/$1"};
+&SequencerConfig; sequencerConfig = new &SequencerConfig;(name, desc, classname, 
+                                                      classpath, pathExpressions);
+sequencingService.addSequencer(sequencerConfig);
+</programlisting>
+    </sect2>
+    <sect2 id="dna-sequencer-zip">
+      <title>ZIP archive sequencer</title>
+      <para>
+      	The ZIP file sequencer is included in JBoss DNA and extracts the files and folders contained in the ZIP archive file,
+				extracting the files and folders into the repository using JCR's <code>nt:file</code> and <code>nt:folder</code> node types.
+      </para>
+			<para>
+				To use this sequencer, simply include the <code>dna-sequencer-zip</code> JAR
+				in your application and configure	the Sequencing Service to use this sequencer using something similar to:
+      </para>
+	    <programlisting>
+String name = "ZIP Sequencer";
+String desc = "Sequences ZIP archives to extract the files and folders";
+String classname = "org.jboss.dna.sequencer.zip.ZipSequencer";
+String[] pathExpressions = {"//(*.zip[*])/jcr:content[@jcr:data] =&gt; /zips/$1"};
+&SequencerConfig; sequencerConfig = new &SequencerConfig;(name, desc, classname, 
+                                                      classpath, pathExpressions);
+this.sequencingService.addSequencer(sequencerConfig);
+</programlisting>
+    </sect2>
+    <sect2 id="dna-sequencer-java">
+      <title>Java source sequencer</title>
+      <para>
+				One of the sequencers that included in JBoss DNA is the <emphasis role="strong">dna-sequencer-java</emphasis> subproject.
+				This sequencer parses Java source code added to the repository and extracts the basic structure of the classes and enumerations 
+				defined in the code.
+				This structure includes: the package structures, class declarations, class and member attribute declarations,
+				class and member method declarations with signature (but not implementation logic), enumerations with each enumeration literal value,
+				annotations, and JavaDoc information for all of the above. 
+				After extracting this information from the source code, the sequencer then writes this structure into the repository,
+				where it can be further processed, analyzed, searched, navigated, or referenced.
+			</para>
+			<para>
+				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 Sequencing Service to use this sequencer using something similar to:
+      </para>
+	    <programlisting>
+String name = "Java Sequencer";
+String desc = "Sequences java files to extract the characteristics of the Java source";
+String classname = "org.jboss.dna.sequencer.java.JavaMetadataSequencer";
+String[] classpath = null; // Use the current classpath
+String[] pathExpressions = {"//(*.java[*])/jcr:content[@jcr:data] =&gt; /java/$1"};
+&SequencerConfig; sequencerConfig = new &SequencerConfig;(name, desc, classname, 
+                                                      classpath, pathExpressions);
+this.sequencingService.addSequencer(sequencerConfig);
+</programlisting>
+    </sect2>
+    <sect2 id="dna-sequencer-mp3">
+      <title>MP3 audio file sequencer</title>
+      <para>
+      	Another sequencer that is included in JBoss DNA is the <emphasis role="strong">dna-sequencer-mp3</emphasis> sequencer project.
+				This sequencer processes MP3 audio files added to a repository and extracts the <ulink url="http://www.id3.org/">ID3</ulink>
+			 	metadata for the file, including the track's title, author, album name, year, and comment.
+				After extracting this information from the audio files, the sequencer then writes this structure into the repository,
+				where it can be further processed, analyzed, searched, navigated, or referenced.
+      </para>
+			<para>
+				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 Sequencing Service to use this sequencer using something similar to:
+      </para>
+	    <programlisting>
+String name = "MP3 Sequencer";
+String desc = "Sequences MP3 files to extract the ID3 tags of the audio file";
+String classname = "org.jboss.dna.sequencer.mp3.Mp3MetadataSequencer";
+String[] pathExpressions = {"//(*.mp3[*])/jcr:content[@jcr:data] =&gt; /mp3s/$1"};
+&SequencerConfig; sequencerConfig = new &SequencerConfig;(name, desc, classname, 
+                                                      classpath, pathExpressions);
+this.sequencingService.addSequencer(sequencerConfig);
+</programlisting>
+    </sect2>
+    <sect2 id="dna-sequencer-cnd">
+      <title>JCR Compact Node Definition (CND) file sequencer</title>
+      <para>
+      	This sequencer processes JCR Compact Node Definition (CND) files
+				to extract the node definitions with their property definitions, and inserts these into the repository using JCR standard notation.
+      </para>
+    </sect2>
+        <sect2 id="dna-sequencer-jbpm-jpdl">
+      <title>jBPM JPDL file sequencer</title>
+      <para>
+        This sequencer is incomplete and is not currently usable.  The purpose is to sequence jBPM JPDL files to identify metadata
+        about processes, their actors, and their dependencies.
+      </para>
+    </sect2>
+    <sect2 id="dna-sequencer-xml">
+      <title>XML file sequencer</title>
+      <para>
+        This sequencer stores the structure and data of an XML file into the repository.
+      </para>
+    </sect2> 
+    
+  </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
+	  sequencers and to then configure JBoss DNA to use them in your own application.
+	  </para>
+	  <para>
+	  Creating a custom sequencer involves the following steps:
+	  <orderedlist>
+	    <listitem>
+	      <para>Create a Maven 2 project for your sequencer;</para>
+	    </listitem>
+	    <listitem>
+	      <para>Implement the &StreamSequencer; interface with your own implementation, and create unit tests to verify
+	      the functionality and expected behavior;</para>
+	    </listitem>
+	    <listitem>
+	      <para>Add the sequencer configuration to the JBoss DNA &SequencingService; in your application
+	      as described in the <link linkend="using_dna">previous chapter</link>; and</para>
+	    </listitem>
+	    <listitem>
+	      <para>Deploy the JAR file with your implementation (as well as any dependencies), and make them available to JBoss DNA
+	      in your application.</para>
+	    </listitem>
+	  </orderedlist>
+	  It's that simple.
+	  </para>
+	  <sect2 id="custom_sequencer_project">
+	    <title>Creating the Maven 2 project</title>
+	    <para>The first step is to create the Maven 2 project that you can use to compile your code and build the JARs.
+	    Maven 2 automates a lot of the work, and since you're already <link linkend="maven">set up to use Maven</link>,
+	    using Maven for your project will save you a lot of time and effort.  Of course, you don't have to use Maven 2, but then you'll
+	    have to get the required libraries and manage the compiling and building process yourself.</para>
+	    <note>
+	      <para>JBoss DNA may provide in the future a Maven archetype for creating sequencer projects.  If you'd find this useful
+	        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 sequencer project.
+					The <emphasis role="strong">dna-sequencer-images</emphasis> project is a small, self-contained sequencer implementation that
+		    	has only the minimal dependencies.  
+		    	See the subversion repository: <ulink url="&Subversion;trunk/extensions/dna-sequencer-images/">&Subversion;trunk/extensions/dna-sequencer-images/</ulink>
+		    </para>
+		  </note>
+	    <para>You can create your Maven project any way you'd like.  For examples, see the <ulink url="http://maven.apache.org/guides/getting-started/index.html#How_do_I_make_my_first_Maven_project">Maven 2 documentation</ulink>.  
+	    Once you've done that, just add the dependencies in your project's <code>pom.xml</code> dependencies section:</para>
+	  	<programlisting role="XML"><![CDATA[
+<dependency>
+  <groupId>org.jboss.dna</groupId>
+  <artifactId>dna-common</artifactId>
+  <version>0.3</version>
+</dependency>
+<dependency>
+  <groupId>org.jboss.dna</groupId>
+  <artifactId>dna-graph</artifactId>
+  <version>0.3</version>
+</dependency>
+	 ]]></programlisting>
+			<para>These are minimum dependencies required for compiling a sequencer.  Of course, you'll have to add
+	  		other dependencies that your sequencer needs.</para>
+	  	<para>As for testing, you probably will want to add more dependencies, such as those listed here:</para>
+			<programlisting role="XML"><![CDATA[
+<dependency>
+  <groupId>org.jboss.dna</groupId>
+  <artifactId>dna-graph</artifactId>
+  <version>0.5</version>
+  <type>test-jar</type>
+  <scope>test</scope>
+</dependency>
+<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>
+<!-- Logging with Log4J -->
+<dependency>
+  <groupId>org.slf4j</groupId>
+  <artifactId>slf4j-log4j12</artifactId>
+  <version>1.4.3</version>
+  <scope>test</scope>
+</dependency>
+<dependency>
+  <groupId>log4j</groupId>
+  <artifactId>log4j</artifactId>
+  <version>1.2.14</version>
+  <scope>test</scope>
+</dependency>
+	 ]]></programlisting>
+	  	<para>Testing JBoss DNA sequencers does not require a JCR repository or the JBoss DNA services.  (For more detail,
+	  		see the <link linkend="testing_custom_sequencers">testing section</link>.)  However, if you want to do
+	  		integration testing with a JCR repository and the JBoss DNA services, you'll need additional dependencies for these libraries.</para>
+			<programlisting role="XML"><![CDATA[
+<!-- JBoss DNA JCR Repository -->
+<dependency>
+  <groupId>org.jboss.dna</groupId>
+  <artifactId>dna-jcr</artifactId>
+  <version>0.5</version>
+  <scope>test</scope>
+</dependency>
+<!-- Java Content Repository API -->
+<dependency>
+  <groupId>javax.jcr</groupId>
+  <artifactId>jcr</artifactId>
+  <version>1.0.1</version>
+  <scope>test</scope>
+</dependency>
+	 ]]></programlisting>
+	  <para>At this point, your project should be set up correctly, and you're ready to move on to 
+	  	<link linkend="custom_sequencer_implementation">writing the Java implementation</link> for your sequencer.</para>
+	  </sect2>
+	  <sect2 id="custom_sequencer_implementation">
+	    <title>Implementing the StreamSequencer interface</title>
+	    <para>After creating the project and setting up the dependencies, the next step is to create a Java class that implements
+	    	the &StreamSequencer; interface.  This interface is very straightforward and involves a single method:</para>
+	    <programlisting>
+public interface &StreamSequencer; {
+
+    /**
+     * Sequence the data found in the supplied stream, placing the output 
+     * information into the supplied map.
+     *
+     * @param stream the stream with the data to be sequenced; never null
+     * @param output the output from the sequencing operation; never null
+     * @param context the context for the sequencing operation; never null
+     */
+    void sequence( &InputStream; stream, &SequencerOutput; output, &SequencerContext; context );
+}
+</programlisting>
+	    <para>The job of a stream sequencer is to process the data in the supplied stream, and place into the &SequencerOutput;
+	    any information that is to go into the JCR repository.  JBoss DNA figures out when your sequencer should be called
+	    (of course, using the sequencing configuration you'll add in a bit), and then makes sure the generated information
+	    is saved in the correct place in the repository.  
+	    </para>
+	    <para>The &SequencerContext; provides information about
+	    the current sequencing operation, including the location and properties of the node being sequenced, the MIME type
+	    of the node being sequenced, and a location to record problems that aren't severe enough to warrant throwing an exception.
+	    </para>
+	    <para>The &SequencerOutput; class is fairly easy to use.  There are basically two methods you need to call.
+	    One method sets the property values, while the other sets references to other nodes in the repository.  Use these
+	    methods to describe the properties of the nodes you want to create, using relative paths for the nodes and
+	    valid JCR property names for properties and references.  JBoss DNA will ensure that nodes are created or updated
+	    whenever they're needed.</para>
+	    <programlisting>
+public interface &SequencerOutput; {
+
+  /**
+   * Set the supplied property on the supplied node.  The allowable
+   * values are any of the following:
+   *   - primitives (which will be autoboxed)
+   *   - String instances
+   *   - String arrays
+   *   - byte arrays
+   *   - InputStream instances
+   *   - Calendar instances
+   *
+   * @param nodePath the path to the node containing the property; 
+   * may not be null
+   * @param property the name of the property to be set
+   * @param values the value(s) for the property; may be empty if 
+   * any existing property is to be removed
+   */
+  void setProperty( String nodePath, String property, Object... values );
+
+  /**
+   * Set the supplied reference on the supplied node.
+   *
+   * @param nodePath the path to the node containing the property; 
+   * may not be null
+   * @param property the name of the property to be set
+   * @param paths the paths to the referenced property, which may be
+   * absolute paths or relative to the sequencer output node;
+   * may be empty if any existing property is to be removed
+   */
+  void setReference( String nodePath, String property, String... paths );
+}
+</programlisting>
+	    <para>JBoss DNA will create nodes of type <code>nt:unstructured</code> unless you specify the value for the
+	      <code>jcr:primaryType</code> property.  You can also specify the values for the <code>jcr:mixinTypes</code> property
+	      if you want to add mixins to any node.</para>
+	    <para>For a complete example of a sequencer, let's look at the &ImageMetadataSequencer; 
+				implementation:</para>
+	    <programlisting>
+public class &ImageMetadataSequencer; implements &StreamSequencer; {
+
+    public static final String METADATA_NODE = "image:metadata";
+    public static final String IMAGE_PRIMARY_TYPE = "jcr:primaryType";
+    public static final String IMAGE_MIXINS = "jcr:mixinTypes";
+    public static final String IMAGE_MIME_TYPE = "jcr:mimeType";
+    public static final String IMAGE_ENCODING = "jcr:encoding";
+    public static final String IMAGE_FORMAT_NAME = "image:formatName";
+    public static final String IMAGE_WIDTH = "image:width";
+    public static final String IMAGE_HEIGHT = "image:height";
+    public static final String IMAGE_BITS_PER_PIXEL = "image:bitsPerPixel";
+    public static final String IMAGE_PROGRESSIVE = "image:progressive";
+    public static final String IMAGE_NUMBER_OF_IMAGES = "image:numberOfImages";
+    public static final String IMAGE_PHYSICAL_WIDTH_DPI = "image:physicalWidthDpi";
+    public static final String IMAGE_PHYSICAL_HEIGHT_DPI = "image:physicalHeightDpi";
+    public static final String IMAGE_PHYSICAL_WIDTH_INCHES = "image:physicalWidthInches";
+    public static final String IMAGE_PHYSICAL_HEIGHT_INCHES = "image:physicalHeightInches";
+
+    /**
+     * {@inheritDoc}
+     */
+    public void sequence( &InputStream; stream, &SequencerOutput; output, 
+                          &SequencerContext; context ) {
+        &ImageMetadata; metadata = new &ImageMetadata;();
+        metadata.setInput(stream);
+        metadata.setDetermineImageNumber(true);
+        metadata.setCollectComments(true);
+
+        // Process the image stream and extract the metadata ...
+        if (!metadata.check()) {
+            metadata = null;
+        }
+        // Generate the output graph if we found useful metadata ...
+        if (metadata != null) {
+            // Place the image metadata into the output map ...
+            output.setProperty(METADATA_NODE, IMAGE_PRIMARY_TYPE, "image:metadata");
+            // output.psetProperty(METADATA_NODE, IMAGE_MIXINS, "");
+            output.setProperty(METADATA_NODE, IMAGE_MIME_TYPE, metadata.getMimeType());
+            // output.setProperty(METADATA_NODE, IMAGE_ENCODING, "");
+            output.setProperty(METADATA_NODE, IMAGE_FORMAT_NAME, metadata.getFormatName());
+            output.setProperty(METADATA_NODE, IMAGE_WIDTH, metadata.getWidth());
+            output.setProperty(METADATA_NODE, IMAGE_HEIGHT, metadata.getHeight());
+            output.setProperty(METADATA_NODE, IMAGE_BITS_PER_PIXEL, metadata.getBitsPerPixel());
+            output.setProperty(METADATA_NODE, IMAGE_PROGRESSIVE, metadata.isProgressive());
+            output.setProperty(METADATA_NODE, IMAGE_NUMBER_OF_IMAGES, metadata.getNumberOfImages());
+            output.setProperty(METADATA_NODE, IMAGE_PHYSICAL_WIDTH_DPI, metadata.getPhysicalWidthDpi());
+            output.setProperty(METADATA_NODE, IMAGE_PHYSICAL_HEIGHT_DPI, metadata.getPhysicalHeightDpi());
+            output.setProperty(METADATA_NODE, IMAGE_PHYSICAL_WIDTH_INCHES, metadata.getPhysicalWidthInch());
+            output.setProperty(METADATA_NODE, IMAGE_PHYSICAL_HEIGHT_INCHES, metadata.getPhysicalHeightInch());
+        }
+    }
+}
+</programlisting>
+	    <para>
+	    Notice how the image metadata is extracted and the output graph is generated.  A single node is created with the name <code>image:metadata</code>
+	    and with the <code>image:metadata</code> node type.  No mixins are defined for the node, but several properties are set on the node
+	    using the values obtained from the image metadata.  After this method returns, the constructed graph will be saved to the repository
+	    in all of the places defined by its configuration.  (This is why only relative paths are used in the sequencer.)
+	    </para>
+	  </sect2>
+	  <sect2 id="testing_custom_sequencers">
+	    <title>Testing custom sequencers</title>
+	    <para>The sequencing framework was designed to make testing sequencers much easier.  In particular, the
+	    &StreamSequencer; interface does not make use of the JCR API.  So instead of requiring a fully-configured
+	    JCR repository and JBoss DNA system, unit tests for a sequencer can focus on testing that the content is
+	    processed correctly and the desired output graph is generated.</para>
+	    <note>
+	      <para>For a complete example of a sequencer unit test, see the <code>ImageMetadataSequencerTest</code> unit test
+	      in the <code>org.jboss.dna.sequencer.images</code> package of the <code>dna-sequencers-image</code> project.
+	      </para>
+	    </note>
+	    <para>The following code fragment shows one way of testing a sequencer, using JUnit 4.4 assertions and 
+	      some of the classes made available by JBoss DNA.  Of course,
+	      this example code does not do any error handling and does not make all the assertions a real test would.</para>
+	    <programlisting>
+&StreamSequencer; sequencer = new &ImageMetadataSequencer;();
+&MockSequencerOutput; output = new &MockSequencerOutput;();
+&MockSequencerContext; context = new &MockSequencerContext;();
+&InputStream; stream = null;
+try {
+    stream = this.getClass().getClassLoader().getResource("caution.gif").openStream();
+    sequencer.sequence(stream,output,context);   // writes to 'output'
+    assertThat(output.getPropertyValues("image:metadata", "jcr:primaryType"), 
+               is(new Object[] {"image:metadata"}));
+    assertThat(output.getPropertyValues("image:metadata", "jcr:mimeType"), 
+               is(new Object[] {"image/gif"}));
+    // ... make more assertions here
+    assertThat(output.hasReferences(), is(false));
+} finally {
+    stream.close();
+}
+</programlisting>
+	  <para>It's also useful to test that a sequencer produces no output for something it should not understand:</para>
+	    <programlisting>
+&Sequencer; sequencer = new &ImageMetadataSequencer;();
+&MockSequencerOutput; output = new &MockSequencerOutput;();
+&MockSequencerContext; context = new &MockSequencerContext;();
+&InputStream; stream = null;
+try {
+    stream = this.getClass().getClassLoader().getResource("caution.pict").openStream();
+    sequencer.sequence(stream,output,context);   // writes to 'output'
+    assertThat(output.hasProperties(), is(false));
+    assertThat(output.hasReferences(), is(false));
+} finally {
+    stream.close();
+}
+</programlisting>
+	    <para>These are just two simple tests that show ways of testing a sequencer.  Some tests may get quite involved,
+	    especially if a lot of output data is produced.  
+	    </para>
+	    <para>It may also be useful to create some integration tests
+	    that <link linkend="using_dna">configure JBoss DNA</link> to use a custom sequencer, and to then upload
+	    content using the JCR API, verifying that the custom sequencer did run.  However, remember that JBoss DNA
+	    runs sequencers asynchronously in the background, and you must synchronize your tests to ensure that the
+	    sequencers have a chance to run before checking the results.  (One way of doing this (although, granted, not always reliable) is to wait for a second
+	    after uploading your content, shutdown the &SequencingService; and await its termination,
+	    and then check that the sequencer output has been saved to the JCR repository.  For an example of this technique,
+	    see the <code>SequencingClientTest</code> unit test in the example application.)
+	    </para>  
+	  </sect2>
+	  <sect2 id="deploying_custom_sequencers">
+	    <title>Deploying custom sequencers</title>
+	    <para>The first step of deploying a sequencer consists of adding/changing the sequencer configuration (e.g., &SequencerConfig;)
+	    in the &SequencingService;.  This was covered in the <link linkend="sequencing_service">previous chapter</link>.
+	    </para>
+	    <para>
+	    The second step is to make the sequencer implementation available to JBoss DNA.  At this time, the JAR containing 
+	    your new sequencer, as well as any JARs that your sequencer depends on, should be placed on your application classpath.</para>
+	    <note>
+	      <para>A future goal of JBoss DNA is to allow sequencers, connectors, and other extensions to be easily deployed into
+	        a runtime repository.  This process will not only be much simpler, but it will also provide JBoss DNA 
+	        with the information necessary to update configurations and create the appropriate class loaders for each extension.
+	        Having separate class loaders for each extension helps prevent the pollution of the common classpath, 
+	        facilitates an isolated runtime environment to eliminate any dependency conflicts, and may potentially
+	        enable hot redeployment of newer extension versions.
+	      </para>
+	    </note>
+	  </sect2>
+  </sect1>
+	<sect1>
+		<title>Summary</title>
+		<para>
+			In this chapter, we described how JBoss DNA sequences files as they're uploaded into a repository.
+			And one of the things we mentioned was that each sequencer is handed (with other inputs) the MIME type of the file it is to process.
+			How does DNA know what the MIME type is?
+			JBoss DNA uses <emphasis>MIME type detectors</emphasis>, and this is the topic of the <link linkend="mimetypes">next chapter</link>.
+		</para>
+	</sect1>
+</chapter>


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

Copied: trunk/docs/reference/src/main/docbook/en-US/content/developers/testing.xml (from rev 994, trunk/docs/reference/src/main/docbook/en-US/content/testing.xml)
===================================================================
--- trunk/docs/reference/src/main/docbook/en-US/content/developers/testing.xml	                        (rev 0)
+++ trunk/docs/reference/src/main/docbook/en-US/content/developers/testing.xml	2009-06-08 14:57:17 UTC (rev 995)
@@ -0,0 +1,152 @@
+<?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="testing">
+  <title>Testing</title>
+  <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
+		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>
+  <sect1 id="unit-tests">
+    <title>Unit tests</title>
+    <para>
+    	<emphasis role="strong">Unit tests</emphasis> verify the behavior of a single class (or small set of classes) in isolation
+			from other classes.
+ 			We use the JUnit 4.4 testing framework, which has significant improvements over earlier versions and makes
+			it very easy to quickly write unit tests with little extra code.  We also frequently use the Mockito library
+			to help create mock implementations of other classes that are not under test but are used in the tests.
+    </para>
+  	<para>
+			Unit tests should generally run quickly and should not require large assemblies of components.  Additionally,
+			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.
+		</para>
+		<para>
+			Developers are expected to run all of the JBoss DNA unit tests in their local environment before committing changes to SVN.
+			So, if you're a developer and you've made changes to your local copy of the source, you can run those tests that are
+			related to your changes using your IDE or with Maven (or any other mechanism).  But before you commit your changes, 
+			you are expected to run a full Maven build using <code>mvn clean install</code> (in the "trunk/" directory).
+			Please do <emphasis>not</emphasis> rely upon continuous integration to run all of the tests for you - the CI
+			system is there to catch the occasional mistakes and to also run the <link linkend="integration-tests">integration tests</link>.
+    </para>
+  </sect1>
+  <sect1 id="integration-tests">
+    <title>Integration tests</title>
+    <para>
+    	While <link linkend="unit-tests">unit tests</link> test individual classes in (relative) isolation, the purpose of
+			<emphasis role="strong">integration tests</emphasis> are to verify that assemblies of classes and components are
+			behaving correctly.  These assemblies are often the same ones that end users will actually use.  In fact,
+			integration tests are executed during the "integration-test" phase of the standard
+			<ulink url="http://maven.apache.org/guides/introduction/introduction-to-the-lifecycle.html">Maven lifecycle</ulink>,
+			meaning they are executed against the packaged JARs and artifacts of the project.
+    </para>
+		<para>
+			Integration tests also use the JUnit 4.4 framework, so they are again easy to write and follow the same pattern
+			as unit tests. However, because they're working with larger assemblies of components, they often will take longer
+			to set up, longer to run, and longer to tear down.  They also may require initializing "external resources", like
+			databases or servers.  
+		</para>
+		<para>
+			Note, that while external resources may be required, care should be taken to minimize these dependencies and to
+			ensure that most (if not all) integration tests may be run by anyone who downloads the source code.  This means
+			that these external resources should be available and set up within the tests.  For example, use in-memory databases
+			where possible.  Or, if a database is required, use an open-source database (e.g., MySQL or PostgreSQL).  And when
+			these external resources are not available, it should be obvious from the test class names and/or test method names 
+			that it involved an external resource (e.g., "<code>MySqlConnectorIntegrationTest.shouldFindNodeStoredInDatabase()</code>").
+		</para>
+  </sect1>
+  <sect1 id="writing-tests">
+    <title>Writing tests</title>
+		<para>
+			As mentioned in <link linkend="methodology">the introduction</link>, the JBoss DNA project doesn't follow any one methodology
+			or process.  Instead, we simply have a goal that as much code as possible is tested to ensure it behaves as expected.
+			Do we expect 100% of the code is covered by automated tests?  No, but we do want to test as much as we can.
+			Maybe a simple JavaBean class doesn't need many tests, but any class with non-trivial logic should be tested.
+		</para>
+		<para>
+			We do encourage writing tests either before or while you write the code.  Again, we're not blindly following a methodology.
+			Instead, there's a very practical reason: writing the tests early on helps you write classes that are testable.  
+			If you wait until after the class (or classes) are done, you'll probably find that it's not easy to test all
+			of the logic (especially the complicated logic).
+		</para>
+		<para>
+			Another suggestion is to write tests so that they specify and verify the behavior that is expected from a class or component.
+			One challenge developers often have is knowing what they should even test and what the tests should look like.
+			This is where <emphasis role="strong"><ulink url="http://behaviour-driven.org/">Behavior-driven development (BDD)</ulink></emphasis>
+			helps out.  If you think about what a class' behaviors are supposed to be (e.g., requirements), simply capture those
+			requirements as test methods (with no implementations).  For example, a test class for sequencer 
+			implementation might have a test method	<code>shouldNotThrowAnErrorWhenTheSuppliedStreamIsNull() { }</code>.  Then, after you enumerate
+			all the requirements you can think of, go back and start implementing the test methods.
+		</para>
+		<para>
+			If you look at the existing test cases, you'll find that the names of the unit and integration tests in JBoss DNA 
+			follow a naming style, where the test method names are readable sentences.  Actually, we try to name the test methods
+			<emphasis>and</emphasis> the test classes such that they form a concisely-worded requirement.  For example,
+		</para>
+		<programlisting>InMemorySequencerTest.shouldNotThrowAnErrorWhenTheSuppliedStreamIsNull()</programlisting>
+		<para>
+			is easily translated into a readable requirement:
+		</para>
+		<programlisting>InMemorySequencer should not throw an error when the supplied stream is null.</programlisting>
+		<para>
+			In fact, at some point in the future, we'd like to process the source to automatically generate a list of the behavior specifications
+			that are asserted by the tests.
+		</para>
+		<para>
+			But for now, we write tests - a lot of them.  And by following a few simple conventions and practices, we're able
+			to do it quickly and in a way that makes it easy to understand what the code is supposed to do (or not do).
+		</para>
+	</sect1>
+  <sect1 id="tck-tests">
+    <title>Technology Compatibility Kit (TCK) tests</title>
+    <para>
+    	Many Java specifications provide TCK test suites that can be used to check or verify that an implementation
+      correctly implements the API or SPI defined by the specification.  These TCK tests vary by technology, but
+			<ulink url="&JSR170;">JSR-170</ulink> does provide TCK tests that ensure that a JCR repository implementation exhibits the correct and expected
+			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>
+		<para>
+			JBoss DNA also frequently runs the JCR unit tests from the Apache Jackrabbit project.  (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>
+  </sect1>
+</chapter>


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

Copied: trunk/docs/reference/src/main/docbook/en-US/content/developers/tools.xml (from rev 994, trunk/docs/reference/src/main/docbook/en-US/content/development_tools.xml)
===================================================================
--- trunk/docs/reference/src/main/docbook/en-US/content/developers/tools.xml	                        (rev 0)
+++ trunk/docs/reference/src/main/docbook/en-US/content/developers/tools.xml	2009-06-08 14:57:17 UTC (rev 995)
@@ -0,0 +1,502 @@
+<?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="development-tools">
+  <title>Developer tools</title>
+  <para>
+		The JBoss DNA project uses <link linkend="maven">Maven</link> as its primary build tool, <link linkend="svn">Subversion</link>
+		for its source code repository, <link linkend="jira">JIRA</link> for the issue management and bug tracking system,
+		and <link linkend="hudson">Hudson</link> for the continuous integration system.  We do not stipulate a specific integrated
+		development environment (IDE), although most of us use <link linkend="eclipse">Eclipse</link> and rely upon the code formatting
+		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.
+	</para>
+	<sect1 id="jdk">
+		<title>JDK</title>
+		<para>
+			Currently, JBoss DNA is developed and built using <ulink url="http://java.sun.com/javase/downloads/index_jdk5.jsp">JDK 5</ulink>.
+			So if you're trying to get JBoss DNA to compile locally, you should make sure you have the JDK 5 installed and are using it.
+			If you're a contributor, you should make sure that you're using JDK 5 before committing any changes.  
+		</para>
+		<note>
+			<para>
+				You should be able to use the <ulink url="http://java.sun.com/javase/downloads/index.jsp">latest JDK</ulink>,
+				which is currently JDK 6.  It is possible to build JBoss DNA using JDK 6 without any code changes, but it's 
+				not our official JDK (yet).
+			</para>
+			<para>
+				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.
+			</para>
+		</note>
+		<para>
+			When installing a JDK, simply follow the procedure for your particular platform.  On most platforms, this should set the
+			<code>JAVA_HOME</code> environment variable.  But if you run into any problems, first check that this environment
+			variable was set to the correct location, and then check that you're running the version you expect by running
+			the following command:
+		</para>
+		<programlisting>$ java -version</programlisting>
+		<para>
+			If you don't see the correct version, double-check your JDK installation.
+		</para>
+	</sect1>
+	<sect1 id="jira">
+		<title>JIRA</title>
+		<para>
+			JBoss DNA uses <ulink url="&JIRA;">JIRA</ulink> as its bug tracking, issue tracking, and project management tool.
+			This is a browser-based tool, with very good functionality for managing the different tasks.  It also serves as
+			the community's roadmap, since we can define new features and manage them along side the bugs and other issues.
+			Although most of the issues have been created by community members, we encourage any users to suggest new features,
+			log defects, or identify shortcomings in JBoss DNA.
+		</para>
+		<para>
+			The JBoss DNA community also encourages its members to work only issues that are managed in JIRA, and preferably those
+			that are targeted to the current release effort.  If something isn't in JIRA but needs to get done, then create an 
+			issue before you start working on the code changes.  Once you have code changes, you can upload a patch to the JIRA issue
+			if the change is complex, if you want someone to review it, or if you don't have commit privileges and have fixed
+			a bug.
+		</para>
+	</sect1>
+	<sect1 id="svn">
+		<title>Subversion</title>
+		<para>JBoss DNA uses Subversion as its source code management system, and specifically the instance at 
+			<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
+		 	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
+			particular platform.
+		</para>
+		<para>
+			Here are some useful URLs for the JBoss DNA Subversion:
+		</para>
+		<table frame='all'>
+			<title>SVN URLs for JBoss DNA</title>
+			<tgroup cols='2' align='left' colsep='1' rowsep='1'>
+	      <colspec colname='c1' colwidth="1*"/>
+	      <colspec colname='c2' colwidth="1*"/>
+				<thead>
+					<row>
+			  		<entry>Repository</entry>
+			  		<entry>URL</entry>
+					</row>
+				</thead>
+				<tbody>
+					<row>
+						<entry>Anonymous Access URL</entry>
+						<entry><ulink url="&Subversion;trunk/">&Subversion;trunk/</ulink></entry>
+					</row>
+					<row>
+						<entry>Secure Developer Access URL</entry>
+						<entry><ulink url="&Fisheye;trunk/">&Fisheye;trunk/</ulink></entry>
+					</row>
+					<row>
+						<entry>FishEye Code Browser</entry>
+						<entry><ulink url="&SecureSubversion;trunk/">&SecureSubversion;trunk/</ulink></entry>
+					</row>
+				</tbody>
+			</tgroup>
+		</table>
+		<para>
+			When committing to SVN, be sure to include in a commit comment that includes the JIRA issue that the commit applies to and a very
+			good and thorough description of what was done.  It only takes a minute or two to be very clear about the change.  And including
+			the JIRA issue (e.g., "DNA-123") in the comment allows the JIRA system to track the changes that have been made for each issue.
+		</para>
+		<para>
+			Also, any single SVN commit should apply to one and only one JIRA issue.  Doing this helps ensure that each commit is atomic
+			and focused on a single activity.  There are exceptions to this rule, but they are rare.
+		</para>
+		<para>
+			Sometimes you may have some local changes that you don't want to (or aren't allowed to) commit.  You can make a patch file
+			and upload it to the JIRA issue, allowing other committers to review the patch.  However, to ensure that patches are easily
+			applied, please use SVN to create the patch.  To do this, simply do the following in the top of the codebase (e.g., the 
+			<code>trunk</code> directory):
+		</para>
+		<programlisting>$ svn diff . > ~/DNA-000.patch</programlisting> 
+		<para>
+			where <code>DNA-000</code> represents the DNA issue number.  Note that the above command places the patch file in your home directory,
+			but you can place the patch file anywhere.  Then, simply use JIRA to attach the patch file to the particular issue, also adding
+			a comment that describes the version number against which the patch was created.
+		</para>
+		<para>
+			To apply a patch, you usually want to start with a workspace that has no changes.  Download the patch file, then issue the
+			following command (again, from the top-level of the workspace):
+		</para>
+		<programlisting>$ patch -E -p0 &lt; ~/DNA-000.patch</programlisting> 
+		<para>
+			The "-E" option specifies to delete any files that were made empty by the application of the patch, and the "-p0" option instructs
+			the patch tool to not change any of the paths.  After you run this command, your working area should have the changes defined
+			by the patch.
+		</para>
+	</sect1>
+	<sect1 id="maven">
+		<title>Maven</title>
+		<para>JBoss DNA uses Maven 2 for its build system, as is 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>
+		<para>
+      To use Maven with JBoss DNA, you'll need to have <link linkend="jdk">JDK 5 or 6</link> and Maven 2.0.9 (or higher).</para>
+		<para>
+      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>
+  <profiles>
+    <profile>
+      <id>jboss.repository</id>
+      <activation>
+        <property>
+          <name>!jboss.repository.off</name>
+        </property>
+      </activation>
+      <repositories>
+        <repository>
+          <id>snapshots.jboss.org</id>
+          <url>http://snapshots.jboss.org/maven2</url>
+          <snapshots>
+            <enabled>true</enabled>
+          </snapshots>
+        </repository>
+        <repository>
+          <id>repository.jboss.org</id>
+          <url>http://repository.jboss.org/maven2</url>
+          <snapshots>
+            <enabled>false</enabled>
+          </snapshots>
+        </repository>
+      </repositories>
+      <pluginRepositories>
+        <pluginRepository>
+          <id>repository.jboss.org</id>
+          <url>http://repository.jboss.org/maven2</url>
+          <snapshots>
+            <enabled>false</enabled>
+          </snapshots>
+        </pluginRepository>
+        <pluginRepository>
+          <id>snapshots.jboss.org</id>
+          <url>http://snapshots.jboss.org/maven2</url>
+          <snapshots>
+            <enabled>true</enabled>
+          </snapshots>
+        </pluginRepository>
+      </pluginRepositories>
+    </profile>
+  </profiles>
+</settings>
+]]></programlisting>
+		<para>This profile informs Maven of the two JBoss repositories (<ulink url="http://repository.jboss.org/maven2">snapshots</ulink> 
+		  and <ulink url="http://snapshots.jboss.org/maven2">releases</ulink>) that contain all of the JARs for JBoss DNA and all dependent libraries.
+		</para>
+		<para>While you're adding <code>$MAVEN_HOME/bin</code> to your path, you should also set the <code>$MAVEN_OPTS</code> environment variable
+		  to "<code>-Xmx256m</code>".  If you don't do this, you'll likely see an <code>java.lang.OutOfMemoryError</code> sometime during a full
+		  build.
+		</para>
+		<note>
+			<para>
+				The JBoss Maven repository provides a central location for not only the artifacts produced by the JBoss.org projects (well, at least those
+				that use Maven), but also is where those projects can place the artifacts that they depend on.  JBoss DNA has a policy that
+				the <emphasis>source code and JARs</emphasis> for <emphasis>all</emphasis> dependencies <emphasis>must</emphasis> be loaded into the 
+				JBoss Maven repository.  It may be a little bit more work for the developers, but it does help ensure that developers have easy
+				access to the source and that the project (and dependencies) can always be rebuilt when needed.
+			</para>
+			<para>
+				For more information about the JBoss Maven repository, including instructions for adding source and JAR artifacts, 
+				see the <ulink url="http://wiki.jboss.org/wiki/Maven">JBoss.org Wiki</ulink>.
+			</para>
+		</note>
+		<para>
+			There are just a few commands that are useful for building JBoss DNA (and it's <link linkend="modules">subprojects</link>).
+			Usually, these are issued while at the top level of the code (usually just below <code>trunk/</code>), although issuing
+			them inside a subproject just applies to that subproject.
+		</para>
+		<table frame='all'>
+			<title>Useful Maven commands</title>
+			<tgroup cols='2' align='left' colsep='1' rowsep='1'>
+	      <colspec colname='c1' colwidth="1*"/>
+	      <colspec colname='c2' colwidth="1*"/>
+				<thead>
+					<row>
+			  		<entry>Command</entry>
+			  		<entry>Description</entry>
+					</row>
+				</thead>
+				<tbody>
+					<row>
+						<entry><code>mvn clean</code></entry>
+						<entry>Clean up all built artifacts (e.g., the <code>target/</code> directory in each project)</entry>
+					</row>
+					<row>
+						<entry><code>mvn clean install</code></entry>
+						<entry>Clean up all built artifacts, then compile, run the unit tests, and install the resulting JAR artifact(s)
+							into your local Maven repository (e.g, usually <code>~/.m2/repository</code>).
+						</entry>
+					</row>
+				</tbody>
+			</tgroup>
+		</table>
+	</sect1>
+	<sect1 id="hudson">
+		<title>Continuous integration with Hudson</title>
+		<para>JBoss DNA's continuous integration is done with several Hudson jobs on <ulink url="http://www.jboss.org">JBoss.org</ulink>.
+		  These jobs run periodically and basically run the Maven build process.  Any build failures or test failures are reported,
+		  as are basic statistics and history for each job.
+		</para>
+		<table frame='all'>
+			<title>Continuous integration jobs</title>
+			<tgroup cols='2' align='left' colsep='1' rowsep='1'>
+	      <colspec colname='c1' colwidth="1*"/>
+	      <colspec colname='c2' colwidth="1*"/>
+				<thead>
+					<row>
+			  		<entry>Job</entry>
+			  		<entry>Description</entry>
+					</row>
+				</thead>
+				<tbody>
+					<row>
+						<entry><ulink url="http://hudson.jboss.org/hudson/job/DNA%20continuous%20on%20JDK1.5/">Continuous on JDK 5</ulink></entry>
+						<entry>Continuous build that runs after changes are committed to SVN.  SVN is polled every 15 minutes.</entry>
+					</row>
+					<row>
+						<entry><ulink url="http://hudson.jboss.org/hudson/job/DNA%20nightly%20integration%20on%20JDK1.5/">Nightly on JDK 5</ulink></entry>
+						<entry>Build that runs every night (usually around 2 a.m. EDT), regardless of whether changes have been committed to SVN
+							since the previous night.</entry>
+					</row>
+				</tbody>
+			</tgroup>
+		</table>
+	</sect1>
+	<sect1 id="eclipse">
+		<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"), 
+			available from <ulink url="http://www.eclipse.org/">Eclipse.org</ulink>.  Simply follow the instructions for your platform.
+		</para>
+		<para>
+			After Eclipse is installed, create a new workspace.  Before importing the JBoss DNA projects, import (via 
+			<emphasis role="strong">File->Import->Preferences</emphasis>) the subset of the Eclipse preferences by importing the 
+			<code>eclipse-preferences.epf</code> file (located under <code>trunk</code>). Then, open the Eclipse preferences and 
+			open the <emphasis role="strong">Java->Code Style-> Formatter</emphasis> preference page, and press the "Import" button and
+			choose the <code>eclipse-code-formatter-profile.xml</code> file (also located under <code>trunk</code>).  This will load the code
+			formatting preferences for the JBoss DNA project.
+		</para>
+		<para>
+			Then install Eclipse plugins for SVN and Maven.  (Remember, you will have to restart Eclipse after installing them.)
+			We use the following plugins:
+		</para>
+		<table frame='all'>
+			<title>Eclipse Subversion Plugins</title>
+			<tgroup cols='2' align='left' colsep='1' rowsep='1'>
+	      <colspec colname='c1' colwidth="1*"/>
+	      <colspec colname='c2' colwidth="1*"/>
+				<thead>
+					<row>
+			  		<entry>Eclipse Plugins</entry>
+						<entry>Update Site URLs</entry>
+					</row>
+				</thead>
+				<tbody>
+					<row>
+						<entry>Subversive SVN Client</entry>
+						<entry>
+							<ulink url="http://www.polarion.org/projects/subversive/download/eclipse/2.0/update-site/">http://www.polarion.org/projects/subversive/download/eclipse/2.0/update-site/</ulink>
+						  <ulink url="http://www.polarion.org/projects/subversive/download/integrations/update-site/">http://www.polarion.org/projects/subversive/download/integrations/update-site/</ulink>
+						</entry>
+					</row>
+					<row>
+						<entry>Maven Integration for Eclipse</entry>
+						<entry><ulink url="http://m2eclipse.sonatype.org/update/">http://m2eclipse.sonatype.org/update/</ulink></entry>
+					</row>
+				</tbody>
+			</tgroup>
+		</table>
+		<para>
+			After you check out the JBoss DNA codebase, you can import the JBoss DNA Maven projects into Eclipse as Eclipse projects.
+			To do this, go to "File->Import->Existing Projects", navigate to the <code>trunk/</code> folder in the import wizard,
+			and then check each of the <link linkend="modules">subprojects</link> that you want to have in your workspace.
+			Don't forget about the projects under <code>extensions/</code> or <code>docs/</code>.
+		</para>
+	</sect1>
+	<sect1 id="releasing">
+		<title>Releasing</title>
+		<para>
+			This section outlines the basic process of releasing JBoss DNA.  This <emphasis role="strong">must</emphasis> be done
+			either by the project lead or only after communicating with the project lead.
+		</para>
+		<para>
+			Before continuing, your local workspace should contain no changes and should be a perfect reflection of Subversion.
+			You can verify this by getting the latest from Subversion
+		</para>
+		<programlisting>$ svn update</programlisting> 
+		<para>
+			and ensuring that you have no additional changes with
+		</para>
+		<programlisting>$ svn status</programlisting>
+		<para>
+			You may also want to note the revision number for use later on in the process.  The release number is returned by
+			the <code>svn update</code> command, but may also be found using
+		</para>
+		<programlisting>$ svn info</programlisting>
+		<para>
+			At this point, you're ready to verify that everything builds normally.
+		</para>
+		<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.
+				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>
+			<note>
+				<para>
+					Before running Maven commands to build the releases, increase the memory available to Maven with this command:
+					<code>$ export MAVEN_OPTS=-Xmx256m</code>
+				</para>
+			</note>
+			<para>
+				To perform this complete build, issue the following command while in the <code>target/</code> directory:
+			</para>
+			<programlisting>$ mvn -P assembly clean javadoc:javadoc install</programlisting>
+			<para>
+				This command runs the "clean", "javadoc:javadoc", and "install" goals using the "assembly" profile, 
+				which adds the production of JavaDocs, the Getting Started document, the Reference Guide document, 
+				the Getting Started examples, and several ZIP archives.  The order of the goals is important,
+				since the "install" goal attempts to include the JavaDoc in the archives. 
+			</para>
+			<para>
+				After this build has completed, verify that the assemblies under <code>target/</code> have actually been created and that
+				they contain the correct information.
+				At this point, we know that the actual Maven build process is building
+				everything we want and will complete without errors.  We can now proceed with preparing for the release.
+			</para>
+		</sect2>
+		<sect2 id="determine-version">
+			<title>Determine the version to be released</title>
+			<para>
+				The version being released should match the <ulink url="&JIRA;">JIRA</ulink> road map. Make sure that all issues related to the release are closed. 
+				The project lead should be notified and approve that the release is taking place.
+			</para>
+		</sect2>
+		<sect2 id="release-dry-run">
+			<title>Release dry run</title>
+			<para>
+				The next step is to ensure that all information in the POM is correct and contains all the information required for
+				the release process.  This is called a <emphasis>dry run</emphasis>, and is done with the Maven "release" plugin:
+			</para>
+			<programlisting>$ mvn -Passembly release:prepare -DdryRun=true</programlisting>
+			<para>
+				This may download a lot of Maven plugins if they already haven't been downloaded, but it will eventually prompt you for
+				the release version of each of the Maven projects, the tag name for the release, and the next development versions
+				(again for each of the Maven projects).  The default values are probably acceptable; if not, then check that the 
+				"<code>&lt;version&gt;</code>" tags in each of the POM files is correct and end with "-SNAPSHOT".
+			</para>
+			<para>
+				After the dry run completes you should clean up the files that the release plugin created in the dry run:
+			</para>
+			<programlisting>$ mvn -Passembly release:clean</programlisting>
+		</sect2>
+		<sect2 id="prepare-release">
+			<title>Prepare for the release</title>
+			<para>
+				Run the prepare step (without the <code>dryRun</code> option):
+			</para>
+			<programlisting>$ mvn -Passembly release:prepare</programlisting>
+			<para>
+				You will again be prompted for the release versions and tag name. These should be the same as what was used during the dry run. 
+				This will run the same steps as the dry run, with the additional step of tagging the release in SVN.  
+			</para>
+			<para>
+				If there are any problems during this step, you should go back and try the dry run option.  But after this runs successfully,
+				the release will be tagged in SVN, and the <code>pom.xml</code> files in SVN under <code>/trunk</code> will have the 
+				next version in the "&lt;version&gt;" values.
+				However, the artifacts for the release are not yet published.  That's the next step.
+			</para>
+		</sect2>
+		<sect2 id="release">
+			<title>Perform the release</title>
+			<para>
+				At this point, the release's artifacts need to be published to the JBoss Maven repository.  This next command check outs the
+				files from the release tag created earlier (into a <code>trunk/target/checkout</code> directory), runs a build, and then
+				deploys the generated artifacts.  Note that this ensures that the artifacts are built from the tagged code.
+			</para>
+			<programlisting>$ mvn release:perform -DuseReleaseProfile=false</programlisting>
+			<note>
+				<para>
+					If during this process you get an error finding the released artifacts in your local Maven repository, you may 
+					need to go into the <code>trunk/target/checkout</code> folder and run <code>$ mvn install</code>.  This is a simple
+					workaround to make the artifacts available locally.  Another option to try is adding <code>-Dgoals=install,assembly</code> 
+					to the <code>$ mvn release:perform... </code> command above.
+				</para>
+			</note>
+			<para>
+				The artifacts are deployed to the local file system, which is comprised of a local checkout of the JBoss Maven2 repository 
+				in a location specified by a combination of the <code>&lt;distributionManagement&gt;</code> section of several <code>pom.xml</code> 
+				files and your personal <code>settings.xml</code> file.  Once this Maven command completes, you will need to 
+				commit the new files after they are deployed.  For more information, see the 
+				<ulink url="http://wiki.jboss.org/wiki/Maven">JBoss wiki</ulink>.
+			</para>
+			<para>
+				At this point, the software has been released and tagged, and it's been deployed to a local checked-out copy of the 
+				JBoss DNA Maven 2 repository (via the "&lt;distribution&gt;" section of the pom.xml files).  Those need to be committed
+				into the Maven 2 repository using SVN.  And finally, the last thing is to publish the release onto
+				the project's <ulink url="&Downloads;">downloads</ulink> and <ulink url="&Home;/docs">documentation</ulink> pages.
+			</para>
+			<para>
+				The assemblies of the source, binaries, etc. also need to be published onto the &Downloads; area of the
+				<ulink url="http://www.jboss.org/dna">the project page</ulink>.  This process is expected to change, as <ulink url="http://www.jboss.org">JBoss.org</ulink>
+				improves its infrastructure.
+			</para>
+		</sect2>
+	</sect1>
+	<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>.
+		</para>
+	</sect1>
+</chapter>


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

Deleted: trunk/docs/reference/src/main/docbook/en-US/content/development_tools.xml
===================================================================
--- trunk/docs/reference/src/main/docbook/en-US/content/development_tools.xml	2009-06-08 00:52:09 UTC (rev 994)
+++ trunk/docs/reference/src/main/docbook/en-US/content/development_tools.xml	2009-06-08 14:57:17 UTC (rev 995)
@@ -1,502 +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
-  -->
-<!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="development-tools">
-  <title>Developer tools</title>
-  <para>
-		The JBoss DNA project uses <link linkend="maven">Maven</link> as its primary build tool, <link linkend="svn">Subversion</link>
-		for its source code repository, <link linkend="jira">JIRA</link> for the issue management and bug tracking system,
-		and <link linkend="hudson">Hudson</link> for the continuous integration system.  We do not stipulate a specific integrated
-		development environment (IDE), although most of us use <link linkend="eclipse">Eclipse</link> and rely upon the code formatting
-		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.
-	</para>
-	<sect1 id="jdk">
-		<title>JDK</title>
-		<para>
-			Currently, JBoss DNA is developed and built using <ulink url="http://java.sun.com/javase/downloads/index_jdk5.jsp">JDK 5</ulink>.
-			So if you're trying to get JBoss DNA to compile locally, you should make sure you have the JDK 5 installed and are using it.
-			If you're a contributor, you should make sure that you're using JDK 5 before committing any changes.  
-		</para>
-		<note>
-			<para>
-				You should be able to use the <ulink url="http://java.sun.com/javase/downloads/index.jsp">latest JDK</ulink>,
-				which is currently JDK 6.  It is possible to build JBoss DNA using JDK 6 without any code changes, but it's 
-				not our official JDK (yet).
-			</para>
-			<para>
-				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.
-			</para>
-		</note>
-		<para>
-			When installing a JDK, simply follow the procedure for your particular platform.  On most platforms, this should set the
-			<code>JAVA_HOME</code> environment variable.  But if you run into any problems, first check that this environment
-			variable was set to the correct location, and then check that you're running the version you expect by running
-			the following command:
-		</para>
-		<programlisting>$ java -version</programlisting>
-		<para>
-			If you don't see the correct version, double-check your JDK installation.
-		</para>
-	</sect1>
-	<sect1 id="jira">
-		<title>JIRA</title>
-		<para>
-			JBoss DNA uses <ulink url="&JIRA;">JIRA</ulink> as its bug tracking, issue tracking, and project management tool.
-			This is a browser-based tool, with very good functionality for managing the different tasks.  It also serves as
-			the community's roadmap, since we can define new features and manage them along side the bugs and other issues.
-			Although most of the issues have been created by community members, we encourage any users to suggest new features,
-			log defects, or identify shortcomings in JBoss DNA.
-		</para>
-		<para>
-			The JBoss DNA community also encourages its members to work only issues that are managed in JIRA, and preferably those
-			that are targeted to the current release effort.  If something isn't in JIRA but needs to get done, then create an 
-			issue before you start working on the code changes.  Once you have code changes, you can upload a patch to the JIRA issue
-			if the change is complex, if you want someone to review it, or if you don't have commit privileges and have fixed
-			a bug.
-		</para>
-	</sect1>
-	<sect1 id="svn">
-		<title>Subversion</title>
-		<para>JBoss DNA uses Subversion as its source code management system, and specifically the instance at 
-			<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
-		 	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
-			particular platform.
-		</para>
-		<para>
-			Here are some useful URLs for the JBoss DNA Subversion:
-		</para>
-		<table frame='all'>
-			<title>SVN URLs for JBoss DNA</title>
-			<tgroup cols='2' align='left' colsep='1' rowsep='1'>
-	      <colspec colname='c1' colwidth="1*"/>
-	      <colspec colname='c2' colwidth="1*"/>
-				<thead>
-					<row>
-			  		<entry>Repository</entry>
-			  		<entry>URL</entry>
-					</row>
-				</thead>
-				<tbody>
-					<row>
-						<entry>Anonymous Access URL</entry>
-						<entry><ulink url="&Subversion;trunk/">&Subversion;trunk/</ulink></entry>
-					</row>
-					<row>
-						<entry>Secure Developer Access URL</entry>
-						<entry><ulink url="&Fisheye;trunk/">&Fisheye;trunk/</ulink></entry>
-					</row>
-					<row>
-						<entry>FishEye Code Browser</entry>
-						<entry><ulink url="&SecureSubversion;trunk/">&SecureSubversion;trunk/</ulink></entry>
-					</row>
-				</tbody>
-			</tgroup>
-		</table>
-		<para>
-			When committing to SVN, be sure to include in a commit comment that includes the JIRA issue that the commit applies to and a very
-			good and thorough description of what was done.  It only takes a minute or two to be very clear about the change.  And including
-			the JIRA issue (e.g., "DNA-123") in the comment allows the JIRA system to track the changes that have been made for each issue.
-		</para>
-		<para>
-			Also, any single SVN commit should apply to one and only one JIRA issue.  Doing this helps ensure that each commit is atomic
-			and focused on a single activity.  There are exceptions to this rule, but they are rare.
-		</para>
-		<para>
-			Sometimes you may have some local changes that you don't want to (or aren't allowed to) commit.  You can make a patch file
-			and upload it to the JIRA issue, allowing other committers to review the patch.  However, to ensure that patches are easily
-			applied, please use SVN to create the patch.  To do this, simply do the following in the top of the codebase (e.g., the 
-			<code>trunk</code> directory):
-		</para>
-		<programlisting>$ svn diff . > ~/DNA-000.patch</programlisting> 
-		<para>
-			where <code>DNA-000</code> represents the DNA issue number.  Note that the above command places the patch file in your home directory,
-			but you can place the patch file anywhere.  Then, simply use JIRA to attach the patch file to the particular issue, also adding
-			a comment that describes the version number against which the patch was created.
-		</para>
-		<para>
-			To apply a patch, you usually want to start with a workspace that has no changes.  Download the patch file, then issue the
-			following command (again, from the top-level of the workspace):
-		</para>
-		<programlisting>$ patch -E -p0 &lt; ~/DNA-000.patch</programlisting> 
-		<para>
-			The "-E" option specifies to delete any files that were made empty by the application of the patch, and the "-p0" option instructs
-			the patch tool to not change any of the paths.  After you run this command, your working area should have the changes defined
-			by the patch.
-		</para>
-	</sect1>
-	<sect1 id="maven">
-		<title>Maven</title>
-		<para>JBoss DNA uses Maven 2 for its build system, as is 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>
-		<para>
-      To use Maven with JBoss DNA, you'll need to have <link linkend="jdk">JDK 5 or 6</link> and Maven 2.0.9 (or higher).</para>
-		<para>
-      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>
-  <profiles>
-    <profile>
-      <id>jboss.repository</id>
-      <activation>
-        <property>
-          <name>!jboss.repository.off</name>
-        </property>
-      </activation>
-      <repositories>
-        <repository>
-          <id>snapshots.jboss.org</id>
-          <url>http://snapshots.jboss.org/maven2</url>
-          <snapshots>
-            <enabled>true</enabled>
-          </snapshots>
-        </repository>
-        <repository>
-          <id>repository.jboss.org</id>
-          <url>http://repository.jboss.org/maven2</url>
-          <snapshots>
-            <enabled>false</enabled>
-          </snapshots>
-        </repository>
-      </repositories>
-      <pluginRepositories>
-        <pluginRepository>
-          <id>repository.jboss.org</id>
-          <url>http://repository.jboss.org/maven2</url>
-          <snapshots>
-            <enabled>false</enabled>
-          </snapshots>
-        </pluginRepository>
-        <pluginRepository>
-          <id>snapshots.jboss.org</id>
-          <url>http://snapshots.jboss.org/maven2</url>
-          <snapshots>
-            <enabled>true</enabled>
-          </snapshots>
-        </pluginRepository>
-      </pluginRepositories>
-    </profile>
-  </profiles>
-</settings>
-]]></programlisting>
-		<para>This profile informs Maven of the two JBoss repositories (<ulink url="http://repository.jboss.org/maven2">snapshots</ulink> 
-		  and <ulink url="http://snapshots.jboss.org/maven2">releases</ulink>) that contain all of the JARs for JBoss DNA and all dependent libraries.
-		</para>
-		<para>While you're adding <code>$MAVEN_HOME/bin</code> to your path, you should also set the <code>$MAVEN_OPTS</code> environment variable
-		  to "<code>-Xmx256m</code>".  If you don't do this, you'll likely see an <code>java.lang.OutOfMemoryError</code> sometime during a full
-		  build.
-		</para>
-		<note>
-			<para>
-				The JBoss Maven repository provides a central location for not only the artifacts produced by the JBoss.org projects (well, at least those
-				that use Maven), but also is where those projects can place the artifacts that they depend on.  JBoss DNA has a policy that
-				the <emphasis>source code and JARs</emphasis> for <emphasis>all</emphasis> dependencies <emphasis>must</emphasis> be loaded into the 
-				JBoss Maven repository.  It may be a little bit more work for the developers, but it does help ensure that developers have easy
-				access to the source and that the project (and dependencies) can always be rebuilt when needed.
-			</para>
-			<para>
-				For more information about the JBoss Maven repository, including instructions for adding source and JAR artifacts, 
-				see the <ulink url="http://wiki.jboss.org/wiki/Maven">JBoss.org Wiki</ulink>.
-			</para>
-		</note>
-		<para>
-			There are just a few commands that are useful for building JBoss DNA (and it's <link linkend="modules">subprojects</link>).
-			Usually, these are issued while at the top level of the code (usually just below <code>trunk/</code>), although issuing
-			them inside a subproject just applies to that subproject.
-		</para>
-		<table frame='all'>
-			<title>Useful Maven commands</title>
-			<tgroup cols='2' align='left' colsep='1' rowsep='1'>
-	      <colspec colname='c1' colwidth="1*"/>
-	      <colspec colname='c2' colwidth="1*"/>
-				<thead>
-					<row>
-			  		<entry>Command</entry>
-			  		<entry>Description</entry>
-					</row>
-				</thead>
-				<tbody>
-					<row>
-						<entry><code>mvn clean</code></entry>
-						<entry>Clean up all built artifacts (e.g., the <code>target/</code> directory in each project)</entry>
-					</row>
-					<row>
-						<entry><code>mvn clean install</code></entry>
-						<entry>Clean up all built artifacts, then compile, run the unit tests, and install the resulting JAR artifact(s)
-							into your local Maven repository (e.g, usually <code>~/.m2/repository</code>).
-						</entry>
-					</row>
-				</tbody>
-			</tgroup>
-		</table>
-	</sect1>
-	<sect1 id="hudson">
-		<title>Continuous integration with Hudson</title>
-		<para>JBoss DNA's continuous integration is done with several Hudson jobs on <ulink url="http://www.jboss.org">JBoss.org</ulink>.
-		  These jobs run periodically and basically run the Maven build process.  Any build failures or test failures are reported,
-		  as are basic statistics and history for each job.
-		</para>
-		<table frame='all'>
-			<title>Continuous integration jobs</title>
-			<tgroup cols='2' align='left' colsep='1' rowsep='1'>
-	      <colspec colname='c1' colwidth="1*"/>
-	      <colspec colname='c2' colwidth="1*"/>
-				<thead>
-					<row>
-			  		<entry>Job</entry>
-			  		<entry>Description</entry>
-					</row>
-				</thead>
-				<tbody>
-					<row>
-						<entry><ulink url="http://hudson.jboss.org/hudson/job/DNA%20continuous%20on%20JDK1.5/">Continuous on JDK 5</ulink></entry>
-						<entry>Continuous build that runs after changes are committed to SVN.  SVN is polled every 15 minutes.</entry>
-					</row>
-					<row>
-						<entry><ulink url="http://hudson.jboss.org/hudson/job/DNA%20nightly%20integration%20on%20JDK1.5/">Nightly on JDK 5</ulink></entry>
-						<entry>Build that runs every night (usually around 2 a.m. EDT), regardless of whether changes have been committed to SVN
-							since the previous night.</entry>
-					</row>
-				</tbody>
-			</tgroup>
-		</table>
-	</sect1>
-	<sect1 id="eclipse">
-		<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"), 
-			available from <ulink url="http://www.eclipse.org/">Eclipse.org</ulink>.  Simply follow the instructions for your platform.
-		</para>
-		<para>
-			After Eclipse is installed, create a new workspace.  Before importing the JBoss DNA projects, import (via 
-			<emphasis role="strong">File->Import->Preferences</emphasis>) the subset of the Eclipse preferences by importing the 
-			<code>eclipse-preferences.epf</code> file (located under <code>trunk</code>). Then, open the Eclipse preferences and 
-			open the <emphasis role="strong">Java->Code Style-> Formatter</emphasis> preference page, and press the "Import" button and
-			choose the <code>eclipse-code-formatter-profile.xml</code> file (also located under <code>trunk</code>).  This will load the code
-			formatting preferences for the JBoss DNA project.
-		</para>
-		<para>
-			Then install Eclipse plugins for SVN and Maven.  (Remember, you will have to restart Eclipse after installing them.)
-			We use the following plugins:
-		</para>
-		<table frame='all'>
-			<title>Eclipse Subversion Plugins</title>
-			<tgroup cols='2' align='left' colsep='1' rowsep='1'>
-	      <colspec colname='c1' colwidth="1*"/>
-	      <colspec colname='c2' colwidth="1*"/>
-				<thead>
-					<row>
-			  		<entry>Eclipse Plugins</entry>
-						<entry>Update Site URLs</entry>
-					</row>
-				</thead>
-				<tbody>
-					<row>
-						<entry>Subversive SVN Client</entry>
-						<entry>
-							<ulink url="http://www.polarion.org/projects/subversive/download/eclipse/2.0/update-site/">http://www.polarion.org/projects/subversive/download/eclipse/2.0/update-site/</ulink>
-						  <ulink url="http://www.polarion.org/projects/subversive/download/integrations/update-site/">http://www.polarion.org/projects/subversive/download/integrations/update-site/</ulink>
-						</entry>
-					</row>
-					<row>
-						<entry>Maven Integration for Eclipse</entry>
-						<entry><ulink url="http://m2eclipse.sonatype.org/update/">http://m2eclipse.sonatype.org/update/</ulink></entry>
-					</row>
-				</tbody>
-			</tgroup>
-		</table>
-		<para>
-			After you check out the JBoss DNA codebase, you can import the JBoss DNA Maven projects into Eclipse as Eclipse projects.
-			To do this, go to "File->Import->Existing Projects", navigate to the <code>trunk/</code> folder in the import wizard,
-			and then check each of the <link linkend="modules">subprojects</link> that you want to have in your workspace.
-			Don't forget about the projects under <code>extensions/</code> or <code>docs/</code>.
-		</para>
-	</sect1>
-	<sect1 id="releasing">
-		<title>Releasing</title>
-		<para>
-			This section outlines the basic process of releasing JBoss DNA.  This <emphasis role="strong">must</emphasis> be done
-			either by the project lead or only after communicating with the project lead.
-		</para>
-		<para>
-			Before continuing, your local workspace should contain no changes and should be a perfect reflection of Subversion.
-			You can verify this by getting the latest from Subversion
-		</para>
-		<programlisting>$ svn update</programlisting> 
-		<para>
-			and ensuring that you have no additional changes with
-		</para>
-		<programlisting>$ svn status</programlisting>
-		<para>
-			You may also want to note the revision number for use later on in the process.  The release number is returned by
-			the <code>svn update</code> command, but may also be found using
-		</para>
-		<programlisting>$ svn info</programlisting>
-		<para>
-			At this point, you're ready to verify that everything builds normally.
-		</para>
-		<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.
-				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>
-			<note>
-				<para>
-					Before running Maven commands to build the releases, increase the memory available to Maven with this command:
-					<code>$ export MAVEN_OPTS=-Xmx256m</code>
-				</para>
-			</note>
-			<para>
-				To perform this complete build, issue the following command while in the <code>target/</code> directory:
-			</para>
-			<programlisting>$ mvn -P assembly clean javadoc:javadoc install</programlisting>
-			<para>
-				This command runs the "clean", "javadoc:javadoc", and "install" goals using the "assembly" profile, 
-				which adds the production of JavaDocs, the Getting Started document, the Reference Guide document, 
-				the Getting Started examples, and several ZIP archives.  The order of the goals is important,
-				since the "install" goal attempts to include the JavaDoc in the archives. 
-			</para>
-			<para>
-				After this build has completed, verify that the assemblies under <code>target/</code> have actually been created and that
-				they contain the correct information.
-				At this point, we know that the actual Maven build process is building
-				everything we want and will complete without errors.  We can now proceed with preparing for the release.
-			</para>
-		</sect2>
-		<sect2 id="determine-version">
-			<title>Determine the version to be released</title>
-			<para>
-				The version being released should match the <ulink url="&JIRA;">JIRA</ulink> road map. Make sure that all issues related to the release are closed. 
-				The project lead should be notified and approve that the release is taking place.
-			</para>
-		</sect2>
-		<sect2 id="release-dry-run">
-			<title>Release dry run</title>
-			<para>
-				The next step is to ensure that all information in the POM is correct and contains all the information required for
-				the release process.  This is called a <emphasis>dry run</emphasis>, and is done with the Maven "release" plugin:
-			</para>
-			<programlisting>$ mvn -Passembly release:prepare -DdryRun=true</programlisting>
-			<para>
-				This may download a lot of Maven plugins if they already haven't been downloaded, but it will eventually prompt you for
-				the release version of each of the Maven projects, the tag name for the release, and the next development versions
-				(again for each of the Maven projects).  The default values are probably acceptable; if not, then check that the 
-				"<code>&lt;version&gt;</code>" tags in each of the POM files is correct and end with "-SNAPSHOT".
-			</para>
-			<para>
-				After the dry run completes you should clean up the files that the release plugin created in the dry run:
-			</para>
-			<programlisting>$ mvn -Passembly release:clean</programlisting>
-		</sect2>
-		<sect2 id="prepare-release">
-			<title>Prepare for the release</title>
-			<para>
-				Run the prepare step (without the <code>dryRun</code> option):
-			</para>
-			<programlisting>$ mvn -Passembly release:prepare</programlisting>
-			<para>
-				You will again be prompted for the release versions and tag name. These should be the same as what was used during the dry run. 
-				This will run the same steps as the dry run, with the additional step of tagging the release in SVN.  
-			</para>
-			<para>
-				If there are any problems during this step, you should go back and try the dry run option.  But after this runs successfully,
-				the release will be tagged in SVN, and the <code>pom.xml</code> files in SVN under <code>/trunk</code> will have the 
-				next version in the "&lt;version&gt;" values.
-				However, the artifacts for the release are not yet published.  That's the next step.
-			</para>
-		</sect2>
-		<sect2 id="release">
-			<title>Perform the release</title>
-			<para>
-				At this point, the release's artifacts need to be published to the JBoss Maven repository.  This next command check outs the
-				files from the release tag created earlier (into a <code>trunk/target/checkout</code> directory), runs a build, and then
-				deploys the generated artifacts.  Note that this ensures that the artifacts are built from the tagged code.
-			</para>
-			<programlisting>$ mvn release:perform -DuseReleaseProfile=false</programlisting>
-			<note>
-				<para>
-					If during this process you get an error finding the released artifacts in your local Maven repository, you may 
-					need to go into the <code>trunk/target/checkout</code> folder and run <code>$ mvn install</code>.  This is a simple
-					workaround to make the artifacts available locally.  Another option to try is adding <code>-Dgoals=install,assembly</code> 
-					to the <code>$ mvn release:perform... </code> command above.
-				</para>
-			</note>
-			<para>
-				The artifacts are deployed to the local file system, which is comprised of a local checkout of the JBoss Maven2 repository 
-				in a location specified by a combination of the <code>&lt;distributionManagement&gt;</code> section of several <code>pom.xml</code> 
-				files and your personal <code>settings.xml</code> file.  Once this Maven command completes, you will need to 
-				commit the new files after they are deployed.  For more information, see the 
-				<ulink url="http://wiki.jboss.org/wiki/Maven">JBoss wiki</ulink>.
-			</para>
-			<para>
-				At this point, the software has been released and tagged, and it's been deployed to a local checked-out copy of the 
-				JBoss DNA Maven 2 repository (via the "&lt;distribution&gt;" section of the pom.xml files).  Those need to be committed
-				into the Maven 2 repository using SVN.  And finally, the last thing is to publish the release onto
-				the project's <ulink url="&Downloads;">downloads</ulink> and <ulink url="&Home;/docs">documentation</ulink> pages.
-			</para>
-			<para>
-				The assemblies of the source, binaries, etc. also need to be published onto the &Downloads; area of the
-				<ulink url="http://www.jboss.org/dna">the project page</ulink>.  This process is expected to change, as <ulink url="http://www.jboss.org">JBoss.org</ulink>
-				improves its infrastructure.
-			</para>
-		</sect2>
-	</sect1>
-	<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>.
-		</para>
-	</sect1>
-</chapter>

Deleted: trunk/docs/reference/src/main/docbook/en-US/content/environment.xml
===================================================================
--- trunk/docs/reference/src/main/docbook/en-US/content/environment.xml	2009-06-08 00:52:09 UTC (rev 994)
+++ trunk/docs/reference/src/main/docbook/en-US/content/environment.xml	2009-06-08 14:57:17 UTC (rev 995)
@@ -1,310 +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
-  -->
-<!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="environment">
-  <title>Environment</title>
-  <para>
-		The various components of JBoss DNA are designed as plain old Java objects, or POJOs.  And rather than making assumptions
-		about their environment, each component instead requires that any external dependencies necessary for it to operate
-		must be supplied to it.  This pattern is known as Dependency Injection, and it allows the components to be simpler
-		and allows for a great deal of flexibility and customization in how the components are configured.  
-		And, JBoss DNA will soon provide a higher-level component that leverages the 
-		<ulink url="http://www.jboss.org/jbossmc">JBoss Microcontainer</ulink> to automatically assemble and wire together
-		all the lower-level components.
-  </para>
-	<sect1 id="execution-context">
-		<title>Execution contexts</title>
-		<para>
-			One of the objects that must be supplied to many JBoss DNA components is an &ExecutionContext;.  Some components 
-			require this context to be passed into individual methods, allowing the context to vary with each method invocation.
-			Other components require the context to be provided before it's used, and will use that context for all its operations
-			(until it is given a different one).
-		</para>
-		<para>
-			What does an &ExecutionContext; represent?  Quite simply, it's the set of objects that define the environment
-			or context in which the method or component is currently operating.  It includes a way for recording and reporting 
-			errors and problems.  It includes the ability to <link linkend="classloaders">create class loaders</link> 
-			given a classpath of class loader names. It also includes information about the current <link linkend="security">user</link>.
-			It includes access to factories that can be used to create and convert property values. And it includes factories 
-			for working with namespaces and fully-qualified names.  In fact, as JBoss DNA evolves, more things may need to be
-			added.  Here is what the &ExecutionContext; interface looks like:
-		</para>
-	  <programlisting>
-public class &ExecutionContext; implements &ClassLoaderFactory; {
-
-    /**
-     * Get the factories that should be used to create values for {@link Property properties}.
-     * @return the property value factory; never null
-     */
-    public &ValueFactories; getValueFactories() {...}
-
-    /**
-     * Get the namespace registry for this context.
-     * @return the namespace registry; never null
-     */
-    public &NamespaceRegistry; getNamespaceRegistry() {...}
-
-    /**
-     * Get the factory for creating {@link Property} objects.
-     * @return the property factory; never null
-     */
-    public &PropertyFactory; getPropertyFactory() {...}
-
-    /**
-     * Get the security context for this environment.
-     * @return the security context; never <code>null</code>
-     */
-    public &SecurityContext; getSecurityContext() {...}
-
-    /**
-     * Return a logger associated with this context. This logger records only those activities within the 
-     * context and provide a way to capture the context-specific activities. All log messages are also
-     * sent to the system logger, so classes that log via this mechanism should <i>not</i> also 
-     * {@link Logger#getLogger(Class) obtain a system logger}.
-     * @param clazz the class that is doing the logging
-     * @return the logger, named after <code>clazz</code>; never null
-     */
-    public &Logger; getLogger( Class&lt;?> clazz ) {...}
-
-    /**
-    * Return a logger associated with this context. This logger records only those activities within the 
-    * context and provide a way to capture the context-specific activities. All log messages are also
-    * sent to the system logger, so classes that log via this mechanism should <i>not</i> also 
-    * {@link Logger#getLogger(Class) obtain a system logger}.
-     * @param name the name for the logger
-     * @return the logger, named after <code>clazz</code>; never null
-     */
-    public &Logger; getLogger( String name ) {...}
-
-		...
-}
-</programlisting>
-		<para>
-			Notice that &ExecutionContext; implements the &ClassLoaderFactory; interface described in the
-			<link linkend="classloaders">previous chapter</link>, meaning it can be used to create other contexts.  These other methods are not shown,
-			but can be used to create create subcontexts with different <link linkend="security">security contexts</link>,
-	    with different namespace registry, or with different combinations of components.
-		</para>
-	  <para>
-			The fact that so many of the JBoss DNA components take &ExecutionContext; instances gives us some interesting possibilities.  
-			For example, one execution context instance can be used as the highest-level (or "application-level") context for all of the services 
-			(e.g., &RepositoryService;, &SequencingService;, etc.).
-			Then, an execution context could be created for each user that will be performing operations, and that user's context can
-			be passed around to not only provide security information about the user but also to allow the activities being performed
-			to be recorded for user feedback, monitoring and/or auditing purposes.
-		</para>
-		<para>
-			The following code fragment shows how easy it is to create various execution contexts:
-		</para>
-	  <programlisting>
-&ExecutionContext; context1 = new &ExecutionContext;();
-String jaasRealm = ...;
-
-// Create a context for a user, authenticating using a JAAS LoginContext...
-char[] password = "password".toCharArray();
-&SecurityContext; securityContext = new JaasSecurityContext(jaasRealm, "username", password);
-&ExecutionContext; context2 = context1.with(securityContext);
-
-// Create a context for the same user, authenticating using JAAS, and using a different callback handler ...
-&CallbackHandler; callbackHandler = ...
-&ExecutionContext; context3 = context1.with(new JaasSecurityContext(jaasRealm, callbackHandler);
-
-// Create a context that uses a provided &SecurityContext; (see the <link linkend="security">next section</link>)...
-&SecurityContext; mySecurityContext = ...
-&ExecutionContext; context4 = context1.with(mySecurityContext);
-</programlisting>
-		<para>
-			These contexts can then be passed to the various components as needed.
-		</para>
-	</sect1>
-	<sect1 id="security">
-		<title>Security</title>
-	  <para>
-	    JBoss DNA uses a simple abstraction layer to isolate it from the security infrastructure used within an application.
-	   The &SecurityContext; interface is defined as follows:
-		</para>
-	  <programlisting>
-public interface &SecurityContext; {
-
-    /**
-     * Get the name of the authenticated user.
-     * @return the authenticated user's name
-     */
-    &String; getUserName();
-
-    /**
-     * Determine whether the authenticated user has the given role.
-     * @param roleName the name of the role to check
-     * @return true if the user has the role and is logged in; false otherwise
-     */
-    boolean hasRole( String roleName );
-
-    /**
-     * Logs the user out of the authentication mechanism.
-     * For some authentication mechanisms, this will be implemented as a no-op.
-     */
-    void logout();
-}
-</programlisting>
-		<para>
-			As noted below, this security context is made available through the &ExecutionContext; described above.
-		</para>
-		<sect2 id="jaas_security">
-			<title>JAAS</title>
-			<para>
-				One such implementation is the &JaasSecurityContext;, which delegates any authentication or authorization requests to a
-		    <ulink url="http://java.sun.com/javase/technologies/security/">Java Authentication and Authorization Service (JAAS)</ulink>
-		    provider.  This is the standard approach for authenticating and authorizing in Java, and is the default mechanism 
-		    used by the &JcrEngine;.  
-		  </para>
-		  <para>
-				There are quite a few JAAS providers available, but one of the best and most powerful providers is
-		    <ulink url="http://www.jboss.org/jbosssecurity/">JBoss Security</ulink>, the open source
-				security framework used by JBoss.  JBoss Security offers a number of JAAS login modules, including:
-		    <itemizedlist>
-		      <listitem>
-		        <para>
-		          <emphasis role="strong">User-Roles Login Module</emphasis>
-		          is a simple
-		          <code>javax.security.auth.login.LoginContext</code>
-		          implementation that uses usernames and passwords stored in a properties file.
-		        </para>
-		      </listitem>
-		      <listitem>
-		        <para>
-		          <emphasis role="strong">Client Login Module</emphasis>
-		          prompts the user for their username and password.
-		        </para>
-		      </listitem>
-		      <listitem>
-		        <para>
-		          <emphasis role="strong">Database Server Login Module</emphasis>
-		          uses a JDBC database to authenticate principals and associate them with roles.
-		        </para>
-		      </listitem>
-		      <listitem>
-		        <para>
-		          <emphasis role="strong">LDAP Login Module</emphasis>
-		          uses an LDAP directory to authenticate principals. Two implementations are available.
-		        </para>
-		      </listitem>
-		      <listitem>
-		        <para>
-		          <emphasis role="strong">Certificate Login Module</emphasis>
-		          authenticates using X509 certificates, obtaining roles from either property files or a JDBC database.
-		        </para>
-		      </listitem>
-		      <listitem>
-		        <para>
-		          <emphasis role="strong">Operating System Login Module</emphasis>
-		          authenticates using the operating system's mechanism.
-		        </para>
-		      </listitem>
-		    </itemizedlist>
-		    and many others.  Plus, JBoss Security also provides other capabilities, such as using XACML policies or using federated single sign-on. 
-				For more detail, see the <ulink url="http://www.jboss.org/jbosssecurity/">JBoss Security</ulink> project.
-		  </para>
-		</sect2>
-		<sect2 id="web_security">
-			<title>Web application security</title>
-			<para>
-				If JBoss DNA is being used within a web application, then it is probably desirable to reuse the security infrastructure
-				of the application server.  This can be accomplished by implementing the &SecurityContext; interface with an implementation
-				that delegates to the <interface>HttpServletRequest</interface>.  Then, for each request, create a &SecurityContextCredentials;
-				instance around your &SecurityContext;, and use that credentials to obtain a JCR &Session;.
-			</para>
-			<para>
-				Here is an example of the &SecurityContext; implementation that uses the servlet request:
-			</para>
-	  <programlisting>
- at Immutable
-public class ServletSecurityContext implements &SecurityContext; {
-
-    private final String userName;
-    private final HttpServletRequest request;
-
-    /**
-     * Create a {@link ServletSecurityContext} with the supplied 
-     * {@link HttpServletRequest servlet information}.
-     * 
-     * @param request the servlet request; may not be null
-     */
-    public ServletSecurityContext( HttpServletRequest request ) {
-        this.request = request;
-        this.userName = request.getUserPrincipal() != null ? request.getUserPrincipal().getName() : null;
-    }
-
-    /**
-     * Get the name of the authenticated user.
-     * @return the authenticated user's name
-     */
-    public &String; getUserName() {
-        return userName;
-    }
-
-    /**
-     * Determine whether the authenticated user has the given role.
-     * @param roleName the name of the role to check
-     * @return true if the user has the role and is logged in; false otherwise
-     */
-    boolean hasRole( String roleName ) {
-        request.isUserInRole(roleName);
-    }
-
-    /**
-     * Logs the user out of the authentication mechanism.
-     * For some authentication mechanisms, this will be implemented as a no-op.
-     */
-    public void logout() {
-    }
-}</programlisting>
-			<para>
-				Then use this to create a &Session;:
-			</para>
-	  <programlisting>
-HttpServletRequest request = ...
-&Repository; repository = engine.getRepository("my repository");
-&SecurityContext; securityContext = new ServletSecurityContext(httpServletRequest);
-SecurityContextCredentials credentials = new SecurityContextCredentials(securityContext);
-&Session; session = repository.login(credentials, workspaceName);
-</programlisting>
-		</sect2>
-	</sect1>
-	<sect1>
-		<title>Summary</title>
-		<para>
-			In this chapter, we covered security and environment topics as used throughout JBoss DNA. 
-			The <link linkend="repositories">next chapter</link> will cover JBoss DNA repositories, including the connector framework,
-			how DNA's JCR implementation works with connectors, what connectors are available (and how to use them),
-			and how to write your own connector.
-		</para>
-	</sect1>
-</chapter>
-

Copied: trunk/docs/reference/src/main/docbook/en-US/content/jcr/jcr.xml (from rev 994, trunk/docs/reference/src/main/docbook/en-US/content/jcr.xml)
===================================================================
--- trunk/docs/reference/src/main/docbook/en-US/content/jcr/jcr.xml	                        (rev 0)
+++ trunk/docs/reference/src/main/docbook/en-US/content/jcr/jcr.xml	2009-06-08 14:57:17 UTC (rev 995)
@@ -0,0 +1,120 @@
+<?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">
+  <title>Content Repositories for Java (JCR)</title>
+  <para>
+  	The
+    <ulink url="&JSR170;">Content Repository for Java technology API</ulink>
+    provides a standard Java API for working with content repositories. Abbreviated "JCR", this API was developed as part of the
+    Java Community Process under <ulink url="&JSR170;">JSR-170</ulink> (JCR 1.0) and is being revised under <ulink url="&JSR283;">JSR-283</ulink>.
+		JBoss DNA provides a partial JCR 1.0 implementation that allows you to work with the contents of a repository using the
+		JCR API.  For information about how to use the JCR API, please see the <ulink url="&JSR170;">JSR-170</ulink> specification.
+  </para>
+  <sect1 id="jcr-repositories">
+    <title>Obtaining JCR repositories</title>
+		<para>The JCR API doesn't define how your application first obtains a reference to a &Repository; implementation.
+			With JBoss DNA, you simply creating a &JcrRepository; object and supply
+			an &ExecutionContextFactory; and a &RepositoryConnectionFactory; (such as a &RepositoryLibrary; or &RepositoryService;).
+			Since &JcrRepository; implements the JCR &Repository; interface, from this point forward you can just use the
+			standard JCR API.
+		</para>
+		<note>
+			<para>
+				For more information about the &ExecutionContextFactory; and &RepositoryConnectionFactory; classes, see
+				the chapter on <link linkend="environment">setting up a JBoss DNA environment</link> and
+				<link linkend="repositories">setting up the &RepositoryService;</link>.
+			</para>
+		</note>
+  </sect1>
+  <sect1 id="jcr-sessions">
+    <title>Creating JCR sessions</title>
+		<para>Creating sessions is done using a &Repository; one of its <code>login(...)</code> methods, where the
+			name of the workspace corresponds to the name of the &RepositorySource;:
+		</para>
+    <programlisting>
+&JcrRepository; jcrRepository = new &JcrRepository;(contextFactory, sources);
+&Session; session = jcrRepository.login(sourceName);
+</programlisting>
+		<para>
+			Now, this code doesn't do any authentication; it essentially trusts the caller has the appropriate privileges.
+			Normally, your application will need to authenticate the user, so let's look at how that's done.
+		</para>
+		<para>
+			As we mentioned in the <link linkend="security">security section</link>, JBoss DNA uses JAAS for authentication
+			and authorization.  So how does this work with the JCR API?
+		</para>
+		<para>The JCR API defines a &Credentials; marker interface, an instance of which can be passed to the
+		  <code>&Session;.login(...)</code> method.  Rather than provide a concrete implementation of this interface, JBoss DNA
+		  allows you to pass any implementation of &Credentials; that also has one of the following methods:
+		  <itemizedlist>
+			  <listitem>
+					<para><code>getLoginContext()</code> that returns a &LoginContext; instance.</para>
+				</listitem>
+			  <listitem>
+					<para><code>getAccessControlContext()</code> that returns a &AccessControlContext; instance.</para>
+				</listitem>
+			</itemizedlist>
+			This way, your application can obtain the JAAS &LoginContext; or &AccessControlContext; however it wants,
+			and then merely passes that into DNA through the JCR &Credentials;.  No interfaces or classes specific to JBoss DNA are required.
+		</para>
+		<para>
+			The following code shows how this is done, using an anonymous inner class for the &Credentials; implementation.
+		</para>
+    <programlisting>
+&CallbackHandler; callbackHandler = // as needed by your app, according to JAAS
+final &LoginContext; loginContext = new &LoginContext;("MyAppContextName",callbackHandler);
+
+// Now pass to JBoss DNA to create a JCR Session ...
+&Credentials; credentials = new &Credentials;() {
+public &LoginContext; getLoginContext() { return loginContext; }
+};
+&JcrRepository; jcrRepository = new &JcrRepository;(contextFactory, sources);
+&Session; session = jcrRepository.login(credentials, sourceName);
+</programlisting>
+  </sect1>
+	<sect1>
+		<title>JCR Support</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, nor are all of the update methods that make up Level 2.
+			So while the current implementation provides 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>
+	</sect1>
+	<sect1>
+		<title>Summary</title>
+		<para>
+			In this chapter, we covered how to use JCR with JBoss DNA.  Now that you know how JBoss DNA repositories work,
+			and how to use JCR to work with DNA repositories, we'll move on in 
+			the <link linkend="sequencing">next chapter</link> to describing in detail how the sequencing of file content works.
+		</para>
+	</sect1>
+</chapter>


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

Added: 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	                        (rev 0)
+++ trunk/docs/reference/src/main/docbook/en-US/content/jcr/rest_service.xml	2009-06-08 14:57:17 UTC (rev 995)
@@ -0,0 +1,43 @@
+<?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="rest-service">
+  <title>RESTful Web Service</title>
+  <para>
+		blah blah 
+  </para>
+	<sect1>
+		<title>Summary</title>
+		<para>
+			In this chapter, we covered .... something  .... FIX ME.
+		</para>
+	</sect1>
+</chapter>
+


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

Deleted: trunk/docs/reference/src/main/docbook/en-US/content/jcr.xml
===================================================================
--- trunk/docs/reference/src/main/docbook/en-US/content/jcr.xml	2009-06-08 00:52:09 UTC (rev 994)
+++ trunk/docs/reference/src/main/docbook/en-US/content/jcr.xml	2009-06-08 14:57:17 UTC (rev 995)
@@ -1,120 +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
-  -->
-<!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">
-  <title>Content Repositories for Java (JCR)</title>
-  <para>
-  	The
-    <ulink url="&JSR170;">Content Repository for Java technology API</ulink>
-    provides a standard Java API for working with content repositories. Abbreviated "JCR", this API was developed as part of the
-    Java Community Process under <ulink url="&JSR170;">JSR-170</ulink> (JCR 1.0) and is being revised under <ulink url="&JSR283;">JSR-283</ulink>.
-		JBoss DNA provides a partial JCR 1.0 implementation that allows you to work with the contents of a repository using the
-		JCR API.  For information about how to use the JCR API, please see the <ulink url="&JSR170;">JSR-170</ulink> specification.
-  </para>
-  <sect1 id="jcr-repositories">
-    <title>Obtaining JCR repositories</title>
-		<para>The JCR API doesn't define how your application first obtains a reference to a &Repository; implementation.
-			With JBoss DNA, you simply creating a &JcrRepository; object and supply
-			an &ExecutionContextFactory; and a &RepositoryConnectionFactory; (such as a &RepositoryLibrary; or &RepositoryService;).
-			Since &JcrRepository; implements the JCR &Repository; interface, from this point forward you can just use the
-			standard JCR API.
-		</para>
-		<note>
-			<para>
-				For more information about the &ExecutionContextFactory; and &RepositoryConnectionFactory; classes, see
-				the chapter on <link linkend="environment">setting up a JBoss DNA environment</link> and
-				<link linkend="repositories">setting up the &RepositoryService;</link>.
-			</para>
-		</note>
-  </sect1>
-  <sect1 id="jcr-sessions">
-    <title>Creating JCR sessions</title>
-		<para>Creating sessions is done using a &Repository; one of its <code>login(...)</code> methods, where the
-			name of the workspace corresponds to the name of the &RepositorySource;:
-		</para>
-    <programlisting>
-&JcrRepository; jcrRepository = new &JcrRepository;(contextFactory, sources);
-&Session; session = jcrRepository.login(sourceName);
-</programlisting>
-		<para>
-			Now, this code doesn't do any authentication; it essentially trusts the caller has the appropriate privileges.
-			Normally, your application will need to authenticate the user, so let's look at how that's done.
-		</para>
-		<para>
-			As we mentioned in the <link linkend="security">security section</link>, JBoss DNA uses JAAS for authentication
-			and authorization.  So how does this work with the JCR API?
-		</para>
-		<para>The JCR API defines a &Credentials; marker interface, an instance of which can be passed to the
-		  <code>&Session;.login(...)</code> method.  Rather than provide a concrete implementation of this interface, JBoss DNA
-		  allows you to pass any implementation of &Credentials; that also has one of the following methods:
-		  <itemizedlist>
-			  <listitem>
-					<para><code>getLoginContext()</code> that returns a &LoginContext; instance.</para>
-				</listitem>
-			  <listitem>
-					<para><code>getAccessControlContext()</code> that returns a &AccessControlContext; instance.</para>
-				</listitem>
-			</itemizedlist>
-			This way, your application can obtain the JAAS &LoginContext; or &AccessControlContext; however it wants,
-			and then merely passes that into DNA through the JCR &Credentials;.  No interfaces or classes specific to JBoss DNA are required.
-		</para>
-		<para>
-			The following code shows how this is done, using an anonymous inner class for the &Credentials; implementation.
-		</para>
-    <programlisting>
-&CallbackHandler; callbackHandler = // as needed by your app, according to JAAS
-final &LoginContext; loginContext = new &LoginContext;("MyAppContextName",callbackHandler);
-
-// Now pass to JBoss DNA to create a JCR Session ...
-&Credentials; credentials = new &Credentials;() {
-public &LoginContext; getLoginContext() { return loginContext; }
-};
-&JcrRepository; jcrRepository = new &JcrRepository;(contextFactory, sources);
-&Session; session = jcrRepository.login(credentials, sourceName);
-</programlisting>
-  </sect1>
-	<sect1>
-		<title>JCR Support</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, nor are all of the update methods that make up Level 2.
-			So while the current implementation provides 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>
-	</sect1>
-	<sect1>
-		<title>Summary</title>
-		<para>
-			In this chapter, we covered how to use JCR with JBoss DNA.  Now that you know how JBoss DNA repositories work,
-			and how to use JCR to work with DNA repositories, we'll move on in 
-			the <link linkend="sequencing">next chapter</link> to describing in detail how the sequencing of file content works.
-		</para>
-	</sect1>
-</chapter>

Deleted: trunk/docs/reference/src/main/docbook/en-US/content/mimetypes.xml
===================================================================
--- trunk/docs/reference/src/main/docbook/en-US/content/mimetypes.xml	2009-06-08 00:52:09 UTC (rev 994)
+++ trunk/docs/reference/src/main/docbook/en-US/content/mimetypes.xml	2009-06-08 14:57:17 UTC (rev 995)
@@ -1,204 +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
-  -->
-<!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="mimetypes">
-  <title>MIME types</title>
-  <para>
-  	JBoss DNA often needs the ability to determine the MIME type for some binary content.  When uploading content into
-		a repository, we may want to add the MIME type as metadata.  Or, we may want to make some processing decisions
-		based upon the MIME type.  So, JBoss DNA created a small pluggable framework for determining the MIME type by using
-		the name of the file (e.g., extensions) and/or by reading the actual content.  Technically, the framework
-		delegates this to one or more extensions.  And we've provided one extension that does a very good job at 
-		determining the MIME type from a large variety of file types.  But if that isn't sufficient, you can always
-		incorporate your own detector into JBoss DNA.
-  </para>
-	<para>
-		To use this system, you simply invoke a static method and supply the name of the content (e.g., the name of the file, with the extension)
-		and the &InputStream; to the actual binary content:
-	</para>
-	<programlisting>&MimeType;.of(name,content)</programlisting>
-	<para>
-		The result is a &String; containing the <ulink url="http://www.iana.org/assignments/media-types/">MIME type</ulink>
-	  (e.g., "text/plain") or null if the MIME type cannot be determined.  Note that the name or &InputStream; may be
-		null, making this a very versatile utility.
-	</para>
-  <sect1 id="detectors">
-    <title>JBoss DNA MIME type detectors</title>
-    <para>
-    	The principle component in this framework is the concept of a <emphasis role="strong">detector</emphasis>.
-			A detector attempts to determine the MIME type using the name of the content (e.g., the file name)
-			and the actual content itself.  If the detector is able to determine the MIME type, it simply returns
-			it as a string.  If not, it merely returns null.  Note, however, that a detector must be thread-safe.
-    </para>
-		<para>
-			Here is the interface:
-		</para>
-		<programlisting>
-package org.jboss.dna.graph.mimetype;
- at ThreadSafe
-public interface &MimeTypeDetector; {
-
-    /**
-     * Returns the MIME-type of a data source, using its supplied content and/or
-     * its supplied name, depending upon the implementation. If the MIME-type 
-     * cannot be determined, either a "default" MIME-type or <code>null</code> may 
-     * be returned, where the former will prevent earlier registered MIME-type 
-     * detectors from being consulted.
-     * 
-     * @param name The name of the data source; may be <code>null</code>.
-     * @param content The content of the data source; may be <code>null</code>.
-     * @return The MIME-type of the data source, or optionally <code>null</code> 
-     * if the MIME-type could not be determined.
-     * @throws &IOException; If an error occurs reading the supplied content.
-     */
-    &String; mimeTypeOf( &String; name,
-                       &InputStream; content ) throws &IOException;;
-}</programlisting>
-		<para>
-			Detectors can be added to the &MimeType; class using the <code>addDetector(&MimeTypeDetectorConfig; config)</code>
-			method, where the &MimeTypeDetectorConfig; defines the name of the detector class, the name of the
-			<link linkend="classloaders">class loader</link>, a name, and a description.  It is also possible
-			to set the &ClassLoaderFactory; that the &MimeType; singleton will use.
-		</para>
-		<para>
-			We'll next look at the MIME type detectors that are provided out by JBoss DNA out of the box, and how to write your own. 
-		</para>
-    <sect2 id="dna-mimetype-detector-aperture">
-      <title>Aperture MIME type detector</title>
-      <para>
-      	The &ApertureMimeTypeDetector; class is an implementation of &MimeTypeDetector; that uses the
-				<ulink url="http://aperture.sourceforge.net/">Aperture</ulink> open-source library, which
-				is a very capable utility for determining the MIME type for a wide range of file types,
-				using both the file name and the actual content.
-      </para>
-    </sect2>
-  </sect1>
-  <sect1 id="custom-detectors">
-    <title>Writing custom detectors</title>
-	  <para>
-	  Creating a custom detector involves the following steps:
-	  <itemizedlist>
-	    <listitem>
-	      <para>Create a Maven 2 project for your detector;</para>
-	    </listitem>
-	    <listitem>
-	      <para>Implement the &MimeTypeDetector; interface with your own implementation, and create unit tests to verify
-	      the functionality and expected behavior;</para>
-	    </listitem>
-	    <listitem>
-	      <para>Add a &MimeTypeDetectorConfig; to the &MimeType; class in your application
-	      as described <link linkend="detectors">earlier</link>; and</para>
-	    </listitem>
-	    <listitem>
-	      <para>Deploy the JAR file with your implementation (as well as any dependencies), and make them available to JBoss DNA
-	      in your application.</para>
-	    </listitem>
-	  </itemizedlist>
-	  It's that simple.
-	  </para>
-	  <sect2 id="custom_detector_project">
-	    <title>Creating the Maven 2 project</title>
-	    <para>The first step is to create the Maven 2 project that you can use to compile your code and build the JARs.
-	    Maven 2 automates a lot of the work, and since you're already <link linkend="maven">set up to use Maven</link>,
-	    using Maven for your project will save you a lot of time and effort.  Of course, you don't have to use Maven 2, but then you'll
-	    have to get the required libraries and manage the compiling and building process yourself.</para>
-	    <note>
-	      <para>JBoss DNA may provide in the future a Maven archetype for creating detector projects.  If you'd find this useful
-	        and would like to help create it, please <link linkend="preface">join the community</link>.</para>
-	    </note>
-			<note>
-		    <para>
-					The <emphasis role="strong">dna-mimetype-detector-aperture</emphasis> project is a small, self-contained detector implementation that
-			    that you can use to help you get going.  Starting with this project's source and modifying it to suit your needs
-			 		may be the easiest way to get started.
-			    See the subversion repository: 
-					<ulink url="&Subversion;trunk/extensions/dna-mimetype-detector-aperture/">&Subversion;trunk/sequencers/dna-mimetype-detector-aperture/</ulink>
-			  </para>
-			</note>
-	    <para>You can create your Maven project any way you'd like.  For examples, see the <ulink url="http://maven.apache.org/guides/getting-started/index.html#How_do_I_make_my_first_Maven_project">Maven 2 documentation</ulink>.  
-	    Once you've done that, just add the dependencies in your project's <code>pom.xml</code> dependencies section:</para>
-	  	<programlisting role="XML"><![CDATA[<dependency>
-  <groupId>org.jboss.dna</groupId>
-  <artifactId>dna-common</artifactId>
-  <version>0.1</version>
-</dependency>
-<dependency>
-  <groupId>org.jboss.dna</groupId>
-  <artifactId>dna-graph</artifactId>
-  <version>0.1</version>
-</dependency>
-<dependency>
-  <groupId>org.slf4j</groupId>
-  <artifactId>slf4j-api</artifactId>
-</dependency>
-]]></programlisting>
-			<para>These are minimum dependencies required for compiling a detector.  Of course, you'll have to add
-	  		other dependencies that your sequencer needs.</para>
-	  	<para>As for testing, you probably will want to add more dependencies, such as those listed here:</para>
-			<programlisting role="XML"><![CDATA[<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>
-<!-- Logging with Log4J -->
-<dependency>
-  <groupId>org.slf4j</groupId>
-  <artifactId>slf4j-log4j12</artifactId>
-  <version>1.4.3</version>
-  <scope>test</scope>
-</dependency>
-<dependency>
-  <groupId>log4j</groupId>
-  <artifactId>log4j</artifactId>
-  <version>1.2.14</version>
-  <scope>test</scope>
-</dependency>
-]]></programlisting>
-			<para>
-				After you've created the project, simply implement the &MimeTypeDetector; interface.  And testing should be
-				quite straightforward, MIME type detectors don't require any other components.  In your tests,
-				simply instantiate your &MimeTypeDetector; implementation, supply various combinations of names and/or &InputStream;s,
-				and verify the output is what you expect.
-	  	</para>
-			<para>
-				To use in your application, create a &MimeTypeDetectorConfig; object with the name, description, and class information
-				for your detector, and add to the &MimeType; class using the <code>addDetector(&MimeTypeDetectorConfig; config)</code> method.
-				Then, just use the &MimeType; class.
-			</para>
-		</sect2>
-  </sect1>
-</chapter>

Deleted: trunk/docs/reference/src/main/docbook/en-US/content/repositories.xml
===================================================================
--- trunk/docs/reference/src/main/docbook/en-US/content/repositories.xml	2009-06-08 00:52:09 UTC (rev 994)
+++ trunk/docs/reference/src/main/docbook/en-US/content/repositories.xml	2009-06-08 14:57:17 UTC (rev 995)
@@ -1,1468 +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
-  -->
-<!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="repositories">
-  <title>Repositories</title>
-  <para></para>
-  <para>There is a lot of information stored in many of different places: databases, repositories, SCM systems,
-    registries, file systems, services, etc. The purpose of the federation engine is to allow applications to use the JCR API
-    to access that information as if it were all stored in a single JCR repository, but to really leave the information where
-    it is.</para>
-  <para>Why not just copy or move the information into a JCR repository?  Moving it is probably pretty difficult, since most 
-		likely there are existing applications that rely upon that information being where it is.  All of those applications
-		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.
-		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
-    those changes down to the original source, making those changes visible to all the other applications.
-	</para>
-	<para>
-		In short, all clients see the correct information, even when it changes in the underlying systems. But the JCR clients can get to all of the information
-		in one spot, using one powerful standard API.
-	</para>
-  <sect1 id="connectors">
-    <title>Repository connectors</title>
-		<para>
-			With JBoss DNA, your applications use the <ulink url="&JSR170;">JCR API</ulink> to work with the repository,
-			but the DNA repository transparently fetches the information from different kinds of repositories and storage systems,
-			not just a single purpose-built store.  This is fundamentally what makes JBoss DNA different.
-		</para>
-		<para>How does JBoss DNA do this?  At the heart of JBoss DNA and it's JCR implementation is a simple graph-based 
-			<emphasis>repository connector</emphasis> system.  Essentially, JBoss DNA's JCR implementation uses a single 
-			repository connector to access all content:
-			<figure id="dnajcr-and-connector">
-				<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 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>
-			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
-			<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">
-				<title>Future JBoss DNA connectors</title>
-				<graphic align="center" scale="100" fileref="dna-connectors-future.png"/>
-			</figure>
-		</para>
-		<para>
-		</para>
-		<para>
-	  	It's even possible to put a different API layer on top of the connectors.  For example, the new <ulink url="&JSR203;">New I/O (JSR-203)</ulink>
-			API offers the opportunity to build new file system providers.  This would be very straightforward to put on top of a JCR implementation,
-			but it could be made even simpler by putting it on top of a DNA connector.  In both cases, it'd be a trivial mapping from nodes that represent
-			files and folders into JSR-203 files and directories, and events on those nodes could easily be translated into JSR-203 watch events.
-			Then, simply choose a DNA connector and configure it to use the source you want to use.
-			<figure id="dna-connectors-vfs">
-				<title>Virtual File System with JBoss DNA</title>
-				<graphic align="center" scale="100" fileref="vfs-and-connector.png"/>
-			</figure>
-		</para>
-    <para>Before we go further, let's define some terminology regarding connectors.</para>
- 		<itemizedlist>
-			<listitem>
-				<para>
-					A <emphasis role="strong">connector</emphasis> is the runnable code packaged in one or more JAR files that
-					contains implementations of several interfaces (described below).  A Java developer <emphasis>writes</emphasis>
-					a connector to a type of source, such as a particular database management system, LDAP directory, source code
-					management system, etc.  It is then packaged into one or more JAR files (including dependent JARs) and deployed
-					for use in applications that use JBoss DNA repositories.
-				</para>
-			</listitem>
-			<listitem>
-				<para>
-					The description of a particular source system (e.g., the "Customer" database, or the company LDAP system) 
-					is called a <emphasis role="strong">repository source</emphasis>.  JBoss DNA defines a &RepositorySource; interface
-					that defines methods describing the behavior and supported features and a method for establishing connections.
-					A connector will have a class that implements this interface and that has JavaBean properties for
-					all of the connector-specific properties required to fully describe an instance of the system.  Use of JavaBean
-					properties is not required, but it is highly recommended, as it enables reflective configuration and administration.
-					Applications that use JBoss DNA create an instance of the connector's &RepositorySource; implementation and set 
-					the properties for the external source that the application wants to access with that connector.
-				</para>
-			</listitem>
-			<listitem>
-				<para>
-					A repository source instance is then used to establish <emphasis role="strong">connections</emphasis> to
-					that source.  A connector provides an implementation of the &RepositoryConnection; interface, which
-					defines methods for interacting with the external system.  In particular, the <code>execute(...)</code> method
-					takes an &ExecutionContext; instance and a &Request; object.  The &ExectuionContext; object defines the
-					environment in which the processing is occurring, including information about the JAAS &Subject; and &LoginContext;.
-					The &Request; object describes the requested operations on the content, with different concrete subclasses
-					representing each type of activity.  Examples of commands include (but not limited to) getting a node, moving a node, creating a node, 
-					changing a node, and deleting a node.  And, if the repository source is able to participate in JTA/JTS distributed transactions, then the
-					&RepositoryConnection; must implement the <code>getXaResource()</code> method by returning 
-					a valid <code>javax.transaction.xa.XAResource</code> object that can be used by the transaction monitor.
-				</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
-			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;,
-			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.)
-		</para>
-		<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,
-			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
-			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.
-		</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> 
-			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>
-		<para>
-			So, we've so far learned what a repository connector is and how they're used to establish connections to the underlying sources 
-			and access the content in those sources.  In the <link linkend="repository-service">next section</link>, we'll show how these 
-			source instances can be configured, managed, and their connections pooled.  After that, we'll look review JBoss DNA's 
-			<link linkend="connector-library">existing connectors</link> and show how to <link linkend="custom-connectors">create your own connectors</link>.
-		</para>
-  </sect1>
-  <sect1 id="repository-workspaces">
-    <title>Workspaces</title>
-		<para>The previous section talked about how connector expose their information through the graph language of JBoss DNA.
-			This is true, except that we didn't dive into too much of the detail.  JBoss DNA graphs have the notion of <emphasis>workspaces</emphasis>
-			in which the content appears, and its very easy for clients using the graph to switch between workspaces.  In fact,
-			workspaces differ from each other in that they provide different views of the same information.
-		</para>
-		<para>Consider a source control system, like SVN or CVS.  These systems provide different views of the source code:
-			a mainline development branch as well as other branches (or tags) commonly used for releases.  So, just like one source
-			file might appear in the mainline branch as well as the previous two release branches, a node in a repository source
-			might appear in multiple workspaces.
-		</para>
-		<para>
-			However, each connector can kind of decide how (or whether) it uses workspaces.  For example, there may be no overlap
-			in the content between workspaces.  Or a connector might only expose a single workspace (in other words, there's only one
-			"default" workspace).
-		</para>
-  </sect1>
-  <sect1 id="repository-service">
-    <title>Repository Service</title>
-		<para>The JBoss DNA &RepositoryService; is the component that manages the <emphasis>repository sources</emphasis>
-		  and the connections to them.  &RepositorySource; instances can be programmatically added to the service, but
-			the service can actually read its configuration from a configuration repository (which, by the way, is represented by a
-			just another &RepositorySource; instance that's usually added programmatically to the service).  The service connects to
-			the configuration repository, reads the content in a particular area, and automatically sets up the &RepositorySource; instances
-		  per the information found in the configuration repository.  
-		</para>
-		<para>
-			The &RepositoryService; also transparently maintains for each source a pool of reusable connections.  The pooling properties
-			can be controlled via the configuration repository, or adjusted programmatically.
-		</para>
-    <para>
-			Using a repository, then, involves simply asking the &RepositoryService; for a &RepositoryConnection;
-			to the repository given the repository's name.  If a source exists with that name, the service checks out a connection from
-			the source's pool.  The resulting connection is actually a wrapper around the underlying pooled connection, so the
-			component that requested the connection can simply close it, and under the covers the actual connection is simply returned
-			to the pool.
-    </para>
-		<para>To instantiate the &RepositoryService;, we need to first have a few other objects:
-			<itemizedlist>
-				<listitem>
-					<para>
-						A &ExecutionContext; instance, as discussed <link linkend="execution-context">earlier</link>.
-					</para>
-				</listitem>
-				<listitem>
-					<para>
-						A &RepositoryLibrary; instance that manages the list of &RepositorySource; instances,
-						properly injects the execution contexts into each repository source, and provides a configurable pool of connections
-						for each source.
-					</para>
-				</listitem>
-				<listitem>
-					<para>
-						A <emphasis>configuration repository</emphasis> that contains descriptions of all of the repository sources
-					  as well as any information those sources need.  Because this is a regular repository, this could be a simple 
-					  repository with content loaded from an XML file, or it could be a shared
-					  central repository with information about all of the JBoss DNA repositories used across your organization.
-					</para>
-				</listitem>
-			</itemizedlist>
-			With these components in place, we can then instantiate the &RepositoryService; and start it (using its
-			&ServiceAdministrator;).  During startup, the service reads the configuration repository and loads any
-			defined &RepositorySource; instances into the repository library, using the class loader factory 
-			(available in the &ExecutionContext;) to obtain.
-    </para>
-		<para>
-			Here's sample code that shows how to set up and start the repository service.  You can see something similar
-			in the example application in the <code>startRepositories()</code> method of the 
-			<code>org.jboss.example.dna.repository.RepositoryClient</code> class.
-		</para>
-    <programlisting>
- // Create the top-level execution context with all standard components ...
- &ExecutionContext; context = new ExecutionContext();
-
- // Create the library for the RepositorySource instances ...
- &RepositoryLibrary; sources = new &RepositoryLibrary;(context);
-
- // Load into the source manager the repository source for the configuration repository ...
- &InMemoryRepositorySource; configSource = new &InMemoryRepositorySource;();
- configSource.setName("Configuration");
- sources.addSource(configSource);
-
- // Now instantiate the Repository Service ...
- &RepositoryService; service = new &RepositoryService;(sources, configSource.getName(), context);
- service.getAdministrator().start();
- </programlisting>
-
-		<para>After startup completes, the repositories are ready to be used.  The client application obtains the list of repositories
-			and presents them to the user.  When the user selects one, the client application starts navigating that repository
-			starting at its root node (e.g., the "/" path).  As you type a command to list the contents of the current node or to
-			"change directories" to a different node, the client application obtains the information for the node using a simple
-			procedure:
-			<orderedlist>
-				<listitem>
-					<para>Get a connection to the repository.</para>
-				</listitem>
-				<listitem>
-					<para>Using the connection, find the current node and read its properties and children, putting the information
-						into a simple Java plain old Java object (POJO).</para>
-				</listitem>
-				<listitem>
-					<para>Close the connection to the repository (in a finally block to ensure it always happens).</para>
-				</listitem>
-			</orderedlist>
-		</para>
-  </sect1>
-  <sect1 id="connector-library">
-    <title>Out-of-the-box repository connectors</title>
-    <para>
-    	A number of repository connectors are already available in JBoss DNA, and are outlined in the following sections.
-			Note that we do want to build <ulink url="https://jira.jboss.org/jira/secure/IssueNavigator.jspa?reset=true&amp;mode=hide&amp;pid=12310520&amp;sorter/order=DESC&amp;sorter/field=priority&amp;resolution=-1&amp;component=12311441">more connectors</ulink>
-			in the upcoming releases.
-    </para>
-    <sect2 id="dna-connector-inmemory">
-      <title>In-memory connector</title>
-      <para>
-      	The in-memory repository connector is a simple connector that creates a transient, in-memory repository.
-				This repository is used as a very simple in-memory cache or as a standalone transient repository.
-      </para>
-			<para>
-				The &InMemoryRepositorySource; class provides a number of JavaBean properties that control its behavior:
-			</para>
-			<table frame='all'>
-				<title>&InMemoryRepositorySource; 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>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>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>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>
-						</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>
-						</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>
-    </sect2>
-    <sect2 id="dna-connector-jbosscache">
-      <title>JBoss Cache connector</title>
-      <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="dna-connector-federation">federated</link>
-				repository.
-      </para>
-			<para>
-				The &JBossCacheSource; class provides a number of JavaBean properties that control its behavior:
-			</para>
-			<table frame='all'>
-				<title>&JBossCacheSource; 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>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>cacheFactoryJndiName</entry>
-							<entry>Optional property that, if used, specifies the name in JNDI where an existing JBoss Cache Factory instance can be found.
-								That factory would then be used if needed to create a JBoss Cache instance.  If no value is provided, then the
-								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
-								a special way.</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>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>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>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 defines the names of the workspaces that exist and that are available for use without having to create them.</entry>
-						</row>
-						<row>
-							<entry>creatingWorkspacesAllowed</entry>
-							<entry>Optional property that is by default 'true' that defines whether clients can create new workspaces.</entry>
-						</row>
-					</tbody>
-				</tgroup>
-			</table>
-    </sect2>
-    <sect2 id="dna-connector-federation">
-      <title>Federating connector</title>
-      <para>
-      	The federated repository source provides a unified repository consisting of information that is dynamically federated from multiple other
-				&RepositorySource; instances.  This is a very powerful repository source that appears to be a single repository, when in 
-				fact the content is stored and managed in multiple other systems.  Each &FederatedRepositorySource; is typically configured
-				with the name of another &RepositorySource; that should be used as the local, unified cache of the federated content.
-				The configuration also contains the names of the other &RepositorySource; instances that are to be federated along with
-				the &Projection; definition describing where in the unified repository the content is to appear.
-      </para>
-			<figure id="dna-connector-federation-image">
-				<title>Federating multiple sources using the Federated Repository Connector</title>
-				<graphic align="center" scale="100" fileref="dna-connector-federation.png"/>
-			</figure>
-      <para> The federation connector works by effectively building up a single graph by querying each source and merging or
-        unifying the responses. This information is cached, which improves performance, reduces the number of (potentially
-        expensive) remote calls, reduces the load on the sources, and helps mitigate problems with source availability. As
-        clients interact with the repository, this cache is consulted first. When the requested portion of the graph (or
-        "subgraph") is contained completely in the cache, it is retuned immediately. However, if any part of the requested
-        subgraph is not in the cache, each source is consulted for their contributions to that subgraph, and any results are
-        cached.</para>
-      <para> This basic flow makes it possible for the federated repository to build up a local cache of the integrated graph
-        (or at least the portions that are used by clients). In fact, the federated repository caches information in a manner
-        that is similar to that of the Domain Name System (DNS). As sources are consulted for their contributions, the source
-        also specifies whether it is the authoritative source for this information (some sources that are themselves federated
-        may not be the information's authority), whether the information may be modified, the time-to-live (TTL) value (the time
-        after which the cached information should be refreshed), and the expiration time (the time after which the cached
-        information is no longer valid). In effect, the source has complete control over how the information it contributes is
-        cached and used.</para>
-      <para>
-        The federated repository also needs to incorporate <emphasis>negative caching</emphasis>, which is storage of the knowledge 
-				that something does <emphasis>not</emphasis> exist. Sources can be configured to contribute information
-        only below certain paths (e.g., <code>/A/B/C</code>), and the federation engine can take advantage of this by never 
-				consulting that source for contributions to information on other paths. However, below that path, any negative responses 
-				must also be cached (with appropriate TTL and expiry parameters) to prevent the exclusion of that source (in case the source 
-				has information to contribute at a later time) or the frequent checking with the source.
-      </para>
-			<para>
-				The federated repository uses other &RepositorySource;s that are to be federated and a &RepositorySource; that is to be used as the
-				cache of the unified contents.  These are configured in another &RepositorySource; that is treated as a configuration repository.
-				The &FederatedRepositorySource; class uses JavaBean properties to define the name of the configuration repository and 
-				the path to the "<code>dna:federation</code>" node in that configuration repository containing the information about the 
-				cache and federated sources.  This graph structure that is expected at this location is as follows:
-			</para>
-			<programlisting><![CDATA[<!-- Define the federation configuration. -->
-<dna:federatedRepository xmlns:dna="http://www.jboss.org/dna" 
-	                   xmlns:jcr="http://www.jcp.org/jcr/1.0"
-                     dna:timeToCache="100000" >
-  <dna:workspaces>
-    <dna:workspace jcr:name="default">
-	    <!-- Define how the content in the 'Cache' source is to map to the federated cache -->
-      <dna:cache dna:sourceName="Cache" dna:workspaceName="default" dna:projectionRules="/a => /" />
-
-      <!-- Define how the content in the two sources maps to the federated/unified repository.
-           This example puts the 'Cars' and 'Aircraft' content underneath '/vehicles', but the
-           'Configuration' content (which is defined by this file) will appear under '/'. -->
-      <dna:projections>
-        <dna:projection jcr:name="Cars" dna:projectionRules="/Vehicles => /" />
-        <dna:projection jcr:name="Aircraft" dna:projectionRules="/Vehicles => /" />
-        <dna:projection jcr:name="Configuration" dna:projectionRules="/ => /" />
-      </dna:projections>
-    </dna:workspace>
-	</dna:workspaces>
-</dna:federatedRepository>
-]]></programlisting>
-			<note>
-				<para>
-					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
-					works.
-				</para>
-			</note>
-			<para>
-				Notice that there is a cache projection and three source projections, and each projection defines
-				one or more <emphasis>projection rules</emphasis> that are of the form:
-			</para>
-			<programlisting>pathInFederatedRepository =&gt; pathInSourceRepository</programlisting>
-			<para>
-				So, a projection rule <code>/Vehicles =&gt; /</code> projects the entire contents of the source so that
-				it appears in the federated repository under the "<code>/Vehicles</code>" node.
-			</para>
-			<para>
-				The &FederatedRepositorySource; class provides a number of JavaBean properties that control its behavior:
-			</para>
-			<table frame='all'>
-				<title>&FederatedRepositorySource; 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>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>repositoryName</entry>
-							<entry>The name for the federated repository.</entry>
-						</row>
-						<row>
-							<entry>configurationSourceName</entry>
-							<entry>The name of the &RepositorySource; that should be used as the configuration repository, and in which is defined
-								how this federated repository is to be set up and configured.
-								This name is supplied to the &RepositoryConnectionFactory; that is provided to this instance when added to the
-								&RepositoryLibrary;.</entry>
-						</row>
-						<row>
-							<entry>configurationWorkspaceName</entry>
-							<entry>The name of the workspace in the configuration &RepositorySource; with the content defining
-								how this federated repository is to be set up and configured.</entry>
-						</row>
-						<row>
-							<entry>configurationSourcePath</entry>
-							<entry>The path to the node in the configuration repository below which a "dna:federation" node exists with the 
-								graph structure describing how this federated repository is to be configured.</entry>
-						</row>
-						<row>
-							<entry>securityDomain</entry>
-							<entry>Optional property that, if used, specifies the name of the JAAS application context that should be used
-								to establish the <link linkend="execution-contenxt">execution context</link> for this repository.
-								This should correspond to the JAAS login configuration located within the JAAS login configuration file, 
-								and should be used only if a "<code>username</code>" property is defined.</entry>
-						</row>
-						<row>
-							<entry>username</entry>
-							<entry>Optional property that, if used, defines the name of the JAAS subject that should be used
-								to establish the <link linkend="execution-contenxt">execution context</link> for this repository.
-								This should be used if a "<code>securityDomain</code>" property is defined.</entry>
-						</row>
-						<row>
-							<entry>password</entry>
-							<entry>Optional property that, if used, defines the password of the JAAS subject that should be used
-								to establish the <link linkend="execution-contenxt">execution context</link> for this repository.
-								If the password is not provided but values for the "<code>securityDomain</code>" and "<code>username</code>" properties are,
-								then authentication will use the default JAAS callback handlers.</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>
-						</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>
-					</tbody>
-				</tgroup>
-			</table>
-    </sect2>
-  </sect1>
-  <sect1 id="custom-connectors">
-    <title>Writing custom connectors</title>
-    <para>
-		  There may come a time when you want to tackle creating your own repository connector.  Maybe the connectors we provide out-of-the-box
-			don't work with your source.  Maybe you want to use a different cache system.  
-			Maybe you have a system that you want to make available through a JBoss DNA repository.  Or, maybe you're
-			a contributor and want to help us round out our library with a new connector.  No matter what the reason, creating a new connector
-			is pretty straightforward, as we'll see in this section.
-    </para>
-	  <para>
-		  Creating a custom connector involves the following steps:
-		  <orderedlist>
-		    <listitem>
-		      <para>Create a Maven 2 project for your connector;</para>
-		    </listitem>
-		    <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 
-						<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.
-					</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
-						in different environments, and try to make the failure messages clear when the tests can't connect to the underlying source.)
-					</para>
-		    </listitem>
-		    <listitem>
-		      <para>
-						Configure JBoss DNA to use your connector.  This may involve just registering the source with the &RepositoryService;,
-			   		or it may involve adding a source to a configuration repository used by the <link linkend="dna-connector-federation">federated repository</link>.
-					</para>
-		    </listitem>
-		    <listitem>
-		      <para>
-						Deploy the JAR file with your connector (as well as any dependencies), and make them available to JBoss DNA
-		      	in your application.
-					</para>
-		    </listitem>
-		  </orderedlist>
-		  Let's go through each one of these steps in more detail.
-	  </para>
-	  <sect2 id="custom_connector_project">
-	    <title>Creating the Maven 2 project</title>
-	    <para>
-				The first step is to create the Maven 2 project that you can use to compile your code and build the JARs.
-	    	Maven 2 automates a lot of the work, and since you're already <link linkend="maven">set up to use Maven</link>,
-	    	using Maven for your project will save you a lot of time and effort.  Of course, you don't have to use Maven 2, but then you'll
-	    	have to get the required libraries and manage the compiling and building process yourself.</para>
-	    <note>
-	      <para>JBoss DNA may provide in the future a Maven archetype for creating connector projects.  If you'd find this useful
-	        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.
-		    	See the subversion repository: <ulink url="&Subversion;trunk/extensions/dna-connector-filesystem/">&Subversion;trunk/extensions/dna-connector-filesystem/</ulink>
-		    </para>
-		  </note>
-	    <para>
-				You can create your Maven project any way you'd like.  For examples, see the 
-				<ulink url="http://maven.apache.org/guides/getting-started/index.html#How_do_I_make_my_first_Maven_project">Maven 2 documentation</ulink>.  
-	    	Once you've done that, just add the dependencies in your project's <code>pom.xml</code> dependencies section:
-			</para>
-	  	<programlisting role="XML"><![CDATA[
-<dependency>
-  <groupId>org.jboss.dna</groupId>
-  <artifactId>dna-graph</artifactId>
-  <version>0.4</version>
-</dependency>
-	 ]]></programlisting>
-			<para>
-				This is the only dependency required for compiling a connector - Maven pulls in all of the dependencies needed by 
-				the 'dna-graph' artifact.  Of course, you'll still have to add dependencies for any library your connector needs
-				to talk to its underlying system.
-			</para>
-	  	<para>
-				As for testing, you probably will want to add more dependencies, such as those listed here:
-			</para>
-			<programlisting role="XML"><![CDATA[
-<dependency>
-  <groupId>org.jboss.dna</groupId>
-  <artifactId>dna-graph</artifactId>
-  <version>0.4</version>
-  <type>test-jar</type>
-  <scope>test</scope>
-</dependency>
-<dependency>
-  <groupId>org.jboss.dna</groupId>
-  <artifactId>dna-common</artifactId>
-  <version>0.4</version>
-  <type>test-jar</type>
-  <scope>test</scope>
-</dependency>
-<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>
-<!-- Logging with Log4J -->
-<dependency>
-  <groupId>org.slf4j</groupId>
-  <artifactId>slf4j-log4j12</artifactId>
-  <version>1.4.3</version>
-  <scope>test</scope>
-</dependency>
-<dependency>
-  <groupId>log4j</groupId>
-  <artifactId>log4j</artifactId>
-  <version>1.2.14</version>
-  <scope>test</scope>
-</dependency>
-	 ]]></programlisting>
-	  	<para>
-				Testing JBoss DNA connectors does not require a JCR repository or the JBoss DNA services.  (For more detail,
-	  		see the <link linkend="testing_custom_connectors">testing section</link>.) However, if you want to do
-	  		integration testing with a JCR repository and the JBoss DNA services, you'll need additional dependencies
-				(e.g., <code>dna-repository</code> and any other extensions).
-			</para>
-	    <para>
-				At this point, your project should be set up correctly, and you're ready to move on to 
-	  		<link linkend="implementing_repository_source">writing the Java implementation</link> for your connector.
-			</para>
-	  </sect2>
-	  <sect2 id="implementing_repository_source">
-	    <title>Implementing a <code>RepositorySource</code></title>
-	    <para>
-				As mentioned earlier, a <emphasis>connector</emphasis> consists of the Java code that is used to access content
-				from a system.  Perhaps the most important class that makes up a connector is the implementation of the
-				&RepositorySource;.  This class is analogous to JDBC's DataSource in that it is instantiated to represent
-				a single instance of a system that will be accessed, and it contains enough information (in the form of JavaBean properties)
-				so that it can create connections to the source.
-			</para>
-			<para>
-				Why is the &RepositorySource; implementation a JavaBean?  Well, this is the class that is instantiated, usually
-				reflectively, and so a no-arg constructor is required.  Using JavaBean properties makes it possible
-				to reflect upon the object's class to determine the properties that can be set (using setters) and read
-				(using getters).  This means that an administrative application can instantiate, configure, and manage
-				the objects that represent the actual sources, without having to know anything about the actual implementation.
-			</para>
-			<para>
-				So, your connector will need a public class that implements &RepositorySource; and provides JavaBean properties
-				for any kind of inputs or options required to establish a connection to and interact with the underlying source.
-				Most of the semantics of the class are defined by the &RepositorySource; and inherited interface.
-				However, there are a few characteristics that are worth mentioning here.
-			</para>
-			<sect3 id="connector_cache_policy">
-				<title>Cache policy</title>
-				<para>
-					Each connector is responsible for determining whether and how long DNA is to cache the
-					content made available by the connector.  This is referred to as the <emphasis>caching policy</emphasis>,
-					and consists of a <emphasis>time to live</emphasis> value representing the number of milliseconds that
-					a piece of data may be cached.  After the TTL has passed, the information is no longer used.
-				</para>
-				<para>
-					DNA allows a connector to use a flexible and powerful caching policy.  First, each connection returns the
-					<emphasis>default</emphasis> caching policy for all information returned by that connection.
-					Often this policy can be configured via properties on the &RepositorySource; implementation.
-					This is optional, meaning the connector can return <code>null</code> if it does not wish to
-					have a default caching policy.
-				</para>
-				<para>
-					Second, the connector is able to override its default caching policy on individual requests
-					(which we'll cover in the <link linkend="implementing_repository_connection">next section</link>).
-					Again, this is optional, meaning that a null caching policy on a request implies that the
-					request has no overridden caching policy.
-				</para>
-				<para>
-					Third, if the connector has no default caching policy and none is set on the individual requests,
-					DNA uses whatever caching policy is set up for that component using the connector.  For example, the federating
-					connector allows a default caching policy to be specified, and this policy is used should the sources
-					being federated not define their own caching policy.
-				</para>
-				<para>
-					In summary, a connector has total control over whether and for how long the information it provides
-					is cached.
-				</para>
-			</sect3>
-			<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.
-					One example of this is the JBoss Cache connector: while the connector can
-					instantiate a new JBoss Cache instance, more interesting use cases involve JBoss Cache instances that are
-					set up for clustering and replication, something that is generally difficult to configure in a single JavaBean.
-					Therefore the &JBossCacheSource; has optional JavaBean properties that define how it is to look up a
-					JBoss Cache instance in JNDI.  
-				</para>
-				<para>
-					This is a simple pattern that you may find useful in your connector.  Basically, if your source implementation
-					can look up an object in JNDI, simply use a single JavaBean String property that defines the 
-					full name that should be used to locate that object in JNDI.  Usually it's best to include "Jndi" in the
-					JavaBean property name so that administrative users understand the purpose of the property.
-					(And some may suggest that any optional property also use the word "optional" in the property name.)
-				</para>
-			</sect3>
-			<sect3 id="repository_source_capabilities">
-				<title>Capabilities</title>
-				<para>
-					Another characteristic of a &RepositorySource; implementation is that it provides some hint as to whether
-					it supports several features.  This is defined on the interface as a method that returns a
-					&RepositorySourceCapabilities; object.  This class currently provides methods that say whether the connector supports
-					updates, whether it supports same-name-siblings (SNS), and whether the connector supports listeners and events.
-				</para>
-				<para>
-					Note that these may be hard-coded values, or the connector's response may be determined at runtime by various factors.
-					For example, a connector may interrogate the underlying system to decide whether it can support updates.
-				</para>
-				<para>
-					The &RepositorySourceCapabilities; can be used as is (the class is immutable), or it can be subclassed
-					to provide more complex behavior.  It is important, however, that the capabilities remain constant
-					throughout the lifetime of the &RepositorySource; instance.
-				</para>
-				<note>
-					<para>
-						Why a concrete class and not an interface?  By using a concrete class, connectors inherit the default
-						behavior.  If additional capabilities need to be added to the class in future releases, connectors may
-						not have to override the defaults.  This provides some insulation against future enhancements to the connector framework.
-					</para>
-				</note>
-			</sect3>
-			<sect3 id="repository_source_security">
-				<title>Security and authentication</title>
-				<para>
-					As we'll see in the next section, the main method connectors have to process requests takes an &ExecutionContext;,
-					which contains the JAAS security information of the subject performing the request.  This means that the connector
-					can use this to determine authentication and authorization information for each request.
-				</para>
-				<para>
-					Sometimes that is not sufficient.  For example, it may be that the connector needs its own authorization information
-					so that it can establish a connection (even if user-level privileges still use the &ExecutionContext; provided with
-					each request).  In this case, the &RepositorySource; implementation will probably need JavaBean properties
-					that represent the connector's authentication information.  This may take the form of a username and password,
-					or it may be properties that are used to delegate authentication to JAAS.  
-					Either way, just realize that it's perfectly acceptable for the connector to require its own security properties.
-				</para>
-			</sect3>
-		</sect2>
-	  <sect2 id="implementing_repository_connection">
-	    <title>Implementing a <code>RepositoryConnection</code></title>
-	    <para>
-				One job of the &RepositorySource; implementation is to create connections to the underlying sources.
-				Connections are represented by classes that implement the &RepositoryConnection; interface, and creating this
-				class is the next step in writing a repository connector.  This is what we'll cover in this section.
-			</para>
-	    <para>
-				The &RepositoryConnection; interface is pretty straightforward:
-			</para>
-	    <programlisting>
-/**
- * A connection to a repository source.
- * <p>
- * These connections need not support concurrent operations by multiple threads.
- * </p>
- */
- at NotThreadSafe
-public interface &RepositoryConnection; {
-
-    /**
-     * Get the name for this repository source. This value should be the same as that returned
-     * by the same &RepositorySource; that created this connection.
-     * 
-     * @return the identifier; never null or empty
-     */
-    String getSourceName();
-
-    /**
-     * Return the transactional resource associated with this connection. The transaction manager 
-     * will use this resource to manage the participation of this connection in a distributed transaction.
-     * 
-     * @return the XA resource, or null if this connection is not aware of distributed transactions
-     */
-    XAResource getXAResource();
-
-    /**
-     * Ping the underlying system to determine if the connection is still valid and alive.
-     * 
-     * @param time the length of time to wait before timing out
-     * @param unit the time unit to use; may not be null
-     * @return true if this connection is still valid and can still be used, or false otherwise
-     * @throws InterruptedException if the thread has been interrupted during the operation
-     */
-    boolean ping( long time, &TimeUnit; unit ) throws InterruptedException;
-
-    /**
-     * Set the listener that is to receive notifications to changes to content within this source.
-     * 
-     * @param listener the new listener, or null if no component is interested in the change notifications
-     */
-    void setListener( &RepositorySourceListener; listener );
-
-    /**
-     * Get the default cache policy for this repository. If none is provided, a global cache policy
-     * will be used.
-     * 
-     * @return the default cache policy
-     */
-    &CachePolicy; getDefaultCachePolicy();
-
-    /**
-     * Execute the supplied commands against this repository source.
-     * 
-     * @param context the environment in which the commands are being executed; never null
-     * @param request the request to be executed; never null
-     * @throws RepositorySourceException if there is a problem loading the node data
-     */
-    void execute( &ExecutionContext; context,
-                  &Request; request ) throws &RepositorySourceException;;
-
-    /**
-     * Close this connection to signal that it is no longer needed and that any accumulated 
-     * resources are to be released.
-     */
-    void close();
-}</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
-				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>
-				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
-				as well as the subject performing the request.  This was discussed <link linkend="execution-context">earlier</link>.
-			</para>
-	    <para>
-				The second parameter, however, represents a request that is to be processed by the connector.  Request objects can
-				take many different forms, as there are different classes for each kind of request (see the table below).
-				Each request contains the information a connector needs to do the processing, and it also is the place
-				where the connector places the results (or the error, if one occurs).
-			</para>
-			<para>
-				How do the requests reference a node (or nodes)? Since requests are coming from a client, the client 
-				may identify a particular node using a &Location; object that is created with:
-			  <itemizedlist>
-			    <listitem>
-			      <para>the &Path; to the node; or</para>
-			    </listitem>
-			    <listitem>
-			      <para>one or more <emphasis>identification properties</emphasis> that are likely source=specific
-							and that are represented with &Property; objects; or</para>
-			    </listitem>
-			    <listitem>
-			      <para>a combination of both.</para>
-			    </listitem>
-			  </itemizedlist>
-				So, when a client knows the path or the identification properties, they can create a &Location;.  However,
-				all of the requests return &Location; objects, so often times the client simply uses the location
-				from a previous request.  Since &Location; is an immutable class, it is perfectly safe to reuse them.
-			</para>
-			<para>
-				One more thing about locations: while the request may have an incomplete location (e.g., a path but no
-				identification properties), the connector is expected to set on the request the <emphasis>actual</emphasis>
-				location that contains the path and all identification properties.  So as long as the client
-				reuses the actual locations in subsequent requests, the connectors will have the benefit of having
-				both the path and identification properties.  Connectors can then be written to leverage this
-				information, although the connector should still perform as expected when requests have incomplete locations.
-			</para>
-			<table frame='all'>
-				<title>Types of Node Operation Requests</title>
-				<tgroup cols='2' align='left' colsep='1' rowsep='1'>
-		      <colspec colname='c1' colwidth="1*"/>
-		      <colspec colname='c2' colwidth="1*"/>
-					<thead>
-						<row>
-				  		<entry>Name</entry>
-				  		<entry>Description</entry>
-						</row>
-					</thead>
-					<tbody>
-						<row>
-							<entry>ReadNodeRequest</entry>
-							<entry>
-								A request to read from the named workspace in the source a node's properties and children.
-								The node may be specified by path and/or by identification properties.
-								The connector returns all properties and the locations for all children,
-								or sets a &PathNotFoundException; error on the request if the node did not exist in the workspace.
-								If the node is found, the connector sets on the request the actual location of the node (including the path and identification properties).
-								The connector sets a &InvalidWorkspaceException; error on the request if the named workspace does not exist.
-							</entry>
-						</row>
-						<row>
-							<entry>VerifyNodeExistsRequest</entry>
-							<entry>
-								A request to verify the existance of a node at the specified location in the named workspace of the source.
-								The connector returns all the actual location for the node if it exists, or
-								sets a &PathNotFoundException; error on the request if the node does not exist in the workspace.
-								The connector sets a &InvalidWorkspaceException; error on the request if the named workspace does not exist.
-							</entry>
-						</row>
-						<row>
-							<entry>ReadAllPropertiesRequest</entry>
-							<entry>
-								A request to read from the named workspace in the source all of the properties of a node.
-								The node may be specified by path and/or by identification properties.
-								The connector returns all properties that were found on the node,
-								or sets a &PathNotFoundException; error on the request if the node did not exist in the workspace.
-								If the node is found, the connector sets on the request the actual location of the node (including the path and identification properties).
-								The connector sets a &InvalidWorkspaceException; error on the request if the named workspace does not exist.
-							</entry>
-						</row>
-						<row>
-							<entry>ReadPropertyRequest</entry>
-							<entry>
-								A request to read from the named workspace in the source a single property of a node.
-								The node may be specified by path and/or by identification properties,
-								and the property is specified by name.
-								The connector returns the property if found on the node,
-								or sets a &PathNotFoundException; error on the request if the node or property did not exist in the workspace.
-								If the node is found, the connector sets on the request the actual location of the node (including the path and identification properties).
-								The connector sets a &InvalidWorkspaceException; error on the request if the named workspace does not exist.
-							</entry>
-						</row>
-						<row>
-							<entry>ReadAllChildrenRequest</entry>
-							<entry>
-								A request to read from the named workspace in the source all of the children of a node.
-								The node may be specified by path and/or by identification properties.
-								The connector returns an ordered list of locations for each child found on the node,
-								an empty list if the node had no children,
-								or sets a &PathNotFoundException; error on the request if the node did not exist in the workspace.
-								If the node is found, the connector sets on the request the actual location of the parent node (including the path and identification properties).
-								The connector sets a &InvalidWorkspaceException; error on the request if the named workspace does not exist.
-							</entry>
-						</row>
-						<row>
-							<entry>ReadBlockOfChildrenRequest</entry>
-							<entry>
-								A request to read from the named workspace in the source a block of children of a node, starting with the n<superscript>th</superscript> children.
-								This is designed to allow paging through the children, which is much more efficient for large numbers of children.
-								The node may be specified by path and/or by identification properties, and the block
-								is defined by a starting index and a count (i.e., the block size).
-								The connector returns an ordered list of locations for each of the node's children found in the block,
-								or an empty list if there are no children in that range.
-								The connector also sets on the request the actual location of the parent node (including the path and identification properties)
-								or sets a &PathNotFoundException; error on the request if the parent node did not exist in the workspace.
-								The connector sets a &InvalidWorkspaceException; error on the request if the named workspace does not exist.
-							</entry>
-						</row>
-						<row>
-							<entry>ReadNextBlockOfChildrenRequest</entry>
-							<entry>
-								A request to read from the named workspace in the source a block of children of a node, starting with the children that immediately follow
-								a previously-returned child.
-								This is designed to allow paging through the children, which is much more efficient for large numbers of children.
-								The node may be specified by path and/or by identification properties, and the block
-								is defined by the location of the node immediately preceding the block and a count (i.e., the block size).
-								The connector returns an ordered list of locations for each of the node's children found in the block,
-								or an empty list if there are no children in that range.
-								The connector also sets on the request the actual location of the parent node (including the path and identification properties)
-								or sets a &PathNotFoundException; error on the request if the parent node did not exist in the workspace.
-								The connector sets a &InvalidWorkspaceException; error on the request if the named workspace does not exist.
-							</entry>
-						</row>
-						<row>
-							<entry>ReadBranchRequest</entry>
-							<entry>
-								A request to read a portion of a subgraph that has as its root a particular node, up to a maximum depth.
-								This request is an efficient mechanism when a branch (or part of a branch) is to be navigated and processed,
-								and replaces some non-trivial code to read the branch iteratively using multiple <code>ReadNodeRequest</code>s.
-								The connector reads the branch to the specified maximum depth, returning the properties and children for all
-								nodes found in the branch.  
-								The connector also sets on the request the actual location of the branch's root node (including the path and identification properties).
-								The connector sets a &PathNotFoundException; error on the request if the node at 
-								the top of the branch does not exist in the workspace.
-								The connector sets a &InvalidWorkspaceException; error on the request if the named workspace does not exist.
-							</entry>
-						</row>
-						<row>
-							<entry>CreateNodeRequest</entry>
-							<entry>
-								A request to create a node at the specified location and setting on the new node the properties included in the request.
-								The connector creates the node at the desired location, adjusting any same-name-sibling indexes as required.
-								(If an SNS index is provided in the new node's location, existing children with the same name after that SNS index
-								will have their SNS indexes adjusted.  However, if the requested location does not include a SNS index, the new
-								node is added after all existing children, and it's SNS index is set accordingly.)
-								The connector also sets on the request the actual location of the new node (including the path and identification properties)..
-								The connector sets a &PathNotFoundException; error on the request if the parent node does not exist in the workspace.
-								The connector sets a &InvalidWorkspaceException; error on the request if the named workspace does not exist.
-							</entry>
-						</row>
-						<row>
-							<entry>RemovePropertiesRequest</entry>
-							<entry>
-								A request to remove a set of properties on an existing node.  The request contains the location of the node as well as the
-								names of the properties to be removed.  The connector performs these changes and sets on the request the
-								actual location (including the path and identification properties) of the node.
-								The connector sets a &PathNotFoundException; error on the request if the node does not exist in the workspace.
-								The connector sets a &InvalidWorkspaceException; error on the request if the named workspace does not exist.
-							</entry>
-						</row>
-						<row>
-							<entry>UpdatePropertiesRequest</entry>
-							<entry>
-								A request to set or update properties on an existing node.  The request contains the location of the node as well as the
-								properties to be set and those to be deleted.  The connector performs these changes and sets on the request the
-								actual location (including the path and identification properties) of the node.
-								The connector sets a &PathNotFoundException; error on the request if the node does not exist in the workspace.
-								The connector sets a &InvalidWorkspaceException; error on the request if the named workspace does not exist.
-							</entry>
-						</row>
-						<row>
-							<entry>RenameNodeRequest</entry>
-							<entry>
-								A request to change the name of a node.  The connector changes the node's name, adjusts all SNS indexes
-								accordingly, and returns the actual locations (including the path and identification properties) of both the original
-								location and the new location.
-								The connector sets a &PathNotFoundException; error on the request if the node does not exist in the workspace.
-								The connector sets a &InvalidWorkspaceException; error on the request if the named workspace does not exist.
-							</entry>
-						</row>
-						<row>
-							<entry>CopyBranchRequest</entry>
-							<entry>
-								A request to copy a portion of a subgraph that has as its root a particular node, up to a maximum depth.
-								The request includes the name of the workspace where the original node is located as well as the name of the
-								workspace where the copy is to be placed (these may be the same, but may be different).
-								The connector copies the branch from the original location, up to the specified maximum depth, and places a copy
-								of the node as a child of the new location.
-								The connector also sets on the request the actual location (including the path and identification properties)
-								of the original location as well as the location of the new copy.
-								The connector sets a &PathNotFoundException; error on the request if the node at 
-								the top of the branch does not exist in the workspace.
-								The connector sets a &InvalidWorkspaceException; error on the request if one of the named workspaces does not exist.
-							</entry>
-						</row>
-						<row>
-							<entry>MoveBranchRequest</entry>
-							<entry>
-								A request to move a subgraph that has a particular node as its root.
-								The connector moves the branch from the original location and places it as child of the specified new location.
-								The connector also sets on the request the actual location (including the path and identification properties)
-								of the original and new locations.  The connector will adjust SNS indexes accordingly.
-								The connector sets a &PathNotFoundException; error on the request if the node that is to be moved or the
-								new location do not exist in the workspace.
-								The connector sets a &InvalidWorkspaceException; error on the request if the named workspace does not exist.
-							</entry>
-						</row>
-						<row>
-							<entry>DeleteBranchRequest</entry>
-							<entry>
-								A request to delete an entire branch specified by a single node's location.
-								The connector deletes the specified node and all nodes below it, and sets the actual location,
-								including the path and identification properties, of the node that was deleted.
-								The connector sets a &PathNotFoundException; error on the request if the node being deleted does not exist in the workspace.
-								The connector sets a &InvalidWorkspaceException; error on the request if the named workspace does not exist.
-							</entry>
-						</row>
-						<row>
-							<entry>CompositeRequest</entry>
-							<entry>
-								A request that actually comprises multiple requests (none of which will be a composite).
-								The connector simply processes all of the requests in the composite request, but should set on the composite
-								request any error (usually the first error) that occurs during processing of the contained requests.
-							</entry>
-						</row>
-					</tbody>
-				</tgroup>
-			</table>
-			<para>There are also requests that deal with workspaces:</para>
-			<table frame='all'>
-				<title>Types of Workspace Requests</title>
-				<tgroup cols='2' align='left' colsep='1' rowsep='1'>
-		      <colspec colname='c1' colwidth="1*"/>
-		      <colspec colname='c2' colwidth="1*"/>
-					<thead>
-						<row>
-				  		<entry>Name</entry>
-				  		<entry>Description</entry>
-						</row>
-					</thead>
-					<tbody>
-						<row>
-							<entry>GetWorkspacesRequest</entry>
-							<entry>
-								A request to obtain the names of the existing workspaces that are accessible to the caller.
-							</entry>
-						</row>
-						<row>
-							<entry>VerifyWorkspaceRequest</entry>
-							<entry>
-								A request to verify that a workspace with a particular name exists.
-								The connector returns the actual location for the root node if the workspace exists, as well as the actual name of the workspace
-								(e.g., the default workspace name if a null name is supplied).
-							</entry>
-						</row>
-						<row>
-							<entry>CreateWorkspaceRequest</entry>
-							<entry>
-								A request to create a workspace with a particular name.
-								The connector returns the actual location for the root node if the workspace exists, as well as the actual name of the workspace
-								(e.g., the default workspace name if a null name is supplied).
-								The connector sets a &InvalidWorkspaceException; error on the request if the named workspace already exists.
-							</entry>
-						</row>
-						<row>
-							<entry>DestroyWorkspaceRequest</entry>
-							<entry>
-								A request to destroy a workspace with a particular name.
-								The connector sets a &InvalidWorkspaceException; error on the request if the named workspace does not exist.
-							</entry>
-						</row>
-						<row>
-							<entry>CloneWorkspaceRequest</entry>
-							<entry>
-								A request to clone one named workspace as another new named workspace.
-								The connector sets a &InvalidWorkspaceException; error on the request if the original workspace does not exist, 
-								or if the new workspace already exists.
-							</entry>
-						</row>
-					</tbody>
-				</tgroup>
-			</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;.
-				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 DNA provides a &RequestProcessor; class that can simplify writing your own connector and at the
-				same time help insulate your connector from new kinds of requests that may be added in the future.  The &RequestProcessor;
-				is an abstract class that defines a <code>process(...)</code> method for each concrete &Request; subclass.
-				In other words, there is a <code>process(CompositeRequest)</code> method, a <code>process(ReadNodeRequest)</code> method,
-				and so on.  
-			</para>
-			<para>
-				To use this in your connector, simply create a subclass of &RequestProcessor;, overriding all of the abstract methods and optionally
-				overriding any of the other methods that have a default implementation.
-			</para>
-			<note>
-				<para>
-					The &RequestProcessor; abstract class contains default implementations for quite a few of the <code>process(...)</code> methods,
-					and these will be <emphasis>sufficient</emphasis>	but probably not efficient or optimum.  If you can provide a more efficient
-					implementation given your source, feel free to do so.  However, if performance is not a big issue, all of the concrete methods
-					will provide the correct behavior. Keep things simple to start out - you can always provide better implementations later.
-				</para>
-			</note>
-			<para>
-				Then, in your connector's <code>execute(&ExecutionContext;, &Request;)</code> method, instantiate your &RequestProcessor; subclass
-				and call its <code>process(&Request;) method, passing in the <code>execute(...)</code> method's &Request; parameter.</code>
-				The &RequestProcessor; will determine the appropriate method given the actual &Request; object and will then invoke that method:
-			</para>
-	    <programlisting>
-public void execute( final &ExecutionContext; context,
-                     final &Request; request ) throws RepositorySourceException {
-    RequestProcessor processor = new RequestProcessor(context);
-    try {
-        processor.process(request);
-    } finally {
-        processor.close();
-    }
-}</programlisting>
-			<para>
-				If you do this, the bulk of your connector implementation may be in the &RequestProcessor; implementation methods.
-				This not only is pretty maintainable, it also lends itself to easier testing.  And should any new request types be added
-				in the future, your connector may work just fine without any changes.  In fact, if the &RequestProcessor; class
-				can implement meaningful methods for those new request types, your connector may "just work".  Or, at least
-				your connector will still be binary compatible, even if your connector won't support any of the new features.
-			</para>
-			<para>
-				Finally, how should the connector handle exceptions?  As mentioned above, each &Request; object has a slot where the connector
-				can set any exception encountered during processing.  This not only handles the exception, but in the case of &CompositeRequest;s
-				it also correctly associates the problem with the request.  However, it is perfectly acceptable to throw an exception
-				if the connection becomes invalid (e.g., there is a communication failure) or if a fatal error would prevent subsequent
-				requests from being processed.
-			</para>
-		</sect2>
-	  <sect2 id="testing_custom_connectors">
-	    <title>Testing custom connectors</title>
-	    <para>
-				Testing connectors is not really that much different than testing other classes.  Using mocks may help to isolate your
-				instances so you can create more unit tests that don't require the underlying source system.
-			</para>
-	    <para>
-				However, there may be times when you have to use the underlying source system in your tests.  If this is the case,
-				we recommend using Maven integration tests, which run at a different point in the Maven lifecycle.  The benefit of
-				using integration tests is that by convention they're able to rely upon external systems.  Plus, your unit tests
-				don't become polluted with slow-running tests that break if the external system is not available.
-			</para>
-		</sect2>
-	  <sect2 id="deploying_custom_connectors">
-	    <title>Configuring and deploying custom connectors</title>
-	    <para>
-				After building your connector project, you need to configure the JBoss DNA components your application is using so
-				that they use your connector.  In a lot of cases, this will entail instantiating your connector's &RepositorySource; class,
-				setting the various properties, and registering it with a &RepositoryLibrary;.  Or, it will entail using a configuration
-				repository to use your source and letting &RepositoryService; instantiate and set up your &RepositorySource; instance.
-				Or, you can just instantiate and set it up manually, passing the instance to whatever component needs it.
-			</para>
-			<para>
-				And of course you have to make the JAR file containing your connector (as well as any dependency JARs) available to
-				your application's classpath.
-			</para>
-		</sect2>
-  </sect1>
-	<sect1 id="dna_graph_api">
-		<title>Graph API for using connectors</title>
-		<para>
-			So far we've talked about repositories, repository connectors, and how connectors respond to the different kinds of requests.
-			Normally you'd code to the JCR API and use our JCR implementation.  However, what does your code look like if you want 
-			to use the connectors directly, without using our JCR implementation?  After all, you may be a contributor to JBoss DNA,
-			or you may want to take advantage of our connectors without all the overhead of JCR.
-		</para>
-		<para>
-			One option, of course, is to explicitly create the different requests and pass them to the connector's <code>execute(...)</code> method.
-			While this is the most efficient approach (and one taken in some key DNA components), you probably want something that
-			is much less verbose and much easier to use.  This is where the DNA graph API comes in.
-		</para>
-		<para>
-			JBoss DNA's <emphasis>Graph API</emphasis> was designed as a lightweight public API for working with graph information,
-			and it insulates components from the underlying requests and interacting with connectors.  
-			The &Graph; class is the primary class in API, and each instance represents a single, independent
-			view of the graph of content from a single connector.  &Graph; instances return snapshots of state, and those snapshots
-			never change after they're retrieved.  To obtain a &Graph; instance, use the static <code>create(...)</code>
-			method, supplying the name of the source, a &RepositoryConnectionFactory; from which a &RepositoryConnection; can be obtained,
-			and the &ExecutionContext;.
-		</para>
-		<para>
-			The &Graph; class basically represents an <ulink url="http://www.martinfowler.com/bliki/DomainSpecificLanguage.html">internal domain specific language (DSL)</ulink>,
-			designed to be easy to use in an application.  
-			The Graph API makes extensive use of interfaces and method chaining, so that methods return a concise interface that has only those
-			methods that make sense at that point.  In fact, this should be really easy if your IDE has code completion.
-			Just remember that under the covers, a &Graph; is just building &Request; objects, submitting them to the connector,
-			and then exposing the results.
-		</para>
-		<sect2 id="dna_graph_api_workspaces">
-			<title>Using workspaces</title>
-		<para>
-			Let's look at some examples of how the Graph API works.  This first example shows how to obtain the names of the available workspaces:
-		</para>
-		<programlisting>
-&Set;&lt;&String;> workspaceNames = graph.getWorkspaces();
-</programlisting>
-		<para>Once you know the name of the workspace, you can specify that the graph should use it:
-		</para>
-		<programlisting>
-graph.useWorkspace("myWorkspace");
-</programlisting>
-		<para>
-			From this point forward, all requests will apply to the workspace named "myWorkspace".  At any time, you can use a different workspace,
-			which will affect all subsequent requests made using the graph.  Of course, creating a new workspace is just as easy:
-		</para>
-		<programlisting>
-graph.createWorkspace().named("newWorkspace");
-</programlisting>
-	  <para>This will attempt to create a workspace named "newWorkspace", which will fail if that workspace already exists.  You may
-		want to create a new workspace with a name that should be altered if the name you supply is already used.  The following code shows
-		how you can do this:
-		</para>
-		<programlisting>
-graph.createWorkspace().namedSomethingLike("newWorkspace");
-</programlisting>
-	  <para>If there is no existing workspace named "newWorkspace", a new one will be created with this name.  However, if "newWorkspace" already
-		exists, this call will create a workspace with a name that is some alteration of the supplied name.
-		</para>
-	  <para>
-		You can also clone workspaces, too:
-		</para>
-		<programlisting>
-graph.createWorkspace().clonedFrom("original").named("something");
-</programlisting>
-		<para>
-			or
-		</para>
-		<programlisting>
-graph.createWorkspace().clonedFrom("original").namedSomethingLike("something");
-</programlisting>
-		<para>
-			As you can see, it's very easy to specify which workspace you want to use or to create new workspaces.  You can also find out which workspace
-			the graph is currently using:
-		</para>
-		<programlisting>
-&String; current = graph.getCurrentWorkspaceName();
-</programlisting>
-		<para>or, if you want, you can get more information about the workspace:
-		</para>
-		<programlisting>
-&Workspace; current = graph.getCurrentWorkspace();
-&String; name = current.getName();
-&Location; rootLocation = current.getRoot();
-</programlisting>
-    </sect2>
-		<sect2 id="dna_graph_api_nodes">
-			<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;:
-		</para>
-		<programlisting>
-&Path; path = ...
-Map&lt;&Name;,&Property;> propertiesByName = graph.getPropertiesByName().on(path);
-</programlisting>
-		<para>
-			This next example shows how the graph can be used to obtain and loop over the properties of a node:
-		</para>
-		<programlisting>
-&Path; path = ...
-for ( &Property; property : graph.getProperties().on(path) ) {
-	  ...
-}
-</programlisting>
-		<para>
-			Likewise, the next example shows how the graph can be used to obtain and loop over the children of a node:
-		</para>
-		<programlisting>
-&Path; path = ...
-for ( &Location; child : graph.getChildren().of(path) ) {
-    &Path; childPath = child.getPath();
-	  ...
-}
-</programlisting>
-		<para>
-			Notice that the examples pass a &Path; instance to the <code>on(...)</code> and <code>of(...)</code> methods.  Many
-			of the Graph API methods take a variety of parameter types, including String, &Path;s, &Location;s, &UUID;, or &Property; parameters.
-			This should make it easy to use in many different situations.
-		</para>
-		<para>
-			Of course, changing content is more interesting and offers more interesting possibilities.  Here are a few examples:
-		</para>
-		<programlisting>
-&Path; path = ...
-&Location; location = ...
-&Property; idProp1 = ...
-&Property; idProp2 = ...
-&UUID; uuid = ...
-graph.move(path).into(idProp1, idProp2);
-graph.copy(path).into(location);
-graph.delete(uuid);
-graph.delete(idProp1,idProp2);
-</programlisting>
-		<para>
-			The methods shown above work immediately, as soon as each request is built.  However, there is another way to use
-			the &Graph; object, and that is in a <emphasis>batch</emphasis> mode.  Simply create a &GraphBatch; object using the
-			<code>batch()</code> method, create the requests on that batch object, and then execute all of the commands on the
-			batch by calling its <code>execute()</code> method.  That <code>execute()</code> method returns a &Results; interface
-			that can be used to read the node information retrieved by the batched requests. 
-		</para>
-		<para>
-			Method chaining works really well with the batch mode, since multiple commands can be assembled together very easily:
-		</para>
-		<programlisting>
-&Path; path = ...
-String path2 = ...
-&Location; location = ...
-&Property; idProp1 = ...
-&Property; idProp2 = ...
-&UUID; uuid = ...
-graph.batch().move(path).into(idProp1, idProp2).and().copy(path2).into(location).and().delete(uuid).execute();
-&Results; results = graph.batch().read(path2).
-                    and().readChildren().of(idProp1,idProp2).
-                    and().readSugraphOfDepth(3).at(uuid2).
-                    execute();
-for ( &Location; child : results.getNode(path2) ) {
-    ...
-}
-</programlisting>
-		<para>
-			Of course, this section provided just a hint of the Graph API.  
-			The &Graph; interface is actually quite complete and offers a full-featured approach for reading and updating a graph.
-			For more information, see the &Graph; JavaDocs.
-		</para>
-	</sect2>
-	</sect1>
-	<sect1>
-		<title>Summary</title>
-		<para>
-			In this chapter, we covered all the aspects of JBoss DNA repositories, including the connector framework,
-			how DNA's JCR implementation works with connectors, what connectors are available (and how to use them),
-			and how to write your own connector.  So now that you know how to set up and use JBoss DNA repositories,
-			the <link linkend="jcr">next chapter</link> describes how you can leverage JBoss DNA's JCR implementation.
-		</para>
-	</sect1>
-</chapter>

Added: trunk/docs/reference/src/main/docbook/en-US/content/sequencers/zip.xml
===================================================================
--- trunk/docs/reference/src/main/docbook/en-US/content/sequencers/zip.xml	                        (rev 0)
+++ trunk/docs/reference/src/main/docbook/en-US/content/sequencers/zip.xml	2009-06-08 14:57:17 UTC (rev 995)
@@ -0,0 +1,36 @@
+<?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="zip-file-sequencer">
+  <title>ZIP File Sequencer</title>
+  <para>
+		blah blah 
+  </para>
+</chapter>
\ No newline at end of file


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

Deleted: trunk/docs/reference/src/main/docbook/en-US/content/sequencing.xml
===================================================================
--- trunk/docs/reference/src/main/docbook/en-US/content/sequencing.xml	2009-06-08 00:52:09 UTC (rev 994)
+++ trunk/docs/reference/src/main/docbook/en-US/content/sequencing.xml	2009-06-08 14:57:17 UTC (rev 995)
@@ -1,793 +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
-  -->
-<!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="sequencing">
-  <title>Sequencing content</title>
-	<para>As we've mentioned before, JBoss DNA is able to work with existing JCR repositories.  Your client applications
-  	make changes to the information in those repositories, and JBoss DNA automatically uses its sequencers to extract
-  	additional information from the uploaded files.</para>
-	<para>
-		This chapter discusses the sequencing features of JBoss DNA and the components that are involved.
-	</para>
-  <sect1 id="sequencing-service">
-    <title>Sequencing Service</title>
-		<para>The JBoss DNA <emphasis>sequencing service</emphasis> is the component that manages the <emphasis>sequencers</emphasis>, 
-			reacting to changes in JCR repositories and then running the appropriate sequencers.
-      This involves processing the changes on a node, determining which (if any) sequencers should be run on that node,
-      and for each sequencer constructing the execution environment, calling the sequencer, and saving the information
-      generated by the sequencer.</para>
-		<note>
-			<para>Configuring JBoss DNA services is a bit more manual than is ideal. As you'll see, JBoss DNA uses dependency
-	      injection to allow a great deal of flexibility in how it can be configured and customized. But this flexibility
-	      makes it more difficult for you to use.  We understand this, and will soon provide a much easier way to set up 
-				and manage JBoss DNA.  Current plans are to use the <ulink url="http://www.jboss.org/jbossmc">JBoss Microcontainer</ulink>
-				along with a configuration repository.</para>
-		</note>
-		<para>To set up the sequencing service, an instance is created, and dependent components are injected into
-      the object.  This includes among other things:
-			<itemizedlist>
-				<listitem>
-					<para>An <emphasis>execution context</emphasis> that defines the context in which the service runs, including
-			        a factory for JCR sessions given names of the repository and workspace.  This factory must be configured,
-			        and is how JBoss DNA knows about your JCR repositories and how to connect to them.  More on this a bit later.</para>
-				</listitem>
-				<listitem>
-					<para>An optional <emphasis>factory for class loaders</emphasis> used to load sequencers.  If no factory is supplied,
-			        the service uses the current thread's context class loader (or if that is null, the class loader that loaded the
-			        sequencing service class).</para>
-				</listitem>
-				<listitem>
-					<para>An &ExecutorService; used to execute the sequencing activites.  If none
-			        is supplied, a new single-threaded executor is created by calling <code>Executors.newSingleThreadExecutor()</code>.
-			        (This can easily be changed by subclassing and overriding the <code>SequencerService.createDefaultExecutorService()</code> method.)</para>
-				</listitem>
-				<listitem>
-					<para>Filters for sequencers and events.  By default, all sequencers are considered for "node added", "property added"
-			        and "property changed" events.</para>
-				</listitem>
-			</itemizedlist>
-    </para>
-		<para>As mentioned above, the &JcrExecutionContext; provides access to a &SessionFactory; that is used
-      by JBoss DNA to establish sessions to your JCR repositories.  Two implementations are available:
-			<itemizedlist>
-				<listitem>
-					<para>The &JndiSessionFactory;> looks up JCR &Repository; instances in JNDI using
-			          names that are supplied when creating sessions.  This implementation also has methods to set the
-			          JCR &Credentials; for a given workspace name.</para>
-				</listitem>
-				<listitem>
-					<para>The &SimpleSessionFactory; has methods to register the JCR &Repository; instances
-			          with names, as well as methods to set the JCR &Credentials; for a given workspace name.</para>
-				</listitem>
-			</itemizedlist>
-      You can use the &JcrExecutionContext; and use one of these &SessionFactory; implementations or another
-      implementation that you provide.</para>
-		<para>Here's an example of how to instantiate and configure the &SequencingService;:</para>
-    <programlisting>
-&SimpleSessionFactory; sessionFactory = new &SimpleSessionFactory;();
-sessionFactory.registerRepository("Main Repository", this.repository);
-&Credentials; credentials = new &SimpleCredentials;("jsmith", "secret".toCharArray());
-sessionFactory.registerCredentials("Main Repository/Workspace1", credentials);
-// Now create the JCR execution context, with a reference to the session factory
-// and the name of the repository from which sessions will be obtained ...
-ExecutionContext executionContext = new &JcrExecutionContext;(sessionFactory,"Main Repository");
-
-// Create the sequencing service, passing in the execution context ...
-&SequencingService; sequencingService = new &SequencingService;();
-sequencingService.setExecutionContext(executionContext);
-</programlisting>
-		<para>After the sequencing service is created and configured, it must be started.  The &SequencingService;
-      has an <emphasis>administration object</emphasis> (that is an instance of &ServiceAdministrator;)
-      with <code>start()</code>, <code>pause()</code>, and <code>shutdown()</code> methods.  The latter method will 
-      close the queue for sequencing, but will allow sequencing operations already running to complete normally.
-      To wait until all sequencing operations have completed, simply call the <code>awaitTermination</code> method
-      and pass it the maximum amount of time you want to wait.</para>
-		<programlisting>
-sequencingService.getAdministrator().start();
-</programlisting>
-		<para>The JBoss DNA services are utilizing resources and threads that must be released before your application is ready to shut down.
-    	The safe way to do this is to simply obtain the &ServiceAdministrator; for each service (via the <code>getServiceAdministrator()</code> method)
-    	and call <code>shutdown()</code>.  As previously mentioned, the shutdown method will simply prevent new work from being processed
-    	and will not wait for existing work to be completed.  If you want to wait until the service completes all its work, you must wait
-    	until the service terminates.  Here's an example that shows how this is done:</para>
-    <programlisting>
-// Shut down the service and wait until it's all shut down ...
-sequencingService.getAdministrator().shutdown();
-sequencingService.getAdministrator().awaitTermination(5, TimeUnit.SECONDS);
-
-// Shut down the observation service ...
-observationService.getAdministrator().shutdown();
-observationService.getAdministrator().awaitTermination(5, TimeUnit.SECONDS);
-</programlisting>
-  </sect1>
-  <sect1 id="sequencer-configuration">
-    <title>Sequencer Configurations</title>
-		<para>The sequencing service must also be configured with the sequencers that it will use.  This is done using the
-      <code>addSequencer(SequencerConfig)</code> method and passing a &SequencerConfig; instance that
-      you create.  Here's the code that defines 3 sequencer configurations: 1 that places image metadata into
-      "<code><![CDATA[/images/<filename>]]></code>", another that places MP3 metadata into "<code><![CDATA[/mp3s/<filename>]]></code>",
-      and a third that places a structure that represents the classes, methods, and attributes found within Java source into 
-      "<code><![CDATA[/java/<filename>]]></code>".</para>
-    <programlisting>
-String name = "Image Sequencer";
-String desc = "Sequences image files to extract the characteristics of the image";
-String classname = "org.jboss.dna.sequencer.images.ImageMetadataSequencer";
-String[] classpath = null; // Use the current classpath
-String[] pathExpressions = {"//(*.(jpg|jpeg|gif|bmp|pcx|png)[*])/jcr:content[@jcr:data] => /images/$1"};
-&SequencerConfig; imageSequencerConfig = new &SequencerConfig;(name, desc, classname, 
-                                                           classpath, pathExpressions);
-sequencingService.addSequencer(imageSequencerConfig);
-
-name = "MP3 Sequencer";
-desc = "Sequences MP3 files to extract the ID3 tags from the audio file";
-classname = "org.jboss.dna.sequencer.mp3.Mp3MetadataSequencer";
-pathExpressions = {"//(*.mp3[*])/jcr:content[@jcr:data] =&gt; /mp3s/$1"};
-&SequencerConfig; mp3SequencerConfig = new &SequencerConfig;(name, desc, classname, 
-                                                         classpath, pathExpressions);
-sequencingService.addSequencer(mp3SequencerConfig);
-
-name = "Java Sequencer";
-desc = "Sequences java files to extract the characteristics of the Java source";
-classname = "org.jboss.dna.sequencer.java.JavaMetadataSequencer";
-pathExpressions = {"//(*.java[*])/jcr:content[@jcr:data] => /java/$1"};
-&SequencerConfig; javaSequencerConfig = new &SequencerConfig;(name, desc, classname, 
-                                                          classpath, pathExpressions);
-this.sequencingService.addSequencer(javaSequencerConfig);
-</programlisting>
-    <para>Each configuration defines several things, including the name, description, and sequencer implementation class.
-	    The configuration also defines the classpath information, which can be passed to the &ClassLoaderFactory; to get
-	    a Java &ClassLoader; with which the sequencer class can be loaded.  (If no classpath information is provided, as is done
-	    in the code above, the application class loader is used.)  The configuration also specifies the path expressions that
-	    identify the nodes that should be sequenced with the sequencer and where to store the output generated by the sequencer.
-	    Path expressions are pretty straightforward but are quite powerful, so before we go any further with the example,
-	    let's dive into path expressions in more detail.</para>
-		<sect2 id="path_expressions">
-			<title>Path Expressions</title>
-			<para>Path expressions consist of two parts: a selection criteria (or an input path) and an output path:</para>
-	    <programlisting><![CDATA[  inputPath => outputPath ]]></programlisting>
-			<para>The <emphasis>inputPath</emphasis> part defines an expression for the path of a node that is to be sequenced.
-			  Input paths consist of '<code>/</code>' separated segments, where each segment represents a pattern for a single node's
-			  name (including the same-name-sibling indexes) and '<code>@</code>' signifies a property name.</para>
-			<para>Let's first look at some simple examples:</para>
-			<table frame='all'>
-				<title>Simple Input Path Examples</title>
-				<tgroup cols='2' align='left' colsep='1' rowsep='1'>
-		      <colspec colname='c1' colwidth="1*"/>
-		      <colspec colname='c2' colwidth="1*"/>
-					<thead>
-						<row>
-				  		<entry>Input Path</entry>
-				  		<entry>Description</entry>
-						</row>
-					</thead>
-					<tbody>
-						<row><entry>/a/b</entry><entry>Match node "<code>b</code>" that is a child of the top level node "<code>a</code>". Neither node
-						     may have any same-name-sibilings.</entry></row>
-						<row><entry>/a/*</entry><entry>Match any child node of the top level node "<code>a</code>".</entry></row>
-						<row><entry>/a/*.txt</entry><entry>Match any child node of the top level node "<code>a</code>" that also has a name ending in "<code>.txt</code>".</entry></row>
-						<row><entry>/a/*.txt</entry><entry>Match any child node of the top level node "<code>a</code>" that also has a name ending in "<code>.txt</code>".</entry></row>
-						<row><entry>/a/b at c</entry><entry>Match the property "<code>c</code>" of node "<code>/a/b</code>".</entry></row>
-						<row><entry>/a/b[2]</entry><entry>The second child named "<code>b</code>" below the top level node "<code>a</code>".</entry></row>
-						<row><entry>/a/b[2,3,4]</entry><entry>The second, third or fourth child named "<code>b</code>" below the top level node "<code>a</code>".</entry></row>
-						<row><entry>/a/b[*]</entry><entry>Any (and every) child named "<code>b</code>" below the top level node "<code>a</code>".</entry></row>
-						<row><entry>//a/b</entry><entry>Any node named "<code>b</code>" that exists below a node named "<code>a</code>", regardless 
-						     of where node "<code>a</code>" occurs.  Again, neither node may have any same-name-sibilings.</entry></row>
-					</tbody>
-				</tgroup>
-			</table>
-			<para>With these simple examples, you can probably discern the most important rules.  First, the '<code>*</code>' is a wildcard character
-			  that matches any character or sequence of characters in a node's name (or index if appearing in between square brackets), and
-			  can be used in conjunction with other characters (e.g., "<code>*.txt</code>").</para>
-			<para>Second, square brackets (i.e., '<code>[</code>' and '<code>]</code>') are used to match a node's same-name-sibiling index.
-			  You can put a single non-negative number or a comma-separated list of non-negative numbers.  Use '0' to match a node that has no
-			  same-name-sibilings, or any positive number to match the specific same-name-sibling.</para>
-			<para>Third, combining two delimiters (e.g., "<code>//</code>") matches any sequence of nodes, regardless of what their names are 
-			  or how many nodes.  Often used with other patterns to identify nodes at any level matching other patterns. 
-				Three or more sequential slash characters are treated as two.</para>
-			<para>Many input paths can be created using just these simple rules.  However, input paths can be more complicated.  Here are some
-				more examples:</para>
-			<table frame='all'>
-				<title>More Complex Input Path Examples</title>
-				<tgroup cols='2' align='left' colsep='1' rowsep='1'>
-		      <colspec colname='c1' colwidth="1*"/>
-		      <colspec colname='c2' colwidth="1*"/>
-					<thead>
-						<row>
-				  		<entry>Input Path</entry>
-				  		<entry>Description</entry>
-						</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 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
-								 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
-						     "<code>something</code>". None of the nodes may have same-name-sibling indexes.</entry></row>
-					</tbody>
-				</tgroup>
-			</table>
-			<para>These examples show a few more advanced rules.  Parentheses (i.e., '<code>(</code>' and '<code>)</code>') can be used
-			  to define a set of options for names, as shown in the first and third rules.  Whatever part of the selected node's path
-			  appears between the parentheses is captured for use within the output path.  Thus, the first input path in the previous table
-			  would match node "<code>/a/b</code>", and "b" would be captured and could be used within the output path using "<code>$1</code>",
-			  where the number used in the output path identifies the parentheses.</para>
-			<para>Square brackets can also be used to specify criteria on a node's properties or children.  Whatever appears in between the square
-				brackets does not appear in the selected node.</para>
-		  <para>Let's go back to the previous code fragment and look at the first path expression:</para>
-		  <programlisting><![CDATA[  //(*.(jpg|jpeg|gif|bmp|pcx|png)[*])/jcr:content[@jcr:data] => /images/$1 ]]></programlisting>
-		  <para>This matches a node named "<code>jcr:content</code>" with property "<code>jcr:data</code>" but no siblings with the same name,
-		    and that is a child of a node whose name ends with "<code>.jpg</code>", "<code>.jpeg</code>", "<code>.gif</code>", "<code>.bmp</code>", "<code>.pcx</code>", 
-		    or  "<code>.png</code>" that may have any same-name-sibling index.  These nodes can appear at any level in the repository.
-			  Note how the input path capture the filename (the segment containing the file extension), including any same-name-sibling index.
-			  This filename is then used in the output path, which is where the sequenced content is placed.</para>
-		</sect2>
-  </sect1>
-  <sect1 id="sequencers">
-    <title>JBoss DNA Sequencers</title>
-    <para>
-    	JBoss DNA includes a number of sequencers "out of the box".  These sequencers can be used within your application to sequence
-			a variety of common file formats.  To use them, the only thing you have to do is define the appropriate sequencer configurations
-			and include the appropriate JAR files.
-    </para>
-    <sect2 id="dna-sequencer-images">
-      <title>Image sequencer</title>
-      <para>
-				A sequencer that extracts metadata from JPEG, GIF, BMP, PCX, PNG, IFF, RAS, PBM, PGM, PPM and PSD image files.
-				This sequencer extracts the file format, image resolution, number of bits per pixel and optionally number of images, comments 
-				and physical resolution, and then writes this information into the repository using the following structure:
-			</para>
-			<itemizedlist>
-				<listitem>
-					<para>
-						<emphasis role="strong">image:metadata</emphasis> node of type <code>image:metadata</code>
-					</para>
-				</listitem>
-				<listitem>
-					<itemizedlist>
-						<listitem>
-							<para><emphasis role="strong">jcr:mimeType</emphasis> - optional string property for the mime type of the image</para>
-						</listitem>
-						<listitem>
-							<para><emphasis role="strong">jcr:encoding</emphasis> - optional string property for the encoding of the image</para>
-						</listitem>
-						<listitem>
-							<para><emphasis role="strong">image:formatName</emphasis> - string property for the name of the format</para>
-						</listitem>
-						<listitem>
-							<para><emphasis role="strong">image:width</emphasis> - optional integer property for the image's width in pixels</para>
-						</listitem>
-						<listitem>
-							<para><emphasis role="strong">image:height</emphasis> - optional integer property for the image's height in pixles</para>
-						</listitem>
-						<listitem>
-							<para><emphasis role="strong">image:bitsPerPixel</emphasis> - optional integer property for the number of bits per pixel</para>
-						</listitem>
-						<listitem>
-							<para><emphasis role="strong">image:progressive</emphasis> - optional boolean property specifying whether the image is stored in a progressive
-									(i.e., interlaced) form</para>
-						</listitem>
-						<listitem>
-							<para><emphasis role="strong">image:numberOfImages</emphasis> - optional integer property for the number of images stored in the file; defaults
-									to 1</para>
-						</listitem>
-						<listitem>
-							<para><emphasis role="strong">image:physicalWidthDpi</emphasis> - optional integer property for the physical width of the image in dots per inch</para>
-						</listitem>
-						<listitem>
-							<para><emphasis role="strong">image:physicalHeightDpi</emphasis> - optional integer property for the physical height of the image in dots per
-									inch</para>
-						</listitem>
-						<listitem>
-							<para><emphasis role="strong">image:physicalWidthInches</emphasis> - optional double property for the physical width of the image in inches</para>
-						</listitem>
-						<listitem>
-							<para><emphasis role="strong">image:physicalHeightInches</emphasis> - optional double property for the physical height of the image in inches</para>
-						</listitem>
-					</itemizedlist>
-				</listitem>
-			</itemizedlist>
-			<para>
-				This structure could be extended in the future to add EXIF and IPTC metadata as child nodes. For example, EXIF metadata is
-				structured as tags in directories, where the directories form something like namespaces, and which are used by different camera
-				vendors to store custom metadata. This structure could be mapped with each directory (e.g. "EXIF" or "Nikon Makernote" or
-				"IPTC") as the name of a child node, with the EXIF tags values stored as either properties or child nodes.
-      </para>
-			<para>
-				To use this sequencer, simply include the <code>dna-sequencer-images</code> JAR
-				in your application and configure	the Sequencing Service to use this sequencer using something similar to:
-      </para>
-	    <programlisting>
-String name = "Image Sequencer";
-String desc = "Sequences image files to extract the characteristics of the image";
-String classname = "org.jboss.dna.sequencer.images.ImageMetadataSequencer";
-String[] classpath = null; // Use the current classpath
-String[] pathExpressions = {"//(*.(jpg|jpeg|gif|bmp|pcx|png|iff|ras|pbm|pgm|ppm|psd)[*])/jcr:content[@jcr:data] =&gt; /images/$1"};
-&SequencerConfig; sequencerConfig = new &SequencerConfig;(name, desc, classname, 
-                                                      classpath, pathExpressions);
-sequencingService.addSequencer(sequencerConfig);
-</programlisting>
-    </sect2>
-    <sect2 id="dna-sequencer-msoffice">
-      <title>Microsoft Office document sequencer</title>
-      <para>
-      	This sequencer is included in JBoss DNA and processes Microsoft Office documents, including Word documents, Excel spreadsheets,
-				and PowerPoint presentations.  With documents, the sequencer extracts the internal structure based on Heading styles.
-				With presentations, the sequencer extracts the slides, titles, text and slide thumbnails.
-				With spreadsheets, the sequencer extracts the names of the sheets.  And, the sequencer extracts for all the files the
-				general file information, including the name of the author, title, keywords, subject, comments, and various dates.
-      </para>
-			<para>
-				To use this sequencer, simply include the <code>dna-sequencer-msoffice</code> JAR and all of the
-				<ulink url="http://poi.apache.org/">POI</ulink> JARs
-				in your application and configure	the Sequencing Service to use this sequencer using something similar to:
-      </para>
-	    <programlisting>
-String name = "Microsoft Office Document Sequencer";
-String desc = "Sequences MS Office documents, including spreadsheets and presentations";
-String classname = "org.jboss.dna.sequencer.msoffice.MSOfficeMetadataSequencer";
-String[] classpath = null; // Use the current classpath
-String[] pathExpressions = {"//(*.(doc|docx|ppt|pps|xls)[*])/jcr:content[@jcr:data] =&gt; /msoffice/$1"};
-&SequencerConfig; sequencerConfig = new &SequencerConfig;(name, desc, classname, 
-                                                      classpath, pathExpressions);
-sequencingService.addSequencer(sequencerConfig);
-</programlisting>
-    </sect2>
-    <sect2 id="dna-sequencer-zip">
-      <title>ZIP archive sequencer</title>
-      <para>
-      	The ZIP file sequencer is included in JBoss DNA and extracts the files and folders contained in the ZIP archive file,
-				extracting the files and folders into the repository using JCR's <code>nt:file</code> and <code>nt:folder</code> node types.
-      </para>
-			<para>
-				To use this sequencer, simply include the <code>dna-sequencer-zip</code> JAR
-				in your application and configure	the Sequencing Service to use this sequencer using something similar to:
-      </para>
-	    <programlisting>
-String name = "ZIP Sequencer";
-String desc = "Sequences ZIP archives to extract the files and folders";
-String classname = "org.jboss.dna.sequencer.zip.ZipSequencer";
-String[] pathExpressions = {"//(*.zip[*])/jcr:content[@jcr:data] =&gt; /zips/$1"};
-&SequencerConfig; sequencerConfig = new &SequencerConfig;(name, desc, classname, 
-                                                      classpath, pathExpressions);
-this.sequencingService.addSequencer(sequencerConfig);
-</programlisting>
-    </sect2>
-    <sect2 id="dna-sequencer-java">
-      <title>Java source sequencer</title>
-      <para>
-				One of the sequencers that included in JBoss DNA is the <emphasis role="strong">dna-sequencer-java</emphasis> subproject.
-				This sequencer parses Java source code added to the repository and extracts the basic structure of the classes and enumerations 
-				defined in the code.
-				This structure includes: the package structures, class declarations, class and member attribute declarations,
-				class and member method declarations with signature (but not implementation logic), enumerations with each enumeration literal value,
-				annotations, and JavaDoc information for all of the above. 
-				After extracting this information from the source code, the sequencer then writes this structure into the repository,
-				where it can be further processed, analyzed, searched, navigated, or referenced.
-			</para>
-			<para>
-				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 Sequencing Service to use this sequencer using something similar to:
-      </para>
-	    <programlisting>
-String name = "Java Sequencer";
-String desc = "Sequences java files to extract the characteristics of the Java source";
-String classname = "org.jboss.dna.sequencer.java.JavaMetadataSequencer";
-String[] classpath = null; // Use the current classpath
-String[] pathExpressions = {"//(*.java[*])/jcr:content[@jcr:data] =&gt; /java/$1"};
-&SequencerConfig; sequencerConfig = new &SequencerConfig;(name, desc, classname, 
-                                                      classpath, pathExpressions);
-this.sequencingService.addSequencer(sequencerConfig);
-</programlisting>
-    </sect2>
-    <sect2 id="dna-sequencer-mp3">
-      <title>MP3 audio file sequencer</title>
-      <para>
-      	Another sequencer that is included in JBoss DNA is the <emphasis role="strong">dna-sequencer-mp3</emphasis> sequencer project.
-				This sequencer processes MP3 audio files added to a repository and extracts the <ulink url="http://www.id3.org/">ID3</ulink>
-			 	metadata for the file, including the track's title, author, album name, year, and comment.
-				After extracting this information from the audio files, the sequencer then writes this structure into the repository,
-				where it can be further processed, analyzed, searched, navigated, or referenced.
-      </para>
-			<para>
-				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 Sequencing Service to use this sequencer using something similar to:
-      </para>
-	    <programlisting>
-String name = "MP3 Sequencer";
-String desc = "Sequences MP3 files to extract the ID3 tags of the audio file";
-String classname = "org.jboss.dna.sequencer.mp3.Mp3MetadataSequencer";
-String[] pathExpressions = {"//(*.mp3[*])/jcr:content[@jcr:data] =&gt; /mp3s/$1"};
-&SequencerConfig; sequencerConfig = new &SequencerConfig;(name, desc, classname, 
-                                                      classpath, pathExpressions);
-this.sequencingService.addSequencer(sequencerConfig);
-</programlisting>
-    </sect2>
-    <sect2 id="dna-sequencer-cnd">
-      <title>JCR Compact Node Definition (CND) file sequencer</title>
-      <para>
-      	This sequencer processes JCR Compact Node Definition (CND) files
-				to extract the node definitions with their property definitions, and inserts these into the repository using JCR standard notation.
-      </para>
-    </sect2>
-        <sect2 id="dna-sequencer-jbpm-jpdl">
-      <title>jBPM JPDL file sequencer</title>
-      <para>
-        This sequencer is incomplete and is not currently usable.  The purpose is to sequence jBPM JPDL files to identify metadata
-        about processes, their actors, and their dependencies.
-      </para>
-    </sect2>
-    <sect2 id="dna-sequencer-xml">
-      <title>XML file sequencer</title>
-      <para>
-        This sequencer stores the structure and data of an XML file into the repository.
-      </para>
-    </sect2> 
-    
-  </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
-	  sequencers and to then configure JBoss DNA to use them in your own application.
-	  </para>
-	  <para>
-	  Creating a custom sequencer involves the following steps:
-	  <orderedlist>
-	    <listitem>
-	      <para>Create a Maven 2 project for your sequencer;</para>
-	    </listitem>
-	    <listitem>
-	      <para>Implement the &StreamSequencer; interface with your own implementation, and create unit tests to verify
-	      the functionality and expected behavior;</para>
-	    </listitem>
-	    <listitem>
-	      <para>Add the sequencer configuration to the JBoss DNA &SequencingService; in your application
-	      as described in the <link linkend="using_dna">previous chapter</link>; and</para>
-	    </listitem>
-	    <listitem>
-	      <para>Deploy the JAR file with your implementation (as well as any dependencies), and make them available to JBoss DNA
-	      in your application.</para>
-	    </listitem>
-	  </orderedlist>
-	  It's that simple.
-	  </para>
-	  <sect2 id="custom_sequencer_project">
-	    <title>Creating the Maven 2 project</title>
-	    <para>The first step is to create the Maven 2 project that you can use to compile your code and build the JARs.
-	    Maven 2 automates a lot of the work, and since you're already <link linkend="maven">set up to use Maven</link>,
-	    using Maven for your project will save you a lot of time and effort.  Of course, you don't have to use Maven 2, but then you'll
-	    have to get the required libraries and manage the compiling and building process yourself.</para>
-	    <note>
-	      <para>JBoss DNA may provide in the future a Maven archetype for creating sequencer projects.  If you'd find this useful
-	        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 sequencer project.
-					The <emphasis role="strong">dna-sequencer-images</emphasis> project is a small, self-contained sequencer implementation that
-		    	has only the minimal dependencies.  
-		    	See the subversion repository: <ulink url="&Subversion;trunk/extensions/dna-sequencer-images/">&Subversion;trunk/extensions/dna-sequencer-images/</ulink>
-		    </para>
-		  </note>
-	    <para>You can create your Maven project any way you'd like.  For examples, see the <ulink url="http://maven.apache.org/guides/getting-started/index.html#How_do_I_make_my_first_Maven_project">Maven 2 documentation</ulink>.  
-	    Once you've done that, just add the dependencies in your project's <code>pom.xml</code> dependencies section:</para>
-	  	<programlisting role="XML"><![CDATA[
-<dependency>
-  <groupId>org.jboss.dna</groupId>
-  <artifactId>dna-common</artifactId>
-  <version>0.3</version>
-</dependency>
-<dependency>
-  <groupId>org.jboss.dna</groupId>
-  <artifactId>dna-graph</artifactId>
-  <version>0.3</version>
-</dependency>
-	 ]]></programlisting>
-			<para>These are minimum dependencies required for compiling a sequencer.  Of course, you'll have to add
-	  		other dependencies that your sequencer needs.</para>
-	  	<para>As for testing, you probably will want to add more dependencies, such as those listed here:</para>
-			<programlisting role="XML"><![CDATA[
-<dependency>
-  <groupId>org.jboss.dna</groupId>
-  <artifactId>dna-graph</artifactId>
-  <version>0.5</version>
-  <type>test-jar</type>
-  <scope>test</scope>
-</dependency>
-<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>
-<!-- Logging with Log4J -->
-<dependency>
-  <groupId>org.slf4j</groupId>
-  <artifactId>slf4j-log4j12</artifactId>
-  <version>1.4.3</version>
-  <scope>test</scope>
-</dependency>
-<dependency>
-  <groupId>log4j</groupId>
-  <artifactId>log4j</artifactId>
-  <version>1.2.14</version>
-  <scope>test</scope>
-</dependency>
-	 ]]></programlisting>
-	  	<para>Testing JBoss DNA sequencers does not require a JCR repository or the JBoss DNA services.  (For more detail,
-	  		see the <link linkend="testing_custom_sequencers">testing section</link>.)  However, if you want to do
-	  		integration testing with a JCR repository and the JBoss DNA services, you'll need additional dependencies for these libraries.</para>
-			<programlisting role="XML"><![CDATA[
-<!-- JBoss DNA JCR Repository -->
-<dependency>
-  <groupId>org.jboss.dna</groupId>
-  <artifactId>dna-jcr</artifactId>
-  <version>0.5</version>
-  <scope>test</scope>
-</dependency>
-<!-- Java Content Repository API -->
-<dependency>
-  <groupId>javax.jcr</groupId>
-  <artifactId>jcr</artifactId>
-  <version>1.0.1</version>
-  <scope>test</scope>
-</dependency>
-	 ]]></programlisting>
-	  <para>At this point, your project should be set up correctly, and you're ready to move on to 
-	  	<link linkend="custom_sequencer_implementation">writing the Java implementation</link> for your sequencer.</para>
-	  </sect2>
-	  <sect2 id="custom_sequencer_implementation">
-	    <title>Implementing the StreamSequencer interface</title>
-	    <para>After creating the project and setting up the dependencies, the next step is to create a Java class that implements
-	    	the &StreamSequencer; interface.  This interface is very straightforward and involves a single method:</para>
-	    <programlisting>
-public interface &StreamSequencer; {
-
-    /**
-     * Sequence the data found in the supplied stream, placing the output 
-     * information into the supplied map.
-     *
-     * @param stream the stream with the data to be sequenced; never null
-     * @param output the output from the sequencing operation; never null
-     * @param context the context for the sequencing operation; never null
-     */
-    void sequence( &InputStream; stream, &SequencerOutput; output, &SequencerContext; context );
-}
-</programlisting>
-	    <para>The job of a stream sequencer is to process the data in the supplied stream, and place into the &SequencerOutput;
-	    any information that is to go into the JCR repository.  JBoss DNA figures out when your sequencer should be called
-	    (of course, using the sequencing configuration you'll add in a bit), and then makes sure the generated information
-	    is saved in the correct place in the repository.  
-	    </para>
-	    <para>The &SequencerContext; provides information about
-	    the current sequencing operation, including the location and properties of the node being sequenced, the MIME type
-	    of the node being sequenced, and a location to record problems that aren't severe enough to warrant throwing an exception.
-	    </para>
-	    <para>The &SequencerOutput; class is fairly easy to use.  There are basically two methods you need to call.
-	    One method sets the property values, while the other sets references to other nodes in the repository.  Use these
-	    methods to describe the properties of the nodes you want to create, using relative paths for the nodes and
-	    valid JCR property names for properties and references.  JBoss DNA will ensure that nodes are created or updated
-	    whenever they're needed.</para>
-	    <programlisting>
-public interface &SequencerOutput; {
-
-  /**
-   * Set the supplied property on the supplied node.  The allowable
-   * values are any of the following:
-   *   - primitives (which will be autoboxed)
-   *   - String instances
-   *   - String arrays
-   *   - byte arrays
-   *   - InputStream instances
-   *   - Calendar instances
-   *
-   * @param nodePath the path to the node containing the property; 
-   * may not be null
-   * @param property the name of the property to be set
-   * @param values the value(s) for the property; may be empty if 
-   * any existing property is to be removed
-   */
-  void setProperty( String nodePath, String property, Object... values );
-
-  /**
-   * Set the supplied reference on the supplied node.
-   *
-   * @param nodePath the path to the node containing the property; 
-   * may not be null
-   * @param property the name of the property to be set
-   * @param paths the paths to the referenced property, which may be
-   * absolute paths or relative to the sequencer output node;
-   * may be empty if any existing property is to be removed
-   */
-  void setReference( String nodePath, String property, String... paths );
-}
-</programlisting>
-	    <para>JBoss DNA will create nodes of type <code>nt:unstructured</code> unless you specify the value for the
-	      <code>jcr:primaryType</code> property.  You can also specify the values for the <code>jcr:mixinTypes</code> property
-	      if you want to add mixins to any node.</para>
-	    <para>For a complete example of a sequencer, let's look at the &ImageMetadataSequencer; 
-				implementation:</para>
-	    <programlisting>
-public class &ImageMetadataSequencer; implements &StreamSequencer; {
-
-    public static final String METADATA_NODE = "image:metadata";
-    public static final String IMAGE_PRIMARY_TYPE = "jcr:primaryType";
-    public static final String IMAGE_MIXINS = "jcr:mixinTypes";
-    public static final String IMAGE_MIME_TYPE = "jcr:mimeType";
-    public static final String IMAGE_ENCODING = "jcr:encoding";
-    public static final String IMAGE_FORMAT_NAME = "image:formatName";
-    public static final String IMAGE_WIDTH = "image:width";
-    public static final String IMAGE_HEIGHT = "image:height";
-    public static final String IMAGE_BITS_PER_PIXEL = "image:bitsPerPixel";
-    public static final String IMAGE_PROGRESSIVE = "image:progressive";
-    public static final String IMAGE_NUMBER_OF_IMAGES = "image:numberOfImages";
-    public static final String IMAGE_PHYSICAL_WIDTH_DPI = "image:physicalWidthDpi";
-    public static final String IMAGE_PHYSICAL_HEIGHT_DPI = "image:physicalHeightDpi";
-    public static final String IMAGE_PHYSICAL_WIDTH_INCHES = "image:physicalWidthInches";
-    public static final String IMAGE_PHYSICAL_HEIGHT_INCHES = "image:physicalHeightInches";
-
-    /**
-     * {@inheritDoc}
-     */
-    public void sequence( &InputStream; stream, &SequencerOutput; output, 
-                          &SequencerContext; context ) {
-        &ImageMetadata; metadata = new &ImageMetadata;();
-        metadata.setInput(stream);
-        metadata.setDetermineImageNumber(true);
-        metadata.setCollectComments(true);
-
-        // Process the image stream and extract the metadata ...
-        if (!metadata.check()) {
-            metadata = null;
-        }
-        // Generate the output graph if we found useful metadata ...
-        if (metadata != null) {
-            // Place the image metadata into the output map ...
-            output.setProperty(METADATA_NODE, IMAGE_PRIMARY_TYPE, "image:metadata");
-            // output.psetProperty(METADATA_NODE, IMAGE_MIXINS, "");
-            output.setProperty(METADATA_NODE, IMAGE_MIME_TYPE, metadata.getMimeType());
-            // output.setProperty(METADATA_NODE, IMAGE_ENCODING, "");
-            output.setProperty(METADATA_NODE, IMAGE_FORMAT_NAME, metadata.getFormatName());
-            output.setProperty(METADATA_NODE, IMAGE_WIDTH, metadata.getWidth());
-            output.setProperty(METADATA_NODE, IMAGE_HEIGHT, metadata.getHeight());
-            output.setProperty(METADATA_NODE, IMAGE_BITS_PER_PIXEL, metadata.getBitsPerPixel());
-            output.setProperty(METADATA_NODE, IMAGE_PROGRESSIVE, metadata.isProgressive());
-            output.setProperty(METADATA_NODE, IMAGE_NUMBER_OF_IMAGES, metadata.getNumberOfImages());
-            output.setProperty(METADATA_NODE, IMAGE_PHYSICAL_WIDTH_DPI, metadata.getPhysicalWidthDpi());
-            output.setProperty(METADATA_NODE, IMAGE_PHYSICAL_HEIGHT_DPI, metadata.getPhysicalHeightDpi());
-            output.setProperty(METADATA_NODE, IMAGE_PHYSICAL_WIDTH_INCHES, metadata.getPhysicalWidthInch());
-            output.setProperty(METADATA_NODE, IMAGE_PHYSICAL_HEIGHT_INCHES, metadata.getPhysicalHeightInch());
-        }
-    }
-}
-</programlisting>
-	    <para>
-	    Notice how the image metadata is extracted and the output graph is generated.  A single node is created with the name <code>image:metadata</code>
-	    and with the <code>image:metadata</code> node type.  No mixins are defined for the node, but several properties are set on the node
-	    using the values obtained from the image metadata.  After this method returns, the constructed graph will be saved to the repository
-	    in all of the places defined by its configuration.  (This is why only relative paths are used in the sequencer.)
-	    </para>
-	  </sect2>
-	  <sect2 id="testing_custom_sequencers">
-	    <title>Testing custom sequencers</title>
-	    <para>The sequencing framework was designed to make testing sequencers much easier.  In particular, the
-	    &StreamSequencer; interface does not make use of the JCR API.  So instead of requiring a fully-configured
-	    JCR repository and JBoss DNA system, unit tests for a sequencer can focus on testing that the content is
-	    processed correctly and the desired output graph is generated.</para>
-	    <note>
-	      <para>For a complete example of a sequencer unit test, see the <code>ImageMetadataSequencerTest</code> unit test
-	      in the <code>org.jboss.dna.sequencer.images</code> package of the <code>dna-sequencers-image</code> project.
-	      </para>
-	    </note>
-	    <para>The following code fragment shows one way of testing a sequencer, using JUnit 4.4 assertions and 
-	      some of the classes made available by JBoss DNA.  Of course,
-	      this example code does not do any error handling and does not make all the assertions a real test would.</para>
-	    <programlisting>
-&StreamSequencer; sequencer = new &ImageMetadataSequencer;();
-&MockSequencerOutput; output = new &MockSequencerOutput;();
-&MockSequencerContext; context = new &MockSequencerContext;();
-&InputStream; stream = null;
-try {
-    stream = this.getClass().getClassLoader().getResource("caution.gif").openStream();
-    sequencer.sequence(stream,output,context);   // writes to 'output'
-    assertThat(output.getPropertyValues("image:metadata", "jcr:primaryType"), 
-               is(new Object[] {"image:metadata"}));
-    assertThat(output.getPropertyValues("image:metadata", "jcr:mimeType"), 
-               is(new Object[] {"image/gif"}));
-    // ... make more assertions here
-    assertThat(output.hasReferences(), is(false));
-} finally {
-    stream.close();
-}
-</programlisting>
-	  <para>It's also useful to test that a sequencer produces no output for something it should not understand:</para>
-	    <programlisting>
-&Sequencer; sequencer = new &ImageMetadataSequencer;();
-&MockSequencerOutput; output = new &MockSequencerOutput;();
-&MockSequencerContext; context = new &MockSequencerContext;();
-&InputStream; stream = null;
-try {
-    stream = this.getClass().getClassLoader().getResource("caution.pict").openStream();
-    sequencer.sequence(stream,output,context);   // writes to 'output'
-    assertThat(output.hasProperties(), is(false));
-    assertThat(output.hasReferences(), is(false));
-} finally {
-    stream.close();
-}
-</programlisting>
-	    <para>These are just two simple tests that show ways of testing a sequencer.  Some tests may get quite involved,
-	    especially if a lot of output data is produced.  
-	    </para>
-	    <para>It may also be useful to create some integration tests
-	    that <link linkend="using_dna">configure JBoss DNA</link> to use a custom sequencer, and to then upload
-	    content using the JCR API, verifying that the custom sequencer did run.  However, remember that JBoss DNA
-	    runs sequencers asynchronously in the background, and you must synchronize your tests to ensure that the
-	    sequencers have a chance to run before checking the results.  (One way of doing this (although, granted, not always reliable) is to wait for a second
-	    after uploading your content, shutdown the &SequencingService; and await its termination,
-	    and then check that the sequencer output has been saved to the JCR repository.  For an example of this technique,
-	    see the <code>SequencingClientTest</code> unit test in the example application.)
-	    </para>  
-	  </sect2>
-	  <sect2 id="deploying_custom_sequencers">
-	    <title>Deploying custom sequencers</title>
-	    <para>The first step of deploying a sequencer consists of adding/changing the sequencer configuration (e.g., &SequencerConfig;)
-	    in the &SequencingService;.  This was covered in the <link linkend="sequencing_service">previous chapter</link>.
-	    </para>
-	    <para>
-	    The second step is to make the sequencer implementation available to JBoss DNA.  At this time, the JAR containing 
-	    your new sequencer, as well as any JARs that your sequencer depends on, should be placed on your application classpath.</para>
-	    <note>
-	      <para>A future goal of JBoss DNA is to allow sequencers, connectors, and other extensions to be easily deployed into
-	        a runtime repository.  This process will not only be much simpler, but it will also provide JBoss DNA 
-	        with the information necessary to update configurations and create the appropriate class loaders for each extension.
-	        Having separate class loaders for each extension helps prevent the pollution of the common classpath, 
-	        facilitates an isolated runtime environment to eliminate any dependency conflicts, and may potentially
-	        enable hot redeployment of newer extension versions.
-	      </para>
-	    </note>
-	  </sect2>
-  </sect1>
-	<sect1>
-		<title>Summary</title>
-		<para>
-			In this chapter, we described how JBoss DNA sequences files as they're uploaded into a repository.
-			And one of the things we mentioned was that each sequencer is handed (with other inputs) the MIME type of the file it is to process.
-			How does DNA know what the MIME type is?
-			JBoss DNA uses <emphasis>MIME type detectors</emphasis>, and this is the topic of the <link linkend="mimetypes">next chapter</link>.
-		</para>
-	</sect1>
-</chapter>

Deleted: trunk/docs/reference/src/main/docbook/en-US/content/testing.xml
===================================================================
--- trunk/docs/reference/src/main/docbook/en-US/content/testing.xml	2009-06-08 00:52:09 UTC (rev 994)
+++ trunk/docs/reference/src/main/docbook/en-US/content/testing.xml	2009-06-08 14:57:17 UTC (rev 995)
@@ -1,152 +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
-  -->
-<!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="testing">
-  <title>Testing</title>
-  <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
-		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>
-  <sect1 id="unit-tests">
-    <title>Unit tests</title>
-    <para>
-    	<emphasis role="strong">Unit tests</emphasis> verify the behavior of a single class (or small set of classes) in isolation
-			from other classes.
- 			We use the JUnit 4.4 testing framework, which has significant improvements over earlier versions and makes
-			it very easy to quickly write unit tests with little extra code.  We also frequently use the Mockito library
-			to help create mock implementations of other classes that are not under test but are used in the tests.
-    </para>
-  	<para>
-			Unit tests should generally run quickly and should not require large assemblies of components.  Additionally,
-			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.
-		</para>
-		<para>
-			Developers are expected to run all of the JBoss DNA unit tests in their local environment before committing changes to SVN.
-			So, if you're a developer and you've made changes to your local copy of the source, you can run those tests that are
-			related to your changes using your IDE or with Maven (or any other mechanism).  But before you commit your changes, 
-			you are expected to run a full Maven build using <code>mvn clean install</code> (in the "trunk/" directory).
-			Please do <emphasis>not</emphasis> rely upon continuous integration to run all of the tests for you - the CI
-			system is there to catch the occasional mistakes and to also run the <link linkend="integration-tests">integration tests</link>.
-    </para>
-  </sect1>
-  <sect1 id="integration-tests">
-    <title>Integration tests</title>
-    <para>
-    	While <link linkend="unit-tests">unit tests</link> test individual classes in (relative) isolation, the purpose of
-			<emphasis role="strong">integration tests</emphasis> are to verify that assemblies of classes and components are
-			behaving correctly.  These assemblies are often the same ones that end users will actually use.  In fact,
-			integration tests are executed during the "integration-test" phase of the standard
-			<ulink url="http://maven.apache.org/guides/introduction/introduction-to-the-lifecycle.html">Maven lifecycle</ulink>,
-			meaning they are executed against the packaged JARs and artifacts of the project.
-    </para>
-		<para>
-			Integration tests also use the JUnit 4.4 framework, so they are again easy to write and follow the same pattern
-			as unit tests. However, because they're working with larger assemblies of components, they often will take longer
-			to set up, longer to run, and longer to tear down.  They also may require initializing "external resources", like
-			databases or servers.  
-		</para>
-		<para>
-			Note, that while external resources may be required, care should be taken to minimize these dependencies and to
-			ensure that most (if not all) integration tests may be run by anyone who downloads the source code.  This means
-			that these external resources should be available and set up within the tests.  For example, use in-memory databases
-			where possible.  Or, if a database is required, use an open-source database (e.g., MySQL or PostgreSQL).  And when
-			these external resources are not available, it should be obvious from the test class names and/or test method names 
-			that it involved an external resource (e.g., "<code>MySqlConnectorIntegrationTest.shouldFindNodeStoredInDatabase()</code>").
-		</para>
-  </sect1>
-  <sect1 id="writing-tests">
-    <title>Writing tests</title>
-		<para>
-			As mentioned in <link linkend="methodology">the introduction</link>, the JBoss DNA project doesn't follow any one methodology
-			or process.  Instead, we simply have a goal that as much code as possible is tested to ensure it behaves as expected.
-			Do we expect 100% of the code is covered by automated tests?  No, but we do want to test as much as we can.
-			Maybe a simple JavaBean class doesn't need many tests, but any class with non-trivial logic should be tested.
-		</para>
-		<para>
-			We do encourage writing tests either before or while you write the code.  Again, we're not blindly following a methodology.
-			Instead, there's a very practical reason: writing the tests early on helps you write classes that are testable.  
-			If you wait until after the class (or classes) are done, you'll probably find that it's not easy to test all
-			of the logic (especially the complicated logic).
-		</para>
-		<para>
-			Another suggestion is to write tests so that they specify and verify the behavior that is expected from a class or component.
-			One challenge developers often have is knowing what they should even test and what the tests should look like.
-			This is where <emphasis role="strong"><ulink url="http://behaviour-driven.org/">Behavior-driven development (BDD)</ulink></emphasis>
-			helps out.  If you think about what a class' behaviors are supposed to be (e.g., requirements), simply capture those
-			requirements as test methods (with no implementations).  For example, a test class for sequencer 
-			implementation might have a test method	<code>shouldNotThrowAnErrorWhenTheSuppliedStreamIsNull() { }</code>.  Then, after you enumerate
-			all the requirements you can think of, go back and start implementing the test methods.
-		</para>
-		<para>
-			If you look at the existing test cases, you'll find that the names of the unit and integration tests in JBoss DNA 
-			follow a naming style, where the test method names are readable sentences.  Actually, we try to name the test methods
-			<emphasis>and</emphasis> the test classes such that they form a concisely-worded requirement.  For example,
-		</para>
-		<programlisting>InMemorySequencerTest.shouldNotThrowAnErrorWhenTheSuppliedStreamIsNull()</programlisting>
-		<para>
-			is easily translated into a readable requirement:
-		</para>
-		<programlisting>InMemorySequencer should not throw an error when the supplied stream is null.</programlisting>
-		<para>
-			In fact, at some point in the future, we'd like to process the source to automatically generate a list of the behavior specifications
-			that are asserted by the tests.
-		</para>
-		<para>
-			But for now, we write tests - a lot of them.  And by following a few simple conventions and practices, we're able
-			to do it quickly and in a way that makes it easy to understand what the code is supposed to do (or not do).
-		</para>
-	</sect1>
-  <sect1 id="tck-tests">
-    <title>Technology Compatibility Kit (TCK) tests</title>
-    <para>
-    	Many Java specifications provide TCK test suites that can be used to check or verify that an implementation
-      correctly implements the API or SPI defined by the specification.  These TCK tests vary by technology, but
-			<ulink url="&JSR170;">JSR-170</ulink> does provide TCK tests that ensure that a JCR repository implementation exhibits the correct and expected
-			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>
-		<para>
-			JBoss DNA also frequently runs the JCR unit tests from the Apache Jackrabbit project.  (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>
-  </sect1>
-</chapter>

Modified: trunk/docs/reference/src/main/docbook/en-US/master.xml
===================================================================
--- trunk/docs/reference/src/main/docbook/en-US/master.xml	2009-06-08 00:52:09 UTC (rev 994)
+++ trunk/docs/reference/src/main/docbook/en-US/master.xml	2009-06-08 14:57:17 UTC (rev 995)
@@ -52,14 +52,32 @@
 	</bookinfo>
 	<xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="content/preface.xml"/>
 	<xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="content/introduction.xml"/>
-	<xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="content/development_tools.xml"/>
-	<xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="content/classloaders.xml"/>
-	<xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="content/environment.xml"/>
-  <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="content/repositories.xml"/>
-  <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="content/jcr.xml"/>
-  <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="content/sequencing.xml"/>
-  <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="content/mimetypes.xml"/>
-  <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="content/configuration.xml"/>
-  <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="content/testing.xml"/>
+	<part>
+		<title>Developers and Contributors</title>
+		<xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="content/developers/tools.xml"/>
+	  <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="content/developers/testing.xml"/>
+	</part>
+	<part>
+		<title>JBoss DNA Core</title>
+		<xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="content/core/classloaders.xml"/>
+		<xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="content/core/environment.xml"/>
+	  <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="content/core/repositories.xml"/>
+	  <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="content/core/sequencing.xml"/>
+	  <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="content/core/mimetypes.xml"/>
+	  <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="content/core/configuration.xml"/>
+	</part>
+	<part>
+		<title>JBoss DNA JCR</title>
+  	<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/rest_service.xml"/>
+  </part>
+	<part>
+		<title>Provided Connectors</title>
+  	<xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="content/connectors/in_memory.xml"/>
+	</part>
+	<part>
+		<title>Provided Sequencers</title>
+  	<xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="content/sequencers/zip.xml"/>
+	</part>
 	<xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="content/future.xml"/>
 </book>



From dna-commits at lists.jboss.org  Mon Jun  8 11:21:29 2009
From: dna-commits at lists.jboss.org (dna-commits at lists.jboss.org)
Date: Mon, 08 Jun 2009 11:21:29 -0400
Subject: [dna-commits] DNA SVN: r996 - in
	trunk/docs/reference/src/main/docbook/en-US: content/jcr and
	1 other directory.
Message-ID: <E1MDgfB-0008Vp-H4@committer01.frg.pub.inap.atl.jboss.com>

Author: bcarothers
Date: 2009-06-08 11:21:29 -0400 (Mon, 08 Jun 2009)
New Revision: 996

Added:
   trunk/docs/reference/src/main/docbook/en-US/content/jcr/deploying_dna_jcr.xml
Modified:
   trunk/docs/reference/src/main/docbook/en-US/content/jcr/jcr.xml
   trunk/docs/reference/src/main/docbook/en-US/content/jcr/rest_service.xml
   trunk/docs/reference/src/main/docbook/en-US/master.xml
Log:
Added changes for the extra JCR chapter, moved JCR WIP docs into new directory structure

Added: trunk/docs/reference/src/main/docbook/en-US/content/jcr/deploying_dna_jcr.xml
===================================================================
--- trunk/docs/reference/src/main/docbook/en-US/content/jcr/deploying_dna_jcr.xml	                        (rev 0)
+++ trunk/docs/reference/src/main/docbook/en-US/content/jcr/deploying_dna_jcr.xml	2009-06-08 15:21:29 UTC (rev 996)
@@ -0,0 +1,100 @@
+<?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="deploying_dna_jcr">
+  <title>Deploying the JBoss DNA JCR Implementation</title>
+  <para>
+		Placeholder for the JBoss DNA REST Server documentation
+  </para>
+	<sect1 id="jcr_deployment_models">
+		<title>JBoss DNA JCR Deployment Models</title>
+		<para>
+			One of the objects that must be supplied to many JBoss DNA components is an &ExecutionContext;.  Some components 
+			require this context to be passed into individual methods, allowing the context to vary with each method invocation.
+			Other components require the context to be provided before it's used, and will use that context for all its operations
+			(until it is given a different one).
+		</para>
+	</sect1>
+	<sect1 id="jcr_security">
+		<title>Understanding JCR Security in JBoss DNA</title>
+		<para>
+			One of the objects that must be supplied to many JBoss DNA components is an &ExecutionContext;.  Some components 
+			require this context to be passed into individual methods, allowing the context to vary with each method invocation.
+			Other components require the context to be provided before it's used, and will use that context for all its operations
+			(until it is given a different one).
+		</para>
+	</sect1>
+	<sect1 id="jcr_configuring_security">
+		<title>Configuring Security</title>
+		<para>
+			One of the objects that must be supplied to many JBoss DNA components is an &ExecutionContext;.  Some components 
+			require this context to be passed into individual methods, allowing the context to vary with each method invocation.
+			Other components require the context to be provided before it's used, and will use that context for all its operations
+			(until it is given a different one).
+		</para>
+	</sect1>
+	<sect1 id="jcr_repository_configuration">
+		<title>Configuring the Repositories</title>
+		<para>
+			One of the objects that must be supplied to many JBoss DNA components is an &ExecutionContext;.  Some components 
+			require this context to be passed into individual methods, allowing the context to vary with each method invocation.
+			Other components require the context to be provided before it's used, and will use that context for all its operations
+			(until it is given a different one).
+		</para>
+		<sect2 id="jcr_choosing_connectors">
+			<title>Choosing the Correct Connectors</title>
+			<para>
+				One of the objects that must be supplied to many JBoss DNA components is an &ExecutionContext;.  Some components 
+				require this context to be passed into individual methods, allowing the context to vary with each method invocation.
+				Other components require the context to be provided before it's used, and will use that context for all its operations
+				(until it is given a different one).
+			</para>
+		</sect2>
+	</sect1>
+	<sect1 id="jcr_dna_core_configuration">
+		<title>Configuring JBoss DNA Core</title>
+		<para>
+			One of the objects that must be supplied to many JBoss DNA components is an &ExecutionContext;.  Some components 
+			require this context to be passed into individual methods, allowing the context to vary with each method invocation.
+			Other components require the context to be provided before it's used, and will use that context for all its operations
+			(until it is given a different one).
+		</para>
+	</sect1>
+	<sect1 id="jcr_smoke_test">
+		<title>Smoke Testing the Installation</title>
+		<para>
+			One such implementation is the &JaasSecurityContext;, which delegates any authentication or authorization requests to a
+	    <ulink url="http://java.sun.com/javase/technologies/security/">Java Authentication and Authorization Service (JAAS)</ulink>
+	    provider.  This is the standard approach for authenticating and authorizing in Java, and is the default mechanism 
+	    used by the &JcrEngine;.  
+	  </para>
+	</sect1>
+</chapter>
+


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

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	2009-06-08 14:57:17 UTC (rev 995)
+++ trunk/docs/reference/src/main/docbook/en-US/content/jcr/jcr.xml	2009-06-08 15:21:29 UTC (rev 996)
@@ -29,7 +29,7 @@
 %CustomDTD;
 ]>
 <chapter id="jcr">
-  <title>Content Repositories for Java (JCR)</title>
+  <title>The JBoss DNA Content Repository for Java (JCR) Implementation</title>
   <para>
   	The
     <ulink url="&JSR170;">Content Repository for Java technology API</ulink>
@@ -108,6 +108,15 @@
 			So while the current implementation provides 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>
+			<title>Optional Features</title>
+		</sect2>
+		<sect2>
+			<title>JCR Security</title>
+		</sect2>
+		<sect2>
+			<title>Node Type Registration</title>
+		</sect2>
 	</sect1>
 	<sect1>
 		<title>Summary</title>

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	2009-06-08 14:57:17 UTC (rev 995)
+++ trunk/docs/reference/src/main/docbook/en-US/content/jcr/rest_service.xml	2009-06-08 15:21:29 UTC (rev 996)
@@ -28,16 +28,46 @@
 <!ENTITY % CustomDTD SYSTEM "../../custom.dtd">
 %CustomDTD;
 ]>
-<chapter id="rest-service">
-  <title>RESTful Web Service</title>
+<chapter id="rest_service">
+  <title>The JBoss DNA REST Server</title>
   <para>
-		blah blah 
+		Placeholder for the JBoss DNA REST Server documentation
   </para>
-	<sect1>
-		<title>Summary</title>
+	<sect1 id="supported_rest_resources">
+		<title>Supported Resources and URIs</title>
 		<para>
-			In this chapter, we covered .... something  .... FIX ME.
+			One of the objects that must be supplied to many JBoss DNA components is an &ExecutionContext;.  Some components 
+			require this context to be passed into individual methods, allowing the context to vary with each method invocation.
+			Other components require the context to be provided before it's used, and will use that context for all its operations
+			(until it is given a different one).
 		</para>
 	</sect1>
+	<sect1 id="jcr_rest_spi">
+		<title>Repository Providers</title>
+		<para>
+			One of the objects that must be supplied to many JBoss DNA components is an &ExecutionContext;.  Some components 
+			require this context to be passed into individual methods, allowing the context to vary with each method invocation.
+			Other components require the context to be provided before it's used, and will use that context for all its operations
+			(until it is given a different one).
+		</para>
+	</sect1>
+	<sect1 id="dna_rest_server_configuration">
+		<title>Configuring the DNA REST Server</title>
+		<para>
+			One of the objects that must be supplied to many JBoss DNA components is an &ExecutionContext;.  Some components 
+			require this context to be passed into individual methods, allowing the context to vary with each method invocation.
+			Other components require the context to be provided before it's used, and will use that context for all its operations
+			(until it is given a different one).
+		</para>
+	</sect1>
+	<sect1 id="dna_rest_server_deployment">
+		<title>Deploying the DNA REST Server</title>
+		<para>
+			One such implementation is the &JaasSecurityContext;, which delegates any authentication or authorization requests to a
+	    <ulink url="http://java.sun.com/javase/technologies/security/">Java Authentication and Authorization Service (JAAS)</ulink>
+	    provider.  This is the standard approach for authenticating and authorizing in Java, and is the default mechanism 
+	    used by the &JcrEngine;.  
+	  </para>
+	</sect1>
 </chapter>
 

Modified: trunk/docs/reference/src/main/docbook/en-US/master.xml
===================================================================
--- trunk/docs/reference/src/main/docbook/en-US/master.xml	2009-06-08 14:57:17 UTC (rev 995)
+++ trunk/docs/reference/src/main/docbook/en-US/master.xml	2009-06-08 15:21:29 UTC (rev 996)
@@ -69,6 +69,7 @@
 	<part>
 		<title>JBoss DNA JCR</title>
   	<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/deploying_dna_jcr.xml"/>
   	<xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="content/jcr/rest_service.xml"/>
   </part>
 	<part>



From dna-commits at lists.jboss.org  Mon Jun  8 11:47:40 2009
From: dna-commits at lists.jboss.org (dna-commits at lists.jboss.org)
Date: Mon, 08 Jun 2009 11:47:40 -0400
Subject: [dna-commits] DNA SVN: r997 - in
	trunk/docs/reference/src/main/docbook/en-US: content/core and
	1 other directory.
Message-ID: <E1MDh4W-0001Fb-Ay@committer01.frg.pub.inap.atl.jboss.com>

Author: rhauch
Date: 2009-06-08 11:47:40 -0400 (Mon, 08 Jun 2009)
New Revision: 997

Added:
   trunk/docs/reference/src/main/docbook/en-US/content/core/connector.xml
Removed:
   trunk/docs/reference/src/main/docbook/en-US/content/core/repositories.xml
Modified:
   trunk/docs/reference/src/main/docbook/en-US/content/core/sequencing.xml
   trunk/docs/reference/src/main/docbook/en-US/master.xml
Log:
More revisions to the master Reference Guide document.

Copied: trunk/docs/reference/src/main/docbook/en-US/content/core/connector.xml (from rev 996, trunk/docs/reference/src/main/docbook/en-US/content/core/repositories.xml)
===================================================================
--- trunk/docs/reference/src/main/docbook/en-US/content/core/connector.xml	                        (rev 0)
+++ trunk/docs/reference/src/main/docbook/en-US/content/core/connector.xml	2009-06-08 15:47:40 UTC (rev 997)
@@ -0,0 +1,1468 @@
+<?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="connector_framework">
+  <title>Connector Framework</title>
+  <para></para>
+  <para>There is a lot of information stored in many of different places: databases, repositories, SCM systems,
+    registries, file systems, services, etc. The purpose of the federation engine is to allow applications to use the JCR API
+    to access that information as if it were all stored in a single JCR repository, but to really leave the information where
+    it is.</para>
+  <para>Why not just copy or move the information into a JCR repository?  Moving it is probably pretty difficult, since most 
+		likely there are existing applications that rely upon that information being where it is.  All of those applications
+		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.
+		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
+    those changes down to the original source, making those changes visible to all the other applications.
+	</para>
+	<para>
+		In short, all clients see the correct information, even when it changes in the underlying systems. But the JCR clients can get to all of the information
+		in one spot, using one powerful standard API.
+	</para>
+  <sect1 id="connectors">
+    <title>Repository connectors</title>
+		<para>
+			With JBoss DNA, your applications use the <ulink url="&JSR170;">JCR API</ulink> to work with the repository,
+			but the DNA repository transparently fetches the information from different kinds of repositories and storage systems,
+			not just a single purpose-built store.  This is fundamentally what makes JBoss DNA different.
+		</para>
+		<para>How does JBoss DNA do this?  At the heart of JBoss DNA and it's JCR implementation is a simple graph-based 
+			<emphasis>repository connector</emphasis> system.  Essentially, JBoss DNA's JCR implementation uses a single 
+			repository connector to access all content:
+			<figure id="dnajcr-and-connector">
+				<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 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>
+			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
+			<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">
+				<title>Future JBoss DNA connectors</title>
+				<graphic align="center" scale="100" fileref="dna-connectors-future.png"/>
+			</figure>
+		</para>
+		<para>
+		</para>
+		<para>
+	  	It's even possible to put a different API layer on top of the connectors.  For example, the new <ulink url="&JSR203;">New I/O (JSR-203)</ulink>
+			API offers the opportunity to build new file system providers.  This would be very straightforward to put on top of a JCR implementation,
+			but it could be made even simpler by putting it on top of a DNA connector.  In both cases, it'd be a trivial mapping from nodes that represent
+			files and folders into JSR-203 files and directories, and events on those nodes could easily be translated into JSR-203 watch events.
+			Then, simply choose a DNA connector and configure it to use the source you want to use.
+			<figure id="dna-connectors-vfs">
+				<title>Virtual File System with JBoss DNA</title>
+				<graphic align="center" scale="100" fileref="vfs-and-connector.png"/>
+			</figure>
+		</para>
+    <para>Before we go further, let's define some terminology regarding connectors.</para>
+ 		<itemizedlist>
+			<listitem>
+				<para>
+					A <emphasis role="strong">connector</emphasis> is the runnable code packaged in one or more JAR files that
+					contains implementations of several interfaces (described below).  A Java developer <emphasis>writes</emphasis>
+					a connector to a type of source, such as a particular database management system, LDAP directory, source code
+					management system, etc.  It is then packaged into one or more JAR files (including dependent JARs) and deployed
+					for use in applications that use JBoss DNA repositories.
+				</para>
+			</listitem>
+			<listitem>
+				<para>
+					The description of a particular source system (e.g., the "Customer" database, or the company LDAP system) 
+					is called a <emphasis role="strong">repository source</emphasis>.  JBoss DNA defines a &RepositorySource; interface
+					that defines methods describing the behavior and supported features and a method for establishing connections.
+					A connector will have a class that implements this interface and that has JavaBean properties for
+					all of the connector-specific properties required to fully describe an instance of the system.  Use of JavaBean
+					properties is not required, but it is highly recommended, as it enables reflective configuration and administration.
+					Applications that use JBoss DNA create an instance of the connector's &RepositorySource; implementation and set 
+					the properties for the external source that the application wants to access with that connector.
+				</para>
+			</listitem>
+			<listitem>
+				<para>
+					A repository source instance is then used to establish <emphasis role="strong">connections</emphasis> to
+					that source.  A connector provides an implementation of the &RepositoryConnection; interface, which
+					defines methods for interacting with the external system.  In particular, the <code>execute(...)</code> method
+					takes an &ExecutionContext; instance and a &Request; object.  The &ExectuionContext; object defines the
+					environment in which the processing is occurring, including information about the JAAS &Subject; and &LoginContext;.
+					The &Request; object describes the requested operations on the content, with different concrete subclasses
+					representing each type of activity.  Examples of commands include (but not limited to) getting a node, moving a node, creating a node, 
+					changing a node, and deleting a node.  And, if the repository source is able to participate in JTA/JTS distributed transactions, then the
+					&RepositoryConnection; must implement the <code>getXaResource()</code> method by returning 
+					a valid <code>javax.transaction.xa.XAResource</code> object that can be used by the transaction monitor.
+				</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
+			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;,
+			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.)
+		</para>
+		<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,
+			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
+			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.
+		</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> 
+			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>
+		<para>
+			So, we've so far learned what a repository connector is and how they're used to establish connections to the underlying sources 
+			and access the content in those sources.  In the <link linkend="repository-service">next section</link>, we'll show how these 
+			source instances can be configured, managed, and their connections pooled.  After that, we'll look review JBoss DNA's 
+			<link linkend="connector-library">existing connectors</link> and show how to <link linkend="custom-connectors">create your own connectors</link>.
+		</para>
+  </sect1>
+  <sect1 id="repository-workspaces">
+    <title>Workspaces</title>
+		<para>The previous section talked about how connector expose their information through the graph language of JBoss DNA.
+			This is true, except that we didn't dive into too much of the detail.  JBoss DNA graphs have the notion of <emphasis>workspaces</emphasis>
+			in which the content appears, and its very easy for clients using the graph to switch between workspaces.  In fact,
+			workspaces differ from each other in that they provide different views of the same information.
+		</para>
+		<para>Consider a source control system, like SVN or CVS.  These systems provide different views of the source code:
+			a mainline development branch as well as other branches (or tags) commonly used for releases.  So, just like one source
+			file might appear in the mainline branch as well as the previous two release branches, a node in a repository source
+			might appear in multiple workspaces.
+		</para>
+		<para>
+			However, each connector can kind of decide how (or whether) it uses workspaces.  For example, there may be no overlap
+			in the content between workspaces.  Or a connector might only expose a single workspace (in other words, there's only one
+			"default" workspace).
+		</para>
+  </sect1>
+  <sect1 id="repository-service">
+    <title>Repository Service</title>
+		<para>The JBoss DNA &RepositoryService; is the component that manages the <emphasis>repository sources</emphasis>
+		  and the connections to them.  &RepositorySource; instances can be programmatically added to the service, but
+			the service can actually read its configuration from a configuration repository (which, by the way, is represented by a
+			just another &RepositorySource; instance that's usually added programmatically to the service).  The service connects to
+			the configuration repository, reads the content in a particular area, and automatically sets up the &RepositorySource; instances
+		  per the information found in the configuration repository.  
+		</para>
+		<para>
+			The &RepositoryService; also transparently maintains for each source a pool of reusable connections.  The pooling properties
+			can be controlled via the configuration repository, or adjusted programmatically.
+		</para>
+    <para>
+			Using a repository, then, involves simply asking the &RepositoryService; for a &RepositoryConnection;
+			to the repository given the repository's name.  If a source exists with that name, the service checks out a connection from
+			the source's pool.  The resulting connection is actually a wrapper around the underlying pooled connection, so the
+			component that requested the connection can simply close it, and under the covers the actual connection is simply returned
+			to the pool.
+    </para>
+		<para>To instantiate the &RepositoryService;, we need to first have a few other objects:
+			<itemizedlist>
+				<listitem>
+					<para>
+						A &ExecutionContext; instance, as discussed <link linkend="execution-context">earlier</link>.
+					</para>
+				</listitem>
+				<listitem>
+					<para>
+						A &RepositoryLibrary; instance that manages the list of &RepositorySource; instances,
+						properly injects the execution contexts into each repository source, and provides a configurable pool of connections
+						for each source.
+					</para>
+				</listitem>
+				<listitem>
+					<para>
+						A <emphasis>configuration repository</emphasis> that contains descriptions of all of the repository sources
+					  as well as any information those sources need.  Because this is a regular repository, this could be a simple 
+					  repository with content loaded from an XML file, or it could be a shared
+					  central repository with information about all of the JBoss DNA repositories used across your organization.
+					</para>
+				</listitem>
+			</itemizedlist>
+			With these components in place, we can then instantiate the &RepositoryService; and start it (using its
+			&ServiceAdministrator;).  During startup, the service reads the configuration repository and loads any
+			defined &RepositorySource; instances into the repository library, using the class loader factory 
+			(available in the &ExecutionContext;) to obtain.
+    </para>
+		<para>
+			Here's sample code that shows how to set up and start the repository service.  You can see something similar
+			in the example application in the <code>startRepositories()</code> method of the 
+			<code>org.jboss.example.dna.repository.RepositoryClient</code> class.
+		</para>
+    <programlisting>
+ // Create the top-level execution context with all standard components ...
+ &ExecutionContext; context = new ExecutionContext();
+
+ // Create the library for the RepositorySource instances ...
+ &RepositoryLibrary; sources = new &RepositoryLibrary;(context);
+
+ // Load into the source manager the repository source for the configuration repository ...
+ &InMemoryRepositorySource; configSource = new &InMemoryRepositorySource;();
+ configSource.setName("Configuration");
+ sources.addSource(configSource);
+
+ // Now instantiate the Repository Service ...
+ &RepositoryService; service = new &RepositoryService;(sources, configSource.getName(), context);
+ service.getAdministrator().start();
+ </programlisting>
+
+		<para>After startup completes, the repositories are ready to be used.  The client application obtains the list of repositories
+			and presents them to the user.  When the user selects one, the client application starts navigating that repository
+			starting at its root node (e.g., the "/" path).  As you type a command to list the contents of the current node or to
+			"change directories" to a different node, the client application obtains the information for the node using a simple
+			procedure:
+			<orderedlist>
+				<listitem>
+					<para>Get a connection to the repository.</para>
+				</listitem>
+				<listitem>
+					<para>Using the connection, find the current node and read its properties and children, putting the information
+						into a simple Java plain old Java object (POJO).</para>
+				</listitem>
+				<listitem>
+					<para>Close the connection to the repository (in a finally block to ensure it always happens).</para>
+				</listitem>
+			</orderedlist>
+		</para>
+  </sect1>
+  <sect1 id="connector-library">
+    <title>Out-of-the-box repository connectors</title>
+    <para>
+    	A number of repository connectors are already available in JBoss DNA, and are outlined in the following sections.
+			Note that we do want to build <ulink url="https://jira.jboss.org/jira/secure/IssueNavigator.jspa?reset=true&amp;mode=hide&amp;pid=12310520&amp;sorter/order=DESC&amp;sorter/field=priority&amp;resolution=-1&amp;component=12311441">more connectors</ulink>
+			in the upcoming releases.
+    </para>
+    <sect2 id="dna-connector-inmemory">
+      <title>In-memory connector</title>
+      <para>
+      	The in-memory repository connector is a simple connector that creates a transient, in-memory repository.
+				This repository is used as a very simple in-memory cache or as a standalone transient repository.
+      </para>
+			<para>
+				The &InMemoryRepositorySource; class provides a number of JavaBean properties that control its behavior:
+			</para>
+			<table frame='all'>
+				<title>&InMemoryRepositorySource; 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>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>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>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>
+						</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>
+						</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>
+    </sect2>
+    <sect2 id="dna-connector-jbosscache">
+      <title>JBoss Cache connector</title>
+      <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="dna-connector-federation">federated</link>
+				repository.
+      </para>
+			<para>
+				The &JBossCacheSource; class provides a number of JavaBean properties that control its behavior:
+			</para>
+			<table frame='all'>
+				<title>&JBossCacheSource; 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>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>cacheFactoryJndiName</entry>
+							<entry>Optional property that, if used, specifies the name in JNDI where an existing JBoss Cache Factory instance can be found.
+								That factory would then be used if needed to create a JBoss Cache instance.  If no value is provided, then the
+								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
+								a special way.</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>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>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>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 defines the names of the workspaces that exist and that are available for use without having to create them.</entry>
+						</row>
+						<row>
+							<entry>creatingWorkspacesAllowed</entry>
+							<entry>Optional property that is by default 'true' that defines whether clients can create new workspaces.</entry>
+						</row>
+					</tbody>
+				</tgroup>
+			</table>
+    </sect2>
+    <sect2 id="dna-connector-federation">
+      <title>Federating connector</title>
+      <para>
+      	The federated repository source provides a unified repository consisting of information that is dynamically federated from multiple other
+				&RepositorySource; instances.  This is a very powerful repository source that appears to be a single repository, when in 
+				fact the content is stored and managed in multiple other systems.  Each &FederatedRepositorySource; is typically configured
+				with the name of another &RepositorySource; that should be used as the local, unified cache of the federated content.
+				The configuration also contains the names of the other &RepositorySource; instances that are to be federated along with
+				the &Projection; definition describing where in the unified repository the content is to appear.
+      </para>
+			<figure id="dna-connector-federation-image">
+				<title>Federating multiple sources using the Federated Repository Connector</title>
+				<graphic align="center" scale="100" fileref="dna-connector-federation.png"/>
+			</figure>
+      <para> The federation connector works by effectively building up a single graph by querying each source and merging or
+        unifying the responses. This information is cached, which improves performance, reduces the number of (potentially
+        expensive) remote calls, reduces the load on the sources, and helps mitigate problems with source availability. As
+        clients interact with the repository, this cache is consulted first. When the requested portion of the graph (or
+        "subgraph") is contained completely in the cache, it is retuned immediately. However, if any part of the requested
+        subgraph is not in the cache, each source is consulted for their contributions to that subgraph, and any results are
+        cached.</para>
+      <para> This basic flow makes it possible for the federated repository to build up a local cache of the integrated graph
+        (or at least the portions that are used by clients). In fact, the federated repository caches information in a manner
+        that is similar to that of the Domain Name System (DNS). As sources are consulted for their contributions, the source
+        also specifies whether it is the authoritative source for this information (some sources that are themselves federated
+        may not be the information's authority), whether the information may be modified, the time-to-live (TTL) value (the time
+        after which the cached information should be refreshed), and the expiration time (the time after which the cached
+        information is no longer valid). In effect, the source has complete control over how the information it contributes is
+        cached and used.</para>
+      <para>
+        The federated repository also needs to incorporate <emphasis>negative caching</emphasis>, which is storage of the knowledge 
+				that something does <emphasis>not</emphasis> exist. Sources can be configured to contribute information
+        only below certain paths (e.g., <code>/A/B/C</code>), and the federation engine can take advantage of this by never 
+				consulting that source for contributions to information on other paths. However, below that path, any negative responses 
+				must also be cached (with appropriate TTL and expiry parameters) to prevent the exclusion of that source (in case the source 
+				has information to contribute at a later time) or the frequent checking with the source.
+      </para>
+			<para>
+				The federated repository uses other &RepositorySource;s that are to be federated and a &RepositorySource; that is to be used as the
+				cache of the unified contents.  These are configured in another &RepositorySource; that is treated as a configuration repository.
+				The &FederatedRepositorySource; class uses JavaBean properties to define the name of the configuration repository and 
+				the path to the "<code>dna:federation</code>" node in that configuration repository containing the information about the 
+				cache and federated sources.  This graph structure that is expected at this location is as follows:
+			</para>
+			<programlisting><![CDATA[<!-- Define the federation configuration. -->
+<dna:federatedRepository xmlns:dna="http://www.jboss.org/dna" 
+	                   xmlns:jcr="http://www.jcp.org/jcr/1.0"
+                     dna:timeToCache="100000" >
+  <dna:workspaces>
+    <dna:workspace jcr:name="default">
+	    <!-- Define how the content in the 'Cache' source is to map to the federated cache -->
+      <dna:cache dna:sourceName="Cache" dna:workspaceName="default" dna:projectionRules="/a => /" />
+
+      <!-- Define how the content in the two sources maps to the federated/unified repository.
+           This example puts the 'Cars' and 'Aircraft' content underneath '/vehicles', but the
+           'Configuration' content (which is defined by this file) will appear under '/'. -->
+      <dna:projections>
+        <dna:projection jcr:name="Cars" dna:projectionRules="/Vehicles => /" />
+        <dna:projection jcr:name="Aircraft" dna:projectionRules="/Vehicles => /" />
+        <dna:projection jcr:name="Configuration" dna:projectionRules="/ => /" />
+      </dna:projections>
+    </dna:workspace>
+	</dna:workspaces>
+</dna:federatedRepository>
+]]></programlisting>
+			<note>
+				<para>
+					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
+					works.
+				</para>
+			</note>
+			<para>
+				Notice that there is a cache projection and three source projections, and each projection defines
+				one or more <emphasis>projection rules</emphasis> that are of the form:
+			</para>
+			<programlisting>pathInFederatedRepository =&gt; pathInSourceRepository</programlisting>
+			<para>
+				So, a projection rule <code>/Vehicles =&gt; /</code> projects the entire contents of the source so that
+				it appears in the federated repository under the "<code>/Vehicles</code>" node.
+			</para>
+			<para>
+				The &FederatedRepositorySource; class provides a number of JavaBean properties that control its behavior:
+			</para>
+			<table frame='all'>
+				<title>&FederatedRepositorySource; 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>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>repositoryName</entry>
+							<entry>The name for the federated repository.</entry>
+						</row>
+						<row>
+							<entry>configurationSourceName</entry>
+							<entry>The name of the &RepositorySource; that should be used as the configuration repository, and in which is defined
+								how this federated repository is to be set up and configured.
+								This name is supplied to the &RepositoryConnectionFactory; that is provided to this instance when added to the
+								&RepositoryLibrary;.</entry>
+						</row>
+						<row>
+							<entry>configurationWorkspaceName</entry>
+							<entry>The name of the workspace in the configuration &RepositorySource; with the content defining
+								how this federated repository is to be set up and configured.</entry>
+						</row>
+						<row>
+							<entry>configurationSourcePath</entry>
+							<entry>The path to the node in the configuration repository below which a "dna:federation" node exists with the 
+								graph structure describing how this federated repository is to be configured.</entry>
+						</row>
+						<row>
+							<entry>securityDomain</entry>
+							<entry>Optional property that, if used, specifies the name of the JAAS application context that should be used
+								to establish the <link linkend="execution-contenxt">execution context</link> for this repository.
+								This should correspond to the JAAS login configuration located within the JAAS login configuration file, 
+								and should be used only if a "<code>username</code>" property is defined.</entry>
+						</row>
+						<row>
+							<entry>username</entry>
+							<entry>Optional property that, if used, defines the name of the JAAS subject that should be used
+								to establish the <link linkend="execution-contenxt">execution context</link> for this repository.
+								This should be used if a "<code>securityDomain</code>" property is defined.</entry>
+						</row>
+						<row>
+							<entry>password</entry>
+							<entry>Optional property that, if used, defines the password of the JAAS subject that should be used
+								to establish the <link linkend="execution-contenxt">execution context</link> for this repository.
+								If the password is not provided but values for the "<code>securityDomain</code>" and "<code>username</code>" properties are,
+								then authentication will use the default JAAS callback handlers.</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>
+						</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>
+					</tbody>
+				</tgroup>
+			</table>
+    </sect2>
+  </sect1>
+  <sect1 id="custom-connectors">
+    <title>Writing custom connectors</title>
+    <para>
+		  There may come a time when you want to tackle creating your own repository connector.  Maybe the connectors we provide out-of-the-box
+			don't work with your source.  Maybe you want to use a different cache system.  
+			Maybe you have a system that you want to make available through a JBoss DNA repository.  Or, maybe you're
+			a contributor and want to help us round out our library with a new connector.  No matter what the reason, creating a new connector
+			is pretty straightforward, as we'll see in this section.
+    </para>
+	  <para>
+		  Creating a custom connector involves the following steps:
+		  <orderedlist>
+		    <listitem>
+		      <para>Create a Maven 2 project for your connector;</para>
+		    </listitem>
+		    <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 
+						<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.
+					</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
+						in different environments, and try to make the failure messages clear when the tests can't connect to the underlying source.)
+					</para>
+		    </listitem>
+		    <listitem>
+		      <para>
+						Configure JBoss DNA to use your connector.  This may involve just registering the source with the &RepositoryService;,
+			   		or it may involve adding a source to a configuration repository used by the <link linkend="dna-connector-federation">federated repository</link>.
+					</para>
+		    </listitem>
+		    <listitem>
+		      <para>
+						Deploy the JAR file with your connector (as well as any dependencies), and make them available to JBoss DNA
+		      	in your application.
+					</para>
+		    </listitem>
+		  </orderedlist>
+		  Let's go through each one of these steps in more detail.
+	  </para>
+	  <sect2 id="custom_connector_project">
+	    <title>Creating the Maven 2 project</title>
+	    <para>
+				The first step is to create the Maven 2 project that you can use to compile your code and build the JARs.
+	    	Maven 2 automates a lot of the work, and since you're already <link linkend="maven">set up to use Maven</link>,
+	    	using Maven for your project will save you a lot of time and effort.  Of course, you don't have to use Maven 2, but then you'll
+	    	have to get the required libraries and manage the compiling and building process yourself.</para>
+	    <note>
+	      <para>JBoss DNA may provide in the future a Maven archetype for creating connector projects.  If you'd find this useful
+	        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.
+		    	See the subversion repository: <ulink url="&Subversion;trunk/extensions/dna-connector-filesystem/">&Subversion;trunk/extensions/dna-connector-filesystem/</ulink>
+		    </para>
+		  </note>
+	    <para>
+				You can create your Maven project any way you'd like.  For examples, see the 
+				<ulink url="http://maven.apache.org/guides/getting-started/index.html#How_do_I_make_my_first_Maven_project">Maven 2 documentation</ulink>.  
+	    	Once you've done that, just add the dependencies in your project's <code>pom.xml</code> dependencies section:
+			</para>
+	  	<programlisting role="XML"><![CDATA[
+<dependency>
+  <groupId>org.jboss.dna</groupId>
+  <artifactId>dna-graph</artifactId>
+  <version>0.4</version>
+</dependency>
+	 ]]></programlisting>
+			<para>
+				This is the only dependency required for compiling a connector - Maven pulls in all of the dependencies needed by 
+				the 'dna-graph' artifact.  Of course, you'll still have to add dependencies for any library your connector needs
+				to talk to its underlying system.
+			</para>
+	  	<para>
+				As for testing, you probably will want to add more dependencies, such as those listed here:
+			</para>
+			<programlisting role="XML"><![CDATA[
+<dependency>
+  <groupId>org.jboss.dna</groupId>
+  <artifactId>dna-graph</artifactId>
+  <version>0.4</version>
+  <type>test-jar</type>
+  <scope>test</scope>
+</dependency>
+<dependency>
+  <groupId>org.jboss.dna</groupId>
+  <artifactId>dna-common</artifactId>
+  <version>0.4</version>
+  <type>test-jar</type>
+  <scope>test</scope>
+</dependency>
+<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>
+<!-- Logging with Log4J -->
+<dependency>
+  <groupId>org.slf4j</groupId>
+  <artifactId>slf4j-log4j12</artifactId>
+  <version>1.4.3</version>
+  <scope>test</scope>
+</dependency>
+<dependency>
+  <groupId>log4j</groupId>
+  <artifactId>log4j</artifactId>
+  <version>1.2.14</version>
+  <scope>test</scope>
+</dependency>
+	 ]]></programlisting>
+	  	<para>
+				Testing JBoss DNA connectors does not require a JCR repository or the JBoss DNA services.  (For more detail,
+	  		see the <link linkend="testing_custom_connectors">testing section</link>.) However, if you want to do
+	  		integration testing with a JCR repository and the JBoss DNA services, you'll need additional dependencies
+				(e.g., <code>dna-repository</code> and any other extensions).
+			</para>
+	    <para>
+				At this point, your project should be set up correctly, and you're ready to move on to 
+	  		<link linkend="implementing_repository_source">writing the Java implementation</link> for your connector.
+			</para>
+	  </sect2>
+	  <sect2 id="implementing_repository_source">
+	    <title>Implementing a <code>RepositorySource</code></title>
+	    <para>
+				As mentioned earlier, a <emphasis>connector</emphasis> consists of the Java code that is used to access content
+				from a system.  Perhaps the most important class that makes up a connector is the implementation of the
+				&RepositorySource;.  This class is analogous to JDBC's DataSource in that it is instantiated to represent
+				a single instance of a system that will be accessed, and it contains enough information (in the form of JavaBean properties)
+				so that it can create connections to the source.
+			</para>
+			<para>
+				Why is the &RepositorySource; implementation a JavaBean?  Well, this is the class that is instantiated, usually
+				reflectively, and so a no-arg constructor is required.  Using JavaBean properties makes it possible
+				to reflect upon the object's class to determine the properties that can be set (using setters) and read
+				(using getters).  This means that an administrative application can instantiate, configure, and manage
+				the objects that represent the actual sources, without having to know anything about the actual implementation.
+			</para>
+			<para>
+				So, your connector will need a public class that implements &RepositorySource; and provides JavaBean properties
+				for any kind of inputs or options required to establish a connection to and interact with the underlying source.
+				Most of the semantics of the class are defined by the &RepositorySource; and inherited interface.
+				However, there are a few characteristics that are worth mentioning here.
+			</para>
+			<sect3 id="connector_cache_policy">
+				<title>Cache policy</title>
+				<para>
+					Each connector is responsible for determining whether and how long DNA is to cache the
+					content made available by the connector.  This is referred to as the <emphasis>caching policy</emphasis>,
+					and consists of a <emphasis>time to live</emphasis> value representing the number of milliseconds that
+					a piece of data may be cached.  After the TTL has passed, the information is no longer used.
+				</para>
+				<para>
+					DNA allows a connector to use a flexible and powerful caching policy.  First, each connection returns the
+					<emphasis>default</emphasis> caching policy for all information returned by that connection.
+					Often this policy can be configured via properties on the &RepositorySource; implementation.
+					This is optional, meaning the connector can return <code>null</code> if it does not wish to
+					have a default caching policy.
+				</para>
+				<para>
+					Second, the connector is able to override its default caching policy on individual requests
+					(which we'll cover in the <link linkend="implementing_repository_connection">next section</link>).
+					Again, this is optional, meaning that a null caching policy on a request implies that the
+					request has no overridden caching policy.
+				</para>
+				<para>
+					Third, if the connector has no default caching policy and none is set on the individual requests,
+					DNA uses whatever caching policy is set up for that component using the connector.  For example, the federating
+					connector allows a default caching policy to be specified, and this policy is used should the sources
+					being federated not define their own caching policy.
+				</para>
+				<para>
+					In summary, a connector has total control over whether and for how long the information it provides
+					is cached.
+				</para>
+			</sect3>
+			<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.
+					One example of this is the JBoss Cache connector: while the connector can
+					instantiate a new JBoss Cache instance, more interesting use cases involve JBoss Cache instances that are
+					set up for clustering and replication, something that is generally difficult to configure in a single JavaBean.
+					Therefore the &JBossCacheSource; has optional JavaBean properties that define how it is to look up a
+					JBoss Cache instance in JNDI.  
+				</para>
+				<para>
+					This is a simple pattern that you may find useful in your connector.  Basically, if your source implementation
+					can look up an object in JNDI, simply use a single JavaBean String property that defines the 
+					full name that should be used to locate that object in JNDI.  Usually it's best to include "Jndi" in the
+					JavaBean property name so that administrative users understand the purpose of the property.
+					(And some may suggest that any optional property also use the word "optional" in the property name.)
+				</para>
+			</sect3>
+			<sect3 id="repository_source_capabilities">
+				<title>Capabilities</title>
+				<para>
+					Another characteristic of a &RepositorySource; implementation is that it provides some hint as to whether
+					it supports several features.  This is defined on the interface as a method that returns a
+					&RepositorySourceCapabilities; object.  This class currently provides methods that say whether the connector supports
+					updates, whether it supports same-name-siblings (SNS), and whether the connector supports listeners and events.
+				</para>
+				<para>
+					Note that these may be hard-coded values, or the connector's response may be determined at runtime by various factors.
+					For example, a connector may interrogate the underlying system to decide whether it can support updates.
+				</para>
+				<para>
+					The &RepositorySourceCapabilities; can be used as is (the class is immutable), or it can be subclassed
+					to provide more complex behavior.  It is important, however, that the capabilities remain constant
+					throughout the lifetime of the &RepositorySource; instance.
+				</para>
+				<note>
+					<para>
+						Why a concrete class and not an interface?  By using a concrete class, connectors inherit the default
+						behavior.  If additional capabilities need to be added to the class in future releases, connectors may
+						not have to override the defaults.  This provides some insulation against future enhancements to the connector framework.
+					</para>
+				</note>
+			</sect3>
+			<sect3 id="repository_source_security">
+				<title>Security and authentication</title>
+				<para>
+					As we'll see in the next section, the main method connectors have to process requests takes an &ExecutionContext;,
+					which contains the JAAS security information of the subject performing the request.  This means that the connector
+					can use this to determine authentication and authorization information for each request.
+				</para>
+				<para>
+					Sometimes that is not sufficient.  For example, it may be that the connector needs its own authorization information
+					so that it can establish a connection (even if user-level privileges still use the &ExecutionContext; provided with
+					each request).  In this case, the &RepositorySource; implementation will probably need JavaBean properties
+					that represent the connector's authentication information.  This may take the form of a username and password,
+					or it may be properties that are used to delegate authentication to JAAS.  
+					Either way, just realize that it's perfectly acceptable for the connector to require its own security properties.
+				</para>
+			</sect3>
+		</sect2>
+	  <sect2 id="implementing_repository_connection">
+	    <title>Implementing a <code>RepositoryConnection</code></title>
+	    <para>
+				One job of the &RepositorySource; implementation is to create connections to the underlying sources.
+				Connections are represented by classes that implement the &RepositoryConnection; interface, and creating this
+				class is the next step in writing a repository connector.  This is what we'll cover in this section.
+			</para>
+	    <para>
+				The &RepositoryConnection; interface is pretty straightforward:
+			</para>
+	    <programlisting>
+/**
+ * A connection to a repository source.
+ * <p>
+ * These connections need not support concurrent operations by multiple threads.
+ * </p>
+ */
+ at NotThreadSafe
+public interface &RepositoryConnection; {
+
+    /**
+     * Get the name for this repository source. This value should be the same as that returned
+     * by the same &RepositorySource; that created this connection.
+     * 
+     * @return the identifier; never null or empty
+     */
+    String getSourceName();
+
+    /**
+     * Return the transactional resource associated with this connection. The transaction manager 
+     * will use this resource to manage the participation of this connection in a distributed transaction.
+     * 
+     * @return the XA resource, or null if this connection is not aware of distributed transactions
+     */
+    XAResource getXAResource();
+
+    /**
+     * Ping the underlying system to determine if the connection is still valid and alive.
+     * 
+     * @param time the length of time to wait before timing out
+     * @param unit the time unit to use; may not be null
+     * @return true if this connection is still valid and can still be used, or false otherwise
+     * @throws InterruptedException if the thread has been interrupted during the operation
+     */
+    boolean ping( long time, &TimeUnit; unit ) throws InterruptedException;
+
+    /**
+     * Set the listener that is to receive notifications to changes to content within this source.
+     * 
+     * @param listener the new listener, or null if no component is interested in the change notifications
+     */
+    void setListener( &RepositorySourceListener; listener );
+
+    /**
+     * Get the default cache policy for this repository. If none is provided, a global cache policy
+     * will be used.
+     * 
+     * @return the default cache policy
+     */
+    &CachePolicy; getDefaultCachePolicy();
+
+    /**
+     * Execute the supplied commands against this repository source.
+     * 
+     * @param context the environment in which the commands are being executed; never null
+     * @param request the request to be executed; never null
+     * @throws RepositorySourceException if there is a problem loading the node data
+     */
+    void execute( &ExecutionContext; context,
+                  &Request; request ) throws &RepositorySourceException;;
+
+    /**
+     * Close this connection to signal that it is no longer needed and that any accumulated 
+     * resources are to be released.
+     */
+    void close();
+}</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
+				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>
+				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
+				as well as the subject performing the request.  This was discussed <link linkend="execution-context">earlier</link>.
+			</para>
+	    <para>
+				The second parameter, however, represents a request that is to be processed by the connector.  Request objects can
+				take many different forms, as there are different classes for each kind of request (see the table below).
+				Each request contains the information a connector needs to do the processing, and it also is the place
+				where the connector places the results (or the error, if one occurs).
+			</para>
+			<para>
+				How do the requests reference a node (or nodes)? Since requests are coming from a client, the client 
+				may identify a particular node using a &Location; object that is created with:
+			  <itemizedlist>
+			    <listitem>
+			      <para>the &Path; to the node; or</para>
+			    </listitem>
+			    <listitem>
+			      <para>one or more <emphasis>identification properties</emphasis> that are likely source=specific
+							and that are represented with &Property; objects; or</para>
+			    </listitem>
+			    <listitem>
+			      <para>a combination of both.</para>
+			    </listitem>
+			  </itemizedlist>
+				So, when a client knows the path or the identification properties, they can create a &Location;.  However,
+				all of the requests return &Location; objects, so often times the client simply uses the location
+				from a previous request.  Since &Location; is an immutable class, it is perfectly safe to reuse them.
+			</para>
+			<para>
+				One more thing about locations: while the request may have an incomplete location (e.g., a path but no
+				identification properties), the connector is expected to set on the request the <emphasis>actual</emphasis>
+				location that contains the path and all identification properties.  So as long as the client
+				reuses the actual locations in subsequent requests, the connectors will have the benefit of having
+				both the path and identification properties.  Connectors can then be written to leverage this
+				information, although the connector should still perform as expected when requests have incomplete locations.
+			</para>
+			<table frame='all'>
+				<title>Types of Node Operation Requests</title>
+				<tgroup cols='2' align='left' colsep='1' rowsep='1'>
+		      <colspec colname='c1' colwidth="1*"/>
+		      <colspec colname='c2' colwidth="1*"/>
+					<thead>
+						<row>
+				  		<entry>Name</entry>
+				  		<entry>Description</entry>
+						</row>
+					</thead>
+					<tbody>
+						<row>
+							<entry>ReadNodeRequest</entry>
+							<entry>
+								A request to read from the named workspace in the source a node's properties and children.
+								The node may be specified by path and/or by identification properties.
+								The connector returns all properties and the locations for all children,
+								or sets a &PathNotFoundException; error on the request if the node did not exist in the workspace.
+								If the node is found, the connector sets on the request the actual location of the node (including the path and identification properties).
+								The connector sets a &InvalidWorkspaceException; error on the request if the named workspace does not exist.
+							</entry>
+						</row>
+						<row>
+							<entry>VerifyNodeExistsRequest</entry>
+							<entry>
+								A request to verify the existance of a node at the specified location in the named workspace of the source.
+								The connector returns all the actual location for the node if it exists, or
+								sets a &PathNotFoundException; error on the request if the node does not exist in the workspace.
+								The connector sets a &InvalidWorkspaceException; error on the request if the named workspace does not exist.
+							</entry>
+						</row>
+						<row>
+							<entry>ReadAllPropertiesRequest</entry>
+							<entry>
+								A request to read from the named workspace in the source all of the properties of a node.
+								The node may be specified by path and/or by identification properties.
+								The connector returns all properties that were found on the node,
+								or sets a &PathNotFoundException; error on the request if the node did not exist in the workspace.
+								If the node is found, the connector sets on the request the actual location of the node (including the path and identification properties).
+								The connector sets a &InvalidWorkspaceException; error on the request if the named workspace does not exist.
+							</entry>
+						</row>
+						<row>
+							<entry>ReadPropertyRequest</entry>
+							<entry>
+								A request to read from the named workspace in the source a single property of a node.
+								The node may be specified by path and/or by identification properties,
+								and the property is specified by name.
+								The connector returns the property if found on the node,
+								or sets a &PathNotFoundException; error on the request if the node or property did not exist in the workspace.
+								If the node is found, the connector sets on the request the actual location of the node (including the path and identification properties).
+								The connector sets a &InvalidWorkspaceException; error on the request if the named workspace does not exist.
+							</entry>
+						</row>
+						<row>
+							<entry>ReadAllChildrenRequest</entry>
+							<entry>
+								A request to read from the named workspace in the source all of the children of a node.
+								The node may be specified by path and/or by identification properties.
+								The connector returns an ordered list of locations for each child found on the node,
+								an empty list if the node had no children,
+								or sets a &PathNotFoundException; error on the request if the node did not exist in the workspace.
+								If the node is found, the connector sets on the request the actual location of the parent node (including the path and identification properties).
+								The connector sets a &InvalidWorkspaceException; error on the request if the named workspace does not exist.
+							</entry>
+						</row>
+						<row>
+							<entry>ReadBlockOfChildrenRequest</entry>
+							<entry>
+								A request to read from the named workspace in the source a block of children of a node, starting with the n<superscript>th</superscript> children.
+								This is designed to allow paging through the children, which is much more efficient for large numbers of children.
+								The node may be specified by path and/or by identification properties, and the block
+								is defined by a starting index and a count (i.e., the block size).
+								The connector returns an ordered list of locations for each of the node's children found in the block,
+								or an empty list if there are no children in that range.
+								The connector also sets on the request the actual location of the parent node (including the path and identification properties)
+								or sets a &PathNotFoundException; error on the request if the parent node did not exist in the workspace.
+								The connector sets a &InvalidWorkspaceException; error on the request if the named workspace does not exist.
+							</entry>
+						</row>
+						<row>
+							<entry>ReadNextBlockOfChildrenRequest</entry>
+							<entry>
+								A request to read from the named workspace in the source a block of children of a node, starting with the children that immediately follow
+								a previously-returned child.
+								This is designed to allow paging through the children, which is much more efficient for large numbers of children.
+								The node may be specified by path and/or by identification properties, and the block
+								is defined by the location of the node immediately preceding the block and a count (i.e., the block size).
+								The connector returns an ordered list of locations for each of the node's children found in the block,
+								or an empty list if there are no children in that range.
+								The connector also sets on the request the actual location of the parent node (including the path and identification properties)
+								or sets a &PathNotFoundException; error on the request if the parent node did not exist in the workspace.
+								The connector sets a &InvalidWorkspaceException; error on the request if the named workspace does not exist.
+							</entry>
+						</row>
+						<row>
+							<entry>ReadBranchRequest</entry>
+							<entry>
+								A request to read a portion of a subgraph that has as its root a particular node, up to a maximum depth.
+								This request is an efficient mechanism when a branch (or part of a branch) is to be navigated and processed,
+								and replaces some non-trivial code to read the branch iteratively using multiple <code>ReadNodeRequest</code>s.
+								The connector reads the branch to the specified maximum depth, returning the properties and children for all
+								nodes found in the branch.  
+								The connector also sets on the request the actual location of the branch's root node (including the path and identification properties).
+								The connector sets a &PathNotFoundException; error on the request if the node at 
+								the top of the branch does not exist in the workspace.
+								The connector sets a &InvalidWorkspaceException; error on the request if the named workspace does not exist.
+							</entry>
+						</row>
+						<row>
+							<entry>CreateNodeRequest</entry>
+							<entry>
+								A request to create a node at the specified location and setting on the new node the properties included in the request.
+								The connector creates the node at the desired location, adjusting any same-name-sibling indexes as required.
+								(If an SNS index is provided in the new node's location, existing children with the same name after that SNS index
+								will have their SNS indexes adjusted.  However, if the requested location does not include a SNS index, the new
+								node is added after all existing children, and it's SNS index is set accordingly.)
+								The connector also sets on the request the actual location of the new node (including the path and identification properties)..
+								The connector sets a &PathNotFoundException; error on the request if the parent node does not exist in the workspace.
+								The connector sets a &InvalidWorkspaceException; error on the request if the named workspace does not exist.
+							</entry>
+						</row>
+						<row>
+							<entry>RemovePropertiesRequest</entry>
+							<entry>
+								A request to remove a set of properties on an existing node.  The request contains the location of the node as well as the
+								names of the properties to be removed.  The connector performs these changes and sets on the request the
+								actual location (including the path and identification properties) of the node.
+								The connector sets a &PathNotFoundException; error on the request if the node does not exist in the workspace.
+								The connector sets a &InvalidWorkspaceException; error on the request if the named workspace does not exist.
+							</entry>
+						</row>
+						<row>
+							<entry>UpdatePropertiesRequest</entry>
+							<entry>
+								A request to set or update properties on an existing node.  The request contains the location of the node as well as the
+								properties to be set and those to be deleted.  The connector performs these changes and sets on the request the
+								actual location (including the path and identification properties) of the node.
+								The connector sets a &PathNotFoundException; error on the request if the node does not exist in the workspace.
+								The connector sets a &InvalidWorkspaceException; error on the request if the named workspace does not exist.
+							</entry>
+						</row>
+						<row>
+							<entry>RenameNodeRequest</entry>
+							<entry>
+								A request to change the name of a node.  The connector changes the node's name, adjusts all SNS indexes
+								accordingly, and returns the actual locations (including the path and identification properties) of both the original
+								location and the new location.
+								The connector sets a &PathNotFoundException; error on the request if the node does not exist in the workspace.
+								The connector sets a &InvalidWorkspaceException; error on the request if the named workspace does not exist.
+							</entry>
+						</row>
+						<row>
+							<entry>CopyBranchRequest</entry>
+							<entry>
+								A request to copy a portion of a subgraph that has as its root a particular node, up to a maximum depth.
+								The request includes the name of the workspace where the original node is located as well as the name of the
+								workspace where the copy is to be placed (these may be the same, but may be different).
+								The connector copies the branch from the original location, up to the specified maximum depth, and places a copy
+								of the node as a child of the new location.
+								The connector also sets on the request the actual location (including the path and identification properties)
+								of the original location as well as the location of the new copy.
+								The connector sets a &PathNotFoundException; error on the request if the node at 
+								the top of the branch does not exist in the workspace.
+								The connector sets a &InvalidWorkspaceException; error on the request if one of the named workspaces does not exist.
+							</entry>
+						</row>
+						<row>
+							<entry>MoveBranchRequest</entry>
+							<entry>
+								A request to move a subgraph that has a particular node as its root.
+								The connector moves the branch from the original location and places it as child of the specified new location.
+								The connector also sets on the request the actual location (including the path and identification properties)
+								of the original and new locations.  The connector will adjust SNS indexes accordingly.
+								The connector sets a &PathNotFoundException; error on the request if the node that is to be moved or the
+								new location do not exist in the workspace.
+								The connector sets a &InvalidWorkspaceException; error on the request if the named workspace does not exist.
+							</entry>
+						</row>
+						<row>
+							<entry>DeleteBranchRequest</entry>
+							<entry>
+								A request to delete an entire branch specified by a single node's location.
+								The connector deletes the specified node and all nodes below it, and sets the actual location,
+								including the path and identification properties, of the node that was deleted.
+								The connector sets a &PathNotFoundException; error on the request if the node being deleted does not exist in the workspace.
+								The connector sets a &InvalidWorkspaceException; error on the request if the named workspace does not exist.
+							</entry>
+						</row>
+						<row>
+							<entry>CompositeRequest</entry>
+							<entry>
+								A request that actually comprises multiple requests (none of which will be a composite).
+								The connector simply processes all of the requests in the composite request, but should set on the composite
+								request any error (usually the first error) that occurs during processing of the contained requests.
+							</entry>
+						</row>
+					</tbody>
+				</tgroup>
+			</table>
+			<para>There are also requests that deal with workspaces:</para>
+			<table frame='all'>
+				<title>Types of Workspace Requests</title>
+				<tgroup cols='2' align='left' colsep='1' rowsep='1'>
+		      <colspec colname='c1' colwidth="1*"/>
+		      <colspec colname='c2' colwidth="1*"/>
+					<thead>
+						<row>
+				  		<entry>Name</entry>
+				  		<entry>Description</entry>
+						</row>
+					</thead>
+					<tbody>
+						<row>
+							<entry>GetWorkspacesRequest</entry>
+							<entry>
+								A request to obtain the names of the existing workspaces that are accessible to the caller.
+							</entry>
+						</row>
+						<row>
+							<entry>VerifyWorkspaceRequest</entry>
+							<entry>
+								A request to verify that a workspace with a particular name exists.
+								The connector returns the actual location for the root node if the workspace exists, as well as the actual name of the workspace
+								(e.g., the default workspace name if a null name is supplied).
+							</entry>
+						</row>
+						<row>
+							<entry>CreateWorkspaceRequest</entry>
+							<entry>
+								A request to create a workspace with a particular name.
+								The connector returns the actual location for the root node if the workspace exists, as well as the actual name of the workspace
+								(e.g., the default workspace name if a null name is supplied).
+								The connector sets a &InvalidWorkspaceException; error on the request if the named workspace already exists.
+							</entry>
+						</row>
+						<row>
+							<entry>DestroyWorkspaceRequest</entry>
+							<entry>
+								A request to destroy a workspace with a particular name.
+								The connector sets a &InvalidWorkspaceException; error on the request if the named workspace does not exist.
+							</entry>
+						</row>
+						<row>
+							<entry>CloneWorkspaceRequest</entry>
+							<entry>
+								A request to clone one named workspace as another new named workspace.
+								The connector sets a &InvalidWorkspaceException; error on the request if the original workspace does not exist, 
+								or if the new workspace already exists.
+							</entry>
+						</row>
+					</tbody>
+				</tgroup>
+			</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;.
+				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 DNA provides a &RequestProcessor; class that can simplify writing your own connector and at the
+				same time help insulate your connector from new kinds of requests that may be added in the future.  The &RequestProcessor;
+				is an abstract class that defines a <code>process(...)</code> method for each concrete &Request; subclass.
+				In other words, there is a <code>process(CompositeRequest)</code> method, a <code>process(ReadNodeRequest)</code> method,
+				and so on.  
+			</para>
+			<para>
+				To use this in your connector, simply create a subclass of &RequestProcessor;, overriding all of the abstract methods and optionally
+				overriding any of the other methods that have a default implementation.
+			</para>
+			<note>
+				<para>
+					The &RequestProcessor; abstract class contains default implementations for quite a few of the <code>process(...)</code> methods,
+					and these will be <emphasis>sufficient</emphasis>	but probably not efficient or optimum.  If you can provide a more efficient
+					implementation given your source, feel free to do so.  However, if performance is not a big issue, all of the concrete methods
+					will provide the correct behavior. Keep things simple to start out - you can always provide better implementations later.
+				</para>
+			</note>
+			<para>
+				Then, in your connector's <code>execute(&ExecutionContext;, &Request;)</code> method, instantiate your &RequestProcessor; subclass
+				and call its <code>process(&Request;) method, passing in the <code>execute(...)</code> method's &Request; parameter.</code>
+				The &RequestProcessor; will determine the appropriate method given the actual &Request; object and will then invoke that method:
+			</para>
+	    <programlisting>
+public void execute( final &ExecutionContext; context,
+                     final &Request; request ) throws RepositorySourceException {
+    RequestProcessor processor = new RequestProcessor(context);
+    try {
+        processor.process(request);
+    } finally {
+        processor.close();
+    }
+}</programlisting>
+			<para>
+				If you do this, the bulk of your connector implementation may be in the &RequestProcessor; implementation methods.
+				This not only is pretty maintainable, it also lends itself to easier testing.  And should any new request types be added
+				in the future, your connector may work just fine without any changes.  In fact, if the &RequestProcessor; class
+				can implement meaningful methods for those new request types, your connector may "just work".  Or, at least
+				your connector will still be binary compatible, even if your connector won't support any of the new features.
+			</para>
+			<para>
+				Finally, how should the connector handle exceptions?  As mentioned above, each &Request; object has a slot where the connector
+				can set any exception encountered during processing.  This not only handles the exception, but in the case of &CompositeRequest;s
+				it also correctly associates the problem with the request.  However, it is perfectly acceptable to throw an exception
+				if the connection becomes invalid (e.g., there is a communication failure) or if a fatal error would prevent subsequent
+				requests from being processed.
+			</para>
+		</sect2>
+	  <sect2 id="testing_custom_connectors">
+	    <title>Testing custom connectors</title>
+	    <para>
+				Testing connectors is not really that much different than testing other classes.  Using mocks may help to isolate your
+				instances so you can create more unit tests that don't require the underlying source system.
+			</para>
+	    <para>
+				However, there may be times when you have to use the underlying source system in your tests.  If this is the case,
+				we recommend using Maven integration tests, which run at a different point in the Maven lifecycle.  The benefit of
+				using integration tests is that by convention they're able to rely upon external systems.  Plus, your unit tests
+				don't become polluted with slow-running tests that break if the external system is not available.
+			</para>
+		</sect2>
+	  <sect2 id="deploying_custom_connectors">
+	    <title>Configuring and deploying custom connectors</title>
+	    <para>
+				After building your connector project, you need to configure the JBoss DNA components your application is using so
+				that they use your connector.  In a lot of cases, this will entail instantiating your connector's &RepositorySource; class,
+				setting the various properties, and registering it with a &RepositoryLibrary;.  Or, it will entail using a configuration
+				repository to use your source and letting &RepositoryService; instantiate and set up your &RepositorySource; instance.
+				Or, you can just instantiate and set it up manually, passing the instance to whatever component needs it.
+			</para>
+			<para>
+				And of course you have to make the JAR file containing your connector (as well as any dependency JARs) available to
+				your application's classpath.
+			</para>
+		</sect2>
+  </sect1>
+	<sect1 id="dna_graph_api">
+		<title>Graph API for using connectors</title>
+		<para>
+			So far we've talked about repositories, repository connectors, and how connectors respond to the different kinds of requests.
+			Normally you'd code to the JCR API and use our JCR implementation.  However, what does your code look like if you want 
+			to use the connectors directly, without using our JCR implementation?  After all, you may be a contributor to JBoss DNA,
+			or you may want to take advantage of our connectors without all the overhead of JCR.
+		</para>
+		<para>
+			One option, of course, is to explicitly create the different requests and pass them to the connector's <code>execute(...)</code> method.
+			While this is the most efficient approach (and one taken in some key DNA components), you probably want something that
+			is much less verbose and much easier to use.  This is where the DNA graph API comes in.
+		</para>
+		<para>
+			JBoss DNA's <emphasis>Graph API</emphasis> was designed as a lightweight public API for working with graph information,
+			and it insulates components from the underlying requests and interacting with connectors.  
+			The &Graph; class is the primary class in API, and each instance represents a single, independent
+			view of the graph of content from a single connector.  &Graph; instances return snapshots of state, and those snapshots
+			never change after they're retrieved.  To obtain a &Graph; instance, use the static <code>create(...)</code>
+			method, supplying the name of the source, a &RepositoryConnectionFactory; from which a &RepositoryConnection; can be obtained,
+			and the &ExecutionContext;.
+		</para>
+		<para>
+			The &Graph; class basically represents an <ulink url="http://www.martinfowler.com/bliki/DomainSpecificLanguage.html">internal domain specific language (DSL)</ulink>,
+			designed to be easy to use in an application.  
+			The Graph API makes extensive use of interfaces and method chaining, so that methods return a concise interface that has only those
+			methods that make sense at that point.  In fact, this should be really easy if your IDE has code completion.
+			Just remember that under the covers, a &Graph; is just building &Request; objects, submitting them to the connector,
+			and then exposing the results.
+		</para>
+		<sect2 id="dna_graph_api_workspaces">
+			<title>Using workspaces</title>
+		<para>
+			Let's look at some examples of how the Graph API works.  This first example shows how to obtain the names of the available workspaces:
+		</para>
+		<programlisting>
+&Set;&lt;&String;> workspaceNames = graph.getWorkspaces();
+</programlisting>
+		<para>Once you know the name of the workspace, you can specify that the graph should use it:
+		</para>
+		<programlisting>
+graph.useWorkspace("myWorkspace");
+</programlisting>
+		<para>
+			From this point forward, all requests will apply to the workspace named "myWorkspace".  At any time, you can use a different workspace,
+			which will affect all subsequent requests made using the graph.  Of course, creating a new workspace is just as easy:
+		</para>
+		<programlisting>
+graph.createWorkspace().named("newWorkspace");
+</programlisting>
+	  <para>This will attempt to create a workspace named "newWorkspace", which will fail if that workspace already exists.  You may
+		want to create a new workspace with a name that should be altered if the name you supply is already used.  The following code shows
+		how you can do this:
+		</para>
+		<programlisting>
+graph.createWorkspace().namedSomethingLike("newWorkspace");
+</programlisting>
+	  <para>If there is no existing workspace named "newWorkspace", a new one will be created with this name.  However, if "newWorkspace" already
+		exists, this call will create a workspace with a name that is some alteration of the supplied name.
+		</para>
+	  <para>
+		You can also clone workspaces, too:
+		</para>
+		<programlisting>
+graph.createWorkspace().clonedFrom("original").named("something");
+</programlisting>
+		<para>
+			or
+		</para>
+		<programlisting>
+graph.createWorkspace().clonedFrom("original").namedSomethingLike("something");
+</programlisting>
+		<para>
+			As you can see, it's very easy to specify which workspace you want to use or to create new workspaces.  You can also find out which workspace
+			the graph is currently using:
+		</para>
+		<programlisting>
+&String; current = graph.getCurrentWorkspaceName();
+</programlisting>
+		<para>or, if you want, you can get more information about the workspace:
+		</para>
+		<programlisting>
+&Workspace; current = graph.getCurrentWorkspace();
+&String; name = current.getName();
+&Location; rootLocation = current.getRoot();
+</programlisting>
+    </sect2>
+		<sect2 id="dna_graph_api_nodes">
+			<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;:
+		</para>
+		<programlisting>
+&Path; path = ...
+Map&lt;&Name;,&Property;> propertiesByName = graph.getPropertiesByName().on(path);
+</programlisting>
+		<para>
+			This next example shows how the graph can be used to obtain and loop over the properties of a node:
+		</para>
+		<programlisting>
+&Path; path = ...
+for ( &Property; property : graph.getProperties().on(path) ) {
+	  ...
+}
+</programlisting>
+		<para>
+			Likewise, the next example shows how the graph can be used to obtain and loop over the children of a node:
+		</para>
+		<programlisting>
+&Path; path = ...
+for ( &Location; child : graph.getChildren().of(path) ) {
+    &Path; childPath = child.getPath();
+	  ...
+}
+</programlisting>
+		<para>
+			Notice that the examples pass a &Path; instance to the <code>on(...)</code> and <code>of(...)</code> methods.  Many
+			of the Graph API methods take a variety of parameter types, including String, &Path;s, &Location;s, &UUID;, or &Property; parameters.
+			This should make it easy to use in many different situations.
+		</para>
+		<para>
+			Of course, changing content is more interesting and offers more interesting possibilities.  Here are a few examples:
+		</para>
+		<programlisting>
+&Path; path = ...
+&Location; location = ...
+&Property; idProp1 = ...
+&Property; idProp2 = ...
+&UUID; uuid = ...
+graph.move(path).into(idProp1, idProp2);
+graph.copy(path).into(location);
+graph.delete(uuid);
+graph.delete(idProp1,idProp2);
+</programlisting>
+		<para>
+			The methods shown above work immediately, as soon as each request is built.  However, there is another way to use
+			the &Graph; object, and that is in a <emphasis>batch</emphasis> mode.  Simply create a &GraphBatch; object using the
+			<code>batch()</code> method, create the requests on that batch object, and then execute all of the commands on the
+			batch by calling its <code>execute()</code> method.  That <code>execute()</code> method returns a &Results; interface
+			that can be used to read the node information retrieved by the batched requests. 
+		</para>
+		<para>
+			Method chaining works really well with the batch mode, since multiple commands can be assembled together very easily:
+		</para>
+		<programlisting>
+&Path; path = ...
+String path2 = ...
+&Location; location = ...
+&Property; idProp1 = ...
+&Property; idProp2 = ...
+&UUID; uuid = ...
+graph.batch().move(path).into(idProp1, idProp2).and().copy(path2).into(location).and().delete(uuid).execute();
+&Results; results = graph.batch().read(path2).
+                    and().readChildren().of(idProp1,idProp2).
+                    and().readSugraphOfDepth(3).at(uuid2).
+                    execute();
+for ( &Location; child : results.getNode(path2) ) {
+    ...
+}
+</programlisting>
+		<para>
+			Of course, this section provided just a hint of the Graph API.  
+			The &Graph; interface is actually quite complete and offers a full-featured approach for reading and updating a graph.
+			For more information, see the &Graph; JavaDocs.
+		</para>
+	</sect2>
+	</sect1>
+	<sect1>
+		<title>Summary</title>
+		<para>
+			In this chapter, we covered all the aspects of JBoss DNA repositories, including the connector framework,
+			how DNA's JCR implementation works with connectors, what connectors are available (and how to use them),
+			and how to write your own connector.  So now that you know how to set up and use JBoss DNA repositories,
+			the <link linkend="jcr">next chapter</link> describes how you can leverage JBoss DNA's JCR implementation.
+		</para>
+	</sect1>
+</chapter>


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

Deleted: trunk/docs/reference/src/main/docbook/en-US/content/core/repositories.xml
===================================================================
--- trunk/docs/reference/src/main/docbook/en-US/content/core/repositories.xml	2009-06-08 15:21:29 UTC (rev 996)
+++ trunk/docs/reference/src/main/docbook/en-US/content/core/repositories.xml	2009-06-08 15:47:40 UTC (rev 997)
@@ -1,1468 +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
-  -->
-<!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="repositories">
-  <title>Repositories</title>
-  <para></para>
-  <para>There is a lot of information stored in many of different places: databases, repositories, SCM systems,
-    registries, file systems, services, etc. The purpose of the federation engine is to allow applications to use the JCR API
-    to access that information as if it were all stored in a single JCR repository, but to really leave the information where
-    it is.</para>
-  <para>Why not just copy or move the information into a JCR repository?  Moving it is probably pretty difficult, since most 
-		likely there are existing applications that rely upon that information being where it is.  All of those applications
-		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.
-		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
-    those changes down to the original source, making those changes visible to all the other applications.
-	</para>
-	<para>
-		In short, all clients see the correct information, even when it changes in the underlying systems. But the JCR clients can get to all of the information
-		in one spot, using one powerful standard API.
-	</para>
-  <sect1 id="connectors">
-    <title>Repository connectors</title>
-		<para>
-			With JBoss DNA, your applications use the <ulink url="&JSR170;">JCR API</ulink> to work with the repository,
-			but the DNA repository transparently fetches the information from different kinds of repositories and storage systems,
-			not just a single purpose-built store.  This is fundamentally what makes JBoss DNA different.
-		</para>
-		<para>How does JBoss DNA do this?  At the heart of JBoss DNA and it's JCR implementation is a simple graph-based 
-			<emphasis>repository connector</emphasis> system.  Essentially, JBoss DNA's JCR implementation uses a single 
-			repository connector to access all content:
-			<figure id="dnajcr-and-connector">
-				<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 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>
-			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
-			<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">
-				<title>Future JBoss DNA connectors</title>
-				<graphic align="center" scale="100" fileref="dna-connectors-future.png"/>
-			</figure>
-		</para>
-		<para>
-		</para>
-		<para>
-	  	It's even possible to put a different API layer on top of the connectors.  For example, the new <ulink url="&JSR203;">New I/O (JSR-203)</ulink>
-			API offers the opportunity to build new file system providers.  This would be very straightforward to put on top of a JCR implementation,
-			but it could be made even simpler by putting it on top of a DNA connector.  In both cases, it'd be a trivial mapping from nodes that represent
-			files and folders into JSR-203 files and directories, and events on those nodes could easily be translated into JSR-203 watch events.
-			Then, simply choose a DNA connector and configure it to use the source you want to use.
-			<figure id="dna-connectors-vfs">
-				<title>Virtual File System with JBoss DNA</title>
-				<graphic align="center" scale="100" fileref="vfs-and-connector.png"/>
-			</figure>
-		</para>
-    <para>Before we go further, let's define some terminology regarding connectors.</para>
- 		<itemizedlist>
-			<listitem>
-				<para>
-					A <emphasis role="strong">connector</emphasis> is the runnable code packaged in one or more JAR files that
-					contains implementations of several interfaces (described below).  A Java developer <emphasis>writes</emphasis>
-					a connector to a type of source, such as a particular database management system, LDAP directory, source code
-					management system, etc.  It is then packaged into one or more JAR files (including dependent JARs) and deployed
-					for use in applications that use JBoss DNA repositories.
-				</para>
-			</listitem>
-			<listitem>
-				<para>
-					The description of a particular source system (e.g., the "Customer" database, or the company LDAP system) 
-					is called a <emphasis role="strong">repository source</emphasis>.  JBoss DNA defines a &RepositorySource; interface
-					that defines methods describing the behavior and supported features and a method for establishing connections.
-					A connector will have a class that implements this interface and that has JavaBean properties for
-					all of the connector-specific properties required to fully describe an instance of the system.  Use of JavaBean
-					properties is not required, but it is highly recommended, as it enables reflective configuration and administration.
-					Applications that use JBoss DNA create an instance of the connector's &RepositorySource; implementation and set 
-					the properties for the external source that the application wants to access with that connector.
-				</para>
-			</listitem>
-			<listitem>
-				<para>
-					A repository source instance is then used to establish <emphasis role="strong">connections</emphasis> to
-					that source.  A connector provides an implementation of the &RepositoryConnection; interface, which
-					defines methods for interacting with the external system.  In particular, the <code>execute(...)</code> method
-					takes an &ExecutionContext; instance and a &Request; object.  The &ExectuionContext; object defines the
-					environment in which the processing is occurring, including information about the JAAS &Subject; and &LoginContext;.
-					The &Request; object describes the requested operations on the content, with different concrete subclasses
-					representing each type of activity.  Examples of commands include (but not limited to) getting a node, moving a node, creating a node, 
-					changing a node, and deleting a node.  And, if the repository source is able to participate in JTA/JTS distributed transactions, then the
-					&RepositoryConnection; must implement the <code>getXaResource()</code> method by returning 
-					a valid <code>javax.transaction.xa.XAResource</code> object that can be used by the transaction monitor.
-				</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
-			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;,
-			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.)
-		</para>
-		<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,
-			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
-			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.
-		</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> 
-			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>
-		<para>
-			So, we've so far learned what a repository connector is and how they're used to establish connections to the underlying sources 
-			and access the content in those sources.  In the <link linkend="repository-service">next section</link>, we'll show how these 
-			source instances can be configured, managed, and their connections pooled.  After that, we'll look review JBoss DNA's 
-			<link linkend="connector-library">existing connectors</link> and show how to <link linkend="custom-connectors">create your own connectors</link>.
-		</para>
-  </sect1>
-  <sect1 id="repository-workspaces">
-    <title>Workspaces</title>
-		<para>The previous section talked about how connector expose their information through the graph language of JBoss DNA.
-			This is true, except that we didn't dive into too much of the detail.  JBoss DNA graphs have the notion of <emphasis>workspaces</emphasis>
-			in which the content appears, and its very easy for clients using the graph to switch between workspaces.  In fact,
-			workspaces differ from each other in that they provide different views of the same information.
-		</para>
-		<para>Consider a source control system, like SVN or CVS.  These systems provide different views of the source code:
-			a mainline development branch as well as other branches (or tags) commonly used for releases.  So, just like one source
-			file might appear in the mainline branch as well as the previous two release branches, a node in a repository source
-			might appear in multiple workspaces.
-		</para>
-		<para>
-			However, each connector can kind of decide how (or whether) it uses workspaces.  For example, there may be no overlap
-			in the content between workspaces.  Or a connector might only expose a single workspace (in other words, there's only one
-			"default" workspace).
-		</para>
-  </sect1>
-  <sect1 id="repository-service">
-    <title>Repository Service</title>
-		<para>The JBoss DNA &RepositoryService; is the component that manages the <emphasis>repository sources</emphasis>
-		  and the connections to them.  &RepositorySource; instances can be programmatically added to the service, but
-			the service can actually read its configuration from a configuration repository (which, by the way, is represented by a
-			just another &RepositorySource; instance that's usually added programmatically to the service).  The service connects to
-			the configuration repository, reads the content in a particular area, and automatically sets up the &RepositorySource; instances
-		  per the information found in the configuration repository.  
-		</para>
-		<para>
-			The &RepositoryService; also transparently maintains for each source a pool of reusable connections.  The pooling properties
-			can be controlled via the configuration repository, or adjusted programmatically.
-		</para>
-    <para>
-			Using a repository, then, involves simply asking the &RepositoryService; for a &RepositoryConnection;
-			to the repository given the repository's name.  If a source exists with that name, the service checks out a connection from
-			the source's pool.  The resulting connection is actually a wrapper around the underlying pooled connection, so the
-			component that requested the connection can simply close it, and under the covers the actual connection is simply returned
-			to the pool.
-    </para>
-		<para>To instantiate the &RepositoryService;, we need to first have a few other objects:
-			<itemizedlist>
-				<listitem>
-					<para>
-						A &ExecutionContext; instance, as discussed <link linkend="execution-context">earlier</link>.
-					</para>
-				</listitem>
-				<listitem>
-					<para>
-						A &RepositoryLibrary; instance that manages the list of &RepositorySource; instances,
-						properly injects the execution contexts into each repository source, and provides a configurable pool of connections
-						for each source.
-					</para>
-				</listitem>
-				<listitem>
-					<para>
-						A <emphasis>configuration repository</emphasis> that contains descriptions of all of the repository sources
-					  as well as any information those sources need.  Because this is a regular repository, this could be a simple 
-					  repository with content loaded from an XML file, or it could be a shared
-					  central repository with information about all of the JBoss DNA repositories used across your organization.
-					</para>
-				</listitem>
-			</itemizedlist>
-			With these components in place, we can then instantiate the &RepositoryService; and start it (using its
-			&ServiceAdministrator;).  During startup, the service reads the configuration repository and loads any
-			defined &RepositorySource; instances into the repository library, using the class loader factory 
-			(available in the &ExecutionContext;) to obtain.
-    </para>
-		<para>
-			Here's sample code that shows how to set up and start the repository service.  You can see something similar
-			in the example application in the <code>startRepositories()</code> method of the 
-			<code>org.jboss.example.dna.repository.RepositoryClient</code> class.
-		</para>
-    <programlisting>
- // Create the top-level execution context with all standard components ...
- &ExecutionContext; context = new ExecutionContext();
-
- // Create the library for the RepositorySource instances ...
- &RepositoryLibrary; sources = new &RepositoryLibrary;(context);
-
- // Load into the source manager the repository source for the configuration repository ...
- &InMemoryRepositorySource; configSource = new &InMemoryRepositorySource;();
- configSource.setName("Configuration");
- sources.addSource(configSource);
-
- // Now instantiate the Repository Service ...
- &RepositoryService; service = new &RepositoryService;(sources, configSource.getName(), context);
- service.getAdministrator().start();
- </programlisting>
-
-		<para>After startup completes, the repositories are ready to be used.  The client application obtains the list of repositories
-			and presents them to the user.  When the user selects one, the client application starts navigating that repository
-			starting at its root node (e.g., the "/" path).  As you type a command to list the contents of the current node or to
-			"change directories" to a different node, the client application obtains the information for the node using a simple
-			procedure:
-			<orderedlist>
-				<listitem>
-					<para>Get a connection to the repository.</para>
-				</listitem>
-				<listitem>
-					<para>Using the connection, find the current node and read its properties and children, putting the information
-						into a simple Java plain old Java object (POJO).</para>
-				</listitem>
-				<listitem>
-					<para>Close the connection to the repository (in a finally block to ensure it always happens).</para>
-				</listitem>
-			</orderedlist>
-		</para>
-  </sect1>
-  <sect1 id="connector-library">
-    <title>Out-of-the-box repository connectors</title>
-    <para>
-    	A number of repository connectors are already available in JBoss DNA, and are outlined in the following sections.
-			Note that we do want to build <ulink url="https://jira.jboss.org/jira/secure/IssueNavigator.jspa?reset=true&amp;mode=hide&amp;pid=12310520&amp;sorter/order=DESC&amp;sorter/field=priority&amp;resolution=-1&amp;component=12311441">more connectors</ulink>
-			in the upcoming releases.
-    </para>
-    <sect2 id="dna-connector-inmemory">
-      <title>In-memory connector</title>
-      <para>
-      	The in-memory repository connector is a simple connector that creates a transient, in-memory repository.
-				This repository is used as a very simple in-memory cache or as a standalone transient repository.
-      </para>
-			<para>
-				The &InMemoryRepositorySource; class provides a number of JavaBean properties that control its behavior:
-			</para>
-			<table frame='all'>
-				<title>&InMemoryRepositorySource; 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>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>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>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>
-						</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>
-						</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>
-    </sect2>
-    <sect2 id="dna-connector-jbosscache">
-      <title>JBoss Cache connector</title>
-      <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="dna-connector-federation">federated</link>
-				repository.
-      </para>
-			<para>
-				The &JBossCacheSource; class provides a number of JavaBean properties that control its behavior:
-			</para>
-			<table frame='all'>
-				<title>&JBossCacheSource; 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>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>cacheFactoryJndiName</entry>
-							<entry>Optional property that, if used, specifies the name in JNDI where an existing JBoss Cache Factory instance can be found.
-								That factory would then be used if needed to create a JBoss Cache instance.  If no value is provided, then the
-								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
-								a special way.</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>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>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>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 defines the names of the workspaces that exist and that are available for use without having to create them.</entry>
-						</row>
-						<row>
-							<entry>creatingWorkspacesAllowed</entry>
-							<entry>Optional property that is by default 'true' that defines whether clients can create new workspaces.</entry>
-						</row>
-					</tbody>
-				</tgroup>
-			</table>
-    </sect2>
-    <sect2 id="dna-connector-federation">
-      <title>Federating connector</title>
-      <para>
-      	The federated repository source provides a unified repository consisting of information that is dynamically federated from multiple other
-				&RepositorySource; instances.  This is a very powerful repository source that appears to be a single repository, when in 
-				fact the content is stored and managed in multiple other systems.  Each &FederatedRepositorySource; is typically configured
-				with the name of another &RepositorySource; that should be used as the local, unified cache of the federated content.
-				The configuration also contains the names of the other &RepositorySource; instances that are to be federated along with
-				the &Projection; definition describing where in the unified repository the content is to appear.
-      </para>
-			<figure id="dna-connector-federation-image">
-				<title>Federating multiple sources using the Federated Repository Connector</title>
-				<graphic align="center" scale="100" fileref="dna-connector-federation.png"/>
-			</figure>
-      <para> The federation connector works by effectively building up a single graph by querying each source and merging or
-        unifying the responses. This information is cached, which improves performance, reduces the number of (potentially
-        expensive) remote calls, reduces the load on the sources, and helps mitigate problems with source availability. As
-        clients interact with the repository, this cache is consulted first. When the requested portion of the graph (or
-        "subgraph") is contained completely in the cache, it is retuned immediately. However, if any part of the requested
-        subgraph is not in the cache, each source is consulted for their contributions to that subgraph, and any results are
-        cached.</para>
-      <para> This basic flow makes it possible for the federated repository to build up a local cache of the integrated graph
-        (or at least the portions that are used by clients). In fact, the federated repository caches information in a manner
-        that is similar to that of the Domain Name System (DNS). As sources are consulted for their contributions, the source
-        also specifies whether it is the authoritative source for this information (some sources that are themselves federated
-        may not be the information's authority), whether the information may be modified, the time-to-live (TTL) value (the time
-        after which the cached information should be refreshed), and the expiration time (the time after which the cached
-        information is no longer valid). In effect, the source has complete control over how the information it contributes is
-        cached and used.</para>
-      <para>
-        The federated repository also needs to incorporate <emphasis>negative caching</emphasis>, which is storage of the knowledge 
-				that something does <emphasis>not</emphasis> exist. Sources can be configured to contribute information
-        only below certain paths (e.g., <code>/A/B/C</code>), and the federation engine can take advantage of this by never 
-				consulting that source for contributions to information on other paths. However, below that path, any negative responses 
-				must also be cached (with appropriate TTL and expiry parameters) to prevent the exclusion of that source (in case the source 
-				has information to contribute at a later time) or the frequent checking with the source.
-      </para>
-			<para>
-				The federated repository uses other &RepositorySource;s that are to be federated and a &RepositorySource; that is to be used as the
-				cache of the unified contents.  These are configured in another &RepositorySource; that is treated as a configuration repository.
-				The &FederatedRepositorySource; class uses JavaBean properties to define the name of the configuration repository and 
-				the path to the "<code>dna:federation</code>" node in that configuration repository containing the information about the 
-				cache and federated sources.  This graph structure that is expected at this location is as follows:
-			</para>
-			<programlisting><![CDATA[<!-- Define the federation configuration. -->
-<dna:federatedRepository xmlns:dna="http://www.jboss.org/dna" 
-	                   xmlns:jcr="http://www.jcp.org/jcr/1.0"
-                     dna:timeToCache="100000" >
-  <dna:workspaces>
-    <dna:workspace jcr:name="default">
-	    <!-- Define how the content in the 'Cache' source is to map to the federated cache -->
-      <dna:cache dna:sourceName="Cache" dna:workspaceName="default" dna:projectionRules="/a => /" />
-
-      <!-- Define how the content in the two sources maps to the federated/unified repository.
-           This example puts the 'Cars' and 'Aircraft' content underneath '/vehicles', but the
-           'Configuration' content (which is defined by this file) will appear under '/'. -->
-      <dna:projections>
-        <dna:projection jcr:name="Cars" dna:projectionRules="/Vehicles => /" />
-        <dna:projection jcr:name="Aircraft" dna:projectionRules="/Vehicles => /" />
-        <dna:projection jcr:name="Configuration" dna:projectionRules="/ => /" />
-      </dna:projections>
-    </dna:workspace>
-	</dna:workspaces>
-</dna:federatedRepository>
-]]></programlisting>
-			<note>
-				<para>
-					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
-					works.
-				</para>
-			</note>
-			<para>
-				Notice that there is a cache projection and three source projections, and each projection defines
-				one or more <emphasis>projection rules</emphasis> that are of the form:
-			</para>
-			<programlisting>pathInFederatedRepository =&gt; pathInSourceRepository</programlisting>
-			<para>
-				So, a projection rule <code>/Vehicles =&gt; /</code> projects the entire contents of the source so that
-				it appears in the federated repository under the "<code>/Vehicles</code>" node.
-			</para>
-			<para>
-				The &FederatedRepositorySource; class provides a number of JavaBean properties that control its behavior:
-			</para>
-			<table frame='all'>
-				<title>&FederatedRepositorySource; 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>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>repositoryName</entry>
-							<entry>The name for the federated repository.</entry>
-						</row>
-						<row>
-							<entry>configurationSourceName</entry>
-							<entry>The name of the &RepositorySource; that should be used as the configuration repository, and in which is defined
-								how this federated repository is to be set up and configured.
-								This name is supplied to the &RepositoryConnectionFactory; that is provided to this instance when added to the
-								&RepositoryLibrary;.</entry>
-						</row>
-						<row>
-							<entry>configurationWorkspaceName</entry>
-							<entry>The name of the workspace in the configuration &RepositorySource; with the content defining
-								how this federated repository is to be set up and configured.</entry>
-						</row>
-						<row>
-							<entry>configurationSourcePath</entry>
-							<entry>The path to the node in the configuration repository below which a "dna:federation" node exists with the 
-								graph structure describing how this federated repository is to be configured.</entry>
-						</row>
-						<row>
-							<entry>securityDomain</entry>
-							<entry>Optional property that, if used, specifies the name of the JAAS application context that should be used
-								to establish the <link linkend="execution-contenxt">execution context</link> for this repository.
-								This should correspond to the JAAS login configuration located within the JAAS login configuration file, 
-								and should be used only if a "<code>username</code>" property is defined.</entry>
-						</row>
-						<row>
-							<entry>username</entry>
-							<entry>Optional property that, if used, defines the name of the JAAS subject that should be used
-								to establish the <link linkend="execution-contenxt">execution context</link> for this repository.
-								This should be used if a "<code>securityDomain</code>" property is defined.</entry>
-						</row>
-						<row>
-							<entry>password</entry>
-							<entry>Optional property that, if used, defines the password of the JAAS subject that should be used
-								to establish the <link linkend="execution-contenxt">execution context</link> for this repository.
-								If the password is not provided but values for the "<code>securityDomain</code>" and "<code>username</code>" properties are,
-								then authentication will use the default JAAS callback handlers.</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>
-						</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>
-					</tbody>
-				</tgroup>
-			</table>
-    </sect2>
-  </sect1>
-  <sect1 id="custom-connectors">
-    <title>Writing custom connectors</title>
-    <para>
-		  There may come a time when you want to tackle creating your own repository connector.  Maybe the connectors we provide out-of-the-box
-			don't work with your source.  Maybe you want to use a different cache system.  
-			Maybe you have a system that you want to make available through a JBoss DNA repository.  Or, maybe you're
-			a contributor and want to help us round out our library with a new connector.  No matter what the reason, creating a new connector
-			is pretty straightforward, as we'll see in this section.
-    </para>
-	  <para>
-		  Creating a custom connector involves the following steps:
-		  <orderedlist>
-		    <listitem>
-		      <para>Create a Maven 2 project for your connector;</para>
-		    </listitem>
-		    <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 
-						<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.
-					</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
-						in different environments, and try to make the failure messages clear when the tests can't connect to the underlying source.)
-					</para>
-		    </listitem>
-		    <listitem>
-		      <para>
-						Configure JBoss DNA to use your connector.  This may involve just registering the source with the &RepositoryService;,
-			   		or it may involve adding a source to a configuration repository used by the <link linkend="dna-connector-federation">federated repository</link>.
-					</para>
-		    </listitem>
-		    <listitem>
-		      <para>
-						Deploy the JAR file with your connector (as well as any dependencies), and make them available to JBoss DNA
-		      	in your application.
-					</para>
-		    </listitem>
-		  </orderedlist>
-		  Let's go through each one of these steps in more detail.
-	  </para>
-	  <sect2 id="custom_connector_project">
-	    <title>Creating the Maven 2 project</title>
-	    <para>
-				The first step is to create the Maven 2 project that you can use to compile your code and build the JARs.
-	    	Maven 2 automates a lot of the work, and since you're already <link linkend="maven">set up to use Maven</link>,
-	    	using Maven for your project will save you a lot of time and effort.  Of course, you don't have to use Maven 2, but then you'll
-	    	have to get the required libraries and manage the compiling and building process yourself.</para>
-	    <note>
-	      <para>JBoss DNA may provide in the future a Maven archetype for creating connector projects.  If you'd find this useful
-	        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.
-		    	See the subversion repository: <ulink url="&Subversion;trunk/extensions/dna-connector-filesystem/">&Subversion;trunk/extensions/dna-connector-filesystem/</ulink>
-		    </para>
-		  </note>
-	    <para>
-				You can create your Maven project any way you'd like.  For examples, see the 
-				<ulink url="http://maven.apache.org/guides/getting-started/index.html#How_do_I_make_my_first_Maven_project">Maven 2 documentation</ulink>.  
-	    	Once you've done that, just add the dependencies in your project's <code>pom.xml</code> dependencies section:
-			</para>
-	  	<programlisting role="XML"><![CDATA[
-<dependency>
-  <groupId>org.jboss.dna</groupId>
-  <artifactId>dna-graph</artifactId>
-  <version>0.4</version>
-</dependency>
-	 ]]></programlisting>
-			<para>
-				This is the only dependency required for compiling a connector - Maven pulls in all of the dependencies needed by 
-				the 'dna-graph' artifact.  Of course, you'll still have to add dependencies for any library your connector needs
-				to talk to its underlying system.
-			</para>
-	  	<para>
-				As for testing, you probably will want to add more dependencies, such as those listed here:
-			</para>
-			<programlisting role="XML"><![CDATA[
-<dependency>
-  <groupId>org.jboss.dna</groupId>
-  <artifactId>dna-graph</artifactId>
-  <version>0.4</version>
-  <type>test-jar</type>
-  <scope>test</scope>
-</dependency>
-<dependency>
-  <groupId>org.jboss.dna</groupId>
-  <artifactId>dna-common</artifactId>
-  <version>0.4</version>
-  <type>test-jar</type>
-  <scope>test</scope>
-</dependency>
-<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>
-<!-- Logging with Log4J -->
-<dependency>
-  <groupId>org.slf4j</groupId>
-  <artifactId>slf4j-log4j12</artifactId>
-  <version>1.4.3</version>
-  <scope>test</scope>
-</dependency>
-<dependency>
-  <groupId>log4j</groupId>
-  <artifactId>log4j</artifactId>
-  <version>1.2.14</version>
-  <scope>test</scope>
-</dependency>
-	 ]]></programlisting>
-	  	<para>
-				Testing JBoss DNA connectors does not require a JCR repository or the JBoss DNA services.  (For more detail,
-	  		see the <link linkend="testing_custom_connectors">testing section</link>.) However, if you want to do
-	  		integration testing with a JCR repository and the JBoss DNA services, you'll need additional dependencies
-				(e.g., <code>dna-repository</code> and any other extensions).
-			</para>
-	    <para>
-				At this point, your project should be set up correctly, and you're ready to move on to 
-	  		<link linkend="implementing_repository_source">writing the Java implementation</link> for your connector.
-			</para>
-	  </sect2>
-	  <sect2 id="implementing_repository_source">
-	    <title>Implementing a <code>RepositorySource</code></title>
-	    <para>
-				As mentioned earlier, a <emphasis>connector</emphasis> consists of the Java code that is used to access content
-				from a system.  Perhaps the most important class that makes up a connector is the implementation of the
-				&RepositorySource;.  This class is analogous to JDBC's DataSource in that it is instantiated to represent
-				a single instance of a system that will be accessed, and it contains enough information (in the form of JavaBean properties)
-				so that it can create connections to the source.
-			</para>
-			<para>
-				Why is the &RepositorySource; implementation a JavaBean?  Well, this is the class that is instantiated, usually
-				reflectively, and so a no-arg constructor is required.  Using JavaBean properties makes it possible
-				to reflect upon the object's class to determine the properties that can be set (using setters) and read
-				(using getters).  This means that an administrative application can instantiate, configure, and manage
-				the objects that represent the actual sources, without having to know anything about the actual implementation.
-			</para>
-			<para>
-				So, your connector will need a public class that implements &RepositorySource; and provides JavaBean properties
-				for any kind of inputs or options required to establish a connection to and interact with the underlying source.
-				Most of the semantics of the class are defined by the &RepositorySource; and inherited interface.
-				However, there are a few characteristics that are worth mentioning here.
-			</para>
-			<sect3 id="connector_cache_policy">
-				<title>Cache policy</title>
-				<para>
-					Each connector is responsible for determining whether and how long DNA is to cache the
-					content made available by the connector.  This is referred to as the <emphasis>caching policy</emphasis>,
-					and consists of a <emphasis>time to live</emphasis> value representing the number of milliseconds that
-					a piece of data may be cached.  After the TTL has passed, the information is no longer used.
-				</para>
-				<para>
-					DNA allows a connector to use a flexible and powerful caching policy.  First, each connection returns the
-					<emphasis>default</emphasis> caching policy for all information returned by that connection.
-					Often this policy can be configured via properties on the &RepositorySource; implementation.
-					This is optional, meaning the connector can return <code>null</code> if it does not wish to
-					have a default caching policy.
-				</para>
-				<para>
-					Second, the connector is able to override its default caching policy on individual requests
-					(which we'll cover in the <link linkend="implementing_repository_connection">next section</link>).
-					Again, this is optional, meaning that a null caching policy on a request implies that the
-					request has no overridden caching policy.
-				</para>
-				<para>
-					Third, if the connector has no default caching policy and none is set on the individual requests,
-					DNA uses whatever caching policy is set up for that component using the connector.  For example, the federating
-					connector allows a default caching policy to be specified, and this policy is used should the sources
-					being federated not define their own caching policy.
-				</para>
-				<para>
-					In summary, a connector has total control over whether and for how long the information it provides
-					is cached.
-				</para>
-			</sect3>
-			<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.
-					One example of this is the JBoss Cache connector: while the connector can
-					instantiate a new JBoss Cache instance, more interesting use cases involve JBoss Cache instances that are
-					set up for clustering and replication, something that is generally difficult to configure in a single JavaBean.
-					Therefore the &JBossCacheSource; has optional JavaBean properties that define how it is to look up a
-					JBoss Cache instance in JNDI.  
-				</para>
-				<para>
-					This is a simple pattern that you may find useful in your connector.  Basically, if your source implementation
-					can look up an object in JNDI, simply use a single JavaBean String property that defines the 
-					full name that should be used to locate that object in JNDI.  Usually it's best to include "Jndi" in the
-					JavaBean property name so that administrative users understand the purpose of the property.
-					(And some may suggest that any optional property also use the word "optional" in the property name.)
-				</para>
-			</sect3>
-			<sect3 id="repository_source_capabilities">
-				<title>Capabilities</title>
-				<para>
-					Another characteristic of a &RepositorySource; implementation is that it provides some hint as to whether
-					it supports several features.  This is defined on the interface as a method that returns a
-					&RepositorySourceCapabilities; object.  This class currently provides methods that say whether the connector supports
-					updates, whether it supports same-name-siblings (SNS), and whether the connector supports listeners and events.
-				</para>
-				<para>
-					Note that these may be hard-coded values, or the connector's response may be determined at runtime by various factors.
-					For example, a connector may interrogate the underlying system to decide whether it can support updates.
-				</para>
-				<para>
-					The &RepositorySourceCapabilities; can be used as is (the class is immutable), or it can be subclassed
-					to provide more complex behavior.  It is important, however, that the capabilities remain constant
-					throughout the lifetime of the &RepositorySource; instance.
-				</para>
-				<note>
-					<para>
-						Why a concrete class and not an interface?  By using a concrete class, connectors inherit the default
-						behavior.  If additional capabilities need to be added to the class in future releases, connectors may
-						not have to override the defaults.  This provides some insulation against future enhancements to the connector framework.
-					</para>
-				</note>
-			</sect3>
-			<sect3 id="repository_source_security">
-				<title>Security and authentication</title>
-				<para>
-					As we'll see in the next section, the main method connectors have to process requests takes an &ExecutionContext;,
-					which contains the JAAS security information of the subject performing the request.  This means that the connector
-					can use this to determine authentication and authorization information for each request.
-				</para>
-				<para>
-					Sometimes that is not sufficient.  For example, it may be that the connector needs its own authorization information
-					so that it can establish a connection (even if user-level privileges still use the &ExecutionContext; provided with
-					each request).  In this case, the &RepositorySource; implementation will probably need JavaBean properties
-					that represent the connector's authentication information.  This may take the form of a username and password,
-					or it may be properties that are used to delegate authentication to JAAS.  
-					Either way, just realize that it's perfectly acceptable for the connector to require its own security properties.
-				</para>
-			</sect3>
-		</sect2>
-	  <sect2 id="implementing_repository_connection">
-	    <title>Implementing a <code>RepositoryConnection</code></title>
-	    <para>
-				One job of the &RepositorySource; implementation is to create connections to the underlying sources.
-				Connections are represented by classes that implement the &RepositoryConnection; interface, and creating this
-				class is the next step in writing a repository connector.  This is what we'll cover in this section.
-			</para>
-	    <para>
-				The &RepositoryConnection; interface is pretty straightforward:
-			</para>
-	    <programlisting>
-/**
- * A connection to a repository source.
- * <p>
- * These connections need not support concurrent operations by multiple threads.
- * </p>
- */
- at NotThreadSafe
-public interface &RepositoryConnection; {
-
-    /**
-     * Get the name for this repository source. This value should be the same as that returned
-     * by the same &RepositorySource; that created this connection.
-     * 
-     * @return the identifier; never null or empty
-     */
-    String getSourceName();
-
-    /**
-     * Return the transactional resource associated with this connection. The transaction manager 
-     * will use this resource to manage the participation of this connection in a distributed transaction.
-     * 
-     * @return the XA resource, or null if this connection is not aware of distributed transactions
-     */
-    XAResource getXAResource();
-
-    /**
-     * Ping the underlying system to determine if the connection is still valid and alive.
-     * 
-     * @param time the length of time to wait before timing out
-     * @param unit the time unit to use; may not be null
-     * @return true if this connection is still valid and can still be used, or false otherwise
-     * @throws InterruptedException if the thread has been interrupted during the operation
-     */
-    boolean ping( long time, &TimeUnit; unit ) throws InterruptedException;
-
-    /**
-     * Set the listener that is to receive notifications to changes to content within this source.
-     * 
-     * @param listener the new listener, or null if no component is interested in the change notifications
-     */
-    void setListener( &RepositorySourceListener; listener );
-
-    /**
-     * Get the default cache policy for this repository. If none is provided, a global cache policy
-     * will be used.
-     * 
-     * @return the default cache policy
-     */
-    &CachePolicy; getDefaultCachePolicy();
-
-    /**
-     * Execute the supplied commands against this repository source.
-     * 
-     * @param context the environment in which the commands are being executed; never null
-     * @param request the request to be executed; never null
-     * @throws RepositorySourceException if there is a problem loading the node data
-     */
-    void execute( &ExecutionContext; context,
-                  &Request; request ) throws &RepositorySourceException;;
-
-    /**
-     * Close this connection to signal that it is no longer needed and that any accumulated 
-     * resources are to be released.
-     */
-    void close();
-}</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
-				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>
-				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
-				as well as the subject performing the request.  This was discussed <link linkend="execution-context">earlier</link>.
-			</para>
-	    <para>
-				The second parameter, however, represents a request that is to be processed by the connector.  Request objects can
-				take many different forms, as there are different classes for each kind of request (see the table below).
-				Each request contains the information a connector needs to do the processing, and it also is the place
-				where the connector places the results (or the error, if one occurs).
-			</para>
-			<para>
-				How do the requests reference a node (or nodes)? Since requests are coming from a client, the client 
-				may identify a particular node using a &Location; object that is created with:
-			  <itemizedlist>
-			    <listitem>
-			      <para>the &Path; to the node; or</para>
-			    </listitem>
-			    <listitem>
-			      <para>one or more <emphasis>identification properties</emphasis> that are likely source=specific
-							and that are represented with &Property; objects; or</para>
-			    </listitem>
-			    <listitem>
-			      <para>a combination of both.</para>
-			    </listitem>
-			  </itemizedlist>
-				So, when a client knows the path or the identification properties, they can create a &Location;.  However,
-				all of the requests return &Location; objects, so often times the client simply uses the location
-				from a previous request.  Since &Location; is an immutable class, it is perfectly safe to reuse them.
-			</para>
-			<para>
-				One more thing about locations: while the request may have an incomplete location (e.g., a path but no
-				identification properties), the connector is expected to set on the request the <emphasis>actual</emphasis>
-				location that contains the path and all identification properties.  So as long as the client
-				reuses the actual locations in subsequent requests, the connectors will have the benefit of having
-				both the path and identification properties.  Connectors can then be written to leverage this
-				information, although the connector should still perform as expected when requests have incomplete locations.
-			</para>
-			<table frame='all'>
-				<title>Types of Node Operation Requests</title>
-				<tgroup cols='2' align='left' colsep='1' rowsep='1'>
-		      <colspec colname='c1' colwidth="1*"/>
-		      <colspec colname='c2' colwidth="1*"/>
-					<thead>
-						<row>
-				  		<entry>Name</entry>
-				  		<entry>Description</entry>
-						</row>
-					</thead>
-					<tbody>
-						<row>
-							<entry>ReadNodeRequest</entry>
-							<entry>
-								A request to read from the named workspace in the source a node's properties and children.
-								The node may be specified by path and/or by identification properties.
-								The connector returns all properties and the locations for all children,
-								or sets a &PathNotFoundException; error on the request if the node did not exist in the workspace.
-								If the node is found, the connector sets on the request the actual location of the node (including the path and identification properties).
-								The connector sets a &InvalidWorkspaceException; error on the request if the named workspace does not exist.
-							</entry>
-						</row>
-						<row>
-							<entry>VerifyNodeExistsRequest</entry>
-							<entry>
-								A request to verify the existance of a node at the specified location in the named workspace of the source.
-								The connector returns all the actual location for the node if it exists, or
-								sets a &PathNotFoundException; error on the request if the node does not exist in the workspace.
-								The connector sets a &InvalidWorkspaceException; error on the request if the named workspace does not exist.
-							</entry>
-						</row>
-						<row>
-							<entry>ReadAllPropertiesRequest</entry>
-							<entry>
-								A request to read from the named workspace in the source all of the properties of a node.
-								The node may be specified by path and/or by identification properties.
-								The connector returns all properties that were found on the node,
-								or sets a &PathNotFoundException; error on the request if the node did not exist in the workspace.
-								If the node is found, the connector sets on the request the actual location of the node (including the path and identification properties).
-								The connector sets a &InvalidWorkspaceException; error on the request if the named workspace does not exist.
-							</entry>
-						</row>
-						<row>
-							<entry>ReadPropertyRequest</entry>
-							<entry>
-								A request to read from the named workspace in the source a single property of a node.
-								The node may be specified by path and/or by identification properties,
-								and the property is specified by name.
-								The connector returns the property if found on the node,
-								or sets a &PathNotFoundException; error on the request if the node or property did not exist in the workspace.
-								If the node is found, the connector sets on the request the actual location of the node (including the path and identification properties).
-								The connector sets a &InvalidWorkspaceException; error on the request if the named workspace does not exist.
-							</entry>
-						</row>
-						<row>
-							<entry>ReadAllChildrenRequest</entry>
-							<entry>
-								A request to read from the named workspace in the source all of the children of a node.
-								The node may be specified by path and/or by identification properties.
-								The connector returns an ordered list of locations for each child found on the node,
-								an empty list if the node had no children,
-								or sets a &PathNotFoundException; error on the request if the node did not exist in the workspace.
-								If the node is found, the connector sets on the request the actual location of the parent node (including the path and identification properties).
-								The connector sets a &InvalidWorkspaceException; error on the request if the named workspace does not exist.
-							</entry>
-						</row>
-						<row>
-							<entry>ReadBlockOfChildrenRequest</entry>
-							<entry>
-								A request to read from the named workspace in the source a block of children of a node, starting with the n<superscript>th</superscript> children.
-								This is designed to allow paging through the children, which is much more efficient for large numbers of children.
-								The node may be specified by path and/or by identification properties, and the block
-								is defined by a starting index and a count (i.e., the block size).
-								The connector returns an ordered list of locations for each of the node's children found in the block,
-								or an empty list if there are no children in that range.
-								The connector also sets on the request the actual location of the parent node (including the path and identification properties)
-								or sets a &PathNotFoundException; error on the request if the parent node did not exist in the workspace.
-								The connector sets a &InvalidWorkspaceException; error on the request if the named workspace does not exist.
-							</entry>
-						</row>
-						<row>
-							<entry>ReadNextBlockOfChildrenRequest</entry>
-							<entry>
-								A request to read from the named workspace in the source a block of children of a node, starting with the children that immediately follow
-								a previously-returned child.
-								This is designed to allow paging through the children, which is much more efficient for large numbers of children.
-								The node may be specified by path and/or by identification properties, and the block
-								is defined by the location of the node immediately preceding the block and a count (i.e., the block size).
-								The connector returns an ordered list of locations for each of the node's children found in the block,
-								or an empty list if there are no children in that range.
-								The connector also sets on the request the actual location of the parent node (including the path and identification properties)
-								or sets a &PathNotFoundException; error on the request if the parent node did not exist in the workspace.
-								The connector sets a &InvalidWorkspaceException; error on the request if the named workspace does not exist.
-							</entry>
-						</row>
-						<row>
-							<entry>ReadBranchRequest</entry>
-							<entry>
-								A request to read a portion of a subgraph that has as its root a particular node, up to a maximum depth.
-								This request is an efficient mechanism when a branch (or part of a branch) is to be navigated and processed,
-								and replaces some non-trivial code to read the branch iteratively using multiple <code>ReadNodeRequest</code>s.
-								The connector reads the branch to the specified maximum depth, returning the properties and children for all
-								nodes found in the branch.  
-								The connector also sets on the request the actual location of the branch's root node (including the path and identification properties).
-								The connector sets a &PathNotFoundException; error on the request if the node at 
-								the top of the branch does not exist in the workspace.
-								The connector sets a &InvalidWorkspaceException; error on the request if the named workspace does not exist.
-							</entry>
-						</row>
-						<row>
-							<entry>CreateNodeRequest</entry>
-							<entry>
-								A request to create a node at the specified location and setting on the new node the properties included in the request.
-								The connector creates the node at the desired location, adjusting any same-name-sibling indexes as required.
-								(If an SNS index is provided in the new node's location, existing children with the same name after that SNS index
-								will have their SNS indexes adjusted.  However, if the requested location does not include a SNS index, the new
-								node is added after all existing children, and it's SNS index is set accordingly.)
-								The connector also sets on the request the actual location of the new node (including the path and identification properties)..
-								The connector sets a &PathNotFoundException; error on the request if the parent node does not exist in the workspace.
-								The connector sets a &InvalidWorkspaceException; error on the request if the named workspace does not exist.
-							</entry>
-						</row>
-						<row>
-							<entry>RemovePropertiesRequest</entry>
-							<entry>
-								A request to remove a set of properties on an existing node.  The request contains the location of the node as well as the
-								names of the properties to be removed.  The connector performs these changes and sets on the request the
-								actual location (including the path and identification properties) of the node.
-								The connector sets a &PathNotFoundException; error on the request if the node does not exist in the workspace.
-								The connector sets a &InvalidWorkspaceException; error on the request if the named workspace does not exist.
-							</entry>
-						</row>
-						<row>
-							<entry>UpdatePropertiesRequest</entry>
-							<entry>
-								A request to set or update properties on an existing node.  The request contains the location of the node as well as the
-								properties to be set and those to be deleted.  The connector performs these changes and sets on the request the
-								actual location (including the path and identification properties) of the node.
-								The connector sets a &PathNotFoundException; error on the request if the node does not exist in the workspace.
-								The connector sets a &InvalidWorkspaceException; error on the request if the named workspace does not exist.
-							</entry>
-						</row>
-						<row>
-							<entry>RenameNodeRequest</entry>
-							<entry>
-								A request to change the name of a node.  The connector changes the node's name, adjusts all SNS indexes
-								accordingly, and returns the actual locations (including the path and identification properties) of both the original
-								location and the new location.
-								The connector sets a &PathNotFoundException; error on the request if the node does not exist in the workspace.
-								The connector sets a &InvalidWorkspaceException; error on the request if the named workspace does not exist.
-							</entry>
-						</row>
-						<row>
-							<entry>CopyBranchRequest</entry>
-							<entry>
-								A request to copy a portion of a subgraph that has as its root a particular node, up to a maximum depth.
-								The request includes the name of the workspace where the original node is located as well as the name of the
-								workspace where the copy is to be placed (these may be the same, but may be different).
-								The connector copies the branch from the original location, up to the specified maximum depth, and places a copy
-								of the node as a child of the new location.
-								The connector also sets on the request the actual location (including the path and identification properties)
-								of the original location as well as the location of the new copy.
-								The connector sets a &PathNotFoundException; error on the request if the node at 
-								the top of the branch does not exist in the workspace.
-								The connector sets a &InvalidWorkspaceException; error on the request if one of the named workspaces does not exist.
-							</entry>
-						</row>
-						<row>
-							<entry>MoveBranchRequest</entry>
-							<entry>
-								A request to move a subgraph that has a particular node as its root.
-								The connector moves the branch from the original location and places it as child of the specified new location.
-								The connector also sets on the request the actual location (including the path and identification properties)
-								of the original and new locations.  The connector will adjust SNS indexes accordingly.
-								The connector sets a &PathNotFoundException; error on the request if the node that is to be moved or the
-								new location do not exist in the workspace.
-								The connector sets a &InvalidWorkspaceException; error on the request if the named workspace does not exist.
-							</entry>
-						</row>
-						<row>
-							<entry>DeleteBranchRequest</entry>
-							<entry>
-								A request to delete an entire branch specified by a single node's location.
-								The connector deletes the specified node and all nodes below it, and sets the actual location,
-								including the path and identification properties, of the node that was deleted.
-								The connector sets a &PathNotFoundException; error on the request if the node being deleted does not exist in the workspace.
-								The connector sets a &InvalidWorkspaceException; error on the request if the named workspace does not exist.
-							</entry>
-						</row>
-						<row>
-							<entry>CompositeRequest</entry>
-							<entry>
-								A request that actually comprises multiple requests (none of which will be a composite).
-								The connector simply processes all of the requests in the composite request, but should set on the composite
-								request any error (usually the first error) that occurs during processing of the contained requests.
-							</entry>
-						</row>
-					</tbody>
-				</tgroup>
-			</table>
-			<para>There are also requests that deal with workspaces:</para>
-			<table frame='all'>
-				<title>Types of Workspace Requests</title>
-				<tgroup cols='2' align='left' colsep='1' rowsep='1'>
-		      <colspec colname='c1' colwidth="1*"/>
-		      <colspec colname='c2' colwidth="1*"/>
-					<thead>
-						<row>
-				  		<entry>Name</entry>
-				  		<entry>Description</entry>
-						</row>
-					</thead>
-					<tbody>
-						<row>
-							<entry>GetWorkspacesRequest</entry>
-							<entry>
-								A request to obtain the names of the existing workspaces that are accessible to the caller.
-							</entry>
-						</row>
-						<row>
-							<entry>VerifyWorkspaceRequest</entry>
-							<entry>
-								A request to verify that a workspace with a particular name exists.
-								The connector returns the actual location for the root node if the workspace exists, as well as the actual name of the workspace
-								(e.g., the default workspace name if a null name is supplied).
-							</entry>
-						</row>
-						<row>
-							<entry>CreateWorkspaceRequest</entry>
-							<entry>
-								A request to create a workspace with a particular name.
-								The connector returns the actual location for the root node if the workspace exists, as well as the actual name of the workspace
-								(e.g., the default workspace name if a null name is supplied).
-								The connector sets a &InvalidWorkspaceException; error on the request if the named workspace already exists.
-							</entry>
-						</row>
-						<row>
-							<entry>DestroyWorkspaceRequest</entry>
-							<entry>
-								A request to destroy a workspace with a particular name.
-								The connector sets a &InvalidWorkspaceException; error on the request if the named workspace does not exist.
-							</entry>
-						</row>
-						<row>
-							<entry>CloneWorkspaceRequest</entry>
-							<entry>
-								A request to clone one named workspace as another new named workspace.
-								The connector sets a &InvalidWorkspaceException; error on the request if the original workspace does not exist, 
-								or if the new workspace already exists.
-							</entry>
-						</row>
-					</tbody>
-				</tgroup>
-			</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;.
-				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 DNA provides a &RequestProcessor; class that can simplify writing your own connector and at the
-				same time help insulate your connector from new kinds of requests that may be added in the future.  The &RequestProcessor;
-				is an abstract class that defines a <code>process(...)</code> method for each concrete &Request; subclass.
-				In other words, there is a <code>process(CompositeRequest)</code> method, a <code>process(ReadNodeRequest)</code> method,
-				and so on.  
-			</para>
-			<para>
-				To use this in your connector, simply create a subclass of &RequestProcessor;, overriding all of the abstract methods and optionally
-				overriding any of the other methods that have a default implementation.
-			</para>
-			<note>
-				<para>
-					The &RequestProcessor; abstract class contains default implementations for quite a few of the <code>process(...)</code> methods,
-					and these will be <emphasis>sufficient</emphasis>	but probably not efficient or optimum.  If you can provide a more efficient
-					implementation given your source, feel free to do so.  However, if performance is not a big issue, all of the concrete methods
-					will provide the correct behavior. Keep things simple to start out - you can always provide better implementations later.
-				</para>
-			</note>
-			<para>
-				Then, in your connector's <code>execute(&ExecutionContext;, &Request;)</code> method, instantiate your &RequestProcessor; subclass
-				and call its <code>process(&Request;) method, passing in the <code>execute(...)</code> method's &Request; parameter.</code>
-				The &RequestProcessor; will determine the appropriate method given the actual &Request; object and will then invoke that method:
-			</para>
-	    <programlisting>
-public void execute( final &ExecutionContext; context,
-                     final &Request; request ) throws RepositorySourceException {
-    RequestProcessor processor = new RequestProcessor(context);
-    try {
-        processor.process(request);
-    } finally {
-        processor.close();
-    }
-}</programlisting>
-			<para>
-				If you do this, the bulk of your connector implementation may be in the &RequestProcessor; implementation methods.
-				This not only is pretty maintainable, it also lends itself to easier testing.  And should any new request types be added
-				in the future, your connector may work just fine without any changes.  In fact, if the &RequestProcessor; class
-				can implement meaningful methods for those new request types, your connector may "just work".  Or, at least
-				your connector will still be binary compatible, even if your connector won't support any of the new features.
-			</para>
-			<para>
-				Finally, how should the connector handle exceptions?  As mentioned above, each &Request; object has a slot where the connector
-				can set any exception encountered during processing.  This not only handles the exception, but in the case of &CompositeRequest;s
-				it also correctly associates the problem with the request.  However, it is perfectly acceptable to throw an exception
-				if the connection becomes invalid (e.g., there is a communication failure) or if a fatal error would prevent subsequent
-				requests from being processed.
-			</para>
-		</sect2>
-	  <sect2 id="testing_custom_connectors">
-	    <title>Testing custom connectors</title>
-	    <para>
-				Testing connectors is not really that much different than testing other classes.  Using mocks may help to isolate your
-				instances so you can create more unit tests that don't require the underlying source system.
-			</para>
-	    <para>
-				However, there may be times when you have to use the underlying source system in your tests.  If this is the case,
-				we recommend using Maven integration tests, which run at a different point in the Maven lifecycle.  The benefit of
-				using integration tests is that by convention they're able to rely upon external systems.  Plus, your unit tests
-				don't become polluted with slow-running tests that break if the external system is not available.
-			</para>
-		</sect2>
-	  <sect2 id="deploying_custom_connectors">
-	    <title>Configuring and deploying custom connectors</title>
-	    <para>
-				After building your connector project, you need to configure the JBoss DNA components your application is using so
-				that they use your connector.  In a lot of cases, this will entail instantiating your connector's &RepositorySource; class,
-				setting the various properties, and registering it with a &RepositoryLibrary;.  Or, it will entail using a configuration
-				repository to use your source and letting &RepositoryService; instantiate and set up your &RepositorySource; instance.
-				Or, you can just instantiate and set it up manually, passing the instance to whatever component needs it.
-			</para>
-			<para>
-				And of course you have to make the JAR file containing your connector (as well as any dependency JARs) available to
-				your application's classpath.
-			</para>
-		</sect2>
-  </sect1>
-	<sect1 id="dna_graph_api">
-		<title>Graph API for using connectors</title>
-		<para>
-			So far we've talked about repositories, repository connectors, and how connectors respond to the different kinds of requests.
-			Normally you'd code to the JCR API and use our JCR implementation.  However, what does your code look like if you want 
-			to use the connectors directly, without using our JCR implementation?  After all, you may be a contributor to JBoss DNA,
-			or you may want to take advantage of our connectors without all the overhead of JCR.
-		</para>
-		<para>
-			One option, of course, is to explicitly create the different requests and pass them to the connector's <code>execute(...)</code> method.
-			While this is the most efficient approach (and one taken in some key DNA components), you probably want something that
-			is much less verbose and much easier to use.  This is where the DNA graph API comes in.
-		</para>
-		<para>
-			JBoss DNA's <emphasis>Graph API</emphasis> was designed as a lightweight public API for working with graph information,
-			and it insulates components from the underlying requests and interacting with connectors.  
-			The &Graph; class is the primary class in API, and each instance represents a single, independent
-			view of the graph of content from a single connector.  &Graph; instances return snapshots of state, and those snapshots
-			never change after they're retrieved.  To obtain a &Graph; instance, use the static <code>create(...)</code>
-			method, supplying the name of the source, a &RepositoryConnectionFactory; from which a &RepositoryConnection; can be obtained,
-			and the &ExecutionContext;.
-		</para>
-		<para>
-			The &Graph; class basically represents an <ulink url="http://www.martinfowler.com/bliki/DomainSpecificLanguage.html">internal domain specific language (DSL)</ulink>,
-			designed to be easy to use in an application.  
-			The Graph API makes extensive use of interfaces and method chaining, so that methods return a concise interface that has only those
-			methods that make sense at that point.  In fact, this should be really easy if your IDE has code completion.
-			Just remember that under the covers, a &Graph; is just building &Request; objects, submitting them to the connector,
-			and then exposing the results.
-		</para>
-		<sect2 id="dna_graph_api_workspaces">
-			<title>Using workspaces</title>
-		<para>
-			Let's look at some examples of how the Graph API works.  This first example shows how to obtain the names of the available workspaces:
-		</para>
-		<programlisting>
-&Set;&lt;&String;> workspaceNames = graph.getWorkspaces();
-</programlisting>
-		<para>Once you know the name of the workspace, you can specify that the graph should use it:
-		</para>
-		<programlisting>
-graph.useWorkspace("myWorkspace");
-</programlisting>
-		<para>
-			From this point forward, all requests will apply to the workspace named "myWorkspace".  At any time, you can use a different workspace,
-			which will affect all subsequent requests made using the graph.  Of course, creating a new workspace is just as easy:
-		</para>
-		<programlisting>
-graph.createWorkspace().named("newWorkspace");
-</programlisting>
-	  <para>This will attempt to create a workspace named "newWorkspace", which will fail if that workspace already exists.  You may
-		want to create a new workspace with a name that should be altered if the name you supply is already used.  The following code shows
-		how you can do this:
-		</para>
-		<programlisting>
-graph.createWorkspace().namedSomethingLike("newWorkspace");
-</programlisting>
-	  <para>If there is no existing workspace named "newWorkspace", a new one will be created with this name.  However, if "newWorkspace" already
-		exists, this call will create a workspace with a name that is some alteration of the supplied name.
-		</para>
-	  <para>
-		You can also clone workspaces, too:
-		</para>
-		<programlisting>
-graph.createWorkspace().clonedFrom("original").named("something");
-</programlisting>
-		<para>
-			or
-		</para>
-		<programlisting>
-graph.createWorkspace().clonedFrom("original").namedSomethingLike("something");
-</programlisting>
-		<para>
-			As you can see, it's very easy to specify which workspace you want to use or to create new workspaces.  You can also find out which workspace
-			the graph is currently using:
-		</para>
-		<programlisting>
-&String; current = graph.getCurrentWorkspaceName();
-</programlisting>
-		<para>or, if you want, you can get more information about the workspace:
-		</para>
-		<programlisting>
-&Workspace; current = graph.getCurrentWorkspace();
-&String; name = current.getName();
-&Location; rootLocation = current.getRoot();
-</programlisting>
-    </sect2>
-		<sect2 id="dna_graph_api_nodes">
-			<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;:
-		</para>
-		<programlisting>
-&Path; path = ...
-Map&lt;&Name;,&Property;> propertiesByName = graph.getPropertiesByName().on(path);
-</programlisting>
-		<para>
-			This next example shows how the graph can be used to obtain and loop over the properties of a node:
-		</para>
-		<programlisting>
-&Path; path = ...
-for ( &Property; property : graph.getProperties().on(path) ) {
-	  ...
-}
-</programlisting>
-		<para>
-			Likewise, the next example shows how the graph can be used to obtain and loop over the children of a node:
-		</para>
-		<programlisting>
-&Path; path = ...
-for ( &Location; child : graph.getChildren().of(path) ) {
-    &Path; childPath = child.getPath();
-	  ...
-}
-</programlisting>
-		<para>
-			Notice that the examples pass a &Path; instance to the <code>on(...)</code> and <code>of(...)</code> methods.  Many
-			of the Graph API methods take a variety of parameter types, including String, &Path;s, &Location;s, &UUID;, or &Property; parameters.
-			This should make it easy to use in many different situations.
-		</para>
-		<para>
-			Of course, changing content is more interesting and offers more interesting possibilities.  Here are a few examples:
-		</para>
-		<programlisting>
-&Path; path = ...
-&Location; location = ...
-&Property; idProp1 = ...
-&Property; idProp2 = ...
-&UUID; uuid = ...
-graph.move(path).into(idProp1, idProp2);
-graph.copy(path).into(location);
-graph.delete(uuid);
-graph.delete(idProp1,idProp2);
-</programlisting>
-		<para>
-			The methods shown above work immediately, as soon as each request is built.  However, there is another way to use
-			the &Graph; object, and that is in a <emphasis>batch</emphasis> mode.  Simply create a &GraphBatch; object using the
-			<code>batch()</code> method, create the requests on that batch object, and then execute all of the commands on the
-			batch by calling its <code>execute()</code> method.  That <code>execute()</code> method returns a &Results; interface
-			that can be used to read the node information retrieved by the batched requests. 
-		</para>
-		<para>
-			Method chaining works really well with the batch mode, since multiple commands can be assembled together very easily:
-		</para>
-		<programlisting>
-&Path; path = ...
-String path2 = ...
-&Location; location = ...
-&Property; idProp1 = ...
-&Property; idProp2 = ...
-&UUID; uuid = ...
-graph.batch().move(path).into(idProp1, idProp2).and().copy(path2).into(location).and().delete(uuid).execute();
-&Results; results = graph.batch().read(path2).
-                    and().readChildren().of(idProp1,idProp2).
-                    and().readSugraphOfDepth(3).at(uuid2).
-                    execute();
-for ( &Location; child : results.getNode(path2) ) {
-    ...
-}
-</programlisting>
-		<para>
-			Of course, this section provided just a hint of the Graph API.  
-			The &Graph; interface is actually quite complete and offers a full-featured approach for reading and updating a graph.
-			For more information, see the &Graph; JavaDocs.
-		</para>
-	</sect2>
-	</sect1>
-	<sect1>
-		<title>Summary</title>
-		<para>
-			In this chapter, we covered all the aspects of JBoss DNA repositories, including the connector framework,
-			how DNA's JCR implementation works with connectors, what connectors are available (and how to use them),
-			and how to write your own connector.  So now that you know how to set up and use JBoss DNA repositories,
-			the <link linkend="jcr">next chapter</link> describes how you can leverage JBoss DNA's JCR implementation.
-		</para>
-	</sect1>
-</chapter>

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	2009-06-08 15:21:29 UTC (rev 996)
+++ trunk/docs/reference/src/main/docbook/en-US/content/core/sequencing.xml	2009-06-08 15:47:40 UTC (rev 997)
@@ -28,7 +28,7 @@
 <!ENTITY % CustomDTD SYSTEM "../../custom.dtd">
 %CustomDTD;
 ]>
-<chapter id="sequencing">
+<chapter id="sequencing_framework">
   <title>Sequencing content</title>
 	<para>As we've mentioned before, JBoss DNA is able to work with existing JCR repositories.  Your client applications
   	make changes to the information in those repositories, and JBoss DNA automatically uses its sequencers to extract

Modified: trunk/docs/reference/src/main/docbook/en-US/master.xml
===================================================================
--- trunk/docs/reference/src/main/docbook/en-US/master.xml	2009-06-08 15:21:29 UTC (rev 996)
+++ trunk/docs/reference/src/main/docbook/en-US/master.xml	2009-06-08 15:47:40 UTC (rev 997)
@@ -52,32 +52,71 @@
 	</bookinfo>
 	<xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="content/preface.xml"/>
 	<xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="content/introduction.xml"/>
-	<part>
+	<part id="developers-part">
 		<title>Developers and Contributors</title>
+		<partintro>
+			<para>
+			  The JBoss DNA project uses a number of process, tools, and procedures to assist in the development of
+			  the software.  This portion of the document focuses on these aspects and will help developers and contributors
+			  obtain the source code, build locally, and contribute to the project.
+			</para>
+			<para>If you're not contributing to the project but are still developing 
+				custom <link linkend="connector_framework">connectors</link> or <link linkend="sequencing_framework">sequencers</link>. 
+			  this information may be helpful in establishing your own environment.
+			</para>
+		</partintro>
 		<xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="content/developers/tools.xml"/>
 	  <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="content/developers/testing.xml"/>
 	</part>
-	<part>
+	<part id="core-part">
 		<title>JBoss DNA Core</title>
+		<partintro>
+			<para>
+			  The JBoss DNA project organizes the codebase into a number of subprojects.  The most fundamental are those 
+			  <emphasis>core libraries</emphasis>, including the graph API, connector framework, sequencing framework,
+			  as well as the configuration and engine in which all the components run.  These are all topics covered
+			  in this part of the document.
+			</para>
+			<para>The JBoss DNA implementation of the <ulink url="&JSR170;">JCR API</ulink> as well as some other
+			  JCR-related components are covered in the <link linkend="jcr-part">next part</link>.
+			</para>
+		</partintro>
 		<xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="content/core/classloaders.xml"/>
 		<xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="content/core/environment.xml"/>
-	  <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="content/core/repositories.xml"/>
+	  <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="content/core/connector.xml"/>
 	  <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="content/core/sequencing.xml"/>
 	  <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="content/core/mimetypes.xml"/>
 	  <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="content/core/configuration.xml"/>
 	</part>
-	<part>
+	<part id="jcr-part">
 		<title>JBoss DNA JCR</title>
+		<partintro>
+			<para>
+			  The JBoss DNA project provides an implementation of the <ulink url="&JSR170;">JCR API</ulink>, which is
+			  built on top of the <link linkend="core-part">core libraries</link> discussed earlier.  This implementation
+			  as well as a number of JCR-related components are described in this part of the document.
+			</para>
+		</partintro>
   	<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/deploying_dna_jcr.xml"/>
   	<xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="content/jcr/rest_service.xml"/>
   </part>
-	<part>
+	<part id="provied-connectors-part">
 		<title>Provided Connectors</title>
+		<para>
+		  The JBoss DNA project provides a number of <link linkend="connector_framework">connectors</link> out-of-the-box.
+		  These are ready to be used by simply including them in the classpath and <link linkend="configuration">configuring</link>
+		  them as a repository source.
+		</para>
   	<xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="content/connectors/in_memory.xml"/>
 	</part>
-	<part>
+	<part id="provied-sequencers-part">
 		<title>Provided Sequencers</title>
+		<para>
+		  The JBoss DNA project provides a number of <link linkend="sequencing_framework">sequencers</link> out-of-the-box.
+		  These are ready to be used by simply including them in the classpath and <link linkend="configuration">configuring</link>
+		  them appropriately.
+		</para>
   	<xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="content/sequencers/zip.xml"/>
 	</part>
 	<xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="content/future.xml"/>



From dna-commits at lists.jboss.org  Mon Jun  8 12:12:59 2009
From: dna-commits at lists.jboss.org (dna-commits at lists.jboss.org)
Date: Mon, 08 Jun 2009 12:12:59 -0400
Subject: [dna-commits] DNA SVN: r998 - in
	trunk/docs/reference/src/main/docbook/en-US:
	content/connectors and 2 other directories.
Message-ID: <E1MDhT1-0002Zc-Kj@committer01.frg.pub.inap.atl.jboss.com>

Author: rhauch
Date: 2009-06-08 12:12:59 -0400 (Mon, 08 Jun 2009)
New Revision: 998

Added:
   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/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/sequencers/compact_node_types.xml
   trunk/docs/reference/src/main/docbook/en-US/content/sequencers/image.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/xml.xml
Modified:
   trunk/docs/reference/src/main/docbook/en-US/content/developers/tools.xml
   trunk/docs/reference/src/main/docbook/en-US/custom.dtd
   trunk/docs/reference/src/main/docbook/en-US/master.xml
Log:
Updated the skeleton connector and sequencer chapters to have the correct titles (but nothing more).  Also added reference to Git within the developer tools chapter.

Added: trunk/docs/reference/src/main/docbook/en-US/content/connectors/federation.xml
===================================================================
--- trunk/docs/reference/src/main/docbook/en-US/content/connectors/federation.xml	                        (rev 0)
+++ trunk/docs/reference/src/main/docbook/en-US/content/connectors/federation.xml	2009-06-08 16:12:59 UTC (rev 998)
@@ -0,0 +1,37 @@
+<?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="federation-connector">
+  <title>Federation Connector</title>
+  <para>
+		blah blah 
+  </para>
+</chapter>
+


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

Added: 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	                        (rev 0)
+++ trunk/docs/reference/src/main/docbook/en-US/content/connectors/file_system.xml	2009-06-08 16:12:59 UTC (rev 998)
@@ -0,0 +1,37 @@
+<?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="file-system-connector">
+  <title>File System Connector</title>
+  <para>
+		blah blah 
+  </para>
+</chapter>
+


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

Added: 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	                        (rev 0)
+++ trunk/docs/reference/src/main/docbook/en-US/content/connectors/jboss_cache.xml	2009-06-08 16:12:59 UTC (rev 998)
@@ -0,0 +1,37 @@
+<?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="jboss-cache-connector">
+  <title>JBoss Cache Connector</title>
+  <para>
+		blah blah 
+  </para>
+</chapter>
+


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

Added: 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	                        (rev 0)
+++ trunk/docs/reference/src/main/docbook/en-US/content/connectors/jdbc_metadata.xml	2009-06-08 16:12:59 UTC (rev 998)
@@ -0,0 +1,37 @@
+<?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="jdbc-metadata-connector">
+  <title>JDBC Metadata Connector</title>
+  <para>
+		blah blah 
+  </para>
+</chapter>
+


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

Added: 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	                        (rev 0)
+++ trunk/docs/reference/src/main/docbook/en-US/content/connectors/jdbc_storage.xml	2009-06-08 16:12:59 UTC (rev 998)
@@ -0,0 +1,37 @@
+<?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="jdbc-storage-connector">
+  <title>JDBC Storage (JPA) Connector</title>
+  <para>
+		blah blah 
+  </para>
+</chapter>
+


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

Added: trunk/docs/reference/src/main/docbook/en-US/content/connectors/subversion.xml
===================================================================
--- trunk/docs/reference/src/main/docbook/en-US/content/connectors/subversion.xml	                        (rev 0)
+++ trunk/docs/reference/src/main/docbook/en-US/content/connectors/subversion.xml	2009-06-08 16:12:59 UTC (rev 998)
@@ -0,0 +1,37 @@
+<?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="subversion-connector">
+  <title>Subversion Connector</title>
+  <para>
+		blah blah 
+  </para>
+</chapter>
+


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

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	2009-06-08 15:47:40 UTC (rev 997)
+++ trunk/docs/reference/src/main/docbook/en-US/content/developers/tools.xml	2009-06-08 16:12:59 UTC (rev 998)
@@ -163,6 +163,16 @@
 			by the patch.
 		</para>
 	</sect1>
+	<sect1 id="git">
+		<title>Git</title>
+		<para>
+			Several contributors are using <ulink url="&Git;">Git</ulink> on their local development machines.  This allows
+			the developer to use Git branches, commits, merges, and other Git tools, but still using 
+			the JBoss DNA <link linkend="svn">Subversion</link> repository.  For more information, see our 
+			<ulink url="http://jbossdna.blogspot.com/2009/05/git-and-svn-beginning.html">blog</ulink>
+			<ulink url="http://jbossdna.blogspot.com/2009/05/git-it-together-with-subversion.html">posts</ulink> on the topic.
+		</para>
+	</sect1>
 	<sect1 id="maven">
 		<title>Maven</title>
 		<para>JBoss DNA uses Maven 2 for its build system, as is this example. Using Maven 2 has several advantages, including

Added: 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	                        (rev 0)
+++ trunk/docs/reference/src/main/docbook/en-US/content/sequencers/compact_node_types.xml	2009-06-08 16:12:59 UTC (rev 998)
@@ -0,0 +1,36 @@
+<?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="cnd-sequencer">
+  <title>Compact Node Type (CND) Sequencer</title>
+  <para>
+		blah blah 
+  </para>
+</chapter>
\ No newline at end of file


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

Added: trunk/docs/reference/src/main/docbook/en-US/content/sequencers/image.xml
===================================================================
--- trunk/docs/reference/src/main/docbook/en-US/content/sequencers/image.xml	                        (rev 0)
+++ trunk/docs/reference/src/main/docbook/en-US/content/sequencers/image.xml	2009-06-08 16:12:59 UTC (rev 998)
@@ -0,0 +1,36 @@
+<?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="image-sequencer">
+  <title>Image Sequencer</title>
+  <para>
+		blah blah 
+  </para>
+</chapter>
\ No newline at end of file


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

Added: 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	                        (rev 0)
+++ trunk/docs/reference/src/main/docbook/en-US/content/sequencers/java_source.xml	2009-06-08 16:12:59 UTC (rev 998)
@@ -0,0 +1,36 @@
+<?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-source-sequencer">
+  <title>Java Source File Sequencer</title>
+  <para>
+		blah blah 
+  </para>
+</chapter>
\ No newline at end of file


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

Added: 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	                        (rev 0)
+++ trunk/docs/reference/src/main/docbook/en-US/content/sequencers/microsoft_office.xml	2009-06-08 16:12:59 UTC (rev 998)
@@ -0,0 +1,36 @@
+<?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="msoffice-sequencer">
+  <title><trademark class='registered'>Microsoft Office</trademark> Document Sequencer</title>
+  <para>
+		blah blah 
+  </para>
+</chapter>
\ No newline at end of file


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

Added: trunk/docs/reference/src/main/docbook/en-US/content/sequencers/mp3.xml
===================================================================
--- trunk/docs/reference/src/main/docbook/en-US/content/sequencers/mp3.xml	                        (rev 0)
+++ trunk/docs/reference/src/main/docbook/en-US/content/sequencers/mp3.xml	2009-06-08 16:12:59 UTC (rev 998)
@@ -0,0 +1,36 @@
+<?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="mp3-sequencer">
+  <title>MP3 Sequencer</title>
+  <para>
+		blah blah 
+  </para>
+</chapter>
\ No newline at end of file


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

Added: trunk/docs/reference/src/main/docbook/en-US/content/sequencers/xml.xml
===================================================================
--- trunk/docs/reference/src/main/docbook/en-US/content/sequencers/xml.xml	                        (rev 0)
+++ trunk/docs/reference/src/main/docbook/en-US/content/sequencers/xml.xml	2009-06-08 16:12:59 UTC (rev 998)
@@ -0,0 +1,36 @@
+<?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="xml-sequencer">
+  <title>XML Document Sequencer</title>
+  <para>
+		blah blah 
+  </para>
+</chapter>
\ No newline at end of file


Property changes on: trunk/docs/reference/src/main/docbook/en-US/content/sequencers/xml.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	2009-06-08 15:47:40 UTC (rev 997)
+++ trunk/docs/reference/src/main/docbook/en-US/custom.dtd	2009-06-08 16:12:59 UTC (rev 998)
@@ -21,6 +21,7 @@
 <!ENTITY MailTo     					"mailto:dna-users at jboss.org">
 <!ENTITY Wikipedia						"http://en.wikipedia.org/wiki/">
 <!ENTITY JBossMaven						"http://repository.jboss.com/maven2/">
+<!ENTITY Git									"http://git-scm.com/">
 
 <!ENTITY Java									"http://java.sun.com/j2se/1.5.0/docs/api/">
 

Modified: trunk/docs/reference/src/main/docbook/en-US/master.xml
===================================================================
--- trunk/docs/reference/src/main/docbook/en-US/master.xml	2009-06-08 15:47:40 UTC (rev 997)
+++ trunk/docs/reference/src/main/docbook/en-US/master.xml	2009-06-08 16:12:59 UTC (rev 998)
@@ -103,21 +103,37 @@
   </part>
 	<part id="provied-connectors-part">
 		<title>Provided Connectors</title>
-		<para>
-		  The JBoss DNA project provides a number of <link linkend="connector_framework">connectors</link> out-of-the-box.
-		  These are ready to be used by simply including them in the classpath and <link linkend="configuration">configuring</link>
-		  them as a repository source.
-		</para>
+		<partintro>
+			<para>
+			  The JBoss DNA project provides a number of <link linkend="connector_framework">connectors</link> out-of-the-box.
+			  These are ready to be used by simply including them in the classpath and <link linkend="configuration">configuring</link>
+			  them as a repository source.
+			</para>
+		</partintro>
   	<xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="content/connectors/in_memory.xml"/>
+  	<xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="content/connectors/file_system.xml"/>
+  	<xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="content/connectors/jdbc_storage.xml"/>
+  	<xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="content/connectors/federation.xml"/>
+  	<xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="content/connectors/subversion.xml"/>
+  	<xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="content/connectors/jboss_cache.xml"/>
+  	<xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="content/connectors/jdbc_metadata.xml"/>
 	</part>
 	<part id="provied-sequencers-part">
 		<title>Provided Sequencers</title>
-		<para>
-		  The JBoss DNA project provides a number of <link linkend="sequencing_framework">sequencers</link> out-of-the-box.
-		  These are ready to be used by simply including them in the classpath and <link linkend="configuration">configuring</link>
-		  them appropriately.
-		</para>
+		<partintro>
+			<para>
+			  The JBoss DNA project provides a number of <link linkend="sequencing_framework">sequencers</link> out-of-the-box.
+			  These are ready to be used by simply including them in the classpath and <link linkend="configuration">configuring</link>
+			  them appropriately.
+			</para>
+		</partintro>
+  	<xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="content/sequencers/compact_node_types.xml"/>
+  	<xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="content/sequencers/xml.xml"/>
   	<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/image.xml"/>
+  	<xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="content/sequencers/mp3.xml"/>
 	</part>
 	<xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="content/future.xml"/>
 </book>



From dna-commits at lists.jboss.org  Mon Jun  8 15:59:00 2009
From: dna-commits at lists.jboss.org (dna-commits at lists.jboss.org)
Date: Mon, 08 Jun 2009 15:59:00 -0400
Subject: [dna-commits] DNA SVN: r999 - in
	trunk/docs/reference/src/main/docbook/en-US: content and 2
	other directories.
Message-ID: <E1MDkzk-0004CP-1V@committer01.frg.pub.inap.atl.jboss.com>

Author: rhauch
Date: 2009-06-08 15:58:59 -0400 (Mon, 08 Jun 2009)
New Revision: 999

Added:
   trunk/docs/reference/src/main/docbook/en-US/content/core/execution_context.xml
   trunk/docs/reference/src/main/docbook/en-US/content/mime_type_detectors/
   trunk/docs/reference/src/main/docbook/en-US/content/mime_type_detectors/aperture.xml
   trunk/docs/reference/src/main/docbook/en-US/content/mime_type_detectors/custom_detectors.xml
Removed:
   trunk/docs/reference/src/main/docbook/en-US/content/core/classloaders.xml
   trunk/docs/reference/src/main/docbook/en-US/content/core/environment.xml
   trunk/docs/reference/src/main/docbook/en-US/content/core/mimetypes.xml
Modified:
   trunk/docs/reference/src/main/docbook/en-US/custom.dtd
   trunk/docs/reference/src/main/docbook/en-US/master.xml
Log:
Added more detail to the Execution Context chapter, and broke out the MIME type detector content into this chapter and a new document part focused on MIME type detectors.

Deleted: trunk/docs/reference/src/main/docbook/en-US/content/core/classloaders.xml
===================================================================
--- trunk/docs/reference/src/main/docbook/en-US/content/core/classloaders.xml	2009-06-08 16:12:59 UTC (rev 998)
+++ trunk/docs/reference/src/main/docbook/en-US/content/core/classloaders.xml	2009-06-08 19:58:59 UTC (rev 999)
@@ -1,121 +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
-  -->
-<!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="classloaders">
-  <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 all of the "interesting" components
-		are extensions that plug into and are used by different parts of the core.  The core doesn't really care what
-		the extensions do or what external libraries they require, as long as the extension fulfills its end of the
-		extension contract.
-	</para>
-	<para>
-		This means that you only need the core modules of JBoss DNA on the application classpath, while the extensions
-		do not have to be on the application classpath.  And because the core modules of JBoss DNA have few dependencies,
-		the risk of JBoss DNA libraries conflicting with the application's are lower.  Extensions, on the other hand,
-		will likely have a lot of unique dependencies. By separating the core of JBoss DNA from the class loaders used
-		to load the extensions, your application is isolated from the extensions and their dependencies.  Of course,
-		you can put all the JARs on the application classpath, too.  (This is what the examples in the &GettingStarted; document do.)
-	</para>
-	<para>
-		This design also allows you to select only those extensions that are interesting and useful for your application.
-		Not every application needs all of the JBoss DNA functionality.
-		Some applications may only need JBoss DNA sequencing, and specifically just a few types of sequencers.
-		Other applications may not need sequencing but do want to use JBoss DNA federation capabilities.
-  </para>
-	<para>
-		Finally, the use of these formal extensions also makes it easier for you to write your own customized extensions.
-		You may have proprietary file formats that you want to sequence.  Or, you may have a non-JCR repository system that you
-		want to access via JCR and maybe even federate with information from other sources.  Since extensions do
-		only one thing (e.g., be a sequencer, or a connector, etc.), its easier to develop those customizations.
-  </para>
-  <sect1 id="dna-classloader-factory">
-    <title>Class loader factory</title>
-		<para>
-			JBoss DNA loads all of the extension classes using class loaders returned by a <emphasis>class loader factory</emphasis>.
-			Each time JBoss DNA wants to load a class, it needs the name of the class and an optional "class loader name".
-			The meaning of the names is dependent upon the implementation of the class loader factory.  For example, the
-			<link linkend="dna-maven-classloader">Maven class loader factory</link> expects the names to be 
-			<ulink url="http://maven.apache.org/pom.html#Maven_Coordinates">Maven coordinates</ulink>.  Either way,
-			the class loader factory implementation uses the name to create and return a &ClassLoader;
-			instance that can be used to load the class.  Of course, if no name is provided, then a JBoss DNA service
-			just uses its class loader to load the class. (This is why putting all the extension jars on the classpath works.)
-		</para>
-		<para>
-			The class loader factory interface is pretty simple:
-		</para>
-		<programlisting>
-public interface &ClassLoaderFactory; {
-    /**
-     * Get a class loader given the supplied classpath.  The meaning of the classpath 
-     * is implementation-dependent.
-     * @param classpath the classpath to use
-     * @return the class loader; may not be null
-     */
-    &ClassLoader; getClassLoader( &String;... classpath );
-}
-</programlisting>
-    <para>In the <link linkend="environment">next chapter</link> we'll describe an &ExecutionContext; interface that is
- 			supplied to each of the JBoss DNA core services.  This context interface actually extends the &ClassLoaderFactory;
- 			interface, so setting up an &ExecutionContext; implicitly sets up the class loader factory.</para>
-  </sect1>
-  <sect1 id="dna-standard-classloader">
-    <title>Standard class loader factory</title>
-    <para>JBoss DNA includes and uses as a default a standard class loader factory that just loads the classes using the Thread's current context
-	    class loader (if there is one), or a delegate class loader that defaults to the class loader that loaded
-	    the &StandardClassLoaderFactory; class.  The class ignores any class loader names that are supplied.
-		</para>
-  </sect1>
-  <sect1 id="dna-maven-classloader">
-    <title>Maven Repository class loader factory</title>
-    <para>
-    	The <code>dna-classloader-maven</code> project has a class loader factory implementation that parses the names into
-			<ulink url="http://maven.apache.org/pom.html#Maven_Coordinates">Maven coordinates</ulink>, then uses those coordinates
-			to look up artifacts in a Maven 2 repository.  The artifact's POM file is used to determine the dependencies,
-			which is done transitively to obtain the complete dependency graph.  The resulting class loader has access
-			to these artifacts in dependency order.
-		</para>
-		<para>
-			This class loader is also able to use a JCR repository that contains the equivalent contents of a Maven repository.
-			However, JBoss DNA doesn't currently have any tooling to help populate that repository, so this component may be
-			of limited use right now.
-		</para>
-  </sect1>
-	<sect1>
-		<title>Summary</title>
-		<para>
-			In this chapter, we described the framework used by JBoss DNA to load extension classes, like implementations
-			of repositories, sequencers, MIME type detectors, and other components.
-		  <link linkend="environment">Next</link>, we cover how JBoss security works and how the various components
-		  of JBoss DNA can access this security information as well as information about the environment in which the component is running.
-		</para>
-	</sect1>
-</chapter>

Deleted: trunk/docs/reference/src/main/docbook/en-US/content/core/environment.xml
===================================================================
--- trunk/docs/reference/src/main/docbook/en-US/content/core/environment.xml	2009-06-08 16:12:59 UTC (rev 998)
+++ trunk/docs/reference/src/main/docbook/en-US/content/core/environment.xml	2009-06-08 19:58:59 UTC (rev 999)
@@ -1,310 +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
-  -->
-<!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="environment">
-  <title>Environment</title>
-  <para>
-		The various components of JBoss DNA are designed as plain old Java objects, or POJOs.  And rather than making assumptions
-		about their environment, each component instead requires that any external dependencies necessary for it to operate
-		must be supplied to it.  This pattern is known as Dependency Injection, and it allows the components to be simpler
-		and allows for a great deal of flexibility and customization in how the components are configured.  
-		And, JBoss DNA will soon provide a higher-level component that leverages the 
-		<ulink url="http://www.jboss.org/jbossmc">JBoss Microcontainer</ulink> to automatically assemble and wire together
-		all the lower-level components.
-  </para>
-	<sect1 id="execution-context">
-		<title>Execution contexts</title>
-		<para>
-			One of the objects that must be supplied to many JBoss DNA components is an &ExecutionContext;.  Some components 
-			require this context to be passed into individual methods, allowing the context to vary with each method invocation.
-			Other components require the context to be provided before it's used, and will use that context for all its operations
-			(until it is given a different one).
-		</para>
-		<para>
-			What does an &ExecutionContext; represent?  Quite simply, it's the set of objects that define the environment
-			or context in which the method or component is currently operating.  It includes a way for recording and reporting 
-			errors and problems.  It includes the ability to <link linkend="classloaders">create class loaders</link> 
-			given a classpath of class loader names. It also includes information about the current <link linkend="security">user</link>.
-			It includes access to factories that can be used to create and convert property values. And it includes factories 
-			for working with namespaces and fully-qualified names.  In fact, as JBoss DNA evolves, more things may need to be
-			added.  Here is what the &ExecutionContext; interface looks like:
-		</para>
-	  <programlisting>
-public class &ExecutionContext; implements &ClassLoaderFactory; {
-
-    /**
-     * Get the factories that should be used to create values for {@link Property properties}.
-     * @return the property value factory; never null
-     */
-    public &ValueFactories; getValueFactories() {...}
-
-    /**
-     * Get the namespace registry for this context.
-     * @return the namespace registry; never null
-     */
-    public &NamespaceRegistry; getNamespaceRegistry() {...}
-
-    /**
-     * Get the factory for creating {@link Property} objects.
-     * @return the property factory; never null
-     */
-    public &PropertyFactory; getPropertyFactory() {...}
-
-    /**
-     * Get the security context for this environment.
-     * @return the security context; never <code>null</code>
-     */
-    public &SecurityContext; getSecurityContext() {...}
-
-    /**
-     * Return a logger associated with this context. This logger records only those activities within the 
-     * context and provide a way to capture the context-specific activities. All log messages are also
-     * sent to the system logger, so classes that log via this mechanism should <i>not</i> also 
-     * {@link Logger#getLogger(Class) obtain a system logger}.
-     * @param clazz the class that is doing the logging
-     * @return the logger, named after <code>clazz</code>; never null
-     */
-    public &Logger; getLogger( Class&lt;?> clazz ) {...}
-
-    /**
-    * Return a logger associated with this context. This logger records only those activities within the 
-    * context and provide a way to capture the context-specific activities. All log messages are also
-    * sent to the system logger, so classes that log via this mechanism should <i>not</i> also 
-    * {@link Logger#getLogger(Class) obtain a system logger}.
-     * @param name the name for the logger
-     * @return the logger, named after <code>clazz</code>; never null
-     */
-    public &Logger; getLogger( String name ) {...}
-
-		...
-}
-</programlisting>
-		<para>
-			Notice that &ExecutionContext; implements the &ClassLoaderFactory; interface described in the
-			<link linkend="classloaders">previous chapter</link>, meaning it can be used to create other contexts.  These other methods are not shown,
-			but can be used to create create subcontexts with different <link linkend="security">security contexts</link>,
-	    with different namespace registry, or with different combinations of components.
-		</para>
-	  <para>
-			The fact that so many of the JBoss DNA components take &ExecutionContext; instances gives us some interesting possibilities.  
-			For example, one execution context instance can be used as the highest-level (or "application-level") context for all of the services 
-			(e.g., &RepositoryService;, &SequencingService;, etc.).
-			Then, an execution context could be created for each user that will be performing operations, and that user's context can
-			be passed around to not only provide security information about the user but also to allow the activities being performed
-			to be recorded for user feedback, monitoring and/or auditing purposes.
-		</para>
-		<para>
-			The following code fragment shows how easy it is to create various execution contexts:
-		</para>
-	  <programlisting>
-&ExecutionContext; context1 = new &ExecutionContext;();
-String jaasRealm = ...;
-
-// Create a context for a user, authenticating using a JAAS LoginContext...
-char[] password = "password".toCharArray();
-&SecurityContext; securityContext = new JaasSecurityContext(jaasRealm, "username", password);
-&ExecutionContext; context2 = context1.with(securityContext);
-
-// Create a context for the same user, authenticating using JAAS, and using a different callback handler ...
-&CallbackHandler; callbackHandler = ...
-&ExecutionContext; context3 = context1.with(new JaasSecurityContext(jaasRealm, callbackHandler);
-
-// Create a context that uses a provided &SecurityContext; (see the <link linkend="security">next section</link>)...
-&SecurityContext; mySecurityContext = ...
-&ExecutionContext; context4 = context1.with(mySecurityContext);
-</programlisting>
-		<para>
-			These contexts can then be passed to the various components as needed.
-		</para>
-	</sect1>
-	<sect1 id="security">
-		<title>Security</title>
-	  <para>
-	    JBoss DNA uses a simple abstraction layer to isolate it from the security infrastructure used within an application.
-	   The &SecurityContext; interface is defined as follows:
-		</para>
-	  <programlisting>
-public interface &SecurityContext; {
-
-    /**
-     * Get the name of the authenticated user.
-     * @return the authenticated user's name
-     */
-    &String; getUserName();
-
-    /**
-     * Determine whether the authenticated user has the given role.
-     * @param roleName the name of the role to check
-     * @return true if the user has the role and is logged in; false otherwise
-     */
-    boolean hasRole( String roleName );
-
-    /**
-     * Logs the user out of the authentication mechanism.
-     * For some authentication mechanisms, this will be implemented as a no-op.
-     */
-    void logout();
-}
-</programlisting>
-		<para>
-			As noted below, this security context is made available through the &ExecutionContext; described above.
-		</para>
-		<sect2 id="jaas_security">
-			<title>JAAS</title>
-			<para>
-				One such implementation is the &JaasSecurityContext;, which delegates any authentication or authorization requests to a
-		    <ulink url="http://java.sun.com/javase/technologies/security/">Java Authentication and Authorization Service (JAAS)</ulink>
-		    provider.  This is the standard approach for authenticating and authorizing in Java, and is the default mechanism 
-		    used by the &JcrEngine;.  
-		  </para>
-		  <para>
-				There are quite a few JAAS providers available, but one of the best and most powerful providers is
-		    <ulink url="http://www.jboss.org/jbosssecurity/">JBoss Security</ulink>, the open source
-				security framework used by JBoss.  JBoss Security offers a number of JAAS login modules, including:
-		    <itemizedlist>
-		      <listitem>
-		        <para>
-		          <emphasis role="strong">User-Roles Login Module</emphasis>
-		          is a simple
-		          <code>javax.security.auth.login.LoginContext</code>
-		          implementation that uses usernames and passwords stored in a properties file.
-		        </para>
-		      </listitem>
-		      <listitem>
-		        <para>
-		          <emphasis role="strong">Client Login Module</emphasis>
-		          prompts the user for their username and password.
-		        </para>
-		      </listitem>
-		      <listitem>
-		        <para>
-		          <emphasis role="strong">Database Server Login Module</emphasis>
-		          uses a JDBC database to authenticate principals and associate them with roles.
-		        </para>
-		      </listitem>
-		      <listitem>
-		        <para>
-		          <emphasis role="strong">LDAP Login Module</emphasis>
-		          uses an LDAP directory to authenticate principals. Two implementations are available.
-		        </para>
-		      </listitem>
-		      <listitem>
-		        <para>
-		          <emphasis role="strong">Certificate Login Module</emphasis>
-		          authenticates using X509 certificates, obtaining roles from either property files or a JDBC database.
-		        </para>
-		      </listitem>
-		      <listitem>
-		        <para>
-		          <emphasis role="strong">Operating System Login Module</emphasis>
-		          authenticates using the operating system's mechanism.
-		        </para>
-		      </listitem>
-		    </itemizedlist>
-		    and many others.  Plus, JBoss Security also provides other capabilities, such as using XACML policies or using federated single sign-on. 
-				For more detail, see the <ulink url="http://www.jboss.org/jbosssecurity/">JBoss Security</ulink> project.
-		  </para>
-		</sect2>
-		<sect2 id="web_security">
-			<title>Web application security</title>
-			<para>
-				If JBoss DNA is being used within a web application, then it is probably desirable to reuse the security infrastructure
-				of the application server.  This can be accomplished by implementing the &SecurityContext; interface with an implementation
-				that delegates to the <interface>HttpServletRequest</interface>.  Then, for each request, create a &SecurityContextCredentials;
-				instance around your &SecurityContext;, and use that credentials to obtain a JCR &Session;.
-			</para>
-			<para>
-				Here is an example of the &SecurityContext; implementation that uses the servlet request:
-			</para>
-	  <programlisting>
- at Immutable
-public class ServletSecurityContext implements &SecurityContext; {
-
-    private final String userName;
-    private final HttpServletRequest request;
-
-    /**
-     * Create a {@link ServletSecurityContext} with the supplied 
-     * {@link HttpServletRequest servlet information}.
-     * 
-     * @param request the servlet request; may not be null
-     */
-    public ServletSecurityContext( HttpServletRequest request ) {
-        this.request = request;
-        this.userName = request.getUserPrincipal() != null ? request.getUserPrincipal().getName() : null;
-    }
-
-    /**
-     * Get the name of the authenticated user.
-     * @return the authenticated user's name
-     */
-    public &String; getUserName() {
-        return userName;
-    }
-
-    /**
-     * Determine whether the authenticated user has the given role.
-     * @param roleName the name of the role to check
-     * @return true if the user has the role and is logged in; false otherwise
-     */
-    boolean hasRole( String roleName ) {
-        request.isUserInRole(roleName);
-    }
-
-    /**
-     * Logs the user out of the authentication mechanism.
-     * For some authentication mechanisms, this will be implemented as a no-op.
-     */
-    public void logout() {
-    }
-}</programlisting>
-			<para>
-				Then use this to create a &Session;:
-			</para>
-	  <programlisting>
-HttpServletRequest request = ...
-&Repository; repository = engine.getRepository("my repository");
-&SecurityContext; securityContext = new ServletSecurityContext(httpServletRequest);
-SecurityContextCredentials credentials = new SecurityContextCredentials(securityContext);
-&Session; session = repository.login(credentials, workspaceName);
-</programlisting>
-		</sect2>
-	</sect1>
-	<sect1>
-		<title>Summary</title>
-		<para>
-			In this chapter, we covered security and environment topics as used throughout JBoss DNA. 
-			The <link linkend="repositories">next chapter</link> will cover JBoss DNA repositories, including the connector framework,
-			how DNA's JCR implementation works with connectors, what connectors are available (and how to use them),
-			and how to write your own connector.
-		</para>
-	</sect1>
-</chapter>
-

Added: 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	                        (rev 0)
+++ trunk/docs/reference/src/main/docbook/en-US/content/core/execution_context.xml	2009-06-08 19:58:59 UTC (rev 999)
@@ -0,0 +1,578 @@
+<?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="execution_context">
+  <title>Execution Context</title>
+  <para>
+		The various components of JBoss DNA are designed as plain old Java objects, or POJOs.  And rather than making assumptions
+		about their environment, each component instead requires that any external dependencies necessary for it to operate
+		must be supplied to it.  This pattern is known as Dependency Injection, and it allows the components to be simpler
+		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
+		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).  
+		Most of the JBoss DNA components require an &ExecutionContext; and thus have access to all these facilities.
+	</para>
+	<para>
+		The &ExecutionContext; is a concrete class that is instantiated with the no-argument constructor:
+	</para>
+	<programlisting>
+public class &ExecutionContext; implements &ClassLoaderFactory; {
+
+    /**
+     * Create an instance of an execution context, with default implementations for all components.
+     */
+    public &ExecutionContext;() { ... }
+
+    /**
+     * Get the factories that should be used to create values for {@link Property properties}.
+     * @return the property value factory; never null
+     */
+    public &ValueFactories; getValueFactories() {...}
+
+    /**
+     * Get the namespace registry for this context.
+     * @return the namespace registry; never null
+     */
+    public &NamespaceRegistry; getNamespaceRegistry() {...}
+
+    /**
+     * Get the factory for creating {@link Property} objects.
+     * @return the property factory; never null
+     */
+    public &PropertyFactory; getPropertyFactory() {...}
+
+    /**
+     * Get the security context for this environment.
+     * @return the security context; never <code>null</code>
+     */
+    public &SecurityContext; getSecurityContext() {...}
+
+    /**
+     * Return a logger associated with this context. This logger records only those activities within the 
+     * context and provide a way to capture the context-specific activities. All log messages are also
+     * sent to the system logger, so classes that log via this mechanism should <i>not</i> also 
+     * {@link Logger#getLogger(Class) obtain a system logger}.
+     * @param clazz the class that is doing the logging
+     * @return the logger, named after <code>clazz</code>; never null
+     */
+    public &Logger; getLogger( Class&lt;?> clazz ) {...}
+
+    /**
+    * Return a logger associated with this context. This logger records only those activities within the 
+    * context and provide a way to capture the context-specific activities. All log messages are also
+    * sent to the system logger, so classes that log via this mechanism should <i>not</i> also 
+    * {@link Logger#getLogger(Class) obtain a system logger}.
+     * @param name the name for the logger
+     * @return the logger, named after <code>clazz</code>; never null
+     */
+    public &Logger; getLogger( String name ) {...}
+
+		...
+}
+</programlisting>
+  <para>
+		The fact that so many of the JBoss DNA components take &ExecutionContext; instances gives us some interesting possibilities.  
+		For example, one execution context instance can be used as the highest-level (or "application-level") context for all of the services 
+		(e.g., &RepositoryService;, &SequencingService;, etc.).
+		Then, an execution context could be created for each user that will be performing operations, and that user's context can
+		be passed around to not only provide security information about the user but also to allow the activities being performed
+		to be recorded for user feedback, monitoring and/or auditing purposes.
+	</para>
+	<para>
+		As mentioned above, the starting point is to create a default execution context, which will have all the default components:
+	</para>
+<programlisting>
+&ExecutionContext; context = new &ExecutionContext;();
+</programlisting>
+	<para>
+		Once you have this top-level context, you can start creating <emphasis>subcontexts</emphasis> with different components,
+		and different security contexts.  (Of course, you can create a subcontext from any &ExceutionContext; instance.)
+		To create a subcontext, simply use one of the <code>with(...)</code> methods on the parent context.  We'll show examples
+		later on in this chapter.
+	</para>
+	<sect1 id="security">
+		<title>Security</title>
+	  <para>
+	    JBoss DNA uses a simple abstraction layer to isolate it from the security infrastructure used within an application.
+	    A &SecurityContext; represents the context of an authenticated user, and is defined as an interface:
+		</para>
+	  <programlisting>
+public interface &SecurityContext; {
+
+    /**
+     * Get the name of the authenticated user.
+     * @return the authenticated user's name
+     */
+    String getUserName();
+
+    /**
+     * Determine whether the authenticated user has the given role.
+     * @param roleName the name of the role to check
+     * @return true if the user has the role and is logged in; false otherwise
+     */
+    boolean hasRole( String roleName );
+
+    /**
+     * Logs the user out of the authentication mechanism.
+     * For some authentication mechanisms, this will be implemented as a no-op.
+     */
+    void logout();
+}
+</programlisting>
+		<para>
+			Every &ExecutionContext; has a &SecurityContext; instance, though the top-level (default) execution context does not represent
+			an authenticated user.  But you can create a subcontext for a user authenticated via JAAS:
+		</para>
+<programlisting>
+&ExecutionContext; context = ...
+String username = ...
+char[] password = ...
+String jaasRealm = ...
+&SecurityContext; securityContext = new JaasSecurityContext(jaasRealm, username, password);
+&ExecutionContext; userContext = context.with(securityContext);
+</programlisting>
+		<para>
+			In the case of JAAS, you might not have the password but would rather prompt the user.  In that case, simply create
+			a subcontext with a different security context:
+		</para>
+<programlisting>
+&ExecutionContext; context = ...
+String jaasRealm = ...
+&CallbackHandler; callbackHandler = ...
+&ExecutionContext; userContext = context.with(new JaasSecurityContext(jaasRealm, callbackHandler);
+</programlisting>
+		<para>
+			Of course if your application has a non-JAAS authentication and authorization system, you can simply provide your own implementation
+			of &SecurityContext;:
+		</para>
+<programlisting>
+&ExecutionContext; context = ...
+&SecurityContext; mySecurityContext = ...
+&ExecutionContext; myAppContext = context.with(mySecurityContext);
+</programlisting>
+		<para>
+			These &ExecutionContext; then represent the authenticated user in any component that uses the context.
+		</para>
+		<sect2 id="jaas_security">
+			<title>JAAS</title>
+			<para>
+				One of the &SecurityContext; implementations provided by JBoss DNA is the &JaasSecurityContext;, which delegates any authentication 
+				or authorization requests to a <ulink url="http://java.sun.com/javase/technologies/security/">Java Authentication and Authorization Service (JAAS)</ulink>
+		    provider.  This is the standard approach for authenticating and authorizing in Java.  
+		  </para>
+		  <para>
+				There are quite a few JAAS providers available, but one of the best and most powerful providers is
+		    <ulink url="http://www.jboss.org/jbosssecurity/">JBoss Security</ulink>, the open source
+				security framework used by JBoss.  JBoss Security offers a number of JAAS login modules, including:
+		    <itemizedlist>
+		      <listitem>
+		        <para>
+		          <emphasis role="strong">User-Roles Login Module</emphasis>
+		          is a simple
+		          <code>javax.security.auth.login.LoginContext</code>
+		          implementation that uses usernames and passwords stored in a properties file.
+		        </para>
+		      </listitem>
+		      <listitem>
+		        <para>
+		          <emphasis role="strong">Client Login Module</emphasis>
+		          prompts the user for their username and password.
+		        </para>
+		      </listitem>
+		      <listitem>
+		        <para>
+		          <emphasis role="strong">Database Server Login Module</emphasis>
+		          uses a JDBC database to authenticate principals and associate them with roles.
+		        </para>
+		      </listitem>
+		      <listitem>
+		        <para>
+		          <emphasis role="strong">LDAP Login Module</emphasis>
+		          uses an LDAP directory to authenticate principals. Two implementations are available.
+		        </para>
+		      </listitem>
+		      <listitem>
+		        <para>
+		          <emphasis role="strong">Certificate Login Module</emphasis>
+		          authenticates using X509 certificates, obtaining roles from either property files or a JDBC database.
+		        </para>
+		      </listitem>
+		      <listitem>
+		        <para>
+		          <emphasis role="strong">Operating System Login Module</emphasis>
+		          authenticates using the operating system's mechanism.
+		        </para>
+		      </listitem>
+		    </itemizedlist>
+		    and many others.  Plus, JBoss Security also provides other capabilities, such as using XACML policies or using federated single sign-on. 
+				For more detail, see the <ulink url="http://www.jboss.org/jbosssecurity/">JBoss Security</ulink> project.
+		  </para>
+		</sect2>
+		<sect2 id="web_security">
+			<title>Web application security</title>
+			<para>
+				If JBoss DNA is being used within a web application, then it is probably desirable to reuse the security infrastructure
+				of the application server.  This can be accomplished by implementing the &SecurityContext; interface with an implementation
+				that delegates to the <interface>HttpServletRequest</interface>.  Then, for each request, create a &SecurityContextCredentials;
+				instance around your &SecurityContext;, and use that credentials to obtain a JCR &Session;.
+			</para>
+			<para>
+				Here is an example of the &SecurityContext; implementation that uses the servlet request:
+			</para>
+	  <programlisting>
+ at Immutable
+public class ServletSecurityContext implements &SecurityContext; {
+
+    private final String userName;
+    private final HttpServletRequest request;
+
+    /**
+     * Create a {@link ServletSecurityContext} with the supplied 
+     * {@link HttpServletRequest servlet information}.
+     * 
+     * @param request the servlet request; may not be null
+     */
+    public ServletSecurityContext( HttpServletRequest request ) {
+        this.request = request;
+        this.userName = request.getUserPrincipal() != null ? request.getUserPrincipal().getName() : null;
+    }
+
+    /**
+     * Get the name of the authenticated user.
+     * @return the authenticated user's name
+     */
+    public String getUserName() {
+        return userName;
+    }
+
+    /**
+     * Determine whether the authenticated user has the given role.
+     * @param roleName the name of the role to check
+     * @return true if the user has the role and is logged in; false otherwise
+     */
+    boolean hasRole( String roleName ) {
+        request.isUserInRole(roleName);
+    }
+
+    /**
+     * Logs the user out of the authentication mechanism.
+     * For some authentication mechanisms, this will be implemented as a no-op.
+     */
+    public void logout() {
+    }
+}</programlisting>
+			<para>
+				Then use this to create a &Session;:
+			</para>
+<programlisting>
+HttpServletRequest request = ...
+&Repository; repository = engine.getRepository("my repository");
+&SecurityContext; securityContext = new ServletSecurityContext(httpServletRequest);
+&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
+				the authenticated user.
+			</para>
+		</sect2>
+	</sect1>
+	<sect1 id="namespace_registry">
+		<title>Namespace Registry</title>
+	  <para>
+	    As we saw earlier, every &ExecutionContext; has a registry of namespaces.  Namespaces are used throughout the graph API
+	    (as we'll see soon), and the prefix associated with each namespace makes for more readable string representations.
+	    The namespace registry tracks all of these namespaces and prefixes, and allows registrations to be added, modified, or
+		  removed.  The interface for the &NamespaceRegistry; shows how these operations are done:
+		</para>
+	  <programlisting>
+public interface &NamespaceRegistry; {
+
+    /**
+     * Return the namespace URI that is currently mapped to the empty prefix.
+     * @return the namespace URI that represents the default namespace, 
+     * or null if there is no default namespace
+     */
+    String getDefaultNamespaceUri();
+
+    /**
+     * Get the namespace URI for the supplied prefix.
+     * @param prefix the namespace prefix
+     * @return the namespace URI for the supplied prefix, or null if there is no 
+     * namespace currently registered to use that prefix
+     * @throws IllegalArgumentException if the prefix is null
+     */
+    String getNamespaceForPrefix( String prefix );
+
+    /**
+     * Return the prefix used for the supplied namespace URI.
+     * @param namespaceUri the namespace URI
+     * @param generateIfMissing true if the namespace URI has not already been registered and the 
+     *        method should auto-register the namespace with a generated prefix, or false if the  
+     *        method should never auto-register the namespace
+     * @return the prefix currently being used for the namespace, or "null" if the namespace has 
+     *         not been registered and "generateIfMissing" is "false"
+     * @throws IllegalArgumentException if the namespace URI is null
+     * @see #isRegisteredNamespaceUri(String)
+     */
+    String getPrefixForNamespaceUri( String namespaceUri, boolean generateIfMissing );
+
+    /**
+     * Return whether there is a registered prefix for the supplied namespace URI.
+     * @param namespaceUri the namespace URI
+     * @return true if the supplied namespace has been registered with a prefix, or false otherwise
+     * @throws IllegalArgumentException if the namespace URI is null
+     */
+    boolean isRegisteredNamespaceUri( String namespaceUri );
+
+    /**
+     * Register a new namespace using the supplied prefix, returning the namespace URI previously 
+     * registered under that prefix.
+     * @param prefix the prefix for the namespace, or null if a namesapce prefix should be generated 
+     *        automatically
+     * @param namespaceUri the namespace URI
+     * @return the namespace URI that was previously registered with the supplied prefix, or null if the 
+     *         prefix was not previously bound to a namespace URI
+     * @throws IllegalArgumentException if the namespace URI is null
+     */
+    String register( String prefix, String namespaceUri );
+
+    /**
+     * Unregister the namespace with the supplied URI.
+     * @param namespaceUri the namespace URI
+     * @return true if the namespace was removed, or false if the namespace was not registered
+     * @throws IllegalArgumentException if the namespace URI is null
+     * @throws NamespaceException if there is a problem unregistering the namespace
+     */
+    boolean unregister( String namespaceUri );
+
+    /**
+     * Obtain the set of namespaces that are registered.
+     * @return the set of namespace URIs; never null
+     */
+    Set&lt;String> getRegisteredNamespaceUris();
+
+    /**
+     * Obtain a snapshot of all of the {@link Namespace namespaces} registered at the time this method 
+     * is called. The resulting set is immutable, and will not reflect changes made to the registry.
+     * @return an immutable set of &Namespace; objects reflecting a snapshot of the registry; never null
+     */
+    Set&lt;&Namespace;> getNamespaces();
+}
+</programlisting>
+		<para>
+			This interfaces exposes &Namespace; objects that are immutable:
+		</para>
+<programlisting>
+ at Immutable
+interface &Namespace; extends Comparable&lt;&Namespace;> {
+    /**
+     * Get the prefix for the namespace
+     * @return the prefix; never null but possibly the empty string
+     */
+    String getPrefix();
+
+    /**
+     * Get the URI for the namespace
+     * @return the namespace URI; never null but possibly the empty string
+     */
+    String getNamespaceUri();
+}
+</programlisting>
+			<para>
+				JBoss DNA actually uses several implementations of &NamespaceRegistry;, but you can even implement your own
+				and create &ExecutionContext;s that uses it:
+			</para>
+<programlisting>
+&NamespaceRegistry; myRegistry = ...
+&ExecutionContext; contextWithMyRegistry = context.with(myRegistry);
+</programlisting>
+	</sect1>
+	<sect1 id="class_loader_factory">
+		<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
+			are extensions that plug into and are used by different parts of the core or by layers above (such as the
+			<link linkend="jcr">JCR implementation</link>).  The core doesn't really care what
+			the extensions do or what external libraries they require, as long as the extension fulfills its end of the
+			extension contract.
+		</para>
+		<para>
+			This means that you only need the core modules of JBoss DNA on the application classpath, while the extensions
+			do not have to be on the application classpath.  And because the core modules of JBoss DNA have few dependencies,
+			the risk of JBoss DNA libraries conflicting with the application's are lower.  Extensions, on the other hand,
+			will likely have a lot of unique dependencies. By separating the core of JBoss DNA from the class loaders used
+			to load the extensions, your application is isolated from the extensions and their dependencies. 
+		</para>
+		<note>
+			<para>Of course, you can put all the JARs on the application classpath, too. 
+				This is what the examples in the &GettingStarted; document do.
+			</para>
+		</note>
+		<para>
+			But in this case, how does JBoss DNA load all the extension classes?  You may have noticed earlier that 
+			&ExecutionContext; implements	the &ClassLoaderFactory; interface with a single method:
+		</para>
+		<programlisting>
+public interface &ClassLoaderFactory; {
+    /**
+     * Get a class loader given the supplied classpath.  The meaning of the classpath 
+     * is implementation-dependent.
+     * @param classpath the classpath to use
+     * @return the class loader; may not be null
+     */
+    &ClassLoader; getClassLoader( &String;... classpath );
+}
+</programlisting>
+		<para>
+			This means that any component that has a reference to an &ExecutionContext; has the ability to create a
+			class loader with a supplied class path.  As we'll see later, the connectors and sequencers are all
+			defined with a class and optional class path.  This is where that class path comes in.
+		</para>
+		<para>
+			The actual meaning of the class path, however, is a function of the implementation.  JBoss DNA uses
+			a &StandardClassLoaderFactory; that just loads the classes using the Thread's current context
+			class loader (or, if there is none, delegates to the class loader that loaded the &StandardClassLoaderFactory; class).
+			Of course, it's possible to implement other &ClassLoaderFactory; with other implementations.
+			Then, just create a subcontext with your implementation:
+		</para>
+<programlisting>
+&ClassLoaderFactory; myClassLoaderFactory = ...
+&ExecutionContext; contextWithMyClassLoaderFactories = context.with(myClassLoaderFactory);
+</programlisting>
+		<note>
+	    <para>
+	    	The <code>dna-classloader-maven</code> project has a class loader factory implementation that parses the names into
+				<ulink url="http://maven.apache.org/pom.html#Maven_Coordinates">Maven coordinates</ulink>, then uses those coordinates
+				to look up artifacts in a Maven 2 repository.  The artifact's POM file is used to determine the dependencies,
+				which is done transitively to obtain the complete dependency graph.  The resulting class loader has access
+				to these artifacts in dependency order.
+			</para>
+			<para>
+				This class loader is not ready for use, however, since there is no tooling to help populate the repository.
+			</para>
+	  </note>
+	</sect1>
+	<sect1 id="mime-type-detectors">
+		<title>Property factory and value factories</title>
+	  <para>
+	  	JBoss DNA often needs the ability to determine the MIME type for some binary content.  When uploading content into
+			a repository, we may want to add the MIME type as metadata.  Or, we may want to make some processing decisions
+			based upon the MIME type.  So, JBoss DNA created a small pluggable framework for determining the MIME type by using
+			the name of the file (e.g., extensions) and/or by reading the actual content.
+	  </para>
+    <para>
+	 		JBoss DNA defines a &MimeTypeDetector; interface that abstracts the implementation that actually determines
+			the MIME type given the name and content.
+			If the detector is able to determine the MIME type, it simply returns
+			it as a string.  If not, it merely returns null.  Note, however, that a detector must be thread-safe.
+			Here is the interface:
+		</para>
+		<programlisting>
+ at ThreadSafe
+public interface &MimeTypeDetector; {
+
+    /**
+     * Returns the MIME-type of a data source, using its supplied content and/or its supplied name, 
+     * depending upon the implementation. If the MIME-type cannot be determined, either a "default" 
+     * MIME-type or <code>null</code> may be returned, where the former will prevent earlier 
+     * registered MIME-type detectors from being consulted.
+     * 
+     * @param name The name of the data source; may be <code>null</code>.
+     * @param content The content of the data source; may be <code>null</code>.
+     * @return The MIME-type of the data source, or optionally <code>null</code> 
+     * if the MIME-type could not be determined.
+     * @throws &IOException; If an error occurs reading the supplied content.
+     */
+    &String; mimeTypeOf( &String; name, &InputStream; content ) throws &IOException;;
+}</programlisting>
+		<para>
+			To use a detector, simply invoke the method and supply the name of the content (e.g., the name of the file, with the extension)
+			and the &InputStream; to the actual binary content.  The result is a &String; containing the 
+			<ulink url="http://www.iana.org/assignments/media-types/">MIME type</ulink>
+		  (e.g., "text/plain") or null if the MIME type cannot be determined.  Note that the name or &InputStream; may be
+			null, making this a very versatile utility.
+		</para>
+		<para>
+			Once again, you can obtain a &MimeTypeDetector; from the &ExecutionContext;.  JBoss DNA provides and uses by
+			default an implementation that uses only the name (the content is ignored), looking at the name's extension
+			and looking for a match in a small listing (loaded from the <code>org/jboss/dna/graph/mime.types</code> loaded from the classpath).
+			You can add extensions by copying this file, adding or correcting the entries, and then placing your updated file in the
+			expected location on the classpath.
+		</para>
+		<para>
+			Of course, you can always use a different &MimeTypeDetector; by creating a subcontext and supplying your implementation:
+		</para>
+<programlisting>
+&MimeTypeDetector; myDetector = ...
+&ExecutionContext; contextWithMyDetector = context.with(myDetector);
+</programlisting>
+	</sect1>
+	<sect1>
+		<title>Property factory and value factories</title>
+		<para>
+			Two other components are made available by the &ExecutionContext;.  The &PropertyFactory; is an interface
+			that can be used to create &Property; instances, which are used throughout the graph API.  The &ValueFactories;
+			interface provides access to a number of different factories for different kinds of property values.
+			These will be discussed in much more detail in the next chapter.  But like the other components that
+			are in an &ExecutionContext;, you can create subcontexts with different implementations:
+		</para>
+<programlisting>
+&PropertyFactory; myPropertyFactory = ...
+&ExecutionContext; contextWithMyPropertyFactory = context.with(myPropertyFactory);
+</programlisting>
+		<para>and</para>
+<programlisting>
+&ValueFactories; myValueFactories = ...
+&ExecutionContext; contextWithMyValueFactories = context.with(myValueFactories);
+</programlisting>
+		<para>
+			Of course, implementing your own factories is a pretty advanced topic, and it will likely be something you do not
+			need to do in your application.
+		</para>
+	</sect1>
+	<sect1>
+		<title>Summary</title>
+		<para>
+			In this chapter, we introduced the &ExecutionContext; as a representation of the environment in which many of the
+			JBoss DNA components operate.  &ExecutionContext; provides a very simple but powerful way to inject commonly-needed
+			facilities throughout the system.
+		</para>
+		<para>
+			In the <link linkend="graph-api">next chapter</link>, we'll dive into Graph API and will introduce the notion of
+			nodes, paths, names, and properties, that are so essential and used throughout JBoss DNA.
+		</para>
+	</sect1>
+</chapter>
+


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

Deleted: trunk/docs/reference/src/main/docbook/en-US/content/core/mimetypes.xml
===================================================================
--- trunk/docs/reference/src/main/docbook/en-US/content/core/mimetypes.xml	2009-06-08 16:12:59 UTC (rev 998)
+++ trunk/docs/reference/src/main/docbook/en-US/content/core/mimetypes.xml	2009-06-08 19:58:59 UTC (rev 999)
@@ -1,204 +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
-  -->
-<!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="mimetypes">
-  <title>MIME types</title>
-  <para>
-  	JBoss DNA often needs the ability to determine the MIME type for some binary content.  When uploading content into
-		a repository, we may want to add the MIME type as metadata.  Or, we may want to make some processing decisions
-		based upon the MIME type.  So, JBoss DNA created a small pluggable framework for determining the MIME type by using
-		the name of the file (e.g., extensions) and/or by reading the actual content.  Technically, the framework
-		delegates this to one or more extensions.  And we've provided one extension that does a very good job at 
-		determining the MIME type from a large variety of file types.  But if that isn't sufficient, you can always
-		incorporate your own detector into JBoss DNA.
-  </para>
-	<para>
-		To use this system, you simply invoke a static method and supply the name of the content (e.g., the name of the file, with the extension)
-		and the &InputStream; to the actual binary content:
-	</para>
-	<programlisting>&MimeType;.of(name,content)</programlisting>
-	<para>
-		The result is a &String; containing the <ulink url="http://www.iana.org/assignments/media-types/">MIME type</ulink>
-	  (e.g., "text/plain") or null if the MIME type cannot be determined.  Note that the name or &InputStream; may be
-		null, making this a very versatile utility.
-	</para>
-  <sect1 id="detectors">
-    <title>JBoss DNA MIME type detectors</title>
-    <para>
-    	The principle component in this framework is the concept of a <emphasis role="strong">detector</emphasis>.
-			A detector attempts to determine the MIME type using the name of the content (e.g., the file name)
-			and the actual content itself.  If the detector is able to determine the MIME type, it simply returns
-			it as a string.  If not, it merely returns null.  Note, however, that a detector must be thread-safe.
-    </para>
-		<para>
-			Here is the interface:
-		</para>
-		<programlisting>
-package org.jboss.dna.graph.mimetype;
- at ThreadSafe
-public interface &MimeTypeDetector; {
-
-    /**
-     * Returns the MIME-type of a data source, using its supplied content and/or
-     * its supplied name, depending upon the implementation. If the MIME-type 
-     * cannot be determined, either a "default" MIME-type or <code>null</code> may 
-     * be returned, where the former will prevent earlier registered MIME-type 
-     * detectors from being consulted.
-     * 
-     * @param name The name of the data source; may be <code>null</code>.
-     * @param content The content of the data source; may be <code>null</code>.
-     * @return The MIME-type of the data source, or optionally <code>null</code> 
-     * if the MIME-type could not be determined.
-     * @throws &IOException; If an error occurs reading the supplied content.
-     */
-    &String; mimeTypeOf( &String; name,
-                       &InputStream; content ) throws &IOException;;
-}</programlisting>
-		<para>
-			Detectors can be added to the &MimeType; class using the <code>addDetector(&MimeTypeDetectorConfig; config)</code>
-			method, where the &MimeTypeDetectorConfig; defines the name of the detector class, the name of the
-			<link linkend="classloaders">class loader</link>, a name, and a description.  It is also possible
-			to set the &ClassLoaderFactory; that the &MimeType; singleton will use.
-		</para>
-		<para>
-			We'll next look at the MIME type detectors that are provided out by JBoss DNA out of the box, and how to write your own. 
-		</para>
-    <sect2 id="dna-mimetype-detector-aperture">
-      <title>Aperture MIME type detector</title>
-      <para>
-      	The &ApertureMimeTypeDetector; class is an implementation of &MimeTypeDetector; that uses the
-				<ulink url="http://aperture.sourceforge.net/">Aperture</ulink> open-source library, which
-				is a very capable utility for determining the MIME type for a wide range of file types,
-				using both the file name and the actual content.
-      </para>
-    </sect2>
-  </sect1>
-  <sect1 id="custom-detectors">
-    <title>Writing custom detectors</title>
-	  <para>
-	  Creating a custom detector involves the following steps:
-	  <itemizedlist>
-	    <listitem>
-	      <para>Create a Maven 2 project for your detector;</para>
-	    </listitem>
-	    <listitem>
-	      <para>Implement the &MimeTypeDetector; interface with your own implementation, and create unit tests to verify
-	      the functionality and expected behavior;</para>
-	    </listitem>
-	    <listitem>
-	      <para>Add a &MimeTypeDetectorConfig; to the &MimeType; class in your application
-	      as described <link linkend="detectors">earlier</link>; and</para>
-	    </listitem>
-	    <listitem>
-	      <para>Deploy the JAR file with your implementation (as well as any dependencies), and make them available to JBoss DNA
-	      in your application.</para>
-	    </listitem>
-	  </itemizedlist>
-	  It's that simple.
-	  </para>
-	  <sect2 id="custom_detector_project">
-	    <title>Creating the Maven 2 project</title>
-	    <para>The first step is to create the Maven 2 project that you can use to compile your code and build the JARs.
-	    Maven 2 automates a lot of the work, and since you're already <link linkend="maven">set up to use Maven</link>,
-	    using Maven for your project will save you a lot of time and effort.  Of course, you don't have to use Maven 2, but then you'll
-	    have to get the required libraries and manage the compiling and building process yourself.</para>
-	    <note>
-	      <para>JBoss DNA may provide in the future a Maven archetype for creating detector projects.  If you'd find this useful
-	        and would like to help create it, please <link linkend="preface">join the community</link>.</para>
-	    </note>
-			<note>
-		    <para>
-					The <emphasis role="strong">dna-mimetype-detector-aperture</emphasis> project is a small, self-contained detector implementation that
-			    that you can use to help you get going.  Starting with this project's source and modifying it to suit your needs
-			 		may be the easiest way to get started.
-			    See the subversion repository: 
-					<ulink url="&Subversion;trunk/extensions/dna-mimetype-detector-aperture/">&Subversion;trunk/sequencers/dna-mimetype-detector-aperture/</ulink>
-			  </para>
-			</note>
-	    <para>You can create your Maven project any way you'd like.  For examples, see the <ulink url="http://maven.apache.org/guides/getting-started/index.html#How_do_I_make_my_first_Maven_project">Maven 2 documentation</ulink>.  
-	    Once you've done that, just add the dependencies in your project's <code>pom.xml</code> dependencies section:</para>
-	  	<programlisting role="XML"><![CDATA[<dependency>
-  <groupId>org.jboss.dna</groupId>
-  <artifactId>dna-common</artifactId>
-  <version>0.1</version>
-</dependency>
-<dependency>
-  <groupId>org.jboss.dna</groupId>
-  <artifactId>dna-graph</artifactId>
-  <version>0.1</version>
-</dependency>
-<dependency>
-  <groupId>org.slf4j</groupId>
-  <artifactId>slf4j-api</artifactId>
-</dependency>
-]]></programlisting>
-			<para>These are minimum dependencies required for compiling a detector.  Of course, you'll have to add
-	  		other dependencies that your sequencer needs.</para>
-	  	<para>As for testing, you probably will want to add more dependencies, such as those listed here:</para>
-			<programlisting role="XML"><![CDATA[<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>
-<!-- Logging with Log4J -->
-<dependency>
-  <groupId>org.slf4j</groupId>
-  <artifactId>slf4j-log4j12</artifactId>
-  <version>1.4.3</version>
-  <scope>test</scope>
-</dependency>
-<dependency>
-  <groupId>log4j</groupId>
-  <artifactId>log4j</artifactId>
-  <version>1.2.14</version>
-  <scope>test</scope>
-</dependency>
-]]></programlisting>
-			<para>
-				After you've created the project, simply implement the &MimeTypeDetector; interface.  And testing should be
-				quite straightforward, MIME type detectors don't require any other components.  In your tests,
-				simply instantiate your &MimeTypeDetector; implementation, supply various combinations of names and/or &InputStream;s,
-				and verify the output is what you expect.
-	  	</para>
-			<para>
-				To use in your application, create a &MimeTypeDetectorConfig; object with the name, description, and class information
-				for your detector, and add to the &MimeType; class using the <code>addDetector(&MimeTypeDetectorConfig; config)</code> method.
-				Then, just use the &MimeType; class.
-			</para>
-		</sect2>
-  </sect1>
-</chapter>

Added: trunk/docs/reference/src/main/docbook/en-US/content/mime_type_detectors/aperture.xml
===================================================================
--- trunk/docs/reference/src/main/docbook/en-US/content/mime_type_detectors/aperture.xml	                        (rev 0)
+++ trunk/docs/reference/src/main/docbook/en-US/content/mime_type_detectors/aperture.xml	2009-06-08 19:58:59 UTC (rev 999)
@@ -0,0 +1,47 @@
+<?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="aperture-mimetype-detector">
+   <title>Aperture MIME type detector</title>
+   <para>
+   	The &ApertureMimeTypeDetector; class is an implementation of &MimeTypeDetector; that uses the
+		<ulink url="http://aperture.sourceforge.net/">Aperture</ulink> open-source library, which
+		is a very capable utility for determining the MIME type for a wide range of file types,
+		using both the file name and the actual content.
+   </para>
+	<para>
+		To use, simply include the <code>dna-mime-type-detector-aperture.jar</code> file on the classpath
+		and create a new &ExecutionContext; subcontext with it:
+	</para>
+<programlisting>
+&MimeTypeDetector; myDetector = new ApertureMimeTypeDetector();
+&ExecutionContext; contextWithMyDetector = context.with(myDetector);
+</programlisting>
+</chapter>


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

Added: trunk/docs/reference/src/main/docbook/en-US/content/mime_type_detectors/custom_detectors.xml
===================================================================
--- trunk/docs/reference/src/main/docbook/en-US/content/mime_type_detectors/custom_detectors.xml	                        (rev 0)
+++ trunk/docs/reference/src/main/docbook/en-US/content/mime_type_detectors/custom_detectors.xml	2009-06-08 19:58:59 UTC (rev 999)
@@ -0,0 +1,128 @@
+<?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="custom-mimetype-detector">
+    <title>Writing custom detectors</title>
+	  <para>
+	  Creating a custom detector involves the following steps:
+	  <itemizedlist>
+	    <listitem>
+	      <para>Create a Maven 2 project for your detector;</para>
+	    </listitem>
+	    <listitem>
+	      <para>Implement the &MimeTypeDetector; interface with your own implementation, and create unit tests to verify
+	      the functionality and expected behavior;</para>
+	    </listitem>
+	    <listitem>
+	      <para>Add a &MimeTypeDetectorConfig; to the &MimeType; class in your application
+	      as described <link linkend="detectors">earlier</link>; and</para>
+	    </listitem>
+	    <listitem>
+	      <para>Deploy the JAR file with your implementation (as well as any dependencies), and make them available to JBoss DNA
+	      in your application.</para>
+	    </listitem>
+	  </itemizedlist>
+	  It's that simple.
+	  </para>
+	    <para>The first step is to create the Maven 2 project that you can use to compile your code and build the JARs.
+	    Maven 2 automates a lot of the work, and since you're already <link linkend="maven">set up to use Maven</link>,
+	    using Maven for your project will save you a lot of time and effort.  Of course, you don't have to use Maven 2, but then you'll
+	    have to get the required libraries and manage the compiling and building process yourself.</para>
+	    <note>
+	      <para>JBoss DNA may provide in the future a Maven archetype for creating detector projects.  If you'd find this useful
+	        and would like to help create it, please <link linkend="preface">join the community</link>.</para>
+	    </note>
+			<note>
+		    <para>
+					The <emphasis role="strong">dna-mimetype-detector-aperture</emphasis> project is a small, self-contained detector implementation that
+			    that you can use to help you get going.  Starting with this project's source and modifying it to suit your needs
+			 		may be the easiest way to get started.
+			    See the subversion repository: 
+					<ulink url="&Subversion;trunk/extensions/dna-mimetype-detector-aperture/">&Subversion;trunk/sequencers/dna-mimetype-detector-aperture/</ulink>
+			  </para>
+			</note>
+	    <para>You can create your Maven project any way you'd like.  For examples, see the <ulink url="http://maven.apache.org/guides/getting-started/index.html#How_do_I_make_my_first_Maven_project">Maven 2 documentation</ulink>.  
+	    Once you've done that, just add the dependencies in your project's <code>pom.xml</code> dependencies section:</para>
+	  	<programlisting role="XML"><![CDATA[<dependency>
+  <groupId>org.jboss.dna</groupId>
+  <artifactId>dna-common</artifactId>
+  <version>0.1</version>
+</dependency>
+<dependency>
+  <groupId>org.jboss.dna</groupId>
+  <artifactId>dna-graph</artifactId>
+  <version>0.1</version>
+</dependency>
+<dependency>
+  <groupId>org.slf4j</groupId>
+  <artifactId>slf4j-api</artifactId>
+</dependency>
+]]></programlisting>
+			<para>These are minimum dependencies required for compiling a detector.  Of course, you'll have to add
+	  		other dependencies that your sequencer needs.</para>
+	  	<para>As for testing, you probably will want to add more dependencies, such as those listed here:</para>
+			<programlisting role="XML"><![CDATA[<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>
+<!-- Logging with Log4J -->
+<dependency>
+  <groupId>org.slf4j</groupId>
+  <artifactId>slf4j-log4j12</artifactId>
+  <version>1.4.3</version>
+  <scope>test</scope>
+</dependency>
+<dependency>
+  <groupId>log4j</groupId>
+  <artifactId>log4j</artifactId>
+  <version>1.2.14</version>
+  <scope>test</scope>
+</dependency>
+]]></programlisting>
+			<para>
+				After you've created the project, simply implement the &MimeTypeDetector; interface.  And testing should be
+				quite straightforward, MIME type detectors don't require any other components.  In your tests,
+				simply instantiate your &MimeTypeDetector; implementation, supply various combinations of names and/or &InputStream;s,
+				and verify the output is what you expect.
+	  	</para>
+			<para>
+				To use in your application, create a &MimeTypeDetectorConfig; object with the name, description, and class information
+				for your detector, and add to the &MimeType; class using the <code>addDetector(&MimeTypeDetectorConfig; config)</code> method.
+				Then, just use the &MimeType; class.
+			</para>
+</chapter>


Property changes on: trunk/docs/reference/src/main/docbook/en-US/content/mime_type_detectors/custom_detectors.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	2009-06-08 16:12:59 UTC (rev 998)
+++ trunk/docs/reference/src/main/docbook/en-US/custom.dtd	2009-06-08 19:58:59 UTC (rev 999)
@@ -78,6 +78,7 @@
 <!ENTITY Property						       		"<ulink url='&API;graph/property/Property.html'><interface>Property</interface></ulink>">
 <!ENTITY ValueFactories       				"<ulink url='&API;graph/property/ValueFactories.html'><interface>ValueFactories</interface></ulink>">
 <!ENTITY NamespaceRegistry       			"<ulink url='&API;graph/property/NamespaceRegistry.html'><interface>NamespaceRegistry</interface></ulink>">
+<!ENTITY Namespace				       			"<ulink url='&API;graph/property/NamespaceRegistry.Namespaces.html'><interface>Namespace</interface></ulink>">
 <!ENTITY PropertyFactory       				"<ulink url='&API;graph/property/PropertyFactory.html'><interface>PropertyFactory</interface></ulink>">
 <!ENTITY PathNotFoundException				"<ulink url='&API;graph/property/PathNotFoundException.html'><classname>PathNotFoundException</classname></ulink>">
 <!ENTITY RepositorySource       			"<ulink url='&API;graph/connector/RepositorySource.html'><interface>RepositorySource</interface></ulink>">

Modified: trunk/docs/reference/src/main/docbook/en-US/master.xml
===================================================================
--- trunk/docs/reference/src/main/docbook/en-US/master.xml	2009-06-08 16:12:59 UTC (rev 998)
+++ trunk/docs/reference/src/main/docbook/en-US/master.xml	2009-06-08 19:58:59 UTC (rev 999)
@@ -81,11 +81,9 @@
 			  JCR-related components are covered in the <link linkend="jcr-part">next part</link>.
 			</para>
 		</partintro>
-		<xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="content/core/classloaders.xml"/>
-		<xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="content/core/environment.xml"/>
+		<xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="content/core/execution_context.xml"/>
 	  <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="content/core/connector.xml"/>
 	  <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="content/core/sequencing.xml"/>
-	  <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="content/core/mimetypes.xml"/>
 	  <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="content/core/configuration.xml"/>
 	</part>
 	<part id="jcr-part">
@@ -135,5 +133,17 @@
   	<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"/>
 	</part>
+	<part id="provied-mime-type-detectors-part">
+		<title>Provided MIME type detectors</title>
+		<partintro>
+			<para>
+			  The JBoss DNA project provides a number of <link linkend="mime-type-detectors">MIME type detectors</link> out-of-the-box.
+			  These are ready to be used by simply including them in the classpath and 
+			  <link linkend="mime-type-detectors">setting up the &ExecutionContext;</link> appropriately.
+			</para>
+		</partintro>
+  	<xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="content/mime_type_detectors/aperture.xml"/>
+  	<xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="content/mime_type_detectors/custom_detectors.xml"/>
+	</part>
 	<xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="content/future.xml"/>
 </book>



From dna-commits at lists.jboss.org  Mon Jun  8 18:41:58 2009
From: dna-commits at lists.jboss.org (dna-commits at lists.jboss.org)
Date: Mon, 08 Jun 2009 18:41:58 -0400
Subject: [dna-commits] DNA SVN: r1000 -
	trunk/docs/gettingstarted/src/main/docbook/en-US/content.
Message-ID: <E1MDnXS-00032G-4x@committer01.frg.pub.inap.atl.jboss.com>

Author: bcarothers
Date: 2009-06-08 18:41:58 -0400 (Mon, 08 Jun 2009)
New Revision: 1000

Modified:
   trunk/docs/gettingstarted/src/main/docbook/en-US/content/use_cases.xml
Log:
Redacted a reference to SOA registries

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	2009-06-08 19:58:59 UTC (rev 999)
+++ trunk/docs/gettingstarted/src/main/docbook/en-US/content/use_cases.xml	2009-06-08 22:41:58 UTC (rev 1000)
@@ -68,14 +68,6 @@
 			resource declarations, documentation, presentations, ontologies, etc.
 		</para>
 		<para>
-			It is also desirable that the service registry can provide accurate and up-to-date information about where the services are deployed
-			and their current health.  The best way to do this would be to access this information directly from the other components of the SOA, 
-			such as the Enterprise Service Bus and the management/monitoring system. JBoss DNA connectors might allow the service registry
-			to access an ESB to discover which services are deployed, which are running, and automatically annotate the services in the registry
-			with this dynamic information.  In fact, the service registry could cache this information to provide a safe and low-impact mechanism
-			for obtaining this information to other applications without having each application hit the ESB.
-		</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 
 			(dev, test, production, etc.).



From dna-commits at lists.jboss.org  Mon Jun  8 18:42:14 2009
From: dna-commits at lists.jboss.org (dna-commits at lists.jboss.org)
Date: Mon, 08 Jun 2009 18:42:14 -0400
Subject: [dna-commits] DNA SVN: r1001 - in
	trunk/docs/reference/src/main/docbook/en-US: content/jcr and
	1 other directory.
Message-ID: <E1MDnXi-00033A-4g@committer01.frg.pub.inap.atl.jboss.com>

Author: bcarothers
Date: 2009-06-08 18:42:13 -0400 (Mon, 08 Jun 2009)
New Revision: 1001

Modified:
   trunk/docs/reference/src/main/docbook/en-US/content/jcr/jcr.xml
   trunk/docs/reference/src/main/docbook/en-US/custom.dtd
Log:
Added first cut of the new JCR chapter

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	2009-06-08 22:41:58 UTC (rev 1000)
+++ trunk/docs/reference/src/main/docbook/en-US/content/jcr/jcr.xml	2009-06-08 22:42:13 UTC (rev 1001)
@@ -40,88 +40,222 @@
   </para>
   <sect1 id="jcr-repositories">
     <title>Obtaining JCR repositories</title>
-		<para>The JCR API doesn't define how your application first obtains a reference to a &Repository; implementation.
-			With JBoss DNA, you simply creating a &JcrRepository; object and supply
-			an &ExecutionContextFactory; and a &RepositoryConnectionFactory; (such as a &RepositoryLibrary; or &RepositoryService;).
-			Since &JcrRepository; implements the JCR &Repository; interface, from this point forward you can just use the
-			standard JCR API.
+		<para>Add reference to how to use JcrConfiguration to obtain a JcrEngine.
 		</para>
-		<note>
-			<para>
-				For more information about the &ExecutionContextFactory; and &RepositoryConnectionFactory; classes, see
-				the chapter on <link linkend="environment">setting up a JBoss DNA environment</link> and
-				<link linkend="repositories">setting up the &RepositoryService;</link>.
-			</para>
-		</note>
   </sect1>
   <sect1 id="jcr-sessions">
     <title>Creating JCR sessions</title>
-		<para>Creating sessions is done using a &Repository; one of its <code>login(...)</code> methods, where the
-			name of the workspace corresponds to the name of the &RepositorySource;:
+		<para>Once you have obtained a reference to the JCR &Repository;, you can create a JCR session using one of its
+			<code>login(...)</code> methods.  The <ulink url="&JSR170;">JSR-170</ulink> specification provides four login methods.
 		</para>
+		<para>The first method allows the implementation to choose its own security context to create a session in the default workspace
+		for the repository.  The JBoss DNA JCR implementation uses the security context from the current &AccessControlContext;.  This implies
+		that this method will throw a &LoginException; if it is not executed as a &PrivilegedAction;.  Here is one example of how this might  
+		work:
     <programlisting>
-&JcrRepository; jcrRepository = new &JcrRepository;(contextFactory, sources);
-&Session; session = jcrRepository.login(sourceName);
-</programlisting>
-		<para>
-			Now, this code doesn't do any authentication; it essentially trusts the caller has the appropriate privileges.
-			Normally, your application will need to authenticate the user, so let's look at how that's done.
+Subject subject = ...;
+&Session; session = (&Session;) Subject.doAsPrivileged(subject, new PrivilegedExceptionAction&lt;&Session;&gt;() {
+    public Session run() throws Exception {
+        return repository.login();
+    }}, AccessController.getContext());
+</programlisting>	
+		This approach will yield a session with the same user name and roles as <code>subject</code>.  There is a comparable
+		version of <code>login(...)</code> that allows the workspace to be specified by name.
+    <programlisting>
+Subject subject = ...;
+final &String; workspaceName = ...;
+&Session; session = (&Session;) Subject.doAsPrivileged(subject, new PrivilegedExceptionAction&lt;&Session;&gt;() {
+    public Session run() throws Exception {
+        return repository.login(workspaceName);
+    }}, AccessController.getContext());
+</programlisting>	
 		</para>
-		<para>
-			As we mentioned in the <link linkend="security">security section</link>, JBoss DNA uses JAAS for authentication
-			and authorization.  So how does this work with the JCR API?
+		<para>It is also possible to supply the &Credentials; directly as part of the login process, although JBoss DNA imposes
+		some requirements on what types of &Credentials; may be supplied.  The simplest way is to provide a &SimpleCredentials; object.
+		These credentials will be validated against the JAAS realm named "dna-jcr" unless another realm name is provided as an option 
+		during the JCR repository configuration.  For example:
+	    <programlisting>
+&String; userName = ...;
+char[] password = ...;
+&Session; session = repository.login(new &SimpleCredentials;(userName, password));
+</programlisting>	
+		The credentials-based <code>login(...)</code> method also supports an optional workspace name.
+	    <programlisting>
+&String; userName = ...;
+char[] password = ...;
+&String; workspaceName = ...;
+&Session; session = repository.login(new &SimpleCredentials;(userName, password), workspaceName);
+</programlisting>	
+		If a &LoginContext; is available for the user, that can be used as part of the credentials to authenticate the user with
+		JBoss DNA instead.  This snippet uses an anonymous class to provide the login context, but any class with a <code>&LoginContext; getLoginContext()</code>
+		method can be used as well.
+	    <programlisting>
+final &LoginContext; loginContext = ...;
+&Session; session = repository.login(new &Credentials;() {
+	&LoginContext; loginContext getLoginContext() {
+		return loginContext;
+	}
+}, workspaceName);
+</programlisting>			
+		Servlet-based applications may wish to reuse the authentication information from &HttpServletRequest; instead.  Please note that 
+		the example below assumes that the servlet has a security constraint that prevents unauthenticated access.
+	    <programlisting>
+&HttpServletRequest; request = ...;
+&ServletSecurityContext; securityContext = new ServletSecurityContext(request);
+&Session; session = repository.login(new &SecurityContextCredentials;(securityContext);
+</programlisting>			
+		Once the &Session; is obtained, the repository content can be access and modified like any other JCR repository.  No roles are required to connect
+		to any workspace at this time.  Restrictions on workspace connections will likely be added to JBoss DNA in the near future.  The roles from the JAAS
+		information or the &HttpServletRequest; are used to control read and write access to the repository.  Please see the <ulink linkend="dna_jcr_security">JCR Security section</ulink>
+		for more details on how access is controlled.
 		</para>
-		<para>The JCR API defines a &Credentials; marker interface, an instance of which can be passed to the
-		  <code>&Session;.login(...)</code> method.  Rather than provide a concrete implementation of this interface, JBoss DNA
-		  allows you to pass any implementation of &Credentials; that also has one of the following methods:
-		  <itemizedlist>
-			  <listitem>
-					<para><code>getLoginContext()</code> that returns a &LoginContext; instance.</para>
-				</listitem>
-			  <listitem>
-					<para><code>getAccessControlContext()</code> that returns a &AccessControlContext; instance.</para>
-				</listitem>
-			</itemizedlist>
-			This way, your application can obtain the JAAS &LoginContext; or &AccessControlContext; however it wants,
-			and then merely passes that into DNA through the JCR &Credentials;.  No interfaces or classes specific to JBoss DNA are required.
-		</para>
-		<para>
-			The following code shows how this is done, using an anonymous inner class for the &Credentials; implementation.
-		</para>
-    <programlisting>
-&CallbackHandler; callbackHandler = // as needed by your app, according to JAAS
-final &LoginContext; loginContext = new &LoginContext;("MyAppContextName",callbackHandler);
-
-// Now pass to JBoss DNA to create a JCR Session ...
-&Credentials; credentials = new &Credentials;() {
-public &LoginContext; getLoginContext() { return loginContext; }
-};
-&JcrRepository; jcrRepository = new &JcrRepository;(contextFactory, sources);
-&Session; session = jcrRepository.login(credentials, sourceName);
-</programlisting>
-  </sect1>
+	</sect1>
 	<sect1>
-		<title>JCR Support</title>
+		<title>JCR Specification Support</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, nor are all of the update methods that make up Level 2.
-			So while the current implementation provides 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>
+		The JBoss DNA JCR implementation will not be JCR-compliant prior to 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.
+		</para> 
 		<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.  Some of the L2 features such as workspace cloning and updating, corresponding nodes, 
+				and referential integrity for <code>REFERENCE</code> properties are 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.
+			</para>
+		</sect2>
+		<sect2>
 			<title>Optional Features</title>
+			<para>
+				JBoss DNA does not currently support any of the optional JCR features.  Currently, the observation optional feature is planned to be complete prior
+				to the 1.0 release.  The locking optional feature <emphasis>may</emphasis> be implemented in this timeframe as well.  
+				<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.
+					</para>
+				</note>
+			</para>
 		</sect2>
-		<sect2>
+		<sect2 id="dna_jcr_security">
 			<title>JCR Security</title>
+			<para>
+				Although the <ulink url="&JSR170;">JSR-170</ulink> specification requires implementation of the <code>Session.checkPermission(String, String)</code> method,
+				it allows implementors to choose the granularity of their access controls.  JBoss DNA supports coarse-grained, role-based access control at the repository 
+				and workspace level.
+			</para>
+			<para>
+				JBoss DNA currently defines two permissions: <code>READONLY</code> and <code>READWRITE</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) has either role, the session will have
+				the corresponding access to all workspaces within the repository.  That is, having the <code>READONLY</code> role implies that <code>Session.checkPermission(path, "read")</code>
+				will not throw an &AccessDeniedException;  for any value of <code>path</code> in any workspace in the repository.  Similarly, having the <code>READWRITE</code> 
+				role implies that <code>Session.checkPermission(path, actions)</code> will not throw an &AccessDeniedException; for any values of <code>path</code> and 
+				<code>actions</code>.
+				  
+				<note>
+					<para> In this release, JBoss DNA does not properly check for actions or even check that the <code>actions</code> parameter passed into 
+						<code>Session.checkPermission(...)</code> is even valid.  This will be corrected prior to the 1.0 release.
+					</para>
+				</note> 
+				
+				It is also possible to grant access only to one or more named workspaces.  For a workspace named "staging", this can be done by assigning a role named 
+				<code>READONLY.staging</code>.  Appending <code>"." + workspaceName</code> to the <code>READWRITE</code> role works as well.
+			</para>
+			<para>
+				As a final note, the JBoss DNA JCR implementation will likely have additional security roles added prior to the 1.0 release.  A <code>CONNECT</code> role
+				is already being used by the DNA REST Server to control whether users have access to the repository through that means.   
+			</para>
 		</sect2>
 		<sect2>
-			<title>Node Type Registration</title>
+			<title>Built-In Node Types</title>
+			<para>Add description of the DNA built-in node types.</para>
 		</sect2>
+		<sect2>
+			<title>Custom Node Type Registration</title>
+			<para>
+				Although the <ulink url="&JSR170;">JSR-170</ulink> specification does not require support for registration of custom types, JBoss DNA supports this extremely
+				useful feature.  Custom node types can be added at startup, as noted above or at runtime through a DNA-specific interface.  JBoss DNA supports defining node
+				types either through a <ulink url="&JSR283;">JSR-283</ulink>-like template approach or through the use of &CND; (CND) files.
+				Both type registration mechanisms are supported equally within JBoss DNA, although the CND approach for defining node types is recommended.
+				<note>
+					<para>JBoss DNA also supports defining custom node types to load at startup.  This is discussed in more detail
+					in the next chapter.
+					</para>
+				</note>
+			</para>
+			<para>
+				Although the JSR-283 specification is not yet final, it does provide a useful means of programatically defining JCR node types.  JBoss DNA supports a comparable
+				node type definition API that implements the functionality from the specification, albeit with classes in an <code>org.jboss.dna.jcr</code> package.  The intent
+				is to deprecate these classes and replace their usage with the JSR-283 equivalents after JBoss DNA fully supports in the JSR-283 specification in a future release.
+				Node types can be defined like so:
+	    <programlisting>
+&Session; session = ... ;
+NodeTypeManager nodeTypeManager = session.getWorkspace().getNodeTypeManager();
+
+// Declare a mixin node type named "searchable" (with no namespace)
+NodeTypeTemplate nodeType = nodeTypeManager.createNodeTypeTemplate();
+nodeType.setName("searchable");
+nodeType.setMixin(true);
+nodeType.getNodeDefinitionTemplates().add(childNode);
+
+// Add a mandatory child named "source" with a required primary type of "nt:file" 
+NodeDefinitionTemplate childNode = nodeTypeManager.createNodeDefinitionTemplate();
+childNode.setName("source");
+childNode.setMandatory(true);
+childNode.setRequiredPrimaryTypeNames(new String[] { "nt:file" });
+childNode.setDefaultPrimaryType("nt:file");
+
+// Add a multi-valued STRING property named "keywords"
+PropertyDefinitionTemplate property = nodeTypeManager.createPropertyDefinitionTemplate();
+property.setName("keywords");
+property.setMultiple(true);
+property.setRequiredType(PropertyType.STRING);
+nodeType.getPropertyDefinitionTemplates().add(property);
+
+// Register the custom node type
+nodeTypeManager.registerNodeType(nodeType);
+</programlisting>	
+			Residual properties and child node definitions can also be defined simply by not calling <code>setName</code> on 
+			the template.
+			</para>
+			<para>
+			Custom node types can be defined more succinctly through the &CND; file format.  In fact, this is how JBoss
+			DNA defines its built-in node types.  An example CND file that declares the same node type as above would be:
+<programlisting>
+[searchable] mixin
+- keywords (string) multiple
++ source (nt:file) = nt:file
+</programlisting>	
+			This definition could then be registered with the following code snippet.
+<programlisting>
+
+String pathToCndFileInClassLoader = ...;
+CndNodeTypeSource nodeTypeSource = new CndNodeTypeSource(pathToCndFileInClassLoader);
+
+for (Problem problem : nodeTypeSource.getProblems()) {
+    System.err.println(problem);
+}
+if (!nodeTypeSource.isValid()) {
+    throw new IllegalStateException("Problems loading node types");
+}
+
+&Session; session = ... ;
+NodeTypeManager nodeTypeManager = session.getWorkspace().getNodeTypeManager();
+nodeTypeManager.registerNodeTypes(nodeTypeSource);
+</programlisting>
+				<note>
+					<para> JBoss DNA does not yet support a simple means on unregistering types at this time, so be careful before registering types outside of a 
+					sandboxed environment.
+					</para>
+				</note> 	
+
+			</para>
+		</sect2>
 	</sect1>
 	<sect1>
 		<title>Summary</title>
 		<para>
-			In this chapter, we covered how to use JCR with JBoss DNA.  Now that you know how JBoss DNA repositories work,
+			In this chapter, we covered how to use JCR with JBoss DNA and learned about how it implements the JCR specification.  Now that you know how JBoss DNA repositories work,
 			and how to use JCR to work with DNA repositories, we'll move on in 
 			the <link linkend="sequencing">next chapter</link> to describing in detail how the sequencing of file content works.
 		</para>

Modified: trunk/docs/reference/src/main/docbook/en-US/custom.dtd
===================================================================
--- trunk/docs/reference/src/main/docbook/en-US/custom.dtd	2009-06-08 22:41:58 UTC (rev 1000)
+++ trunk/docs/reference/src/main/docbook/en-US/custom.dtd	2009-06-08 22:42:13 UTC (rev 1001)
@@ -28,6 +28,8 @@
 <!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 CND			      		"<ulink url='http://jackrabbit.apache.org/node-type-notation.html'>Compact Node Definition</ulink>">
+
 <!-- Types in JRE -->
 
 <!ENTITY String							      		"<ulink url='&Java;java/lang/String.html'><interface>String</interface></ulink>">
@@ -38,6 +40,7 @@
 <!ENTITY IOException				      		"<ulink url='&Java;java/io/IOException.html'><classname>IOException</classname></ulink>">
 <!ENTITY ClassLoader				      		"<ulink url='&Java;java/lang/ClassLoader.html'><interface>ClassLoader</interface></ulink>">
 <!ENTITY AccessControlContext      		"<ulink url='&Java;java/security/AccessController.html'><classname>AccessControlContext</classname></ulink>">
+<!ENTITY PrivilegedAction			      		"<ulink url='&Java;java/security/PrivilegedAction.html'><classname>PrivilegedAction</classname></ulink>">
 <!ENTITY LoginContext				      		"<ulink url='&Java;javax/security/auth/login/LoginContext.html'><classname>LoginContext</classname></ulink>">
 <!ENTITY Subject						      		"<ulink url='&Java;javax/security/auth/Subject.html'><classname>Subject</classname></ulink>">
 <!ENTITY CallbackHandler		      		"<ulink url='&Java;javax/security/auth/callback/CallbackHandler.html'><interface>CallbackHandler</interface></ulink>">
@@ -45,6 +48,7 @@
 <!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 HttpServletRequest			      		"<ulink url='&Java;javax/servlet/http/HttpServletRequest.html'><classname>HttpServletRequest</classname></ulink>">
 
 
 <!-- Types in JCR API -->
@@ -53,6 +57,8 @@
 <!ENTITY Session						       		"<interface>Session</interface>">
 <!ENTITY Credentials					       	"<interface>Credentials</interface>">
 <!ENTITY SimpleCredentials					  "<interface>SimpleCredentials</interface>">
+<!ENTITY LoginException						  "<interface>LoginException</interface>">
+<!ENTITY AccessDeniedException						  "<interface>AccessDeniedException</interface>">
 
 <!-- Types in dna-common -->
 
@@ -72,6 +78,7 @@
 <!ENTITY ExecutionContext		       		"<ulink url='&API;graph/ExecutionContext.html'><classname>ExecutionContext</classname></ulink>">
 <!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 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>">
 <!ENTITY PathSegment				       		"<ulink url='&API;graph/property/Path.Segment.html'><interface>Path.Segment</interface></ulink>">



From dna-commits at lists.jboss.org  Mon Jun  8 23:30:34 2009
From: dna-commits at lists.jboss.org (dna-commits at lists.jboss.org)
Date: Mon, 08 Jun 2009 23:30:34 -0400
Subject: [dna-commits] DNA SVN: r1002 - in
	trunk/docs/reference/src/main/docbook/en-US: content/core and
	1 other directory.
Message-ID: <E1MDs2k-0007Pt-QA@committer01.frg.pub.inap.atl.jboss.com>

Author: rhauch
Date: 2009-06-08 23:30:34 -0400 (Mon, 08 Jun 2009)
New Revision: 1002

Added:
   trunk/docs/reference/src/main/docbook/en-US/content/core/graph.xml
Modified:
   trunk/docs/reference/src/main/docbook/en-US/master.xml
Log:
More Reference Guide content on the graph api.

Added: trunk/docs/reference/src/main/docbook/en-US/content/core/graph.xml
===================================================================
--- trunk/docs/reference/src/main/docbook/en-US/content/core/graph.xml	                        (rev 0)
+++ trunk/docs/reference/src/main/docbook/en-US/content/core/graph.xml	2009-06-09 03:30:34 UTC (rev 1002)
@@ -0,0 +1,256 @@
+<?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="graph_api">
+  <title>Graph API</title>
+  <para>
+		One of the central concepts within JBoss DNA is that of its <emphasis>graph model</emphasis>.
+		Information is structured into a hierarchy of nodes with properties, where nodes in the hierarchy
+		are identified by their path (and/or identifier properties).  Properties are identified by
+		a name that incorporates a namespace and local name, and contain one or more property values
+		consisting of normal Java strings, names, paths, URIs, booleans, longs, doubles, decimals, binary content,
+		dates, UUIDs, references to other nodes, or any other serializable object.
+	</para>
+	<para>
+		This graph model is used throughout JBoss DNA: it forms the basis for the 
+		<link linkend="connector_framework">connector framework</link>, it is used by the 
+		<link linkend="sequencing_framework">sequencing framework</link> for the generated output,
+		and it is what the <link linkend="jcr">JCR implementation</link> uses internally to access and operate
+		on the repository content.
+	</para>
+	<para>
+		Therefore, this chapter provides essential information that will be essential to really understanding
+		how the connectors, sequencers, and other JBoss DNA features work.
+	</para>
+	<sect1 id="graph-names">
+		<title>Names</title>
+		<para>
+			JBoss DNA uses names to identify quite a few different types of objects.  As we'll soon see, each property
+			of a node is given by a name, and each segment in a path is comprised of a name.  Therefore,
+			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
+			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
+			clashes in names that have an equivalent same local part.
+		</para>
+		<para>
+			All names are immutable, which means that once a &Name; object is created, it will never change.
+			This characteristic makes it much easier to write thread-safe code - the objects never change and therefore
+			require no locks or synchronization to guarantee atomic reads.  This is a technique that is more and more
+			often found in newer languages and frameworks that simplify concurrent operations.
+		</para>
+		<para>
+			&Name; is also a interface rather than a concrete class:
+		</para>
+<programlisting>
+</programlisting>
+		<para>
+			This means that you need to use a factory to create &Name; instances.
+		</para>
+		<para>
+			The use of a factory may seem like a disadvantage and unnecessary complexity, but there actually
+			are several benefits.  First, it hides the concrete implementations, which is very appealing if
+			an optimized implementation can be chosen for particular situations.  It also simplifies the
+			usage, since &Name; only has a few methods.  Third, it allows the factory to cache or pool instances
+			where appropriate to help conserve memory.  Finally, the very same factory actually serves as
+			a <emphasis>conversion</emphasis> mechanism from other forms.  We'll actually see more of this
+			later in this chapter, when we talk about other kinds of <link linkend="graph-properties">property values</link>.
+		</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.
+		</para>
+		<para>
+			We mentioned earlier that names are qualified with a namespace, and namespaces are identified by URIs.
+			Also, the local part of the names can contain any character.  So what do the string representation of names look like?
+		</para>
+		<para>
+			The &Name; interface defines a number of <code>getString(...)</code> methods that take different parameters.
+			The <code>getString()</code> method (which is called by the <code>toString()</code> method) will simply output
+			the namespace URI followed by a ':' and an local name (encoded with a default &TextEncoder; implementation, which
+			will be discussed in the <link linkend="graph-encoders">next section</link>).  If you want to use the
+			namespace prefix, then simply use one of the <code>getString(...)</code> methods that takes a &NamespaceRegistry;
+			parameter.
+		</para>
+		<para>
+			We'll see how names are used later one, but one more point to make:  &Name; is both serializable and comparable,
+			and all implementations should support <code>equals(...)</code> and <code>hashCode()</code> so that &Name; can
+			be used as a key in a hash-based map.
+		</para>
+	</sect1>
+	<sect1 id="graph-paths">
+		<title>Paths</title>
+		<para>
+			Another important concept in JBoss DNA's graph model is that of a <emphasis>path</emphasis>, which provides a way
+			of locating a node within a hierarchy.  JBoss DNA's &Path; object is actually comprised of an ordered sequence
+			of &PathSegment; objects:
+		</para>
+		<programlisting>
+public interface &Path; extends Comparable<Path>, Iterable<&PathSegment;>, Serializable {
+
+    /**
+     * Return the number of segments in this path.
+     * @return the number of path segments
+     */
+    public int size();
+
+    /**
+     * Return whether this path represents the root path.
+     * @return true if this path is the root path, or false otherwise
+     */
+    public boolean isRoot();
+
+		/**
+		 * {@inheritDoc}
+		 */
+		public Iterator<&PathSegment;> iterator();
+
+		/**
+		 * Obtain a copy of the segments in this path. None of the segments are encoded.
+		 * @return the array of segments as a copy
+		 */
+		public &PathSegment;[] getSegmentsArray();
+
+		/**
+		 * Get an unmodifiable list of the path segments.
+		 * @return the unmodifiable list of path segments; never null
+		 */
+		public List<&PathSegment;> getSegmentsList();
+		/**
+		 * Get the last segment in this path.
+		 * @return the last segment, or null if the path is empty
+		 */
+		public &PathSegment; getLastSegment();
+
+		/**
+		 * Get the segment at the supplied index.
+		 * @param index the index
+		 * @return the segment
+		 * @throws IndexOutOfBoundsException if the index is out of bounds
+		 */
+		public &PathSegment; getSegment( int index );
+
+		/**
+		 * Return an iterator that walks the paths from the root path down to this path. This method 
+		 * always returns at least one path (the root returns an iterator containing itself).
+		 * @return the path iterator; never null
+		 */
+		public Iterator<&Path;> pathsFromRoot();
+
+		/**
+		 * Return a new path consisting of the segments starting at <code>beginIndex</code> index (inclusive). 
+		 * This is equivalent to calling <code>path.subpath(beginIndex,path.size()-1)</code>.
+		 * @param beginIndex the beginning index, inclusive.
+		 * @return the specified subpath
+		 * @exception IndexOutOfBoundsException if the <code>beginIndex</code> is negative or larger 
+		 *            than the length of this <code>Path</code> object
+		 */
+		public &Path; subpath( int beginIndex );
+
+		/**
+		 * Return a new path consisting of the segments between the <code>beginIndex</code> index (inclusive)
+		 * and the <code>endIndex</code> index (exclusive).
+		 * @param beginIndex the beginning index, inclusive.
+		 * @param endIndex the ending index, exclusive.
+		 * @return the specified subpath
+		 * @exception IndexOutOfBoundsException if the <code>beginIndex</code> is negative, or 
+		 *            <code>endIndex</code> is larger than the length of this <code>Path</code> 
+		 *            object, or <code>beginIndex</code> is larger than <code>endIndex</code>.
+		 */
+		public &Path; subpath( int beginIndex, int endIndex );
+
+    ...
+
+}   </programlisting>
+		<para>
+			where each &PathSegment; is comprised of a &Name; and <emphasis>same-name-sibling index</emphasis>:
+		</para>
+		<programlisting>
+		</programlisting>
+		<para>
+			
+		</para>
+		
+	</sect1>
+	<sect1 id="graph-properties">
+		<title>Properties</title>
+		<para>
+			
+		</para>
+	</sect1>
+	<sect1 id="graph-value-factories">
+		<title>Values and value factories</title>
+		<para>
+			
+		</para>
+	</sect1>
+	<sect1 id="graph-encoders">
+		<title>Encoders and decoders</title>
+		<para>
+			String representations of &Name; and &Path; objects  mentioned earlier that names are qualified with a namespace, and namespaces are identified by URIs.
+			Also, the local part of the names can contain any character.  So what do the string representation of names look like?
+		</para>
+		<para>
+			The key is understanding that the namespaces will 
+		</para>
+		
+		
+	</sect1>
+	<sect1 id="graph-api">
+		<title>Graph API</title>
+		<para>
+			
+		</para>
+	</sect1>
+	<sect1 id="graph-requests">
+		<title>Request Model</title>
+		<para>
+			
+		</para>
+	</sect1>
+	<sect1>
+		<title>Summary</title>
+		<para>
+			In this chapter, we introduced JBoss DNA's <emphasis>graph model</emphasis> and showed the different
+			kinds of objects used to represent nodes, paths, names, and properties.  We saw how all of these objects
+			are actually immutable, and how the low-level Graph API uses this characteristic to provide a stateless
+			and thread-safe interface for working with repository content using the <emphasis>request model</emphasis>
+			used to read, update, and change content.
+		</para>
+		<para>
+			Next, we'll dive into the <link linkend="connector_framework">connector framework</link>, which builds
+			on top of the graph model and request model, allowing JBoss DNA to access the graph content stored
+			in many different kinds of systems.
+		</para>
+	</sect1>
+</chapter>


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

Modified: trunk/docs/reference/src/main/docbook/en-US/master.xml
===================================================================
--- trunk/docs/reference/src/main/docbook/en-US/master.xml	2009-06-08 22:42:13 UTC (rev 1001)
+++ trunk/docs/reference/src/main/docbook/en-US/master.xml	2009-06-09 03:30:34 UTC (rev 1002)
@@ -82,6 +82,7 @@
 			</para>
 		</partintro>
 		<xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="content/core/execution_context.xml"/>
+	  <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="content/core/graph.xml"/>
 	  <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="content/core/connector.xml"/>
 	  <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="content/core/sequencing.xml"/>
 	  <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="content/core/configuration.xml"/>



From dna-commits at lists.jboss.org  Mon Jun  8 23:30:56 2009
From: dna-commits at lists.jboss.org (dna-commits at lists.jboss.org)
Date: Mon, 08 Jun 2009 23:30:56 -0400
Subject: [dna-commits] DNA SVN: r1003 - in trunk:
	docs/reference/src/main/docbook/en-US and 1 other directories.
Message-ID: <E1MDs36-0007R1-7S@committer01.frg.pub.inap.atl.jboss.com>

Author: rhauch
Date: 2009-06-08 23:30:56 -0400 (Mon, 08 Jun 2009)
New Revision: 1003

Added:
   trunk/dna-graph/src/main/java/org/jboss/dna/graph/property/Readable.java
Modified:
   trunk/dna-graph/src/main/java/org/jboss/dna/graph/property/Name.java
   trunk/dna-graph/src/main/java/org/jboss/dna/graph/property/Path.java
   trunk/dna-graph/src/main/java/org/jboss/dna/graph/property/Property.java
   trunk/docs/reference/src/main/docbook/en-US/content/core/graph.xml
   trunk/docs/reference/src/main/docbook/en-US/custom.dtd
Log:
Added the Readable interface, which not only made the documentation more clear but also added value to the API.  Also elaborated a lot of the graph API section in the Reference Guide.

Modified: trunk/dna-graph/src/main/java/org/jboss/dna/graph/property/Name.java
===================================================================
--- trunk/dna-graph/src/main/java/org/jboss/dna/graph/property/Name.java	2009-06-09 03:30:34 UTC (rev 1002)
+++ trunk/dna-graph/src/main/java/org/jboss/dna/graph/property/Name.java	2009-06-09 03:30:56 UTC (rev 1003)
@@ -25,8 +25,6 @@
 
 import java.io.Serializable;
 import net.jcip.annotations.Immutable;
-import org.jboss.dna.common.text.TextEncoder;
-import org.jboss.dna.graph.property.Path.Segment;
 
 /**
  * A qualified name consisting of a namespace and a local name.
@@ -34,7 +32,7 @@
  * @author Randall Hauch
  */
 @Immutable
-public interface Name extends Comparable<Name>, Serializable {
+public interface Name extends Comparable<Name>, Serializable, Readable {
 
     /**
      * Get the local name part of this qualified name.
@@ -49,69 +47,4 @@
      * @return the URI; never null but possibly empty
      */
     String getNamespaceUri();
-
-    /**
-     * Get the string form of the name. The {@link Path#DEFAULT_ENCODER default encoder} is used to encode characters in the local
-     * name and namespace.
-     * 
-     * @return the encoded string
-     * @see #getString(TextEncoder)
-     */
-    public String getString();
-
-    /**
-     * Get the encoded string form of the name, using the supplied encoder to encode characters in the local name and namespace.
-     * 
-     * @param encoder the encoder to use, or null if the {@link Path#DEFAULT_ENCODER default encoder} should be used
-     * @return the encoded string
-     * @see #getString()
-     */
-    public String getString( TextEncoder encoder );
-
-    /**
-     * Get the string form of the name, using the supplied namespace registry to convert the {@link #getNamespaceUri() namespace
-     * URI} to a prefix. The {@link Path#DEFAULT_ENCODER default encoder} is used to encode characters in each of the path
-     * segments.
-     * 
-     * @param namespaceRegistry the namespace registry that should be used to obtain the prefix for the
-     *        {@link Name#getNamespaceUri() namespace URI}
-     * @return the encoded string
-     * @throws IllegalArgumentException if the namespace registry is null
-     * @see #getString(NamespaceRegistry,TextEncoder)
-     */
-    public String getString( NamespaceRegistry namespaceRegistry );
-
-    /**
-     * Get the encoded string form of the name, using the supplied namespace registry to convert the {@link #getNamespaceUri()
-     * namespace URI} to a prefix.
-     * 
-     * @param namespaceRegistry the namespace registry that should be used to obtain the prefix for the
-     *        {@link Name#getNamespaceUri() namespace URI}
-     * @param encoder the encoder to use, or null if the {@link Path#DEFAULT_ENCODER default encoder} should be used
-     * @return the encoded string
-     * @throws IllegalArgumentException if the namespace registry is null
-     * @see #getString(NamespaceRegistry)
-     */
-    public String getString( NamespaceRegistry namespaceRegistry,
-                             TextEncoder encoder );
-
-    /**
-     * Get the encoded string form of the name, using the supplied namespace registry to convert the names' namespace URIs to
-     * prefixes and the supplied encoder to encode characters in each of the path segments, and using the second delimiter to
-     * encode (or convert) the delimiter used between the namespace prefix and the local part.
-     * 
-     * @param namespaceRegistry the namespace registry that should be used to obtain the prefix for the
-     *        {@link Name#getNamespaceUri() namespace URIs} in the segment {@link Segment#getName() names}
-     * @param encoder the encoder to use for encoding the {@link Name#getLocalName() local part} and
-     *        {@link Name#getNamespaceUri() namespace prefix}, or null if the {@link Path#DEFAULT_ENCODER default encoder} should
-     *        be used
-     * @param delimiterEncoder the encoder to use for encoding the delimiter between the {@link Name#getLocalName() local part}
-     *        and {@link Name#getNamespaceUri() namespace prefix}, or null if the standard delimiter should be used
-     * @return the encoded string
-     * @see #getString(NamespaceRegistry)
-     * @see #getString(NamespaceRegistry, TextEncoder)
-     */
-    public String getString( NamespaceRegistry namespaceRegistry,
-                             TextEncoder encoder,
-                             TextEncoder delimiterEncoder );
 }

Modified: trunk/dna-graph/src/main/java/org/jboss/dna/graph/property/Path.java
===================================================================
--- trunk/dna-graph/src/main/java/org/jboss/dna/graph/property/Path.java	2009-06-09 03:30:34 UTC (rev 1002)
+++ trunk/dna-graph/src/main/java/org/jboss/dna/graph/property/Path.java	2009-06-09 03:30:56 UTC (rev 1003)
@@ -74,7 +74,7 @@
  * @author John Verhaeg
  */
 @Immutable
-public interface Path extends Comparable<Path>, Iterable<Path.Segment>, Serializable {
+public interface Path extends Comparable<Path>, Iterable<Path.Segment>, Serializable, Readable {
 
     /**
      * The text encoder that does nothing.
@@ -149,7 +149,7 @@
      * @author Randall Hauch
      */
     @Immutable
-    public static interface Segment extends Cloneable, Comparable<Segment>, Serializable {
+    public static interface Segment extends Cloneable, Comparable<Segment>, Serializable, Readable {
 
         /**
          * Get the name component of this segment.
@@ -194,73 +194,6 @@
          * @see #getString(TextEncoder)
          */
         public String getUnencodedString();
-
-        /**
-         * Get the string form of the segment. The {@link #DEFAULT_ENCODER default encoder} is used to encode characters in each
-         * of the path segments.
-         * 
-         * @return the encoded string
-         * @see #getString(TextEncoder)
-         */
-        public String getString();
-
-        /**
-         * Get the encoded string form of the segment, using the supplied encoder to encode characters in each of the path
-         * segments.
-         * 
-         * @param encoder the encoder to use, or null if the {@link #DEFAULT_ENCODER default encoder} should be used
-         * @return the encoded string
-         * @see #getString()
-         */
-        public String getString( TextEncoder encoder );
-
-        /**
-         * Get the string form of the segment, using the supplied namespace registry to convert the name's namespace URI to a
-         * prefix. The {@link #DEFAULT_ENCODER default encoder} is used to encode characters in each of the path segments.
-         * 
-         * @param namespaceRegistry the namespace registry that should be used to obtain the prefix for the
-         *        {@link Name#getNamespaceUri() namespace URI} in the segment's {@link #getName() name}
-         * @return the encoded string
-         * @throws IllegalArgumentException if the namespace registry is null
-         * @see #getString(NamespaceRegistry,TextEncoder)
-         */
-        public String getString( NamespaceRegistry namespaceRegistry );
-
-        /**
-         * Get the encoded string form of the segment, using the supplied namespace registry to convert the name's namespace URI
-         * to a prefix and the supplied encoder to encode characters in each of the path segments.
-         * 
-         * @param namespaceRegistry the namespace registry that should be used to obtain the prefix for the
-         *        {@link Name#getNamespaceUri() namespace URI} in the segment's {@link #getName() name}
-         * @param encoder the encoder to use, or null if the {@link #DEFAULT_ENCODER default encoder} should be used
-         * @return the encoded string
-         * @throws IllegalArgumentException if the namespace registry is null
-         * @see #getString(NamespaceRegistry)
-         */
-        public String getString( NamespaceRegistry namespaceRegistry,
-                                 TextEncoder encoder );
-
-        /**
-         * Get the encoded string form of the segment, using the supplied namespace registry to convert the names' namespace URIs
-         * to prefixes and the supplied encoder to encode characters in each of the path segments. The second encoder is used to
-         * encode (or convert) the delimiter between the {@link Name#getNamespaceUri() namespace prefix} and the
-         * {@link Name#getLocalName() local part}.
-         * 
-         * @param namespaceRegistry the namespace registry that should be used to obtain the prefix for the
-         *        {@link Name#getNamespaceUri() namespace URIs} in the segment {@link Segment#getName() names}
-         * @param encoder the encoder to use for encoding the {@link Name#getLocalName() local part} and
-         *        {@link Name#getNamespaceUri() namespace prefix} in the segment's {@link #getName() name}, or null if the
-         *        {@link #DEFAULT_ENCODER default encoder} should be used
-         * @param delimiterEncoder the encoder to use for encoding the delimiter between the {@link Name#getLocalName() local
-         *        part} and {@link Name#getNamespaceUri() namespace prefix} of each {@link Path#getSegmentsList() segment}, or
-         *        null if the standard delimiters should be used
-         * @return the encoded string
-         * @see #getString(NamespaceRegistry)
-         * @see #getString(NamespaceRegistry, TextEncoder)
-         */
-        public String getString( NamespaceRegistry namespaceRegistry,
-                                 TextEncoder encoder,
-                                 TextEncoder delimiterEncoder );
     }
 
     /**
@@ -516,74 +449,4 @@
      */
     public List<Segment> getSegmentsList();
 
-    /**
-     * Get the string form of the path. The {@link #DEFAULT_ENCODER default encoder} is used to encode characters in each of the
-     * path segments.
-     * 
-     * @return the encoded string
-     * @see #getString(TextEncoder)
-     */
-    public String getString();
-
-    /**
-     * Get the encoded string form of the path, using the supplied encoder to encode characters in each of the path segments.
-     * 
-     * @param encoder the encoder to use, or null if the {@link #DEFAULT_ENCODER default encoder} should be used
-     * @return the encoded string
-     * @see #getString()
-     */
-    public String getString( TextEncoder encoder );
-
-    /**
-     * Get the string form of the path, using the supplied namespace registry to convert the names' namespace URIs to prefixes.
-     * The {@link #DEFAULT_ENCODER default encoder} is used to encode characters in each of the path segments. The second encoder
-     * is used to encode (or convert) the delimiter between the {@link Name#getNamespaceUri() namespace prefix} and the
-     * {@link Name#getLocalName() local part}.
-     * 
-     * @param namespaceRegistry the namespace registry that should be used to obtain the prefix for the
-     *        {@link Name#getNamespaceUri() namespace URIs} in the segment {@link Segment#getName() names}
-     * @return the encoded string
-     * @throws IllegalArgumentException if the namespace registry is null
-     * @see #getString(NamespaceRegistry,TextEncoder)
-     * @see #getString(NamespaceRegistry, TextEncoder, TextEncoder)
-     */
-    public String getString( NamespaceRegistry namespaceRegistry );
-
-    /**
-     * Get the encoded string form of the path, using the supplied namespace registry to convert the names' namespace URIs to
-     * prefixes and the supplied encoder to encode characters in each of the path segments.
-     * 
-     * @param namespaceRegistry the namespace registry that should be used to obtain the prefix for the
-     *        {@link Name#getNamespaceUri() namespace URIs} in the segment {@link Segment#getName() names}, or null if the
-     *        namespace registry should not be used
-     * @param encoder the encoder to use for encoding the {@link Name#getLocalName() local part} and
-     *        {@link Name#getNamespaceUri() namespace prefix} of each {@link Path#getSegmentsList() segment}, or null if the
-     *        {@link #DEFAULT_ENCODER default encoder} should be used
-     * @return the encoded string
-     * @see #getString(NamespaceRegistry)
-     * @see #getString(NamespaceRegistry, TextEncoder, TextEncoder)
-     */
-    public String getString( NamespaceRegistry namespaceRegistry,
-                             TextEncoder encoder );
-
-    /**
-     * Get the encoded string form of the path, using the supplied namespace registry to convert the names' namespace URIs to
-     * prefixes and the supplied encoder to encode characters in each of the path segments.
-     * 
-     * @param namespaceRegistry the namespace registry that should be used to obtain the prefix for the
-     *        {@link Name#getNamespaceUri() namespace URIs} in the segment {@link Segment#getName() names}
-     * @param encoder the encoder to use for encoding the {@link Name#getLocalName() local part} and
-     *        {@link Name#getNamespaceUri() namespace prefix} of each {@link Path#getSegmentsList() segment}, or null if the
-     *        {@link #DEFAULT_ENCODER default encoder} should be used
-     * @param delimiterEncoder the encoder to use for encoding the delimiter between the {@link Name#getLocalName() local part}
-     *        and {@link Name#getNamespaceUri() namespace prefix} of each {@link Path#getSegmentsList() segment}, and for encoding
-     *        the path delimiter, or null if the standard delimiters should be used
-     * @return the encoded string
-     * @see #getString(NamespaceRegistry)
-     * @see #getString(NamespaceRegistry, TextEncoder)
-     */
-    public String getString( NamespaceRegistry namespaceRegistry,
-                             TextEncoder encoder,
-                             TextEncoder delimiterEncoder );
-
 }

Modified: trunk/dna-graph/src/main/java/org/jboss/dna/graph/property/Property.java
===================================================================
--- trunk/dna-graph/src/main/java/org/jboss/dna/graph/property/Property.java	2009-06-09 03:30:34 UTC (rev 1002)
+++ trunk/dna-graph/src/main/java/org/jboss/dna/graph/property/Property.java	2009-06-09 03:30:56 UTC (rev 1003)
@@ -25,7 +25,6 @@
 
 import java.util.Iterator;
 import net.jcip.annotations.Immutable;
-import org.jboss.dna.common.text.TextEncoder;
 
 /**
  * Representation of a property consisting of a name and value(s). Note that this property is immutable, meaning that the property
@@ -59,7 +58,7 @@
  * @author Randall Hauch
  */
 @Immutable
-public interface Property extends Iterable<Object>, Comparable<Property> {
+public interface Property extends Iterable<Object>, Comparable<Property>, Readable {
 
     /**
      * Get the name of the property.
@@ -155,67 +154,4 @@
      * @see ValueFactory#create(Object[])
      */
     Object[] getValuesAsArray();
-
-    /**
-     * Get the string form of the property, using the default encoder.
-     * 
-     * @return the encoded string
-     * @see #getString(TextEncoder)
-     */
-    public String getString();
-
-    /**
-     * Get the encoded string form of the property, using the supplied encoder to encode characters in the property's name and
-     * values.
-     * 
-     * @param encoder the encoder to use, or null if the default encoder should be used
-     * @return the encoded string
-     * @see #getString()
-     */
-    public String getString( TextEncoder encoder );
-
-    /**
-     * Get the string form of the property, using the supplied namespace registry to convert the property's name and values.
-     * 
-     * @param namespaceRegistry the namespace registry that should be used to obtain the prefix for the
-     *        {@link Name#getNamespaceUri() namespace URIs} in the property {@link #getName() name}
-     * @return the string
-     * @throws IllegalArgumentException if the namespace registry is null
-     * @see #getString(NamespaceRegistry,TextEncoder)
-     * @see #getString(NamespaceRegistry, TextEncoder, TextEncoder)
-     */
-    public String getString( NamespaceRegistry namespaceRegistry );
-
-    /**
-     * Get the encoded string form of the property, using the supplied namespace registry to convert the property's namespace URIs
-     * to prefixes and the supplied encoder to encode characters in the property's name and values.
-     * 
-     * @param namespaceRegistry the namespace registry that should be used to obtain the prefix for the
-     *        {@link Name#getNamespaceUri() namespace URIs} in the property {@link #getName() name}, or null if the namespace
-     *        registry should not be used
-     * @param encoder the encoder to use for encoding the name and values, or null if the default encoder should be used
-     * @return the encoded string
-     * @see #getString(NamespaceRegistry)
-     * @see #getString(NamespaceRegistry, TextEncoder, TextEncoder)
-     */
-    public String getString( NamespaceRegistry namespaceRegistry,
-                             TextEncoder encoder );
-
-    /**
-     * Get the encoded string form of the property, using the supplied namespace registry to convert the property's namespace URIs
-     * to prefixes and the supplied encoder to encode characters in the property's name and values.
-     * 
-     * @param namespaceRegistry the namespace registry that should be used to obtain the prefix for the
-     *        {@link Name#getNamespaceUri() namespace URIs} in the property {@link #getName() name}, or null if the namespace
-     *        registry should not be used
-     * @param encoder the encoder to use for encoding the name and values, or null if the default encoder should be used
-     * @param delimiterEncoder the encoder to use for encoding delimiters used in paths and names, or null if the standard
-     *        delimiters should be used
-     * @return the encoded string
-     * @see #getString(NamespaceRegistry)
-     * @see #getString(NamespaceRegistry, TextEncoder)
-     */
-    public String getString( NamespaceRegistry namespaceRegistry,
-                             TextEncoder encoder,
-                             TextEncoder delimiterEncoder );
 }

Copied: trunk/dna-graph/src/main/java/org/jboss/dna/graph/property/Readable.java (from rev 1002, trunk/dna-graph/src/main/java/org/jboss/dna/graph/property/Name.java)
===================================================================
--- trunk/dna-graph/src/main/java/org/jboss/dna/graph/property/Readable.java	                        (rev 0)
+++ trunk/dna-graph/src/main/java/org/jboss/dna/graph/property/Readable.java	2009-06-09 03:30:56 UTC (rev 1003)
@@ -0,0 +1,95 @@
+/*
+ * 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.property;
+
+import net.jcip.annotations.Immutable;
+import org.jboss.dna.common.text.TextEncoder;
+import org.jboss.dna.graph.property.Path.Segment;
+
+/**
+ * An interface defining methods to obtain a "readable" string representation.
+ */
+ at Immutable
+public interface Readable {
+
+    /**
+     * Get the string form of the object. A {@link Path#DEFAULT_ENCODER default encoder} is used to encode characters.
+     * 
+     * @return the encoded string
+     * @see #getString(TextEncoder)
+     */
+    public String getString();
+
+    /**
+     * Get the encoded string form of the object, using the supplied encoder to encode characters.
+     * 
+     * @param encoder the encoder to use, or null if the {@link Path#DEFAULT_ENCODER default encoder} should be used
+     * @return the encoded string
+     * @see #getString()
+     */
+    public String getString( TextEncoder encoder );
+
+    /**
+     * Get the string form of the object, using the supplied namespace registry to convert any namespace URIs to prefixes. A
+     * {@link Path#DEFAULT_ENCODER default encoder} is used to encode characters.
+     * 
+     * @param namespaceRegistry the namespace registry that should be used to obtain the prefix for any namespace URIs
+     * @return the encoded string
+     * @throws IllegalArgumentException if the namespace registry is null
+     * @see #getString(NamespaceRegistry,TextEncoder)
+     */
+    public String getString( NamespaceRegistry namespaceRegistry );
+
+    /**
+     * Get the encoded string form of the object, using the supplied namespace registry to convert the any namespace URIs to
+     * prefixes.
+     * 
+     * @param namespaceRegistry the namespace registry that should be used to obtain the prefix for the namespace URIs
+     * @param encoder the encoder to use, or null if the {@link Path#DEFAULT_ENCODER default encoder} should be used
+     * @return the encoded string
+     * @throws IllegalArgumentException if the namespace registry is null
+     * @see #getString(NamespaceRegistry)
+     */
+    public String getString( NamespaceRegistry namespaceRegistry,
+                             TextEncoder encoder );
+
+    /**
+     * Get the encoded string form of the object, using the supplied namespace registry to convert the names' namespace URIs to
+     * prefixes and the supplied encoder to encode characters, and using the second delimiter to encode (or convert) the delimiter
+     * used between the namespace prefix and the local part of any names.
+     * 
+     * @param namespaceRegistry the namespace registry that should be used to obtain the prefix for the namespace URIs in the
+     *        segment {@link Segment#getName() names}
+     * @param encoder the encoder to use for encoding the local part and namespace prefix of any names, or null if the
+     *        {@link Path#DEFAULT_ENCODER default encoder} should be used
+     * @param delimiterEncoder the encoder to use for encoding the delimiter between the local part and namespace prefix of any
+     *        names, or null if the standard delimiter should be used
+     * @return the encoded string
+     * @see #getString(NamespaceRegistry)
+     * @see #getString(NamespaceRegistry, TextEncoder)
+     */
+    public String getString( NamespaceRegistry namespaceRegistry,
+                             TextEncoder encoder,
+                             TextEncoder delimiterEncoder );
+}

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	2009-06-09 03:30:34 UTC (rev 1002)
+++ trunk/docs/reference/src/main/docbook/en-US/content/core/graph.xml	2009-06-09 03:30:56 UTC (rev 1003)
@@ -73,7 +73,21 @@
 			&Name; is also a interface rather than a concrete class:
 		</para>
 <programlisting>
-</programlisting>
+ at Immutable
+public interface &Name; extends Comparable&lt;&Name;>, &Serializable;, &Readable; {
+
+    /**
+     * Get the local name part of this qualified name.
+     * @return the local name; never null
+     */
+    String getLocalName();
+
+    /**
+     * Get the URI for the namespace used in this qualified name.
+     * @return the URI; never null but possibly empty
+     */
+    String getNamespaceUri();
+}</programlisting>
 		<para>
 			This means that you need to use a factory to create &Name; instances.
 		</para>
@@ -91,32 +105,22 @@
 			via the <code>getValueFactories()</code> method.  But before we see that, let's first discuss how names are represented as strings.
 		</para>
 		<para>
-			We mentioned earlier that names are qualified with a namespace, and namespaces are identified by URIs.
-			Also, the local part of the names can contain any character.  So what do the string representation of names look like?
-		</para>
-		<para>
-			The &Name; interface defines a number of <code>getString(...)</code> methods that take different parameters.
-			The <code>getString()</code> method (which is called by the <code>toString()</code> method) will simply output
-			the namespace URI followed by a ':' and an local name (encoded with a default &TextEncoder; implementation, which
-			will be discussed in the <link linkend="graph-encoders">next section</link>).  If you want to use the
-			namespace prefix, then simply use one of the <code>getString(...)</code> methods that takes a &NamespaceRegistry;
-			parameter.
-		</para>
-		<para>
 			We'll see how names are used later one, but one more point to make:  &Name; is both serializable and comparable,
 			and all implementations should support <code>equals(...)</code> and <code>hashCode()</code> so that &Name; can
-			be used as a key in a hash-based map.
+			be used as a key in a hash-based map.  &Name; also extends the &Readable; interface, which we'll learn
+			more about later in this chapter.
 		</para>
 	</sect1>
 	<sect1 id="graph-paths">
 		<title>Paths</title>
 		<para>
 			Another important concept in JBoss DNA's graph model is that of a <emphasis>path</emphasis>, which provides a way
-			of locating a node within a hierarchy.  JBoss DNA's &Path; object is actually comprised of an ordered sequence
-			of &PathSegment; objects:
+			of locating a node within a hierarchy.  JBoss DNA's &Path; object is an immutable ordered sequence
+			of &PathSegment; objects.  A small portion of the interface is shown here:
 		</para>
 		<programlisting>
-public interface &Path; extends Comparable<Path>, Iterable<&PathSegment;>, Serializable {
+ at Immutable
+public interface &Path; extends Comparable&lt;Path>, Iterable&lt;&PathSegment;>, &Serializable;, &Readable; {
 
     /**
      * Return the number of segments in this path.
@@ -130,101 +134,586 @@
      */
     public boolean isRoot();
 
-		/**
-		 * {@inheritDoc}
-		 */
-		public Iterator<&PathSegment;> iterator();
+    /**
+     * {@inheritDoc}
+     */
+    public Iterator&lt;&PathSegment;> iterator();
 
-		/**
-		 * Obtain a copy of the segments in this path. None of the segments are encoded.
-		 * @return the array of segments as a copy
-		 */
-		public &PathSegment;[] getSegmentsArray();
+    /**
+     * Obtain a copy of the segments in this path. None of the segments are encoded.
+     * @return the array of segments as a copy
+     */
+    public &PathSegment;[] getSegmentsArray();
 
-		/**
-		 * Get an unmodifiable list of the path segments.
-		 * @return the unmodifiable list of path segments; never null
-		 */
-		public List<&PathSegment;> getSegmentsList();
-		/**
-		 * Get the last segment in this path.
-		 * @return the last segment, or null if the path is empty
-		 */
-		public &PathSegment; getLastSegment();
+    /**
+     * Get an unmodifiable list of the path segments.
+     * @return the unmodifiable list of path segments; never null
+     */
+    public List&lt;&PathSegment;> getSegmentsList();
+    /**
+     * Get the last segment in this path.
+     * @return the last segment, or null if the path is empty
+     */
+    public &PathSegment; getLastSegment();
 
-		/**
-		 * Get the segment at the supplied index.
-		 * @param index the index
-		 * @return the segment
-		 * @throws IndexOutOfBoundsException if the index is out of bounds
-		 */
-		public &PathSegment; getSegment( int index );
+    /**
+     * Get the segment at the supplied index.
+     * @param index the index
+     * @return the segment
+     * @throws IndexOutOfBoundsException if the index is out of bounds
+     */
+    public &PathSegment; getSegment( int index );
 
-		/**
-		 * Return an iterator that walks the paths from the root path down to this path. This method 
-		 * always returns at least one path (the root returns an iterator containing itself).
-		 * @return the path iterator; never null
-		 */
-		public Iterator<&Path;> pathsFromRoot();
+    /**
+     * Return an iterator that walks the paths from the root path down to this path. This method 
+     * always returns at least one path (the root returns an iterator containing itself).
+     * @return the path iterator; never null
+     */
+    public Iterator&lt;&Path;> pathsFromRoot();
 
-		/**
-		 * Return a new path consisting of the segments starting at <code>beginIndex</code> index (inclusive). 
-		 * This is equivalent to calling <code>path.subpath(beginIndex,path.size()-1)</code>.
-		 * @param beginIndex the beginning index, inclusive.
-		 * @return the specified subpath
-		 * @exception IndexOutOfBoundsException if the <code>beginIndex</code> is negative or larger 
-		 *            than the length of this <code>Path</code> object
-		 */
-		public &Path; subpath( int beginIndex );
+    /**
+     * Return a new path consisting of the segments starting at <code>beginIndex</code> index (inclusive). 
+     * This is equivalent to calling <code>path.subpath(beginIndex,path.size()-1)</code>.
+     * @param beginIndex the beginning index, inclusive.
+     * @return the specified subpath
+     * @exception IndexOutOfBoundsException if the <code>beginIndex</code> is negative or larger 
+     *            than the length of this <code>Path</code> object
+     */
+    public &Path; subpath( int beginIndex );
 
-		/**
-		 * Return a new path consisting of the segments between the <code>beginIndex</code> index (inclusive)
-		 * and the <code>endIndex</code> index (exclusive).
-		 * @param beginIndex the beginning index, inclusive.
-		 * @param endIndex the ending index, exclusive.
-		 * @return the specified subpath
-		 * @exception IndexOutOfBoundsException if the <code>beginIndex</code> is negative, or 
-		 *            <code>endIndex</code> is larger than the length of this <code>Path</code> 
-		 *            object, or <code>beginIndex</code> is larger than <code>endIndex</code>.
-		 */
-		public &Path; subpath( int beginIndex, int endIndex );
+    /**
+     * Return a new path consisting of the segments between the <code>beginIndex</code> index (inclusive)
+     * and the <code>endIndex</code> index (exclusive).
+     * @param beginIndex the beginning index, inclusive.
+     * @param endIndex the ending index, exclusive.
+     * @return the specified subpath
+     * @exception IndexOutOfBoundsException if the <code>beginIndex</code> is negative, or 
+     *            <code>endIndex</code> is larger than the length of this <code>Path</code> 
+     *            object, or <code>beginIndex</code> is larger than <code>endIndex</code>.
+     */
+    public &Path; subpath( int beginIndex, int endIndex );
 
     ...
-
 }   </programlisting>
 		<para>
-			where each &PathSegment; is comprised of a &Name; and <emphasis>same-name-sibling index</emphasis>:
+			There are actually quite a few methods (not shown above) for obtaining related paths: the path of the parent, the path of an ancestor,
+			resolving a path relative to this path, normalizing a path (by removing "." and ".." segments), finding the lowest
+			common ancestor shared with another path, etc. There are also a number of methods that compare the path with others,
+			including determining whether a path is above, equal to, or below this path.
 		</para>
+		<para>
+			Each &PathSegment; is an immutable pair of a &Name; and <emphasis>same-name-sibling (SNS) index</emphasis>.  When two sibling nodes
+			have the same name, then the first sibling will have SNS index of "1" and the second will be given a SNS index of "2".
+			(This mirrors the same-name-sibling index behavior of <ulink url="&JSR170;">JCR paths</ulink>.)
+		</para>
 		<programlisting>
+ at Immutable
+public static interface &PathSegment; extends Cloneable, Comparable&lt;&PathSegment;>, &Serializable;, &Readable; {
+
+    /**
+     * Get the name component of this segment.
+     * @return the segment's name
+     */
+    public &Name; getName();
+
+    /**
+     * Get the index for this segment, which will be 1 by default.
+     * @return the index
+     */
+    public int getIndex();
+
+    /**
+     * Return whether this segment has an index that is not "1"
+     * @return true if this segment has an index, or false otherwise.
+     */
+    public boolean hasIndex();
+
+    /**
+     * Return whether this segment is a self-reference (or ".").
+     * @return true if the segment is a self-reference, or false otherwise.
+     */
+    public boolean isSelfReference();
+
+    /**
+     * Return whether this segment is a reference to a parent (or "..")
+     * @return true if the segment is a parent-reference, or false otherwise.
+     */
+    public boolean isParentReference();
+}
 		</programlisting>
 		<para>
-			
+			Like &Name;, the only way to create a &Path; or a &PathSegment; is to use the &PathFactory;, which is available 
+			within the &ExecutionContext; via the <code>getValueFactories()</code> method.
 		</para>
-		
 	</sect1>
 	<sect1 id="graph-properties">
 		<title>Properties</title>
 		<para>
-			
+			The JBoss DNA graph model allows nodes to hold multiple properties, where each property is identified
+			by a unique &Name; and may have one or more values.  Like many of the other classes used in the graph model,
+			&Property; is an immutable object that, once constructed, can never be changed and therefore provides
+			a consistent snapshot of the state of a property as it existed at the time it was read.
 		</para>
+		<para>
+		  JBoss DNA properties can hold a wide range of value objects, including normal Java strings, names, paths, 
+		  URIs, booleans, longs, doubles, decimals, binary content,	dates, UUIDs, references to other nodes, 
+		  or any other serializable object.  All but three these are the standard Java classes: dates are
+		  represented by an immutable &DateTime; class; binary content is represented by an immutable &Binary;
+		  interface patterned after the proposed interface of the same name in <ulink url="&JSR283;">JSR-283</ulink>;
+		  and &Reference; is an immutable interface patterned after the corresponding interface is 
+		  <ulink url="&JSR170;">JSR-170</ulink> and <ulink url="&JSR283;">JSR-283</ulink>.
+		</para>
+		<para>
+			The &Property; interface defines methods for obtaining the name and property values:
+		</para>
+		<programlisting>
+ at Immutable
+public interface &Property; extends Iterable&lt;Object>, Comparable&lt;&Property;>, &Readable; {
+
+    /**
+     * Get the name of the property.
+     * 
+     * @return the property name; never null
+     */
+    &Name; getName();
+
+    /**
+     * Get the number of actual values in this property.
+     * @return the number of actual values in this property; always non-negative
+     */
+    int size();
+
+    /**
+     * Determine whether the property currently has multiple values.
+     * @return true if the property has multiple values, or false otherwise.
+     */
+    boolean isMultiple();
+
+    /**
+     * Determine whether the property currently has a single value.
+     * @return true if the property has a single value, or false otherwise.
+     */
+    boolean isSingle();
+
+    /**
+     * Determine whether this property has no actual values. This method may return <code>true</code> 
+     * regardless of whether the property has a single value or multiple values.
+     * This method is a convenience method that is equivalent to <code>size() == 0</code>.
+     * @return true if this property has no values, or false otherwise
+     */
+    boolean isEmpty();
+
+    /**
+     * Obtain the property's first value in its natural form. This is equivalent to calling
+     * <code>isEmpty() ? null : iterator().next()</code>
+     * @return the first value, or null if the property is {@link #isEmpty() empty}
+     */
+    Object getFirstValue();
+
+    /**
+     * Obtain the property's values in their natural form. This is equivalent to calling <code>iterator()</code>.
+     * A valid iterator is returned if the property has single valued or multi-valued.
+     * The resulting iterator is immutable, and all property values are immutable.
+     * @return an iterator over the values; never null
+     */
+    Iterator&lt;?> getValues();
+
+    /**
+     * Obtain the property's values as an array of objects in their natural form.
+     * A valid iterator is returned if the property has single valued or multi-valued, or a
+     * null value is returned if the property is {@link #isEmpty() empty}.
+     * The resulting array is a copy, guaranteeing immutability for the property.
+     * @return the array of values
+     */
+    Object[] getValuesAsArray();
+}
+		</programlisting>
+		<para>
+			Creating &Property; instances is done by using the &PropertyFactory; object owned by the &ExecutionContext;.
+			This factory defines methods for creating properties with a &Name; and various representation of values,
+			including variable-length arguments, arrays, &Iterator;, and &Iterable;.
+		</para>
+		<para>
+			When it comes to using the property values, JBoss DNA takes a non-traditional approach.
+			Many other graph models (including JCR) mark each property with a data type and then require 
+			all property values adhere to this data type. When the property values are obtained, they
+			are guaranteed to be of the correct type. However, many times the property's data type may
+			not match the data type expected by the caller, and so a conversion may be required
+			and thus has to be coded.
+		</para>
+		<para>
+			The JBoss DNA graph model uses a different tact.  Because callers almost always have to convert the
+			values to the types they can handle, JBoss DNA skips the steps of associating the  &Property; with a data type
+			and ensuring the values match.  Instead, JBoss DNA simply provides a very easy mechanism to convert
+			the property values to the type desired by the caller.  In fact, the conversion mechanism
+			is exactly the same as the factories that create the values in the first place.
+		</para>
 	</sect1>
 	<sect1 id="graph-value-factories">
 		<title>Values and value factories</title>
 		<para>
-			
+			JBoss DNA properties can hold a variety of types of value objects: strings, names, paths, 
+		  URIs, booleans, longs, doubles, decimals, binary content,	dates, UUIDs, references to other nodes, 
+		  or any other serializable object.  To assist in the creation of these values and conversion
+		  into other types, JBoss DNA defines a &ValueFactory; interface.  This interface is parameterized
+		  with the type of value that is being created, but defines methods for creating those values
+		  from all of the other known value types:
 		</para>
+		<programlisting>
+public interface ValueFactory&lt;T> {
+
+    /**
+     * Get the &PropertyType; of values created by this factory.
+     * @return the value type; never null
+     */
+    &PropertyType; getPropertyType();
+
+		/*
+		 * Methods to create a value by converting from another value type.
+		 * If the supplied value is the same type as returned by this factory,
+		 * these methods simply return the supplied value.
+		 * All of these methods throw a &ValueFormatException; if the supplied value
+		 * could not be converted to this type.
+		 */
+    T create( String value ) throws ValueFormatException;
+    T create( String value, TextDecoder decoder ) throws ValueFormatException;
+    T create( int value ) throws ValueFormatException;
+    T create( long value ) throws ValueFormatException;
+    T create( boolean value ) throws ValueFormatException;
+    T create( float value ) throws ValueFormatException;
+    T create( double value ) throws ValueFormatException;
+    T create( &BigDecimal; value ) throws ValueFormatException;
+    T create( &Calendar; value ) throws ValueFormatException;
+    T create( &Date; value ) throws ValueFormatException;
+    T create( &DateTime; value ) throws ValueFormatException;
+    T create( &Name; value ) throws ValueFormatException;
+    T create( &Path; value ) throws ValueFormatException;
+    T create( &Reference; value ) throws ValueFormatException;
+    T create( &URI; value ) throws ValueFormatException;
+    T create( &UUID; value ) throws ValueFormatException;
+    T create( byte[] value ) throws ValueFormatException;
+    T create( &Binary; value ) throws ValueFormatException, IoException;
+    T create( &InputStream; stream, long approximateLength ) throws ValueFormatException, IoException;
+    T create( &Reader; reader, long approximateLength ) throws ValueFormatException, IoException;
+    T create( Object value ) throws ValueFormatException, IoException;
+
+    /*
+     * Methods to create an array of values by converting from another array of values.
+     * If the supplied values are the same type as returned by this factory,
+     * these methods simply return the supplied array.
+     * All of these methods throw a &ValueFormatException; if the supplied values
+     * could not be converted to this type.
+		 */
+    T[] create( String[] values ) throws ValueFormatException;
+    T[] create( String[] values, TextDecoder decoder ) throws ValueFormatException;
+    T[] create( int[] values ) throws ValueFormatException;
+    T[] create( long[] values ) throws ValueFormatException;
+    T[] create( boolean[] values ) throws ValueFormatException;
+    T[] create( float[] values ) throws ValueFormatException;
+    T[] create( double[] values ) throws ValueFormatException;
+    T[] create( &BigDecimal;[] values ) throws ValueFormatException;
+    T[] create( &Calendar;[] values ) throws ValueFormatException;
+    T[] create( &Date;[] values ) throws ValueFormatException;
+    T[] create( &DateTime;[] values ) throws ValueFormatException;
+    T[] create( &Name;[] values ) throws ValueFormatException;
+    T[] create( &Path;[] values ) throws ValueFormatException;
+    T[] create( &Reference;[] values ) throws ValueFormatException;
+    T[] create( &URI;[] values ) throws ValueFormatException;
+    T[] create( &UUID;[] values ) throws ValueFormatException;
+    T[] create( byte[][] values ) throws ValueFormatException;
+    T[] create( &Binary;[] values ) throws ValueFormatException, IoException;
+    T[] create( Object[] values ) throws ValueFormatException, IoException;
+
+    /**
+     * Create an iterator over the values (of an unknown type). The factory converts any 
+     * values as required.  This is useful when wanting to iterate over the values of a property,
+     * where the resulting iterator exposes the desired type.
+     * @param values the values
+     * @return the iterator of type <code>T</code> over the values, or null if the supplied parameter is null
+     * @throws &ValueFormatException; if the conversion from an iterator of objects could not be performed
+     * @throws IoException If an unexpected problem occurs during the conversion.
+     */
+    Iterator&lt;T> create( &Iterator;&lt;?> values ) throws ValueFormatException, IoException;
+    Iterable&lt;T> create( &Iterable;&lt;?> valueIterable ) throws ValueFormatException, IoException;
+}
+	</programlisting>
+		<para>
+			This makes it very easy to convert one or more values (of any type, including mixtures) into
+			corresponding value(s) that are of the desired type.  For example, converting the first value
+			of a property (regardless of type) to a String is simple:
+		</para>
+		<programlisting>
+&ValueFactory;&lt;String> stringFactory = ...
+&Property; property = ...
+String value = stringFactory.create( property.getFirstValue() );
+		</programlisting>
+		<para>
+			Likewise, iterating over the values in a property and converting them is just as easy:
+		</para>
+		<programlisting>
+&ValueFactory;&lt;String> stringFactory = ...
+&Property; property = ...
+for ( String value : stringFactory.create(property) ) {
+    // do something with the values
+}
+		</programlisting>
+		<para>
+			What we've glossed over so far, however, is how to obtain the correct &ValueFactory; for the desired type.
+			If you remember back to the previous chapter, &ExecutionContext; has a <code>getValueFactories()</code> method
+			that return a &ValueFactories; interface:
+		</para>
+		<programlisting>
+		</programlisting>
+		<para>
+			This interface exposes a &ValueFactory; for each of the types, and even has methods to obtain a &ValueFactory;
+			given the &PropertyType; enumeration.  So, the previous examples could be expanded a bit:
+		</para>
+		<programlisting>
+&ValueFactory;&lt;String> stringFactory = context.getValueFactories().getStringFactory();
+&Property; property = ...
+String value = stringFactory.create( property.getFirstValue() );
+		</programlisting>
+		<para>
+			and
+		</para>
+		<programlisting>
+&ValueFactory;&lt;String> stringFactory = context.getValueFactories().getStringFactory();
+&Property; property = ...
+for ( String value : stringFactory.create(property) ) {
+    // do something with the values
+}
+		</programlisting>
+		<para>
+			You might have noticed that several of the &ValueFactories; methods return subinterfaces of &ValueFactory;.  These
+			add type-specific methods that are more commonly needed in certain cases.  For example, here is the &NameFactory; interface:
+		</para>
+		<programlisting>
+public interface &NameFactory; extends &ValueFactory;&lt;&Name;> {
+
+    &Name; create( String namespaceUri, String localName );
+    &Name; create( String namespaceUri, String localName, TextDecoder decoder );
+
+    &NamespaceRegistry; getNamespaceRegistry();
+}
+		</programlisting>
+		<para>and here is the &DateTimeFactory; interface, which adds methods for creating &DateTime; values for the current
+			time as well as for specific instants in time:</para>
+		<programlisting>
+public interface &DateTimeFactory; extends &ValueFactory;&lt;&DateTime;> {
+
+    /**
+     * Create a date-time instance for the current time in the local time zone.
+     */
+    &DateTime; create();
+
+    /**
+     * Create a date-time instance for the current time in UTC.
+     */
+    &DateTime; createUtc();
+
+    &DateTime; create( &DateTime; original, long offsetInMillis );
+    &DateTime; create( int year, int monthOfYear, int dayOfMonth,
+                     int hourOfDay, int minuteOfHour, int secondOfMinute, int millisecondsOfSecond );
+    &DateTime; create( int year, int monthOfYear, int dayOfMonth,
+                     int hourOfDay, int minuteOfHour, int secondOfMinute, int millisecondsOfSecond,
+                     int timeZoneOffsetHours );
+    &DateTime; create(	int year, int monthOfYear, int dayOfMonth,
+                     int hourOfDay, int minuteOfHour, int secondOfMinute, int millisecondsOfSecond,
+                     int timeZoneOffsetHours, String timeZoneId );
+}
+		</programlisting>
+		<para>
+			The &PathFactory; interface defines methods for creating relative and absolute &Path; objects using combinations of other &Path; objects
+			and &Name;s and &PathSegment;s,
+			and introduces methods for creating &PathSegment; objects:
+		</para>
+		<programlisting>
+public interface &PathFactory; extends &ValueFactory;&lt;&Path;> {
+
+    &Path; createRootPath();
+    &Path; createAbsolutePath( &Name;... segmentNames );
+    &Path; createAbsolutePath( &PathSegment;... segments );
+    &Path; createAbsolutePath( &Iterable;&lt;&PathSegment;> segments );
+
+    &Path; createRelativePath();
+    &Path; createRelativePath( &Name;... segmentNames );
+    &Path; createRelativePath( &PathSegment;... segments );
+    &Path; createRelativePath( &Iterable;&lt;&PathSegment;> segments );
+
+    &Path; create( Path parentPath, &Path; childPath );
+    &Path; create( Path parentPath, &Name; segmentName, int index );
+    &Path; create( Path parentPath, String segmentName, int index );
+    &Path; create( Path parentPath, &Name;... segmentNames );
+    &Path; create( Path parentPath, &PathSegment;... segments );
+    &Path; create( Path parentPath, &Iterable;&lt;&PathSegment;> segments );
+    &Path; create( Path parentPath, String subpath );
+
+    &PathSegment; createSegment( String segmentName );
+    &PathSegment; createSegment( String segmentName, &TextDecoder; decoder );
+    &PathSegment; createSegment( String segmentName, int index );
+    &PathSegment; createSegment( &Name; segmentName );
+    &PathSegment; createSegment( &Name; segmentName, int index );
+}
+</programlisting>
+		<para>
+			And finally, the &BinaryFactory; defines methods for creating &Binary; objects from a variety of binary formats,
+			as well as a method that looks for a cached &Binary; instance given the supplied secure hash:
+		</para>
+		<programlisting>
+public interface &BinaryFactory; extends &ValueFactory;&lt;&Binary;> {
+
+    /**
+     * Create a value from the binary content given by the supplied input, the approximate length, 
+     * and the SHA-1 secure hash of the content. If the secure hash is null, then a secure hash is
+     * computed from the content. If the secure hash is not null, it is assumed to be the hash for 
+     * the content and may not be checked.
+     */
+    &Binary; create( &InputStream; stream, long approximateLength, byte[] secureHash ) 
+                          throws ValueFormatException, IoException;
+    &Binary; create( &Reader; reader, long approximateLength, byte[] secureHash ) 
+                          throws ValueFormatException, IoException;
+
+    /**
+     * Create a binary value from the given file.
+     */
+    &Binary; create( &File; file ) throws ValueFormatException, IoException;
+
+    /**
+     * Find an existing binary value given the supplied secure hash. If no such binary value exists, 
+     * null is returned. This method can be used when the caller knows the secure hash (e.g., from 
+     * a previously-held &Binary; object), and would like to reuse an existing binary value 
+     * (if possible) rather than recreate the binary value by processing the stream contents. This is
+     * especially true when the size of the binary is quite large.
+     * 
+     * @param secureHash the secure hash of the binary content, which was probably obtained from a
+     *        previously-held &Binary; object; a null or empty value is allowed, but will always 
+     *        result in returning null
+     * @return the existing Binary value that has the same secure hash, or null if there is no 
+     *        such value available at this time
+     */
+    &Binary; find( byte[] secureHash );
+}
+		</programlisting>
+		<para>
+			JBoss DNA provides efficient implementations of all of these interfaces: the &ValueFactory; interfaces and subinterfaces;
+			the &Path;, &PathSegment;, &Name;, &Binary;, &DateTime;, and &Reference; interfaces; and the &ValueFactories; interface
+			return by the &ExecutionContext;.  In fact, some of these interfaces have multiple implementations that are optimized for 
+			specific but frequently-occurring conditions.
+		</para>
 	</sect1>
-	<sect1 id="graph-encoders">
-		<title>Encoders and decoders</title>
+	<sect1 id="graph-readable">
+		<title>Readable, TextEncoder, and TextDecoder</title>
 		<para>
-			String representations of &Name; and &Path; objects  mentioned earlier that names are qualified with a namespace, and namespaces are identified by URIs.
-			Also, the local part of the names can contain any character.  So what do the string representation of names look like?
+			As shown above, the &Name;, &PathSegment;, &Path;, and &Property; interfaces all extend the &Readable; interface,
+			which defines a number of <code>getString(...)</code> methods that can produce a (readable) string representation of
+		  of that object.  Recall that all of these objects contain names with namespace URIs and local names (consisting of any
+		  characters), and so obtaining a readable string representation will require converting the URIs to prefixes, 
+		  escaping certain characters in the local names, and formatting the prefix and escaped local name appropriately.
+		  The different <code>getString(...)</code> methods of the &Readable; interface accept various combinations
+		  of &NamespaceRegistry; and &TextEncoder; parameters:
 		</para>
+		<programlisting>
+ at Immutable
+public interface Readable {
+
+    /**
+     * Get the string form of the object. A default encoder is used to encode characters.
+     * @return the encoded string
+     */
+    public String getString();
+
+    /**
+     * Get the encoded string form of the object, using the supplied encoder to encode characters.
+     * @param encoder the encoder to use, or null if the default encoder should be used
+     * @return the encoded string
+     */
+    public String getString( &TextEncoder; encoder );
+
+    /**
+     * Get the string form of the object, using the supplied namespace registry to convert any 
+     * namespace URIs to prefixes. A default encoder is used to encode characters.
+     * @param namespaceRegistry the namespace registry that should be used to obtain the prefix
+     *        for any namespace URIs
+     * @return the encoded string
+     * @throws IllegalArgumentException if the namespace registry is null
+     */
+    public String getString( &NamespaceRegistry; namespaceRegistry );
+
+    /**
+     * Get the encoded string form of the object, using the supplied namespace registry to convert 
+     * the any namespace URIs to prefixes.
+     * @param namespaceRegistry the namespace registry that should be used to obtain the prefix for 
+     *        the namespace URIs
+     * @param encoder the encoder to use, or null if the default encoder should be used
+     * @return the encoded string
+     * @throws IllegalArgumentException if the namespace registry is null
+     */
+    public String getString( &NamespaceRegistry; namespaceRegistry,
+                             &TextEncoder; encoder );
+
+    /**
+     * Get the encoded string form of the object, using the supplied namespace registry to convert 
+     * the names' namespace URIs to prefixes and the supplied encoder to encode characters, and using 
+     * the second delimiter to encode (or convert) the delimiter used between the namespace prefix 
+     * and the local part of any names.
+     * @param namespaceRegistry the namespace registry that should be used to obtain the prefix 
+     *        for the namespace URIs in the names
+     * @param encoder the encoder to use for encoding the local part and namespace prefix of any names, 
+     *        or null if the default encoder should be used
+     * @param delimiterEncoder the encoder to use for encoding the delimiter between the local part 
+     *        and namespace prefix of any names, or null if the standard delimiter should be used
+     * @return the encoded string
+     */
+    public String getString( &NamespaceRegistry; namespaceRegistry,
+                             &TextEncoder; encoder, &TextEncoder; delimiterEncoder );
+}
+		</programlisting>
 		<para>
-			The key is understanding that the namespaces will 
+			We've seen the &NamespaceRegistry; in the <link linkend="execution-context">previous chapter</link>,
+			but we've haven't yet talked about the &TextEncoder; interface.  A &TextEncoder; merely does what
+			you'd expect: it encodes the characters in a string using some implementation-specific algorithm.  
+			JBoss DNA provides a number of &TextEncoder; implementations, including:
+			<itemizedlist>
+				<listitem>
+					<para>The &Jsr283Encoder; escapes characters that are not allowed in JCR names, 
+						per the <ulink url="&JSR283;">JSR-283</ulink> specification.  Specifically,
+						these are the '*', '/', ':', '[', ']', and '|' characters, which are escaped by replacing
+						them with the Unicode characters U+F02A, U+F02F, U+F03A, U+F05B, U+F05D, and U+F07C, respectively.
+					</para>
+				</listitem>
+				<listitem>
+					<para>The &NoOpEncoder; does no conversion.
+					</para>
+				</listitem>
+				<listitem>
+					<para>The &UrlEncoder; converts text to be used within the different parts of a URL, as defined by Section 2.3 of
+						<ulink url="http://www.ietf.org/rfc/rfc2396.txt">RFC 2396</ulink>. Note that this class does not 
+						encode a complete URL (since <code>java.net.URLEncoder</code> and <code>java.net.URLDecoder</code>
+						should be used for such purposes).
+					</para>
+				</listitem>
+				<listitem>
+					<para>The &XmlNameEncoder; converts any UTF-16 unicode character that is not a valid XML name character according to the 
+						<ulink url="http://www.w3.org/TR/REC-xml/#sec-common-syn">World Wide Web Consortium (W3C) Extensible Markup Language (XML) 1.0
+						(Fourth Edition) Recommendation</ulink>, escaping such characters as <code>_xHHHH_</code>, where <code>HHHH</code> stands for the 
+						four-digit hexadecimal UTF-16 unicode value for the character in the most significant bit first order. 
+						For example, the name "Customer_ID" is encoded as "Customer_x0020_ID".
+					</para>
+				</listitem>
+				<listitem>
+					<para>The &XmlValueEncoder; escapes characters that are not allowed in XML values.  Specifically,
+						these are the '&amp;', '&lt;', '&gt;', '&quot;', and '&#039;', which are all escaped to
+						"&amp;amp;", '&amp;lt;', '&amp;gt;', '&amp;quot;', and '&amp;#039;'.
+					</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.
 		</para>
-		
-		
+		<para>
+			Of course, you can provide alternative implementations, and supply them to the appropriate <code>getString(...)</code> methods
+			as required.
+		</para>
 	</sect1>
 	<sect1 id="graph-api">
 		<title>Graph API</title>

Modified: trunk/docs/reference/src/main/docbook/en-US/custom.dtd
===================================================================
--- trunk/docs/reference/src/main/docbook/en-US/custom.dtd	2009-06-09 03:30:34 UTC (rev 1002)
+++ trunk/docs/reference/src/main/docbook/en-US/custom.dtd	2009-06-09 03:30:56 UTC (rev 1003)
@@ -28,7 +28,7 @@
 <!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 CND			      		"<ulink url='http://jackrabbit.apache.org/node-type-notation.html'>Compact Node Definition</ulink>">
+<!ENTITY CND			      							"<ulink url='http://jackrabbit.apache.org/node-type-notation.html'>Compact Node Definition</ulink>">
 
 <!-- Types in JRE -->
 
@@ -37,10 +37,11 @@
 <!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>">
+<!ENTITY Reader							      		"<ulink url='&Java;java/io/Reader.html'><interface>Reader</interface></ulink>">
 <!ENTITY IOException				      		"<ulink url='&Java;java/io/IOException.html'><classname>IOException</classname></ulink>">
 <!ENTITY ClassLoader				      		"<ulink url='&Java;java/lang/ClassLoader.html'><interface>ClassLoader</interface></ulink>">
 <!ENTITY AccessControlContext      		"<ulink url='&Java;java/security/AccessController.html'><classname>AccessControlContext</classname></ulink>">
-<!ENTITY PrivilegedAction			      		"<ulink url='&Java;java/security/PrivilegedAction.html'><classname>PrivilegedAction</classname></ulink>">
+<!ENTITY PrivilegedAction			      	"<ulink url='&Java;java/security/PrivilegedAction.html'><classname>PrivilegedAction</classname></ulink>">
 <!ENTITY LoginContext				      		"<ulink url='&Java;javax/security/auth/login/LoginContext.html'><classname>LoginContext</classname></ulink>">
 <!ENTITY Subject						      		"<ulink url='&Java;javax/security/auth/Subject.html'><classname>Subject</classname></ulink>">
 <!ENTITY CallbackHandler		      		"<ulink url='&Java;javax/security/auth/callback/CallbackHandler.html'><interface>CallbackHandler</interface></ulink>">
@@ -48,7 +49,13 @@
 <!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 HttpServletRequest			      		"<ulink url='&Java;javax/servlet/http/HttpServletRequest.html'><classname>HttpServletRequest</classname></ulink>">
+<!ENTITY HttpServletRequest			      "<ulink url='&Java;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 Iteratable								    "<ulink url='&Java;java/util/Iteratable.html'><interface>Iteratable</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>">
 
 
 <!-- Types in JCR API -->
@@ -57,14 +64,21 @@
 <!ENTITY Session						       		"<interface>Session</interface>">
 <!ENTITY Credentials					       	"<interface>Credentials</interface>">
 <!ENTITY SimpleCredentials					  "<interface>SimpleCredentials</interface>">
-<!ENTITY LoginException						  "<interface>LoginException</interface>">
-<!ENTITY AccessDeniedException						  "<interface>AccessDeniedException</interface>">
+<!ENTITY LoginException						  	"<interface>LoginException</interface>">
+<!ENTITY AccessDeniedException				"<interface>AccessDeniedException</interface>">
 
 <!-- Types in dna-common -->
 
 <!ENTITY Logger							       		"<ulink url='&API;common/util/Logger.html'><interface>Logger</interface></ulink>">
 <!ENTITY ClassLoaderFactory       		"<ulink url='&API;common/component/ClassLoaderFactory.html'><interface>ClassLoaderFactory</interface></ulink>">
 <!ENTITY StandardClassLoaderFactory		"<ulink url='&API;common/component/StandardClassLoaderFactory.html'><classname>StandardClassLoaderFactory</classname></ulink>">
+<!ENTITY TextEncoder				       		"<ulink url='&API;common/text/TextEncoder.html'><interface>TextEncoder</interface></ulink>">
+<!ENTITY TextDecoder				       		"<ulink url='&API;common/text/TextDecoder.html'><interface>TextDecoder</interface></ulink>">
+<!ENTITY Jsr283Encoder				       	"<ulink url='&API;common/text/Jsr283Encoder.html'><classname>Jsr283Encoder</classname></ulink>">
+<!ENTITY NoOpEncoder				       		"<ulink url='&API;common/text/Jsr283Encoder.html'><classname>NoOpEncoder</classname></ulink>">
+<!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>">
 
 <!-- Types in dna-graph -->
 
@@ -78,15 +92,25 @@
 <!ENTITY ExecutionContext		       		"<ulink url='&API;graph/ExecutionContext.html'><classname>ExecutionContext</classname></ulink>">
 <!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 ServletSecurityContext		   	"<ulink url='&API;graph/ServletSecurityContext.html'><interface>ServletSecurityContext</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>">
 <!ENTITY PathSegment				       		"<ulink url='&API;graph/property/Path.Segment.html'><interface>Path.Segment</interface></ulink>">
 <!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 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>">
+<!ENTITY DateTimeFactory		       		"<ulink url='&API;graph/property/DateTimeFactory.html'><interface>DateTimeFactory</interface></ulink>">
+<!ENTITY BinaryFactory		       			"<ulink url='&API;graph/property/BinaryFactory.html'><interface>BinaryFactory</interface></ulink>">
+<!ENTITY NameFactory		       				"<ulink url='&API;graph/property/NameFactory.html'><interface>NameFactory</interface></ulink>">
+<!ENTITY PathFactory		       				"<ulink url='&API;graph/property/PathFactory.html'><interface>PathFactory</interface></ulink>">
 <!ENTITY NamespaceRegistry       			"<ulink url='&API;graph/property/NamespaceRegistry.html'><interface>NamespaceRegistry</interface></ulink>">
 <!ENTITY Namespace				       			"<ulink url='&API;graph/property/NamespaceRegistry.Namespaces.html'><interface>Namespace</interface></ulink>">
 <!ENTITY PropertyFactory       				"<ulink url='&API;graph/property/PropertyFactory.html'><interface>PropertyFactory</interface></ulink>">
+<!ENTITY PropertyType		       				"<ulink url='&API;graph/property/PropertyType.html'><classname>PropertyType</classname></ulink>">
 <!ENTITY PathNotFoundException				"<ulink url='&API;graph/property/PathNotFoundException.html'><classname>PathNotFoundException</classname></ulink>">
 <!ENTITY RepositorySource       			"<ulink url='&API;graph/connector/RepositorySource.html'><interface>RepositorySource</interface></ulink>">
 <!ENTITY RepositoryConnection    			"<ulink url='&API;graph/connector/RepositoryConnection.html'><interface>RepositoryConnection</interface></ulink>">



From dna-commits at lists.jboss.org  Tue Jun  9 00:32:58 2009
From: dna-commits at lists.jboss.org (dna-commits at lists.jboss.org)
Date: Tue, 09 Jun 2009 00:32:58 -0400
Subject: [dna-commits] DNA SVN: r1004 - in
	trunk/docs/reference/src/main/docbook/en-US:
	content/connectors and 2 other directories.
Message-ID: <E1MDt18-0001rh-L4@committer01.frg.pub.inap.atl.jboss.com>

Author: rhauch
Date: 2009-06-09 00:32:58 -0400 (Tue, 09 Jun 2009)
New Revision: 1004

Modified:
   trunk/docs/reference/src/main/docbook/en-US/content/connectors/federation.xml
   trunk/docs/reference/src/main/docbook/en-US/content/connectors/in_memory.xml
   trunk/docs/reference/src/main/docbook/en-US/content/connectors/jboss_cache.xml
   trunk/docs/reference/src/main/docbook/en-US/content/core/connector.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/sequencers/compact_node_types.xml
   trunk/docs/reference/src/main/docbook/en-US/content/sequencers/image.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/xml.xml
   trunk/docs/reference/src/main/docbook/en-US/content/sequencers/zip.xml
   trunk/docs/reference/src/main/docbook/en-US/custom.dtd
Log:
Completed (pending editing/reviews) the chapter on the graph model.

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	2009-06-09 03:30:56 UTC (rev 1003)
+++ trunk/docs/reference/src/main/docbook/en-US/content/connectors/federation.xml	2009-06-09 04:32:58 UTC (rev 1004)
@@ -30,8 +30,160 @@
 ]>
 <chapter id="federation-connector">
   <title>Federation Connector</title>
-  <para>
-		blah blah 
-  </para>
+      <para>
+      	The federated repository source provides a unified repository consisting of information that is dynamically federated from multiple other
+				&RepositorySource; instances.  This is a very powerful repository source that appears to be a single repository, when in 
+				fact the content is stored and managed in multiple other systems.  Each &FederatedRepositorySource; is typically configured
+				with the name of another &RepositorySource; that should be used as the local, unified cache of the federated content.
+				The configuration also contains the names of the other &RepositorySource; instances that are to be federated along with
+				the &Projection; definition describing where in the unified repository the content is to appear.
+      </para>
+			<figure id="dna-connector-federation-image">
+				<title>Federating multiple sources using the Federated Repository Connector</title>
+				<graphic align="center" scale="100" fileref="dna-connector-federation.png"/>
+			</figure>
+      <para> The federation connector works by effectively building up a single graph by querying each source and merging or
+        unifying the responses. This information is cached, which improves performance, reduces the number of (potentially
+        expensive) remote calls, reduces the load on the sources, and helps mitigate problems with source availability. As
+        clients interact with the repository, this cache is consulted first. When the requested portion of the graph (or
+        "subgraph") is contained completely in the cache, it is retuned immediately. However, if any part of the requested
+        subgraph is not in the cache, each source is consulted for their contributions to that subgraph, and any results are
+        cached.</para>
+      <para> This basic flow makes it possible for the federated repository to build up a local cache of the integrated graph
+        (or at least the portions that are used by clients). In fact, the federated repository caches information in a manner
+        that is similar to that of the Domain Name System (DNS). As sources are consulted for their contributions, the source
+        also specifies whether it is the authoritative source for this information (some sources that are themselves federated
+        may not be the information's authority), whether the information may be modified, the time-to-live (TTL) value (the time
+        after which the cached information should be refreshed), and the expiration time (the time after which the cached
+        information is no longer valid). In effect, the source has complete control over how the information it contributes is
+        cached and used.</para>
+      <para>
+        The federated repository also needs to incorporate <emphasis>negative caching</emphasis>, which is storage of the knowledge 
+				that something does <emphasis>not</emphasis> exist. Sources can be configured to contribute information
+        only below certain paths (e.g., <code>/A/B/C</code>), and the federation engine can take advantage of this by never 
+				consulting that source for contributions to information on other paths. However, below that path, any negative responses 
+				must also be cached (with appropriate TTL and expiry parameters) to prevent the exclusion of that source (in case the source 
+				has information to contribute at a later time) or the frequent checking with the source.
+      </para>
+			<para>
+				The federated repository uses other &RepositorySource;s that are to be federated and a &RepositorySource; that is to be used as the
+				cache of the unified contents.  These are configured in another &RepositorySource; that is treated as a configuration repository.
+				The &FederatedRepositorySource; class uses JavaBean properties to define the name of the configuration repository and 
+				the path to the "<code>dna:federation</code>" node in that configuration repository containing the information about the 
+				cache and federated sources.  This graph structure that is expected at this location is as follows:
+			</para>
+			<programlisting><![CDATA[<!-- Define the federation configuration. -->
+<dna:federatedRepository xmlns:dna="http://www.jboss.org/dna" 
+	                   xmlns:jcr="http://www.jcp.org/jcr/1.0"
+                     dna:timeToCache="100000" >
+  <dna:workspaces>
+    <dna:workspace jcr:name="default">
+	    <!-- Define how the content in the 'Cache' source is to map to the federated cache -->
+      <dna:cache dna:sourceName="Cache" dna:workspaceName="default" dna:projectionRules="/a => /" />
+
+      <!-- Define how the content in the two sources maps to the federated/unified repository.
+           This example puts the 'Cars' and 'Aircraft' content underneath '/vehicles', but the
+           'Configuration' content (which is defined by this file) will appear under '/'. -->
+      <dna:projections>
+        <dna:projection jcr:name="Cars" dna:projectionRules="/Vehicles => /" />
+        <dna:projection jcr:name="Aircraft" dna:projectionRules="/Vehicles => /" />
+        <dna:projection jcr:name="Configuration" dna:projectionRules="/ => /" />
+      </dna:projections>
+    </dna:workspace>
+	</dna:workspaces>
+</dna:federatedRepository>
+]]></programlisting>
+			<note>
+				<para>
+					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
+					works.
+				</para>
+			</note>
+			<para>
+				Notice that there is a cache projection and three source projections, and each projection defines
+				one or more <emphasis>projection rules</emphasis> that are of the form:
+			</para>
+			<programlisting>pathInFederatedRepository =&gt; pathInSourceRepository</programlisting>
+			<para>
+				So, a projection rule <code>/Vehicles =&gt; /</code> projects the entire contents of the source so that
+				it appears in the federated repository under the "<code>/Vehicles</code>" node.
+			</para>
+			<para>
+				The &FederatedRepositorySource; class provides a number of JavaBean properties that control its behavior:
+			</para>
+			<table frame='all'>
+				<title>&FederatedRepositorySource; 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>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>repositoryName</entry>
+							<entry>The name for the federated repository.</entry>
+						</row>
+						<row>
+							<entry>configurationSourceName</entry>
+							<entry>The name of the &RepositorySource; that should be used as the configuration repository, and in which is defined
+								how this federated repository is to be set up and configured.
+								This name is supplied to the &RepositoryConnectionFactory; that is provided to this instance when added to the
+								&RepositoryLibrary;.</entry>
+						</row>
+						<row>
+							<entry>configurationWorkspaceName</entry>
+							<entry>The name of the workspace in the configuration &RepositorySource; with the content defining
+								how this federated repository is to be set up and configured.</entry>
+						</row>
+						<row>
+							<entry>configurationSourcePath</entry>
+							<entry>The path to the node in the configuration repository below which a "dna:federation" node exists with the 
+								graph structure describing how this federated repository is to be configured.</entry>
+						</row>
+						<row>
+							<entry>securityDomain</entry>
+							<entry>Optional property that, if used, specifies the name of the JAAS application context that should be used
+								to establish the <link linkend="execution-contenxt">execution context</link> for this repository.
+								This should correspond to the JAAS login configuration located within the JAAS login configuration file, 
+								and should be used only if a "<code>username</code>" property is defined.</entry>
+						</row>
+						<row>
+							<entry>username</entry>
+							<entry>Optional property that, if used, defines the name of the JAAS subject that should be used
+								to establish the <link linkend="execution-contenxt">execution context</link> for this repository.
+								This should be used if a "<code>securityDomain</code>" property is defined.</entry>
+						</row>
+						<row>
+							<entry>password</entry>
+							<entry>Optional property that, if used, defines the password of the JAAS subject that should be used
+								to establish the <link linkend="execution-contenxt">execution context</link> for this repository.
+								If the password is not provided but values for the "<code>securityDomain</code>" and "<code>username</code>" properties are,
+								then authentication will use the default JAAS callback handlers.</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>
+						</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>
+					</tbody>
+				</tgroup>
+			</table>
 </chapter>
 

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	2009-06-09 03:30:56 UTC (rev 1003)
+++ trunk/docs/reference/src/main/docbook/en-US/content/connectors/in_memory.xml	2009-06-09 04:32:58 UTC (rev 1004)
@@ -31,7 +31,56 @@
 <chapter id="in-memory-connector">
   <title>In-Memory Connector</title>
   <para>
-		blah blah 
+  	The in-memory repository connector is a simple connector that creates a transient, in-memory repository.
+		This repository is used as a very simple in-memory cache or as a standalone transient repository.
   </para>
+	<para>
+		The &InMemoryRepositorySource; class provides a number of JavaBean properties that control its behavior:
+	</para>
+	<table frame='all'>
+		<title>&InMemoryRepositorySource; 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>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>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>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>
+				</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>
+				</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>
 </chapter>
 

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	2009-06-09 03:30:56 UTC (rev 1003)
+++ trunk/docs/reference/src/main/docbook/en-US/content/connectors/jboss_cache.xml	2009-06-09 04:32:58 UTC (rev 1004)
@@ -31,7 +31,78 @@
 <chapter id="jboss-cache-connector">
   <title>JBoss Cache Connector</title>
   <para>
-		blah blah 
+  	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.
   </para>
+	<para>
+		The &JBossCacheSource; class provides a number of JavaBean properties that control its behavior:
+	</para>
+	<table frame='all'>
+		<title>&JBossCacheSource; 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>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>cacheFactoryJndiName</entry>
+					<entry>Optional property that, if used, specifies the name in JNDI where an existing JBoss Cache Factory instance can be found.
+						That factory would then be used if needed to create a JBoss Cache instance.  If no value is provided, then the
+						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
+						a special way.</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>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>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>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 defines the names of the workspaces that exist and that are available for use without having to create them.</entry>
+				</row>
+				<row>
+					<entry>creatingWorkspacesAllowed</entry>
+					<entry>Optional property that is by default 'true' that defines whether clients can create new workspaces.</entry>
+				</row>
+			</tbody>
+		</tgroup>
+	</table>
 </chapter>
 

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	2009-06-09 03:30:56 UTC (rev 1003)
+++ trunk/docs/reference/src/main/docbook/en-US/content/core/connector.xml	2009-06-09 04:32:58 UTC (rev 1004)
@@ -169,7 +169,7 @@
   </sect1>
   <sect1 id="repository-workspaces">
     <title>Workspaces</title>
-		<para>The previous section talked about how connector expose their information through the graph language of JBoss DNA.
+		<para>The <link linkend="graph-api-workspaces">previous chapter</link> talked about how connector expose their information through the graph language of JBoss DNA.
 			This is true, except that we didn't dive into too much of the detail.  JBoss DNA graphs have the notion of <emphasis>workspaces</emphasis>
 			in which the content appears, and its very easy for clients using the graph to switch between workspaces.  In fact,
 			workspaces differ from each other in that they provide different views of the same information.
@@ -277,300 +277,11 @@
   <sect1 id="connector-library">
     <title>Out-of-the-box repository connectors</title>
     <para>
-    	A number of repository connectors are already available in JBoss DNA, and are outlined in the following sections.
+    	A number of repository connectors are already available in JBoss DNA, and are outlined in detail
+      <link linkend="provied-connectors-part">later in the document</link>.
 			Note that we do want to build <ulink url="https://jira.jboss.org/jira/secure/IssueNavigator.jspa?reset=true&amp;mode=hide&amp;pid=12310520&amp;sorter/order=DESC&amp;sorter/field=priority&amp;resolution=-1&amp;component=12311441">more connectors</ulink>
 			in the upcoming releases.
     </para>
-    <sect2 id="dna-connector-inmemory">
-      <title>In-memory connector</title>
-      <para>
-      	The in-memory repository connector is a simple connector that creates a transient, in-memory repository.
-				This repository is used as a very simple in-memory cache or as a standalone transient repository.
-      </para>
-			<para>
-				The &InMemoryRepositorySource; class provides a number of JavaBean properties that control its behavior:
-			</para>
-			<table frame='all'>
-				<title>&InMemoryRepositorySource; 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>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>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>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>
-						</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>
-						</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>
-    </sect2>
-    <sect2 id="dna-connector-jbosscache">
-      <title>JBoss Cache connector</title>
-      <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="dna-connector-federation">federated</link>
-				repository.
-      </para>
-			<para>
-				The &JBossCacheSource; class provides a number of JavaBean properties that control its behavior:
-			</para>
-			<table frame='all'>
-				<title>&JBossCacheSource; 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>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>cacheFactoryJndiName</entry>
-							<entry>Optional property that, if used, specifies the name in JNDI where an existing JBoss Cache Factory instance can be found.
-								That factory would then be used if needed to create a JBoss Cache instance.  If no value is provided, then the
-								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
-								a special way.</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>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>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>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 defines the names of the workspaces that exist and that are available for use without having to create them.</entry>
-						</row>
-						<row>
-							<entry>creatingWorkspacesAllowed</entry>
-							<entry>Optional property that is by default 'true' that defines whether clients can create new workspaces.</entry>
-						</row>
-					</tbody>
-				</tgroup>
-			</table>
-    </sect2>
-    <sect2 id="dna-connector-federation">
-      <title>Federating connector</title>
-      <para>
-      	The federated repository source provides a unified repository consisting of information that is dynamically federated from multiple other
-				&RepositorySource; instances.  This is a very powerful repository source that appears to be a single repository, when in 
-				fact the content is stored and managed in multiple other systems.  Each &FederatedRepositorySource; is typically configured
-				with the name of another &RepositorySource; that should be used as the local, unified cache of the federated content.
-				The configuration also contains the names of the other &RepositorySource; instances that are to be federated along with
-				the &Projection; definition describing where in the unified repository the content is to appear.
-      </para>
-			<figure id="dna-connector-federation-image">
-				<title>Federating multiple sources using the Federated Repository Connector</title>
-				<graphic align="center" scale="100" fileref="dna-connector-federation.png"/>
-			</figure>
-      <para> The federation connector works by effectively building up a single graph by querying each source and merging or
-        unifying the responses. This information is cached, which improves performance, reduces the number of (potentially
-        expensive) remote calls, reduces the load on the sources, and helps mitigate problems with source availability. As
-        clients interact with the repository, this cache is consulted first. When the requested portion of the graph (or
-        "subgraph") is contained completely in the cache, it is retuned immediately. However, if any part of the requested
-        subgraph is not in the cache, each source is consulted for their contributions to that subgraph, and any results are
-        cached.</para>
-      <para> This basic flow makes it possible for the federated repository to build up a local cache of the integrated graph
-        (or at least the portions that are used by clients). In fact, the federated repository caches information in a manner
-        that is similar to that of the Domain Name System (DNS). As sources are consulted for their contributions, the source
-        also specifies whether it is the authoritative source for this information (some sources that are themselves federated
-        may not be the information's authority), whether the information may be modified, the time-to-live (TTL) value (the time
-        after which the cached information should be refreshed), and the expiration time (the time after which the cached
-        information is no longer valid). In effect, the source has complete control over how the information it contributes is
-        cached and used.</para>
-      <para>
-        The federated repository also needs to incorporate <emphasis>negative caching</emphasis>, which is storage of the knowledge 
-				that something does <emphasis>not</emphasis> exist. Sources can be configured to contribute information
-        only below certain paths (e.g., <code>/A/B/C</code>), and the federation engine can take advantage of this by never 
-				consulting that source for contributions to information on other paths. However, below that path, any negative responses 
-				must also be cached (with appropriate TTL and expiry parameters) to prevent the exclusion of that source (in case the source 
-				has information to contribute at a later time) or the frequent checking with the source.
-      </para>
-			<para>
-				The federated repository uses other &RepositorySource;s that are to be federated and a &RepositorySource; that is to be used as the
-				cache of the unified contents.  These are configured in another &RepositorySource; that is treated as a configuration repository.
-				The &FederatedRepositorySource; class uses JavaBean properties to define the name of the configuration repository and 
-				the path to the "<code>dna:federation</code>" node in that configuration repository containing the information about the 
-				cache and federated sources.  This graph structure that is expected at this location is as follows:
-			</para>
-			<programlisting><![CDATA[<!-- Define the federation configuration. -->
-<dna:federatedRepository xmlns:dna="http://www.jboss.org/dna" 
-	                   xmlns:jcr="http://www.jcp.org/jcr/1.0"
-                     dna:timeToCache="100000" >
-  <dna:workspaces>
-    <dna:workspace jcr:name="default">
-	    <!-- Define how the content in the 'Cache' source is to map to the federated cache -->
-      <dna:cache dna:sourceName="Cache" dna:workspaceName="default" dna:projectionRules="/a => /" />
-
-      <!-- Define how the content in the two sources maps to the federated/unified repository.
-           This example puts the 'Cars' and 'Aircraft' content underneath '/vehicles', but the
-           'Configuration' content (which is defined by this file) will appear under '/'. -->
-      <dna:projections>
-        <dna:projection jcr:name="Cars" dna:projectionRules="/Vehicles => /" />
-        <dna:projection jcr:name="Aircraft" dna:projectionRules="/Vehicles => /" />
-        <dna:projection jcr:name="Configuration" dna:projectionRules="/ => /" />
-      </dna:projections>
-    </dna:workspace>
-	</dna:workspaces>
-</dna:federatedRepository>
-]]></programlisting>
-			<note>
-				<para>
-					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
-					works.
-				</para>
-			</note>
-			<para>
-				Notice that there is a cache projection and three source projections, and each projection defines
-				one or more <emphasis>projection rules</emphasis> that are of the form:
-			</para>
-			<programlisting>pathInFederatedRepository =&gt; pathInSourceRepository</programlisting>
-			<para>
-				So, a projection rule <code>/Vehicles =&gt; /</code> projects the entire contents of the source so that
-				it appears in the federated repository under the "<code>/Vehicles</code>" node.
-			</para>
-			<para>
-				The &FederatedRepositorySource; class provides a number of JavaBean properties that control its behavior:
-			</para>
-			<table frame='all'>
-				<title>&FederatedRepositorySource; 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>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>repositoryName</entry>
-							<entry>The name for the federated repository.</entry>
-						</row>
-						<row>
-							<entry>configurationSourceName</entry>
-							<entry>The name of the &RepositorySource; that should be used as the configuration repository, and in which is defined
-								how this federated repository is to be set up and configured.
-								This name is supplied to the &RepositoryConnectionFactory; that is provided to this instance when added to the
-								&RepositoryLibrary;.</entry>
-						</row>
-						<row>
-							<entry>configurationWorkspaceName</entry>
-							<entry>The name of the workspace in the configuration &RepositorySource; with the content defining
-								how this federated repository is to be set up and configured.</entry>
-						</row>
-						<row>
-							<entry>configurationSourcePath</entry>
-							<entry>The path to the node in the configuration repository below which a "dna:federation" node exists with the 
-								graph structure describing how this federated repository is to be configured.</entry>
-						</row>
-						<row>
-							<entry>securityDomain</entry>
-							<entry>Optional property that, if used, specifies the name of the JAAS application context that should be used
-								to establish the <link linkend="execution-contenxt">execution context</link> for this repository.
-								This should correspond to the JAAS login configuration located within the JAAS login configuration file, 
-								and should be used only if a "<code>username</code>" property is defined.</entry>
-						</row>
-						<row>
-							<entry>username</entry>
-							<entry>Optional property that, if used, defines the name of the JAAS subject that should be used
-								to establish the <link linkend="execution-contenxt">execution context</link> for this repository.
-								This should be used if a "<code>securityDomain</code>" property is defined.</entry>
-						</row>
-						<row>
-							<entry>password</entry>
-							<entry>Optional property that, if used, defines the password of the JAAS subject that should be used
-								to establish the <link linkend="execution-contenxt">execution context</link> for this repository.
-								If the password is not provided but values for the "<code>securityDomain</code>" and "<code>username</code>" properties are,
-								then authentication will use the default JAAS callback handlers.</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>
-						</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>
-					</tbody>
-				</tgroup>
-			</table>
-    </sect2>
   </sect1>
   <sect1 id="custom-connectors">
     <title>Writing custom connectors</title>
@@ -1288,174 +999,6 @@
 			</para>
 		</sect2>
   </sect1>
-	<sect1 id="dna_graph_api">
-		<title>Graph API for using connectors</title>
-		<para>
-			So far we've talked about repositories, repository connectors, and how connectors respond to the different kinds of requests.
-			Normally you'd code to the JCR API and use our JCR implementation.  However, what does your code look like if you want 
-			to use the connectors directly, without using our JCR implementation?  After all, you may be a contributor to JBoss DNA,
-			or you may want to take advantage of our connectors without all the overhead of JCR.
-		</para>
-		<para>
-			One option, of course, is to explicitly create the different requests and pass them to the connector's <code>execute(...)</code> method.
-			While this is the most efficient approach (and one taken in some key DNA components), you probably want something that
-			is much less verbose and much easier to use.  This is where the DNA graph API comes in.
-		</para>
-		<para>
-			JBoss DNA's <emphasis>Graph API</emphasis> was designed as a lightweight public API for working with graph information,
-			and it insulates components from the underlying requests and interacting with connectors.  
-			The &Graph; class is the primary class in API, and each instance represents a single, independent
-			view of the graph of content from a single connector.  &Graph; instances return snapshots of state, and those snapshots
-			never change after they're retrieved.  To obtain a &Graph; instance, use the static <code>create(...)</code>
-			method, supplying the name of the source, a &RepositoryConnectionFactory; from which a &RepositoryConnection; can be obtained,
-			and the &ExecutionContext;.
-		</para>
-		<para>
-			The &Graph; class basically represents an <ulink url="http://www.martinfowler.com/bliki/DomainSpecificLanguage.html">internal domain specific language (DSL)</ulink>,
-			designed to be easy to use in an application.  
-			The Graph API makes extensive use of interfaces and method chaining, so that methods return a concise interface that has only those
-			methods that make sense at that point.  In fact, this should be really easy if your IDE has code completion.
-			Just remember that under the covers, a &Graph; is just building &Request; objects, submitting them to the connector,
-			and then exposing the results.
-		</para>
-		<sect2 id="dna_graph_api_workspaces">
-			<title>Using workspaces</title>
-		<para>
-			Let's look at some examples of how the Graph API works.  This first example shows how to obtain the names of the available workspaces:
-		</para>
-		<programlisting>
-&Set;&lt;&String;> workspaceNames = graph.getWorkspaces();
-</programlisting>
-		<para>Once you know the name of the workspace, you can specify that the graph should use it:
-		</para>
-		<programlisting>
-graph.useWorkspace("myWorkspace");
-</programlisting>
-		<para>
-			From this point forward, all requests will apply to the workspace named "myWorkspace".  At any time, you can use a different workspace,
-			which will affect all subsequent requests made using the graph.  Of course, creating a new workspace is just as easy:
-		</para>
-		<programlisting>
-graph.createWorkspace().named("newWorkspace");
-</programlisting>
-	  <para>This will attempt to create a workspace named "newWorkspace", which will fail if that workspace already exists.  You may
-		want to create a new workspace with a name that should be altered if the name you supply is already used.  The following code shows
-		how you can do this:
-		</para>
-		<programlisting>
-graph.createWorkspace().namedSomethingLike("newWorkspace");
-</programlisting>
-	  <para>If there is no existing workspace named "newWorkspace", a new one will be created with this name.  However, if "newWorkspace" already
-		exists, this call will create a workspace with a name that is some alteration of the supplied name.
-		</para>
-	  <para>
-		You can also clone workspaces, too:
-		</para>
-		<programlisting>
-graph.createWorkspace().clonedFrom("original").named("something");
-</programlisting>
-		<para>
-			or
-		</para>
-		<programlisting>
-graph.createWorkspace().clonedFrom("original").namedSomethingLike("something");
-</programlisting>
-		<para>
-			As you can see, it's very easy to specify which workspace you want to use or to create new workspaces.  You can also find out which workspace
-			the graph is currently using:
-		</para>
-		<programlisting>
-&String; current = graph.getCurrentWorkspaceName();
-</programlisting>
-		<para>or, if you want, you can get more information about the workspace:
-		</para>
-		<programlisting>
-&Workspace; current = graph.getCurrentWorkspace();
-&String; name = current.getName();
-&Location; rootLocation = current.getRoot();
-</programlisting>
-    </sect2>
-		<sect2 id="dna_graph_api_nodes">
-			<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;:
-		</para>
-		<programlisting>
-&Path; path = ...
-Map&lt;&Name;,&Property;> propertiesByName = graph.getPropertiesByName().on(path);
-</programlisting>
-		<para>
-			This next example shows how the graph can be used to obtain and loop over the properties of a node:
-		</para>
-		<programlisting>
-&Path; path = ...
-for ( &Property; property : graph.getProperties().on(path) ) {
-	  ...
-}
-</programlisting>
-		<para>
-			Likewise, the next example shows how the graph can be used to obtain and loop over the children of a node:
-		</para>
-		<programlisting>
-&Path; path = ...
-for ( &Location; child : graph.getChildren().of(path) ) {
-    &Path; childPath = child.getPath();
-	  ...
-}
-</programlisting>
-		<para>
-			Notice that the examples pass a &Path; instance to the <code>on(...)</code> and <code>of(...)</code> methods.  Many
-			of the Graph API methods take a variety of parameter types, including String, &Path;s, &Location;s, &UUID;, or &Property; parameters.
-			This should make it easy to use in many different situations.
-		</para>
-		<para>
-			Of course, changing content is more interesting and offers more interesting possibilities.  Here are a few examples:
-		</para>
-		<programlisting>
-&Path; path = ...
-&Location; location = ...
-&Property; idProp1 = ...
-&Property; idProp2 = ...
-&UUID; uuid = ...
-graph.move(path).into(idProp1, idProp2);
-graph.copy(path).into(location);
-graph.delete(uuid);
-graph.delete(idProp1,idProp2);
-</programlisting>
-		<para>
-			The methods shown above work immediately, as soon as each request is built.  However, there is another way to use
-			the &Graph; object, and that is in a <emphasis>batch</emphasis> mode.  Simply create a &GraphBatch; object using the
-			<code>batch()</code> method, create the requests on that batch object, and then execute all of the commands on the
-			batch by calling its <code>execute()</code> method.  That <code>execute()</code> method returns a &Results; interface
-			that can be used to read the node information retrieved by the batched requests. 
-		</para>
-		<para>
-			Method chaining works really well with the batch mode, since multiple commands can be assembled together very easily:
-		</para>
-		<programlisting>
-&Path; path = ...
-String path2 = ...
-&Location; location = ...
-&Property; idProp1 = ...
-&Property; idProp2 = ...
-&UUID; uuid = ...
-graph.batch().move(path).into(idProp1, idProp2).and().copy(path2).into(location).and().delete(uuid).execute();
-&Results; results = graph.batch().read(path2).
-                    and().readChildren().of(idProp1,idProp2).
-                    and().readSugraphOfDepth(3).at(uuid2).
-                    execute();
-for ( &Location; child : results.getNode(path2) ) {
-    ...
-}
-</programlisting>
-		<para>
-			Of course, this section provided just a hint of the Graph API.  
-			The &Graph; interface is actually quite complete and offers a full-featured approach for reading and updating a graph.
-			For more information, see the &Graph; JavaDocs.
-		</para>
-	</sect2>
-	</sect1>
 	<sect1>
 		<title>Summary</title>
 		<para>

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	2009-06-09 03:30:56 UTC (rev 1003)
+++ trunk/docs/reference/src/main/docbook/en-US/content/core/graph.xml	2009-06-09 04:32:58 UTC (rev 1004)
@@ -715,17 +715,252 @@
 			as required.
 		</para>
 	</sect1>
+	<sect1 id="graph-location">
+		<title>Locations</title>
+		<para>
+			In addition to &Path; objects, nodes can be identified by one or more <emphasis>identification properties</emphasis>.
+			These really are just &Property; instances with names that have a special meaning 
+			(usually to <link linkend="connector-framework">connectors</link>).
+			JBoss DNA also defines a &Location; class that encapsulates:
+		  <itemizedlist>
+		    <listitem>
+		      <para>the &Path; to the node; or</para>
+		    </listitem>
+		    <listitem>
+		      <para>one or more <emphasis>identification properties</emphasis> that are likely source=specific
+						and that are represented with &Property; objects; or</para>
+		    </listitem>
+		    <listitem>
+		      <para>a combination of both.</para>
+		    </listitem>
+		  </itemizedlist>
+			So, when a client knows the path and/or the identification properties, they can create a &Location; object
+			and then use that to identify the node.  &Location; is a class that can be instantiated through factory 
+			methods on the class:
+		</para>
+		<programlisting>
+public abstract class &Location; implements &Iterable;&lt;&Property;>, Comparable&lt;&Location;> {
+
+    public static &Location; create( &Path; path ) { ... }
+    public static &Location; create( &UUID; uuid ) { ... }
+    public static &Location; create( &Path; path, &UUID; uuid ) { ... }
+    public static &Location; create( &Path; path, &Property; idProperty ) { ... }
+    public static &Location; create( &Path; path, &Property; firstIdProperty, 
+                                     &Property;... remainingIdProperties ) { ... }
+    public static &Location; create( &Path; path, &Iterable;&lt;&Property; idProperties ) { ... }
+    public static &Location; create( &Property; idProperty ) { ... }
+    public static &Location; create( &Property; firstIdProperty, 
+                                     &Property;... remainingIdProperties ) { ... }
+    public static &Location; create( &Iterable;&lt;&Property;> idProperties ) { ... }
+    public static &Location; create( &List;&lt;&Property;> idProperties ) { ... }
+    ...
+}		</programlisting>
+		<para>
+		  Like many of the other classes and interfaces, &Location; is immutable and cannot be changed once created.
+		  However, there are methods on the class to create a copy of the &Location; object with a different &Path;,
+		  a different &UUID;, or different identification properties:
+		</para>
+		<programlisting>
+public abstract class &Location; implements &Iterable;&lt;&Property;>, Comparable&lt;&Location;> {
+    ...
+    public &Location; with( &Property; newIdProperty );
+    public &Location; with( &Path; newPath );
+    public &Location; with( &UUID; uuid );
+    ...
+}		</programlisting>
+		<para>
+			One more thing about locations: we'll see later in the next chapter how they are used to make requests
+			to the <link linkend="connector-framework">connectors</link>.  When creating the requests, clients usually have an 
+			incomplete location (e.g., a path but no identification properties).  When processing the requests, connectors
+			provide an <emphasis>actual</emphasis> location that contains the path <emphasis>and</emphasis> all identification properties.
+			If actual &Location; objects are then reused in subsequent requests by the client, the connectors will have the benefit of having
+			both the path and identification properties and may be able to more efficiently locate the identified node.
+		</para>
+	</sect1>
 	<sect1 id="graph-api">
 		<title>Graph API</title>
 		<para>
-			
+			JBoss DNA's <emphasis>Graph API</emphasis> was designed as a lightweight public API for working with graph information.
+			The &Graph; class is the primary class in API, and each instance represents a single, independent
+			view of a single graph.  &Graph; instances don't maintain state, so every request (or batch of requests) operate against
+			the underlying graph and the return <emphasis>immutable snapshots</emphasis> of the requested state at the time
+			the request was made.
 		</para>
-	</sect1>
-	<sect1 id="graph-requests">
-		<title>Request Model</title>
 		<para>
-			
+			There are several ways to obtain a &Graph; instance, as we'll see in later chapters.  For the time being, the important
+			thing to understand is what a &Graph; instance represents and how it interacts with the underlying content to return
+			representations of portions of that underlying graph content.
 		</para>
+		<para>
+			The &Graph; class basically represents an <ulink url="http://www.martinfowler.com/bliki/DomainSpecificLanguage.html">internal domain specific language (DSL)</ulink>,
+			designed to be easy to use in an application.  
+			The Graph API makes extensive use of interfaces and method chaining, so that methods return a concise interface that has only those
+			methods that make sense at that point.  In fact, this should be really easy if your IDE has code completion.
+			Just remember that under the covers, a &Graph; is just building &Request; objects, submitting them to the connector,
+			and then exposing the results.
+		</para>
+		<para>
+			The next few subsections describe how to use a &Graph; instance.
+		</para>
+		<sect2 id="graph-api-workspaces">
+			<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
+			existing workspaces, while other graphs will not allow adding or removing workspaces.  Some graphs may have workspaces may show the same (or very
+			similar) content, while other graphs may have workspaces that each contain completely independent content.
+		</para>
+		<para>
+			The &Graph; object is always bound to a workspace, which initially is the <emphasis>default workspace</emphasis>.  To find out
+			what the name of the default workspace is, simply ask for the current workspace after creating the &Graph;:
+		</para>
+		<programlisting>
+&Workspace; current = graph.getCurrentWorkspace();
+</programlisting>
+		<para>
+			To obtain the list of workspaces available in a graph, simply ask for them:
+		</para>
+		<programlisting>
+&Set;&lt;&String;> workspaceNames = graph.getWorkspaces();
+</programlisting>
+		<para>Once you know the name of a particular workspace, you can specify that the graph should use it:
+		</para>
+		<programlisting>
+graph.useWorkspace("myWorkspace");
+</programlisting>
+		<para>
+			From this point forward, all requests will apply to the workspace named "myWorkspace".  At any time, you can use a different workspace,
+			which will affect all subsequent requests made using the graph.  To go back to the default workspace, simply supply a null name:
+		</para>
+		<programlisting>
+graph.useWorkspace(null);
+</programlisting>
+		<para>
+			Of course, creating a new workspace is just as easy:
+		</para>
+		<programlisting>
+graph.createWorkspace().named("newWorkspace");
+</programlisting>
+	  <para>This will attempt to create a workspace named "newWorkspace", which will fail if that workspace already exists.  You may
+		want to create a new workspace with a name that should be altered if the name you supply is already used.  The following code shows
+		how you can do this:
+		</para>
+		<programlisting>
+graph.createWorkspace().namedSomethingLike("newWorkspace");
+</programlisting>
+	  <para>If there is no existing workspace named "newWorkspace", a new one will be created with this name.  However, if "newWorkspace" already
+		exists, this call will create a workspace with a name that is some alteration of the supplied name.
+		</para>
+	  <para>
+		You can also clone workspaces, too:
+		</para>
+		<programlisting>
+graph.createWorkspace().clonedFrom("original").named("something");
+</programlisting>
+		<para>
+			or
+		</para>
+		<programlisting>
+graph.createWorkspace().clonedFrom("original").namedSomethingLike("something");
+</programlisting>
+		<para>
+			As you can see, it's very easy to specify which workspace you want to use or to create new workspaces.  You can also find out which workspace
+			the graph is currently using:
+		</para>
+		<programlisting>
+&String; current = graph.getCurrentWorkspaceName();
+</programlisting>
+		<para>or, if you want, you can get more information about the workspace:
+		</para>
+		<programlisting>
+&Workspace; current = graph.getCurrentWorkspace();
+&String; name = current.getName();
+&Location; rootLocation = current.getRoot();
+</programlisting>
+    </sect2>
+		<sect2 id="graph_api_nodes">
+			<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;:
+		</para>
+		<programlisting>
+&Path; path = ...
+Map&lt;&Name;,&Property;> propertiesByName = graph.getPropertiesByName().on(path);
+</programlisting>
+		<para>
+			This next example shows how the graph can be used to obtain and loop over the properties of a node:
+		</para>
+		<programlisting>
+&Path; path = ...
+for ( &Property; property : graph.getProperties().on(path) ) {
+	  ...
+}
+</programlisting>
+		<para>
+			Likewise, the next example shows how the graph can be used to obtain and loop over the children of a node:
+		</para>
+		<programlisting>
+&Path; path = ...
+for ( &Location; child : graph.getChildren().of(path) ) {
+    &Path; childPath = child.getPath();
+	  ...
+}
+</programlisting>
+		<para>
+			Notice that the examples pass a &Path; instance to the <code>on(...)</code> and <code>of(...)</code> methods.  Many
+			of the Graph API methods take a variety of parameter types, including String, &Path;s, &Location;s, &UUID;, or &Property; parameters.
+			This should make it easy to use in many different situations.
+		</para>
+		<para>
+			Of course, changing content is more interesting and offers more interesting possibilities.  Here are a few examples:
+		</para>
+		<programlisting>
+&Path; path = ...
+&Location; location = ...
+&Property; idProp1 = ...
+&Property; idProp2 = ...
+&UUID; uuid = ...
+graph.move(path).into(idProp1, idProp2);
+graph.copy(path).into(location);
+graph.delete(uuid);
+graph.delete(idProp1,idProp2);
+</programlisting>
+		<para>
+			The methods shown above work immediately, as soon as each request is built.  However, there is another way to use
+			the &Graph; object, and that is in a <emphasis>batch</emphasis> mode.  Simply create a &GraphBatch; object using the
+			<code>batch()</code> method, create the requests on that batch object, and then execute all of the commands on the
+			batch by calling its <code>execute()</code> method.  That <code>execute()</code> method returns a &Results; interface
+			that can be used to read the node information retrieved by the batched requests. 
+		</para>
+		<para>
+			Method chaining works really well with the batch mode, since multiple commands can be assembled together very easily:
+		</para>
+		<programlisting>
+&Path; path = ...
+String path2 = ...
+&Location; location = ...
+&Property; idProp1 = ...
+&Property; idProp2 = ...
+&UUID; uuid = ...
+graph.batch().move(path).into(idProp1, idProp2)
+       .and().copy(path2).into(location)
+       .and().delete(uuid)
+       .execute();
+&Results; results = graph.batch().read(path2)
+                           .and().readChildren().of(idProp1,idProp2)
+                           .and().readSugraphOfDepth(3).at(uuid2)
+                           .execute();
+for ( &Location; child : results.getNode(path2) ) {
+    ...
+}
+</programlisting>
+		<para>
+			Of course, this section provided just a hint of the Graph API.  
+			The &Graph; interface is actually quite complete and offers a full-featured approach for reading and updating a graph.
+			For more information, see the &Graph; JavaDocs.
+		</para>
+	</sect2>
 	</sect1>
 	<sect1>
 		<title>Summary</title>

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	2009-06-09 03:30:56 UTC (rev 1003)
+++ trunk/docs/reference/src/main/docbook/en-US/content/core/sequencing.xml	2009-06-09 04:32:58 UTC (rev 1004)
@@ -29,7 +29,7 @@
 %CustomDTD;
 ]>
 <chapter id="sequencing_framework">
-  <title>Sequencing content</title>
+  <title>Sequencing framework</title>
 	<para>As we've mentioned before, JBoss DNA is able to work with existing JCR repositories.  Your client applications
   	make changes to the information in those repositories, and JBoss DNA automatically uses its sequencers to extract
   	additional information from the uploaded files.</para>
@@ -253,207 +253,14 @@
 			  This filename is then used in the output path, which is where the sequenced content is placed.</para>
 		</sect2>
   </sect1>
-  <sect1 id="sequencers">
-    <title>JBoss DNA Sequencers</title>
+  <sect1 id="sequencer-library">
+    <title>Out-of-the-box sequencers</title>
     <para>
-    	JBoss DNA includes a number of sequencers "out of the box".  These sequencers can be used within your application to sequence
-			a variety of common file formats.  To use them, the only thing you have to do is define the appropriate sequencer configurations
-			and include the appropriate JAR files.
+    	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>.
+			Note that we do want to build <ulink url="https://jira.jboss.org/jira/secure/IssueNavigator.jspa?reset=true&amp;mode=hide&amp;pid=12310520&amp;sorter/order=DESC&amp;sorter/field=priority&amp;resolution=-1&amp;component=12311441">more sequencers</ulink>
+			in the upcoming releases.
     </para>
-    <sect2 id="dna-sequencer-images">
-      <title>Image sequencer</title>
-      <para>
-				A sequencer that extracts metadata from JPEG, GIF, BMP, PCX, PNG, IFF, RAS, PBM, PGM, PPM and PSD image files.
-				This sequencer extracts the file format, image resolution, number of bits per pixel and optionally number of images, comments 
-				and physical resolution, and then writes this information into the repository using the following structure:
-			</para>
-			<itemizedlist>
-				<listitem>
-					<para>
-						<emphasis role="strong">image:metadata</emphasis> node of type <code>image:metadata</code>
-					</para>
-				</listitem>
-				<listitem>
-					<itemizedlist>
-						<listitem>
-							<para><emphasis role="strong">jcr:mimeType</emphasis> - optional string property for the mime type of the image</para>
-						</listitem>
-						<listitem>
-							<para><emphasis role="strong">jcr:encoding</emphasis> - optional string property for the encoding of the image</para>
-						</listitem>
-						<listitem>
-							<para><emphasis role="strong">image:formatName</emphasis> - string property for the name of the format</para>
-						</listitem>
-						<listitem>
-							<para><emphasis role="strong">image:width</emphasis> - optional integer property for the image's width in pixels</para>
-						</listitem>
-						<listitem>
-							<para><emphasis role="strong">image:height</emphasis> - optional integer property for the image's height in pixles</para>
-						</listitem>
-						<listitem>
-							<para><emphasis role="strong">image:bitsPerPixel</emphasis> - optional integer property for the number of bits per pixel</para>
-						</listitem>
-						<listitem>
-							<para><emphasis role="strong">image:progressive</emphasis> - optional boolean property specifying whether the image is stored in a progressive
-									(i.e., interlaced) form</para>
-						</listitem>
-						<listitem>
-							<para><emphasis role="strong">image:numberOfImages</emphasis> - optional integer property for the number of images stored in the file; defaults
-									to 1</para>
-						</listitem>
-						<listitem>
-							<para><emphasis role="strong">image:physicalWidthDpi</emphasis> - optional integer property for the physical width of the image in dots per inch</para>
-						</listitem>
-						<listitem>
-							<para><emphasis role="strong">image:physicalHeightDpi</emphasis> - optional integer property for the physical height of the image in dots per
-									inch</para>
-						</listitem>
-						<listitem>
-							<para><emphasis role="strong">image:physicalWidthInches</emphasis> - optional double property for the physical width of the image in inches</para>
-						</listitem>
-						<listitem>
-							<para><emphasis role="strong">image:physicalHeightInches</emphasis> - optional double property for the physical height of the image in inches</para>
-						</listitem>
-					</itemizedlist>
-				</listitem>
-			</itemizedlist>
-			<para>
-				This structure could be extended in the future to add EXIF and IPTC metadata as child nodes. For example, EXIF metadata is
-				structured as tags in directories, where the directories form something like namespaces, and which are used by different camera
-				vendors to store custom metadata. This structure could be mapped with each directory (e.g. "EXIF" or "Nikon Makernote" or
-				"IPTC") as the name of a child node, with the EXIF tags values stored as either properties or child nodes.
-      </para>
-			<para>
-				To use this sequencer, simply include the <code>dna-sequencer-images</code> JAR
-				in your application and configure	the Sequencing Service to use this sequencer using something similar to:
-      </para>
-	    <programlisting>
-String name = "Image Sequencer";
-String desc = "Sequences image files to extract the characteristics of the image";
-String classname = "org.jboss.dna.sequencer.images.ImageMetadataSequencer";
-String[] classpath = null; // Use the current classpath
-String[] pathExpressions = {"//(*.(jpg|jpeg|gif|bmp|pcx|png|iff|ras|pbm|pgm|ppm|psd)[*])/jcr:content[@jcr:data] =&gt; /images/$1"};
-&SequencerConfig; sequencerConfig = new &SequencerConfig;(name, desc, classname, 
-                                                      classpath, pathExpressions);
-sequencingService.addSequencer(sequencerConfig);
-</programlisting>
-    </sect2>
-    <sect2 id="dna-sequencer-msoffice">
-      <title>Microsoft Office document sequencer</title>
-      <para>
-      	This sequencer is included in JBoss DNA and processes Microsoft Office documents, including Word documents, Excel spreadsheets,
-				and PowerPoint presentations.  With documents, the sequencer extracts the internal structure based on Heading styles.
-				With presentations, the sequencer extracts the slides, titles, text and slide thumbnails.
-				With spreadsheets, the sequencer extracts the names of the sheets.  And, the sequencer extracts for all the files the
-				general file information, including the name of the author, title, keywords, subject, comments, and various dates.
-      </para>
-			<para>
-				To use this sequencer, simply include the <code>dna-sequencer-msoffice</code> JAR and all of the
-				<ulink url="http://poi.apache.org/">POI</ulink> JARs
-				in your application and configure	the Sequencing Service to use this sequencer using something similar to:
-      </para>
-	    <programlisting>
-String name = "Microsoft Office Document Sequencer";
-String desc = "Sequences MS Office documents, including spreadsheets and presentations";
-String classname = "org.jboss.dna.sequencer.msoffice.MSOfficeMetadataSequencer";
-String[] classpath = null; // Use the current classpath
-String[] pathExpressions = {"//(*.(doc|docx|ppt|pps|xls)[*])/jcr:content[@jcr:data] =&gt; /msoffice/$1"};
-&SequencerConfig; sequencerConfig = new &SequencerConfig;(name, desc, classname, 
-                                                      classpath, pathExpressions);
-sequencingService.addSequencer(sequencerConfig);
-</programlisting>
-    </sect2>
-    <sect2 id="dna-sequencer-zip">
-      <title>ZIP archive sequencer</title>
-      <para>
-      	The ZIP file sequencer is included in JBoss DNA and extracts the files and folders contained in the ZIP archive file,
-				extracting the files and folders into the repository using JCR's <code>nt:file</code> and <code>nt:folder</code> node types.
-      </para>
-			<para>
-				To use this sequencer, simply include the <code>dna-sequencer-zip</code> JAR
-				in your application and configure	the Sequencing Service to use this sequencer using something similar to:
-      </para>
-	    <programlisting>
-String name = "ZIP Sequencer";
-String desc = "Sequences ZIP archives to extract the files and folders";
-String classname = "org.jboss.dna.sequencer.zip.ZipSequencer";
-String[] pathExpressions = {"//(*.zip[*])/jcr:content[@jcr:data] =&gt; /zips/$1"};
-&SequencerConfig; sequencerConfig = new &SequencerConfig;(name, desc, classname, 
-                                                      classpath, pathExpressions);
-this.sequencingService.addSequencer(sequencerConfig);
-</programlisting>
-    </sect2>
-    <sect2 id="dna-sequencer-java">
-      <title>Java source sequencer</title>
-      <para>
-				One of the sequencers that included in JBoss DNA is the <emphasis role="strong">dna-sequencer-java</emphasis> subproject.
-				This sequencer parses Java source code added to the repository and extracts the basic structure of the classes and enumerations 
-				defined in the code.
-				This structure includes: the package structures, class declarations, class and member attribute declarations,
-				class and member method declarations with signature (but not implementation logic), enumerations with each enumeration literal value,
-				annotations, and JavaDoc information for all of the above. 
-				After extracting this information from the source code, the sequencer then writes this structure into the repository,
-				where it can be further processed, analyzed, searched, navigated, or referenced.
-			</para>
-			<para>
-				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 Sequencing Service to use this sequencer using something similar to:
-      </para>
-	    <programlisting>
-String name = "Java Sequencer";
-String desc = "Sequences java files to extract the characteristics of the Java source";
-String classname = "org.jboss.dna.sequencer.java.JavaMetadataSequencer";
-String[] classpath = null; // Use the current classpath
-String[] pathExpressions = {"//(*.java[*])/jcr:content[@jcr:data] =&gt; /java/$1"};
-&SequencerConfig; sequencerConfig = new &SequencerConfig;(name, desc, classname, 
-                                                      classpath, pathExpressions);
-this.sequencingService.addSequencer(sequencerConfig);
-</programlisting>
-    </sect2>
-    <sect2 id="dna-sequencer-mp3">
-      <title>MP3 audio file sequencer</title>
-      <para>
-      	Another sequencer that is included in JBoss DNA is the <emphasis role="strong">dna-sequencer-mp3</emphasis> sequencer project.
-				This sequencer processes MP3 audio files added to a repository and extracts the <ulink url="http://www.id3.org/">ID3</ulink>
-			 	metadata for the file, including the track's title, author, album name, year, and comment.
-				After extracting this information from the audio files, the sequencer then writes this structure into the repository,
-				where it can be further processed, analyzed, searched, navigated, or referenced.
-      </para>
-			<para>
-				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 Sequencing Service to use this sequencer using something similar to:
-      </para>
-	    <programlisting>
-String name = "MP3 Sequencer";
-String desc = "Sequences MP3 files to extract the ID3 tags of the audio file";
-String classname = "org.jboss.dna.sequencer.mp3.Mp3MetadataSequencer";
-String[] pathExpressions = {"//(*.mp3[*])/jcr:content[@jcr:data] =&gt; /mp3s/$1"};
-&SequencerConfig; sequencerConfig = new &SequencerConfig;(name, desc, classname, 
-                                                      classpath, pathExpressions);
-this.sequencingService.addSequencer(sequencerConfig);
-</programlisting>
-    </sect2>
-    <sect2 id="dna-sequencer-cnd">
-      <title>JCR Compact Node Definition (CND) file sequencer</title>
-      <para>
-      	This sequencer processes JCR Compact Node Definition (CND) files
-				to extract the node definitions with their property definitions, and inserts these into the repository using JCR standard notation.
-      </para>
-    </sect2>
-        <sect2 id="dna-sequencer-jbpm-jpdl">
-      <title>jBPM JPDL file sequencer</title>
-      <para>
-        This sequencer is incomplete and is not currently usable.  The purpose is to sequence jBPM JPDL files to identify metadata
-        about processes, their actors, and their dependencies.
-      </para>
-    </sect2>
-    <sect2 id="dna-sequencer-xml">
-      <title>XML file sequencer</title>
-      <para>
-        This sequencer stores the structure and data of an XML file into the repository.
-      </para>
-    </sect2> 
-    
   </sect1>
   <sect1 id="custom-sequencers">
 	  <title>Creating custom sequencers</title>

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	2009-06-09 03:30:56 UTC (rev 1003)
+++ trunk/docs/reference/src/main/docbook/en-US/content/sequencers/compact_node_types.xml	2009-06-09 04:32:58 UTC (rev 1004)
@@ -31,6 +31,7 @@
 <chapter id="cnd-sequencer">
   <title>Compact Node Type (CND) Sequencer</title>
   <para>
-		blah blah 
+  	This sequencer processes JCR Compact Node Definition (CND) files
+		to extract the node definitions with their property definitions, and inserts these into the repository using JCR standard notation.
   </para>
 </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	2009-06-09 03:30:56 UTC (rev 1003)
+++ trunk/docs/reference/src/main/docbook/en-US/content/sequencers/image.xml	2009-06-09 04:32:58 UTC (rev 1004)
@@ -30,7 +30,79 @@
 ]>
 <chapter id="image-sequencer">
   <title>Image Sequencer</title>
-  <para>
-		blah blah 
-  </para>
+     <para>
+			The &ImageMetadataSequencer; sequencer extracts metadata from JPEG, GIF, BMP, PCX, PNG, IFF, RAS, PBM, PGM, PPM and PSD image files.
+			This sequencer extracts the file format, image resolution, number of bits per pixel and optionally number of images, comments 
+			and physical resolution, and then writes this information into the repository using the following structure:
+		</para>
+		<itemizedlist>
+			<listitem>
+				<para>
+					<emphasis role="strong">image:metadata</emphasis> node of type <code>image:metadata</code>
+				</para>
+			</listitem>
+			<listitem>
+				<itemizedlist>
+					<listitem>
+						<para><emphasis role="strong">jcr:mimeType</emphasis> - optional string property for the mime type of the image</para>
+					</listitem>
+					<listitem>
+						<para><emphasis role="strong">jcr:encoding</emphasis> - optional string property for the encoding of the image</para>
+					</listitem>
+					<listitem>
+						<para><emphasis role="strong">image:formatName</emphasis> - string property for the name of the format</para>
+					</listitem>
+					<listitem>
+						<para><emphasis role="strong">image:width</emphasis> - optional integer property for the image's width in pixels</para>
+					</listitem>
+					<listitem>
+						<para><emphasis role="strong">image:height</emphasis> - optional integer property for the image's height in pixles</para>
+					</listitem>
+					<listitem>
+						<para><emphasis role="strong">image:bitsPerPixel</emphasis> - optional integer property for the number of bits per pixel</para>
+					</listitem>
+					<listitem>
+						<para><emphasis role="strong">image:progressive</emphasis> - optional boolean property specifying whether the image is stored in a progressive
+								(i.e., interlaced) form</para>
+					</listitem>
+					<listitem>
+						<para><emphasis role="strong">image:numberOfImages</emphasis> - optional integer property for the number of images stored in the file; defaults
+								to 1</para>
+					</listitem>
+					<listitem>
+						<para><emphasis role="strong">image:physicalWidthDpi</emphasis> - optional integer property for the physical width of the image in dots per inch</para>
+					</listitem>
+					<listitem>
+						<para><emphasis role="strong">image:physicalHeightDpi</emphasis> - optional integer property for the physical height of the image in dots per
+								inch</para>
+					</listitem>
+					<listitem>
+						<para><emphasis role="strong">image:physicalWidthInches</emphasis> - optional double property for the physical width of the image in inches</para>
+					</listitem>
+					<listitem>
+						<para><emphasis role="strong">image:physicalHeightInches</emphasis> - optional double property for the physical height of the image in inches</para>
+					</listitem>
+				</itemizedlist>
+			</listitem>
+		</itemizedlist>
+		<para>
+			This structure could be extended in the future to add EXIF and IPTC metadata as child nodes. For example, EXIF metadata is
+			structured as tags in directories, where the directories form something like namespaces, and which are used by different camera
+			vendors to store custom metadata. This structure could be mapped with each directory (e.g. "EXIF" or "Nikon Makernote" or
+			"IPTC") as the name of a child node, with the EXIF tags values stored as either properties or child nodes.
+     </para>
+		<para>
+			To use this sequencer, simply include the <code>dna-sequencer-images</code> JAR
+			in your application and configure	the Sequencing Service to use this sequencer using something similar to:
+     </para>
+   	<programlisting>
+String name = "Image Sequencer";
+String desc = "Sequences image files to extract the characteristics of the image";
+String classname = "org.jboss.dna.sequencer.images.ImageMetadataSequencer";
+String[] classpath = null; // Use the current classpath
+String[] pathExpressions = {"//(*.(jpg|jpeg|gif|bmp|pcx|png|iff|ras|pbm|pgm|ppm|psd)[*])/jcr:content[@jcr:data] =&gt; /images/$1"};
+&SequencerConfig; sequencerConfig = new &SequencerConfig;(name, desc, classname, 
+                                                      classpath, pathExpressions);
+sequencingService.addSequencer(sequencerConfig);
+</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	2009-06-09 03:30:56 UTC (rev 1003)
+++ trunk/docs/reference/src/main/docbook/en-US/content/sequencers/java_source.xml	2009-06-09 04:32:58 UTC (rev 1004)
@@ -30,7 +30,28 @@
 ]>
 <chapter id="java-source-sequencer">
   <title>Java Source File Sequencer</title>
-  <para>
-		blah blah 
-  </para>
+    <para>
+		One of the sequencers that included in JBoss DNA is the <emphasis role="strong">dna-sequencer-java</emphasis> subproject.
+		This sequencer parses Java source code added to the repository and extracts the basic structure of the classes and enumerations 
+		defined in the code.
+		This structure includes: the package structures, class declarations, class and member attribute declarations,
+		class and member method declarations with signature (but not implementation logic), enumerations with each enumeration literal value,
+		annotations, and JavaDoc information for all of the above. 
+		After extracting this information from the source code, the sequencer then writes this structure into the repository,
+		where it can be further processed, analyzed, searched, navigated, or referenced.
+	</para>
+	<para>
+		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 Sequencing Service to use this sequencer using something similar to:
+    </para>
+  <programlisting>
+String name = "Java Sequencer";
+String desc = "Sequences java files to extract the characteristics of the Java source";
+String classname = "org.jboss.dna.sequencer.java.JavaMetadataSequencer";
+String[] classpath = null; // Use the current classpath
+String[] pathExpressions = {"//(*.java[*])/jcr:content[@jcr:data] =&gt; /java/$1"};
+&SequencerConfig; sequencerConfig = new &SequencerConfig;(name, desc, classname, 
+                                                      classpath, pathExpressions);
+this.sequencingService.addSequencer(sequencerConfig);
+</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	2009-06-09 03:30:56 UTC (rev 1003)
+++ trunk/docs/reference/src/main/docbook/en-US/content/sequencers/microsoft_office.xml	2009-06-09 04:32:58 UTC (rev 1004)
@@ -30,7 +30,26 @@
 ]>
 <chapter id="msoffice-sequencer">
   <title><trademark class='registered'>Microsoft Office</trademark> Document Sequencer</title>
-  <para>
-		blah blah 
-  </para>
+   <para>
+   	This sequencer is included in JBoss DNA and processes Microsoft Office documents, including Word documents, Excel spreadsheets,
+	and PowerPoint presentations.  With documents, the sequencer extracts the internal structure based on Heading styles.
+	With presentations, the sequencer extracts the slides, titles, text and slide thumbnails.
+	With spreadsheets, the sequencer extracts the names of the sheets.  And, the sequencer extracts for all the files the
+	general file information, including the name of the author, title, keywords, subject, comments, and various dates.
+   </para>
+<para>
+	To use this sequencer, simply include the <code>dna-sequencer-msoffice</code> JAR and all of the
+	<ulink url="http://poi.apache.org/">POI</ulink> JARs
+	in your application and configure	the Sequencing Service to use this sequencer using something similar to:
+   </para>
+  <programlisting>
+String name = "Microsoft Office Document Sequencer";
+String desc = "Sequences MS Office documents, including spreadsheets and presentations";
+String classname = "org.jboss.dna.sequencer.msoffice.MSOfficeMetadataSequencer";
+String[] classpath = null; // Use the current classpath
+String[] pathExpressions = {"//(*.(doc|docx|ppt|pps|xls)[*])/jcr:content[@jcr:data] =&gt; /msoffice/$1"};
+&SequencerConfig; sequencerConfig = new &SequencerConfig;(name, desc, classname, 
+                                                      classpath, pathExpressions);
+sequencingService.addSequencer(sequencerConfig);
+</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	2009-06-09 03:30:56 UTC (rev 1003)
+++ trunk/docs/reference/src/main/docbook/en-US/content/sequencers/mp3.xml	2009-06-09 04:32:58 UTC (rev 1004)
@@ -30,7 +30,24 @@
 ]>
 <chapter id="mp3-sequencer">
   <title>MP3 Sequencer</title>
-  <para>
-		blah blah 
-  </para>
+	      <para>
+	      	Another sequencer that is included in JBoss DNA is the <emphasis role="strong">dna-sequencer-mp3</emphasis> sequencer project.
+					This sequencer processes MP3 audio files added to a repository and extracts the <ulink url="http://www.id3.org/">ID3</ulink>
+				 	metadata for the file, including the track's title, author, album name, year, and comment.
+					After extracting this information from the audio files, the sequencer then writes this structure into the repository,
+					where it can be further processed, analyzed, searched, navigated, or referenced.
+	      </para>
+				<para>
+					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 Sequencing Service to use this sequencer using something similar to:
+	      </para>
+		    <programlisting>
+	String name = "MP3 Sequencer";
+	String desc = "Sequences MP3 files to extract the ID3 tags of the audio file";
+	String classname = "org.jboss.dna.sequencer.mp3.Mp3MetadataSequencer";
+	String[] pathExpressions = {"//(*.mp3[*])/jcr:content[@jcr:data] =&gt; /mp3s/$1"};
+	&SequencerConfig; sequencerConfig = new &SequencerConfig;(name, desc, classname, 
+	                                                      classpath, pathExpressions);
+	this.sequencingService.addSequencer(sequencerConfig);
+	</programlisting>
 </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	2009-06-09 03:30:56 UTC (rev 1003)
+++ trunk/docs/reference/src/main/docbook/en-US/content/sequencers/xml.xml	2009-06-09 04:32:58 UTC (rev 1004)
@@ -31,6 +31,6 @@
 <chapter id="xml-sequencer">
   <title>XML Document Sequencer</title>
   <para>
-		blah blah 
+    This sequencer stores the structure and data of an XML file into the repository.
   </para>
 </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	2009-06-09 03:30:56 UTC (rev 1003)
+++ trunk/docs/reference/src/main/docbook/en-US/content/sequencers/zip.xml	2009-06-09 04:32:58 UTC (rev 1004)
@@ -30,7 +30,21 @@
 ]>
 <chapter id="zip-file-sequencer">
   <title>ZIP File Sequencer</title>
-  <para>
-		blah blah 
-  </para>
+    <para>
+    	The ZIP file sequencer is included in JBoss DNA and extracts the files and folders contained in the ZIP archive file,
+		extracting the files and folders into the repository using JCR's <code>nt:file</code> and <code>nt:folder</code> node types.
+    </para>
+	<para>
+		To use this sequencer, simply include the <code>dna-sequencer-zip</code> JAR
+		in your application and configure	the Sequencing Service to use this sequencer using something similar to:
+    </para>
+   <programlisting>
+String name = "ZIP Sequencer";
+String desc = "Sequences ZIP archives to extract the files and folders";
+String classname = "org.jboss.dna.sequencer.zip.ZipSequencer";
+String[] pathExpressions = {"//(*.zip[*])/jcr:content[@jcr:data] =&gt; /zips/$1"};
+&SequencerConfig; sequencerConfig = new &SequencerConfig;(name, desc, classname, 
+                                                      classpath, pathExpressions);
+this.sequencingService.addSequencer(sequencerConfig);
+</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	2009-06-09 03:30:56 UTC (rev 1003)
+++ trunk/docs/reference/src/main/docbook/en-US/custom.dtd	2009-06-09 04:32:58 UTC (rev 1004)
@@ -53,6 +53,9 @@
 <!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 Iteratable								    "<ulink url='&Java;java/util/Iteratable.html'><interface>Iteratable</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>">



From dna-commits at lists.jboss.org  Tue Jun  9 02:11:42 2009
From: dna-commits at lists.jboss.org (dna-commits at lists.jboss.org)
Date: Tue, 09 Jun 2009 02:11:42 -0400
Subject: [dna-commits] DNA SVN: r1005 - in
	trunk/docs/reference/src/main/docbook/en-US: content/core and
	1 other directory.
Message-ID: <E1MDuYg-0005Vf-3b@committer01.frg.pub.inap.atl.jboss.com>

Author: rhauch
Date: 2009-06-09 02:11:41 -0400 (Tue, 09 Jun 2009)
New Revision: 1005

Modified:
   trunk/docs/reference/src/main/docbook/en-US/content/core/connector.xml
   trunk/docs/reference/src/main/docbook/en-US/content/core/graph.xml
   trunk/docs/reference/src/main/docbook/en-US/custom.dtd
Log:
Added to the graph chapter new sections on requests, request processors, and observation.

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	2009-06-09 04:32:58 UTC (rev 1004)
+++ trunk/docs/reference/src/main/docbook/en-US/content/core/connector.xml	2009-06-09 06:11:41 UTC (rev 1005)
@@ -51,20 +51,20 @@
 		in one spot, using one powerful standard API.
 	</para>
   <sect1 id="connectors">
-    <title>Repository connectors</title>
+    <title>Connectors</title>
 		<para>
 			With JBoss DNA, your applications use the <ulink url="&JSR170;">JCR API</ulink> to work with the repository,
 			but the DNA repository transparently fetches the information from different kinds of repositories and storage systems,
 			not just a single purpose-built store.  This is fundamentally what makes JBoss DNA different.
 		</para>
 		<para>How does JBoss DNA do this?  At the heart of JBoss DNA and it's JCR implementation is a simple graph-based 
-			<emphasis>repository connector</emphasis> system.  Essentially, JBoss DNA's JCR implementation uses a single 
-			repository connector to access all content:
+			<emphasis>connector</emphasis> system.  Essentially, JBoss DNA's JCR implementation uses a single 
+			connector to access all content:
 			<figure id="dnajcr-and-connector">
-				<title>JBoss DNA's JCR implementation delegates to a repository connector</title>
+				<title>JBoss DNA's JCR implementation delegates to a connector</title>
 				<graphic align="center" scale="100" fileref="dnajcr-and-connector.png"/>
 			</figure>
-			That single repository connector could use an in-memory repository, a JBoss Cache instance (including those that are clustered and replicated), 
+			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>
@@ -128,9 +128,9 @@
 					A repository source instance is then used to establish <emphasis role="strong">connections</emphasis> to
 					that source.  A connector provides an implementation of the &RepositoryConnection; interface, which
 					defines methods for interacting with the external system.  In particular, the <code>execute(...)</code> method
-					takes an &ExecutionContext; instance and a &Request; object.  The &ExectuionContext; object defines the
-					environment in which the processing is occurring, including information about the JAAS &Subject; and &LoginContext;.
-					The &Request; object describes the requested operations on the content, with different concrete subclasses
+					takes an &ExecutionContext; instance and a &Request; object.  The &ExecutionContext; object defines the
+					environment in which the processing is occurring,
+					while the &Request; object describes the requested operations on the content, with different concrete subclasses
 					representing each type of activity.  Examples of commands include (but not limited to) getting a node, moving a node, creating a node, 
 					changing a node, and deleting a node.  And, if the repository source is able to participate in JTA/JTS distributed transactions, then the
 					&RepositoryConnection; must implement the <code>getXaResource()</code> method by returning 
@@ -161,123 +161,15 @@
 			JBoss DNA components, including the <link linkend="jcr">JCR</link> implementation.
 		</para>
 		<para>
-			So, we've so far learned what a repository connector is and how they're used to establish connections to the underlying sources 
-			and access the content in those sources.  In the <link linkend="repository-service">next section</link>, we'll show how these 
-			source instances can be configured, managed, and their connections pooled.  After that, we'll look review JBoss DNA's 
-			<link linkend="connector-library">existing connectors</link> and show how to <link linkend="custom-connectors">create your own connectors</link>.
+			So, we've so far learned what a connector is and how they're used to establish connections to the underlying sources 
+			and access the content in those sources.  Next we'll show how connectors expose the notion of workspaces, and describe
+			how to <link linkend="custom-connectors">create your own connectors</link>.
 		</para>
   </sect1>
-  <sect1 id="repository-workspaces">
-    <title>Workspaces</title>
-		<para>The <link linkend="graph-api-workspaces">previous chapter</link> talked about how connector expose their information through the graph language of JBoss DNA.
-			This is true, except that we didn't dive into too much of the detail.  JBoss DNA graphs have the notion of <emphasis>workspaces</emphasis>
-			in which the content appears, and its very easy for clients using the graph to switch between workspaces.  In fact,
-			workspaces differ from each other in that they provide different views of the same information.
-		</para>
-		<para>Consider a source control system, like SVN or CVS.  These systems provide different views of the source code:
-			a mainline development branch as well as other branches (or tags) commonly used for releases.  So, just like one source
-			file might appear in the mainline branch as well as the previous two release branches, a node in a repository source
-			might appear in multiple workspaces.
-		</para>
-		<para>
-			However, each connector can kind of decide how (or whether) it uses workspaces.  For example, there may be no overlap
-			in the content between workspaces.  Or a connector might only expose a single workspace (in other words, there's only one
-			"default" workspace).
-		</para>
-  </sect1>
-  <sect1 id="repository-service">
-    <title>Repository Service</title>
-		<para>The JBoss DNA &RepositoryService; is the component that manages the <emphasis>repository sources</emphasis>
-		  and the connections to them.  &RepositorySource; instances can be programmatically added to the service, but
-			the service can actually read its configuration from a configuration repository (which, by the way, is represented by a
-			just another &RepositorySource; instance that's usually added programmatically to the service).  The service connects to
-			the configuration repository, reads the content in a particular area, and automatically sets up the &RepositorySource; instances
-		  per the information found in the configuration repository.  
-		</para>
-		<para>
-			The &RepositoryService; also transparently maintains for each source a pool of reusable connections.  The pooling properties
-			can be controlled via the configuration repository, or adjusted programmatically.
-		</para>
-    <para>
-			Using a repository, then, involves simply asking the &RepositoryService; for a &RepositoryConnection;
-			to the repository given the repository's name.  If a source exists with that name, the service checks out a connection from
-			the source's pool.  The resulting connection is actually a wrapper around the underlying pooled connection, so the
-			component that requested the connection can simply close it, and under the covers the actual connection is simply returned
-			to the pool.
-    </para>
-		<para>To instantiate the &RepositoryService;, we need to first have a few other objects:
-			<itemizedlist>
-				<listitem>
-					<para>
-						A &ExecutionContext; instance, as discussed <link linkend="execution-context">earlier</link>.
-					</para>
-				</listitem>
-				<listitem>
-					<para>
-						A &RepositoryLibrary; instance that manages the list of &RepositorySource; instances,
-						properly injects the execution contexts into each repository source, and provides a configurable pool of connections
-						for each source.
-					</para>
-				</listitem>
-				<listitem>
-					<para>
-						A <emphasis>configuration repository</emphasis> that contains descriptions of all of the repository sources
-					  as well as any information those sources need.  Because this is a regular repository, this could be a simple 
-					  repository with content loaded from an XML file, or it could be a shared
-					  central repository with information about all of the JBoss DNA repositories used across your organization.
-					</para>
-				</listitem>
-			</itemizedlist>
-			With these components in place, we can then instantiate the &RepositoryService; and start it (using its
-			&ServiceAdministrator;).  During startup, the service reads the configuration repository and loads any
-			defined &RepositorySource; instances into the repository library, using the class loader factory 
-			(available in the &ExecutionContext;) to obtain.
-    </para>
-		<para>
-			Here's sample code that shows how to set up and start the repository service.  You can see something similar
-			in the example application in the <code>startRepositories()</code> method of the 
-			<code>org.jboss.example.dna.repository.RepositoryClient</code> class.
-		</para>
-    <programlisting>
- // Create the top-level execution context with all standard components ...
- &ExecutionContext; context = new ExecutionContext();
-
- // Create the library for the RepositorySource instances ...
- &RepositoryLibrary; sources = new &RepositoryLibrary;(context);
-
- // Load into the source manager the repository source for the configuration repository ...
- &InMemoryRepositorySource; configSource = new &InMemoryRepositorySource;();
- configSource.setName("Configuration");
- sources.addSource(configSource);
-
- // Now instantiate the Repository Service ...
- &RepositoryService; service = new &RepositoryService;(sources, configSource.getName(), context);
- service.getAdministrator().start();
- </programlisting>
-
-		<para>After startup completes, the repositories are ready to be used.  The client application obtains the list of repositories
-			and presents them to the user.  When the user selects one, the client application starts navigating that repository
-			starting at its root node (e.g., the "/" path).  As you type a command to list the contents of the current node or to
-			"change directories" to a different node, the client application obtains the information for the node using a simple
-			procedure:
-			<orderedlist>
-				<listitem>
-					<para>Get a connection to the repository.</para>
-				</listitem>
-				<listitem>
-					<para>Using the connection, find the current node and read its properties and children, putting the information
-						into a simple Java plain old Java object (POJO).</para>
-				</listitem>
-				<listitem>
-					<para>Close the connection to the repository (in a finally block to ensure it always happens).</para>
-				</listitem>
-			</orderedlist>
-		</para>
-  </sect1>
   <sect1 id="connector-library">
-    <title>Out-of-the-box repository connectors</title>
+    <title>Out-of-the-box connectors</title>
     <para>
-    	A number of repository connectors are already available in JBoss DNA, and are outlined in detail
+    	A number of connectors are already available in JBoss DNA, and are outlined in detail
       <link linkend="provied-connectors-part">later in the document</link>.
 			Note that we do want to build <ulink url="https://jira.jboss.org/jira/secure/IssueNavigator.jspa?reset=true&amp;mode=hide&amp;pid=12310520&amp;sorter/order=DESC&amp;sorter/field=priority&amp;resolution=-1&amp;component=12311441">more connectors</ulink>
 			in the upcoming releases.
@@ -286,7 +178,7 @@
   <sect1 id="custom-connectors">
     <title>Writing custom connectors</title>
     <para>
-		  There may come a time when you want to tackle creating your own repository connector.  Maybe the connectors we provide out-of-the-box
+		  There may come a time when you want to tackle creating your own connector.  Maybe the connectors we provide out-of-the-box
 			don't work with your source.  Maybe you want to use a different cache system.  
 			Maybe you have a system that you want to make available through a JBoss DNA repository.  Or, maybe you're
 			a contributor and want to help us round out our library with a new connector.  No matter what the reason, creating a new connector
@@ -356,7 +248,7 @@
 <dependency>
   <groupId>org.jboss.dna</groupId>
   <artifactId>dna-graph</artifactId>
-  <version>0.4</version>
+  <version>0.5</version>
 </dependency>
 	 ]]></programlisting>
 			<para>
@@ -371,17 +263,18 @@
 <dependency>
   <groupId>org.jboss.dna</groupId>
   <artifactId>dna-graph</artifactId>
-  <version>0.4</version>
+  <version>0.5</version>
   <type>test-jar</type>
   <scope>test</scope>
 </dependency>
 <dependency>
   <groupId>org.jboss.dna</groupId>
   <artifactId>dna-common</artifactId>
-  <version>0.4</version>
+  <version>0.5</version>
   <type>test-jar</type>
   <scope>test</scope>
 </dependency>
+<!-- Unit testing -->
 <dependency>
   <groupId>junit</groupId>
   <artifactId>junit</artifactId>
@@ -441,6 +334,37 @@
 				Most of the semantics of the class are defined by the &RepositorySource; and inherited interface.
 				However, there are a few characteristics that are worth mentioning here.
 			</para>
+		  <sect3 id="repository-workspaces">
+		    <title>Workspaces</title>
+				<para>The <link linkend="graph-api-workspaces">previous chapter</link> talked about how connector expose their information through the graph language of JBoss DNA.
+					This is true, except that we didn't dive into too much of the detail.  JBoss DNA graphs have the notion of <emphasis>workspaces</emphasis>
+					in which the content appears, and its very easy for clients using the graph to switch between workspaces.  In fact,
+					workspaces differ from each other in that they provide different views of the same information.
+				</para>
+				<para>Consider a source control system, like SVN or CVS.  These systems provide different views of the source code:
+					a mainline development branch as well as other branches (or tags) commonly used for releases.  So, just like one source
+					file might appear in the mainline branch as well as the previous two release branches, a node in a repository source
+					might appear in multiple workspaces.
+				</para>
+				<para>
+					However, each connector can kind of decide how (or whether) it uses workspaces.  For example, there may be no overlap
+					in the content between workspaces.  Or a connector might only expose a single workspace (in other words, there's only one
+					"default" workspace).
+				</para>
+		  </sect3>
+			<sect3 id="connector_events">
+				<title>Broadcasting events</title>
+				<para>
+					When your &RepositorySource; instance is put into the library within a running JBoss DNA system, 
+					the <code>initialize(&RepositoryContext;)</code> method will be called on the instance.
+					The supplied &RepositoryContext; object represents the context in which the &RepositorySource;
+					is running, and provides access to an &ExecutionContext;, a &RepositoryConnectionFactory; that can be used
+					to obtain connections to other sources, and an &Observer; of your source that should be called with
+					events describing the &Changes; being made within the source, either as a result of &ChangeRequest; operations being
+					performed on this source, or as a result of operations being performed on the content from outside
+					the source.
+				</para>
+			</sect3>
 			<sect3 id="connector_cache_policy">
 				<title>Cache policy</title>
 				<para>
@@ -538,7 +462,7 @@
 	    <para>
 				One job of the &RepositorySource; implementation is to create connections to the underlying sources.
 				Connections are represented by classes that implement the &RepositoryConnection; interface, and creating this
-				class is the next step in writing a repository connector.  This is what we'll cover in this section.
+				class is the next step in writing a connector.  This is what we'll cover in this section.
 			</para>
 	    <para>
 				The &RepositoryConnection; interface is pretty straightforward:
@@ -580,13 +504,6 @@
     boolean ping( long time, &TimeUnit; unit ) throws InterruptedException;
 
     /**
-     * Set the listener that is to receive notifications to changes to content within this source.
-     * 
-     * @param listener the new listener, or null if no component is interested in the change notifications
-     */
-    void setListener( &RepositorySourceListener; listener );
-
-    /**
      * Get the default cache policy for this repository. If none is provided, a global cache policy
      * will be used.
      * 
@@ -601,8 +518,7 @@
      * @param request the request to be executed; never null
      * @throws RepositorySourceException if there is a problem loading the node data
      */
-    void execute( &ExecutionContext; context,
-                  &Request; request ) throws &RepositorySourceException;;
+    void execute( &ExecutionContext; context, &Request; request ) throws &RepositorySourceException;;
 
     /**
      * Close this connection to signal that it is no longer needed and that any accumulated 
@@ -618,6 +534,7 @@
 				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>.
@@ -629,293 +546,12 @@
 				as well as the subject performing the request.  This was discussed <link linkend="execution-context">earlier</link>.
 			</para>
 	    <para>
-				The second parameter, however, represents a request that is to be processed by the connector.  Request objects can
-				take many different forms, as there are different classes for each kind of request (see the table below).
+				The second parameter, however, represents a &Request; that is to be processed by the connector.  Request objects can
+				take many different forms, as there are different classes for each kind of request (see the
+				<link linkend="graph-requests">previous chapter</link> for details).
 				Each request contains the information a connector needs to do the processing, and it also is the place
 				where the connector places the results (or the error, if one occurs).
 			</para>
-			<para>
-				How do the requests reference a node (or nodes)? Since requests are coming from a client, the client 
-				may identify a particular node using a &Location; object that is created with:
-			  <itemizedlist>
-			    <listitem>
-			      <para>the &Path; to the node; or</para>
-			    </listitem>
-			    <listitem>
-			      <para>one or more <emphasis>identification properties</emphasis> that are likely source=specific
-							and that are represented with &Property; objects; or</para>
-			    </listitem>
-			    <listitem>
-			      <para>a combination of both.</para>
-			    </listitem>
-			  </itemizedlist>
-				So, when a client knows the path or the identification properties, they can create a &Location;.  However,
-				all of the requests return &Location; objects, so often times the client simply uses the location
-				from a previous request.  Since &Location; is an immutable class, it is perfectly safe to reuse them.
-			</para>
-			<para>
-				One more thing about locations: while the request may have an incomplete location (e.g., a path but no
-				identification properties), the connector is expected to set on the request the <emphasis>actual</emphasis>
-				location that contains the path and all identification properties.  So as long as the client
-				reuses the actual locations in subsequent requests, the connectors will have the benefit of having
-				both the path and identification properties.  Connectors can then be written to leverage this
-				information, although the connector should still perform as expected when requests have incomplete locations.
-			</para>
-			<table frame='all'>
-				<title>Types of Node Operation Requests</title>
-				<tgroup cols='2' align='left' colsep='1' rowsep='1'>
-		      <colspec colname='c1' colwidth="1*"/>
-		      <colspec colname='c2' colwidth="1*"/>
-					<thead>
-						<row>
-				  		<entry>Name</entry>
-				  		<entry>Description</entry>
-						</row>
-					</thead>
-					<tbody>
-						<row>
-							<entry>ReadNodeRequest</entry>
-							<entry>
-								A request to read from the named workspace in the source a node's properties and children.
-								The node may be specified by path and/or by identification properties.
-								The connector returns all properties and the locations for all children,
-								or sets a &PathNotFoundException; error on the request if the node did not exist in the workspace.
-								If the node is found, the connector sets on the request the actual location of the node (including the path and identification properties).
-								The connector sets a &InvalidWorkspaceException; error on the request if the named workspace does not exist.
-							</entry>
-						</row>
-						<row>
-							<entry>VerifyNodeExistsRequest</entry>
-							<entry>
-								A request to verify the existance of a node at the specified location in the named workspace of the source.
-								The connector returns all the actual location for the node if it exists, or
-								sets a &PathNotFoundException; error on the request if the node does not exist in the workspace.
-								The connector sets a &InvalidWorkspaceException; error on the request if the named workspace does not exist.
-							</entry>
-						</row>
-						<row>
-							<entry>ReadAllPropertiesRequest</entry>
-							<entry>
-								A request to read from the named workspace in the source all of the properties of a node.
-								The node may be specified by path and/or by identification properties.
-								The connector returns all properties that were found on the node,
-								or sets a &PathNotFoundException; error on the request if the node did not exist in the workspace.
-								If the node is found, the connector sets on the request the actual location of the node (including the path and identification properties).
-								The connector sets a &InvalidWorkspaceException; error on the request if the named workspace does not exist.
-							</entry>
-						</row>
-						<row>
-							<entry>ReadPropertyRequest</entry>
-							<entry>
-								A request to read from the named workspace in the source a single property of a node.
-								The node may be specified by path and/or by identification properties,
-								and the property is specified by name.
-								The connector returns the property if found on the node,
-								or sets a &PathNotFoundException; error on the request if the node or property did not exist in the workspace.
-								If the node is found, the connector sets on the request the actual location of the node (including the path and identification properties).
-								The connector sets a &InvalidWorkspaceException; error on the request if the named workspace does not exist.
-							</entry>
-						</row>
-						<row>
-							<entry>ReadAllChildrenRequest</entry>
-							<entry>
-								A request to read from the named workspace in the source all of the children of a node.
-								The node may be specified by path and/or by identification properties.
-								The connector returns an ordered list of locations for each child found on the node,
-								an empty list if the node had no children,
-								or sets a &PathNotFoundException; error on the request if the node did not exist in the workspace.
-								If the node is found, the connector sets on the request the actual location of the parent node (including the path and identification properties).
-								The connector sets a &InvalidWorkspaceException; error on the request if the named workspace does not exist.
-							</entry>
-						</row>
-						<row>
-							<entry>ReadBlockOfChildrenRequest</entry>
-							<entry>
-								A request to read from the named workspace in the source a block of children of a node, starting with the n<superscript>th</superscript> children.
-								This is designed to allow paging through the children, which is much more efficient for large numbers of children.
-								The node may be specified by path and/or by identification properties, and the block
-								is defined by a starting index and a count (i.e., the block size).
-								The connector returns an ordered list of locations for each of the node's children found in the block,
-								or an empty list if there are no children in that range.
-								The connector also sets on the request the actual location of the parent node (including the path and identification properties)
-								or sets a &PathNotFoundException; error on the request if the parent node did not exist in the workspace.
-								The connector sets a &InvalidWorkspaceException; error on the request if the named workspace does not exist.
-							</entry>
-						</row>
-						<row>
-							<entry>ReadNextBlockOfChildrenRequest</entry>
-							<entry>
-								A request to read from the named workspace in the source a block of children of a node, starting with the children that immediately follow
-								a previously-returned child.
-								This is designed to allow paging through the children, which is much more efficient for large numbers of children.
-								The node may be specified by path and/or by identification properties, and the block
-								is defined by the location of the node immediately preceding the block and a count (i.e., the block size).
-								The connector returns an ordered list of locations for each of the node's children found in the block,
-								or an empty list if there are no children in that range.
-								The connector also sets on the request the actual location of the parent node (including the path and identification properties)
-								or sets a &PathNotFoundException; error on the request if the parent node did not exist in the workspace.
-								The connector sets a &InvalidWorkspaceException; error on the request if the named workspace does not exist.
-							</entry>
-						</row>
-						<row>
-							<entry>ReadBranchRequest</entry>
-							<entry>
-								A request to read a portion of a subgraph that has as its root a particular node, up to a maximum depth.
-								This request is an efficient mechanism when a branch (or part of a branch) is to be navigated and processed,
-								and replaces some non-trivial code to read the branch iteratively using multiple <code>ReadNodeRequest</code>s.
-								The connector reads the branch to the specified maximum depth, returning the properties and children for all
-								nodes found in the branch.  
-								The connector also sets on the request the actual location of the branch's root node (including the path and identification properties).
-								The connector sets a &PathNotFoundException; error on the request if the node at 
-								the top of the branch does not exist in the workspace.
-								The connector sets a &InvalidWorkspaceException; error on the request if the named workspace does not exist.
-							</entry>
-						</row>
-						<row>
-							<entry>CreateNodeRequest</entry>
-							<entry>
-								A request to create a node at the specified location and setting on the new node the properties included in the request.
-								The connector creates the node at the desired location, adjusting any same-name-sibling indexes as required.
-								(If an SNS index is provided in the new node's location, existing children with the same name after that SNS index
-								will have their SNS indexes adjusted.  However, if the requested location does not include a SNS index, the new
-								node is added after all existing children, and it's SNS index is set accordingly.)
-								The connector also sets on the request the actual location of the new node (including the path and identification properties)..
-								The connector sets a &PathNotFoundException; error on the request if the parent node does not exist in the workspace.
-								The connector sets a &InvalidWorkspaceException; error on the request if the named workspace does not exist.
-							</entry>
-						</row>
-						<row>
-							<entry>RemovePropertiesRequest</entry>
-							<entry>
-								A request to remove a set of properties on an existing node.  The request contains the location of the node as well as the
-								names of the properties to be removed.  The connector performs these changes and sets on the request the
-								actual location (including the path and identification properties) of the node.
-								The connector sets a &PathNotFoundException; error on the request if the node does not exist in the workspace.
-								The connector sets a &InvalidWorkspaceException; error on the request if the named workspace does not exist.
-							</entry>
-						</row>
-						<row>
-							<entry>UpdatePropertiesRequest</entry>
-							<entry>
-								A request to set or update properties on an existing node.  The request contains the location of the node as well as the
-								properties to be set and those to be deleted.  The connector performs these changes and sets on the request the
-								actual location (including the path and identification properties) of the node.
-								The connector sets a &PathNotFoundException; error on the request if the node does not exist in the workspace.
-								The connector sets a &InvalidWorkspaceException; error on the request if the named workspace does not exist.
-							</entry>
-						</row>
-						<row>
-							<entry>RenameNodeRequest</entry>
-							<entry>
-								A request to change the name of a node.  The connector changes the node's name, adjusts all SNS indexes
-								accordingly, and returns the actual locations (including the path and identification properties) of both the original
-								location and the new location.
-								The connector sets a &PathNotFoundException; error on the request if the node does not exist in the workspace.
-								The connector sets a &InvalidWorkspaceException; error on the request if the named workspace does not exist.
-							</entry>
-						</row>
-						<row>
-							<entry>CopyBranchRequest</entry>
-							<entry>
-								A request to copy a portion of a subgraph that has as its root a particular node, up to a maximum depth.
-								The request includes the name of the workspace where the original node is located as well as the name of the
-								workspace where the copy is to be placed (these may be the same, but may be different).
-								The connector copies the branch from the original location, up to the specified maximum depth, and places a copy
-								of the node as a child of the new location.
-								The connector also sets on the request the actual location (including the path and identification properties)
-								of the original location as well as the location of the new copy.
-								The connector sets a &PathNotFoundException; error on the request if the node at 
-								the top of the branch does not exist in the workspace.
-								The connector sets a &InvalidWorkspaceException; error on the request if one of the named workspaces does not exist.
-							</entry>
-						</row>
-						<row>
-							<entry>MoveBranchRequest</entry>
-							<entry>
-								A request to move a subgraph that has a particular node as its root.
-								The connector moves the branch from the original location and places it as child of the specified new location.
-								The connector also sets on the request the actual location (including the path and identification properties)
-								of the original and new locations.  The connector will adjust SNS indexes accordingly.
-								The connector sets a &PathNotFoundException; error on the request if the node that is to be moved or the
-								new location do not exist in the workspace.
-								The connector sets a &InvalidWorkspaceException; error on the request if the named workspace does not exist.
-							</entry>
-						</row>
-						<row>
-							<entry>DeleteBranchRequest</entry>
-							<entry>
-								A request to delete an entire branch specified by a single node's location.
-								The connector deletes the specified node and all nodes below it, and sets the actual location,
-								including the path and identification properties, of the node that was deleted.
-								The connector sets a &PathNotFoundException; error on the request if the node being deleted does not exist in the workspace.
-								The connector sets a &InvalidWorkspaceException; error on the request if the named workspace does not exist.
-							</entry>
-						</row>
-						<row>
-							<entry>CompositeRequest</entry>
-							<entry>
-								A request that actually comprises multiple requests (none of which will be a composite).
-								The connector simply processes all of the requests in the composite request, but should set on the composite
-								request any error (usually the first error) that occurs during processing of the contained requests.
-							</entry>
-						</row>
-					</tbody>
-				</tgroup>
-			</table>
-			<para>There are also requests that deal with workspaces:</para>
-			<table frame='all'>
-				<title>Types of Workspace Requests</title>
-				<tgroup cols='2' align='left' colsep='1' rowsep='1'>
-		      <colspec colname='c1' colwidth="1*"/>
-		      <colspec colname='c2' colwidth="1*"/>
-					<thead>
-						<row>
-				  		<entry>Name</entry>
-				  		<entry>Description</entry>
-						</row>
-					</thead>
-					<tbody>
-						<row>
-							<entry>GetWorkspacesRequest</entry>
-							<entry>
-								A request to obtain the names of the existing workspaces that are accessible to the caller.
-							</entry>
-						</row>
-						<row>
-							<entry>VerifyWorkspaceRequest</entry>
-							<entry>
-								A request to verify that a workspace with a particular name exists.
-								The connector returns the actual location for the root node if the workspace exists, as well as the actual name of the workspace
-								(e.g., the default workspace name if a null name is supplied).
-							</entry>
-						</row>
-						<row>
-							<entry>CreateWorkspaceRequest</entry>
-							<entry>
-								A request to create a workspace with a particular name.
-								The connector returns the actual location for the root node if the workspace exists, as well as the actual name of the workspace
-								(e.g., the default workspace name if a null name is supplied).
-								The connector sets a &InvalidWorkspaceException; error on the request if the named workspace already exists.
-							</entry>
-						</row>
-						<row>
-							<entry>DestroyWorkspaceRequest</entry>
-							<entry>
-								A request to destroy a workspace with a particular name.
-								The connector sets a &InvalidWorkspaceException; error on the request if the named workspace does not exist.
-							</entry>
-						</row>
-						<row>
-							<entry>CloneWorkspaceRequest</entry>
-							<entry>
-								A request to clone one named workspace as another new named workspace.
-								The connector sets a &InvalidWorkspaceException; error on the request if the original workspace does not exist, 
-								or if the new workspace already exists.
-							</entry>
-						</row>
-					</tbody>
-				</tgroup>
-			</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;.
@@ -923,7 +559,8 @@
 			</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 DNA provides a &RequestProcessor; class that can simplify writing your own connector and at the
+				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
 				same time help insulate your connector from new kinds of requests that may be added in the future.  The &RequestProcessor;
 				is an abstract class that defines a <code>process(...)</code> method for each concrete &Request; subclass.
 				In other words, there is a <code>process(CompositeRequest)</code> method, a <code>process(ReadNodeRequest)</code> method,
@@ -984,28 +621,16 @@
 				don't become polluted with slow-running tests that break if the external system is not available.
 			</para>
 		</sect2>
-	  <sect2 id="deploying_custom_connectors">
-	    <title>Configuring and deploying custom connectors</title>
-	    <para>
-				After building your connector project, you need to configure the JBoss DNA components your application is using so
-				that they use your connector.  In a lot of cases, this will entail instantiating your connector's &RepositorySource; class,
-				setting the various properties, and registering it with a &RepositoryLibrary;.  Or, it will entail using a configuration
-				repository to use your source and letting &RepositoryService; instantiate and set up your &RepositorySource; instance.
-				Or, you can just instantiate and set it up manually, passing the instance to whatever component needs it.
-			</para>
-			<para>
-				And of course you have to make the JAR file containing your connector (as well as any dependency JARs) available to
-				your application's classpath.
-			</para>
-		</sect2>
   </sect1>
 	<sect1>
 		<title>Summary</title>
 		<para>
-			In this chapter, we covered all the aspects of JBoss DNA repositories, including the connector framework,
+			In this chapter, we covered all the aspects of JBoss DNA connectors, including the connector API,
 			how DNA's JCR implementation works with connectors, what connectors are available (and how to use them),
 			and how to write your own connector.  So now that you know how to set up and use JBoss DNA repositories,
-			the <link linkend="jcr">next chapter</link> describes how you can leverage JBoss DNA's JCR implementation.
+			the <link linkend="sequencing-framework">next chapter</link> describes the sequencing framework and how
+			to build your own custom sequencers.  After that, we'll get into <link linkend="configuration">how to configure
+			JBoss DNA</link> to use the connectors and sequencers.
 		</para>
 	</sect1>
 </chapter>

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	2009-06-09 04:32:58 UTC (rev 1004)
+++ trunk/docs/reference/src/main/docbook/en-US/content/core/graph.xml	2009-06-09 06:11:41 UTC (rev 1005)
@@ -962,6 +962,441 @@
 		</para>
 	</sect2>
 	</sect1>
+	<sect1 id="graph-requests">
+		<title>Requests</title>
+		<para>
+			JBoss DNA &Graph; objects operate upon the underlying graph content, but we haven't really talked about how that works.
+			Recall that the &Graph; objects don't maintain any stateful representation of the content, but instead submit requests
+			to the underlying graph and return representations of the requested portions of the content.
+			This section focuses on what those requests look like, since they'll actually become very important when
+			working with <link linkend="connector-framework">connectors</link> in the next chapter.
+		</para>
+		<para>
+			A graph &Request; is an encapsulation of a command that is to be executed by the underlying graph owner (typically
+			a connector).  Request objects can take many different forms, as there are different classes for each kind of request.
+			Each request contains the information needed to complete the processing, and it also is the place
+			where the results (or error) are recorded.
+		</para>
+		<para>
+			The &Graph; object creates the &Request; objects using &Location; objects to identify the node (or nodes) that are the
+			subject of the request.  The &Graph; can either submit the request immediately, or it can batch multiple requests
+			together into "units of work".  The submitted requests are then processed by the underlying system (e.g., connector)
+			and returned back to the &Graph; object, which then extracts and returns the results.
+		</para>
+		<para>
+			There are actually quite a few different types of &Request; classes:
+		</para>
+		<table frame='all'>
+			<title>Types of Read Requests</title>
+			<tgroup cols='2' align='left' colsep='1' rowsep='1'>
+	      <colspec colname='c1' colwidth="1*"/>
+	      <colspec colname='c2' colwidth="1*"/>
+				<thead>
+					<row>
+			  		<entry>Name</entry>
+			  		<entry>Description</entry>
+					</row>
+				</thead>
+				<tbody>
+					<row>
+						<entry>ReadNodeRequest</entry>
+						<entry>
+							A request to read from the named workspace in the source a node's properties and children.
+							The node may be specified by path and/or by identification properties.
+							The connector returns all properties and the locations for all children,
+							or sets a &PathNotFoundException; error on the request if the node did not exist in the workspace.
+							If the node is found, the connector sets on the request the actual location of the node (including the path and identification properties).
+							The connector sets a &InvalidWorkspaceException; error on the request if the named workspace does not exist.
+						</entry>
+					</row>
+					<row>
+						<entry>VerifyNodeExistsRequest</entry>
+						<entry>
+							A request to verify the existance of a node at the specified location in the named workspace of the source.
+							The connector returns all the actual location for the node if it exists, or
+							sets a &PathNotFoundException; error on the request if the node does not exist in the workspace.
+							The connector sets a &InvalidWorkspaceException; error on the request if the named workspace does not exist.
+						</entry>
+					</row>
+					<row>
+						<entry>ReadAllPropertiesRequest</entry>
+						<entry>
+							A request to read from the named workspace in the source all of the properties of a node.
+							The node may be specified by path and/or by identification properties.
+							The connector returns all properties that were found on the node,
+							or sets a &PathNotFoundException; error on the request if the node did not exist in the workspace.
+							If the node is found, the connector sets on the request the actual location of the node (including the path and identification properties).
+							The connector sets a &InvalidWorkspaceException; error on the request if the named workspace does not exist.
+						</entry>
+					</row>
+					<row>
+						<entry>ReadPropertyRequest</entry>
+						<entry>
+							A request to read from the named workspace in the source a single property of a node.
+							The node may be specified by path and/or by identification properties,
+							and the property is specified by name.
+							The connector returns the property if found on the node,
+							or sets a &PathNotFoundException; error on the request if the node or property did not exist in the workspace.
+							If the node is found, the connector sets on the request the actual location of the node (including the path and identification properties).
+							The connector sets a &InvalidWorkspaceException; error on the request if the named workspace does not exist.
+						</entry>
+					</row>
+					<row>
+						<entry>ReadAllChildrenRequest</entry>
+						<entry>
+							A request to read from the named workspace in the source all of the children of a node.
+							The node may be specified by path and/or by identification properties.
+							The connector returns an ordered list of locations for each child found on the node,
+							an empty list if the node had no children,
+							or sets a &PathNotFoundException; error on the request if the node did not exist in the workspace.
+							If the node is found, the connector sets on the request the actual location of the parent node (including the path and identification properties).
+							The connector sets a &InvalidWorkspaceException; error on the request if the named workspace does not exist.
+						</entry>
+					</row>
+					<row>
+						<entry>ReadBlockOfChildrenRequest</entry>
+						<entry>
+							A request to read from the named workspace in the source a block of children of a node, starting with the n<superscript>th</superscript> children.
+							This is designed to allow paging through the children, which is much more efficient for large numbers of children.
+							The node may be specified by path and/or by identification properties, and the block
+							is defined by a starting index and a count (i.e., the block size).
+							The connector returns an ordered list of locations for each of the node's children found in the block,
+							or an empty list if there are no children in that range.
+							The connector also sets on the request the actual location of the parent node (including the path and identification properties)
+							or sets a &PathNotFoundException; error on the request if the parent node did not exist in the workspace.
+							The connector sets a &InvalidWorkspaceException; error on the request if the named workspace does not exist.
+						</entry>
+					</row>
+					<row>
+						<entry>ReadNextBlockOfChildrenRequest</entry>
+						<entry>
+							A request to read from the named workspace in the source a block of children of a node, starting with the children that immediately follow
+							a previously-returned child.
+							This is designed to allow paging through the children, which is much more efficient for large numbers of children.
+							The node may be specified by path and/or by identification properties, and the block
+							is defined by the location of the node immediately preceding the block and a count (i.e., the block size).
+							The connector returns an ordered list of locations for each of the node's children found in the block,
+							or an empty list if there are no children in that range.
+							The connector also sets on the request the actual location of the parent node (including the path and identification properties)
+							or sets a &PathNotFoundException; error on the request if the parent node did not exist in the workspace.
+							The connector sets a &InvalidWorkspaceException; error on the request if the named workspace does not exist.
+						</entry>
+					</row>
+					<row>
+						<entry>ReadBranchRequest</entry>
+						<entry>
+							A request to read a portion of a subgraph that has as its root a particular node, up to a maximum depth.
+							This request is an efficient mechanism when a branch (or part of a branch) is to be navigated and processed,
+							and replaces some non-trivial code to read the branch iteratively using multiple <code>ReadNodeRequest</code>s.
+							The connector reads the branch to the specified maximum depth, returning the properties and children for all
+							nodes found in the branch.  
+							The connector also sets on the request the actual location of the branch's root node (including the path and identification properties).
+							The connector sets a &PathNotFoundException; error on the request if the node at 
+							the top of the branch does not exist in the workspace.
+							The connector sets a &InvalidWorkspaceException; error on the request if the named workspace does not exist.
+						</entry>
+					</row>
+				</tbody>
+			</tgroup>
+		</table>
+		<para>
+		  &ChangeRequest; is a subclass of &Request; that provides a base class for all the requests that request a change
+		  be made to the content.  As we'll see later, these &ChangeRequest; objects also get reused by the
+		  <link linkend="graph-observation">observation</link> system.
+		</para>
+		<table frame='all'>
+			<title>Types of Change Requests</title>
+			<tgroup cols='2' align='left' colsep='1' rowsep='1'>
+	      <colspec colname='c1' colwidth="1*"/>
+	      <colspec colname='c2' colwidth="1*"/>
+				<thead>
+					<row>
+			  		<entry>Name</entry>
+			  		<entry>Description</entry>
+					</row>
+				</thead>
+				<tbody>
+					<row>
+						<entry>CreateNodeRequest</entry>
+						<entry>
+							A request to create a node at the specified location and setting on the new node the properties included in the request.
+							The connector creates the node at the desired location, adjusting any same-name-sibling indexes as required.
+							(If an SNS index is provided in the new node's location, existing children with the same name after that SNS index
+							will have their SNS indexes adjusted.  However, if the requested location does not include a SNS index, the new
+							node is added after all existing children, and it's SNS index is set accordingly.)
+							The connector also sets on the request the actual location of the new node (including the path and identification properties)..
+							The connector sets a &PathNotFoundException; error on the request if the parent node does not exist in the workspace.
+							The connector sets a &InvalidWorkspaceException; error on the request if the named workspace does not exist.
+						</entry>
+					</row>
+					<row>
+						<entry>RemovePropertiesRequest</entry>
+						<entry>
+							A request to remove a set of properties on an existing node.  The request contains the location of the node as well as the
+							names of the properties to be removed.  The connector performs these changes and sets on the request the
+							actual location (including the path and identification properties) of the node.
+							The connector sets a &PathNotFoundException; error on the request if the node does not exist in the workspace.
+							The connector sets a &InvalidWorkspaceException; error on the request if the named workspace does not exist.
+						</entry>
+					</row>
+					<row>
+						<entry>UpdatePropertiesRequest</entry>
+						<entry>
+							A request to set or update properties on an existing node.  The request contains the location of the node as well as the
+							properties to be set and those to be deleted.  The connector performs these changes and sets on the request the
+							actual location (including the path and identification properties) of the node.
+							The connector sets a &PathNotFoundException; error on the request if the node does not exist in the workspace.
+							The connector sets a &InvalidWorkspaceException; error on the request if the named workspace does not exist.
+						</entry>
+					</row>
+					<row>
+						<entry>RenameNodeRequest</entry>
+						<entry>
+							A request to change the name of a node.  The connector changes the node's name, adjusts all SNS indexes
+							accordingly, and returns the actual locations (including the path and identification properties) of both the original
+							location and the new location.
+							The connector sets a &PathNotFoundException; error on the request if the node does not exist in the workspace.
+							The connector sets a &InvalidWorkspaceException; error on the request if the named workspace does not exist.
+						</entry>
+					</row>
+					<row>
+						<entry>CopyBranchRequest</entry>
+						<entry>
+							A request to copy a portion of a subgraph that has as its root a particular node, up to a maximum depth.
+							The request includes the name of the workspace where the original node is located as well as the name of the
+							workspace where the copy is to be placed (these may be the same, but may be different).
+							The connector copies the branch from the original location, up to the specified maximum depth, and places a copy
+							of the node as a child of the new location.
+							The connector also sets on the request the actual location (including the path and identification properties)
+							of the original location as well as the location of the new copy.
+							The connector sets a &PathNotFoundException; error on the request if the node at 
+							the top of the branch does not exist in the workspace.
+							The connector sets a &InvalidWorkspaceException; error on the request if one of the named workspaces does not exist.
+						</entry>
+					</row>
+					<row>
+						<entry>MoveBranchRequest</entry>
+						<entry>
+							A request to move a subgraph that has a particular node as its root.
+							The connector moves the branch from the original location and places it as child of the specified new location.
+							The connector also sets on the request the actual location (including the path and identification properties)
+							of the original and new locations.  The connector will adjust SNS indexes accordingly.
+							The connector sets a &PathNotFoundException; error on the request if the node that is to be moved or the
+							new location do not exist in the workspace.
+							The connector sets a &InvalidWorkspaceException; error on the request if the named workspace does not exist.
+						</entry>
+					</row>
+					<row>
+						<entry>DeleteBranchRequest</entry>
+						<entry>
+							A request to delete an entire branch specified by a single node's location.
+							The connector deletes the specified node and all nodes below it, and sets the actual location,
+							including the path and identification properties, of the node that was deleted.
+							The connector sets a &PathNotFoundException; error on the request if the node being deleted does not exist in the workspace.
+							The connector sets a &InvalidWorkspaceException; error on the request if the named workspace does not exist.
+						</entry>
+					</row>
+					<row>
+						<entry>CompositeRequest</entry>
+						<entry>
+							A request that actually comprises multiple requests (none of which will be a composite).
+							The connector simply processes all of the requests in the composite request, but should set on the composite
+							request any error (usually the first error) that occurs during processing of the contained requests.
+						</entry>
+					</row>
+				</tbody>
+			</tgroup>
+		</table>
+		<para>There are also requests that deal with workspaces:</para>
+		<table frame='all'>
+			<title>Types of Workspace Read Requests</title>
+			<tgroup cols='2' align='left' colsep='1' rowsep='1'>
+	      <colspec colname='c1' colwidth="1*"/>
+	      <colspec colname='c2' colwidth="1*"/>
+				<thead>
+					<row>
+			  		<entry>Name</entry>
+			  		<entry>Description</entry>
+					</row>
+				</thead>
+				<tbody>
+					<row>
+						<entry>GetWorkspacesRequest</entry>
+						<entry>
+							A request to obtain the names of the existing workspaces that are accessible to the caller.
+						</entry>
+					</row>
+					<row>
+						<entry>VerifyWorkspaceRequest</entry>
+						<entry>
+							A request to verify that a workspace with a particular name exists.
+							The connector returns the actual location for the root node if the workspace exists, as well as the actual name of the workspace
+							(e.g., the default workspace name if a null name is supplied).
+						</entry>
+					</row>
+				</tbody>
+			</tgroup>
+		</table>
+		<para>And there are also requests that deal with changing workspaces (and thus extend &ChangeRequest;):</para>
+		<table frame='all'>
+			<title>Types of Workspace Change Requests</title>
+			<tgroup cols='2' align='left' colsep='1' rowsep='1'>
+	      <colspec colname='c1' colwidth="1*"/>
+	      <colspec colname='c2' colwidth="1*"/>
+				<thead>
+					<row>
+			  		<entry>Name</entry>
+			  		<entry>Description</entry>
+					</row>
+				</thead>
+				<tbody>
+					<row>
+						<entry>CreateWorkspaceRequest</entry>
+						<entry>
+							A request to create a workspace with a particular name.
+							The connector returns the actual location for the root node if the workspace exists, as well as the actual name of the workspace
+							(e.g., the default workspace name if a null name is supplied).
+							The connector sets a &InvalidWorkspaceException; error on the request if the named workspace already exists.
+						</entry>
+					</row>
+					<row>
+						<entry>DestroyWorkspaceRequest</entry>
+						<entry>
+							A request to destroy a workspace with a particular name.
+							The connector sets a &InvalidWorkspaceException; error on the request if the named workspace does not exist.
+						</entry>
+					</row>
+					<row>
+						<entry>CloneWorkspaceRequest</entry>
+						<entry>
+							A request to clone one named workspace as another new named workspace.
+							The connector sets a &InvalidWorkspaceException; error on the request if the original workspace does not exist, 
+							or if the new workspace already exists.
+						</entry>
+					</row>
+				</tbody>
+			</tgroup>
+		</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;.
+			Getting the version history for a node will likely be another kind of request added in an upcoming release.
+		</para>
+		<para>
+			This section covered the different kinds of &Request; classes.  The next section provides a easy way to encapsulate how
+			a component should responds to these requests, and after that we'll see how these &Request; objects are also used
+			in the <link linkend="graph-observation">observation</link> framework.
+		</para>
+	</sect1>
+	<sect1 id="graph-request-processors">
+		<title>Request processors</title>
+		<para>
+			JBoss DNA connectors are typically the components that receive these &Request; objects.  We'll dive deep into connectors
+			in the <link linkend="connector-framework">next chapter</link>, but before we do there is one more component related to
+			&Request;s that should be discussed.
+		</para>
+		<para>
+			The &RequestProcessor; class is an abstract class that defines a <code>process(...)</code> method for each concrete &Request; subclass.
+			In other words, there is a <code>process(CompositeRequest)</code> method, a <code>process(ReadNodeRequest)</code> method,
+			and so on. This makes it easy to implement behavior that responds to the different kinds of &Request; classes:
+			simply subclass the &RequestProcessor;, override all of the abstract methods, and optionally
+			overriding any of the other methods that have a default implementation.
+		</para>
+		<note>
+			<para>
+				The &RequestProcessor; abstract class contains default implementations for quite a few of the <code>process(...)</code> methods,
+				and these will be <emphasis>sufficient</emphasis>	but probably not efficient or optimum.  If you can provide a more efficient
+				implementation given your source, feel free to do so.  However, if performance is not a big issue, all of the concrete methods
+				will provide the correct behavior. Keep things simple to start out - you can always provide better implementations later.
+			</para>
+		</note>
+	</sect1>
+	<sect1 id="graph-observation">
+		<title>Observation</title>
+		<para>
+			The JBoss DNA graph model also incorporates an observation framework that allows components to register and
+			be notified when changes occur within the content owned by a graph.
+		</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.
+			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
+			also save effort and code.
+		</para>
+		<para>
+			However, one of the more important reasons for providing classes is that &ChangeObserver; uses 
+			weak references to track the &Observable; instances, and the &ChangeObservers;
+			class uses weak references for the listeners.  This means that an observer does not prevent &Observable; instances
+			from being garbage collected, nor do observers prevent &Observable; instances from being garbage collected.
+			These abstract class provide all this functionality for free.
+		</para>
+		<sect2 id="graph-observable">
+			<title>Observable</title>
+			<para>
+				Any component that can have changes and be observed can implement the &Observable; interface.  This interface
+				allows &Observers; to register (or be registered) to receive notifications of the changes.  However, a concrete and thread-safe 
+				implementation of this interface, called &ChangeObservers;, is available and should be used where possible, since it 
+				automatically manages the registered &ChangeObserver; instances and properly implements the register and unregister mechanisms.
+			</para>
+		</sect2>
+		<sect2 id="graph-observers">
+			<title>Observers</title>
+			<para>
+				Components that are to recieve notifications of changes are called <emphasis>observers</emphasis>.  To create an observer, simply extend 
+				the &ChangeObserver; abstract class and provide an implementation of the <code>notify(&Changes;)</code> method.
+				Then, register the observer with an &Observable; using its <code>register(&ChangeObserver;)</code> method.
+				The observer's <code>notify(&Changes;)</code> method will then be called with the changes that have
+				been made to the &Observable;.
+			</para>
+			<para>
+				When an observer is no longer needed, it should be unregistered from all &Observable; instances with which
+				it was registered.  The &ChangeObserver; class automatically tracks which &Observable; instances it is
+				registered with, and calling the observer's <code>unregister()</code> will unregister the observer from
+				all of these &Observable;s.  Alternatively, an observer can be unregistered from a single &Observable; using the
+				&Observable;'s <code>unregister(&ChangeObserver;)</code> method.
+			</para>
+		</sect2>
+		<sect2 id="graph-changes">
+			<title>Changes</title>
+			<para>
+				The &Changes; class represents the set of individual changes that have been made during a single, atomic
+				operation.  Each &Changes; instance has information about the source of the changes, the timestamp at which
+				the changes occurred, and the individual changes that were made.  These individual changes take the form of
+				&ChangeRequest; objects, which we'll see more of in the next chapter.  Each request is 
+				frozen, meaning it is immutable and will not change.  Also none of the change requests will be marked as cancelled.
+			</para>
+			<para>
+				Using the actual &ChangeRequest; objects as the "events" has a number of advantages.
+				First, the existing &ChangeRequest; subclasses already contain the information to accurately and completely
+				describe the operation.  Reusing these classes means we don't need a duplicate class structure or come up with a generic
+				event class.
+			</para>
+			<para>
+				Second, the requests have all the state required for an event, plus they often will have more.  For example,
+				the &DeleteBranchRequest; has the actual location of the branch that was deleted (and in this way is not much different than
+				a more generic event), but the &CreateNodeRequest; has the actual location of the created node along with the properties
+				of that node.  Additionally, the &RemovePropertyRequest; has the actual location of the node along with the name of the property
+				that was removed.  In many cases, these requests have all the information a more general event class might have but
+				then hopefully enough information for many observers to use directly without having to read the graph to decide what
+				actually changed. 
+			</para>
+			<para>
+				Third, the requests that make up a &Changes; instance can actually be replayed.  Consider the case of a cache
+				that is backed by a &RepositorySource;, which might use an observer to keep the cache in sync.  
+				As the cache is notified of &Changes;, the cache can simply replay the changes against its source.
+			</para>
+		</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
+			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.
+		</para>
+	</sect1>
 	<sect1>
 		<title>Summary</title>
 		<para>

Modified: trunk/docs/reference/src/main/docbook/en-US/custom.dtd
===================================================================
--- trunk/docs/reference/src/main/docbook/en-US/custom.dtd	2009-06-09 04:32:58 UTC (rev 1004)
+++ trunk/docs/reference/src/main/docbook/en-US/custom.dtd	2009-06-09 06:11:41 UTC (rev 1005)
@@ -116,10 +116,11 @@
 <!ENTITY PropertyType		       				"<ulink url='&API;graph/property/PropertyType.html'><classname>PropertyType</classname></ulink>">
 <!ENTITY PathNotFoundException				"<ulink url='&API;graph/property/PathNotFoundException.html'><classname>PathNotFoundException</classname></ulink>">
 <!ENTITY RepositorySource       			"<ulink url='&API;graph/connector/RepositorySource.html'><interface>RepositorySource</interface></ulink>">
+<!ENTITY RepositoryContext       			"<ulink url='&API;graph/connector/RepositoryContext.html'><interface>RepositoryContext</interface></ulink>">
 <!ENTITY RepositoryConnection    			"<ulink url='&API;graph/connector/RepositoryConnection.html'><interface>RepositoryConnection</interface></ulink>">
 <!ENTITY RepositoryConnectionFactory	"<ulink url='&API;graph/connector/RepositoryConnectionFactory.html'><interface>RepositoryConnectionFactory</interface></ulink>">
-<!ENTITY RepositorySourceListener			"<ulink url='&API;graph/connector/RepositorySourceListener.html'><interface>RepositorySourceListener</interface></ulink>">
 <!ENTITY RepositorySourceCapabilities	"<ulink url='&API;graph/connector/RepositorySourceCapabilities.html'><classname>RepositorySourceCapabilities</classname></ulink>">
+<!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 FederatedRepository			  	"<ulink url='&API;graph/connector/federation/FederatedRepository.html'><classname>FederatedRepository</classname></ulink>">
@@ -127,9 +128,13 @@
 <!ENTITY Projection								  	"<ulink url='&API;graph/connector/federation/Projection.html'><classname>Projection</classname></ulink>">
 <!ENTITY CachePolicy							    "<ulink url='&API;graph/cache/CachePolicy.html'><interface>CachePolicy</interface></ulink>">
 <!ENTITY Request					       			"<ulink url='&API;graph/request/Request.html'><classname>Request</classname></ulink>">
+<!ENTITY ChangeRequest					      "<ulink url='&API;graph/request/ChangeRequest.html'><classname>ChangeRequest</classname></ulink>">
 <!ENTITY CompositeRequest					    "<ulink url='&API;graph/request/CompositeRequest.html'><classname>CompositeRequest</classname></ulink>">
 <!ENTITY ReadNodeRequest					    "<ulink url='&API;graph/request/ReadNodeRequest.html'><classname>ReadNodeRequest</classname></ulink>">
+<!ENTITY RemovePropertyRequest			  "<ulink url='&API;graph/request/RemovePropertyRequest.html'><classname>RemovePropertyRequest</classname></ulink>">
+<!ENTITY CreateNodeRequest					  "<ulink url='&API;graph/request/CreateNodeRequest.html'><classname>CreateNodeRequest</classname></ulink>">
 <!ENTITY CopyBranchRequest					  "<ulink url='&API;graph/request/CopyBranchRequest.html'><classname>CopyBranchRequest</classname></ulink>">
+<!ENTITY DeleteBranchRequest					"<ulink url='&API;graph/request/DeleteBranchRequest.html'><classname>DeleteBranchRequest</classname></ulink>">
 <!ENTITY InvalidRequestException	   	"<ulink url='&API;graph/request/InvalidRequestException.html'><classname>InvalidRequestException</classname></ulink>">
 <!ENTITY InvalidWorkspaceException		"<ulink url='&API;graph/request/InvalidWorkspaceException.html'><classname>InvalidWorkspaceException</classname></ulink>">
 <!ENTITY UnsupportedRequestException	"<ulink url='&API;graph/request/UnsupportedRequestException.html'><classname>UnsupportedRequestException</classname></ulink>">
@@ -140,6 +145,12 @@
 <!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>">
 
 <!-- Types in dna-repository -->
 



From dna-commits at lists.jboss.org  Tue Jun  9 02:11:58 2009
From: dna-commits at lists.jboss.org (dna-commits at lists.jboss.org)
Date: Tue, 09 Jun 2009 02:11:58 -0400
Subject: [dna-commits] DNA SVN: r1006 -
	trunk/docs/reference/src/main/docbook/en-US/content/core.
Message-ID: <E1MDuYw-0005WX-00@committer01.frg.pub.inap.atl.jboss.com>

Author: rhauch
Date: 2009-06-09 02:11:57 -0400 (Tue, 09 Jun 2009)
New Revision: 1006

Modified:
   trunk/docs/reference/src/main/docbook/en-US/content/core/connector.xml
Log:
Clarified how the connector should be broadcasting events

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	2009-06-09 06:11:41 UTC (rev 1005)
+++ trunk/docs/reference/src/main/docbook/en-US/content/core/connector.xml	2009-06-09 06:11:57 UTC (rev 1006)
@@ -579,6 +579,12 @@
 				</para>
 			</note>
 			<para>
+				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.
+			</para>
+			<para>
 				Then, in your connector's <code>execute(&ExecutionContext;, &Request;)</code> method, instantiate your &RequestProcessor; subclass
 				and call its <code>process(&Request;) method, passing in the <code>execute(...)</code> method's &Request; parameter.</code>
 				The &RequestProcessor; will determine the appropriate method given the actual &Request; object and will then invoke that method:
@@ -586,11 +592,13 @@
 	    <programlisting>
 public void execute( final &ExecutionContext; context,
                      final &Request; request ) throws RepositorySourceException {
-    RequestProcessor processor = new RequestProcessor(context);
+    String sourceName = // from the &RepositorySource;
+    &Observer; observer = // from the &RepositoryContext;
+    &RequestProcessor; processor = new CustomRequestProcessor(sourceName,context,observer);
     try {
         processor.process(request);
     } finally {
-        processor.close();
+        processor.close();	// sends the accumulated &ChangeRequest;s as a &Changes; to the &Observer;
     }
 }</programlisting>
 			<para>



From dna-commits at lists.jboss.org  Tue Jun  9 06:49:09 2009
From: dna-commits at lists.jboss.org (dna-commits at lists.jboss.org)
Date: Tue, 09 Jun 2009 06:49:09 -0400
Subject: [dna-commits] DNA SVN: r1007 -
	trunk/docs/reference/src/main/docbook/en-US/content/core.
Message-ID: <E1MDytB-00018k-0v@committer01.frg.pub.inap.atl.jboss.com>

Author: bcarothers
Date: 2009-06-09 06:49:08 -0400 (Tue, 09 Jun 2009)
New Revision: 1007

Modified:
   trunk/docs/reference/src/main/docbook/en-US/content/core/execution_context.xml
Log:
Fixed a mis-named section

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	2009-06-09 06:11:57 UTC (rev 1006)
+++ trunk/docs/reference/src/main/docbook/en-US/content/core/execution_context.xml	2009-06-09 10:49:08 UTC (rev 1007)
@@ -485,7 +485,7 @@
 	  </note>
 	</sect1>
 	<sect1 id="mime-type-detectors">
-		<title>Property factory and value factories</title>
+		<title>MIME Type Detectors</title>
 	  <para>
 	  	JBoss DNA often needs the ability to determine the MIME type for some binary content.  When uploading content into
 			a repository, we may want to add the MIME type as metadata.  Or, we may want to make some processing decisions



From dna-commits at lists.jboss.org  Tue Jun  9 07:17:52 2009
From: dna-commits at lists.jboss.org (dna-commits at lists.jboss.org)
Date: Tue, 09 Jun 2009 07:17:52 -0400
Subject: [dna-commits] DNA SVN: r1008 -
	trunk/docs/reference/src/main/docbook/en-US/content/jcr.
Message-ID: <E1MDzKy-00026L-Pc@committer01.frg.pub.inap.atl.jboss.com>

Author: bcarothers
Date: 2009-06-09 07:17:52 -0400 (Tue, 09 Jun 2009)
New Revision: 1008

Modified:
   trunk/docs/reference/src/main/docbook/en-US/content/jcr/jcr.xml
Log:
Final draft of the JCR chapter

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	2009-06-09 10:49:08 UTC (rev 1007)
+++ trunk/docs/reference/src/main/docbook/en-US/content/jcr/jcr.xml	2009-06-09 11:17:52 UTC (rev 1008)
@@ -37,14 +37,33 @@
     Java Community Process under <ulink url="&JSR170;">JSR-170</ulink> (JCR 1.0) and is being revised under <ulink url="&JSR283;">JSR-283</ulink>.
 		JBoss DNA provides a partial JCR 1.0 implementation that allows you to work with the contents of a repository using the
 		JCR API.  For information about how to use the JCR API, please see the <ulink url="&JSR170;">JSR-170</ulink> specification.
+	<note>
+		<para>In the interests of brevity, this chapter does not attempt to reproduce the JSR-170 specification in order to provide
+		an exhaustive definition of JBoss DNA JCR capabilities.  Rather, this chapter will describe any deviations from the
+		specification as well as any DNA-specific public APIs and configuration.
+		</para>
+	</note>
   </para>
-  <sect1 id="jcr-repositories">
-    <title>Obtaining JCR repositories</title>
-		<para>Add reference to how to use JcrConfiguration to obtain a JcrEngine.
+	<para>Using JBoss DNA within your application is actually quite straightforward.  As you'll see in this chapter,
+		the first step is setting up JBoss DNA and starting the <code>JcrEngine</code>.  After that, you obtain the
+		<code>javax.jcr.Repository</code> instance for a named repository and just use the standard JCR API throughout your
+		application.
+	</para>
+  <sect1>	
+    <title>Obtaining JCR Repositories</title>
+		<para>Once you've obtained a reference to a <code>JcrEngine</code> as described in 
+		<link linkend="configuration">the previous chapter</link>, obtaining a repository is as easy as calling
+		the <code>getRepository(String)</code> method with the name of the repository that you just configured.
+<programlisting>
+&String; repositoryName = ...;
+&JcrEngine; jcrEngine = ...;
+&Repository; repository = jcrEngine.getRepository(repositoryName);
+</programlisting>
+			At this point, your application can proceed by working with the JCR API.
 		</para>
   </sect1>
   <sect1 id="jcr-sessions">
-    <title>Creating JCR sessions</title>
+    <title>Creating JCR Sessions</title>
 		<para>Once you have obtained a reference to the JCR &Repository;, you can create a JCR session using one of its
 			<code>login(...)</code> methods.  The <ulink url="&JSR170;">JSR-170</ulink> specification provides four login methods.
 		</para>
@@ -57,7 +76,8 @@
 &Session; session = (&Session;) Subject.doAsPrivileged(subject, new PrivilegedExceptionAction&lt;&Session;&gt;() {
     public Session run() throws Exception {
         return repository.login();
-    }}, AccessController.getContext());
+    }
+}, AccessController.getContext());
 </programlisting>	
 		This approach will yield a session with the same user name and roles as <code>subject</code>.  There is a comparable
 		version of <code>login(...)</code> that allows the workspace to be specified by name.
@@ -104,7 +124,7 @@
 &ServletSecurityContext; securityContext = new ServletSecurityContext(request);
 &Session; session = repository.login(new &SecurityContextCredentials;(securityContext);
 </programlisting>			
-		Once the &Session; is obtained, the repository content can be access and modified like any other JCR repository.  No roles are required to connect
+		Once the &Session; is obtained, the repository content can be accessed and modified like any other JCR repository.  No roles are required to connect
 		to any workspace at this time.  Restrictions on workspace connections will likely be added to JBoss DNA in the near future.  The roles from the JAAS
 		information or the &HttpServletRequest; are used to control read and write access to the repository.  Please see the <ulink linkend="dna_jcr_security">JCR Security section</ulink>
 		for more details on how access is controlled.
@@ -168,7 +188,14 @@
 		</sect2>
 		<sect2>
 			<title>Built-In Node Types</title>
-			<para>Add description of the DNA built-in node types.</para>
+			<para>JBoss DNA supports all of the built-in node types described in the JSR-170 specification.  However, several of these node types
+			(mix:lockable, mix:versionable, nt:version, nt:versionLabels, nt:versionHistory, and nt:frozenNode) are semantically meaningless
+			as JBoss DNA does not yet support the locking or versioning optional features.
+			</para>
+			<para>Although JBoss DNA does define some custom node types in the <code>dna</code> namespace, none of these
+			node types are intended to be used by developers integrating with JBoss DNA and may be changed or removed
+			at any time.
+			</para>
 		</sect2>
 		<sect2>
 			<title>Custom Node Type Registration</title>
@@ -244,7 +271,7 @@
 nodeTypeManager.registerNodeTypes(nodeTypeSource);
 </programlisting>
 				<note>
-					<para> JBoss DNA does not yet support a simple means on unregistering types at this time, so be careful before registering types outside of a 
+					<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> 	
@@ -257,7 +284,7 @@
 		<para>
 			In this chapter, we covered how to use JCR with JBoss DNA and learned about how it implements the JCR specification.  Now that you know how JBoss DNA repositories work,
 			and how to use JCR to work with DNA repositories, we'll move on in 
-			the <link linkend="sequencing">next chapter</link> to describing in detail how the sequencing of file content works.
+			the <link linkend="deploying_dna_jcr">next chapter</link> to describing in detail how the sequencing of file content works.
 		</para>
 	</sect1>
 </chapter>



From dna-commits at lists.jboss.org  Tue Jun  9 08:13:04 2009
From: dna-commits at lists.jboss.org (dna-commits at lists.jboss.org)
Date: Tue, 09 Jun 2009 08:13:04 -0400
Subject: [dna-commits] DNA SVN: r1009 -
	trunk/extensions/dna-web-jcr-rest/src/main/java/org/jboss/dna/web/jcr/rest.
Message-ID: <E1ME0CO-0004Se-HE@committer01.frg.pub.inap.atl.jboss.com>

Author: bcarothers
Date: 2009-06-09 08:13:04 -0400 (Tue, 09 Jun 2009)
New Revision: 1009

Modified:
   trunk/extensions/dna-web-jcr-rest/src/main/java/org/jboss/dna/web/jcr/rest/JcrResources.java
Log:
Cleaned up Javadoc

Modified: trunk/extensions/dna-web-jcr-rest/src/main/java/org/jboss/dna/web/jcr/rest/JcrResources.java
===================================================================
--- trunk/extensions/dna-web-jcr-rest/src/main/java/org/jboss/dna/web/jcr/rest/JcrResources.java	2009-06-09 11:17:52 UTC (rev 1008)
+++ trunk/extensions/dna-web-jcr-rest/src/main/java/org/jboss/dna/web/jcr/rest/JcrResources.java	2009-06-09 12:13:04 UTC (rev 1009)
@@ -97,16 +97,6 @@
  * <td>/resources/{repositoryName}/{workspaceName}/node/{uuid}</td>
  * <td>accesses the node with the given UUID</td>
  * <td>ALL</td> </tr>
- * <tr>
- * <td>/resources/{repositoryName}/{workspaceName}/lock/{path}</td>
- * <td>locks the node at the path</td>
- * <td>GET</td>
- * </tr>
- * <tr>
- * <td>/resources/{repositoryName}/{workspaceName}/lock/{path}</td>
- * <td>unlocks the node at the path</td>
- * <td>PUT</td>
- * </tr>
  * </table>
  */
 @Immutable



From dna-commits at lists.jboss.org  Tue Jun  9 08:14:45 2009
From: dna-commits at lists.jboss.org (dna-commits at lists.jboss.org)
Date: Tue, 09 Jun 2009 08:14:45 -0400
Subject: [dna-commits] DNA SVN: r1010 -
	trunk/extensions/dna-web-jcr-rest/src/main/java/org/jboss/dna/web/jcr/rest.
Message-ID: <E1ME0E1-0004XU-5Y@committer01.frg.pub.inap.atl.jboss.com>

Author: bcarothers
Date: 2009-06-09 08:14:45 -0400 (Tue, 09 Jun 2009)
New Revision: 1010

Modified:
   trunk/extensions/dna-web-jcr-rest/src/main/java/org/jboss/dna/web/jcr/rest/JcrResources.java
Log:
Cleaned up another dangling Javadoc reference to an unimplemented method

Modified: trunk/extensions/dna-web-jcr-rest/src/main/java/org/jboss/dna/web/jcr/rest/JcrResources.java
===================================================================
--- trunk/extensions/dna-web-jcr-rest/src/main/java/org/jboss/dna/web/jcr/rest/JcrResources.java	2009-06-09 12:13:04 UTC (rev 1009)
+++ trunk/extensions/dna-web-jcr-rest/src/main/java/org/jboss/dna/web/jcr/rest/JcrResources.java	2009-06-09 12:14:45 UTC (rev 1010)
@@ -94,9 +94,6 @@
  * <td>accesses the item (node or property) at the path</td>
  * <td>ALL</td>
  * </tr>
- * <td>/resources/{repositoryName}/{workspaceName}/node/{uuid}</td>
- * <td>accesses the node with the given UUID</td>
- * <td>ALL</td> </tr>
  * </table>
  */
 @Immutable



From dna-commits at lists.jboss.org  Tue Jun  9 09:11:37 2009
From: dna-commits at lists.jboss.org (dna-commits at lists.jboss.org)
Date: Tue, 09 Jun 2009 09:11:37 -0400
Subject: [dna-commits] DNA SVN: r1011 -
	trunk/docs/reference/src/main/docbook/en-US/content/jcr.
Message-ID: <E1ME173-00077x-1Q@committer01.frg.pub.inap.atl.jboss.com>

Author: bcarothers
Date: 2009-06-09 09:11:36 -0400 (Tue, 09 Jun 2009)
New Revision: 1011

Modified:
   trunk/docs/reference/src/main/docbook/en-US/content/jcr/rest_service.xml
Log:
Adding WIP version of REST server documentation

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	2009-06-09 12:14:45 UTC (rev 1010)
+++ trunk/docs/reference/src/main/docbook/en-US/content/jcr/rest_service.xml	2009-06-09 13:11:36 UTC (rev 1011)
@@ -31,16 +31,203 @@
 <chapter id="rest_service">
   <title>The JBoss DNA REST Server</title>
   <para>
-		Placeholder for the JBoss DNA REST Server documentation
+		JBoss DNA now provides a RESTful interface to its JCR implementation that allows HTTP-based publishing
+		and unpublishing of content.  Although the initial version of this REST server only supports the JBoss DNA
+		JCR implementation, it has been designed to make integration with other JCR implementors easy.  This
+		chapter describes how to configure and deploy the REST server. 
   </para>
 	<sect1 id="supported_rest_resources">
-		<title>Supported Resources and URIs</title>
+		<title>Supported Resources and Methods</title>
 		<para>
-			One of the objects that must be supplied to many JBoss DNA components is an &ExecutionContext;.  Some components 
-			require this context to be passed into individual methods, allowing the context to vary with each method invocation.
-			Other components require the context to be provided before it's used, and will use that context for all its operations
-			(until it is given a different one).
+			The REST Server currently supports the URIs and HTTP methods described below.  The URI patterns assume
+			that the REST server is deployed at its conventional location of "/resources".  These URI patterns would
+			change if the REST server were deployed under a different web context and URI patterns below would
+			change accordingly.  Currently, only JSON-encoded responses are provided.
 		</para>
+				<table frame='all'>
+			<title>Supported URIs for the JBoss DNA REST Server</title>
+			<tgroup cols='3' align='left' colsep='1' rowsep='1'>
+	      <colspec colname='URI' colwidth="3*"/>
+	      <colspec colname='methods' colwidth="1*"/>
+	      <colspec colname='description' colwidth="1*"/>
+				<thead>
+					<row>
+			  		<entry>URI Pattern</entry>
+			  		<entry>HTTP Method(s)</entry>
+			  		<entry>HTTP Description</entry>
+					</row>
+				</thead>
+				<tbody>
+					<row>
+						<entry>/resources</entry>
+						<entry>Returns a list of accessible repositories</entry>
+						<entry>GET</entry>
+					</row>
+					<row>
+						<entry>/resources/{repositoryName}</entry>
+						<entry>Returns a list of accessible workspaces within that repository</entry>
+						<entry>GET</entry>
+					</row>
+					<row>
+						<entry>/resources/{repositoryName}/{workspaceName}</entry>
+						<entry>Returns a list of available operations within the workspace</entry>
+						<entry>GET</entry>
+					</row>
+					<row>
+						<entry>/resources/{repositoryName}/{workspaceName}/item/{path}</entry>
+						<entry>Accesses the item (node or property) at the path</entry>
+						<entry>ALL</entry>
+					</row>
+				</tbody>
+			</tgroup>
+		</table>
+		<para>
+		Note that this approach supports dynamic discovery of the available repositories on the server.  A typical
+		conversation might start with a request to the server to check the available repositories.
+<programlisting>
+GET http://www.example.com/resources
+</programlisting>		 
+		This request would generate a response that mapped the names of the available repositories to metadata information
+		about the repositories like so:
+<programlisting>
+{
+	"dna%3arepository" : { 
+		"repository" : {
+			"name" : "dna%3arepository",
+			"resources" : { "workspaces":"/resources/dna%3arepository" }
+		}
+	}
+}
+</programlisting>		 
+		The actual response wouldn't be pretty-printed like the example, but the format would be the same.  The name
+		of the repository ("dna:repository" URL-encoded) is mapped to a repository object that contains a name
+		(the redundant "dna:repository") and a list of available resources within the repository and their respective
+		URIs.  Note that JBoss DNA supports deploying multiple JCR repositories side-by-side on the same server,
+		so this response could easily contain multiple repositories in a real deployment.  
+	</para>
+	<para>		
+		The only thing that you can do with a repository through the REST interface at this time is to
+		get a list of its workspaces.  A request to do so can be built up from the previous response like this:
+<programlisting>
+GET http://www.example.com/resources/dna%3arepository
+</programlisting>		 
+		This request (and all of the following requests) actually create a JCR &Session; to service the request and
+		require that security be configured.  This process is described in more detail in 
+		<link linkend="dna_rest_server_configuration">a later section</link>.  Assuming that security has been properly
+		configured, the response would look something like this:
+<programlisting>
+{
+	"default" : {
+		"workspace" : {
+			"name" : "default",
+			"resources" : { "items":"/resources/dna%3arepository/default/items" }
+		}
+	}
+}
+</programlisting>	
+		Like the first response, this response consists of a list of workspace names mapped to metadata about the
+		workspaces.  The example above only lists one workspace for simplicity, but there could be many different
+		workspaces returned in a real deployment.  Note that the "items" resource builds the full URI to the root
+		of the items hierarchy, including the encoding of the repository name and the workspace name.
+		</para>
+		<para>
+		Now a request can be built to retrieve the root item of the repository.
+<programlisting>
+GET http://www.example.com/resources/dna%3arepository/default/items
+</programlisting>		 
+		Any other item in the repository could be accessed by appending its path to the URI above.  In a default
+		repository with no content, this would return the following response:  
+<programlisting>
+{
+	"properties": {
+		"jcr:primaryType": "dna:root",
+		"jcr:uuid": "97d7e2ef-996e-4d99-8ec2-dc623e6c2239"
+	},
+	"children": ["jcr:system"]
+</programlisting>		 
+	    The response contains a mapping of property names to their values and an array of child names.  Had one of
+	    the properties been multi-valued, the values for that property would have been provided as an array as well, 
+	    as will shortly be shown.
+	    </para>
+	    <para>
+	    The items resource also contains an option query parameter: <code>dna:depth</code>.  This parameter, which defaults
+	    to 1, controls how deep the hierarchy of returned nodes should be.  Had the request had the parameter:
+<programlisting>
+GET http://www.example.com/resources/dna%3arepository/default/items?dna:depth=2
+</programlisting>		 
+	    Then the response would have contained details for the children of the root node as well.
+<programlisting>
+{
+	"properties": {
+		"jcr:primaryType": "dna:root",
+		"jcr:uuid": "163bc5e5-3b57-4e63-b2ae-ededf43d3445"
+	},
+	"children": {
+		"jcr:system": {
+			"properties": {"jcr:primaryType": "dna:system"},
+    		"children": ["dna:namespaces"]
+		}
+	}
+}
+</programlisting>		 
+		</para>
+		<para>
+		It is also possible to use the RESTful API to add, modify and remove repository content.  Removes are simple -
+		a DELETE request with no body returns a response with no body.
+<programlisting>
+DELETE http://www.example.com/resources/dna%3arepository/default/items/path/to/deletedNode
+</programlisting>		 
+		</para>
+		<para>
+		Adding content simply requires a POST to the name of the <emphasis>relative</emphasis> root node of the
+		content that you wish to add and a request body in the same format as the response from a GET.  Adding multiple
+		nodes at once is supported, as shown below.
+<programlisting>
+POST http://www.example.com/resources/dna%3arepository/default/items/newNode
+
+{
+	"properties": {
+		"jcr:primaryType": "nt:unstructured",
+		"jcr:mixinTypes": "mix:referenceable",
+		"someProperty": "foo"
+	},
+	"children": {
+		"newChildNode": {
+			"properties": {"jcr:primaryType": "nt:unstructured"}
+		}
+	}
+}
+</programlisting>		 
+		Note that protected properties like jcr:uuid are not provided but that the primary type and mixin types are
+		provided as properties.  The REST server will translate these into the appropriate calls behind the
+		scenes.  The response from the request will be empty by convention.
+		</para>
+		<para>
+		The PUT method allows for updates of nodes and properties.  If the URI points to a property, the body of the
+		request should be the new JSON-encoded value for the property.
+<programlisting>
+PUT http://www.example.com/resources/dna%3arepository/default/items/newNode/someProperty
+
+"bar"
+</programlisting>
+		Setting multiple properties at once can be performed by providing a URI to a node instead of a property. The
+		body of the request should then be a JSON object that maps property names to their new values.
+<programlisting>
+PUT http://www.example.com/resources/dna%3arepository/default/items/newNode
+
+{
+	"someProperty": "foobar",
+	"someOtherProperty": "newValue"
+}
+</programlisting>
+		<note>
+			<para>
+			The PUT method doesn't currently support adding or removing mixin types.  This will be corrected in the future.
+			A <ulink url="https://jira.jboss.org/jira/browse/DNA-447">JIRA issue</ulink> has been created to help 
+			track this issue.
+			</para>
+		</note>
+		</para>
 	</sect1>
 	<sect1 id="jcr_rest_spi">
 		<title>Repository Providers</title>



From dna-commits at lists.jboss.org  Tue Jun  9 11:16:01 2009
From: dna-commits at lists.jboss.org (dna-commits at lists.jboss.org)
Date: Tue, 09 Jun 2009 11:16:01 -0400
Subject: [dna-commits] DNA SVN: r1012 - in
	trunk/docs/reference/src/main/docbook/en-US: content and 1
	other directories.
Message-ID: <E1ME33R-0003aV-3U@committer01.frg.pub.inap.atl.jboss.com>

Author: rhauch
Date: 2009-06-09 11:16:00 -0400 (Tue, 09 Jun 2009)
New Revision: 1012

Modified:
   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/introduction.xml
   trunk/docs/reference/src/main/docbook/en-US/master.xml
Log:
Minor edits to the Reference Guide

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	2009-06-09 13:11:36 UTC (rev 1011)
+++ trunk/docs/reference/src/main/docbook/en-US/content/core/execution_context.xml	2009-06-09 15:16:00 UTC (rev 1012)
@@ -570,7 +570,7 @@
 			facilities throughout the system.
 		</para>
 		<para>
-			In the <link linkend="graph-api">next chapter</link>, we'll dive into Graph API and will introduce the notion of
+			In the <link linkend="graph-model">next chapter</link>, we'll dive into Graph API and will introduce the notion of
 			nodes, paths, names, and properties, that are so essential and used throughout JBoss DNA.
 		</para>
 	</sect1>

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	2009-06-09 13:11:36 UTC (rev 1011)
+++ trunk/docs/reference/src/main/docbook/en-US/content/core/graph.xml	2009-06-09 15:16:00 UTC (rev 1012)
@@ -28,8 +28,8 @@
 <!ENTITY % CustomDTD SYSTEM "../../custom.dtd">
 %CustomDTD;
 ]>
-<chapter id="graph_api">
-  <title>Graph API</title>
+<chapter id="graph-model">
+  <title>Graph Model</title>
   <para>
 		One of the central concepts within JBoss DNA is that of its <emphasis>graph model</emphasis>.
 		Information is structured into a hierarchy of nodes with properties, where nodes in the hierarchy

Modified: trunk/docs/reference/src/main/docbook/en-US/content/introduction.xml
===================================================================
--- trunk/docs/reference/src/main/docbook/en-US/content/introduction.xml	2009-06-09 13:11:36 UTC (rev 1011)
+++ trunk/docs/reference/src/main/docbook/en-US/content/introduction.xml	2009-06-09 15:16:00 UTC (rev 1012)
@@ -268,41 +268,49 @@
       <itemizedlist>
         <listitem>
           <para>
-            <emphasis role="strong">dna-common</emphasis>
-            is a low-level library of common utilities and frameworks, including logging, progress monitoring,
-            internationalization/localization, text translators, component management, and class loader factories.
+            <emphasis role="strong">dna-jcr</emphasis>
+            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.
           </para>
         </listitem>
         <listitem>
           <para>
-            <emphasis role="strong">dna-graph</emphasis>
-            defines the graph Application Programming Interface (API) and Service Provider Interface (SPI) for DNA, 
-						including the repository connectors, sequencers, graph interfaces, and MIME type detectors.
+            <emphasis role="strong">dna-repository</emphasis>
+            provides the core DNA graph engine and services for managing repository connections, sequencers, MIME type detectors,
+						and observation. If you're using JBoss DNA repositories via our graph API rather than JCR, then this is where you'd start.
           </para>
         </listitem>
         <listitem>
           <para>
-            <emphasis role="strong">dna-repository</emphasis>
-            is the main module and provides the repository-oriented services, including the Repository Service, Sequencing
-            Service, Observation Service, and Rules Service.
+            <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
+ 						APIs necessary to implement custom connectors, sequencers, and MIME type detectors.
           </para>
         </listitem>
         <listitem>
           <para>
             <emphasis role="strong">dna-cnd</emphasis>
-            provides a utilities for reading and writing files in the CND (Compact Node Definition) format.
+            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-jcr</emphasis>
-            provides the JBoss DNA implementation of the JCR API, which relies upon a repository connector, such as the
-            Federation Connector (see
-            <code>dna-connector-federation</code>
-            ).  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.
+            <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.
           </para>
         </listitem>
+      </itemizedlist>
+				There are several modules that provide system- and integration-level tests:
+      <itemizedlist>
         <listitem>
           <para>
             <emphasis role="strong">dna-jcr-tck</emphasis>
@@ -315,9 +323,9 @@
           <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 many
-            components (whereas unit tests focus on testing a single class or component and may use stubs or mock objects for
-            other components).
+            tests are often more complicated, take longer, and involve testing the integration and functionality of multiple
+            components (whereas unit tests focus on testing a single class or component and may use stubs or mock objects
+            to isolate the code being tested from other related components).
           </para>
         </listitem>
       </itemizedlist>

Modified: trunk/docs/reference/src/main/docbook/en-US/master.xml
===================================================================
--- trunk/docs/reference/src/main/docbook/en-US/master.xml	2009-06-09 13:11:36 UTC (rev 1011)
+++ trunk/docs/reference/src/main/docbook/en-US/master.xml	2009-06-09 15:16:00 UTC (rev 1012)
@@ -101,7 +101,7 @@
   	<xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="content/jcr/rest_service.xml"/>
   </part>
 	<part id="provied-connectors-part">
-		<title>Provided Connectors</title>
+		<title>Connector Library</title>
 		<partintro>
 			<para>
 			  The JBoss DNA project provides a number of <link linkend="connector_framework">connectors</link> out-of-the-box.
@@ -118,7 +118,7 @@
   	<xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="content/connectors/jdbc_metadata.xml"/>
 	</part>
 	<part id="provied-sequencers-part">
-		<title>Provided Sequencers</title>
+		<title>Sequencer Library</title>
 		<partintro>
 			<para>
 			  The JBoss DNA project provides a number of <link linkend="sequencing_framework">sequencers</link> out-of-the-box.
@@ -135,7 +135,7 @@
   	<xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="content/sequencers/mp3.xml"/>
 	</part>
 	<part id="provied-mime-type-detectors-part">
-		<title>Provided MIME type detectors</title>
+		<title>MIME Type Detector Library</title>
 		<partintro>
 			<para>
 			  The JBoss DNA project provides a number of <link linkend="mime-type-detectors">MIME type detectors</link> out-of-the-box.



From dna-commits at lists.jboss.org  Tue Jun  9 12:36:51 2009
From: dna-commits at lists.jboss.org (dna-commits at lists.jboss.org)
Date: Tue, 09 Jun 2009 12:36:51 -0400
Subject: [dna-commits] DNA SVN: r1013 -
	trunk/docs/reference/src/main/docbook/en-US/content.
Message-ID: <E1ME4Jf-0007MB-1A@committer01.frg.pub.inap.atl.jboss.com>

Author: rhauch
Date: 2009-06-09 12:36:50 -0400 (Tue, 09 Jun 2009)
New Revision: 1013

Modified:
   trunk/docs/reference/src/main/docbook/en-US/content/future.xml
Log:
Updated the last chapter in the Reference Guide to better reflect the current status and plans for the immediate future.

Modified: trunk/docs/reference/src/main/docbook/en-US/content/future.xml
===================================================================
--- trunk/docs/reference/src/main/docbook/en-US/content/future.xml	2009-06-09 15:16:00 UTC (rev 1012)
+++ trunk/docs/reference/src/main/docbook/en-US/content/future.xml	2009-06-09 16:36:50 UTC (rev 1013)
@@ -31,21 +31,31 @@
 <chapter id="future">
 	<title>Looking to the future</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.
+		JBoss DNA &version; adds a lot of new features and capabilities.  It introduced an initial RESTful server that makes
+		JCR repositories accessible over HTTP to clients.  The JCR implementation was enhanced to support more features,
+		including the ability to define and register node types using the Compact Node Definition (CND) format.
+		A new configuration system was added, making it very easy to configure and manage the JBoss DNA JCR engine.
+		An observation framework was added to the graph API. The federation connector was rewritten to improve performance
+		and correct several issues.  And quite a few issues were fixed.
 	</para>
 	<para>
-	  If you're interested in getting involved with the JBoss DNA project, consider picking up one of the sequencers on our
-	  <ulink url="http://jira.jboss.org/jira/browse/DNA?report=com.atlassian.jira.plugin.system.project:roadmap-panel">roadmap</ulink>.
-	  Or, check out <ulink url="http://jira.jboss.org/jira/secure/IssueNavigator.jspa?reset=true&amp;mode=hide&amp;pid=12310520&amp;sorter/order=DESC&amp;sorter/field=priority&amp;resolution=-1&amp;component=12311436">JIRA</ulink>
-	  for the list of sequencers we've thought of.  If you think of one that's not there, please add it to JIRA!
+		What's next for JBoss DNA?  Passing all of the JCR API compatibility tests for Level 1 and Level 2,
+		plus some of the optional features, is the primary focus for the next release.  Of course, there are a handful of
+		improvements we'd like to make under the covers, and a few outstanding issues that we'll address.
+		Farther out on our <ulink url="&Roadmap;">roadmap</ulink> are the development of additional connectors and sequencers,
+		some Eclipse tooling for publishing artifacts to a repository, and quite a few other interesting features.
 	</para>
 	<para>
+    We're always looking for suggestions and contributors.  If you'd like to get involved on JBoss DNA, the first
+		step is joining the <ulink url="&Home;lists.html">mailing lists</ulink> or hopping into our chat room
+		on IRC (at irc.freenode.net#jbossdna).  You can also <ulink url="&Home;subversion.html">download the code</ulink>
+		and get it building, and start looking for simple issues or bugs in our
+    <ulink url="&JIRA;">JIRA issue management system</ulink>.
+  </para>
+	<para>
+		But if nothing else, please contact us and let us know how you're using JBoss DNA and what we can do to make it even better.
+	</para>
+	<para>
 		And, if you haven't already, check out our &GettingStarted; guide, which has examples that you can build and run to see
 		JBoss DNA in action.
 	</para>



From dna-commits at lists.jboss.org  Tue Jun  9 12:45:31 2009
From: dna-commits at lists.jboss.org (dna-commits at lists.jboss.org)
Date: Tue, 09 Jun 2009 12:45:31 -0400
Subject: [dna-commits] DNA SVN: r1014 - in trunk:
	docs/reference/src/main/docbook/en-US/content/jcr and 2 other
	directories.
Message-ID: <E1ME4S3-0007kE-1L@committer01.frg.pub.inap.atl.jboss.com>

Author: bcarothers
Date: 2009-06-09 12:45:30 -0400 (Tue, 09 Jun 2009)
New Revision: 1014

Modified:
   trunk/docs/reference/src/main/docbook/en-US/content/jcr/rest_service.xml
   trunk/docs/reference/src/main/docbook/en-US/custom.dtd
   trunk/extensions/dna-web-jcr-rest-war/src/main/webapp/WEB-INF/web.xml
   trunk/extensions/dna-web-jcr-rest/src/main/java/org/jboss/dna/web/jcr/rest/JcrApplication.java
Log:
Final draft of REST chapter

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	2009-06-09 16:36:50 UTC (rev 1013)
+++ trunk/docs/reference/src/main/docbook/en-US/content/jcr/rest_service.xml	2009-06-09 16:45:30 UTC (rev 1014)
@@ -89,7 +89,7 @@
 </programlisting>		 
 		This request would generate a response that mapped the names of the available repositories to metadata information
 		about the repositories like so:
-<programlisting>
+<programlisting><![CDATA[
 {
 	"dna%3arepository" : { 
 		"repository" : {
@@ -98,7 +98,7 @@
 		}
 	}
 }
-</programlisting>		 
+]]></programlisting>		 
 		The actual response wouldn't be pretty-printed like the example, but the format would be the same.  The name
 		of the repository ("dna:repository" URL-encoded) is mapped to a repository object that contains a name
 		(the redundant "dna:repository") and a list of available resources within the repository and their respective
@@ -115,7 +115,7 @@
 		require that security be configured.  This process is described in more detail in 
 		<link linkend="dna_rest_server_configuration">a later section</link>.  Assuming that security has been properly
 		configured, the response would look something like this:
-<programlisting>
+<programlisting><![CDATA[
 {
 	"default" : {
 		"workspace" : {
@@ -124,7 +124,7 @@
 		}
 	}
 }
-</programlisting>	
+]]></programlisting>	
 		Like the first response, this response consists of a list of workspace names mapped to metadata about the
 		workspaces.  The example above only lists one workspace for simplicity, but there could be many different
 		workspaces returned in a real deployment.  Note that the "items" resource builds the full URI to the root
@@ -137,14 +137,14 @@
 </programlisting>		 
 		Any other item in the repository could be accessed by appending its path to the URI above.  In a default
 		repository with no content, this would return the following response:  
-<programlisting>
+<programlisting><![CDATA[
 {
 	"properties": {
 		"jcr:primaryType": "dna:root",
 		"jcr:uuid": "97d7e2ef-996e-4d99-8ec2-dc623e6c2239"
 	},
 	"children": ["jcr:system"]
-</programlisting>		 
+]]></programlisting>		 
 	    The response contains a mapping of property names to their values and an array of child names.  Had one of
 	    the properties been multi-valued, the values for that property would have been provided as an array as well, 
 	    as will shortly be shown.
@@ -156,7 +156,7 @@
 GET http://www.example.com/resources/dna%3arepository/default/items?dna:depth=2
 </programlisting>		 
 	    Then the response would have contained details for the children of the root node as well.
-<programlisting>
+<programlisting><![CDATA[
 {
 	"properties": {
 		"jcr:primaryType": "dna:root",
@@ -169,7 +169,7 @@
 		}
 	}
 }
-</programlisting>		 
+]]></programlisting>		 
 		</para>
 		<para>
 		It is also possible to use the RESTful API to add, modify and remove repository content.  Removes are simple -
@@ -182,7 +182,7 @@
 		Adding content simply requires a POST to the name of the <emphasis>relative</emphasis> root node of the
 		content that you wish to add and a request body in the same format as the response from a GET.  Adding multiple
 		nodes at once is supported, as shown below.
-<programlisting>
+<programlisting><![CDATA[
 POST http://www.example.com/resources/dna%3arepository/default/items/newNode
 
 {
@@ -197,7 +197,7 @@
 		}
 	}
 }
-</programlisting>		 
+]]></programlisting>		 
 		Note that protected properties like jcr:uuid are not provided but that the primary type and mixin types are
 		provided as properties.  The REST server will translate these into the appropriate calls behind the
 		scenes.  The response from the request will be empty by convention.
@@ -205,21 +205,21 @@
 		<para>
 		The PUT method allows for updates of nodes and properties.  If the URI points to a property, the body of the
 		request should be the new JSON-encoded value for the property.
-<programlisting>
+<programlisting><![CDATA[
 PUT http://www.example.com/resources/dna%3arepository/default/items/newNode/someProperty
 
 "bar"
-</programlisting>
+]]></programlisting>
 		Setting multiple properties at once can be performed by providing a URI to a node instead of a property. The
 		body of the request should then be a JSON object that maps property names to their new values.
-<programlisting>
+<programlisting><![CDATA[
 PUT http://www.example.com/resources/dna%3arepository/default/items/newNode
 
 {
 	"someProperty": "foobar",
 	"someOtherProperty": "newValue"
 }
-</programlisting>
+]]></programlisting>
 		<note>
 			<para>
 			The PUT method doesn't currently support adding or removing mixin types.  This will be corrected in the future.
@@ -229,32 +229,320 @@
 		</note>
 		</para>
 	</sect1>
-	<sect1 id="jcr_rest_spi">
-		<title>Repository Providers</title>
-		<para>
-			One of the objects that must be supplied to many JBoss DNA components is an &ExecutionContext;.  Some components 
-			require this context to be passed into individual methods, allowing the context to vary with each method invocation.
-			Other components require the context to be provided before it's used, and will use that context for all its operations
-			(until it is given a different one).
-		</para>
-	</sect1>
 	<sect1 id="dna_rest_server_configuration">
 		<title>Configuring the DNA REST Server</title>
 		<para>
-			One of the objects that must be supplied to many JBoss DNA components is an &ExecutionContext;.  Some components 
-			require this context to be passed into individual methods, allowing the context to vary with each method invocation.
-			Other components require the context to be provided before it's used, and will use that context for all its operations
-			(until it is given a different one).
+			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[
+<?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">
+<web-app>
+	<display-name>JBoss DNA JCR RESTful Interface</display-name>
+]]></programlisting>			 
+		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>.
+<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
+		by the DnaJcrDeployer that controls the lifecycle for the DNA REST server.
+	-->
+	<context-param>
+		<param-name>org.jboss.dna.web.jcr.rest.REPOSITORY_PROVIDER</param-name>
+		<param-value>org.jboss.dna.web.jcr.rest.spi.DnaJcrRepositoryProvider</param-value>
+	</context-param>
+]]></programlisting>			 
+		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.
+		</para>
+
+		<para>
+			Next we configure the DNA &JcrEngine; itself.
+<programlisting role="xml"><![CDATA[
+	<!--
+		This parameter, specific to the DnaJcrRepositoryProvider implementation, specifies
+		the name of the configuration file to initialize the repository or repositories.
+		This configuration file must be on the classpath and is given as a classpath-relative
+		directory.
+	-->
+	<context-param>
+		<param-name>org.jboss.dna.web.jcr.rest.CONFIG_FILE</param-name>
+		<param-value>/configRepository.xml</param-value>
+	</context-param>
+]]></programlisting>			 
+		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.
+		</para>
+
+		<para>
+			This is followed by a bit of RESTEasy and JAX-RS boilerplate.
+<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
+		of the JAX-RS specification like exception handling and resource serving.
+		
+		This should not be modified. 
+	 -->
+	<context-param>
+		<param-name>javax.ws.rs.Application</param-name>
+		<param-value>org.jboss.dna.web.jcr.rest.JcrApplication</param-value>
+	</context-param>
+
+	<!-- Required parameter for RESTEasy - should not be modified -->
+	<listener>
+		<listener-class>org.jboss.resteasy.plugins.server.servlet.ResteasyBootstrap</listener-class>
+	</listener>
+
+	<!-- Required parameter for JBoss DNA REST - should not be modified -->
+	<listener>
+		<listener-class>org.jboss.dna.web.jcr.rest.DnaJcrDeployer</listener-class>
+	</listener>
+
+	<!-- Required parameter for RESTEasy - should not be modified -->
+	<servlet>
+		<servlet-name>Resteasy</servlet-name>
+		<servlet-class>org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher</servlet-class>
+	</servlet>
+
+	<!-- Required parameter for JBoss DNA REST - should not be modified -->
+	<servlet-mapping>
+		<servlet-name>Resteasy</servlet-name>
+		<url-pattern>/*</url-pattern>
+	</servlet-mapping>
+
+
+]]></programlisting>			 
+		In general, this part of the web configuration file should not be modified.
+		</para>
+		
+		<para>
+			Finally, security must be configured for the REST server.
+<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,
+		so this constraint helps lock down the repository.
+		
+		This should generally not be modified. 
+	-->
+	<security-constraint>
+		<display-name>DNA REST</display-name>
+		<web-resource-collection>
+			<web-resource-name>RestEasy</web-resource-name>
+			<url-pattern>/*</url-pattern>
+		</web-resource-collection>
+		<auth-constraint>
+			<!--  
+				A user must be assigned this role to connect to any JCR repository, in addition to needing the READONLY
+				or READWRITE roles to actually read or modify the data.  This is not used internally, so another
+				role could be substituted here.
+			-->
+			<role-name>connect</role-name>
+		</auth-constraint>
+	</security-constraint>
+
+	<!--  
+		Any auth-method will work for JBoss DNA.  BASIC is used this example for simplicity.
+	 -->
+	<login-config>
+		<auth-method>BASIC</auth-method>
+	</login-config>
+
+	<!-- 
+		This must match the role-name in the auth-constraint above. 
+	 -->
+	<security-role>
+		<role-name>connect</role-name>
+	</security-role>
+</web-app>
+
+]]></programlisting>			 
+		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. 
+		</para>	
+		
 	</sect1>
 	<sect1 id="dna_rest_server_deployment">
 		<title>Deploying the DNA REST Server</title>
 		<para>
-			One such implementation is the &JaasSecurityContext;, which delegates any authentication or authorization requests to a
-	    <ulink url="http://java.sun.com/javase/technologies/security/">Java Authentication and Authorization Service (JAAS)</ulink>
-	    provider.  This is the standard approach for authenticating and authorizing in Java, and is the default mechanism 
-	    used by the &JcrEngine;.  
+			Deploying the DNA REST server only requires three steps: <link linkend="dna_rest_server_configuration">
+			preparing the web configuration</link>, configuring the users and their roles in your web container 
+			(outside the scope of this document), and assembling the WAR.  This section describes the requirements 
+			for assembling the WAR.
 	  </para>
+	  <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[
+<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.5-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>${pom.version}</version>
+		</dependency>
+
+		<dependency>
+			<groupId>org.slf4j</groupId>
+			<artifactId>slf4j-log4j12</artifactId>
+			<version>1.4.3</version>
+			<scope>runtime</scope>
+		</dependency>
+		
+		<dependency>
+			<groupId>org.jboss.resteasy</groupId>
+			<artifactId>resteasy-client</artifactId>
+			<version>1.0-beta-8</version>
+		</dependency>		
+	</dependencies>
+</project>
+
+]]></programlisting> 
+		If you use this approach, make sure that web configuration file is in the <code>/src/main/webapp/WEB-INF</code>
+		directory.
+	  </para>
+	  <para>
+	  	The JBoss REST Server WAR is still easy enough to build if you are not using Maven.  Simply construct a WAR with
+	  	the following contents:
+<programlisting>
++ /WEB-INF
+	+ /classes
+	|	+ configRepository.xml
+	|	+ 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.5-SNAPSHOT.jar
+	|	+ dna-common-0.5-SNAPSHOT.jar
+	|	+ dna-connector-federation-0.5-SNAPSHOT.jar
+	|	+ dna-graph-0.5-SNAPSHOT.jar
+	|	+ dna-jcr-0.5-SNAPSHOT.jar
+	|	+ dna-repository-0.5-SNAPSHOT.jar
+	|	+ dna-web-jcr-rest-0.5-SNAPSHOT.jar
+	|	+ FastInfoset-1.2.2.jar
+	|	+ google-collect-snapshot-20080530.jar
+	|	+ hamcrest-core-1.1.jar
+	|	+ javassist-3.6.0.GA.jar
+	|	+ jaxb-api-2.1.jar
+	|	+ jaxb-impl-2.1.9.jar
+	|	+ jaxrs-api-1.1-RC2.jar
+	|	+ jcip-annotations-1.0.jar
+	|	+ jcr-1.0.1.jar
+	|	+ jettison-1.0.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
+	|	+ 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
+	|	+ stax-api-1.0-2.jar
+	|	+ webserver-1.3.3.jar
+	+ web.xml
+			
+</programlisting>	  	
+	  	If you are using sequencers or any connectors other than the in-memory or federated connector, you will also have
+	  	to add the JARs for those dependencies into the <code>WEB-INF/lib</code> directory as well.  You will also have to 
+	  	change the version numbers on the JARs to reflect the current version of JBoss DNA. 
+	  </para>
+	  <para>
+	  	This WAR can be deployed into your servlet container.
+	  </para>
 	</sect1>
+	<sect1 id="jcr_rest_spi">
+		<title>Repository Providers</title>
+		<para>
+			The JBoss DNA REST server can also be used as an interface to to other JCR repositories by creating
+			an implementation of the &RepositoryProvider; interface that connects to the other repository.			
+		</para>
+		<para>
+			The &RepositoryProvider; only has a few methods that must be implemented.  When the &DnaJcrDeployer; starts
+			up, it will dynamically load the &RepositoryProvider; implementation (as noted above) and call the <code>
+			startup(ServletContext)</code> method on the provider.  The provider can use this method to load any
+			required configuration parameters from the web configuration (web.xml) and initialize the repository.
+		</para>
+		<para> 
+			As an example, here's the DNA JCR provider implementation of this method with exception handling omitted for brevity.
+<programlisting><![CDATA[
+public void startup( ServletContext context ) {
+    String configFile = context.getInitParameter(CONFIG_FILE);
+
+     InputStream configFileInputStream = getClass().getResourceAsStream(configFile);
+     jcrEngine = new JcrConfiguration().loadFrom(configFileInputStream).build();
+     jcrEngine.start();
+
+}
+]]></programlisting>
+			As you can see, the name of configuration file for the &JcrEngine; is read from the servlet context and used
+			to initialize the engine. 
+			Once the repository has been started, it is now ready to accept the main methods that provide the interface
+			to the repository.		
+		</para>			 
+		<para>
+  			The first method returns the set of repository names supported by this REST server.
+<programlisting><![CDATA[
+public Set<String> getJcrRepositoryNames() {
+    return new HashSet<String>(jcrEngine.getRepositoryNames());
+}
+]]></programlisting> 
+			The JBoss DNA JCR repository does support multiple repositories on the same server.  Other JCR implementations
+			that don't support multiple repositories are free to return a singleton set containing any string from this method.
+		</para>
+		<para>
+			The other required method returns an open JCR &Session; for the user from the current request in a given repository
+			and workspace.  The provider can use the &HttpServletRequest; to get the authentication credentials for the 
+			HTTP user.
+<programlisting><![CDATA[
+public Session getSession( HttpServletRequest request,
+                           String repositoryName,
+                           String workspaceName ) throws RepositoryException {
+    Repository repository = getRepository(repositoryName);
+
+	SecurityContext context = new ServletSecurityContext(request);
+	Credentials credentials = new SecurityContextCredentials(context);
+    return repository.login(credentials, workspaceName);
+
+}
+]]></programlisting>
+			The <code>getSession(...)</code> method is used by most of the REST server methods to access the JCR 
+			repository and return results as needed.			
+		</para>
+		<para>
+			Finally, the <code>shutdown()</code> method signals that the web context is being undeployed and the JCR
+			repository should shutdown and clean up any resources that are in use.
+		</para>
+	</sect1>
 </chapter>
 

Modified: trunk/docs/reference/src/main/docbook/en-US/custom.dtd
===================================================================
--- trunk/docs/reference/src/main/docbook/en-US/custom.dtd	2009-06-09 16:36:50 UTC (rev 1013)
+++ trunk/docs/reference/src/main/docbook/en-US/custom.dtd	2009-06-09 16:45:30 UTC (rev 1014)
@@ -185,4 +185,6 @@
 <!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>">
 <!ENTITY ApertureMimeTypeDetector	  	"<ulink url='&API;mimetype/aperture/ApertureMimeTypeDetector.html'><classname>ApertureMimeTypeDetector</classname></ulink>">
+<!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>">
 

Modified: trunk/extensions/dna-web-jcr-rest/src/main/java/org/jboss/dna/web/jcr/rest/JcrApplication.java
===================================================================
--- trunk/extensions/dna-web-jcr-rest/src/main/java/org/jboss/dna/web/jcr/rest/JcrApplication.java	2009-06-09 16:36:50 UTC (rev 1013)
+++ trunk/extensions/dna-web-jcr-rest/src/main/java/org/jboss/dna/web/jcr/rest/JcrApplication.java	2009-06-09 16:45:30 UTC (rev 1014)
@@ -23,7 +23,8 @@
  */
 package org.jboss.dna.web.jcr.rest;
 
-import java.util.Collections;
+import java.util.Arrays;
+import java.util.HashSet;
 import java.util.Set;
 import javax.ws.rs.core.Application;
 
@@ -41,7 +42,12 @@
      */
     @Override
     public Set<Class<?>> getClasses() {
-        return Collections.<Class<?>>singleton(JcrResources.class);
+        return new HashSet<Class<?>>(Arrays.asList(new Class<?>[] {
+            JcrResources.class,
+            JcrResources.JSONExceptionMapper.class,
+            JcrResources.NotFoundExceptionMapper.class,
+            JcrResources.RepositoryExceptionMapper.class,
+        })); 
     }
 
 }

Modified: trunk/extensions/dna-web-jcr-rest-war/src/main/webapp/WEB-INF/web.xml
===================================================================
--- trunk/extensions/dna-web-jcr-rest-war/src/main/webapp/WEB-INF/web.xml	2009-06-09 16:36:50 UTC (rev 1013)
+++ trunk/extensions/dna-web-jcr-rest-war/src/main/webapp/WEB-INF/web.xml	2009-06-09 16:45:30 UTC (rev 1014)
@@ -22,46 +22,68 @@
 <web-app>
 	<display-name>JBoss DNA JCR RESTful Interface</display-name>
 
+	<!--
+		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
+		by the DnaJcrDeployer that controls the lifecycle for the DNA REST server.
+	-->
 	<context-param>
 		<param-name>org.jboss.dna.web.jcr.rest.REPOSITORY_PROVIDER</param-name>
 		<param-value>org.jboss.dna.web.jcr.rest.spi.DnaJcrRepositoryProvider</param-value>
 	</context-param>
 
+	<!--
+		This parameter, specific to the DnaJcrRepositoryProvider implementation, specifies
+		the name of the configuration file to initialize the repository or repositories.
+		This configuration file must be on the classpath and is given as a classpath-relative
+		directory.
+	-->
 	<context-param>
 		<param-name>org.jboss.dna.web.jcr.rest.CONFIG_FILE</param-name>
 		<param-value>/configRepository.xml</param-value>
 	</context-param>
 
+	<!--
+		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
+		of the JAX-RS specification like exception handling and resource serving.
+		
+		This should not be modified. 
+	 -->
 	<context-param>
-		<param-name>resteasy.providers</param-name>
-		<param-value>org.jboss.dna.web.jcr.rest.JcrResources$NotFoundExceptionMapper,
-			org.jboss.dna.web.jcr.rest.JcrResources$JSONExceptionMapper,
-			org.jboss.dna.web.jcr.rest.JcrResources$RepositoryExceptionMapper</param-value>
-	</context-param>
-
-	<context-param>
 		<param-name>javax.ws.rs.Application</param-name>
 		<param-value>org.jboss.dna.web.jcr.rest.JcrApplication</param-value>
 	</context-param>
 
+	<!-- Required parameter for RESTEasy - should not be modified -->
 	<listener>
 		<listener-class>org.jboss.resteasy.plugins.server.servlet.ResteasyBootstrap</listener-class>
 	</listener>
 
+	<!-- Required parameter for JBoss DNA REST - should not be modified -->
 	<listener>
 		<listener-class>org.jboss.dna.web.jcr.rest.DnaJcrDeployer</listener-class>
 	</listener>
 
+	<!-- Required parameter for RESTEasy - should not be modified -->
 	<servlet>
 		<servlet-name>Resteasy</servlet-name>
 		<servlet-class>org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher</servlet-class>
 	</servlet>
 
+	<!-- Required parameter for JBoss DNA REST - should not be modified -->
 	<servlet-mapping>
 		<servlet-name>Resteasy</servlet-name>
 		<url-pattern>/*</url-pattern>
 	</servlet-mapping>
 
+	<!-- 
+		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,
+		so this constraint helps lock down the repository.
+		
+		This should generally not be modified. 
+	-->
 	<security-constraint>
 		<display-name>DNA REST</display-name>
 		<web-resource-collection>
@@ -69,14 +91,25 @@
 			<url-pattern>/*</url-pattern>
 		</web-resource-collection>
 		<auth-constraint>
+			<!--  
+				A user must be assigned this role to connect to any JCR repository, in addition to needing the READONLY
+				or READWRITE roles to actually read or modify the data.  This is not used internally, so another
+				role could be substituted here.
+			-->
 			<role-name>connect</role-name>
 		</auth-constraint>
 	</security-constraint>
 
+	<!--  
+		Any auth-method will work for JBoss DNA.  BASIC is used this example for simplicity.
+	 -->
 	<login-config>
 		<auth-method>BASIC</auth-method>
 	</login-config>
 
+	<!-- 
+		This must match the role-name in the auth-constraint above. 
+	 -->
 	<security-role>
 		<role-name>connect</role-name>
 	</security-role>



From dna-commits at lists.jboss.org  Tue Jun  9 14:39:04 2009
From: dna-commits at lists.jboss.org (dna-commits at lists.jboss.org)
Date: Tue, 09 Jun 2009 14:39:04 -0400
Subject: [dna-commits] DNA SVN: r1015 - in trunk/docs:
	gettingstarted/src/main/docbook/en-US/images and 2 other
	directories.
Message-ID: <E1ME6Dw-00043U-2e@committer01.frg.pub.inap.atl.jboss.com>

Author: rhauch
Date: 2009-06-09 14:39:03 -0400 (Tue, 09 Jun 2009)
New Revision: 1015

Added:
   trunk/docs/gettingstarted/src/main/docbook/en-US/images/jcr-features.png
   trunk/docs/reference/src/main/docbook/en-US/images/jcr-features.png
Modified:
   trunk/docs/gettingstarted/src/main/docbook/en-US/content/introduction.xml
   trunk/docs/reference/src/main/docbook/en-US/content/introduction.xml
Log:
Added an image with a Venn diagram of JCR features.

Modified: trunk/docs/gettingstarted/src/main/docbook/en-US/content/introduction.xml
===================================================================
--- trunk/docs/gettingstarted/src/main/docbook/en-US/content/introduction.xml	2009-06-09 16:45:30 UTC (rev 1014)
+++ trunk/docs/gettingstarted/src/main/docbook/en-US/content/introduction.xml	2009-06-09 18:39:03 UTC (rev 1015)
@@ -94,6 +94,10 @@
 	  notifications of changes in the information; search and query; versioning of information; access control; integrity constraints;
 	  participation within distributed transactions; explicit locking of content; and of course persistence.
 	</para>
+	<figure id="jcr-features">
+		<title>JCR API features</title>
+		<graphic align="center" scale="100" fileref="jcr-features.png"/>
+	</figure>
 	<sect1 id="what_is_jboss_dna">
 		<title>JBoss DNA</title>
 		<para>

Added: trunk/docs/gettingstarted/src/main/docbook/en-US/images/jcr-features.png
===================================================================
--- trunk/docs/gettingstarted/src/main/docbook/en-US/images/jcr-features.png	                        (rev 0)
+++ trunk/docs/gettingstarted/src/main/docbook/en-US/images/jcr-features.png	2009-06-09 18:39:03 UTC (rev 1015)
@@ -0,0 +1,357 @@
+?PNG
+
+
+IHDR
+4?/ii ???
+??N{]0??X????e????????[?B?
+???b?&??w???m?????9?<???r%d??M?Eg?M?G?h?@??
+~?]=?T?x~???????%[K????*?_:V{9???U?*?k???????5oj???_??w3?a_??-?&??y??s-????uw
+???#:vw?tIw?u??|???????2z??\ij?\?+?o=,z??x??mOE??C/??F?G??y????/?y?8??2????????cS5oR????z????t??S3~5g?f_????|rY?\????9????n????e???w????V???V~?_?l???!??B?x?TG???Q?hnt	FC???Xq??xq?k?&2A?????r?5?m?"??g??+?;?g??W??????x(xK?D8M$\?Y?x??8^?????p?p???????U?'*+z+?(?h?J?????/h??????uK??N?n?^??$?}??^Fn?&&z??f??J?%,-???YmXm?0?x??#?	??s?????w??bqg???-?)???G?[?????????L?N??R@)-
+?/??????y+?i}tmLm???????\=Xv???????cG???????ut?1?T?4??\????o2e???q?8?Dv|Np??i?<?3?|d?l?\YZ
+??g?].v+1?(]?Y?([,]A??PYz9?J?????k;???????bk??^?????Y?p???VZS??!??-??????8?9?;w?uzttG???M?Wt?????4?~?????c????>??9?6zcLf????D?+???)????W>?????E??????Uz?7?>???? /?]m
+?C??A???D?.W7?Q?/<?<C$+R;?o=?4_9??"~?<A6?\!?P?0??Y??????b?bO?xo?*?&?'Q-i*9,"????1?y.?$'%wO>T?W??"E?O???????Q?L?S?_??F???V???Z???:??Rz??m
+?YC#UcV?e?I?q?????E?UVw?Gm????k8X??:?r?q^pt3?yp?5?)8[?????????????????j{3B>???uE???)u>Z0?B?h|U????????#9?R)?????????T<?&+?g?i\?@~??}??E??Z???*?*y??W?V????m?????????[zn??t?w???t?????2?????a???c'??N????????~x?8k3?????d?L????nc?P> ?k5D ?1?dCZ!S?m?(mT,??
+??nB?a?1G1?X?nl9?N??{? ??pO???;I?T?>?-L??:???Uf/?n?3,?????ll
+?
+??88r999s?$b!?	n4?_??<?<K?h?
+?a>??????' $P*(+?$d,D??9(?!zYL_lpY#^,?'1*+?.U+?&?*sN?LvQ?????W?JEg%?R?r????;?m!?)???$?????i????*???&????cbhi$o?1?14?6?2/??bA???J???)?m???s?wdt?u?w??f???9???P???y???7?G????AFh&=?+Di???O?<5mS?s`?????D?????????v>M?x?	???'??j?6??9?'o)???????^+?x?L????3??????????]????jlRmF???k??8???ctO?O??c`????n???{\???K??????-??f0?*????-??w|/[???.P?? <?H??	?????%?)???Ux?????Y??????????`?a
+c?'D?3ca?{?:?c?PvV?:/Ng31?K???;???s???????????N?P?Y?M??p???(???X?Oq%?e?.?l??????2}??r	?v
+r??gJM??*1??j?$?u?W??[oji?gQ=?m:?r|?x#????{?	?wfc??ZZ[??~c?b???v???h????r???mb?]??vw?g??o???o??
+?K??/_???>R?R?X???ZC&<q4??|???&?~???k?g????c,???V<??<?x?e(yxj?????/?u^??|????:j??M????<?
+4f?>??Z????|R[`_?[??\?%???????o?e??????????????f??????????w?L???}??
+%S??e??r????????????????	>B"????~ ?h?P??*O+???1?:
+??????`?-???
+z[?u???q:?A?-WEk??????hm O?|@??z#?Z????6~?????}????wa???H??U?Cl???X?B(??@5???{?"???9
+?:?U???2?
+^??@??=?n??}|??`{ ????n?@7z?'????????^~??/???F?aJ	??*???`sT"Z???s?V??|??n?Q?%?O?#9??W	????,5?@?=?????K
+????AJ??N???
+???6??}????? V?>?????AC???Hv??s	????/?B??,??_???f????\?a??/$???????#??U?7J6??Pd??????'?????:I?	?"C$uPzt??R? V??7
+??(??G?F~j1??????:?C
+?V?MhO(P?J???A????A?????R??##dc?dm??n???+?`????Gb??q:?$S?d=}M;?[??#3?^??G?dC=??#??Gf<??R???P?z??4????=?+???7??u7???P??:Ai????c?$?a?P)B
+??:!9???6?A????fr??i??u-NI?x'w????5?????p?l?<?:?p?5??????	?X-5?????????`?=
+??QRx?????nbe?{?
+3???J??????G??=|????b	o%?EKa? ???!be????36??#$$???,v?z-???????DI??&$gp?e'G)???u\6R?J????@A&???
+>;?z
+B'??9??qd?T_"U???h?9??#????\?G???aT????NV????o*1?;?Q_$???%?7???N(q'V?+?D?
+?}D???3????~^U???(???p?G??P>S?+?O???O??'#g-??Y??8[?????5???|??A5h#?E?????1Tp??CV	??????PND?>?
+&?N;??T[muSx?L$??$?A?d$B?I??F??n??i7a<T?[^???P???px?Wo???>?????x??Z????AQ?
+??2???]??i??=?;?@]???7?????	V???Y?P*?0??????!pO???9mj?gU??j)????h?6-sZN???6q??S???^????2?h???-?7?9?B?G?-G????r
+?????j?k?k?*? <?@?anU?[?Q?/??????[?+?@Y??Rd?qc?y?of??-?j??* ???6?`?!ee?i??<N??Q?hT?Q?b5)?G???
+?3^WCeaLZ63?y~?SS???????1???\rp[j*B???}?.???jzA?P@? kn;?m`"?6?6??"??Q?X
+?	?i??^c?W????&4wE`??-??#???????Vi??ZhF(G??(?3?R??????G???y?~?x?????????l??=^?/"J?????h????;??)?Le?????l!a?C
+~n5?????<????????}61E???q??nU?G?RG??1nM$"QpS?????z'??#?B?D???"R??????Gm?c+!!??
+5e9??TjF????4@???:,?)C???C??0' UN?"?FN?4?GD?^???????lu?8W?(F??it???(?w?W?????
+u???
+??mG?	t??????DO??v?]xQA=:??E?m?x??	86+[?? 0??^??zU?ngh?f?(??_$>?U?n?A)>?????4?????
+I?Y|??j????*><<&????*???v?j????t&|?l?????:?
+?O?@x?vD%??{9B?k0??D}4??)9??
+2?2b2????1%+?wm[??5G?[zs(?U[???q9???y??cN+???d?z??~?O??$d?(???x?Z?N??u93??t????????7.@?N:?E?%??????3?L1?c???????7.??g$??=?e??oY?PQ??y?3G?__Y??R??J?>????~^:?>?d?9?&??Z?k?Py?s???i?????;Q?t???:?^#??i??S???i|?B??F???/-?b?????ho?|??i?
+?????+i??????2wL???V,j????x}?C
+?7APXQ?^???nav?&N	
+S???:g~8}??+Y`??O5??ycC=_P??S??	ZnK????mU??isC?+=?k?????<??=??f????
+9[???9?T?????bWB?n???z?z?Z??Uv
+5???8????A<??
+z???P??????)@?/s?&?:??Iv??=??????z????R??K?????w?V?~??3E?wU{??D?*?Cek???4???Y??%pW,?.?Z][Z?w??c???%??B
+?PKM???_????????.k?]tjfminXLb???????????/A???>5?E? ??n#&e?I{V~]?u????/??K??5&???w??"21]???oY,
+?r.p	>?<??5???????-???$?? ?2<>%1k????`S??4?W?{?#?2b[?[?????j??`?C<?H?1?#??r??;??Z)??\.????????:o
+??"#?s?P???6=9`?~?vG?`}?p????uzC???C?3t???,????u?av?g?[???O???<??[??????U{??*-p??x
+n????lu??????????p?1??v??????T?L???ka??<zO??[+?4?F5	???No????b?0?CF?2???p???j@???????????v?Eap?;7;?"??P??B?E??T?]0????????B??n4??(?????s?,3!???&]oR???
+??+??dly??h?35Co?y?k???B$?j4i?L6
+il??@E
+i???v	?<2Z\R?N`e?>SHN??9??|??X&?4?Nu?K?vH6???d??????????c?+???,????@It2???{?C R?G1?
+s?bbtt8B??S???x??Nk]eB???]?2l"????Zj??3??SN???P?H6\?QI?^??ampZ??c?n?)?K??D?a??????:?????]Nk#?ght????oZ???w?<}????"(???
+??H?9??jH?K?
+?T?????y+????R6?A???G?????iVW??@V?????Y?S#?????rI?W@J?q???G??
+??W?p????_?}?i????&??
+OI?{?.?E?E?Q?zf???5??r????:{]??Br?h:/?	8.??2?8f?????h2{?L4?_:?x??<??Q=
+??_n???6????t]??1???aN?u??$?M#z!?&??Mt?"??????S?k???K???b????#????J??ho??J???3=??H?uk????qb-'?2????3Y??F??? ??????d?*???4@??qB#??//l?*p?Y?????/???,:uF???-???RAL???Dj??XWW^?1v?Rj!*4????!!-?sd??iT?????????t?S?O9??<?
+???x??&?z????j???)6x
+?e?*l?????=u???????$??k????V?71U????UnL4????t???m???
+#'MZUZ?.??????11E??????????q-|????c??PrI?V???Ko??^U??
+$$?Z??B??JG?????<,\???h>????uk????H?K#????^H?????h???D?6???dC?,i??a ???M?!???8r????'??	??F
+?#c0?"??L????&????QhM?????+??.?Y?y?^????]^??????????????BTV?/s??p?+>E{N???(??(???	=??]??nF?????D[??I???"??[?_?k?Sb:4)????M?A^???I??.?T)??=lR????????]?????;?VR^n*??2m?~C]????S??_o??-??6?9???U)C&??t?-?i ?s?@f&O?N??"?e???????4??9????????RdR:????;jJrC"c2??????Kr6??????MZ??[WU??b????HcX$??????J??????L?R4? /S3s??=l???^?Ue?X?.??V???V,;#<?C}???ryc5?,x?^,?Y4k?X3??MB?!j4?
+_??>q???P???A????N9=$>Y???c>6?{?2u?:?@?78Py?/S_??J???&???,.p?&.Ip?Y?
+??@???v$???<?0??0Fb?????????{?i??L?7?js6?X?rL
+???(???O?Q??RJPN?@;???????ui
+F?R?%[?TD?Yobg%?d?:??z??}??,v??*k??(\???)?HN"1<b{%Z $??FGv?B?UWzQ.??2??QBK?|???Pt?=
+?L$?}G??u,3j???a?-?^?z?u?:??7F????#?????nS,j?*rc??Xt?D(??????&O??&??&g?[??R7;????_?>??????? ,94?]?A@?????
+?3Xr?????????fw?T???[AI?-???J??0?:B???k?<t??I????????-2l%?X0?L???%W??t?d??kTWG?rB??zu?\?f??{Ng??X?!?m????
+ZT??Tb[mV0?h??
+6?fmq?n?Y[???0??tb,e2c#Yo????hb?Q???L?4b?????
+B???&??????`<hd?=?^?2??m?L???#&?????#nWt??????f?TJ???Px?r@]SW?(??y?v^8???	UY%?fmA?n?I[&???v?;BAL??i??wI????	\"????-??b??[?u??????1?6??k??8Wg [K?=N?L?4m0??iG+???[*D??9??!6@??a))P?u?0?R???
+?5?
+k}??????}?????B???6????r?H?x??:??????fr???V+?D??&%q???d;]uT????>??4Z????l0?jXl??
+?KA???c),4?8????m?,y?O??????/%v???w;??b%???Rqm??IP???%:?%???K??x????????6l	???hYu?'? ???H4???=????=
+????a?V??i?T??`[??x?(???.?o?]A?a??`A]?!?T9"u? '?*??u].??Be?Rg??Dy??)???]???#=&?MZ?~$????3E???p;r??m???Jd?R9N????MV?,?D??????G????o?$??}???"?W!?9???<?????c?q
+.???l?n?,?l?%7I?AR?^vE????s??K?)??????"v??z??A?d_?w??/??*K?a}?.G-a`}d?o+,y?B?]$0?t??4s!???l??a?O[Zr(??RjD???[???@?3???U?:?i??>?w}?9?I?d?a?A]y8??????S	?\??v?`?????r??U;??????B`???t??M??
++??:
+?? ?F???o???????,??}??????4? \v????|? 0???.??G????3???db??3?????????7T?L%??9????5????L0?6k??<9yh3Xej?c??A???s,?
+???~???GF:??R??s????A?$0[??c$R??M????S?b??"&e?????^?J??*???Q??_????*?????D???=?z
+?p?N???????'V?8?QObz+??c???-A:??C??B}M?A?????we?a5^?d?<F>z??Rh?EAs?#<?zZ?????3Ltj?[?K??iR<?????~?a%zQy?%??D?
+????? ????^???????>RVA????Z
+????V(?6?N%??xL??h3??t:
+N?].??v?????Y?????Cs\???h??3:??p?-oz??Ul?????C)p??(??q?w?5N?T?V??:p`^???P????N?Gm(@?lZj??A?zjk?9{Jc?C?g?u???%??N??k{yc?c????pCW?R`????ucId?){H??#????oyIC?????????n4??~?Ym?~"n?Z?%?sp??r?-h?R??tq???v???V????@???9???.O6?pd??~??-?
+n??????H?>??5q?]M??Q??t???wW?{;gW?V??%Cm????j?;?????D@d??i}???s?~???<???????Oy?p?*?{'??9???>???^Q?^?A??{E?;???(y?B??=?A?y????!??#;? E??&?V??s?????0?`D'???\vu?m?+/RU????bS?Vn????U[T???W?a??f????e?d???9\?h???=Ra[??e?A??.P??????Zq
+??)`{?%????e??H|?9?K??K?7??G?r,a?sV???d???^D??i??!??Y??????R????-z
+9??_"5W?<?u??/???r?%#???????r	)	?R???i;bS??&(???xa.????n??*???A*H:?????>Vr?/?m[@)?'U??q??y?V??????k+X?1x$HXQR???94??pmeYr?????4??????AQ??X_??k???>&>????7???R_??'!%@??s?h?0D???i??-N??|?9???4??+????.???6ax??????<?_{????0??Qi|??Jjw?*u?<???f?' ?????W]XP??h3f
+?OL??~?@????????:*&?nu?V?.?????i??????f??j????>dX???U`
+??5?
+
+??YQC?'?-???
+E??????5	Ia?????]IM??`Y'L??v?;WzU?t(\??R?J*???n?e??????????????)?????@	??????cw?l?@A?
+
+???y???}{????x????????L?u.'g??'????)?????yq????>??]???"?????]s?CS????]>i????????f????k????,a???????^ZH??{??????????jW@=m?Zx?-o?5{tyY??U{?8k???????????
+???02*???N???S??vl+??7o???)??????g?:s????}??E????J????^???J??F???2?4l??????ox???y????5g?;??'??Og?V?[????nU???gxc??~??w???w~????g?=??7.\???[????????go\[t?????dxiq??s?-<?x?#???~<3??=???W??
+M;?????????
+?????|<Si|?p??Z?L??f???502RR?z?;?J???kP"???w?NL&????'?(g?w??c???vn\?g??4?;????E???[`???????w??+n??_^?h?????yk??????-
+???k_{yYLl?#O^???/K??KZc?
+A?vt?????????_???@??????i?????~'?????=?~???1R????/?u?EW??c??0@?pz?|????q??i??7'2????`?)???Z??f?A????w?m'???????????|???gYnx???{nNa^mE???U?Dy.D???0?jI??he,????h&?/t7?.S
+??]
+KRr??[?<??O?>?O???w???[????n??:???M????W?K|??%cd?}?u
++vd??,??M??
+tK??zbE?sx7}?PsH??j!?7t?#???"1??=W????M???]??.?$? ?D(??f??qC???y???W"?,??7l?)?F?????*x?=????K{???#SR?v???=?
+????????Z?|X??N9;b?b???????dBzb?z?????:??=?[?g?6Q??S??;?n??`??Kr???P??OI???(???X?+U????????O??\??n???c	?7?Z?_y???^RT??ku:??Z{WI???tN'??[nwsS?];?????Aj1%C?k?T0R?????V???*?yR?s?????????bJq^???u??x~b?hV???&s???GL8?,?a|?:2&??"?Rv?J??L???+??=?Y2?1?r???t:K?!*??;zks?%7A=??????d??r?,?J ?????7[F?I?=o?snK8??Q??.???!?24??X????Vgr??_?G?qSb???IU-?i?X??????3??`????>?:|tR[M?eM>Z?L???????p`A???BB???i??}Tn???snp?????@?9?1p???;?.`%??R????}j
+A?.?=^oR?,r??s+????X??????a?ht:s???C{?t?;:n#c??;?k?$?s??????R??D??`??????v??4
+=????sV*?h`?>??ym?~[?w?w??%7pP?????0???f??"?n?[?R?u7M;??q????~?????l6$&E?o????h??T?4??%?????-q?rX|??8??t?ac????_?h??????5+J?l,??5C`FD?"7?+???t??Y!s??I??w?{????|??+??c??a??g??XPQQ???PiK????&O?????g?/u???eR^64?}n???l???q????????d?e??????*'Nmp??<T??????a;???????Se????e:????5
+?q???H?q?????
++?lY'??;b???>|???^
+?}????^????<?+??^??m?Em???&}??V?)
+?????_|????TUX?3?~?????	?3??.7Z???t?E??}???C}???GOW>9H???xa?o?Z??]??????vM?T^`X.YP?r??.?r????>????56????o??T????H??????a???5???Z?l??????j???N?&
+?:???(????#??!^o W5?Y??
+?(M???r?|v??r??5???	~%?"s??C??t4?X?.??vm*.6dr??t??=O??Y??Na?"???(?vUm?????wl?????0?2[???9dd|JZI~.???U??z??????G???D??_p?g?f?B?"n???????????J?&?*,~?!a?&?A??S?l4? ?0}v??l1^????p??^J?OX??7$.?????????????Z?????XV??/?d???O????U{???;??a??fo????:K???&??Y?z??%???3???W?????.^??~??y?Fw?,fJ??????1:??7.x???\4'*??????;O!?i?????????????Z
+?????/???d?tx?>o?O4>??E?????Y?#??
+?{?,$???h???????-?????+ K??>bLL?1?a?i ?D???'???Q1?Ygg?????7W?]?O?K????lJz?%W????]~)????X5??1??_?9??????';??l'?7qJ:?4??????-+??P? ??g?uN6?Hq?}?m???????R^????H????tj??E9??n?6+??????????????G%^r?h???*?d
+q??u[[X????????h???N??(?*????o
+?*?W?uGR??&???a+-?e$?e>??_o\????3j?tv??_?n?T????KI????lH?/^????????X??E???B?E??nGR?&"?????????q?5???? V??_	?|?$??-???-t?a?`Dm0??r????]?
+??!????0H0?????????FE??m4??<BX?RazYVZ???+?F???l?????In=??T?????H??y??_??V??:??GDE???4?_4?????_???0=? r??&?$Ac???1??????R??"?	cu???k??h?\?/?,??K???j??nY_|??????????y??_?[]??9?????7}?R]i5.?o??9o????6?(????W????/??tj?M
+???\|????????d?&????s??g_9???K?.??&r	s?d????9?O???????&??_]D<?O?i????V#??'????????s?V_9?m??#?
+g>	?cY	??T????\J?@??(Ps-L#U??????$????
+%??u?)???????_???q?^|?">r????/??????
+K???W??f??y<z?????qB??EE???^>pP???_??{[^}~??=??9???d?_????W?Q????H9(B????_F?????u????????????u???Qn?????w|w
+k??7c??e???;6?=e?????9?4F??????^!*??l1????	?6?=???0?aL|%?s8?Q?+=
+
+?????s????<?	???m?$????-r?m+L??G?f?????/wA??-c??R6?$&?]z????%?V?Z????)???m?P=D??A??g????8??4rt???"????n????Lw?X???o??^>+???)?.???uE??7?,?eE??H??????????[O>s? ?9???`??3?????????
+y?P[m%gm?]?s"?I??7)
+_?&)?i?W|??V??????s?b?&q(E{Wt%?p?w?*]???+??
+?7??,FW?:.??%G??@?E?
+?L??p??????????i`?7?R??7{(;s???n???R?L???i$@y???j???_j????q?e#\?k&???o????_?S4@????p??5?Ja?E???????/???$\?4J?T>K??B? |X???vF???}????n???K5?O?????_n??????T???[?$?$FZ??z???????=?D?????????aW??{?i?Wz?=?n??L ??4???dx??n?w?oC?#?@???VG[lP???G?E1?????1??J?h?+??.?>Z12?u?q!?{?J?POO??????Y???w^[??]?N????/R?\i????C?????I???'???Z\D???QFD????J????N?Z????U?????@???A??H??%.!???]p?=S`?????7????1IW?0??j-?z?B?6??????]!??K??i?j?@v?D???????N?0??/:??,z1gF?yXdo????;?Y?u??Np?R?0??S<??"*???B????KH?r???iR(k?&O????!Z??N?L<????????z??%??P?,?Y??
+?"<2????!# ??8????m?I????f?5 :6????Sgf?g?7V"MC?"???B?V?7?????+&L??j?R?y???3??L??l'z??Q??~-?#Y????
+??a???%7K?:Q	?N??p???]"?3?i@$????.:?m|??1??B??V?@.???fiD??
+q?????^???}???WGD?>???P.????S'dm???'p+?????????7o?????L?P"v?4o$?6??4????????~?`?????F?q??'`?#?8???jip??(?y
+?Oz??+??=?????.,~
+??4???????<|?mQ?6???;???g?1??g????N?2
+kV??|?/(;?%Sp>??)"??6*?v?	?p? &?,S??H?;
+?#????<??>P?ZQUV?/?3Q?`?p??}(^????*P??y?^?????I)1?.7?qIi???6K??T??7	?l?=????!+e^?"????
+(1]?c??Ve???-+?.?~&f(8?N?(?[_T?9?|l?"??g/??????eS???M?Z:P~?N???.????[z?X?r??
+?1????????????/?????(;????6????<?????????>??mk?????|Q?oWlR?%7?VQZ??????'?k??ig???>?nr??o??,?C2N9????~B
+
+?M??n??`0?q??l??????;d?????????]g????
+?b?
+??/z?:????.9?Y??0???d??.?*??C?%V?*??,???^|~;???H???mX??4???oF|?c???WoZ?#f?Q?9[w??????iCwmZSYZH?
+????;????<???x?
+?LYx?k??<??k)???<
+LS4;??????????,??M8???7=???I?f?w1??_????^?????*,?b??3zz_T at O{?y???c?Zb%?!i:??p?R???H??D?&??<k????a??5?h4i????D?????
+??$U??_??????]Z??q{6??p??C??SNR
+??|????tORZ?F'??_????1(u0?pl?=yFR??????l??\?????????A???K?O?\?.?w?&)?`y<?-?Z#K?;?T???P???xp@?J?;?Qo????????????_?'5??p"?? ?V????b??W??(@?????H?vXT??;RA??Skt8"
+%? f?????\%?(:.???~????????ti??%??r9????_??(???????o?m??]_?O????????
+??????B???7o?v?sX?8????S???????~?????DnX?H4?s?v???????5??CEBrH??3/?,+.??;?????!JE???T^?'"??M=??=???nL?????f?J?w???
+5R}0<@?t??p??R?q?dE??d?PS??????G?	q7|?N3??|1?rNF{???g_vn?6??????F?%rB???p?3o?'??w??9[7???K??Q????(?<a??????C853;5#?|???8$??O?6t?d?S??`?W9??is.????9t)?????????iGr0?e??{t?	????-?{1?`V-{@?3e??h?4?????j?
+?v??4
+GD ????????????O??:????e?8i*??@XLB2'?E?'??>?&3???3?
+?_yK??bU$?n?k??????a5f??67B??]n????hm?M?r8?^S^???W?%??m?{???%?y?=>}??n????6%5*s@|D?k*????[u??'??/??U????R?#E??i?z%s1??????'??x?d???????>?df?S????.%??????:??X???? 
+yKg???4V??k??Za???zF??^???lL?U$?P?]??)?j<thV????9?h?N????????O??
+WL_??????	@? ??????s?8?A????m?~??>c??QiV?S?1#? =???????MC????!??;!?p??/??9?????*?`B<?nq`??:?.?Dp??2?XP???F2"????'?>?'??4???$'?|r??\%?V?t?^?Q^Tz^IO)t2n?d?IT*??Q?8Hg???K?3tH???b DzIP?DY8
+R??[? O1M?5?%M_^??kRa?:t2th5`?@??}
+???^?I??q
+????u?6?G????/j?t??t?F?=6????~???}??vl->m?????>2???mKa}???oX???pr???AI??s??i?nh?q??HQ?'M???Q"??q?tG?Z}N??k??k[/&??s^6^r??1??}????]Ux????c????;??o????????N??6?1???????????O??sI?
+?Z???$???0uAn????U?VJ?l???p?????4?????6?r???P???ukW???k???e?
+)?"??H??
+???Z?w.c at 4^,?Z??{??Q??4?2???????????M?
+?d????#?2?F????|?????i?
+????'^???i???l???I?
+O?ck??0k?r??
+??8J;:???K?f??78-???M??????t?$????ZIQ???????Js????1?!?-????s2[?v??,?^K2???@?B????
+???????????^x?(??#?/?????????>????i???(????n?BA??:???bh|?L???(H?^!1??????6???v?P??`?	yEa??:??~H?A(,i<^???[???<\i?6??m??
+??A??qF
+n?$???"u;?GZ24?N?>?\?"?fs??9g?(???mE7???.6"?f?_t??FpJ??x`#<C?t?D?b>???????Z-???}e(???jH??
+??????8??9R?U???y??E%???b??D:?'<5?'?J??-q6???dA?`~'????nB?????\??.z/???e??t??????? ?????I??y?????y?9o"m<k?`?/???/?s???S???G?+
+??E?M??F'?Y??n??$?r_N5?.q?G?8?A??M??N?????Vp?-C??????1????VUZ????l?8?w at v,xM+??? F)??~}????M?@?|6?J}?X	?z?=?@??"]???`????-?????K}-?_~:,"???????KG|;?7?c}??K?/??;??o<??v????|?jyQ>V????u?C?2c??q???uU8?2f"????????;?x???#B5Z?MV?v???E?rjvtL(?d]?
+??????????\?)?f??-9?????'?F??R?????76?0,OS? *{4?T?
+QM]k8?????
+-?????}?7?m??`??c??q??Nod?kx?aM??	P??5?????<$Q???2?X???O????1k?y?2;??
+h~8_??yC??'??}???j?3??^AM?[???x???J'O???>?z?7{???D$?9?*?-?(s??"8>??J?TA??Z
+o??$'s?????n}R???????d???GB;H?{!?????i???U?.(HMX???a???Dy\??????????Cp???]?@Z?????v?????????v??	??z????z?M?=?/kH??-?r?\???o<??9?????g?4??	)??-??????o???6???"$,Mt??x?????u
+??h????k5??????{?O		5?????
+?c?Lqb*G?????0?P%
+-?????_?|?d???????q??????_>???\&?DUV?cW???.??S????0[C"?#?}??Bi(???p?
+?F???????q???7???ew???????j?O?{?MwL?????>?????G'a?s?ucg_8???N?????????!?^???.|????k?????U??!??V-?{??????]??*????S?,?>??G?????_,?m???>????g<ez??%??g?9fB???yEu?????cA??????>kL?)-???O??2pP??wN?H??????;&??x?k/????A?C?@????)????8wb?????m?????U??Tw??2????Ms?????}???Cc?Re??j<P??%?%?1=????????p+?|?m???4]q??2":????W????y{?Hf???g?w????????3?????2???U?O2?????e??+
+}??????25?0>1+?];J??7?"?Ap$>!"?lXx?A#c??(bBC?>?Uw??N?<s????KvL=m?u?yct
+?F0????????X*?x?Ft??j??????
+?7??4-\???s	?|j?[????^V\???p?d?Jm?x??jN????d?o?w?H?tD???L??????????K%o??j???YYn?????ED?U;6? "??????i]	?l4??3?eD???-0?4?????????e?????????>o\????![^??o;?
+?????6?m	q8??X_????????+8~}??&?(w???????_????????r?????xi?>v^s?
+x???g?{?????
+??O?F?3 ?????-????j?~?e?D???P??[???F}t?Teu|%?c??m?~X??1?/?2'??????{?eF?	??8?????????_??????8?dn{?????-????W?hH?\N?i?+x?=?4W???T?5y??m-???3u?????????O?Zc?????t??~??2e?- ;#?s??????106?Q87vWp96?)??'6ZN_N?x????(?*P&SJ?$p??i?
+
+?o0????m?9%???"Tek?ou??|e?`V"?72???ry?T??rS?????&[y?4Gz?????tL
+??
+w
+??=B\m?t?s???V?U?&m????v?V???I0{W?,j?^?}O????I???rm?6J???????77?W??%m=%&??<??-+?P???a?ym?;/%??{??????(8l??iC?l?&?b????_w[???K??;??1?~J??v??????????????Mk?w=n??????6??Y????????]??3??=>\?*&???? ?z???c?PNz
+n?D2?$u?B?R?PG`?2{zyz3b??kVm?`?^??CL??f????j]?P?pn??	?]?5o`?~?R??2m??Jz?q?9?D???s!K)HT2?????\I?K??p?L
+!^>?Y???? ?o???=5cQd?G?Am???G?? ?e?UF?W??
+/???0??x??
+{?uOK?G??VU??%??Z??|???6??#???&??J{?V?D4????f??Dsj?D????Go????v?So????]?o?
+8??????%)??c??-Aau?))?'???&?E??x??bH?DE&??yY?r???J'???A?j0.?.*B(q???	?1<Z??e??/?*??cA???f)+)????PW?H?????qhV?n??????l??q?@s?d/{??3@?{????????2????M?A????????d?wf#8U?????(????a;v?d????j?K??mN?v????4??Z?h?y'?? '??????w?O??
+b?D?\~????v,???????-?'<?u?M??x????{??.????????????????3??_|(-1????#?/?????>?#?8Z????L???ks3???"q??????^???Y?N?>??ai???s???a??/>??)'R0????,??1?7q???_}P?????9?\;x?d?]?Dn6.?@?_j?6f\?M?????:???????????l????Q6??4?8?G/L?W????JL??h?R??Rd/?&	???'?jn????.????^y?????~??j??????)??]???C(D?????#6'????a??k`??sb?{yI	???a?`;a?j?wn9?kKYI?F?O??????g?$???mH???????U???3'-???_fr?????
+?H+?????????Qn???>5a??R???E?T????~??/?8b???^????~??~??I???o???g??????????pA???t?Ux`}?????+O??9?S??V?	,???t?!??v??????p????!??y?PL`???????$D`?A?8&???b???V?M??????A??<?!H???J???$C?O]4?L?????8u"?<?????YW????~?!?6??G?i5(???|?y?r??9??????y?<????????^{j?????QXQ?I???r???1??IZf??~??3???o???>y30$b?K??F?|??ko>q?O??V????.?Z?\???j?
+?'Q??h???????
+B^@?	J?"?j??????p??#??0
+??|?3?jP??l@?3^?=&???O??5??l?(Kuh?a?A?????R,/&o|0?9'B?K?S_?^???	%j??>????f??Z???
+*??OV??y???0CWS%
+??VG?????m?'?9???K??L?,????	????Gt??
+?
+;??O???????_pxQ~6?}Px?PZ8?g??mh?6?w?r6???u???}??6?v?;?J$?????????1|???%a
+g??o??(????([???~????:??a'??5??-???H????????~tA?????a?B\????v?U???H??<???r???w????qX)?????????S??q????J?????%?b%28??b????p??fd?M???
+?"??q?.J??u?&0??E??_??x???>c&&"?0u???a%??yW?2q??8?
+???????s???????7e?&nZ????^????X?B#??8-(<z??
+?^y??~???>????}??#7???????>?????-?4D??/?????w???~L?n>v?????????9K????}??*??????+8??d0??U??D?%?????B??&????,"Og?Ug?{???M????]??6G;?Z?P&k?^m?V?!??
+?_t?????f????I???_I????W?
+1??d?\n?k?????????FD??U?? ??;?&???.QR/N?`???R???Z?.??	 O????o??????s>8,??U??fR?^=&:Vv*??D @?J?T?)%?&3N?????q?? [?>@??G?-6??8??P?"?F'|????Z??-???SD??%-?0?+'?7<~x?xtdS(?>?? ?T?TDGKGT??i?o??
+?#????M?jk?\"?UV?K 2=R??RkI/?$Oy=???NK??Y??FK#???????A?X?Ei????<??6w]??R???	6?j????6'e?/??$V???????W'?????w???_??f??!????9??Wjs
+'???GO??E?w??bD?????SJK*.?| 1t?^??????/?k
+??+?9*???
+^??N??~^_/_SYI1?????l?????Z??1&??Kf??S|Q??G??	S?????L??,%?xD?7k??%, y@?????-?q?X??][?????Vm4w?????~V|?,H
+?
+ep????W?????%??#:CM@?
+????t]Yo?????%\Gp?K2)???L#n????????io?121?????	%?h?X???=?S??????DI???.?j|3?L?>????Tr??
+?#8B???p+?%@?@????????R??\??}???%?7??
+?
+?@????}?
+?^5t??????qK?pJn??~?}_^2??1 at O?????i??,???IH??d]8????e????????$?]?`???????i?????Y?K<9?,??VQ?#*?wj??[?~`?????g???
+i??y??(?? l
+Zh???q???Nb-?%R??n???h??te??nXaB???8P????e?a??$o??&[?1???H]l?6??%?9'2
+HEDy?0?u??h??????????$??~???????A??>?/?Ol? J,?`?e?0HMh?]*@???????t????????^>?????_:
+??
+?B?Y???k?1#????????
+5M?????????,%?l???*????r????U??,_?{]$'?????????*????????^fc??g??g???X?C:CnP??????z?(?5^?F??	~F???i5"??yWV?,?y???xk???R?????9?7???u???K??c???????+3]?3>??}??c??L?5???^}?1i4
+w'???{"J????i]*9j|4?????f?L?s?"i8Gu?84?f??@????????.??He??J??0?????S?U$n?U?????cB\#??????T?w)I??>?????)?????]?
+
+,?vDa*?m?@yZ??*e?????\_K?X??"?S???L~?=E?????jUm*{??o?????"?9?Ve$%?-h??H????_???1?J???'J	?????U?rd?p#O1?
+w)+?X
+???JL@??;??t
+??u?'Xl?n?*|?d?b?f?b?j?m?H??2????\@?PM@?r/A1????9??D7y?K?i:?DE	??8???????p/??Z2????2?y?
+h???56M\?6????(L?=?>J?'q???96_)	S??KQ???sj????3TqQn9???=????*?????a[
+???????gX????z??@????eZ?!|E$???????lXHy?Nb??lgl&P2?????(??JJ?"B-??h0H9h??J?????R???j??'??o6 W?~?	???#??#*H[?K?y#???E?OL?Xjj????????@S[*????[4?v?$Tb_?????7???*^i.?*?J?/Y??O?%??~?????"@???*Q?4???:??N?Rr@(.O???a6?M?Y?]???????|??????????#?p????M??rC??R??'p?yU???H_?!??5???7j?o????xu?qEC*>?2?j???iB*5l?F????H?m??X?a???'N?>???F?r|XIh-;+Q?he????nN,??rW?AH?????Y7:???R??%??
+G5??0zT??Fg$?$'g?=K?H??|?MLMM???PWC?*????.??$4?????3>??	/:6?Z]??'?#+]?J?Q??N?]?>7?C?g{R^(V?tW???7V??T2r??????M'????X?J?????6?Pn?W???z?I?41}^!:c??????P??>???v;%;)e?*]M1??4E??????v?????6?cwl?>?Z0?.?j?*W/4???[??#Ox|t?Jm7%$?Sk??s?XI????H)=????t?g]?:?J???*n"?W?{]????Wsl?DLKdd???zF,3??&???Ga????@??
+?E?)??OH??a?????!???^?8~??B?4?3?L??
+?.???q?7?D=?vR?-?02?N???1J?????P~@p?Z??0?-??PKU()??cT???t^_?$?_???d?1?1X??q?7?Q?yWLFJ?k??CU&T???0%?yF
+?[x?c??pD{???.?7?I?????^@???A??f?)
+?m?0?????8?1?x?]???????Fm?*??fe?u????S??l??????????S??<?u???`??%S?E?????z@?w$b
+?????O????*?1A??
+~:^r????J??u?ux*?v ??	?P?????)??IZ?0
+??V?.?K??Co??????8)???	FU?1?Z???m???8?'^?(Q?Z?8?n?s?N
+8)?U)
+??R|	&??,?f?m????J??83N?q?e?????%6vu?*.7?????
+?????C?d?e????zz{???&G??x?R???U4?J?*??$[eDot4p????J0???i???5(F??ot??L???LJ???ko9?????
+4?H!E?[?l?d??????:
+T?w?????I ??
+?????????k?Gh???E%???? ???????D???E}??_?^w?N??e{G?
+W??h??!???m?u8yPU2??x?Sv?@WK7??S?????sW????ck??I:?v?;??????y(????]e?J?Z???%???GmkA???;
+???p~^^VJ&???bMOH5??y?
+???????0AF??;????0???a??eE?f/woN???????MF? ??-???L???????C*?	
+??????3??O???
+
+???JJH(?u????FBd\????????
+?h0 0H?c?3r ??????@Ia	??"?xj#?\???j??g???iu?????K at X`pH??)???J????????P??????????Ttv?U??????%
+z?*????;(????\m?O?Y?????.?t???8??	????W??????????Q?????t??????;_q5'=??+]7c??9T|??'??r4v?_0???=??u???3???P??W?D????/?{????????.<k??=???O????q???{q???]???_??I?_u???????#???RY[zE??C/3??_?????o?r?Y?\?????????O?+?V}??e?????w??}#????????????????1???f?e??0y?
+??(?/?"??/?????_?&?_0????y???????|???o{???;
+??6??????Kw???~3??a?CZ??????+?.?M?)?_9r??O?EqLa@??[?}?p???Q?????h????l??P
+????(?0x????????g9?????t??????S??yMuua^w???
+:?i???????5???????????dL????^y?9r?2g?E>&?J?????&???h|?U????;?{???\	;?????????L??[j3??G<???q=??%???m_????????h\j3??F?????????#S???#i	????<?>}?}?*??|h??Il?x??{@??????~?u
+;????
+XGN??ep?????)????bj?<??*m???????{wN?????????(
+Ss?Eg??.??{??????9???z???7?&+%????f?;???????M?O?V[?cYS???{`?R????C?d???a?,h??2??FFA??So]<t?]W????uZ?????n?;Co4@???????	M"?qW?? ??{???3??;?????xZ?z???p??{?D??sG-????x??;??a??u??=P???(i_@6d??
+?fQ?????/????UUh?????J??U???N??~j???`_??????]`"h?s??QR???T)??#?W????'xk?GJ?_?`????W????Q"?.3????@?UH[JL???Ux???????XG?1&:6f??=k~Z????????M?C?
+h???O?x?\\4Z??????9??t??????y????F=??K?/?f??/}?X??????_iv8?Z??b???3????;V|???_??n9u,?????a?
+&?
+??+?Fq?<*?:??R1t?Hu?_o]?????D????%&7i??@???ZN???d}???H?u^MPU?JB}??8???-????????#Zsu??ZhM?@??S$/9Vt?O
+???6L	???N??tVr???G???????D??.?C??1[&?=??k????eX?r?????q??Y?tP?????<?
+???)c????7!?w?????]???b?c?????I????i?^2y?a??>??g??Mfa?>s<wc??]?'?f??d??@`???.M?O????0?????p?????$?"p???W?+_?????,???????????u?O?N?o??????x?N:??}??????????tl;-l?Y??R?G?????@????????L?d?0?lq?????0??~?\r 6??6????z???>x?-ID???/?I#0w=??1??3?g\??=<<?|??d??i5vmYk?5???t??@IdL???.?????|?e?<??????????,??a^??
+?8?+3?r??!22j?c?{???C??>?VdL?^?z????{??%_?'?? Qq8??K???_:4?E???0*9!I?????q????\?^????????????n???N?????.?????????u????1?W?ck?u??:????D?F?w???)?w?N????	?Gt"??????&?~	?2++3?@J~6n??h????Q
+?,.(B
+~?L?????R?O??????b?k
+??D???@?]???*???K?o?S??????x-|?????6??E?+????I>D??9\??P???+|?
+VJZ?????M>?%??@?Qx?qE?t??y/5??(;??Tk	L?O/0?pLd?[?'?H????RW ?G{#T?O?
+???c????K8&_?$(#?H at L?&?t?3JN?s'??v?V????H"IIGR??H-?&?.K???n??Jr????[?&2s,Y7?u??U?????????8/g??`????ob3?????h??'?!0???o??Z?ZX)g?Y?J^?R?????VDw??z
+?0?U?}????"?`???????~;?WW???+vp???S??R???????????i????J]?????l?n?!F	?U<0?`%??1%?)?	S?>d?K%0?O?{??????/1Zl????#???)k[?a??kZ?vf?a*W~?+:?[???Wl???AI?5'????o1???bW?J&?
+VrRe?R?????q"f?.??qdT??|?_???
+<C?P{?D?D!?w
+P????g???;k??>?a1k??????????&??{?aKU??zp0`???M??t#Rv???0????&s?J9Vvz?T???c???T?>N?l?>???>~?8*
+?r"?R???Sw?/k?z???3t??r?B>?4?Fy?3	zTs???)C/?????????X^f?????t???P?Q1;?'??0r?\?u????L???\?:B???E'7?????#)	>?*?^???????.??rr?lT>?G?0?ZE?0?@[;ug??@
+?
++9l&Q?Oq??	Q9??4A1???Q?????/_?A~?-??
+>m\j???G??N????}??{s3r.?????N??[?*2~8??o<?2??7=u?z??HNu?D???y? ????t????q?>???K?9{??n[?m???????O???#????}/
+~?tLT/P???~?l?muM.J???Ya?
+?+"J?s/9?(*`%1???8????/{X????u??vm?
+ at M?N??????
+t*??S??I?-[6??@a?kn???^?????q??????x^}?
+}??????BpA:?#?????J???"?a??h?"???"?`???8LC?b??6?????+&yB???Q???T4?1s????}??!?Z~????|*??=?gx??	?V^:j????Z??+;?yN	?p?????	???????gV?bA??w?z???n??nk
+?>$??<N???ns h?|f`??q??<????????v?p1D?c?????O;|S??\???4?
+E?B???u??i?)?n?????K??Nx?????[1?w??*??X??????????H.??e?|???EO?o?????L????c????t
+3TbYFZ???6?'??F??3?4?QcW?9,[?-??#?W?z??0k?u????o?K,2bJN8g????????a?79?9???4?????????^???Z[?g?;	?????`Kx?H^c?P?yxWq?3??Y??????RVV?nv?@c)????e2?!J?(1??l????????!?>????[_????YW?
+??j???
+`Z+?V7?????????????{???$N?Cy??z????f???6??G???=?-????Y?????I{7?1f???L|????4/?v??	?$zIN?k^???I5H?YE?a.?U???JHO1??>?(?>r??D???
+&P???>;c?????'???????????J????m???e??????~e4?D??Z?????}?\dt7?,|??q?q%p=A?4??K?3???w?z???#{??$??[n?z5-'G??yJgj_w??!dG???q?????????>??Ow39?Uc???CNDb??1p'?"+?????????ON????f?v?(ooo?#???X?1I?]???5??@??UO??+6<{???~????k~X?Q????H??g???|??m?6??Q???[??????q[??????????3????9????;t?_[?S3G?5^FB?C?????????[.p?=???????=????!??g?GFD??XP?w?m????r I?b
+7.K?;
+??d{b{<b?DG]>??+[F\???????\??6??,?u+??~?|N?mD??g???r??_??b??!?F?????)z????=??k?v?"????s?
+????????q?,q?\?ItD7F???4??????o??Q??>??????????g?{?1????}?M?;?????gO?Q?[F?S??7?WQa!Gxr
+????:RB??????????????	???V??UZ# ?s???#?Y
+ n?K~f?r??|??b]??RK	:P??? x?3???J??!Np?:?}?g??b:G???G_?
+H\?B?????????\?6XH?.??(!G???;??^4HZ????);??3A7;PRRn=?ls4????)?S?NC???2?????"?))+??G~S@???E?A???e??}?M
+???IZ;???2???Jy????E???R?1?*?iK?15|?o6??{?|??k???????|????!:]r???n}??[UUW??a6{
+??c?VND?????c???\???E?Y???;?HWl>?J???pi??x?;???????JU????~????r?Gf??cG???uz?|YW?2!kk????^R?v8?|??O!???K|q?=?????D<'b&k???fEeki??#F?q?4?s??YiYf?[??=p??HJ????Yt???F?i??]x????5s?D??V??,??#1?*??#??Bw?`?^R??%*?Q???>/g?I???
+0????\C`?????oz???{??????Dj?T?G>????KR?%?v?T???vR?x) !	???0??)^F??2????u?b??"?7?|???R??l??&r??i6?%g?(????8f????????y?]??i?????/-??g???q;?G?0?)G??GD-z??w?x{7???,~???#???X9x?04Yv?+??/??????? ????b?n&??6p?P??v?a????5??7???????*h?MAh!y0??8)??I?F?v?Fg?D&Z?U<GB4???i"?????K
+T????^??1_????Z?2fMw???\???xIA1&ou?v???85?L???-,??m???8??i?D??i???M?\????C?Vq?B?	?
+H$:??Q??e????t?o$?kG?#v0?????i?????G?0?9?????
+4B?
+???*y[?M????c8?r?U*?j??klA?4????tbe????
+<??4?7"<;??\h?-?Y]v?B???dh>??Q#???8:???lP?n[????~?>?`?m????z???w??A&?:_?vg?7n?H??0??E??????v????
+??f?????O'?????KIYI~??????x??J9?K???Ho????N?5JINQ??=????A
+???^Q?IYaI?Ux????o?N??T5?)Pi?(-(??U????b?w?*>4k)*??J6E	z????2??r
+?
+??z?a?????(/???sm??#3??E??R).c'>^#?N?:U??????rF|?.?-?Mz9?>?~?Rd?x?(?,?8%???r??([pC?2x???
+K?R?B??rWM?u~RH
+kI9?kl???
+???^??O?E?y????^.?+q{???k,????=F??;m????w???UK?2???&?o?}}~J????h???7?`6?Tnb?G?w`?` ?{???????5?)Y?=?F?<m???Rv$????;??I???Z??O?_vB???:|???8?:uO????	??UF??>8*,+%c???
+}??????>?
+??????4????vF???f??B+
+???fPt?UCB?F?F)?t]???P?)?7?J?($!????O??l?,Sl?&?G??M?1e?;FCm}?n???M^???:?#ym????j??????N)??Y??o?qQz7C?????1#fM???????9???????????3??<?I?l]?a?E??B???u??=?3C??????L??,???~???u?G?;????,F_r????0?g???*mg???c???}7??6co??W??????_aF???%?'?w?3???{??["??g'g???wp3$&r???[~Xw?u??/???;|?xKi)???j+?f??!?1#?$n?w?"\f?3??)C?????????'
+n4uGB?)CN???@????C?	?o?fuY~???3????^?:??A?????r???!????????SN???uS?N????S???I)Dq?+???t/?v`@G?	nbRC
+!?lo?D-pp?>KQ????6M?89??l?<}?N?3x??7??????????;??????
+???^??7F?V?n?i???4|Z???iz??1a1Q????M?3T?W??!1?D?b????y0??A!?x>X?????????m?fw?@???v<c?Qg??
+?:?????Mp?1c???>?9?Y?6?3?c??B`??JK????n!???????UVV/??7"???A?	???.??V???>V??ZTP?B???9??[8sX??????zz?{{2????????h?K?a*Up?????
+???btW??#?vZ??f????l?e??6	?#?)?M?6?u??	??G???ls??????
+v?q???4?{????
+.??(~?&S??????A?????#??Ve-?+???D??puU?????y??_158:? +???	PVT?
+Rsz??K????????S??e??????.A?Xb???W?/???h??O??R6?~?.(L{?B?????"??U???5v?/?V,Y???????,?2??lT???????????a??w????V???;???P??q??W?o??hNSw%??F?????????U?/??>k?????9H*;???vn?|
+2b?ai??m?r:g?]?W'Vv?-bM?*Z?f??.?H????zn??????~??V?Z<5x?F??i?
+?&O3@?S\7?w?????O??	?S???0???a2??9i??(??(??q?+?gl?T-?*0y??????'??W?wE?
+?h??????WG????<?5:???m?u3??lqR?j*??v?w??*K???=F??*&?8??????Fi]t???cgM??k?K_
+:g&L1?XJJ???L?.CM??7(&??K?<}???
+3??}=u.Z?F???S?;6????*??=??;9sD?o?}??????~?Z??X??AT??V?:??A????_R???Hl??P'???%??5??O??:?????S?=a??b?7|?r?_??(a?b??	?????????????kv??|JeU%,X??}`???`?????L??h??
+?	?]???????:??????Ox
+?L?~?A?>4y?A??So??JA??!?0g?M????????????3?;C8?V?O??n^??w?{m??D??*Y?]??
+????hP?????t6w??<???_?Y??)???????7??%2 z~?3?
+/?#????52?@L%??K?v
+?>?	????????Z='???????:l??V?\???1!EY?RKs????????r
+?{?y??
+?5r?i&73?f3?`r ???????2?h?i????)X?CzFP?????y?x[?K5zo`lb???}y??e?Ke<X?i??b?_?'?`?RCf?v??????3Kb?c%n=?H?\5??O??????#[UA
+V???3?Yp?u???/
+@????t????~"???78%?v?9??6???7d???2>,???(`???fs?
+??G????0/ul"?,??H?V[>?????\?]P?FxT?Vi\??`??????}??qUj??)?%?,?C????80? ?3r,'+????R@?U??L????h?~<B? [?$???5Z?????g>vd??? Ss??????dT?QD8oA??*I????nI_??S?<Zp??	????*?c&"-b|?0g7?
+???E-?@??9?|??18hh?????C1???%??;vdo???d??H
+?#?z???? ?}??Q?????%{G?i/f?Dy{?ZW6?b/?N?()?8??I??=%)?*?w??4??hX??4??qx?HpDz
+???*???4????O?U??l???LIHB?7??B?D???i??%?s??M??^%?dB%??O@D?I?.4g^?2]?N?+??V??G]???0T?*?P?`?UYQ?????*?m??j??????!?vb???r?O??>U?'v?":`?Y???D
+???D R|?*?????PL?!A?G"?}<((??~?P?	?q?~???:????Cp?k??????1?XZT?
+?
+?=^??
+I??'l????H]??????)O'V??K?? a?A??0?@?UQN??w?tR?c(???????'?8?)?%??'6	??wR?I?S??y??%????
\ No newline at end of file

Modified: trunk/docs/reference/src/main/docbook/en-US/content/introduction.xml
===================================================================
--- trunk/docs/reference/src/main/docbook/en-US/content/introduction.xml	2009-06-09 16:45:30 UTC (rev 1014)
+++ trunk/docs/reference/src/main/docbook/en-US/content/introduction.xml	2009-06-09 18:39:03 UTC (rev 1015)
@@ -31,16 +31,35 @@
 <chapter id="introduction">
   <title>Introduction to JBoss DNA</title>
 	<para>
-		The JBoss DNA project is building a unified metadata repository system that is <link linkend="jcr_intro">JCR-compliant</link>
-		and capable of federating information from a variety of back-end systems.  To client applications, JBoss DNA looks and behaves like a 
-		regular JCR repository that they search, navigate, version, and listen for changes.  But under the covers, JBoss DNA
+		JBoss DNA is a JCR implementation that provides access to content stored in many different kinds of systems. 
+		A JBoss DNA repository isn't yet another silo of isolated 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.
+	</para>
+	<para>
+		To your applications, JBoss DNA looks and behaves like a regular JCR repository.  Using the standard JCR API,
+		applications can search, navigate, version, and listen for changes in the content.  But under the covers, JBoss DNA
 		gets its content by federating multiple back-end systems (like databases, services, other repositories, etc.),
 		allowing those systems to continue "owning" the information while ensuring the unified repository stays up-to-date
-		and in sync.  JBoss DNA also analyzes the files you upload into the repository and turns it into information you can use more effectively.
+		and in sync.
 	</para>
 	<para>
-		This document goes into detail about JBoss DNA and its capabilities, features, architecture, components, extension points,
-		security, configuration, and the development environment and procedures.  
+		Of course when you start providing a unified view of all this information, you start recognizing the need to store 
+		more information, including metadata about and relationships between the existing content. JBoss DNA lets you do this, too. 
+		And JBoss DNA even tries to help you discover more about the information you already have, especially the information 
+		wrapped up in the kinds of files often found in enterprise systems: service definitions, policy files, 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, you can make JBoss DNA
+		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>
+	<para>
+		This document goes into detail about how JBoss DNA works to provide these capabilities.  It also talks in detail
+		about many of the parts within JBoss DNA - what they do, how they work, and how you can extend or customize the
+		behavior.  In particular, you'll learn about JBoss DNA <link linkend='connector-framework'>connectors</link>
+		and <link linkend='sequencing-framework'>sequencers</link>, how you can use the implementations included in JBoss DNA,
+		and how you can write your own to tailor JBoss DNA for your needs.
+	</para>
+	<para>
 		So whether your a developer on the project, or you're trying to learn the intricate details of
 		how JBoss DNA works, this document hopefully serves a good reference for developers on the project.
 	</para>
@@ -169,19 +188,16 @@
 	    and is being revised under <ulink url="http://www.jcp.org/en/jsr/detail?id=283">JSR-283</ulink>.
 	  </para>
 	  <para>
-	    The <emphasis>JBoss DNA project</emphasis>
-	    is building unified metadata repository system that will be compliant with JCR.  Nearly all of these capabilities are to be hidden
-	    below the JCR API and involve automated processing of the information in the repository. Thus, JBoss DNA can add value to
-	    existing repository implementations. For example, JCR repositories offer the ability to upload files into the repository and
-	    have the file content indexed for search purposes. JBoss DNA also defines a library for "sequencing" content - to extract
-	    meaningful information from that content and store it in the repository, where it can then be searched, accessed, and
-	    analyzed using the JCR API.
-	  </para>
-	  <para> JBoss DNA has other features as well.  You can create federated repositories that dynamically merge the information 
-		  from multiple databases, services, applications, and other JCR repositories.  JBoss DNA also will allow you to 
-	    create customized views based upon the type of data and the role of the user that is accessing the data. And yet another goal is
-	    to create a REST-ful API to allow the JCR content to be accessed easily by other applications written in other languages.
-	  </para>
+		  The JCR API provides a number of information services that are needed by many applications,
+		  including: read and write access to information; the ability to structure information in a hierarchical and flexible manner that can adapt
+		  and evolve over time; ability to work with unstructured content; ability to (transparently) handle large strings; 
+		  notifications of changes in the information; search and query; versioning of information; access control; integrity constraints;
+		  participation within distributed transactions; explicit locking of content; and of course persistence.
+		</para>
+		<figure id="jcr-features">
+			<title>JCR API features</title>
+			<graphic align="center" scale="100" fileref="jcr-features.png"/>
+		</figure>
 	</sect1>
   <sect1 id="roadmap">
     <title>Project roadmap</title>

Added: trunk/docs/reference/src/main/docbook/en-US/images/jcr-features.png
===================================================================
--- trunk/docs/reference/src/main/docbook/en-US/images/jcr-features.png	                        (rev 0)
+++ trunk/docs/reference/src/main/docbook/en-US/images/jcr-features.png	2009-06-09 18:39:03 UTC (rev 1015)
@@ -0,0 +1,357 @@
+?PNG
+
+
+IHDR
+4?/ii ???
+??N{]0??X????e????????[?B?
+???b?&??w???m?????9?<???r%d??M?Eg?M?G?h?@??
+~?]=?T?x~???????%[K????*?_:V{9???U?*?k???????5oj???_??w3?a_??-?&??y??s-????uw
+???#:vw?tIw?u??|???????2z??\ij?\?+?o=,z??x??mOE??C/??F?G??y????/?y?8??2????????cS5oR????z????t??S3~5g?f_????|rY?\????9????n????e???w????V???V~?_?l???!??B?x?TG???Q?hnt	FC???Xq??xq?k?&2A?????r?5?m?"??g??+?;?g??W??????x(xK?D8M$\?Y?x??8^?????p?p???????U?'*+z+?(?h?J?????/h??????uK??N?n?^??$?}??^Fn?&&z??f??J?%,-???YmXm?0?x??#?	??s?????w??bqg???-?)???G?[?????????L?N??R@)-
+?/??????y+?i}tmLm???????\=Xv???????cG???????ut?1?T?4??\????o2e???q?8?Dv|Np??i?<?3?|d?l?\YZ
+??g?].v+1?(]?Y?([,]A??PYz9?J?????k;???????bk??^?????Y?p???VZS??!??-??????8?9?;w?uzttG???M?Wt?????4?~?????c????>??9?6zcLf????D?+???)????W>?????E??????Uz?7?>???? /?]m
+?C??A???D?.W7?Q?/<?<C$+R;?o=?4_9??"~?<A6?\!?P?0??Y??????b?bO?xo?*?&?'Q-i*9,"????1?y.?$'%wO>T?W??"E?O???????Q?L?S?_??F???V???Z???:??Rz??m
+?YC#UcV?e?I?q?????E?UVw?Gm????k8X??:?r?q^pt3?yp?5?)8[?????????????????j{3B>???uE???)u>Z0?B?h|U????????#9?R)?????????T<?&+?g?i\?@~??}??E??Z???*?*y??W?V????m?????????[zn??t?w???t?????2?????a???c'??N????????~x?8k3?????d?L????nc?P> ?k5D ?1?dCZ!S?m?(mT,??
+??nB?a?1G1?X?nl9?N??{? ??pO???;I?T?>?-L??:???Uf/?n?3,?????ll
+?
+??88r999s?$b!?	n4?_??<?<K?h?
+?a>??????' $P*(+?$d,D??9(?!zYL_lpY#^,?'1*+?.U+?&?*sN?LvQ?????W?JEg%?R?r????;?m!?)???$?????i????*???&????cbhi$o?1?14?6?2/??bA???J???)?m???s?wdt?u?w??f???9???P???y???7?G????AFh&=?+Di???O?<5mS?s`?????D?????????v>M?x?	???'??j?6??9?'o)???????^+?x?L????3??????????]????jlRmF???k??8???ctO?O??c`????n???{\???K??????-??f0?*????-??w|/[???.P?? <?H??	?????%?)???Ux?????Y??????????`?a
+c?'D?3ca?{?:?c?PvV?:/Ng31?K???;???s???????????N?P?Y?M??p???(???X?Oq%?e?.?l??????2}??r	?v
+r??gJM??*1??j?$?u?W??[oji?gQ=?m:?r|?x#????{?	?wfc??ZZ[??~c?b???v???h????r???mb?]??vw?g??o???o??
+?K??/_???>R?R?X???ZC&<q4??|???&?~???k?g????c,???V<??<?x?e(yxj?????/?u^??|????:j??M????<?
+4f?>??Z????|R[`_?[??\?%???????o?e??????????????f??????????w?L???}??
+%S??e??r????????????????	>B"????~ ?h?P??*O+???1?:
+??????`?-???
+z[?u???q:?A?-WEk??????hm O?|@??z#?Z????6~?????}????wa???H??U?Cl???X?B(??@5???{?"???9
+?:?U???2?
+^??@??=?n??}|??`{ ????n?@7z?'????????^~??/???F?aJ	??*???`sT"Z???s?V??|??n?Q?%?O?#9??W	????,5?@?=?????K
+????AJ??N???
+???6??}????? V?>?????AC???Hv??s	????/?B??,??_???f????\?a??/$???????#??U?7J6??Pd??????'?????:I?	?"C$uPzt??R? V??7
+??(??G?F~j1??????:?C
+?V?MhO(P?J???A????A?????R??##dc?dm??n???+?`????Gb??q:?$S?d=}M;?[??#3?^??G?dC=??#??Gf<??R???P?z??4????=?+???7??u7???P??:Ai????c?$?a?P)B
+??:!9???6?A????fr??i??u-NI?x'w????5?????p?l?<?:?p?5??????	?X-5?????????`?=
+??QRx?????nbe?{?
+3???J??????G??=|????b	o%?EKa? ???!be????36??#$$???,v?z-???????DI??&$gp?e'G)???u\6R?J????@A&???
+>;?z
+B'??9??qd?T_"U???h?9??#????\?G???aT????NV????o*1?;?Q_$???%?7???N(q'V?+?D?
+?}D???3????~^U???(???p?G??P>S?+?O???O??'#g-??Y??8[?????5???|??A5h#?E?????1Tp??CV	??????PND?>?
+&?N;??T[muSx?L$??$?A?d$B?I??F??n??i7a<T?[^???P???px?Wo???>?????x??Z????AQ?
+??2???]??i??=?;?@]???7?????	V???Y?P*?0??????!pO???9mj?gU??j)????h?6-sZN???6q??S???^????2?h???-?7?9?B?G?-G????r
+?????j?k?k?*? <?@?anU?[?Q?/??????[?+?@Y??Rd?qc?y?of??-?j??* ???6?`?!ee?i??<N??Q?hT?Q?b5)?G???
+?3^WCeaLZ63?y~?SS???????1???\rp[j*B???}?.???jzA?P@? kn;?m`"?6?6??"??Q?X
+?	?i??^c?W????&4wE`??-??#???????Vi??ZhF(G??(?3?R??????G???y?~?x?????????l??=^?/"J?????h????;??)?Le?????l!a?C
+~n5?????<????????}61E???q??nU?G?RG??1nM$"QpS?????z'??#?B?D???"R??????Gm?c+!!??
+5e9??TjF????4@???:,?)C???C??0' UN?"?FN?4?GD?^???????lu?8W?(F??it???(?w?W?????
+u???
+??mG?	t??????DO??v?]xQA=:??E?m?x??	86+[?? 0??^??zU?ngh?f?(??_$>?U?n?A)>?????4?????
+I?Y|??j????*><<&????*???v?j????t&|?l?????:?
+?O?@x?vD%??{9B?k0??D}4??)9??
+2?2b2????1%+?wm[??5G?[zs(?U[???q9???y??cN+???d?z??~?O??$d?(???x?Z?N??u93??t????????7.@?N:?E?%??????3?L1?c???????7.??g$??=?e??oY?PQ??y?3G?__Y??R??J?>????~^:?>?d?9?&??Z?k?Py?s???i?????;Q?t???:?^#??i??S???i|?B??F???/-?b?????ho?|??i?
+?????+i??????2wL???V,j????x}?C
+?7APXQ?^???nav?&N	
+S???:g~8}??+Y`??O5??ycC=_P??S??	ZnK????mU??isC?+=?k?????<??=??f????
+9[???9?T?????bWB?n???z?z?Z??Uv
+5???8????A<??
+z???P??????)@?/s?&?:??Iv??=??????z????R??K?????w?V?~??3E?wU{??D?*?Cek???4???Y??%pW,?.?Z][Z?w??c???%??B
+?PKM???_????????.k?]tjfminXLb???????????/A???>5?E? ??n#&e?I{V~]?u????/??K??5&???w??"21]???oY,
+?r.p	>?<??5???????-???$?? ?2<>%1k????`S??4?W?{?#?2b[?[?????j??`?C<?H?1?#??r??;??Z)??\.????????:o
+??"#?s?P???6=9`?~?vG?`}?p????uzC???C?3t???,????u?av?g?[???O???<??[??????U{??*-p??x
+n????lu??????????p?1??v??????T?L???ka??<zO??[+?4?F5	???No????b?0?CF?2???p???j@???????????v?Eap?;7;?"??P??B?E??T?]0????????B??n4??(?????s?,3!???&]oR???
+??+??dly??h?35Co?y?k???B$?j4i?L6
+il??@E
+i???v	?<2Z\R?N`e?>SHN??9??|??X&?4?Nu?K?vH6???d??????????c?+???,????@It2???{?C R?G1?
+s?bbtt8B??S???x??Nk]eB???]?2l"????Zj??3??SN???P?H6\?QI?^??ampZ??c?n?)?K??D?a??????:?????]Nk#?ght????oZ???w?<}????"(???
+??H?9??jH?K?
+?T?????y+????R6?A???G?????iVW??@V?????Y?S#?????rI?W@J?q???G??
+??W?p????_?}?i????&??
+OI?{?.?E?E?Q?zf???5??r????:{]??Br?h:/?	8.??2?8f?????h2{?L4?_:?x??<??Q=
+??_n???6????t]??1???aN?u??$?M#z!?&??Mt?"??????S?k???K???b????#????J??ho??J???3=??H?uk????qb-'?2????3Y??F??? ??????d?*???4@??qB#??//l?*p?Y?????/???,:uF???-???RAL???Dj??XWW^?1v?Rj!*4????!!-?sd??iT?????????t?S?O9??<?
+???x??&?z????j???)6x
+?e?*l?????=u???????$??k????V?71U????UnL4????t???m???
+#'MZUZ?.??????11E??????????q-|????c??PrI?V???Ko??^U??
+$$?Z??B??JG?????<,\???h>????uk????H?K#????^H?????h???D?6???dC?,i??a ???M?!???8r????'??	??F
+?#c0?"??L????&????QhM?????+??.?Y?y?^????]^??????????????BTV?/s??p?+>E{N???(??(???	=??]??nF?????D[??I???"??[?_?k?Sb:4)????M?A^???I??.?T)??=lR????????]?????;?VR^n*??2m?~C]????S??_o??-??6?9???U)C&??t?-?i ?s?@f&O?N??"?e???????4??9????????RdR:????;jJrC"c2??????Kr6??????MZ??[WU??b????HcX$??????J??????L?R4? /S3s??=l???^?Ue?X?.??V???V,;#<?C}???ryc5?,x?^,?Y4k?X3??MB?!j4?
+_??>q???P???A????N9=$>Y???c>6?{?2u?:?@?78Py?/S_??J???&???,.p?&.Ip?Y?
+??@???v$???<?0??0Fb?????????{?i??L?7?js6?X?rL
+???(???O?Q??RJPN?@;???????ui
+F?R?%[?TD?Yobg%?d?:??z??}??,v??*k??(\???)?HN"1<b{%Z $??FGv?B?UWzQ.??2??QBK?|???Pt?=
+?L$?}G??u,3j???a?-?^?z?u?:??7F????#?????nS,j?*rc??Xt?D(??????&O??&??&g?[??R7;????_?>??????? ,94?]?A@?????
+?3Xr?????????fw?T???[AI?-???J??0?:B???k?<t??I????????-2l%?X0?L???%W??t?d??kTWG?rB??zu?\?f??{Ng??X?!?m????
+ZT??Tb[mV0?h??
+6?fmq?n?Y[???0??tb,e2c#Yo????hb?Q???L?4b?????
+B???&??????`<hd?=?^?2??m?L???#&?????#nWt??????f?TJ???Px?r@]SW?(??y?v^8???	UY%?fmA?n?I[&???v?;BAL??i??wI????	\"????-??b??[?u??????1?6??k??8Wg [K?=N?L?4m0??iG+???[*D??9??!6@??a))P?u?0?R???
+?5?
+k}??????}?????B???6????r?H?x??:??????fr???V+?D??&%q???d;]uT????>??4Z????l0?jXl??
+?KA???c),4?8????m?,y?O??????/%v???w;??b%???Rqm??IP???%:?%???K??x????????6l	???hYu?'? ???H4???=????=
+????a?V??i?T??`[??x?(???.?o?]A?a??`A]?!?T9"u? '?*??u].??Be?Rg??Dy??)???]???#=&?MZ?~$????3E???p;r??m???Jd?R9N????MV?,?D??????G????o?$??}???"?W!?9???<?????c?q
+.???l?n?,?l?%7I?AR?^vE????s??K?)??????"v??z??A?d_?w??/??*K?a}?.G-a`}d?o+,y?B?]$0?t??4s!???l??a?O[Zr(??RjD???[???@?3???U?:?i??>?w}?9?I?d?a?A]y8??????S	?\??v?`?????r??U;??????B`???t??M??
++??:
+?? ?F???o???????,??}??????4? \v????|? 0???.??G????3???db??3?????????7T?L%??9????5????L0?6k??<9yh3Xej?c??A???s,?
+???~???GF:??R??s????A?$0[??c$R??M????S?b??"&e?????^?J??*???Q??_????*?????D???=?z
+?p?N???????'V?8?QObz+??c???-A:??C??B}M?A?????we?a5^?d?<F>z??Rh?EAs?#<?zZ?????3Ltj?[?K??iR<?????~?a%zQy?%??D?
+????? ????^???????>RVA????Z
+????V(?6?N%??xL??h3??t:
+N?].??v?????Y?????Cs\???h??3:??p?-oz??Ul?????C)p??(??q?w?5N?T?V??:p`^???P????N?Gm(@?lZj??A?zjk?9{Jc?C?g?u???%??N??k{yc?c????pCW?R`????ucId?){H??#????oyIC?????????n4??~?Ym?~"n?Z?%?sp??r?-h?R??tq???v???V????@???9???.O6?pd??~??-?
+n??????H?>??5q?]M??Q??t???wW?{;gW?V??%Cm????j?;?????D@d??i}???s?~???<???????Oy?p?*?{'??9???>???^Q?^?A??{E?;???(y?B??=?A?y????!??#;? E??&?V??s?????0?`D'???\vu?m?+/RU????bS?Vn????U[T???W?a??f????e?d???9\?h???=Ra[??e?A??.P??????Zq
+??)`{?%????e??H|?9?K??K?7??G?r,a?sV???d???^D??i??!??Y??????R????-z
+9??_"5W?<?u??/???r?%#???????r	)	?R???i;bS??&(???xa.????n??*???A*H:?????>Vr?/?m[@)?'U??q??y?V??????k+X?1x$HXQR???94??pmeYr?????4??????AQ??X_??k???>&>????7???R_??'!%@??s?h?0D???i??-N??|?9???4??+????.???6ax??????<?_{????0??Qi|??Jjw?*u?<???f?' ?????W]XP??h3f
+?OL??~?@????????:*&?nu?V?.?????i??????f??j????>dX???U`
+??5?
+
+??YQC?'?-???
+E??????5	Ia?????]IM??`Y'L??v?;WzU?t(\??R?J*???n?e??????????????)?????@	??????cw?l?@A?
+
+???y???}{????x????????L?u.'g??'????)?????yq????>??]???"?????]s?CS????]>i????????f????k????,a???????^ZH??{??????????jW@=m?Zx?-o?5{tyY??U{?8k???????????
+???02*???N???S??vl+??7o???)??????g?:s????}??E????J????^???J??F???2?4l??????ox???y????5g?;??'??Og?V?[????nU???gxc??~??w???w~????g?=??7.\???[????????go\[t?????dxiq??s?-<?x?#???~<3??=???W??
+M;?????????
+?????|<Si|?p??Z?L??f???502RR?z?;?J???kP"???w?NL&????'?(g?w??c???vn\?g??4?;????E???[`???????w??+n??_^?h?????yk??????-
+???k_{yYLl?#O^???/K??KZc?
+A?vt?????????_???@??????i?????~'?????=?~???1R????/?u?EW??c??0@?pz?|????q??i??7'2????`?)???Z??f?A????w?m'???????????|???gYnx???{nNa^mE???U?Dy.D???0?jI??he,????h&?/t7?.S
+??]
+KRr??[?<??O?>?O???w???[????n??:???M????W?K|??%cd?}?u
++vd??,??M??
+tK??zbE?sx7}?PsH??j!?7t?#???"1??=W????M???]??.?$? ?D(??f??qC???y???W"?,??7l?)?F?????*x?=????K{???#SR?v???=?
+????????Z?|X??N9;b?b???????dBzb?z?????:??=?[?g?6Q??S??;?n??`??Kr???P??OI???(???X?+U????????O??\??n???c	?7?Z?_y???^RT??ku:??Z{WI???tN'??[nwsS?];?????Aj1%C?k?T0R?????V???*?yR?s?????????bJq^???u??x~b?hV???&s???GL8?,?a|?:2&??"?Rv?J??L???+??=?Y2?1?r???t:K?!*??;zks?%7A=??????d??r?,?J ?????7[F?I?=o?snK8??Q??.???!?24??X????Vgr??_?G?qSb???IU-?i?X??????3??`????>?:|tR[M?eM>Z?L???????p`A???BB???i??}Tn???snp?????@?9?1p???;?.`%??R????}j
+A?.?=^oR?,r??s+????X??????a?ht:s???C{?t?;:n#c??;?k?$?s??????R??D??`??????v??4
+=????sV*?h`?>??ym?~[?w?w??%7pP?????0???f??"?n?[?R?u7M;??q????~?????l6$&E?o????h??T?4??%?????-q?rX|??8??t?ac????_?h??????5+J?l,??5C`FD?"7?+???t??Y!s??I??w?{????|??+??c??a??g??XPQQ???PiK????&O?????g?/u???eR^64?}n???l???q????????d?e??????*'Nmp??<T??????a;???????Se????e:????5
+?q???H?q?????
++?lY'??;b???>|???^
+?}????^????<?+??^??m?Em???&}??V?)
+?????_|????TUX?3?~?????	?3??.7Z???t?E??}???C}???GOW>9H???xa?o?Z??]??????vM?T^`X.YP?r??.?r????>????56????o??T????H??????a???5???Z?l??????j???N?&
+?:???(????#??!^o W5?Y??
+?(M???r?|v??r??5???	~%?"s??C??t4?X?.??vm*.6dr??t??=O??Y??Na?"???(?vUm?????wl?????0?2[???9dd|JZI~.???U??z??????G???D??_p?g?f?B?"n???????????J?&?*,~?!a?&?A??S?l4? ?0}v??l1^????p??^J?OX??7$.?????????????Z?????XV??/?d???O????U{???;??a??fo????:K???&??Y?z??%???3???W?????.^??~??y?Fw?,fJ??????1:??7.x???\4'*??????;O!?i?????????????Z
+?????/???d?tx?>o?O4>??E?????Y?#??
+?{?,$???h???????-?????+ K??>bLL?1?a?i ?D???'???Q1?Ygg?????7W?]?O?K????lJz?%W????]~)????X5??1??_?9??????';??l'?7qJ:?4??????-+??P? ??g?uN6?Hq?}?m???????R^????H????tj??E9??n?6+??????????????G%^r?h???*?d
+q??u[[X????????h???N??(?*????o
+?*?W?uGR??&???a+-?e$?e>??_o\????3j?tv??_?n?T????KI????lH?/^????????X??E???B?E??nGR?&"?????????q?5???? V??_	?|?$??-???-t?a?`Dm0??r????]?
+??!????0H0?????????FE??m4??<BX?RazYVZ???+?F???l?????In=??T?????H??y??_??V??:??GDE???4?_4?????_???0=? r??&?$Ac???1??????R??"?	cu???k??h?\?/?,??K???j??nY_|??????????y??_?[]??9?????7}?R]i5.?o??9o????6?(????W????/??tj?M
+???\|????????d?&????s??g_9???K?.??&r	s?d????9?O???????&??_]D<?O?i????V#??'????????s?V_9?m??#?
+g>	?cY	??T????\J?@??(Ps-L#U??????$????
+%??u?)???????_???q?^|?">r????/??????
+K???W??f??y<z?????qB??EE???^>pP???_??{[^}~??=??9???d?_????W?Q????H9(B????_F?????u????????????u???Qn?????w|w
+k??7c??e???;6?=e?????9?4F??????^!*??l1????	?6?=???0?aL|%?s8?Q?+=
+
+?????s????<?	???m?$????-r?m+L??G?f?????/wA??-c??R6?$&?]z????%?V?Z????)???m?P=D??A??g????8??4rt???"????n????Lw?X???o??^>+???)?.???uE??7?,?eE??H??????????[O>s? ?9???`??3?????????
+y?P[m%gm?]?s"?I??7)
+_?&)?i?W|??V??????s?b?&q(E{Wt%?p?w?*]???+??
+?7??,FW?:.??%G??@?E?
+?L??p??????????i`?7?R??7{(;s???n???R?L???i$@y???j???_j????q?e#\?k&???o????_?S4@????p??5?Ja?E???????/???$\?4J?T>K??B? |X???vF???}????n???K5?O?????_n??????T???[?$?$FZ??z???????=?D?????????aW??{?i?Wz?=?n??L ??4???dx??n?w?oC?#?@???VG[lP???G?E1?????1??J?h?+??.?>Z12?u?q!?{?J?POO??????Y???w^[??]?N????/R?\i????C?????I???'???Z\D???QFD????J????N?Z????U?????@???A??H??%.!???]p?=S`?????7????1IW?0??j-?z?B?6??????]!??K??i?j?@v?D???????N?0??/:??,z1gF?yXdo????;?Y?u??Np?R?0??S<??"*???B????KH?r???iR(k?&O????!Z??N?L<????????z??%??P?,?Y??
+?"<2????!# ??8????m?I????f?5 :6????Sgf?g?7V"MC?"???B?V?7?????+&L??j?R?y???3??L??l'z??Q??~-?#Y????
+??a???%7K?:Q	?N??p???]"?3?i@$????.:?m|??1??B??V?@.???fiD??
+q?????^???}???WGD?>???P.????S'dm???'p+?????????7o?????L?P"v?4o$?6??4????????~?`?????F?q??'`?#?8???jip??(?y
+?Oz??+??=?????.,~
+??4???????<|?mQ?6???;???g?1??g????N?2
+kV??|?/(;?%Sp>??)"??6*?v?	?p? &?,S??H?;
+?#????<??>P?ZQUV?/?3Q?`?p??}(^????*P??y?^?????I)1?.7?qIi???6K??T??7	?l?=????!+e^?"????
+(1]?c??Ve???-+?.?~&f(8?N?(?[_T?9?|l?"??g/??????eS???M?Z:P~?N???.????[z?X?r??
+?1????????????/?????(;????6????<?????????>??mk?????|Q?oWlR?%7?VQZ??????'?k??ig???>?nr??o??,?C2N9????~B
+
+?M??n??`0?q??l??????;d?????????]g????
+?b?
+??/z?:????.9?Y??0???d??.?*??C?%V?*??,???^|~;???H???mX??4???oF|?c???WoZ?#f?Q?9[w??????iCwmZSYZH?
+????;????<???x?
+?LYx?k??<??k)???<
+LS4;??????????,??M8???7=???I?f?w1??_????^?????*,?b??3zz_T at O{?y???c?Zb%?!i:??p?R???H??D?&??<k????a??5?h4i????D?????
+??$U??_??????]Z??q{6??p??C??SNR
+??|????tORZ?F'??_????1(u0?pl?=yFR??????l??\?????????A???K?O?\?.?w?&)?`y<?-?Z#K?;?T???P???xp@?J?;?Qo????????????_?'5??p"?? ?V????b??W??(@?????H?vXT??;RA??Skt8"
+%? f?????\%?(:.???~????????ti??%??r9????_??(???????o?m??]_?O????????
+??????B???7o?v?sX?8????S???????~?????DnX?H4?s?v???????5??CEBrH??3/?,+.??;?????!JE???T^?'"??M=??=???nL?????f?J?w???
+5R}0<@?t??p??R?q?dE??d?PS??????G?	q7|?N3??|1?rNF{???g_vn?6??????F?%rB???p?3o?'??w??9[7???K??Q????(?<a??????C853;5#?|???8$??O?6t?d?S??`?W9??is.????9t)?????????iGr0?e??{t?	????-?{1?`V-{@?3e??h?4?????j?
+?v??4
+GD ????????????O??:????e?8i*??@XLB2'?E?'??>?&3???3?
+?_yK??bU$?n?k??????a5f??67B??]n????hm?M?r8?^S^???W?%??m?{???%?y?=>}??n????6%5*s@|D?k*????[u??'??/??U????R?#E??i?z%s1??????'??x?d???????>?df?S????.%??????:??X???? 
+yKg???4V??k??Za???zF??^???lL?U$?P?]??)?j<thV????9?h?N????????O??
+WL_??????	@? ??????s?8?A????m?~??>c??QiV?S?1#? =???????MC????!??;!?p??/??9?????*?`B<?nq`??:?.?Dp??2?XP???F2"????'?>?'??4???$'?|r??\%?V?t?^?Q^Tz^IO)t2n?d?IT*??Q?8Hg???K?3tH???b DzIP?DY8
+R??[? O1M?5?%M_^??kRa?:t2th5`?@??}
+???^?I??q
+????u?6?G????/j?t??t?F?=6????~???}??vl->m?????>2???mKa}???oX???pr???AI??s??i?nh?q??HQ?'M???Q"??q?tG?Z}N??k??k[/&??s^6^r??1??}????]Ux????c????;??o????????N??6?1???????????O??sI?
+?Z???$???0uAn????U?VJ?l???p?????4?????6?r???P???ukW???k???e?
+)?"??H??
+???Z?w.c at 4^,?Z??{??Q??4?2???????????M?
+?d????#?2?F????|?????i?
+????'^???i???l???I?
+O?ck??0k?r??
+??8J;:???K?f??78-???M??????t?$????ZIQ???????Js????1?!?-????s2[?v??,?^K2???@?B????
+???????????^x?(??#?/?????????>????i???(????n?BA??:???bh|?L???(H?^!1??????6???v?P??`?	yEa??:??~H?A(,i<^???[???<\i?6??m??
+??A??qF
+n?$???"u;?GZ24?N?>?\?"?fs??9g?(???mE7???.6"?f?_t??FpJ??x`#<C?t?D?b>???????Z-???}e(???jH??
+??????8??9R?U???y??E%???b??D:?'<5?'?J??-q6???dA?`~'????nB?????\??.z/???e??t??????? ?????I??y?????y?9o"m<k?`?/???/?s???S???G?+
+??E?M??F'?Y??n??$?r_N5?.q?G?8?A??M??N?????Vp?-C??????1????VUZ????l?8?w at v,xM+??? F)??~}????M?@?|6?J}?X	?z?=?@??"]???`????-?????K}-?_~:,"???????KG|;?7?c}??K?/??;??o<??v????|?jyQ>V????u?C?2c??q???uU8?2f"????????;?x???#B5Z?MV?v???E?rjvtL(?d]?
+??????????\?)?f??-9?????'?F??R?????76?0,OS? *{4?T?
+QM]k8?????
+-?????}?7?m??`??c??q??Nod?kx?aM??	P??5?????<$Q???2?X???O????1k?y?2;??
+h~8_??yC??'??}???j?3??^AM?[???x???J'O???>?z?7{???D$?9?*?-?(s??"8>??J?TA??Z
+o??$'s?????n}R???????d???GB;H?{!?????i???U?.(HMX???a???Dy\??????????Cp???]?@Z?????v?????????v??	??z????z?M?=?/kH??-?r?\???o<??9?????g?4??	)??-??????o???6???"$,Mt??x?????u
+??h????k5??????{?O		5?????
+?c?Lqb*G?????0?P%
+-?????_?|?d???????q??????_>???\&?DUV?cW???.??S????0[C"?#?}??Bi(???p?
+?F???????q???7???ew???????j?O?{?MwL?????>?????G'a?s?ucg_8???N?????????!?^???.|????k?????U??!??V-?{??????]??*????S?,?>??G?????_,?m???>????g<ez??%??g?9fB???yEu?????cA??????>kL?)-???O??2pP??wN?H??????;&??x?k/????A?C?@????)????8wb?????m?????U??Tw??2????Ms?????}???Cc?Re??j<P??%?%?1=????????p+?|?m???4]q??2":????W????y{?Hf???g?w????????3?????2???U?O2?????e??+
+}??????25?0>1+?];J??7?"?Ap$>!"?lXx?A#c??(bBC?>?Uw??N?<s????KvL=m?u?yct
+?F0????????X*?x?Ft??j??????
+?7??4-\???s	?|j?[????^V\???p?d?Jm?x??jN????d?o?w?H?tD???L??????????K%o??j???YYn?????ED?U;6? "??????i]	?l4??3?eD???-0?4?????????e?????????>o\????![^??o;?
+?????6?m	q8??X_????????+8~}??&?(w???????_????????r?????xi?>v^s?
+x???g?{?????
+??O?F?3 ?????-????j?~?e?D???P??[???F}t?Teu|%?c??m?~X??1?/?2'??????{?eF?	??8?????????_??????8?dn{?????-????W?hH?\N?i?+x?=?4W???T?5y??m-???3u?????????O?Zc?????t??~??2e?- ;#?s??????106?Q87vWp96?)??'6ZN_N?x????(?*P&SJ?$p??i?
+
+?o0????m?9%???"Tek?ou??|e?`V"?72???ry?T??rS?????&[y?4Gz?????tL
+??
+w
+??=B\m?t?s???V?U?&m????v?V???I0{W?,j?^?}O????I???rm?6J???????77?W??%m=%&??<??-+?P???a?ym?;/%??{??????(8l??iC?l?&?b????_w[???K??;??1?~J??v??????????????Mk?w=n??????6??Y????????]??3??=>\?*&???? ?z???c?PNz
+n?D2?$u?B?R?PG`?2{zyz3b??kVm?`?^??CL??f????j]?P?pn??	?]?5o`?~?R??2m??Jz?q?9?D???s!K)HT2?????\I?K??p?L
+!^>?Y???? ?o???=5cQd?G?Am???G?? ?e?UF?W??
+/???0??x??
+{?uOK?G??VU??%??Z??|???6??#???&??J{?V?D4????f??Dsj?D????Go????v?So????]?o?
+8??????%)??c??-Aau?))?'???&?E??x??bH?DE&??yY?r???J'???A?j0.?.*B(q???	?1<Z??e??/?*??cA???f)+)????PW?H?????qhV?n??????l??q?@s?d/{??3@?{????????2????M?A????????d?wf#8U?????(????a;v?d????j?K??mN?v????4??Z?h?y'?? '??????w?O??
+b?D?\~????v,???????-?'<?u?M??x????{??.????????????????3??_|(-1????#?/?????>?#?8Z????L???ks3???"q??????^???Y?N?>??ai???s???a??/>??)'R0????,??1?7q???_}P?????9?\;x?d?]?Dn6.?@?_j?6f\?M?????:???????????l????Q6??4?8?G/L?W????JL??h?R??Rd/?&	???'?jn????.????^y?????~??j??????)??]???C(D?????#6'????a??k`??sb?{yI	???a?`;a?j?wn9?kKYI?F?O??????g?$???mH???????U???3'-???_fr?????
+?H+?????????Qn???>5a??R???E?T????~??/?8b???^????~??~??I???o???g??????????pA???t?Ux`}?????+O??9?S??V?	,???t?!??v??????p????!??y?PL`???????$D`?A?8&???b???V?M??????A??<?!H???J???$C?O]4?L?????8u"?<?????YW????~?!?6??G?i5(???|?y?r??9??????y?<????????^{j?????QXQ?I???r???1??IZf??~??3???o???>y30$b?K??F?|??ko>q?O??V????.?Z?\???j?
+?'Q??h???????
+B^@?	J?"?j??????p??#??0
+??|?3?jP??l@?3^?=&???O??5??l?(Kuh?a?A?????R,/&o|0?9'B?K?S_?^???	%j??>????f??Z???
+*??OV??y???0CWS%
+??VG?????m?'?9???K??L?,????	????Gt??
+?
+;??O???????_pxQ~6?}Px?PZ8?g??mh?6?w?r6???u???}??6?v?;?J$?????????1|???%a
+g??o??(????([???~????:??a'??5??-???H????????~tA?????a?B\????v?U???H??<???r???w????qX)?????????S??q????J?????%?b%28??b????p??fd?M???
+?"??q?.J??u?&0??E??_??x???>c&&"?0u???a%??yW?2q??8?
+???????s???????7e?&nZ????^????X?B#??8-(<z??
+?^y??~???>????}??#7???????>?????-?4D??/?????w???~L?n>v?????????9K????}??*??????+8??d0??U??D?%?????B??&????,"Og?Ug?{???M????]??6G;?Z?P&k?^m?V?!??
+?_t?????f????I???_I????W?
+1??d?\n?k?????????FD??U?? ??;?&???.QR/N?`???R???Z?.??	 O????o??????s>8,??U??fR?^=&:Vv*??D @?J?T?)%?&3N?????q?? [?>@??G?-6??8??P?"?F'|????Z??-???SD??%-?0?+'?7<~x?xtdS(?>?? ?T?TDGKGT??i?o??
+?#????M?jk?\"?UV?K 2=R??RkI/?$Oy=???NK??Y??FK#???????A?X?Ei????<??6w]??R???	6?j????6'e?/??$V???????W'?????w???_??f??!????9??Wjs
+'???GO??E?w??bD?????SJK*.?| 1t?^??????/?k
+??+?9*???
+^??N??~^_/_SYI1?????l?????Z??1&??Kf??S|Q??G??	S?????L??,%?xD?7k??%, y@?????-?q?X??][?????Vm4w?????~V|?,H
+?
+ep????W?????%??#:CM@?
+????t]Yo?????%\Gp?K2)???L#n????????io?121?????	%?h?X???=?S??????DI???.?j|3?L?>????Tr??
+?#8B???p+?%@?@????????R??\??}???%?7??
+?
+?@????}?
+?^5t??????qK?pJn??~?}_^2??1 at O?????i??,???IH??d]8????e????????$?]?`???????i?????Y?K<9?,??VQ?#*?wj??[?~`?????g???
+i??y??(?? l
+Zh???q???Nb-?%R??n???h??te??nXaB???8P????e?a??$o??&[?1???H]l?6??%?9'2
+HEDy?0?u??h??????????$??~???????A??>?/?Ol? J,?`?e?0HMh?]*@???????t????????^>?????_:
+??
+?B?Y???k?1#????????
+5M?????????,%?l???*????r????U??,_?{]$'?????????*????????^fc??g??g???X?C:CnP??????z?(?5^?F??	~F???i5"??yWV?,?y???xk???R?????9?7???u???K??c???????+3]?3>??}??c??L?5???^}?1i4
+w'???{"J????i]*9j|4?????f?L?s?"i8Gu?84?f??@????????.??He??J??0?????S?U$n?U?????cB\#??????T?w)I??>?????)?????]?
+
+,?vDa*?m?@yZ??*e?????\_K?X??"?S???L~?=E?????jUm*{??o?????"?9?Ve$%?-h??H????_???1?J???'J	?????U?rd?p#O1?
+w)+?X
+???JL@??;??t
+??u?'Xl?n?*|?d?b?f?b?j?m?H??2????\@?PM@?r/A1????9??D7y?K?i:?DE	??8???????p/??Z2????2?y?
+h???56M\?6????(L?=?>J?'q???96_)	S??KQ???sj????3TqQn9???=????*?????a[
+???????gX????z??@????eZ?!|E$???????lXHy?Nb??lgl&P2?????(??JJ?"B-??h0H9h??J?????R???j??'??o6 W?~?	???#??#*H[?K?y#???E?OL?Xjj????????@S[*????[4?v?$Tb_?????7???*^i.?*?J?/Y??O?%??~?????"@???*Q?4???:??N?Rr@(.O???a6?M?Y?]???????|??????????#?p????M??rC??R??'p?yU???H_?!??5???7j?o????xu?qEC*>?2?j???iB*5l?F????H?m??X?a???'N?>???F?r|XIh-;+Q?he????nN,??rW?AH?????Y7:???R??%??
+G5??0zT??Fg$?$'g?=K?H??|?MLMM???PWC?*????.??$4?????3>??	/:6?Z]??'?#+]?J?Q??N?]?>7?C?g{R^(V?tW???7V??T2r??????M'????X?J?????6?Pn?W???z?I?41}^!:c??????P??>???v;%;)e?*]M1??4E??????v?????6?cwl?>?Z0?.?j?*W/4???[??#Ox|t?Jm7%$?Sk??s?XI????H)=????t?g]?:?J???*n"?W?{]????Wsl?DLKdd???zF,3??&???Ga????@??
+?E?)??OH??a?????!???^?8~??B?4?3?L??
+?.???q?7?D=?vR?-?02?N???1J?????P~@p?Z??0?-??PKU()??cT???t^_?$?_???d?1?1X??q?7?Q?yWLFJ?k??CU&T???0%?yF
+?[x?c??pD{???.?7?I?????^@???A??f?)
+?m?0?????8?1?x?]???????Fm?*??fe?u????S??l??????????S??<?u???`??%S?E?????z@?w$b
+?????O????*?1A??
+~:^r????J??u?ux*?v ??	?P?????)??IZ?0
+??V?.?K??Co??????8)???	FU?1?Z???m???8?'^?(Q?Z?8?n?s?N
+8)?U)
+??R|	&??,?f?m????J??83N?q?e?????%6vu?*.7?????
+?????C?d?e????zz{???&G??x?R???U4?J?*??$[eDot4p????J0???i???5(F??ot??L???LJ???ko9?????
+4?H!E?[?l?d??????:
+T?w?????I ??
+?????????k?Gh???E%???? ???????D???E}??_?^w?N??e{G?
+W??h??!???m?u8yPU2??x?Sv?@WK7??S?????sW????ck??I:?v?;??????y(????]e?J?Z???%???GmkA???;
+???p~^^VJ&???bMOH5??y?
+???????0AF??;????0???a??eE?f/woN???????MF? ??-???L???????C*?	
+??????3??O???
+
+???JJH(?u????FBd\????????
+?h0 0H?c?3r ??????@Ia	??"?xj#?\???j??g???iu?????K at X`pH??)???J????????P??????????Ttv?U??????%
+z?*????;(????\m?O?Y?????.?t???8??	????W??????????Q?????t??????;_q5'=??+]7c??9T|??'??r4v?_0???=??u???3???P??W?D????/?{????????.<k??=???O????q???{q???]???_??I?_u???????#???RY[zE??C/3??_?????o?r?Y?\?????????O?+?V}??e?????w??}#????????????????1???f?e??0y?
+??(?/?"??/?????_?&?_0????y???????|???o{???;
+??6??????Kw???~3??a?CZ??????+?.?M?)?_9r??O?EqLa@??[?}?p???Q?????h????l??P
+????(?0x????????g9?????t??????S??yMuua^w???
+:?i???????5???????????dL????^y?9r?2g?E>&?J?????&???h|?U????;?{???\	;?????????L??[j3??G<???q=??%???m_????????h\j3??F?????????#S???#i	????<?>}?}?*??|h??Il?x??{@??????~?u
+;????
+XGN??ep?????)????bj?<??*m???????{wN?????????(
+Ss?Eg??.??{??????9???z???7?&+%????f?;???????M?O?V[?cYS???{`?R????C?d???a?,h??2??FFA??So]<t?]W????uZ?????n?;Co4@???????	M"?qW?? ??{???3??;?????xZ?z???p??{?D??sG-????x??;??a??u??=P???(i_@6d??
+?fQ?????/????UUh?????J??U???N??~j???`_??????]`"h?s??QR???T)??#?W????'xk?GJ?_?`????W????Q"?.3????@?UH[JL???Ux???????XG?1&:6f??=k~Z????????M?C?
+h???O?x?\\4Z??????9??t??????y????F=??K?/?f??/}?X??????_iv8?Z??b???3????;V|???_??n9u,?????a?
+&?
+??+?Fq?<*?:??R1t?Hu?_o]?????D????%&7i??@???ZN???d}???H?u^MPU?JB}??8???-????????#Zsu??ZhM?@??S$/9Vt?O
+???6L	???N??tVr???G???????D??.?C??1[&?=??k????eX?r?????q??Y?tP?????<?
+???)c????7!?w?????]???b?c?????I????i?^2y?a??>??g??Mfa?>s<wc??]?'?f??d??@`???.M?O????0?????p?????$?"p???W?+_?????,???????????u?O?N?o??????x?N:??}??????????tl;-l?Y??R?G?????@????????L?d?0?lq?????0??~?\r 6??6????z???>x?-ID???/?I#0w=??1??3?g\??=<<?|??d??i5vmYk?5???t??@IdL???.?????|?e?<??????????,??a^??
+?8?+3?r??!22j?c?{???C??>?VdL?^?z????{??%_?'?? Qq8??K???_:4?E???0*9!I?????q????\?^????????????n???N?????.?????????u????1?W?ck?u??:????D?F?w???)?w?N????	?Gt"??????&?~	?2++3?@J~6n??h????Q
+?,.(B
+~?L?????R?O??????b?k
+??D???@?]???*???K?o?S??????x-|?????6??E?+????I>D??9\??P???+|?
+VJZ?????M>?%??@?Qx?qE?t??y/5??(;??Tk	L?O/0?pLd?[?'?H????RW ?G{#T?O?
+???c????K8&_?$(#?H at L?&?t?3JN?s'??v?V????H"IIGR??H-?&?.K???n??Jr????[?&2s,Y7?u??U?????????8/g??`????ob3?????h??'?!0???o??Z?ZX)g?Y?J^?R?????VDw??z
+?0?U?}????"?`???????~;?WW???+vp???S??R???????????i????J]?????l?n?!F	?U<0?`%??1%?)?	S?>d?K%0?O?{??????/1Zl????#???)k[?a??kZ?vf?a*W~?+:?[???Wl???AI?5'????o1???bW?J&?
+VrRe?R?????q"f?.??qdT??|?_???
+<C?P{?D?D!?w
+P????g???;k??>?a1k??????????&??{?aKU??zp0`???M??t#Rv???0????&s?J9Vvz?T???c???T?>N?l?>???>~?8*
+?r"?R???Sw?/k?z???3t??r?B>?4?Fy?3	zTs???)C/?????????X^f?????t???P?Q1;?'??0r?\?u????L???\?:B???E'7?????#)	>?*?^???????.??rr?lT>?G?0?ZE?0?@[;ug??@
+?
++9l&Q?Oq??	Q9??4A1???Q?????/_?A~?-??
+>m\j???G??N????}??{s3r.?????N??[?*2~8??o<?2??7=u?z??HNu?D???y? ????t????q?>???K?9{??n[?m???????O???#????}/
+~?tLT/P???~?l?muM.J???Ya?
+?+"J?s/9?(*`%1???8????/{X????u??vm?
+ at M?N??????
+t*??S??I?-[6??@a?kn???^?????q??????x^}?
+}??????BpA:?#?????J???"?a??h?"???"?`???8LC?b??6?????+&yB???Q???T4?1s????}??!?Z~????|*??=?gx??	?V^:j????Z??+;?yN	?p?????	???????gV?bA??w?z???n??nk
+?>$??<N???ns h?|f`??q??<????????v?p1D?c?????O;|S??\???4?
+E?B???u??i?)?n?????K??Nx?????[1?w??*??X??????????H.??e?|???EO?o?????L????c????t
+3TbYFZ???6?'??F??3?4?QcW?9,[?-??#?W?z??0k?u????o?K,2bJN8g????????a?79?9???4?????????^???Z[?g?;	?????`Kx?H^c?P?yxWq?3??Y??????RVV?nv?@c)????e2?!J?(1??l????????!?>????[_????YW?
+??j???
+`Z+?V7?????????????{???$N?Cy??z????f???6??G???=?-????Y?????I{7?1f???L|????4/?v??	?$zIN?k^???I5H?YE?a.?U???JHO1??>?(?>r??D???
+&P???>;c?????'???????????J????m???e??????~e4?D??Z?????}?\dt7?,|??q?q%p=A?4??K?3???w?z???#{??$??[n?z5-'G??yJgj_w??!dG???q?????????>??Ow39?Uc???CNDb??1p'?"+?????????ON????f?v?(ooo?#???X?1I?]???5??@??UO??+6<{???~????k~X?Q????H??g???|??m?6??Q???[??????q[??????????3????9????;t?_[?S3G?5^FB?C?????????[.p?=???????=????!??g?GFD??XP?w?m????r I?b
+7.K?;
+??d{b{<b?DG]>??+[F\???????\??6??,?u+??~?|N?mD??g???r??_??b??!?F?????)z????=??k?v?"????s?
+????????q?,q?\?ItD7F???4??????o??Q??>??????????g?{?1????}?M?;?????gO?Q?[F?S??7?WQa!Gxr
+????:RB??????????????	???V??UZ# ?s???#?Y
+ n?K~f?r??|??b]??RK	:P??? x?3???J??!Np?:?}?g??b:G???G_?
+H\?B?????????\?6XH?.??(!G???;??^4HZ????);??3A7;PRRn=?ls4????)?S?NC???2?????"?))+??G~S@???E?A???e??}?M
+???IZ;???2???Jy????E???R?1?*?iK?15|?o6??{?|??k???????|????!:]r???n}??[UUW??a6{
+??c?VND?????c???\???E?Y???;?HWl>?J???pi??x?;???????JU????~????r?Gf??cG???uz?|YW?2!kk????^R?v8?|??O!???K|q?=?????D<'b&k???fEeki??#F?q?4?s??YiYf?[??=p??HJ????Yt???F?i??]x????5s?D??V??,??#1?*??#??Bw?`?^R??%*?Q???>/g?I???
+0????\C`?????oz???{??????Dj?T?G>????KR?%?v?T???vR?x) !	???0??)^F??2????u?b??"?7?|???R??l??&r??i6?%g?(????8f????????y?]??i?????/-??g???q;?G?0?)G??GD-z??w?x{7???,~???#???X9x?04Yv?+??/??????? ????b?n&??6p?P??v?a????5??7???????*h?MAh!y0??8)??I?F?v?Fg?D&Z?U<GB4???i"?????K
+T????^??1_????Z?2fMw???\???xIA1&ou?v???85?L???-,??m???8??i?D??i???M?\????C?Vq?B?	?
+H$:??Q??e????t?o$?kG?#v0?????i?????G?0?9?????
+4B?
+???*y[?M????c8?r?U*?j??klA?4????tbe????
+<??4?7"<;??\h?-?Y]v?B???dh>??Q#???8:???lP?n[????~?>?`?m????z???w??A&?:_?vg?7n?H??0??E??????v????
+??f?????O'?????KIYI~??????x??J9?K???Ho????N?5JINQ??=????A
+???^Q?IYaI?Ux????o?N??T5?)Pi?(-(??U????b?w?*>4k)*??J6E	z????2??r
+?
+??z?a?????(/???sm??#3??E??R).c'>^#?N?:U??????rF|?.?-?Mz9?>?~?Rd?x?(?,?8%???r??([pC?2x???
+K?R?B??rWM?u~RH
+kI9?kl???
+???^??O?E?y????^.?+q{???k,????=F??;m????w???UK?2???&?o?}}~J????h???7?`6?Tnb?G?w`?` ?{???????5?)Y?=?F?<m???Rv$????;??I???Z??O?_vB???:|???8?:uO????	??UF??>8*,+%c???
+}??????>?
+??????4????vF???f??B+
+???fPt?UCB?F?F)?t]???P?)?7?J?($!????O??l?,Sl?&?G??M?1e?;FCm}?n???M^???:?#ym????j??????N)??Y??o?qQz7C?????1#fM???????9???????????3??<?I?l]?a?E??B???u??=?3C??????L??,???~???u?G?;????,F_r????0?g???*mg???c???}7??6co??W??????_aF???%?'?w?3???{??["??g'g???wp3$&r???[~Xw?u??/???;|?xKi)???j+?f??!?1#?$n?w?"\f?3??)C?????????'
+n4uGB?)CN???@????C?	?o?fuY~???3????^?:??A?????r???!????????SN???uS?N????S???I)Dq?+???t/?v`@G?	nbRC
+!?lo?D-pp?>KQ????6M?89??l?<}?N?3x??7??????????;??????
+???^??7F?V?n?i???4|Z???iz??1a1Q????M?3T?W??!1?D?b????y0??A!?x>X?????????m?fw?@???v<c?Qg??
+?:?????Mp?1c???>?9?Y?6?3?c??B`??JK????n!???????UVV/??7"???A?	???.??V???>V??ZTP?B???9??[8sX??????zz?{{2????????h?K?a*Up?????
+???btW??#?vZ??f????l?e??6	?#?)?M?6?u??	??G???ls??????
+v?q???4?{????
+.??(~?&S??????A?????#??Ve-?+???D??puU?????y??_158:? +???	PVT?
+Rsz??K????????S??e??????.A?Xb???W?/???h??O??R6?~?.(L{?B?????"??U???5v?/?V,Y???????,?2??lT???????????a??w????V???;???P??q??W?o??hNSw%??F?????????U?/??>k?????9H*;???vn?|
+2b?ai??m?r:g?]?W'Vv?-bM?*Z?f??.?H????zn??????~??V?Z<5x?F??i?
+?&O3@?S\7?w?????O??	?S???0???a2??9i??(??(??q?+?gl?T-?*0y??????'??W?wE?
+?h??????WG????<?5:???m?u3??lqR?j*??v?w??*K???=F??*&?8??????Fi]t???cgM??k?K_
+:g&L1?XJJ???L?.CM??7(&??K?<}???
+3??}=u.Z?F???S?;6????*??=??;9sD?o?}??????~?Z??X??AT??V?:??A????_R???Hl??P'???%??5??O??:?????S?=a??b?7|?r?_??(a?b??	?????????????kv??|JeU%,X??}`???`?????L??h??
+?	?]???????:??????Ox
+?L?~?A?>4y?A??So??JA??!?0g?M????????????3?;C8?V?O??n^??w?{m??D??*Y?]??
+????hP?????t6w??<???_?Y??)???????7??%2 z~?3?
+/?#????52?@L%??K?v
+?>?	????????Z='???????:l??V?\???1!EY?RKs????????r
+?{?y??
+?5r?i&73?f3?`r ???????2?h?i????)X?CzFP?????y?x[?K5zo`lb???}y??e?Ke<X?i??b?_?'?`?RCf?v??????3Kb?c%n=?H?\5??O??????#[UA
+V???3?Yp?u???/
+@????t????~"???78%?v?9??6???7d???2>,???(`???fs?
+??G????0/ul"?,??H?V[>?????\?]P?FxT?Vi\??`??????}??qUj??)?%?,?C????80? ?3r,'+????R@?U??L????h?~<B? [?$???5Z?????g>vd??? Ss??????dT?QD8oA??*I????nI_??S?<Zp??	????*?c&"-b|?0g7?
+???E-?@??9?|??18hh?????C1???%??;vdo???d??H
+?#?z???? ?}??Q?????%{G?i/f?Dy{?ZW6?b/?N?()?8??I??=%)?*?w??4??hX??4??qx?HpDz
+???*???4????O?U??l???LIHB?7??B?D???i??%?s??M??^%?dB%??O@D?I?.4g^?2]?N?+??V??G]???0T?*?P?`?UYQ?????*?m??j??????!?vb???r?O??>U?'v?":`?Y???D
+???D R|?*?????PL?!A?G"?}<((??~?P?	?q?~???:????Cp?k??????1?XZT?
+?
+?=^??
+I??'l????H]??????)O'V??K?? a?A??0?@?UQN??w?tR?c(???????'?8?)?%??'6	??wR?I?S??y??%????
\ No newline at end of file



From dna-commits at lists.jboss.org  Tue Jun  9 14:48:18 2009
From: dna-commits at lists.jboss.org (dna-commits at lists.jboss.org)
Date: Tue, 09 Jun 2009 14:48:18 -0400
Subject: [dna-commits] DNA SVN: r1016 -
	trunk/docs/reference/src/main/docbook/en-US.
Message-ID: <E1ME6Ms-0004Ra-CZ@committer01.frg.pub.inap.atl.jboss.com>

Author: bcarothers
Date: 2009-06-09 14:48:18 -0400 (Tue, 09 Jun 2009)
New Revision: 1016

Modified:
   trunk/docs/reference/src/main/docbook/en-US/master.xml
Log:
Removed chapter on Deploying DNA JCR from this version

Modified: trunk/docs/reference/src/main/docbook/en-US/master.xml
===================================================================
--- trunk/docs/reference/src/main/docbook/en-US/master.xml	2009-06-09 18:39:03 UTC (rev 1015)
+++ trunk/docs/reference/src/main/docbook/en-US/master.xml	2009-06-09 18:48:18 UTC (rev 1016)
@@ -97,7 +97,7 @@
 			</para>
 		</partintro>
   	<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/deploying_dna_jcr.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>
 	<part id="provied-connectors-part">



From dna-commits at lists.jboss.org  Tue Jun  9 15:46:34 2009
From: dna-commits at lists.jboss.org (dna-commits at lists.jboss.org)
Date: Tue, 09 Jun 2009 15:46:34 -0400
Subject: [dna-commits] DNA SVN: r1017 - in
	trunk/docs/reference/src/main/docbook/en-US: content/core and
	1 other directory.
Message-ID: <E1ME7HG-0006oy-N3@committer01.frg.pub.inap.atl.jboss.com>

Author: rhauch
Date: 2009-06-09 15:46:34 -0400 (Tue, 09 Jun 2009)
New Revision: 1017

Removed:
   trunk/docs/reference/src/main/docbook/en-US/content/core/configuration.xml
Modified:
   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/custom.dtd
   trunk/docs/reference/src/main/docbook/en-US/master.xml
Log:
Updated the sequencing chapter of the Reference Guide.

Deleted: trunk/docs/reference/src/main/docbook/en-US/content/core/configuration.xml
===================================================================
--- trunk/docs/reference/src/main/docbook/en-US/content/core/configuration.xml	2009-06-09 18:48:18 UTC (rev 1016)
+++ trunk/docs/reference/src/main/docbook/en-US/content/core/configuration.xml	2009-06-09 19:46:34 UTC (rev 1017)
@@ -1,371 +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
-  -->
-<!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="configuration">
-  <title>Configuring and Using JBoss DNA</title>
-	<para>Using JBoss DNA within your application is actually quite straightforward.  As you'll see in this chapter,
-		the first step is setting up JBoss DNA and starting the <code>JcrEngine</code>.  After that, you obtain the
-		<code>javax.jcr.Repository</code> instance for a named repository and just use the standard JCR API throughout your
-		application.
-	</para>
-	<sect1 id="jcr_engine">
-		<title>JBoss DNA's JcrEngine</title>
-		<para>
-			JBoss DNA encapsulates everything necessary to run one or more JCR repositories into a single &JcrEngine; instance.
-			This includes all underlying repository sources, the pools of connections to the sources, the sequencers,
-			the MIME type detector(s), and the &Repository; implementations.
-		</para>
-		<para>
-			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 = ...
-JcrEngine engine = config.build();
-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>
-		<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>
-		<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)
-			present at the time of the <code>shutdown()</code> call will be allowed to finish.  
-			In essence, <code>shutdown()</code> is a <emphasis>graceful</emphasis> request, and since it may take some time to complete,
-			you can wait until the shutdown has completed by simply calling <code>awaitTermination(...)</code> as shown above.
-			This method will block until the engine has indeed shutdown or until the supplied time duration has passed (whichever comes first).
-			And, yes, you can call the <code>awaitTermination(...)</code> method repeatedly if needed.
-		</para>
-	</sect1>
-	<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:
-			<itemizedlist>
-				<listitem>
-					<para><emphasis role="strong"><code>Repository sources</code></emphasis> are the POJO objects that each describe a particular
-					location where content is stored.  Each repository source object is an instance of a JBoss DNA connector, and is configured
-					with the properties that particular source.  JBoss DNA's &RepositorySource; classes are analogous to JDBC's &DataSource; classes -
-					they are implemented by specific connectors (aka, "drivers") for specific kinds of repository sources (aka, "databases").
-					Similarly, a &RepositorySource; instance is analogous to a &DataSource; instance, with bean properties for each configurable
-					parameter.  Therefore, each repository source definition must supply the name of the &RepositorySource; class, any
-					bean properties, and, optionally, the classpath that should be used to load the class. </para>
-				</listitem>
-				<listitem>
-					<para><emphasis role="strong"><code>Repositories</code></emphasis> define the JCR repositories that are available.  Each
-					repository has a unique name that is used to obtain the &Repository; instance from the &JcrEngine;'s <code>getRepository(String)</code>
-					method, but each repository definition also can include the predefined namespaces (other than those automatically defined by
-					JBoss DNA), various options, and the node types that are to be available in the repository without explicit registration
-					through the JCR API.</para>
-				</listitem>
-				<listitem>
-					<para><emphasis role="strong"><code>Sequencers</code></emphasis> define the particular sequencers that are available for use.
-					Each sequencer definition provides the path expressions governing which nodes in the repository should be sequenced when those nodes change,
-					and where the resulting output generated by the sequencer should be placed.  The definition also must state the name of 
-					the sequencer class, any bean properties and, optionally, the classpath that should be used to load the class.</para>
-				</listitem>
-				<listitem>
-					<para><emphasis role="strong"><code>MIME type detectors</code></emphasis> define the particular MIME type detector(s) that should
-					be made available.  A MIME type detector does exactly what the name implies: it attempts to determine the MIME type given a
-					"filename" and contents.  JBoss DNA automatically uses a detector that uses the file extension to identify the MIME type,
-					but also provides an implementation that uses an external library to identify the MIME type based upon the contents.
-					The definition must state the name of the detector class, any bean properties and, optionally, the classpath that should 
-					be used to load the class.</para>
-				</listitem>
-			</itemizedlist>
-		</para>
-		<para>
-			There really are three options:
-			<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>
-				</listitem>
-				<listitem>
-					<para><emphasis role="strong"><code>Load 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>
-				</listitem>
-				<listitem>
-					<para><emphasis role="strong"><code>Programmatic configuration</code></emphasis> is always possible, even if the configuration is loaded
-					from a file or repository.  Using the &JcrConfiguration;'s API, you can define (or update or remove) all of the definitions that make
-					up a configuration.</para>
-				</listitem>
-			</itemizedlist>
-		</para>
-		<para>
-			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>
-			<para>
-				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>
-			<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.  
-			</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 &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
-				this second parameter is very useful.)
-			</para>
-			<para>
-				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"?>
-<configuration xmlns="http://www.jboss.org/dna/1.0" xmlns:jcr="http://www.jcp.org/jcr/1.0">
-	  <!-- 
-	  Define the JCR repositories 
-	  -->
-	  <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">
-	          <options jcr:primaryType="dna:options"/>
-	              <jaasLoginConfigName jcr:primaryType="dna:option" dna:value="dna-jcr"/>
-	          </options>
-	      </dna:repository>
-	  </dna:repositories>
-    <!-- 
-    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">
-            <!-- Define the name of the workspace used by default.  Optional, but convenient. -->
-            <defaultWorkspaceName>workspace2</defaultWorkspaceName>
-        </dna:source>
-    </dna:sources>
-    <!-- 
-    Define the sequencers. This is an optional section. For this example, we're not using any sequencers. 
-    -->
-    <dna:sequencers>
-        <!--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>
-    <dna:mimeTypeDetectors>
-        <dna:mimeTypeDetector jcr:name="Detector" dna:description="Standard extension-based MIME type detector"/>
-    </dna:mimeTypeDetectors>
-</configuration>
- ]]></programlisting>
-		</sect2>
-		<sect2 id="loading_from_repository">
-			<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>
-				method:
-			</para>
-    	<programlisting role="JAVA"><![CDATA[
-RepositorySource configSource = ...
-JcrConfiguration config = new JcrConfiguration();
-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;.
-				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.)
-			</para>
-		</sect2>
-		<sect2 id="programmatic_configuration">
-			<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
-				dynamic information.
-			</para>
-			<para>
-				The &JcrConfiguration; class was designed to have an easy-to-use API that makes it easy to configure each of the different kinds of
-				components, especially when using an IDE with code completion.  Here are several examples:
-			</para>
-			<sect3 id="programmatically_configuring_sources">
-				<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>
-    		<programlisting role="JAVA"><![CDATA[
-JcrConfiguration config = ...
-config.repositorySource("source A")
-      .usingClass(InMemoryRepositorySource.class)
-      .setDescription("The repository for our content")
-      .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.
-					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>
-				<note>
-					<para>Each time <code>repositorySource(String)</code> is called, it will either load the existing definition with the supplied
-					name or will create a new definition if one does not already exist.  To remove a definition, simply call <code>remove()</code>
-					on the result of <code>repositorySource(String)</code>.
-					The set of existing definitions can be accessed with the <code>repositorySources()</code> method.
-					</para>
-				</note>
-			</sect3>
-			<sect3 id="programmatically_configuring_repositories">
-				<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 = ...
-config.repository("repository A")
-      .addNodeTypes("myCustomNodeTypes.cnd")
-      .setSource("source 1")
-      .registerNamespace("acme","http://www.example.com/acme")
-      .setOption(JcrRepository.Option.JAAS_LOGIN_CONFIG_NAME, "dna-jcr");
- ]]></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
-					that will be made available when the repository is accessed.  It also defines the "http://www.example.com/acme" namespace,
-					and finally sets the "JAAS_LOGIN_CONFIG_NAME" option to define the name	of the JAAS login configuration that should be used by 
-					the JBoss DNA repository.
-				</para>
-				<note>
-					<para>Each time <code>repository(String)</code> is called, it will either load the existing definition with the supplied
-					name or will create a new definition if one does not already exist.  To remove a definition, simply call <code>remove()</code>
-					on the result of <code>repository(String)</code>.
-					The set of existing definitions can be accessed with the <code>repositories()</code> method.
-					</para>
-				</note>
-			</sect3>
-			<sect3 id="programmatically_configuring_sequencers">
-				<title>Sequencers</title>
-				<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 = ...
-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>
-				<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 
-					"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.)
-					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>
-				<note>
-					<para>Each time <code>sequencer(String)</code> is called, it will either load the existing definition with the supplied
-					name or will create a new definition if one does not already exist.  To remove a definition, simply call <code>remove()</code>
-					on the result of <code>sequencer(String)</code>.
-					The set of existing definitions can be accessed with the <code>sequencers()</code> method.
-					</para>
-				</note>
-			</sect3>
-			<sect3 id="programmatically_configuring_mime_type_detectors">
-				<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 = ...
-config.mimeTypeDetector("Extension Detector")
-      .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).
-				</para>
-				<note>
-					<para>Each time <code>mimeTypeDetector(String)</code> is called, it will either load the existing definition with the supplied
-					name or will create a new definition if one does not already exist.  To remove a definition, simply call <code>remove()</code>
-					on the result of <code>mimeTypeDetector(String)</code>.  
-					The set of existing definitions can be accessed with the <code>mimeTypeDetectors()</code> method.
-					</para>
-				</note>
-			</sect3>
-		</sect2>
-	</sect1>
-	<sect1 id="using_dna_whats_next">
-		<title>What's next</title>
-		<para>
-			This chapter outline how you configure JBoss DNA, how you then access a <code>javax.jcr.Repository</code> instance,
-			and use the standard JCR API to interact with the repository. The
-			<link linkend="downloading_and_running">next chapter </link> walks you through downloading
-			and running the JBoss DNA examples. 
-		</para>
-	</sect1>
-</chapter>

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	2009-06-09 18:48:18 UTC (rev 1016)
+++ trunk/docs/reference/src/main/docbook/en-US/content/core/connector.xml	2009-06-09 19:46:34 UTC (rev 1017)
@@ -260,6 +260,7 @@
 				As for testing, you probably will want to add more dependencies, such as those listed here:
 			</para>
 			<programlisting role="XML"><![CDATA[
+<!-- DNA-related unit testing utilities and classes -->
 <dependency>
   <groupId>org.jboss.dna</groupId>
   <artifactId>dna-graph</artifactId>

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	2009-06-09 18:48:18 UTC (rev 1016)
+++ trunk/docs/reference/src/main/docbook/en-US/content/core/sequencing.xml	2009-06-09 19:46:34 UTC (rev 1017)
@@ -30,229 +30,233 @@
 ]>
 <chapter id="sequencing_framework">
   <title>Sequencing framework</title>
-	<para>As we've mentioned before, JBoss DNA is able to work with existing JCR repositories.  Your client applications
-  	make changes to the information in those repositories, and JBoss DNA automatically uses its sequencers to extract
-  	additional information from the uploaded files.</para>
 	<para>
-		This chapter discusses the sequencing features of JBoss DNA and the components that are involved.
+		Many repositories are used (at least in part) to manage files and other artifacts, including 
+		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 
+		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>
-  <sect1 id="sequencing-service">
-    <title>Sequencing Service</title>
-		<para>The JBoss DNA <emphasis>sequencing service</emphasis> is the component that manages the <emphasis>sequencers</emphasis>, 
-			reacting to changes in JCR repositories and then running the appropriate sequencers.
-      This involves processing the changes on a node, determining which (if any) sequencers should be run on that node,
-      and for each sequencer constructing the execution environment, calling the sequencer, and saving the information
-      generated by the sequencer.</para>
-		<note>
-			<para>Configuring JBoss DNA services is a bit more manual than is ideal. As you'll see, JBoss DNA uses dependency
-	      injection to allow a great deal of flexibility in how it can be configured and customized. But this flexibility
-	      makes it more difficult for you to use.  We understand this, and will soon provide a much easier way to set up 
-				and manage JBoss DNA.  Current plans are to use the <ulink url="http://www.jboss.org/jbossmc">JBoss Microcontainer</ulink>
-				along with a configuration repository.</para>
-		</note>
-		<para>To set up the sequencing service, an instance is created, and dependent components are injected into
-      the object.  This includes among other things:
-			<itemizedlist>
-				<listitem>
-					<para>An <emphasis>execution context</emphasis> that defines the context in which the service runs, including
-			        a factory for JCR sessions given names of the repository and workspace.  This factory must be configured,
-			        and is how JBoss DNA knows about your JCR repositories and how to connect to them.  More on this a bit later.</para>
-				</listitem>
-				<listitem>
-					<para>An optional <emphasis>factory for class loaders</emphasis> used to load sequencers.  If no factory is supplied,
-			        the service uses the current thread's context class loader (or if that is null, the class loader that loaded the
-			        sequencing service class).</para>
-				</listitem>
-				<listitem>
-					<para>An &ExecutorService; used to execute the sequencing activites.  If none
-			        is supplied, a new single-threaded executor is created by calling <code>Executors.newSingleThreadExecutor()</code>.
-			        (This can easily be changed by subclassing and overriding the <code>SequencerService.createDefaultExecutorService()</code> method.)</para>
-				</listitem>
-				<listitem>
-					<para>Filters for sequencers and events.  By default, all sequencers are considered for "node added", "property added"
-			        and "property changed" events.</para>
-				</listitem>
-			</itemizedlist>
-    </para>
-		<para>As mentioned above, the &JcrExecutionContext; provides access to a &SessionFactory; that is used
-      by JBoss DNA to establish sessions to your JCR repositories.  Two implementations are available:
-			<itemizedlist>
-				<listitem>
-					<para>The &JndiSessionFactory;> looks up JCR &Repository; instances in JNDI using
-			          names that are supplied when creating sessions.  This implementation also has methods to set the
-			          JCR &Credentials; for a given workspace name.</para>
-				</listitem>
-				<listitem>
-					<para>The &SimpleSessionFactory; has methods to register the JCR &Repository; instances
-			          with names, as well as methods to set the JCR &Credentials; for a given workspace name.</para>
-				</listitem>
-			</itemizedlist>
-      You can use the &JcrExecutionContext; and use one of these &SessionFactory; implementations or another
-      implementation that you provide.</para>
-		<para>Here's an example of how to instantiate and configure the &SequencingService;:</para>
+  <sect1 id="sequencers">
+    <title>Sequencers</title>
+		<para>
+			Sequencers are just POJOs that implement a specific interface, and their job is to process a stream of
+			data (supplied by JBoss DNA) to extract meaningful content that usually takes the form of a structured graph.  
+			Exactly what content is up to each sequencer
+			implementation.  For example, JBoss DNA comes with an <link linkend="image-sequencer">image sequencer</link>
+			that extracts the simple metadata from different kinds of image files (e.g., JPEG, GIF, PNG, etc.).
+			Another example is the <link linkend="cnd-sequencer">Compact Node Definition (CND) sequencer</link> 
+			that processes the CND files to extract and produce a structured representation of the node type definitions,
+			property definitions, and child node definitions contained within the file.
+		</para>
+		<para>
+			Sequencers are configured to identify the kinds of nodes that the sequencers can work against.
+			When content in the repository changes, JBoss DNA looks to see which (if any) sequencers might be able
+			to run on the changed content.  If any sequencer configurations do match, those sequencers are run
+			against the content, and the structured graph output of the sequencers is then written back into the repository
+			(at a location dictated by the sequencer configuration).  And once that information is in the repository,
+			it can be easily found and accessed via the standard JCR API.
+		</para>
+		<para>
+			In other words, JBoss DNA uses sequencers to help you extract more meaning from the artifacts you already
+			are managing, and makes it much easier for applications to find and use all that valuable information.
+			All without your applications doing anything extra.
+		</para> 
+	</sect1>
+	<sect1 id="stream-sequencers">
+		<title>Stream Sequencers</title>
+    <para>
+			The &StreamSequencer; interface defines the single method that must be implemented by a sequencer:
+		</para>
     <programlisting>
-&SimpleSessionFactory; sessionFactory = new &SimpleSessionFactory;();
-sessionFactory.registerRepository("Main Repository", this.repository);
-&Credentials; credentials = new &SimpleCredentials;("jsmith", "secret".toCharArray());
-sessionFactory.registerCredentials("Main Repository/Workspace1", credentials);
-// Now create the JCR execution context, with a reference to the session factory
-// and the name of the repository from which sessions will be obtained ...
-ExecutionContext executionContext = new &JcrExecutionContext;(sessionFactory,"Main Repository");
+public interface &StreamSequencer; {
 
-// Create the sequencing service, passing in the execution context ...
-&SequencingService; sequencingService = new &SequencingService;();
-sequencingService.setExecutionContext(executionContext);
+    /**
+     * Sequence the data found in the supplied stream, placing the output 
+     * information into the supplied map.
+     *
+     * @param stream the stream with the data to be sequenced; never null
+     * @param output the output from the sequencing operation; never null
+     * @param context the context for the sequencing operation; never null
+     */
+    void sequence( &InputStream; stream, &SequencerOutput; output, &StreamSequencerContext; context );
+}
 </programlisting>
-		<para>After the sequencing service is created and configured, it must be started.  The &SequencingService;
-      has an <emphasis>administration object</emphasis> (that is an instance of &ServiceAdministrator;)
-      with <code>start()</code>, <code>pause()</code>, and <code>shutdown()</code> methods.  The latter method will 
-      close the queue for sequencing, but will allow sequencing operations already running to complete normally.
-      To wait until all sequencing operations have completed, simply call the <code>awaitTermination</code> method
-      and pass it the maximum amount of time you want to wait.</para>
-		<programlisting>
-sequencingService.getAdministrator().start();
-</programlisting>
-		<para>The JBoss DNA services are utilizing resources and threads that must be released before your application is ready to shut down.
-    	The safe way to do this is to simply obtain the &ServiceAdministrator; for each service (via the <code>getServiceAdministrator()</code> method)
-    	and call <code>shutdown()</code>.  As previously mentioned, the shutdown method will simply prevent new work from being processed
-    	and will not wait for existing work to be completed.  If you want to wait until the service completes all its work, you must wait
-    	until the service terminates.  Here's an example that shows how this is done:</para>
-    <programlisting>
-// Shut down the service and wait until it's all shut down ...
-sequencingService.getAdministrator().shutdown();
-sequencingService.getAdministrator().awaitTermination(5, TimeUnit.SECONDS);
+		<para>
+			Implementations are responsible for processing the content in the supplied &InputStream; content and generating
+			structured content using the supplied &SequencerOutput; interface.  
+	    The &StreamSequencerContext; provides additional details about the information that is being sequenced,
+		  including the location and properties of the node being sequenced, the MIME type
+	    of the node being sequenced, and a &Problems; object where the sequencer can record problems that aren't 
+			severe enough to warrant throwing an exception.  The &StreamSequencerContext; also provides access
+			to the &ValueFactories; that can be used to create &Path;, &Name;, and any other value objects.
+    </para>
+    <para>The &SequencerOutput; interface is fairly easy to use, and its job is to hide from the sequencer
+			all the specifics about where the output is being written.  Therefore, the interface has only a few methods
+			for implementations to call.
+	    Two methods set the property values on a node, while the other sets references to other nodes in the repository.
+			Use these methods to describe the properties of the nodes you want to create, using relative paths for the nodes and
+	    valid JCR property names for properties and references.  JBoss DNA will ensure that nodes are created or updated
+	    whenever they're needed.
+		</para>
+	  <programlisting>
+public interface &SequencerOutput; {
 
-// Shut down the observation service ...
-observationService.getAdministrator().shutdown();
-observationService.getAdministrator().awaitTermination(5, TimeUnit.SECONDS);
-</programlisting>
-  </sect1>
-  <sect1 id="sequencer-configuration">
-    <title>Sequencer Configurations</title>
-		<para>The sequencing service must also be configured with the sequencers that it will use.  This is done using the
-      <code>addSequencer(SequencerConfig)</code> method and passing a &SequencerConfig; instance that
-      you create.  Here's the code that defines 3 sequencer configurations: 1 that places image metadata into
-      "<code><![CDATA[/images/<filename>]]></code>", another that places MP3 metadata into "<code><![CDATA[/mp3s/<filename>]]></code>",
-      and a third that places a structure that represents the classes, methods, and attributes found within Java source into 
-      "<code><![CDATA[/java/<filename>]]></code>".</para>
-    <programlisting>
-String name = "Image Sequencer";
-String desc = "Sequences image files to extract the characteristics of the image";
-String classname = "org.jboss.dna.sequencer.images.ImageMetadataSequencer";
-String[] classpath = null; // Use the current classpath
-String[] pathExpressions = {"//(*.(jpg|jpeg|gif|bmp|pcx|png)[*])/jcr:content[@jcr:data] => /images/$1"};
-&SequencerConfig; imageSequencerConfig = new &SequencerConfig;(name, desc, classname, 
-                                                           classpath, pathExpressions);
-sequencingService.addSequencer(imageSequencerConfig);
+  /**
+   * Set the supplied property on the supplied node.  The allowable
+   * values are any of the following:
+   *   - primitives (which will be autoboxed)
+   *   - String instances
+   *   - String arrays
+   *   - byte arrays
+   *   - InputStream instances
+   *   - Calendar instances
+   *
+   * @param nodePath the path to the node containing the property; 
+   * may not be null
+   * @param property the name of the property to be set
+   * @param values the value(s) for the property; may be empty if 
+   * any existing property is to be removed
+   */
+  void setProperty( String nodePath, String property, Object... values );
+  void setProperty( &Path; nodePath, &Name; property, Object... values );
 
-name = "MP3 Sequencer";
-desc = "Sequences MP3 files to extract the ID3 tags from the audio file";
-classname = "org.jboss.dna.sequencer.mp3.Mp3MetadataSequencer";
-pathExpressions = {"//(*.mp3[*])/jcr:content[@jcr:data] =&gt; /mp3s/$1"};
-&SequencerConfig; mp3SequencerConfig = new &SequencerConfig;(name, desc, classname, 
-                                                         classpath, pathExpressions);
-sequencingService.addSequencer(mp3SequencerConfig);
-
-name = "Java Sequencer";
-desc = "Sequences java files to extract the characteristics of the Java source";
-classname = "org.jboss.dna.sequencer.java.JavaMetadataSequencer";
-pathExpressions = {"//(*.java[*])/jcr:content[@jcr:data] => /java/$1"};
-&SequencerConfig; javaSequencerConfig = new &SequencerConfig;(name, desc, classname, 
-                                                          classpath, pathExpressions);
-this.sequencingService.addSequencer(javaSequencerConfig);
-</programlisting>
-    <para>Each configuration defines several things, including the name, description, and sequencer implementation class.
-	    The configuration also defines the classpath information, which can be passed to the &ClassLoaderFactory; to get
-	    a Java &ClassLoader; with which the sequencer class can be loaded.  (If no classpath information is provided, as is done
-	    in the code above, the application class loader is used.)  The configuration also specifies the path expressions that
-	    identify the nodes that should be sequenced with the sequencer and where to store the output generated by the sequencer.
-	    Path expressions are pretty straightforward but are quite powerful, so before we go any further with the example,
-	    let's dive into path expressions in more detail.</para>
-		<sect2 id="path_expressions">
-			<title>Path Expressions</title>
-			<para>Path expressions consist of two parts: a selection criteria (or an input path) and an output path:</para>
-	    <programlisting><![CDATA[  inputPath => outputPath ]]></programlisting>
-			<para>The <emphasis>inputPath</emphasis> part defines an expression for the path of a node that is to be sequenced.
-			  Input paths consist of '<code>/</code>' separated segments, where each segment represents a pattern for a single node's
-			  name (including the same-name-sibling indexes) and '<code>@</code>' signifies a property name.</para>
-			<para>Let's first look at some simple examples:</para>
-			<table frame='all'>
-				<title>Simple Input Path Examples</title>
-				<tgroup cols='2' align='left' colsep='1' rowsep='1'>
-		      <colspec colname='c1' colwidth="1*"/>
-		      <colspec colname='c2' colwidth="1*"/>
-					<thead>
-						<row>
-				  		<entry>Input Path</entry>
-				  		<entry>Description</entry>
-						</row>
-					</thead>
-					<tbody>
-						<row><entry>/a/b</entry><entry>Match node "<code>b</code>" that is a child of the top level node "<code>a</code>". Neither node
-						     may have any same-name-sibilings.</entry></row>
-						<row><entry>/a/*</entry><entry>Match any child node of the top level node "<code>a</code>".</entry></row>
-						<row><entry>/a/*.txt</entry><entry>Match any child node of the top level node "<code>a</code>" that also has a name ending in "<code>.txt</code>".</entry></row>
-						<row><entry>/a/*.txt</entry><entry>Match any child node of the top level node "<code>a</code>" that also has a name ending in "<code>.txt</code>".</entry></row>
-						<row><entry>/a/b at c</entry><entry>Match the property "<code>c</code>" of node "<code>/a/b</code>".</entry></row>
-						<row><entry>/a/b[2]</entry><entry>The second child named "<code>b</code>" below the top level node "<code>a</code>".</entry></row>
-						<row><entry>/a/b[2,3,4]</entry><entry>The second, third or fourth child named "<code>b</code>" below the top level node "<code>a</code>".</entry></row>
-						<row><entry>/a/b[*]</entry><entry>Any (and every) child named "<code>b</code>" below the top level node "<code>a</code>".</entry></row>
-						<row><entry>//a/b</entry><entry>Any node named "<code>b</code>" that exists below a node named "<code>a</code>", regardless 
-						     of where node "<code>a</code>" occurs.  Again, neither node may have any same-name-sibilings.</entry></row>
-					</tbody>
-				</tgroup>
-			</table>
-			<para>With these simple examples, you can probably discern the most important rules.  First, the '<code>*</code>' is a wildcard character
-			  that matches any character or sequence of characters in a node's name (or index if appearing in between square brackets), and
-			  can be used in conjunction with other characters (e.g., "<code>*.txt</code>").</para>
-			<para>Second, square brackets (i.e., '<code>[</code>' and '<code>]</code>') are used to match a node's same-name-sibiling index.
-			  You can put a single non-negative number or a comma-separated list of non-negative numbers.  Use '0' to match a node that has no
-			  same-name-sibilings, or any positive number to match the specific same-name-sibling.</para>
-			<para>Third, combining two delimiters (e.g., "<code>//</code>") matches any sequence of nodes, regardless of what their names are 
-			  or how many nodes.  Often used with other patterns to identify nodes at any level matching other patterns. 
-				Three or more sequential slash characters are treated as two.</para>
-			<para>Many input paths can be created using just these simple rules.  However, input paths can be more complicated.  Here are some
-				more examples:</para>
-			<table frame='all'>
-				<title>More Complex Input Path Examples</title>
-				<tgroup cols='2' align='left' colsep='1' rowsep='1'>
-		      <colspec colname='c1' colwidth="1*"/>
-		      <colspec colname='c2' colwidth="1*"/>
-					<thead>
-						<row>
-				  		<entry>Input Path</entry>
-				  		<entry>Description</entry>
-						</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 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
-								 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
-						     "<code>something</code>". None of the nodes may have same-name-sibling indexes.</entry></row>
-					</tbody>
-				</tgroup>
-			</table>
-			<para>These examples show a few more advanced rules.  Parentheses (i.e., '<code>(</code>' and '<code>)</code>') can be used
-			  to define a set of options for names, as shown in the first and third rules.  Whatever part of the selected node's path
-			  appears between the parentheses is captured for use within the output path.  Thus, the first input path in the previous table
-			  would match node "<code>/a/b</code>", and "b" would be captured and could be used within the output path using "<code>$1</code>",
-			  where the number used in the output path identifies the parentheses.</para>
-			<para>Square brackets can also be used to specify criteria on a node's properties or children.  Whatever appears in between the square
-				brackets does not appear in the selected node.</para>
-		  <para>Let's go back to the previous code fragment and look at the first path expression:</para>
-		  <programlisting><![CDATA[  //(*.(jpg|jpeg|gif|bmp|pcx|png)[*])/jcr:content[@jcr:data] => /images/$1 ]]></programlisting>
-		  <para>This matches a node named "<code>jcr:content</code>" with property "<code>jcr:data</code>" but no siblings with the same name,
-		    and that is a child of a node whose name ends with "<code>.jpg</code>", "<code>.jpeg</code>", "<code>.gif</code>", "<code>.bmp</code>", "<code>.pcx</code>", 
-		    or  "<code>.png</code>" that may have any same-name-sibling index.  These nodes can appear at any level in the repository.
-			  Note how the input path capture the filename (the segment containing the file extension), including any same-name-sibling index.
-			  This filename is then used in the output path, which is where the sequenced content is placed.</para>
-		</sect2>
+  /**
+   * Set the supplied reference on the supplied node.
+   *
+   * @param nodePath the path to the node containing the property; 
+   * may not be null
+   * @param property the name of the property to be set
+   * @param paths the paths to the referenced property, which may be
+   * absolute paths or relative to the sequencer output node;
+   * may be empty if any existing property is to be removed
+   */
+  void setReference( String nodePath, String property, String... paths );
+}
+		</programlisting>
+		<note>
+    	<para>
+				JBoss DNA will create nodes of type <code>nt:unstructured</code> unless you specify the value for the
+      	<code>jcr:primaryType</code> property.  You can also specify the values for the <code>jcr:mixinTypes</code> property
+      	if you want to add mixins to any node.
+			</para>
+		</note>
   </sect1>
+  <sect1 id="path-expressions">
+    <title>Path Expressions</title>
+		<para>
+			Each sequencer must be configured to describe the areas or types of content that the sequencer is capable
+			of handling.  This is done by specifying these patterns using path expressions that
+	    identify the nodes (or node patterns) that should be sequenced and where to store the output generated by the sequencer.
+			We'll see how to fully configure a sequencer in the <link linkend="configuration">next chapter</link>,
+			but before then let's dive into path expressions in more detail.
+		</para>
+		<para>
+			A path expression consist of two parts: a selection criteria (or an input path) and an output path:
+		</para>
+	  <programlisting><![CDATA[  inputPath => outputPath ]]></programlisting>
+		<para>
+			The <emphasis>inputPath</emphasis> part defines an expression for the path of a node that is to be sequenced.
+		 	Input paths consist of '<code>/</code>' separated segments, where each segment represents a pattern for a single node's
+			name (including the same-name-sibling indexes) and '<code>@</code>' signifies a property name.
+		</para>
+		<para>
+			Let's first look at some simple examples:
+		</para>
+		<table frame='all'>
+			<title>Simple Input Path Examples</title>
+			<tgroup cols='2' align='left' colsep='1' rowsep='1'>
+	      <colspec colname='c1' colwidth="1*"/>
+	      <colspec colname='c2' colwidth="1*"/>
+				<thead>
+					<row>
+			  		<entry>Input Path</entry>
+			  		<entry>Description</entry>
+					</row>
+				</thead>
+				<tbody>
+					<row><entry>/a/b</entry><entry>Match node "<code>b</code>" that is a child of the top level node "<code>a</code>". Neither node
+					     may have any same-name-sibilings.</entry></row>
+					<row><entry>/a/*</entry><entry>Match any child node of the top level node "<code>a</code>".</entry></row>
+					<row><entry>/a/*.txt</entry><entry>Match any child node of the top level node "<code>a</code>" that also has a name ending in "<code>.txt</code>".</entry></row>
+					<row><entry>/a/*.txt</entry><entry>Match any child node of the top level node "<code>a</code>" that also has a name ending in "<code>.txt</code>".</entry></row>
+					<row><entry>/a/b at c</entry><entry>Match the property "<code>c</code>" of node "<code>/a/b</code>".</entry></row>
+					<row><entry>/a/b[2]</entry><entry>The second child named "<code>b</code>" below the top level node "<code>a</code>".</entry></row>
+					<row><entry>/a/b[2,3,4]</entry><entry>The second, third or fourth child named "<code>b</code>" below the top level node "<code>a</code>".</entry></row>
+					<row><entry>/a/b[*]</entry><entry>Any (and every) child named "<code>b</code>" below the top level node "<code>a</code>".</entry></row>
+					<row><entry>//a/b</entry><entry>Any node named "<code>b</code>" that exists below a node named "<code>a</code>", regardless 
+					     of where node "<code>a</code>" occurs.  Again, neither node may have any same-name-sibilings.</entry></row>
+				</tbody>
+			</tgroup>
+		</table>
+		<para>
+			With these simple examples, you can probably discern the most important rules.  First, the '<code>*</code>' is a wildcard character
+		  that matches any character or sequence of characters in a node's name (or index if appearing in between square brackets), and
+		  can be used in conjunction with other characters (e.g., "<code>*.txt</code>").
+		</para>
+		<para>
+			Second, square brackets (i.e., '<code>[</code>' and '<code>]</code>') are used to match a node's same-name-sibiling index.
+		  You can put a single non-negative number or a comma-separated list of non-negative numbers.  Use '0' to match a node that has no
+		  same-name-sibilings, or any positive number to match the specific same-name-sibling.
+		</para>
+		<para>
+			Third, combining two delimiters (e.g., "<code>//</code>") matches any sequence of nodes, regardless of what their names are 
+		  or how many nodes.  Often used with other patterns to identify nodes at any level matching other patterns. 
+			Three or more sequential slash characters are treated as two.
+		</para>
+		<para>
+			Many input paths can be created using just these simple rules.  However, input paths can be more complicated.  Here are some
+			more examples:
+		</para>
+		<table frame='all'>
+			<title>More Complex Input Path Examples</title>
+			<tgroup cols='2' align='left' colsep='1' rowsep='1'>
+	      <colspec colname='c1' colwidth="1*"/>
+	      <colspec colname='c2' colwidth="1*"/>
+				<thead>
+					<row>
+			  		<entry>Input Path</entry>
+			  		<entry>Description</entry>
+					</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 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
+							 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
+					     "<code>something</code>". None of the nodes may have same-name-sibling indexes.</entry></row>
+				</tbody>
+			</tgroup>
+		</table>
+		<para>
+			These examples show a few more advanced rules.  Parentheses (i.e., '<code>(</code>' and '<code>)</code>') can be used
+		  to define a set of options for names, as shown in the first and third rules.  Whatever part of the selected node's path
+		  appears between the parentheses is captured for use within the output path.  Thus, the first input path in the previous table
+		  would match node "<code>/a/b</code>", and "b" would be captured and could be used within the output path using "<code>$1</code>",
+		  where the number used in the output path identifies the parentheses.
+		</para>
+		<para>
+			Square brackets can also be used to specify criteria on a node's properties or children.  Whatever appears in between the square
+			brackets does not appear in the selected node.
+		</para>
+	  <para>
+			Let's go back to the previous code fragment and look at the first path expression:
+		</para>
+	  <programlisting><![CDATA[  //(*.(jpg|jpeg|gif|bmp|pcx|png)[*])/jcr:content[@jcr:data] => /images/$1 ]]></programlisting>
+	  <para>
+			This matches a node named "<code>jcr:content</code>" with property "<code>jcr:data</code>" but no siblings with the same name,
+	    and that is a child of a node whose name ends with "<code>.jpg</code>", "<code>.jpeg</code>", "<code>.gif</code>", "<code>.bmp</code>", "<code>.pcx</code>", 
+	    or  "<code>.png</code>" that may have any same-name-sibling index.  These nodes can appear at any level in the repository.
+		  Note how the input path capture the filename (the segment containing the file extension), including any same-name-sibling index.
+		  This filename is then used in the output path, which is where the sequenced content is placed.
+		</para>
+  </sect1>
   <sect1 id="sequencer-library">
     <title>Out-of-the-box sequencers</title>
     <para>
@@ -309,19 +313,15 @@
 	  	<programlisting role="XML"><![CDATA[
 <dependency>
   <groupId>org.jboss.dna</groupId>
-  <artifactId>dna-common</artifactId>
-  <version>0.3</version>
-</dependency>
-<dependency>
-  <groupId>org.jboss.dna</groupId>
   <artifactId>dna-graph</artifactId>
-  <version>0.3</version>
+  <version>0.5</version>
 </dependency>
 	 ]]></programlisting>
 			<para>These are minimum dependencies required for compiling a sequencer.  Of course, you'll have to add
 	  		other dependencies that your sequencer needs.</para>
 	  	<para>As for testing, you probably will want to add more dependencies, such as those listed here:</para>
 			<programlisting role="XML"><![CDATA[
+<!-- DNA-related unit testing utilities and classes -->
 <dependency>
   <groupId>org.jboss.dna</groupId>
   <artifactId>dna-graph</artifactId>
@@ -330,6 +330,14 @@
   <scope>test</scope>
 </dependency>
 <dependency>
+  <groupId>org.jboss.dna</groupId>
+  <artifactId>dna-common</artifactId>
+  <version>0.5</version>
+  <type>test-jar</type>
+  <scope>test</scope>
+</dependency>
+<!-- Unit testing -->
+<dependency>
   <groupId>junit</groupId>
   <artifactId>junit</artifactId>
   <version>4.4</version>
@@ -353,8 +361,7 @@
   <artifactId>log4j</artifactId>
   <version>1.2.14</version>
   <scope>test</scope>
-</dependency>
-	 ]]></programlisting>
+</dependency>	 ]]></programlisting>
 	  	<para>Testing JBoss DNA sequencers does not require a JCR repository or the JBoss DNA services.  (For more detail,
 	  		see the <link linkend="testing_custom_sequencers">testing section</link>.)  However, if you want to do
 	  		integration testing with a JCR repository and the JBoss DNA services, you'll need additional dependencies for these libraries.</para>
@@ -374,81 +381,16 @@
   <scope>test</scope>
 </dependency>
 	 ]]></programlisting>
-	  <para>At this point, your project should be set up correctly, and you're ready to move on to 
-	  	<link linkend="custom_sequencer_implementation">writing the Java implementation</link> for your sequencer.</para>
-	  </sect2>
-	  <sect2 id="custom_sequencer_implementation">
-	    <title>Implementing the StreamSequencer interface</title>
-	    <para>After creating the project and setting up the dependencies, the next step is to create a Java class that implements
-	    	the &StreamSequencer; interface.  This interface is very straightforward and involves a single method:</para>
-	    <programlisting>
-public interface &StreamSequencer; {
-
-    /**
-     * Sequence the data found in the supplied stream, placing the output 
-     * information into the supplied map.
-     *
-     * @param stream the stream with the data to be sequenced; never null
-     * @param output the output from the sequencing operation; never null
-     * @param context the context for the sequencing operation; never null
-     */
-    void sequence( &InputStream; stream, &SequencerOutput; output, &SequencerContext; context );
-}
-</programlisting>
-	    <para>The job of a stream sequencer is to process the data in the supplied stream, and place into the &SequencerOutput;
-	    any information that is to go into the JCR repository.  JBoss DNA figures out when your sequencer should be called
-	    (of course, using the sequencing configuration you'll add in a bit), and then makes sure the generated information
-	    is saved in the correct place in the repository.  
-	    </para>
-	    <para>The &SequencerContext; provides information about
-	    the current sequencing operation, including the location and properties of the node being sequenced, the MIME type
-	    of the node being sequenced, and a location to record problems that aren't severe enough to warrant throwing an exception.
-	    </para>
-	    <para>The &SequencerOutput; class is fairly easy to use.  There are basically two methods you need to call.
-	    One method sets the property values, while the other sets references to other nodes in the repository.  Use these
-	    methods to describe the properties of the nodes you want to create, using relative paths for the nodes and
-	    valid JCR property names for properties and references.  JBoss DNA will ensure that nodes are created or updated
-	    whenever they're needed.</para>
-	    <programlisting>
-public interface &SequencerOutput; {
-
-  /**
-   * Set the supplied property on the supplied node.  The allowable
-   * values are any of the following:
-   *   - primitives (which will be autoboxed)
-   *   - String instances
-   *   - String arrays
-   *   - byte arrays
-   *   - InputStream instances
-   *   - Calendar instances
-   *
-   * @param nodePath the path to the node containing the property; 
-   * may not be null
-   * @param property the name of the property to be set
-   * @param values the value(s) for the property; may be empty if 
-   * any existing property is to be removed
-   */
-  void setProperty( String nodePath, String property, Object... values );
-
-  /**
-   * Set the supplied reference on the supplied node.
-   *
-   * @param nodePath the path to the node containing the property; 
-   * may not be null
-   * @param property the name of the property to be set
-   * @param paths the paths to the referenced property, which may be
-   * absolute paths or relative to the sequencer output node;
-   * may be empty if any existing property is to be removed
-   */
-  void setReference( String nodePath, String property, String... paths );
-}
-</programlisting>
-	    <para>JBoss DNA will create nodes of type <code>nt:unstructured</code> unless you specify the value for the
-	      <code>jcr:primaryType</code> property.  You can also specify the values for the <code>jcr:mixinTypes</code> property
-	      if you want to add mixins to any node.</para>
-	    <para>For a complete example of a sequencer, let's look at the &ImageMetadataSequencer; 
-				implementation:</para>
-	    <programlisting>
+		  <para>
+				At this point, your project should be set up correctly, and you're ready to move on to 
+			 	write your custom implementation of the &StreamSequencer; interface.  As stated earlier, this should be fairly
+				straightforward: process the stream and generate the output that's appropriate for the kind of file being
+				sequenced.
+			</para>
+		  <para>
+				Let's look at an example.  Here is the complete code for the &ImageMetadataSequencer; implementation:
+			</para>
+		  <programlisting>
 public class &ImageMetadataSequencer; implements &StreamSequencer; {
 
     public static final String METADATA_NODE = "image:metadata";
@@ -493,20 +435,26 @@
             output.setProperty(METADATA_NODE, IMAGE_HEIGHT, metadata.getHeight());
             output.setProperty(METADATA_NODE, IMAGE_BITS_PER_PIXEL, metadata.getBitsPerPixel());
             output.setProperty(METADATA_NODE, IMAGE_PROGRESSIVE, metadata.isProgressive());
-            output.setProperty(METADATA_NODE, IMAGE_NUMBER_OF_IMAGES, metadata.getNumberOfImages());
-            output.setProperty(METADATA_NODE, IMAGE_PHYSICAL_WIDTH_DPI, metadata.getPhysicalWidthDpi());
-            output.setProperty(METADATA_NODE, IMAGE_PHYSICAL_HEIGHT_DPI, metadata.getPhysicalHeightDpi());
-            output.setProperty(METADATA_NODE, IMAGE_PHYSICAL_WIDTH_INCHES, metadata.getPhysicalWidthInch());
-            output.setProperty(METADATA_NODE, IMAGE_PHYSICAL_HEIGHT_INCHES, metadata.getPhysicalHeightInch());
+            output.setProperty(METADATA_NODE, IMAGE_NUMBER_OF_IMAGES, 
+                               metadata.getNumberOfImages());
+            output.setProperty(METADATA_NODE, IMAGE_PHYSICAL_WIDTH_DPI,  
+						metadata.getPhysicalWidthDpi());
+            output.setProperty(METADATA_NODE, IMAGE_PHYSICAL_HEIGHT_DPI,  
+						metadata.getPhysicalHeightDpi());
+            output.setProperty(METADATA_NODE, IMAGE_PHYSICAL_WIDTH_INCHES,  
+						metadata.getPhysicalWidthInch());
+            output.setProperty(METADATA_NODE, IMAGE_PHYSICAL_HEIGHT_INCHES,  
+						metadata.getPhysicalHeightInch());
         }
     }
 }
 </programlisting>
-	    <para>
-	    Notice how the image metadata is extracted and the output graph is generated.  A single node is created with the name <code>image:metadata</code>
-	    and with the <code>image:metadata</code> node type.  No mixins are defined for the node, but several properties are set on the node
-	    using the values obtained from the image metadata.  After this method returns, the constructed graph will be saved to the repository
-	    in all of the places defined by its configuration.  (This is why only relative paths are used in the sequencer.)
+		  <para>
+		    Notice how the image metadata is extracted and the output graph is generated.  A single node is created with the name 
+				<code>image:metadata</code>
+		    and with the <code>image:metadata</code> node type.  No mixins are defined for the node, but several properties are set on the node
+		    using the values obtained from the image metadata.  After this method returns, the constructed graph will be saved to the repository
+		    in all of the places defined by its configuration.  (This is why only relative paths are used in the sequencer.)
 	    </para>
 	  </sect2>
 	  <sect2 id="testing_custom_sequencers">
@@ -563,38 +511,18 @@
 	    that <link linkend="using_dna">configure JBoss DNA</link> to use a custom sequencer, and to then upload
 	    content using the JCR API, verifying that the custom sequencer did run.  However, remember that JBoss DNA
 	    runs sequencers asynchronously in the background, and you must synchronize your tests to ensure that the
-	    sequencers have a chance to run before checking the results.  (One way of doing this (although, granted, not always reliable) is to wait for a second
-	    after uploading your content, shutdown the &SequencingService; and await its termination,
-	    and then check that the sequencer output has been saved to the JCR repository.  For an example of this technique,
-	    see the <code>SequencingClientTest</code> unit test in the example application.)
+	    sequencers have a chance to run before checking the results.
 	    </para>  
 	  </sect2>
-	  <sect2 id="deploying_custom_sequencers">
-	    <title>Deploying custom sequencers</title>
-	    <para>The first step of deploying a sequencer consists of adding/changing the sequencer configuration (e.g., &SequencerConfig;)
-	    in the &SequencingService;.  This was covered in the <link linkend="sequencing_service">previous chapter</link>.
-	    </para>
-	    <para>
-	    The second step is to make the sequencer implementation available to JBoss DNA.  At this time, the JAR containing 
-	    your new sequencer, as well as any JARs that your sequencer depends on, should be placed on your application classpath.</para>
-	    <note>
-	      <para>A future goal of JBoss DNA is to allow sequencers, connectors, and other extensions to be easily deployed into
-	        a runtime repository.  This process will not only be much simpler, but it will also provide JBoss DNA 
-	        with the information necessary to update configurations and create the appropriate class loaders for each extension.
-	        Having separate class loaders for each extension helps prevent the pollution of the common classpath, 
-	        facilitates an isolated runtime environment to eliminate any dependency conflicts, and may potentially
-	        enable hot redeployment of newer extension versions.
-	      </para>
-	    </note>
-	  </sect2>
   </sect1>
 	<sect1>
 		<title>Summary</title>
 		<para>
-			In this chapter, we described how JBoss DNA sequences files as they're uploaded into a repository.
-			And one of the things we mentioned was that each sequencer is handed (with other inputs) the MIME type of the file it is to process.
-			How does DNA know what the MIME type is?
-			JBoss DNA uses <emphasis>MIME type detectors</emphasis>, and this is the topic of the <link linkend="mimetypes">next chapter</link>.
+			In this chapter, we described how JBoss DNA sequences files as they're uploaded into a repository.  We've also learned 
+			in previous chapters about the JBoss DNA <link linkend="execution-context">execution contexts</link>, 
+			<link linkend="graph-model">graph model</link>, and <link linkend="connector-framework">connectors</link>.
+			In the <link linkend="jcr">next part</link> we'll put all these pieces together to learn how
+			to set up a JBoss DNA repository and access it using the JCR API.
 		</para>
 	</sect1>
 </chapter>

Modified: trunk/docs/reference/src/main/docbook/en-US/custom.dtd
===================================================================
--- trunk/docs/reference/src/main/docbook/en-US/custom.dtd	2009-06-09 18:48:18 UTC (rev 1016)
+++ trunk/docs/reference/src/main/docbook/en-US/custom.dtd	2009-06-09 19:46:34 UTC (rev 1017)
@@ -82,6 +82,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 Problems								      "<ulink url='&API;common/collection/Problems.html'><interface>Problems</interface></ulink>">
 
 <!-- Types in dna-graph -->
 
@@ -141,7 +142,7 @@
 <!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 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>">

Modified: trunk/docs/reference/src/main/docbook/en-US/master.xml
===================================================================
--- trunk/docs/reference/src/main/docbook/en-US/master.xml	2009-06-09 18:48:18 UTC (rev 1016)
+++ trunk/docs/reference/src/main/docbook/en-US/master.xml	2009-06-09 19:46:34 UTC (rev 1017)
@@ -85,7 +85,7 @@
 	  <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="content/core/graph.xml"/>
 	  <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="content/core/connector.xml"/>
 	  <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="content/core/sequencing.xml"/>
-	  <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="content/core/configuration.xml"/>
+	  <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="content/jcr/configuration.xml"/>
 	</part>
 	<part id="jcr-part">
 		<title>JBoss DNA JCR</title>



From dna-commits at lists.jboss.org  Tue Jun  9 15:46:45 2009
From: dna-commits at lists.jboss.org (dna-commits at lists.jboss.org)
Date: Tue, 09 Jun 2009 15:46:45 -0400
Subject: [dna-commits] DNA SVN: r1018 - in
	trunk/docs/reference/src/main/docbook/en-US: content/jcr and
	1 other directory.
Message-ID: <E1ME7HR-0006pd-7b@committer01.frg.pub.inap.atl.jboss.com>

Author: rhauch
Date: 2009-06-09 15:46:45 -0400 (Tue, 09 Jun 2009)
New Revision: 1018

Added:
   trunk/docs/reference/src/main/docbook/en-US/content/jcr/configuration.xml
Modified:
   trunk/docs/reference/src/main/docbook/en-US/master.xml
Log:
Moved the chapter on configuring the JCR engine into the part of the Reference Guide that talks about JCR.

Added: trunk/docs/reference/src/main/docbook/en-US/content/jcr/configuration.xml
===================================================================
--- trunk/docs/reference/src/main/docbook/en-US/content/jcr/configuration.xml	                        (rev 0)
+++ trunk/docs/reference/src/main/docbook/en-US/content/jcr/configuration.xml	2009-06-09 19:46:45 UTC (rev 1018)
@@ -0,0 +1,376 @@
+<?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="configuration">
+  <title>Configuring and Using JBoss DNA</title>
+	<para>Using JBoss DNA within your application is actually quite straightforward.  As you'll see in this chapter,
+		the first step is setting up JBoss DNA and starting the <code>JcrEngine</code>.  After that, you obtain the
+		<code>javax.jcr.Repository</code> instance for a named repository and just use the standard JCR API throughout your
+		application.
+	</para>
+	<sect1 id="jcr_engine">
+		<title>JBoss DNA's JcrEngine</title>
+		<para>
+			JBoss DNA encapsulates everything necessary to run one or more JCR repositories into a single &JcrEngine; instance.
+			This includes all underlying repository sources, the pools of connections to the sources, the sequencers,
+			the MIME type detector(s), and the &Repository; implementations.
+		</para>
+		<para>
+			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 = ...
+JcrEngine engine = config.build();
+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>
+		<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>
+		<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)
+			present at the time of the <code>shutdown()</code> call will be allowed to finish.  
+			In essence, <code>shutdown()</code> is a <emphasis>graceful</emphasis> request, and since it may take some time to complete,
+			you can wait until the shutdown has completed by simply calling <code>awaitTermination(...)</code> as shown above.
+			This method will block until the engine has indeed shutdown or until the supplied time duration has passed (whichever comes first).
+			And, yes, you can call the <code>awaitTermination(...)</code> method repeatedly if needed.
+		</para>
+	</sect1>
+	<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:
+			<itemizedlist>
+				<listitem>
+					<para><emphasis role="strong"><code>Repository sources</code></emphasis> are the POJO objects that each describe a particular
+					location where content is stored.  Each repository source object is an instance of a JBoss DNA connector, and is configured
+					with the properties that particular source.  JBoss DNA's &RepositorySource; classes are analogous to JDBC's &DataSource; classes -
+					they are implemented by specific connectors (aka, "drivers") for specific kinds of repository sources (aka, "databases").
+					Similarly, a &RepositorySource; instance is analogous to a &DataSource; instance, with bean properties for each configurable
+					parameter.  Therefore, each repository source definition must supply the name of the &RepositorySource; class, any
+					bean properties, and, optionally, the classpath that should be used to load the class. </para>
+				</listitem>
+				<listitem>
+					<para><emphasis role="strong"><code>Repositories</code></emphasis> define the JCR repositories that are available.  Each
+					repository has a unique name that is used to obtain the &Repository; instance from the &JcrEngine;'s <code>getRepository(String)</code>
+					method, but each repository definition also can include the predefined namespaces (other than those automatically defined by
+					JBoss DNA), various options, and the node types that are to be available in the repository without explicit registration
+					through the JCR API.</para>
+				</listitem>
+				<listitem>
+					<para><emphasis role="strong"><code>Sequencers</code></emphasis> define the particular sequencers that are available for use.
+					Each sequencer definition provides the path expressions governing which nodes in the repository should be sequenced when those nodes change,
+					and where the resulting output generated by the sequencer should be placed.  The definition also must state the name of 
+					the sequencer class, any bean properties and, optionally, the classpath that should be used to load the class.</para>
+				</listitem>
+				<listitem>
+					<para><emphasis role="strong"><code>MIME type detectors</code></emphasis> define the particular MIME type detector(s) that should
+					be made available.  A MIME type detector does exactly what the name implies: it attempts to determine the MIME type given a
+					"filename" and contents.  JBoss DNA automatically uses a detector that uses the file extension to identify the MIME type,
+					but also provides an implementation that uses an external library to identify the MIME type based upon the contents.
+					The definition must state the name of the detector class, any bean properties and, optionally, the classpath that should 
+					be used to load the class.</para>
+				</listitem>
+			</itemizedlist>
+		</para>
+		<para>
+			There really are three options:
+			<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>
+				</listitem>
+				<listitem>
+					<para><emphasis role="strong"><code>Load 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>
+				</listitem>
+				<listitem>
+					<para><emphasis role="strong"><code>Programmatic configuration</code></emphasis> is always possible, even if the configuration is loaded
+					from a file or repository.  Using the &JcrConfiguration;'s API, you can define (or update or remove) all of the definitions that make
+					up a configuration.</para>
+				</listitem>
+			</itemizedlist>
+		</para>
+		<para>
+			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>
+			<para>
+				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>
+			<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.  
+			</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 &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
+				this second parameter is very useful.)
+			</para>
+			<para>
+				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"?>
+<configuration xmlns="http://www.jboss.org/dna/1.0" xmlns:jcr="http://www.jcp.org/jcr/1.0">
+	  <!-- 
+	  Define the JCR repositories 
+	  -->
+	  <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">
+	          <options jcr:primaryType="dna:options"/>
+	              <jaasLoginConfigName jcr:primaryType="dna:option" dna:value="dna-jcr"/>
+	          </options>
+	      </dna:repository>
+	  </dna:repositories>
+    <!-- 
+    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">
+            <!-- Define the name of the workspace used by default.  Optional, but convenient. -->
+            <defaultWorkspaceName>workspace2</defaultWorkspaceName>
+        </dna:source>
+    </dna:sources>
+    <!-- 
+    Define the sequencers. This is an optional section. For this example, we're not using any sequencers. 
+    -->
+    <dna:sequencers>
+        <!--dna:sequencer jcr:name="Image Sequencer">
+            <dna:classname>org.jboss.dna.sequencer.image.ImageMetadataSequencer</dna:classname>
+            <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>
+    <dna:mimeTypeDetectors>
+        <dna:mimeTypeDetector jcr:name="Detector" 
+                              dna:description="Standard extension-based MIME type detector"/>
+    </dna:mimeTypeDetectors>
+</configuration>
+ ]]></programlisting>
+		</sect2>
+		<sect2 id="loading_from_repository">
+			<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>
+				method:
+			</para>
+    	<programlisting role="JAVA"><![CDATA[
+RepositorySource configSource = ...
+JcrConfiguration config = new JcrConfiguration();
+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;.
+				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.)
+			</para>
+		</sect2>
+		<sect2 id="programmatic_configuration">
+			<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
+				dynamic information.
+			</para>
+			<para>
+				The &JcrConfiguration; class was designed to have an easy-to-use API that makes it easy to configure each of the different kinds of
+				components, especially when using an IDE with code completion.  Here are several examples:
+			</para>
+			<sect3 id="programmatically_configuring_sources">
+				<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>
+    		<programlisting role="JAVA"><![CDATA[
+JcrConfiguration config = ...
+config.repositorySource("source A")
+      .usingClass(InMemoryRepositorySource.class)
+      .setDescription("The repository for our content")
+      .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.
+					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>
+				<note>
+					<para>Each time <code>repositorySource(String)</code> is called, it will either load the existing definition with the supplied
+					name or will create a new definition if one does not already exist.  To remove a definition, simply call <code>remove()</code>
+					on the result of <code>repositorySource(String)</code>.
+					The set of existing definitions can be accessed with the <code>repositorySources()</code> method.
+					</para>
+				</note>
+			</sect3>
+			<sect3 id="programmatically_configuring_repositories">
+				<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 = ...
+config.repository("repository A")
+      .addNodeTypes("myCustomNodeTypes.cnd")
+      .setSource("source 1")
+      .registerNamespace("acme","http://www.example.com/acme")
+      .setOption(JcrRepository.Option.JAAS_LOGIN_CONFIG_NAME, "dna-jcr");
+ ]]></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
+					that will be made available when the repository is accessed.  It also defines the "http://www.example.com/acme" namespace,
+					and finally sets the "JAAS_LOGIN_CONFIG_NAME" option to define the name	of the JAAS login configuration that should be used by 
+					the JBoss DNA repository.
+				</para>
+				<note>
+					<para>Each time <code>repository(String)</code> is called, it will either load the existing definition with the supplied
+					name or will create a new definition if one does not already exist.  To remove a definition, simply call <code>remove()</code>
+					on the result of <code>repository(String)</code>.
+					The set of existing definitions can be accessed with the <code>repositories()</code> method.
+					</para>
+				</note>
+			</sect3>
+			<sect3 id="programmatically_configuring_sequencers">
+				<title>Sequencers</title>
+				<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 = ...
+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>
+				<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 
+					"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.)
+					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>
+				<note>
+					<para>Each time <code>sequencer(String)</code> is called, it will either load the existing definition with the supplied
+					name or will create a new definition if one does not already exist.  To remove a definition, simply call <code>remove()</code>
+					on the result of <code>sequencer(String)</code>.
+					The set of existing definitions can be accessed with the <code>sequencers()</code> method.
+					</para>
+				</note>
+			</sect3>
+			<sect3 id="programmatically_configuring_mime_type_detectors">
+				<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 = ...
+config.mimeTypeDetector("Extension Detector")
+      .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).
+				</para>
+				<note>
+					<para>Each time <code>mimeTypeDetector(String)</code> is called, it will either load the existing definition with the supplied
+					name or will create a new definition if one does not already exist.  To remove a definition, simply call <code>remove()</code>
+					on the result of <code>mimeTypeDetector(String)</code>.  
+					The set of existing definitions can be accessed with the <code>mimeTypeDetectors()</code> method.
+					</para>
+				</note>
+			</sect3>
+		</sect2>
+	</sect1>
+	<sect1 id="using_dna_whats_next">
+		<title>What's next</title>
+		<para>
+			This chapter outline how you configure JBoss DNA, how you then access a <code>javax.jcr.Repository</code> instance,
+			and use the standard JCR API to interact with the repository. The
+			<link linkend="downloading_and_running">next chapter </link> walks you through downloading
+			and running the JBoss DNA examples. 
+		</para>
+	</sect1>
+</chapter>


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

Modified: trunk/docs/reference/src/main/docbook/en-US/master.xml
===================================================================
--- trunk/docs/reference/src/main/docbook/en-US/master.xml	2009-06-09 19:46:34 UTC (rev 1017)
+++ trunk/docs/reference/src/main/docbook/en-US/master.xml	2009-06-09 19:46:45 UTC (rev 1018)
@@ -85,7 +85,6 @@
 	  <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="content/core/graph.xml"/>
 	  <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="content/core/connector.xml"/>
 	  <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="content/core/sequencing.xml"/>
-	  <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="content/jcr/configuration.xml"/>
 	</part>
 	<part id="jcr-part">
 		<title>JBoss DNA JCR</title>
@@ -97,6 +96,7 @@
 			</para>
 		</partintro>
   	<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/configuration.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  Tue Jun  9 16:08:03 2009
From: dna-commits at lists.jboss.org (dna-commits at lists.jboss.org)
Date: Tue, 09 Jun 2009 16:08:03 -0400
Subject: [dna-commits] DNA SVN: r1019 -
	trunk/docs/reference/src/main/docbook/en-US.
Message-ID: <E1ME7c3-0007vk-BL@committer01.frg.pub.inap.atl.jboss.com>

Author: spagop
Date: 2009-06-09 16:08:03 -0400 (Tue, 09 Jun 2009)
New Revision: 1019

Modified:
   trunk/docs/reference/src/main/docbook/en-US/custom.dtd
Log:
set up a new Entity for JavaEE API

Modified: trunk/docs/reference/src/main/docbook/en-US/custom.dtd
===================================================================
--- trunk/docs/reference/src/main/docbook/en-US/custom.dtd	2009-06-09 19:46:45 UTC (rev 1018)
+++ trunk/docs/reference/src/main/docbook/en-US/custom.dtd	2009-06-09 20:08:03 UTC (rev 1019)
@@ -24,6 +24,7 @@
 <!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 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>">
@@ -49,7 +50,7 @@
 <!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 HttpServletRequest			      "<ulink url='&Java;javax/servlet/http/HttpServletRequest.html'><classname>HttpServletRequest</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 Iteratable								    "<ulink url='&Java;java/util/Iteratable.html'><interface>Iteratable</interface></ulink>">



From dna-commits at lists.jboss.org  Tue Jun  9 16:12:01 2009
From: dna-commits at lists.jboss.org (dna-commits at lists.jboss.org)
Date: Tue, 09 Jun 2009 16:12:01 -0400
Subject: [dna-commits] DNA SVN: r1020 - in
	trunk/docs/reference/src/main/docbook/en-US: content/core and
	1 other directories.
Message-ID: <E1ME7ft-000877-CL@committer01.frg.pub.inap.atl.jboss.com>

Author: rhauch
Date: 2009-06-09 16:12:01 -0400 (Tue, 09 Jun 2009)
New Revision: 1020

Modified:
   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/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/rest_service.xml
   trunk/docs/reference/src/main/docbook/en-US/master.xml
Log:
Minor edits and changes to the Reference Guide.

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	2009-06-09 20:08:03 UTC (rev 1019)
+++ trunk/docs/reference/src/main/docbook/en-US/content/core/connector.xml	2009-06-09 20:12:01 UTC (rev 1020)
@@ -637,9 +637,9 @@
 			In this chapter, we covered all the aspects of JBoss DNA connectors, including the connector API,
 			how DNA's JCR implementation works with connectors, what connectors are available (and how to use them),
 			and how to write your own connector.  So now that you know how to set up and use JBoss DNA repositories,
-			the <link linkend="sequencing-framework">next chapter</link> describes the sequencing framework and how
-			to build your own custom sequencers.  After that, we'll get into <link linkend="configuration">how to configure
-			JBoss DNA</link> to use the connectors and sequencers.
+			the <link linkend="sequencing_framework">next chapter</link> describes the sequencing framework and how
+			to build your own custom sequencers.  After that, we'll get into <link linkend="jcr-part">how to configure
+			JBoss DNA and use JCR</link>.
 		</para>
 	</sect1>
 </chapter>

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	2009-06-09 20:08:03 UTC (rev 1019)
+++ trunk/docs/reference/src/main/docbook/en-US/content/core/sequencing.xml	2009-06-09 20:12:01 UTC (rev 1020)
@@ -521,7 +521,7 @@
 			In this chapter, we described how JBoss DNA sequences files as they're uploaded into a repository.  We've also learned 
 			in previous chapters about the JBoss DNA <link linkend="execution-context">execution contexts</link>, 
 			<link linkend="graph-model">graph model</link>, and <link linkend="connector-framework">connectors</link>.
-			In the <link linkend="jcr">next part</link> we'll put all these pieces together to learn how
+			In the <link linkend="jcr-part">next part</link> we'll put all these pieces together to learn how
 			to set up a JBoss DNA repository and access it using the JCR API.
 		</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	2009-06-09 20:08:03 UTC (rev 1019)
+++ trunk/docs/reference/src/main/docbook/en-US/content/jcr/configuration.xml	2009-06-09 20:12:01 UTC (rev 1020)
@@ -369,8 +369,7 @@
 		<para>
 			This chapter outline how you configure JBoss DNA, how you then access a <code>javax.jcr.Repository</code> instance,
 			and use the standard JCR API to interact with the repository. The
-			<link linkend="downloading_and_running">next chapter </link> walks you through downloading
-			and running the JBoss DNA examples. 
+			<link linkend="jcr">next chapter</link> talks about using the JCR API with your JBoss DNA repository.
 		</para>
 	</sect1>
 </chapter>

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	2009-06-09 20:08:03 UTC (rev 1019)
+++ trunk/docs/reference/src/main/docbook/en-US/content/jcr/jcr.xml	2009-06-09 20:12:01 UTC (rev 1020)
@@ -29,7 +29,7 @@
 %CustomDTD;
 ]>
 <chapter id="jcr">
-  <title>The JBoss DNA Content Repository for Java (JCR) Implementation</title>
+  <title>Using the JCR API with JBoss DNA</title>
   <para>
   	The
     <ulink url="&JSR170;">Content Repository for Java technology API</ulink>
@@ -38,7 +38,7 @@
 		JBoss DNA provides a partial JCR 1.0 implementation that allows you to work with the contents of a repository using the
 		JCR API.  For information about how to use the JCR API, please see the <ulink url="&JSR170;">JSR-170</ulink> specification.
 	<note>
-		<para>In the interests of brevity, this chapter does not attempt to reproduce the JSR-170 specification in order to provide
+		<para>In the interests of brevity, this chapter does not attempt to reproduce the JSR-170 specification nor provide
 		an exhaustive definition of JBoss DNA JCR capabilities.  Rather, this chapter will describe any deviations from the
 		specification as well as any DNA-specific public APIs and configuration.
 		</para>
@@ -282,9 +282,10 @@
 	<sect1>
 		<title>Summary</title>
 		<para>
-			In this chapter, we covered how to use JCR with JBoss DNA and learned about how it implements the JCR specification.  Now that you know how JBoss DNA repositories work,
-			and how to use JCR to work with DNA repositories, we'll move on in 
-			the <link linkend="deploying_dna_jcr">next chapter</link> to describing in detail how the sequencing of file content works.
+			In this chapter, we covered how to use JCR with JBoss DNA and learned about how it implements the JCR specification.  
+			Now that you know how JBoss DNA repositories work and how to use JCR to work with DNA repositories, we'll move on in 
+			the <link linkend="rest_service">next chapter</link> to show how you can use the RESTful web service to
+			provide access to the content in a JCR repository to clients.
 		</para>
 	</sect1>
 </chapter>

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	2009-06-09 20:08:03 UTC (rev 1019)
+++ trunk/docs/reference/src/main/docbook/en-US/content/jcr/rest_service.xml	2009-06-09 20:12:01 UTC (rev 1020)
@@ -29,10 +29,10 @@
 %CustomDTD;
 ]>
 <chapter id="rest_service">
-  <title>The JBoss DNA REST Server</title>
+  <title>The JBoss DNA RESTful Web Service</title>
   <para>
-		JBoss DNA now provides a RESTful interface to its JCR implementation that allows HTTP-based publishing
-		and unpublishing of content.  Although the initial version of this REST server only supports the JBoss DNA
+		JBoss DNA now provides a RESTful interface to its JCR implementation that allows HTTP-based 
+		access and updating of content.  Although the initial version of this REST server only supports the JBoss DNA
 		JCR implementation, it has been designed to make integration with other JCR implementors easy.  This
 		chapter describes how to configure and deploy the REST server. 
   </para>
@@ -240,7 +240,7 @@
 <!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
                          "http://java.sun.com/dtd/web-app_2_3.dtd">
 <web-app>
-	<display-name>JBoss DNA JCR RESTful Interface</display-name>
+  <display-name>JBoss DNA JCR RESTful Interface</display-name>
 ]]></programlisting>			 
 		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.
@@ -248,15 +248,15 @@
 		<para>
 			The next stanza configures the <link linkend="jcr_rest_spi">repository provider</link>.
 <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
-		by the DnaJcrDeployer that controls the lifecycle for the DNA REST server.
-	-->
-	<context-param>
-		<param-name>org.jboss.dna.web.jcr.rest.REPOSITORY_PROVIDER</param-name>
-		<param-value>org.jboss.dna.web.jcr.rest.spi.DnaJcrRepositoryProvider</param-value>
-	</context-param>
+  <!--
+    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
+    by the DnaJcrDeployer that controls the lifecycle for the DNA REST server.
+  -->
+  <context-param>
+    <param-name>org.jboss.dna.web.jcr.rest.REPOSITORY_PROVIDER</param-name>
+    <param-value>org.jboss.dna.web.jcr.rest.spi.DnaJcrRepositoryProvider</param-value>
+  </context-param>
 ]]></programlisting>			 
 		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
@@ -266,16 +266,16 @@
 		<para>
 			Next we configure the DNA &JcrEngine; itself.
 <programlisting role="xml"><![CDATA[
-	<!--
-		This parameter, specific to the DnaJcrRepositoryProvider implementation, specifies
-		the name of the configuration file to initialize the repository or repositories.
-		This configuration file must be on the classpath and is given as a classpath-relative
-		directory.
-	-->
-	<context-param>
-		<param-name>org.jboss.dna.web.jcr.rest.CONFIG_FILE</param-name>
-		<param-value>/configRepository.xml</param-value>
-	</context-param>
+  <!--
+    This parameter, specific to the DnaJcrRepositoryProvider implementation, specifies
+    the name of the configuration file to initialize the repository or repositories.
+    This configuration file must be on the classpath and is given as a classpath-relative
+    directory.
+  -->
+  <context-param>
+    <param-name>org.jboss.dna.web.jcr.rest.CONFIG_FILE</param-name>
+    <param-value>/configRepository.xml</param-value>
+  </context-param>
 ]]></programlisting>			 
 		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>
@@ -285,41 +285,40 @@
 		<para>
 			This is followed by a bit of RESTEasy and JAX-RS boilerplate.
 <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
-		of the JAX-RS specification like exception handling and resource serving.
+  <!--
+    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
+    of the JAX-RS specification like exception handling and resource serving.
 		
-		This should not be modified. 
-	 -->
-	<context-param>
-		<param-name>javax.ws.rs.Application</param-name>
-		<param-value>org.jboss.dna.web.jcr.rest.JcrApplication</param-value>
-	</context-param>
+    This should not be modified. 
+  -->
+  <context-param>
+    <param-name>javax.ws.rs.Application</param-name>
+    <param-value>org.jboss.dna.web.jcr.rest.JcrApplication</param-value>
+  </context-param>
 
-	<!-- Required parameter for RESTEasy - should not be modified -->
-	<listener>
-		<listener-class>org.jboss.resteasy.plugins.server.servlet.ResteasyBootstrap</listener-class>
-	</listener>
+  <!-- Required parameter for RESTEasy - should not be modified -->
+  <listener>
+    <listener-class>org.jboss.resteasy.plugins.server.servlet.ResteasyBootstrap</listener-class>
+  </listener>
 
-	<!-- Required parameter for JBoss DNA REST - should not be modified -->
-	<listener>
-		<listener-class>org.jboss.dna.web.jcr.rest.DnaJcrDeployer</listener-class>
-	</listener>
+  <!-- Required parameter for JBoss DNA REST - should not be modified -->
+  <listener>
+    <listener-class>org.jboss.dna.web.jcr.rest.DnaJcrDeployer</listener-class>
+  </listener>
 
-	<!-- Required parameter for RESTEasy - should not be modified -->
-	<servlet>
-		<servlet-name>Resteasy</servlet-name>
-		<servlet-class>org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher</servlet-class>
-	</servlet>
+  <!-- Required parameter for RESTEasy - should not be modified -->
+  <servlet>
+    <servlet-name>Resteasy</servlet-name>
+    <servlet-class>org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher</servlet-class>
+  </servlet>
 
-	<!-- Required parameter for JBoss DNA REST - should not be modified -->
-	<servlet-mapping>
-		<servlet-name>Resteasy</servlet-name>
-		<url-pattern>/*</url-pattern>
-	</servlet-mapping>
+  <!-- Required parameter for JBoss DNA REST - should not be modified -->
+  <servlet-mapping>
+    <servlet-name>Resteasy</servlet-name>
+    <url-pattern>/*</url-pattern>
+  </servlet-mapping>
 
-
 ]]></programlisting>			 
 		In general, this part of the web configuration file should not be modified.
 		</para>
@@ -327,42 +326,42 @@
 		<para>
 			Finally, security must be configured for the REST server.
 <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,
-		so this constraint helps lock down the repository.
+  <!-- 
+    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,
+    so this constraint helps lock down the repository.
 		
-		This should generally not be modified. 
-	-->
-	<security-constraint>
-		<display-name>DNA REST</display-name>
-		<web-resource-collection>
-			<web-resource-name>RestEasy</web-resource-name>
-			<url-pattern>/*</url-pattern>
-		</web-resource-collection>
-		<auth-constraint>
+    This should generally not be modified. 
+  -->
+  <security-constraint>
+    <display-name>DNA REST</display-name>
+    <web-resource-collection>
+      <web-resource-name>RestEasy</web-resource-name>
+      <url-pattern>/*</url-pattern>
+    </web-resource-collection>
+    <auth-constraint>
 			<!--  
-				A user must be assigned this role to connect to any JCR repository, in addition to needing the READONLY
-				or READWRITE roles to actually read or modify the data.  This is not used internally, so another
-				role could be substituted here.
-			-->
-			<role-name>connect</role-name>
-		</auth-constraint>
-	</security-constraint>
+        A user must be assigned this role to connect to any JCR repository, in addition to needing the READONLY
+        or READWRITE roles to actually read or modify the data.  This is not used internally, so another
+        role could be substituted here.
+      -->
+      <role-name>connect</role-name>
+    </auth-constraint>
+  </security-constraint>
 
-	<!--  
-		Any auth-method will work for JBoss DNA.  BASIC is used this example for simplicity.
-	 -->
-	<login-config>
-		<auth-method>BASIC</auth-method>
-	</login-config>
+  <!--  
+    Any auth-method will work for JBoss DNA.  BASIC is used this example for simplicity.
+  -->
+  <login-config>
+    <auth-method>BASIC</auth-method>
+  </login-config>
 
-	<!-- 
-		This must match the role-name in the auth-constraint above. 
-	 -->
-	<security-role>
-		<role-name>connect</role-name>
-	</security-role>
+  <!-- 
+    This must match the role-name in the auth-constraint above. 
+  -->
+  <security-role>
+    <role-name>connect</role-name>
+  </security-role>
 </web-app>
 
 ]]></programlisting>			 
@@ -384,8 +383,9 @@
 	  		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[
-<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>
@@ -502,7 +502,6 @@
      InputStream configFileInputStream = getClass().getResourceAsStream(configFile);
      jcrEngine = new JcrConfiguration().loadFrom(configFileInputStream).build();
      jcrEngine.start();
-
 }
 ]]></programlisting>
 			As you can see, the name of configuration file for the &JcrEngine; is read from the servlet context and used
@@ -533,7 +532,6 @@
 	SecurityContext context = new ServletSecurityContext(request);
 	Credentials credentials = new SecurityContextCredentials(context);
     return repository.login(credentials, workspaceName);
-
 }
 ]]></programlisting>
 			The <code>getSession(...)</code> method is used by most of the REST server methods to access the JCR 

Modified: trunk/docs/reference/src/main/docbook/en-US/master.xml
===================================================================
--- trunk/docs/reference/src/main/docbook/en-US/master.xml	2009-06-09 20:08:03 UTC (rev 1019)
+++ trunk/docs/reference/src/main/docbook/en-US/master.xml	2009-06-09 20:12:01 UTC (rev 1020)
@@ -93,10 +93,12 @@
 			  The JBoss DNA project provides an implementation of the <ulink url="&JSR170;">JCR API</ulink>, which is
 			  built on top of the <link linkend="core-part">core libraries</link> discussed earlier.  This implementation
 			  as well as a number of JCR-related components are described in this part of the document.
+				But before talking about how to use the JCR API with a JBoss DNA repository, first we need to
+				show how to set up a JBoss DNA engine.
 			</para>
 		</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/configuration.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  Tue Jun  9 17:08:19 2009
From: dna-commits at lists.jboss.org (dna-commits at lists.jboss.org)
Date: Tue, 09 Jun 2009 17:08:19 -0400
Subject: [dna-commits] DNA SVN: r1021 - in
	trunk/docs/reference/src/main/docbook/en-US/content:
	sequencers and 1 other directory.
Message-ID: <E1ME8YN-00026w-Ql@committer01.frg.pub.inap.atl.jboss.com>

Author: bcarothers
Date: 2009-06-09 17:08:19 -0400 (Tue, 09 Jun 2009)
New Revision: 1021

Modified:
   trunk/docs/reference/src/main/docbook/en-US/content/jcr/configuration.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/image.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/xml.xml
   trunk/docs/reference/src/main/docbook/en-US/content/sequencers/zip.xml
Log:
Updated the example configuration code for each of the sequencers.  Fixed a small typo in the configuration 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	2009-06-09 20:12:01 UTC (rev 1020)
+++ trunk/docs/reference/src/main/docbook/en-US/content/jcr/configuration.xml	2009-06-09 21:08:19 UTC (rev 1021)
@@ -367,7 +367,7 @@
 	<sect1 id="using_dna_whats_next">
 		<title>What's next</title>
 		<para>
-			This chapter outline how you configure JBoss DNA, how you then access a <code>javax.jcr.Repository</code> instance,
+			This chapter outlines how you configure JBoss DNA, how you then access a <code>javax.jcr.Repository</code> instance,
 			and use the standard JCR API to interact with the repository. The
 			<link linkend="jcr">next chapter</link> talks about using the JCR API with your JBoss DNA repository.
 		</para>

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	2009-06-09 20:12:01 UTC (rev 1020)
+++ trunk/docs/reference/src/main/docbook/en-US/content/sequencers/compact_node_types.xml	2009-06-09 21:08:19 UTC (rev 1021)
@@ -32,6 +32,22 @@
   <title>Compact Node Type (CND) Sequencer</title>
   <para>
   	This sequencer processes JCR Compact Node Definition (CND) files
-		to extract the node definitions with their property definitions, and inserts these into the repository using JCR standard notation.
+		to extract the node definitions with their property definitions, and inserts these into the repository using JCR built-in types.
+	The node structure generated by this sequencer is equivalent to the node structure used in <code>/jcr:system/jcr:nodeTypes</code>.
   </para>
+  
+  <para>
+  	This sequencer can be added to the repository configuration like so:
+<programlisting>
+JcrConfiguration config = ...
+
+config.sequencer("CND Sequencer")
+      .usingClass("org.jboss.dna.sequencer.cnd.CndSequencer")
+      .loadedFromClasspath()
+      .setDescription("Sequences CND files to extract the node type definitions")
+      .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/image.xml
===================================================================
--- trunk/docs/reference/src/main/docbook/en-US/content/sequencers/image.xml	2009-06-09 20:12:01 UTC (rev 1020)
+++ trunk/docs/reference/src/main/docbook/en-US/content/sequencers/image.xml	2009-06-09 21:08:19 UTC (rev 1021)
@@ -93,16 +93,16 @@
      </para>
 		<para>
 			To use this sequencer, simply include the <code>dna-sequencer-images</code> JAR
-			in your application and configure	the Sequencing Service to use this sequencer using something similar to:
+			in your application and configure the &JcrConfiguration; to use this sequencer using something similar to:
      </para>
    	<programlisting>
-String name = "Image Sequencer";
-String desc = "Sequences image files to extract the characteristics of the image";
-String classname = "org.jboss.dna.sequencer.images.ImageMetadataSequencer";
-String[] classpath = null; // Use the current classpath
-String[] pathExpressions = {"//(*.(jpg|jpeg|gif|bmp|pcx|png|iff|ras|pbm|pgm|ppm|psd)[*])/jcr:content[@jcr:data] =&gt; /images/$1"};
-&SequencerConfig; sequencerConfig = new &SequencerConfig;(name, desc, classname, 
-                                                      classpath, pathExpressions);
-sequencingService.addSequencer(sequencerConfig);
+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>
 </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	2009-06-09 20:12:01 UTC (rev 1020)
+++ trunk/docs/reference/src/main/docbook/en-US/content/sequencers/java_source.xml	2009-06-09 21:08:19 UTC (rev 1021)
@@ -42,16 +42,16 @@
 	</para>
 	<para>
 		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 Sequencing Service to use this sequencer using something similar to:
+		in your application and configure the &JcrConfiguration; to use this sequencer using something similar to:
     </para>
   <programlisting>
-String name = "Java Sequencer";
-String desc = "Sequences java files to extract the characteristics of the Java source";
-String classname = "org.jboss.dna.sequencer.java.JavaMetadataSequencer";
-String[] classpath = null; // Use the current classpath
-String[] pathExpressions = {"//(*.java[*])/jcr:content[@jcr:data] =&gt; /java/$1"};
-&SequencerConfig; sequencerConfig = new &SequencerConfig;(name, desc, classname, 
-                                                      classpath, pathExpressions);
-this.sequencingService.addSequencer(sequencerConfig);
+JcrConfiguration config = ...
+
+config.sequencer("Java Sequencer")
+      .usingClass("org.jboss.dna.sequencer.java.JavaMetadataSequencer")
+      .loadedFromClasspath()
+      .setDescription("Sequences java files to extract the characteristics of the Java source")
+      .sequencingFrom("//(*.(java)[*])/jcr:content[@jcr:data]")
+      .andOutputtingTo("/java/$1");	
 </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	2009-06-09 20:12:01 UTC (rev 1020)
+++ trunk/docs/reference/src/main/docbook/en-US/content/sequencers/microsoft_office.xml	2009-06-09 21:08:19 UTC (rev 1021)
@@ -32,7 +32,7 @@
   <title><trademark class='registered'>Microsoft Office</trademark> Document Sequencer</title>
    <para>
    	This sequencer is included in JBoss DNA and processes Microsoft Office documents, including Word documents, Excel spreadsheets,
-	and PowerPoint presentations.  With documents, the sequencer extracts the internal structure based on Heading styles.
+	and PowerPoint presentations.  With documents, the sequencer attempts to infer the internal structure from the heading styles.
 	With presentations, the sequencer extracts the slides, titles, text and slide thumbnails.
 	With spreadsheets, the sequencer extracts the names of the sheets.  And, the sequencer extracts for all the files the
 	general file information, including the name of the author, title, keywords, subject, comments, and various dates.
@@ -40,16 +40,16 @@
 <para>
 	To use this sequencer, simply include the <code>dna-sequencer-msoffice</code> JAR and all of the
 	<ulink url="http://poi.apache.org/">POI</ulink> JARs
-	in your application and configure	the Sequencing Service to use this sequencer using something similar to:
+	in your application and configure the &JcrConfiguration; to use this sequencer using something similar to:
    </para>
   <programlisting>
-String name = "Microsoft Office Document Sequencer";
-String desc = "Sequences MS Office documents, including spreadsheets and presentations";
-String classname = "org.jboss.dna.sequencer.msoffice.MSOfficeMetadataSequencer";
-String[] classpath = null; // Use the current classpath
-String[] pathExpressions = {"//(*.(doc|docx|ppt|pps|xls)[*])/jcr:content[@jcr:data] =&gt; /msoffice/$1"};
-&SequencerConfig; sequencerConfig = new &SequencerConfig;(name, desc, classname, 
-                                                      classpath, pathExpressions);
-sequencingService.addSequencer(sequencerConfig);
+JcrConfiguration config = ...
+
+config.sequencer("Microsoft Office Document Sequencer")
+      .usingClass("org.jboss.dna.sequencer.msoffice.MSOfficeMetadataSequencer")
+      .loadedFromClasspath()
+      .setDescription("Sequences MS Office documents, including spreadsheets and presentations")
+      .sequencingFrom("//(*.(*.(doc|docx|ppt|pps|xls)[*])/jcr:content[@jcr:data]")
+      .andOutputtingTo("/msoffice/$1");	
 </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	2009-06-09 20:12:01 UTC (rev 1020)
+++ trunk/docs/reference/src/main/docbook/en-US/content/sequencers/mp3.xml	2009-06-09 21:08:19 UTC (rev 1021)
@@ -39,15 +39,16 @@
 	      </para>
 				<para>
 					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 Sequencing Service to use this sequencer using something similar to:
+					library in your application and configure the &JcrConfiguration; to use this sequencer using something similar to:
 	      </para>
 		    <programlisting>
-	String name = "MP3 Sequencer";
-	String desc = "Sequences MP3 files to extract the ID3 tags of the audio file";
-	String classname = "org.jboss.dna.sequencer.mp3.Mp3MetadataSequencer";
-	String[] pathExpressions = {"//(*.mp3[*])/jcr:content[@jcr:data] =&gt; /mp3s/$1"};
-	&SequencerConfig; sequencerConfig = new &SequencerConfig;(name, desc, classname, 
-	                                                      classpath, pathExpressions);
-	this.sequencingService.addSequencer(sequencerConfig);
+JcrConfiguration config = ...
+
+config.sequencer("MP3 Sequencer")
+      .usingClass("org.jboss.dna.sequencer.mp3.Mp3MetadataSequencer")
+      .loadedFromClasspath()
+      .setDescription("Sequences MP3 files to extract the ID3 tags of the audio file")
+      .sequencingFrom("//(*.mp3[*])/jcr:content[@jcr:data]")
+      .andOutputtingTo("/mp3s/$1");	
 	</programlisting>
 </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	2009-06-09 20:12:01 UTC (rev 1020)
+++ trunk/docs/reference/src/main/docbook/en-US/content/sequencers/xml.xml	2009-06-09 21:08:19 UTC (rev 1021)
@@ -31,6 +31,17 @@
 <chapter id="xml-sequencer">
   <title>XML Document Sequencer</title>
   <para>
-    This sequencer stores the structure and data of an XML file into the repository.
+    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>
+JcrConfiguration config = ...
+
+config.sequencer("XML Sequencer")
+      .usingClass("org.jboss.dna.sequencer.xml.XmlSequencer")
+      .loadedFromClasspath()
+      .setDescription("Sequences XML documents and maps their data into the repository")
+      .sequencingFrom("//(*.xml[*])/jcr:content[@jcr:data]")
+      .andOutputtingTo("/xml/$1");	
+</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	2009-06-09 20:12:01 UTC (rev 1020)
+++ trunk/docs/reference/src/main/docbook/en-US/content/sequencers/zip.xml	2009-06-09 21:08:19 UTC (rev 1021)
@@ -32,19 +32,21 @@
   <title>ZIP File Sequencer</title>
     <para>
     	The ZIP file sequencer is included in JBoss DNA and extracts the files and folders contained in the ZIP archive file,
-		extracting the files and folders into the repository using JCR's <code>nt:file</code> and <code>nt:folder</code> node types.
+		extracting the files and folders into the repository using JCR's <code>nt:file</code> and <code>nt:folder</code> 
+		built-in node types.  The structure of the output thus matches the logical structure of the contents of the ZIP file.
     </para>
 	<para>
 		To use this sequencer, simply include the <code>dna-sequencer-zip</code> JAR
-		in your application and configure	the Sequencing Service to use this sequencer using something similar to:
+		in your application and configure the &JcrConfiguration; to use this sequencer using something similar to:
     </para>
    <programlisting>
-String name = "ZIP Sequencer";
-String desc = "Sequences ZIP archives to extract the files and folders";
-String classname = "org.jboss.dna.sequencer.zip.ZipSequencer";
-String[] pathExpressions = {"//(*.zip[*])/jcr:content[@jcr:data] =&gt; /zips/$1"};
-&SequencerConfig; sequencerConfig = new &SequencerConfig;(name, desc, classname, 
-                                                      classpath, pathExpressions);
-this.sequencingService.addSequencer(sequencerConfig);
-</programlisting>
+JcrConfiguration config = ...
+
+config.sequencer("ZIP Sequencer")
+      .usingClass("org.jboss.dna.sequencer.zip.ZipSequencer")
+      .loadedFromClasspath()
+      .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>
 </chapter>
\ No newline at end of file



From dna-commits at lists.jboss.org  Tue Jun  9 18:51:55 2009
From: dna-commits at lists.jboss.org (dna-commits at lists.jboss.org)
Date: Tue, 09 Jun 2009 18:51:55 -0400
Subject: [dna-commits] DNA SVN: r1022 -
	trunk/dna-repository/src/main/java/org/jboss/dna/repository/sequencer.
Message-ID: <E1MEAAd-0006dm-Oh@committer01.frg.pub.inap.atl.jboss.com>

Author: bcarothers
Date: 2009-06-09 18:51:55 -0400 (Tue, 09 Jun 2009)
New Revision: 1022

Modified:
   trunk/dna-repository/src/main/java/org/jboss/dna/repository/sequencer/StreamSequencerAdapter.java
Log:
DNA-443 Java sequencer is not saving content correctly

Well, the initial guess was in the ballpark but not correct.

Part of the StreamSequencerAdapter code (the buildPathTo part) was operating directly against the graph for reads and writes.  The other part (saveOutput) was operating against a destination that happened to be a batch.  The batch doesn't save until all of the processing for the output of a particular sequencer is complete, leading to some race conditions between the two parts of the code.  The batch is there to support a all-or-nothing save semantics for the output of a particular sequencer.

The most correct solution is to switch all of the code to use a batch, but this creates some challenges.  For one thing, the batch doesn't support the concept of createIfMissing semantics or reads of any sort.  I think that we would have to keep some sort of internal graph of nodes added to the batch while processing the sequencer output and check against that as well as the nodes in the graph.

My workaround for now is to make all of the operations in StreamSequencerAdapter work directly against the graph.  We can always revisit this in 0.6.

Modified: trunk/dna-repository/src/main/java/org/jboss/dna/repository/sequencer/StreamSequencerAdapter.java
===================================================================
--- trunk/dna-repository/src/main/java/org/jboss/dna/repository/sequencer/StreamSequencerAdapter.java	2009-06-09 21:08:19 UTC (rev 1021)
+++ trunk/dna-repository/src/main/java/org/jboss/dna/repository/sequencer/StreamSequencerAdapter.java	2009-06-09 22:51:55 UTC (rev 1022)
@@ -32,11 +32,14 @@
 import java.util.List;
 import java.util.Set;
 import org.jboss.dna.common.collection.Problems;
+import org.jboss.dna.graph.JcrLexicon;
+import org.jboss.dna.graph.JcrNtLexicon;
 import org.jboss.dna.graph.Node;
 import org.jboss.dna.graph.observe.NetChangeObserver.NetChange;
 import org.jboss.dna.graph.property.Binary;
 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.ValueFactories;
@@ -177,19 +180,26 @@
     private void buildPathTo( Path targetPath,
                               SequencerContext context ) {
         PathFactory pathFactory = context.getExecutionContext().getValueFactories().getPathFactory();
+        PropertyFactory propFactory = context.getExecutionContext().getPropertyFactory();
 
         if (targetPath.isRoot()) return;
         Path workingPath = pathFactory.createRootPath();
         Path.Segment[] segments = targetPath.getSegmentsArray();
         int i = 0;
         if (segments.length > 1) {
+            Property primaryType = propFactory.create(JcrLexicon.PRIMARY_TYPE, JcrNtLexicon.UNSTRUCTURED);
             for (int max = segments.length - 1; i < max; i++) {
                 workingPath = pathFactory.create(workingPath, segments[i]);
-                context.graph().createIfMissing(workingPath);
+                
+                try {
+                    context.graph().getNodeAt(workingPath);
+                }
+                catch (PathNotFoundException pnfe) {
+                    context.graph().create(workingPath, primaryType);
+                }
             }
         }
-        workingPath = pathFactory.create(workingPath, segments[i]);
-        context.graph().create(workingPath);
+        context.graph().create(targetPath); 
     }
 
     /**
@@ -228,7 +238,7 @@
             if (absolutePath.getParent() != null) {
                 buildPathTo(absolutePath.getParent(), context);
             }
-            context.getDestination().create(absolutePath, properties);
+            context.graph().create(absolutePath, properties);
         }
     }
 



From dna-commits at lists.jboss.org  Tue Jun  9 19:50:21 2009
From: dna-commits at lists.jboss.org (dna-commits at lists.jboss.org)
Date: Tue, 09 Jun 2009 19:50:21 -0400
Subject: [dna-commits] DNA SVN: r1023 - in
	trunk/docs/reference/src/main/docbook/en-US: content and 2
	other directories.
Message-ID: <E1MEB5B-0000vX-Gc@committer01.frg.pub.inap.atl.jboss.com>

Author: rhauch
Date: 2009-06-09 19:50:21 -0400 (Tue, 09 Jun 2009)
New Revision: 1023

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/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/introduction.xml
   trunk/docs/reference/src/main/docbook/en-US/custom.dtd
   trunk/docs/reference/src/main/docbook/en-US/images/dna-connector-federation.graffle
   trunk/docs/reference/src/main/docbook/en-US/images/dna-connector-federation.png
Log:
Added more detail in each of the connector library chapters of 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	2009-06-09 22:51:55 UTC (rev 1022)
+++ trunk/docs/reference/src/main/docbook/en-US/content/connectors/federation.xml	2009-06-09 23:50:21 UTC (rev 1023)
@@ -30,42 +30,339 @@
 ]>
 <chapter id="federation-connector">
   <title>Federation Connector</title>
+     <para>
+     	The federated repository source provides a unified repository consisting of information that is dynamically federated from multiple other
+			&RepositorySource; instances.  This is a very powerful repository source that appears to be a single repository, when in 
+			fact the content is stored and managed in multiple other systems.  Each &FederatedRepositorySource; is typically configured
+			with the name of another &RepositorySource; that should be used as the local, unified cache of the federated content.
+			The &FederatedRepositorySource; then looks in the configuration repository to determine the various workspaces
+			and how other sources are projected into each workspace.
+     </para>
+		<figure id="dna-connector-federation-image">
+			<title>Federating multiple sources using the Federated Repository Connector</title>
+			<graphic align="center" scale="100" fileref="dna-connector-federation.png"/>
+		</figure>
+		<sect1>
+			<title>Projections</title>
       <para>
-      	The federated repository source provides a unified repository consisting of information that is dynamically federated from multiple other
-				&RepositorySource; instances.  This is a very powerful repository source that appears to be a single repository, when in 
-				fact the content is stored and managed in multiple other systems.  Each &FederatedRepositorySource; is typically configured
-				with the name of another &RepositorySource; that should be used as the local, unified cache of the federated content.
-				The configuration also contains the names of the other &RepositorySource; instances that are to be federated along with
-				the &Projection; definition describing where in the unified repository the content is to appear.
+			 Each federated repository source provides a unified repository consisting of information that is dynamically federated
+			 from multiple other &RepositorySource; instances. The connector is configured with a number of <strong>projections</strong>
+			 that each describe where in the unified repository the federated connector should place the content from another source.
+			 Projections consist of the name of the source containing the content and a number of <strong>rules</strong> that
+			 define the path mappings, where each rule is defined as a string with this format:
       </para>
-			<figure id="dna-connector-federation-image">
-				<title>Federating multiple sources using the Federated Repository Connector</title>
-				<graphic align="center" scale="100" fileref="dna-connector-federation.png"/>
-			</figure>
-      <para> The federation connector works by effectively building up a single graph by querying each source and merging or
-        unifying the responses. This information is cached, which improves performance, reduces the number of (potentially
-        expensive) remote calls, reduces the load on the sources, and helps mitigate problems with source availability. As
-        clients interact with the repository, this cache is consulted first. When the requested portion of the graph (or
-        "subgraph") is contained completely in the cache, it is retuned immediately. However, if any part of the requested
-        subgraph is not in the cache, each source is consulted for their contributions to that subgraph, and any results are
-        cached.</para>
-      <para> This basic flow makes it possible for the federated repository to build up a local cache of the integrated graph
-        (or at least the portions that are used by clients). In fact, the federated repository caches information in a manner
-        that is similar to that of the Domain Name System (DNS). As sources are consulted for their contributions, the source
-        also specifies whether it is the authoritative source for this information (some sources that are themselves federated
-        may not be the information's authority), whether the information may be modified, the time-to-live (TTL) value (the time
-        after which the cached information should be refreshed), and the expiration time (the time after which the cached
-        information is no longer valid). In effect, the source has complete control over how the information it contributes is
-        cached and used.</para>
-      <para>
-        The federated repository also needs to incorporate <emphasis>negative caching</emphasis>, which is storage of the knowledge 
-				that something does <emphasis>not</emphasis> exist. Sources can be configured to contribute information
-        only below certain paths (e.g., <code>/A/B/C</code>), and the federation engine can take advantage of this by never 
-				consulting that source for contributions to information on other paths. However, below that path, any negative responses 
-				must also be cached (with appropriate TTL and expiry parameters) to prevent the exclusion of that source (in case the source 
-				has information to contribute at a later time) or the frequent checking with the source.
-      </para>
+			<programlisting>pathInFederatedRepository => pathInSourceRepository</programlisting>
+     	<para>
+			 Here, the <code>pathInFederatedRepository</code> is the string representation of the path in the unified
+			 (or federated) repository, and <code>pathInSourceRepository</code> is the string representation of the path of the
+			 actual content in the underlying source.  For example:
+    	</para>
+			<programlisting>/ => /</programlisting>
+     	<para>
+			  is a trivial rule that states that all of the content in the underlying source should be mapped into the unified
+			  repository such that the locations are the same.  Therefore, a node at <code>/a/b/c</code> in the source would
+			  appear in the unified repository at <code>/a/b/c</code>.  This is called a <strong>mirror projection</strong>,
+			  since the unified repository mirrors the underlying source repository.
+    	</para>
+     	<para>
+			  Another example is an <strong>offset projection</strong>, which is similar to the mirror projection except that
+			  the federated path includes an offset not found in the source:
+    	</para>
+			<programlisting>/alpha/beta => /</programlisting>
+     	<para>
+			  Here, a node at <code>/a/b/c</code> in the source would actually appear in the unified repository at 
+			  <code>/alpha/beta/a/b/c</code>.  The offset path (<code>/alpha/beta</code> in this example) can have 1 or more segments.
+			  (If there are no segments, then it reduces to a mirror projection.)
+    	</para>
+     	<para>
+			  Often a rule will map a path in one source into another path in the unified source:
+    	</para>
+			<programlisting>/alpha/beta => /foo/bar</programlisting>
+     	<para>
+			  Here, the content at <code>/foo/bar</code> is projected in the unified repository under <code>/alpha/beta</code>,
+			  meaning that the <code>/foo/bar</code> prefix never even appears in the unified repository.  So the node at
+			  <code>/foo/bar/baz/raz</code> would appear in the unified repository at <code>/alpha/beta/baz/raz</code>.  Again,
+			  the size of the two paths in the rule don't matter.
+     	</para>
+		</sect1>
+		<sect1>
+			<title>Multiple Projections</title>
+		  <h3>Multiple Projections</h3>
+		  <para>
+		  Federated repositories that use a single projection are useful, but they aren't as interesting or powerful as
+		  those that use multiple projections.  Consider a federated repository that is defined by two projections:
+		  </para>
+<programlisting>
+/ => /                         for source "S1"
+/alpha => /foo/bar             for source "S2"
+</programlisting>
+		  <para>
+		  And consider that S1 contains the following structure:
+		  </para>
+<programlisting>
++- a
+|  +- i
+|  +- j
++- b
+   +- k
+   +- m
+   +- n
+</programlisting>
+	  <para>
+		  and S2 contains the following:
+		</para>
+<programlisting>
++- foo
+   +- bar
+   |  +- baz
+   |  |  +- taz
+   |  |  +- zaz
+   |  +- raz
+   +- bum
+      +- bot
+</programlisting>
+		  <para>
+		  The unified repository would then have this structure:
+		  </para>
+<programlisting>
++- a
+|  +- i
+|  +- j
++- b
+|  +- k
+|  +- m
+|  +- n
++- alpha
+   +- baz
+      +- taz
+      |  +- zaz
+      +- raz
+</programlisting>
+		  <para>
+		  Note how the <code>/foo/bum</code> branch does not even appear in the unified repository, since it is outside of the
+		  branch being projected. Also, the <code>/alpha</code> node doesn't exist in S1 or S2; it's what is called a
+		  <strong>placeholder</strong> node that exists purely so that the nodes below it have a place to exist.
+		  Placeholders are somewhat special: they allow any structure below them (including other placeholder nodes or real
+		  projected nodes), but they cannot be modified.
+		  </para>
+		  <para>
+		  Even more interesting are cases that involve more projections.  Consider a federated repository that contains
+		  information about different kinds of automobiles, aircraft, and spacecraft, except that the information
+		  about each kind of vehicle exists in a different source (and possibly a different <i>kind</i> of source, such as
+		  a database, or file, or web service).
+			</para>
+		  <para>
+		  First, the sources.  The "Cars" source contains the following structure:
+		  </para>
+<programlisting>
++- Cars
+   +- Hybrid
+   |  +- Toyota Prius
+   |  +- Toyota Highlander
+   |  +- Nissan Altima
+   +- Sports
+   |  +- Aston Martin DB9
+   |  +- Infinity G37
+   +- Luxury
+   |  +- Cadillac DTS
+   |  +- Bentley Continental
+   |  +- Lexus IS350
+   +- Utility
+      +- Land Rover LR2
+      +- Land Rover LR3
+      +- Hummer H3
+      +- Ford F-150
+</programlisting>
+		  <para>
+		  The "Aircraft" source contains the following structure:
+		  </para>
+<programlisting>
++- Aviation
+   +- Business
+   |  +- Gulfstream V
+   |  +- Learjet 45
+   +- Commercial
+   |  +- Boeing 777
+   |  +- Boeing 767
+   |  +- Boeing 787
+   |  +- Boeing 757
+   |  +- Airbus A380
+   |  +- Airbus A340
+   |  +- Airbus A310
+   |  +- Embraer RJ-175
+   +- Vintage
+   |  +- Fokker Trimotor
+   |  +- P-38 Lightning
+   |  +- A6M Zero
+   |  +- Bf 109
+   |  +- Wright Flyer
+   +- Homebuilt
+      +- Long-EZ
+      +- Cirrus VK-30
+      +- Van's RV-4
+</programlisting>
+		  <para>
+		  Finally, our "Spacecraft" source contains the following structure:
+		  </para>
+<programlisting>
++- Space Vehicles
+   +- Manned
+   |  +- Space Shuttle
+   |  +- Soyuz
+   |  +- Skylab
+   |  +- ISS
+   +- Unmanned
+   |  +- Sputnik
+   |  +- Explorer
+   |  +- Vanguard
+   |  +- Pioneer
+   |  +- Marsnik
+   |  +- Mariner
+   |  +- Mars Pathfinder
+   |  +- Mars Observer
+   |  +- Mars Polar Lander
+   +- Launch Vehicles
+   |  +- Saturn V
+   |  +- Aries
+   |  +- Delta
+   |  +- Delta II
+   |  +- Orion
+   +- X-Prize
+      +- SpaceShipOne
+      +- WildFire
+      +- Spirit of Liberty
+</programlisting>
+		  <para>
+		  So, we can define our unified "Vehicles" source with the following projections:
+		  </para>
+<programlisting>
+/Vehicles => /                                  for source "Cars"
+/Vehicles/Aircraft => /Aviation                 for source "Aircraft"
+/Vehicles/Spacecraft => /Space Vehicles         for source "Cars"
+</programlisting>
+		  <para>
+		  The result is a unified repository with the following structure:
+		  </para>
+<programlisting>
++- Vehicles
+   +- Cars
+   |  +- Hybrid
+   |   |  +- Toyota Prius
+   |   |  +- Toyota Highlander
+   |   |  +- Nissan Altima
+   |   +- Sports
+   |   |  +- Aston Martin DB9
+   |   |  +- Infinity G37
+   |   +- Luxury
+   |   |  +- Cadillac DTS
+   |   |  +- Bentley Continental
+   |  +- Lexus IS350
+   |  +- Utility
+   |     +- Land Rover LR2
+   |     +- Land Rover LR3
+   |     +- Hummer H3
+   |     +- Ford F-150
+   +- Aircraft
+   |   +- Business
+   |   |  +- Gulfstream V
+   |   |  +- Learjet 45
+   |   +- Commercial
+   |   |  +- Boeing 777
+   |   |  +- Boeing 767
+   |   |  +- Boeing 787
+   |   |  +- Boeing 757
+   |   |  +- Airbus A380
+   |   |  +- Airbus A340
+   |   |  +- Airbus A310
+   |   |  +- Embraer RJ-175
+   |   +- Vintage
+   |   |  +- Fokker Trimotor
+   |   |  +- P-38 Lightning
+   |   |  +- A6M Zero
+   |   |  +- Bf 109
+   |   |  +- Wright Flyer
+   |   +- Homebuilt
+   |      +- Long-EZ
+   |      +- Cirrus VK-30
+   |      +- Van's RV-4
+   +- Spacecraft
+      +- Manned
+      |  +- Space Shuttle
+      |  +- Soyuz
+      |  +- Skylab
+      |  +- ISS
+      +- Unmanned
+      |  +- Sputnik
+      |  +- Explorer
+      |  +- Vanguard
+      |  +- Pioneer
+      |  +- Marsnik
+      |  +- Mariner
+      |  +- Mars Pathfinder
+      |  +- Mars Observer
+      |  +- Mars Polar Lander
+      +- Launch Vehicles
+      |  +- Saturn V
+      |  +- Aries
+      |  +- Delta
+      |  +- Delta II
+      |  +- Orion
+      +- X-Prize
+         +- SpaceShipOne
+         +- WildFire
+         +- Spirit of Liberty
+</programlisting>
+		  <para>
+		  Other combinations are of course possible.
+		  </para>
+		</sect1>
+		<sect1>
+			<title>Processing flow</title>
 			<para>
+		  This connctor executes &Requests; against the federated repository by
+		  projecting them into requests against the underlying sources that are being federated.
+			</para>
+		  <para>
+		  One important design of the connector framework is that requests can be submitted in a batch, which may be processed more efficiently 
+			than if each request was submitted one at a time.  
+		  This connector design accomplishes this by projecting the incoming requests into requests against each source, then
+		  submitting the batch of projected requests to each source, and then transforming the results of the projected requests back
+		  into original requests.
+		  </para>
+		  <para>
+		  This is accomplished using a three-step process:
+			</para>
+			<orderedlist>
+				<listitem>
+					<para>
+		  			Process the incoming requests and for each generate the appropriate request(s) against the sources
+		  			(dictated by the {@link FederatedWorkspace workspace's} {@link FederatedWorkspace#getProjections() projections}). These
+		  			"projected requests" are then enqueued for each source.
+					</para>
+				</listitem>
+				<listitem>
+					<para>
+		  			Submit each batch of projected requests to the appropriate source, in parallel where possible.
+					  Note that the requests are still ordered correctly for each source.
+					</para>
+				</listitem>
+				<listitem>
+					<para>
+					  Accumulate the results for the incoming requests by post-processing the projected requests and
+					  transforming the source-specific results back into the federated workspace (again, using the workspace's projections).
+					</para>
+				</listitem>
+			</orderedlist>
+		  <para>
+		  This process is a form of the <i>fork-join</i> divide-and-conquer algorithm, which involves splitting a problem into smaller
+		  parts, forking new subtasks to execute each smaller part, joining on the subtasks (waiting until all have finished), and then
+		  composing the results. Technically, Step 2 performs the fork and join operations, but this class uses &RequestProcessor;
+		  implementations to do Step 1 and 3 (called &ForkRequestProcessor; and &JoinRequestProcessor;, respectively).
+		  </para>
+		</sect1>
+		<sect1>
+			<title>Configuration</title>
+			<para>
 				The federated repository uses other &RepositorySource;s that are to be federated and a &RepositorySource; that is to be used as the
 				cache of the unified contents.  These are configured in another &RepositorySource; that is treated as a configuration repository.
 				The &FederatedRepositorySource; class uses JavaBean properties to define the name of the configuration repository and 
@@ -102,16 +399,10 @@
 					works.
 				</para>
 			</note>
+		</sect1>
+		<sect1>
+			<title>Repository Source properties</title>
 			<para>
-				Notice that there is a cache projection and three source projections, and each projection defines
-				one or more <emphasis>projection rules</emphasis> that are of the form:
-			</para>
-			<programlisting>pathInFederatedRepository =&gt; pathInSourceRepository</programlisting>
-			<para>
-				So, a projection rule <code>/Vehicles =&gt; /</code> projects the entire contents of the source so that
-				it appears in the federated repository under the "<code>/Vehicles</code>" node.
-			</para>
-			<para>
 				The &FederatedRepositorySource; class provides a number of JavaBean properties that control its behavior:
 			</para>
 			<table frame='all'>
@@ -131,10 +422,6 @@
 							<entry>The name of the repository source, which is used by the &RepositoryService; when obtaining a &RepositoryConnection; by name.</entry>
 						</row>
 						<row>
-							<entry>repositoryName</entry>
-							<entry>The name for the federated repository.</entry>
-						</row>
-						<row>
 							<entry>configurationSourceName</entry>
 							<entry>The name of the &RepositorySource; that should be used as the configuration repository, and in which is defined
 								how this federated repository is to be set up and configured.
@@ -152,38 +439,13 @@
 								graph structure describing how this federated repository is to be configured.</entry>
 						</row>
 						<row>
-							<entry>securityDomain</entry>
-							<entry>Optional property that, if used, specifies the name of the JAAS application context that should be used
-								to establish the <link linkend="execution-contenxt">execution context</link> for this repository.
-								This should correspond to the JAAS login configuration located within the JAAS login configuration file, 
-								and should be used only if a "<code>username</code>" property is defined.</entry>
-						</row>
-						<row>
-							<entry>username</entry>
-							<entry>Optional property that, if used, defines the name of the JAAS subject that should be used
-								to establish the <link linkend="execution-contenxt">execution context</link> for this repository.
-								This should be used if a "<code>securityDomain</code>" property is defined.</entry>
-						</row>
-						<row>
-							<entry>password</entry>
-							<entry>Optional property that, if used, defines the password of the JAAS subject that should be used
-								to establish the <link linkend="execution-contenxt">execution context</link> for this repository.
-								If the password is not provided but values for the "<code>securityDomain</code>" and "<code>username</code>" properties are,
-								then authentication will use the default JAAS callback handlers.</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>
 						</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>
 					</tbody>
 				</tgroup>
 			</table>
+		</sect1>
 </chapter>
 

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	2009-06-09 22:51:55 UTC (rev 1022)
+++ trunk/docs/reference/src/main/docbook/en-US/content/connectors/file_system.xml	2009-06-09 23:50:21 UTC (rev 1023)
@@ -31,7 +31,72 @@
 <chapter id="file-system-connector">
   <title>File System Connector</title>
   <para>
-		blah blah 
+		This connector exposes an area of the local file system as a <emphasis>read-only</emphasis> graph of "nt:file" and "nt:folder" nodes. 
+		The connector considers a workspace name to be the path to the directory on the file system that represents the root of that
+		workspace. Each connector can define whether it allows new workspaces can be created, but if so the names of the new workspaces
+		must represent valid paths to existing directories.
   </para>
+	<para>
+		The &FileSystemSource; class provides a number of JavaBean properties that control its behavior:
+	</para>
+	<table frame='all'>
+		<title>&FileSystemSource; 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>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>directoryForDefaultWorkspace</entry>
+					<entry>Optional property that, if used, specifies the file system path to the existing directory that should be used for the 
+						default workspace. If null (or not specified), the source will use the current working directory of this virtual machine
+						(as defined by <code>new File(".").getAbsolutePath()</code>.</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 "fase" value for the "creatingWorkspaceAllowed" property to allow only the use of only 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>
+				</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>
+				</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>
+			</tbody>
+		</tgroup>
+	</table>
+	<para>
+		Using the file system connector is used by creating in the &JcrConfiguration; a repository source that uses the &InMemoryRepositorySource; class.
+		For example:
+	</para>
+  <programlisting role="JAVA"><![CDATA[
+JcrConfiguration config = ...
+config.repositorySource("source A")
+      .usingClass(FileSystemSource.class)
+      .setDescription("The repository for our content")
+      .setProperty("directoryForDefaultWorkspace", "file://some/file/path")
+      .setProperty("creatingWorkspaceAllowed", "false");
+ ]]></programlisting>
 </chapter>
 

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	2009-06-09 22:51:55 UTC (rev 1022)
+++ trunk/docs/reference/src/main/docbook/en-US/content/connectors/in_memory.xml	2009-06-09 23:50:21 UTC (rev 1023)
@@ -33,6 +33,8 @@
   <para>
   	The in-memory repository connector is a simple connector that creates a transient, in-memory repository.
 		This repository is used as a very simple in-memory cache or as a standalone transient repository.
+		This connector works well for a readable and writable repository source with small to moderate sized
+		content that need not be permanently saved.
   </para>
 	<para>
 		The &InMemoryRepositorySource; class provides a number of JavaBean properties that control its behavior:
@@ -82,5 +84,15 @@
 			</tbody>
 		</tgroup>
 	</table>
-</chapter>
-
+	<para>
+		Using the in-memory connector is used by creating in the &JcrConfiguration; a repository source that uses the &InMemoryRepositorySource; class.
+		For example:
+	</para>
+  <programlisting role="JAVA"><![CDATA[
+JcrConfiguration config = ...
+config.repositorySource("source A")
+      .usingClass(InMemoryRepositorySource.class)
+      .setDescription("The repository for our content")
+      .setProperty("defaultWorkspaceName", workspaceName);
+ ]]></programlisting>
+</chapter>
\ No newline at end of file

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	2009-06-09 22:51:55 UTC (rev 1022)
+++ trunk/docs/reference/src/main/docbook/en-US/content/connectors/jdbc_metadata.xml	2009-06-09 23:50:21 UTC (rev 1023)
@@ -31,7 +31,9 @@
 <chapter id="jdbc-metadata-connector">
   <title>JDBC Metadata Connector</title>
   <para>
-		blah blah 
+		This connector is a prototype that provides read-only access to the database schema (metadata) from relational databases through a JDBC 
+    connection.
+                <emphasis>This is still under development.</emphasis>
   </para>
 </chapter>
 

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	2009-06-09 22:51:55 UTC (rev 1022)
+++ trunk/docs/reference/src/main/docbook/en-US/content/connectors/jdbc_storage.xml	2009-06-09 23:50:21 UTC (rev 1023)
@@ -31,7 +31,301 @@
 <chapter id="jdbc-storage-connector">
   <title>JDBC Storage (JPA) Connector</title>
   <para>
-		blah blah 
+		This connector stores a graph of any structure or size in a relational database, using a JPA provider on top of a JDBC driver. 
+		Currently this connector relies upon some Hibernate-specific capabilities.  The schema of the database is dictated by this
+		connector and is optimized for storing a graph structure.
+		(In other words, this connector does not expose as a graph the data in an existing database with an arbitrary schema.)
   </para>
+	<para>
+		The &JpaSource; class provides a number of JavaBean properties that control its behavior:
+	</para>
+	<table frame='all'>
+		<title>&JpaSource; 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>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>supportsUpdates</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>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>
+				</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 "fase" value for the "creatingWorkspaceAllowed" property to allow only the use of only 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>
+				</row>
+				<row>
+					<entry>dialect</entry>
+					<entry>
+						Required property that defines the dialect of the database.  This must match one of the Hibernate dialect names, and must correspond to the type of driver being used.
+					</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>
+						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.
+						This is not required if the DataSource is found in JNDI.
+					</entry>
+				</row>
+				<row>
+					<entry>url</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.
+					</entry>
+				</row>
+				<row>
+					<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>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>maximumConnectionsInPool</entry>
+					<entry>
+						The maximum number of connections that may be in the connection pool.
+						The default is "5".
+					</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.
+						The default is "600" seconds (or 10 minutes).
+					</entry>
+				</row>
+				<row>
+					<entry>maximumSizeOfStatementCache</entry>
+					<entry>
+						The maximum number of statements that should be cached.  
+						Statement caching can be disabled by setting to "0".  
+						The default is "100".
+					</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>idleTimeInSecondsBeforeTestingConnections</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).
+					</entry>
+				</row>
+				<row>
+					<entry>referentialIntegrityEnforced</entry>
+					<entry>
+						An advanced boolean property that dictates whether the database's referential integrity should be enabled, or false if this checking
+						is not to be used.  While referential integrity does help to ensure the consistency of the records, it does add work to update
+						operations and can impact performance.  
+						The default value is "true".
+					</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>
+				</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>
+				</row>
+				<row>
+					<entry>model</entry>
+					<entry>
+						An advanced property that dictates the type of storage schema that is used.  Currently, the only supported value is "Basic",
+						which is also the default.
+					</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>
+				</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>
+	<para>
+		Using the file system connector is used by creating in the &JcrConfiguration; a repository source that uses the &JpaSource; class.
+		For example:
+	</para>
+  <programlisting role="JAVA"><![CDATA[
+JcrConfiguration config = ...
+config.repositorySource("source A")
+      .usingClass(JpaSource.class)
+      .setDescription("The database store for our content")
+      .setProperty("dialect", "org.hibernate.dialect.MySQLDialect")
+      .setProperty("dataSourceJndiName", "java:/MyDataSource")
+      .setProperty("nameOfDefaultWorkspace", "My Default Workspace");
+ ]]></programlisting>
+	<para>
+		Of course, setting other more advanced properties would entail calling <code>setProperty(...)</code> for each.  Since almost all
+		of the properties have acceptable default values, however, we don't need to set very many of them.
+	</para>
+	<sect2>
+		<title>Basic Model</title>
+		<para>
+			This database schema model stores node properties as opaque records and children as transparent records. 
+			Large property values are stored separately.
+		</para>
+		<para>
+			The set of tables used in this model includes:
+			<itemizedlist>
+				<listitem>
+					<para>
+						Namespaces - the set of namespace URIs used in paths, property names, and property values.
+					</para>
+				</listitem>
+				<listitem>
+					<para>
+						Properties - the properties for each node, stored in a serialized (and optionally compressed) form.
+					</para>
+				</listitem>
+				<listitem>
+					<para>
+						Large values - property values larger than a certain size will be broken out into this table, where they are tracked by
+						their SHA-1 has and shared by all properties that have that same value. The values are stored in a binary (and optionally
+						compressed) form.
+					</para>
+				</listitem>
+				<listitem>
+					<para>
+						Children - the children for each node, where each child is represented by a separate record. This approach makes it
+		 				possible to efficiently work with nodes containing large numbers of children, where adding and removing child nodes is largely
+		 				independent of the number of children. Also, working with properties is also completely independent of the number of child
+		 				nodes.
+					</para>
+				</listitem>
+				<listitem>
+					<para>
+						ReferenceChanges - the references from one node to another
+					</para>
+				</listitem>
+				<listitem>
+					<para>
+	 					Subgraph - a working area for efficiently computing the space of a subgraph; see below
+					</para>
+				</listitem>
+				<!--listitem>
+					<para>
+				 		Change log - a record of the changes that have been made to the repository. This is used to distribute change events across
+				 		multiple distributed processes, and to allow a recently-connected client to identify the set of changes that have been made
+				 		since a particular time or date. Changes are serialized into a binary, compressed format.
+					</para>
+				</listitem-->
+				<listitem>
+					<para>
+				 		Options - the parameters for this store's configuration (common to all models)
+					</para>
+				</listitem>
+			</itemizedlist>
+		</para>
+		<para>
+		 This database model contains two tables that are used in an efficient mechanism to find all of the nodes in the subgraph below
+		 a certain node. This process starts by creating a record for the subgraph query, and then proceeds by executing a join to find
+		 all the children of the top-level node, and inserting them into the database (in a working area associated with the subgraph
+		 query). Then, another join finds all the children of those children and inserts them into the same working area. This continues
+		 until the maximum depth has been reached, or until there are no more children (whichever comes first). All of the nodes in the
+		 subgraph are then represented by records in the working area, and can be used to quickly and efficient work with the subgraph
+		 nodes. When finished, the mechanism deletes the records in the working area associated with the subgraph query.
+		</para>
+		<para>
+		 This subgraph query mechanism is extremely efficient, performing one join/insert statement <i>per level of the subgraph</i>,
+		 and is completely independent of the number of nodes in the subgraph. For example, consider a subgraph of node A, where A has
+		 10 children, and each child contains 10 children, and each grandchild contains 10 children. This subgraph has a total of 1111
+		 nodes (1 root + 10 children + 10*10 grandchildren + 10*10*10 great-grandchildren). Finding the nodes in this subgraph would
+		 normally require 1 query per node (in other words, 1111 queries). But with this subgraph query mechanism, all of the nodes in
+		 the subgraph can be found with 1 insert plus 4 additional join/inserts.
+		</para>
+		<para>
+		 This mechanism has the added benefit that the set of nodes in the subgraph are kept in a working area in the database, meaning
+		 they don't have to be pulled into memory.
+		</para>
+		<para>
+		 Subgraph queries are used to efficiently process a number of different requests, including &ReadBranchRequest;,
+		 &DeleteBranchRequest;, &MoveBranchRequest;, and &CopyBranchRequest;. Processing each of these kinds of
+		 requests requires knowledge of the subgraph, and in fact all but the &ReadBranchRequest; need to know the complete
+		 subgraph.
+		</para>
+	</sect2>
 </chapter>
 

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	2009-06-09 22:51:55 UTC (rev 1022)
+++ trunk/docs/reference/src/main/docbook/en-US/content/connectors/subversion.xml	2009-06-09 23:50:21 UTC (rev 1023)
@@ -31,7 +31,92 @@
 <chapter id="subversion-connector">
   <title>Subversion Connector</title>
   <para>
-		blah blah 
+		This connector provides read-only 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"). 
+		New workspaces can be created, as long as the names represent valid existing directories within the SVN repository.
   </para>
+	<para>
+		The &SVNRepositorySource; class provides a number of JavaBean properties that control its behavior:
+	</para>
+	<table frame='all'>
+		<title>&SVNRepositorySource; 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>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>repositoryRootURL</entry>
+					<entry>
+						Required property that should be set with the URL to the Subversion repository.
+					</entry>
+				</row>
+				<row>
+					<entry>username</entry>
+					<entry>
+						The username that should be used to establish a connection to the repository.
+					</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
+						anonymous SVN repository address.
+					</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.
+					</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 "fase" value for the "creatingWorkspaceAllowed" property to allow only the use of only 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>
+				</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>
+				</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>
+			</tbody>
+		</tgroup>
+	</table>
+	<para>
+		Using the SVN connector can be used by creating in the &JcrConfiguration; a repository source that uses the &SVNRepositorySource; class.
+		For example:
+	</para>
+  <programlisting role="JAVA"><![CDATA[
+JcrConfiguration config = ...
+config.repositorySource("SVN repository for JBoss DNA")
+      .usingClass(SVNRepositorySource.class)
+      .setDescription("The DNA SVN repository (anonymous access)")
+      .setProperty("repositoryRootUrl", "http://anonsvn.jboss.org/repos/dna");
+      .setProperty("directoryForDefaultWorkspace", "trunk");
+      .setProperty("predefinedWorkspaceNames", new  String[]{"trunk","tags/0.1","/tags/0.2", "/tags/0.3", "/tags/0.4", "/tags/0.5");
+ ]]></programlisting>
 </chapter>
-

Modified: trunk/docs/reference/src/main/docbook/en-US/content/introduction.xml
===================================================================
--- trunk/docs/reference/src/main/docbook/en-US/content/introduction.xml	2009-06-09 22:51:55 UTC (rev 1022)
+++ trunk/docs/reference/src/main/docbook/en-US/content/introduction.xml	2009-06-09 23:50:21 UTC (rev 1023)
@@ -410,7 +410,6 @@
             <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>This is still under development.</emphasis>
           </para>
         </listitem>
         <listitem>

Modified: trunk/docs/reference/src/main/docbook/en-US/custom.dtd
===================================================================
--- trunk/docs/reference/src/main/docbook/en-US/custom.dtd	2009-06-09 22:51:55 UTC (rev 1022)
+++ trunk/docs/reference/src/main/docbook/en-US/custom.dtd	2009-06-09 23:50:21 UTC (rev 1023)
@@ -127,6 +127,8 @@
 <!ENTITY InMemoryRepositorySource  		"<ulink url='&API;graph/connector/inmemory/InMemoryRepositorySource.html'><classname>InMemoryRepositorySource</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>">
+<!ENTITY JoinRequestProcessor			  	"<ulink url='&API;graph/connector/federation/JoinRequestProcessor.html'><classname>JoinRequestProcessor</classname></ulink>">
 <!ENTITY Projection								  	"<ulink url='&API;graph/connector/federation/Projection.html'><classname>Projection</classname></ulink>">
 <!ENTITY CachePolicy							    "<ulink url='&API;graph/cache/CachePolicy.html'><interface>CachePolicy</interface></ulink>">
 <!ENTITY Request					       			"<ulink url='&API;graph/request/Request.html'><classname>Request</classname></ulink>">
@@ -181,12 +183,15 @@
 
 <!-- Types in extensions/ -->
 
+<!ENTITY FileSystemSource  						"<ulink url='&API;connector/filesystem/FileSystemSource.html'><classname>FileSystemSource</classname></ulink>">
+<!ENTITY JpaSource  									"<ulink url='&API;connector/source/jap/JpaSource.html'><classname>JpaSource</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>">
 <!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>">
 <!ENTITY ApertureMimeTypeDetector	  	"<ulink url='&API;mimetype/aperture/ApertureMimeTypeDetector.html'><classname>ApertureMimeTypeDetector</classname></ulink>">
-<!ENTITY DnaJcrDeployer	  				"<ulink url='&API;web/jcr/rest/DnaJcrDeployer.html'><classname>DnaJcrDeployer</classname></ulink>">
+<!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>">
 

Modified: trunk/docs/reference/src/main/docbook/en-US/images/dna-connector-federation.graffle
===================================================================
--- trunk/docs/reference/src/main/docbook/en-US/images/dna-connector-federation.graffle	2009-06-09 22:51:55 UTC (rev 1022)
+++ trunk/docs/reference/src/main/docbook/en-US/images/dna-connector-federation.graffle	2009-06-09 23:50:21 UTC (rev 1023)
@@ -7,7 +7,7 @@
 	<key>ApplicationVersion</key>
 	<array>
 		<string>com.omnigroup.OmniGraffle</string>
-		<string>136.19.0.104178</string>
+		<string>137.11.0.108132</string>
 	</array>
 	<key>AutoAdjust</key>
 	<true/>
@@ -163,7 +163,7 @@
 			<key>Text</key>
 			<dict>
 				<key>Text</key>
-				<string>{\rtf1\ansi\ansicpg1252\cocoartf949\cocoasubrtf350
+				<string>{\rtf1\ansi\ansicpg1252\cocoartf949\cocoasubrtf460
 {\fonttbl\f0\fswiss\fcharset0 Helvetica;}
 {\colortbl;\red255\green255\blue255;}
 \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
@@ -285,7 +285,7 @@
 			<key>Text</key>
 			<dict>
 				<key>Text</key>
-				<string>{\rtf1\ansi\ansicpg1252\cocoartf949\cocoasubrtf350
+				<string>{\rtf1\ansi\ansicpg1252\cocoartf949\cocoasubrtf460
 {\fonttbl\f0\fswiss\fcharset0 Helvetica;}
 {\colortbl;\red255\green255\blue255;}
 \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
@@ -407,7 +407,7 @@
 			<key>Text</key>
 			<dict>
 				<key>Text</key>
-				<string>{\rtf1\ansi\ansicpg1252\cocoartf949\cocoasubrtf350
+				<string>{\rtf1\ansi\ansicpg1252\cocoartf949\cocoasubrtf460
 {\fonttbl\f0\fswiss\fcharset0 Helvetica;}
 {\colortbl;\red255\green255\blue255;}
 \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
@@ -529,7 +529,7 @@
 			<key>Text</key>
 			<dict>
 				<key>Text</key>
-				<string>{\rtf1\ansi\ansicpg1252\cocoartf949\cocoasubrtf350
+				<string>{\rtf1\ansi\ansicpg1252\cocoartf949\cocoasubrtf460
 {\fonttbl\f0\fswiss\fcharset0 Helvetica;}
 {\colortbl;\red255\green255\blue255;}
 \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
@@ -538,39 +538,6 @@
 			</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>
@@ -613,7 +580,7 @@
 				<key>Pad</key>
 				<integer>0</integer>
 				<key>Text</key>
-				<string>{\rtf1\ansi\ansicpg1252\cocoartf949\cocoasubrtf350
+				<string>{\rtf1\ansi\ansicpg1252\cocoartf949\cocoasubrtf460
 {\fonttbl\f0\fswiss\fcharset0 Helvetica;}
 {\colortbl;\red255\green255\blue255;}
 \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
@@ -724,181 +691,6 @@
 		</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.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>{{353.068, 269}, {83, 29.0002}}</string>
 			<key>Class</key>
 			<string>ShapedGraphic</string>
@@ -975,7 +767,7 @@
 			<key>Text</key>
 			<dict>
 				<key>Text</key>
-				<string>{\rtf1\ansi\ansicpg1252\cocoartf949\cocoasubrtf350
+				<string>{\rtf1\ansi\ansicpg1252\cocoartf949\cocoasubrtf460
 {\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 +823,7 @@
 			<key>Text</key>
 			<dict>
 				<key>Text</key>
-				<string>{\rtf1\ansi\ansicpg1252\cocoartf949\cocoasubrtf350
+				<string>{\rtf1\ansi\ansicpg1252\cocoartf949\cocoasubrtf460
 {\fonttbl\f0\fswiss\fcharset0 Helvetica;}
 {\colortbl;\red255\green255\blue255;}
 \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
@@ -1124,7 +916,7 @@
 	<key>MasterSheets</key>
 	<array/>
 	<key>ModificationDate</key>
-	<string>2008-11-12 12:46:58 -0600</string>
+	<string>2009-06-09 18:40:47 -0500</string>
 	<key>Modifier</key>
 	<string>Randall Hauch</string>
 	<key>NotesVisible</key>
@@ -1168,216 +960,175 @@
 	<key>QuickLookPreview</key>
 	<data>
 	JVBERi0xLjMKJcTl8uXrp/Og0MTGCjQgMCBvYmoKPDwgL0xlbmd0aCA1IDAgUiAvRmls
-	dGVyIC9GbGF0ZURlY29kZSA+PgpzdHJlYW0KeAG1WMtuXDcM3d+v0LJdWNb7Stu6DdCs
-	2thA18FkDDvwI7HdFv37nqP3jMexDdgJkhnqSiTFw0Pyznfxp/guFP76NYjVWnG3FX+J
-	G6FkUPmPuBTHJ/dabO6Fzn/vN+JISV+fjm9VwQIF5+L4j+3dZvvt4e/PV+LuEibSWqxo
-	YV2SZvVJ2BjkmgxUX4vj36+1+PU2e1O3Oju2OmPz1qVsNWWrFh/h0Vdx/Gl79fnh8p/t
-	ye3V7d3l9fbh7nJDs9nxk9NsWYnTE/ihs3DED9yW+mxy0ocoLDy5Fi5FqYOCmJJU8OFK
-	nMIrRkgJXN0r7MZ/2J6kdtbkM0mm4NNibZDWW41DLvGrD8JaDfUqYe3i4OlzKP6If18P
-	etftOWVlpJ/0sdiDj0EGF6i723NKS2cTfRj2lul0vo4MVulocCnpkw9p5TfndHL4hmta
-	b0pQEA4vIqBYmRkA9uTeLMiFvEshOaaQtkg6HXAIof3lTGiDrUoc4fPIRBmi86tw4gyQ
-	f9BSLVqcnYufPmy/bO8A4e3Nz+Lsq/jtjCE/kIHw1qwJ+OCpddrYyG8mujU4tdDvwGhH
-	4QJgYqgMXOkywkQ0bPR1g7O+PsbtVxXwPC8szuNTbJqcPxH2HGm1yqS0G2s2BImw27YC
-	0Gv4qI7HlhHRovlqbAnVtPVwNa3Qm33fvckGYNaVpd2tgEFi/hAM0C17fhiPNa5aHNml
-	AQKCEJBP22+395cPt3f/iYHIIah/oH0F2iYYofW+9pPbm5vtBtqHbpYhF9eCRmaVR7pk
-	6CBdCW8tgQsLKedt3WgABWEbCxagdUmBwkqRCl430NqaizGDBmpECYiQM2s12LYA/rZk
-	WAiGVM26CJZkyOBU9T47SLh2b8OayvOKyQiLXiCJjWvl9lG97HXKY3M+ZJD8uf6dXmhx
-	fwGGPFG6jfgXKJbSuEciI1gNW/FeDlRE0rZ5jhIBCjUcKA0cBMUWaKu8VCa5pS9oNeFg
-	Ub0RYZKn49DXGg4oqI5oIZAl6EvfMnCw0DtwaGbhcMWBTs3eTzgs5TasfqxhT9FmJ9y1
-	hqVSwhIqGKqHSsri235OP8eYZxQruQadgkj7eg9wZeJh0bqimSK8leGst6y4+IfyE32y
-	SLmi1khVCX5eKu72i9h83lxsBxE1smcva3TOmqyVGYOaXQzggxMDzNrVyxQdux2rrkkK
-	vPRmr4m2OaI4iGqNwi199B5Q92ZqkpFrZIMdjdNEPF6B7dRgL/rpuRWfL081U7rZ7IGB
-	vZl2e1PjbPaWqcFO9qbTTKfGtQmWERiUNK1SwGjAwFjv0GcMp4sgURs9spkqrAf+Gh2E
-	gQgrOjr34qhRnjGV1uQub72W0XgNdRhTXMRx9IUDh58eKjJc7QRvAprpZTaXULjXPMQ0
-	c3DXIZFYhydz7TB8ncKwHAwDxghje344DaqjcEIv+mOurdTAuUHFgCxCFKKN8IpLCcRA
-	EKK0Fr0K9Ndaak6bzIaoc2BQbvcOw6spCAdyth/gPTT61GwN9w3B5HbfrQEyHRErBuHA
-	Yd7gR5XFYTSxGtCP6WiZpyOUUKXS2qcj27kqpZz5+biy74ecbcIhOOwbFjYgBcxeISLi
-	2kgbkYwl8R5REpMUN6KMst8YYwkCDq9gJKfwwEgBA+qzFmtorFgLOTUeHX4ehGaOfrkV
-	tx/mLPowXGWSd3NWgwvRugLCgcNEgX3RcIji9UE2JDeG4iZh9FKYtDBL5IdoKXxUug1n
-	ibqAT1TUIbHFlVmCFQPJjFi2NRpbc3rj7YCzxGI4P9J824Ji15ag92pI7I00a3ziLAG6
-	w+PJe4yOKD07t+EsQW0ZXr6PCLxn1B6bx3RueHqiMBGplTMDYagThXnfiaL571DOBhqU
-	JjQotuA7zmCcKPoCBu6BhuPgVyaKjkZf62g4TJB5oqihX/qWgQZK0YRGMzvQoFOz9xMa
-	mBx5m+d4vxPu2qPfZKJ4RvFrJgoyhv0216fCGBC8ScBotXjLimzUyOl1rY9q6vaFwpj2
-	uKU+33UwYuMlbdCBxhwGBkxlhTFIexQmlsd2DGi3pcyYLjXGoCfiJRAvTNmp4n12kBjt
-	3oaEwPs9ugUNNMa8YPrmjxX5EIt25Yp9X640z0t22YoDpYEDBhhwpQa6Je3SFwpX2uPB
-	lY5DJ0LDAbW9cqWGeeZKi3zhSpcqRRHYikN2qmYRv084vJArO+F+S648o/jVXME8k0to
-	5grf8puEXuWUVPiJIaeic5h0chuqXOkLmStdakmP48azl8xcqcPTxBXMw1lrOwautKXC
-	lSZ1riTUfL6pZq4U7wdXdm6TuYKX49K+XsEVzkT50MQV985cqZ4z2zjyFBwoDRwyV1qg
-	O1f6QuZKlwZXOg6DKxWHiSslzDtcqZGvXGlS50rDIXNl8j5zpcgv5MpOuN+SK88ofi1X
-	+vt45orHW35OEkj4OQCDfv5Vh2mZf+KZudIXMle61JKevyb4vUmMxjiJDa60H22mvtKX
-	Mle61Lgyfk2AU9X7zpXd25ArPF/I+AqueIyg+dDEFf++XGmeF640HApXGg6ZKy3QnSt9
-	IXOlS4MrHYfOlYbD4EoN88yVFvnClS41rnQc6OPsPblS5RdyZSfcb8mVZxS/iiv/AxWi
-	X5gKZW5kc3RyZWFtCmVuZG9iago1IDAgb2JqCjE5NjQKZW5kb2JqCjIgMCBvYmoKPDwg
-	L1R5cGUgL1BhZ2UgL1BhcmVudCAzIDAgUiAvUmVzb3VyY2VzIDYgMCBSIC9Db250ZW50
-	cyA0IDAgUiAvTWVkaWFCb3ggWzAgMCA1NzYgNzMzXQo+PgplbmRvYmoKNiAwIG9iago8
-	PCAvUHJvY1NldCBbIC9QREYgL1RleHQgL0ltYWdlQiAvSW1hZ2VDIC9JbWFnZUkgXSAv
-	Q29sb3JTcGFjZSA8PCAvQ3MxIDcgMCBSCi9DczIgMTIgMCBSID4+IC9Gb250IDw8IC9G
-	MS4wIDEzIDAgUiAvRjIuMCAxNSAwIFIgL0YzLjAgMTYgMCBSID4+IC9YT2JqZWN0Cjw8
-	IC9JbTEgOCAwIFIgL0ltMiAxMCAwIFIgPj4gL1NoYWRpbmcgPDwgL1NoMSAxNCAwIFIg
-	L1NoNCAxOSAwIFIgL1NoMyAxOCAwIFIKL1NoMiAxNyAwIFIgL1NoNSAyMCAwIFIgPj4g
-	Pj4KZW5kb2JqCjE0IDAgb2JqCjw8IC9Db2xvclNwYWNlIDcgMCBSIC9TaGFkaW5nVHlw
-	ZSAzIC9Db29yZHMgWyAwIDAgMCAwIDAgMzIuMzEwOTkgXSAvRG9tYWluClsgMCAxIF0g
-	L0V4dGVuZCBbIGZhbHNlIGZhbHNlIF0gL0Z1bmN0aW9uIDIxIDAgUiA+PgplbmRvYmoK
-	MTkgMCBvYmoKPDwgL0NvbG9yU3BhY2UgNyAwIFIgL1NoYWRpbmdUeXBlIDMgL0Nvb3Jk
-	cyBbIDAgMCAwIDAgMCAzMC40NjMwOSBdIC9Eb21haW4KWyAwIDEgXSAvRXh0ZW5kIFsg
-	ZmFsc2UgZmFsc2UgXSAvRnVuY3Rpb24gMjIgMCBSID4+CmVuZG9iagoxOCAwIG9iago8
-	PCAvQ29sb3JTcGFjZSA3IDAgUiAvU2hhZGluZ1R5cGUgMyAvQ29vcmRzIFsgMCAwIDAg
-	MCAwIDMwLjQ2MzA5IF0gL0RvbWFpbgpbIDAgMSBdIC9FeHRlbmQgWyBmYWxzZSBmYWxz
-	ZSBdIC9GdW5jdGlvbiAyMyAwIFIgPj4KZW5kb2JqCjE3IDAgb2JqCjw8IC9Db2xvclNw
-	YWNlIDcgMCBSIC9TaGFkaW5nVHlwZSAzIC9Db29yZHMgWyAwIDAgMCAwIDAgMzAuNDYz
-	MDkgXSAvRG9tYWluClsgMCAxIF0gL0V4dGVuZCBbIGZhbHNlIGZhbHNlIF0gL0Z1bmN0
-	aW9uIDI0IDAgUiA+PgplbmRvYmoKMjAgMCBvYmoKPDwgL0NvbG9yU3BhY2UgNyAwIFIg
-	L1NoYWRpbmdUeXBlIDMgL0Nvb3JkcyBbIDAgMCAwIDAgMCAzMC40NjMwOSBdIC9Eb21h
-	aW4KWyAwIDEgXSAvRXh0ZW5kIFsgZmFsc2UgZmFsc2UgXSAvRnVuY3Rpb24gMjUgMCBS
-	ID4+CmVuZG9iago4IDAgb2JqCjw8IC9MZW5ndGggOSAwIFIgL1R5cGUgL1hPYmplY3Qg
-	L1N1YnR5cGUgL0ltYWdlIC9XaWR0aCAxOTQgL0hlaWdodCAxMDIgL0NvbG9yU3BhY2UK
-	MjYgMCBSIC9TTWFzayAyNyAwIFIgL0JpdHNQZXJDb21wb25lbnQgOCAvRmlsdGVyIC9G
-	bGF0ZURlY29kZSA+PgpzdHJlYW0KeAHt0IEAAAAAw6D5U1/gCIVQYcCAAQMGDBgwYMCA
-	AQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgw
-	YMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMG
-	DBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCA
-	AQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgw
-	YMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMG/sAA5+QAAQpl
-	bmRzdHJlYW0KZW5kb2JqCjkgMCBvYmoKMjgzCmVuZG9iagoxMCAwIG9iago8PCAvTGVu
-	Z3RoIDExIDAgUiAvVHlwZSAvWE9iamVjdCAvU3VidHlwZSAvSW1hZ2UgL1dpZHRoIDE5
-	NCAvSGVpZ2h0IDg2IC9Db2xvclNwYWNlCjI5IDAgUiAvU01hc2sgMzAgMCBSIC9CaXRz
-	UGVyQ29tcG9uZW50IDggL0ZpbHRlciAvRmxhdGVEZWNvZGUgPj4Kc3RyZWFtCngB7dCB
-	AAAAAMOg+VMf5IVQYcCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCA
-	AQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgw
-	YMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMG
-	DBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCA
-	AQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgw8D4ww4QAAQplbmRzdHJlYW0KZW5kb2JqCjEx
-	IDAgb2JqCjI0MAplbmRvYmoKMjcgMCBvYmoKPDwgL0xlbmd0aCAyOCAwIFIgL1R5cGUg
-	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
-	rcBxBf4PP9iXDwplbmRzdHJlYW0KZW5kb2JqCjI4IDAgb2JqCjE5MjcKZW5kb2JqCjMw
-	IDAgb2JqCjw8IC9MZW5ndGggMzEgMCBSIC9UeXBlIC9YT2JqZWN0IC9TdWJ0eXBlIC9J
-	bWFnZSAvV2lkdGggMTk0IC9IZWlnaHQgODYgL0NvbG9yU3BhY2UKL0RldmljZUdyYXkg
-	L0JpdHNQZXJDb21wb25lbnQgOCAvRmlsdGVyIC9GbGF0ZURlY29kZSA+PgpzdHJlYW0K
-	eAHtW/k7W1sXNiYhA4kMZNCQCGlDpEVQ2vQGpdUipPS6VUQN/bQIWqoN8Riu4OpFWq2a
-	qqh5akPQ5/5r39onQnS8X7U95/ke7y/8cs5e717D2dlrvW5uJyD2DrgTAN+5Q+7uHgie
-	np5euAIMwAxxd/9fiGDWe3p5e3uTyGQyBV+QySQwxAvx+Lcs0OaD9SQKxceXSqXR6HQ6
-	AyfA0jQalerrQ6GQHSz+hSfAfth9MsWHSqMz/JhMFiuAjSMCAlhMpj+DQaP6IBLgiW9w
-	gPjB7KfSGP7MADaXFxjE5wsEQpwgEPD5/EAej8Nm+SMS3+YADkD7T6X7MdncQL4oWCwO
-	lUgkUmkYLpBKpRJJaIg4WMQP4iESiIPX19wADoDw96X7sTiBApFYEhYuP61QREZFKXFC
-	VFSkQnFaHi6ThAQLArkB/nQqhQSh9KVIQgTAAQwmJ1AolsjkCqXqXGycOj4hIREnJCTE
-	q9WxMSpl5OlwiVgUxGExaOCGL1HACPjQ/AJ4ArE0QhEdo05MvqjRalNS0/BDqlZ76WJy
-	ojpGFSkPEwt5bH+675coYAR86Ux2kEgSEalSn9do0zIys7J1utw8PU7Iy9XpsrMyr1xO
-	0SSpz0bJJcF8DpPhS/m8F1AIAQEOXyxTqNTJ2vTMHH1BYVFxSanBUFZ2BweUlRkMpSXF
-	RYU39bprGdoL8WcVMrGA+yUK7h5eZB86kysICY+KSdJmZOkLbxsq7lbfr6kzGusdaPhl
-	2F/QaKyrram+W1FWXHgj+4o2OU4pDxXygALZ28Pjo1MGECBRaEyOIEQerb6Ydl3/R2ll
-	dV3jw0ctT0ym1jaA+RcDrdnaanry+FFTo/FelaHoRla6Jl4llwi5TLoPyevjggQxRKH6
-	sflAIP5Shu73ksqahmaTuaOru8di6e3twwW9vRZLz59dHWbTo8aaKkNh7lVtokoeKuD4
-	01AqHHECiiFfRkCQODw6/rerebfu3Gtoaevs6Rt4Ojg0bLVan+ECWHh4aPDvgX5Ll7ml
-	8X55kT4TURDz2X5UiKMjXwV3cAGNyRPJotSXruqLKmqbWjt7B4aejYyOjo2Pj0/gBFh6
-	7NXoyPPhp33dbc3GquIbmdoEpexUIAvi6KgTwAUQQwLJmZiLGXlFlcZH7T0D1hevJqam
-	38zMzs7hh9mZN9NTE2MvrE8tHS31VcX6qxq1Qiri+lMpR5zg7uFNobMCxRGqpDTdrQpj
-	S0fv4MjY1Ju5+YXFpWWEFRyALby0uDA/N/N6/MVQf+fj+qqivIzkcxBHAQwfb0+XMHL3
-	JPn6cYSSSLX2+u93ah919A+PTs7MLy6vrq1vbOKKjfW1tZWl+dmpUStQMFYUZqckKMOQ
-	E8heLrns4QVZgFyQnKEvudfU3js8OjW3uLq++c5ms21tbW3jBFgaDHi3ub669Hb6lbW/
-	o7nGkH/1YoxcHMSiQxgdViMPbx8Gmy9RqLVZf1Q2tFoGgcDy2qZta9tu39nZxRE7O3a7
-	fcv2bn15fnp0uNf84G6RLiU+SipkM3xJh2EEQUT154pk0efT9aU1LZ0DI5Nzy+vvt+w7
-	u3sOfMAF+4vv7ti3bRvLb6de/t39uK6sICNZFXGKx6SSXRhAJYIgksdczCysbGjrtY7N
-	LK6937aD/QeW//PLcbD03t7uzrZtfXl2/Fl/+4OqW1mXYs+E8lk0ymEiQBrQA7Agyrld
-	3dw58GLq7crmlguBX279/oL7JMAXO9vv1hZegxNaakpyUxOipAI2wyURoJYy2MIwZWKa
-	3lD3pGfo1ZvFddshAbzsR+s6OezabRtLs+NWS6uxPD8jSSUTcf18D1PZw9vXjxscDpWo
-	oKLB3PdsYm55c2vHGUJ4EnByQE7YXHk7OfIXhFFh5oVz8lM8fyrpoBgBA3/eKfk5SIOq
-	hx0DI1Pzq++2dx05gLP9BxR27e9RGD3tbK4uytLEnBYHMqkkT2c59SChRD4do7leVN3c
-	9fTl9MLae7vDBfgT2I+kPbttffHN6CAkQnGOVq2AVHYpRh5kKisoVBH3W/bt+y3dg6NY
-	GmAuIAIBB4W9HUiEmbHhnie1JboUdaSEH0CjHJRTTzKNhZUiXXENSuSZpQ2bnUAMUD7v
-	7WxtQj21WkxGQ14aKkYBdIqX82QEDKCYRsan6ErrTJbhsdnlDdsOYkAMF2BO2NsFBnPj
-	1t62+jJ9WqISvsquDLDPQVRCaq7BaLJYx2exUkQcAojC3i4Uo7mJZ33mhjv6y4nKMDhX
-	uPiAQmcLpMAgz2BsBQaOYkpEBpPP+8yN5TeAgUz0KQP4oOWV1cOZwsmAKDGE7Nj3weTz
-	fmCQn34++gsM9CcMfprbvssHP82a73qxI5O/EEXunlgmo4OdaxR910I/7aGvM4DDNdSi
-	owx2936aMd/14g9YNf3IB87DqbvXweH6Tn0bOpqubG7vEuZz5iD8Ydf+bvXt1Eh/e2NF
-	AXa85sB1xf7h1JWB43BNRAZ7TgYPThh8VxQf/6EPJz44/iYe8w0nPjjmBv6Ax0988AM2
-	8ZivOPHBMTfwBzx+4oMfsInHfMWJD465gT/g8f9zH7h9/lfm/tU9Qf589VfmAQN044Vu
-	HWeWHA2Q/T4WIf6gFgi6N+1tQzden7sv4kui0L1p7RO4u349v7JpgzYmkbBt21xdmH41
-	1GMyYvemn9w67rfRiu8/6hh4PjGzgHrJhMLmxuri7OTI066W2lKskfbRvSncvocqYjVZ
-	t/7zwGwZfDk1s7C0skoorCwvQF9/uK+9qfp2NnRAoH/gene934y9kHmz3Pi4s986OjE9
-	O/eWUJibezM5ah3oNtVXFV7TONuxh/0DKpN3KkKFGuLVD1q7+4dGRscnpwiFyfFXI8N/
-	/Wluum/Iv5J8Vo76aIc9HOijoZa+Mj4l51Z5TVNrF4wWWZ+PEArPnw3BkJG5ua6ySAcN
-	EFnwkaY+9DIZMFykiNFcvVFcWfvwSXtXT28/wdBn6W43NdVVlRRcuxSnkAo5fi6DFWgw
-	BCbUIqITU7MKiivu1Te1mMztBIPZ1NJUf7+y+GZOWpJKHsJnoys7Zx5ATx+NqEkVMRfS
-	s/JvGSqra4wNjQ8IhcZGY011paGoICdDExcZBkHkOp6DZtRgOkcsU8KgZqYuv/B2aVl5
-	BcFQXlZ6u7BAdy1NE68Mdw4LOjvijjlBmPYNV8ae16RmXMvO1d8oIBjy9bk516+kXUqK
-	U0aEwOTvkVlBGLODWU0mFxtYjk1M1mhT09IzCIb0y6laTXJinCoyPETIYzFgVPCgIe7m
-	BroJmNpnAYUwmNk/G6tOSDyfRDCcT0xQx56LjpTD7DWP5QdCBNexXw8Pb5IPEh7wRSFS
-	mfyMIkoZrSIYopXKyDPycGlIMJ/L8nPIEJxp4ObmkB4ABTaPLwwG5Yo0TEY8SCWh4lMi
-	Po/NxOQsR3UULvobDi+QLxCKCAihAOQ4XNDjgJblEz0O0nCBBMeHihRcmH6LQziApgyk
-	Xf4MOgi7SJ8KihwyNFDRIREdbgq6bwn36EheR0H2f06Y5uDgTSJhMkYfAgKpKzGNI2a/
-	80BxmM2Qz0ACpKQgJAUhJCEBpmFC068JNDExLxAhKDDzXHf95P+THTjZAccO/Bf2t3JM
-	CmVuZHN0cmVhbQplbmRvYmoKMzEgMCBvYmoKMjcwMwplbmRvYmoKMzIgMCBvYmoKPDwg
-	L0xlbmd0aCAzMyAwIFIgL04gMyAvQWx0ZXJuYXRlIC9EZXZpY2VSR0IgL0ZpbHRlciAv
-	RmxhdGVEZWNvZGUgPj4Kc3RyZWFtCngBhZRNSBRhGMf/s40EsQbRlwjF0MEkVCYLUgLT
-	9StTtmXVTAlinX13nRxnp5ndLUUihOiYdYwuVkSHiE7hoUOnOkQEmXWJoKNFEAVeIrb/
-	O5O7Y1S+MDO/eZ7/+3y9wwBVj1KOY0U0YMrOu8nemHZ6dEzb/BpVqEYUXCnDczoSiQGf
-	qZXP9Wv1LRRpWWqUsdb7NnyrdpkQUDQqd2QDPix5PODjki/knTw1ZyQbE6k02SE3uEPJ
-	TvIt8tZsiMdDnBaeAVS1U5MzHJdxIjvILUUjK2M+IOt22rTJ76U97RlT1LDfyDc5C9q4
-	8v1A2x5g04uKbcwDHtwDdtdVbPU1wM4RYPFQxfY96c9H2fXKyxxq9sMp0Rhr+lAqfa8D
-	Nt8Afl4vlX7cLpV+3mEO1vHUMgpu0deyMOUlENQb7Gb85Br9i4OefFULsMA5jmwB+q8A
-	Nz8C+x8C2x8DiWpgqBWRy2w3uPLiIucCdOacadfMTuS1Zl0/onXwaIXWZxtNDVrKsjTf
-	5Wmu8IRbFOkmTFkFztlf23iPCnt4kE/2F7kkvO7frMylU12cJZrY1qe06OomN5DvZ8ye
-	PnI9r/cZt2c4YOWAme8bCjhyyrbiPBepidTY4/GTZMZXVCcfk/OQPOcVB2VM334udSJB
-	rqU9OZnrl5pd3Ns+MzHEM5KsWDMTnfHf/MYtJGXefdTcdSz/m2dtkWcYhQUBEzbvNjQk
-	0YsYGuHARQ4ZekwqTFqlX9BqwsPkX5UWEuVdFhW9WOGeFX/PeRS4W8Y/hVgccw3lCJr+
-	Tv+iL+sL+l3983xtob7imXPPmsara18ZV2aW1ci4QY0yvqwpiG+w2g56LWRpneIV9OSV
-	9Y3h6jL2fG3Zo8kc4mp8NdSlCGVqxDjjya5l90WyxTfh51vL9q/pUft89klNJdeyunhm
-	Kfp8NlwNa/+zq2DSsqvw5I2QLjxroe5VD6p9aovaCk09prarbWoX346qA+Udw5yViQus
-	22X1KfZgY5reyklXZovg38Ivhv+lXmEL1zQ0+Q9NuLmMaQnfEdw2cIeU/8NfswMN3gpl
-	bmRzdHJlYW0KZW5kb2JqCjMzIDAgb2JqCjc5MgplbmRvYmoKNyAwIG9iagpbIC9JQ0NC
-	YXNlZCAzMiAwIFIgXQplbmRvYmoKMzQgMCBvYmoKPDwgL0xlbmd0aCAzNSAwIFIgL04g
-	MyAvQWx0ZXJuYXRlIC9EZXZpY2VSR0IgL0ZpbHRlciAvRmxhdGVEZWNvZGUgPj4Kc3Ry
-	ZWFtCngBhZK/TxRREMc/e8SAIVAI0ZhYPBM1mqBZjiso79wCSQ5yEqJiaPb21uPC3bHZ
-	W/FHRcNfoKEg2hEKf9RYWFysLLQyQSI02pmYWKA0eFnn7cuG6mCSl/m82e/MZOYt9Nhu
-	ENQzQKMZhTMTN9W9ufuqd4cMw5zmEhddrxUUSqWiSLrYwTaW/vTluq61t9hZj17+PbTa
-	A2+/r/342SUpDQ+E0hAsJYHhquGc5rLhW5ofRUEkmnnN3oJbEQ6ER8LZGUf4hfBg1fAb
-	zWXD7zUve1Wd+0nYblZqTeF/wuMVv+VBRvd65gWhaDIfhfONxpLU7+kTvqp3IV7s6TYU
-	Xkvu4FHsznN4tQzn9QgqkXF5EYb+wLvNo9j+TrIf62xf68FYNtFZ/Vtwai2O9+9C7zXo
-	fI3jw6047mxK72/QPvAehlLbqK3PcNLdzGn08HsjpW5sdpGobNhow5xcJvOwLufKOTiz
-	CyXh2TzWLyc9Zm8ilUGL2dyoPT2lHLdeK4du5MvmjA1RJEuOUWymmULh4FKnRplQKMIn
-	ER9TI611so/8x/J+4CwFT8JadSFSBfkTfTXZ9G6MqKxtjx9fw7y51syvwu0VTR8qFxKv
-	ObX/LjiQyAplbmRzdHJlYW0KZW5kb2JqCjM1IDAgb2JqCjQ2MgplbmRvYmoKMjYgMCBv
-	YmoKWyAvSUNDQmFzZWQgMzQgMCBSIF0KZW5kb2JqCjM2IDAgb2JqCjw8IC9MZW5ndGgg
-	MzcgMCBSIC9OIDEgL0FsdGVybmF0ZSAvRGV2aWNlR3JheSAvRmlsdGVyIC9GbGF0ZURl
+	dGVyIC9GbGF0ZURlY29kZSA+PgpzdHJlYW0KeAG1WMtuXDcM3d+v0LJdWNb7sa3bAM2q
+	jQ10HUwmsIOxJxm7Lfr3PaRE6Y4z8QNIYiRzqZFE3nN4SDpf1J/qizL4iTmp7L06bNVf
+	6k4ZnQz/UTfq/OLeqs29svxzv1FnRsf+7XzqFyy44KM6/2N72Gw/P/z9fqcON3BRc/Ni
+	lQ9Vuxyr8iXpXB2uvlXnv99a9eueo+lbg59bg/O8dWlbXdtq1VtE9Emdv9vu3j/c/LO9
+	2O/2h5vb7cPhZkNuOfCLS/Zs1OUF4rBsnNEH3pbu8zXomIryiORWhVq0TQZmrdoghp26
+	RFSEkFF49WiwG/9ge9U2eMdnqq4p1sX7pH30FodCpceYlPcW15uKteuTpz/i4rf4++lk
+	dMNfMF4XipNibP4QY9IpJLp7+AvG6uArxTD9LavT/Do6eWOLw0vpWGOqmZ5CsDXgCa/p
+	o2ugAI6oCqjIlBkg9uLeLcgF3mWQHCtIBclgEw4B2l+ulHXYatQZPs9c0amEmFVQV6D8
+	jdVmserqo/rpzfbD9gAK93c/q6tP6rcrgvxEBiJalyv4wbc+WOcLPbkScgpmobgToV1U
+	SKCJoHIIZdiAidjwJfYNwcf+Nd4+m4TveWEJEZ9qIzZ/AnZG2mRdjQ1zzaekAbuXFZDe
+	4aPr6NgyEW037+aW1F37iFBrxr0c+/GbbEBmX1nk3RoZJMwnyYDcOPLTfOSSrTrzixAC
+	gRAh77af9/c3D/vDf2oycorqJ27PYNslp6x9fPvF/u5uu8Ht827R8pr1lT9WK1Jq8Tnq
+	WgLpivh11eiao3skV6lYlHoMDlJExxLjSraLq07nQlKeEnUFqs4GVWpK+VqdOA0pDNki
+	icmNFBXK/HFiJbzhbyXR6a9LeSHZnjpNshWQTgCDapq1NVWA8TEgo11ZqEaAhYh6QFf4
+	aHS2yFWqXymjdqACRhx1BuAgXb3jeuKj1cVFAgIFMRS1W5CBJw6vcHhUXAmHcYJw8A6l
+	cbpDaEiRzOVyukM1LuCTYDh1+CkYWjUv2vmRH8EGbaAq5AeU6KScU4UyJQEsoFA8F1Us
+	1WTRlvDC3mcLJoK12lJfo2woloG5xupXh58GQQ5wFbZQBOrS8Ib3TclxYRneQJktjMvK
+	GyHYDgODherwt6QfUAS9RQuDk1N1OGo075pbHV7O3zhtuuy11lOSNBk4qkXcHAkj9Ixh
+	oYIZXE+11DvyhdqckG7o1OgmgKwt4LOijg7LsHPqTiQHMAVqZI2cZeYOTRZVsyyOyjC5
+	ly0bNZZwLy6RDeLWxdqqKAW1ih4VGLo6ehsac+i8YQfUL9CuXZAJ6KsRZqjcFd8OEb48
+	klxeW3V/DXl9Y5py6t8h3nWFYxZpQJF5ajkxpHA96ZEHqHTyQNaKBzIF6GAwvrgalrGA
+	jjV5CA5NrPWzwcNYGzwEdGykihOYl7Fl8gCFrXgQtzjReaCgBHd6XvEAPdDbkKSfSucj
+	uAkMjBW1VdyKoQIpaarxeHrcZp5rYs9cjEKJepBUfXzvifZFvFMbYdkh88BRQhkhEcIC
+	R9ljTCkR+sBSzv0r0YosNK2IJUlPw0KhrrfSCjkL6IOL71qBI9dulWNgW5ZYK8MSraDU
+	Y4rCxMFBteg5QJ42jt6GtIIBGUWQxPgKrdC0z4dWWnE/VivCQ8su4YGsyYMiU3iQpMVw
+	0YihnAZ6Yk2tDB6GEIQHTJpdKx3mtVYE+aaVYXWJAtjOAwfVcafnFQ8v1MoR3N9TK89c
+	/Gqt4PcKrrusFRqTxULXDUYb9BVOxRDQwLkBda2MBdbKsCTpcdxF6iJrrcAZzQQrrWDM
+	a2W/tyOwLUtNK2INrVTUfJrOWSst+qmVo7dhrRT83vTavkJDAR9aacX/YK30yCnbMJV0
+	HsiaPLBWBOihlbHAWhnW1MrgYWql87DSSoP5SCsd+a4VsYZWhAfWyip61kqzX6iVI7i/
+	p1aeufi1WgmY7DktWCvRzYlspyLmV8xgSG18Gb3vG7tWxgJrZVhTK9HGRzMYOaMZbGol
+	ZEnloZWxxFoZlmglFPzngWilRz+0cvw2pBU638T4ir4SMXzyoZVWwo/VikTetCI8NK0I
+	D6wVAXpoZSywVoY1tTJ4GFoRHqZWOsxrrQjyTSvDEq0MHijGdfSklW6/UCtHcH9PrTxz
+	8au08j+OeV+5CmVuZHN0cmVhbQplbmRvYmoKNSAwIG9iagoxNjE0CmVuZG9iagoyIDAg
+	b2JqCjw8IC9UeXBlIC9QYWdlIC9QYXJlbnQgMyAwIFIgL1Jlc291cmNlcyA2IDAgUiAv
+	Q29udGVudHMgNCAwIFIgL01lZGlhQm94IFswIDAgNTc2IDczM10KPj4KZW5kb2JqCjYg
+	MCBvYmoKPDwgL1Byb2NTZXQgWyAvUERGIC9UZXh0IC9JbWFnZUIgL0ltYWdlQyAvSW1h
+	Z2VJIF0gL0NvbG9yU3BhY2UgPDwgL0NzMSA3IDAgUgovQ3MyIDEyIDAgUiA+PiAvRm9u
+	dCA8PCAvRjEuMCAxMyAwIFIgL0YyLjAgMTQgMCBSID4+IC9YT2JqZWN0IDw8IC9JbTIg
+	MTAgMCBSCi9JbTEgOCAwIFIgPj4gL1NoYWRpbmcgPDwgL1NoMyAxNyAwIFIgL1NoMiAx
+	NiAwIFIgL1NoMSAxNSAwIFIgL1NoNCAxOCAwIFIKPj4gPj4KZW5kb2JqCjE3IDAgb2Jq
+	Cjw8IC9Db2xvclNwYWNlIDcgMCBSIC9TaGFkaW5nVHlwZSAzIC9Db29yZHMgWyAwIDAg
+	MCAwIDAgMzAuNDYzMDkgXSAvRG9tYWluClsgMCAxIF0gL0V4dGVuZCBbIGZhbHNlIGZh
+	bHNlIF0gL0Z1bmN0aW9uIDE5IDAgUiA+PgplbmRvYmoKMTYgMCBvYmoKPDwgL0NvbG9y
+	U3BhY2UgNyAwIFIgL1NoYWRpbmdUeXBlIDMgL0Nvb3JkcyBbIDAgMCAwIDAgMCAzMC40
+	NjMwOSBdIC9Eb21haW4KWyAwIDEgXSAvRXh0ZW5kIFsgZmFsc2UgZmFsc2UgXSAvRnVu
+	Y3Rpb24gMjAgMCBSID4+CmVuZG9iagoxNSAwIG9iago8PCAvQ29sb3JTcGFjZSA3IDAg
+	UiAvU2hhZGluZ1R5cGUgMyAvQ29vcmRzIFsgMCAwIDAgMCAwIDMwLjQ2MzA5IF0gL0Rv
+	bWFpbgpbIDAgMSBdIC9FeHRlbmQgWyBmYWxzZSBmYWxzZSBdIC9GdW5jdGlvbiAyMSAw
+	IFIgPj4KZW5kb2JqCjE4IDAgb2JqCjw8IC9Db2xvclNwYWNlIDcgMCBSIC9TaGFkaW5n
+	VHlwZSAzIC9Db29yZHMgWyAwIDAgMCAwIDAgMzAuNDYzMDkgXSAvRG9tYWluClsgMCAx
+	IF0gL0V4dGVuZCBbIGZhbHNlIGZhbHNlIF0gL0Z1bmN0aW9uIDIyIDAgUiA+PgplbmRv
+	YmoKMTAgMCBvYmoKPDwgL0xlbmd0aCAxMSAwIFIgL1R5cGUgL1hPYmplY3QgL1N1YnR5
+	cGUgL0ltYWdlIC9XaWR0aCAxOTQgL0hlaWdodCA4NiAvQ29sb3JTcGFjZQoyMyAwIFIg
+	L1NNYXNrIDI0IDAgUiAvQml0c1BlckNvbXBvbmVudCA4IC9GaWx0ZXIgL0ZsYXRlRGVj
+	b2RlID4+CnN0cmVhbQp4Ae3QgQAAAADDoPlTH+SFUGHAgAEDBgwYMGDAgAEDBgwYMGDA
+	gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY
+	MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED
+	BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA
+	gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMPA+MMOEAAEK
+	ZW5kc3RyZWFtCmVuZG9iagoxMSAwIG9iagoyNDAKZW5kb2JqCjggMCBvYmoKPDwgL0xl
+	bmd0aCA5IDAgUiAvVHlwZSAvWE9iamVjdCAvU3VidHlwZSAvSW1hZ2UgL1dpZHRoIDE5
+	NCAvSGVpZ2h0IDEwMiAvQ29sb3JTcGFjZQoyNiAwIFIgL1NNYXNrIDI3IDAgUiAvQml0
+	c1BlckNvbXBvbmVudCA4IC9GaWx0ZXIgL0ZsYXRlRGVjb2RlID4+CnN0cmVhbQp4Ae3Q
+	gQAAAADDoPlTX+AIhVBhwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBg
+	wIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYM
+	GDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIAB
+	AwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBg
+	wIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYM
+	GDBgwIABAwYMGDBgwIABAwb+wADn5AABCmVuZHN0cmVhbQplbmRvYmoKOSAwIG9iagoy
+	ODMKZW5kb2JqCjI0IDAgb2JqCjw8IC9MZW5ndGggMjUgMCBSIC9UeXBlIC9YT2JqZWN0
+	IC9TdWJ0eXBlIC9JbWFnZSAvV2lkdGggMTk0IC9IZWlnaHQgODYgL0NvbG9yU3BhY2UK
+	L0RldmljZUdyYXkgL0JpdHNQZXJDb21wb25lbnQgOCAvRmlsdGVyIC9GbGF0ZURlY29k
+	ZSA+PgpzdHJlYW0KeAHtW/k7W1sXNiYhA4kMZNCQCGlDpEVQ2vQGpdUipPS6VUQN/bQI
+	WqoN8Riu4OpFWq2aqqh5akPQ5/5r39onQnS8X7U95/ke7y/8cs5e717D2dlrvW5uJyD2
+	DrgTAN+5Q+7uHgienp5euAIMwAxxd/9fiGDWe3p5e3uTyGQyBV+QySQwxAvx+Lcs0OaD
+	9SQKxceXSqXR6HQ6AyfA0jQalerrQ6GQHSz+hSfAfth9MsWHSqMz/JhMFiuAjSMCAlhM
+	pj+DQaP6IBLgiW9wgPjB7KfSGP7MADaXFxjE5wsEQpwgEPD5/EAej8Nm+SMS3+YADkD7
+	T6X7MdncQL4oWCwOlUgkUmkYLpBKpRJJaIg4WMQP4iESiIPX19wADoDw96X7sTiBApFY
+	EhYuP61QREZFKXFCVFSkQnFaHi6ThAQLArkB/nQqhQSh9KVIQgTAAQwmJ1AolsjkCqXq
+	XGycOj4hIREnJCTEq9WxMSpl5OlwiVgUxGExaOCGL1HACPjQ/AJ4ArE0QhEdo05MvqjR
+	alNS0/BDqlZ76WJyojpGFSkPEwt5bH+675coYAR86Ux2kEgSEalSn9do0zIys7J1utw8
+	PU7Iy9XpsrMyr1xO0SSpz0bJJcF8DpPhS/m8F1AIAQEOXyxTqNTJ2vTMHH1BYVFxSanB
+	UFZ2BweUlRkMpSXFRYU39bprGdoL8WcVMrGA+yUK7h5eZB86kysICY+KSdJmZOkLbxsq
+	7lbfr6kzGusdaPhl2F/QaKyrram+W1FWXHgj+4o2OU4pDxXygALZ28Pjo1MGECBRaEyO
+	IEQerb6Ydl3/R2lldV3jw0ctT0ym1jaA+RcDrdnaanry+FFTo/FelaHoRla6Jl4llwi5
+	TLoPyevjggQxRKH6sflAIP5Shu73ksqahmaTuaOru8di6e3twwW9vRZLz59dHWbTo8aa
+	KkNh7lVtokoeKuD401AqHHECiiFfRkCQODw6/rerebfu3Gtoaevs6Rt4Ojg0bLVan+EC
+	WHh4aPDvgX5Ll7ml8X55kT4TURDz2X5UiKMjXwV3cAGNyRPJotSXruqLKmqbWjt7B4ae
+	jYyOjo2Pj0/gBFh67NXoyPPhp33dbc3GquIbmdoEpexUIAvi6KgTwAUQQwLJmZiLGXlF
+	lcZH7T0D1hevJqam38zMzs7hh9mZN9NTE2MvrE8tHS31VcX6qxq1Qiri+lMpR5zg7uFN
+	obMCxRGqpDTdrQpjS0fv4MjY1Ju5+YXFpWWEFRyALby0uDA/N/N6/MVQf+fj+qqivIzk
+	cxBHAQwfb0+XMHL3JPn6cYSSSLX2+u93ah919A+PTs7MLy6vrq1vbOKKjfW1tZWl+dmp
+	UStQMFYUZqckKMOQE8heLrns4QVZgFyQnKEvudfU3js8OjW3uLq++c5ms21tbW3jBFga
+	DHi3ub669Hb6lbW/o7nGkH/1YoxcHMSiQxgdViMPbx8Gmy9RqLVZf1Q2tFoGgcDy2qZt
+	a9tu39nZxRE7O3a7fcv2bn15fnp0uNf84G6RLiU+SipkM3xJh2EEQUT154pk0efT9aU1
+	LZ0DI5Nzy+vvt+w7u3sOfMAF+4vv7ti3bRvLb6de/t39uK6sICNZFXGKx6SSXRhAJYIg
+	ksdczCysbGjrtY7NLK6937aD/QeW//PLcbD03t7uzrZtfXl2/Fl/+4OqW1mXYs+E8lk0
+	ymEiQBrQA7Agyrld3dw58GLq7crmlguBX279/oL7JMAXO9vv1hZegxNaakpyUxOipAI2
+	wyURoJYy2MIwZWKa3lD3pGfo1ZvFddshAbzsR+s6OezabRtLs+NWS6uxPD8jSSUTcf18
+	D1PZw9vXjxscDpWooKLB3PdsYm55c2vHGUJ4EnByQE7YXHk7OfIXhFFh5oVz8lM8fyrp
+	oBgBA3/eKfk5SIOqhx0DI1Pzq++2dx05gLP9BxR27e9RGD3tbK4uytLEnBYHMqkkT2c5
+	9SChRD4do7leVN3c9fTl9MLae7vDBfgT2I+kPbttffHN6CAkQnGOVq2AVHYpRh5kKiso
+	VBH3W/bt+y3dg6NYGmAuIAIBB4W9HUiEmbHhnie1JboUdaSEH0CjHJRTTzKNhZUiXXEN
+	SuSZpQ2bnUAMUD7v7WxtQj21WkxGQ14aKkYBdIqX82QEDKCYRsan6ErrTJbhsdnlDdsO
+	YkAMF2BO2NsFBnPj1t62+jJ9WqISvsquDLDPQVRCaq7BaLJYx2exUkQcAojC3i4Uo7mJ
+	Z33mhjv6y4nKMDhXuPiAQmcLpMAgz2BsBQaOYkpEBpPP+8yN5TeAgUz0KQP4oOWV1cOZ
+	wsmAKDGE7Nj3weTzfmCQn34++gsM9CcMfprbvssHP82a73qxI5O/EEXunlgmo4OdaxR9
+	10I/7aGvM4DDNdSiowx2936aMd/14g9YNf3IB87DqbvXweH6Tn0bOpqubG7vEuZz5iD8
+	Ydf+bvXt1Eh/e2NFAXa85sB1xf7h1JWB43BNRAZ7TgYPThh8VxQf/6EPJz44/iYe8w0n
+	PjjmBv6Ax0988AM28ZivOPHBMTfwBzx+4oMfsInHfMWJD465gT/g8f9zH7h9/lfm/tU9
+	Qf589VfmAQN044VuHWeWHA2Q/T4WIf6gFgi6N+1tQzden7sv4kui0L1p7RO4u349v7Jp
+	gzYmkbBt21xdmH411GMyYvemn9w67rfRiu8/6hh4PjGzgHrJhMLmxuri7OTI066W2lKs
+	kfbRvSncvocqYjVZt/7zwGwZfDk1s7C0skoorCwvQF9/uK+9qfp2NnRAoH/gene934y9
+	kHmz3Pi4s986OjE9O/eWUJibezM5ah3oNtVXFV7TONuxh/0DKpN3KkKFGuLVD1q7+4dG
+	RscnpwiFyfFXI8N//Wluum/Iv5J8Vo76aIc9HOijoZa+Mj4l51Z5TVNrF4wWWZ+PEArP
+	nw3BkJG5ua6ySAcNEFnwkaY+9DIZMFykiNFcvVFcWfvwSXtXT28/wdBn6W43NdVVlRRc
+	uxSnkAo5fi6DFWgwBCbUIqITU7MKiivu1Te1mMztBIPZ1NJUf7+y+GZOWpJKHsJnoys7
+	Zx5ATx+NqEkVMRfSs/JvGSqra4wNjQ8IhcZGY011paGoICdDExcZBkHkOp6DZtRgOkcs
+	U8KgZqYuv/B2aVl5BcFQXlZ6u7BAdy1NE68Mdw4LOjvijjlBmPYNV8ae16RmXMvO1d8o
+	IBjy9bk516+kXUqKU0aEwOTvkVlBGLODWU0mFxtYjk1M1mhT09IzCIb0y6laTXJinCoy
+	PETIYzFgVPCgIe7mBroJmNpnAYUwmNk/G6tOSDyfRDCcT0xQx56LjpTD7DWP5QdCBNex
+	Xw8Pb5IPEh7wRSFSmfyMIkoZrSIYopXKyDPycGlIMJ/L8nPIEJxp4ObmkB4ABTaPLwwG
+	5Yo0TEY8SCWh4lMiPo/NxOQsR3UULvobDi+QLxCKCAihAOQ4XNDjgJblEz0O0nCBBMeH
+	ihRcmH6LQziApgykXf4MOgi7SJ8KihwyNFDRIREdbgq6bwn36EheR0H2f06Y5uDgTSJh
+	MkYfAgKpKzGNI2a/80BxmM2Qz0ACpKQgJAUhJCEBpmFC068JNDExLxAhKDDzXHf95P+T
+	HTjZAccO/Bf2t3JMCmVuZHN0cmVhbQplbmRvYmoKMjUgMCBvYmoKMjcwMwplbmRvYmoK
+	MjcgMCBvYmoKPDwgL0xlbmd0aCAyOCAwIFIgL1R5cGUgL1hPYmplY3QgL1N1YnR5cGUg
+	L0ltYWdlIC9XaWR0aCAxOTQgL0hlaWdodCAxMDIgL0NvbG9yU3BhY2UKL0RldmljZUdy
+	YXkgL0JpdHNQZXJDb21wb25lbnQgOCAvRmlsdGVyIC9GbGF0ZURlY29kZSA+PgpzdHJl
+	YW0KeAHtXOtXUmkflTt4OEeBoyiXxEDUAUEmCMXL0CioXbwVXpalpkbWwiFxMBuNxGU6
+	46VmvI9OaKVZljrFjGnWev+19zmQFxzX+XjWM7PO/uCX58Pv2XvzwHKt395xcTRgU4AB
+	O0gEYzCYACwWiw0twOWIOzIYp9Egrs9iczhcLo/HhxQ8HpfL4bAJFv/gQOgPrs/jC+IR
+	RChEUQw6oKhQiCDxAj4vSiKWA7g/0J/HR4QYligSiSU4hJCIRaJEDBMiAsAB+BBDgcFk
+	cbj8eCEmkuDJ0hSZTC5XQAa5XCZLlSbjEhEmjOdzOWwm89hjiBJA0ERJcqpcmaY6q1Zr
+	MiCDRqM+q0pTylOluAgjbGAdNwG8AS4fwUR4qkKlzsjM1ulzDEbYYNDrsrO0apUyNemA
+	wpEJ4DNEEEiSpakzdQbTOYs1L98GG/KsFrPJqMvSqGTJYgzhc9lHJjCYHF48CgiotLpc
+	s7Wg2F5S6oQOjpILxYV55ly9FlAALvA4xxgAC4SJuCxNm2O2FZeUXaqsrr3mggzXamuq
+	LpeXfmczGzJVsiQRKuCyDt8yk82LxyQpaRk5lqLSi9Wuxhstbe0dt6BCR3tb641GV80l
+	R7HVCFzAExAe+4gBsECUrFDrzEXOSldTq/tu1z1fD2Tw3eu66267XldV/p1Fr1FKRUI+
+	5zgDVJySlmm0lVbWN7s93f4HA4HBIFQYDDz8qdfncbc0VDkLTFnABExw9BCYHAGGy87q
+	zMUXXc1ur79/cHh0bHwCKoyP/TwcHOj1drbWX7Zb9GpFUkI8l3Xws8zkIonJSo3BWlLV
+	5PbeDwyPPfltZnYOKszOTD0Ze/yoz+turnXkG7VnpCKEd8iAxUNE0rRMk63M1erxB0Ym
+	p+YWn4WWoULo2dL81OToo96u9rqKom+zVSknGaSoss8VXWq81d0/PDH9e+jF6jpkWHsR
+	WpyZHBnwdTZdsZt16TKxkM8++BSx+EJxavo3Fnvl9Tv+wbGp35dXX7/d3IIKm+/erK0s
+	To8H73uaq7+36tUyCRrDQCJT663fV7d4Hgw/mQutbmz+GYYM77c21pYXnj7u996sLc0z
+	aOR4DAMUl6lz8kprb3oHRn9bfPF688PfH3ehwsed8Nabl0tTvwR87S6nzZihwLHjHqC4
+	XGPId1xr7w6MzTxbffvn37uf9qHCp72d9+/WQrPjgz+668psuVrlKQxsTleHb3B8NrS+
+	Gf746fMXqPB5fze8tb4yPxn0u+vLC2IZMNh8DFdkGAGDWz3Bibnl9a3w7v6X/0GFL5/3
+	/tp+/Xxhcqj3dkNFoUmrTCJ+lKP/IdAMKPGK9oASmUmH0B6QykPJIe0BJTKTDqE9IJWH
+	kkPaA0pkJh1Ce0AqDyWHtAeUyEw6hPaAVB5KDmkPKJGZdAjtAak8lBzSHlAiM+kQ2gNS
+	eSg5pD2gRGbSIbQHpPJQckh7QInMpENoD0jloeSQ9oASmUmH0B6QykPJIe0BJTKTDqE9
+	IJWHkkPaA0pkJh1Ce0AqDyWHtAeUyEw65D/uQRyLH9mz+/duqR0yAJuCPmJTcO3d+529
+	/c9QYX9v58PmK2JT0A82BU/s2UUYRLc127wPR6eWXrzZCu/s7kGF3Z3w9sbLP6bBtmbH
+	qduakY3ZkprWrp+Gn84vr21svw//BRXCH7bfvlpZ+HWk/17bVUe+QXNi31QoBsv7FnvV
+	jbu9wbGpxedrG++2tqHC1ubGq+dLMxNDfZ6W6pJ/bC2D3XewOW4uvtzo9g08npxdWn75
+	av01VFhfX11Zmn06Gui5AzbHLbqzsZvjX7f3C8pdNz29j0YnpxeWQivPocJK6I+FmSc/
+	B/t+aK+/+HV7n3+YP4gmKDKMeaU1193evkcj40+nZ+cXoML83PSvE6PBB92dzbVg7fpE
+	goLJicdwuVpvtl+qa+28d//h0Mgv45OQYWJsdCjQ133nZsOVC+f1mhMpFpDDkaSqsnJt
+	jqqG1ttdPX39geAQZAgG+vt6fuhsbaxxFpqy008miUCaS6rU6M3FZVX1N9o7PV7fj/5e
+	qOD3+7yezvbmhpoK+/mcDBDDQY+nudg8BMNTVVqjtdh5uba+qaWtw30bMrg72lqaGmqv
+	OO15RhAKJBJ1B4vjcXEMItVIxDIzjZYCu6PiSvVVV10DZKh3Xa2pvOi8UHjemJUuT45N
+	NUaSpZgoGSRL9SaLrche4nCWV0CG8jJHib3Idt6Uk5mukBLhWM7hl2lcHIjog3SvGFDQ
+	ZOuN31qs+baCQshQYMu3Ws7l5mRrVXKpOCE23RvHZHK4gkhAWZmu0YKAtcGYa4IMuUZj
+	ji47U5N+BsSTE4SRkPhRwppIufMICrhUpjgDQu6aDC18iMbcZaem3IEJbNA0gKAJIjwJ
+	FA3IFUoIoZBHqgbEiSgCGh9A08BBno6wgmh7ABQECIolRLsekqAD6J8AfQ+JGIoIolUJ
+	xwlEKRA28InCDQjrNqL9HyhRucEn7n+yruLAhmjpCVF5IoAQxL1A78nXxpBYB6JvOtI8
+	E+md4UAK0IgTqZ45vXnmgAUo/yHqaeBEpJkoelP6L60ArcBxBf4PP9iXDwplbmRzdHJl
+	YW0KZW5kb2JqCjI4IDAgb2JqCjE5MjcKZW5kb2JqCjI5IDAgb2JqCjw8IC9MZW5ndGgg
+	MzAgMCBSIC9OIDEgL0FsdGVybmF0ZSAvRGV2aWNlR3JheSAvRmlsdGVyIC9GbGF0ZURl
 	Y29kZSA+PgpzdHJlYW0KeAGFUk9IFFEc/s02EoSIQYV4iHcKCZUprKyg2nZ1WZVtW5XS
 	ohhn37qjszPTm9k1xZMEXaI8dQ+iY3Ts0KGbl6LArEvXIKkgCDx16PvN7OoohG95O9/7
 	/f1+33tEbZ2m7zspQVRzQ5UrpaduTk2Lgx8pRR3UTlimFfjpYnGMseu5kr+719Zn0tiy
@@ -1392,795 +1143,564 @@
 	VG4p1Oo9g0qsHCvYAHZwksQsWhy4U2u6OXh32CJ6bflNV7Lrhv769nr72vIebcqoKSgT
 	zbNEZpSxW6Pk3Xjb/WaREZ84Or7nvYpayf5JRRA/hTlaKvIUVfRWUNbEb2cOfhu2flw/
 	pef1Qf08CT2tn9Gv6KMRvgx0Sc/Cc1Efo0nwsGkh4hKgioMz1E5UY40D4inx8rRbZJH9
-	D0AZ/WYKZW5kc3RyZWFtCmVuZG9iagozNyAwIG9iago3MDQKZW5kb2JqCjEyIDAgb2Jq
-	ClsgL0lDQ0Jhc2VkIDM2IDAgUiBdCmVuZG9iagozOCAwIG9iago8PCAvTGVuZ3RoIDM5
+	D0AZ/WYKZW5kc3RyZWFtCmVuZG9iagozMCAwIG9iago3MDQKZW5kb2JqCjEyIDAgb2Jq
+	ClsgL0lDQ0Jhc2VkIDI5IDAgUiBdCmVuZG9iagozMSAwIG9iago8PCAvTGVuZ3RoIDMy
 	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
-	7RVNHyoXEq85tf8uOJDICmVuZHN0cmVhbQplbmRvYmoKMzkgMCBvYmoKNDYyCmVuZG9i
-	agoyOSAwIG9iagpbIC9JQ0NCYXNlZCAzOCAwIFIgXQplbmRvYmoKMjEgMCBvYmoKPDwg
-	L0xlbmd0aCA0MCAwIFIgL0Z1bmN0aW9uVHlwZSAwIC9CaXRzUGVyU2FtcGxlIDggL1Np
-	emUgWyAxMzY1IF0gL0RvbWFpbgpbIDAgMSBdIC9SYW5nZSBbIDAgMSAwIDEgMCAxIF0g
-	L0ZpbHRlciAvRmxhdGVEZWNvZGUgPj4Kc3RyZWFtCngBncEHVgEAAADQ+9/ESrZkVBQa
-	skdpGJlRjuA5gv//4XDyr/7UXu3Ur9qqjVqrlVqShfpRczVTUzVR3+pLfaoPNVbv6k2N
-	1FANVF/1VFd1SFu1VFO9qoZ6Uc/qST2quqqpqnpQ96qiyupO3aobVVJFUlB5da1y6kpl
-	VUalVUolVULFVUxdqqi6UBEVViEVVIHzHQFawrliCmVuZHN0cmVhbQplbmRvYmoKNDAg
-	MCBvYmoKMTUyCmVuZG9iagoyMiAwIG9iago8PCAvTGVuZ3RoIDQxIDAgUiAvRnVuY3Rp
-	b25UeXBlIDAgL0JpdHNQZXJTYW1wbGUgOCAvU2l6ZSBbIDEzNjUgXSAvRG9tYWluClsg
-	MCAxIF0gL1JhbmdlIFsgMCAxIDAgMSAwIDEgXSAvRmlsdGVyIC9GbGF0ZURlY29kZSA+
-	PgpzdHJlYW0KeAGdwQdWAQAAAND738RKtmRUFBqyR2kYmVGO4DmC///hcPKv/tRe7dSv
-	2qqNWquVWpKF+lFzNVNTNVHf6kt9qg81Vu/qTY3UUA1UX/VUV3VIW7VUU72qhnpRz+pJ
-	Paq6qqmqelD3qqLK6k7dqhtVUkVSUHl1rXLqSmVVRqVVSiVVQsVVTF2qqLpQERVWIRVU
-	gfMdAVrCuWIKZW5kc3RyZWFtCmVuZG9iago0MSAwIG9iagoxNTIKZW5kb2JqCjI0IDAg
-	b2JqCjw8IC9MZW5ndGggNDIgMCBSIC9GdW5jdGlvblR5cGUgMCAvQml0c1BlclNhbXBs
-	ZSA4IC9TaXplIFsgMTM2NSBdIC9Eb21haW4KWyAwIDEgXSAvUmFuZ2UgWyAwIDEgMCAx
-	IDAgMSBdIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlID4+CnN0cmVhbQp4AZ3BB1YBAAAA0Pvf
-	xEq2ZFQUGrJHaRiZUY7gOYL//+Fw8q/+1F7t1K/aqo1aq5VakoX6UXM1U1M1Ud/qS32q
-	DzVW7+pNjdRQDVRf9VRXdUhbtVRTvaqGelHP6kk9qrqqqap6UPeqosrqTt2qG1VSRVJQ
-	eXWtcupKZVVGpVVKJVVCxVVMXaqoulARFVYhFVSB8x0BWsK5YgplbmRzdHJlYW0KZW5k
-	b2JqCjQyIDAgb2JqCjE1MgplbmRvYmoKMjUgMCBvYmoKPDwgL0xlbmd0aCA0MyAwIFIg
-	L0Z1bmN0aW9uVHlwZSAwIC9CaXRzUGVyU2FtcGxlIDggL1NpemUgWyAxMzY1IF0gL0Rv
-	bWFpbgpbIDAgMSBdIC9SYW5nZSBbIDAgMSAwIDEgMCAxIF0gL0ZpbHRlciAvRmxhdGVE
-	ZWNvZGUgPj4Kc3RyZWFtCngBncEHVgEAAADQ+9/ESrZkVBQaskdpGJlRjuA5gv//4XDy
-	r/7UXu3Ur9qqjVqrlVqShfpRczVTUzVR3+pLfaoPNVbv6k2N1FANVF/1VFd1SFu1VFO9
-	qoZ6Uc/qST2quqqpqnpQ96qiyupO3aobVVJFUlB5da1y6kplVUalVUolVULFVUxdqqi6
-	UBEVViEVVIHzHQFawrliCmVuZHN0cmVhbQplbmRvYmoKNDMgMCBvYmoKMTUyCmVuZG9i
-	agoyMyAwIG9iago8PCAvTGVuZ3RoIDQ0IDAgUiAvRnVuY3Rpb25UeXBlIDAgL0JpdHNQ
-	ZXJTYW1wbGUgOCAvU2l6ZSBbIDEzNjUgXSAvRG9tYWluClsgMCAxIF0gL1JhbmdlIFsg
-	MCAxIDAgMSAwIDEgXSAvRmlsdGVyIC9GbGF0ZURlY29kZSA+PgpzdHJlYW0KeAGdwQdW
-	AQAAAND738RKtmRUFBqyR2kYmVGO4DmC///hcPKv/tRe7dSv2qqNWquVWpKF+lFzNVNT
-	NVHf6kt9qg81Vu/qTY3UUA1UX/VUV3VIW7VUU72qhnpRz+pJPaq6qqmqelD3qqLK6k7d
-	qhtVUkVSUHl1rXLqSmVVRqVVSiVVQsVVTF2qqLpQERVWIRVUgfMdAVrCuWIKZW5kc3Ry
-	ZWFtCmVuZG9iago0NCAwIG9iagoxNTIKZW5kb2JqCjMgMCBvYmoKPDwgL1R5cGUgL1Bh
-	Z2VzIC9NZWRpYUJveCBbMCAwIDU3NiA3MzNdIC9Db3VudCAxIC9LaWRzIFsgMiAwIFIg
-	XSA+PgplbmRvYmoKNDUgMCBvYmoKPDwgL1R5cGUgL0NhdGFsb2cgL1BhZ2VzIDMgMCBS
-	IC9WZXJzaW9uIC8xLjQgPj4KZW5kb2JqCjQ2IDAgb2JqCjw8IC9MZW5ndGggNDcgMCBS
-	IC9MZW5ndGgxIDkwMDggL0ZpbHRlciAvRmxhdGVEZWNvZGUgPj4Kc3RyZWFtCngBvVkL
-	dFTV1d7nPubeeWQyM5n3+2YyM3k/SUhISIaQScIrQqKQINEkkJAg0YAxChX+qFghIopK
-	iGCtqIUAaoaQwgBCKQVRaytaxUdtqxWs7TKLPtBaJTP/vndCKl3Wn7V+l3PmvPZ57f2d
-	ffY59xwgAKCCXqAhsLizuQsGSTpSXkX/yuKebvcDfy59AoAMANDL27qWdmo/+MUrACwD
-	oFAtXb6qzaO5MwQQr0HPtLc2L7mQ8487AJx6bF/QjgRFIpeC+dmYT2rv7L4jaGZfwHwX
-	5iuW37K42b5eaMP8iFje2XxHF3+b4l+Yfwfz7pubO1sX9N64GvNfYD6x65Zbu8kq6hkA
-	l11s37WyteuFe27OwXwT8vca0gg68acCGRzD2A0LxykS+f8RUFJb+r/0gHh8y4/FMhlw
-	wI/XkU/UVYASeQWIAzXET1ARTfY4aNijkMz2gpXJAhdA9F3074lx5Lrox+xp0EQ6o3+j
-	i7HVIdFTkbISOA4PwHYYwtEGMZ0MN8AAvEyWwSGyCEbgLHFCJs41A2GYDa+SaPR1aINn
-	sH43nIAtsA95SYZOMGDpJuKNrsZ8ANMtsC76FCRBIfwQjkIR9roJRqO7o/uxtBaugz2w
-	F9v/kniofUxC9PnoOZR0Hva5Dktej86ODoEO0qEc5iJ1HRwjXvq9aDuYoRi5exx+DDvg
-	5/ApuZuMRNujPdEz0Q+BwlI71KFbQ0bIh/QQ88Po49G/RCOIRDKk4qhN8Ag8jf0PoTuO
-	0x4kN5Fu8gjZQgWou6kR5l7WFBlDHFKgCl013ALrEYFDcBL+Dv8iFygzraG76VPR/Og/
-	cA5moZSiJK3Qg+4+dJtQpiNERrLJdDKXrCGPki3kN1QqdR1VT91O3UF9TNfQi+hV9G+Y
-	W5lhdiM7IFNGPoseiZ6OvgUmcMD1sBLWonQn4AxchC8JjX3ZiZcUk3JyA7pesp06RHaQ
-	Q9RccpycofaQP5CPyAXyFcVSKspApVHd1CPUXuoE9Wu6g95CP0b/gf6MKWUpdgd7Xubl
-	fhtpiWyI/DpaHP0w+gWuXh4EnJlyqIEboRml7YJJ8D8oxXPohnDWTsIpeFlyHxE7jMIX
-	iAIQHbGSXDIHXQ25hrSRDvIEOYzumMTL5xROBCWntJSJslN1VAvVSfVSb1G9tI1OpWfS
-	C+khdC/RZ+mv6K8YlklgDEwVMwM2Mp3MNnQ7mUFmmHmNLWJL2Rp2PtvLbmA30ovZ19mz
-	srWyTbJh2QXZX7lkbjZ3C7cRZ+dl1NmfT6wCMcGQJOQ+F26GxaSCtEA/zsYO0gx9qF1L
-	yHrEqwuSo430WrqKykZtOAY/QG3dBmtgA70IdkTfoffA26gpy7GvXtjFlIOD3Yqzczdk
-	oxaNu0BKakqy3+dN8iQKbpfTYbdZLWaT0aBP0Gk1cSqlQs5zMpahKQLpQU9lkzvkawox
-	Pk91dYaY9zQjoflrhKaQG0mVV9YJucV2zVh0Rc0A1mz7j5qBWM3ARE2icZdASUa6O+hx
-	h35V4XGHycJ59Zh+oMLT4A6NSuk5UvohKR2HaUHABu6gub3CHSJN7mCosqe9L9hUkZFO
-	DgUQDkVGumg4AqAUOw7B9OY17WaMxBrBkNVTEQxZPJjGMtobbF4SmjuvPlhhE4QGpCGp
-	th7HyEjvCCGfcL9qiWfJ/eEAtDSJqeZF9SG6uSFENYl9adNCJk9FyLT6vPnf2cup4Mav
-	FYYob2Vza19lKNB0P4IrZpvEXPNGzM2qc2O31L0N9SFy7zgTIo/LkFOR3VZPUOSraZk7
-	JPeUe9r7ljUhuFBbP2wNWIOe5oqGEMytH7YELFImI/2QeW2xgNIfypiWMU2MiwXz2lj8
-	p3ti9DeOi7F57ckPMJ5VOwEAEUfyzEA+Q+7F0iAeZLZQDFoLoW9xIeKEvwaCYnYgP9ND
-	FOoM7Q2x3hnNod66y2y0V8SYa1pWMSy3WEUZmsobsH5Tn2YKzhTW13jcfZ8BTqFn9NMr
-	Kc3jFJlX8xmIheJET+hKiDRfTvdIwKDU7WZPuzi/PdKcYt5jDn6NgHkRGpHnkD6UO2tu
-	vRByNyAhDGnps8Ign1u/j5BNDWESvTcMFY5DIAf6xhuwOF1UtY4KHB8zGelISBUwlZnu
-	rkSpK0Vdcfe5+2Ys6XNXuttRmRivFGNBa19DFiJYV484wbU4YqDBNpFsbWiYgv1kif1g
-	E6ze14A9LBvvAWOJlDWGlbLTZ+Gs+ObWz6sP9VbYQoGKBpwFVN/jc+tDx1FzGxqwVs4E
-	p8jxmg7zOM+5yHNOKpbnxXqpwz6wi4a+PrHPunqPEDre12frE9dbLB8m8J+EwDghDGIV
-	FDwYJr1zsS1GHsEmEjyCR0C2GkRMJ6FKX9aoMOR/O8IFE3xjy8nIbYGEcOF3hHDR1SA8
-	5aoQLp7g9AqES5DnYhHhqd8fwqVXIFz27QgHJvhGJqchtwEJ4fLvCOHpV4NwxVUhHJzg
-	9AqEK5HnoIhw1feHcPUVCM/4doRnTvCNTM5CbmdKCM/+jhCeczUI11wVwtdMcHoFwnOR
-	52tEhOd9fwjXXoFw3bcjfO0E38jkdcjttRLC878jhBdcDcL1V4VwwwSnVyC8EHluEBG+
-	/vtDeNHXEMYDbzkeO8/gtxeNX2xlYahLCwOfhZsfel4TBjiDXsxjmn4/DAx6wDT3PhzG
-	FgDz0w5jLyzG2Tl5WkHrR1/ObApf+iN79MvpYWbOV/uxFgULo++xK9jzeBp1wr5AsY3d
-	SvpZ2kVczN3kPnZDAlvH0z90aLUG2RQHrZpikDspp9NC51DFmhyt1S3PsVhc7h3CsjZz
-	WlrNxTmjNZrP54xeHNUVZUFZ2WiZmNCM5mRPXxWYAnaTN8Gn9tp8SqM8F+L0mlyi08Zr
-	ODvmWKBzCaEYWmFW5UK8DgPeKsslDMEgDX9EU6IpSUuLhSLhrkbSyBOTJ5N4EkGr0eXl
-	Ti6YnCfjZILb79NqJhcIHsZJJmlPCKeG34189rcL79861XnC+vBQ5O0oPH/+2cOkKpk9
-	H3nvyKadkdcipyKRyM92N2z+5EdHt/+KPEuCZ/6I+BA89wOzB+dBDkUBM+dkGDntJPg5
-	wstuIlYlzXvBolCGyYL9wpb3YxCMlYgYnEPxS0Tpx3KyEwSDoBW9Z4j+6tKr1OtjWafZ
-	oyOR8qGxJeIc4L0De4c0hh8eDei4uBmkmm0g9WwHu0R/B8sbj+AHoAVsxB4o9whuX5Nu
-	he42Pa1zuvR2Ay04jXrGp0vyOkEut3FOJeWz23i31+DyGumc+A6bNYX3ef0KS3LKWWFL
-	bJ5K5sS4vDj6JjooKykpG0NeS8ZKirSmIqLVFRXhvxHjtJxs0khyC/In+X0eQUsLueI3
-	iYxzEhcxmowmA+KfRXxSoYeu2vj0yqltEetpanCw87XOlvkLWI5W6jIvKlSMiltStDpS
-	fJq2dz38oyJnREHtyLlhbN1gnmdl76lrUyr1QkLJ/M8eyrGN9aHW10bfl77i4vH7vAR+
-	FyhMzSYKjdKmsvvzqjUd8mUarojXqeS0LZdLkjs0KkdxGpWZUnywmCrOTfXqNBzL2/2J
-	JnuY9AU8JoeL8zsylZQjX1nClZTY9VxK6mCStdSWYp8Z7y+0TC19gWzFj9dDpB/GNfmi
-	pMvnxk5O6HLZKE6oVmeSgMkczRwVgUK8JPVOLphsSARi8ZKCeAHMTpsARrdeIEIiTKYE
-	sDpMAjEIGEBMmSUVvusuQC1OMoq6O5WoSTxB/TWQgsmIt8+TyMk4TynJEyHX6rESDqFG
-	bff7/GLky59UMDmBqFfW3NjQL7Tndrbk1JGRUoPqntUPFAuKQfafTx/tuc3kVTm1qem+
-	xlSjfPKv79xy9PDWvtcWps/Yudlgl6nj7FlLyXI+3ZyxqG52at2L26urB8a22hNp+l6V
-	rNwTqF720/Vbnkkg50Q9xa98+gxTA1awwa5A1i4LGTAP8nvM9Exeu11P03qZw8rFOfRK
-	G2ezmTR+HaH9lNbqUPhNFrsjTLj9wso1/7YTJXNGi4q+yVJMAgvvVRkUPlAnaHwxG2HB
-	HNoIQbIRSmOcD20EBnKzzCfaCOEbbISELRhjFgJhjSGYJ0JH5Wsgj6POfmQa0qxc++zM
-	7PUPd91jGXL+9cgbXxLdm3amJvT24nsGO5/c8f6G2986RfI+xiuKKSxiUBh9jx5lT+Bt
-	jQNuD+ROVlepF6h3MbttrJfXU/EODfAOB5egoBwmJZuZkKlJ0eqsLqXfanG67hNWln9d
-	/LFzaCVGRTOpLdLGtMhqtssVQIhZibLZMQAL5QOFjfehgPi/S9QYnagKkoLIDIBrUJun
-	9eSLYkH+JF3e5w/vWLNj5+r1u0lfXfbU554qe/aW/ZEvL/ye3PjJ2y//8hdnXqEmT3LO
-	ohxflm5ZXE8yvvwLWYDrrTr6HmPFWxM73rB5iSqwaiv/mHWXi2bVVDyrN6h18QZ9QBXQ
-	8ylWMkt5gD5NXqRP297h35Wfdb3j+cT0iUd5WntaRy3iWSEpfpvRkVQk4zij4LBzCodR
-	6eW22nfZD9rftjNeY7zXzloUKk6r9sc7/KzVn5TJ+S0Wn/9NYWfjuBE9J20kb46Jdihm
-	jrIaJ3YUtFOaUaRKC68SPAxL45UUYRmZCy2/TpOg0WsYmcqbaEvy4e2rw0ecDrmJ84HS
-	oPaROLXHKiCJxYA3o17FaTAQl6W4yYhbDKZS01LvIisaYUVjI6oQOoPgxJUobjFqgutS
-	Jm06kCeZvkQZR6iRs4UFOs2lC+xDWx+4Nlu/j7smp3bVtNqXIn8h5j8SlzJ55nN3DrLE
-	w1TddN285TOfevpUY0FV8ebMuXYN8eC9HEXKI77bKu/e30fex60HdW0dbkDFuC+IZ4CC
-	gJ07z+CGJKMVcpPJivVTOBoXinyP0BLTqpI5J8dKTtYEWys+Fjefsjm47yagamjzDJ51
-	B/HHpH51lj0q3qpLfdOjON8WXM03BHIOyk7LKEaml/n1PbJujtWrKL1Z42A5kJmVCitn
-	tYIqRW61k0xzigUsNjSrsv3/HngsNl0xS1mCGq0tKiLi/IjmLSHPcNmIebTiNiLaNTUx
-	aD1k3d7Ze9rPzU0/6MheG0iZWZhhGyG7mKyBG2p/vOCpsXnU0y0lS+KM5fkrOsZeQ2YR
-	ieLou4yANkiFd7MWeCiQN8D3ax4z/oQZ5HdqdhvD/Ev828x59Z/1qim8zGHmVA6d0sJZ
-	LAbKH2+1yf0Gi9UWJnK0ROOaFjuxTNh4SaXSwcT4lAly1Aot5SOcCVNsHKYUepUPiAYD
-	3oiGh1ZjIOmNGKTh0kzSSRtlomRtdHgsoQRclZKx+eDe7NmHf9Lf/zRegF+K/PN3kUtE
-	9ydZN4nf2X/Do5eG956j34t8GrkYGYs8T9Iu4WYQEO1NT+Q6xouiqyERugPpu/ldJiqZ
-	d9u1apnDwMXL1A67MlFN+c3WJEWmJlNISYy3eJLuE47GxMON/lxsbqTFI07M+LKxG23A
-	Wn2MD2woGGvEgFjUPqBNkkySWKKxSYpt/ThnBr3JmEfyDLg75eXipaS4BnAr0nqoF3d5
-	Kw8fCXoxjGQOFQSu/8GByMHubatqs4tHVv3mjd5F+44s2Xbngp30vk0zkksif0YZn+q/
-	Md85Y+x34hlrAyrkw0wVaOGagM9P++Im01UMo+Y1lFqulav8vKiGWgVvTSCiPQWLLiFM
-	gqh+ayVjIcpYoxF1fk7ZybGTorUQN2ZR+cZVD48pmWgeZahyG/YanrmJNTs0Ns36h0eY
-	rEMF2yn6GE0NrRwbENdFefRt+gAzC18oskhm4MFC+QDbr3tMP2AYSJUlJ3n9BUKlUJVU
-	5Z+ftMDflrTUt0q1Km6VusfTndTt7fbtdA6mJ9BoZtgMJjMBrAabyW42ZOgzk+OVHXgK
-	K/BS3sQ4BZOWYH7R7kjgGEfmtjRlFidXaygOsoQsq8tsNPtNpck+zp9szVG7/JpS8Gda
-	snOGJ2zj6MWxItE6jhVpMCWKW5SFIS45cY7xzI2m0VS0QtLk2SSD8hm8Vp+gdgkg93EC
-	odPxnMOmYsqhQ5pNbxaIOz5RACFRHcf7FQLxeeUKksEIIEvBwKm1C8RixEAykdIBXAok
-	Fbms+OI6RyspbUx+n3QixOOJeHThPOLpUFwRJqN0ZsTjIx5e/OQC760YXDIw1X/rgxum
-	df/20N9vmk7tYX2lj7V1BJNrbj9R3vHu7y+c5shBMndh9oIF1weTcFdJTJ1x18ALmxa2
-	T82tqglUploSHFnpwUcfPPPuk9S/UJdM0QuUnF2I1qH2p3GZiuNqEiZlAS9jLDLRMrVC
-	a0Xbia8gKWBQG+JpF03Rl4wWi/WSsHT8ZDLWWHRSPAhrYoY0Cy0pHpZHNWPnJGuKtlQr
-	roPLZzFfPu69eYMH9u71GXLinHrXdP/ahZs3swsjbz0yFixMUBJqk5y/ayl16hHJ7hoi
-	M+hPcD2L1uuVwM19hvXmXWaak5lkhbpqXb1uKXc7fTu3UT8AW9kBw1bjVtMgDBo11TDL
-	UGV62cBUsC+y1H3sTthJdrGDJjYpmTUbTEbcFwwqZbyDV4vGzmhDKVkgQyaDeUj1oBFt
-	3pvCUnG1WPAb7Zx5rKgI/xZJQnPM9KE25VqyzPglUCKun1m1qwI6gwGMxk6dyWRmCenU
-	AZjvy0zTrDkpRTzGpBG1bAVpRCufJ6MpjpImNl/cKAsml5LJJI/QtHDad09L+eO9j/tS
-	nFmpmtwsDVuqjnS/ih8QTNbSyObIp89H2kZk/DNxMsHMP5rE1FwaoO8W7YL0m3ZsxdiN
-	8SWfgTb2cHkq8BaaZQApRjTxy+k8ZuWX64uxLCWC770q8kXrpVHl5okSqT8MtKwOyqki
-	/Oo6DQuZj2AI4xHmVqhlAIoxLkRfTU7DOoxFL9J6qD2wAcvFdiaMDdjPJHQn4XPSS82k
-	XqULGYrJZjayDNvDviB7XPYpd7c0shbfwWi4CfdwCjToGgG4TxQqfP8UJST4KhmTVIZl
-	UDGntmFaZVp16/Ke1u6Oxc1Yg0KPv2grvgt+00+LRBp8+MaYDxVQKb0zzsY3zlp8t7wO
-	5sMCWBS7P5iBdwhl6PPRp6VNM0Mv2QkPoX8SPQ0d5H5YhX4D+sfQMxOp3Zg7RO4fZvjA
-	YbIKrGRmQMm4rtVbXGaF0vUGHgVGnnC9a/7oCH6kxsGHxDIcB/JpCvIk+TEsARf5CZ4o
-	V+PrZzLZtj9luasJi3ZDF/pe9LQUErJ72JnrOkbSwcsQbOMDJ0MOuP6Uk+E6nxOmyLDr
-	hD/MYPRzJ+YC8a7jjidcP3MsdR1DvzdWtCcFaxxw7XYsdz3iDJNtw66H8asD22yORbc5
-	sOkBV2dKv2tJjlQ+uz9M7R12FWH5/IDSVVAouPId51xZ/jBPMJ/hmO1KzfmVKwkbYjU3
-	duoNaF12xyOuKVjkdAT9U9AfIXvIdkgl24e9M12HMYni7p+RUtgfJj/YX52c4w2T1YGC
-	6uT+lGq/N2W2y5tS6fdjev5L3Druem4al8ul4QMkGmfOxul5Ha/h1byKV/A8z4XJs8Nl
-	LtkRshfKEJa9+3kZz4bJ80hkjpDnJOJzB3mGp3jg9eHoB3iZQEAfJntHUJ0IYOKATErJ
-	wuQ5vPMRSc8FXKjCBBipQIMahlcaqEaoiBThKZiJLz0PhGVwr7GnzFymK9UWVVb8t6BJ
-	KrkcStvBNwdm4gj141tDaI+jAZ91MBF1NFyuiqbp//h134YVWsvT0tA07e/pWtYmPVN5
-	gq1N+FoVur8Hnw17W9zufcu6xt/gfE0ti9vFd5Lm1lCXp7UitMxT4d7XI7UTyV8rbhOL
-	ezwV+6AteG39vrZAa8VwT6AnKD7X7W8pX9l4xVgbJsZaWf4NY5WLna0Ux2qR2v3HWI1i
-	cYs4VqM4VqM4VkugRRpLhCDYUVd+azdqJz5l4VNScl1oxryF9fhi21ARJjvF963b4H8B
-	s/XyXgplbmRzdHJlYW0KZW5kb2JqCjQ3IDAgb2JqCjU5MjUKZW5kb2JqCjQ4IDAgb2Jq
-	Cjw8IC9UeXBlIC9Gb250RGVzY3JpcHRvciAvQXNjZW50IDc3MCAvQ2FwSGVpZ2h0IDcy
-	NyAvRGVzY2VudCAtMjMwIC9GbGFncyAzMgovRm9udEJCb3ggWy05NTEgLTQ4MSAxNDQ1
-	IDExMjJdIC9Gb250TmFtZSAvRE1SWUFGK0hlbHZldGljYSAvSXRhbGljQW5nbGUgMAov
-	U3RlbVYgOTggL01heFdpZHRoIDE1MDAgL1N0ZW1IIDg1IC9YSGVpZ2h0IDUzMSAvRm9u
-	dEZpbGUyIDQ2IDAgUiA+PgplbmRvYmoKNDkgMCBvYmoKWyAyNzggMCAwIDAgMCAwIDAg
-	MCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAw
-	IDAgMAo3MjIgMCAwIDYxMSAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgNzIyIDAgMCAwIDAg
-	MCAwIDAgMCAwIDAgMCAwIDAgMCA1NTYgMCA1MDAKNTU2IDU1NiAwIDAgMCAyMjIgMCAw
-	IDAgMCA1NTYgNTU2IDU1NiAwIDMzMyA1MDAgMjc4IDAgMCAwIDAgNTAwIF0KZW5kb2Jq
-	CjEzIDAgb2JqCjw8IC9UeXBlIC9Gb250IC9TdWJ0eXBlIC9UcnVlVHlwZSAvQmFzZUZv
-	bnQgL0RNUllBRitIZWx2ZXRpY2EgL0ZvbnREZXNjcmlwdG9yCjQ4IDAgUiAvV2lkdGhz
-	IDQ5IDAgUiAvRmlyc3RDaGFyIDMyIC9MYXN0Q2hhciAxMjEgL0VuY29kaW5nIC9NYWNS
-	b21hbkVuY29kaW5nCj4+CmVuZG9iago1MCAwIG9iago8PCAvTGVuZ3RoIDUxIDAgUiAv
-	TGVuZ3RoMSA2MzU2IC9GaWx0ZXIgL0ZsYXRlRGVjb2RlID4+CnN0cmVhbQp4AcVYe1RU
-	17n/9nnMDA+RlzA8hjPjYXgjAhFQvDLiDIIYg6B2xmhkQBAI6FxFoiZaajRRVG6MF7Wa
-	ZTWmuSoxHoHaQashVpukaVNjq21z7W1sEvtYyfLeNnblxsi5v3NAIllJln9k5Z699tnf
-	/vbj+32/7zsDexMjomBqJ54ctS1eH9UzAZpfoA7UtrVad/x12gEitp2Ib673LWsJe/en
-	PycSPiEKDF7WvLZ+V9BzZ4jGYo3wbkOdd+nNkI//SRTxPtbnNUARfDukkSgyHv3EhpbW
-	NYm5wjPoO9BPaV5R6zXGG0LQb0A/qsW7xmdqCcTeke3oW5d7W+pSpkYuQP8g+mm+Fata
-	aS/rRF/Dl+dbWef7yZPLs4nGwT7/K+gYivYEk4H60Fpp/rBGV/8/vTjY5UkgEaiIjF+C
-	wgRdgDhAoeJZShHbKVbIIolI/T3qO1o7OF+9Ib5GoYMt6v/whZjdr1VusGgqDdAO2k8n
-	sPcRyCn0CO2lN1gT9bNF4OAqS6AJ1A7rfppNv2Cq+jbV0wuY30rnqYtOgqsUaqFxGO1k
-	dnUd+g7INbRJfZ4SqYCeorM0Gbt20kfqUbUXo5Vg9Rh1Y/2bTOZOChHqy+r7ZKK52HMT
-	Rt5WZ6snKJwyqJgqoN1E55idf0dtIDMVAt1z9AM6RK/Sh2wj61Mb1Db1knqdOIzGUxXK
-	etbHrvMnhKfU59S/qYNgIoXSYLWadtFh7H8CZQChdrFHWSvbxbo4B7eR6xM2i9GDd8BD
-	Ks1EKaUVtAUM9NMF+jv9L7vJmflQvpW/qE5S/0FBVA4vNU/qqA3laZRO+HSGGdhENoNV
-	sPXs31kX+zWXxs3n3Nxj3BruBj+HX8Sv5X8trBJ6xO3iXkPQ4C31jPqaeoWiyUIP00ra
-	AO/O0yX6mD5lPPaKZ3ZWyIrZIyjtbD/Xzw6xfq6CDbBL3DH2R/Yeu8lucyIXzI3j0rlW
-	bhfXzZ3n3uIb+S7++/wf+VvCNJETD4kfGOzG/xysGdw6+JZaqF5XP0FGmciGyBTTHFpC
-	Xnjrowfou/DiOMoJRO0CXaQ39PIei6eP6BOwQCycxbIc9iDKHPYQq2eN7AA7jXJOx/JP
-	DoHgArgwLpqL56q4Gq6Fa+eucO18HJ/Gz+IX8idQXuev8rf524IoRAjjhJlCGW0XWoR9
-	KC8KR4Qe4VfiZHGaOEdcILaLW8XtfK34tnjVsMHQaegx3DT8tzHFONu4wrgd0XkDOfvq
-	qC9CYIlAn0PLqZY5WQ3tRjQOMS91ILuWsi3gy0cp6mJ+Az+Tm4hsOEePI1v30Xrayi+i
-	Q+rv+GP0W2RKM3Ztp/8Qiski7kF0NtJEZNFwcaSmpaYkJ9kT5fE2q5RgiY+LjTFHR42L
-	jAgPCx0THBQYYDIaRIHnGGW45JJqq5JUrQhJcmlpptaXvVB471FUK1aoSkbPUazaOi+G
-	Rs10YGb9F2Y6hmY6RmayUOtUmpqZYXXJVuWXTtnqZwvnuiHvcMoeq/KRLj+oy8/o8hjI
-	NhsWWF3mBqdVYdVWl1LS1tDhqnZmZrB+B+gIzMzQfjgcFKRtrNAM7/oGMxpthkuJlZ0u
-	JUaGjDHe7vIuVSrmul3OOJvNAx1UlW7YyMxoVICTtgUvlZdu8zuoplqTvIvcCu/1KFy1
-	tldYuhItO5XodR+YP+/elVzb7xlUOHuJt66jRHFUbwO5Wrda63m3o1deZcW23GaPW2Gb
-	h0FoGJuAVINbJ7s0XNVNViVALpYbOpqqQS5VuntiHbEu2ev0KFTh7olxxOidzIx+84ZC
-	G7zvz5yeOV1rC23mDUPtn58c0l8e0Frzhgvvoi2vHCGAaZbkMuBUrLW6ERlgC7RXXQF1
-	1BaAJzweBjcbgWeGwiFneLsi2su8SnvVXRgNziFw1U3OnoCYWM2H6mIP5ld3hE5BpDA/
-	VLZ23CKEUP7ow9Ea77DGYA+9RdqgFuiRXFGY967cphMDrxvMcoMW3zY9pujLZtc9CvQ1
-	ajTMSqSSU17htilWDxR+Ss8o91NAhfskY50eP1M3+8lp6acA4pc8guEMLdUanbCPTmYG
-	FGk2SBMyrCXwukTLFWuHtaNsaYe1xNqAZBLseouBug5PFhiscoMnmgeLDk/ciFjn8UzB
-	PlnaPliC6R0e7NA0vANaXZV1B5MmZpQjKkkV7rlupd0ZpzicHkQB6TtQ4VYGkLkeD2Zl
-	jyAF4vWN5mHMOcCcnYbx3KFdqrAHtvB0dGh7VrllmzLQ0RHXoX1vQ30/oy8qHMMKP2lT
-	4LjLz9orsBaNbIvTFLJNtgGWR+P0AaT03Yzy06SvZzhvBDdW5gNtns5wwTfE8OT7YXjK
-	fTFcOIJ0FMNTgblQY/hfvj2Gp41iuOjrGXaM4AbI6UDr0Bku/oYYnnE/DDvvi2HXCNJR
-	DJcAs0tjeOa3x3DpKIbLvp7hWSO4AbIcaGfpDM/+hhh+8H4YnnNfDD80gnQUwxXA/JDG
-	8Nxvj+HKUQxXfT3D80ZwA+R8oJ2nM7zgG2L4O/fDsPu+GPaMIB3F8EJg9mgMP/ztMbzo
-	HobxD28xzq+XcPbicTor8lNVup9MWfjjh2oK9RNdQtX6kPlrfhJQCbLxGp3Wz3ML0k9j
-	F5EWpE/Mzg2zhSWjFgud/s/+JJ79dIZfePB2L/794sinXsP/yGU0FuegQs0O1ifTJKw7
-	jVNONFo/Jd9jUJPTLqHC+CTIEyBPyJqYbc/JzytiIWwsMxhRolhePkqSPB49OS8xNyc6
-	ysgbonJz8vKNIUwen5yUrzVJ+dNYPruxpPaHiQn25bm+uvzFUWFLWK9DCguIXLluR3la
-	3JEsZj58tr7e+qRhrD1YCrdkZCYtjh8rznz/ia49Fusf9q/OKHtx5zgc28fEZy2bs5CL
-	NGWYMxdVzU6r+tn+0tK9d/bEj+f5zcGGYtlR2vSjLV0vROAEvlq9LqwX5lAsJQ97HYTz
-	oea1GSdTzWszvGOgNRxtyLWJ2UwedmfIi1yDII/n8sMpNydKWHZCXLDhpeUzx8sLn/Ud
-	zDlRPnjjzOX+7Kls/m9+dJZ7rfbJIy0HD13b+tiViyz3Bk47UxSN+xXqO2KSeB4nPwvF
-	6Sj8NDbrNOISpSOJx8lRi58dpGm2dV6joiNymayTx+XnwTpXvP6t9PQn1m25km73ciFp
-	mauOD772vDTvlRW9P8vLZgX/9fhjv33jzZ9e+vlLf+H3JJRzlk+nddW6Weanf2PfgSng
-	WK++g1PSTJx1E0kaZsNEkTqGWJzoNFYsOitgIcoYZbRpFCC+uSFMCzZ4iNB54POSdZjC
-	9+wikz+7mbBsz45lU+WTkS2Ftd91Vb7+u4J8tuhPKwfWhMRMOP7EWzL/9NzmWc8fvrg4
-	b2bhzgkV8aFMxgGVY8WPDu5cXbKxt0PDx3AjQHyleBnZiLAgQ/0UiuzjUEWwNYZCgBAx
-	QpzCkY1j0EZeAtI8RCbaOAFZZjDmGmVejpDzc/PzOFbZF5YYJcfFBFXm2HsS+i70XOhK
-	6EqMF9sWcdwLHJv/cudnS/nnOo/4YHsTvsODiFEU2YdtB8HuOFSCbQOF6exwiCGFhU+G
-	1VwewRpKdzlimA9eZmf7VldOqd3414mxtmf7/y0mXHrad3XCmj7x/J1rc22TD3sO3JnL
-	HW7Ld++7eud1zeet8HktYhI2HBHN59P4noN1X0X4aIKvJnx5LNc4jd3jKow1dydbLz4q
-	muNTQmNDt/w4ZmOfkNWft5/jz/HciZV39mL/V9Sb3IfiQmT7XU7DsD8bzn0B++s/K2jH
-	wQ6PNlrjNJfXmDREf/4hJ+VrtLI3Tzm6pe6u4PER2WMSxiXYXMkbiqL27JR2igsHr+y6
-	4yqICGJcZ4Dpe8u4i7tgR39S/zDnH0vGTr1FYdp1E9FFx5WkkbZY/zouIz8D7s7XWkPq
-	YCqu09gnHZ9NCn7WREz7Hfv8CRTDqZibjKitIh8u4VajXYG6HrqTaDdxx2gr5Few5AEU
-	hf7O8thT7ALuGCZyPmg1bIG4u+CoCb+kHIWiLMYl2V8Cg8GONsrwSzHkgQH80cJ55TPK
-	qtJL65rb6loba72ZD9U0N/7r6jrM5HBT9jFqHe50vuwJhJInJ5Xot0NluAGaT/gotUzz
-	UxlqEeok1PT06WZqZy/SM6gHUXlqZNtoLepW1O+jCiPSUfT62bYeweQ4zdZSLJvlCBKk
-	eZExkjkwSLrsZ4a+A9Lvze+dYTH4eq6zmJ4xFDA9kB1kP6ClJLEfkp2tw21VCtvXm9os
-	VWPoKPlQ21F5/c3Y0Z6EHOkcyyC7wLAmiRIEdkr6c3am9EG2n2M90vlkv4Dm1QT0HGOl
-	AcsB6RXLMukcavfQ0LFUzDglHbU0S7sS/Gxfj/Ssxc+wZudQs9qCpaekltTd0tJsfXz2
-	bj/X3SNNxvgCR5CUV2CTJlnel7KS/SaGfqZltpSW/UspEQsxzYpN7Y4wKd6yS5qCoQSL
-	K3kK6hl2jO2nNLa/xz5LOg0R7vaWpRbs9rPHe0tTsu1+ts6RV5qyO7U02Z46W7KnliQn
-	Q17wunGT8WHjdGOOMR0XRklGmzHOGGkKN4WaQkzBpkCTyWT0s5d6iiTDGdZNRaClu9dk
-	MIl+9jKUwhl2XFce/7FJMHEmMkX61XdxKcwo0s+6+0I1CcIpgy4Z/Ow4cltTHXdISGV8
-	nPpAKLKKaamFN3HMxNEsnMx3+A20OaqtyFwUPi1sconzq17V+sjdd/pXP2ZmUXbjbKgc
-	s3hwDIegWjx3p5vvCl/Ztq7GUF1xenp55dreNl9TvX6tILvqqnG7oGxrwzVPe43VerLJ
-	N3xnklRdU9ugnWu9dYpPrnMqTbLTerJNX6ep7xmu14bbZOdJqnfNc5+sd9Q5e9ocbS7t
-	eqW3pnjl4lG2to7YWln8JbaKtc1WarZq9HVfsLVYG67RbC3WbC3WbNU4anRbmvOuxqri
-	Va3ITlw94OifUqWUzV3oxg2bx+lnL2r3Eavp/wC1n5T8CmVuZHN0cmVhbQplbmRvYmoK
-	NTEgMCBvYmoKMzcxMgplbmRvYmoKNTIgMCBvYmoKPDwgL1R5cGUgL0ZvbnREZXNjcmlw
-	dG9yIC9Bc2NlbnQgNzcwIC9DYXBIZWlnaHQgNzI3IC9EZXNjZW50IC0yMzAgL0ZsYWdz
-	IDk2Ci9Gb250QkJveCBbLTkzMyAtNDgxIDE1NzEgMTEzOF0gL0ZvbnROYW1lIC9aVEtD
-	SVMrSGVsdmV0aWNhLU9ibGlxdWUgL0l0YWxpY0FuZ2xlCi0xMiAvU3RlbVYgMCAvTWF4
-	V2lkdGggMTUwMCAvWEhlaWdodCA1MzEgL0ZvbnRGaWxlMiA1MCAwIFIgPj4KZW5kb2Jq
-	CjUzIDAgb2JqClsgMjc4IDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAw
-	IDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAKMCAwIDAgMCAwIDAgMCAwIDAg
-	MCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgNTU2IDAgNTAw
-	IDU1Ngo1NTYgMjc4IDAgNTU2IDAgMCAwIDAgMCAwIDAgMCAwIDMzMyAwIDI3OCBdCmVu
-	ZG9iagoxNSAwIG9iago8PCAvVHlwZSAvRm9udCAvU3VidHlwZSAvVHJ1ZVR5cGUgL0Jh
-	c2VGb250IC9aVEtDSVMrSGVsdmV0aWNhLU9ibGlxdWUgL0ZvbnREZXNjcmlwdG9yCjUy
-	IDAgUiAvV2lkdGhzIDUzIDAgUiAvRmlyc3RDaGFyIDMyIC9MYXN0Q2hhciAxMTYgL0Vu
-	Y29kaW5nIC9NYWNSb21hbkVuY29kaW5nCj4+CmVuZG9iago1NCAwIG9iago8PCAvTGVu
-	Z3RoIDU1IDAgUiAvTGVuZ3RoMSA1MDgwIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlID4+CnN0
-	cmVhbQp4Ab1XC3BU1Rn+//vYRwiSEJBNwnp3uZuEJLuEl4RATG7CblgMiSGBuMtDd5Ms
-	BprAtqWpSMHIQ2WxDo4VaMYWqczoYNGbBfEio5MqjrbK1MegFh+o4wOlKa3DowrJ7X/u
-	hpUwDJOZMtwz5/7n/8//+O53zibnAAJAKnQCD0pzezgKFvCT5S3qtuaOVY67KvIVGn8J
-	wN+/NHpX+9uRb3YDCG0AKRl3ta1eWrN/exbADZ3k8+fWSLjlVNOZVIARbtKntZLBer/Z
-	QnoL6a7W9lV3WwDJf8SDpFvaVjaHoRGmkr6VdFN7+O6oJZJygfQdpDtWhNsjfzmmv0+6
-	RnpedOUvV+n3QIT0z0jPjf4iEu2r37wUII1q8H8nG1JjTyqYqANMYBaxB9LFV8Ajbge7
-	UAl2AP0Y9Y+Y7G/QT4lvQ4rep/fyhATHsX78PI6C58AML8A6EOBd2INWkKEXJ8M/0I4F
-	8CH0w0fwBWTBFniC3j44gWfBCt/iePKZBuvhj7BTj0IUyqmdQBFGw3T4Vl+jv6H/AJUQ
-	g8Noxgy06wehCB6g1gWPYyrXpHeDDebCr2lF1sNf4Zge17+j/NPgK0zHImGm/glwIJKl
-	BDbDHngBnShjAS7SvyK7jTAuhj16jd5BcafIqwhqYQ1V+xwlzMVC7MJP+V69U3+Yvm0s
-	zS2AZmrtcB/sgMdhr+HVJIwVR1N+L1TT3MO0F07A90RjPlbi3dxR/jv+38JMoUs/TDgW
-	UL0Q7ESeWHHhAmzBKO7F/fgqnuWKuTBfwh8VosIuwrYAHoRd8BK8Du/BJ3ASeuFH6EOB
-	MJXhbbgG/0BxX3BTuCXcWu4h7hh3ip/EfyqYhS3iJvGQLuhH9R8J801QADNhNsyDAO2D
-	CCyFFfAruBc2ohm2Qze8SmiPw3FMwTQswkk4G+fjIvwZroZHcDe+iB/jl/g1fkvoMjiJ
-	k7kiroPqrec2c3u5OHeQ6+XT+VX8Wr6H/5Q/K4wWlgg91I6LHnGVaayp2jyv/3f9x3WP
-	vlXvonW5kZoL8sEDZSgQi+2wkVZyM3H2OOyGZ+BZiENcP48lcBjeIVyfwyk4Rys2lpoT
-	J+N0rMN5hLAN2/Fe3EEI9+ABQnkID8EH+AGep9YPmZyV83CLuDC3mloX7ODeM/hJ5Z38
-	eN7DV/MN+n/4vXw3/72QIywUfi6sEWLCDmGnOFa8RbxdXChGxcfEA+Kb4vviKfG0yW56
-	wLTbtN/0ntlinmreYe7HcYTFgTmwH16mXbeNj5Luglm4kVa1Ed6i3dsLr8F5+AF64Cm0
-	Qz/PVjNX3wWa/iCt5kvwPP8bKIVHuEe5W/Vy/mneipP1c5RrIq3XxQZKQf74vNwclzzO
-	6ZBuso/Nzsq0jblx9KiMkelpI24YnjosxWoxm0SB5xDcPrkq5FBzQ6qQK/v9HqbLYTKE
-	LzGEVAeZqgb7qA4WF6apQZ4KeS69zFNJeCpJT0xzlEKpx+3wyQ71iFd2aLhwXoDGv/XK
-	QYfaa4xrjPFWYzycxk4nBTh8tlavQ8WQw6dWdbTGfCGvx40HFfoblOJxw0EABYaxxCrM
-	Cq9ttZFgHj41S/b61EyZxjTH5/jCLWrdvIDPm+10Bj1uFWc1y00qyJXqiMKBcBbnINf6
-	ANX2uJephB+2pLbILVs0BZpCbBReHFD5cFDlQqxGeqE6RvaqY+75yvaTenHke+iSSZXL
-	qQpHYlWqEtpCpDM1xLTwQ6RVNzgoLbcpGFBxE4FjIAzsia+IyD5mCS13qFa5Um6NLQ8R
-	51AXiGcpWT455A2qUB+IZyqZhuJxH7Stm+kkUg56KjwVTM502tYl5DcbEvZ3e5i0rTv8
-	Gcnq+iQvyCrJcwim6mimIsQFYZ3OXpHpEGueTvTRE0T6ymWEZ5bK0Vbic1QxZ05Y7WwY
-	gBFu9Q6AW+6NWzOzfPQNocog+YdiaTNoAck/TXbEzgCtrNz7z8GW8IDFlJN2BtgkW//k
-	FlIxfHHcYRDjk8OtNrmVLV+HsdSkyzbfJQbSycnr0aDAXa2BtS7QjfhwUEN9kwZe+0H6
-	B8PfeQdNF7INt8xL5Uhxu8lQ4KQRIaiij6xiO8MRc8TmtMQcVY5W2lJCjiFpIhILFhFh
-	DQGiBeYHnKoSzE4OI8HgDMozgeWhEHKPBSnD8oEMJA1TUR85FbmraRFy6wLzAmqnN1tV
-	vEEinTZxT11A7aH9GwyS18QkUkK8dpltAPMkwjyxgOYnJ7I0UA5KEYzFWM6GgOxUe2Kx
-	7Bj71SV0DeFygzJg0IC50If7NOyso1gSsjObGWSn7CRYQcbpFNrAFzeQBlOvzvDNSdwU
-	OY3Q3mwwXHyNGJ4+FIZLhsTwjCTSQQzPJMwzGMOl14/hWwYxXHZ1hsuTuAmkQmjLDYYr
-	rhHDlUNheNaQGPYmkQ5i2EeYvYzhquvH8OxBDPuvzvCcJG4CeSuhnWMwXH2NGJ47FIZr
-	hsRwbRLpIIZvI8y1jOG668fwvEEM11+d4YYkbgI5n9A2GAwvuEYMNw6F4duHxHAgiXQQ
-	w0HCHGAML7x+DC+6hGGgm0EXAJ1TX6EbqBnKFKdostP5TzDbeUgRBTvPc1lWk9mOkGmx
-	7nG2ldoKC2tPl9b0ldamnS2tSesrhfLSvlLWJ02cku5Mz6PeJTypXTgivvJjmSbUn3+W
-	DmF0D+yk13N0d+MhV8nA8XyKOGZMFkYhUxCjznsTeWv6an0R79dQXtM7aWKGM93ZiUX9
-	72BBP11CWQ6jS5PWl9w5ovQMpNO1k57XlKO5Sdk58DVI/6wTd1EjxpTfn0/XUjz38YWP
-	hq1LzrAw9nDi69DFlTCMdB9upDeL5WA59Ta6k3OQRm0xgPlESgbdSBNIRg7kMdHtEry3
-	1cyuCxb6I20dkVXLmsOeypVtLSyH8ejstnSlh82nA2hQX6iBn3oZ9anUCwq7LcqLuBVG
-	LTmtWFESYJj0Yea/XsYJMBy+Nt4qTlBSh4O1eUOp1Lxhgz+/worVUCwgSOgDlyG9cdcz
-	koZlcZdM4paE4OLFdtJAsRa7pL7iJulCsWZBJVv6r+tR6Rz1s65y6YxrkvQO+b1dPFs6
-	UkHzcenNAo0j8TeXJqAyQnrDdZ/0fHG+tL94phTPI1tc6q4gcUDaXXyf9ORGw/KnAkPs
-	cmnYFZeeYOKAtJPyb9tgTDyWCFyfENGNRqGV+wyxYp/GPXNAanflSk0UiMowaYmrTVrs
-	KpHmV2iYE5dqWNgBaW7eEamalY5LSqLQtET2m10G4smJsm7XIWl8osI45q1kSA7XXMlO
-	+d1PbJPcrjukigINn37BP77A5c/bNk3D00YNJggoEysSojnvJXyKbsL5uBBy8Pf7/PmE
-	GbfGpQ0kuvb5xxfnaPwJZaS0L8+ft5H6NOo51BdoOF9xm7ebW8wLzFPMheZ8c67Zab7J
-	nG0eZRlpSbPcYEm1pFgsFpNFsHAWsIzS9M+UQrYjR5nSmDAJ7C0Y4zTaP2hsMtqSHFo4
-	uBU0E2y6saPcVj6yLL2kynuFV8gwhryFPz30s04+NrSr2+iwpu6xB9XJbKDbg8nZ/28Q
-	qaT46vrV++pXn2w0zvuyLxKiY7+6pYOuZZ1NDkf3ydVsgp08Q03NrUyGI+pqOeJVT8pe
-	R3e9EXfZdCObrpe93dDomx/oblQi3ni9Us/O88F9dT4//V2hIhdrbU7W8vuuUMvHkvlZ
-	rToj7rJatWy6jtWqZbVqWa06pc6oVVjoW9ZQCf8D6TF5zAplbmRzdHJlYW0KZW5kb2Jq
-	CjU1IDAgb2JqCjI3ODMKZW5kb2JqCjU2IDAgb2JqCjw8IC9UeXBlIC9Gb250RGVzY3Jp
-	cHRvciAvQXNjZW50IDc3MCAvQ2FwSGVpZ2h0IDczMSAvRGVzY2VudCAtMjMwIC9GbGFn
-	cyAzMgovRm9udEJCb3ggWy0xMDE4IC00ODEgMTQzNiAxMTU5XSAvRm9udE5hbWUgL0RP
-	TUdQWStIZWx2ZXRpY2EtQm9sZCAvSXRhbGljQW5nbGUKMCAvU3RlbVYgMTQ5IC9NYXhX
-	aWR0aCAxNTAwIC9TdGVtSCAxMjQgL1hIZWlnaHQgNTQwIC9Gb250RmlsZTIgNTQgMCBS
-	ID4+CmVuZG9iago1NyAwIG9iagpbIDI3OCBdCmVuZG9iagoxNiAwIG9iago8PCAvVHlw
-	ZSAvRm9udCAvU3VidHlwZSAvVHJ1ZVR5cGUgL0Jhc2VGb250IC9ET01HUFkrSGVsdmV0
-	aWNhLUJvbGQgL0ZvbnREZXNjcmlwdG9yCjU2IDAgUiAvV2lkdGhzIDU3IDAgUiAvRmly
-	c3RDaGFyIDQ2IC9MYXN0Q2hhciA0NiAvRW5jb2RpbmcgL01hY1JvbWFuRW5jb2RpbmcK
-	Pj4KZW5kb2JqCjEgMCBvYmoKPDwgL1RpdGxlIChVbnRpdGxlZCkgL0F1dGhvciAoUmFu
-	ZGFsbCBIYXVjaCkgL0NyZWF0b3IgKE9tbmlHcmFmZmxlKSAvUHJvZHVjZXIKKE1hYyBP
-	UyBYIDEwLjUuNSBRdWFydHogUERGQ29udGV4dCkgL0NyZWF0aW9uRGF0ZSAoRDoyMDA4
-	MTExMjE4NDcwMlowMCcwMCcpCi9Nb2REYXRlIChEOjIwMDgxMTEyMTg0NzAyWjAwJzAw
-	JykgPj4KZW5kb2JqCnhyZWYKMCA1OAowMDAwMDAwMDAwIDY1NTM1IGYgCjAwMDAwMjg0
-	NjggMDAwMDAgbiAKMDAwMDAwMjA4MCAwMDAwMCBuIAowMDAwMDEzODUyIDAwMDAwIG4g
-	CjAwMDAwMDAwMjIgMDAwMDAgbiAKMDAwMDAwMjA2MCAwMDAwMCBuIAowMDAwMDAyMTg0
-	IDAwMDAwIG4gCjAwMDAwMTAwMzIgMDAwMDAgbiAKMDAwMDAwMzE3MyAwMDAwMCBuIAow
-	MDAwMDAzNjM3IDAwMDAwIG4gCjAwMDAwMDM2NTYgMDAwMDAgbiAKMDAwMDAwNDA3OCAw
-	MDAwMCBuIAowMDAwMDExNTE4IDAwMDAwIG4gCjAwMDAwMjA1MDMgMDAwMDAgbiAKMDAw
-	MDAwMjQ1OCAwMDAwMCBuIAowMDAwMDI0OTQ0IDAwMDAwIG4gCjAwMDAwMjgyODkgMDAw
-	MDAgbiAKMDAwMDAwMjg4NyAwMDAwMCBuIAowMDAwMDAyNzQ0IDAwMDAwIG4gCjAwMDAw
-	MDI2MDEgMDAwMDAgbiAKMDAwMDAwMzAzMCAwMDAwMCBuIAowMDAwMDEyMTc3IDAwMDAw
-	IG4gCjAwMDAwMTI1MTIgMDAwMDAgbiAKMDAwMDAxMzUxNyAwMDAwMCBuIAowMDAwMDEy
-	ODQ3IDAwMDAwIG4gCjAwMDAwMTMxODIgMDAwMDAgbiAKMDAwMDAxMDY1MyAwMDAwMCBu
-	IAowMDAwMDA0MDk4IDAwMDAwIG4gCjAwMDAwMDYxOTkgMDAwMDAgbiAKMDAwMDAxMjE0
-	MCAwMDAwMCBuIAowMDAwMDA2MjIwIDAwMDAwIG4gCjAwMDAwMDkwOTYgMDAwMDAgbiAK
-	MDAwMDAwOTExNyAwMDAwMCBuIAowMDAwMDEwMDEyIDAwMDAwIG4gCjAwMDAwMTAwNjgg
-	MDAwMDAgbiAKMDAwMDAxMDYzMyAwMDAwMCBuIAowMDAwMDEwNjkwIDAwMDAwIG4gCjAw
-	MDAwMTE0OTggMDAwMDAgbiAKMDAwMDAxMTU1NSAwMDAwMCBuIAowMDAwMDEyMTIwIDAw
-	MDAwIG4gCjAwMDAwMTI0OTIgMDAwMDAgbiAKMDAwMDAxMjgyNyAwMDAwMCBuIAowMDAw
-	MDEzMTYyIDAwMDAwIG4gCjAwMDAwMTM0OTcgMDAwMDAgbiAKMDAwMDAxMzgzMiAwMDAw
-	MCBuIAowMDAwMDEzOTM1IDAwMDAwIG4gCjAwMDAwMTM5OTkgMDAwMDAgbiAKMDAwMDAy
-	MDAxNCAwMDAwMCBuIAowMDAwMDIwMDM1IDAwMDAwIG4gCjAwMDAwMjAyNzEgMDAwMDAg
-	biAKMDAwMDAyMDY3OCAwMDAwMCBuIAowMDAwMDI0NDgwIDAwMDAwIG4gCjAwMDAwMjQ1
-	MDEgMDAwMDAgbiAKMDAwMDAyNDczNiAwMDAwMCBuIAowMDAwMDI1MTI3IDAwMDAwIG4g
-	CjAwMDAwMjgwMDAgMDAwMDAgbiAKMDAwMDAyODAyMSAwMDAwMCBuIAowMDAwMDI4MjY1
-	IDAwMDAwIG4gCnRyYWlsZXIKPDwgL1NpemUgNTggL1Jvb3QgNDUgMCBSIC9JbmZvIDEg
-	MCBSIC9JRCBbIDw1MmVlNmM2ZDI2ZThhMWE1N2U2NDUwZmZiMzY1NGI1YT4KPDUyZWU2
-	YzZkMjZlOGExYTU3ZTY0NTBmZmIzNjU0YjVhPiBdID4+CnN0YXJ0eHJlZgoyODY3NQol
-	JUVPRgoxIDAgb2JqCjw8L0F1dGhvciAoUmFuZGFsbCBIYXVjaCkvQ3JlYXRpb25EYXRl
-	IChEOjIwMDgwOTE5MTUzNTAwWikvQ3JlYXRvciAoT21uaUdyYWZmbGUgNS4wLjIpL01v
-	ZERhdGUgKEQ6MjAwODExMTIxODQ2MDBaKS9Qcm9kdWNlciAoTWFjIE9TIFggMTAuNS41
-	IFF1YXJ0eiBQREZDb250ZXh0KS9UaXRsZSAoZG5hLWNvbm5lY3Rvci1mZWRlcmF0aW9u
-	KT4+CmVuZG9iagp4cmVmCjEgMQowMDAwMDI5OTkzIDAwMDAwIG4gCnRyYWlsZXIKPDwv
-	SUQgWzw1MmVlNmM2ZDI2ZThhMWE1N2U2NDUwZmZiMzY1NGI1YT4gPDUyZWU2YzZkMjZl
-	OGExYTU3ZTY0NTBmZmIzNjU0YjVhPl0gL0luZm8gMSAwIFIgL1ByZXYgMjg2NzUgL1Jv
-	b3QgNDUgMCBSIC9TaXplIDU4Pj4Kc3RhcnR4cmVmCjMwMjAzCiUlRU9GCg==
+	ZSA+PgpzdHJlYW0KeAGtmHc81V8fwM/dLte+uPbI3jsrm2wyi8i6Rq7RJSsV/SgSZSRK
+	IiOVZBT5oewGFy0jSklDQlSiyHMu1e95vZ7X83r+ec7rde95n8844/s53zO+ALC99ImI
+	oCABAKFhUVTH7cYiO3e5i+BGAQYQABEwAYyPX2SEkYODDTT5L2lpCCDoqscK9LpOe10w
+	noxYj5349GW14PrE5//i9FvMQoUNAoCQhwJi4CYb0tl3k53pHBMVEQVtgujsF+TjDzkB
+	sjzV2dEEciVklsBNvkVn302+R+dov0C67wgAWI4w/+AwAHAfIev7kyP9oJrerr9/pF8o
+	5FMAIJGhoeGwfrZcKJf2i6BCX7YWyOL05wJzmDwvA7AVjhi79I8sUhWAeg4ARMr+kUn8
+	AICbAYCr6f/IPjtuPCsE90BkgBr0gQlBMAYA82J9/bMk7Fs2AGtZ6+s/Lq6vr5UCgBoH
+	oI3it58avWELrRE0AP5XeXPMvzxQsKv0ABOBOcgCXxDeiBfIEBQDqg4dhJHBrGFf4roZ
+	6vDXGOuZbhNozDOsODZ5djeOdM4OLiS3Nk8S6R6fAH+AQIMQg/BukUYx4hZf8TuSRKlY
+	6UeyUnKn5RcVbZWuqOBVA9TaNVg0KVt7tIk6obrN2zj0dxmUGH4x1jaJMW0w+7Hd3YJm
+	pWB9zhZrR7Hv3SHnmOs07+Lo2rhTYtcR9+ndDp41e5i9yT6tfkL+h8i9gWJBscH9IXKU
+	+NCecL4Iv32V1KUorf3R0R2xIE43fv+BmoTpQ8KHbRNTkqqPDCcjUxSPehxLTa1I6z7+
+	5gQuQyrT+KT/qcNZZ7JLcppzaaff530+M5P/qmD0bO+5tsJb5xuLKi6UFB8vOXAxvDSg
+	zLXcokLnkkwlV+XPy++uDF3trqq9drI65jq5xrpWoY697lv9yI2bNwsbYhtdb2k2cTV9
+	+ru3uaLlSKvHbbU7THcm2xraT3T4d+p3cXdNdzf3nLxLvqd9H39/5MHl3oQ+R5okbam/
+	ayBr0OOh8MPnj0ofBz6RefLhae1QxLDS8MJI3WjUM41nX8cax/c/V30+9+L6ROhL2Zcf
+	XlVOkl+Lvn4+dfbNrrc8bx+9y3nvMM08/fDDyRnbj0wf+2Yz53bMc80/+VSw4LkovDj1
+	ueoL9avOEnaJ9i1v2WtFcmXp++0faatuaxJrcz871oPX12H82YEOiAMPEPKIs0gSshSl
+	i3qJPomxwrJip+EMqMRnMSYxxRMSmFNZ8lkr2drZJzgxRBUuH+5Mnk7SEp8Mf4TANcFZ
+	YQWRMNFKsTlxXYlYyQ5phIyJbJbcsAJJ0V2pUPmZKkHNVj1d447mqpaedoBOtu5dvUV9
+	HgMtwz1GJcbzpkpmCebdFgRLO6tM62Fbop27fanDoqO6U5Jznyunm9vOM7tGPMR2UzzL
+	vN56y/iE+Db6LZHVAhICbwTN7lUMIVPOhY6Fc0SY7YujXouc3E+MNoiJij0X1xk/m0A6
+	aH4o6nBO4o2kkSNryaIpBkcDjiWnlqTVHh9In85gyOQ7yX+KN4uUTcxhz+U8zZ1HPMOW
+	z1AACn6eXT23VLh4fq7o3YXnxYMlHRdbSxvLqsvzKo5fOlYZeznwittV6yqda9LVpOvY
+	64s1b2of1bXWX7mRdzO5YV+j+y2zJqW/eZoRzXMt462023V3CtqS2yM6dneadEl3s3Wv
+	9ny4++ze7fvlDzJ6o/tcaWr9XP0rA88Gbz0sepTwePeTbU9FhtBDL4e7RspHk595j+mP
+	C44vPx950TiR8zL8leWk2OT312NTNW9S3/q803rP/P7DdOuHUzN+HzVnmWZfztXPp3xy
+	WZBc+LLY9TnvC/mr+hJu6fG3kmXKitZ33PfBH+dWA9fU1lZ+3l+nbMQfD4SBIQgBxeAF
+	QhIRg3iIVEeWoLhR2WhudAlGHUPDhuBYcc0MoXhx/GvGEiYyQYWwxtzHcoE1mm0HuyIH
+	muMdZx+xhiuPO4FnD8mMV5GPxI/knxN4KHhLqEQ4TSRc1FnMeIuUOF78lcQdyfNwhXCS
+	kZbFyo7IVconKgQreivZKBuqaKhKqLGrrasvaLzQ7N/aoXVL+5pOiW6BXua2JP19Br6G
+	XkZuxiYmeqbqZvLmStslLAQtBa24rFltWG0Z7TD2eAfcDrQjygntjHPBu+LdmHey7GJx
+	Z/fg2S3qKeelsEfZW9PHwNfaz9bfm0wOCA8MDooLTtibFVJAKQwtCqsIL4u4tK+K2hh5
+	K6ppf310bUxt7M242vgauJ5cPVh26OzhjMT0pGNHkv7am+yd4nV0xzHDVJU0yeNc6Zj0
+	pRNvMh5l9py8cao460R2fE5wrutpozyFM6R8ZP5swRhcWVoKy89nFMVdCC52KzG8KF3K
+	WYYoWyx/XUG71FBZejn3SsrVmKrAazuq9a7L1vDUYmuX6l7V997ovlnTcL6x4FZaU8zf
+	Ic2BLZ6tzred7ji2ObY7d7h1enQFdEf2xN1Nu1d0/+aD/t4fNN5+3QHK4MWHY4+5nrg+
+	rRj6OeI2emNMZrz4hdBE3Suf18Qp2tvy91c+tMyC+ZBFxq+o5fzVVXr8N/c++p6A1QQg
+	LxKAXW0AOMcDkA73UKkBALi8AXBghjJtgNwxA5AC0gAB9b/3DyngBBJBNZw9zAg9RBii
+	BPEYiUXqIvchK5Av4DyyR6WiOlBraC10DLoevYhRwYRjajGfsZrYeOwdHBpniTuFG2eQ
+	YAhnaMXj8C74cvw3RhPGXMb3TNuYspmmCYaEAsIisz1zLQszSwgLjVWNNZd1lc2P7T77
+	VvYKDg6OQxyLnEGcE8SdRBqXLlcZNwf3Ue4vPP48QyQrUjuvDm89nzRfOf8W/iIBfoE8
+	QTbBXCGiUI4wl/BZERGRy6Lqou1i1mJPt3hv+SqeJsEnUS1pKjksFSKNk66QMZJ5Lpsk
+	JyV3Tz5UgVfhriJFiU+JppyooqnyUbVMzVOdX/2lRqGm/1bFrctandqZOu66UnoIvbFt
+	DfpZBhRDGyNVY1bjZZNJ03GzHvPW7ZUWRZZVVnetR22+2/HYazhY7KA6nnLqcV5wFXQz
+	23lw1zX3KThb/b2q98z5qPjG+o2QpQKogYPBanszQj6H+oV1RejuuxYpHHU+WjDmQpxo
+	fFWC9sG+w+TEtSM5yVIpvcei0wSPt5+IzFQ8+SYrP2f7aVzeQH7B2X2FwUXWxVoXlcv4
+	KoQqea/wV/FWi9XI1m274dGw99aJv8tbem7PtQt0mneH3710v7+P0K8yGPboypPJYZ7R
+	7WMnnrdO/JzUnqK8vfJ+eIY4azOfvdD2Bb1ksEz93rr6bmP9UAI+IBfcA2sINUQgoggx
+	hGRDWiFTkG3IHyhtVCyqEfUNvRUdi25Cr2GMMUcx/Vge7G5sOfYTTheXinvKIMUQy3AP
+	T8KH4zsYSYxUxj6mLUwHmcYIOoSzhFVmL+ZuFhWWMyzrrKGs42wWbA3sCuyXOAQ4cjk5
+	OXOJJGIhFw/XCW4091/cqzyxPEukaNIK72E+wJfCz8afJyAkUCooK9gkZCxEE/YQnhE5
+	KMohellMX2xwC1kcI14soScxKhkrxS5VK+0mvSpzTtZMdlHunLyp/FeFSkVnJYxSi3KU
+	ioLKO9USGG0h9SmNi/Ako6mF0KJp5+v46Srr4fUmt/2tn2MQYmhpJG+MMZ4xGTTtNqsy
+	L9yeYkG1jLJKts6yKbFtsuuzH3OYd2R0knW2d6G6Zrrd3DnujvRQ3O3tecbrsTfGR9uX
+	6tdBRgZoByYHPdorHBJEaQ/jDA+KuE8ViDwQNRFtElMZxxwfc2D6oMuhvkTjpIa/pJPP
+	HOU/dj5N4Hj+Cb6Mqye3nmrLNsvpOb0nbyk//azouafnD14QKx64eKRMuvzNpTOXHa78
+	rOqsjq/Rrl2vp93MagxsUm1GtAzfrmvL7TjQ5dBjdE/+AU8fkfZjYPXh+hPUEG6E8Ix7
+	XO6FwUuvyfipnLct74dmMLMq86ELBZ+fLZGWd3wvWx3ZiP8uUIPAIDwQtUgGpA+yCcWJ
+	oqAeoCXRKei3GAvMVXiOiMe+wlnhGhnEGc7gmfCJ8P2OYJxhCmOaJ0QSvjMfY2GFe4k6
+	62O2UHZW9joOL04MZzMxkkuIq4U7gIfAc4Pkw8vJ28MXw6/C/06gUNBZiE3ogXCqiKUo
+	q+iIWMEWT3El8WWJLslsqZ3S8tLrMn2y5XIJ8nYKcooYxWdKTcr5KjGqrmoa6iT1dY1X
+	mr1bb2oVaR+FZ1EXPYttOvpyBnyGeCO00Zzxe5MJ03dmY+YT2x9aDFoOW722fmOzYoe1
+	53YQ2KHqaOoU4JzsctG1yW1iF8Jd3MN2d4JnjdcHb5KPlW+S3wCZEGAcmB40undLCIXS
+	uRG7u1TeyOio0ehtMcVx6HjKgXF4FmlOVEoq+Yst+WDK6rGE1OXjEemzGXEnkaeOZuNy
+	kk9z5pXnqxY0nzMr7C/yvvCz5HSpYtmDCq9L65cvX9WoGq8+UsNS21i/58ZaQyY8cQ40
+	+7Z8v53RJt5+s9Oma6Bn992v92MeLPfF0VYGPAeHH7k87ni6ZSh5eGrU5NnFsS/PdV4c
+	nuh8hZvc/jpqquRN/9uV9zzTCh80ZvQ+msxaztnOm3xSW2BfmFvs/Vz6JeSr2teFpZpv
+	5GXO5fYVz5Xl79k/uH/kr/KtZq2urPms3f+p8rN3nUyP/+Z9ib5/AEaTcEo4VcTGxHSj
+	+P/7C6Xsh3eyjcQG/wlhvnb2MIf3KjAYGe1kBnO6fDIg2NzyFy/6+5haQxaAVyNkfJCJ
+	HWQCZKEAqrkjZG7Isnt9rBwgs0A2JIe5OEGGdSLsIqKM6TYkyN7kSLPf8tj4IGe3X/bH
+	qfsdXSCLQ5v8kHBruj29/hZ/sumv/iDuhVHsbKCc3tZIcJSlM2Qi5Dl44/IBVBAIyEAB
+	2AATYAolUxuS32XXjXLwH/2mlQII2PCMhp6R8Mz2FvqE7gk+QgUiv+rZtBMBfiAc7AcU
+	aLcfUJWvKk8rr/6xMYE6Cvz9p9c/mmDgDy3+vbYND3pboXUB0fnhcTquQfAtV0VroI3R
+	29D6aG0gAk+MfEABrQ73eiO0AVoX6rT7PzZ+/NPy5rh9/4zK+ncPYT/D/kj/o1UQDL9D
+	bNy/4RMEWBjrQigBoMNANZGe/3uKIsfCuzkAJuERcdTgwKAoESP49YEsL2IZ5qcoL6Kq
+	rKwN/gU6z1XLCmVuZHN0cmVhbQplbmRvYmoKMzIgMCBvYmoKMzg3MwplbmRvYmoKMjMg
+	MCBvYmoKWyAvSUNDQmFzZWQgMzEgMCBSIF0KZW5kb2JqCjMzIDAgb2JqCjw8IC9MZW5n
+	dGggMzQgMCBSIC9OIDMgL0FsdGVybmF0ZSAvRGV2aWNlUkdCIC9GaWx0ZXIgL0ZsYXRl
+	RGVjb2RlID4+CnN0cmVhbQp4AYWUTUgUYRjH/7ONBLEG0ZcIxdDBJFQmC1IC0/UrU7Zl
+	1UwJYp19d50cZ6eZ3S1FIoTomHWMLlZEh4hO4aFDpzpEBJl1iaCjRRAFXiK2/zuTu2NU
+	vjAzv3me//t8vcMAVY9SjmNFNGDKzrvJ3ph2enRM2/waVahGFFwpw3M6EokBn6mVz/Vr
+	9S0UaVlqlLHW+zZ8q3aZEFA0KndkAz4seTzg45Iv5J08NWckGxOpNNkhN7hDyU7yLfLW
+	bIjHQ5wWngFUtVOTMxyXcSI7yC1FIytjPiDrdtq0ye+lPe0ZU9Sw38g3OQvauPL9QNse
+	YNOLim3MAx7cA3bXVWz1NcDOEWDxUMX2PenPR9n1ysscavbDKdEYa/pQKn2vAzbfAH5e
+	L5V+3C6Vft5hDtbx1DIKbtHXsjDlJRDUG+xm/OQa/YuDnnxVC7DAOY5sAfqvADc/Avsf
+	AtsfA4lqYKgVkctsN7jy4iLnAnTmnGnXzE7ktWZdP6J18GiF1mcbTQ1ayrI03+VprvCE
+	WxTpJkxZBc7ZX9t4jwp7eJBP9he5JLzu36zMpVNdnCWa2NantOjqJjeQ72fMnj5yPa/3
+	GbdnOGDlgJnvGwo4csq24jwXqYnU2OPxk2TGV1QnH5PzkDznFQdlTN9+LnUiQa6lPTmZ
+	65eaXdzbPjMxxDOSrFgzE53x3/zGLSRl3n3U3HUs/5tnbZFnGIUFARM27zY0JNGLGBrh
+	wEUOGXpMKkxapV/QasLD5F+VFhLlXRYVvVjhnhV/z3kUuFvGP4VYHHMN5Qia/k7/oi/r
+	C/pd/fN8baG+4plzz5rGq2tfGVdmltXIuEGNMr6sKYhvsNoOei1kaZ3iFfTklfWN4eoy
+	9nxt2aPJHOJqfDXUpQhlasQ448muZfdFssU34edby/av6VH7fPZJTSXXsrp4Zin6fDZc
+	DWv/s6tg0rKr8OSNkC48a6HuVQ+qfWqL2gpNPaa2q21qF9+OqgPlHcOclYkLrNtl9Sn2
+	YGOa3spJV2aL4N/CL4b/pV5hC9c0NPkPTbi5jGkJ3xHcNnCHlP/DX7MDDd4KZW5kc3Ry
+	ZWFtCmVuZG9iagozNCAwIG9iago3OTIKZW5kb2JqCjcgMCBvYmoKWyAvSUNDQmFzZWQg
+	MzMgMCBSIF0KZW5kb2JqCjM1IDAgb2JqCjw8IC9MZW5ndGggMzYgMCBSIC9OIDMgL0Fs
+	dGVybmF0ZSAvRGV2aWNlUkdCIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlID4+CnN0cmVhbQp4
+	Aa2YdzzVXx/Az90u17649sjeOyubbDKLyLpGrtElKxX9KBJlJEoiI5VkFPmh7AYXLSNK
+	SUNCVKLIcy7V73m9ntfzev55zut173mfzzjj+znfM74AsL30iYigIAEAoWFRVMftxiI7
+	d7mL4EYBBhAAETABjI9fZISRg4MNNPkvaWkIIOiqxwr0uk57XTCejFiPnfj0ZbXg+sTn
+	/+L0W8xChQ0CgJCHAmLgJhvS2XeTnekcExURBW2C6OwX5OMPOQGyPNXZ0QRyJWSWwE2+
+	RWffTb5H52i/QLrvCABYjjD/4DAAcB8h6/uTI/2gmt6uv3+kXyjkUwAgkaGh4bB+tlwo
+	l/aLoEJfthbI4vTnAnOYPC8DsBWOGLv0jyxSFYB6DgBEyv6RSfwAgJsBgKvp/8g+O248
+	KwT3QGSAGvSBCUEwBgDzYn39syTsWzYAa1nr6z8urq+vlQKAGgegjeK3nxq9YQutETQA
+	/ld5c8y/PFCwq/QAE4E5yAJfEN6IF8gQFAOqDh2EkcGsYV/iuhnq8NcY65luE2jMM6w4
+	Nnl2N450zg4uJLc2TxLpHp8Af4BAgxCD8G6RRjHiFl/xO5JEqVjpR7JScqflFxVtla6o
+	4FUD1No1WDQpW3u0iTqhus3bOPR3GZQYfjHWNokxbTD7sd3dgmalYH3OFmtHse/dIeeY
+	6zTv4ujauFNi1xH36d0OnjV7mL3JPq1+Qv6HyL2BYkGxwf0hcpT40J5wvgi/fZXUpSit
+	/dHRHbEgTjd+/4GahOlDwodtE1OSqo8MJyNTFI96HEtNrUjrPv7mBC5DKtP4pP+pw1ln
+	sktymnNpp9/nfT4zk/+qYPRs77m2wlvnG4sqLpQUHy85cDG8NKDMtdyiQueSTCVX5c/L
+	764MXe2uqr12sjrmOrnGulahjr3uW/3IjZs3CxtiG11vaTZxNX36u7e5ouVIq8dttTtM
+	dybbGtpPdPh36ndxd013N/ecvEu+p30ff3/kweXehD5HmiRtqb9rIGvQ46Hww+ePSh8H
+	PpF58uFp7VDEsNLwwkjdaNQzjWdfxxrH9z9XfT734vpE6EvZlx9eVU6SX4u+fj519s2u
+	tzxvH73Lee8wzTz98MPJGduPTB/7ZjPndsxzzT/5VLDguSi8OPW56gv1q84Sdon2LW/Z
+	a0VyZen77R9pq25rEmtzPzvWg9fXYfzZgQ6IAw8Q8oizSBKyFKWLeok+ibHCsmKn4Qyo
+	xGcxJjHFExKYU1nyWSvZ2tknODFEFS4f7kyeTtISnwx/hMA1wVlhBZEw0UqxOXFdiVjJ
+	DmmEjIlsltywAknRXalQ+ZkqQc1WPV3jjuaqlp52gE627l29RX0eAy3DPUYlxvOmSmYJ
+	5t0WBEs7q0zrYVuinbt9qcOio7pTknOfK6eb284zu0Y8xHZTPMu83nrL+IT4NvotkdUC
+	EgJvBM3uVQwhU86FjoVzRJjti6Nei5zcT4w2iImKPRfXGT+bQDpofijqcE7ijaSRI2vJ
+	oikGRwOOJaeWpNUeH0ifzmDI5DvJf4o3i5RNzGHP5TzNnUc8w5bPUAAKfp5dPbdUuHh+
+	rujdhefFgyUdF1tLG8uqy/Mqjl86Vhl7OfCK21XrKp1r0tWk69jrizVvah/VtdZfuZF3
+	M7lhX6P7LbMmpb95mhHNcy3jrbTbdXcK2pLbIzp2d5p0SXezda/2fLj77N7t++UPMnqj
+	+1xpav1c/SsDzwZvPSx6lPB495NtT0WG0EMvh7tGykeTn3mP6Y8Lji8/H3nROJHzMvyV
+	5aTY5PfXY1M1b1Lf+rzTes/8/sN064dTM34fNWeZZl/O1c+nfHJZkFz4stj1Oe8L+av6
+	Em7p8beSZcqK1nfc98Ef51YD19TWVn7eX6dsxB8PhIEhCAHF4AVCEhGDeIhUR5aguFHZ
+	aG50CUYdQ8OG4FhxzQyheHH8a8YSJjJBhbDG3MdygTWabQe7Igea4x1nH7GGK487gWcP
+	yYxXkY/Ej+SfE3goeEuoRDhNJFzUWcx4i5Q4XvyVxB3J83CFcJKRlsXKjshVyicqBCt6
+	K9koG6poqEqosautqy9ovNDs39qhdUv7mk6JboFe5rYk/X0GvoZeRm7GJiZ6pupm8uZK
+	2yUsBC0FrbisWW1YbRntMPZ4B9wOtCPKCe2Mc8G74t2Yd7LsYnFn9+DZLeop56WwR9lb
+	08fA19rP1t+bTA4IDwwOigtO2JsVUkApDC0Kqwgvi7i0r4raGHkrqml/fXRtTG3szbja
+	+Bq4nlw9WHbo7OGMxPSkY0eS/tqb7J3idXTHMcNUlTTJ41zpmPSlE28yHmX2nLxxqjjr
+	RHZ8TnCu62mjPIUzpHxk/mzBGFxZWgrLz2cUxV0ILnYrMbwoXcpZhihbLH9dQbvUUFl6
+	OfdKytWYqsBrO6r1rsvW8NRia5fqXtX33ui+WdNwvrHgVlpTzN8hzYEtnq3Ot53uOLY5
+	tjt3uHV6dAV0R/bE3U27V3T/5oP+3h803n7dAcrgxYdjj7meuD6tGPo54jZ6Y0xmvPiF
+	0ETdK5/XxCna2/L3Vz60zIL5kEXGr6jl/NVVevw39z76noDVBCAvEoBdbQA4xwOQDvdQ
+	qQEAuLwBcGCGMm2A3DEDkALSAAH1v/cPKeAEEkE1nD3MCD1EGKIE8RiJReoi9yErkC/g
+	PLJHpaI6UGtoLXQMuh69iFHBhGNqMZ+xmth47B0cGmeJO4UbZ5BgCGdoxePwLvhy/DdG
+	E8ZcxvdM25iymaYJhoQCwiKzPXMtCzNLCAuNVY01l3WVzY/tPvtW9goODo5DHIucQZwT
+	xJ1EGpcuVxk3B/dR7i88/jxDJCtSO68Obz2fNF85/xb+IgF+gTxBNsFcIaJQjjCX8FkR
+	EZHLouqi7WLWYk+3eG/5Kp4mwSdRLWkqOSwVIo2TrpAxknkumyQnJXdPPlSBV+GuIkWJ
+	T4mmnKiiqfJRtUzNU51f/aVGoab/VsWty1qd2pk67rpSegi9sW0N+lkGFEMbI1VjVuNl
+	k0nTcbMe89btlRZFllVWd61Hbb7b8dhrOFjsoDqecupxXnAVdDPbeXDXNfcpOFv9var3
+	zPmo+Mb6jZClAqiBg8FqezNCPof6hXVF6O67FikcdT5aMOZCnGh8VYL2wb7D5MS1IznJ
+	Uim9x6LTBI+3n4jMVDz5Jis/Z/tpXN5AfsHZfYXBRdbFWheVy/gqhCp5r/BX8VaL1cjW
+	bbvh0bD31om/y1t6bs+1C3Sad4ffvXS/v4/QrzIY9ujKk8lhntHtYyeet078nNSeory9
+	8n54hjhrM5+90PYFvWSwTP3euvpuY/1QAj4gF9wDawg1RCCiCDGEZENaIVOQbcgfKG1U
+	LKoR9Q29FR2LbkKvYYwxRzH9WB7sbmw59hNOF5eKe8ogxRDLcA9PwofjOxhJjFTGPqYt
+	TAeZxgg6hLOEVWYv5m4WFZYzLOusoazjbBZsDewK7Jc4BDhyOTk5c4kkYiEXD9cJbjT3
+	X9yrPLE8S6Ro0grvYT7Al8LPxp8nICRQKigr2CRkLEQT9hCeETkoyiF6WUxfbHALWRwj
+	XiyhJzEqGSvFLlUr7Sa9KnNO1kx2Ue6cvKn8V4VKRWcljFKLcpSKgso71RIYbSH1KY2L
+	8CSjqYXQomnn6/jpKuvh9Sa3/a2fYxBiaGkkb4wxnjEZNO02qzIv3J5iQbWMskq2zrIp
+	sW2y67Mfc5h3ZHSSdbZ3obpmut3cOe6O9FDc7e15xuuxN8ZH25fq10FGBmgHJgc92isc
+	EkRpD+MMD4q4TxWIPBA1EW0SUxnHHB9zYPqgy6G+ROOkhr+kk88c5T92Pk3geP4Jvoyr
+	J7eeass2y+k5vSdvKT/9rOi5p+cPXhArHrh4pEy6/M2lM5cdrvys6qyOr9GuXa+n3cxq
+	DGxSbUa0DN+ua8vtONDl0GN0T/4BTx+R9mNg9eH6E9QQboTwjHtc7oXBS6/J+Kmcty3v
+	h2YwsyrzoQsFn58tkZZ3fC9bHdmI/y5Qg8AgPBC1SAakD7IJxYmioB6gJdEp6LcYC8xV
+	eI6Ix77CWeEaGcQZzuCZ8Inw/Y5gnGEKY5onRBK+Mx9jYYV7iTrrY7ZQdlb2Og4vTgxn
+	MzGSS4irhTuAh8Bzg+TDy8nbwxfDr8L/TqBQ0FmITeiBcKqIpSir6IhYwRZPcSXxZYku
+	yWypndLy0usyfbLlcgnydgpyihjFZ0pNyvkqMaquahrqJPV1jVeavVtvahVpH4VnURc9
+	i206+nIGfIZ4I7TRnPF7kwnTd2Zj5hPbH1oMWg5bvbZ+Y7Nih7XndhDYoepo6hTgnOxy
+	0bXJbWIXwl3cw3Z3gmeN1wdvko+Vb5LfAJkQYByYHjS6d0sIhdK5Ebu7VN7I6KjR6G0x
+	xXHoeMqBcXgWaU5USir5iy35YMrqsYTU5eMR6bMZcSeRp45m43KST3PmleerFjSfMyvs
+	L/K+8LPkdKli2YMKr0vrly9f1agarz5Sw1LbWL/nxlpDJjxxDjT7tny/ndEm3n6z06Zr
+	oGf33a/3Yx4s98XRVgY8B4cfuTzueLplKHl4atTk2cWxL891Xhye6HyFm9z+Omqq5E3/
+	25X3PNMKHzRm9D6azFrO2c6bfFJbYF+YW+z9XPol5Kva14Wlmm/kZc7l9hXPleXv2T+4
+	f+Sv8q1mra6s+azd/6nys3edTI//5n2Jvn8ARpNwSjhVxMbEdKP4//sLpeyHd7KNxAb/
+	CWG+dvYwh/cqMBgZ7WQGc7p8MiDY3PIXL/r7mFpDFoBXI2R8kIkdZAJkoQCquSNkbsiy
+	e32sHCCzQDYkh7k4QYZ1IuwioozpNiTI3uRIs9/y2PggZ7df9sep+x1dIItDm/yQcGu6
+	Pb3+Fn+y6a/+IO6FUexsoJze1khwlKUzZCLkOXjj8gFUEAjIQAHYABNgCiVTG5LfZdeN
+	cvAf/aaVAgjY8IyGnpHwzPYW+oTuCT5CBSK/6tm0EwF+IBzsBxRotx9Qla8qTyuv/rEx
+	gToK/P2n1z+aYOAPLf69tg0PeluhdQHR+eFxOq5B8C1XRWugjdHb0PpobSACT4x8QAGt
+	Dvd6I7QBWhfqtPs/Nn780/LmuH3/jMr6dw9hP8P+SP+jVRAMv0Ns3L/hEwRYGOtCKAGg
+	w0A1kZ7/e4oix8K7OQAm4RFx1ODAoCgRI/j1gSwvYhnmpygvoqqsrA3+BTrPVcsKZW5k
+	c3RyZWFtCmVuZG9iagozNiAwIG9iagozODczCmVuZG9iagoyNiAwIG9iagpbIC9JQ0NC
+	YXNlZCAzNSAwIFIgXQplbmRvYmoKMTkgMCBvYmoKPDwgL0xlbmd0aCAzNyAwIFIgL0Z1
+	bmN0aW9uVHlwZSAwIC9CaXRzUGVyU2FtcGxlIDggL1NpemUgWyAxMzY1IF0gL0RvbWFp
+	bgpbIDAgMSBdIC9SYW5nZSBbIDAgMSAwIDEgMCAxIF0gL0ZpbHRlciAvRmxhdGVEZWNv
+	ZGUgPj4Kc3RyZWFtCngBncEHVgEAAADQ+9/ESrZkVBQaskdpGJlRjuA5gv//4XDyr/7U
+	Xu3Ur9qqjVqrlVqShfpRczVTUzVR3+pLfaoPNVbv6k2N1FANVF/1VFd1SFu1VFO9qoZ6
+	Uc/qST2quqqpqnpQ96qiyupO3aobVVJFUlB5da1y6kplVUalVUolVULFVUxdqqi6UBEV
+	ViEVVIHzHQFawrliCmVuZHN0cmVhbQplbmRvYmoKMzcgMCBvYmoKMTUyCmVuZG9iagoy
+	MCAwIG9iago8PCAvTGVuZ3RoIDM4IDAgUiAvRnVuY3Rpb25UeXBlIDAgL0JpdHNQZXJT
+	YW1wbGUgOCAvU2l6ZSBbIDEzNjUgXSAvRG9tYWluClsgMCAxIF0gL1JhbmdlIFsgMCAx
+	IDAgMSAwIDEgXSAvRmlsdGVyIC9GbGF0ZURlY29kZSA+PgpzdHJlYW0KeAGdwQdWAQAA
+	AND738RKtmRUFBqyR2kYmVGO4DmC///hcPKv/tRe7dSv2qqNWquVWpKF+lFzNVNTNVHf
+	6kt9qg81Vu/qTY3UUA1UX/VUV3VIW7VUU72qhnpRz+pJPaq6qqmqelD3qqLK6k7dqhtV
+	UkVSUHl1rXLqSmVVRqVVSiVVQsVVTF2qqLpQERVWIRVUgfMdAVrCuWIKZW5kc3RyZWFt
+	CmVuZG9iagozOCAwIG9iagoxNTIKZW5kb2JqCjIxIDAgb2JqCjw8IC9MZW5ndGggMzkg
+	MCBSIC9GdW5jdGlvblR5cGUgMCAvQml0c1BlclNhbXBsZSA4IC9TaXplIFsgMTM2NSBd
+	IC9Eb21haW4KWyAwIDEgXSAvUmFuZ2UgWyAwIDEgMCAxIDAgMSBdIC9GaWx0ZXIgL0Zs
+	YXRlRGVjb2RlID4+CnN0cmVhbQp4AZ3BB1YBAAAA0PvfxEq2ZFQUGrJHaRiZUY7gOYL/
+	/+Fw8q/+1F7t1K/aqo1aq5VakoX6UXM1U1M1Ud/qS32qDzVW7+pNjdRQDVRf9VRXdUhb
+	tVRTvaqGelHP6kk9qrqqqap6UPeqosrqTt2qG1VSRVJQeXWtcupKZVVGpVVKJVVCxVVM
+	XaqoulARFVYhFVSB8x0BWsK5YgplbmRzdHJlYW0KZW5kb2JqCjM5IDAgb2JqCjE1Mgpl
+	bmRvYmoKMjIgMCBvYmoKPDwgL0xlbmd0aCA0MCAwIFIgL0Z1bmN0aW9uVHlwZSAwIC9C
+	aXRzUGVyU2FtcGxlIDggL1NpemUgWyAxMzY1IF0gL0RvbWFpbgpbIDAgMSBdIC9SYW5n
+	ZSBbIDAgMSAwIDEgMCAxIF0gL0ZpbHRlciAvRmxhdGVEZWNvZGUgPj4Kc3RyZWFtCngB
+	ncEHVgEAAADQ+9/ESrZkVBQaskdpGJlRjuA5gv//4XDyr/7UXu3Ur9qqjVqrlVqShfpR
+	czVTUzVR3+pLfaoPNVbv6k2N1FANVF/1VFd1SFu1VFO9qoZ6Uc/qST2quqqpqnpQ96qi
+	yupO3aobVVJFUlB5da1y6kplVUalVUolVULFVUxdqqi6UBEVViEVVIHzHQFawrliCmVu
+	ZHN0cmVhbQplbmRvYmoKNDAgMCBvYmoKMTUyCmVuZG9iagozIDAgb2JqCjw8IC9UeXBl
+	IC9QYWdlcyAvTWVkaWFCb3ggWzAgMCA1NzYgNzMzXSAvQ291bnQgMSAvS2lkcyBbIDIg
+	MCBSIF0gPj4KZW5kb2JqCjQxIDAgb2JqCjw8IC9UeXBlIC9DYXRhbG9nIC9QYWdlcyAz
+	IDAgUiAvVmVyc2lvbiAvMS40ID4+CmVuZG9iago0MiAwIG9iago8PCAvTGVuZ3RoIDQz
+	IDAgUiAvTGVuZ3RoMSA5MDA4IC9GaWx0ZXIgL0ZsYXRlRGVjb2RlID4+CnN0cmVhbQp4
+	Ab1ZC3RU1dXe5z7m3nlkMjOZ9/tmMjN5P0lISEiGkMmDRwSCkCDRJJCQIFHAGI0KRsUK
+	EVFUQgRrRS0EUDOEFAYQSymIWlvRKj5qW61gbZdZtP3RWiUz/753Qipd1p+1fpdz5rz2
+	ee39nX32OfccIACggl6gIbCks3klDJJ0pLyG/tUl3V3uB/5S+gQAGQCgV7StXNap/fCX
+	rwKwDIBCtWxFT5tHc0cIIF6DnmlvbV7694aHJgE49di+oB0JikQuBfOzMJ/U3tl1a9DM
+	voD5lZivWHHjkmb7eqEN8yNieWfzrSv5mxX/wvy7mHff0NzZWntnz52Y/xLziStvvKmL
+	9FDPALjsYvuVq1tXvnDPDTmYb0L+XkcaQSf+VCCDFzF2w6JxikT+fwSU1Jb+Lz0gHt/x
+	Y7FMBhzw43XkE3UVoEReAeJADfETVESTPQYa9igks71gZbLABRB9D/37Yhy5OvoJewo0
+	kc7o3+libHVI9FSkrASOwQOwHYZwtEFMJ8O1MACvkOVwiCyGEThDnJCJc81AGGbBayQa
+	fQPa4Bms3wXHYQvsQ16SoRMMWLqJeKO3YT6A6RZYF30KkqAQfgRHoQh73QSj0d3R/Vg6
+	D66GPbAX2/+KeKh9TEL0+ehZlHQu9rkOS96IzooOgQ7SoRzmIHUdvEi89PvRdjBDMXL3
+	OPwEdsAv4DNyNxmJtke7o6ejHwGFpXaoQ7eGjJCP6CHmR9HHo3+NRhCJZEjFUZvgEXga
+	+x9CdwynPUiuJ13kEbKFClB3UyPMvawpMoY4pEAVumq4EdYjAofgBPwD/kXOU2ZaQ3fR
+	J6P50f/BOZiJUoqStEI3uvvQbUKZjhAZySbTyRyyhjxKtpDfUqnU1VQ9dQt1K/UJXUsv
+	pnvo3zI3McPsRnZApox8Hj0SPRV9G0zggGtgNaxF6Y7DabgAXxEa+7ITLykm5eRadL1k
+	O3WI7CCHqDnkGDlN7SF/JB+T8+RriqVUlIFKo7qoR6i91HHqN3QHvYV+jP4j/TlTylLs
+	DvaczMv9LtIS2RD5TbQ4+lH0S1y9PAg4M+VQC9dBM0q7EibBnSjFc+iGcNZOwEl4RXIf
+	EzuMwpeIAhAdsZJcMhtdLbmKtJEO8gQ5jO5FiZcvKJwISk5pKRNlp+qoFqqT6qXepnpp
+	G51Kz6AX0UPoXqbP0F/TXzMsk8AYmCqmBjYyncw2dDuZQWaYeZ0tYkvZWnYB28tuYDfS
+	S9g32DOytbJNsmHZednfuGRuFncjtxFn5xXU2V9MrAIxwZAk5D4XboAlpIK0QD/Oxg7S
+	DH2oXUvJesRrJSRHG+m1dBWVjdrwItyO2roN1sAGejHsiL5L74F3UFNWYF+9sIspBwe7
+	FWfnbshGLRp3gZTUlGS/z5vkSRTcLqfDbrNazCajQZ+g02riVEqFnOdkLENTBNKDnsom
+	d8jXFGJ8nurqDDHvaUZC8zcITSE3kiovrxNyi+2aseiymgGs2fYfNQOxmoGJmkTjLoGS
+	jHR30OMO/brC4w6TRXPrMf1AhafBHRqV0rOl9ENSOg7TgoAN3EFze4U7RJrcwVBld3tf
+	sKkiI50cCiAciox00XAEQCl2HILpzWvazRiJNYIhq6ciGLJ4MI1ltDfYvDQ0Z259sMIm
+	CA1IQ9K8ehwjI70jhHzC/aqlnqX3hwPQ0iSmmhfXh+jmhhDVJPalTQuZPBUh023nzP/O
+	XkoFN36jMER5K5tb+ypDgab7EVwx2yTmmjdibmadG7ul7m2oD5F7x5kQeVyOnIrstnqC
+	Il9Ny90huafc0963vAnBhXn1w9aANehprmgIwZz6YUvAImUy0g+Z1xYLKP2hjGkZ08S4
+	WDCvjcV/vidGf/OYGJvXnvgQ45nzJgAg4kieGuQz5F4iDeJBZgvFoLUQ+pYUIk74ayAo
+	ZgfyMz1Eoc7Q3hDrrWkO9dZdYqO9IsZc0/KKYbnFKsrQVN6A9Zv6NFNwprC+xuPu+xxw
+	Cj2jn11OaR6nyLyaz0EsFCd6QldCpPlSulsCBqVuN3vaxfntluYU8x5z8BsEzIvQiDyH
+	9KHcmXPqhZC7AQlhSEufGQb5nPp9hGxqCJPovWGocBwCOdDXXYvF6aKqdVTg+JjJSEdC
+	qoCpzHR3JUpdKeqKu8/dV7O0z13pbkdlYrxSjAWtfQ1ZiGBdPeIE83HEQINtItna0DAF
+	+8kS+8EmWL2vAXtYPt4DxhIpawwrZafPxFnxzamfWx/qrbCFAhUNOAuovsfm1IeOoeY2
+	NGCtnAlOkeM1HeZxnnOR55xULM+L9VKHfWAXDX19Yp919R4hdKyvz9YnrrdYPkzgPwmB
+	cUIYxCooeDBMeudgW4w8gk0keASPgGw1iJhOQpW+pFFhyP9uhAsm+MaWk5HbAgnhwu8J
+	4aIrQXjKFSFcPMHpZQiXIM/FIsJTfziESy9DuOy7EQ5M8I1MTkNuAxLC5d8TwtOvBOGK
+	K0I4OMHpZQhXIs9BEeGqHw7h6ssQrvluhGdM8I1MzkRuZ0gIz/qeEJ59JQjXXhHCV01w
+	ehnCc5Dnq0SE5/5wCM+7DOG670Z4/gTfyOTVyO18CeEF3xPCC68E4forQrhhgtPLEF6E
+	PDeICF/zwyG8+BsI44G3HI+dp/Hbi8YvtrIw1KWFgc/CzQ89rwkDnEYv5jFNfxAGBj1g
+	mvsADmMLgAVph7EXFuPsnDytoPWjL2c2hS/+iT361fQwM/vr/ViLgkXR99lV7Dk8jTph
+	X6DYxm4l/SztIi7mbnIfuyGBrePpHzm0WoNsioNWTTHInZTTaaFzqGJNjtbqludYLC73
+	DmF5mzktrfbC7NFazRezRy+M6oqyoKxstExMaEZzsqf3BKaA3eRN8Km9Np/SKM+FOL0m
+	l+i08RrOjjkW6FxCKIZWmFW5EK/DgLfKcglDMEjDH9GUaErS0mKhSLirkTTyxOTJJJ5E
+	0Gp0ebmTCybnyTiZ4Pb7tJrJBYKHcZJJ2uPCyeH3Ip///fwHN011Hrc+PBR5JwrPn3v2
+	MKlKZs9F3j+yaWfk9cjJSCTy890Nmz/98dHtvybPkuDpPyE+BM/9wOzBeZBDUcDMORlG
+	TjsJfo7wsuuJVUnzXrAolGGycL+w5YMYBGMlIgZnUfwSUfqxnOwEwSBoRe8Zor+++Br1
+	xljWKfboSKR8aGypOAd478DeKo3hh0cDOi6uhlSzDaSe7WCX6m9leeMR/AC0gI3YA+Ue
+	we1r0q3S3ayndU6X3m6gBadRz/h0SV4nyOU2zqmkfHYb7/YaXF4jnRPfYbOm8D6vX2FJ
+	TjkjbInNU8nsGJcXRt9CB2UlJWVjyGvJWEmR1lREtLqiIvw3YpyWk00aSW5B/iS/zyNo
+	aSFX/CaRcU7iIkaT0WRA/LOITyr00FUbn149tS1iPUUNDna+3tmyYCHL0Upd5gWFilFx
+	S4tuixSfou0rH/5xkTOioHbkXDu2bjDPs7r35PyUSr2QULLg84dybGN9qPXzoh9IX3Hx
+	+H1eAr8PFKZmE4VGaVPZ/XnVmg75cg1XxOtUctqWyyXJHRqVoziNykwpPlhMFeemenUa
+	juXt/kSTPUz6Ah6Tw8X5HZlKypGvLOFKSux6LiV1MMlaakuxz4j3F1qmlr5AtuLH6yHS
+	D+OafEHS5bNjJyZ0uWwUJ1SrM0nAZI5mjopAIV6SeicXTDYkArF4SUG8AGanTQCjWy8Q
+	IREmUwJYHSaBGAQMIKbMkgrfdRegFicZRd2dStQknqD+GkjBZMTb50nkZJynlOSJkGv1
+	WAmHUKO2+31+MfLlTyqYnEDUq2uva+gX2nM7W3LqyEipQXXPbQ8UC4pB9p9PH+2+2eRV
+	ObWp6b7GVKN88m/u2HL08Na+1xel1+zcbLDL1HH2rGVkBZ9uzlhcNyu17qXt1dUDY1vt
+	iTR9r0pW7glUL//Z+i3PJJCzop7iVz59mqkFK9hgVyBrl4UMmAf5PWZ6Bq/drqdpvcxh
+	5eIceqWNs9lMGr+O0H5Ka3Uo/CaL3REm3H5h9Zp/24mS2aNFRd9mKSaBhfeqDAofqBM0
+	vpiNsGAObYQg2QilMc6HNgIDuVnmE22E8C02QsIWjDELgbDGEMwToaPyNZDHUWc+Ng1p
+	Vq99dkb2+odX3mMZcv7tyJtfEd1bdqY29M6SewY7n9zxwYZb3j5J8j7BK4opLGJQGH2f
+	HmWP422NA24J5E5WV6kXqncxu22sl9dT8Q4N8A4Hl6CgHCYlm5mQqUnR6qwupd9qcbru
+	E1aXf1P8sbNoJUZFM6kt0sa0yGq2yxVAiFmJstkxAAvlA4WN96GA+L9L1BidqAqSgsgM
+	gGtQm6f15ItiQf4kXd4XD+9Ys2Pnbet3k7667KnPPVX27I37I1+d/wO57tN3XvnVL0+/
+	Sk2e5JxJOb4q3bKknmR89VeyENdbdfR9xoq3Jna8YfMSVaBnK/+YdZeLZtVUPKs3qHXx
+	Bn1AFdDzKVYyU3mAPkVeok/Z3uXfk59xvev51PSpR3lKe0pHLeZZISl+m9GRVCTjOKPg
+	sHMKh1Hp5bbad9kP2t+xM15jvNfOWhQqTqv2xzv8rNWflMn5LRaf/y1hZ+O4ET0rbSRv
+	jYl2KGaOshondhS0U5pRpEoLrxI8DEvjlRRhGZkLLb9Ok6DRaxiZyptoS/Lh7avDR5wO
+	uYnzgdKg9pE4tccqIInFgDejXsVpMBCXpbjJiFsMplLTUu8iqxphVWMjqhA6g+DElShu
+	MWqC61ImbTqQJ5m+RBlHqJEzhQU6zcXz7ENbH5ifrd/HXZUzr2favJcjfyXmPxGXMnnG
+	c3cMssTDVF1/9dwVM556+mRjQVXx5sw5dg3x4L0cRcojvpsr797fRz7ArQd1bR1uQMW4
+	L4hngIKAnTvH4IYkoxVyk8mK9VM4GheKfI/QEtOqktknxkpO1AZbKz4RN5+y2bjvJqBq
+	aPMMnnUH8cekfn2GPSreqkt906M43xZczdcGcg7KTskoRqaX+fXdsi6O1asovVnjYDmQ
+	mZUKK2e1gipFbrWTTHOKBSw2NKuy/f8eeCw2XTFLWYIarS0qIuL8iOYtIc9wyYh5tOI2
+	Ito1NTFoPWTd3ll72s/OST/oyF4bSJlRmGEbIbuYrIFr5/1k4VNjc6mnW0qWxhnL81d1
+	jL2OzCISxdH3GAFtkArvZi3wUCBvgO/XPGb8KTPI79TsNob5l/l3mHPqv+hVU3iZw8yp
+	HDqlhbNYDJQ/3mqT+w0Wqy1M5GiJxjUtdmKZsPGSSqWDifEpE+SoFVrKRzgTptg4TCn0
+	Kh8QDQa8EQ0PrcZA0hsxSMOlmaSTNspEydro8FhCCbgqJWPz4b3Zsw7/tL//abwAvxj5
+	5+8jF4nuz7IuEr+z/9pHLw7vPUu/H/ksciEyFnmepF3EzSAg2pvuyNWMF0VXQyJ0BdJ3
+	87tMVDLvtmvVMoeBi5epHXZloprym61JikxNppCSGG/xJN0nHI2Jhxv92djcSItHnJjx
+	ZWM32oC1+hgf2FAw1ogBsah9QJskmSSxRGOTFNv6cc4MepMxj+QZcHfKy8VLSXEN4Fak
+	9VAv7fJWHj4S9GIYyRwqCFxz+4HIwa5tPfOyi0d6fvtm7+J9R5Zuu2PhTnrfpprkkshf
+	UMan+q/Ld9aM/V48Y21AhXyYqQItXBXw+Wlf3GS6imHUvIZSy7VylZ8X1VCr4K0JRLSn
+	YNElhEkQ1W+tZCxEGWs1os7PLjsxdkK0FuLGLCrfuOrhMSUTzaMMVW7DXsMz17Nmh8am
+	Wf/wCJN1qGA7Rb9IU0OrxwbEdVEefYc+wMzEF4oskhl4sFA+wPbrHtMPGAZSZclJXn+B
+	UClUJVX5FyQt9LclLfP1qHrietTdnq6kLm+Xb6dzMD2BRjPDZjCZCWA12Ex2syFDn5kc
+	r+zAU1iBl/ImximYtATzS3ZHAsc4MrelKbM4uVpDcZAlZFldZqPZbypN9nH+ZGuO2uXX
+	lII/05KdMzxhG0cvjBWJ1nGsSIMpUdyiLAxxyYlzjGduNI2molWSJs8iGZTP4LX6BLVL
+	ALmPEwidjuccNhVTDh3SbHqzQNzxiQIIieo43q8QiM8rV5AMRgBZCgZOrV0gFiMGkomU
+	DuBSIKnIJcUX1zlaSWlj8vukEyEeT8SjC+cRT4fiijAZpTMjHh/x8OIn53lvxeDSgan+
+	mx7cMK3rd4f+cf10ag/rK32srSOYXHvL8fKO9/5w/hRHDpI5i7IXLrwmmIS7SmJqzV0D
+	L2xa1D41t6o2UJlqSXBkpQcfffD0e09S/0JdMkXPU3J2EVqHeT+Ly1QcU5MwKQt4GWOR
+	iZapFVor2k58BUkBg9oQT7toir5otFisF4Vl4yeTscaiE+JBWBMzpFloSfGwPKoZOytZ
+	U7SlWnEdXDqL+fJx780bPLB3r8+QE+fUu6b71y7avJldFHn7kbFgYYKSUJvk/F3LqJOP
+	SHbXEKmhP8X1LFqvVwM39BnWm3eZaU5mkhXqqnX1umXcLfQt3Eb9AGxlBwxbjVtNgzBo
+	1FTDTEOV6RUDU8G+xFL3sTthJ9nFDprYpGTWbDAZcV8wqJTxDl4tGjujDaVkgQyZDOYh
+	1YNGtHlvCcvE1WLBb7Sz5rGiIvxbJAnNMdOH2pRryTLjl0CJuH5mzusJ6AwGMBo7dSaT
+	mSWkUwdgvi8zTbPmhBTxGJNG1LJVpBGtfJ6MpjhKmth8caMsmFxKJpM8QtPCKd89LeWP
+	9z7uS3FmpWpyszRsqTrS9Rp+QDBZyyKbI589H2kbkfHPxMkEM/9oElN7cYC+W7QL0u+q
+	Vczt18WXfA7a2MPlS/Ofxn0RQIoRTfxyOodZ+aX6YixLieB7r4p82XpxVLl5okTqDwMt
+	q4Nyqgi/uk7BIuZjGMJ4hLkJ5jEAxRgXoq8mp2AdxqIXad3UHtiA5WI7E8YG7GcSuhPw
+	BemlZlCv0YUMxWQzG1mG7WZfkD0u+4y7WxpZi+9gNFyPezgFGnSNANynChW+f4oSEnyV
+	jEkqwzKor6mpr7oqrbp1RXdrV8eSZqxBocdftBXfBb/tp0UiDT58Y8yHCqiU3hln4Rvn
+	PHy3vBoWwEJYHLs/qME7hDL0+ejT0qaZoZfshIfQP4mehg5yP/Sg34D+MfTMRGo35g6R
+	+4cZPnCY9ICVzAgoGdd8vcVlVihdb+JRYOQJ13vmj4/gR2ocfEQsw3Egn6YgT5KfwFJw
+	kZ/iifI2fP1MJtv2p6xwNWHRbliJvhc9LYWE7B525rpeJOngZQi28YGTIQdcf87JcJ3L
+	CVNk2HXcH2Yw+oUTc4F41zHHE66fO5a5XkS/N1a0JwVrHHDtdqxwPeIMk23DrofxqwPb
+	bI5FNzuw6QFXZ0q/a2mOVD6rP0ztHXYVYfmCgNJVUCi48h1nXVn+ME8wn+GY5UrN+bUr
+	CRtiNTd26g1oXXbHI64pWOR0BP1T0B8he8h2SCXbh70zXIcxieLur0kp7A+T2/dXJ+d4
+	w+S2QEF1cn9Ktd+bMsvlTan0+zG94GVuHXcNN43L5dLwARKNM2fj9LyO1/BqXsUreJ7n
+	wuTZ4TKX7AjZC2UIy979vIxnw+R5JDJHyHMS8bmDPMNTPPD6cPRDvEwgoA+TvSOoTgQw
+	cUAmpWRh8hze+Yik5wIuVGECjFSgQQ3DKw1UI1REivAUzMCXngfCMrjX2F1mLtOVaosq
+	K/5b0CSVXAql7eDbAzNxhPrxrSG0x9GAzzqYiDoaLlVF0/R//Lpuxgqt5WlpaJr2d69c
+	3iY9U3mCrU34WhW6vxufDXtb3O59y1eOv8H5mlqWtIvvJM2toZWe1orQck+Fe1+31E4k
+	f6O4TSzu9lTsg7bg/Pp9bYHWiuHuQHdQfK7b31K+uvGysTZMjLW6/FvGKhc7Wy2O1SK1
+	+4+xGsXiFnGsRnGsRnGslkCLNJYIQbCjrvymLtROfMrCp6TkulDN3EX1+GLbUBEmO8X3
+	rZvhfwFnAfFfCmVuZHN0cmVhbQplbmRvYmoKNDMgMCBvYmoKNTkyNgplbmRvYmoKNDQg
+	MCBvYmoKPDwgL1R5cGUgL0ZvbnREZXNjcmlwdG9yIC9Bc2NlbnQgNzcwIC9DYXBIZWln
+	aHQgNzI3IC9EZXNjZW50IC0yMzAgL0ZsYWdzIDMyCi9Gb250QkJveCBbLTk1MSAtNDgx
+	IDE0NDUgMTEyMl0gL0ZvbnROYW1lIC9YSUlYR08rSGVsdmV0aWNhIC9JdGFsaWNBbmds
+	ZSAwCi9TdGVtViA5OCAvTWF4V2lkdGggMTUwMCAvU3RlbUggODUgL1hIZWlnaHQgNTMx
+	IC9Gb250RmlsZTIgNDIgMCBSID4+CmVuZG9iago0NSAwIG9iagpbIDI3OCAwIDAgMCAw
+	IDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAg
+	MCAwIDAgMCAwCjcyMiAwIDAgNjExIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCA3MjIgMCAw
+	IDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDU1NiAwIDUwMAo1NTYgNTU2IDAgMCAwIDIy
+	MiAwIDAgMCAwIDU1NiA1NTYgNTU2IDAgMzMzIDUwMCAyNzggMCAwIDAgMCA1MDAgXQpl
+	bmRvYmoKMTMgMCBvYmoKPDwgL1R5cGUgL0ZvbnQgL1N1YnR5cGUgL1RydWVUeXBlIC9C
+	YXNlRm9udCAvWElJWEdPK0hlbHZldGljYSAvRm9udERlc2NyaXB0b3IKNDQgMCBSIC9X
+	aWR0aHMgNDUgMCBSIC9GaXJzdENoYXIgMzIgL0xhc3RDaGFyIDEyMSAvRW5jb2Rpbmcg
+	L01hY1JvbWFuRW5jb2RpbmcKPj4KZW5kb2JqCjQ2IDAgb2JqCjw8IC9MZW5ndGggNDcg
+	MCBSIC9MZW5ndGgxIDUwODAgL0ZpbHRlciAvRmxhdGVEZWNvZGUgPj4Kc3RyZWFtCngB
+	vVcLcFTVGf7/+9hHCJIQkE3Cene5m4Qku4SXhEdMbsJu2BgSQwJxl4fuJlkMNIFtS1OR
+	gpGHymIdHCvQjC1SmdHBojcL4kUGJ6O02ipTH4NaX6jjA6WR6vCoQnL7n7thJYzDZEaG
+	e+bc//yP8//f/c7Z5BxAAEiFTuBBaW4PR8ECfrK8Rt3W3LHKcUd5vkLjzwD4e5dG72h/
+	PfLlbgChDSAl44621Utr9m/PAriuk2L+2hoJt3wbe+gVgBFu0qe1ksF6r9lCegvprtb2
+	VXdaACl+xP2kW9pWNoehEaaSvpV0U3v4zqglknKB9B2kO1aE2yOHjwka6dQhL7ry16v0
+	uyBC+sek50Z/FYn21W9eCpBGNfh/kQ2psScVTNQBJjCL2APp4ovgEbeDXagAO4D+HvX3
+	mexv0E+Jr0OK3qf38oQEx7F+/DyOgmfADM/BOhDgTdiDVpChFyfDv9GOBfAu9MP78Clk
+	wRZ4jN4+OIFnwQpf4XiKmQbr4c+wU49CFMqonUARRsN0+Epfo7+ifw8VEIMjaMYMtOsH
+	oQjuo9YFj2Iq16R3gw3mwm9pRdbDP+A9Pa5/TfmnweeYjkXCLP1D4EAkywzYDHvgOXSi
+	jAW4SP+c7DbCuBj26DV6B807RVFFUAtrqNonKGEuFmIXfsT36p36g/RtY8m3AJqptcM9
+	sAMehb1GVJMwVhxN+b1QTb4HaS+cgO+IxnyswDu5Y/zX/H+FWUKXfoRwLKB6IdiJPLHi
+	wgXYglHci/vxJTzLFXNhfgZ/TIgKuwjbArgfdsFheBnegg/hJPTCD9CHAmEqxVtwDf6J
+	5n3KTeGWcGu5B7j3uFP8JP4jwSxsETeJh3RBP6b/QJhvgAKYBXNgHgRoH0RgKayA38Dd
+	sBHNsB264SVCexyOYwqmYRFOwjk4HxfhL3A1PIS78Xn8AD/DL/ArQpfBSZzMFXEdVG89
+	t5nby8W5g1wvn86v4tfyPfxH/FlhtLBE6KF2XPSIq0xjTdXmef1/6D+ue/Stehety/XU
+	XJAPHihFgVhsh420kpuJs0dhNzwFT0Mc4vp5nAFH4A3C9QmcgnO0YmOpOXEyTsc6nEcI
+	27Ad78YdhHAPHiCUh/AQvIPv4Hlq/ZDJWTkPt4gLc6updcEO7i2Dn1TeyY/nPXw136B/
+	y+/lu/nvhBxhofBLYY0QE3YIO8Wx4k3ireJCMSo+Ih4QXxXfFk+Jp012032m3ab9prfM
+	FvNU8w5zP44jLA7Mgf3wAu26bXyUdBfMxo20qo3wGu3eXvgbnIfvoQeeQDv082w1c/Vd
+	oOn302oehmf530EJPMQ9zN2sl/FP8lacrJ+jXBNpvS42UAryx+fl5rjkcU6HdIN9bHZW
+	pm3M9aNHZYxMTxtx3fDUYSlWi9kkCjyH4PbJlSGHmhtShVzZ7/cwXQ6TIXyJIaQ6yFQ5
+	OEZ1sHlhcg2KVChy6WWRSiJSSUZimqMESjxuh092qEe9skPDhfMCNP69Vw461F5jXGOM
+	txrj4TR2OmmCw2dr9TpUDDl8amVHa8wX8nrceFChv0EpHjccBFBgGEuswuzw2lYbCRbh
+	U7Nkr0/NlGlMPj7HF25R6+YFfN5spzPocas4u1luUkGuUEcUDkxn8xwUWh+g2h73MpXw
+	w5bUFrlli6ZAU4iNwosDKh8OqlyI1UgvVMfIXnXMXZ/bflQvjnwPXOJUuZzKcCRWqSqh
+	LUQ6U0NMCz9AWnWDg9Jym4IBFTcROAbCwJ74iojsY5bQcodqlSvk1tjyEHEOdYF4lpLl
+	k0PeoAr1gXimkmkoHvdB27pZTiLloKfcU87kLKdtXUJ+uSFhf7OHSdu6Ix+TrK5P8oKs
+	klxFMFVHMxUhLgjrdPaKTIdY83Sij54g0lcuIzyzVY62Ep+jijlVYbWzYQBGuNU7AG65
+	N27NzPLRN4QqghQfiqXNpAWk+DTZETsDtLJy738GW8IDFlNO2hlgTrb+yS2kYvjiuMMg
+	xieHW21yK1u+DmOpSZdtvksMpFOQ16NBgbtaA2tdoBvxwaCG+iYNvPaD9A+Gv/02chey
+	DbfMS+VIcbvJUOCkESGopI+sZDvDEXPEqlpijkpHK20pIceQ5IjEgkVEWEOAaIH5Aaeq
+	BLOTw0gwOJPyTGB5aAqFx4KUYflABpKGqaiPgorc1bQIuXWBeQG105utKt4gkU6buKcu
+	oPbQ/g0GKWpiEikhXrvMNoB5EmGeWED+yYksDZSDUgRjMZazISA71Z5YLDvGfnUJXUO4
+	3KAMGDRgIfThPg0762guCdmZzQyyU3YSrCDjdApt4IsbSIOpV2b4xiRumjmN0N5oMFx8
+	lRiePhSGZwyJ4ZlJpIMYnkWYZzKGS64dwzcNYrj0ygyXJXETSIXQlhkMl18lhiuGwvDs
+	ITHsTSIdxLCPMHsZw5XXjuE5gxj2X5nhqiRuAnkzoa0yGK6+SgzPHQrDNUNiuDaJdBDD
+	txDmWsZw3bVjeN4ghuuvzHBDEjeBnE9oGwyGF1wlhhuHwvCtQ2I4kEQ6iOEgYQ4whhde
+	O4YXXcIw0M2gC4DOqS/SDdQMpYpTNNnp/CeY7TykiIKd57ksq8lsR8i0WPc420pshYW1
+	p0tq+kpq086W1KT1lUBZSV8J65MmTkl3pudR7xIe1y4cFV/8oVQT6s8/TYcwugd20usZ
+	urvxkKtk4Hg+RRwzJgujkCmIUefdibw1fbW+iPcLKKvpnTQxw5nu7MSi/jewoP/tRA6W
+	B8Z9U9p3+4iSM5BO1056/j7/8Y1J2TnwNUj/rBN3UWOOKb8/n66leO6DC+8PW5f0sGns
+	4cSXoYubwTDSfbiR3mwuB8upt9GdnIM0aosBzCdSMuhGyrwIIwfymOh2CXVVVeVV5YX+
+	SFtHZNWy5rCnYmVbC8thPDq7Lf3Uw/zpABrUF2rgp15KfSr1gsJui/I8boVRS04rVpQE
+	GCa9m/nNCzgBhsMXxlvFCUrqcLA2byiRmjds8OeXW7EaigUECX3gMqQ37npK0rA07pJJ
+	3JQQXLzYThoo1mKX1FfcJF0o1iyoZEv/cz0snaN+1lUmnXFNkt6guNeL50hHy8kfl14t
+	0DgS/3RpAiojpFdc90jPFudL+4tnSfE8ssWl7nISB6TdxfdIj280LH8pMMQul4Zdcekx
+	Jg5IOyn/tg2G45HExPUJEd1oFFq5zxAr9mncUwekdleu1EQTURkmLXG1SYtdM6T55Rrm
+	xKUaNu2ANDfvqFTNSsclJVFoWiL7jS4D8eREWbfrkDQ+UWEci1YyJIdrrmSn/O7Htklu
+	121SeYGGTz7nH1/g8udtm6bhaaMGEwSUiRUJ0Zx3GJ+gm3A+LoQc/OM+fz5hxq1xaQOJ
+	rn3+8cU5Gn9CGSnty/PnbaQ+jXoO9QUazlfc5u3mFvMC8xRzoTnfnGt2mm8wZ5tHWUZa
+	0izXWVItKRaLxWQRLJwFLKM0/WOlkO23UaY0JkwCewvGOI32DxqbjLYkhxYObgbNBJuu
+	7yizlY0sTZ9R6f2JV8gwhryFPz70s04+NrSr2+iwpu6xB9XJbKDbg0nvzxtEKmh+df3q
+	ffWrTzYa533ZFwnRsV/d0kHXss4mh6P75GrmYCfPUFNzK5PhiLpajnjVk7LX0V1vzLvM
+	3cjc9bK3Gxp98wPdjUrEG69X6tl5PrivzuenvytU5GKtzclaft9P1PKxZH5Wq86Yd1mt
+	WuauY7VqWa1aVqtOqTNqFRb6ljVUwP8BnCt6ywplbmRzdHJlYW0KZW5kb2JqCjQ3IDAg
+	b2JqCjI3ODQKZW5kb2JqCjQ4IDAgb2JqCjw8IC9UeXBlIC9Gb250RGVzY3JpcHRvciAv
+	QXNjZW50IDc3MCAvQ2FwSGVpZ2h0IDczMSAvRGVzY2VudCAtMjMwIC9GbGFncyAzMgov
+	Rm9udEJCb3ggWy0xMDE4IC00ODEgMTQzNiAxMTU5XSAvRm9udE5hbWUgL1BJSUFJQStI
+	ZWx2ZXRpY2EtQm9sZCAvSXRhbGljQW5nbGUKMCAvU3RlbVYgMTQ5IC9NYXhXaWR0aCAx
+	NTAwIC9TdGVtSCAxMjQgL1hIZWlnaHQgNTQwIC9Gb250RmlsZTIgNDYgMCBSID4+CmVu
+	ZG9iago0OSAwIG9iagpbIDI3OCBdCmVuZG9iagoxNCAwIG9iago8PCAvVHlwZSAvRm9u
+	dCAvU3VidHlwZSAvVHJ1ZVR5cGUgL0Jhc2VGb250IC9QSUlBSUErSGVsdmV0aWNhLUJv
+	bGQgL0ZvbnREZXNjcmlwdG9yCjQ4IDAgUiAvV2lkdGhzIDQ5IDAgUiAvRmlyc3RDaGFy
+	IDQ2IC9MYXN0Q2hhciA0NiAvRW5jb2RpbmcgL01hY1JvbWFuRW5jb2RpbmcKPj4KZW5k
+	b2JqCjEgMCBvYmoKPDwgL1RpdGxlIChVbnRpdGxlZCkgL0F1dGhvciAoUmFuZGFsbCBI
+	YXVjaCkgL0NyZWF0b3IgKE9tbmlHcmFmZmxlKSAvUHJvZHVjZXIKKE1hYyBPUyBYIDEw
+	LjUuNyBRdWFydHogUERGQ29udGV4dCkgL0NyZWF0aW9uRGF0ZSAoRDoyMDA5MDYwOTIz
+	NDA1MlowMCcwMCcpCi9Nb2REYXRlIChEOjIwMDkwNjA5MjM0MDUyWjAwJzAwJykgPj4K
+	ZW5kb2JqCnhyZWYKMCA1MAowMDAwMDAwMDAwIDY1NTM1IGYgCjAwMDAwMjk5OTIgMDAw
+	MDAgbiAKMDAwMDAwMTczMCAwMDAwMCBuIAowMDAwMDE5ODIzIDAwMDAwIG4gCjAwMDAw
+	MDAwMjIgMDAwMDAgbiAKMDAwMDAwMTcxMCAwMDAwMCBuIAowMDAwMDAxODM0IDAwMDAw
+	IG4gCjAwMDAwMTQ0MTMgMDAwMDAgbiAKMDAwMDAwMzA5NyAwMDAwMCBuIAowMDAwMDAz
+	NTYxIDAwMDAwIG4gCjAwMDAwMDI2NTUgMDAwMDAgbiAKMDAwMDAwMzA3NyAwMDAwMCBu
+	IAowMDAwMDA5NDI3IDAwMDAwIG4gCjAwMDAwMjY0NzUgMDAwMDAgbiAKMDAwMDAyOTgx
+	MyAwMDAwMCBuIAowMDAwMDAyMzY5IDAwMDAwIG4gCjAwMDAwMDIyMjYgMDAwMDAgbiAK
+	MDAwMDAwMjA4MyAwMDAwMCBuIAowMDAwMDAyNTEyIDAwMDAwIG4gCjAwMDAwMTg0ODMg
+	MDAwMDAgbiAKMDAwMDAxODgxOCAwMDAwMCBuIAowMDAwMDE5MTUzIDAwMDAwIG4gCjAw
+	MDAwMTk0ODggMDAwMDAgbiAKMDAwMDAxMzQ2MSAwMDAwMCBuIAowMDAwMDAzNTgwIDAw
+	MDAwIG4gCjAwMDAwMDY0NTYgMDAwMDAgbiAKMDAwMDAxODQ0NiAwMDAwMCBuIAowMDAw
+	MDA2NDc3IDAwMDAwIG4gCjAwMDAwMDg1NzggMDAwMDAgbiAKMDAwMDAwODU5OSAwMDAw
+	MCBuIAowMDAwMDA5NDA3IDAwMDAwIG4gCjAwMDAwMDk0NjQgMDAwMDAgbiAKMDAwMDAx
+	MzQ0MCAwMDAwMCBuIAowMDAwMDEzNDk4IDAwMDAwIG4gCjAwMDAwMTQzOTMgMDAwMDAg
+	biAKMDAwMDAxNDQ0OSAwMDAwMCBuIAowMDAwMDE4NDI1IDAwMDAwIG4gCjAwMDAwMTg3
+	OTggMDAwMDAgbiAKMDAwMDAxOTEzMyAwMDAwMCBuIAowMDAwMDE5NDY4IDAwMDAwIG4g
+	CjAwMDAwMTk4MDMgMDAwMDAgbiAKMDAwMDAxOTkwNiAwMDAwMCBuIAowMDAwMDE5OTcw
+	IDAwMDAwIG4gCjAwMDAwMjU5ODYgMDAwMDAgbiAKMDAwMDAyNjAwNyAwMDAwMCBuIAow
+	MDAwMDI2MjQzIDAwMDAwIG4gCjAwMDAwMjY2NTAgMDAwMDAgbiAKMDAwMDAyOTUyNCAw
+	MDAwMCBuIAowMDAwMDI5NTQ1IDAwMDAwIG4gCjAwMDAwMjk3ODkgMDAwMDAgbiAKdHJh
+	aWxlcgo8PCAvU2l6ZSA1MCAvUm9vdCA0MSAwIFIgL0luZm8gMSAwIFIgL0lEIFsgPGE3
+	YWY0YjgyMzhiMTNlZmVlNGU0OTZhZWFkZDQ4MThlPgo8YTdhZjRiODIzOGIxM2VmZWU0
+	ZTQ5NmFlYWRkNDgxOGU+IF0gPj4Kc3RhcnR4cmVmCjMwMTk5CiUlRU9GCjEgMCBvYmoK
+	PDwvQXV0aG9yIChSYW5kYWxsIEhhdWNoKS9DcmVhdGlvbkRhdGUgKEQ6MjAwODA5MTkx
+	NTM1MDBaKS9DcmVhdG9yIChPbW5pR3JhZmZsZSA1LjEuMSkvTW9kRGF0ZSAoRDoyMDA5
+	MDYwOTIzNDAwMFopL1Byb2R1Y2VyIChNYWMgT1MgWCAxMC41LjcgUXVhcnR6IFBERkNv
+	bnRleHQpL1RpdGxlIChkbmEtY29ubmVjdG9yLWZlZGVyYXRpb24uZ3JhZmZsZSk+Pgpl
+	bmRvYmoKeHJlZgoxIDEKMDAwMDAzMTM1NyAwMDAwMCBuIAp0cmFpbGVyCjw8L0lEIFs8
+	YTdhZjRiODIzOGIxM2VmZWU0ZTQ5NmFlYWRkNDgxOGU+IDxhN2FmNGI4MjM4YjEzZWZl
+	ZTRlNDk2YWVhZGQ0ODE4ZT5dIC9JbmZvIDEgMCBSIC9QcmV2IDMwMTk5IC9Sb290IDQx
+	IDAgUiAvU2l6ZSA1MD4+CnN0YXJ0eHJlZgozMTU3NQolJUVPRgo=
 	</data>
 	<key>QuickLookThumbnail</key>
 	<data>
-	TU0AKgAATqyAP+BACCQWDQeEQmFQuGQ2HQ+IRGJROKRWLReMRmNRuOR2PR+QSGRSOSSW
-	TSeUSmVSuRwJ/yyYTGZTOaTWbTecTmdTueT2fT+Yy6gUOiUWjQx8PZ6uZuNp5u52Pl8P
-	eEUKj1edAgFAsGhEJhoSicCgYDwUBWcA2msWu2W23RCrW+5XO6RNzN1tMFVKRvtNnv9/
-	P664OdAOxiMYjUdlEsV8N2kA2fJALIZDCZfMZmPXHNZ3PTvAP5eKROslaq/LZ/VTS0js
-	plsZkcmATaZOzgPcZLV7veZfOb3gcGPq5IolrsdhcLlTAXkUljkoFfaAQD9XJdPK2rl9
-	vuTTf93weEAMVYKpgKhQyBtud1qFhMsC7iEA0EAcVBwLkUXCcB2fLkSWRei+HwaguB4G
-	mQbZwhsEgPP6ATNB2LQxhQGwdOqA4DQ06bpsk1LxRBEKNu/EUSs+eR3HaS44DKfh9Hy9
-	T2FeZZpjsJwhIQdR5HoSpcmIKIahaGAQA2y54Hqe4GPqygAj8VZbj6KQjAOAoCM0BAGg
-	eJI4D2BoHAcBUwgRMbpgLMzdRNNM1IbEk1zctyXGCVZSmKVxTpG9Z1xnGsboWThfGOE4
-	NAuHoUBEfR+H4WpnGsbZ0HYCYGAUI4XhQDgJggcB1ncapxnRJhpnGc4JgaBQpBsFwIgW
-	BR/IEXppm0ZpvnIAKCQYD4gBUEbIG+dR3GEa5uHKdx4hEC4JieGgWgSAwClIYZmCSGIU
-	lsZ5rmycx1AwCAGjMIYdHyfZ9z2cJ1neCIGASJQYhUEQLAmdcdl+apuA7TBqnIdAKgcB
-	YQAqCQXg/IqCGkcRzU0dwnBmFiRhUI4oBNCwG4mBeKzGBEzSq2r/TfjsTTbj2QqIfuSE
-	+PY4HScBvTw9hXGWaQ4iUH6Cn7VtenaVRkGgM9vgyCIHFXnVEH6/QTnQd55FkZpqDkJY
-	gHCdh3lMYhmiEFgSyGDlgG5oYqhwGEEnAZxvnKLQeBkfZ+H6UuqB8FIRhkEIOEmXBh3W
-	FNVAUXBomwDWf1yEkAQFAgDNoRxamANgjh5AwGz+ZAPgoCIe7ebp0nYWJmGoNwkB8eZ7
-	nwThfmQDYJAfQoRXiepuUeL4fhqgpRmEZgSAwCgchMECRgcDwRBiJwrgj4WJ+IBoE+O6
-	bcAHD+Rea4WQed6KbJcfXqkeMgsH6fZ9ZY9r3odIYNioG4XnufR9kMWBd6aIG8oKTvRh
-	mEIOyoAhZc1GwhMhRB+EYWgwA8BPCGJYXQxAcglBADMEQHSCthGwOUdQXQfA0EWLMXwQ
-	QVAlBoCMDo+2SLhH4A8BQCXBIDBqBYBwDUnJQSkPMfA+RIi2GCHsKQRWMAFIKn8Y7WQN
-	AQAcJgXgxoAhDAUhkeA9h7iQhkHoKARCCABEO+pmIQEwAIJGAMrgKwoBbAnF2LwD4wPH
-	ASxdjKaHpRnNU9CNEayVMkH6PMeI8BKhqC8SZPKew5hMCAQVVo/xtLZFOMYZ4aQig7IK
-	JcXYxYigGIQ2kfgQwWAmVIAsYo2RvBkCEDkhEUReBjCCDcTIvRjs8ByBZA5BVsDqF4rA
-	Nbi4HjpFsNAa49IXgrA4BgIIKwSgSUlCVAkKIVJPSiEYcQ7R3rVGuG8JIPiECtGSNECg
-	DQFglAwBUVAxxnvsIREAYwPlDGQGGNcboZgiA6JOAMAgHQjhTAvO0Cs7wJTxAZPNioC0
-	NAGeVGyfRmI1T7n8SFcQ+x4DtHYJoOAZI7IyRo/khbdBhg7BOCFyIERIi3GEHyGrhUrE
-	EfMPtB7lh2C+GoNuVoPCCy0HyIgWIvYmBEWeMwILV5qAVILJUb47R6D1CUDAFT/JFjoH
-	gPIYI1hulqCsDkGMvoTwphXMOEAkhcDCD0FEIqTCCiZiC0UBBtJrzZacQgYklh1DxHoQ
-	VbYDQdAmBCSYf4AgBgOBwEQDFcwM11neBUCFeUwgKjImZ5k/7AFHn7YGwhGHqj6HaOod
-	Ing6BooSnqhafSFCfGAMkFIGwLg2BGB9w4wAfq6BqCMD0Rx7iYF2MYL0Ex4j2HwKgYwz
-	g1BGcYgcYg2BvDNG8OMN7MqhjcR0PQKCQQCFnsoMoHAJQPgfX+JZHwbQkA9AQs0ay+Rl
-	DdHEGAH4NqlSmAaH8VQtw7wCSUAdHoxLPgjBYB0DNpLmDERsEOsY86uzaIOke0ovBikF
-	DUEUHkVSTD+MiAQFwOq5gYA1gfArwmfpfjFGVjlhcIE/sHhHChDDAj+Hzhkd47B1ifDq
-	Gmx6e6GEKtcM4goWAdAyG8OkdsgRnAMQyPF0DbgRuAGuOUdIuBoDYLQS5tQ/WvAwuUBK
-	1Y9xQDAGUPhRIBzaS8AUFnFKVQBuZGoNAcA5FLgQHsuFu4IwLgUqUtsBwoRgjLHPUFpo
-	P1HDsFYzqSbnx8uAdwCAcyxL51fIVaYYtGgxSfJTgAAQ+gSAwwKBvQ2h54gSryBCes94
-	zYV0g9MgekdKEQjdYcdg6R0CiDwGwrGPx2DzHq8YBAC0MkFxuOkYw2hvhhCADe+yqgE1
-	/AAYEf9OB6v1AdGMhY7x6j2g8P6FADCKUdWZDggj/B3D0Hs3l+pF3ZDMBeCADQLgPAaJ
-	SP0AAAR6AeBVO0C9yQP4FAtuXRc88YHVnzpXdhMMJ7twrG7DI+R1joHOKQPQbjNap1WN
-	+TwODw7LHsNYco6BlDbHFbsHyD9s7bHiBsE+4MDgaA9xWu+Ct0MXOnvDjhKN38dsLG4f
-	HI96jnFKHsN5ml4j0HGO0eDcQOHht/dMdAMgQAcv8SvbQAR3AYBJXfcQHOhV30TxlMbG
-	eQdJJFx/pU/43D36gOoc45hTh9Dj007nOx1gVBDuADvX+wV3i88SvuyOsdnIx0ztEa+n
-	9R6n1Xq5NB6wvHqPkfTecpdrJF1rrm5QLcVA90IDnftEvEwambvXiSJdq8U87to9+pdU
-	6sSxYY8RWTPf4fEAd9nUBDBaCY8JLkEoLQbwwtnfAQ9+7B2Dwk8fDPH6R432RC/GezY8
-	okfnUB78l7gSlz4+BHwyYUCx8JBdfWlkSETz9oQPHc1tU1KWz/T7b636ncvYPBbg8KxP
-	w/ZvbffAB7X8CayAPyBPeCOt0OdTn04gCGQ2HQ+IRGJQ1ctFsOl4vMvD4axNvOp2vh9P
-	sVBwMPN7vhXstpuF1u8IgwEkoYioRBYJuh4PJitlvhUHAxlt1xAgDAUpDUXBkIg5iNlv
-	AUBAOPu1xOx3h8KhEpjcXgUBgN9QJas5rNt0OwJgwFEcXigOBMIQ1suZ1LdoNexv2Shc
-	ji4UKhjs+6uoMBAGmYhjp8vt9yuWy+YzOazcJut5PRftVuB25NVyOgyEIcRPTaeIP0AA
-	F1BQQBfYBzZbMMbUI7cHbkE7sC73Ub/gcHhcPicXjcfkcnlcvmc2Jv/oc7pdPqdXrdfs
-	dmBPyCPeDQiFdmGqJhMu4hAhCsS8RNr1jh8KBEeikRt10uxYsxqG4kD53nqexOF8ZAbB
-	IDwcBKD6Kmyfx/H+LofBoWpnmsZxvnIpIWgUA4DlaZJoiGFoTBiEANlWZBoL2IoXBOdB
-	3nkWRmmoOQliAfJ+H6SRbmEK4chgCQGgWVxlGkFQNguFgOgyRxamANgjh4C4HgbARkPg
-	+T6Ps/D9P4HyUHwThfmQDYJAeHoUBEEwMgs7LVNY1zYAu2baNs3DcgRPADT08U+T7P0/
-	0BQM/ugf9BUNQ9EUTRSJu27rvoShc+PaY8kgyHITBA4J2HmepIlsYI9ikIoEN8hkBGOG
-	AQA4CyglGYZmDyJ4iAEAQAnCrBXQ+OMawmax9xwKAahahtegMsIeTQQxYF3GggAiBYFI
-	aTsxBmEIOngex7nIdp4C4HoaIacp3Hg/57yMDA/FWW4+ikIx5nwfNPVBUVSAKhtT1SDg
-	NAgBxMF4Yw8CeIcNgNPs3Na17Yzmk06qbO88z3ReJYnimK4sh9CYvjWN45jdGoKg9IT6
-	VkPn7BsehiibMHodtOLCARbGea43iSHyIQ8aIKSCEKcMhmmbIYnR5PIZg7CcIVe1IAgh
-	hYEyGl2aRsn2fp+heD4NkuXZi4IiFfn5pgTHXTgFqOIy3onBp/3Tdd2nEdp35jmea5vD
-	+dAWEoMAqwRn2bQGDzhhU5tqDDb4cB08KNiOO8XxnG8c57o8fyXJ8o4+Pu9kLwz4YZsG
-	9zhvViIYA9GiGSGjVgGBhq5JFwYQ9CiItagChpM3/FYTgJWhYGYacuoboWiaNpEKASo7
-	0vWhmoalqgbhID5Ix2PlRAMAgCIae6RgHWhlG6cJ0ngeauhehtNnqel4A8CYI7XdgjMa
-	fnWdd2HZdp20WAR6u977P+/4TOTC3BuFNy4diDBXKwHgRAlPjGYFQNgc49y6j3NHifeJ
-	BT4NARAdCACsEj2gBDXHKOlE40A5o1AWAgA4lRcjEB+CoEalVsD3EtCtowQxzDvHi7t3
-	p/Xfk7eC0dXrxQCvHae1FqY/QkAvBSkwYELQRg1BGB6GImBdjGI2DR6gAxPC/GUGUIYO
-	QHgJAQq4ZgMwRAcJKBgP4qhbh3YEAyFEKoWQuhgtmGYxIajqIy/pGrfjVsITiwthjhE7
-	QEcTAaB8iZFSLcgoWRkj5IKCgi5lSKflbjvVyNEeRKXqPWIYsEFoKUjkNNAOgViKAJpB
-	JQPkIAKgSKXBAVcd8OnfNBh8MJosQHiPGPVEV5Y/SaAqG8OkdopxjDOAYAcAw8SUg+Pp
-	K0EhDT8jUGehcBoCQDpSAaFoHYM1aABFCMEZY5ydo0B+WgdkpxoSpAXKuaEsBzDuHjHw
-	IEfk3v+kFAGQriE9SIkjP+gDkoGUBoJQU5ckzwSVUAoRcqhR/gSWg6N2ZEixj8HcPQey
-	z0NgFk8odHA/XyzXAQAuZREx7D5H07Ioy9iJPYH3EIhtFaL0ZWgAejjFX+yBgAw2Ac/H
-	FUGqBUFRNA6hVFqMRA7Y+KlDqHOOZkVR6oMSf64MDdVQO1XTiBKrQDauU+n9VGsFYTk1
-	ErFWWSLVB+ndHYOodAvBRCXH2PofVKB8j5XgY4xw/IjsmbS5Gs1fyGuzsEABWitXqjzA
-	YBoCdi6rgdNnVmrdXDdgJN7SywFl7MEOrJZmzjlK0HdHaO0dYvxcCTs7ac5Rjh/DWG6A
-	EC1rwM2xA9bO14FqtJAq6niytqLeVgs3b24DFq0VKHxaEdYvhbiSuDcs1FqhtjiAMBW6
-	TgzZ3SArYsCYC7tWTt3cwhh2x63hHteNBo/rmIcAPVwBt6HG2/u9e9QV5VHDrHSMAXIl
-	L4X5u+Pwf44BzgLAhgG6hsgKYFAfgfAIEHEXds6d0ZuDxs4RHLhO91+bbgnwwDbDWCWK
-	4Vv1h8695bxj2uNaS02ILvECH+OQdaU6uAaxhbEDOBQKXYu0Au7ipbMDIx4MHH1xLAuj
-	n7gyiWQaJkOyKQ/JOSHSESyWcTDxDKB2bypX5QlaK6j5vKQ0sIAwb5fCFmHLtQ6/YozN
-	iFBuI8S2lzPcvFWLAHuFtrjK62BwHwDAVnl6tHaw1oFhn8amgSGwDcHgmythcu0SsLoh
-	l836JOj0Xo4AOkXZaP0tkewuVZHAAUJp06F5byqE1Dp7UGpdTKEO3qYeWqx0attCO1Ql
-	jQs6zsmobKObdcHGs+QTNeJ9c2oxUOIdIDcE4ycHda296sF46rCLTZ2Dxm5dBDtO2+lB
-	WbXFRtnPK0SGZ2ENt+qoG9KaU0vYXRWkcl2FOCoQNu7Q6bvG/vHGQIN6ai1LvYf1aN8X
-	l31p7VNfR/jx4EN3glch9WNC9wnPdC8y6/4cce4dSh130vtfjh9ncVDeHKAm7Ftbq3Sw
-	TnbZdlqoDY5MKnlFhQTcrvVuZ0eXRVcx22FLmlhRL83sLu0NujIPaV3Jpbn+k1aKE3Ux
-	jKx0MR2VEl0sGHTQedP1Pp6tHUR/nb091XFW/iBXlyyNfr3BsNA2CT2Phmm+L9nOFxG4
-	torkXK7RZi510Lb7hxgBq2t2AGd523wuo6hBM9/HT4Gx5sNKZdsKKvxFkwo+Lz2Lnx3J
-	hsbvDoLrynjhcj08wIPzR3RQ+duJYUOHoeVgm86KEX3p4Bh59VY0PXrdXgi9gHX2QhPa
-	BO9t5LBInvdbZFQL/33eQGBu+Fzbm44fjdhBL8np4PMfDBHV8/2wTt8b9H/eEevXhrkN
-	DP9tOKfdb9v/AADtQ7K14m/DYC1RnAAODTjbMD1kLcAN5HVDVo6O/iZz2Cz/We6JaJdG
-	z25QFSGLAG2mBCuIGtAQEpAUgGEFAaEhAeGrAi90E8DHAqERAu2uFY+MHCE5A650EVBA
-	EnBE2gFtBKCnBPA6E46WR0FuFuBjBeD9BiDvBm8QFW6aBg9gBEEZB2ETB6GfB+8sCtCE
-	+2DOFFCM+eHVAm80EGD7Ca4SC83oBA3+QcOg+oHBCu/IHZBuCfC4+84a/PDAIYrQzUtE
-	4rDCrKtUGoG2H+uw/c8GAutup6t02YqEGTDsFxDwtvCi/60aKnD7AC4MCNEEO2EtEKzC
-	CE+AFBEVByokO7AqDG8sD/EkolC4Ce1mCysrEuokCXE5BKFsD5FAGXFEB1FIDxFM51Bm
-	DvBrBeBiHJFcsLBOCmvLCECs2+EM5uEu9oEIvKDBF6EbF+9kDrFxCm1M34aouJAiGqsq
-	DtGY74Ou+/DO4ccuuNDNGirAtUIsH4p0cENq2SskN5DoqCF5HHAGGKxkxk8M0lHSAE5i
-	FUsnFiy6GBHlAQGsChHsFLHwEBH0+tHkGBCi/uE1ICHNIHFMDxGCF7IQD3IU4IG7ICE0
-	DDIgrQBXInEkD+B3IvAy9UDzHbFYsm9OF8DlJCG3JG9KC/JNFxF0rRBTIGHM3CC1JfGK
-	Qa+o6sOg8gxGDJJw3COzGhGs1xGnDKvvJ6qjGwGxG0cCToAxG8mvHA5IcYuJFsC5Ki9G
-	OI8sx4TGqqTi/8ADHWsLHa22CpLAokGdLGFPLKEjLPFsO7FcHI+EDc23I0cG+s9aD0+W
-	DXLsy68wHpI0xlJwDIBVL+G5MDAUEpILILLGGcFHMTEUFBGCsKHnMeDZMicRFxCWUI3i
-	G+CxMzHatqvLJoH++pM6IFA2HdNI+jFZJ3C/KE7PJ+HXGrNUqLKJKMf/G5KSsjKWspHC
-	Y6FlN2C3N6O29HJCDkCrOG22InBaFuGVOS3DKyLCok/40gVpK1OeADOnOceqHhOw22+B
-	B+Ge8oF09CDgxuvRD4AG1WHk2qVoIg/qus6vM8+sn6vLNIHcgG6m4BM9CQEPPzB6ETM9
-	Jm6yH/GMH6HFQHCyCRQMy+BvNQ7NNfNWIG15KA4soKy2IY6LDDNjG3KRKUxzKacWFfQ9
-	F6DBPMIa+ArROGCrMiDYBrRUIbOPOSGU3Ctqz23GVpOq5fD7HXHXPIok8gGFR651K1HX
-	Om5cyO+mao1HM/SNJkaoyurRSXCrSS3yapIYErSpIgDC+SBK+pPrCo6wH41NQGKu/JQM
-	CRQRQVQY/BNZNcOsGeGiG6EkEuFkNQBqBmBMDUDKCWOmFuF0GYHgHiHqCyCqB+YkHQHS
-	HeHOHQHcBiBeBGG4G8HME6FCF0EOECDAgcFyF4GcFQFYGC8Ky6LCz2y6z3VBU9VJVLVN
-	VM55VPVVVWy7LXMPLyImy6vQvRI+HPVtRdOWNhOkerOsAI3PD8AHV7R1OhWA55SHOnRx
-	Oa0sz233SUr5S5P7SdSRWfQDSZWfM9WrSeH63xWjQFQJTFQOy/TNTO7RTTKCOxTYG7U0
-	GCESEGDEUNT1T5T9UBUEUWGQGUGwGKGQGsDmDcCkryHmHoHuAkAiAagctUQoH0us7qzo
-	ukzwzy0OVpSbYnYpYrYtQDYtYzY0rQGNY7CMFFVgIkcQ1iquz+FhTBVxKxV1RvWVK3D7
-	PI+s+BYiAFOnWRZbWNOjZu0izGIe6o1RP/QDaDWdSLWo3vW1aFSjW20+QaO2HHadQLXD
-	QSOxJ5XIvzXNQjTXTbXXXbXeOAHGxYFI96HWHYHiBUBQA8C2CuCAN2AOUIFYFgGKGaGe
-	G2AzDgsWAcZfXorqH2FKFUF+GoGqHCteAgCsCiB6BEBCAxUOHcFkFqGQBGBEAyGYGcG2
-	DwDmCsGkGoG+FsFyGXbGHiBMBKA4C0CsCA8wHuEcEmFeHoHqHwB2BwBSCAB6BcFoFwGU
-	DQDGCUbSFeFmGMGGGKGqdICCB+BeCaCSBsokEaEkFcCCB8BcFkFsGTdYHwCQCIBmCICC
-	BgOzQvKONkcHQ1KYckFNfGDRfLMeHmy6cQwTfKDRCe/dRZBbZSSPZXWDRs5655LzAaEE
-	4MuIBff9GYDtK1V6540vRlHVZeyaIdSPWa1BS0aoFJghLACosLWzQBWdaRWtgrQDTBah
-	TJXFanNTaqzbauOzXSFAFIF5dInqIkBkBgBGIEH6DsD4E8CXeOBoBgBIFndtMeHuDcDS
-	CcGGGMGqFrdtUACBT6HoFMFUGBdkBdXoEyE8Fvb2CoCgB3a+HYFEFOF7a4HYHaHiEQEa
-	FWBCA+AuCSCMBoBaBWBAD4EEFGCqCiB4BEBAAwFPU2uuAcCcCWBwF8GCGjbkG4DSDKCV
-	i6HlUhUlUoF4F+GgGKGOGsDYDQCarkH3TeFkCWCOBqB4B0BWDiDwE0AiAgAYDCC6CMG0
-	G2HIFKFSF+EuEiDYmVQ4Obe5NnQzNtQ2ckFdlvFivVKiC5L6Bll8NRRbOVZUAvRzfs54
-	E/mQz3EeolGDL6BdmfWTfq0fgM0rgG0kyMIa3xm1aXgbWlJeC0/un7gzgu4BP9S9nLSg
-	+pacHG4mHXTHTLhBQXhFJ9QcHvGpXOOvXSEsE2FqA+A6TYIkDkDaCgGXcoGCGIGmD8Dw
-	C0IbYCHuDiDsE0EqEeDUE6FEF0BQBMA4CFeIIaEgEqFgAuAsAiCcCUBuDaDoEwEUEGDC
-	wMIaESEcFWB6B2BYA0AyAkEGEQFOEiEUDO7yASpQH2HAe8BPdFhgFpOQG6G+HPX6ClXv
-	XzX3qbUbUfUjUmDAD8EIFGCKCEBkB7k0IbkSGgGgGkG8DoDeClk4E0DGC8COBYBUA+Ia
-	DiDuE0DiDYCiA8A6AqOtlinzG7lpfCcpR6GFIuB3Z4OFmDRfmHPJZw0qDVsdF07qsK/q
-	rwcGExsswiGyBJs1FSF3s7O5LWutIq98F+GZtLnWtrH0EAxvMHY6GMxpP2rxP28g/0BY
-	B9tsDntw8WCjCJMG+xALPBtGGjuFMuEfuLGJaNWmrRTA1fnfg/GfhDnmxRhJXRa1U3a4
-	NQFWFcGGF2F+GehQq+ABemEWEKDEECEMFMDqDgCmsdr0IYFnejemByBsBQECEOFMAaJk
-	Ihb2CiCcB0BQBOA4Evn5uuykOgF0F6GcGAGGGmWyHyAiAeAYslqbqfX1X5X9qnkNqsDU
-	DgEqD2DsCwA2sUIaGiGmG+FcFkGKECD2C5rSDpX9xCAoIaDwD8E+DKDACRcgAzr2H2H9
-	GzQxe9r8/jlqqPsQ7qcHV/ZsAGyzL7ADsW0i2cFoyzEvBTSxnbMCG4EDyzMGBHy44EHi
-	G1zBFtuKEfy4BG23zAG1scDVMGvQvVnaDNzhLOEiCvzpPBFxDwFwxHgkE7z5CjPkGJ0B
-	yyEDWZaO1LS2UJg5XBg9alufnluizNunnzurXZXcNRqQGUG8HAHRh8CcIgHeHgHoAgAe
-	AWEIESFRjyK8BaBEXuFAFyu0ARo4BeD2EAFDomDUQ4ssvCHwAILBcXwEFrwIAAGzlMEs
-	E0Frw8CuAsAqAhkYGsGQGWGxwnXxwrqlUdwzUoEKEUFQCeCYBxrcUyIZUuGaHUHWHgC6
-	CyCHrSDqDeCnpsAnxlxpxtxxcjx3x7KLx+kHfBNxleoNyKxgTjU7mk0pHsChluFcsmsL
-	JZOwHhHbLsDXCjrEGhO9AKsnFpBqrwUI23zoCu94yzsxnWwSxGBb5HJGG34dBy1MC75U
-	/vFAD5zU3D4j4m2mUJE4CXnHS5S21NnXg7nh0b0e1/0jazXVut0qNOG6G8HOEZeWEID8
-	C6AmAkAcGPXwFiFoGOEQEEDDegGSHKHMHYDEC8CMIIHyEEEOFPTmBMCuCmB6DsD6E+Ca
-	CQBsB+B6BaHaHcHnpyFPrqCgod1/2DwUGlcmG5rMClSNTeFibTqaGWGaG0F6GAGhcsCt
-	wxqrUp0uHMHOHblECKeqAGEWEgFbewBhhaBJ3V3Z3d3hxrxvxz3rx9e73zr/32qh387s
-	tfgI//V5WJ5btsB8CZ94O3F1m/RdtoB7+HBq+BLy+Bt0Fb+U4NRG7zFjHa4MokvU+jHp
-	LztbImBX91BS+iDj+7Fw9KBR/CBz/HAy22+sIb94CZ5znJ5xShnXuZajXH5/hHnrnvaw
-	OrXTa36KN+FaIAsWKt10zAsFQg+Xy+zMYiQJxKHHa7nmi0grHw+H2/wA/xWKQ+DQYCSy
-	VR+12y40qmloDgaCnc73mSyONSaShu4HE6Uum1qiUGYgBQ3q9Xwg0SpwQBwM+X0+x4OR
-	UuV6zjAWyIHg4FUFSReLBCPx6LU6oV0h0CYJi80YkVc93w+aWBoOEDWZiYBgMBDieE0d
-	TeUw0GQnQwAeD8nzKYCQIxEGcNkclk8plX2+380Ww/AvnQ5n9AGNEEtIDdMCdQBdVldZ
-	rddr9hsdlkVvtWVtwzuc6FwFvQDvwJwd/wwCA+M6uQk+U8eY7OcP+gc+k5+oiOsE+w/e
-	0fe5tVuDPAUPErfI+vNhvADCl61V7cu+yR8Tx8wf9XB90l+fegv4C/8/7uD6QkBgPAoq
-	wOQsEtICR+QaOkHl7CJ/wmJcKn9C8Jn+7R+wvDsPQ7DZyREdsSPiJAbxQ2cVMNDMVxdF
-	8YRjGUZxpGsbRvHDJwafh7x7Eh1mAXJKRzIihnmeh7ned56MGCTggGybtH8dB0neCoKA
-	evQCNYy5+Sod4IAgBiRATGB1HWeAJgkBzjAFHp8ye1QCH5DZ+H9AoCtZDp0nUeAEAQAw
-	IzFIsbsuzLNt20DQtG0rTtS1dCUjG7vNuZQNUuCtMt7TdOOMAdON6wzggIop6tUAr0uH
-	TzhnnVswghVU21CodQAE4bDU21kMnRXgKV9T0Pn9UrUATDMOntZC9ANDLmHi/8NwzY0L
-	w3YNoWif8dw6cttxIdsTRQG9JI7CdxXLc1z3RdN1NlHcenvH8gyHdd53pet7RVQzNM4z
-	1FA40QMQW0wG2JU973vSjbuxNTSOI39NuHWuH4bVeG4riTiuMw1bqHigAtZXLK2ujjJQ
-	zDbDQ7kVpH9k8MQna2U5flEJ5laJ05seWcW/FNJRbg2fZ/oGgyLdsfHbIEhaFpOlaXGF
-	80RflFX/gNHATgumXKXGsmTrer67pgk7AG2xXFnuvbNs+0XFol36NeO07fuF6adfYL37
-	f1GAlgWCUhuManNv5dcC9++8JIs/gQJvE1fslycLx3H8Ltd4aRyHK8tfDMX1RN+6lRuB
-	0fPPL9F0fSMnsvS9R1Nz8ltvKdV1/Hbnzeo7xvXQdh3Hc670/dd73zY9Zo95d/4mldlq
-	FF4Bz299D4vnefSPeeh6fc+Dt3qexdfj7rzna6pq3s/D8TYel8fzcf63XfP9cbe3u3O7
-	z7++fZ+ns/L+v8a79Ph/z/rZPue68p+Ln2qvzdgNaBAIoFOHRgu5Xg6AQwRdEN6CilwN
-	QMZ8kod67oLL0fu/6EDP39whhIa2ADtIBO2gK811QW4XKjE5DF8CKxUw1GdDcRMOV1CR
-	h4EOHwLIgI2iACwZERT0s/EPEkDcSwvRNg842EsUWDQjilFUAEJ3ktTgJDN0gV4vCwjA
-	fMPAd4yIPDoLWNAL41CmjYekUsb4kiHN2BGOgWY7NgCTGaNAtY1AvjYKY9IWJBA6kIMe
-	QwnZEBkkVDcZ0CgRHtFUI6SR1hEBFksLGTB+RJCVk4ekUMn4hrdDRKMaMpQtSnFdKkaU
-	q0onaD1K+P4JJZCklpEsDYgZcSpFcsSTglQZy/GfMGUYaGbDpDjMcN8yQozLNALaZ0EQ
-	Qx7QKAeTUvZPSgiCi+D8VpuKRipN2EkWDPvwhVFx0bgRdCvnUJedge53R0AiGOeQYp6B
-	AnsEafAX59S0FIMafwYaADjoFOwS88J5BjnoGKewQA2UNPqA+Y4cQ10TEtRUFtF0DhVl
-	OFqgAYZfgzCDSGUo0Rd0lkQJ2iolhMUrGXS2dQr5BBYB3TMK1NY8AypxDEThk4/0tGWI
-	uoEZA7gxqIbkDItKkCKqUJ6pg4qnIDEID2qVJ54BCqsNSrEFhAVbCpV0HNX5nC2goN6k
-	9KaViYp9S9GE25wVtRsjsjI+B3DuHYNMZ4u1kD2HpXuvi7iFFOPMtRC6LIoVuMqzgeVe
-	Z4TTaWp5TxvQBjtHiAZf8tgO2XN3Fp5jqociJnhF4K9H5KHDnQaBEQ5AmWpcSE0btrap
-	A9GvbG0R1rSOBNAFO3ETQvDMt4ywfwv7gVYGpJIR0mBYwaE/ckUVy6QhBq6FRf62xy3G
-	uSJ+moVoijIMMF27lrwzXfMmDi8QubyUPHhec96mQKjQvZT6fkywoggvk1sZMcTDDbvw
-	sQJV+5VjSMMCvAAwsBXPufdFbdxkIi9rXYWw2DUbIbXcq0ecGpi3SqcOI5w7INV9R6jt
-	cVp0d3yBAjNDo4cTQWsYjK06CwFYtUIt2/oHsZSOY2vVWIA3DsCngwrGQHpbXqQWA7IT
-	h5zOipidIOY2MlCayZakJhk0TR4oEONTwwMrCQyxbgKeTBNZOygfG4Vwo4rNqsEKHwQw
-	a5pyQNzNkvUM0ZvEDgN2czJgqzsdQc+UxB57MNQvLAkAYaBMNmwbk+gvjF0Qay6+LQFW
-	vFZo8O2kaT6GksEUyZ5BW39lwIGuIKdPYCGFnHOYbs652tXgtkeDtVI0Q3XHCUGlu2nu
-	lhmDVea44eRwju9g0LzjwB9r9ZSM8lDYwlmkGqNoEDWQzgAFa4q40+OHsbFK9VPTTYFQ
-	+9VRjQK+ApPA9ORIDOj2YM3ck/J/DGqYJ6uN3wzUno/qBV9z6P3q3Pundd36TyvD1sa6
-	9QBFnmH1O4PYm+CCU4NSPQ1ugP8LCPw21o3TDB54lobZOoM/jT4xnFZqozDQazPIyuY7
-	rQZ7EGgGkou7+5xulVsQGZQn8v5ICfmW5Bm1fByeIKFPuSXE4aEfh/EeJz6BR0PVGq+j
-	IyQ3X+vizeQt/HNnjkKzVS1xZMUOthrdejB61epsQNuOIyrjca/YSmBI2mLzTsa50O0j
-	4fa83a6jhqjmnoyh6C1/1G24q/Rjh+vujr5IQHV/YH2gYFngP/hwneJEN4u6uIrEeLEN
-	szwhpvDeI8SETzFZ5ZAkpegGogMaHx7kMMfgUGpdUd4fwDsYfvWYmHDk6Cx6TkDqGH7U
-	1gXPceuWJVCox0Afg8+Af9rIuLqoZDh8eR0Fpe3Nk+KHHuXOncs9Ra31V+/WB+Rn1fo/
-	2zKIdr+u5ZsGvZzF17hKvPAOqox4rgLX4Ps7AqRz1oYKG8yo5Q3WeRQZNprn9deQXLQI
-	GDYzGpcRTxZRYhgRBbbgC0BaLQ/5ZTvp4gb8CSWzYIyQdcC6h8CoykCQb8CgvQ2TkLvZ
-	P5Zqh4wyvLRgwyB5YkEoyRDb2aoxFcEg+oyZdxdxBavJU5U495HZYhGcFQ1EFhGj7T7k
-	IgoZDrgEGpHrXrkJbrCSviuLgBDqwjVJLgy64zKaFwLcBYCxHLXqTQOUMCI5IrdLOL95
-	eixAU8NJZS64/5QhiA3pU5w4/5gTbieCh49LRhUZT0IsPhecIcPro5DI97gCuJUqxBZq
-	vKv6v5Hb9I17pyHgSLEShL/ZHATMSxBajJcSpAWjkK3Re5DoVcULRAYqhoNgE0U5QhUZ
-	UcOJP8OY0yh5YhYhZRU5kEQEWxxkKkW8XRDY96v495Upd0KA8xDpHbq6dCTQNMZJCoJZ
-	cQ+4cANsaAVEaUNpSQbMayqAUcbJoS7LyCmKOwLMAZGsVQ4JZRZQ/8WQvRw5TZUccMXU
-	dxG0P8d7BxEBDY7UXwy7gA98esfY1iuJBIQq3gZkSEU4Exc8Uqj6jrtRC7m0Ta9RoSB6
-	iLIQByzpxZF7GpTaxw4zuRPA1SacdY4MWseUkRGseMkatpkUfZDhC8KJYKwbqyKDh7/L
-	oYFARkmsahcrmj/K7MShcqhMZbLRpZHbyCl7ggTYGko5GZiw3sPQ40WhiJWw38k0qRGU
-	ksqacBlJmZaY7UKZspDMUIVbJDlihJejnr3ALi7gLpejLiRis5s74cZINL44OCZIN5GD
-	GsPYocN5Thisq0vqbTBkv0W5kR0xCav6iLBMr4F0xReg7wOsxykcvBdcawbJE0Dht7C6
-	mK9QUEzaeEu0qIyUvkwM0RF0qs0cPjQi57mQE6nTssPxCcADTbnBn6WzUAEc2xt496MT
-	R4Vkr7rs0035e00s4DVcr4NU4w/gQUuBn8NIU7P6+hoTQzwAM86ZxwWU6yg7gUuU4c7Z
-	c04U7iKyv7JA703bz5n4981S6r3xoS5YUUTaSByr1y540C6sis78+z7MwE+7Bysa67ET
-	dMiRoSlM6wWT4Zpbpyi4FrDMdpvo96M1Acr8o4Gk/VCZFU71Ch+iXU6YM768aANppavK
-	Rz4cABrsmcaQVFEZ0il7djw4P8UtC9F5kM/NGB/w98xwOq403aj5rsf64U5hs6iYNaRz
-	JB1UDjLSR0/7IVGdC9C1JR4s+KrqWz5sIJpbkIEtKxSs2wEZs6XSnSsJ3DgEMAOSsM3a
-	nAGVJs+1JlM53K4z/M7L45t6MyvKlJt6DThYD5brIp1M3c4wNTTc5VNU39NNQB0c3I+b
-	TCSE3xtK08xQFzZJf5vtCLP74AHh4k1Crs1U1g01Qcq1QVTZx7C60Dbk9kzpuL/MLbyB
-	xyoTRlFh56v8uTk7TCPtT0kVTtWZuCPajrSIOyMxxzYa17QlKZuKdCqDUB8KGoVNIDyD
-	dlW0wVGVZhy5HbgSP8r7OJyrLTONGxypdzbkC4dcFB7K/AbbLSIbLkMVZ7o1Wtc5oK06
-	0Ch6fhBZyqnznDh6DByyhaMREx8yuLUbKwYDTFBFdTB1dNgJew7wMFg9MNXVBZwq5ssy
-	g50rkixDfx/CP7Uazth9gibtgdjJcxDZAMbIUdEymYHZ0qdFDrZMyJ0Tc8UqRh/0ybLV
-	Mqgkm9jh/1jdmhIrpymJYiN4Urbh0pDNMpAI9YKR1RHZBcZ1eB/pd1IDc7TDZlm5/Nm1
-	qBGrk8tFDrfVhZy1Y8moRinx3rJ1g4MC56KVkCiIRts7Q1qZ9dqVtRFRDrlinVEz9p3B
-	HdTCGK5p3oR9vQbVvigibi2Ia9obOKXtb9tp6Ftlww1yB6mJUc5khx3Ss6XSdB4i/q59
-	vgbStqvMuDmkr7TwFNxJ4txF0AyTBMs0uAPl1EkJ2BdyRyPdMp4hDMLaYIZ40DBrdKoV
-	vQR8s10Z3V0VwxDrkkSwTNnlvB5ySiRk956amJE1sLVa4TLT9qTUHt3ln9Z16hFb2ajZ
-	DdEzt55yDVKwEr0d8B6korUFkD7ZUrdjjAacr81V65y931jj+Ub7/Lll1R4qoTXt4R8K
-	sdSbp0QEorfSTUb995x9+NZhDLyA5QSafjzAIh8K6VBAauCcGB8bET4cmcQFyqrrMrP9
-	euAps+A9TbDKjauNY+Cp8TdhBaSh9j/MAFF0W7CQMuGbYc3bzeEBs2EVM72oYamNsM5F
-	lJ7Ny7wDQk+p805iSCtUkas91APigkTOHBpeHVChDKzrP75rnp/CjNCKoR/D2cgjkN+8
-	XTXbLREy4knmKKJ8XN0ZbstCxFY6Wx/Dmi1bh96Z/NBDdLY0qyxCg7h83aR2NM4N61m7
-	c60Cjcf8CB+rSq59DSEkuRf6MU0yXtFl4UoGQJdWKc0RDNs4Rrfy6rtKELBKYdwGRJ/I
-	WeU6TTk84aRi57J1rkDWS5QmTMqyDS3Vbsr6y4DqKSj6MWKCErCSoxbuNEvxZqjrKaSC
-	aGWJIuWcka7K6666SmUp/0r6zraEz6KrmzyF4s+0SEf7Lk2WZUeGQdNV3KSinTU6KxDc
-	magmBytuJowyqFC6nyjNoaztPOcJ8mcdC7XtsLp0r9OytsotEzBLBq4AX7fT0dGbXq3S
-	YqSGgGfA2eZj7meZA7nDf2e6Ehdzza41CLBqv5hTPE1tJS4izuc5xOiGfONdC+Bbkmb4
-	8TVapQRRSs3b7bSrUedFNS7K0C66OOaWiGiStqxCjsZ03eZLVRZqRz0cgj7aSiB7P9Wc
-	TqJpbqSGXOlEKc/SRjLTJ2TmWDVTiQPLDMosIqnyhN9dZ5DNrlrmT6/elGoCKKlNFis+
-	Sz7jPDZl9eOMIhDpBdy8LdgOQqL0LKqGn16+tx/LCT/Ny83dLMQCYciWmMXS+C6+AljJ
-	bsszCWOCJeKOwp9ikdoafAIzP+YbozQhcDQlUkWzgwSjXanVqGKqHN3M9mLN9+zZ8bLj
-	fSlK68eSmNRjfUeVwDscy1xIYm4a0GH4/mINqe2h6Cvjdi4TTF8cd6RjJzQlwseSozc+
-	o1w2EiU6v9E2FG1ufTVV9bLShaTWD8d7nrnFP8qUtD9uGYMt6hDMf+1OBrzG8GlTo6k6
-	oSTSjcq1fqhNy+wcXUzYUD4dE2KN+aO299FmMVT25R1RUsuCRjTF90vzYyMy0EwK07z7
-	2drN0D2cb5Ds5lR+BG8KEuCYarLTwCXuO0qyXTkiRnD0kcgk3dRmS94DPd4Sfj+vB3Ex
-	/z5rJF3MtE0xDb9+Bez84cuEgiiOlAX3J0syYeJvBtCfB5wtpaib0aXVz0qyYt7oACk6
-	fmg0783fAkTbPCDUM2QNxaQRUaP+vtGHKpuFwDeSX6s+6skcZyaFsNFlSaXVRM37XsTc
-	uEiVbo9/OM4dt6ranU5k9WKnHx7KfiiKzssc0c3ahKv9oCnD/1YMvqYd4UiTCRsuXLC+
-	qwoYXnU8s1q6V/GUvvQ5ebh7zcuClJdzUbUDTCIc4emLgTXAAEdQ3tDuFkv14VMKvI1j
-	rs5/UowzPC0Bw6P7bl4SYbBPHlWnR50ZDNBDZJYiglrlBDLlmc4FsL5o1hU5UfYs0bsb
-	BLgAyajN5PZIyJDb6/AkSC3VbZX0Z3b8W3VxdCTTfRUowxZTlmr9C5cBSoyZw6Ry+lc0
-	wNKtKzkIyaoXYPdw1jTEtBdwwxYijqXseXfRcS6UgncwyJTcgikers7Zf6YowzRjOOU4
-	WfO837BK1Zdxw+TlPniQ1uz7+XdQyRw+4YYlHVZu/B1+Bz+XXg1jStyc7hDpZRDbRijK
-	k+5E78UrdJU75ucHmwyJANriuI17zeUg4MQHjhIrTC3XkA4ZgSuLwFkF2s7jC8ghTer5
-	ANM7gEmbPD+XP/q4oavijfU4XncpZD9LRjgW3sPtNJHZUqvMKRnyvjSrG5w6ha5tCPkp
-	GDaw020Rs5DqvhUvxJgzZNsLlmUBdA4cA403ARs3zCvfzUlxdaYq1ef7hZe5TY/49PKb
-	VfwwovxH1RGBDa/tfrBLXowzgCl+vBoHygBvyxtMP5dzmkya6XsJphBc1TruIxoNcN2d
-	cPoqEI0Fz3yMD5oJDN9d9cDkRp/pUaR1BDZnVh/H5Tcn5hbf5xpf6DmX6RMJt7q67L+X
-	rcvI38WY1QgABgQAgkFgQBg0DgsEg8LhkKh0Rh4Bf8ViUXgsVf8YjUZi0EjsOfkjfMlf
-	0ngoDlQ3lhCl0qAcYmUzmkFeM3WE5cE7hIBAs/oEHhsTiNDhdGns1ichmtMjkaj8Lpka
-	fdVq0nf0FBlbI9dFlfpVhsUFctlWVndVpntAoNChFEh1GpFxiE0g9Omd4qVRvVMrFWq1
-	MC+DJ+FDOHseJxWLxmNZGPYORfGTnoGy1tt9HiFzAGczkYu9RsN6j0bkF80UEkb8kr5r
-	Eplctl8qxu10epAD93U5WDU30FB/BDHD4IPywGmEH5MCmHLAIC6Fu5/Q6nU6UF6lhrFY
-	0L/3T9jVY8Pb8nkjXf8+6eHrdHtdvvjQd+RZ+gJ+22sNlcqm/j2/wCQAw4MgrAj7AS6s
-	EQSmDrLdBKDwc6S3Jo17TtMADyvG7b0vAirywwirWnfET9HpEqCh9FAgxU/CxmrFzeNW
-	A8ZQECkaxkA7qOc6kAAJB7ouYlUfQSASewiuqLwoACoSW8UOpO78mqgrD0Scfzvtadcs
-	v0fUuKAKMvhTMMWTHMkxu+3jfGo4DhOI4LjudODmgHITpSHH6hOw6DtPI7sqH/KMPUDD
-	cNvWeD2nQ952vi+b6vvMsxr0WlJGbSiYBDS4JUyV1NlTToF0+goHVEQ1SA1U0GADBcET
-	rO87AEpjswqgqsDdWo6Vub9cwEEFeQ+qDVyjPysNXDZ52MblkNa+QOi9ZseUegsRHeTd
-	qHva1RAcEdtRuPtum9b6gKxMIUj/coEXPV101bPSCVRIqBKnJcvijTZXFLe4p3ymFgt1
-	QMrN1JZ/2BQJz4KcWDo0JeFBphloIcnZwFHiSsAtioPYvHl5uKiImY6MGPxzIKBR3AFW
-	AFIVYs6za3Xif5tZeTWYkTmZRZqLmbvLYTySgk8N381dcm/LJ1pgL+jWXh2k6UiNJFpS
-	hm0tTFNU5T1QIJbFSENUwNVRVTq5NlEEVhdklKjWlbVxXTD14EFfI1gZ/UHKtiIq79jH
-	nZBuWU+Vmi9Z+lsSphscHTpUuoE/EK2BiYFZxsDXm6hM8k6g28rIUdTtk13Xa6C+qi/x
-	7R4SfRhf0oedPDMp4BKt/Z5f8OT+k9rHua/ay4fQbdyJPd0ejVqE3gpzuLbQRswP3jjP
-	5NLhCmA0ecMvoB16TlJVCAAx5zWySE0lZIJu8DC38PfuPDPXbl2J/bo71+57urdaHb5v
-	JgNX6UyCVHtb0ZJnr/jBguxcDyqGjBfXuKVHg8oEBWgULaBgCoHOYOq157LJyIHUe42V
-	9Bkx8I8CvB1wrqh+qASe6tX5I1+QhhG7BoJaR1ANhc5UNpQHAQzRY4MbDhXDuJK24xxx
-	9nIHQckJlyjlmRnQgg9ZsMFDMwWNwUx0DonSOmdQ6yFLqVAuuZ0P52btRru3dyDZ3YSY
-	aFiYDEEdMZ1lsVAs14VsbUDBSjgQcXcc2XjaDlHcXUeY9P8HqIGP0GhQyBg0TAN8hXEA
-	nZqKIXsi4XANDxI8D8kQ9STHZJV4kdw5NZCdJtW4dAISfE7KFwowJSKfAWrUNxBxMSrY
-	OOIGsr3iA9lkMKWkZx0hNlwhlu8NiCvJDO/5MY0JhCxmIccFEx0bshAGHyZkvniEHEXN
-	EHc05ZA9kSM6bAE5tCAm5AwWw1pwKJjVI8PB1BJTnRcNUEs61uh9kqOwQ88TWhFnovkK
-	b9A1H0CyHGfi8w0z/nOJKLgIqCSYkWL0aNCX4yfAhPh+0QXTg8BJRNt5I2gqJdKC8KFG
-	1H0HGJR9xQJqRNeJgF2kwqKUPUAHPoTlLSrCgphHWiLzg0R+EDA4BUrQZ07n+GkcNPxK
-	VBUOEiogYajS0GEKepRB6jBhfsKqqE2gJiVqpJMPQLasVUErLYIdXQq1fEbWE6jt2ICM
-	rMRoO9aXjh+R4d878XHQVdCHRGMddSxkajNGg+Uao2RuPtHAKUco6MvkxHqPb/KbSAkE
-	ZOQkhnESJoPI2ckkQP1WnfJeO8mpOK3oZKETso5SqflRKqVjB5Xg1ljLOWsZ5cBNl0sa
-	XhBJfTArsU8f6h4go8K+CwoCCXGisGNcFtkGouCRuMcUQlyRH3LTSJ+5wYroCKukKu6l
-	Pxw2eDZdmaIi39NPm8vOz1AZvAyvIuUP9aQ73UFXRmggIqzCMERfEZ9845i7q+FWmlMB
-	QQsucJ8QV/61s3C5ZRPx37rNDBhgkwoT0xyrExLayiBAKnSJhO1G62FCwIHlUESgysPX
-	WugGK/qBnZt3DzidwqBiNQagG/qQ7EJGhaxlIl8IW2OhMmILELGO7PC1x9HyDoV2Yiae
-	WO7Iww8kCDyUvU6kmwnBkygJfKSs32j/j5OlHgdstN/MaVi97s6RAmWxSog996InUutm
-	EOua7jCRK6EdceWg7XZDZWERsAyXBCDnnvOQkM/U0eWGvQV0hFSYvM/6bwK9FZSEvoQK
-	mj71ZyqasvPYc523bvbSYLucnoBlI1Z680WD1HrG3qWhkhQ3211UTO3DkrdFft6gi39w
-	RjXDMncW45wbkiEuWI+5tz7o3TurT+7F2po3dUpd9L94Zz3jvKuW9F6r2UEvffERF8xn
-	31vvfmmF/LnX/EFgFm+BISYGp/gjBRhdVkSI0MndwuN4P2bYnEAdvzWhG3wd/RgQN+OK
-	kS8sg7s8oBkFzwWdpB15z6KBPog7Cgli34gHviWHhlTTB3OTOk5KoCqwSDAc3HyD2AKx
-	jsLDWRLcnyUIMrFTRHctk7hw8r6nQTpKBnLLhiWh8nEsjzRQK0eTKIPO1ecAHQVWw44X
-	j45jiwat2TB4lRAkRcqUKePmaw6vLaeLPrUqOrKJvvPrhxZxZZBE92WckMFljM7VwUXL
-	xDv0bChCzcDfRf910EGuio/IQTgGs7OAbbDbMQkCKFG/PaVTKxkFrXpB2IZtxzgKiYJC
-	D5GHdiHwfLRHVSv7hK/XYjqYcnWCVGoFJ4iHQNPgCPqdGaEnteqe0HyTxBeXfXgYG/bC
-	89wxAgqy5quuWGSMaXwTVz4wluv4xBN3DJ3gLjeSvN6b2JLvgI2+spb8CBv5mvACBcCy
-	h2zg5AuEn04WfThrCuIC34kHvinFuMXZ41VDjvSeQxw5Hjvk3KMlcrqN5jl9QeYiRiNO
-	ZkXOastkAPjgACAggD/gS8gjFgwZhAbhQBhgDhwCiCsiQJihSi0QATCjTVjhQjynkB/k
-	T0kjBkwflCblUrcctPMvO0xXszPc1bs3TU5MM7fs9Fc/QFBHVDiSsl55VNJGNLBFNX9P
-	OVRbdTUNVL1XTFZQNbgT/Ttfc1hDVjLNlnr9rr+tVntT+a9ve1xMlzhQbAF3vF5vV7aF
-	9WN/CGBEWDjEOAcMAOGmp7NWNEOPwyPyVDHTqywNzBLzTazj5zzM0AG0Rn0ir0zp1AE1
-	Qv1hC1yk2GYBsUBI52wF3BY3Sg3m6LCz4BW4Sf4krFnH2w5VHL2j351dJ3Rrpu6gS6xN
-	7Ap7VnrtstU3bru8RP8gw8179HpvDK9i39wT+EoD+Fh2Iwxc/FJVP2h1XLxPQAQsBDnA
-	gLwMYEEBdBQ+QYqI5PMGA6wkK8KKyTBLwwwIIDTDiRD+kxgt8csRtIM5ERPDBLkXFaLC
-	kooxRgR0ZNoOkajjG7JEeM0drquJ7DhIDEETIbVAItruIEfklG5Jh4yc4QrO0FL1SpKs
-	rSvLEsvUgheIMYqEAyur+AGjCitpFqMI0YSOGqjwoJAU8PJIekQPklaWJcmCZJomycJ0
-	nifKAoSiIko79KWGKmgQp5fwcqZtqqUL/QsrZAq6r5OrCcyxg0sosyQf8jp6tq3mvHy5
-	jIustVXLKulzV5kViuoMVo+jDoYooFV0KdeMQaNflNYJI2GQ1inxY5yWSNllgXZo9WfA
-	wLx8o7KOoN0innbI8W3TlUBVb8mG4SlxjvcqjmddBRXU4hP3KO7ETmxo1NpCxBXtJR+J
-	acbfOWVAKX+7tRrXgR/G/gzxHc6InURVi8JmXpiYjWgMU5MdbMXeTBhEwxOY6BmPuwJp
-	B5GB2S31GRHOBlRZseELUHTABPH1majgrmyzxWRZn52S2ehLn526DcZKCPopa6PZ49UV
-	Tw/aa+AJn3qMGD4XGqrxkKulhrTYFIUevLxfFRH6tpwbKdmziVtIa7Xhq9S5L0wTAw2L
-	Ig/AuP0wyMDXvcgDhfFMNkruUR2Mx5cNuSHQtNSck1p4PcePvI2GSJp8q2QQcw1whZ6S
-	0ciZz4x9DXQFZjDVOWtbY8cIuqz0rIsajotuxbFspwaCdrNCWGnd7b3vfd+9FXlzWJkV
-	nWqIbnXCJdHXgp19YFhWJY1kWVZlnWhA1ppfarqWxbVuLHb1wSZod3XPdN1uJd14JJeV
-	6KzexBXxfV+OXf4KYDseB/1guDvEwphjwHfldPcLc9gygOQJYmRhWytjEJFgeapMY8IK
-	LNgsAtX40RdQbb6oo2jyQArZHmBGEkDCIF4HPClmwFX8v5R8kUrrCDZKgXw/ls47BDw5
-	h0d4f0PFQDhiAOuIQSIiA3iM72AsB1OMTboAJvLyD6kMghFKCRDSHRCHWtFIpKwTRdbW
-	DV+8IEipOHjCQCKRS8NRH2whp6oIeD1jgAeOS+IKDwgtC0gUPEuIjHKhQK7s39lddrFi
-	IgSIjA3eBEk9hdVoxiiqYkh8UEySShMAIvDt1OGGdCGMScnS2gWlAmMtpnh8gPlMRgvE
-	Iium0dlK2NTMx9G4AKseWg+I5AHjwP+HjOWihHi6CaQEPSeyCbLISIsR4BTJmUliRUCI
-	FPHgZE+J0UQAxTmrI8w0dYLrNgzBsXUHSmwfmpCKM0lYUQqZtLks8LzVQxPFDOYaSUlQ
-	2bPDqHbBIfTxH/EAcMxpDTImWqyAh7oDvGAxNaRwBJKwNklBGhREFSpqWtA6K0k5p0WM
-	QXgtMgZ5D8la7KGseZ9L4VAo9Cx/pflnpVPqHk/IbyFkPEigh7FOSNMNNQw1CKcSRovQ
-	yBicAR1BB7UOaUladUWLa/mYNH2w0ff22IrrVRcJqQIHN0dTanFnn4ZYdVMKAUygNIsh
-	UoALJFoWRCo8TZpVFIgu5kYgzZVsgZUcjFUKRP8Xw2BJVdpdT4r8P0TNgZaIcDTPktFd
-	2yTFiHMeRFAbHWPLvM2g1aYqUPoXWualZqIFvokdSikkKLTSoyXejcwrDj/qxUyeddyu
-	0kn1SYrNKIu0rpVUotVLmz1esbZBLFA6wzOA5Ta0NPLMK3muASJslbi0+uVTwjBXboUd
-	tbau1F1IeUfLPSGvr/LDV8h/EGxc/7dqsmbEtWlaiHV0kpQ2itDr3WVTHe+0FowATBu7
-	Ry7d0x+W2tNfZgl2Ce1bMtbqRNMxlSMQNQm+Vy72XzvhZW4t6LjX0vvf2p9+LDX8wrG5
-	gkg7w0xt5iGAUzYE3BwTcTFFw7jXqsvim5kJq5XRuhdrGl1r/ytuzja7lf7vT6n5P7EG
-	Ikq2+gPiVicIMIkMR9BaW9n5rYsrPRcxE5i71Of3Xq/diML4WtNhqv+Xn+W4HZgRtt5S
-	xxMwfg645iHDDyafQmn2SKd0WxYXvAFp4eX8u1hm6WWnZQ8u1h4deZHfWSIVcKz9oiGJ
-	zafhLF80bMmqyjKgvRbbtZgfzbS/WmLWZ+0DYrQdjMhajzLgbIytM5YqMRktZuTcG5Pm
-	xc6s8IMqX1ysWfLGYL/Z4x5hjXo/sxaE1IejIlYgNpgvjZVOaAhCykloawF6Eg66Jxdg
-	2uRiMpwntIQKj86qVlda4mgiGm8/Q0upntgmwdRalt/eYDGjiIT82YdYCWbQqb3Tdkm0
-	FnyMTW2TtijW3MrZ30skprwowtcJr5ujHfDb+aC2Fuyguh8T3GuKow3goKyL4Dbx1RGE
-	r5UOs/tmSxerSqg4Llm7bBhvngB9y/DdLNf7mH4OLm2QKv7D50lTQ2xyEb/SLstAWzlj
-	7Q2ltTFXSJK7YIZpQAFpak6du2qDcJF9x59u3wvc+Oi27qvFzvYhAuewL2sQ5dQokik7
-	DCRgmIdlUAt7hoq4+Ue5dLIYerqKoS1bkxmkoLff7AiZNEAbPl1eVY9rxdTr2QbyYG3d
-	0oiCNw4qoBl5U5w9wy+Z7O6OaU1u6TUyjfTO3e+BZd9Ljkfhvlgimu1ruXNWFQcQ3XoX
-	A2CAL9yMNGpGAYvAtPGx79jonBJfDqPTchxeN+yP5ERD0WlS1F45R6TrJamIjES95Lhn
-	rty1/5sOLnF45kmgGZJtVHHQ2hB/Qx8BjKliiGP0foFH8bHdjmhqns/aSd9sJj2/uNPP
-	lsWqMOmoTPmi8u8u8tLqOu/gtvAvBvCvWtfPEuVPFucuwOnuxPaiFEwPkK0JHllg2H4l
-	OCMGXpSC6vAhswTqggRl3EuF0BnFkhyKyHIg+kEBgBmwbF9IVighAILGhhjwfH7khhEo
-	1BFQiFSifgVgfwkqqk3FUEUvfhsHMAQA3wplGBpQrOWBGQsuaH8vuqXvZvGt2ixqyM4C
-	IJaF5PVkxwngOw1oRCVosAiQ4D/NmJZFSjkwpg3wdJZBqQ9gdw+kHB0RAHJw9hqAgRCw
-	7jOBtQiBFI6nmo6nOF3DjgWELGXv0Agt7gqBIRMuAh/kStdvuvvsCwwgNM0N9pJBlxTh
-	hxUijoQBkxWw+gdoDhVRZJYPdgeRbPzIzJ+O1HcnCENHalUG0glGdhnvghvRjQ7nNBfR
-	lPgiunYHORjBvEThEGEE4JSQFAbRsGkjERXxCggRPObsPwKHgEQRuijv2qyJTAHlHm9g
-	1nOQWoApluewNC7vkrkCGQPQQCxwRDUQSCFQTQUKgwViCQWwXwYnIwaQbBmwcGbQdQeF
-	xwfBjwgEhwhwii3wjwkgfwliPQmkMQnwow7wqwrmDQshGQtq7wurcwvwKwLB/uerhKHJ
-	SESw0KKlbGjhapYI/FMGfgSosFwq3vhhJQUoyFHv2mUQUjaFwrCHOPBv1IblUSgEoPJE
-	UqpEfRLlMD5B3yskvGmg/DDJcmxSUMxyVEtMzANQxqeJrRThlxUhhnUtUiMK3j/Qol3H
-	4q3gky7xgj/RMhIH4nPy/AmI/JOhJvAmQwjkSkHFMDfEFAXQdGpjfBSzIDFguzJsSnUi
-	jmUGNI/C8OtOaxwNQuvnfyyxSR6jEPgmNS7gksnDVLCEco1EPEUnNRZBVENOEgtGVDKG
-	tBYIzHmoCwFCVvLzai/hYzJgumUI1BXzkTFvqm+lUBGznE5q3ySGFH4kpO+KWogQvTQS
-	VztrIwMANyXrKyYjSSZxSqLybScEKSdGfyekmSfvhyhEnSiFiyjKgykEmSlGeymGPynC
-	5yoDhSpEMSqC4yrCvysStCDSuSvOpSwObTsvGSVtihlN3LkiIHmkzCKDEIUhzysh3hW0
-	PF5HHgPQrBpJvGWnRxLiio1C8HRkoD9JYQnl9R0kfO4AWlwwPGWoeD/EUwZF5EwC+hoE
-	uQoiuncs7u+SwuIyyMDEwRSNUwnl2S9pK0fw1gOijuDmOGOwUoCtpUQu2g0UvHJjF0pv
-	JF5R2AT0zC8T+AyTnBGzkBXs7zauDwFFIi2mYj5RlBfAv08sStNOpMfxwvwGGyylormr
-	jTZCzgwVEIQGHpfuztmCMESmUPMgy0PBWiMAo1LhZVMk3BaVOC8S/F2Hcsgp+EPFMEcq
-	PhjVUEvDyAniVlKi2x2K3m+vAr9OBizl9RQTuTuTRLzyaITULCJ0MCGUNUOVKUQHH0R0
-	SjH0Tt70Umo0VldUWik0Xvf0YpTUZu4UbFl0cGCUdEMUeDG0fC+0gnMUhjNUiusUjyxu
-	wUIvHvmVegBSuKhgey/I1P2zay1FvgVV5CijZIRDZE3VKUVC7oLHmzZJYDEDZVVxBk5y
-	IRIyMCVmQ0ABLlIv4gUAcWL0LgEvLiuxgvosuVbCWnb0kEspmkwSzqLJKpYFURFGW0OD
-	FhK2YHUwgjZCjqqmcl3C6u2rCSgGki6qq2dvhjFmJqpUaF3SgDaSSG+wFOzx2IdJbwZQ
-	PGh1EAwFOSTPDF9UHRxFV2SiEVBtXjVREHJ01x0xEF2IdHYEUi8UvA0F2FPTZDEHmzhE
-	W02jEGFThFPD9C2uDxLvduDxAB0BbXApfvqkSlrGhl8QPSgVJEUsOOGi22sSUztVcwK1
-	dgMCMIm14qh16Go17OE18Fv19iJV+ls1/iPWA1nWBlm2CxZmZ2EDMWFQ92GQfWHQk2ID
-	sWJWKP42LgcWM2NiBWOp9Ndl9WRV1Od12QxJQM4iHKuWYBKoyIsSMKqlNQgmni2jFoC3
-	SgoVKJYC8XsiipYTUHUmSgHJ+HJo1H4oLP1GphCX2JbxLv2t6F8EHU7i8TUO8sK3hmg2
-	RpmUlCEIV3lLjUfuMjaRoFrJCniE4ENC6vJHYO2i6l3W1ygCjlONpW1oyGhnAiBU11UB
-	jOMnR3dxLlPTiDaGuENFo21lK08gvlOPEC2103JOJD2EwIVtYR7NsVMhZSbIzGXtmEpO
-	MhrYgC2ncxgza23iGRL02xL1KC8VLgozhGuPqvLpDnCPgxhkfFrXxw7q3k1E2Czgi4vg
-	h4wyOBLtOO9B/YX0H3JudSyqyYAXmWYXnohXokCXpkh3qi1Xrj3Xs3tmZ3ujME3XvmZ3
-	wlt3x3ylh3zl7X0mP3132o5X3li34klX5xlX6y737tf38h239udXjgNFowNgBYan2B6J
-	boLXLqKk5kNOmAA5T5WKzi8QCC92/s3iHMZIRDaLSvLvBi20ODZOUsZLrstizo+XiYYU
-	krf4ZmbZWrNABKHC8IyIzJZIQCupYP1O6ttAAJKiuunPRh/GXlojEC2pYI1PBiuo1Czj
-	EJYJaKrq9vni70+PDH85M5N2SX+gMqyUKKe13AAmEKyN/CGJaILPPZ9ta5WkrEfJaENC
-	ui8I4B6vBxNpaL6IRJbzNsrNMsviBZ53i41MhVBEDZQZRNFiSZSlm5WjDZUjA5V5Wso5
-	YO7kq5Zj4UFLoZbiKZcjnZdi1ZejMZfro5g2Pie5iX9aNth0In7ozExi8IQN/uSNauSa
-	naXZs595Yj0iu5w53SWMZO8rSvoXgvpNuvSi26uLTmXs256EqpmmnkNO7NsNU5V6lumP
-	Q6oakpqHgO8xN6tLouBxNs8vSuoPpGXoyazEr60D4ENalQBNJ5V7Dtsa16DC9IQFWiBL
-	6a8B/6Kh/ZgCe7Law536unZaspWiu7AEnbBaOLHpm6jISakC77F7F6WC76n5XZm6oZW6
-	puwh/6rB/RN7P7L686r2Pa/beYzbNgAFQayHDbSMRKomqxWhk7S7nbnj1TURsAbHeqpb
-	mbobsbs7pRsHgbrRW7s7wbnbt7qbwsQ7vbm7y70zt7x3JiulNJvWBb1b5MQlFGQkNHe7
-	3oN74757+KA76jsb7nf78hdb97+8DHgb/gm8A8DngcB8C8GcIFV8E8FztiAgAAAOAQAA
-	AwAAAAEBKwAAAQEAAwAAAAEAowAAAQIAAwAAAAMAAE9aAQMAAwAAAAEABQAAAQYAAwAA
-	AAEAAgAAAREABAAAAAIAAE9gARIAAwAAAAEAAQAAARUAAwAAAAEAAwAAARYAAwAAAAEA
-	kgAAARcABAAAAAIAAE9oARwAAwAAAAEAAQAAAT0AAwAAAAEAAgAAAVMAAwAAAAMAAE9w
-	h3MABwAAAzAAAE92AAAAAAAIAAgACAAAAAgAADxpAAA8YQAAEkIAAQABAAEAAAMwYXBw
-	bAIAAABtbnRyUkdCIFhZWiAH2AACABQACQAkACFhY3NwQVBQTAAAAAAAAAAAAAAAAAAA
-	AAAAAAAAAAAAAAAA9tYAAQAAAADTLWFwcGzca/2adJ31+wHADa3hluLpAAAAAAAAAAAA
-	AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA1yWFlaAAABIAAAABRnWFlaAAABNAAAABRiWFla
-	AAABSAAAABR3dHB0AAABXAAAABRjaGFkAAABcAAAACxyVFJDAAABnAAAAA5nVFJDAAAB
-	rAAAAA5iVFJDAAABvAAAAA52Y2d0AAABzAAAADBuZGluAAAB/AAAADhkZXNjAAACNAAA
-	AJNjcHJ0AAACyAAAAEBtbW9kAAADCAAAAChYWVogAAAAAAAAetYAAEGrAAABDlhZWiAA
-	AAAAAABWlAAAqnYAABlyWFlaIAAAAAAAACVrAAAT9AAAuKZYWVogAAAAAAAA89gAAQAA
-	AAEWCHNmMzIAAAAAAAELtwAABZb///NXAAAHKQAA/df///u3///9pgAAA9oAAMD2Y3Vy
-	dgAAAAAAAAABAc0AAGN1cnYAAAAAAAAAAQHNAABjdXJ2AAAAAAAAAAEBzQAAdmNndAAA
-	AAAAAAABAADvpAAAAAAAAQAAAADvpAAAAAAAAQAAAADvpAAAAAAAAQAAbmRpbgAAAAAA
-	AAAwAACkwAAAWQAAAElAAACaQAAAJhcAABLbAABQQAAAVEAAAexDAAHsQwAB7ENkZXNj
-	AAAAAAAAABNMMjQxME5NIENhbGlicmF0ZWQAAAAAAAAAABMATAAyADQAMQAwAE4ATQAg
-	AEMAYQBsAGkAYgByAGEAdABlAGQAAAAAE0wyNDEwTk0gQ2FsaWJyYXRlZAAAAAAAAAAA
-	AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdGV4dAAAAABD
-	b3B5cmlnaHQgQXBwbGUgSW5jLiwgMjAwOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-	AAAAAG1tb2QAAAAAAABchQAAUYAAAAAAwmQcgAAAAAAAAAAAAAAAAAAAAAA=
+	TU0AKgAABXSAP+BACCQWDQeEQmFQuCv5+v1rr9cvN2OqGReFgYEgsUkEjAkHA+MSOSQu
+	BP+SymVM1YKljqVPAB+PNkOJ6hMFAYEAcCAIAgB/v5/PZ8vt+AICAqez8AgoFgsKggBh
+	8YjUmnpCSqtSOT1uvQteJVGNhgLsAP5+PF7Px6UWHPsDgsEP+H0UAgkCgB9v8BAd+vl+
+	A4IhcCAAGhYLl9KqKv42D13HZGw2OygC/uZ6P8JAsCgWfv6UP2fgODP98Pl/AgDAPRAO
+	pYbEYrGZHHZDaV/J2Rdvh6vJ0PoCAV9vYAzt70R8v1+PJ/AQJXh/vd78ADBsKhIJYXD4
+	nF7fG7bvVpkrFSuhtteCv19v4BgUBd4EA0Gkcznfw17wfeSsZfqRvG0ZT9IQBgGgmKAt
+	D/ASVPzBSLv4/0AIKfb1s697bwJA0EQaksGQ2hUHv/AJ6naZxyn4BB/AEBJ+nmej2AAu
+	IGH8469gKBIDgeB4CHuAYHBACQCwxA8Ew8jEOyKg8QQjCZ8OUdB1H0A4Bn4fyzgAAwGA
+	Ceh4n+BIELOf4FAqBoDH0ACngJIUNSQhkjzYgklQDD01SJN6EzdN84yLOk7IVPE2MglC
+	DnzQgBUMzq8oOflFnGcZyADSAOg6DgB0qglIUhPs7oHTSSHhT5z1CE9RnDUoIVPQwBHj
+	VYPVadVXndWNWg8BVa07P1OVux6BHNXp7V/WdFn4ctiBNYyHn6bVlBTZiCnpZ5yWiCdp
+	gratdILP8kUIfJxW6BNvg3cNMG7clqgqB10IKbl13CDdvgSgthW6cVU0kDtKtJPtswbT
+	54VCc4M4DU4IIKeWDHXhAR4UhB0YbfFzIWdOJX7e1agVN99tuk9enNX57VmA+QoRZRtX
+	ap4FoQeeVHblgQZcjFnnpaJyApmubSLjLGn1nd5gRn120whB36HVZ45cECFqEfxsaZZg
+	U6Ci95W7fAOarfD9ZyrWi44DGugjr6TIEbOx6Pn0voub20gvteTq1hp0aLWd3u9rKLpP
+	f+Yg/vWQgOjB2b/j1ZpLV51JPtYLq/lR52IcubZu2tcq/nZ9Xnvl21SjGlbGbOFBGA3P
+	pKevRYkdIRdMyMJn3Rpx3xe3MQXyKVa3XvDuwCStdJYV2q0k5r98FXgP1t+41buaSZzf
+	uhnf1NZ7MrWZlF6I7+nq6vEr6+nCF7T9cVmd366DHnVwf5+HwfAAZ8wqEj/9lED19/Xo
+	T8x8fEgxefuan8jh/aR/Keg/E0gIfUAAWMBVkBSgQd58r52fD/QmGWCAPYJBjgo2Ef4r
+	BLiXHMbwe4+QCAVA0A0tKKQADyHAPAAQEQHgNA4BcBoN4YNHOkOYS4ixNvLAMBUB56oU
+	j2HcPMCAGgLAOAMccBAGALgKACESJi6AHDcGOKsT4thrACHyPgAwEwPgeAkeono8h2Dx
+	HyAEA4EgOAfBMBcCIPI2KIIwKgSglB1D7HwAUCIGQGgCHuPQeA/QCJaHCPBHoDQFAdAw
+	A4k4qhTilAyB8EoD4BATXCXgArRWPDqb+Pd0S5gaydGXJ8d7fwKtdYGxYgslmhjqOkAJ
+	RbVQOAolgLeWTn4sgQQIBcDYEVaseaKO5hA9UJgXZqxYEYGwHjqfoBoCjBCDipFMKMDQ
+	IATgWAmA9gaiGitFHequTQ9STidEmI0B8QxxjqAYCcEDBB9lqj8PQfA/wGATAcAl8isw
+	Wz3GSMkX4zRkjcAmBUA5vUYD/HgO0AoFgEj6HeP0fw+wCgaBUCUCYBmvgRnuC0W4rhOj
+	fHOPIAYAQHAAHwZkBgEAKQuAAPcd413WAxBeBoEzLlt0XIwJoSAigJAZAjOUBgOQgAsH
+	2Nsao6Z2j4HmPYfYEAPgXAMQEAAOAQAAAwAAAAEAMQAAAQEAAwAAAAEAHAAAAQIAAwAA
+	AAMAAAYiAQMAAwAAAAEABQAAAQYAAwAAAAEAAgAAAREABAAAAAEAAAAIARIAAwAAAAEA
+	AQAAARUAAwAAAAEAAwAAARYAAwAAAAEDewAAARcABAAAAAEAAAVsARwAAwAAAAEAAQAA
+	AT0AAwAAAAEAAgAAAVMAAwAAAAMAAAYoh3MABwAAEOAAAAYuAAAAAAAIAAgACAABAAEA
+	AQAAEOBhcHBsAgAAAG1udHJSR0IgWFlaIAfZAAUADAAUAAsABWFjc3BBUFBMAAAAAAAA
+	AAAAAAAAAAAAAAAAAAAAAAAAAAD21gABAAAAANMtYXBwbJVen0LicP943/D0/Jmv3/MA
+	AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADnJYWVoAAAEsAAAAFGdYWVoAAAFA
+	AAAAFGJYWVoAAAFUAAAAFHd0cHQAAAFoAAAAFGNoYWQAAAF8AAAALHJUUkMAAAGoAAAA
+	DmdUUkMAAAG4AAAADmJUUkMAAAHIAAAADnZjZ3QAAAHYAAAGEm5kaW4AAAfsAAAGPmRl
+	c2MAAA4sAAAAZGRzY20AAA6QAAACAm1tb2QAABCUAAAAKGNwcnQAABC8AAAAJFhZWiAA
+	AAAAAABdqQAANwEAAAb2WFlaIAAAAAAAAHMyAACzEgAAIKRYWVogAAAAAAAAJfsAABYI
+	AACri1hZWiAAAAAAAADzUgABAAAAARbPc2YzMgAAAAAAAQxCAAAF3v//8yYAAAeSAAD9
+	kf//+6L///2jAAAD3AAAwGxjdXJ2AAAAAAAAAAEBzQAAY3VydgAAAAAAAAABAc0AAGN1
+	cnYAAAAAAAAAAQHNAAB2Y2d0AAAAAAAAAAAAAwEAAAIAAAAUAEYAkQD0AWAB3gJrAwgD
+	sgRoBSkF/QbgB8UIsgmtCrMLvgzNDesPBxAsEVcSixPCFQIWOReBGMgaHBtmHLYeCB9c
+	ILciFCNiJL8mFCd4KNIqJyuVLPIuTS+qMQkyZjPBNQ42bDfGORQ6bTu7PRI+WT+hQPRC
+	OUN3RLZF+0daSM1KLUubTQZObE/LUStSlFPvVVJWt1glWYJa6VxQXbBfDWBlYb1jHmR+
+	ZctnImh4ac5rK2x6bcZvGnBjcahy9nQ4dXZ2wngAeTt6dXuwfOl+H39NgIWBroLXhAKF
+	LoZbh4iIponFiuWMB40njkKPZJB/kZeSoZO7lM2V6Jbzl+uY4ZnZmsubwJy4nbeepp+h
+	oIqhe6Jvo2akVqVIpjqnKagVqP6p56rWq8Wssa2PrnevZbBLsS2yEbL3s9i0tbWctni3
+	Vrg2uRW58LrLu6a8gr1bvjO/C7/iwLbBjMJkwz7EFsTpxbvGj8dlyDnJCcnYyqnLfMxS
+	zSbN9s7Ez5HQW9Ef0d3So9Nn1CnU6tWx1nDXL9fx2LLZdNo12vXbt9x13TLd7t6v323g
+	KuDq4ajiZeMh493kmuVZ5hfm0ueT6FDpDenR6o/rTewL7Mztju5R7xXv1PCZ8V3yH/Lk
+	86z0cvU69gb2zfeW+F75Jvn2+r77ifxX/SX97v7C/2n//wAAABEAOgB5AMoBLAGaAhgC
+	owM7A+AEjwVKBg8G6QfFCKgJkQqBC3oMfA2IDpgPqBDBEd8TBRQxFWEWjhfDGPYaKRtw
+	HK0d7R8tIG4hqCLuJDsleCbCKAEpQyqRK9ctGC5aL5ww2jIMM000izW/Nvw4PDlmOpI7
+	xzzyPhc/OEBfQaFC70QvRXxGxUgMSU5KjkvXTRROWk+jUPJSNFOBVMxWE1dXWJdZ2Fsi
+	XGxdpF7mYClha2K3Y/ZlM2Z8Z7Ro7Woua2Vsm23bbxJwRXF5cq1z4nUUdj93dHibecN6
+	7XwYfUZ+dH+TgLSB2IL9hCGFP4Zmh4SIoYmxis+L6Y0IjhqPG5AZkRiSFJMRlBOVFpYU
+	lxCYCJkAmf6a/Jv2nPKd7p7nn92g0KHCor2jt6SupZamiqeHqHipZ6pXq0usOq0orhiv
+	Bq/ysOWx0rK9s6q0lrWEtnG3WrhFuS+6F7sBu+683L3NvrK/mcCEwXDCXMNDxCjFEMX8
+	xurH2si+yaXKjct2zFbNM84VzvnP2tC40Z7SfNNc1D3VINYE1uDXxNil2YTaYNs+3B3c
+	+N3Y3rffk+Bv4UniIuL649vksOWI5mHnOOgN6OrpveqQ62PsNu0L7eDus++F8FXxJvH0
+	8sTzlvRl9TT2B/bT96H4bPk4+gf60Pub/Gf9M/35/sn/bP//AAAACQAfAEAAawCgAN4B
+	JgF3AdECNAKhAxYDkgQWBKEFNAXNBmsHDwe7CG0JJAnjCqELZQwxDP0NzA6fD3YQUREu
+	EgQS5xPMFLAVlhZ8F18YRRkuGhgbAhvuHNEduB6hH4kgbyFUIkIjJyQJJOElvyadJ3go
+	UykoKgYq2CuoLIAtaS5gL0wwQDE1MiUzETP/NPE13jbON8I4uDmtOqE7mTyOPYE+cT9i
+	QF5BV0JDQzxENEUsRi9HJUgdSR1KFUsPTA9NCk4FTwlQB1EEUgNTBFQHVQlWCVcNWA5Z
+	DloRWxdcIV0rXi1fMGA2YT9iS2NNZGBlZWZvZ2loeWl8apFrmWycbZ5upm+kcKdxrHK3
+	c7h0uXWzdrF3sXi1ebF6sHuwfKt9pH6af42Ai4GHgoGDaoRghV6GUYdAiDGJJooViwWL
+	9ozljdKOxo+0kKCRjJJ6k2mUVpVBli2XGJgCmO2Z25rLm7ycpZ2NnnmfaaBXoUCiKKMT
+	pAGk8qXjps2ntqijqZSqhat3rGetUa48ryqwF7EGsfay4bPLtMW1sLadt5m4ibl3umu7
+	Z7xdvVS+U79SwFLBVMJXw1vEZsVzxnnHicieybXKzsv7zRnOO89s0KLR29MV1FbVptb+
+	2FfZtNsp3KDeHt+y4WHjFOTN5qXoquq87QDva/IK9QP4mPz8//8AAG5kaW4AAAAAAAAG
+	NgAAlnMAAFnAAABUegAAi0MAACfPAAAVYAAAUA0AAFQ5AAJR6wACHCgAAVR6AAMBAAAC
+	AAAAJwBTAIAArgDeAQ0BPAFuAaEB0wIGAjsCcQKmAt4DFgNPA4gDwgP9BDgEdwSzBPIF
+	MQVvBbEF8wY2BnoGvwcEB0kHkAfcCCUIbwi9CQcJVQmlCfcKQwqUCugLPQuSC+kMQAyZ
+	DPINTw2xDg0Oaw7NDzMPlA/8EGMQyRE3EaYSEhJ+EvITaBPfFFgUzRU7FaQWEhaGFvQX
+	ZBfWGEoYwRk6GbMaKBqlGyMbnhwbHJYdEB2UHhQekx8VH5ogICCpITQhwSJLItUjYCP1
+	JIklGiWuJkQm1ydrKAcopilBKd0qgSsnK8gsbS0ZLccubC8aL80wgDE2MewypDNdNBs0
+	4DWcNmQ3Ljf4OMM5jjpaOyc8ATzbPbY+kT9sQExBMkIPQvhD4kTcRcZGvUeoSJ5JrErH
+	S9lM+k4XTzVQSFFyUpBTxlTxVh1XRVh9Wa1a5FwhXWRerl/uYTFieGPYZSdmcmfQaTNq
+	jWvzbWNuxHA7ca1zH3Sddh13n3kheqx8OX3Mf2WA/YKThCeFy4d2iR2KwYxzji6P5ZGY
+	k0eVB5bPmJmacZxpnkugOKIwpBqmHqgZqhusGa4isCqyPbRbtmq4jLqlvMa+7sEcw0bF
+	b8enyc7MDM4x0G7SqtTi1xfZR9uM3b3f/uI55GzmqujX6xTtTO+S8cD0BPY/+HL6vfzn
+	//8AAAAvAGEAlADIAP0BMwFnAZ4B1gIQAkoChQLAAvsDOQN4A7cD9wQ3BHgEuQT9BUIF
+	hgXOBhcGXAalBvAHOweIB9UIJwh4CMgJGAlvCcIKGApyCswLIwt9C9sMOgyaDPwNXg3F
+	DjEOlw7/D20P3BBIELYRLRGnEhwSlBMTE5QUGBScFRcVjBYEFoMW/Bd4F/YYdhj5GX8a
+	ABqFGxAblhweHKMdKh25HkIezR9bH+sgfSESIakiPiLQI2UkBSSgJTwl2SZ4JxEnsShX
+	KPwpmypFKvIrmyxELPUtqC5ULwUvvDB0MS0x5zKhM100HjTkNaI2bDc2OAE4zTmYOmM7
+	MDwJPOI9uj6TP2tASUEsQgVC60PQRMVFrEacR4VIckl0SoRLkUyhTblOzE/bUO9SClMq
+	VE9VclaOV7VY3FoCWy5cYF2XXtNgBWE5YnJjwmUCZjlnhGjSah9raGzBbhNvaHDJchxz
+	e3TfdkN3qHkNend76X1VfsyAQoG2gyiEl4Ybh52JHIqYjBqNq483kMCSRZPGlV+W9piL
+	miGb1Z19nyKgz6KCpCil5aeXqVCq/qzDrnqwObH/s821kbdnuTK7AbzXvrLAlMJ7xFDG
+	QcgsyhfMFM37z/zR/9QD1gfYDNoW3CveP+Be4nrkk+a86NbrBe0x723xmfPa9hj4Ufqk
+	/Nj//wAAAFkAsAEFAVsBsQIIAmECuQMTA2wDygQmBIUE5gVIBasGDwZ6BuEHSge3CCQI
+	lwkLCYAJ9wpwCusLbgvvDHMM+g2HDg8Onw80D9MQbREPEbISXhMFE7sUcxUeFbwWZhcM
+	F7QYYRkTGcYadxsxG+ccnB1UHhAeyh+IIEkhDyHYIpkjXSQvJPglxCaSJ1goLCj/Kcwq
+	pSt8LE4tKy4FLtovuTCYMXcyVjM1NBg0/zXhNss3tTieOYY6bTtVPEg9Oj4rPxpACUEE
+	Qe5C6EPfROdF20bfR9FI0EnXSuNL5Uz5TgZPFlAcUTJSRFNmVIRVola5V99ZAVokW01c
+	fF2wXupgGGFKYoFjz2UMZkJni2jZaiNrbGzDbhNvaHDHchlzdnTZdj13oHkEemx73H1G
+	fruAL4GhgxCEfYX8h3yI+Ipwi+2NeY8CkIaSB5OElROWpZgymbubRZzOnmCf/qGVoy6k
+	yqZep/+pqas1rNyugrAOsbezX7T9to64NrnPu2K8+r6NwCTBtcNMxM/GXMf1yXfK+Mx5
+	zfnPXdDX0lXTwtUj1oTX5NlD2qLb9N063n/fw+EH4kfjdOSh5c7m+egX6S3qNes87EPt
+	Se5N70PwM/ER8e7yy/Oj9Gv1M/Xx9rD3ZfgT+MH5Xfn4+pL7FvuY/Br8kfz5/WH9yf4x
+	/sv/Zf//AABkZXNjAAAAAAAAAApDb2xvciBMQ0QAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+	AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+	AAAAAAAAbWx1YwAAAAAAAAAQAAAADG5iTk8AAAASAAAA0HN2U0UAAAAQAAAA4mZpRkkA
+	AAAQAAAA8mRhREsAAAAcAAABAnpoQ04AAAAMAAABHmZyRlIAAAAWAAABKmphSlAAAAAO
+	AAABQGVuVVMAAAASAAABTnB0QlIAAAAYAAABYGVzRVMAAAASAAABeHpoVFcAAAAOAAAB
+	inJ1UlUAAAAkAAABmGtvS1IAAAAMAAABvGRlREUAAAAQAAAByG5sTkwAAAAWAAAB2Gl0
+	SVQAAAAUAAAB7gBGAGEAcgBnAGUALQBMAEMARABGAOQAcgBnAC0ATABDAEQAVgDkAHIA
+	aQAtAEwAQwBEAEwAQwBEAC0AZgBhAHIAdgBlAHMAawDmAHIAbV9pgnIAIABMAEMARABM
+	AEMARAAgAGMAbwB1AGwAZQB1AHIwqzDpMPwAIABMAEMARABDAG8AbABvAHIAIABMAEMA
+	RABMAEMARAAgAEMAbwBsAG8AcgBpAGQAbwBMAEMARAAgAGMAbwBsAG8Acl9pgnJtsmZ2
+	mG95OlZoBCYEMgQ1BEIEPQQ+BDkAIAQWBBoALQQ0BDgEQQQ/BDsENQQ5zuy37AAgAEwA
+	QwBEAEYAYQByAGIALQBMAEMARABLAGwAZQB1AHIAZQBuAC0ATABDAEQATABDAEQAIABj
+	AG8AbABvAHIAaQAAbW1vZAAAAAAAAAYQAACcaQAAAADCPzKAAAAAAAAAAAAAAAAAAAAA
+	AHRleHQAAAAAQ29weXJpZ2h0IEFwcGxlLCBJbmMuLCAyMDA5AA==
 	</data>
 	<key>ReadOnly</key>
 	<string>NO</string>

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



From dna-commits at lists.jboss.org  Tue Jun  9 19:57:55 2009
From: dna-commits at lists.jboss.org (dna-commits at lists.jboss.org)
Date: Tue, 09 Jun 2009 19:57:55 -0400
Subject: [dna-commits] DNA SVN: r1024 -
	trunk/docs/reference/src/main/docbook/en-US/content/connectors.
Message-ID: <E1MEBCV-0001GA-77@committer01.frg.pub.inap.atl.jboss.com>

Author: rhauch
Date: 2009-06-09 19:57:54 -0400 (Tue, 09 Jun 2009)
New Revision: 1024

Modified:
   trunk/docs/reference/src/main/docbook/en-US/content/connectors/federation.xml
Log:
Minor corrections to the chapter on the federated connector in 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	2009-06-09 23:50:21 UTC (rev 1023)
+++ trunk/docs/reference/src/main/docbook/en-US/content/connectors/federation.xml	2009-06-09 23:57:54 UTC (rev 1024)
@@ -46,9 +46,9 @@
 			<title>Projections</title>
       <para>
 			 Each federated repository source provides a unified repository consisting of information that is dynamically federated
-			 from multiple other &RepositorySource; instances. The connector is configured with a number of <strong>projections</strong>
+			 from multiple other &RepositorySource; instances. The connector is configured with a number of <emphasis role="bold">projections</emphasis>
 			 that each describe where in the unified repository the federated connector should place the content from another source.
-			 Projections consist of the name of the source containing the content and a number of <strong>rules</strong> that
+			 Projections consist of the name of the source containing the content and a number of <emphasis role="bold">rules</emphasis> that
 			 define the path mappings, where each rule is defined as a string with this format:
       </para>
 			<programlisting>pathInFederatedRepository => pathInSourceRepository</programlisting>
@@ -61,11 +61,11 @@
      	<para>
 			  is a trivial rule that states that all of the content in the underlying source should be mapped into the unified
 			  repository such that the locations are the same.  Therefore, a node at <code>/a/b/c</code> in the source would
-			  appear in the unified repository at <code>/a/b/c</code>.  This is called a <strong>mirror projection</strong>,
+			  appear in the unified repository at <code>/a/b/c</code>.  This is called a <emphasis role="bold">mirror projection</emphasis>,
 			  since the unified repository mirrors the underlying source repository.
     	</para>
      	<para>
-			  Another example is an <strong>offset projection</strong>, which is similar to the mirror projection except that
+			  Another example is an <emphasis role="bold">offset projection</emphasis>, which is similar to the mirror projection except that
 			  the federated path includes an offset not found in the source:
     	</para>
 			<programlisting>/alpha/beta => /</programlisting>
@@ -87,7 +87,6 @@
 		</sect1>
 		<sect1>
 			<title>Multiple Projections</title>
-		  <h3>Multiple Projections</h3>
 		  <para>
 		  Federated repositories that use a single projection are useful, but they aren't as interesting or powerful as
 		  those that use multiple projections.  Consider a federated repository that is defined by two projections:
@@ -141,14 +140,14 @@
 		  <para>
 		  Note how the <code>/foo/bum</code> branch does not even appear in the unified repository, since it is outside of the
 		  branch being projected. Also, the <code>/alpha</code> node doesn't exist in S1 or S2; it's what is called a
-		  <strong>placeholder</strong> node that exists purely so that the nodes below it have a place to exist.
+		  <emphasis role="bold">placeholder</emphasis> node that exists purely so that the nodes below it have a place to exist.
 		  Placeholders are somewhat special: they allow any structure below them (including other placeholder nodes or real
 		  projected nodes), but they cannot be modified.
 		  </para>
 		  <para>
 		  Even more interesting are cases that involve more projections.  Consider a federated repository that contains
 		  information about different kinds of automobiles, aircraft, and spacecraft, except that the information
-		  about each kind of vehicle exists in a different source (and possibly a different <i>kind</i> of source, such as
+		  about each kind of vehicle exists in a different source (and possibly a different <emphasis>kind</emphasis> of source, such as
 		  a database, or file, or web service).
 			</para>
 		  <para>
@@ -336,7 +335,7 @@
 				<listitem>
 					<para>
 		  			Process the incoming requests and for each generate the appropriate request(s) against the sources
-		  			(dictated by the {@link FederatedWorkspace workspace's} {@link FederatedWorkspace#getProjections() projections}). These
+		  			(dictated by the workspace's projections). These
 		  			"projected requests" are then enqueued for each source.
 					</para>
 				</listitem>
@@ -354,7 +353,7 @@
 				</listitem>
 			</orderedlist>
 		  <para>
-		  This process is a form of the <i>fork-join</i> divide-and-conquer algorithm, which involves splitting a problem into smaller
+		  This process is a form of the <emphasis>fork-join</emphasis> divide-and-conquer algorithm, which involves splitting a problem into smaller
 		  parts, forking new subtasks to execute each smaller part, joining on the subtasks (waiting until all have finished), and then
 		  composing the results. Technically, Step 2 performs the fork and join operations, but this class uses &RequestProcessor;
 		  implementations to do Step 1 and 3 (called &ForkRequestProcessor; and &JoinRequestProcessor;, respectively).
@@ -369,7 +368,7 @@
 				the path to the "<code>dna:federation</code>" node in that configuration repository containing the information about the 
 				cache and federated sources.  This graph structure that is expected at this location is as follows:
 			</para>
-			<programlisting><![CDATA[<!-- Define the federation configuration. -->
+			<programlisting role='xml'><![CDATA[<!-- Define the federation configuration. -->
 <dna:federatedRepository xmlns:dna="http://www.jboss.org/dna" 
 	                   xmlns:jcr="http://www.jcp.org/jcr/1.0"
                      dna:timeToCache="100000" >



From dna-commits at lists.jboss.org  Tue Jun  9 20:18:55 2009
From: dna-commits at lists.jboss.org (dna-commits at lists.jboss.org)
Date: Tue, 09 Jun 2009 20:18:55 -0400
Subject: [dna-commits] DNA SVN: r1025 -
	trunk/docs/reference/src/main/docbook/en-US/content/connectors.
Message-ID: <E1MEBWp-0002Dc-2b@committer01.frg.pub.inap.atl.jboss.com>

Author: rhauch
Date: 2009-06-09 20:18:54 -0400 (Tue, 09 Jun 2009)
New Revision: 1025

Modified:
   trunk/docs/reference/src/main/docbook/en-US/content/connectors/federation.xml
Log:
Added to the Reference Guide more detail about how the federated connector can parallelize the fork-join processes.  Also addressed the limitations of update requests when such requests do not map to a single projection.

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	2009-06-09 23:57:54 UTC (rev 1024)
+++ trunk/docs/reference/src/main/docbook/en-US/content/connectors/federation.xml	2009-06-10 00:18:54 UTC (rev 1025)
@@ -358,8 +358,46 @@
 		  composing the results. Technically, Step 2 performs the fork and join operations, but this class uses &RequestProcessor;
 		  implementations to do Step 1 and 3 (called &ForkRequestProcessor; and &JoinRequestProcessor;, respectively).
 		  </para>
+			<para>
+				Such fork-join style techniques are well-suited to <emphasis>parallel processing</emphasis>.  This connector uses an &ExecutorService;
+				to allow these different processors to operate concurrently.  This can greatly improve the performance as perceived
+				by the clients, since indeed much of the operations on the different sources are occurring at the same time.
+			</para>
+			<para>
+				It is also possible that not every incoming &Request; get projected to all sources. Indeed, many operations can
+				effectively be mapped to a <emphasis>single projection</emphasis>.  In such cases, the overhead of the federated
+				connector is quite minimal.
+			</para>
+			<note>
+				<para>
+					&Request;s that include the &Path; within the request's &Location; can be very quickly mapped to the correct projection,
+					and thus such federated requests can be processed with very little overhead.  However, when requests contain &Location;s
+					that only contain identification properties (e.g., UUIDs), the connector may not be able to determine the correct
+					projection(s), and may have to simply forward the request to all of the projections.  This is obviously less desirable,
+					so when possible ensure that the &Request; objects include the &Path;.
+				</para>
+			</note>
 		</sect1>
 		<sect1>
+			<title>Update operations</title>
+			<para>
+				The federated connector behavior for <emphasis>read-only</emphasis> requests is fairly obvious.  In the best case, the connector determines the
+				appropriate projections, forwards the request into the appropriate sources, and then combines the results.
+				But what happens with <emphasis>change requests</emphasis>?
+			</para>
+			<para>
+				Currently, the federated connector requires that each &ChangeRequest; be mapped to <emphasis>one and only one</emphasis> projection.
+				However, when a single projection cannot be determined for a &ChangeRequest;, the connector throws an error.
+			</para>
+			<para>
+				This is thought to be a minimal problem that will not actually be an issue in most uses of the federated connector.  
+				If you find that your usage does indeed fall into this category, 
+				please let us know via the <ulink url="&Home;lists.html">mailing lists</ulink> or log
+				an enhancement request in <ulink url="&JIRA;">JIRA</ulink>.  Be sure to include as much detail as possible about the scenario,
+				the problem condition, and the desired behavior.
+			</para> 
+		</sect1>
+		<sect1>
 			<title>Configuration</title>
 			<para>
 				The federated repository uses other &RepositorySource;s that are to be federated and a &RepositorySource; that is to be used as the



From dna-commits at lists.jboss.org  Wed Jun 10 00:16:55 2009
From: dna-commits at lists.jboss.org (dna-commits at lists.jboss.org)
Date: Wed, 10 Jun 2009 00:16:55 -0400
Subject: [dna-commits] DNA SVN: r1026 - in trunk/docs:
	gettingstarted/src/main/docbook/en-US and 4 other directories.
Message-ID: <E1MEFF9-0004yz-Km@committer01.frg.pub.inap.atl.jboss.com>

Author: rhauch
Date: 2009-06-10 00:16:55 -0400 (Wed, 10 Jun 2009)
New Revision: 1026

Modified:
   trunk/docs/gettingstarted/pom.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/master.xml
   trunk/docs/reference/pom.xml
   trunk/docs/reference/src/main/docbook/en-US/content/author_group.xml
   trunk/docs/reference/src/main/docbook/en-US/master.xml
Log:
Minor tweaks to upgrade to the latest version of the JBoss.org docbook style, and to generate the single HTML forms of the docs.

Modified: trunk/docs/gettingstarted/pom.xml
===================================================================
--- trunk/docs/gettingstarted/pom.xml	2009-06-10 00:18:54 UTC (rev 1025)
+++ trunk/docs/gettingstarted/pom.xml	2009-06-10 04:16:55 UTC (rev 1026)
@@ -17,28 +17,30 @@
         <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.Beta1</version>
+            <version>1.1.0</version>
           </dependency>
           <dependency>
             <groupId>org.jboss</groupId>
             <artifactId>jbossorg-jdocbook-style</artifactId>
-            <version>1.1.0.Beta1</version>
+            <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>
-          <!-- cssResource>
-            <directory>${basedir}/src/main/docbook/css</directory>
-          </cssResource-->
+          <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>
@@ -46,18 +48,16 @@
               <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>index.html</finalName>
+              <finalName>${pom.artifactId}.html</finalName>
             </format>
             <format>
               <formatName>pdf</formatName>
               <stylesheetResource>classpath:/xslt/org/jboss/pdf.xsl</stylesheetResource>
-              <finalName>userguide_en.pdf</finalName>
+              <finalName>${pom.artifactId}.pdf</finalName>
             </format>
-          -->
           </formats>
           <options>
             <xincludeSupported>true</xincludeSupported>

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	2009-06-10 00:18:54 UTC (rev 1025)
+++ trunk/docs/gettingstarted/src/main/docbook/en-US/content/repository_example.xml	2009-06-10 04:16:55 UTC (rev 1026)
@@ -45,13 +45,13 @@
 		<para>This collection of repositories is shown in the following figure:
 	  	<figure id="example-repositories">
 				<title>Repositories used in the example client</title>
-				<graphic align="center" scale="100" fileref="example-repositories.png"/>
+				<graphic align="center" scale="60" fileref="example-repositories.png"/>
 			</figure>
 			Most of the repositories are in-memory repositories (using the In-Memory repository connector), but 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">
 				<title>Vehicles repository content is federated from the Cars, Airplanes and Configuration repositories</title>
-				<graphic align="center" scale="100" fileref="example-federated-repository.png"/>
+				<graphic align="center" scale="60" fileref="example-federated-repository.png"/>
 			</figure>
 	  </para>
 		<para>
@@ -59,7 +59,7 @@
       directory and type <code>./run.sh</code>. You should see the command-line client and its menus in your terminal:
       <figure id="example-repositories-client">
 				<title>Example Client</title>
-				<graphic align="center" scale="100" fileref="example-repositories-client.png"/>
+				<graphic align="center" scale="60" fileref="example-repositories-client.png"/>
 			</figure>
       From this menu, you can see the list of repositories, select one, and navigate through that repository in a manner similar
       to a *nix command-line shell (although the client itself uses the JCR API to interact with the repositories).
@@ -88,7 +88,7 @@
 			<para>If you were to select the "Cars" repository and use some of the commands, you should see something similar to: 
 	      <figure id="example-repositories-navigating">
 					<title>Navigating the Cars repository</title>
-					<graphic align="center" scale="100" fileref="example-repositories-navigating.png"/>
+					<graphic align="center" scale="60" fileref="example-repositories-navigating.png"/>
 				</figure>
 			</para>
 			<para>You can also choose to navigate the "Vehicles" repository, which projects the "Cars" repository content under the

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	2009-06-10 00:18:54 UTC (rev 1025)
+++ trunk/docs/gettingstarted/src/main/docbook/en-US/content/sequencer_example.xml	2009-06-10 04:16:55 UTC (rev 1026)
@@ -48,7 +48,7 @@
       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">
 				<title>Example client</title>
-				<graphic align="center" scale="100" fileref="example-sequencer-client.png"/>
+				<graphic align="center" scale="60" fileref="example-sequencer-client.png"/>
 			</figure>
       From this menu, you can upload a file into the repository, search for media in the repository, print sequencing statistics,
       or quit the application.</para>
@@ -59,7 +59,7 @@
 			in that directory without specifying the path:
       <figure id="example-sequencer-upload">
 				<title>Uploading an image using the example client</title>
-				<graphic align="center" scale="100" fileref="example-sequencer-upload.png"/>
+				<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
@@ -98,17 +98,17 @@
 		<para>So, after the file is uploaded, you can search the repository for the image metadata using the "s" menu option:
     	<figure id="example-sequencer-search">
 				<title>Searching for media using the example client</title>
-				<graphic align="center" scale="100" fileref="example-sequencer-search.png"/>
+				<graphic align="center" scale="60" fileref="example-sequencer-search.png"/>
 			</figure>
     	Here are the search results after the <code>sample1.mp3</code> audio file has been uploaded (to the <code>/a/b/sample1.mp3</code> location):
     	<figure id="example-sequencer-search-with-mp3">
 				<title>Searching for media using the example client</title>
-				<graphic align="center" scale="100" fileref="example-sequencer-search-with-mp3.png"/>
+				<graphic align="center" scale="60" fileref="example-sequencer-search-with-mp3.png"/>
 			</figure>
     	You can also display the sequencing statistics using the "d" menu option:
     	<figure id="example-sequencer-statistics">
 				<title>Sequencing statistics using the example client</title>
-				<graphic align="center" scale="100" fileref="example-sequencer-statistics.png"/>
+				<graphic align="center" scale="60" fileref="example-sequencer-statistics.png"/>
 			</figure>
     	These stats show how many nodes were sequenced, and how many nodes were skipped because they didn't apply to the sequencer's
     	criteria.
@@ -341,7 +341,7 @@
 		<para>At this point, we've reviewed all of the interesting code in the example application related to JBoss DNA.  However, feel free
     to play with the application, trying different things.</para>
 	</sect1>
-	<sect1 id="using_dna_whats_next">
+	<sect1>
 		<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

Modified: trunk/docs/gettingstarted/src/main/docbook/en-US/master.xml
===================================================================
--- trunk/docs/gettingstarted/src/main/docbook/en-US/master.xml	2009-06-10 00:18:54 UTC (rev 1025)
+++ trunk/docs/gettingstarted/src/main/docbook/en-US/master.xml	2009-06-10 04:16:55 UTC (rev 1026)
@@ -34,7 +34,6 @@
 		<subtitle>Getting Started Guide</subtitle>
 		<releaseinfo>&versionNumber;</releaseinfo>
 		<productnumber>&versionNumber;</productnumber>
-		<issuenum>5</issuenum>
 		<mediaobject>
 			<imageobject role="fo">
 				<imagedata fileref="dna-logo.png" align="center"/>
@@ -48,7 +47,6 @@
 			<holder>&copyrightHolder;</holder>
 		</copyright>
 		<xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="content/author_group.xml"/>
-		<xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="content/legal_notice.xml"/>
 	</bookinfo>
 	<xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="content/preface.xml"/>
 	<xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="content/introduction.xml"/>

Modified: trunk/docs/reference/pom.xml
===================================================================
--- trunk/docs/reference/pom.xml	2009-06-10 00:18:54 UTC (rev 1025)
+++ trunk/docs/reference/pom.xml	2009-06-10 04:16:55 UTC (rev 1026)
@@ -17,28 +17,30 @@
         <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.Beta1</version>
+            <version>1.1.0</version>
           </dependency>
           <dependency>
             <groupId>org.jboss</groupId>
             <artifactId>jbossorg-jdocbook-style</artifactId>
-            <version>1.1.0.Beta1</version>
+            <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>
-          <!-- cssResource>
-            <directory>${basedir}/src/main/docbook/css</directory>
-          </cssResource-->
+           <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>
@@ -46,17 +48,15 @@
               <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>index.html</finalName>
+              <finalName>${pom.artifactId}.html</finalName>
             </format>
-            -->
             <format>
               <formatName>pdf</formatName>
               <stylesheetResource>classpath:/xslt/org/jboss/pdf.xsl</stylesheetResource>
-              <finalName>userguide_en.pdf</finalName>
+              <finalName>${pom.artifactId}.pdf</finalName>
             </format>
           </formats>
           <options>

Modified: trunk/docs/reference/src/main/docbook/en-US/content/author_group.xml
===================================================================
--- trunk/docs/reference/src/main/docbook/en-US/content/author_group.xml	2009-06-10 00:18:54 UTC (rev 1025)
+++ trunk/docs/reference/src/main/docbook/en-US/content/author_group.xml	2009-06-10 04:16:55 UTC (rev 1026)
@@ -30,4 +30,5 @@
 ]>
 <authorgroup>
   <corpauthor>Randall M. Hauch</corpauthor>
+  <corpauthor>Brian Carothers</corpauthor>
 </authorgroup>
\ 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	2009-06-10 00:18:54 UTC (rev 1025)
+++ trunk/docs/reference/src/main/docbook/en-US/master.xml	2009-06-10 04:16:55 UTC (rev 1026)
@@ -34,7 +34,6 @@
 		<subtitle>Reference Guide</subtitle>
 		<releaseinfo>&versionNumber;</releaseinfo>
 		<productnumber>&versionNumber;</productnumber>
-		<issuenum>4</issuenum>
 		<mediaobject>
 			<imageobject role="fo">
 				<imagedata fileref="dna-logo.png" align="center"/>
@@ -48,7 +47,6 @@
 			<holder>&copyrightHolder;</holder>
 		</copyright>
 		<xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="content/author_group.xml"/>
-		<xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="content/legal_notice.xml"/>
 	</bookinfo>
 	<xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="content/preface.xml"/>
 	<xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="content/introduction.xml"/>



From dna-commits at lists.jboss.org  Wed Jun 10 00:43:17 2009
From: dna-commits at lists.jboss.org (dna-commits at lists.jboss.org)
Date: Wed, 10 Jun 2009 00:43:17 -0400
Subject: [dna-commits] DNA SVN: r1027 -
	trunk/docs/examples/gettingstarted/sequencers/src/test/java/org/jboss/example/dna/sequencer.
Message-ID: <E1MEFef-000682-N2@committer01.frg.pub.inap.atl.jboss.com>

Author: rhauch
Date: 2009-06-10 00:43:17 -0400 (Wed, 10 Jun 2009)
New Revision: 1027

Modified:
   trunk/docs/examples/gettingstarted/sequencers/src/test/java/org/jboss/example/dna/sequencer/SequencingClientTest.java
Log:
DNA-443 Added back in the unit test in the sequencer example that runs the Java sequencer.

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	2009-06-10 04:16:55 UTC (rev 1026)
+++ trunk/docs/examples/gettingstarted/sequencers/src/test/java/org/jboss/example/dna/sequencer/SequencingClientTest.java	2009-06-10 04:43:17 UTC (rev 1027)
@@ -39,7 +39,6 @@
 import org.jboss.dna.sequencer.mp3.Mp3MetadataSequencer;
 import org.junit.After;
 import org.junit.Before;
-import org.junit.Ignore;
 import org.junit.Test;
 
 /**
@@ -159,7 +158,6 @@
         client.search();
     }
 
-    @Ignore
     @Test
     public void shouldUploadAndSequenceJavaSourceFile() throws Exception {
         client.setUserInterface(new MockUserInterface(this.javaSourceUrl, "/a/b/MySource.java", 1));



From dna-commits at lists.jboss.org  Wed Jun 10 10:53:56 2009
From: dna-commits at lists.jboss.org (dna-commits at lists.jboss.org)
Date: Wed, 10 Jun 2009 10:53:56 -0400
Subject: [dna-commits] DNA SVN: r1028 - in trunk/dna-repository/src:
	test/java/org/jboss/dna/repository/sequencer and 1 other directory.
Message-ID: <E1MEPBc-0006vT-1v@committer01.frg.pub.inap.atl.jboss.com>

Author: bcarothers
Date: 2009-06-10 10:53:55 -0400 (Wed, 10 Jun 2009)
New Revision: 1028

Modified:
   trunk/dna-repository/src/main/java/org/jboss/dna/repository/sequencer/StreamSequencerAdapter.java
   trunk/dna-repository/src/test/java/org/jboss/dna/repository/sequencer/StreamSequencerAdapterTest.java
Log:
DNA-443 Java sequencer is not saving content correctly

Applied patch that changes all of the node creation to use the destination instead of doing direct writes to the graph.  Had to add an accumulator to keep track of the created paths.  This should have a beneficial effect on performance over the use of createIfMissing, since it avoids having to continually read in the nodes at the root of the graph.  The patch also adds a new test case to verify that the StreamSequencerAdapter is not creating extra nodes.

Modified: trunk/dna-repository/src/main/java/org/jboss/dna/repository/sequencer/StreamSequencerAdapter.java
===================================================================
--- trunk/dna-repository/src/main/java/org/jboss/dna/repository/sequencer/StreamSequencerAdapter.java	2009-06-10 04:43:17 UTC (rev 1027)
+++ trunk/dna-repository/src/main/java/org/jboss/dna/repository/sequencer/StreamSequencerAdapter.java	2009-06-10 14:53:55 UTC (rev 1028)
@@ -138,6 +138,9 @@
             }
         }
 
+        // Accumulator of paths that we've added to the batch but have not yet been submitted to the graph
+        Set<Path> builtPaths = new HashSet<Path>();
+
         // Find each output node and save the image metadata there ...
         for (RepositoryNodePath outputPath : outputPaths) {
             // Get the name of the repository workspace and the path to the output node
@@ -147,11 +150,11 @@
             // Find or create the output node in this session ...
             context.graph().useWorkspace(repositoryWorkspaceName);
 
-            buildPathTo(nodePath, context);
-            Node outputNode = context.graph().getNodeAt(nodePath);
+            buildPathTo(nodePath, context, builtPaths);
+            // Node outputNode = context.graph().getNodeAt(nodePath);
 
             // Now save the image metadata to the output node ...
-            saveOutput(outputNode, output, context);
+            saveOutput(nodePath, output, context, builtPaths);
         }
 
         context.getDestination().submit();
@@ -162,13 +165,15 @@
      * 
      * @param nodePath the node path to create
      * @param context the sequencer context under which it should be created
+     * @param builtPaths a set of the paths that have already been created but not submitted in this batch
      */
     private void buildPathTo( String nodePath,
-                              SequencerContext context ) {
+                              SequencerContext context,
+                              Set<Path> builtPaths ) {
         PathFactory pathFactory = context.getExecutionContext().getValueFactories().getPathFactory();
         Path targetPath = pathFactory.create(nodePath);
 
-        buildPathTo(targetPath, context);
+        buildPathTo(targetPath, context, builtPaths);
     }
 
     /**
@@ -176,9 +181,11 @@
      * 
      * @param targetPath the node path to create
      * @param context the sequencer context under which it should be created
+     * @param builtPaths a set of the paths that have already been created but not submitted in this batch
      */
     private void buildPathTo( Path targetPath,
-                              SequencerContext context ) {
+                              SequencerContext context,
+                              Set<Path> builtPaths ) {
         PathFactory pathFactory = context.getExecutionContext().getValueFactories().getPathFactory();
         PropertyFactory propFactory = context.getExecutionContext().getPropertyFactory();
 
@@ -186,20 +193,19 @@
         Path workingPath = pathFactory.createRootPath();
         Path.Segment[] segments = targetPath.getSegmentsArray();
         int i = 0;
-        if (segments.length > 1) {
-            Property primaryType = propFactory.create(JcrLexicon.PRIMARY_TYPE, JcrNtLexicon.UNSTRUCTURED);
-            for (int max = segments.length - 1; i < max; i++) {
-                workingPath = pathFactory.create(workingPath, segments[i]);
-                
+        Property primaryType = propFactory.create(JcrLexicon.PRIMARY_TYPE, JcrNtLexicon.UNSTRUCTURED);
+        for (int max = segments.length; i < max; i++) {
+            workingPath = pathFactory.create(workingPath, segments[i]);
+
+            if (!builtPaths.contains(workingPath)) {
                 try {
                     context.graph().getNodeAt(workingPath);
+                } catch (PathNotFoundException pnfe) {
+                    context.getDestination().create(workingPath, primaryType);
+                    builtPaths.add(workingPath);
                 }
-                catch (PathNotFoundException pnfe) {
-                    context.graph().create(workingPath, primaryType);
-                }
             }
         }
-        context.graph().create(targetPath); 
     }
 
     /**
@@ -209,15 +215,16 @@
      * @param outputNode the existing node onto (or below) which the output is to be written; never null
      * @param output the (immutable) sequencing output; never null
      * @param context the execution context for this sequencing operation; never null
+     * @param builtPaths a set of the paths that have already been created but not submitted in this batch
      */
-    protected void saveOutput( Node outputNode,
+    protected void saveOutput( String nodePath,
                                SequencerOutputMap output,
-                               SequencerContext context ) {
+                               SequencerContext context,
+                               Set<Path> builtPaths ) {
         if (output.isEmpty()) return;
         final PathFactory pathFactory = context.getExecutionContext().getValueFactories().getPathFactory();
         final PropertyFactory propertyFactory = context.getExecutionContext().getPropertyFactory();
-        // TODO: Is it safe to assume that the location for this node will include a path?
-        final Path outputNodePath = pathFactory.create(outputNode.getLocation().getPath());
+        final Path outputNodePath = pathFactory.create(nodePath);
 
         // Iterate over the entries in the output, in Path's natural order (shorter paths first and in lexicographical order by
         // prefix and name)
@@ -230,15 +237,15 @@
             List<Property> properties = new LinkedList<Property>();
             // Set all of the properties on this
             for (SequencerOutputMap.PropertyValue property : entry.getPropertyValues()) {
-                // String propertyName = property.getName().getString(namespaceRegistry, Path.NO_OP_ENCODER);
                 properties.add(propertyFactory.create(property.getName(), property.getValue()));
                 // TODO: Handle reference properties - currently passed in as Paths
             }
 
             if (absolutePath.getParent() != null) {
-                buildPathTo(absolutePath.getParent(), context);
+                buildPathTo(absolutePath.getParent(), context, builtPaths);
             }
-            context.graph().create(absolutePath, properties);
+            context.getDestination().create(absolutePath, properties);
+            builtPaths.add(absolutePath);
         }
     }
 
@@ -260,8 +267,7 @@
         Path path = factories.getPathFactory().create(input.getLocation().getPath());
 
         Set<org.jboss.dna.graph.property.Property> props = new HashSet<org.jboss.dna.graph.property.Property>(
-                                                                                                              input.getPropertiesByName()
-                                                                                                                   .values());
+                                                                                                              input.getPropertiesByName().values());
         props = Collections.unmodifiableSet(props);
         String mimeType = getMimeType(context, sequencedProperty, path.getLastSegment().getName().getLocalName());
         return new StreamSequencerContext(context.getExecutionContext(), path, props, mimeType, problems);

Modified: trunk/dna-repository/src/test/java/org/jboss/dna/repository/sequencer/StreamSequencerAdapterTest.java
===================================================================
--- trunk/dna-repository/src/test/java/org/jboss/dna/repository/sequencer/StreamSequencerAdapterTest.java	2009-06-10 04:43:17 UTC (rev 1027)
+++ trunk/dna-repository/src/test/java/org/jboss/dna/repository/sequencer/StreamSequencerAdapterTest.java	2009-06-10 14:53:55 UTC (rev 1028)
@@ -37,6 +37,8 @@
 import java.util.EnumSet;
 import java.util.HashSet;
 import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
 import java.util.Set;
 import org.jboss.dna.common.collection.Problems;
 import org.jboss.dna.common.collection.SimpleProblems;
@@ -48,6 +50,7 @@
 import org.jboss.dna.graph.mimetype.MimeTypeDetectors;
 import org.jboss.dna.graph.observe.NetChangeObserver.ChangeType;
 import org.jboss.dna.graph.observe.NetChangeObserver.NetChange;
+import org.jboss.dna.graph.property.Name;
 import org.jboss.dna.graph.property.Path;
 import org.jboss.dna.graph.property.PathNotFoundException;
 import org.jboss.dna.graph.property.Property;
@@ -527,7 +530,61 @@
                                                                                          problems);
         assertThat(sequencerContext.getMimeType(), is("text/plain"));
     }
+    
+    private Name nameFor(String raw) {
+        return context.getValueFactories().getNameFactory().create(raw);
+    }
+    
+    @Test
+    public void shouldNotCreateExtraNodesWhenSavingOutput() throws Exception {
+        SequencerOutputMap output = new SequencerOutputMap(context.getValueFactories());
+        Map<Name, Property> props;
+        
+        /*
+         * Create several output properties and make sure the resulting graph
+         * does not contain duplicate nodes
+         */
+        output.setProperty("a", "property1", "value1");
+        output.setProperty("a/b", "property1", "value1");
+        output.setProperty("a/b", "property2", "value2");
+        output.setProperty("a/b[2]", "property1", "value1");
+        output.setProperty("a/b[2]/c", "property1", "value1");
+        
+        Set<Path> builtPaths = new HashSet<Path>();
+        sequencer.saveOutput("/", output, seqContext, builtPaths);
+        seqContext.getDestination().submit();
+        
+        Node rootNode = graph.getNodeAt("/");
+        assertThat(rootNode.getChildren().size(), is(1));
+        
+        Node nodeA = graph.getNodeAt("/a");
+        props = nodeA.getPropertiesByName();
 
+        assertThat(nodeA.getChildren().size(), is(2));
+        assertThat(props.size(), is(2));  // Need to add one to account for dna:uuid
+        assertThat(props.get(nameFor("property1")).getFirstValue().toString(), is("value1"));
+
+        Node nodeB = graph.getNodeAt("/a/b[1]");
+        props = nodeB.getPropertiesByName();
+    
+        assertThat(props.size(), is(3));  // Need to add one to account for dna:uuid
+        assertThat(props.get(nameFor("property1")).getFirstValue().toString(), is("value1"));
+        assertThat(props.get(nameFor("property2")).getFirstValue().toString(), is("value2"));
+
+        Node nodeB2 = graph.getNodeAt("/a/b[2]");
+        props = nodeB2.getPropertiesByName();
+    
+        assertThat(props.size(), is(2));   // Need to add one to account for dna:uuid
+        assertThat(props.get(nameFor("property1")).getFirstValue().toString(), is("value1"));
+
+        Node nodeC = graph.getNodeAt("/a/b[2]/c");
+        props = nodeC.getPropertiesByName();
+    
+        assertThat(props.size(), is(2));   // Need to add one to account for dna:uuid
+        assertThat(props.get(nameFor("property1")).getFirstValue().toString(), is("value1"));
+
+    }
+
     private void verifyProperty( StreamSequencerContext context,
                                  String name,
                                  Object... values ) {



From dna-commits at lists.jboss.org  Wed Jun 10 11:01:21 2009
From: dna-commits at lists.jboss.org (dna-commits at lists.jboss.org)
Date: Wed, 10 Jun 2009 11:01:21 -0400
Subject: [dna-commits] DNA SVN: r1029 - in trunk/dna-repository/src:
	test/java/org/jboss/dna/repository/sequencer and 1 other directory.
Message-ID: <E1MEPIn-0007FX-LS@committer01.frg.pub.inap.atl.jboss.com>

Author: rhauch
Date: 2009-06-10 11:01:21 -0400 (Wed, 10 Jun 2009)
New Revision: 1029

Modified:
   trunk/dna-repository/src/main/java/org/jboss/dna/repository/sequencer/StreamSequencerAdapter.java
   trunk/dna-repository/src/test/java/org/jboss/dna/repository/sequencer/StreamSequencerAdapterTest.java
Log:
DNA-443 Java sequencer is not saving content correctly

Corrected a JavaDoc error and removed unused import in a test case.

Modified: trunk/dna-repository/src/main/java/org/jboss/dna/repository/sequencer/StreamSequencerAdapter.java
===================================================================
--- trunk/dna-repository/src/main/java/org/jboss/dna/repository/sequencer/StreamSequencerAdapter.java	2009-06-10 14:53:55 UTC (rev 1028)
+++ trunk/dna-repository/src/main/java/org/jboss/dna/repository/sequencer/StreamSequencerAdapter.java	2009-06-10 15:01:21 UTC (rev 1029)
@@ -212,7 +212,7 @@
      * Save the sequencing output to the supplied node. This method does not need to save the output, as that is done by the
      * caller of this method.
      * 
-     * @param outputNode the existing node onto (or below) which the output is to be written; never null
+     * @param nodePath the existing node onto (or below) which the output is to be written; never null
      * @param output the (immutable) sequencing output; never null
      * @param context the execution context for this sequencing operation; never null
      * @param builtPaths a set of the paths that have already been created but not submitted in this batch
@@ -267,7 +267,8 @@
         Path path = factories.getPathFactory().create(input.getLocation().getPath());
 
         Set<org.jboss.dna.graph.property.Property> props = new HashSet<org.jboss.dna.graph.property.Property>(
-                                                                                                              input.getPropertiesByName().values());
+                                                                                                              input.getPropertiesByName()
+                                                                                                                   .values());
         props = Collections.unmodifiableSet(props);
         String mimeType = getMimeType(context, sequencedProperty, path.getLastSegment().getName().getLocalName());
         return new StreamSequencerContext(context.getExecutionContext(), path, props, mimeType, problems);

Modified: trunk/dna-repository/src/test/java/org/jboss/dna/repository/sequencer/StreamSequencerAdapterTest.java
===================================================================
--- trunk/dna-repository/src/test/java/org/jboss/dna/repository/sequencer/StreamSequencerAdapterTest.java	2009-06-10 14:53:55 UTC (rev 1028)
+++ trunk/dna-repository/src/test/java/org/jboss/dna/repository/sequencer/StreamSequencerAdapterTest.java	2009-06-10 15:01:21 UTC (rev 1029)
@@ -37,7 +37,6 @@
 import java.util.EnumSet;
 import java.util.HashSet;
 import java.util.Iterator;
-import java.util.List;
 import java.util.Map;
 import java.util.Set;
 import org.jboss.dna.common.collection.Problems;
@@ -530,16 +529,16 @@
                                                                                          problems);
         assertThat(sequencerContext.getMimeType(), is("text/plain"));
     }
-    
-    private Name nameFor(String raw) {
+
+    private Name nameFor( String raw ) {
         return context.getValueFactories().getNameFactory().create(raw);
     }
-    
+
     @Test
     public void shouldNotCreateExtraNodesWhenSavingOutput() throws Exception {
         SequencerOutputMap output = new SequencerOutputMap(context.getValueFactories());
         Map<Name, Property> props;
-        
+
         /*
          * Create several output properties and make sure the resulting graph
          * does not contain duplicate nodes
@@ -549,38 +548,38 @@
         output.setProperty("a/b", "property2", "value2");
         output.setProperty("a/b[2]", "property1", "value1");
         output.setProperty("a/b[2]/c", "property1", "value1");
-        
+
         Set<Path> builtPaths = new HashSet<Path>();
         sequencer.saveOutput("/", output, seqContext, builtPaths);
         seqContext.getDestination().submit();
-        
+
         Node rootNode = graph.getNodeAt("/");
         assertThat(rootNode.getChildren().size(), is(1));
-        
+
         Node nodeA = graph.getNodeAt("/a");
         props = nodeA.getPropertiesByName();
 
         assertThat(nodeA.getChildren().size(), is(2));
-        assertThat(props.size(), is(2));  // Need to add one to account for dna:uuid
+        assertThat(props.size(), is(2)); // Need to add one to account for dna:uuid
         assertThat(props.get(nameFor("property1")).getFirstValue().toString(), is("value1"));
 
         Node nodeB = graph.getNodeAt("/a/b[1]");
         props = nodeB.getPropertiesByName();
-    
-        assertThat(props.size(), is(3));  // Need to add one to account for dna:uuid
+
+        assertThat(props.size(), is(3)); // Need to add one to account for dna:uuid
         assertThat(props.get(nameFor("property1")).getFirstValue().toString(), is("value1"));
         assertThat(props.get(nameFor("property2")).getFirstValue().toString(), is("value2"));
 
         Node nodeB2 = graph.getNodeAt("/a/b[2]");
         props = nodeB2.getPropertiesByName();
-    
-        assertThat(props.size(), is(2));   // Need to add one to account for dna:uuid
+
+        assertThat(props.size(), is(2)); // Need to add one to account for dna:uuid
         assertThat(props.get(nameFor("property1")).getFirstValue().toString(), is("value1"));
 
         Node nodeC = graph.getNodeAt("/a/b[2]/c");
         props = nodeC.getPropertiesByName();
-    
-        assertThat(props.size(), is(2));   // Need to add one to account for dna:uuid
+
+        assertThat(props.size(), is(2)); // Need to add one to account for dna:uuid
         assertThat(props.get(nameFor("property1")).getFirstValue().toString(), is("value1"));
 
     }



From dna-commits at lists.jboss.org  Wed Jun 10 15:56:54 2009
From: dna-commits at lists.jboss.org (dna-commits at lists.jboss.org)
Date: Wed, 10 Jun 2009 15:56:54 -0400
Subject: [dna-commits] DNA SVN: r1030 - in trunk/extensions:
	dna-web-jcr-rest-war/src/test/java/org/jboss/dna/web/jcr/rest
	and 1 other directory.
Message-ID: <E1METuo-0003hB-0E@committer01.frg.pub.inap.atl.jboss.com>

Author: bcarothers
Date: 2009-06-10 15:56:53 -0400 (Wed, 10 Jun 2009)
New Revision: 1030

Modified:
   trunk/extensions/dna-web-jcr-rest-war/src/test/java/org/jboss/dna/web/jcr/rest/JcrResourcesTest.java
   trunk/extensions/dna-web-jcr-rest/src/main/java/org/jboss/dna/web/jcr/rest/JcrResources.java
Log:
DNA-447 Make REST PUT Method Support add/removeMixin Like POST Method

Added check to JcrResources.setPropertyOnNode to handle the special case of the jcr:mixinTypes property and a corresponding test case.

Also added missing node.save() call for PUT handler.


Modified: trunk/extensions/dna-web-jcr-rest/src/main/java/org/jboss/dna/web/jcr/rest/JcrResources.java
===================================================================
--- trunk/extensions/dna-web-jcr-rest/src/main/java/org/jboss/dna/web/jcr/rest/JcrResources.java	2009-06-10 15:01:21 UTC (rev 1029)
+++ trunk/extensions/dna-web-jcr-rest/src/main/java/org/jboss/dna/web/jcr/rest/JcrResources.java	2009-06-10 19:56:53 UTC (rev 1030)
@@ -25,10 +25,13 @@
 
 import java.io.IOException;
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.HashMap;
+import java.util.HashSet;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
+import java.util.Set;
 import javax.jcr.Item;
 import javax.jcr.Node;
 import javax.jcr.NodeIterator;
@@ -38,6 +41,7 @@
 import javax.jcr.RepositoryException;
 import javax.jcr.Session;
 import javax.jcr.Value;
+import javax.jcr.nodetype.NodeType;
 import javax.jcr.nodetype.PropertyDefinition;
 import javax.servlet.http.HttpServletRequest;
 import javax.ws.rs.Consumes;
@@ -122,17 +126,17 @@
      * @return an active session with the given workspace in the named repository
      * @throws RepositoryException if any other error occurs
      */
-    private Session getSession( HttpServletRequest request, 
+    private Session getSession( HttpServletRequest request,
                                 String rawRepositoryName,
                                 String rawWorkspaceName ) throws NotFoundException, RepositoryException {
         assert request != null;
-        assert request.getUserPrincipal() != null: "Request must be authorized";
+        assert request.getUserPrincipal() != null : "Request must be authorized";
 
         // Sanity check
         if (request.getUserPrincipal() == null) {
             throw new UnauthorizedException("Client is not authorized");
         }
-        
+
         return RepositoryFactory.getSession(request, repositoryNameFor(rawRepositoryName), workspaceNameFor(rawWorkspaceName));
     }
 
@@ -177,7 +181,7 @@
     public Map<String, WorkspaceEntry> getWorkspaces( @Context HttpServletRequest request,
                                                       @PathParam( "repositoryName" ) String rawRepositoryName )
         throws RepositoryException, IOException {
-        
+
         assert request != null;
         assert rawRepositoryName != null;
 
@@ -185,7 +189,7 @@
 
         Session session = getSession(request, rawRepositoryName, null);
         rawRepositoryName = URL_ENCODER.encode(rawRepositoryName);
-        
+
         for (String name : session.getWorkspace().getAccessibleWorkspaceNames()) {
             if (name.trim().length() == 0) {
                 name = EMPTY_WORKSPACE_NAME;
@@ -221,7 +225,7 @@
     @GET
     @Path( "/{repositoryName}/{workspaceName}/items{path:.*}" )
     @Produces( "application/json" )
-    public String getItem( @Context HttpServletRequest request, 
+    public String getItem( @Context HttpServletRequest request,
                            @PathParam( "repositoryName" ) String rawRepositoryName,
                            @PathParam( "workspaceName" ) String rawWorkspaceName,
                            @PathParam( "path" ) String path,
@@ -464,18 +468,46 @@
     private void setPropertyOnNode( Node node,
                                     String propName,
                                     Object value ) throws RepositoryException, JSONException {
+        String[] values;
         if (value instanceof JSONArray) {
             JSONArray jsonValues = (JSONArray)value;
-            String[] values = new String[jsonValues.length()];
+            values = new String[jsonValues.length()];
 
             for (int i = 0; i < values.length; i++) {
                 values[i] = jsonValues.getString(i);
             }
-            node.setProperty(propName, values);
         } else {
-            node.setProperty(propName, (String)value);
+            values = new String[] { (String)value };
         }
 
+        if (propName.equals(JcrResources.MIXIN_TYPES_PROPERTY)) {
+            Set<String> toBeMixins = new HashSet<String>(Arrays.asList(values));
+            Set<String> asIsMixins = new HashSet<String>();
+            
+            for (NodeType nodeType : node.getMixinNodeTypes()) {
+                asIsMixins.add(nodeType.getName());
+            }
+            
+            Set<String> mixinsToAdd = new HashSet<String>(toBeMixins);
+            mixinsToAdd.removeAll(asIsMixins);
+            asIsMixins.removeAll(toBeMixins);
+            
+            for (String nodeType : mixinsToAdd) {
+                node.addMixin(nodeType);
+            }
+
+            for (String nodeType : asIsMixins) {
+                node.removeMixin(nodeType);
+            }
+        } else {
+            if (values.length == 1) {
+                node.setProperty(propName, values[0]);
+                
+            }
+            else {
+                node.setProperty(propName, values);
+            }
+        }
     }
 
     /**
@@ -581,7 +613,7 @@
 
             setPropertyOnNode(node, property.getName(), properties.get("value"));
         }
-
+        node.save();
         return jsonFor(node, 0).toString();
     }
 

Modified: trunk/extensions/dna-web-jcr-rest-war/src/test/java/org/jboss/dna/web/jcr/rest/JcrResourcesTest.java
===================================================================
--- trunk/extensions/dna-web-jcr-rest-war/src/test/java/org/jboss/dna/web/jcr/rest/JcrResourcesTest.java	2009-06-10 15:01:21 UTC (rev 1029)
+++ trunk/extensions/dna-web-jcr-rest-war/src/test/java/org/jboss/dna/web/jcr/rest/JcrResourcesTest.java	2009-06-10 19:56:53 UTC (rev 1030)
@@ -825,4 +825,74 @@
         connection.disconnect();
     
     }
+
+    @Test
+    public void shouldBeAbleToAddAndRemoveMixinTypes() throws Exception {
+
+        URL postUrl = new URL(SERVER_URL + "/dna%3arepository/default/items/nodeWithNoMixins");
+        HttpURLConnection connection = (HttpURLConnection)postUrl.openConnection();
+
+        connection.setDoOutput(true);
+        connection.setRequestMethod("POST");
+        connection.setRequestProperty("Content-Type", MediaType.APPLICATION_JSON);
+
+        String payload = "{ \"properties\": {\"jcr:primaryType\": \"nt:unstructured\" }}";
+        connection.getOutputStream().write(payload.getBytes());
+        
+        assertThat(connection.getResponseCode(), is(HttpURLConnection.HTTP_CREATED));
+        connection.disconnect();
+
+        connection = (HttpURLConnection)postUrl.openConnection();
+
+        connection.setDoOutput(true);
+        connection.setRequestMethod("PUT");
+        connection.setRequestProperty("Content-Type", MediaType.APPLICATION_JSON);
+
+        payload = "{\"jcr:mixinTypes\": \"mix:referenceable\"}";
+        connection.getOutputStream().write(payload.getBytes());
+        
+        JSONObject body = new JSONObject(getResponseFor(connection));
+        assertThat(body.length(), is(1));
+
+        JSONObject properties = body.getJSONObject("properties");
+        assertThat(properties, is(notNullValue()));
+
+        assertThat(properties.length(), is(3));
+        assertThat(properties.getString("jcr:primaryType"), is("nt:unstructured"));
+        JSONArray mixinTypes = properties.getJSONArray("jcr:mixinTypes");
+        assertThat(mixinTypes, is(notNullValue()));
+        assertThat(mixinTypes.length(), is(1));
+        assertThat(mixinTypes.getString(0), is("mix:referenceable"));
+        assertThat(properties.getString("jcr:uuid"), is(notNullValue()));
+        
+        assertThat(connection.getResponseCode(), is(HttpURLConnection.HTTP_OK));
+        connection.disconnect();
+
+        connection = (HttpURLConnection)postUrl.openConnection();
+
+        connection.setDoOutput(true);
+        connection.setRequestMethod("PUT");
+        connection.setRequestProperty("Content-Type", MediaType.APPLICATION_JSON);
+
+        payload = "{\"jcr:mixinTypes\": []}";
+        connection.getOutputStream().write(payload.getBytes());
+        
+        body = new JSONObject(getResponseFor(connection));
+        assertThat(body.length(), is(1));
+
+        properties = body.getJSONObject("properties");
+        assertThat(properties, is(notNullValue()));
+        assertThat(properties.length(), is(2));
+        assertThat(properties.getString("jcr:primaryType"), is("nt:unstructured"));
+
+        // removeMixin doesn't currently null out this value
+        mixinTypes = properties.getJSONArray("jcr:mixinTypes");
+        assertThat(mixinTypes, is(notNullValue()));
+        assertThat(mixinTypes.length(), is(0));
+
+        assertThat(connection.getResponseCode(), is(HttpURLConnection.HTTP_OK));
+        connection.disconnect();
+
+    }
+
 }



From dna-commits at lists.jboss.org  Wed Jun 10 17:21:37 2009
From: dna-commits at lists.jboss.org (dna-commits at lists.jboss.org)
Date: Wed, 10 Jun 2009 17:21:37 -0400
Subject: [dna-commits] DNA SVN: r1031 - in trunk/dna-repository/src:
	test/java/org/jboss/dna/repository and 1 other directories.
Message-ID: <E1MEVEn-0007re-1R@committer01.frg.pub.inap.atl.jboss.com>

Author: rhauch
Date: 2009-06-10 17:21:36 -0400 (Wed, 10 Jun 2009)
New Revision: 1031

Modified:
   trunk/dna-repository/src/main/java/org/jboss/dna/repository/RepositoryLibrary.java
   trunk/dna-repository/src/main/java/org/jboss/dna/repository/RepositoryService.java
   trunk/dna-repository/src/test/java/org/jboss/dna/repository/RepositoryServiceTest.java
   trunk/dna-repository/src/test/java/org/jboss/dna/repository/sequencer/SequencingServiceTest.java
Log:
DNA-449 Federation connector does not find it's configuration when imported using the JcrConfiguration

Cleaned up several unused constructors that added quite a bit of complication to the classes.

Modified: trunk/dna-repository/src/main/java/org/jboss/dna/repository/RepositoryLibrary.java
===================================================================
--- trunk/dna-repository/src/main/java/org/jboss/dna/repository/RepositoryLibrary.java	2009-06-10 19:56:53 UTC (rev 1030)
+++ trunk/dna-repository/src/main/java/org/jboss/dna/repository/RepositoryLibrary.java	2009-06-10 21:21:36 UTC (rev 1031)
@@ -115,45 +115,13 @@
 
     /**
      * Create a new manager instance.
-     */
-    public RepositoryLibrary() {
-        this(new ExecutionContext(), null);
-    }
-
-    /**
-     * Create a new manager instance.
      * 
-     * @param delegate the connection factory to which this instance should delegate in the event that a source is not found in
-     *        this manager; may be null if there is no delegate
-     */
-    public RepositoryLibrary( RepositoryConnectionFactory delegate ) {
-        this(new ExecutionContext(), delegate);
-    }
-
-    /**
-     * Create a new manager instance.
-     * 
      * @param executionContext the execution context, which can be used used by sources to create other {@link ExecutionContext}
      *        instances with different JAAS security contexts
      * @throws IllegalArgumentException if the <code>executionContextFactory</code> reference is null
      */
-    public RepositoryLibrary( ExecutionContext executionContext ) {
-        this(executionContext, null);
-    }
-
-    /**
-     * Create a new manager instance.
-     * 
-     * @param executionContext the execution context, which can be used used by sources to create other {@link ExecutionContext}
-     *        instances with different JAAS security contexts
-     * @param delegate the connection factory to which this instance should delegate in the event that a source is not found in
-     *        this manager; may be null if there is no delegate
-     * @throws IllegalArgumentException if the <code>executionContextFactory</code> reference is null
-     */
-    public RepositoryLibrary( final ExecutionContext executionContext,
-                              RepositoryConnectionFactory delegate ) {
+    public RepositoryLibrary( final ExecutionContext executionContext ) {
         CheckArg.isNotNull(executionContext, "executionContext");
-        this.delegate = delegate;
         this.executionContext = executionContext;
         final ObservationBus observationBus = this.observationBus;
         this.repositoryContext = new RepositoryContext() {
@@ -213,26 +181,6 @@
     }
 
     /**
-     * Get the delegate connection factory.
-     * 
-     * @return the connection factory to which this instance should delegate in the event that a source is not found in this
-     *         manager, or null if there is no delegate
-     */
-    public RepositoryConnectionFactory getDelegate() {
-        return delegate;
-    }
-
-    /**
-     * Set the delegate connection factory.
-     * 
-     * @param delegate the connection factory to which this instance should delegate in the event that a source is not found in
-     *        this manager; may be null if there is no delegate
-     */
-    public void setDelegate( RepositoryConnectionFactory delegate ) {
-        this.delegate = delegate;
-    }
-
-    /**
      * @return administrator
      */
     public ServiceAdministrator getAdministrator() {

Modified: trunk/dna-repository/src/main/java/org/jboss/dna/repository/RepositoryService.java
===================================================================
--- trunk/dna-repository/src/main/java/org/jboss/dna/repository/RepositoryService.java	2009-06-10 19:56:53 UTC (rev 1030)
+++ trunk/dna-repository/src/main/java/org/jboss/dna/repository/RepositoryService.java	2009-06-10 21:21:36 UTC (rev 1031)
@@ -107,55 +107,6 @@
     private final AtomicBoolean started = new AtomicBoolean(false);
 
     /**
-     * Create a service instance, reading the configuration describing new {@link RepositorySource} instances from the source with
-     * the supplied name.
-     * 
-     * @param sources the source manager
-     * @param configurationSourceName the name of the {@link RepositorySource} that is the configuration repository
-     * @param configurationWorkspaceName the name of the workspace in the {@link RepositorySource} that is the configuration
-     *        repository
-     * @param context the execution context in which this service should run
-     * @throws IllegalArgumentException if the bootstrap source is null or the execution context is null
-     */
-    public RepositoryService( RepositoryLibrary sources,
-                              String configurationSourceName,
-                              String configurationWorkspaceName,
-                              ExecutionContext context ) {
-        this(sources, configurationSourceName, configurationWorkspaceName, null, context);
-    }
-
-    /**
-     * Create a service instance, reading the configuration describing new {@link RepositorySource} instances from the source with
-     * the supplied name and path within the repository.
-     * 
-     * @param sources the source manager
-     * @param configurationSourceName the name of the {@link RepositorySource} that is the configuration repository
-     * @param configurationWorkspaceName the name of the workspace in the {@link RepositorySource} that is the configuration
-     *        repository, or null if the default workspace of the source should be used (if there is one)
-     * @param pathToConfigurationRoot the path of the node in the configuration source repository that should be treated by this
-     *        service as the root of the service's configuration; if null, then "/dna:system" is used
-     * @param context the execution context in which this service should run
-     * @throws IllegalArgumentException if the bootstrap source is null or the execution context is null
-     */
-    public RepositoryService( RepositoryLibrary sources,
-                              String configurationSourceName,
-                              String configurationWorkspaceName,
-                              Path pathToConfigurationRoot,
-                              ExecutionContext context ) {
-        CheckArg.isNotNull(configurationSourceName, "configurationSourceName");
-        CheckArg.isNotNull(sources, "sources");
-        CheckArg.isNotNull(context, "context");
-        if (pathToConfigurationRoot == null) pathToConfigurationRoot = context.getValueFactories()
-                                                                              .getPathFactory()
-                                                                              .create("/dna:system");
-        this.sources = sources;
-        this.pathToConfigurationRoot = pathToConfigurationRoot;
-        this.configurationSourceName = configurationSourceName;
-        this.configurationWorkspaceName = configurationWorkspaceName;
-        this.context = context;
-    }
-
-    /**
      * Create a service instance, reading the configuration describing new {@link RepositorySource} instances from the supplied
      * configuration repository.
      * 
@@ -176,7 +127,7 @@
         if (pathToConfigurationRoot == null) pathToConfigurationRoot = context.getValueFactories()
                                                                               .getPathFactory()
                                                                               .create("/dna:system");
-        this.sources = new RepositoryLibrary();
+        this.sources = new RepositoryLibrary(context);
         this.sources.addSource(configurationSource);
         this.pathToConfigurationRoot = pathToConfigurationRoot;
         this.configurationSourceName = configurationSource.getName();

Modified: trunk/dna-repository/src/test/java/org/jboss/dna/repository/RepositoryServiceTest.java
===================================================================
--- trunk/dna-repository/src/test/java/org/jboss/dna/repository/RepositoryServiceTest.java	2009-06-10 19:56:53 UTC (rev 1030)
+++ trunk/dna-repository/src/test/java/org/jboss/dna/repository/RepositoryServiceTest.java	2009-06-10 21:21:36 UTC (rev 1031)
@@ -29,14 +29,10 @@
 import static org.hamcrest.core.IsNull.nullValue;
 import static org.hamcrest.core.IsSame.sameInstance;
 import static org.junit.Assert.assertThat;
-import static org.junit.matchers.JUnitMatchers.hasItems;
 import static org.mockito.Mockito.stub;
-import static org.mockito.Mockito.times;
-import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.verifyNoMoreInteractions;
 import java.util.concurrent.TimeUnit;
 import org.jboss.dna.common.util.Logger;
-import org.jboss.dna.connector.federation.FederationException;
 import org.jboss.dna.graph.DnaLexicon;
 import org.jboss.dna.graph.ExecutionContext;
 import org.jboss.dna.graph.Graph;
@@ -80,7 +76,7 @@
         RepositoryConnection configRepositoryConnection = configRepositorySource.getConnection();
         stub(sources.createConnection(configSourceName)).toReturn(configRepositoryConnection);
         root = context.getValueFactories().getPathFactory().createRootPath();
-        service = new RepositoryService(sources, configSourceName, configWorkspaceName, context);
+        service = new RepositoryService(configRepositorySource, configWorkspaceName, root, context);
     }
 
     @After
@@ -120,66 +116,7 @@
         assertThat(service.getAdministrator().getState(), is(ServiceAdministrator.State.TERMINATED));
     }
 
-    @Test( expected = FederationException.class )
-    public void shouldFailToStartUpIfConfigurationRepositorySourceIsNotFound() throws Exception {
-        stub(sources.createConnection(configSourceName)).toReturn(null);
-        service.getAdministrator().start();
-    }
-
-    @Test( expected = FederationException.class )
-    public void shouldFailToStartUpIfUnableToConnectToConfigurationRepository() throws Exception {
-        stub(sources.createConnection(configSourceName)).toThrow(new UnsupportedOperationException());
-        service.getAdministrator().start();
-    }
-
     @Test
-    public void shouldStartUpUsingConfigurationRepositoryThatContainsSomeSources() throws Exception {
-        // Use a real source manager for this test ...
-        sources = new RepositoryLibrary(sources);
-        sources.addSource(configRepositorySource);
-        assertThat(sources.getSources(), hasItems((RepositorySource)configRepositorySource));
-        assertThat(sources.getSources().size(), is(1));
-        service = new RepositoryService(sources, configSourceName, configWorkspaceName, root, context);
-
-        // Set up the configuration repository to contain 3 sources ...
-        final String className = InMemoryRepositorySource.class.getName();
-        configRepository.create("/dna:sources");
-        configRepository.create("/dna:sources/source A");
-        configRepository.set(DnaLexicon.CLASSNAME).on("/dna:sources/source A").to(className);
-        configRepository.set(DnaLexicon.CLASSPATH).on("/dna:sources/source A").to("");
-        configRepository.set("retryLimit").on("/dna:sources/source A").to(3);
-
-        configRepository.create("/dna:sources/source B");
-        configRepository.set(DnaLexicon.CLASSNAME).on("/dna:sources/source B").to(className);
-        configRepository.set(DnaLexicon.CLASSPATH).on("/dna:sources/source B").to("");
-
-        configRepository.create("/dna:sources/source C");
-        configRepository.set(DnaLexicon.CLASSNAME).on("/dna:sources/source C").to(className);
-        configRepository.set(DnaLexicon.CLASSPATH).on("/dna:sources/source C").to("");
-
-        // Now, start up the service ...
-        service.getAdministrator().start();
-
-        // and verify that the sources were added to the manager...
-        assertThat(sources.getSources().size(), is(4));
-        assertThat(sources.getSource("source A"), is(instanceOf(InMemoryRepositorySource.class)));
-        assertThat(sources.getSource("source B"), is(instanceOf(InMemoryRepositorySource.class)));
-        assertThat(sources.getSource("source C"), is(instanceOf(InMemoryRepositorySource.class)));
-
-        InMemoryRepositorySource sourceA = (InMemoryRepositorySource)sources.getSource("source A");
-        assertThat(sourceA.getName(), is("source A"));
-        assertThat(sourceA.getRetryLimit(), is(3));
-
-        InMemoryRepositorySource sourceB = (InMemoryRepositorySource)sources.getSource("source B");
-        assertThat(sourceB.getName(), is("source B"));
-        assertThat(sourceB.getRetryLimit(), is(InMemoryRepositorySource.DEFAULT_RETRY_LIMIT));
-
-        InMemoryRepositorySource sourceC = (InMemoryRepositorySource)sources.getSource("source C");
-        assertThat(sourceC.getName(), is("source C"));
-        assertThat(sourceC.getRetryLimit(), is(InMemoryRepositorySource.DEFAULT_RETRY_LIMIT));
-    }
-
-    @Test
     public void shouldStartUpUsingConfigurationRepositoryThatContainsNoSources() throws Exception {
         // Set up the configuration repository to contain NO sources ...
         configRepository.create("/dna:sources");
@@ -187,9 +124,6 @@
         // Now, start up the service ...
         service.getAdministrator().start();
 
-        // and verify that the configuration source was obtained from the manager ...
-        verify(sources, times(2)).createConnection(configSourceName); // once for checking source, second for getting
-
         // and verify that the sources were never added to the manager...
         verifyNoMoreInteractions(sources);
     }
@@ -254,9 +188,8 @@
 
     @Test
     public void shouldConfigureRepositorySourceWithSetterThatTakesArrayButWithSingleValues() {
-        RepositoryLibrary sources = new RepositoryLibrary(context);
-        sources.addSource(configRepositorySource);
-        service = new RepositoryService(sources, configSourceName, configWorkspaceName, context);
+        Path configPath = context.getValueFactories().getPathFactory().create("/dna:system");
+        service = new RepositoryService(configRepositorySource, configWorkspaceName, configPath, context);
 
         // Set up the configuration repository ...
         configRepository.useWorkspace("default");

Modified: trunk/dna-repository/src/test/java/org/jboss/dna/repository/sequencer/SequencingServiceTest.java
===================================================================
--- trunk/dna-repository/src/test/java/org/jboss/dna/repository/sequencer/SequencingServiceTest.java	2009-06-10 19:56:53 UTC (rev 1030)
+++ trunk/dna-repository/src/test/java/org/jboss/dna/repository/sequencer/SequencingServiceTest.java	2009-06-10 21:21:36 UTC (rev 1031)
@@ -59,7 +59,7 @@
 
     @Before
     public void beforeEach() {
-        sources = new RepositoryLibrary();
+        sources = new RepositoryLibrary(new ExecutionContext());
         InMemoryRepositorySource source = new InMemoryRepositorySource();
         source.setName(REPOSITORY_SOURCE_NAME);
         sources.addSource(source);



From dna-commits at lists.jboss.org  Wed Jun 10 17:22:01 2009
From: dna-commits at lists.jboss.org (dna-commits at lists.jboss.org)
Date: Wed, 10 Jun 2009 17:22:01 -0400
Subject: [dna-commits] DNA SVN: r1032 - in trunk:
	dna-graph/src/main/java/org/jboss/dna/graph/connector/federation
	and 4 other directories.
Message-ID: <E1MEVFB-0007st-KE@committer01.frg.pub.inap.atl.jboss.com>

Author: rhauch
Date: 2009-06-10 17:22:01 -0400 (Wed, 10 Jun 2009)
New Revision: 1032

Modified:
   trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/RepositoryContext.java
   trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/federation/FederatedRepositorySource.java
   trunk/dna-graph/src/test/java/org/jboss/dna/graph/connector/federation/AbstractFederatedRepositorySourceIntegrationTest.java
   trunk/dna-graph/src/test/java/org/jboss/dna/graph/connector/federation/FederatedRepositorySourceTest.java
   trunk/dna-graph/src/test/java/org/jboss/dna/graph/connector/test/AbstractConnectorTest.java
   trunk/dna-repository/src/main/java/org/jboss/dna/repository/RepositoryLibrary.java
   trunk/dna-repository/src/main/java/org/jboss/dna/repository/RepositoryService.java
   trunk/dna-repository/src/test/java/org/jboss/dna/repository/sequencer/SequencingServiceTest.java
Log:
DNA-449 Federation connector does not find it's configuration when imported using the JcrConfiguration

Changed how the FederatedRepositorySource is reading its configuration to use the new RepositoryContext approach.

Modified: trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/RepositoryContext.java
===================================================================
--- trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/RepositoryContext.java	2009-06-10 21:21:36 UTC (rev 1031)
+++ trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/RepositoryContext.java	2009-06-10 21:22:01 UTC (rev 1032)
@@ -24,7 +24,9 @@
 package org.jboss.dna.graph.connector;
 
 import org.jboss.dna.graph.ExecutionContext;
+import org.jboss.dna.graph.Graph;
 import org.jboss.dna.graph.observe.Observer;
+import org.jboss.dna.graph.property.Path;
 
 /**
  * The context for a repository. This interface need not be implemented by a {@link RepositorySource}, as it is normally provided
@@ -54,4 +56,19 @@
      * @return the observer, or null if the are no listeners and publishing is not required/requested
      */
     Observer getObserver();
+
+    /**
+     * Get a graph to the configuration content, already configured to the correct workspace.
+     * 
+     * @return the configuration graph, or null if there is no configuration
+     */
+    Graph getConfiguration();
+
+    /**
+     * Get the path within the {@link #getConfiguration() configuration} where the source is represented.
+     * 
+     * @return the path to the {@link RepositorySource}'s configuration element, or null if the source is not defined within the
+     *         configuration
+     */
+    Path getPathInConfiguration();
 }

Modified: trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/federation/FederatedRepositorySource.java
===================================================================
--- trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/federation/FederatedRepositorySource.java	2009-06-10 21:21:36 UTC (rev 1031)
+++ trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/federation/FederatedRepositorySource.java	2009-06-10 21:22:01 UTC (rev 1032)
@@ -74,24 +74,13 @@
      */
     public static final int DEFAULT_RETRY_LIMIT = 0;
 
-    /**
-     * The default path to the node defining the configuration for a source.
-     */
-    public static final String DEFAULT_CONFIGURATION_PATH = "/";
-
     protected static final String SOURCE_NAME = "sourceName";
     protected static final String RETRY_LIMIT = "retryLimit";
-    protected static final String CONFIGURATION_SOURCE_NAME = "configurationSourceName";
-    protected static final String CONFIGURATION_PATH = "configurationPath";
-    protected static final String CONFIGURATION_WORKSPACE_NAME = "configurationWorkspaceName";
 
     private static final long serialVersionUID = 1L;
 
     private volatile String name;
     private volatile int retryLimit;
-    private volatile String configurationSourceName;
-    private volatile String configurationWorkspaceName;
-    private volatile String configurationPath = DEFAULT_CONFIGURATION_PATH;
     private volatile RepositorySourceCapabilities capabilities = new RepositorySourceCapabilities(true, true, false, false, true);
     private volatile transient FederatedRepository configuration;
     private volatile transient RepositoryContext context;
@@ -140,114 +129,6 @@
     }
 
     /**
-     * Get the name of the {@link RepositorySource} that should be used to create the {@link FederatedRepository federated
-     * repository configuration} as the configuration repository.
-     * <p>
-     * This is a required property.
-     * </p>
-     * 
-     * @return the name of the {@link RepositorySource} instance that should be used for the configuration
-     * @see #setConfigurationSourceName(String)
-     * @see #getConfigurationWorkspaceName()
-     * @see #getConfigurationPath()
-     */
-    public String getConfigurationSourceName() {
-        return configurationSourceName;
-    }
-
-    /**
-     * Set the name of the {@link RepositorySource} that should be used to create the {@link FederatedRepository federated
-     * repository configuration} as the configuration repository. The instance will be retrieved from the
-     * {@link RepositoryConnectionFactory} instance inside the {@link RepositoryContext#getRepositoryConnectionFactory()
-     * repository context} supplied during {@link RepositorySource#initialize(RepositoryContext) initialization}.
-     * <p>
-     * This is a required property.
-     * </p>
-     * 
-     * @param sourceName the name of the {@link RepositorySource} instance that should be used for the configuration, or null if
-     *        the federated repository instance is to be found in JNDI
-     * @see #getConfigurationSourceName()
-     * @see #setConfigurationPath(String)
-     * @see #setConfigurationWorkspaceName(String)
-     */
-    public synchronized void setConfigurationSourceName( String sourceName ) {
-        if (this.configurationSourceName == sourceName || this.configurationSourceName != null
-            && this.configurationSourceName.equals(sourceName)) return; // unchanged
-        this.configurationSourceName = sourceName;
-        changeConfiguration();
-    }
-
-    /**
-     * Get the name of the workspace in the {@link #getConfigurationSourceName() source} containing the configuration content for
-     * this source. If this workspace name is null, the default workspace as defined by that source will be used.
-     * 
-     * @return the name of the configuration workspace, or null if the default workspace for the
-     *         {@link #getConfigurationSourceName() configuration source} should be used
-     * @see #getConfigurationSourceName()
-     * @see #setConfigurationWorkspaceName(String)
-     * @see #getConfigurationPath()
-     */
-    public String getConfigurationWorkspaceName() {
-        return configurationWorkspaceName;
-    }
-
-    /**
-     * Set the name of the workspace in the {@link #getConfigurationSourceName() source} containing the configuration content for
-     * this source. If this workspace name is null, the default workspace as defined by that source will be used.
-     * 
-     * @param workspaceName the name of the configuration workspace, or null if the default workspace for the
-     *        {@link #getConfigurationSourceName() configuration source} should be used
-     * @see #setConfigurationSourceName(String)
-     * @see #setConfigurationPath(String)
-     * @see #getConfigurationWorkspaceName()
-     */
-    public synchronized void setConfigurationWorkspaceName( String workspaceName ) {
-        if (this.configurationWorkspaceName == workspaceName || this.configurationWorkspaceName != null
-            && this.configurationWorkspaceName.equals(workspaceName)) return; // unchanged
-        this.configurationWorkspaceName = workspaceName;
-        changeConfiguration();
-    }
-
-    /**
-     * Get the path in the {@link #getConfigurationWorkspaceName() workspace} of the {@link #getConfigurationSourceName()
-     * configuration source} where this source can find the content defining its configuration.
-     * <p>
-     * This is a required property.
-     * </p>
-     * 
-     * @return the string array of projection rules, or null if the projection rules haven't yet been set or if the federated
-     *         repository instance is to be found in JNDI
-     * @see #getConfigurationSourceName()
-     * @see #getConfigurationWorkspaceName()
-     * @see #setConfigurationPath(String)
-     */
-    public String getConfigurationPath() {
-        return configurationPath;
-    }
-
-    /**
-     * Set the path in the {@link #getConfigurationWorkspaceName() workspace} of the {@link #getConfigurationSourceName()
-     * configuration source} where this source can find the content defining its configuration.
-     * <p>
-     * This is a required property.
-     * </p>
-     * 
-     * @param pathInSourceToConfigurationRoot the path within the configuration source to the node that should be the root of the
-     *        configuration information, or null if the {@link #DEFAULT_CONFIGURATION_PATH default path} should be used
-     * @see #getConfigurationPath()
-     * @see #setConfigurationSourceName(String)
-     * @see #setConfigurationWorkspaceName(String)
-     */
-    public void setConfigurationPath( String pathInSourceToConfigurationRoot ) {
-        if (this.configurationPath == pathInSourceToConfigurationRoot || this.configurationPath != null
-            && this.configurationPath.equals(pathInSourceToConfigurationRoot)) return;
-        String path = pathInSourceToConfigurationRoot != null ? pathInSourceToConfigurationRoot : DEFAULT_CONFIGURATION_PATH;
-        // Ensure one leading slash and one trailing slashes ...
-        this.configurationPath = path = ("/" + path).replaceAll("^/+", "/").replaceAll("/+$", "") + "/";
-        changeConfiguration();
-    }
-
-    /**
      * {@inheritDoc}
      * 
      * @see org.jboss.dna.graph.connector.RepositorySource#getCapabilities()
@@ -296,16 +177,15 @@
                         I18n msg = GraphI18n.federatedRepositorySourceMustBeInitialized;
                         throw new RepositorySourceException(getName(), msg.text("name", name));
                     }
-                    String configSource = getConfigurationSourceName();
-                    String configWorkspace = getConfigurationWorkspaceName();
-                    String configPath = getConfigurationPath();
-                    if (configSource == null) {
+
+                    // Make sure there is a configuration ...
+                    if (repositoryContext.getConfiguration() == null) {
                         I18n msg = GraphI18n.propertyIsRequiredForFederatedRepositorySource;
-                        throw new RepositorySourceException(getName(), msg.text("configuration source name", name));
+                        throw new RepositorySourceException(getName(), msg.text("configuration", name));
                     }
 
                     // Load the configuration ...
-                    this.configuration = loadRepository(name, repositoryContext, configSource, configWorkspace, configPath);
+                    this.configuration = loadRepository(name, repositoryContext);
                 }
                 config = this.configuration;
             }
@@ -326,9 +206,6 @@
 
         ref.add(new StringRefAddr(SOURCE_NAME, getName()));
         ref.add(new StringRefAddr(RETRY_LIMIT, Integer.toString(getRetryLimit())));
-        ref.add(new StringRefAddr(CONFIGURATION_SOURCE_NAME, getConfigurationSourceName()));
-        ref.add(new StringRefAddr(CONFIGURATION_WORKSPACE_NAME, getConfigurationWorkspaceName()));
-        ref.add(new StringRefAddr(CONFIGURATION_PATH, getConfigurationPath()));
         return ref;
     }
 
@@ -356,16 +233,10 @@
             }
             String sourceName = values.get(SOURCE_NAME);
             String retryLimit = values.get(RETRY_LIMIT);
-            String configSourceName = values.get(CONFIGURATION_SOURCE_NAME);
-            String configSourceWorkspace = values.get(CONFIGURATION_WORKSPACE_NAME);
-            String configSourcePath = values.get(CONFIGURATION_PATH);
 
             // Create the source instance ...
             FederatedRepositorySource source = new FederatedRepositorySource();
             if (sourceName != null) source.setName(sourceName);
-            if (configSourceName != null) source.setConfigurationSourceName(configSourceName);
-            if (configSourceWorkspace != null) source.setConfigurationWorkspaceName(configSourceWorkspace);
-            if (configSourcePath != null) source.setConfigurationPath(configSourcePath);
             if (retryLimit != null) source.setRetryLimit(Integer.parseInt(retryLimit));
             return source;
         }
@@ -408,23 +279,17 @@
     }
 
     /**
-     * Utility to load the current configuration for this source from the {@link #getConfigurationSourceName() configuration
-     * repository}. This method may only be called after the source is {@link #initialize(RepositoryContext) initialized}.
+     * Utility to load the current configuration for this source from the {@link RepositoryContext#getConfiguration()
+     * configuration repository}. This method may only be called after the source is {@link #initialize(RepositoryContext)
+     * initialized}.
      * 
      * @param name the name of the source; may not be null
      * @param repositoryContext the repository context; may not be null
-     * @param configSource the name of the configuration source; may not be null
-     * @param configWorkspace the name of the workspace in the configuration source, or null if the configuration source's default
-     *        workspace should be used
-     * @param configPath the path to the node in the configuration workspace that defines the source; may not be null
      * @return the configuration; never null
      * @throws RepositorySourceException if there is a problem with the configuration
      */
     protected FederatedRepository loadRepository( String name,
-                                                  RepositoryContext repositoryContext,
-                                                  String configSource,
-                                                  String configWorkspace,
-                                                  String configPath ) throws RepositorySourceException {
+                                                  RepositoryContext repositoryContext ) throws RepositorySourceException {
         // All the required properties have been set ...
         ExecutionContext executionContext = repositoryContext.getExecutionContext();
         RepositoryConnectionFactory connectionFactory = repositoryContext.getRepositoryConnectionFactory();
@@ -434,14 +299,12 @@
         ProjectionParser projectionParser = ProjectionParser.getInstance();
         NamespaceRegistry registry = executionContext.getNamespaceRegistry();
 
-        try {
-            Graph config = Graph.create(configSource, connectionFactory, executionContext);
-            if (configWorkspace != null) {
-                configWorkspace = config.useWorkspace(configWorkspace).getName();
-            } else {
-                configWorkspace = config.getCurrentWorkspaceName();
-            }
+        Graph config = repositoryContext.getConfiguration();
+        Path pathOfSource = repositoryContext.getPathInConfiguration();
+        assert config != null;
+        assert pathOfSource != null;
 
+        try {
             // Read the configuration for the federated repository:
             // Level 1: the node representing the federated repository
             // Level 2: the "dna:workspaces" node
@@ -449,7 +312,7 @@
             // Level 4: the "dna:projections" nodes
             // Level 5: a node below "dna:projections" for each projection, with properties for the source name,
             // workspace name, cache expiration time, and projection rules
-            Subgraph repositories = config.getSubgraphOfDepth(5).at(configPath);
+            Subgraph repositories = config.getSubgraphOfDepth(5).at(pathOfSource);
 
             // Get the name of the default workspace ...
             String defaultWorkspaceName = null;
@@ -473,8 +336,8 @@
                 I18n msg = GraphI18n.requiredNodeDoesNotExistRelativeToNode;
                 throw new RepositorySourceException(msg.text(DnaLexicon.WORKSPACES.getString(registry),
                                                              repositories.getLocation().getPath().getString(registry),
-                                                             configWorkspace,
-                                                             configSource));
+                                                             config.getCurrentWorkspaceName(),
+                                                             config.getSourceName()));
             }
 
             // Level 3: The workspace nodes ...
@@ -502,8 +365,8 @@
                                                                             workspaceNode.getLocation()
                                                                                          .getPath()
                                                                                          .getString(registry),
-                                                                            configWorkspace,
-                                                                            configSource));
+                                                                            config.getCurrentWorkspaceName(),
+                                                                            config.getSourceName()));
                 }
 
                 // Level 5: the projection nodes ...
@@ -531,6 +394,9 @@
             throw t; // rethrow
         } catch (Throwable t) {
             I18n msg = GraphI18n.errorReadingConfigurationForFederatedRepositorySource;
+            String configSource = config.getSourceName();
+            String configWorkspace = config.getCurrentWorkspaceName();
+            String configPath = pathOfSource.getString(registry);
             throw new RepositorySourceException(getName(), msg.text(name, configSource, configWorkspace, configPath), t);
         }
     }

Modified: trunk/dna-graph/src/test/java/org/jboss/dna/graph/connector/federation/AbstractFederatedRepositorySourceIntegrationTest.java
===================================================================
--- trunk/dna-graph/src/test/java/org/jboss/dna/graph/connector/federation/AbstractFederatedRepositorySourceIntegrationTest.java	2009-06-10 21:21:36 UTC (rev 1031)
+++ trunk/dna-graph/src/test/java/org/jboss/dna/graph/connector/federation/AbstractFederatedRepositorySourceIntegrationTest.java	2009-06-10 21:22:01 UTC (rev 1032)
@@ -43,6 +43,7 @@
 import org.jboss.dna.graph.connector.RepositoryContext;
 import org.jboss.dna.graph.connector.inmemory.InMemoryRepositorySource;
 import org.jboss.dna.graph.connector.test.AbstractConnectorTest;
+import org.jboss.dna.graph.observe.Observer;
 import org.jboss.dna.graph.property.Name;
 import org.jboss.dna.graph.property.Path;
 import org.jboss.dna.graph.property.PathNotFoundException;
@@ -72,10 +73,9 @@
     protected ExecutionContext context;
     private Map<String, InMemoryRepositorySource> sources;
     protected Graph federated;
+    private RepositoryContext repositoryContext;
     @Mock
     private RepositoryConnectionFactory connectionFactory;
-    @Mock
-    private RepositoryContext repositoryContext;
 
     /**
      * @throws java.lang.Exception
@@ -88,16 +88,6 @@
         configurationWorkspaceName = "configSpace";
         repositoryName = "Test Repository";
 
-        // Set up the source ...
-        source = new FederatedRepositorySource();
-        source.setName(repositoryName);
-        sourceName = "federated source";
-        source.setName(sourceName);
-        source.setConfigurationSourceName(configurationSourceName);
-        source.setConfigurationWorkspaceName(configurationWorkspaceName);
-        source.setConfigurationPath("/a/b/Test Repository");
-        source.initialize(repositoryContext);
-
         // Set up the configuration repository ...
         configRepositorySource = new InMemoryRepositorySource();
         configRepositorySource.setName("Configuration Repository");
@@ -108,13 +98,44 @@
         config.create("/a/b/Test Repository");
         config.create("/a/b/Test Repository/dna:workspaces");
 
+        repositoryContext = new RepositoryContext() {
+            public ExecutionContext getExecutionContext() {
+                return context;
+            }
+
+            public Observer getObserver() {
+                return null;
+            }
+
+            @SuppressWarnings( "synthetic-access" )
+            public RepositoryConnectionFactory getRepositoryConnectionFactory() {
+                return connectionFactory;
+            }
+
+            @SuppressWarnings( "synthetic-access" )
+            public Graph getConfiguration() {
+                Graph result = Graph.create(configRepositorySource, context);
+                result.useWorkspace(configurationWorkspaceName);
+                return result;
+            }
+
+            public Path getPathInConfiguration() {
+                return context.getValueFactories().getPathFactory().create("/a/b/Test Repository");
+            }
+        };
+
+        // Set up the source ...
+        source = new FederatedRepositorySource();
+        source.setName(repositoryName);
+        sourceName = "federated source";
+        source.setName(sourceName);
+        source.initialize(repositoryContext);
+
         // Set up the map of sources ...
         sources = new HashMap<String, InMemoryRepositorySource>();
 
         // Stub the RepositoryContext and RepositoryConnectionFactory instances ...
         configRepositoryConnection = configRepositorySource.getConnection();
-        stub(repositoryContext.getExecutionContext()).toReturn(context);
-        stub(repositoryContext.getRepositoryConnectionFactory()).toReturn(connectionFactory);
         stub(connectionFactory.createConnection(configurationSourceName)).toReturn(configRepositoryConnection);
         stub(connectionFactory.createConnection(sourceName)).toAnswer(new Answer<RepositoryConnection>() {
             public RepositoryConnection answer( InvocationOnMock invocation ) throws Throwable {
@@ -151,16 +172,19 @@
         CheckArg.isNotNull(sourceName, "sourceName");
         CheckArg.isNotNull(workspaceName, "workspaceName");
         CheckArg.isNotEmpty(projectionRules, "projectionRules");
-        assertThat(source.getConfigurationPath().endsWith("/"), is(true));
-        String wsPath = source.getConfigurationPath() + "dna:workspaces/" + federatedWorkspace;
+        String configPath = repositoryContext.getPathInConfiguration().getString(context.getNamespaceRegistry());
+        assertThat(configPath.endsWith("/"), is(false));
+        String wsPath = configPath + "/dna:workspaces/" + federatedWorkspace;
         String projectionPath = wsPath + "/dna:projections/" + projectionName;
         Graph config = Graph.create(configRepositorySource, context);
         config.useWorkspace(configurationWorkspaceName);
         config.createIfMissing(wsPath);
         config.createIfMissing(wsPath + "/dna:projections");
-        config.createAt(projectionPath).with(FederatedLexicon.PROJECTION_RULES, (Object[])projectionRules).with(FederatedLexicon.SOURCE_NAME,
-                                                                                                                sourceName).with(FederatedLexicon.WORKSPACE_NAME,
-                                                                                                                                 workspaceName).and();
+        config.createAt(projectionPath)
+              .with(FederatedLexicon.PROJECTION_RULES, (Object[])projectionRules)
+              .with(FederatedLexicon.SOURCE_NAME, sourceName)
+              .with(FederatedLexicon.WORKSPACE_NAME, workspaceName)
+              .and();
         // Make sure the source and workspace exist ...
         graphFor(sourceName, workspaceName);
     }
@@ -258,8 +282,10 @@
         Path fedPath = fedNode.getLocation().getPath();
         Path sourcePath = sourceNode.getLocation().getPath();
         if (!fedPath.isRoot() && !sourcePath.isRoot()) {
-            assertThat(fedNode.getLocation().getPath().getLastSegment().getName(),
-                       is(sourceNode.getLocation().getPath().getLastSegment().getName()));
+            assertThat(fedNode.getLocation().getPath().getLastSegment().getName(), is(sourceNode.getLocation()
+                                                                                                .getPath()
+                                                                                                .getLastSegment()
+                                                                                                .getName()));
         }
         // The children should match ...
         List<Path.Segment> fedChildren = new ArrayList<Path.Segment>();

Modified: trunk/dna-graph/src/test/java/org/jboss/dna/graph/connector/federation/FederatedRepositorySourceTest.java
===================================================================
--- trunk/dna-graph/src/test/java/org/jboss/dna/graph/connector/federation/FederatedRepositorySourceTest.java	2009-06-10 21:21:36 UTC (rev 1031)
+++ trunk/dna-graph/src/test/java/org/jboss/dna/graph/connector/federation/FederatedRepositorySourceTest.java	2009-06-10 21:22:01 UTC (rev 1032)
@@ -46,6 +46,8 @@
 import org.jboss.dna.graph.connector.RepositoryConnectionFactory;
 import org.jboss.dna.graph.connector.RepositoryContext;
 import org.jboss.dna.graph.connector.inmemory.InMemoryRepositorySource;
+import org.jboss.dna.graph.observe.Observer;
+import org.jboss.dna.graph.property.Path;
 import org.junit.Before;
 import org.junit.Test;
 import org.mockito.ArgumentMatcher;
@@ -68,7 +70,6 @@
     private RepositoryConnection connection;
     @Mock
     private RepositoryConnectionFactory connectionFactory;
-    @Mock
     private RepositoryContext repositoryContext;
 
     /**
@@ -80,16 +81,42 @@
         context = new ExecutionContext();
         configurationSourceName = "configuration";
         repositoryName = "Test Repository";
+        configRepositorySource = new InMemoryRepositorySource();
+        configRepositorySource.setName("Configuration Repository");
+
+        repositoryContext = new RepositoryContext() {
+            @SuppressWarnings( "synthetic-access" )
+            public ExecutionContext getExecutionContext() {
+                return context;
+            }
+
+            public Observer getObserver() {
+                return null;
+            }
+
+            @SuppressWarnings( "synthetic-access" )
+            public RepositoryConnectionFactory getRepositoryConnectionFactory() {
+                return connectionFactory;
+            }
+
+            @SuppressWarnings( "synthetic-access" )
+            public Graph getConfiguration() {
+                Graph result = Graph.create(configRepositorySource, context);
+                result.useWorkspace("configSpace");
+                return result;
+            }
+
+            @SuppressWarnings( "synthetic-access" )
+            public Path getPathInConfiguration() {
+                return context.getValueFactories().getPathFactory().create("/a/b/Test Repository");
+            }
+        };
+
         source = new FederatedRepositorySource();
         source.setName(repositoryName);
         sourceName = "federated source";
         source.setName(sourceName);
-        source.setConfigurationSourceName(configurationSourceName);
-        source.setConfigurationWorkspaceName("configSpace");
-        source.setConfigurationPath("/a/b/Test Repository");
         source.initialize(repositoryContext);
-        configRepositorySource = new InMemoryRepositorySource();
-        configRepositorySource.setName("Configuration Repository");
 
         Graph configRepository = Graph.create(configRepositorySource, context);
         configRepository.createWorkspace().named("configSpace");
@@ -99,24 +126,26 @@
         batch.create("/a/b/Test Repository").with(FederatedLexicon.DEFAULT_WORKSPACE_NAME, "fedSpace").and();
         batch.create("/a/b/Test Repository/dna:workspaces").and();
         batch.create("/a/b/Test Repository/dna:workspaces/fedSpace").and();
-        batch.create("/a/b/Test Repository/dna:workspaces/fedSpace/dna:cache").with(FederatedLexicon.PROJECTION_RULES, "/ => /").with(FederatedLexicon.SOURCE_NAME,
-                                                                                                                                      "cache source").with(FederatedLexicon.WORKSPACE_NAME,
-                                                                                                                                                           "cacheSpace").with(FederatedLexicon.TIME_TO_EXPIRE,
-                                                                                                                                                                              100000).and();
+        batch.create("/a/b/Test Repository/dna:workspaces/fedSpace/dna:cache")
+             .with(FederatedLexicon.PROJECTION_RULES, "/ => /")
+             .with(FederatedLexicon.SOURCE_NAME, "cache source")
+             .with(FederatedLexicon.WORKSPACE_NAME, "cacheSpace")
+             .with(FederatedLexicon.TIME_TO_EXPIRE, 100000)
+             .and();
         batch.create("/a/b/Test Repository/dna:workspaces/fedSpace/dna:projections").and();
-        batch.create("/a/b/Test Repository/dna:workspaces/fedSpace/dna:projections/projection1").with(FederatedLexicon.PROJECTION_RULES,
-                                                                                                      "/ => /s1").with(FederatedLexicon.SOURCE_NAME,
-                                                                                                                       "source 1").with(FederatedLexicon.WORKSPACE_NAME,
-                                                                                                                                        "s1 workspace").and();
-        batch.create("/a/b/Test Repository/dna:workspaces/fedSpace/dna:projections/projection2").with(FederatedLexicon.PROJECTION_RULES,
-                                                                                                      "/ => /s2").with(FederatedLexicon.SOURCE_NAME,
-                                                                                                                       "source 2").with(FederatedLexicon.WORKSPACE_NAME,
-                                                                                                                                        "s2 worskspace").and();
+        batch.create("/a/b/Test Repository/dna:workspaces/fedSpace/dna:projections/projection1")
+             .with(FederatedLexicon.PROJECTION_RULES, "/ => /s1")
+             .with(FederatedLexicon.SOURCE_NAME, "source 1")
+             .with(FederatedLexicon.WORKSPACE_NAME, "s1 workspace")
+             .and();
+        batch.create("/a/b/Test Repository/dna:workspaces/fedSpace/dna:projections/projection2")
+             .with(FederatedLexicon.PROJECTION_RULES, "/ => /s2")
+             .with(FederatedLexicon.SOURCE_NAME, "source 2")
+             .with(FederatedLexicon.WORKSPACE_NAME, "s2 worskspace")
+             .and();
         batch.execute();
 
         configRepositoryConnection = configRepositorySource.getConnection();
-        stub(repositoryContext.getExecutionContext()).toReturn(context);
-        stub(repositoryContext.getRepositoryConnectionFactory()).toReturn(connectionFactory);
         stub(connectionFactory.createConnection(configurationSourceName)).toReturn(configRepositoryConnection);
     }
 
@@ -199,8 +228,6 @@
         int retryLimit = 100;
         source.setRetryLimit(retryLimit);
         source.setName("Some source");
-        source.setConfigurationSourceName("config source");
-        source.setConfigurationPath("/a/b/c");
 
         Reference ref = source.getReference();
         assertThat(ref.getClassName(), is(FederatedRepositorySource.class.getName()));
@@ -215,11 +242,6 @@
 
         assertThat((String)refAttributes.remove(FederatedRepositorySource.SOURCE_NAME), is(source.getName()));
         assertThat((String)refAttributes.remove(FederatedRepositorySource.RETRY_LIMIT), is(Integer.toString(retryLimit)));
-        assertThat((String)refAttributes.remove(FederatedRepositorySource.CONFIGURATION_WORKSPACE_NAME),
-                   is(source.getConfigurationWorkspaceName()));
-        assertThat((String)refAttributes.remove(FederatedRepositorySource.CONFIGURATION_SOURCE_NAME),
-                   is(source.getConfigurationSourceName()));
-        assertThat((String)refAttributes.remove(FederatedRepositorySource.CONFIGURATION_PATH), is("/a/b/c/"));
         assertThat(refAttributes.isEmpty(), is(true));
 
         // Recreate the object, use a newly constructed source ...
@@ -232,9 +254,6 @@
 
         assertThat(recoveredSource.getName(), is(source.getName()));
         assertThat(recoveredSource.getRetryLimit(), is(source.getRetryLimit()));
-        assertThat(recoveredSource.getConfigurationSourceName(), is(source.getConfigurationSourceName()));
-        assertThat(recoveredSource.getConfigurationWorkspaceName(), is(source.getConfigurationWorkspaceName()));
-        assertThat(recoveredSource.getConfigurationPath(), is(source.getConfigurationPath()));
 
         assertThat(recoveredSource.equals(source), is(true));
         assertThat(source.equals(recoveredSource), is(true));

Modified: trunk/dna-graph/src/test/java/org/jboss/dna/graph/connector/test/AbstractConnectorTest.java
===================================================================
--- trunk/dna-graph/src/test/java/org/jboss/dna/graph/connector/test/AbstractConnectorTest.java	2009-06-10 21:21:36 UTC (rev 1031)
+++ trunk/dna-graph/src/test/java/org/jboss/dna/graph/connector/test/AbstractConnectorTest.java	2009-06-10 21:22:01 UTC (rev 1032)
@@ -83,6 +83,7 @@
     protected static ExecutionContext context;
     protected static RepositorySource source;
     protected static Graph graph;
+    protected static RepositorySource configSource;
     private static RepositoryConnectionFactory connectionFactory;
     private static List<RepositoryConnection> openConnections;
     private static boolean running;
@@ -96,6 +97,9 @@
             // Set up the execution context ...
             context = setUpExecutionContext(new ExecutionContext());
 
+            // Set up the configuration source ...
+            configSource = setUpConfigurationSource();
+
             // Set up the source ...
             source = setUpSource();
 
@@ -128,6 +132,19 @@
                 public Observer getObserver() {
                     return null; // no observers here
                 }
+
+                public Graph getConfiguration() {
+                    Graph result = null;
+                    if (configSource != null) {
+                        result = Graph.create(configSource, getExecutionContext());
+                        // use the default workspace
+                    }
+                    return result;
+                }
+
+                public Path getPathInConfiguration() {
+                    return getExecutionContext().getValueFactories().getPathFactory().create(source.getName());
+                }
             });
 
             // And set up the graph instance ...
@@ -200,6 +217,17 @@
     }
 
     /**
+     * Set up a {@link RepositorySource} that contains the configuration for the source being tested (and any other sources, if
+     * needed). The source's default workspace will be used. This implementation returns null by default.
+     * 
+     * @return the configuration source, or null if no configuration is needed
+     * @throws Exception if there is a problem setting up the source
+     */
+    protected RepositorySource setUpConfigurationSource() throws Exception {
+        return null;
+    }
+
+    /**
      * Set up a {@link RepositorySource} that should be used for each of the unit tests.
      * 
      * @return the repository source

Modified: trunk/dna-repository/src/main/java/org/jboss/dna/repository/RepositoryLibrary.java
===================================================================
--- trunk/dna-repository/src/main/java/org/jboss/dna/repository/RepositoryLibrary.java	2009-06-10 21:21:36 UTC (rev 1031)
+++ trunk/dna-repository/src/main/java/org/jboss/dna/repository/RepositoryLibrary.java	2009-06-10 21:22:01 UTC (rev 1032)
@@ -36,6 +36,7 @@
 import net.jcip.annotations.ThreadSafe;
 import org.jboss.dna.common.util.CheckArg;
 import org.jboss.dna.graph.ExecutionContext;
+import org.jboss.dna.graph.Graph;
 import org.jboss.dna.graph.connector.RepositoryConnection;
 import org.jboss.dna.graph.connector.RepositoryConnectionFactory;
 import org.jboss.dna.graph.connector.RepositoryConnectionPool;
@@ -46,6 +47,7 @@
 import org.jboss.dna.graph.observe.Changes;
 import org.jboss.dna.graph.observe.Observable;
 import org.jboss.dna.graph.observe.Observer;
+import org.jboss.dna.graph.property.Path;
 import org.jboss.dna.repository.service.AbstractServiceAdministrator;
 import org.jboss.dna.repository.service.ServiceAdministrator;
 
@@ -110,49 +112,56 @@
     private final CopyOnWriteArrayList<RepositoryConnectionPool> pools = new CopyOnWriteArrayList<RepositoryConnectionPool>();
     private RepositoryConnectionFactory delegate;
     private final ExecutionContext executionContext;
-    private final RepositoryContext repositoryContext;
     private final ObservationBus observationBus = new InMemoryObservationBus();
+    private final RepositorySource configurationSource;
+    private final String configurationWorkspaceName;
+    private final Path pathToConfigurationRoot;
 
     /**
      * Create a new manager instance.
      * 
-     * @param executionContext the execution context, which can be used used by sources to create other {@link ExecutionContext}
-     *        instances with different JAAS security contexts
+     * @param configurationSource the {@link RepositorySource} that is the configuration repository
+     * @param configurationWorkspaceName the name of the workspace in the {@link RepositorySource} that is the configuration
+     *        repository, or null if the default workspace of the source should be used (if there is one)
+     * @param pathToSourcesConfigurationRoot the path of the node in the configuration source repository that should be treated by
+     *        this service as the root of the service's configuration; if null, then "/dna:system" is used
+     * @param context the execution context in which this service should run
      * @throws IllegalArgumentException if the <code>executionContextFactory</code> reference is null
      */
-    public RepositoryLibrary( final ExecutionContext executionContext ) {
-        CheckArg.isNotNull(executionContext, "executionContext");
-        this.executionContext = executionContext;
-        final ObservationBus observationBus = this.observationBus;
-        this.repositoryContext = new RepositoryContext() {
-            /**
-             * {@inheritDoc}
-             * 
-             * @see org.jboss.dna.graph.connector.RepositoryContext#getExecutionContext()
-             */
-            public ExecutionContext getExecutionContext() {
-                return executionContext;
-            }
+    public RepositoryLibrary( RepositorySource configurationSource,
+                              String configurationWorkspaceName,
+                              Path pathToSourcesConfigurationRoot,
+                              final ExecutionContext context ) {
+        CheckArg.isNotNull(configurationSource, "configurationSource");
+        CheckArg.isNotNull(context, "context");
+        CheckArg.isNotNull(pathToSourcesConfigurationRoot, "pathToSourcesConfigurationRoot");
+        this.executionContext = context;
+        this.configurationSource = configurationSource;
+        this.configurationWorkspaceName = configurationWorkspaceName;
+        this.pathToConfigurationRoot = pathToSourcesConfigurationRoot;
+    }
 
-            /**
-             * {@inheritDoc}
-             * 
-             * @see org.jboss.dna.graph.connector.RepositoryContext#getRepositoryConnectionFactory()
-             */
-            public RepositoryConnectionFactory getRepositoryConnectionFactory() {
-                return RepositoryLibrary.this;
-            }
+    /**
+     * Get the path to the top-level of the configuration root.
+     * 
+     * @return pathToConfigurationRoot
+     */
+    protected Path getPathToConfigurationRoot() {
+        return pathToConfigurationRoot;
+    }
 
-            /**
-             * {@inheritDoc}
-             * 
-             * @see org.jboss.dna.graph.connector.RepositoryContext#getObserver()
-             */
-            public Observer getObserver() {
-                return observationBus.hasObservers() ? observationBus : null;
-            }
+    /**
+     * @return configurationSource
+     */
+    protected RepositorySource getConfigurationSource() {
+        return configurationSource;
+    }
 
-        };
+    /**
+     * @return configurationWorkspaceName
+     */
+    protected String getConfigurationWorkspaceName() {
+        return configurationWorkspaceName;
     }
 
     /**
@@ -350,9 +359,68 @@
         if (source == null) return false;
         try {
             this.sourcesLock.writeLock().lock();
+            final String sourceName = source.getName();
             for (RepositoryConnectionPool existingPool : this.pools) {
-                if (existingPool.getRepositorySource().getName().equals(source.getName())) return false;
+                if (existingPool.getRepositorySource().getName().equals(sourceName)) return false;
             }
+            // Create a repository context for this source ...
+            final ObservationBus observationBus = this.observationBus;
+            RepositoryContext repositoryContext = new RepositoryContext() {
+                /**
+                 * {@inheritDoc}
+                 * 
+                 * @see org.jboss.dna.graph.connector.RepositoryContext#getExecutionContext()
+                 */
+                public ExecutionContext getExecutionContext() {
+                    return getExecutionContext();
+                }
+
+                /**
+                 * {@inheritDoc}
+                 * 
+                 * @see org.jboss.dna.graph.connector.RepositoryContext#getRepositoryConnectionFactory()
+                 */
+                public RepositoryConnectionFactory getRepositoryConnectionFactory() {
+                    return RepositoryLibrary.this;
+                }
+
+                /**
+                 * {@inheritDoc}
+                 * 
+                 * @see org.jboss.dna.graph.connector.RepositoryContext#getObserver()
+                 */
+                public Observer getObserver() {
+                    return observationBus.hasObservers() ? observationBus : null;
+                }
+
+                /**
+                 * {@inheritDoc}
+                 * 
+                 * @see org.jboss.dna.graph.connector.RepositoryContext#getConfiguration()
+                 */
+                public Graph getConfiguration() {
+                    Graph result = null;
+                    RepositorySource configSource = getConfigurationSource();
+                    if (configSource != null) {
+                        result = Graph.create(configSource, getExecutionContext());
+                        String workspaceName = getConfigurationWorkspaceName();
+                        if (workspaceName != null) {
+                            result.useWorkspace(workspaceName);
+                        }
+                    }
+                    return result;
+                }
+
+                /**
+                 * {@inheritDoc}
+                 * 
+                 * @see org.jboss.dna.graph.connector.RepositoryContext#getPathInConfiguration()
+                 */
+                public Path getPathInConfiguration() {
+                    Path configPath = getPathToConfigurationRoot();
+                    return getExecutionContext().getValueFactories().getPathFactory().create(configPath, sourceName);
+                }
+            };
             source.initialize(repositoryContext);
             RepositoryConnectionPool pool = new RepositoryConnectionPool(source);
             this.pools.add(pool);

Modified: trunk/dna-repository/src/main/java/org/jboss/dna/repository/RepositoryService.java
===================================================================
--- trunk/dna-repository/src/main/java/org/jboss/dna/repository/RepositoryService.java	2009-06-10 21:21:36 UTC (rev 1031)
+++ trunk/dna-repository/src/main/java/org/jboss/dna/repository/RepositoryService.java	2009-06-10 21:22:01 UTC (rev 1032)
@@ -44,6 +44,7 @@
 import org.jboss.dna.graph.connector.RepositorySource;
 import org.jboss.dna.graph.property.Name;
 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.PropertyType;
@@ -124,10 +125,11 @@
                               ExecutionContext context ) {
         CheckArg.isNotNull(configurationSource, "configurationSource");
         CheckArg.isNotNull(context, "context");
-        if (pathToConfigurationRoot == null) pathToConfigurationRoot = context.getValueFactories()
-                                                                              .getPathFactory()
-                                                                              .create("/dna:system");
-        this.sources = new RepositoryLibrary(context);
+        PathFactory pathFactory = context.getValueFactories().getPathFactory();
+        if (pathToConfigurationRoot == null) pathToConfigurationRoot = pathFactory.create("/dna:system");
+        Path sourcesPath = pathFactory.create(pathToConfigurationRoot, DnaLexicon.SOURCES);
+
+        this.sources = new RepositoryLibrary(configurationSource, configurationWorkspaceName, sourcesPath, context);
         this.sources.addSource(configurationSource);
         this.pathToConfigurationRoot = pathToConfigurationRoot;
         this.configurationSourceName = configurationSource.getName();

Modified: trunk/dna-repository/src/test/java/org/jboss/dna/repository/sequencer/SequencingServiceTest.java
===================================================================
--- trunk/dna-repository/src/test/java/org/jboss/dna/repository/sequencer/SequencingServiceTest.java	2009-06-10 21:21:36 UTC (rev 1031)
+++ trunk/dna-repository/src/test/java/org/jboss/dna/repository/sequencer/SequencingServiceTest.java	2009-06-10 21:22:01 UTC (rev 1032)
@@ -36,6 +36,7 @@
 import org.jboss.dna.graph.ExecutionContext;
 import org.jboss.dna.graph.Graph;
 import org.jboss.dna.graph.connector.inmemory.InMemoryRepositorySource;
+import org.jboss.dna.graph.property.Path;
 import org.jboss.dna.repository.RepositoryLibrary;
 import org.jboss.dna.repository.service.ServiceAdministrator;
 import org.junit.After;
@@ -59,7 +60,12 @@
 
     @Before
     public void beforeEach() {
-        sources = new RepositoryLibrary(new ExecutionContext());
+        ExecutionContext context = new ExecutionContext();
+        InMemoryRepositorySource configSource = new InMemoryRepositorySource();
+        configSource.setDefaultWorkspaceName("default");
+        Path configPath = context.getValueFactories().getPathFactory().create("/");
+
+        sources = new RepositoryLibrary(configSource, "default", configPath, context);
         InMemoryRepositorySource source = new InMemoryRepositorySource();
         source.setName(REPOSITORY_SOURCE_NAME);
         sources.addSource(source);



From dna-commits at lists.jboss.org  Wed Jun 10 17:22:10 2009
From: dna-commits at lists.jboss.org (dna-commits at lists.jboss.org)
Date: Wed, 10 Jun 2009 17:22:10 -0400
Subject: [dna-commits] DNA SVN: r1033 -
	trunk/docs/reference/src/main/docbook/en-US/content/connectors.
Message-ID: <E1MEVFK-0007tW-3d@committer01.frg.pub.inap.atl.jboss.com>

Author: rhauch
Date: 2009-06-10 17:22:09 -0400 (Wed, 10 Jun 2009)
New Revision: 1033

Modified:
   trunk/docs/reference/src/main/docbook/en-US/content/connectors/federation.xml
Log:
DNA-449 Federation connector does not find it's configuration when imported using the JcrConfiguration

Updated the Reference Guide's chapter on the federated connector so that it reflects the (slightly) updated approach.  Note that several JavaBean properties are no longer needed, which should make it at least a little easier to configure.

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	2009-06-10 21:22:01 UTC (rev 1032)
+++ trunk/docs/reference/src/main/docbook/en-US/content/connectors/federation.xml	2009-06-10 21:22:09 UTC (rev 1033)
@@ -401,31 +401,21 @@
 			<title>Configuration</title>
 			<para>
 				The federated repository uses other &RepositorySource;s that are to be federated and a &RepositorySource; that is to be used as the
-				cache of the unified contents.  These are configured in another &RepositorySource; that is treated as a configuration repository.
-				The &FederatedRepositorySource; class uses JavaBean properties to define the name of the configuration repository and 
-				the path to the "<code>dna:federation</code>" node in that configuration repository containing the information about the 
-				cache and federated sources.  This graph structure that is expected at this location is as follows:
+				cache of the unified contents.  These are configured in another &RepositorySource; that is treated as a configuration repository,
+				which should contain information about the workspaces and how other sources are projected:
 			</para>
 			<programlisting role='xml'><![CDATA[<!-- Define the federation configuration. -->
-<dna:federatedRepository xmlns:dna="http://www.jboss.org/dna" 
-	                   xmlns:jcr="http://www.jcp.org/jcr/1.0"
-                     dna:timeToCache="100000" >
-  <dna:workspaces>
-    <dna:workspace jcr:name="default">
-	    <!-- Define how the content in the 'Cache' source is to map to the federated cache -->
-      <dna:cache dna:sourceName="Cache" dna:workspaceName="default" dna:projectionRules="/a => /" />
-
-      <!-- Define how the content in the two sources maps to the federated/unified repository.
-           This example puts the 'Cars' and 'Aircraft' content underneath '/vehicles', but the
-           'Configuration' content (which is defined by this file) will appear under '/'. -->
-      <dna:projections>
-        <dna:projection jcr:name="Cars" dna:projectionRules="/Vehicles => /" />
-        <dna:projection jcr:name="Aircraft" dna:projectionRules="/Vehicles => /" />
-        <dna:projection jcr:name="Configuration" dna:projectionRules="/ => /" />
-      </dna:projections>
-    </dna:workspace>
-	</dna:workspaces>
-</dna:federatedRepository>
+<dna:workspaces>
+  <dna:workspace jcr:name="default">
+    <!-- Define how the content in the two sources maps to the federated/unified repository.
+         This example puts the 'Cars' and 'Aircraft' content underneath '/vehicles', but the
+         'Configuration' content (which is defined by this file) will appear under '/'. -->
+    <dna:projections>
+      <dna:projection jcr:name="Cars" dna:projectionRules="/Vehicles => /" />
+      <dna:projection jcr:name="Aircraft" dna:projectionRules="/Vehicles => /" />
+    </dna:projections>
+  </dna:workspace>
+</dna:workspaces>
 ]]></programlisting>
 			<note>
 				<para>
@@ -440,7 +430,8 @@
 		<sect1>
 			<title>Repository Source properties</title>
 			<para>
-				The &FederatedRepositorySource; class provides a number of JavaBean properties that control its behavior:
+				While the majority of the configuration is defined using the configuration source (as discussed above), the &FederatedRepositorySource; 
+				class have have a few JavaBean properties:
 			</para>
 			<table frame='all'>
 				<title>&FederatedRepositorySource; properties</title>
@@ -459,23 +450,6 @@
 							<entry>The name of the repository source, which is used by the &RepositoryService; when obtaining a &RepositoryConnection; by name.</entry>
 						</row>
 						<row>
-							<entry>configurationSourceName</entry>
-							<entry>The name of the &RepositorySource; that should be used as the configuration repository, and in which is defined
-								how this federated repository is to be set up and configured.
-								This name is supplied to the &RepositoryConnectionFactory; that is provided to this instance when added to the
-								&RepositoryLibrary;.</entry>
-						</row>
-						<row>
-							<entry>configurationWorkspaceName</entry>
-							<entry>The name of the workspace in the configuration &RepositorySource; with the content defining
-								how this federated repository is to be set up and configured.</entry>
-						</row>
-						<row>
-							<entry>configurationSourcePath</entry>
-							<entry>The path to the node in the configuration repository below which a "dna:federation" node exists with the 
-								graph structure describing how this federated repository is to be configured.</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>



From dna-commits at lists.jboss.org  Wed Jun 10 17:22:34 2009
From: dna-commits at lists.jboss.org (dna-commits at lists.jboss.org)
Date: Wed, 10 Jun 2009 17:22:34 -0400
Subject: [dna-commits] DNA SVN: r1034 - in trunk:
	dna-graph/src/main/java/org/jboss/dna/graph/connector/federation
	and 4 other directories.
Message-ID: <E1MEVFi-0007ur-7u@committer01.frg.pub.inap.atl.jboss.com>

Author: rhauch
Date: 2009-06-10 17:22:34 -0400 (Wed, 10 Jun 2009)
New Revision: 1034

Modified:
   trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/RepositoryContext.java
   trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/RepositorySource.java
   trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/federation/FederatedRepositorySource.java
   trunk/dna-graph/src/main/resources/org/jboss/dna/graph/GraphI18n.properties
   trunk/dna-graph/src/test/java/org/jboss/dna/graph/connector/federation/AbstractFederatedRepositorySourceIntegrationTest.java
   trunk/dna-graph/src/test/java/org/jboss/dna/graph/connector/federation/FederatedRepositorySourceTest.java
   trunk/dna-graph/src/test/java/org/jboss/dna/graph/connector/test/AbstractConnectorTest.java
   trunk/dna-repository/src/main/java/org/jboss/dna/repository/RepositoryLibrary.java
Log:
DNA-449 Federation connector does not find it's configuration when imported using the JcrConfiguration

Change the RepositoryContext to expose a subgraph snapshot of the configuration. This is not only easier to use, but it requires less setup and also prevents the RepositorySource from changing the configuration content. Also added a note to the RepositorySource.initialize(RepositoryContext) method that it may be called whenever the configuration changes.

Modified: trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/RepositoryContext.java
===================================================================
--- trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/RepositoryContext.java	2009-06-10 21:22:09 UTC (rev 1033)
+++ trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/RepositoryContext.java	2009-06-10 21:22:34 UTC (rev 1034)
@@ -24,9 +24,8 @@
 package org.jboss.dna.graph.connector;
 
 import org.jboss.dna.graph.ExecutionContext;
-import org.jboss.dna.graph.Graph;
+import org.jboss.dna.graph.Subgraph;
 import org.jboss.dna.graph.observe.Observer;
-import org.jboss.dna.graph.property.Path;
 
 /**
  * The context for a repository. This interface need not be implemented by a {@link RepositorySource}, as it is normally provided
@@ -58,17 +57,11 @@
     Observer getObserver();
 
     /**
-     * Get a graph to the configuration content, already configured to the correct workspace.
+     * Get a snapshot of the current configuration for the {@link RepositorySource}. The root of the subgraph will be the node in
+     * the configuration that represents the RepositorySource.
      * 
-     * @return the configuration graph, or null if there is no configuration
+     * @param depth the max depth of the configuration subgraph
+     * @return the configuration snapshot as a subgraph, or null if there is no configuration
      */
-    Graph getConfiguration();
-
-    /**
-     * Get the path within the {@link #getConfiguration() configuration} where the source is represented.
-     * 
-     * @return the path to the {@link RepositorySource}'s configuration element, or null if the source is not defined within the
-     *         configuration
-     */
-    Path getPathInConfiguration();
+    Subgraph getConfiguration( int depth );
 }

Modified: trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/RepositorySource.java
===================================================================
--- trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/RepositorySource.java	2009-06-10 21:22:09 UTC (rev 1033)
+++ trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/RepositorySource.java	2009-06-10 21:22:34 UTC (rev 1034)
@@ -139,9 +139,13 @@
 public interface RepositorySource extends Referenceable, Serializable {
 
     /**
-     * Initialize this source to use the supplied {@link RepositoryContext}, from which this source can obtain
-     * {@link RepositoryContext#getRepositoryConnectionFactory() connections} to other {@link RepositorySource sources} as well as
-     * {@link RepositoryContext#getExecutionContext() execution contexts}.
+     * Initialize this source to use the supplied {@link RepositoryContext}, from which this source can obtain the
+     * {@link RepositoryContext#getConfiguration(int) configuration} defining this source,
+     * {@link RepositoryContext#getRepositoryConnectionFactory() connections} to other {@link RepositorySource sources}, and the
+     * {@link RepositoryContext#getExecutionContext() execution context}.
+     * <p>
+     * This method may be called each time the configuration changes, allowing the source to update itself.
+     * </p>
      * 
      * @param context
      * @throws RepositorySourceException

Modified: trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/federation/FederatedRepositorySource.java
===================================================================
--- trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/federation/FederatedRepositorySource.java	2009-06-10 21:22:09 UTC (rev 1033)
+++ trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/federation/FederatedRepositorySource.java	2009-06-10 21:22:34 UTC (rev 1034)
@@ -43,7 +43,6 @@
 import org.jboss.dna.common.util.HashCode;
 import org.jboss.dna.graph.DnaLexicon;
 import org.jboss.dna.graph.ExecutionContext;
-import org.jboss.dna.graph.Graph;
 import org.jboss.dna.graph.GraphI18n;
 import org.jboss.dna.graph.Location;
 import org.jboss.dna.graph.Node;
@@ -178,12 +177,6 @@
                         throw new RepositorySourceException(getName(), msg.text("name", name));
                     }
 
-                    // Make sure there is a configuration ...
-                    if (repositoryContext.getConfiguration() == null) {
-                        I18n msg = GraphI18n.propertyIsRequiredForFederatedRepositorySource;
-                        throw new RepositorySourceException(getName(), msg.text("configuration", name));
-                    }
-
                     // Load the configuration ...
                     this.configuration = loadRepository(name, repositoryContext);
                 }
@@ -279,7 +272,7 @@
     }
 
     /**
-     * Utility to load the current configuration for this source from the {@link RepositoryContext#getConfiguration()
+     * Utility to load the current configuration for this source from the {@link RepositoryContext#getConfiguration(int)
      * configuration repository}. This method may only be called after the source is {@link #initialize(RepositoryContext)
      * initialized}.
      * 
@@ -299,11 +292,6 @@
         ProjectionParser projectionParser = ProjectionParser.getInstance();
         NamespaceRegistry registry = executionContext.getNamespaceRegistry();
 
-        Graph config = repositoryContext.getConfiguration();
-        Path pathOfSource = repositoryContext.getPathInConfiguration();
-        assert config != null;
-        assert pathOfSource != null;
-
         try {
             // Read the configuration for the federated repository:
             // Level 1: the node representing the federated repository
@@ -312,7 +300,7 @@
             // Level 4: the "dna:projections" nodes
             // Level 5: a node below "dna:projections" for each projection, with properties for the source name,
             // workspace name, cache expiration time, and projection rules
-            Subgraph repositories = config.getSubgraphOfDepth(5).at(pathOfSource);
+            Subgraph repositories = repositoryContext.getConfiguration(5);
 
             // Get the name of the default workspace ...
             String defaultWorkspaceName = null;
@@ -336,8 +324,8 @@
                 I18n msg = GraphI18n.requiredNodeDoesNotExistRelativeToNode;
                 throw new RepositorySourceException(msg.text(DnaLexicon.WORKSPACES.getString(registry),
                                                              repositories.getLocation().getPath().getString(registry),
-                                                             config.getCurrentWorkspaceName(),
-                                                             config.getSourceName()));
+                                                             repositories.getGraph().getCurrentWorkspaceName(),
+                                                             repositories.getGraph().getSourceName()));
             }
 
             // Level 3: The workspace nodes ...
@@ -365,8 +353,8 @@
                                                                             workspaceNode.getLocation()
                                                                                          .getPath()
                                                                                          .getString(registry),
-                                                                            config.getCurrentWorkspaceName(),
-                                                                            config.getSourceName()));
+                                                                            repositories.getGraph().getCurrentWorkspaceName(),
+                                                                            repositories.getGraph().getSourceName()));
                 }
 
                 // Level 5: the projection nodes ...
@@ -394,10 +382,7 @@
             throw t; // rethrow
         } catch (Throwable t) {
             I18n msg = GraphI18n.errorReadingConfigurationForFederatedRepositorySource;
-            String configSource = config.getSourceName();
-            String configWorkspace = config.getCurrentWorkspaceName();
-            String configPath = pathOfSource.getString(registry);
-            throw new RepositorySourceException(getName(), msg.text(name, configSource, configWorkspace, configPath), t);
+            throw new RepositorySourceException(getName(), msg.text(name), t);
         }
     }
 

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	2009-06-10 21:22:09 UTC (rev 1033)
+++ trunk/dna-graph/src/main/resources/org/jboss/dna/graph/GraphI18n.properties	2009-06-10 21:22:34 UTC (rev 1034)
@@ -87,7 +87,7 @@
 namePropertyIsRequiredForFederatedRepositorySource = The "{0}" property is required on each federated repository source
 propertyIsRequiredForFederatedRepositorySource = The "{0}" property is required on the "{1}" federated repository source
 federatedRepositorySourceMustBeInitialized = The "{0}" federated repository source must be initialized before it can be used
-errorReadingConfigurationForFederatedRepositorySource = Error with the "{0}" federated repository source's configuration at "{3}" in the "{2}" workspace of "{1}"
+errorReadingConfigurationForFederatedRepositorySource = Error with the "{0}" federated repository source's configuration
 errorAddingProjectionRuleParseMethod = Error while adding a parsing method for a federation projection rule
 requiredNodeDoesNotExistRelativeToNode = The required node "{0}" does not exist relative to "{1}" in "{2}" workspace of the "{3}" repository
 unableToObtainConnectionToFederatedSource = Unable to obtain a connection to source "{0}" being federated by the "{1}" workspace of the "{2}" federated repository

Modified: trunk/dna-graph/src/test/java/org/jboss/dna/graph/connector/federation/AbstractFederatedRepositorySourceIntegrationTest.java
===================================================================
--- trunk/dna-graph/src/test/java/org/jboss/dna/graph/connector/federation/AbstractFederatedRepositorySourceIntegrationTest.java	2009-06-10 21:22:09 UTC (rev 1033)
+++ trunk/dna-graph/src/test/java/org/jboss/dna/graph/connector/federation/AbstractFederatedRepositorySourceIntegrationTest.java	2009-06-10 21:22:34 UTC (rev 1034)
@@ -113,15 +113,11 @@
             }
 
             @SuppressWarnings( "synthetic-access" )
-            public Graph getConfiguration() {
+            public Subgraph getConfiguration( int depth ) {
                 Graph result = Graph.create(configRepositorySource, context);
                 result.useWorkspace(configurationWorkspaceName);
-                return result;
+                return result.getSubgraphOfDepth(depth).at("/a/b/Test Repository");
             }
-
-            public Path getPathInConfiguration() {
-                return context.getValueFactories().getPathFactory().create("/a/b/Test Repository");
-            }
         };
 
         // Set up the source ...
@@ -172,7 +168,10 @@
         CheckArg.isNotNull(sourceName, "sourceName");
         CheckArg.isNotNull(workspaceName, "workspaceName");
         CheckArg.isNotEmpty(projectionRules, "projectionRules");
-        String configPath = repositoryContext.getPathInConfiguration().getString(context.getNamespaceRegistry());
+        String configPath = repositoryContext.getConfiguration(1)
+                                             .getLocation()
+                                             .getPath()
+                                             .getString(context.getNamespaceRegistry());
         assertThat(configPath.endsWith("/"), is(false));
         String wsPath = configPath + "/dna:workspaces/" + federatedWorkspace;
         String projectionPath = wsPath + "/dna:projections/" + projectionName;

Modified: trunk/dna-graph/src/test/java/org/jboss/dna/graph/connector/federation/FederatedRepositorySourceTest.java
===================================================================
--- trunk/dna-graph/src/test/java/org/jboss/dna/graph/connector/federation/FederatedRepositorySourceTest.java	2009-06-10 21:22:09 UTC (rev 1033)
+++ trunk/dna-graph/src/test/java/org/jboss/dna/graph/connector/federation/FederatedRepositorySourceTest.java	2009-06-10 21:22:34 UTC (rev 1034)
@@ -42,12 +42,12 @@
 import javax.security.auth.callback.CallbackHandler;
 import org.jboss.dna.graph.ExecutionContext;
 import org.jboss.dna.graph.Graph;
+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.inmemory.InMemoryRepositorySource;
 import org.jboss.dna.graph.observe.Observer;
-import org.jboss.dna.graph.property.Path;
 import org.junit.Before;
 import org.junit.Test;
 import org.mockito.ArgumentMatcher;
@@ -100,16 +100,11 @@
             }
 
             @SuppressWarnings( "synthetic-access" )
-            public Graph getConfiguration() {
+            public Subgraph getConfiguration( int depth ) {
                 Graph result = Graph.create(configRepositorySource, context);
                 result.useWorkspace("configSpace");
-                return result;
+                return result.getSubgraphOfDepth(depth).at("/a/b/Test Repository");
             }
-
-            @SuppressWarnings( "synthetic-access" )
-            public Path getPathInConfiguration() {
-                return context.getValueFactories().getPathFactory().create("/a/b/Test Repository");
-            }
         };
 
         source = new FederatedRepositorySource();

Modified: trunk/dna-graph/src/test/java/org/jboss/dna/graph/connector/test/AbstractConnectorTest.java
===================================================================
--- trunk/dna-graph/src/test/java/org/jboss/dna/graph/connector/test/AbstractConnectorTest.java	2009-06-10 21:22:09 UTC (rev 1033)
+++ trunk/dna-graph/src/test/java/org/jboss/dna/graph/connector/test/AbstractConnectorTest.java	2009-06-10 21:22:34 UTC (rev 1034)
@@ -133,18 +133,15 @@
                     return null; // no observers here
                 }
 
-                public Graph getConfiguration() {
-                    Graph result = null;
+                public Subgraph getConfiguration( int depth ) {
+                    Subgraph result = null;
                     if (configSource != null) {
-                        result = Graph.create(configSource, getExecutionContext());
-                        // use the default workspace
+                        Graph config = Graph.create(configSource, getExecutionContext());
+                        config.useWorkspace(null); // default workspace
+                        result = config.getSubgraphOfDepth(depth).at(source.getName());
                     }
                     return result;
                 }
-
-                public Path getPathInConfiguration() {
-                    return getExecutionContext().getValueFactories().getPathFactory().create(source.getName());
-                }
             });
 
             // And set up the graph instance ...

Modified: trunk/dna-repository/src/main/java/org/jboss/dna/repository/RepositoryLibrary.java
===================================================================
--- trunk/dna-repository/src/main/java/org/jboss/dna/repository/RepositoryLibrary.java	2009-06-10 21:22:09 UTC (rev 1033)
+++ trunk/dna-repository/src/main/java/org/jboss/dna/repository/RepositoryLibrary.java	2009-06-10 21:22:34 UTC (rev 1034)
@@ -37,6 +37,7 @@
 import org.jboss.dna.common.util.CheckArg;
 import org.jboss.dna.graph.ExecutionContext;
 import org.jboss.dna.graph.Graph;
+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.RepositoryConnectionPool;
@@ -396,30 +397,24 @@
                 /**
                  * {@inheritDoc}
                  * 
-                 * @see org.jboss.dna.graph.connector.RepositoryContext#getConfiguration()
+                 * @see org.jboss.dna.graph.connector.RepositoryContext#getConfiguration(int)
                  */
-                public Graph getConfiguration() {
-                    Graph result = null;
+                public Subgraph getConfiguration( int depth ) {
+                    Subgraph result = null;
                     RepositorySource configSource = getConfigurationSource();
                     if (configSource != null) {
-                        result = Graph.create(configSource, getExecutionContext());
+                        Graph config = Graph.create(configSource, getExecutionContext());
                         String workspaceName = getConfigurationWorkspaceName();
                         if (workspaceName != null) {
-                            result.useWorkspace(workspaceName);
+                            config.useWorkspace(workspaceName);
                         }
+                        Path configPath = getPathToConfigurationRoot();
+                        Path sourcePath = getExecutionContext().getValueFactories().getPathFactory().create(configPath,
+                                                                                                            sourceName);
+                        result = config.getSubgraphOfDepth(depth).at(sourcePath);
                     }
                     return result;
                 }
-
-                /**
-                 * {@inheritDoc}
-                 * 
-                 * @see org.jboss.dna.graph.connector.RepositoryContext#getPathInConfiguration()
-                 */
-                public Path getPathInConfiguration() {
-                    Path configPath = getPathToConfigurationRoot();
-                    return getExecutionContext().getValueFactories().getPathFactory().create(configPath, sourceName);
-                }
             };
             source.initialize(repositoryContext);
             RepositoryConnectionPool pool = new RepositoryConnectionPool(source);



From dna-commits at lists.jboss.org  Wed Jun 10 17:23:19 2009
From: dna-commits at lists.jboss.org (dna-commits at lists.jboss.org)
Date: Wed, 10 Jun 2009 17:23:19 -0400
Subject: [dna-commits] DNA SVN: r1035 - in trunk:
	dna-graph/src/main/java/org/jboss/dna/graph/connector/federation
	and 8 other directories.
Message-ID: <E1MEVGR-0007xK-V7@committer01.frg.pub.inap.atl.jboss.com>

Author: rhauch
Date: 2009-06-10 17:23:19 -0400 (Wed, 10 Jun 2009)
New Revision: 1035

Added:
   trunk/docs/examples/gettingstarted/repositories/src/main/resources/vehicles.cnd
Removed:
   trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/federation/FederatedLexicon.java
   trunk/docs/examples/gettingstarted/repositories/src/main/resources/virtual.cnd
Modified:
   trunk/dna-graph/src/main/java/org/jboss/dna/graph/DnaLexicon.java
   trunk/dna-graph/src/main/java/org/jboss/dna/graph/ExecutionContext.java
   trunk/dna-graph/src/main/java/org/jboss/dna/graph/Location.java
   trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/federation/BranchedMirrorProjector.java
   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/test/java/org/jboss/dna/graph/connector/federation/AbstractFederatedRepositorySourceIntegrationTest.java
   trunk/dna-graph/src/test/java/org/jboss/dna/graph/connector/federation/FederatedRepositorySourceTest.java
   trunk/dna-jcr/src/test/resources/config/configRepository.xml
   trunk/dna-repository/src/main/java/org/jboss/dna/repository/RepositoryLibrary.java
   trunk/docs/examples/gettingstarted/repositories/src/main/java/org/jboss/example/dna/repository/RepositoryClient.java
   trunk/docs/examples/gettingstarted/repositories/src/main/resources/aircraft.xml
   trunk/docs/examples/gettingstarted/repositories/src/main/resources/cars.xml
   trunk/docs/examples/gettingstarted/repositories/src/main/resources/configRepository.xml
   trunk/docs/examples/gettingstarted/repositories/src/test/java/org/jboss/example/dna/repository/RepositoryClientTest.java
   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/reference/src/main/docbook/en-US/content/jcr/configuration.xml
Log:
DNA-449 Federation connector does not find it's configuration when imported using the JcrConfiguration

Quite a few relatively minor tweaks, all related to getting the federated repository source recognizing and reading its configuration.

Modified: trunk/dna-graph/src/main/java/org/jboss/dna/graph/DnaLexicon.java
===================================================================
--- trunk/dna-graph/src/main/java/org/jboss/dna/graph/DnaLexicon.java	2009-06-10 21:22:34 UTC (rev 1034)
+++ trunk/dna-graph/src/main/java/org/jboss/dna/graph/DnaLexicon.java	2009-06-10 21:23:19 UTC (rev 1035)
@@ -47,7 +47,7 @@
     public static final Name NAMESPACE_URI = new BasicName(Namespace.URI, "uri");
 
     public static final Name WORKSPACES = new BasicName(Namespace.URI, "workspaces");
-    public static final Name SOURCE_NAME = new BasicName(Namespace.URI, "sourceName");
+    public static final Name SOURCE_NAME = new BasicName(Namespace.URI, "source");
     public static final Name WORKSPACE_NAME = new BasicName(Namespace.URI, "workspaceName");
     public static final Name DEFAULT_WORKSPACE_NAME = new BasicName(Namespace.URI, "defaultWorkspaceName");
     public static final Name PROJECTION = new BasicName(Namespace.URI, "projection");

Modified: trunk/dna-graph/src/main/java/org/jboss/dna/graph/ExecutionContext.java
===================================================================
--- trunk/dna-graph/src/main/java/org/jboss/dna/graph/ExecutionContext.java	2009-06-10 21:22:34 UTC (rev 1034)
+++ trunk/dna-graph/src/main/java/org/jboss/dna/graph/ExecutionContext.java	2009-06-10 21:23:19 UTC (rev 1035)
@@ -31,7 +31,6 @@
 import org.jboss.dna.common.component.StandardClassLoaderFactory;
 import org.jboss.dna.common.util.CheckArg;
 import org.jboss.dna.common.util.Logger;
-import org.jboss.dna.graph.connector.federation.FederatedLexicon;
 import org.jboss.dna.graph.mimetype.ExtensionBasedMimeTypeDetector;
 import org.jboss.dna.graph.mimetype.MimeTypeDetector;
 import org.jboss.dna.graph.property.NamespaceRegistry;
@@ -328,7 +327,6 @@
         namespaceRegistry.register(JcrMixLexicon.Namespace.PREFIX, JcrMixLexicon.Namespace.URI);
         namespaceRegistry.register(JcrNtLexicon.Namespace.PREFIX, JcrNtLexicon.Namespace.URI);
         namespaceRegistry.register(DnaLexicon.Namespace.PREFIX, DnaLexicon.Namespace.URI);
-        namespaceRegistry.register(FederatedLexicon.Namespace.PREFIX, DnaLexicon.Namespace.URI);
         // namespaceRegistry.register("dnadtd", "http://www.jboss.org/dna/dtd/1.0");
         // namespaceRegistry.register("dnaxml", "http://www.jboss.org/dna/xml/1.0");
     }

Modified: trunk/dna-graph/src/main/java/org/jboss/dna/graph/Location.java
===================================================================
--- trunk/dna-graph/src/main/java/org/jboss/dna/graph/Location.java	2009-06-10 21:22:34 UTC (rev 1034)
+++ trunk/dna-graph/src/main/java/org/jboss/dna/graph/Location.java	2009-06-10 21:23:19 UTC (rev 1035)
@@ -577,7 +577,7 @@
             }
             sb.append("]");
             if (hasPath) {
-                sb.append("<");
+                sb.append(">");
             }
         }
         return sb.toString();

Modified: trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/federation/BranchedMirrorProjector.java
===================================================================
--- trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/federation/BranchedMirrorProjector.java	2009-06-10 21:22:34 UTC (rev 1034)
+++ trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/federation/BranchedMirrorProjector.java	2009-06-10 21:23:19 UTC (rev 1035)
@@ -71,13 +71,16 @@
         if (firstTopLevelPaths.size() != 1) return null;
         List<Path> secondTopLevelPaths = second.getRules().get(0).getTopLevelPathsInRepository(pathFactory);
         if (secondTopLevelPaths.size() != 1) return null;
-        // We're good, so create the instance ...
         Path firstTopLevelPath = firstTopLevelPaths.get(0);
         Path secondTopLevelPath = secondTopLevelPaths.get(0);
         if (firstTopLevelPath.isRoot()) {
+            // We're good, so create the instance ...
             return new BranchedMirrorProjector(context, projections, first, second, secondTopLevelPath,
                                                secondRule.getPathInSource(secondTopLevelPath, pathFactory));
         }
+        // the second top-level path must be a root ...
+        if (!secondTopLevelPath.isRoot()) return null;
+        // We're good, so create the instance ...
         return new BranchedMirrorProjector(context, projections, second, first, firstTopLevelPath,
                                            firstRule.getPathInSource(firstTopLevelPath, pathFactory));
     }

Deleted: trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/federation/FederatedLexicon.java
===================================================================
--- trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/federation/FederatedLexicon.java	2009-06-10 21:22:34 UTC (rev 1034)
+++ trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/federation/FederatedLexicon.java	2009-06-10 21:23:19 UTC (rev 1035)
@@ -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.graph.connector.federation;
-
-import org.jboss.dna.graph.DnaLexicon;
-import org.jboss.dna.graph.property.Name;
-import org.jboss.dna.graph.property.basic.BasicName;
-
-/**
- * @author Randall Hauch
- */
-public class FederatedLexicon extends DnaLexicon {
-
-    public static final Name WORKSPACES = new BasicName(Namespace.URI, "workspaces");
-    public static final Name CACHE = new BasicName(Namespace.URI, "cache");
-    public static final Name PROJECTION = new BasicName(Namespace.URI, "projection");
-    public static final Name PROJECTIONS = new BasicName(Namespace.URI, "projections");
-    public static final Name SOURCE_NAME = new BasicName(Namespace.URI, "sourceName");
-    public static final Name WORKSPACE_NAME = new BasicName(Namespace.URI, "workspaceName");
-    public static final Name DEFAULT_WORKSPACE_NAME = new BasicName(Namespace.URI, "defaultWorkspaceName");
-}

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	2009-06-10 21:22:34 UTC (rev 1034)
+++ trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/federation/FederatedRepositoryConnection.java	2009-06-10 21:23:19 UTC (rev 1035)
@@ -156,7 +156,7 @@
 
         // Figure out whether we should asynchronously do the forking ...
         boolean synchronousStep1 = shouldProcessSynchronously(request);
-        final boolean awaitAllSubtasks = false;
+        final boolean awaitAllSubtasks = true;
 
         // Prepare for trace-level logging ...
         if (stopwatch != null) stopwatch.start();

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	2009-06-10 21:22:34 UTC (rev 1034)
+++ trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/federation/ForkRequestProcessor.java	2009-06-10 21:23:19 UTC (rev 1035)
@@ -329,6 +329,7 @@
                  */
                 public String call() throws Exception {
                     final RepositoryConnection connection = connectionFactory.createConnection(sourceName);
+                    assert connection != null;
                     try {
                         connection.execute(context, composite);
                     } finally {
@@ -1129,7 +1130,10 @@
         if (projectedFromNode == null) return;
         ProjectedNode projectedIntoNode = project(request.into(), request.inWorkspace(), request, true);
         if (projectedIntoNode == null) return;
-        ProjectedNode projectedBeforeNode = request.before() != null ? project(request.before(), request.inWorkspace(), request, true) : null;
+        ProjectedNode projectedBeforeNode = request.before() != null ? project(request.before(),
+                                                                               request.inWorkspace(),
+                                                                               request,
+                                                                               true) : null;
 
         // Limitation: only able to project the move if the 'from' and 'into' are in the same source & projection ...
         while (projectedFromNode != null) {
@@ -1166,8 +1170,9 @@
         boolean sameLocation = fromProxy.isSameLocationAsOriginal() && intoProxy.isSameLocationAsOriginal();
 
         // Create the pushed-down request ...
-        MoveBranchRequest pushDown = new MoveBranchRequest(fromProxy.location(), intoProxy.location(), beforeProxy.location(), intoProxy.workspaceName(),
-                                                           request.desiredName(), request.conflictBehavior());
+        MoveBranchRequest pushDown = new MoveBranchRequest(fromProxy.location(), intoProxy.location(), beforeProxy.location(),
+                                                           intoProxy.workspaceName(), request.desiredName(),
+                                                           request.conflictBehavior());
         // Create the federated request ...
         FederatedRequest federatedRequest = new FederatedRequest(request);
         federatedRequest.add(pushDown, sameLocation, false, fromProxy.projection(), intoProxy.projection());

Modified: trunk/dna-graph/src/test/java/org/jboss/dna/graph/connector/federation/AbstractFederatedRepositorySourceIntegrationTest.java
===================================================================
--- trunk/dna-graph/src/test/java/org/jboss/dna/graph/connector/federation/AbstractFederatedRepositorySourceIntegrationTest.java	2009-06-10 21:22:34 UTC (rev 1034)
+++ trunk/dna-graph/src/test/java/org/jboss/dna/graph/connector/federation/AbstractFederatedRepositorySourceIntegrationTest.java	2009-06-10 21:23:19 UTC (rev 1035)
@@ -33,6 +33,7 @@
 import java.util.Map;
 import org.jboss.dna.common.statistic.Stopwatch;
 import org.jboss.dna.common.util.CheckArg;
+import org.jboss.dna.graph.DnaLexicon;
 import org.jboss.dna.graph.ExecutionContext;
 import org.jboss.dna.graph.Graph;
 import org.jboss.dna.graph.Location;
@@ -180,9 +181,9 @@
         config.createIfMissing(wsPath);
         config.createIfMissing(wsPath + "/dna:projections");
         config.createAt(projectionPath)
-              .with(FederatedLexicon.PROJECTION_RULES, (Object[])projectionRules)
-              .with(FederatedLexicon.SOURCE_NAME, sourceName)
-              .with(FederatedLexicon.WORKSPACE_NAME, workspaceName)
+              .with(DnaLexicon.PROJECTION_RULES, (Object[])projectionRules)
+              .with(DnaLexicon.SOURCE_NAME, sourceName)
+              .with(DnaLexicon.WORKSPACE_NAME, workspaceName)
               .and();
         // Make sure the source and workspace exist ...
         graphFor(sourceName, workspaceName);

Modified: trunk/dna-graph/src/test/java/org/jboss/dna/graph/connector/federation/FederatedRepositorySourceTest.java
===================================================================
--- trunk/dna-graph/src/test/java/org/jboss/dna/graph/connector/federation/FederatedRepositorySourceTest.java	2009-06-10 21:22:34 UTC (rev 1034)
+++ trunk/dna-graph/src/test/java/org/jboss/dna/graph/connector/federation/FederatedRepositorySourceTest.java	2009-06-10 21:23:19 UTC (rev 1035)
@@ -40,6 +40,7 @@
 import javax.naming.Reference;
 import javax.naming.spi.ObjectFactory;
 import javax.security.auth.callback.CallbackHandler;
+import org.jboss.dna.graph.DnaLexicon;
 import org.jboss.dna.graph.ExecutionContext;
 import org.jboss.dna.graph.Graph;
 import org.jboss.dna.graph.Subgraph;
@@ -118,25 +119,25 @@
         Graph.Batch batch = configRepository.batch();
         batch.create("/a").and();
         batch.create("/a/b").and();
-        batch.create("/a/b/Test Repository").with(FederatedLexicon.DEFAULT_WORKSPACE_NAME, "fedSpace").and();
+        batch.create("/a/b/Test Repository").with(DnaLexicon.DEFAULT_WORKSPACE_NAME, "fedSpace").and();
         batch.create("/a/b/Test Repository/dna:workspaces").and();
         batch.create("/a/b/Test Repository/dna:workspaces/fedSpace").and();
         batch.create("/a/b/Test Repository/dna:workspaces/fedSpace/dna:cache")
-             .with(FederatedLexicon.PROJECTION_RULES, "/ => /")
-             .with(FederatedLexicon.SOURCE_NAME, "cache source")
-             .with(FederatedLexicon.WORKSPACE_NAME, "cacheSpace")
-             .with(FederatedLexicon.TIME_TO_EXPIRE, 100000)
+             .with(DnaLexicon.PROJECTION_RULES, "/ => /")
+             .with(DnaLexicon.SOURCE_NAME, "cache source")
+             .with(DnaLexicon.WORKSPACE_NAME, "cacheSpace")
+             .with(DnaLexicon.TIME_TO_EXPIRE, 100000)
              .and();
         batch.create("/a/b/Test Repository/dna:workspaces/fedSpace/dna:projections").and();
         batch.create("/a/b/Test Repository/dna:workspaces/fedSpace/dna:projections/projection1")
-             .with(FederatedLexicon.PROJECTION_RULES, "/ => /s1")
-             .with(FederatedLexicon.SOURCE_NAME, "source 1")
-             .with(FederatedLexicon.WORKSPACE_NAME, "s1 workspace")
+             .with(DnaLexicon.PROJECTION_RULES, "/ => /s1")
+             .with(DnaLexicon.SOURCE_NAME, "source 1")
+             .with(DnaLexicon.WORKSPACE_NAME, "s1 workspace")
              .and();
         batch.create("/a/b/Test Repository/dna:workspaces/fedSpace/dna:projections/projection2")
-             .with(FederatedLexicon.PROJECTION_RULES, "/ => /s2")
-             .with(FederatedLexicon.SOURCE_NAME, "source 2")
-             .with(FederatedLexicon.WORKSPACE_NAME, "s2 worskspace")
+             .with(DnaLexicon.PROJECTION_RULES, "/ => /s2")
+             .with(DnaLexicon.SOURCE_NAME, "source 2")
+             .with(DnaLexicon.WORKSPACE_NAME, "s2 worskspace")
              .and();
         batch.execute();
 

Modified: trunk/dna-jcr/src/test/resources/config/configRepository.xml
===================================================================
--- trunk/dna-jcr/src/test/resources/config/configRepository.xml	2009-06-10 21:22:34 UTC (rev 1034)
+++ trunk/dna-jcr/src/test/resources/config/configRepository.xml	2009-06-10 21:23:19 UTC (rev 1035)
@@ -66,7 +66,7 @@
     </dna:mimeTypeDetectors>
     <!-- JCR Repositories.  This is required, with a separate repository for each JCR repository instance. -->
     <dna:repositories>
-        <dna:repository jcr:name="Car Repository" dna:sourceName="Cars">
+        <dna:repository jcr:name="Car Repository" dna:source="Cars">
             <dna:options>
                 <dna:option jcr:name="projectNodeTypes" dna:value="true"/>
                 <dna:option jcr:name="jaasLoginConfigName" dna:value="dna-jcr"/>

Modified: trunk/dna-repository/src/main/java/org/jboss/dna/repository/RepositoryLibrary.java
===================================================================
--- trunk/dna-repository/src/main/java/org/jboss/dna/repository/RepositoryLibrary.java	2009-06-10 21:22:34 UTC (rev 1034)
+++ trunk/dna-repository/src/main/java/org/jboss/dna/repository/RepositoryLibrary.java	2009-06-10 21:23:19 UTC (rev 1035)
@@ -373,7 +373,7 @@
                  * @see org.jboss.dna.graph.connector.RepositoryContext#getExecutionContext()
                  */
                 public ExecutionContext getExecutionContext() {
-                    return getExecutionContext();
+                    return RepositoryLibrary.this.getExecutionContext();
                 }
 
                 /**

Modified: trunk/docs/examples/gettingstarted/repositories/src/main/java/org/jboss/example/dna/repository/RepositoryClient.java
===================================================================
--- trunk/docs/examples/gettingstarted/repositories/src/main/java/org/jboss/example/dna/repository/RepositoryClient.java	2009-06-10 21:22:34 UTC (rev 1034)
+++ trunk/docs/examples/gettingstarted/repositories/src/main/java/org/jboss/example/dna/repository/RepositoryClient.java	2009-06-10 21:23:19 UTC (rev 1035)
@@ -99,7 +99,6 @@
     private String jaasContextName;
     private UserInterface userInterface;
     private LoginContext loginContext;
-    private ExecutionContext context;
     private JcrEngine engine;
 
     /**
@@ -144,9 +143,9 @@
         // in the configuration file, but this approach is easy and allows us to define the node types
         // using the CND format in one or multiple files.
         String locationOfCndFiles = userInterface.getLocationOfCndFiles();
-        configuration.repository("aircraft repository").addNodeTypes(locationOfCndFiles + "/aircraft.cnd");
-        configuration.repository("car repository").addNodeTypes(locationOfCndFiles + "/cars.cnd");
-        configuration.repository("virtual").addNodeTypes(locationOfCndFiles + "/virtual.cnd");
+        configuration.repository("Aircraft").addNodeTypes(locationOfCndFiles + "/aircraft.cnd");
+        configuration.repository("Car").addNodeTypes(locationOfCndFiles + "/cars.cnd");
+        configuration.repository("Vehicles").addNodeTypes(locationOfCndFiles + "/vehicles.cnd");
 
         // Now create the JCR engine ...
         engine = configuration.build();
@@ -157,11 +156,9 @@
         // 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 ...
-        Graph cars = engine.getGraph("Cars");
-        cars.importXmlFrom(location + "/cars.xml").into("/");
-        Graph aircraft = engine.getGraph("Aircraft");
-        aircraft.importXmlFrom(location + "/aircraft.xml").into("/");
+        // Now import the content for the two in-memory repository sources ...
+        engine.getGraph("Cars").importXmlFrom(location + "/cars.xml").into("/");
+        engine.getGraph("Aircraft").importXmlFrom(location + "/aircraft.xml").into("/");
     }
 
     /**
@@ -307,13 +304,12 @@
             case DNA: {
                 try {
                     // Use the DNA Graph API to read the properties and children of the node ...
-                    ExecutionContext context = this.context;
+                    ExecutionContext context = this.engine.getExecutionContext();
                     if (loginContext != null) {
                         JaasSecurityContext security = new JaasSecurityContext(loginContext);
-                        context = this.context.with(security);
+                        context = context.with(security);
                     }
                     Graph graph = engine.getGraph(context, sourceName);
-                    graph.useWorkspace("default");
                     org.jboss.dna.graph.Node node = graph.getNodeAt(pathToNode);
 
                     if (properties != null) {
@@ -351,6 +347,7 @@
                              String input ) {
         if (current == null) current = "/";
         if (input == null || input.length() == 0) return current;
+        ExecutionContext context = this.engine.getExecutionContext();
         PathFactory factory = context.getValueFactories().getPathFactory();
         Path inputPath = factory.create(input);
         if (inputPath.isAbsolute()) {

Modified: trunk/docs/examples/gettingstarted/repositories/src/main/resources/aircraft.xml
===================================================================
--- trunk/docs/examples/gettingstarted/repositories/src/main/resources/aircraft.xml	2009-06-10 21:22:34 UTC (rev 1034)
+++ trunk/docs/examples/gettingstarted/repositories/src/main/resources/aircraft.xml	2009-06-10 21:23:19 UTC (rev 1035)
@@ -24,31 +24,33 @@
   ~ 51 Franklin Street, Fifth Floor
   ~ Boston, MA  02110-1301  USA
   -->
-<Aircraft xmlns:jcr="http://www.jcp.org/jcr/1.0" xmlns:nt="http://www.jcp.org/jcr/nt/1.0" xmlns="http://jboss.org/dna/examples/aircraft/1.0">
-    <Business>
-        <Aircraft jcr:name="Gulfstream V" maker="Gulfstream" model="G-V" introduced="1995" range="5800nm" cruiseSpeed="488kt" crew="2" emptyWeight="46200lb" url="http://en.wikipedia.org/wiki/Gulfstream_V"/>
-        <Aircraft jcr:name="Learjet 45" maker="Learjet" model="LJ45" introduced="1995" numberBuilt="264+" crew="2" emptyWeight="13695lb" range="2120nm" cruiseSpeed="457kt" url="http://en.wikipedia.org/wiki/Learjet_45"/>
+<Aircraft xmlns:jcr="http://www.jcp.org/jcr/1.0" 
+          xmlns:nt="http://www.jcp.org/jcr/nt/1.0"
+          xmlns:air="http://jboss.org/dna/examples/aircraft/1.0" jcr:primaryType="nt:unstructured">
+    <Business jcr:primaryType="nt:unstructured">
+        <air:Aircraft jcr:name="Gulfstream V" maker="Gulfstream" model="G-V" introduced="1995" range="5800nm" cruiseSpeed="488kt" crew="2" emptyWeight="46200lb" url="http://en.wikipedia.org/wiki/Gulfstream_V"/>
+        <air:Aircraft jcr:name="Learjet 45" maker="Learjet" model="LJ45" introduced="1995" numberBuilt="264+" crew="2" emptyWeight="13695lb" range="2120nm" cruiseSpeed="457kt" url="http://en.wikipedia.org/wiki/Learjet_45"/>
     </Business>
-    <Commercial>
-        <Aircraft jcr:name="Boeing 777" maker="Boeing" model="777-200LR" introduced="1995" numberBuilt="731+" maxRange="7500nm" emptyWeight="326000lb" cruiseSpeed="560mph" url="http://en.wikipedia.org/wiki/Boeing_777"/>
-        <Aircraft jcr:name="Boeing 767" maker="Boeing" model="767-200" introduced="1982" numberBuilt="966+" maxRange="3950nm" emptyWeight="176650lb" cruiseSpeed="530mph"  url="http://en.wikipedia.org/wiki/Boeing_767"/>
-        <Aircraft jcr:name="Boeing 787" maker="Boeing" model="787-3" introduced="2009" range="3050nm" emptyWeight="223000lb" cruiseSpeed="561mph" url="http://en.wikipedia.org/wiki/Boeing_787"/>
-        <Aircraft jcr:name="Boeing 757" maker="Boeing" model="757-200" introduced="1983" numberBuilt="1050" range="3900nm" maxWeight="255000lb" cruiseSpeed="530mph" url="http://en.wikipedia.org/wiki/Boeing_757"/>
-        <Aircraft jcr:name="Airbus A380" maker="Airbus" model="A380-800" introduced="2007" numberBuilt="18" range="8200nm" maxWeight="1235000lb" cruiseSpeed="647mph" url="http://en.wikipedia.org/wiki/Airbus_a380"/>
-        <Aircraft jcr:name="Airbus A340" maker="Airbus" model="A340-200" introduced="1993" numberBuilt="354" range="8000nm" maxWeight="606300lb" cruiseSpeed="557mph" url="http://en.wikipedia.org/wiki/Airbus_A-340"/>
-        <Aircraft jcr:name="Airbus A310" maker="Airbus" model="A310-200" introduced="1983" numberBuilt="255" cruiseSpeed="850km/h" emptyWeight="176312lb" range="3670nm" url="http://en.wikipedia.org/wiki/Airbus_A-310"/>
-        <Aircraft jcr:name="Embraer RJ-175" maker="Embraer" model="ERJ170-200" introduced="2004" range="3334km" cruiseSpeed="481kt" emptyWeight="21810kg" url="http://en.wikipedia.org/wiki/EMBRAER_170"/>
+    <Commercial jcr:primaryType="nt:unstructured">
+        <air:Aircraft jcr:name="Boeing 777" maker="Boeing" model="777-200LR" introduced="1995" numberBuilt="731+" maxRange="7500nm" emptyWeight="326000lb" cruiseSpeed="560mph" url="http://en.wikipedia.org/wiki/Boeing_777"/>
+        <air:Aircraft jcr:name="Boeing 767" maker="Boeing" model="767-200" introduced="1982" numberBuilt="966+" maxRange="3950nm" emptyWeight="176650lb" cruiseSpeed="530mph"  url="http://en.wikipedia.org/wiki/Boeing_767"/>
+        <air:Aircraft jcr:name="Boeing 787" maker="Boeing" model="787-3" introduced="2009" range="3050nm" emptyWeight="223000lb" cruiseSpeed="561mph" url="http://en.wikipedia.org/wiki/Boeing_787"/>
+        <air:Aircraft jcr:name="Boeing 757" maker="Boeing" model="757-200" introduced="1983" numberBuilt="1050" range="3900nm" maxWeight="255000lb" cruiseSpeed="530mph" url="http://en.wikipedia.org/wiki/Boeing_757"/>
+        <air:Aircraft jcr:name="Airbus A380" maker="Airbus" model="A380-800" introduced="2007" numberBuilt="18" range="8200nm" maxWeight="1235000lb" cruiseSpeed="647mph" url="http://en.wikipedia.org/wiki/Airbus_a380"/>
+        <air:Aircraft jcr:name="Airbus A340" maker="Airbus" model="A340-200" introduced="1993" numberBuilt="354" range="8000nm" maxWeight="606300lb" cruiseSpeed="557mph" url="http://en.wikipedia.org/wiki/Airbus_A-340"/>
+        <air:Aircraft jcr:name="Airbus A310" maker="Airbus" model="A310-200" introduced="1983" numberBuilt="255" cruiseSpeed="850km/h" emptyWeight="176312lb" range="3670nm" url="http://en.wikipedia.org/wiki/Airbus_A-310"/>
+        <air:Aircraft jcr:name="Embraer RJ-175" maker="Embraer" model="ERJ170-200" introduced="2004" range="3334km" cruiseSpeed="481kt" emptyWeight="21810kg" url="http://en.wikipedia.org/wiki/EMBRAER_170"/>
     </Commercial>
-    <Vintage>
-        <Aircraft jcr:name="Fokker Trimotor" maker="Fokker" model="F.VII" introduced="1925" cruiseSpeed="170km/h" emptyWeight="3050kg" crew="2" url="http://en.wikipedia.org/wiki/Fokker_trimotor"/>
-        <Aircraft jcr:name="P-38 Lightning" maker="Lockheed" model="P-38" designedBy="Kelly Johnson" introduced="1941" numberBuilt="10037" rateOfClimb="4750ft/min" range="1300mi" emptyWeight="12780lb" crew="1" url="http://en.wikipedia.org/wiki/P-38_Lightning"/>
-        <Aircraft jcr:name="A6M Zero" maker="Mitsubishi" model="A6M" designedBy="Jiro Horikoshi" introduced="1940" numberBuilt="11000" crew="1" emptyWeight="3704lb" serviceCeiling="33000ft" maxSpeed="331mph" range="1929mi" rateOfClimb="3100ft/min" url="http://en.wikipedia.org/wiki/A6M_Zero"/>
-        <Aircraft jcr:name="Bf 109" maker="Messerschmitt" model="Bf 109" introduced="1937" url="http://en.wikipedia.org/wiki/BF_109"/>
-        <Aircraft jcr:name="Wright Flyer" maker="Wright Brothers" introduced="1903" range="852ft" maxSpeed="30mph" emptyWeight="605lb" crew="1"/>
+    <Vintage jcr:primaryType="nt:unstructured">
+        <air:Aircraft jcr:name="Fokker Trimotor" maker="Fokker" model="F.VII" introduced="1925" cruiseSpeed="170km/h" emptyWeight="3050kg" crew="2" url="http://en.wikipedia.org/wiki/Fokker_trimotor"/>
+        <air:Aircraft jcr:name="P-38 Lightning" maker="Lockheed" model="P-38" designedBy="Kelly Johnson" introduced="1941" numberBuilt="10037" rateOfClimb="4750ft/min" range="1300mi" emptyWeight="12780lb" crew="1" url="http://en.wikipedia.org/wiki/P-38_Lightning"/>
+        <air:Aircraft jcr:name="A6M Zero" maker="Mitsubishi" model="A6M" designedBy="Jiro Horikoshi" introduced="1940" numberBuilt="11000" crew="1" emptyWeight="3704lb" serviceCeiling="33000ft" maxSpeed="331mph" range="1929mi" rateOfClimb="3100ft/min" url="http://en.wikipedia.org/wiki/A6M_Zero"/>
+        <air:Aircraft jcr:name="Bf 109" maker="Messerschmitt" model="Bf 109" introduced="1937" url="http://en.wikipedia.org/wiki/BF_109"/>
+        <air:Aircraft jcr:name="Wright Flyer" maker="Wright Brothers" introduced="1903" range="852ft" maxSpeed="30mph" emptyWeight="605lb" crew="1"/>
     </Vintage>
-    <Homebuilt>
-        <Aircraft jcr:name="Long-EZ" maker="Rutan Aircraft Factory" model="61" emptyWeight="760lb" fuelCapacity="200L" maxSpeed="185kt" since="1976" range="1200nm" url="http://en.wikipedia.org/wiki/Rutan_Long-EZ"/>
-        <Aircraft jcr:name="Cirrus VK-30" maker="Cirrus Design" model="VK-30" emptyWeight="2400lb" maxLoad="1200lb" maxSpeed="250mph" rateOfClimb="1500ft/min" range="1300mi" url="http://en.wikipedia.org/wiki/Cirrus_VK-30"/>
-        <Aircraft jcr:name="Van's RV-4" maker="Van's Aircraft" model="RV-4" introduced="1980" emptyWeight="905lb" maxLoad="500lb" maxSpeed="200mph" rateOfClimb="2450ft/min" range="725mi" url="http://en.wikipedia.org/wiki/Van%27s_Aircraft_RV-4"/>
+    <Homebuilt jcr:primaryType="nt:unstructured">
+        <air:Aircraft jcr:name="Long-EZ" maker="Rutan Aircraft Factory" model="61" emptyWeight="760lb" fuelCapacity="200L" maxSpeed="185kt" since="1976" range="1200nm" url="http://en.wikipedia.org/wiki/Rutan_Long-EZ"/>
+        <air:Aircraft jcr:name="Cirrus VK-30" maker="Cirrus Design" model="VK-30" emptyWeight="2400lb" maxLoad="1200lb" maxSpeed="250mph" rateOfClimb="1500ft/min" range="1300mi" url="http://en.wikipedia.org/wiki/Cirrus_VK-30"/>
+        <air:Aircraft jcr:name="Van's RV-4" maker="Van's Aircraft" model="RV-4" introduced="1980" emptyWeight="905lb" maxLoad="500lb" maxSpeed="200mph" rateOfClimb="2450ft/min" range="725mi" url="http://en.wikipedia.org/wiki/Van%27s_Aircraft_RV-4"/>
     </Homebuilt>
 </Aircraft>
\ No newline at end of file

Modified: trunk/docs/examples/gettingstarted/repositories/src/main/resources/cars.xml
===================================================================
--- trunk/docs/examples/gettingstarted/repositories/src/main/resources/cars.xml	2009-06-10 21:22:34 UTC (rev 1034)
+++ trunk/docs/examples/gettingstarted/repositories/src/main/resources/cars.xml	2009-06-10 21:23:19 UTC (rev 1035)
@@ -26,25 +26,25 @@
   -->
 <Cars xmlns:jcr="http://www.jcp.org/jcr/1.0"
       xmlns:nt="http://www.jcp.org/jcr/nt/1.0" 
-      xmlns="http://jboss.org/dna/examples/cars/1.0">
-    <Hybrid>
-        <Car jcr:name="Toyota Prius" maker="Toyota" model="Prius" year="2008" msrp="$21,500" userRating="4.2" valueRating="5" mpgCity="48" mpgHighway="45"/>
-        <Car jcr:name="Toyota Highlander" maker="Toyota" model="Highlander" year="2008" msrp="$34,200" userRating="4" valueRating="5" mpgCity="27" mpgHighway="25"/>
-        <Car jcr:name="Nissan Altima" maker="Nissan" model="Altima" year="2008" msrp="$18,260" mpgCity="23" mpgHighway="32"/>
+      xmlns:car="http://jboss.org/dna/examples/cars/1.0" jcr:primaryType="nt:unstructured">
+    <Hybrid jcr:primaryType="nt:unstructured">
+        <car:Car jcr:name="Toyota Prius" maker="Toyota" model="Prius" year="2008" msrp="$21,500" userRating="4.2" valueRating="5" mpgCity="48" mpgHighway="45"/>
+        <car:Car jcr:name="Toyota Highlander" maker="Toyota" model="Highlander" year="2008" msrp="$34,200" userRating="4" valueRating="5" mpgCity="27" mpgHighway="25"/>
+        <car:Car jcr:name="Nissan Altima" maker="Nissan" model="Altima" year="2008" msrp="$18,260" mpgCity="23" mpgHighway="32"/>
     </Hybrid>
-    <Sports>
-        <Car jcr:name="Aston Martin DB9" maker="Aston Martin" model="DB9" year="2008" msrp="$171,600" userRating="5" mpgCity="12" mpgHighway="19" lengthInInches="185.5" wheelbaseInInches="108.0" engine="5,935 cc 5.9 liters V 12"/>
-        <Car jcr:name="Infiniti G37" maker="Infiniti" model="G37" year="2008" msrp="$34,900" userRating="3.5" valueRating="4" mpgCity="18" mpgHighway="24" />
+    <Sports jcr:primaryType="nt:unstructured">
+        <car:Car jcr:name="Aston Martin DB9" maker="Aston Martin" model="DB9" year="2008" msrp="$171,600" userRating="5" mpgCity="12" mpgHighway="19" lengthInInches="185.5" wheelbaseInInches="108.0" engine="5,935 cc 5.9 liters V 12"/>
+        <car:Car jcr:name="Infiniti G37" maker="Infiniti" model="G37" year="2008" msrp="$34,900" userRating="3.5" valueRating="4" mpgCity="18" mpgHighway="24" />
     </Sports>
-    <Luxury>
-        <Car jcr:name="Cadillac DTS" maker="Cadillac" model="DTS" year="2008" engine="3.6-liter V6" userRating="0"/>
-        <Car jcr:name="Bentley Continental" maker="Bentley" model="Continental" year="2008" msrp="$170,990" mpgCity="10" mpgHighway="17" />
-        <Car jcr:name="Lexus IS350" maker="Lexus" model="IS350" year="2008" msrp="$36,305" mpgCity="18" mpgHighway="25" userRating="4" valueRating="5" />
+    <Luxury jcr:primaryType="nt:unstructured">
+        <car:Car jcr:name="Cadillac DTS" maker="Cadillac" model="DTS" year="2008" engine="3.6-liter V6" userRating="0"/>
+        <car:Car jcr:name="Bentley Continental" maker="Bentley" model="Continental" year="2008" msrp="$170,990" mpgCity="10" mpgHighway="17" />
+        <car:Car jcr:name="Lexus IS350" maker="Lexus" model="IS350" year="2008" msrp="$36,305" mpgCity="18" mpgHighway="25" userRating="4" valueRating="5" />
     </Luxury>
-    <Utility>
-        <Car jcr:name="Land Rover LR2" maker="Land Rover" model="LR2" year="2008" msrp="$33,985" userRating="4.5" valueRating="5" mpgCity="16" mpgHighway="23" />
-        <Car jcr:name="Land Rover LR3" maker="Land Rover" model="LR3" year="2008" msrp="$48,525" userRating="5" valueRating="2" mpgCity="12" mpgHighway="17" />
-        <Car jcr:name="Hummer H3" maker="Hummer" model="H3" year="2008" msrp="$30,595" userRating="3.5" valueRating="4" mpgCity="13" mpgHighway="16" />
-        <Car jcr:name="Ford F-150" maker="Ford" model="F-150" year="2008" msrp="$23,910" userRating="4" valueRating="1" mpgCity="14" mpgHighway="20" />
+    <Utility jcr:primaryType="nt:unstructured">
+        <car:Car jcr:name="Land Rover LR2" maker="Land Rover" model="LR2" year="2008" msrp="$33,985" userRating="4.5" valueRating="5" mpgCity="16" mpgHighway="23" />
+        <car:Car jcr:name="Land Rover LR3" maker="Land Rover" model="LR3" year="2008" msrp="$48,525" userRating="5" valueRating="2" mpgCity="12" mpgHighway="17" />
+        <car:Car jcr:name="Hummer H3" maker="Hummer" model="H3" year="2008" msrp="$30,595" userRating="3.5" valueRating="4" mpgCity="13" mpgHighway="16" />
+        <car:Car jcr:name="Ford F-150" maker="Ford" model="F-150" year="2008" msrp="$23,910" userRating="4" valueRating="1" mpgCity="14" mpgHighway="20" />
     </Utility>
 </Cars>
\ No newline at end of file

Modified: trunk/docs/examples/gettingstarted/repositories/src/main/resources/configRepository.xml
===================================================================
--- trunk/docs/examples/gettingstarted/repositories/src/main/resources/configRepository.xml	2009-06-10 21:22:34 UTC (rev 1034)
+++ trunk/docs/examples/gettingstarted/repositories/src/main/resources/configRepository.xml	2009-06-10 21:23:19 UTC (rev 1035)
@@ -24,7 +24,7 @@
   ~ 51 Franklin Street, Fifth Floor
   ~ Boston, MA  02110-1301  USA
   -->
-<configuration xmlns="http://www.jboss.org/dna/1.0" xmlns:jcr="http://www.jcp.org/jcr/1.0">
+<configuration xmlns:dna="http://www.jboss.org/dna/1.0" xmlns:jcr="http://www.jcp.org/jcr/1.0">
     <!-- 
     Define the sources for the content.  These sources are directly accessible using the DNA-specific Graph API.
     In fact, this is how the DNA JCR implementation works.  You can think of these as being similar to
@@ -50,7 +50,7 @@
         under '/Vehicles/Cars', while all the 'Aircraft' content appears under '/Vehicles/Aircraft'.
         -->
         <dna:source jcr:name="Vehicles">
-            <dna:classname>org.jboss.dna.graph.connector.federated.FederatedRepositorySource</dna:classname>
+            <dna:classname>org.jboss.dna.graph.connector.federation.FederatedRepositorySource</dna:classname>
             <dna:workspaces>
                 <!-- 
                 Unlike some other repository sources, federated sources have to define all of their workspaces,
@@ -61,11 +61,11 @@
                 <dna:workspace jcr:name="virtual">
                     <dna:projections>
                         <!-- Project the 'Cars' content, starting with the '/Cars' node. -->
-                        <dna:projection jcr:name="Cars projection" dna:source="Cars" dna:workspace="workspace1">
+                        <dna:projection jcr:name="Cars projection" dna:source="Cars" dna:workspaceName="workspace1">
                             <dna:projectionRules>/Vehicles/Cars => /Cars</dna:projectionRules>
                         </dna:projection>
                         <!-- Project the 'Aicraft' content, starting with the '/Aircraft' node. -->
-                        <dna:projection jcr:name="Aircarft projection" dna:source="Aircraft" dna:workspace="workspace2">
+                        <dna:projection jcr:name="Aircarft projection" dna:source="Aircraft" dna:workspaceName="workspace2">
                             <dna:projectionRules>/Vehicles/Aircraft => /Aircraft</dna:projectionRules>
                         </dna:projection>
                     </dna:projections>
@@ -114,15 +114,15 @@
         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:repository jcr:name="Cars">
             <!-- Specify the source that should be used for the repository -->
-            <source>Cars</source>
+            <dna:source>Cars</dna:source>
             <!-- Define the options for the JCR repository, using camelcase version of JcrRepository.Option names -->
-            <options jcr:primaryType="dna:options"/>
+            <dna:options jcr:primaryType="dna:options">
                 <jaasLoginConfigName jcr:primaryType="dna:option" dna:value="dna-jcr"/>
-            </options>
+            </dna:options>
             <!-- Define any custom node types. Importing CND files via JcrConfiguration is equivalent to specifying here. -->
-            <nodeTypes jcr:primaryType="dna:nodeTypes"/>
+            <dna:nodeTypes jcr:primaryType="dna:nodeTypes"/>
             <!-- Define any namespaces for this repository, other than those already defined by JCR or DNA -->
             <namespaces jcr:primaryType="dna:namespaces">
                 <car jcr:primaryType="dna:namespace" dna:uri="http://jboss.org/dna/examples/cars/1.0"/>
@@ -132,34 +132,34 @@
         Define a JCR repository that accesses the 'Aircraft' source directly.
         This of course isn't really necessary for this example, since we could access the same content through 'vehicles'.
         -->
-        <dna:repository jcr:name="aircraft repository">
+        <dna:repository jcr:name="Aircraft">
             <!-- Specify the source that should be used for the repository -->
-            <source>Aircraft</source>
+            <dna:source>Aircraft</dna:source>
             <!-- Define the options for the JCR repository, using camelcase version of JcrRepository.Option names -->
-            <options jcr:primaryType="dna:options"/>
+            <dna:options jcr:primaryType="dna:options">
                 <jaasLoginConfigName jcr:primaryType="dna:option" dna:value="dna-jcr"/>
-            </options>
+            </dna:options>
         </dna:repository>
         <!-- 
         Define a JCR repository that accesses the 'Vehicles' federated source directly,
         which is defined in the sources to be a projection of the 'Cars' and 'Vehicles' content.
         -->
         <!-- Define a JCR repository that accesses the 'Vehicles' federated source directly -->
-        <dna:repository jcr:name="vehicles">
+        <dna:repository jcr:name="Vehicles">
             <!-- Specify the source that should be used for the repository -->
-            <source>Vehicles</source>
+            <dna:source>Vehicles</dna:source>
             <!-- Define the options for the JCR repository, using camelcase version of JcrRepository.Option names -->
-            <options jcr:primaryType="dna:options">
+            <dna:options jcr:primaryType="dna:options">
                 <projectNodeTypes jcr:primaryType="dna:option" dna:value="false"/>
                 <jaasLoginConfigName jcr:primaryType="dna:option" dna:value="dna-jcr"/>
-            </options>
+            </dna:options>
             <!-- Define any custom node types. Importing CND files via JcrConfiguration is equivalent to specifying here. -->
-            <nodeTypes jcr:primaryType="dna:nodeTypes"/>
+            <dna:nodeTypes jcr:primaryType="dna:nodeTypes"/>
             <!-- Define any namespaces for this repository, other than those already defined by JCR, DNA or by imported content. -->
-            <namespaces jcr:primaryType="dna:namespaces">
+            <dna:namespaces jcr:primaryType="dna:namespaces">
                 <car jcr:primaryType="dna:namespace" dna:uri="http://jboss.org/dna/examples/cars/1.0"/>
                 <air jcr:primaryType="dna:namespace" dna:uri="http://jboss.org/dna/examples/aircraft/1.0"/>
-            </namespaces>
+            </dna:namespaces>
         </dna:repository>
     </dna:repositories>
 </configuration>
\ No newline at end of file

Copied: trunk/docs/examples/gettingstarted/repositories/src/main/resources/vehicles.cnd (from rev 1034, trunk/docs/examples/gettingstarted/repositories/src/main/resources/virtual.cnd)
===================================================================
--- trunk/docs/examples/gettingstarted/repositories/src/main/resources/vehicles.cnd	                        (rev 0)
+++ trunk/docs/examples/gettingstarted/repositories/src/main/resources/vehicles.cnd	2009-06-10 21:23:19 UTC (rev 1035)
@@ -0,0 +1,79 @@
+/*
+ * 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'>
+<air='http://jboss.org/dna/examples/aircraft/1.0'>
+<car='http://jboss.org/dna/examples/cars/1.0'>
+
+//------------------------------------------------------------------------------
+// N O D E T Y P E S
+//------------------------------------------------------------------------------
+
+[car:Car] > nt:unstructured
+  - car:maker (string)
+  - car:model (string)
+  - car:year (string) < '(19|20)\d{2}'                     // any 4 digit number starting with '19' or '20'
+  - car:msrp (string) < '[$]\d{1,3}[,]?\d{3}([.]\d{2})?'   // of the form "$X,XXX.ZZ", "$XX,XXX.ZZ" or "$XXX,XXX.ZZ" 
+                                                           // where '.ZZ' is optional
+  - car:userRating (long) < '[1,5]'                        // any value from 1 to 5 (inclusive)
+  - car:valueRating (long) < '[1,5]'                       // any value from 1 to 5 (inclusive)
+  - car:mpgCity (long) < '(0,]'                            // any value greater than 0
+  - car:mpgHighway (long) < '(0,]'                         // any value greater than 0
+  - car:lengthInInches (double) < '(0,]'                   // any value greater than 0
+  - car:wheelbaseInInches (double) < '(0,]'                // any value greater than 0
+  - car:engine (string)
+
+[air:Aircraft] > nt:unstructured
+  - air:maker (string)
+  - air:model (string)
+  - air:designedBy (string)
+  - air:introduced (string) < '(19|20)\d{2}'                // any 4 digit number starting with '19' or '20'
+  - air:range (string)                                      // any integer (with optional ',' every 1000s place)
+     < '\d{1,3}(,?\d{3})*\s*(nm|m|km|mi|ft)'                // followed by 'nm', 'm', 'km', 'mi', or 'ft'
+  - air:maxSpeed (string)                                   // any integer (with optional ',' every 1000s place)
+    < '\d{1,3}(,?\d{3})*\s*(kt|mph|km/h|kmph)'              // followed by 'kt', 'mph', 'km/h' or 'kmph'
+  - air:takeoffSpeed (string)                               // any integer (with optional ',' every 1000s place)
+    < '\d{1,3}(,?\d{3})*\s*(kt|mph|km/h|kmph)'              // followed by 'kt', 'mph', 'km/h' or 'kmph'
+  - air:cruiseSpeed (string)                                // any integer (with optional ',' every 1000s place)
+    < '\d{1,3}(,?\d{3})*\s*(kt|mph|km/h|kmph)'              // followed by 'kt', 'mph', 'km/h' or 'kmph'
+  - air:emptyWeight (string)                                // any integer (with optional ',' every 1000s place)
+    < '\d{1,3}(,?\d{3})*\s*(lb|kg)'                         // followed by 'lb' or 'kg'
+  - air:maxWeight (string)                                  // any integer (with optional ',' every 1000s place)
+    < '\d{1,3}(,?\d{3})*\s*(lb|kg)'                         // followed by 'lb' or 'kg'
+  - air:rateOfClimb (string)                                // any integer (with optional ',' every 1000s place)
+    < '\d{1,3}(,?\d{3})*\s*(ft|km|m)/(s|min)'               // followed by 'ft/s', 'ft/min', 'km/s', 'km/min', 'm/s', or 'm/min'
+  - air:serviceCeiling (string)                             // any integer (with optional ',' every 1000s place)
+    < '\d{1,3}(,?\d{3})*\s*(nm|m|km|mi|ft)'                 // followed by 'nm', 'm', 'km', 'mi', or 'ft'
+  - air:fuelCapacity (string)                               // any integer (with optional ',' every 1000s place)
+    < '\d{1,3}(,?\d{3})*\s*(lb|kg|gal|L)'                   // followed by 'lb', 'kg', 'gal', or 'L'
+  - air:crew (long) < '[0,)'                                // any non-negative value
+  - air:numberBuilt (string)                                // any integer (with optional ',' every 1000s place)
+    < '\d{1,3}(,?\d{3})*\s*[+]?' ,                          // optionally followed by '+'
+      '([<>]\s*)?\d{1,3}(,?\d{3})*'                         // or prefixed by '<' or '>'
+  - air:url (string)

Deleted: trunk/docs/examples/gettingstarted/repositories/src/main/resources/virtual.cnd
===================================================================
--- trunk/docs/examples/gettingstarted/repositories/src/main/resources/virtual.cnd	2009-06-10 21:22:34 UTC (rev 1034)
+++ trunk/docs/examples/gettingstarted/repositories/src/main/resources/virtual.cnd	2009-06-10 21:23:19 UTC (rev 1035)
@@ -1,79 +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'>
-<air='http://jboss.org/dna/examples/aircraft/1.0'>
-<car='http://jboss.org/dna/examples/cars/1.0'>
-
-//------------------------------------------------------------------------------
-// N O D E T Y P E S
-//------------------------------------------------------------------------------
-
-[car:Car] > nt:unstructured
-  - car:maker (string)
-  - car:model (string)
-  - car:year (string) < '(19|20)\d{2}'                     // any 4 digit number starting with '19' or '20'
-  - car:msrp (string) < '[$]\d{1,3}[,]?\d{3}([.]\d{2})?'   // of the form "$X,XXX.ZZ", "$XX,XXX.ZZ" or "$XXX,XXX.ZZ" 
-                                                           // where '.ZZ' is optional
-  - car:userRating (long) < '[1,5]'                        // any value from 1 to 5 (inclusive)
-  - car:valueRating (long) < '[1,5]'                       // any value from 1 to 5 (inclusive)
-  - car:mpgCity (long) < '(0,]'                            // any value greater than 0
-  - car:mpgHighway (long) < '(0,]'                         // any value greater than 0
-  - car:lengthInInches (double) < '(0,]'                   // any value greater than 0
-  - car:wheelbaseInInches (double) < '(0,]'                // any value greater than 0
-  - car:engine (string)
-
-[air:Aircraft] > nt:unstructured
-  - air:maker (string)
-  - air:model (string)
-  - air:designedBy (string)
-  - air:introduced (string) < '(19|20)\d{2}'                // any 4 digit number starting with '19' or '20'
-  - air:range (string)                                      // any integer (with optional ',' every 1000s place)
-     < '\d{1,3}(,?\d{3})*\s*(nm|m|km|mi|ft)'                // followed by 'nm', 'm', 'km', 'mi', or 'ft'
-  - air:maxSpeed (string)                                   // any integer (with optional ',' every 1000s place)
-    < '\d{1,3}(,?\d{3})*\s*(kt|mph|km/h|kmph)'              // followed by 'kt', 'mph', 'km/h' or 'kmph'
-  - air:takeoffSpeed (string)                               // any integer (with optional ',' every 1000s place)
-    < '\d{1,3}(,?\d{3})*\s*(kt|mph|km/h|kmph)'              // followed by 'kt', 'mph', 'km/h' or 'kmph'
-  - air:cruiseSpeed (string)                                // any integer (with optional ',' every 1000s place)
-    < '\d{1,3}(,?\d{3})*\s*(kt|mph|km/h|kmph)'              // followed by 'kt', 'mph', 'km/h' or 'kmph'
-  - air:emptyWeight (string)                                // any integer (with optional ',' every 1000s place)
-    < '\d{1,3}(,?\d{3})*\s*(lb|kg)'                         // followed by 'lb' or 'kg'
-  - air:maxWeight (string)                                  // any integer (with optional ',' every 1000s place)
-    < '\d{1,3}(,?\d{3})*\s*(lb|kg)'                         // followed by 'lb' or 'kg'
-  - air:rateOfClimb (string)                                // any integer (with optional ',' every 1000s place)
-    < '\d{1,3}(,?\d{3})*\s*(ft|km|m)/(s|min)'               // followed by 'ft/s', 'ft/min', 'km/s', 'km/min', 'm/s', or 'm/min'
-  - air:serviceCeiling (string)                             // any integer (with optional ',' every 1000s place)
-    < '\d{1,3}(,?\d{3})*\s*(nm|m|km|mi|ft)'                 // followed by 'nm', 'm', 'km', 'mi', or 'ft'
-  - air:fuelCapacity (string)                               // any integer (with optional ',' every 1000s place)
-    < '\d{1,3}(,?\d{3})*\s*(lb|kg|gal|L)'                   // followed by 'lb', 'kg', 'gal', or 'L'
-  - air:crew (long) < '[0,)'                                // any non-negative value
-  - air:numberBuilt (string)                                // any integer (with optional ',' every 1000s place)
-    < '\d{1,3}(,?\d{3})*\s*[+]?' ,                          // optionally followed by '+'
-      '([<>]\s*)?\d{1,3}(,?\d{3})*'                         // or prefixed by '<' or '>'
-  - air:url (string)

Modified: trunk/docs/examples/gettingstarted/repositories/src/test/java/org/jboss/example/dna/repository/RepositoryClientTest.java
===================================================================
--- trunk/docs/examples/gettingstarted/repositories/src/test/java/org/jboss/example/dna/repository/RepositoryClientTest.java	2009-06-10 21:22:34 UTC (rev 1034)
+++ trunk/docs/examples/gettingstarted/repositories/src/test/java/org/jboss/example/dna/repository/RepositoryClientTest.java	2009-06-10 21:23:19 UTC (rev 1035)
@@ -34,6 +34,7 @@
 import java.util.Map;
 import org.junit.After;
 import org.junit.Before;
+import org.junit.Ignore;
 import org.junit.Test;
 import org.mockito.MockitoAnnotations;
 import org.mockito.MockitoAnnotations.Mock;
@@ -60,6 +61,8 @@
         client.setUserInterface(userInterface);
         client.setApi(getApi());
         stub(userInterface.getLocationOfRepositoryFiles()).toReturn(new File("src/main/resources").getAbsolutePath());
+        stub(userInterface.getLocationOfCndFiles()).toReturn(new File("src/main/resources").getAbsolutePath());
+        stub(userInterface.getRepositoryConfiguration()).toReturn(new File("src/main/resources/configRepository.xml"));
     }
 
     @After
@@ -96,21 +99,22 @@
     @Test
     public void shouldStartupWithoutError() throws Exception {
         client.startRepositories();
-        assertThat(client.getNamesOfRepositories(), hasItems("Aircraft", "Cars", "Configuration", "Vehicles", "Cache"));
+        assertThat(client.getNamesOfRepositories(), hasItems("Aircraft", "Car", "Vehicles"));
     }
 
     @Test
     public void shouldStartupWithoutErrorMoreThanOnce() throws Exception {
         client.startRepositories();
-        assertThat(client.getNamesOfRepositories(), hasItems("Aircraft", "Cars", "Configuration", "Vehicles", "Cache"));
+        assertThat(client.getNamesOfRepositories(), hasItems("Aircraft", "Car", "Vehicles"));
     }
 
+    @Ignore
     @Test
     public void shouldHaveContentFromConfigurationRepository() throws Throwable {
         client.startRepositories();
 
         getNodeInfo("Configuration", "/jcr:system");
-        //assertThat(children, hasItems("dna:sources", "dna:federatedRepositories"));
+        // assertThat(children, hasItems("dna:sources", "dna:federatedRepositories"));
         assertThat(properties.containsKey("jcr:primaryType"), is(true));
         // assertThat(properties.containsKey("dna:uuid"), is(true));
         assertThat(properties.size() >= 1, is(true));
@@ -225,13 +229,13 @@
         client.startRepositories();
 
         getNodeInfo("Vehicles", "/");
-        //assertThat(children, hasItems("Vehicles", "jcr:system"));
+        // assertThat(children, hasItems("Vehicles", "jcr:system"));
 
         getNodeInfo("Vehicles", "/Vehicles");
         assertThat(children, hasItems("Cars", "Aircraft"));
 
         getNodeInfo("Vehicles", "/");
-        //assertThat(children, hasItems("Vehicles", "jcr:system"));
+        // assertThat(children, hasItems("Vehicles", "jcr:system"));
 
         getNodeInfo("Vehicles", "/Vehicles/Cars/Hybrid");
         assertThat(children, hasItems("Toyota Prius", "Toyota Highlander", "Nissan Altima"));
@@ -252,6 +256,8 @@
         assertProperty("wheelbaseInInches", "108.0");
         assertProperty("engine", "5,935 cc 5.9 liters V 12");
 
+        getNodeInfo("Vehicles", "/Vehicles/Aircraft");
+
         getNodeInfo("Vehicles", "/Vehicles/Aircraft/Vintage/Wright Flyer");
         assertThat(children.size(), is(0));
         assertThat(properties.containsKey("jcr:primaryType"), is(true));
@@ -272,10 +278,10 @@
     @Test
     public void shouldBeAbleToExecuteTestsRepeatedly() throws Throwable {
         for (int i = 0; i != 5; ++i) {
-            shouldHaveContentFromConfigurationRepository();
+            // shouldHaveContentFromConfigurationRepository();
             shouldHaveContentFromCarsRepository();
             shouldHaveContentFromAircraftRepository();
-            // shouldHaveContentFromVehiclesRepository();
+            shouldHaveContentFromVehiclesRepository();
         }
     }
 }

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	2009-06-10 21:22:34 UTC (rev 1034)
+++ trunk/docs/gettingstarted/src/main/docbook/en-US/content/downloading_and_running.xml	2009-06-10 21:23:19 UTC (rev 1035)
@@ -224,8 +224,9 @@
 				</listitem>
 				<listitem>
 					<para><emphasis role="strong"><code>aircraft.cnd</code></emphasis>, <emphasis role="strong"><code>cars.cnd</code></emphasis>,
-					and <emphasis role="strong"><code>virtual.cnd</code></emphasis> are the CND files used for the three different JCR Repositories
-					set up in the example.  The <emphasis role="strong"><code>virtual.cnd</code></emphasis> is just a combination of the other two.
+					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).
 					</para>
 				</listitem>
 				<listitem>

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	2009-06-10 21:22:34 UTC (rev 1034)
+++ trunk/docs/gettingstarted/src/main/docbook/en-US/content/repository_example.xml	2009-06-10 21:23:19 UTC (rev 1035)
@@ -263,9 +263,9 @@
     // in the configuration file, but this approach is easy and allows us to define the node types
     // using the CND format in one or multiple files.
     String locationOfCndFiles = userInterface.getLocationOfCndFiles();
-    configuration.repository("aircraft repository").addNodeTypes(locationOfCndFiles + "/aircraft.cnd");
-    configuration.repository("car repository").addNodeTypes(locationOfCndFiles + "/cars.cnd");
-    configuration.repository("virtual").addNodeTypes(locationOfCndFiles + "/virtual.cnd");
+    configuration.repository("Aircraft").addNodeTypes(locationOfCndFiles + "/aircraft.cnd");
+    configuration.repository("Cars").addNodeTypes(locationOfCndFiles + "/cars.cnd");
+    configuration.repository("Vehicles").addNodeTypes(locationOfCndFiles + "/vehicles.cnd");
 
     // Now create the JCR engine ...
     engine = configuration.build();

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	2009-06-10 21:22:34 UTC (rev 1034)
+++ trunk/docs/gettingstarted/src/main/docbook/en-US/content/using_dna.xml	2009-06-10 21:23:19 UTC (rev 1035)
@@ -179,7 +179,7 @@
 	      This of course is optional, since we could access the same content through 'vehicles'.
 	      -->
 	      <dna:repository jcr:name="car repository" dna:source="Cars">
-	          <options jcr:primaryType="dna:options"/>
+	          <options jcr:primaryType="dna:options">
 	              <jaasLoginConfigName jcr:primaryType="dna:option" dna:value="dna-jcr"/>
 	          </options>
 	      </dna:repository>

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	2009-06-10 21:22:34 UTC (rev 1034)
+++ trunk/docs/reference/src/main/docbook/en-US/content/jcr/configuration.xml	2009-06-10 21:23:19 UTC (rev 1035)
@@ -179,7 +179,7 @@
 	      This of course is optional, since we could access the same content through 'vehicles'.
 	      -->
 	      <dna:repository jcr:name="car repository" dna:source="Cars">
-	          <options jcr:primaryType="dna:options"/>
+	          <options jcr:primaryType="dna:options">
 	              <jaasLoginConfigName jcr:primaryType="dna:option" dna:value="dna-jcr"/>
 	          </options>
 	      </dna:repository>



From dna-commits at lists.jboss.org  Thu Jun 11 05:19:30 2009
From: dna-commits at lists.jboss.org (dna-commits at lists.jboss.org)
Date: Thu, 11 Jun 2009 05:19:30 -0400
Subject: [dna-commits] DNA SVN: r1036 - in trunk:
	docs/examples/gettingstarted/repositories/src/main/java/org/jboss/example/dna/repository
	and 2 other directories.
Message-ID: <E1MEgRW-0005hO-8U@committer01.frg.pub.inap.atl.jboss.com>

Author: rhauch
Date: 2009-06-11 05:19:29 -0400 (Thu, 11 Jun 2009)
New Revision: 1036

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
   trunk/docs/examples/gettingstarted/repositories/src/main/java/org/jboss/example/dna/repository/RepositoryClient.java
   trunk/docs/examples/gettingstarted/repositories/src/main/resources/configRepository.xml
   trunk/docs/examples/gettingstarted/repositories/src/test/java/org/jboss/example/dna/repository/RepositoryClientTest.java
   trunk/docs/examples/gettingstarted/repositories/src/test/java/org/jboss/example/dna/repository/RepositoryClientUsingJcrTest.java
Log:
DNA-449 Additional fixes to get the repository example working.  The Federated Connector's fork- and join-processors were not properly handling create requests, so that was fixed.

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	2009-06-10 21:23:19 UTC (rev 1035)
+++ trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/federation/ForkRequestProcessor.java	2009-06-11 09:19:29 UTC (rev 1036)
@@ -50,6 +50,7 @@
 import org.jboss.dna.graph.property.DateTime;
 import org.jboss.dna.graph.property.Name;
 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.request.CloneWorkspaceRequest;
@@ -70,6 +71,7 @@
 import org.jboss.dna.graph.request.ReadNodeRequest;
 import org.jboss.dna.graph.request.ReadPropertyRequest;
 import org.jboss.dna.graph.request.Request;
+import org.jboss.dna.graph.request.SetPropertyRequest;
 import org.jboss.dna.graph.request.UnsupportedRequestException;
 import org.jboss.dna.graph.request.UpdatePropertiesRequest;
 import org.jboss.dna.graph.request.VerifyNodeExistsRequest;
@@ -933,6 +935,7 @@
         FederatedRequest federatedRequest = new FederatedRequest(request);
 
         // Any non-read request should be submitted to the first ProxyNode ...
+        PlaceholderNode placeholder = null;
         while (projectedNode != null) {
             if (projectedNode.isProxy()) {
                 ProxyNode proxy = projectedNode.asProxy();
@@ -947,9 +950,48 @@
                 return;
             }
             assert projectedNode.isPlaceholder();
+            if (placeholder == null) placeholder = projectedNode.asPlaceholder();
             projectedNode = projectedNode.next();
         }
-        // Unable to perform this create ...
+
+        // At this point, we know the parent node is a placeholder, so we cannot create children.
+        // What we don't know, though, is whether there is an existing child at the desired location.
+        if (placeholder != null) {
+            switch (request.conflictBehavior()) {
+                case UPDATE:
+                case DO_NOT_REPLACE:
+                    // See if there is an existing node at the desired location ...
+                    Location parent = request.under();
+                    if (parent.hasPath()) {
+                        PathFactory pathFactory = getExecutionContext().getValueFactories().getPathFactory();
+                        Path childPath = pathFactory.create(parent.getPath(), request.named());
+                        Location childLocation = Location.create(childPath);
+                        projectedNode = project(childLocation, request.inWorkspace(), request, true);
+                        if (projectedNode != null) {
+                            if (projectedNode.isProxy()) {
+                                ProxyNode proxy = projectedNode.asProxy();
+
+                                // We know that the parent is a placeholder, so this proxy node must exist, so do a read ...
+                                ReadNodeRequest pushDownRequest = new ReadNodeRequest(proxy.location(), proxy.workspaceName());
+                                federatedRequest.add(pushDownRequest, proxy.isSameLocationAsOriginal(), false, proxy.projection());
+
+                                // Submit the requests for processing and then STOP ...
+                                submit(federatedRequest);
+                                return;
+                            }
+                            // The node does exist, so set the location ...
+                            assert projectedNode.isPlaceholder();
+                            request.setActualLocationOfNode(projectedNode.location());
+                            return;
+                        }
+                    }
+                    break;
+                case APPEND:
+                case REPLACE:
+                    // Unable to perform this create ...
+                    break;
+            }
+        }
         String msg = GraphI18n.unableToCreateNodeUnderPlaceholder.text(readable(request.named()),
                                                                        readable(request.under()),
                                                                        request.inWorkspace(),
@@ -995,6 +1037,41 @@
     /**
      * {@inheritDoc}
      * 
+     * @see org.jboss.dna.graph.request.processor.RequestProcessor#process(org.jboss.dna.graph.request.SetPropertyRequest)
+     */
+    @Override
+    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);
+
+        // Any non-read request should be submitted to the first ProxyNode ...
+        while (projectedNode != null) {
+            if (projectedNode.isProxy()) {
+                ProxyNode proxy = projectedNode.asProxy();
+                // Create and submit a request for the projection ...
+                SetPropertyRequest pushDownRequest = new SetPropertyRequest(proxy.location(), proxy.workspaceName(),
+                                                                            request.property());
+                federatedRequest.add(pushDownRequest, proxy.isSameLocationAsOriginal(), false, proxy.projection());
+
+                // Submit the requests for processing and then STOP ...
+                submit(federatedRequest);
+                return;
+            }
+            assert projectedNode.isPlaceholder();
+            projectedNode = projectedNode.next();
+        }
+        // Unable to perform this update ...
+        String msg = GraphI18n.unableToUpdatePlaceholder.text(readable(request.on()), request.inWorkspace(), getSourceName());
+        request.setError(new UnsupportedRequestException(msg));
+    }
+
+    /**
+     * {@inheritDoc}
+     * 
      * @see org.jboss.dna.graph.request.processor.RequestProcessor#process(org.jboss.dna.graph.request.DeleteBranchRequest)
      */
     @Override

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	2009-06-10 21:23:19 UTC (rev 1035)
+++ trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/federation/JoinRequestProcessor.java	2009-06-11 09:19:29 UTC (rev 1036)
@@ -61,6 +61,7 @@
 import org.jboss.dna.graph.request.ReadNodeRequest;
 import org.jboss.dna.graph.request.ReadPropertyRequest;
 import org.jboss.dna.graph.request.Request;
+import org.jboss.dna.graph.request.SetPropertyRequest;
 import org.jboss.dna.graph.request.UpdatePropertiesRequest;
 import org.jboss.dna.graph.request.VerifyNodeExistsRequest;
 import org.jboss.dna.graph.request.VerifyWorkspaceRequest;
@@ -678,9 +679,22 @@
     public void process( CreateNodeRequest request ) {
         ProjectedRequest projected = federatedRequest.getFirstProjectedRequest();
         assert !projected.hasNext();
-        CreateNodeRequest source = (CreateNodeRequest)projected.getRequest();
-        if (checkErrorOrCancel(request, source)) return;
-        Location sourceLocation = source.getActualLocationOfNode();
+        Request projectedRequest = projected.getRequest();
+        // Check the error first ...
+        if (checkErrorOrCancel(request, projectedRequest)) return;
+
+        // No error, so project the results back to the federated repository ...
+        Location sourceLocation = null;
+        if (projectedRequest instanceof CreateNodeRequest) {
+            CreateNodeRequest source = (CreateNodeRequest)projectedRequest;
+            sourceLocation = source.getActualLocationOfNode();
+        } else if (projectedRequest instanceof ReadNodeRequest) {
+            // In this case, the original request was to create the node only if it was missing,
+            // but we knew it already exists because the parent was a placeholder and the child
+            // mapped to an existing proxy node. Therefore, record the location...
+            ReadNodeRequest source = (ReadNodeRequest)projectedRequest;
+            sourceLocation = source.getActualLocationOfNode();
+        }
         request.setActualLocationOfNode(projectToFederated(request.under(), projected.getProjection(), sourceLocation, request));
     }
 
@@ -702,6 +716,21 @@
     /**
      * {@inheritDoc}
      * 
+     * @see org.jboss.dna.graph.request.processor.RequestProcessor#process(org.jboss.dna.graph.request.SetPropertyRequest)
+     */
+    @Override
+    public void process( SetPropertyRequest request ) {
+        ProjectedRequest projected = federatedRequest.getFirstProjectedRequest();
+        assert !projected.hasNext();
+        SetPropertyRequest source = (SetPropertyRequest)projected.getRequest();
+        if (checkErrorOrCancel(request, source)) return;
+        Location sourceLocation = source.getActualLocationOfNode();
+        request.setActualLocationOfNode(projectToFederated(request.on(), projected.getProjection(), sourceLocation, request));
+    }
+
+    /**
+     * {@inheritDoc}
+     * 
      * @see org.jboss.dna.graph.request.processor.RequestProcessor#process(org.jboss.dna.graph.request.DeleteBranchRequest)
      */
     @Override

Modified: trunk/docs/examples/gettingstarted/repositories/src/main/java/org/jboss/example/dna/repository/RepositoryClient.java
===================================================================
--- trunk/docs/examples/gettingstarted/repositories/src/main/java/org/jboss/example/dna/repository/RepositoryClient.java	2009-06-10 21:23:19 UTC (rev 1035)
+++ trunk/docs/examples/gettingstarted/repositories/src/main/java/org/jboss/example/dna/repository/RepositoryClient.java	2009-06-11 09:19:29 UTC (rev 1036)
@@ -62,7 +62,7 @@
 public class RepositoryClient {
 
     public static final String INMEMORY_REPOSITORY_SOURCE_CLASSNAME = "org.jboss.dna.connector.inmemory.InMemoryRepositorySource";
-    public static final String JAAS_LOGIN_CONTEXT_NAME = "dna-repository-example";
+    public static final String JAAS_LOGIN_CONTEXT_NAME = "dna-jcr";
 
     /**
      * @param args
@@ -96,7 +96,7 @@
     }
 
     private Api api = Api.JCR;
-    private String jaasContextName;
+    private String jaasContextName = JAAS_LOGIN_CONTEXT_NAME;
     private UserInterface userInterface;
     private LoginContext loginContext;
     private JcrEngine engine;

Modified: trunk/docs/examples/gettingstarted/repositories/src/main/resources/configRepository.xml
===================================================================
--- trunk/docs/examples/gettingstarted/repositories/src/main/resources/configRepository.xml	2009-06-10 21:23:19 UTC (rev 1035)
+++ trunk/docs/examples/gettingstarted/repositories/src/main/resources/configRepository.xml	2009-06-11 09:19:29 UTC (rev 1036)
@@ -68,10 +68,18 @@
                         <dna:projection jcr:name="Aircarft projection" dna:source="Aircraft" dna:workspaceName="workspace2">
                             <dna:projectionRules>/Vehicles/Aircraft => /Aircraft</dna:projectionRules>
                         </dna:projection>
+                        <!-- Project the 'System' content. Only needed when this source is accessed through JCR. -->
+                        <dna:projection jcr:name="System projection" dna:source="System" dna:workspaceName="default">
+                            <dna:projectionRules>/jcr:system => /</dna:projectionRules>
+                        </dna:projection>
                     </dna:projections>
                 </dna:workspace>
             </dna:workspaces>
         </dna:source>
+        <!-- 
+        A 'System' source needed for the '/jcr:system' branch of the Vehicles source when it is access through JCR.
+        -->
+        <dna:source jcr:name="System" dna:classname="org.jboss.dna.graph.connector.inmemory.InMemoryRepositorySource" dna:retryLimit="3" dna:defaultWorkspaceName="default"/>
     </dna:sources>
     <!-- 
     Define the sequencers. This is an optional section. For this example, we're not using any sequencers. 

Modified: trunk/docs/examples/gettingstarted/repositories/src/test/java/org/jboss/example/dna/repository/RepositoryClientTest.java
===================================================================
--- trunk/docs/examples/gettingstarted/repositories/src/test/java/org/jboss/example/dna/repository/RepositoryClientTest.java	2009-06-10 21:23:19 UTC (rev 1035)
+++ trunk/docs/examples/gettingstarted/repositories/src/test/java/org/jboss/example/dna/repository/RepositoryClientTest.java	2009-06-11 09:19:29 UTC (rev 1036)
@@ -32,6 +32,9 @@
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import javax.security.auth.callback.CallbackHandler;
+import org.jboss.dna.graph.JaasSecurityContext;
+import org.jboss.security.config.IDTrustConfiguration;
 import org.junit.After;
 import org.junit.Before;
 import org.junit.Ignore;
@@ -63,6 +66,17 @@
         stub(userInterface.getLocationOfRepositoryFiles()).toReturn(new File("src/main/resources").getAbsolutePath());
         stub(userInterface.getLocationOfCndFiles()).toReturn(new File("src/main/resources").getAbsolutePath());
         stub(userInterface.getRepositoryConfiguration()).toReturn(new File("src/main/resources/configRepository.xml"));
+
+        // Set up the JAAS provider (IDTrust) and a policy file (which defines the "dna-jcr" login config name)
+        IDTrustConfiguration idtrustConfig = new IDTrustConfiguration();
+        try {
+            idtrustConfig.config("security/jaas.conf.xml");
+        } catch (Exception ex) {
+            throw new IllegalStateException(ex);
+        }
+
+        CallbackHandler handler = new JaasSecurityContext.UserPasswordCallbackHandler("jsmith", "secret".toCharArray());
+        stub(userInterface.getCallbackHandler()).toReturn(handler);
     }
 
     @After

Modified: trunk/docs/examples/gettingstarted/repositories/src/test/java/org/jboss/example/dna/repository/RepositoryClientUsingJcrTest.java
===================================================================
--- trunk/docs/examples/gettingstarted/repositories/src/test/java/org/jboss/example/dna/repository/RepositoryClientUsingJcrTest.java	2009-06-10 21:23:19 UTC (rev 1035)
+++ trunk/docs/examples/gettingstarted/repositories/src/test/java/org/jboss/example/dna/repository/RepositoryClientUsingJcrTest.java	2009-06-11 09:19:29 UTC (rev 1036)
@@ -24,12 +24,19 @@
 package org.jboss.example.dna.repository;
 
 import org.jboss.example.dna.repository.RepositoryClient.Api;
+import org.junit.Before;
 
 /**
  * @author Randall Hauch
  */
 public class RepositoryClientUsingJcrTest extends RepositoryClientTest {
 
+    @Before
+    @Override
+    public void beforeEach() {
+        super.beforeEach();
+    }
+
     /**
      * {@inheritDoc}
      * 



From dna-commits at lists.jboss.org  Thu Jun 11 05:20:04 2009
From: dna-commits at lists.jboss.org (dna-commits at lists.jboss.org)
Date: Thu, 11 Jun 2009 05:20:04 -0400
Subject: [dna-commits] DNA SVN: r1037 -
	trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/federation.
Message-ID: <E1MEgS4-0005hu-Q8@committer01.frg.pub.inap.atl.jboss.com>

Author: rhauch
Date: 2009-06-11 05:20:03 -0400 (Thu, 11 Jun 2009)
New Revision: 1037

Modified:
   trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/federation/ForkRequestProcessor.java
Log:
DNA-449 Minor correction to the VerifyNodeExistsRequest processing within the federated connector.

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	2009-06-11 09:19:29 UTC (rev 1036)
+++ trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/federation/ForkRequestProcessor.java	2009-06-11 09:20:03 UTC (rev 1037)
@@ -696,9 +696,7 @@
             if (projectedNode.isPlaceholder()) {
                 PlaceholderNode placeholder = projectedNode.asPlaceholder();
                 // Create a request and set the results ...
-                ReadNodeRequest placeholderRequest = new ReadNodeRequest(request.at(), request.inWorkspace());
-                placeholderRequest.addChildren(placeholder.children());
-                placeholderRequest.addProperties(placeholder.properties().values());
+                VerifyNodeExistsRequest placeholderRequest = new VerifyNodeExistsRequest(request.at(), request.inWorkspace());
                 placeholderRequest.setActualLocationOfNode(placeholder.location());
                 federatedRequest.add(placeholderRequest, true, true, null);
             } else if (projectedNode.isProxy()) {



From dna-commits at lists.jboss.org  Thu Jun 11 05:21:06 2009
From: dna-commits at lists.jboss.org (dna-commits at lists.jboss.org)
Date: Thu, 11 Jun 2009 05:21:06 -0400
Subject: [dna-commits] DNA SVN: r1038 - in trunk:
	dna-graph/src/main/java/org/jboss/dna/graph/connector/federation
	and 5 other directories.
Message-ID: <E1MEgT4-0005jl-RU@committer01.frg.pub.inap.atl.jboss.com>

Author: rhauch
Date: 2009-06-11 05:21:06 -0400 (Thu, 11 Jun 2009)
New Revision: 1038

Modified:
   trunk/dna-graph/src/main/java/org/jboss/dna/graph/LocationWithPathAndProperties.java
   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/GeneralProjector.java
   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/ProjectedNode.java
   trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/federation/ProjectorWithPlaceholders.java
   trunk/dna-graph/src/test/java/org/jboss/dna/graph/connector/federation/AbstractProjectorTest.java
   trunk/dna-graph/src/test/java/org/jboss/dna/graph/connector/federation/BranchedMirrorProjectorTest.java
   trunk/dna-graph/src/test/java/org/jboss/dna/graph/connector/federation/ForkRequestProcessorTest.java
   trunk/dna-graph/src/test/java/org/jboss/dna/graph/connector/federation/ProjectorWithPlaceholdersTest.java
   trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/JcrConfiguration.java
   trunk/dna-repository/src/main/java/org/jboss/dna/repository/DnaConfiguration.java
   trunk/docs/examples/gettingstarted/repositories/src/main/java/org/jboss/example/dna/repository/RepositoryClient.java
   trunk/docs/examples/gettingstarted/repositories/src/test/java/org/jboss/example/dna/repository/RepositoryClientTest.java
   trunk/docs/examples/gettingstarted/repositories/src/test/java/org/jboss/example/dna/repository/RepositoryClientUsingJcrTest.java
Log:
DNA-449 Discovered a very subtle error in the RepositoryClient source that was importing the node type definitions into a non-existant repository.  After fixing this (and perhaps several other issues), the test cases all run.

Modified: trunk/dna-graph/src/main/java/org/jboss/dna/graph/LocationWithPathAndProperties.java
===================================================================
--- trunk/dna-graph/src/main/java/org/jboss/dna/graph/LocationWithPathAndProperties.java	2009-06-11 09:20:03 UTC (rev 1037)
+++ trunk/dna-graph/src/main/java/org/jboss/dna/graph/LocationWithPathAndProperties.java	2009-06-11 09:21:06 UTC (rev 1038)
@@ -135,7 +135,7 @@
      */
     @Override
     public Location with( Path newPath ) {
-        if (newPath == null || this.getPath().equals(newPath)) return this;
+        if (newPath == null || newPath.equals(this.getPath())) return this;
         return new LocationWithPathAndProperties(newPath, idProperties);
     }
 

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	2009-06-11 09:20:03 UTC (rev 1037)
+++ trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/federation/FederatedRepositoryConnection.java	2009-06-11 09:21:06 UTC (rev 1038)
@@ -180,7 +180,7 @@
                 } finally {
                     fork.close();
                 }
-                if (!awaitAllSubtasks) requests.add(new NoMoreFederatedRequests());
+                requests.add(new NoMoreFederatedRequests());
                 // At this point, all submitted requests have been processed/forked, so we can continue with
                 // the join process, starting with the first submitted request. Note that the subtasks may
                 // still be executing, but as the join process operates on a forked request, it will wait
@@ -195,7 +195,7 @@
                         } finally {
                             fork.close();
                         }
-                        if (!awaitAllSubtasks) requests.add(new NoMoreFederatedRequests());
+                        requests.add(new NoMoreFederatedRequests());
                     }
                 });
 

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	2009-06-11 09:20:03 UTC (rev 1037)
+++ trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/federation/ForkRequestProcessor.java	2009-06-11 09:21:06 UTC (rev 1038)
@@ -23,6 +23,7 @@
  */
 package org.jboss.dna.graph.connector.federation;
 
+import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.Iterator;
 import java.util.LinkedList;
@@ -727,12 +728,46 @@
         while (projectedNode != null) {
             if (projectedNode.isPlaceholder()) {
                 PlaceholderNode placeholder = projectedNode.asPlaceholder();
-                // Create a request and set the results ...
-                ReadNodeRequest placeholderRequest = new ReadNodeRequest(placeholder.location(), request.inWorkspace());
-                placeholderRequest.addChildren(placeholder.children());
-                placeholderRequest.addProperties(placeholder.properties().values());
-                placeholderRequest.setActualLocationOfNode(placeholder.location());
-                federatedRequest.add(placeholderRequest, true, true, null);
+                // This placeholder may have proxy nodes as children, in which case we need to verify
+                // their existance to get their actual locations.
+                List<Location> children = new LinkedList<Location>();
+                boolean firstRequest = true;
+                for (ProjectedNode child : placeholder.children()) {
+                    if (child.isPlaceholder()) {
+                        children.add(child.location());
+                        continue;
+                    }
+                    while (child != null && child.isProxy()) {
+                        // Take any children so far and simply record a ReadNodeRequest with results ...
+                        ReadNodeRequest placeholderRequest = new ReadNodeRequest(placeholder.location(), request.inWorkspace());
+                        placeholderRequest.addChildren(children);
+                        if (firstRequest) {
+                            firstRequest = false;
+                            placeholderRequest.addProperties(placeholder.properties().values());
+                        }
+                        placeholderRequest.setActualLocationOfNode(placeholder.location());
+                        federatedRequest.add(placeholderRequest, true, true, null);
+                        children = new LinkedList<Location>();
+                        // Now issue a VerifyNodeExistsRequest for the child.
+                        // We'll mix these into the federated request along with the ReadNodeRequests ...
+                        ProxyNode proxy = child.asProxy();
+                        VerifyNodeExistsRequest verifyRequest = new VerifyNodeExistsRequest(proxy.location(),
+                                                                                            proxy.workspaceName());
+                        federatedRequest.add(verifyRequest, proxy.isSameLocationAsOriginal(), false, proxy.projection());
+                        child = child.next();
+                    }
+                }
+                if (!children.isEmpty()) {
+                    // Submit the children so far ...
+                    ReadNodeRequest placeholderRequest = new ReadNodeRequest(placeholder.location(), request.inWorkspace());
+                    placeholderRequest.addChildren(children);
+                    if (firstRequest) {
+                        firstRequest = false;
+                        placeholderRequest.addProperties(placeholder.properties().values());
+                    }
+                    placeholderRequest.setActualLocationOfNode(placeholder.location());
+                    federatedRequest.add(placeholderRequest, true, true, null);
+                }
             } else if (projectedNode.isProxy()) {
                 ProxyNode proxy = projectedNode.asProxy();
                 // Create and submit a request for the projection ...
@@ -761,12 +796,39 @@
         while (projectedNode != null) {
             if (projectedNode.isPlaceholder()) {
                 PlaceholderNode placeholder = projectedNode.asPlaceholder();
-                // Create a request and set the results ...
-                ReadAllChildrenRequest placeholderRequest = new ReadAllChildrenRequest(placeholder.location(),
-                                                                                       request.inWorkspace());
-                placeholderRequest.addChildren(placeholder.children());
-                placeholderRequest.setActualLocationOfNode(placeholder.location());
-                federatedRequest.add(placeholderRequest, true, true, null);
+                // This placeholder may have proxy nodes as children, in which case we need to verify
+                // their existance to get their actual locations.
+                List<Location> children = new LinkedList<Location>();
+                for (ProjectedNode child : placeholder.children()) {
+                    if (child.isPlaceholder()) {
+                        children.add(child.location());
+                        continue;
+                    }
+                    while (child != null && child.isProxy()) {
+                        // Take any children so far and simply record a ReadNodeRequest with results ...
+                        ReadAllChildrenRequest placeholderRequest = new ReadAllChildrenRequest(placeholder.location(),
+                                                                                               request.inWorkspace());
+                        placeholderRequest.addChildren(children);
+                        placeholderRequest.setActualLocationOfNode(placeholder.location());
+                        federatedRequest.add(placeholderRequest, true, true, null);
+                        children = new LinkedList<Location>();
+                        // Now issue a VerifyNodeExistsRequest for the child.
+                        // We'll mix these into the federated request along with the ReadNodeRequests ...
+                        ProxyNode proxy = child.asProxy();
+                        VerifyNodeExistsRequest verifyRequest = new VerifyNodeExistsRequest(proxy.location(),
+                                                                                            proxy.workspaceName());
+                        federatedRequest.add(verifyRequest, proxy.isSameLocationAsOriginal(), false, proxy.projection());
+                        child = child.next();
+                    }
+                }
+                if (!children.isEmpty()) {
+                    // Submit the children so far ...
+                    ReadAllChildrenRequest placeholderRequest = new ReadAllChildrenRequest(placeholder.location(),
+                                                                                           request.inWorkspace());
+                    placeholderRequest.addChildren(children);
+                    placeholderRequest.setActualLocationOfNode(placeholder.location());
+                    federatedRequest.add(placeholderRequest, true, true, null);
+                }
             } else if (projectedNode.isProxy()) {
                 ProxyNode proxy = projectedNode.asProxy();
                 // Create and submit a request for the projection ...
@@ -895,17 +957,19 @@
                 PlaceholderNode placeholder = projectedNode.asPlaceholder();
                 // Create a request and set the results ...
                 ReadNodeRequest placeholderRequest = new ReadNodeRequest(placeholder.location(), workspace.getName());
-                placeholderRequest.addChildren(placeholder.children());
+                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!
+                }
+                placeholderRequest.addChildren(children);
                 placeholderRequest.addProperties(placeholder.properties().values());
                 placeholderRequest.setActualLocationOfNode(placeholder.location());
                 federatedRequest.add(placeholderRequest, true, true, null);
                 if (maxDepth > 1) {
-                    ExecutionContext context = getExecutionContext();
                     // For each child of the placeholder node ...
-                    for (Location child : placeholder.children()) {
-                        ProjectedNode projectedSubnode = workspace.project(context, child, false);
+                    for (ProjectedNode child : placeholder.children()) {
                         // Call recursively, but reduce the max depth
-                        processBranch(federatedRequest, projectedSubnode, workspace, maxDepth - 1);
+                        processBranch(federatedRequest, child, workspace, maxDepth - 1);
                     }
                 }
             } else if (projectedNode.isProxy()) {
@@ -1124,10 +1188,12 @@
                 federatedRequest.add(delete, true, true, null);
                 // Create and submit a request for each proxy below this placeholder ...
                 // For each child of the placeholder node ...
-                for (Location child : placeholder.children()) {
-                    ProjectedNode projectedSubnode = workspace.project(context, child, true);
-                    // Call recursively ...
-                    submit = deleteBranch(federatedRequest, projectedSubnode, workspace, context);
+                for (ProjectedNode child : placeholder.children()) {
+                    while (child != null && child.isProxy()) {
+                        // Call recursively ...
+                        submit = deleteBranch(federatedRequest, child.asProxy(), workspace, context);
+                        child = child.next();
+                    }
                 }
             }
             projectedNode = projectedNode.next();

Modified: trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/federation/GeneralProjector.java
===================================================================
--- trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/federation/GeneralProjector.java	2009-06-11 09:20:03 UTC (rev 1037)
+++ trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/federation/GeneralProjector.java	2009-06-11 09:21:06 UTC (rev 1038)
@@ -69,6 +69,9 @@
     public ProjectedNode project( ExecutionContext context,
                                   Location location,
                                   boolean requiresUpdate ) {
+        PlaceholderNode placeholder = isPlaceholder(location);
+        if (placeholder != null) return placeholder;
+
         // Find the location of the desired node ...
         Path path = location.getPath();
         if (path == null) {

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	2009-06-11 09:20:03 UTC (rev 1037)
+++ trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/federation/JoinRequestProcessor.java	2009-06-11 09:21:06 UTC (rev 1038)
@@ -202,6 +202,11 @@
                 return;
             }
 
+            // Make sure we have an actual location ...
+            actualLocation = determineActualLocation(actualLocation,
+                                                     readFromSource.getActualLocationOfNode(),
+                                                     projectedRequest.getProjection());
+
             // Accumulate the identification properties ...
             for (Property propertyInSource : readFromSource.getActualLocationOfNode().getIdProperties()) {
                 Name name = propertyInSource.getName();
@@ -240,56 +245,64 @@
         Location actualLocation = request.at();
         int numMerged = 0;
         while (projectedRequest != null) {
-            ReadNodeRequest readFromSource = (ReadNodeRequest)projectedRequest.getRequest();
-            if (readFromSource.hasError()) {
+            Request sourceRequest = projectedRequest.getRequest();
+            if (sourceRequest.hasError()) {
                 projectedRequest = projectedRequest.next();
                 continue;
             }
-            if (readFromSource.isCancelled()) {
+            if (sourceRequest.isCancelled()) {
                 request.cancel();
                 return;
             }
 
-            // Accumulate the identification properties ...
-            for (Property propertyInSource : readFromSource.getActualLocationOfNode().getIdProperties()) {
-                Name name = propertyInSource.getName();
-                Property existing = actualLocation.getIdProperty(name);
-                if (existing != null) {
-                    // Merge the property values ...
-                    propertyInSource = merge(existing, propertyInSource, propertyFactory, true);
+            Projection projection = projectedRequest.getProjection();
+            if (sourceRequest instanceof VerifyNodeExistsRequest) {
+                // We needed to verify the existance of a child node ...
+                VerifyNodeExistsRequest verify = (VerifyNodeExistsRequest)sourceRequest;
+                Location childInSource = verify.getActualLocationOfNode();
+                Location childInRepos = getChildLocationWithCorrectSnsIndex(childInSource,
+                                                                            federatedPath,
+                                                                            childSnsIndexes,
+                                                                            projection);
+                request.addChild(childInRepos);
+                if (federatedPath == null) federatedPath = childInRepos.getPath().getParent();
+            } else {
+                ReadNodeRequest readFromSource = (ReadNodeRequest)sourceRequest;
+                // Accumulate the identification properties ...
+                for (Property propertyInSource : readFromSource.getActualLocationOfNode().getIdProperties()) {
+                    Name name = propertyInSource.getName();
+                    Property existing = actualLocation.getIdProperty(name);
+                    if (existing != null) {
+                        // Merge the property values ...
+                        propertyInSource = merge(existing, propertyInSource, propertyFactory, true);
+                    }
+                    actualLocation = actualLocation.with(propertyInSource);
                 }
-                actualLocation = actualLocation.with(propertyInSource);
-            }
 
-            // Add all the children from the source ...
-            for (Location childInSource : readFromSource.getChildren()) {
-                // Project back into the federated repository ...
-                Path childPath = childInSource.getPath();
-                // Correct the same-name-sibling index for the child ...
-                Name childName = childPath.getLastSegment().getName();
-                Integer snsIndex = childSnsIndexes.get(childName);
-                if (snsIndex == null) {
-                    snsIndex = new Integer(1);
-                    childSnsIndexes.put(childName, snsIndex);
-                } else {
-                    snsIndex = new Integer(snsIndex.intValue() + 1);
-                    childSnsIndexes.put(childName, snsIndex);
+                // Make sure we have an actual location ...
+                actualLocation = determineActualLocation(actualLocation, readFromSource.getActualLocationOfNode(), projection);
+                if (federatedPath == null) federatedPath = actualLocation.getPath();
+
+                // Add all the children from the source ...
+                for (Location childInSource : readFromSource.getChildren()) {
+                    request.addChild(getChildLocationWithCorrectSnsIndex(childInSource,
+                                                                         federatedPath,
+                                                                         childSnsIndexes,
+                                                                         projection));
                 }
-                Path newPath = pathFactory.create(federatedPath, childName, snsIndex.intValue());
-                request.addChild(childInSource.with(newPath));
-            }
 
-            // Add all the properties ...
-            for (Property propertyInSource : readFromSource.getProperties()) {
-                Name name = propertyInSource.getName();
-                Property existing = properties.get(name);
-                if (existing != null) {
-                    // Merge the property values ...
-                    propertyInSource = merge(existing, propertyInSource, propertyFactory, true);
+                // Add all the properties ...
+                for (Property propertyInSource : readFromSource.getProperties()) {
+                    Name name = propertyInSource.getName();
+                    Property existing = properties.get(name);
+                    if (existing != null) {
+                        // Merge the property values ...
+                        propertyInSource = merge(existing, propertyInSource, propertyFactory, true);
+                    }
+                    properties.put(name, propertyInSource);
                 }
-                properties.put(name, propertyInSource);
+                setCacheableInfo(request, readFromSource.getCachePolicy());
             }
-            setCacheableInfo(request, readFromSource.getCachePolicy());
             projectedRequest = projectedRequest.next();
             ++numMerged;
         }
@@ -297,10 +310,43 @@
             // No source requests had results ...
             setPathNotFound(request, request.at(), federatedRequest.getFirstProjectedRequest());
         } else {
+            if (!actualLocation.hasPath()) {
+                assert federatedPath != null;
+                actualLocation = actualLocation.with(federatedPath);
+            }
             request.setActualLocationOfNode(actualLocation);
         }
     }
 
+    protected Location getChildLocationWithCorrectSnsIndex( Location childInSource,
+                                                            Path federatedPath,
+                                                            Map<Name, Integer> childSnsIndexes,
+                                                            Projection projection ) {
+        // Project back into the federated repository ...
+        Path childPath = childInSource.getPath();
+        if (childPath.isRoot() || federatedPath == null) {
+            // We've lost the name of the child, so we need to recompute the path ...
+            for (Path path : projection.getPathsInRepository(childInSource.getPath(), pathFactory)) {
+                childPath = path;
+                if (federatedPath == null) federatedPath = path;
+                break;
+            }
+        }
+
+        // Correct the same-name-sibling index for the child ...
+        Name childName = childPath.getLastSegment().getName();
+        Integer snsIndex = childSnsIndexes.get(childName);
+        if (snsIndex == null) {
+            snsIndex = new Integer(1);
+            childSnsIndexes.put(childName, snsIndex);
+        } else {
+            snsIndex = new Integer(snsIndex.intValue() + 1);
+            childSnsIndexes.put(childName, snsIndex);
+        }
+        Path newPath = pathFactory.create(federatedPath, childName, snsIndex.intValue());
+        return childInSource.with(newPath);
+    }
+
     /**
      * Sets the request {@link Request#setError(Throwable) error} to a {@link PathNotFoundException} that has the lowest existing
      * ancestor computed from the {@link PathNotFoundException}s in the projected requests.
@@ -346,46 +392,54 @@
         Location actualLocation = request.of();
         int numMerged = 0;
         while (projectedRequest != null) {
-            ReadAllChildrenRequest readFromSource = (ReadAllChildrenRequest)projectedRequest.getRequest();
-            if (readFromSource.hasError()) {
+            Request sourceRequest = projectedRequest.getRequest();
+            if (sourceRequest.hasError()) {
                 projectedRequest = projectedRequest.next();
                 continue;
             }
-            if (readFromSource.isCancelled()) {
+            if (sourceRequest.isCancelled()) {
                 request.cancel();
                 return;
             }
 
-            // Accumulate the identification properties ...
-            for (Property propertyInSource : readFromSource.getActualLocationOfNode().getIdProperties()) {
-                Name name = propertyInSource.getName();
-                Property existing = actualLocation.getIdProperty(name);
-                if (existing != null) {
-                    // Merge the property values ...
-                    propertyInSource = merge(existing, propertyInSource, propertyFactory, true);
+            Projection projection = projectedRequest.getProjection();
+            if (sourceRequest instanceof VerifyNodeExistsRequest) {
+                // We needed to verify the existance of a child node ...
+                VerifyNodeExistsRequest verify = (VerifyNodeExistsRequest)sourceRequest;
+                Location childInSource = verify.getActualLocationOfNode();
+                Location childInRepos = getChildLocationWithCorrectSnsIndex(childInSource,
+                                                                            federatedPath,
+                                                                            childSnsIndexes,
+                                                                            projection);
+                request.addChild(childInRepos);
+                if (federatedPath == null) federatedPath = childInRepos.getPath().getParent();
+            } else {
+                ReadAllChildrenRequest readFromSource = (ReadAllChildrenRequest)sourceRequest;
+                // Accumulate the identification properties ...
+                for (Property propertyInSource : readFromSource.getActualLocationOfNode().getIdProperties()) {
+                    Name name = propertyInSource.getName();
+                    Property existing = actualLocation.getIdProperty(name);
+                    if (existing != null) {
+                        // Merge the property values ...
+                        propertyInSource = merge(existing, propertyInSource, propertyFactory, true);
+                    }
+                    actualLocation = actualLocation.with(propertyInSource);
                 }
-                actualLocation = actualLocation.with(propertyInSource);
-            }
 
-            // Add all the children from the source ...
-            for (Location childInSource : readFromSource.getChildren()) {
-                // Project back into the federated repository ...
-                Path childPath = childInSource.getPath();
-                // Correct the same-name-sibling index for the child ...
-                Name childName = childPath.getLastSegment().getName();
-                Integer snsIndex = childSnsIndexes.get(childName);
-                if (snsIndex == null) {
-                    snsIndex = new Integer(1);
-                    childSnsIndexes.put(childName, snsIndex);
-                } else {
-                    snsIndex = new Integer(snsIndex.intValue() + 1);
-                    childSnsIndexes.put(childName, snsIndex);
+                // Make sure we have an actual location ...
+                actualLocation = determineActualLocation(actualLocation, readFromSource.getActualLocationOfNode(), projection);
+                if (federatedPath == null) federatedPath = actualLocation.getPath();
+
+                // Add all the children from the source ...
+                for (Location childInSource : readFromSource.getChildren()) {
+                    request.addChild(getChildLocationWithCorrectSnsIndex(childInSource,
+                                                                         federatedPath,
+                                                                         childSnsIndexes,
+                                                                         projection));
                 }
-                Path newPath = pathFactory.create(federatedPath, childName, snsIndex.intValue());
-                request.addChild(childInSource.with(newPath));
+                setCacheableInfo(request, readFromSource.getCachePolicy());
             }
 
-            setCacheableInfo(request, readFromSource.getCachePolicy());
             projectedRequest = projectedRequest.next();
             ++numMerged;
         }
@@ -393,10 +447,31 @@
             // No source requests had results ...
             setPathNotFound(request, request.of(), federatedRequest.getFirstProjectedRequest());
         } else {
+            if (!actualLocation.hasPath()) {
+                assert federatedPath != null;
+                actualLocation = actualLocation.with(federatedPath);
+            }
             request.setActualLocationOfNode(actualLocation);
         }
     }
 
+    protected Location determineActualLocation( Location actual,
+                                                Location inSource,
+                                                Projection projection ) {
+        if (!actual.hasPath()) {
+            if (projection == null) {
+                // It must be a placeholder node ...
+                return inSource;
+            }
+            // Get the projection from the source-specific location ...
+            Path pathInSource = inSource.getPath();
+            for (Path path : projection.getPathsInRepository(pathInSource, pathFactory)) {
+                return actual.with(path);
+            }
+        }
+        return actual;
+    }
+
     /**
      * {@inheritDoc}
      * 
@@ -421,6 +496,11 @@
                 return;
             }
 
+            // Make sure we have an actual location ...
+            actualLocation = determineActualLocation(actualLocation,
+                                                     readFromSource.getActualLocationOfNode(),
+                                                     projectedRequest.getProjection());
+
             // Accumulate the identification properties ...
             for (Property propertyInSource : readFromSource.getActualLocationOfNode().getIdProperties()) {
                 Name name = propertyInSource.getName();
@@ -477,6 +557,11 @@
                 return;
             }
 
+            // Make sure we have an actual location ...
+            actualLocation = determineActualLocation(actualLocation,
+                                                     readFromSource.getActualLocationOfNode(),
+                                                     projectedRequest.getProjection());
+
             // Accumulate the identification properties ...
             for (Property propertyInSource : readFromSource.getActualLocationOfNode().getIdProperties()) {
                 Name name = propertyInSource.getName();
@@ -523,6 +608,8 @@
         request.setCachePolicy(getDefaultCachePolicy());
         Location actualLocation = request.at();
         int numMerged = 0;
+        // The first pass will only capture the actual ReadBranchRequests to the underlying sources ...
+        Map<Path, Location> actualLocationsOfProxyNodes = new HashMap<Path, Location>();
         while (projectedRequest != null) {
             CacheableRequest fromSource = (CacheableRequest)projectedRequest.getRequest();
             if (fromSource.hasError()) {
@@ -535,24 +622,45 @@
             }
 
             Projection projection = projectedRequest.getProjection();
-            if (fromSource instanceof ReadNodeRequest) {
-                ReadNodeRequest readFromSource = (ReadNodeRequest)fromSource;
-                Location parent = readFromSource.getActualLocationOfNode();
-                List<Location> children = readFromSource.getChildren();
-                Map<Name, Property> properties = readFromSource.getPropertiesByName();
-                projectToFederated(actualLocation, projection, request, parent, children, properties);
-            } else if (fromSource instanceof ReadBranchRequest) {
+            if (fromSource instanceof ReadBranchRequest) {
                 ReadBranchRequest readFromSource = (ReadBranchRequest)fromSource;
                 for (Location parent : readFromSource) {
                     List<Location> children = readFromSource.getChildren(parent);
                     Map<Name, Property> properties = readFromSource.getPropertiesFor(parent);
                     projectToFederated(actualLocation, projection, request, parent, children, properties);
                 }
+                Location locationOfProxy = readFromSource.getActualLocationOfNode();
+                actualLocationsOfProxyNodes.put(locationOfProxy.getPath(), locationOfProxy);
             }
             setCacheableInfo(request, fromSource.getCachePolicy());
             projectedRequest = projectedRequest.next();
             ++numMerged;
         }
+        // Go through the requests and process the ReadNodeRequests (which were reading children of placeholders)...
+        projectedRequest = federatedRequest.getFirstProjectedRequest();
+        while (projectedRequest != null) {
+            CacheableRequest fromSource = (CacheableRequest)projectedRequest.getRequest();
+            Projection projection = projectedRequest.getProjection();
+            if (fromSource instanceof ReadNodeRequest) {
+                ReadNodeRequest readFromSource = (ReadNodeRequest)fromSource;
+                Location parent = readFromSource.getActualLocationOfNode();
+                List<Location> children = readFromSource.getChildren();
+                for (int i = 0; i != children.size(); ++i) {
+                    Location child = children.get(i);
+                    if (!child.hasIdProperties()) {
+                        // The the child must have been a proxy node ...
+                        Location actual = actualLocationsOfProxyNodes.get(child.getPath());
+                        assert actual != null;
+                        children.set(i, actual);
+                    }
+                }
+                Map<Name, Property> properties = readFromSource.getPropertiesByName();
+                projectToFederated(actualLocation, projection, request, parent, children, properties);
+            }
+            setCacheableInfo(request, fromSource.getCachePolicy());
+            projectedRequest = projectedRequest.next();
+        }
+
         if (numMerged == 0) {
             // No source requests had results ...
             setPathNotFound(request, request.at(), federatedRequest.getFirstProjectedRequest());

Modified: trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/federation/ProjectedNode.java
===================================================================
--- trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/federation/ProjectedNode.java	2009-06-11 09:20:03 UTC (rev 1037)
+++ trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/federation/ProjectedNode.java	2009-06-11 09:21:06 UTC (rev 1038)
@@ -25,7 +25,6 @@
 
 import java.util.List;
 import java.util.Map;
-import net.jcip.annotations.Immutable;
 import net.jcip.annotations.NotThreadSafe;
 import org.jboss.dna.graph.Location;
 import org.jboss.dna.graph.property.Name;
@@ -35,7 +34,7 @@
  * Information about a node that has been projected into the repository from a source. Each projected node may be followed by a
  * {@link #next() next} projected node.
  */
- at Immutable
+ at NotThreadSafe
 abstract class ProjectedNode {
     private final Location location;
     private ProjectedNode next;
@@ -82,20 +81,20 @@
     public abstract ProxyNode asProxy();
 }
 
- at Immutable
+ at NotThreadSafe
 class PlaceholderNode extends ProjectedNode {
     private final Map<Name, Property> properties;
-    private final List<Location> children;
+    private final List<ProjectedNode> children;
 
     protected PlaceholderNode( Location location,
                                Map<Name, Property> properties,
-                               List<Location> children ) {
+                               List<ProjectedNode> children ) {
         super(location);
         this.properties = properties;
         this.children = children;
     }
 
-    public List<Location> children() {
+    public List<ProjectedNode> children() {
         return children;
     }
 

Modified: trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/federation/ProjectorWithPlaceholders.java
===================================================================
--- trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/federation/ProjectorWithPlaceholders.java	2009-06-11 09:20:03 UTC (rev 1037)
+++ trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/federation/ProjectorWithPlaceholders.java	2009-06-11 09:21:06 UTC (rev 1038)
@@ -37,8 +37,6 @@
 import org.jboss.dna.graph.property.Path;
 import org.jboss.dna.graph.property.PathFactory;
 import org.jboss.dna.graph.property.Property;
-import com.google.common.collect.Multimaps;
-import com.google.common.collect.TreeMultimap;
 
 /**
  * A Projector for federated repository configurations that are an offset, direct one-for-one mirror against a single source
@@ -99,28 +97,44 @@
                                                 Iterable<Projection> projections,
                                                 Collection<PlaceholderNode> placeholderNodes ) {
         final PathFactory pathFactory = context.getValueFactories().getPathFactory();
-        TreeMultimap<Path, Location> childrenForParent = Multimaps.newTreeMultimap();
+        Map<Path, ProxyNode> proxyNodesByPath = new HashMap<Path, ProxyNode>();
+        Map<Path, PlaceholderNode> placeholdersByPath = new HashMap<Path, PlaceholderNode>();
         for (Projection projection : projections) {
-            // Collect the paths to all of the top-level nodes under each of their parents ...
+            // Create for all of the top-level nodes ...
             for (Path path : projection.getTopLevelPathsInRepository(pathFactory)) {
                 if (path.isRoot()) continue;
+                // Create ProxyNodes for each corresponding path-in-source ...
+                Location inRepository = Location.create(path);
+                ProxyNode previous = null;
+                for (Path pathInSource : projection.getPathsInSource(path, pathFactory)) {
+                    Location inSource = Location.create(pathInSource);
+                    ProxyNode proxy = new ProxyNode(projection, inSource, inRepository);
+                    if (previous == null) {
+                        previous = proxy;
+                        proxyNodesByPath.put(path, proxy);
+                    } else {
+                        previous.add(proxy);
+                    }
+                }
+                // Walk up the in-repository path to create the placeholder nodes ...
+                ProjectedNode child = previous;
                 while (!path.isRoot()) {
                     // Create a projected node for the parent of this path ...
                     Path parent = path.getParent();
-                    childrenForParent.put(parent, Location.create(path));
+                    PlaceholderNode parentPlaceholder = placeholdersByPath.get(parent);
+                    if (parentPlaceholder == null) {
+                        // Need to create the placeholder ...
+                        Map<Name, Property> properties = Collections.emptyMap();
+                        Location location = Location.create(parent, UUID.randomUUID());
+                        parentPlaceholder = new PlaceholderNode(location, properties, new ArrayList<ProjectedNode>());
+                        placeholdersByPath.put(parent, parentPlaceholder);
+                        placeholderNodes.add(parentPlaceholder);
+                    }
+                    parentPlaceholder.children().add(child);
+                    child = parentPlaceholder;
                     path = parent;
                 }
             }
         }
-        // Now, we want to create a placeholder for each parent, with the list of all children ...
-        for (Path parentPath : childrenForParent.keySet()) {
-            // Get the children for this parent ...
-            List<Location> children = new ArrayList<Location>(childrenForParent.get(parentPath));
-            Map<Name, Property> properties = Collections.emptyMap();
-            Location location = Location.create(parentPath, UUID.randomUUID());
-            PlaceholderNode placeholder = new PlaceholderNode(location, properties, children);
-            placeholderNodes.add(placeholder);
-        }
     }
-
 }

Modified: trunk/dna-graph/src/test/java/org/jboss/dna/graph/connector/federation/AbstractProjectorTest.java
===================================================================
--- trunk/dna-graph/src/test/java/org/jboss/dna/graph/connector/federation/AbstractProjectorTest.java	2009-06-11 09:20:03 UTC (rev 1037)
+++ trunk/dna-graph/src/test/java/org/jboss/dna/graph/connector/federation/AbstractProjectorTest.java	2009-06-11 09:21:06 UTC (rev 1038)
@@ -106,11 +106,19 @@
         assertThat(node, is(notNullValue()));
         assertThat(node.isPlaceholder(), is(true));
         PlaceholderNode placeholder = node.asPlaceholder();
-        List<Location> locations = new ArrayList<Location>();
+        List<Path> locations = new ArrayList<Path>();
         for (String childSegment : childSegments) {
             Path childPath = path(parentPath, childSegment);
-            locations.add(Location.create(childPath));
+            locations.add(childPath);
         }
-        assertThat(placeholder.children(), is(locations));
+        List<Path> actual = new ArrayList<Path>();
+        for (ProjectedNode child : placeholder.children()) {
+            if (child.isPlaceholder()) {
+                actual.add(child.location().getPath());
+            } else {
+                actual.add(child.asProxy().federatedLocation().getPath());
+            }
+        }
+        assertThat(actual, is(locations));
     }
 }

Modified: trunk/dna-graph/src/test/java/org/jboss/dna/graph/connector/federation/BranchedMirrorProjectorTest.java
===================================================================
--- trunk/dna-graph/src/test/java/org/jboss/dna/graph/connector/federation/BranchedMirrorProjectorTest.java	2009-06-11 09:20:03 UTC (rev 1037)
+++ trunk/dna-graph/src/test/java/org/jboss/dna/graph/connector/federation/BranchedMirrorProjectorTest.java	2009-06-11 09:21:06 UTC (rev 1038)
@@ -111,7 +111,7 @@
         assertThat(placeholder.isPlaceholder(), is(true));
         assertThat(placeholder.location().getPath(), is(path("/")));
         assertThat(placeholder.children().size(), is(1));
-        assertThat(placeholder.children().get(0).getPath(), is(path("/system")));
+        assertThat(placeholder.children().get(0).location().getPath(), is(path("/system")));
         assertThat(placeholder.hasNext(), is(false));
     }
 

Modified: trunk/dna-graph/src/test/java/org/jboss/dna/graph/connector/federation/ForkRequestProcessorTest.java
===================================================================
--- trunk/dna-graph/src/test/java/org/jboss/dna/graph/connector/federation/ForkRequestProcessorTest.java	2009-06-11 09:20:03 UTC (rev 1037)
+++ trunk/dna-graph/src/test/java/org/jboss/dna/graph/connector/federation/ForkRequestProcessorTest.java	2009-06-11 09:21:06 UTC (rev 1038)
@@ -31,6 +31,7 @@
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.stub;
 import java.util.ArrayList;
+import java.util.Collections;
 import java.util.HashMap;
 import java.util.LinkedList;
 import java.util.List;
@@ -87,7 +88,7 @@
     private MockRepositoryConnection connectionForSourceB;
     private MockRepositoryConnection connectionForSourceC;
     private Map<Name, Property> properties;
-    private List<Location> children;
+    private List<ProjectedNode> children;
 
     @Before
     public void beforeEach() {
@@ -105,7 +106,7 @@
         context = new ExecutionContext();
         now = context.getValueFactories().getDateFactory().create();
         federatedRequests = new LinkedList<FederatedRequest>();
-        children = new ArrayList<Location>();
+        children = new ArrayList<ProjectedNode>();
         properties = new HashMap<Name, Property>();
 
         // Set up the connection factory and connection ...
@@ -169,7 +170,10 @@
     public void addChild( Location parent,
                           String childName ) {
         Path path = context.getValueFactories().getPathFactory().create(parent.getPath(), segment(childName));
-        children.add(Location.create(path));
+        Map<Name, Property> properties = Collections.emptyMap();
+        List<ProjectedNode> grandChildren = Collections.emptyList();
+        PlaceholderNode child = new PlaceholderNode(Location.create(path), properties, grandChildren);
+        this.children.add(child);
     }
 
     @Test
@@ -349,7 +353,11 @@
         FederatedRequest fedRequest = federatedRequests.poll();
         ReadNodeRequest projectedRequest = (ReadNodeRequest)fedRequest.getFirstProjectedRequest().getRequest();
         assertThat(projectedRequest.at(), is(locationInFed));
-        assertThat(projectedRequest.getChildren(), is(children));
+        List<Location> expectedChildren = new ArrayList<Location>();
+        for (ProjectedNode child : children) {
+            expectedChildren.add(child.location());
+        }
+        assertThat(projectedRequest.getChildren(), is(expectedChildren));
         assertThat(projectedRequest.getPropertiesByName(), is(properties));
         assertThat(fedRequest.getFirstProjectedRequest().hasNext(), is(false));
 

Modified: trunk/dna-graph/src/test/java/org/jboss/dna/graph/connector/federation/ProjectorWithPlaceholdersTest.java
===================================================================
--- trunk/dna-graph/src/test/java/org/jboss/dna/graph/connector/federation/ProjectorWithPlaceholdersTest.java	2009-06-11 09:20:03 UTC (rev 1037)
+++ trunk/dna-graph/src/test/java/org/jboss/dna/graph/connector/federation/ProjectorWithPlaceholdersTest.java	2009-06-11 09:21:06 UTC (rev 1038)
@@ -31,7 +31,6 @@
 import java.util.Collection;
 import java.util.List;
 import org.jboss.dna.graph.ExecutionContext;
-import org.jboss.dna.graph.Location;
 import org.jboss.dna.graph.connector.federation.Projection.Rule;
 import org.jboss.dna.graph.property.Path;
 import org.junit.Before;
@@ -90,12 +89,20 @@
         assertThat(node, is(notNullValue()));
         assertThat(node.isPlaceholder(), is(true));
         PlaceholderNode placeholder = node.asPlaceholder();
-        List<Location> locations = new ArrayList<Location>();
+        List<Path> locations = new ArrayList<Path>();
         for (String childSegment : childSegments) {
             Path childPath = path(parentPath, childSegment);
-            locations.add(Location.create(childPath));
+            locations.add(childPath);
         }
-        assertThat(placeholder.children(), is(locations));
+        List<Path> actual = new ArrayList<Path>();
+        for (ProjectedNode child : placeholder.children()) {
+            if (child.isPlaceholder()) {
+                actual.add(child.location().getPath());
+            } else {
+                actual.add(child.asProxy().federatedLocation().getPath());
+            }
+        }
+        assertThat(actual, is(locations));
     }
 
     protected void assertNoPlacholder( String parent ) {

Modified: trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/JcrConfiguration.java
===================================================================
--- trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/JcrConfiguration.java	2009-06-11 09:20:03 UTC (rev 1037)
+++ trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/JcrConfiguration.java	2009-06-11 09:21:06 UTC (rev 1038)
@@ -118,14 +118,14 @@
         String getOption( JcrRepository.Option option );
 
         /**
-         * Specify that the CND in the supplied string should be loaded into the repository.
+         * Specify that the CND file located at the supplied path should be loaded into the repository.
          * 
-         * @param cndContents the string containing the compact node definitions
+         * @param pathToCndFile the path to the CND file
          * @return this object for chained method invocation
          * @throws IllegalArgumentException if the string is null or empty
-         * @throws DnaConfigurationException if there is an error reading the CND contents
+         * @throws DnaConfigurationException if there is an error reading the CND file
          */
-        RepositoryDefinition<ReturnType> addNodeTypes( String cndContents );
+        RepositoryDefinition<ReturnType> addNodeTypes( String pathToCndFile );
 
         /**
          * Specify that the CND file is to be loaded into the repository.
@@ -513,19 +513,9 @@
             return this;
         }
 
-        public RepositoryDefinition<ReturnType> addNodeTypes( String cndContents ) {
-            CheckArg.isNotEmpty(cndContents, "cndContents");
-            CndImporter importer = createCndImporter();
-            try {
-                Set<Namespace> namespacesBefore = batch.getGraph().getContext().getNamespaceRegistry().getNamespaces();
-                importer.importFrom(cndContents, getProblems(), "stream");
-
-                // Record any new namespaces added by this import ...
-                registerNewNamespaces(namespacesBefore);
-            } catch (IOException e) {
-                throw new DnaConfigurationException(e);
-            }
-            return this;
+        public RepositoryDefinition<ReturnType> addNodeTypes( String pathToCndFile ) {
+            CheckArg.isNotEmpty(pathToCndFile, "pathToCndFile");
+            return addNodeTypes(new File(pathToCndFile));
         }
 
         public RepositoryDefinition<ReturnType> addNodeTypes( File file ) {

Modified: trunk/dna-repository/src/main/java/org/jboss/dna/repository/DnaConfiguration.java
===================================================================
--- trunk/dna-repository/src/main/java/org/jboss/dna/repository/DnaConfiguration.java	2009-06-11 09:20:03 UTC (rev 1037)
+++ trunk/dna-repository/src/main/java/org/jboss/dna/repository/DnaConfiguration.java	2009-06-11 09:21:06 UTC (rev 1038)
@@ -403,8 +403,11 @@
     public DnaConfiguration save() {
         Graph.Batch changes = this.changes;
         if (changes != null && changes.isExecuteRequired()) {
+            System.out.println("Execution: ");
+            System.out.println(changes);
             changes.execute();
         }
+        this.changes = null;
         sequencerDefinitions.clear();
         mimeTypeDetectorDefinitions.clear();
         repositorySourceDefinitions.clear();

Modified: trunk/docs/examples/gettingstarted/repositories/src/main/java/org/jboss/example/dna/repository/RepositoryClient.java
===================================================================
--- trunk/docs/examples/gettingstarted/repositories/src/main/java/org/jboss/example/dna/repository/RepositoryClient.java	2009-06-11 09:20:03 UTC (rev 1037)
+++ trunk/docs/examples/gettingstarted/repositories/src/main/java/org/jboss/example/dna/repository/RepositoryClient.java	2009-06-11 09:21:06 UTC (rev 1038)
@@ -144,8 +144,11 @@
         // using the CND format in one or multiple files.
         String locationOfCndFiles = userInterface.getLocationOfCndFiles();
         configuration.repository("Aircraft").addNodeTypes(locationOfCndFiles + "/aircraft.cnd");
-        configuration.repository("Car").addNodeTypes(locationOfCndFiles + "/cars.cnd");
+        configuration.save();
+        configuration.repository("Cars").addNodeTypes(locationOfCndFiles + "/cars.cnd");
+        configuration.save();
         configuration.repository("Vehicles").addNodeTypes(locationOfCndFiles + "/vehicles.cnd");
+        configuration.save();
 
         // Now create the JCR engine ...
         engine = configuration.build();

Modified: trunk/docs/examples/gettingstarted/repositories/src/test/java/org/jboss/example/dna/repository/RepositoryClientTest.java
===================================================================
--- trunk/docs/examples/gettingstarted/repositories/src/test/java/org/jboss/example/dna/repository/RepositoryClientTest.java	2009-06-11 09:20:03 UTC (rev 1037)
+++ trunk/docs/examples/gettingstarted/repositories/src/test/java/org/jboss/example/dna/repository/RepositoryClientTest.java	2009-06-11 09:21:06 UTC (rev 1038)
@@ -113,13 +113,13 @@
     @Test
     public void shouldStartupWithoutError() throws Exception {
         client.startRepositories();
-        assertThat(client.getNamesOfRepositories(), hasItems("Aircraft", "Car", "Vehicles"));
+        assertThat(client.getNamesOfRepositories(), hasItems("Aircraft", "Cars", "Vehicles"));
     }
 
     @Test
     public void shouldStartupWithoutErrorMoreThanOnce() throws Exception {
         client.startRepositories();
-        assertThat(client.getNamesOfRepositories(), hasItems("Aircraft", "Car", "Vehicles"));
+        assertThat(client.getNamesOfRepositories(), hasItems("Aircraft", "Cars", "Vehicles"));
     }
 
     @Ignore

Modified: trunk/docs/examples/gettingstarted/repositories/src/test/java/org/jboss/example/dna/repository/RepositoryClientUsingJcrTest.java
===================================================================
--- trunk/docs/examples/gettingstarted/repositories/src/test/java/org/jboss/example/dna/repository/RepositoryClientUsingJcrTest.java	2009-06-11 09:20:03 UTC (rev 1037)
+++ trunk/docs/examples/gettingstarted/repositories/src/test/java/org/jboss/example/dna/repository/RepositoryClientUsingJcrTest.java	2009-06-11 09:21:06 UTC (rev 1038)
@@ -25,6 +25,7 @@
 
 import org.jboss.example.dna.repository.RepositoryClient.Api;
 import org.junit.Before;
+import org.junit.Ignore;
 
 /**
  * @author Randall Hauch
@@ -52,8 +53,72 @@
      * 
      * @see org.jboss.example.dna.repository.RepositoryClientTest#shouldHaveContentFromVehiclesRepository()
      */
+    @Ignore
     @Override
     public void shouldHaveContentFromVehiclesRepository() throws Throwable {
-        super.shouldHaveContentFromVehiclesRepository();
+        // super.shouldHaveContentFromVehiclesRepository();
     }
+
+    /**
+     * {@inheritDoc}
+     * 
+     * @see org.jboss.example.dna.repository.RepositoryClientTest#shouldBeAbleToExecuteTestsRepeatedly()
+     */
+    @Ignore
+    @Override
+    public void shouldBeAbleToExecuteTestsRepeatedly() throws Throwable {
+        // super.shouldBeAbleToExecuteTestsRepeatedly();
+    }
+
+    /**
+     * {@inheritDoc}
+     * 
+     * @see org.jboss.example.dna.repository.RepositoryClientTest#shouldHaveContentFromAircraftRepository()
+     */
+    @Override
+    public void shouldHaveContentFromAircraftRepository() throws Throwable {
+        super.shouldHaveContentFromAircraftRepository();
+    }
+
+    /**
+     * {@inheritDoc}
+     * 
+     * @see org.jboss.example.dna.repository.RepositoryClientTest#shouldHaveContentFromCarsRepository()
+     */
+    @Override
+    public void shouldHaveContentFromCarsRepository() throws Throwable {
+        super.shouldHaveContentFromCarsRepository();
+    }
+
+    /**
+     * {@inheritDoc}
+     * 
+     * @see org.jboss.example.dna.repository.RepositoryClientTest#shouldReturnNullForNonExistantNode()
+     */
+    @Override
+    public void shouldReturnNullForNonExistantNode() throws Throwable {
+        super.shouldReturnNullForNonExistantNode();
+    }
+
+    /**
+     * {@inheritDoc}
+     * 
+     * @see org.jboss.example.dna.repository.RepositoryClientTest#shouldStartupWithoutError()
+     */
+    @Ignore
+    @Override
+    public void shouldStartupWithoutError() throws Exception {
+        super.shouldStartupWithoutError();
+    }
+
+    /**
+     * {@inheritDoc}
+     * 
+     * @see org.jboss.example.dna.repository.RepositoryClientTest#shouldStartupWithoutErrorMoreThanOnce()
+     */
+    @Ignore
+    @Override
+    public void shouldStartupWithoutErrorMoreThanOnce() throws Exception {
+        super.shouldStartupWithoutErrorMoreThanOnce();
+    }
 }



From dna-commits at lists.jboss.org  Thu Jun 11 05:21:34 2009
From: dna-commits at lists.jboss.org (dna-commits at lists.jboss.org)
Date: Thu, 11 Jun 2009 05:21:34 -0400
Subject: [dna-commits] DNA SVN: r1039 - in trunk:
	dna-graph/src/main/java/org/jboss/dna/graph and 5 other directories.
Message-ID: <E1MEgTW-0005kb-OO@committer01.frg.pub.inap.atl.jboss.com>

Author: rhauch
Date: 2009-06-11 05:21:34 -0400 (Thu, 11 Jun 2009)
New Revision: 1039

Modified:
   trunk/dna-graph/src/main/java/org/jboss/dna/graph/Location.java
   trunk/dna-graph/src/main/java/org/jboss/dna/graph/LocationWithPathAndProperties.java
   trunk/dna-graph/src/main/java/org/jboss/dna/graph/LocationWithProperties.java
   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/dna-graph/src/main/java/org/jboss/dna/graph/connector/federation/ProjectorWithPlaceholders.java
   trunk/dna-repository/src/main/java/org/jboss/dna/repository/DnaConfiguration.java
   trunk/docs/examples/gettingstarted/pom.xml
   trunk/docs/examples/gettingstarted/repositories/src/main/java/org/jboss/example/dna/repository/RepositoryClient.java
   trunk/docs/examples/gettingstarted/repositories/src/test/java/org/jboss/example/dna/repository/RepositoryClientUsingJcrTest.java
   trunk/pom.xml
Log:
DNA-449 Fixed all of the issues with the federated connector and use by our JCR implementation.  All code builds, and all tests pass.

Modified: trunk/dna-graph/src/main/java/org/jboss/dna/graph/Location.java
===================================================================
--- trunk/dna-graph/src/main/java/org/jboss/dna/graph/Location.java	2009-06-11 09:21:06 UTC (rev 1038)
+++ trunk/dna-graph/src/main/java/org/jboss/dna/graph/Location.java	2009-06-11 09:21:34 UTC (rev 1039)
@@ -208,7 +208,7 @@
         for (Property property : remainingIdProperties) {
             if (names.add(property.getName())) idProperties.add(property);
         }
-        return new LocationWithPathAndProperties(null, idProperties);
+        return new LocationWithProperties(idProperties);
     }
 
     /**

Modified: trunk/dna-graph/src/main/java/org/jboss/dna/graph/LocationWithPathAndProperties.java
===================================================================
--- trunk/dna-graph/src/main/java/org/jboss/dna/graph/LocationWithPathAndProperties.java	2009-06-11 09:21:06 UTC (rev 1038)
+++ trunk/dna-graph/src/main/java/org/jboss/dna/graph/LocationWithPathAndProperties.java	2009-06-11 09:21:34 UTC (rev 1039)
@@ -55,6 +55,7 @@
      */
     LocationWithPathAndProperties( Path path,
                                    List<Property> idProperties ) {
+        assert path != null;
         assert idProperties != null;
         assert !idProperties.isEmpty();
         this.path = path;

Modified: trunk/dna-graph/src/main/java/org/jboss/dna/graph/LocationWithProperties.java
===================================================================
--- trunk/dna-graph/src/main/java/org/jboss/dna/graph/LocationWithProperties.java	2009-06-11 09:21:06 UTC (rev 1038)
+++ trunk/dna-graph/src/main/java/org/jboss/dna/graph/LocationWithProperties.java	2009-06-11 09:21:34 UTC (rev 1039)
@@ -138,7 +138,7 @@
      */
     @Override
     public Location with( Path newPath ) {
-        if (newPath == null || this.getPath().equals(newPath)) return this;
+        if (newPath == null) return this;
         return new LocationWithPathAndProperties(newPath, idProperties);
     }
 

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	2009-06-11 09:21:06 UTC (rev 1038)
+++ trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/federation/FederatedRepositoryConnection.java	2009-06-11 09:21:34 UTC (rev 1039)
@@ -156,7 +156,7 @@
 
         // Figure out whether we should asynchronously do the forking ...
         boolean synchronousStep1 = shouldProcessSynchronously(request);
-        final boolean awaitAllSubtasks = true;
+        final boolean awaitAllSubtasks = false;
 
         // Prepare for trace-level logging ...
         if (stopwatch != null) stopwatch.start();
@@ -180,7 +180,7 @@
                 } finally {
                     fork.close();
                 }
-                requests.add(new NoMoreFederatedRequests());
+                if (!awaitAllSubtasks) requests.add(new NoMoreFederatedRequests());
                 // At this point, all submitted requests have been processed/forked, so we can continue with
                 // the join process, starting with the first submitted request. Note that the subtasks may
                 // still be executing, but as the join process operates on a forked request, it will wait
@@ -195,7 +195,7 @@
                         } finally {
                             fork.close();
                         }
-                        requests.add(new NoMoreFederatedRequests());
+                        if (!awaitAllSubtasks) requests.add(new NoMoreFederatedRequests());
                     }
                 });
 

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	2009-06-11 09:21:06 UTC (rev 1038)
+++ trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/federation/ForkRequestProcessor.java	2009-06-11 09:21:34 UTC (rev 1039)
@@ -738,16 +738,19 @@
                         continue;
                     }
                     while (child != null && child.isProxy()) {
-                        // Take any children so far and simply record a ReadNodeRequest with results ...
-                        ReadNodeRequest placeholderRequest = new ReadNodeRequest(placeholder.location(), request.inWorkspace());
-                        placeholderRequest.addChildren(children);
-                        if (firstRequest) {
-                            firstRequest = false;
-                            placeholderRequest.addProperties(placeholder.properties().values());
+                        if (!children.isEmpty()) {
+                            // Take any children so far and simply record a ReadNodeRequest with results ...
+                            ReadNodeRequest placeholderRequest = new ReadNodeRequest(placeholder.location(),
+                                                                                     request.inWorkspace());
+                            placeholderRequest.addChildren(children);
+                            if (firstRequest) {
+                                firstRequest = false;
+                                placeholderRequest.addProperties(placeholder.properties().values());
+                            }
+                            placeholderRequest.setActualLocationOfNode(placeholder.location());
+                            federatedRequest.add(placeholderRequest, true, true, null);
+                            children = new LinkedList<Location>();
                         }
-                        placeholderRequest.setActualLocationOfNode(placeholder.location());
-                        federatedRequest.add(placeholderRequest, true, true, null);
-                        children = new LinkedList<Location>();
                         // Now issue a VerifyNodeExistsRequest for the child.
                         // We'll mix these into the federated request along with the ReadNodeRequests ...
                         ProxyNode proxy = child.asProxy();
@@ -757,7 +760,7 @@
                         child = child.next();
                     }
                 }
-                if (!children.isEmpty()) {
+                if (!children.isEmpty() || firstRequest) {
                     // Submit the children so far ...
                     ReadNodeRequest placeholderRequest = new ReadNodeRequest(placeholder.location(), request.inWorkspace());
                     placeholderRequest.addChildren(children);
@@ -799,19 +802,25 @@
                 // This placeholder may have proxy nodes as children, in which case we need to verify
                 // their existance to get their actual locations.
                 List<Location> children = new LinkedList<Location>();
+                boolean firstRequest = true;
                 for (ProjectedNode child : placeholder.children()) {
                     if (child.isPlaceholder()) {
                         children.add(child.location());
                         continue;
                     }
                     while (child != null && child.isProxy()) {
-                        // Take any children so far and simply record a ReadNodeRequest with results ...
-                        ReadAllChildrenRequest placeholderRequest = new ReadAllChildrenRequest(placeholder.location(),
-                                                                                               request.inWorkspace());
-                        placeholderRequest.addChildren(children);
-                        placeholderRequest.setActualLocationOfNode(placeholder.location());
-                        federatedRequest.add(placeholderRequest, true, true, null);
-                        children = new LinkedList<Location>();
+                        if (!children.isEmpty()) {
+                            // Take any children so far and simply record a ReadNodeRequest with results ...
+                            ReadAllChildrenRequest placeholderRequest = new ReadAllChildrenRequest(placeholder.location(),
+                                                                                                   request.inWorkspace());
+                            placeholderRequest.addChildren(children);
+                            if (firstRequest) {
+                                firstRequest = false;
+                            }
+                            placeholderRequest.setActualLocationOfNode(placeholder.location());
+                            federatedRequest.add(placeholderRequest, true, true, null);
+                            children = new LinkedList<Location>();
+                        }
                         // Now issue a VerifyNodeExistsRequest for the child.
                         // We'll mix these into the federated request along with the ReadNodeRequests ...
                         ProxyNode proxy = child.asProxy();
@@ -821,11 +830,14 @@
                         child = child.next();
                     }
                 }
-                if (!children.isEmpty()) {
+                if (!children.isEmpty() || firstRequest) {
                     // Submit the children so far ...
                     ReadAllChildrenRequest placeholderRequest = new ReadAllChildrenRequest(placeholder.location(),
                                                                                            request.inWorkspace());
                     placeholderRequest.addChildren(children);
+                    if (firstRequest) {
+                        firstRequest = false;
+                    }
                     placeholderRequest.setActualLocationOfNode(placeholder.location());
                     federatedRequest.add(placeholderRequest, true, true, null);
                 }

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	2009-06-11 09:21:06 UTC (rev 1038)
+++ trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/federation/JoinRequestProcessor.java	2009-06-11 09:21:34 UTC (rev 1039)
@@ -314,6 +314,7 @@
                 assert federatedPath != null;
                 actualLocation = actualLocation.with(federatedPath);
             }
+            assert actualLocation.getPath() != null;
             request.setActualLocationOfNode(actualLocation);
         }
     }
@@ -328,7 +329,7 @@
             // We've lost the name of the child, so we need to recompute the path ...
             for (Path path : projection.getPathsInRepository(childInSource.getPath(), pathFactory)) {
                 childPath = path;
-                if (federatedPath == null) federatedPath = path;
+                if (federatedPath == null) federatedPath = path.getParent();
                 break;
             }
         }
@@ -458,7 +459,7 @@
     protected Location determineActualLocation( Location actual,
                                                 Location inSource,
                                                 Projection projection ) {
-        if (!actual.hasPath()) {
+        if (actual.getPath() == null) {
             if (projection == null) {
                 // It must be a placeholder node ...
                 return inSource;

Modified: trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/federation/ProjectorWithPlaceholders.java
===================================================================
--- trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/federation/ProjectorWithPlaceholders.java	2009-06-11 09:21:06 UTC (rev 1038)
+++ trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/federation/ProjectorWithPlaceholders.java	2009-06-11 09:21:34 UTC (rev 1039)
@@ -129,8 +129,12 @@
                         parentPlaceholder = new PlaceholderNode(location, properties, new ArrayList<ProjectedNode>());
                         placeholdersByPath.put(parent, parentPlaceholder);
                         placeholderNodes.add(parentPlaceholder);
+                        parentPlaceholder.children().add(child);
+                    } else {
+                        // The placeholder already exists, so make sure we're not adding it to this parent twice ...
+                        List<ProjectedNode> children = parentPlaceholder.children();
+                        if (!children.contains(child)) children.add(child);
                     }
-                    parentPlaceholder.children().add(child);
                     child = parentPlaceholder;
                     path = parent;
                 }

Modified: trunk/dna-repository/src/main/java/org/jboss/dna/repository/DnaConfiguration.java
===================================================================
--- trunk/dna-repository/src/main/java/org/jboss/dna/repository/DnaConfiguration.java	2009-06-11 09:21:06 UTC (rev 1038)
+++ trunk/dna-repository/src/main/java/org/jboss/dna/repository/DnaConfiguration.java	2009-06-11 09:21:34 UTC (rev 1039)
@@ -403,8 +403,6 @@
     public DnaConfiguration save() {
         Graph.Batch changes = this.changes;
         if (changes != null && changes.isExecuteRequired()) {
-            System.out.println("Execution: ");
-            System.out.println(changes);
             changes.execute();
         }
         this.changes = null;

Modified: trunk/docs/examples/gettingstarted/pom.xml
===================================================================
--- trunk/docs/examples/gettingstarted/pom.xml	2009-06-11 09:21:06 UTC (rev 1038)
+++ trunk/docs/examples/gettingstarted/pom.xml	2009-06-11 09:21:34 UTC (rev 1039)
@@ -10,7 +10,7 @@
 
   <modules>
     <module>sequencers</module>
-    <!--module>repositories</module-->
+    <module>repositories</module>
   </modules>
 
   <dependencyManagement>

Modified: trunk/docs/examples/gettingstarted/repositories/src/main/java/org/jboss/example/dna/repository/RepositoryClient.java
===================================================================
--- trunk/docs/examples/gettingstarted/repositories/src/main/java/org/jboss/example/dna/repository/RepositoryClient.java	2009-06-11 09:21:06 UTC (rev 1038)
+++ trunk/docs/examples/gettingstarted/repositories/src/main/java/org/jboss/example/dna/repository/RepositoryClient.java	2009-06-11 09:21:34 UTC (rev 1039)
@@ -144,11 +144,8 @@
         // using the CND format in one or multiple files.
         String locationOfCndFiles = userInterface.getLocationOfCndFiles();
         configuration.repository("Aircraft").addNodeTypes(locationOfCndFiles + "/aircraft.cnd");
-        configuration.save();
         configuration.repository("Cars").addNodeTypes(locationOfCndFiles + "/cars.cnd");
-        configuration.save();
         configuration.repository("Vehicles").addNodeTypes(locationOfCndFiles + "/vehicles.cnd");
-        configuration.save();
 
         // Now create the JCR engine ...
         engine = configuration.build();

Modified: trunk/docs/examples/gettingstarted/repositories/src/test/java/org/jboss/example/dna/repository/RepositoryClientUsingJcrTest.java
===================================================================
--- trunk/docs/examples/gettingstarted/repositories/src/test/java/org/jboss/example/dna/repository/RepositoryClientUsingJcrTest.java	2009-06-11 09:21:06 UTC (rev 1038)
+++ trunk/docs/examples/gettingstarted/repositories/src/test/java/org/jboss/example/dna/repository/RepositoryClientUsingJcrTest.java	2009-06-11 09:21:34 UTC (rev 1039)
@@ -56,7 +56,7 @@
     @Ignore
     @Override
     public void shouldHaveContentFromVehiclesRepository() throws Throwable {
-        // super.shouldHaveContentFromVehiclesRepository();
+        super.shouldHaveContentFromVehiclesRepository();
     }
 
     /**
@@ -69,56 +69,4 @@
     public void shouldBeAbleToExecuteTestsRepeatedly() throws Throwable {
         // super.shouldBeAbleToExecuteTestsRepeatedly();
     }
-
-    /**
-     * {@inheritDoc}
-     * 
-     * @see org.jboss.example.dna.repository.RepositoryClientTest#shouldHaveContentFromAircraftRepository()
-     */
-    @Override
-    public void shouldHaveContentFromAircraftRepository() throws Throwable {
-        super.shouldHaveContentFromAircraftRepository();
-    }
-
-    /**
-     * {@inheritDoc}
-     * 
-     * @see org.jboss.example.dna.repository.RepositoryClientTest#shouldHaveContentFromCarsRepository()
-     */
-    @Override
-    public void shouldHaveContentFromCarsRepository() throws Throwable {
-        super.shouldHaveContentFromCarsRepository();
-    }
-
-    /**
-     * {@inheritDoc}
-     * 
-     * @see org.jboss.example.dna.repository.RepositoryClientTest#shouldReturnNullForNonExistantNode()
-     */
-    @Override
-    public void shouldReturnNullForNonExistantNode() throws Throwable {
-        super.shouldReturnNullForNonExistantNode();
-    }
-
-    /**
-     * {@inheritDoc}
-     * 
-     * @see org.jboss.example.dna.repository.RepositoryClientTest#shouldStartupWithoutError()
-     */
-    @Ignore
-    @Override
-    public void shouldStartupWithoutError() throws Exception {
-        super.shouldStartupWithoutError();
-    }
-
-    /**
-     * {@inheritDoc}
-     * 
-     * @see org.jboss.example.dna.repository.RepositoryClientTest#shouldStartupWithoutErrorMoreThanOnce()
-     */
-    @Ignore
-    @Override
-    public void shouldStartupWithoutErrorMoreThanOnce() throws Exception {
-        super.shouldStartupWithoutErrorMoreThanOnce();
-    }
 }

Modified: trunk/pom.xml
===================================================================
--- trunk/pom.xml	2009-06-11 09:21:06 UTC (rev 1038)
+++ trunk/pom.xml	2009-06-11 09:21:34 UTC (rev 1039)
@@ -146,7 +146,7 @@
 		<module>extensions/dna-web-jcr-rest</module> 
 		<module>extensions/dna-web-jcr-rest-war</module> 
 		<module>dna-integration-tests</module>
-		<!--module>docs/examples/gettingstarted</module-->
+		<module>docs/examples/gettingstarted</module>
 	</modules>
 
 	<profiles>



From dna-commits at lists.jboss.org  Thu Jun 11 10:28:27 2009
From: dna-commits at lists.jboss.org (dna-commits at lists.jboss.org)
Date: Thu, 11 Jun 2009 10:28:27 -0400
Subject: [dna-commits] DNA SVN: r1040 - in trunk/docs:
	reference/src/main/docbook/en-US/content/connectors and 1
	other directories.
Message-ID: <E1MElGV-0002DC-HQ@committer01.frg.pub.inap.atl.jboss.com>

Author: rhauch
Date: 2009-06-11 10:28:27 -0400 (Thu, 11 Jun 2009)
New Revision: 1040

Modified:
   trunk/docs/gettingstarted/src/main/docbook/en-US/content/using_dna.xml
   trunk/docs/reference/src/main/docbook/en-US/content/connectors/federation.xml
   trunk/docs/reference/src/main/docbook/en-US/content/jcr/configuration.xml
Log:
Minor corrections to the portions of the configuration files and source code to reflect recent changes.

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	2009-06-11 09:21:34 UTC (rev 1039)
+++ trunk/docs/gettingstarted/src/main/docbook/en-US/content/using_dna.xml	2009-06-11 14:28:27 UTC (rev 1040)
@@ -179,9 +179,9 @@
 	      This of course is optional, since we could access the same content through 'vehicles'.
 	      -->
 	      <dna:repository jcr:name="car repository" dna:source="Cars">
-	          <options jcr:primaryType="dna:options">
+	          <dna:options jcr:primaryType="dna:options">
 	              <jaasLoginConfigName jcr:primaryType="dna:option" dna:value="dna-jcr"/>
-	          </options>
+	          </dna:options>
 	      </dna:repository>
 	  </dna:repositories>
     <!-- 

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	2009-06-11 09:21:34 UTC (rev 1039)
+++ trunk/docs/reference/src/main/docbook/en-US/content/connectors/federation.xml	2009-06-11 14:28:27 UTC (rev 1040)
@@ -411,8 +411,18 @@
          This example puts the 'Cars' and 'Aircraft' content underneath '/vehicles', but the
          'Configuration' content (which is defined by this file) will appear under '/'. -->
     <dna:projections>
-      <dna:projection jcr:name="Cars" dna:projectionRules="/Vehicles => /" />
-      <dna:projection jcr:name="Aircraft" dna:projectionRules="/Vehicles => /" />
+      <!-- Project the 'Cars' content, starting with the '/Cars' node. -->
+      <dna:projection jcr:name="Cars projection" dna:source="Cars" dna:workspaceName="workspace1">
+          <dna:projectionRules>/Vehicles/Cars => /Cars</dna:projectionRules>
+      </dna:projection>
+      <!-- Project the 'Aicraft' content, starting with the '/Aircraft' node. -->
+      <dna:projection jcr:name="Aircarft projection" dna:source="Aircraft" dna:workspaceName="workspace2">
+          <dna:projectionRules>/Vehicles/Aircraft => /Aircraft</dna:projectionRules>
+      </dna:projection>
+      <!-- Project the 'System' content. Only needed when this source is accessed through JCR. -->
+      <dna:projection jcr:name="System projection" dna:source="System" dna:workspaceName="default">
+          <dna:projectionRules>/jcr:system => /</dna:projectionRules>
+      </dna:projection>
     </dna:projections>
   </dna:workspace>
 </dna:workspaces>

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	2009-06-11 09:21:34 UTC (rev 1039)
+++ trunk/docs/reference/src/main/docbook/en-US/content/jcr/configuration.xml	2009-06-11 14:28:27 UTC (rev 1040)
@@ -179,9 +179,9 @@
 	      This of course is optional, since we could access the same content through 'vehicles'.
 	      -->
 	      <dna:repository jcr:name="car repository" dna:source="Cars">
-	          <options jcr:primaryType="dna:options">
+	          <dna:options jcr:primaryType="dna:options">
 	              <jaasLoginConfigName jcr:primaryType="dna:option" dna:value="dna-jcr"/>
-	          </options>
+	          </dna:options>
 	      </dna:repository>
 	  </dna:repositories>
     <!-- 



From dna-commits at lists.jboss.org  Thu Jun 11 11:01:24 2009
From: dna-commits at lists.jboss.org (dna-commits at lists.jboss.org)
Date: Thu, 11 Jun 2009 11:01:24 -0400
Subject: [dna-commits] DNA SVN: r1041 -
	trunk/docs/gettingstarted/src/main/docbook/en-US/content.
Message-ID: <E1MElmO-0003gJ-E5@committer01.frg.pub.inap.atl.jboss.com>

Author: rhauch
Date: 2009-06-11 11:01:24 -0400 (Thu, 11 Jun 2009)
New Revision: 1041

Modified:
   trunk/docs/gettingstarted/src/main/docbook/en-US/content/repository_example.xml
Log:
Added a note to the Getting Started guide about which username and password should be entered. This was previously not in the document, and would have required users to dive into the files to figure it out. This is a very minor change.

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	2009-06-11 14:28:27 UTC (rev 1040)
+++ trunk/docs/gettingstarted/src/main/docbook/en-US/content/repository_example.xml	2009-06-11 15:01:24 UTC (rev 1041)
@@ -85,6 +85,14 @@
 					</tbody>
 				</tgroup>
 			</table>
+			<note>
+				<para>
+					The first time you access any repository, you will be prompted to log in.  This is JAAS at work, and the example application
+					should prompt you for a username and password.  As configured in the "jaas.conf.xml" and "users.properties" files,
+					enter "jsmith" for the username and "secret" for the password.  And, yes, the password is shown in cleartext - this
+					is a simple example, after all!
+				</para>
+			</note>
 			<para>If you were to select the "Cars" repository and use some of the commands, you should see something similar to: 
 	      <figure id="example-repositories-navigating">
 					<title>Navigating the Cars repository</title>



From dna-commits at lists.jboss.org  Thu Jun 11 11:19:04 2009
From: dna-commits at lists.jboss.org (dna-commits at lists.jboss.org)
Date: Thu, 11 Jun 2009 11:19:04 -0400
Subject: [dna-commits] DNA SVN: r1042 - in trunk: dna-cnd and 30 other
	directories.
Message-ID: <E1MEm3U-0004e6-Ty@committer01.frg.pub.inap.atl.jboss.com>

Author: rhauch
Date: 2009-06-11 11:19:04 -0400 (Thu, 11 Jun 2009)
New Revision: 1042

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-common-jdbc/pom.xml
   trunk/extensions/dna-connector-federation/pom.xml
   trunk/extensions/dna-connector-filesystem/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-sequencer-cnd/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-xml/pom.xml
   trunk/extensions/dna-sequencer-zip/pom.xml
   trunk/extensions/dna-web-jcr-rest-war/pom.xml
   trunk/extensions/dna-web-jcr-rest/pom.xml
   trunk/pom.xml
Log:
[maven-release-plugin] prepare release dna-0.5

Modified: trunk/dna-cnd/pom.xml
===================================================================
--- trunk/dna-cnd/pom.xml	2009-06-11 15:01:24 UTC (rev 1041)
+++ trunk/dna-cnd/pom.xml	2009-06-11 15:19:04 UTC (rev 1042)
@@ -2,7 +2,7 @@
   <parent>
     <artifactId>dna</artifactId>
     <groupId>org.jboss.dna</groupId>
-    <version>0.5-SNAPSHOT</version>
+    <version>0.5</version>
   </parent>
   <modelVersion>4.0.0</modelVersion>
   <groupId>org.jboss.dna</groupId>

Modified: trunk/dna-common/pom.xml
===================================================================
--- trunk/dna-common/pom.xml	2009-06-11 15:01:24 UTC (rev 1041)
+++ trunk/dna-common/pom.xml	2009-06-11 15:19:04 UTC (rev 1042)
@@ -3,7 +3,7 @@
   <parent>
     <groupId>org.jboss.dna</groupId>
     <artifactId>dna</artifactId>
-    <version>0.5-SNAPSHOT</version>
+    <version>0.5</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	2009-06-11 15:01:24 UTC (rev 1041)
+++ trunk/dna-graph/pom.xml	2009-06-11 15:19:04 UTC (rev 1042)
@@ -3,7 +3,7 @@
   <parent>
     <groupId>org.jboss.dna</groupId>
     <artifactId>dna</artifactId>
-    <version>0.5-SNAPSHOT</version>
+    <version>0.5</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	2009-06-11 15:01:24 UTC (rev 1041)
+++ trunk/dna-integration-tests/pom.xml	2009-06-11 15:19:04 UTC (rev 1042)
@@ -3,12 +3,12 @@
   <parent>
     <groupId>org.jboss.dna</groupId>
     <artifactId>dna</artifactId>
-    <version>0.5-SNAPSHOT</version>
+    <version>0.5</version>
   </parent>
   <!-- The groupId and version values are inherited from parent -->
   <artifactId>dna-integration-tests</artifactId>
   <packaging>jar</packaging>
-  <version>0.5-SNAPSHOT</version>
+  <version>0.5</version>
   <name>JBoss DNA Integration Tests</name>
   <url>http://labs.jboss.org/dna</url>
   

Modified: trunk/dna-jcr/pom.xml
===================================================================
--- trunk/dna-jcr/pom.xml	2009-06-11 15:01:24 UTC (rev 1041)
+++ trunk/dna-jcr/pom.xml	2009-06-11 15:19:04 UTC (rev 1042)
@@ -4,7 +4,7 @@
   <parent>
     <groupId>org.jboss.dna</groupId>
     <artifactId>dna</artifactId>
-    <version>0.5-SNAPSHOT</version>
+    <version>0.5</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	2009-06-11 15:01:24 UTC (rev 1041)
+++ trunk/dna-repository/pom.xml	2009-06-11 15:19:04 UTC (rev 1042)
@@ -3,7 +3,7 @@
   <parent>
     <groupId>org.jboss.dna</groupId>
     <artifactId>dna</artifactId>
-    <version>0.5-SNAPSHOT</version>
+    <version>0.5</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	2009-06-11 15:01:24 UTC (rev 1041)
+++ trunk/docs/examples/gettingstarted/pom.xml	2009-06-11 15:19:04 UTC (rev 1042)
@@ -4,7 +4,7 @@
   <groupId>org.jboss.dna.examples</groupId>
   <artifactId>getting_started</artifactId>
   <packaging>pom</packaging>
-  <version>0.5-SNAPSHOT</version>
+  <version>0.5</version>
   <name>JBoss DNA Getting Started examples</name>
   <description />
 

Modified: trunk/docs/examples/gettingstarted/repositories/pom.xml
===================================================================
--- trunk/docs/examples/gettingstarted/repositories/pom.xml	2009-06-11 15:01:24 UTC (rev 1041)
+++ trunk/docs/examples/gettingstarted/repositories/pom.xml	2009-06-11 15:19:04 UTC (rev 1042)
@@ -3,14 +3,14 @@
   <parent>
     <groupId>org.jboss.dna.examples</groupId>
     <artifactId>getting_started</artifactId>
-    <version>0.5-SNAPSHOT</version>
+    <version>0.5</version>
     <relativePath>..</relativePath>
   </parent>
 
   <modelVersion>4.0.0</modelVersion>
   <groupId>org.jboss.dna.examples</groupId>
   <artifactId>dna-example-repositories</artifactId>
-  <version>0.5-SNAPSHOT</version>
+  <version>0.5</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	2009-06-11 15:01:24 UTC (rev 1041)
+++ trunk/docs/examples/gettingstarted/sequencers/pom.xml	2009-06-11 15:19:04 UTC (rev 1042)
@@ -3,14 +3,14 @@
   <parent>
     <groupId>org.jboss.dna.examples</groupId>
     <artifactId>getting_started</artifactId>
-    <version>0.5-SNAPSHOT</version>
+    <version>0.5</version>
     <relativePath>..</relativePath>
   </parent>
 
   <modelVersion>4.0.0</modelVersion>
   <groupId>org.jboss.dna.examples</groupId>
   <artifactId>dna-example-sequencers</artifactId>
-  <version>0.5-SNAPSHOT</version>
+  <version>0.5</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	2009-06-11 15:01:24 UTC (rev 1041)
+++ trunk/docs/gettingstarted/pom.xml	2009-06-11 15:19:04 UTC (rev 1042)
@@ -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.5-SNAPSHOT</version>
+  <version>0.5</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	2009-06-11 15:01:24 UTC (rev 1041)
+++ trunk/docs/pom.xml	2009-06-11 15:19:04 UTC (rev 1042)
@@ -2,7 +2,7 @@
   <parent>
     <groupId>org.jboss.dna</groupId>
     <artifactId>dna</artifactId>
-    <version>0.5-SNAPSHOT</version>
+    <version>0.5</version>
   </parent>
   <modelVersion>4.0.0</modelVersion>
   <groupId>org.jboss.dna.docs</groupId>

Modified: trunk/docs/reference/pom.xml
===================================================================
--- trunk/docs/reference/pom.xml	2009-06-11 15:01:24 UTC (rev 1041)
+++ trunk/docs/reference/pom.xml	2009-06-11 15:19:04 UTC (rev 1042)
@@ -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.5-SNAPSHOT</version>
+  <version>0.5</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	2009-06-11 15:01:24 UTC (rev 1041)
+++ trunk/extensions/dna-classloader-maven/pom.xml	2009-06-11 15:19:04 UTC (rev 1042)
@@ -3,7 +3,7 @@
   <parent>
     <groupId>org.jboss.dna</groupId>
     <artifactId>dna</artifactId>
-    <version>0.5-SNAPSHOT</version>
+    <version>0.5</version>
   </parent>
   <!-- The groupId and version values are inherited from parent -->
   <artifactId>dna-classloader-maven</artifactId>

Modified: trunk/extensions/dna-common-jdbc/pom.xml
===================================================================
--- trunk/extensions/dna-common-jdbc/pom.xml	2009-06-11 15:01:24 UTC (rev 1041)
+++ trunk/extensions/dna-common-jdbc/pom.xml	2009-06-11 15:19:04 UTC (rev 1042)
@@ -3,7 +3,7 @@
   <parent>
     <artifactId>dna</artifactId>
     <groupId>org.jboss.dna</groupId>
-    <version>0.5-SNAPSHOT</version>
+    <version>0.5</version>
     <relativePath>../..</relativePath>
   </parent>
   <!-- The groupId and version values are inherited from parent -->

Modified: trunk/extensions/dna-connector-federation/pom.xml
===================================================================
--- trunk/extensions/dna-connector-federation/pom.xml	2009-06-11 15:01:24 UTC (rev 1041)
+++ trunk/extensions/dna-connector-federation/pom.xml	2009-06-11 15:19:04 UTC (rev 1042)
@@ -4,7 +4,7 @@
   <parent>
     <groupId>org.jboss.dna</groupId>
     <artifactId>dna</artifactId>
-    <version>0.5-SNAPSHOT</version>
+    <version>0.5</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	2009-06-11 15:01:24 UTC (rev 1041)
+++ trunk/extensions/dna-connector-filesystem/pom.xml	2009-06-11 15:19:04 UTC (rev 1042)
@@ -4,7 +4,7 @@
   <parent>
     <groupId>org.jboss.dna</groupId>
     <artifactId>dna</artifactId>
-    <version>0.5-SNAPSHOT</version>
+    <version>0.5</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	2009-06-11 15:01:24 UTC (rev 1041)
+++ trunk/extensions/dna-connector-jbosscache/pom.xml	2009-06-11 15:19:04 UTC (rev 1042)
@@ -4,7 +4,7 @@
   <parent>
     <groupId>org.jboss.dna</groupId>
     <artifactId>dna</artifactId>
-    <version>0.5-SNAPSHOT</version>
+    <version>0.5</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	2009-06-11 15:01:24 UTC (rev 1041)
+++ trunk/extensions/dna-connector-jdbc-metadata/pom.xml	2009-06-11 15:19:04 UTC (rev 1042)
@@ -3,7 +3,7 @@
   <parent>
     <artifactId>dna</artifactId>
     <groupId>org.jboss.dna</groupId>
-    <version>0.5-SNAPSHOT</version>
+    <version>0.5</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	2009-06-11 15:01:24 UTC (rev 1041)
+++ trunk/extensions/dna-connector-store-jpa/pom.xml	2009-06-11 15:19:04 UTC (rev 1042)
@@ -4,7 +4,7 @@
   <parent>
     <groupId>org.jboss.dna</groupId>
     <artifactId>dna</artifactId>
-    <version>0.5-SNAPSHOT</version>
+    <version>0.5</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	2009-06-11 15:01:24 UTC (rev 1041)
+++ trunk/extensions/dna-connector-svn/pom.xml	2009-06-11 15:19:04 UTC (rev 1042)
@@ -3,7 +3,7 @@
 	<parent>
 		<groupId>org.jboss.dna</groupId>
 		<artifactId>dna</artifactId>
-		<version>0.5-SNAPSHOT</version>
+		<version>0.5</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	2009-06-11 15:01:24 UTC (rev 1041)
+++ trunk/extensions/dna-mimetype-detector-aperture/pom.xml	2009-06-11 15:19:04 UTC (rev 1042)
@@ -3,7 +3,7 @@
   <parent>
     <groupId>org.jboss.dna</groupId>
     <artifactId>dna</artifactId>
-    <version>0.5-SNAPSHOT</version>
+    <version>0.5</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	2009-06-11 15:01:24 UTC (rev 1041)
+++ trunk/extensions/dna-sequencer-cnd/pom.xml	2009-06-11 15:19:04 UTC (rev 1042)
@@ -2,7 +2,7 @@
   <parent>
     <artifactId>dna</artifactId>
     <groupId>org.jboss.dna</groupId>
-    <version>0.5-SNAPSHOT</version>
+    <version>0.5</version>
     <relativePath>../..</relativePath>
   </parent>
   <modelVersion>4.0.0</modelVersion>

Modified: trunk/extensions/dna-sequencer-images/pom.xml
===================================================================
--- trunk/extensions/dna-sequencer-images/pom.xml	2009-06-11 15:01:24 UTC (rev 1041)
+++ trunk/extensions/dna-sequencer-images/pom.xml	2009-06-11 15:19:04 UTC (rev 1042)
@@ -3,7 +3,7 @@
   <parent>
     <groupId>org.jboss.dna</groupId>
     <artifactId>dna</artifactId>
-    <version>0.5-SNAPSHOT</version>
+    <version>0.5</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	2009-06-11 15:01:24 UTC (rev 1041)
+++ trunk/extensions/dna-sequencer-java/pom.xml	2009-06-11 15:19:04 UTC (rev 1042)
@@ -3,7 +3,7 @@
 	<parent>
 		<groupId>org.jboss.dna</groupId>
 		<artifactId>dna</artifactId>
-		<version>0.5-SNAPSHOT</version>
+		<version>0.5</version>
 		<relativePath>../..</relativePath>
 	</parent>
 	<!-- The groupId and version values are inherited from parent -->
@@ -47,7 +47,7 @@
 		<dependency>
 			<groupId>org.jboss.dna</groupId>
 			<artifactId>dna-integration-tests</artifactId>
-			<version>0.5-SNAPSHOT</version>
+			<version>0.5</version>
 			<scope>test</scope>
 		</dependency>
 		<!-- 

Modified: trunk/extensions/dna-sequencer-jbpm-jpdl/pom.xml
===================================================================
--- trunk/extensions/dna-sequencer-jbpm-jpdl/pom.xml	2009-06-11 15:01:24 UTC (rev 1041)
+++ trunk/extensions/dna-sequencer-jbpm-jpdl/pom.xml	2009-06-11 15:19:04 UTC (rev 1042)
@@ -3,12 +3,12 @@
 	<parent>
 		<groupId>org.jboss.dna</groupId>
 		<artifactId>dna</artifactId>
-		<version>0.5-SNAPSHOT</version>
+		<version>0.5</version>
 		<relativePath>../..</relativePath>
 	</parent>
 	<artifactId>dna-sequencer-jbpm-jpdl</artifactId>
 	<packaging>jar</packaging>
-	<version>0.5-SNAPSHOT</version>
+	<version>0.5</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	2009-06-11 15:01:24 UTC (rev 1041)
+++ trunk/extensions/dna-sequencer-mp3/pom.xml	2009-06-11 15:19:04 UTC (rev 1042)
@@ -3,7 +3,7 @@
   <parent>
     <artifactId>dna</artifactId>
     <groupId>org.jboss.dna</groupId>
-    <version>0.5-SNAPSHOT</version>
+    <version>0.5</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	2009-06-11 15:01:24 UTC (rev 1041)
+++ trunk/extensions/dna-sequencer-msoffice/pom.xml	2009-06-11 15:19:04 UTC (rev 1042)
@@ -3,7 +3,7 @@
   <parent>
     <artifactId>dna</artifactId>
     <groupId>org.jboss.dna</groupId>
-    <version>0.5-SNAPSHOT</version>
+    <version>0.5</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	2009-06-11 15:01:24 UTC (rev 1041)
+++ trunk/extensions/dna-sequencer-xml/pom.xml	2009-06-11 15:19:04 UTC (rev 1042)
@@ -3,7 +3,7 @@
   <parent>
     <groupId>org.jboss.dna</groupId>
     <artifactId>dna</artifactId>
-    <version>0.5-SNAPSHOT</version>
+    <version>0.5</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	2009-06-11 15:01:24 UTC (rev 1041)
+++ trunk/extensions/dna-sequencer-zip/pom.xml	2009-06-11 15:19:04 UTC (rev 1042)
@@ -3,7 +3,7 @@
   <parent>
     <artifactId>dna</artifactId>
     <groupId>org.jboss.dna</groupId>
-    <version>0.5-SNAPSHOT</version>
+    <version>0.5</version>
     <relativePath>../..</relativePath>
   </parent>
   <!-- The groupId and version values are inherited from parent -->

Modified: trunk/extensions/dna-web-jcr-rest/pom.xml
===================================================================
--- trunk/extensions/dna-web-jcr-rest/pom.xml	2009-06-11 15:01:24 UTC (rev 1041)
+++ trunk/extensions/dna-web-jcr-rest/pom.xml	2009-06-11 15:19:04 UTC (rev 1042)
@@ -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.5-SNAPSHOT</version>
+		<version>0.5</version>
 		<relativePath>../..</relativePath>
 	</parent>
 	<artifactId>dna-web-jcr-rest</artifactId>

Modified: trunk/extensions/dna-web-jcr-rest-war/pom.xml
===================================================================
--- trunk/extensions/dna-web-jcr-rest-war/pom.xml	2009-06-11 15:01:24 UTC (rev 1041)
+++ trunk/extensions/dna-web-jcr-rest-war/pom.xml	2009-06-11 15:19:04 UTC (rev 1042)
@@ -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.5-SNAPSHOT</version>
+		<version>0.5</version>
 		<relativePath>../..</relativePath>
 	</parent>
 	<artifactId>dna-web-jcr-rest-war</artifactId>
@@ -46,7 +45,7 @@
 			<plugin>
 				<groupId>org.codehaus.cargo</groupId>
 				<artifactId>cargo-maven2-plugin</artifactId>
-				<!-- >version>1.0.1-SNAPSHOT</version  -->
+				<!-- >version>1.0.1-SNAPSHOT</version -->
 				<executions>
 					<execution>
 						<id>start-container</id>

Modified: trunk/pom.xml
===================================================================
--- trunk/pom.xml	2009-06-11 15:01:24 UTC (rev 1041)
+++ trunk/pom.xml	2009-06-11 15:19:04 UTC (rev 1042)
@@ -2,7 +2,7 @@
 	<modelVersion>4.0.0</modelVersion>
 	<groupId>org.jboss.dna</groupId>
 	<artifactId>dna</artifactId>
-	<version>0.5-SNAPSHOT</version>
+	<version>0.5</version>
 	<packaging>pom</packaging>
 	<name>JBoss DNA</name>
 	<url>http://www.jboss.org/dna</url>
@@ -11,7 +11,7 @@
 		JBoss DNA provides tools for working with JCR repositories.
 	</description>
 	<scm>
-		<connection>scm:svn:https://svn.jboss.org/repos/dna/trunk</connection>
+		<connection>scm:svn:https://svn.jboss.org/repos/dna/tags/dna-0.5</connection>
 	</scm>
 	<licenses>
 		<license>



From dna-commits at lists.jboss.org  Thu Jun 11 11:19:22 2009
From: dna-commits at lists.jboss.org (dna-commits at lists.jboss.org)
Date: Thu, 11 Jun 2009 11:19:22 -0400
Subject: [dna-commits] DNA SVN: r1043 - in tags: dna-0.5 and 31 other
	directories.
Message-ID: <E1MEm3m-0004f4-AX@committer01.frg.pub.inap.atl.jboss.com>

Author: rhauch
Date: 2009-06-11 11:19:22 -0400 (Thu, 11 Jun 2009)
New Revision: 1043

Added:
   tags/dna-0.5/
   tags/dna-0.5/dna-cnd/pom.xml
   tags/dna-0.5/dna-common/pom.xml
   tags/dna-0.5/dna-graph/pom.xml
   tags/dna-0.5/dna-integration-tests/pom.xml
   tags/dna-0.5/dna-jcr/pom.xml
   tags/dna-0.5/dna-repository/pom.xml
   tags/dna-0.5/docs/examples/gettingstarted/pom.xml
   tags/dna-0.5/docs/examples/gettingstarted/repositories/pom.xml
   tags/dna-0.5/docs/examples/gettingstarted/sequencers/pom.xml
   tags/dna-0.5/docs/gettingstarted/pom.xml
   tags/dna-0.5/docs/pom.xml
   tags/dna-0.5/docs/reference/pom.xml
   tags/dna-0.5/extensions/dna-classloader-maven/pom.xml
   tags/dna-0.5/extensions/dna-common-jdbc/pom.xml
   tags/dna-0.5/extensions/dna-connector-federation/pom.xml
   tags/dna-0.5/extensions/dna-connector-filesystem/pom.xml
   tags/dna-0.5/extensions/dna-connector-jbosscache/pom.xml
   tags/dna-0.5/extensions/dna-connector-jdbc-metadata/pom.xml
   tags/dna-0.5/extensions/dna-connector-store-jpa/pom.xml
   tags/dna-0.5/extensions/dna-connector-svn/pom.xml
   tags/dna-0.5/extensions/dna-mimetype-detector-aperture/pom.xml
   tags/dna-0.5/extensions/dna-sequencer-cnd/pom.xml
   tags/dna-0.5/extensions/dna-sequencer-images/pom.xml
   tags/dna-0.5/extensions/dna-sequencer-java/pom.xml
   tags/dna-0.5/extensions/dna-sequencer-jbpm-jpdl/pom.xml
   tags/dna-0.5/extensions/dna-sequencer-mp3/pom.xml
   tags/dna-0.5/extensions/dna-sequencer-msoffice/pom.xml
   tags/dna-0.5/extensions/dna-sequencer-xml/pom.xml
   tags/dna-0.5/extensions/dna-sequencer-zip/pom.xml
   tags/dna-0.5/extensions/dna-web-jcr-rest-war/pom.xml
   tags/dna-0.5/extensions/dna-web-jcr-rest/pom.xml
   tags/dna-0.5/pom.xml
Removed:
   tags/dna-0.5/dna-cnd/pom.xml
   tags/dna-0.5/dna-common/pom.xml
   tags/dna-0.5/dna-graph/pom.xml
   tags/dna-0.5/dna-integration-tests/pom.xml
   tags/dna-0.5/dna-jcr/pom.xml
   tags/dna-0.5/dna-repository/pom.xml
   tags/dna-0.5/docs/examples/gettingstarted/pom.xml
   tags/dna-0.5/docs/examples/gettingstarted/repositories/pom.xml
   tags/dna-0.5/docs/examples/gettingstarted/sequencers/pom.xml
   tags/dna-0.5/docs/gettingstarted/pom.xml
   tags/dna-0.5/docs/pom.xml
   tags/dna-0.5/docs/reference/pom.xml
   tags/dna-0.5/extensions/dna-classloader-maven/pom.xml
   tags/dna-0.5/extensions/dna-common-jdbc/pom.xml
   tags/dna-0.5/extensions/dna-connector-federation/pom.xml
   tags/dna-0.5/extensions/dna-connector-filesystem/pom.xml
   tags/dna-0.5/extensions/dna-connector-jbosscache/pom.xml
   tags/dna-0.5/extensions/dna-connector-jdbc-metadata/pom.xml
   tags/dna-0.5/extensions/dna-connector-store-jpa/pom.xml
   tags/dna-0.5/extensions/dna-connector-svn/pom.xml
   tags/dna-0.5/extensions/dna-mimetype-detector-aperture/pom.xml
   tags/dna-0.5/extensions/dna-sequencer-cnd/pom.xml
   tags/dna-0.5/extensions/dna-sequencer-images/pom.xml
   tags/dna-0.5/extensions/dna-sequencer-java/pom.xml
   tags/dna-0.5/extensions/dna-sequencer-jbpm-jpdl/pom.xml
   tags/dna-0.5/extensions/dna-sequencer-mp3/pom.xml
   tags/dna-0.5/extensions/dna-sequencer-msoffice/pom.xml
   tags/dna-0.5/extensions/dna-sequencer-xml/pom.xml
   tags/dna-0.5/extensions/dna-sequencer-zip/pom.xml
   tags/dna-0.5/extensions/dna-web-jcr-rest-war/pom.xml
   tags/dna-0.5/extensions/dna-web-jcr-rest/pom.xml
   tags/dna-0.5/pom.xml
Log:
[maven-release-plugin]  copy for tag dna-0.5

Copied: tags/dna-0.5 (from rev 1041, trunk)

Deleted: tags/dna-0.5/dna-cnd/pom.xml
===================================================================
--- trunk/dna-cnd/pom.xml	2009-06-11 15:01:24 UTC (rev 1041)
+++ tags/dna-0.5/dna-cnd/pom.xml	2009-06-11 15:19:22 UTC (rev 1043)
@@ -1,107 +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.5-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>
-    <dependency>
-      <groupId>org.antlr</groupId>
-      <artifactId>antlr-runtime</artifactId>
-      <version>3.1.3</version>        
-      <exclusions>
-        <exclusion>
-          <groupId>org.antlr</groupId>
-          <artifactId>stringtemplate</artifactId>
-        </exclusion>                                  
-      </exclusions>                        
-    </dependency>
-    
-    <!-- Testing -->
-    <dependency>
-      <groupId>org.jboss.dna</groupId>
-      <artifactId>dna-graph</artifactId>
-      <version>${pom.version}</version>
-      <type>test-jar</type>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>junit</groupId>
-      <artifactId>junit</artifactId>
-    </dependency>
-	  <dependency>
-	    <groupId>org.antlr</groupId>
-	    <artifactId>antlr</artifactId>
-	    <version>3.1.3</version>
-      <exclusions>
-        <exclusion>
-          <groupId>org.antlr</groupId>
-          <artifactId>stringtemplate</artifactId>
-        </exclusion>      
-        <exclusion>
-          <groupId>org.apache.maven</groupId>
-          <artifactId>maven-project</artifactId>
-        </exclusion>                                                                
-      </exclusions>                                             
-	    <!-- we try to use scope to hide it from transitivity -->
-	    <scope>test</scope> <!-- or perhaps 'provided' (see later discussion) or 'import' (maven >= 2.0.9) -->
-	  </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>
-  <build>
-    <plugins>
-      <plugin>
-        <groupId>org.antlr</groupId>
-        <artifactId>antlr3-maven-plugin</artifactId>
-        <version>3.1.3-1</version>
-        <executions>
-          <execution>
-            <goals>
-              <goal>antlr</goal>
-            </goals>
-          </execution>
-        </executions>
-      </plugin>
-    </plugins>
-  </build>
-</project>
\ No newline at end of file

Copied: tags/dna-0.5/dna-cnd/pom.xml (from rev 1042, trunk/dna-cnd/pom.xml)
===================================================================
--- tags/dna-0.5/dna-cnd/pom.xml	                        (rev 0)
+++ tags/dna-0.5/dna-cnd/pom.xml	2009-06-11 15:19:22 UTC (rev 1043)
@@ -0,0 +1,107 @@
+<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.5</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>
+    <dependency>
+      <groupId>org.antlr</groupId>
+      <artifactId>antlr-runtime</artifactId>
+      <version>3.1.3</version>        
+      <exclusions>
+        <exclusion>
+          <groupId>org.antlr</groupId>
+          <artifactId>stringtemplate</artifactId>
+        </exclusion>                                  
+      </exclusions>                        
+    </dependency>
+    
+    <!-- Testing -->
+    <dependency>
+      <groupId>org.jboss.dna</groupId>
+      <artifactId>dna-graph</artifactId>
+      <version>${pom.version}</version>
+      <type>test-jar</type>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>junit</groupId>
+      <artifactId>junit</artifactId>
+    </dependency>
+	  <dependency>
+	    <groupId>org.antlr</groupId>
+	    <artifactId>antlr</artifactId>
+	    <version>3.1.3</version>
+      <exclusions>
+        <exclusion>
+          <groupId>org.antlr</groupId>
+          <artifactId>stringtemplate</artifactId>
+        </exclusion>      
+        <exclusion>
+          <groupId>org.apache.maven</groupId>
+          <artifactId>maven-project</artifactId>
+        </exclusion>                                                                
+      </exclusions>                                             
+	    <!-- we try to use scope to hide it from transitivity -->
+	    <scope>test</scope> <!-- or perhaps 'provided' (see later discussion) or 'import' (maven >= 2.0.9) -->
+	  </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>
+  <build>
+    <plugins>
+      <plugin>
+        <groupId>org.antlr</groupId>
+        <artifactId>antlr3-maven-plugin</artifactId>
+        <version>3.1.3-1</version>
+        <executions>
+          <execution>
+            <goals>
+              <goal>antlr</goal>
+            </goals>
+          </execution>
+        </executions>
+      </plugin>
+    </plugins>
+  </build>
+</project>
\ No newline at end of file

Deleted: tags/dna-0.5/dna-common/pom.xml
===================================================================
--- trunk/dna-common/pom.xml	2009-06-11 15:01:24 UTC (rev 1041)
+++ tags/dna-0.5/dna-common/pom.xml	2009-06-11 15:19:22 UTC (rev 1043)
@@ -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>
-    <groupId>org.jboss.dna</groupId>
-    <artifactId>dna</artifactId>
-    <version>0.5-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>
-    <!-- 
-    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.5/dna-common/pom.xml (from rev 1042, trunk/dna-common/pom.xml)
===================================================================
--- tags/dna-0.5/dna-common/pom.xml	                        (rev 0)
+++ tags/dna-0.5/dna-common/pom.xml	2009-06-11 15:19:22 UTC (rev 1043)
@@ -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>
+    <groupId>org.jboss.dna</groupId>
+    <artifactId>dna</artifactId>
+    <version>0.5</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>
+    <!-- 
+    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.5/dna-graph/pom.xml
===================================================================
--- trunk/dna-graph/pom.xml	2009-06-11 15:01:24 UTC (rev 1041)
+++ tags/dna-0.5/dna-graph/pom.xml	2009-06-11 15:19:22 UTC (rev 1043)
@@ -1,78 +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.5-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>${pom.version}</version>
-      <type>test-jar</type>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>joda-time</groupId>
-      <artifactId>joda-time</artifactId>
-    </dependency>
-    <dependency>
-        <groupId>com.google.code.google-collections</groupId>
-        <artifactId>google-collect</artifactId>
-        <version>snapshot-20080530</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>
-    <!-- 
-    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.5/dna-graph/pom.xml (from rev 1042, trunk/dna-graph/pom.xml)
===================================================================
--- tags/dna-0.5/dna-graph/pom.xml	                        (rev 0)
+++ tags/dna-0.5/dna-graph/pom.xml	2009-06-11 15:19:22 UTC (rev 1043)
@@ -0,0 +1,78 @@
+<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.5</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>${pom.version}</version>
+      <type>test-jar</type>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>joda-time</groupId>
+      <artifactId>joda-time</artifactId>
+    </dependency>
+    <dependency>
+        <groupId>com.google.code.google-collections</groupId>
+        <artifactId>google-collect</artifactId>
+        <version>snapshot-20080530</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>
+    <!-- 
+    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.5/dna-integration-tests/pom.xml
===================================================================
--- trunk/dna-integration-tests/pom.xml	2009-06-11 15:01:24 UTC (rev 1041)
+++ tags/dna-0.5/dna-integration-tests/pom.xml	2009-06-11 15:19:22 UTC (rev 1043)
@@ -1,142 +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.5-SNAPSHOT</version>
-  </parent>
-  <!-- The groupId and version values are inherited from parent -->
-  <artifactId>dna-integration-tests</artifactId>
-  <packaging>jar</packaging>
-  <version>0.5-SNAPSHOT</version>
-  <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-common</artifactId>
-      <version>${pom.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>
-    </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>
-		<!-- Apache Jackrabbit (JCR Implementation) -->
-		<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>
-    <!-- 
-      Databases and JDBC Drivers
-    -->
-    <dependency>
-      <groupId>org.apache.derby</groupId>
-      <artifactId>derby</artifactId>
-    </dependency>
-  </dependencies>
-  <!--
-	Build configuration - run integration tests only in 'integration' phase
-  -->
-  <build>
-	<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.5/dna-integration-tests/pom.xml (from rev 1042, trunk/dna-integration-tests/pom.xml)
===================================================================
--- tags/dna-0.5/dna-integration-tests/pom.xml	                        (rev 0)
+++ tags/dna-0.5/dna-integration-tests/pom.xml	2009-06-11 15:19:22 UTC (rev 1043)
@@ -0,0 +1,142 @@
+<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.5</version>
+  </parent>
+  <!-- The groupId and version values are inherited from parent -->
+  <artifactId>dna-integration-tests</artifactId>
+  <packaging>jar</packaging>
+  <version>0.5</version>
+  <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-common</artifactId>
+      <version>${pom.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>
+    </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>
+		<!-- Apache Jackrabbit (JCR Implementation) -->
+		<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>
+    <!-- 
+      Databases and JDBC Drivers
+    -->
+    <dependency>
+      <groupId>org.apache.derby</groupId>
+      <artifactId>derby</artifactId>
+    </dependency>
+  </dependencies>
+  <!--
+	Build configuration - run integration tests only in 'integration' phase
+  -->
+  <build>
+	<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.5/dna-jcr/pom.xml
===================================================================
--- trunk/dna-jcr/pom.xml	2009-06-11 15:01:24 UTC (rev 1041)
+++ tags/dna-0.5/dna-jcr/pom.xml	2009-06-11 15:19:22 UTC (rev 1043)
@@ -1,141 +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.5-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>${pom.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>${pom.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>
-      <version>${pom.version}</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>
-      <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.code.google-collections</groupId>
-      <artifactId>google-collect</artifactId>
-      <version>snapshot-20080530</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.5/dna-jcr/pom.xml (from rev 1042, trunk/dna-jcr/pom.xml)
===================================================================
--- tags/dna-0.5/dna-jcr/pom.xml	                        (rev 0)
+++ tags/dna-0.5/dna-jcr/pom.xml	2009-06-11 15:19:22 UTC (rev 1043)
@@ -0,0 +1,141 @@
+<?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.5</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>${pom.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>${pom.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>
+      <version>${pom.version}</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>
+      <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.code.google-collections</groupId>
+      <artifactId>google-collect</artifactId>
+      <version>snapshot-20080530</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.5/dna-repository/pom.xml
===================================================================
--- trunk/dna-repository/pom.xml	2009-06-11 15:01:24 UTC (rev 1041)
+++ tags/dna-0.5/dna-repository/pom.xml	2009-06-11 15:19:22 UTC (rev 1043)
@@ -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.5-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>${pom.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>${pom.version}</version>
-      <type>test-jar</type>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.jboss.dna</groupId>
-      <artifactId>dna-connector-federation</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>org.jboss.dna</groupId>
-      <artifactId>dna-connector-federation</artifactId>
-      <version>${pom.version}</version>
-      <type>test-jar</type>
-      <scope>test</scope>
-    </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.5/dna-repository/pom.xml (from rev 1042, trunk/dna-repository/pom.xml)
===================================================================
--- tags/dna-0.5/dna-repository/pom.xml	                        (rev 0)
+++ tags/dna-0.5/dna-repository/pom.xml	2009-06-11 15:19:22 UTC (rev 1043)
@@ -0,0 +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.5</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>${pom.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>${pom.version}</version>
+      <type>test-jar</type>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.jboss.dna</groupId>
+      <artifactId>dna-connector-federation</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.jboss.dna</groupId>
+      <artifactId>dna-connector-federation</artifactId>
+      <version>${pom.version}</version>
+      <type>test-jar</type>
+      <scope>test</scope>
+    </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.5/docs/examples/gettingstarted/pom.xml
===================================================================
--- trunk/docs/examples/gettingstarted/pom.xml	2009-06-11 15:01:24 UTC (rev 1041)
+++ tags/dna-0.5/docs/examples/gettingstarted/pom.xml	2009-06-11 15:19:22 UTC (rev 1043)
@@ -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.5-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>${pom.version}</version>
-      </dependency>
-      <dependency>
-        <groupId>org.jboss.dna</groupId>
-        <artifactId>dna-graph</artifactId>
-        <version>${pom.version}</version>
-      </dependency>
-      <dependency>
-        <groupId>org.jboss.dna</groupId>
-        <artifactId>dna-repository</artifactId>
-        <version>${pom.version}</version>
-      </dependency>
-      <dependency>
-        <groupId>org.jboss.dna</groupId>
-        <artifactId>dna-jcr</artifactId>
-        <version>${pom.version}</version>
-      </dependency>
-      <dependency>
-        <groupId>org.jboss.dna</groupId>
-        <artifactId>dna-maven-classloader</artifactId>
-        <version>${pom.version}</version>
-      </dependency>
-      <dependency>
-        <groupId>org.jboss.dna</groupId>
-        <artifactId>dna-sequencer-images</artifactId>
-        <version>${pom.version}</version>
-      </dependency>
-      <dependency>
-        <groupId>org.jboss.dna</groupId>
-        <artifactId>dna-sequencer-java</artifactId>
-        <version>${pom.version}</version>
-      </dependency>
-      <dependency>
-        <groupId>org.jboss.dna</groupId>
-        <artifactId>dna-connector-jbosscache</artifactId>
-        <version>${pom.version}</version>
-      </dependency>
-      <dependency>
-        <groupId>org.jboss.dna</groupId>
-        <artifactId>dna-connector-federation</artifactId>
-        <version>${pom.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.4.3</version>
-      </dependency>
-      <dependency>
-		<groupId>org.slf4j</groupId>
-		<artifactId>slf4j-log4j12</artifactId>
-		<version>1.4.3</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.5/docs/examples/gettingstarted/pom.xml (from rev 1042, trunk/docs/examples/gettingstarted/pom.xml)
===================================================================
--- tags/dna-0.5/docs/examples/gettingstarted/pom.xml	                        (rev 0)
+++ tags/dna-0.5/docs/examples/gettingstarted/pom.xml	2009-06-11 15:19:22 UTC (rev 1043)
@@ -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.5</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>${pom.version}</version>
+      </dependency>
+      <dependency>
+        <groupId>org.jboss.dna</groupId>
+        <artifactId>dna-graph</artifactId>
+        <version>${pom.version}</version>
+      </dependency>
+      <dependency>
+        <groupId>org.jboss.dna</groupId>
+        <artifactId>dna-repository</artifactId>
+        <version>${pom.version}</version>
+      </dependency>
+      <dependency>
+        <groupId>org.jboss.dna</groupId>
+        <artifactId>dna-jcr</artifactId>
+        <version>${pom.version}</version>
+      </dependency>
+      <dependency>
+        <groupId>org.jboss.dna</groupId>
+        <artifactId>dna-maven-classloader</artifactId>
+        <version>${pom.version}</version>
+      </dependency>
+      <dependency>
+        <groupId>org.jboss.dna</groupId>
+        <artifactId>dna-sequencer-images</artifactId>
+        <version>${pom.version}</version>
+      </dependency>
+      <dependency>
+        <groupId>org.jboss.dna</groupId>
+        <artifactId>dna-sequencer-java</artifactId>
+        <version>${pom.version}</version>
+      </dependency>
+      <dependency>
+        <groupId>org.jboss.dna</groupId>
+        <artifactId>dna-connector-jbosscache</artifactId>
+        <version>${pom.version}</version>
+      </dependency>
+      <dependency>
+        <groupId>org.jboss.dna</groupId>
+        <artifactId>dna-connector-federation</artifactId>
+        <version>${pom.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.4.3</version>
+      </dependency>
+      <dependency>
+		<groupId>org.slf4j</groupId>
+		<artifactId>slf4j-log4j12</artifactId>
+		<version>1.4.3</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.5/docs/examples/gettingstarted/repositories/pom.xml
===================================================================
--- trunk/docs/examples/gettingstarted/repositories/pom.xml	2009-06-11 15:01:24 UTC (rev 1041)
+++ tags/dna-0.5/docs/examples/gettingstarted/repositories/pom.xml	2009-06-11 15:19:22 UTC (rev 1043)
@@ -1,124 +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.5-SNAPSHOT</version>
-    <relativePath>..</relativePath>
-  </parent>
-
-  <modelVersion>4.0.0</modelVersion>
-  <groupId>org.jboss.dna.examples</groupId>
-  <artifactId>dna-example-repositories</artifactId>
-  <version>0.5-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-repository</artifactId>
-      <version>${pom.version}</version>
-      <scope>compile</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.jboss.dna</groupId>
-      <artifactId>dna-jcr</artifactId>
-      <version>${pom.version}</version>
-      <scope>compile</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.jboss.dna</groupId>
-      <artifactId>dna-connector-jbosscache</artifactId>
-      <version>${pom.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>
-    </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>${pom.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.5/docs/examples/gettingstarted/repositories/pom.xml (from rev 1042, trunk/docs/examples/gettingstarted/repositories/pom.xml)
===================================================================
--- tags/dna-0.5/docs/examples/gettingstarted/repositories/pom.xml	                        (rev 0)
+++ tags/dna-0.5/docs/examples/gettingstarted/repositories/pom.xml	2009-06-11 15:19:22 UTC (rev 1043)
@@ -0,0 +1,124 @@
+<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.5</version>
+    <relativePath>..</relativePath>
+  </parent>
+
+  <modelVersion>4.0.0</modelVersion>
+  <groupId>org.jboss.dna.examples</groupId>
+  <artifactId>dna-example-repositories</artifactId>
+  <version>0.5</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-repository</artifactId>
+      <version>${pom.version}</version>
+      <scope>compile</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.jboss.dna</groupId>
+      <artifactId>dna-jcr</artifactId>
+      <version>${pom.version}</version>
+      <scope>compile</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.jboss.dna</groupId>
+      <artifactId>dna-connector-jbosscache</artifactId>
+      <version>${pom.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>
+    </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>${pom.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.5/docs/examples/gettingstarted/sequencers/pom.xml
===================================================================
--- trunk/docs/examples/gettingstarted/sequencers/pom.xml	2009-06-11 15:01:24 UTC (rev 1041)
+++ tags/dna-0.5/docs/examples/gettingstarted/sequencers/pom.xml	2009-06-11 15:19:22 UTC (rev 1043)
@@ -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">
-
-  <parent>
-    <groupId>org.jboss.dna.examples</groupId>
-    <artifactId>getting_started</artifactId>
-    <version>0.5-SNAPSHOT</version>
-    <relativePath>..</relativePath>
-  </parent>
-
-  <modelVersion>4.0.0</modelVersion>
-  <groupId>org.jboss.dna.examples</groupId>
-  <artifactId>dna-example-sequencers</artifactId>
-  <version>0.5-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-jcr</artifactId>
-      <version>${pom.version}</version>
-      <scope>compile</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.jboss.dna</groupId>
-      <artifactId>dna-sequencer-images</artifactId>
-      <version>${pom.version}</version>
-      <scope>runtime</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.jboss.dna</groupId>
-      <artifactId>dna-sequencer-mp3</artifactId>
-      <version>${pom.version}</version>
-      <scope>runtime</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.jboss.dna</groupId>
-      <artifactId>dna-sequencer-java</artifactId>
-      <version>${pom.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>
-    </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>${pom.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.5/docs/examples/gettingstarted/sequencers/pom.xml (from rev 1042, trunk/docs/examples/gettingstarted/sequencers/pom.xml)
===================================================================
--- tags/dna-0.5/docs/examples/gettingstarted/sequencers/pom.xml	                        (rev 0)
+++ tags/dna-0.5/docs/examples/gettingstarted/sequencers/pom.xml	2009-06-11 15:19:22 UTC (rev 1043)
@@ -0,0 +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">
+
+  <parent>
+    <groupId>org.jboss.dna.examples</groupId>
+    <artifactId>getting_started</artifactId>
+    <version>0.5</version>
+    <relativePath>..</relativePath>
+  </parent>
+
+  <modelVersion>4.0.0</modelVersion>
+  <groupId>org.jboss.dna.examples</groupId>
+  <artifactId>dna-example-sequencers</artifactId>
+  <version>0.5</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-jcr</artifactId>
+      <version>${pom.version}</version>
+      <scope>compile</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.jboss.dna</groupId>
+      <artifactId>dna-sequencer-images</artifactId>
+      <version>${pom.version}</version>
+      <scope>runtime</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.jboss.dna</groupId>
+      <artifactId>dna-sequencer-mp3</artifactId>
+      <version>${pom.version}</version>
+      <scope>runtime</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.jboss.dna</groupId>
+      <artifactId>dna-sequencer-java</artifactId>
+      <version>${pom.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>
+    </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>${pom.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.5/docs/gettingstarted/pom.xml
===================================================================
--- trunk/docs/gettingstarted/pom.xml	2009-06-11 15:01:24 UTC (rev 1041)
+++ tags/dna-0.5/docs/gettingstarted/pom.xml	2009-06-11 15:19:22 UTC (rev 1043)
@@ -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.5-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>${pom.artifactId}.html</finalName>
-            </format>
-            <format>
-              <formatName>pdf</formatName>
-              <stylesheetResource>classpath:/xslt/org/jboss/pdf.xsl</stylesheetResource>
-              <finalName>${pom.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.5/docs/gettingstarted/pom.xml (from rev 1042, trunk/docs/gettingstarted/pom.xml)
===================================================================
--- tags/dna-0.5/docs/gettingstarted/pom.xml	                        (rev 0)
+++ tags/dna-0.5/docs/gettingstarted/pom.xml	2009-06-11 15:19:22 UTC (rev 1043)
@@ -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.5</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>${pom.artifactId}.html</finalName>
+            </format>
+            <format>
+              <formatName>pdf</formatName>
+              <stylesheetResource>classpath:/xslt/org/jboss/pdf.xsl</stylesheetResource>
+              <finalName>${pom.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.5/docs/pom.xml
===================================================================
--- trunk/docs/pom.xml	2009-06-11 15:01:24 UTC (rev 1041)
+++ tags/dna-0.5/docs/pom.xml	2009-06-11 15:19:22 UTC (rev 1043)
@@ -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.5-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.5/docs/pom.xml (from rev 1042, trunk/docs/pom.xml)
===================================================================
--- tags/dna-0.5/docs/pom.xml	                        (rev 0)
+++ tags/dna-0.5/docs/pom.xml	2009-06-11 15:19:22 UTC (rev 1043)
@@ -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.5</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.5/docs/reference/pom.xml
===================================================================
--- trunk/docs/reference/pom.xml	2009-06-11 15:01:24 UTC (rev 1041)
+++ tags/dna-0.5/docs/reference/pom.xml	2009-06-11 15:19:22 UTC (rev 1043)
@@ -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.5-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>${pom.artifactId}.html</finalName>
-            </format>
-            <format>
-              <formatName>pdf</formatName>
-              <stylesheetResource>classpath:/xslt/org/jboss/pdf.xsl</stylesheetResource>
-              <finalName>${pom.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.5/docs/reference/pom.xml (from rev 1042, trunk/docs/reference/pom.xml)
===================================================================
--- tags/dna-0.5/docs/reference/pom.xml	                        (rev 0)
+++ tags/dna-0.5/docs/reference/pom.xml	2009-06-11 15:19:22 UTC (rev 1043)
@@ -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.5</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>${pom.artifactId}.html</finalName>
+            </format>
+            <format>
+              <formatName>pdf</formatName>
+              <stylesheetResource>classpath:/xslt/org/jboss/pdf.xsl</stylesheetResource>
+              <finalName>${pom.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.5/extensions/dna-classloader-maven/pom.xml
===================================================================
--- trunk/extensions/dna-classloader-maven/pom.xml	2009-06-11 15:01:24 UTC (rev 1041)
+++ tags/dna-0.5/extensions/dna-classloader-maven/pom.xml	2009-06-11 15:19:22 UTC (rev 1043)
@@ -1,103 +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.5-SNAPSHOT</version>
-  </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>${pom.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.5/extensions/dna-classloader-maven/pom.xml (from rev 1042, trunk/extensions/dna-classloader-maven/pom.xml)
===================================================================
--- tags/dna-0.5/extensions/dna-classloader-maven/pom.xml	                        (rev 0)
+++ tags/dna-0.5/extensions/dna-classloader-maven/pom.xml	2009-06-11 15:19:22 UTC (rev 1043)
@@ -0,0 +1,103 @@
+<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.5</version>
+  </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>${pom.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.5/extensions/dna-common-jdbc/pom.xml
===================================================================
--- trunk/extensions/dna-common-jdbc/pom.xml	2009-06-11 15:01:24 UTC (rev 1041)
+++ tags/dna-0.5/extensions/dna-common-jdbc/pom.xml	2009-06-11 15:19:22 UTC (rev 1043)
@@ -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.5-SNAPSHOT</version>
-    <relativePath>../..</relativePath>
-  </parent>
-  <!-- The groupId and version values are inherited from parent -->
-  <artifactId>dna-common-jdbc</artifactId>
-  <packaging>jar</packaging>
-  <name>JBoss DNA JDBC Common model</name>
-  <description>JBoss DNA Common Model that stores JDBC related 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-graph</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>commons-beanutils</groupId>
-      <artifactId>commons-beanutils</artifactId>
-      <version>1.8.0</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.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>
-       <version>1.8.0.7</version>
-       <scope>test</scope>
-    </dependency>    
-  </dependencies>
-</project>
\ No newline at end of file

Copied: tags/dna-0.5/extensions/dna-common-jdbc/pom.xml (from rev 1042, trunk/extensions/dna-common-jdbc/pom.xml)
===================================================================
--- tags/dna-0.5/extensions/dna-common-jdbc/pom.xml	                        (rev 0)
+++ tags/dna-0.5/extensions/dna-common-jdbc/pom.xml	2009-06-11 15:19:22 UTC (rev 1043)
@@ -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.5</version>
+    <relativePath>../..</relativePath>
+  </parent>
+  <!-- The groupId and version values are inherited from parent -->
+  <artifactId>dna-common-jdbc</artifactId>
+  <packaging>jar</packaging>
+  <name>JBoss DNA JDBC Common model</name>
+  <description>JBoss DNA Common Model that stores JDBC related 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-graph</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>commons-beanutils</groupId>
+      <artifactId>commons-beanutils</artifactId>
+      <version>1.8.0</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.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>
+       <version>1.8.0.7</version>
+       <scope>test</scope>
+    </dependency>    
+  </dependencies>
+</project>
\ No newline at end of file

Deleted: tags/dna-0.5/extensions/dna-connector-federation/pom.xml
===================================================================
--- trunk/extensions/dna-connector-federation/pom.xml	2009-06-11 15:01:24 UTC (rev 1041)
+++ tags/dna-0.5/extensions/dna-connector-federation/pom.xml	2009-06-11 15:19:22 UTC (rev 1043)
@@ -1,89 +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.5-SNAPSHOT</version>
-    <relativePath>../..</relativePath>
-  </parent>
-  <!-- The groupId and version values are inherited from parent -->
-  <artifactId>dna-connector-federation</artifactId>
-  <packaging>jar</packaging>
-  <name>JBoss DNA Federation Connector</name>
-  <description>JBoss DNA Connector that federates content from multiple connectors.</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>${pom.version}</version>
-      <type>test-jar</type>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.jboss.dna</groupId>
-      <artifactId>dna-graph</artifactId>
-      <version>${pom.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>
-    </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.5/extensions/dna-connector-federation/pom.xml (from rev 1042, trunk/extensions/dna-connector-federation/pom.xml)
===================================================================
--- tags/dna-0.5/extensions/dna-connector-federation/pom.xml	                        (rev 0)
+++ tags/dna-0.5/extensions/dna-connector-federation/pom.xml	2009-06-11 15:19:22 UTC (rev 1043)
@@ -0,0 +1,89 @@
+<?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.5</version>
+    <relativePath>../..</relativePath>
+  </parent>
+  <!-- The groupId and version values are inherited from parent -->
+  <artifactId>dna-connector-federation</artifactId>
+  <packaging>jar</packaging>
+  <name>JBoss DNA Federation Connector</name>
+  <description>JBoss DNA Connector that federates content from multiple connectors.</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>${pom.version}</version>
+      <type>test-jar</type>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.jboss.dna</groupId>
+      <artifactId>dna-graph</artifactId>
+      <version>${pom.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>
+    </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.5/extensions/dna-connector-filesystem/pom.xml
===================================================================
--- trunk/extensions/dna-connector-filesystem/pom.xml	2009-06-11 15:01:24 UTC (rev 1041)
+++ tags/dna-0.5/extensions/dna-connector-filesystem/pom.xml	2009-06-11 15:19:22 UTC (rev 1043)
@@ -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.5-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>${pom.version}</version>
-      <type>test-jar</type>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.jboss.dna</groupId>
-      <artifactId>dna-graph</artifactId>
-      <version>${pom.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.5/extensions/dna-connector-filesystem/pom.xml (from rev 1042, trunk/extensions/dna-connector-filesystem/pom.xml)
===================================================================
--- tags/dna-0.5/extensions/dna-connector-filesystem/pom.xml	                        (rev 0)
+++ tags/dna-0.5/extensions/dna-connector-filesystem/pom.xml	2009-06-11 15:19:22 UTC (rev 1043)
@@ -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.5</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>${pom.version}</version>
+      <type>test-jar</type>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.jboss.dna</groupId>
+      <artifactId>dna-graph</artifactId>
+      <version>${pom.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.5/extensions/dna-connector-jbosscache/pom.xml
===================================================================
--- trunk/extensions/dna-connector-jbosscache/pom.xml	2009-06-11 15:01:24 UTC (rev 1041)
+++ tags/dna-0.5/extensions/dna-connector-jbosscache/pom.xml	2009-06-11 15:19:22 UTC (rev 1043)
@@ -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.5-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>${pom.version}</version>
-      <type>test-jar</type>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.jboss.dna</groupId>
-      <artifactId>dna-graph</artifactId>
-      <version>${pom.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.5/extensions/dna-connector-jbosscache/pom.xml (from rev 1042, trunk/extensions/dna-connector-jbosscache/pom.xml)
===================================================================
--- tags/dna-0.5/extensions/dna-connector-jbosscache/pom.xml	                        (rev 0)
+++ tags/dna-0.5/extensions/dna-connector-jbosscache/pom.xml	2009-06-11 15:19:22 UTC (rev 1043)
@@ -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.5</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>${pom.version}</version>
+      <type>test-jar</type>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.jboss.dna</groupId>
+      <artifactId>dna-graph</artifactId>
+      <version>${pom.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.5/extensions/dna-connector-jdbc-metadata/pom.xml
===================================================================
--- trunk/extensions/dna-connector-jdbc-metadata/pom.xml	2009-06-11 15:01:24 UTC (rev 1041)
+++ tags/dna-0.5/extensions/dna-connector-jdbc-metadata/pom.xml	2009-06-11 15:19:22 UTC (rev 1043)
@@ -1,94 +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.5-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</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-common</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>org.jboss.dna</groupId>
-      <artifactId>dna-graph</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>org.jboss.dna</groupId>
-      <artifactId>dna-common-jdbc</artifactId>
-      <version>${pom.version}</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.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>
-       <version>1.8.0.7</version>
-       <scope>test</scope>
-    </dependency>
-    <dependency>
-       <groupId>org.dbunit</groupId>
-       <artifactId>dbunit</artifactId>
-       <version>2.4.1</version>
-       <scope>test</scope>
-    </dependency>    
-  </dependencies>
-  <properties>
-       <jdbc.driverClassName>org.hsqldb.jdbcDriver</jdbc.driverClassName>
-       <jdbc.username>sa</jdbc.username>
-       <jdbc.password />
-       <jdbc.url>jdbc:hsqldb:file:${basedir}/target/testdb/db</jdbc.url>
-  </properties>
-  <build>
-       <resources>
-            <resource>
-                <directory>src/main/resources</directory>
-                <filtering>true</filtering>
-            </resource>
-       </resources>
-       <testResources>
-            <testResource>
-                <directory>src/test/resources</directory>
-                <filtering>true</filtering>
-            </testResource>
-            <testResource>
-                <directory>src/test/data</directory>
-                <filtering>true</filtering>
-                <targetPath>../</targetPath>
-            </testResource>
-            <testResource>
-                <directory>src/it/resources</directory>
-                <filtering>true</filtering>
-            </testResource>
-       </testResources>
-  </build>
-</project>
\ No newline at end of file

Copied: tags/dna-0.5/extensions/dna-connector-jdbc-metadata/pom.xml (from rev 1042, trunk/extensions/dna-connector-jdbc-metadata/pom.xml)
===================================================================
--- tags/dna-0.5/extensions/dna-connector-jdbc-metadata/pom.xml	                        (rev 0)
+++ tags/dna-0.5/extensions/dna-connector-jdbc-metadata/pom.xml	2009-06-11 15:19:22 UTC (rev 1043)
@@ -0,0 +1,94 @@
+<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.5</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</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-common</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.jboss.dna</groupId>
+      <artifactId>dna-graph</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.jboss.dna</groupId>
+      <artifactId>dna-common-jdbc</artifactId>
+      <version>${pom.version}</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.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>
+       <version>1.8.0.7</version>
+       <scope>test</scope>
+    </dependency>
+    <dependency>
+       <groupId>org.dbunit</groupId>
+       <artifactId>dbunit</artifactId>
+       <version>2.4.1</version>
+       <scope>test</scope>
+    </dependency>    
+  </dependencies>
+  <properties>
+       <jdbc.driverClassName>org.hsqldb.jdbcDriver</jdbc.driverClassName>
+       <jdbc.username>sa</jdbc.username>
+       <jdbc.password />
+       <jdbc.url>jdbc:hsqldb:file:${basedir}/target/testdb/db</jdbc.url>
+  </properties>
+  <build>
+       <resources>
+            <resource>
+                <directory>src/main/resources</directory>
+                <filtering>true</filtering>
+            </resource>
+       </resources>
+       <testResources>
+            <testResource>
+                <directory>src/test/resources</directory>
+                <filtering>true</filtering>
+            </testResource>
+            <testResource>
+                <directory>src/test/data</directory>
+                <filtering>true</filtering>
+                <targetPath>../</targetPath>
+            </testResource>
+            <testResource>
+                <directory>src/it/resources</directory>
+                <filtering>true</filtering>
+            </testResource>
+       </testResources>
+  </build>
+</project>
\ No newline at end of file

Deleted: tags/dna-0.5/extensions/dna-connector-store-jpa/pom.xml
===================================================================
--- trunk/extensions/dna-connector-store-jpa/pom.xml	2009-06-11 15:01:24 UTC (rev 1041)
+++ tags/dna-0.5/extensions/dna-connector-store-jpa/pom.xml	2009-06-11 15:19:22 UTC (rev 1043)
@@ -1,105 +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.5-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.1.GA</version>
-    </dependency>
-    <!-- 
-    HSQLDB
-    -->
-    <dependency>
-      <groupId>hsqldb</groupId>
-      <artifactId>hsqldb</artifactId>
-      <version>1.8.0.2</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>${pom.version}</version>
-      <type>test-jar</type>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.jboss.dna</groupId>
-      <artifactId>dna-graph</artifactId>
-      <version>${pom.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.5/extensions/dna-connector-store-jpa/pom.xml (from rev 1042, trunk/extensions/dna-connector-store-jpa/pom.xml)
===================================================================
--- tags/dna-0.5/extensions/dna-connector-store-jpa/pom.xml	                        (rev 0)
+++ tags/dna-0.5/extensions/dna-connector-store-jpa/pom.xml	2009-06-11 15:19:22 UTC (rev 1043)
@@ -0,0 +1,105 @@
+<?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.5</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.1.GA</version>
+    </dependency>
+    <!-- 
+    HSQLDB
+    -->
+    <dependency>
+      <groupId>hsqldb</groupId>
+      <artifactId>hsqldb</artifactId>
+      <version>1.8.0.2</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>${pom.version}</version>
+      <type>test-jar</type>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.jboss.dna</groupId>
+      <artifactId>dna-graph</artifactId>
+      <version>${pom.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.5/extensions/dna-connector-svn/pom.xml
===================================================================
--- trunk/extensions/dna-connector-svn/pom.xml	2009-06-11 15:01:24 UTC (rev 1041)
+++ tags/dna-0.5/extensions/dna-connector-svn/pom.xml	2009-06-11 15:19:22 UTC (rev 1043)
@@ -1,96 +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.5-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>${pom.version}</version>
-			<type>test-jar</type>
-			<scope>test</scope>
-		</dependency>
-		<dependency>
-			<groupId>org.jboss.dna</groupId>
-			<artifactId>dna-graph</artifactId>
-			<version>${pom.version}</version>
-			<type>test-jar</type>
-			<scope>test</scope>
-		</dependency>
-		<!-- 
-			SVNKit
-		-->
-		<dependency>
-			<groupId>org.tmatesoft.svnkit</groupId>
-			<artifactId>svnkit</artifactId>
-			<version>1.2.3.5521</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.5/extensions/dna-connector-svn/pom.xml (from rev 1042, trunk/extensions/dna-connector-svn/pom.xml)
===================================================================
--- tags/dna-0.5/extensions/dna-connector-svn/pom.xml	                        (rev 0)
+++ tags/dna-0.5/extensions/dna-connector-svn/pom.xml	2009-06-11 15:19:22 UTC (rev 1043)
@@ -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.5</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>${pom.version}</version>
+			<type>test-jar</type>
+			<scope>test</scope>
+		</dependency>
+		<dependency>
+			<groupId>org.jboss.dna</groupId>
+			<artifactId>dna-graph</artifactId>
+			<version>${pom.version}</version>
+			<type>test-jar</type>
+			<scope>test</scope>
+		</dependency>
+		<!-- 
+			SVNKit
+		-->
+		<dependency>
+			<groupId>org.tmatesoft.svnkit</groupId>
+			<artifactId>svnkit</artifactId>
+			<version>1.2.3.5521</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.5/extensions/dna-mimetype-detector-aperture/pom.xml
===================================================================
--- trunk/extensions/dna-mimetype-detector-aperture/pom.xml	2009-06-11 15:01:24 UTC (rev 1041)
+++ tags/dna-0.5/extensions/dna-mimetype-detector-aperture/pom.xml	2009-06-11 15:19:22 UTC (rev 1043)
@@ -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.5-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>${pom.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.5/extensions/dna-mimetype-detector-aperture/pom.xml (from rev 1042, trunk/extensions/dna-mimetype-detector-aperture/pom.xml)
===================================================================
--- tags/dna-0.5/extensions/dna-mimetype-detector-aperture/pom.xml	                        (rev 0)
+++ tags/dna-0.5/extensions/dna-mimetype-detector-aperture/pom.xml	2009-06-11 15:19:22 UTC (rev 1043)
@@ -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.5</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>${pom.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.5/extensions/dna-sequencer-cnd/pom.xml
===================================================================
--- trunk/extensions/dna-sequencer-cnd/pom.xml	2009-06-11 15:01:24 UTC (rev 1041)
+++ tags/dna-0.5/extensions/dna-sequencer-cnd/pom.xml	2009-06-11 15:19:22 UTC (rev 1043)
@@ -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.5-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>${pom.version}</version>
-      <type>test-jar</type>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.jboss.dna</groupId>
-      <artifactId>dna-graph</artifactId>
-      <version>${pom.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.5/extensions/dna-sequencer-cnd/pom.xml (from rev 1042, trunk/extensions/dna-sequencer-cnd/pom.xml)
===================================================================
--- tags/dna-0.5/extensions/dna-sequencer-cnd/pom.xml	                        (rev 0)
+++ tags/dna-0.5/extensions/dna-sequencer-cnd/pom.xml	2009-06-11 15:19:22 UTC (rev 1043)
@@ -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.5</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>${pom.version}</version>
+      <type>test-jar</type>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.jboss.dna</groupId>
+      <artifactId>dna-graph</artifactId>
+      <version>${pom.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.5/extensions/dna-sequencer-images/pom.xml
===================================================================
--- trunk/extensions/dna-sequencer-images/pom.xml	2009-06-11 15:01:24 UTC (rev 1041)
+++ tags/dna-0.5/extensions/dna-sequencer-images/pom.xml	2009-06-11 15:19:22 UTC (rev 1043)
@@ -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.5-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>${pom.version}</version>
-      <type>test-jar</type>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.jboss.dna</groupId>
-      <artifactId>dna-graph</artifactId>
-      <version>${pom.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.5/extensions/dna-sequencer-images/pom.xml (from rev 1042, trunk/extensions/dna-sequencer-images/pom.xml)
===================================================================
--- tags/dna-0.5/extensions/dna-sequencer-images/pom.xml	                        (rev 0)
+++ tags/dna-0.5/extensions/dna-sequencer-images/pom.xml	2009-06-11 15:19:22 UTC (rev 1043)
@@ -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.5</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>${pom.version}</version>
+      <type>test-jar</type>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.jboss.dna</groupId>
+      <artifactId>dna-graph</artifactId>
+      <version>${pom.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.5/extensions/dna-sequencer-java/pom.xml
===================================================================
--- trunk/extensions/dna-sequencer-java/pom.xml	2009-06-11 15:01:24 UTC (rev 1041)
+++ tags/dna-0.5/extensions/dna-sequencer-java/pom.xml	2009-06-11 15:19:22 UTC (rev 1043)
@@ -1,142 +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.5-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>${pom.version}</version>
-			<type>test-jar</type>
-			<scope>test</scope>
-		</dependency>
-		<dependency>
-			<groupId>org.jboss.dna</groupId>
-			<artifactId>dna-graph</artifactId>
-			<version>${pom.version}</version>
-			<type>test-jar</type>
-			<scope>test</scope>
-		</dependency>
-		<dependency>
-			<groupId>org.jboss.dna</groupId>
-			<artifactId>dna-integration-tests</artifactId>
-			<version>0.5-SNAPSHOT</version>
-			<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.5/extensions/dna-sequencer-java/pom.xml (from rev 1042, trunk/extensions/dna-sequencer-java/pom.xml)
===================================================================
--- tags/dna-0.5/extensions/dna-sequencer-java/pom.xml	                        (rev 0)
+++ tags/dna-0.5/extensions/dna-sequencer-java/pom.xml	2009-06-11 15:19:22 UTC (rev 1043)
@@ -0,0 +1,142 @@
+<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.5</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>${pom.version}</version>
+			<type>test-jar</type>
+			<scope>test</scope>
+		</dependency>
+		<dependency>
+			<groupId>org.jboss.dna</groupId>
+			<artifactId>dna-graph</artifactId>
+			<version>${pom.version}</version>
+			<type>test-jar</type>
+			<scope>test</scope>
+		</dependency>
+		<dependency>
+			<groupId>org.jboss.dna</groupId>
+			<artifactId>dna-integration-tests</artifactId>
+			<version>0.5</version>
+			<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.5/extensions/dna-sequencer-jbpm-jpdl/pom.xml
===================================================================
--- trunk/extensions/dna-sequencer-jbpm-jpdl/pom.xml	2009-06-11 15:01:24 UTC (rev 1041)
+++ tags/dna-0.5/extensions/dna-sequencer-jbpm-jpdl/pom.xml	2009-06-11 15:19:22 UTC (rev 1043)
@@ -1,122 +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.5-SNAPSHOT</version>
-		<relativePath>../..</relativePath>
-	</parent>
-	<artifactId>dna-sequencer-jbpm-jpdl</artifactId>
-	<packaging>jar</packaging>
-	<version>0.5-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>${pom.version}</version>
-			<type>test-jar</type>
-			<scope>test</scope>
-		</dependency>
-		<dependency>
-			<groupId>org.jboss.dna</groupId>
-			<artifactId>dna-graph</artifactId>
-			<version>${pom.version}</version>
-			<type>test-jar</type>
-			<scope>test</scope>
-		</dependency>
-		<dependency>
-			<groupId>org.jboss.dna</groupId>
-			<artifactId>dna-integration-tests</artifactId>
-			<version>${pom.version}</version>
-			<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.5/extensions/dna-sequencer-jbpm-jpdl/pom.xml (from rev 1042, trunk/extensions/dna-sequencer-jbpm-jpdl/pom.xml)
===================================================================
--- tags/dna-0.5/extensions/dna-sequencer-jbpm-jpdl/pom.xml	                        (rev 0)
+++ tags/dna-0.5/extensions/dna-sequencer-jbpm-jpdl/pom.xml	2009-06-11 15:19:22 UTC (rev 1043)
@@ -0,0 +1,122 @@
+<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.5</version>
+		<relativePath>../..</relativePath>
+	</parent>
+	<artifactId>dna-sequencer-jbpm-jpdl</artifactId>
+	<packaging>jar</packaging>
+	<version>0.5</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>${pom.version}</version>
+			<type>test-jar</type>
+			<scope>test</scope>
+		</dependency>
+		<dependency>
+			<groupId>org.jboss.dna</groupId>
+			<artifactId>dna-graph</artifactId>
+			<version>${pom.version}</version>
+			<type>test-jar</type>
+			<scope>test</scope>
+		</dependency>
+		<dependency>
+			<groupId>org.jboss.dna</groupId>
+			<artifactId>dna-integration-tests</artifactId>
+			<version>${pom.version}</version>
+			<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.5/extensions/dna-sequencer-mp3/pom.xml
===================================================================
--- trunk/extensions/dna-sequencer-mp3/pom.xml	2009-06-11 15:01:24 UTC (rev 1041)
+++ tags/dna-0.5/extensions/dna-sequencer-mp3/pom.xml	2009-06-11 15:19:22 UTC (rev 1043)
@@ -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.5-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.5/extensions/dna-sequencer-mp3/pom.xml (from rev 1042, trunk/extensions/dna-sequencer-mp3/pom.xml)
===================================================================
--- tags/dna-0.5/extensions/dna-sequencer-mp3/pom.xml	                        (rev 0)
+++ tags/dna-0.5/extensions/dna-sequencer-mp3/pom.xml	2009-06-11 15:19:22 UTC (rev 1043)
@@ -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.5</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.5/extensions/dna-sequencer-msoffice/pom.xml
===================================================================
--- trunk/extensions/dna-sequencer-msoffice/pom.xml	2009-06-11 15:01:24 UTC (rev 1041)
+++ tags/dna-0.5/extensions/dna-sequencer-msoffice/pom.xml	2009-06-11 15:19:22 UTC (rev 1043)
@@ -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.5-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>${pom.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.5/extensions/dna-sequencer-msoffice/pom.xml (from rev 1042, trunk/extensions/dna-sequencer-msoffice/pom.xml)
===================================================================
--- tags/dna-0.5/extensions/dna-sequencer-msoffice/pom.xml	                        (rev 0)
+++ tags/dna-0.5/extensions/dna-sequencer-msoffice/pom.xml	2009-06-11 15:19:22 UTC (rev 1043)
@@ -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.5</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>${pom.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.5/extensions/dna-sequencer-xml/pom.xml
===================================================================
--- trunk/extensions/dna-sequencer-xml/pom.xml	2009-06-11 15:01:24 UTC (rev 1041)
+++ tags/dna-0.5/extensions/dna-sequencer-xml/pom.xml	2009-06-11 15:19:22 UTC (rev 1043)
@@ -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.5-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>${pom.version}</version>
-      <type>test-jar</type>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.jboss.dna</groupId>
-      <artifactId>dna-graph</artifactId>
-      <version>${pom.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.5/extensions/dna-sequencer-xml/pom.xml (from rev 1042, trunk/extensions/dna-sequencer-xml/pom.xml)
===================================================================
--- tags/dna-0.5/extensions/dna-sequencer-xml/pom.xml	                        (rev 0)
+++ tags/dna-0.5/extensions/dna-sequencer-xml/pom.xml	2009-06-11 15:19:22 UTC (rev 1043)
@@ -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.5</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>${pom.version}</version>
+      <type>test-jar</type>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.jboss.dna</groupId>
+      <artifactId>dna-graph</artifactId>
+      <version>${pom.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.5/extensions/dna-sequencer-zip/pom.xml
===================================================================
--- trunk/extensions/dna-sequencer-zip/pom.xml	2009-06-11 15:01:24 UTC (rev 1041)
+++ tags/dna-0.5/extensions/dna-sequencer-zip/pom.xml	2009-06-11 15:19:22 UTC (rev 1043)
@@ -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.5-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>${pom.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.5/extensions/dna-sequencer-zip/pom.xml (from rev 1042, trunk/extensions/dna-sequencer-zip/pom.xml)
===================================================================
--- tags/dna-0.5/extensions/dna-sequencer-zip/pom.xml	                        (rev 0)
+++ tags/dna-0.5/extensions/dna-sequencer-zip/pom.xml	2009-06-11 15:19:22 UTC (rev 1043)
@@ -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.5</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>${pom.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.5/extensions/dna-web-jcr-rest/pom.xml
===================================================================
--- trunk/extensions/dna-web-jcr-rest/pom.xml	2009-06-11 15:01:24 UTC (rev 1041)
+++ tags/dna-0.5/extensions/dna-web-jcr-rest/pom.xml	2009-06-11 15:19:22 UTC (rev 1043)
@@ -1,81 +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.5-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.1-RC2</version>
-		</dependency>
-		<dependency>
-			<groupId>org.jboss.resteasy</groupId>
-			<artifactId>resteasy-jaxb-provider</artifactId>
-			<version>1.1-RC2</version>
-			<exclusions>
-				<exclusion>
-					<groupId>com.sun.xml.bind</groupId>
-					<artifactId>jaxb-impl</artifactId>
-				</exclusion>
-			</exclusions>
-		</dependency>
-
-		<!-- This is only included as a temp. workaround.  Current release of RESTEasy depends on 2.1.8, which is not in our repo at this time 
-			This should be removed after RESTEasy 1.1GA is released and added to this pom.
-		-->
-		<dependency>
-			<groupId>com.sun.xml.bind</groupId>
-			<artifactId>jaxb-impl</artifactId>
-			<version>2.1.9</version>
-		</dependency>
-		<dependency>
-			<groupId>org.jboss.dna</groupId>
-			<artifactId>dna-jcr</artifactId>
-		</dependency>
-
-		<dependency>
-			<groupId>org.slf4j</groupId>
-			<artifactId>slf4j-log4j12</artifactId>
-			<version>1.4.3</version>
-			<scope>runtime</scope>
-		</dependency>
-		<!-- 
-      Java Content Repository API 
-    -->
-		<dependency>
-			<groupId>javax.jcr</groupId>
-			<artifactId>jcr</artifactId>
-		</dependency>
-
-		<!--  TESTING DEPENDENCIES -->
-		<dependency>
-			<groupId>junit</groupId>
-			<artifactId>junit-dep</artifactId>
-			<version>4.4</version>
-			<scope>integration-test</scope>
-		</dependency>
-		<dependency>
-			<groupId>org.jboss.resteasy</groupId>
-			<artifactId>resteasy-client</artifactId>
-			<version>1.0-beta-8</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.5/extensions/dna-web-jcr-rest/pom.xml (from rev 1042, trunk/extensions/dna-web-jcr-rest/pom.xml)
===================================================================
--- tags/dna-0.5/extensions/dna-web-jcr-rest/pom.xml	                        (rev 0)
+++ tags/dna-0.5/extensions/dna-web-jcr-rest/pom.xml	2009-06-11 15:19:22 UTC (rev 1043)
@@ -0,0 +1,80 @@
+<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.5</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.1-RC2</version>
+		</dependency>
+		<dependency>
+			<groupId>org.jboss.resteasy</groupId>
+			<artifactId>resteasy-jaxb-provider</artifactId>
+			<version>1.1-RC2</version>
+			<exclusions>
+				<exclusion>
+					<groupId>com.sun.xml.bind</groupId>
+					<artifactId>jaxb-impl</artifactId>
+				</exclusion>
+			</exclusions>
+		</dependency>
+
+		<!-- This is only included as a temp. workaround.  Current release of RESTEasy depends on 2.1.8, which is not in our repo at this time 
+			This should be removed after RESTEasy 1.1GA is released and added to this pom.
+		-->
+		<dependency>
+			<groupId>com.sun.xml.bind</groupId>
+			<artifactId>jaxb-impl</artifactId>
+			<version>2.1.9</version>
+		</dependency>
+		<dependency>
+			<groupId>org.jboss.dna</groupId>
+			<artifactId>dna-jcr</artifactId>
+		</dependency>
+
+		<dependency>
+			<groupId>org.slf4j</groupId>
+			<artifactId>slf4j-log4j12</artifactId>
+			<version>1.4.3</version>
+			<scope>runtime</scope>
+		</dependency>
+		<!-- 
+      Java Content Repository API 
+    -->
+		<dependency>
+			<groupId>javax.jcr</groupId>
+			<artifactId>jcr</artifactId>
+		</dependency>
+
+		<!--  TESTING DEPENDENCIES -->
+		<dependency>
+			<groupId>junit</groupId>
+			<artifactId>junit-dep</artifactId>
+			<version>4.4</version>
+			<scope>integration-test</scope>
+		</dependency>
+		<dependency>
+			<groupId>org.jboss.resteasy</groupId>
+			<artifactId>resteasy-client</artifactId>
+			<version>1.0-beta-8</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.5/extensions/dna-web-jcr-rest-war/pom.xml
===================================================================
--- trunk/extensions/dna-web-jcr-rest-war/pom.xml	2009-06-11 15:01:24 UTC (rev 1041)
+++ tags/dna-0.5/extensions/dna-web-jcr-rest-war/pom.xml	2009-06-11 15:19:22 UTC (rev 1043)
@@ -1,103 +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.5-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>${pom.version}</version>
-		</dependency>
-
-		<dependency>
-			<groupId>org.slf4j</groupId>
-			<artifactId>slf4j-log4j12</artifactId>
-			<version>1.4.3</version>
-			<scope>runtime</scope>
-		</dependency>
-
-		<!--  TESTING DEPENDENCIES -->
-		<dependency>
-			<groupId>junit</groupId>
-			<artifactId>junit-dep</artifactId>
-			<version>4.4</version>
-			<scope>integration-test</scope>
-		</dependency>
-		<dependency>
-			<groupId>org.jboss.resteasy</groupId>
-			<artifactId>resteasy-client</artifactId>
-			<version>1.0-beta-8</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.5/extensions/dna-web-jcr-rest-war/pom.xml (from rev 1042, trunk/extensions/dna-web-jcr-rest-war/pom.xml)
===================================================================
--- tags/dna-0.5/extensions/dna-web-jcr-rest-war/pom.xml	                        (rev 0)
+++ tags/dna-0.5/extensions/dna-web-jcr-rest-war/pom.xml	2009-06-11 15:19:22 UTC (rev 1043)
@@ -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.5</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>${pom.version}</version>
+		</dependency>
+
+		<dependency>
+			<groupId>org.slf4j</groupId>
+			<artifactId>slf4j-log4j12</artifactId>
+			<version>1.4.3</version>
+			<scope>runtime</scope>
+		</dependency>
+
+		<!--  TESTING DEPENDENCIES -->
+		<dependency>
+			<groupId>junit</groupId>
+			<artifactId>junit-dep</artifactId>
+			<version>4.4</version>
+			<scope>integration-test</scope>
+		</dependency>
+		<dependency>
+			<groupId>org.jboss.resteasy</groupId>
+			<artifactId>resteasy-client</artifactId>
+			<version>1.0-beta-8</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>

Deleted: tags/dna-0.5/pom.xml
===================================================================
--- trunk/pom.xml	2009-06-11 15:01:24 UTC (rev 1041)
+++ tags/dna-0.5/pom.xml	2009-06-11 15:19:22 UTC (rev 1043)
@@ -1,631 +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.5-SNAPSHOT</version>
-	<packaging>pom</packaging>
-	<name>JBoss DNA</name>
-	<url>http://www.jboss.org/dna</url>
-	<inceptionYear>2008</inceptionYear>
-	<description>
-		JBoss DNA provides tools for working with JCR repositories.
-	</description>
-	<scm>
-		<connection>scm:svn:https://svn.jboss.org/repos/dna/trunk</connection>
-	</scm>
-	<licenses>
-		<license>
-			<name>GNU Lesser General Public License</name>
-			<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>
-		<developer>
-			<name>Bojidar Penchev</name>
-			<id>dcodeboy</id>
-			<email>dcodeboy at gmail.com</email>
-			<roles>
-				<role>Developer</role>
-			</roles>
-			<timezone>+1</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>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-msoffice</module>
-		<module>extensions/dna-sequencer-xml</module>
-		<module>extensions/dna-sequencer-zip</module>
-		<module>extensions/dna-connector-federation</module>
-		<module>extensions/dna-connector-filesystem</module>
-		<module>extensions/dna-connector-jbosscache</module>
-		<module>extensions/dna-connector-svn</module>
-		<module>extensions/dna-connector-store-jpa</module>
-		<module>extensions/dna-mimetype-detector-aperture</module>
-		<module>extensions/dna-common-jdbc</module> 
-		<module>extensions/dna-connector-jdbc-metadata</module> 
-		<module>extensions/dna-web-jcr-rest</module> 
-		<module>extensions/dna-web-jcr-rest-war</module> 
-		<module>dna-integration-tests</module>
-		<module>docs/examples/gettingstarted</module>
-	</modules>
-
-	<profiles>
-		<profile>
-			<id>release</id>
-			<modules>
-				<module>docs</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>
-	      </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>
-	        </plugins>
-	      </build>
-	      <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>
-	</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.maven.plugins</groupId>
-					<artifactId>maven-javadoc-plugin</artifactId>
-					<version>2.2</version>
-					<configuration>
-						<aggregate>true</aggregate>
-            <doclet>net.gleamynode.apiviz.APIviz</doclet>
-	          <docletArtifact>
-	            <groupId>net.gleamynode.apiviz</groupId>
-	            <artifactId>apiviz</artifactId>
-	            <version>1.1.1</version>
-	          </docletArtifact>
-	          <additionalparam>
-	            -charset UTF-8
-	            -docencoding UTF-8
-	            -version
-	            -author
-	            -breakiterator
-	            -linksource
-	            -sourcetab 4
-	            -windowtitle "${project.name} ${project.version} API Reference"
-	            -doctitle "${project.name} ${project.version} API Reference"
-	            -bottom "Copyright ? ${project.inceptionYear}-Present JBoss a division of Red Hat. All Rights Reserved."
-	            -link http://java.sun.com/javase/6/docs/api/
-	          </additionalparam>
-	          <encoding>UTF-8</encoding>
-					</configuration>
-				</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>
-			<!-- 
-           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>
-								${pom.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>${pom.version}</version>
-			</dependency>
-			<dependency>
-				<groupId>org.jboss.dna</groupId>
-				<artifactId>dna-classloader-maven</artifactId>
-				<version>${pom.version}</version>
-			</dependency>
-			<dependency>
-				<groupId>org.jboss.dna</groupId>
-				<artifactId>dna-graph</artifactId>
-				<version>${pom.version}</version>
-			</dependency>
-			<dependency>
-				<groupId>org.jboss.dna</groupId>
-				<artifactId>dna-cnd</artifactId>
-				<version>${pom.version}</version>
-			</dependency>
-			<dependency>
-				<groupId>org.jboss.dna</groupId>
-				<artifactId>dna-repository</artifactId>
-				<version>${pom.version}</version>
-			</dependency>
-			<dependency>
-				<groupId>org.jboss.dna</groupId>
-				<artifactId>dna-jcr</artifactId>
-				<version>${pom.version}</version>
-			</dependency>
-			<dependency>
-				<groupId>org.jboss.dna</groupId>
-				<artifactId>dna-jcr-tck</artifactId>
-				<version>${pom.version}</version>
-			</dependency>
-			<dependency>
-				<groupId>org.jboss.dna</groupId>
-				<artifactId>dna-connector-federation</artifactId>
-				<version>${pom.version}</version>
-			</dependency>
-			<dependency>
-				<groupId>org.jboss.dna</groupId>
-				<artifactId>dna-connector-jbosscache</artifactId>
-				<version>${pom.version}</version>
-			</dependency>
-			<dependency>
-				<groupId>org.jboss.dna</groupId>
-				<artifactId>dna-connector-store-jpa</artifactId>
-				<version>${pom.version}</version>
-			</dependency>
-			<dependency>
-				<groupId>org.jboss.dna</groupId>
-				<artifactId>dna-connector-filesystem</artifactId>
-				<version>${pom.version}</version>
-			</dependency>
-			<dependency>
-				<groupId>org.jboss.dna</groupId>
-				<artifactId>dna-connector-svn</artifactId>
-				<version>${pom.version}</version>
-			</dependency>
-			<dependency>
-				<groupId>org.jboss.dna</groupId>
-				<artifactId>dna-mimetype-detector-aperture</artifactId>
-				<version>${pom.version}</version>
-			</dependency>
-			<dependency>
-				<groupId>org.jboss.dna</groupId>
-				<artifactId>dna-sequencer-cnd</artifactId>
-				<version>${pom.version}</version>
-			</dependency>
-			<dependency>
-				<groupId>org.jboss.dna</groupId>
-				<artifactId>dna-sequencer-images</artifactId>
-				<version>${pom.version}</version>
-			</dependency>
-			<dependency>
-				<groupId>org.jboss.dna</groupId>
-				<artifactId>dna-sequencer-java</artifactId>
-				<version>${pom.version}</version>
-			</dependency>
-			<dependency>
-				<groupId>org.jboss.dna</groupId>
-				<artifactId>dna-sequencer-mp3</artifactId>
-				<version>${pom.version}</version>
-			</dependency>
-			<dependency>
-				<groupId>org.jboss.dna</groupId>
-				<artifactId>dna-sequencer-msoffice</artifactId>
-				<version>${pom.version}</version>
-			</dependency>
-			<dependency>
-				<groupId>org.jboss.dna</groupId>
-				<artifactId>dna-sequencer-xml</artifactId>
-				<version>${pom.version}</version>
-			</dependency>
-			<dependency>
-				<groupId>org.jboss.dna</groupId>
-				<artifactId>dna-sequencer-zip</artifactId>
-				<version>${pom.version}</version>
-			</dependency>
-			<!-- 
-		    Time and Date
-		    -->
-			<dependency>
-				<groupId>joda-time</groupId>
-				<artifactId>joda-time</artifactId>
-				<version>1.4</version>
-			</dependency>
-			<!-- 
-		    Rules
-		    -->
-			<dependency>
-				<groupId>jsr94</groupId>
-				<artifactId>jsr94</artifactId>
-				<version>1.1</version>
-			</dependency>
-			<dependency>
-				<groupId>org.drools</groupId>
-				<artifactId>drools-jsr94</artifactId>
-				<version>4.0.7</version>
-				<scope>test</scope>
-			</dependency>
-			<dependency>
-				<groupId>org.drools</groupId>
-				<artifactId>drools-compiler</artifactId>
-				<version>4.0.7</version>
-				<scope>test</scope>
-			</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.4.3</version>
-				<scope>compile</scope>
-			</dependency>
-			<dependency>
-				<groupId>org.slf4j</groupId>
-				<artifactId>slf4j-log4j12</artifactId>
-				<version>1.4.3</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>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>
-			
-			
-		</dependencies>
-	</dependencyManagement>
-	<reporting>
-		<plugins>
-			<plugin>
-				<groupId>org.apache.maven.plugins</groupId>
-				<artifactId>maven-surefire-report-plugin</artifactId>
-			</plugin>
-	    </plugins>
-	</reporting>
-	
-	<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.5/pom.xml (from rev 1042, trunk/pom.xml)
===================================================================
--- tags/dna-0.5/pom.xml	                        (rev 0)
+++ tags/dna-0.5/pom.xml	2009-06-11 15:19:22 UTC (rev 1043)
@@ -0,0 +1,631 @@
+<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.5</version>
+	<packaging>pom</packaging>
+	<name>JBoss DNA</name>
+	<url>http://www.jboss.org/dna</url>
+	<inceptionYear>2008</inceptionYear>
+	<description>
+		JBoss DNA provides tools for working with JCR repositories.
+	</description>
+	<scm>
+		<connection>scm:svn:https://svn.jboss.org/repos/dna/tags/dna-0.5</connection>
+	</scm>
+	<licenses>
+		<license>
+			<name>GNU Lesser General Public License</name>
+			<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>
+		<developer>
+			<name>Bojidar Penchev</name>
+			<id>dcodeboy</id>
+			<email>dcodeboy at gmail.com</email>
+			<roles>
+				<role>Developer</role>
+			</roles>
+			<timezone>+1</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>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-msoffice</module>
+		<module>extensions/dna-sequencer-xml</module>
+		<module>extensions/dna-sequencer-zip</module>
+		<module>extensions/dna-connector-federation</module>
+		<module>extensions/dna-connector-filesystem</module>
+		<module>extensions/dna-connector-jbosscache</module>
+		<module>extensions/dna-connector-svn</module>
+		<module>extensions/dna-connector-store-jpa</module>
+		<module>extensions/dna-mimetype-detector-aperture</module>
+		<module>extensions/dna-common-jdbc</module> 
+		<module>extensions/dna-connector-jdbc-metadata</module> 
+		<module>extensions/dna-web-jcr-rest</module> 
+		<module>extensions/dna-web-jcr-rest-war</module> 
+		<module>dna-integration-tests</module>
+		<module>docs/examples/gettingstarted</module>
+	</modules>
+
+	<profiles>
+		<profile>
+			<id>release</id>
+			<modules>
+				<module>docs</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>
+	      </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>
+	        </plugins>
+	      </build>
+	      <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>
+	</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.maven.plugins</groupId>
+					<artifactId>maven-javadoc-plugin</artifactId>
+					<version>2.2</version>
+					<configuration>
+						<aggregate>true</aggregate>
+            <doclet>net.gleamynode.apiviz.APIviz</doclet>
+	          <docletArtifact>
+	            <groupId>net.gleamynode.apiviz</groupId>
+	            <artifactId>apiviz</artifactId>
+	            <version>1.1.1</version>
+	          </docletArtifact>
+	          <additionalparam>
+	            -charset UTF-8
+	            -docencoding UTF-8
+	            -version
+	            -author
+	            -breakiterator
+	            -linksource
+	            -sourcetab 4
+	            -windowtitle "${project.name} ${project.version} API Reference"
+	            -doctitle "${project.name} ${project.version} API Reference"
+	            -bottom "Copyright ? ${project.inceptionYear}-Present JBoss a division of Red Hat. All Rights Reserved."
+	            -link http://java.sun.com/javase/6/docs/api/
+	          </additionalparam>
+	          <encoding>UTF-8</encoding>
+					</configuration>
+				</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>
+			<!-- 
+           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>
+								${pom.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>${pom.version}</version>
+			</dependency>
+			<dependency>
+				<groupId>org.jboss.dna</groupId>
+				<artifactId>dna-classloader-maven</artifactId>
+				<version>${pom.version}</version>
+			</dependency>
+			<dependency>
+				<groupId>org.jboss.dna</groupId>
+				<artifactId>dna-graph</artifactId>
+				<version>${pom.version}</version>
+			</dependency>
+			<dependency>
+				<groupId>org.jboss.dna</groupId>
+				<artifactId>dna-cnd</artifactId>
+				<version>${pom.version}</version>
+			</dependency>
+			<dependency>
+				<groupId>org.jboss.dna</groupId>
+				<artifactId>dna-repository</artifactId>
+				<version>${pom.version}</version>
+			</dependency>
+			<dependency>
+				<groupId>org.jboss.dna</groupId>
+				<artifactId>dna-jcr</artifactId>
+				<version>${pom.version}</version>
+			</dependency>
+			<dependency>
+				<groupId>org.jboss.dna</groupId>
+				<artifactId>dna-jcr-tck</artifactId>
+				<version>${pom.version}</version>
+			</dependency>
+			<dependency>
+				<groupId>org.jboss.dna</groupId>
+				<artifactId>dna-connector-federation</artifactId>
+				<version>${pom.version}</version>
+			</dependency>
+			<dependency>
+				<groupId>org.jboss.dna</groupId>
+				<artifactId>dna-connector-jbosscache</artifactId>
+				<version>${pom.version}</version>
+			</dependency>
+			<dependency>
+				<groupId>org.jboss.dna</groupId>
+				<artifactId>dna-connector-store-jpa</artifactId>
+				<version>${pom.version}</version>
+			</dependency>
+			<dependency>
+				<groupId>org.jboss.dna</groupId>
+				<artifactId>dna-connector-filesystem</artifactId>
+				<version>${pom.version}</version>
+			</dependency>
+			<dependency>
+				<groupId>org.jboss.dna</groupId>
+				<artifactId>dna-connector-svn</artifactId>
+				<version>${pom.version}</version>
+			</dependency>
+			<dependency>
+				<groupId>org.jboss.dna</groupId>
+				<artifactId>dna-mimetype-detector-aperture</artifactId>
+				<version>${pom.version}</version>
+			</dependency>
+			<dependency>
+				<groupId>org.jboss.dna</groupId>
+				<artifactId>dna-sequencer-cnd</artifactId>
+				<version>${pom.version}</version>
+			</dependency>
+			<dependency>
+				<groupId>org.jboss.dna</groupId>
+				<artifactId>dna-sequencer-images</artifactId>
+				<version>${pom.version}</version>
+			</dependency>
+			<dependency>
+				<groupId>org.jboss.dna</groupId>
+				<artifactId>dna-sequencer-java</artifactId>
+				<version>${pom.version}</version>
+			</dependency>
+			<dependency>
+				<groupId>org.jboss.dna</groupId>
+				<artifactId>dna-sequencer-mp3</artifactId>
+				<version>${pom.version}</version>
+			</dependency>
+			<dependency>
+				<groupId>org.jboss.dna</groupId>
+				<artifactId>dna-sequencer-msoffice</artifactId>
+				<version>${pom.version}</version>
+			</dependency>
+			<dependency>
+				<groupId>org.jboss.dna</groupId>
+				<artifactId>dna-sequencer-xml</artifactId>
+				<version>${pom.version}</version>
+			</dependency>
+			<dependency>
+				<groupId>org.jboss.dna</groupId>
+				<artifactId>dna-sequencer-zip</artifactId>
+				<version>${pom.version}</version>
+			</dependency>
+			<!-- 
+		    Time and Date
+		    -->
+			<dependency>
+				<groupId>joda-time</groupId>
+				<artifactId>joda-time</artifactId>
+				<version>1.4</version>
+			</dependency>
+			<!-- 
+		    Rules
+		    -->
+			<dependency>
+				<groupId>jsr94</groupId>
+				<artifactId>jsr94</artifactId>
+				<version>1.1</version>
+			</dependency>
+			<dependency>
+				<groupId>org.drools</groupId>
+				<artifactId>drools-jsr94</artifactId>
+				<version>4.0.7</version>
+				<scope>test</scope>
+			</dependency>
+			<dependency>
+				<groupId>org.drools</groupId>
+				<artifactId>drools-compiler</artifactId>
+				<version>4.0.7</version>
+				<scope>test</scope>
+			</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.4.3</version>
+				<scope>compile</scope>
+			</dependency>
+			<dependency>
+				<groupId>org.slf4j</groupId>
+				<artifactId>slf4j-log4j12</artifactId>
+				<version>1.4.3</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>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>
+			
+			
+		</dependencies>
+	</dependencyManagement>
+	<reporting>
+		<plugins>
+			<plugin>
+				<groupId>org.apache.maven.plugins</groupId>
+				<artifactId>maven-surefire-report-plugin</artifactId>
+			</plugin>
+	    </plugins>
+	</reporting>
+	
+	<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



From dna-commits at lists.jboss.org  Thu Jun 11 11:19:35 2009
From: dna-commits at lists.jboss.org (dna-commits at lists.jboss.org)
Date: Thu, 11 Jun 2009 11:19:35 -0400
Subject: [dna-commits] DNA SVN: r1044 - in trunk: dna-cnd and 30 other
	directories.
Message-ID: <E1MEm3z-0004fq-Vx@committer01.frg.pub.inap.atl.jboss.com>

Author: rhauch
Date: 2009-06-11 11:19:35 -0400 (Thu, 11 Jun 2009)
New Revision: 1044

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-common-jdbc/pom.xml
   trunk/extensions/dna-connector-federation/pom.xml
   trunk/extensions/dna-connector-filesystem/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-sequencer-cnd/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-xml/pom.xml
   trunk/extensions/dna-sequencer-zip/pom.xml
   trunk/extensions/dna-web-jcr-rest-war/pom.xml
   trunk/extensions/dna-web-jcr-rest/pom.xml
   trunk/pom.xml
Log:
[maven-release-plugin] prepare for next development iteration

Modified: trunk/dna-cnd/pom.xml
===================================================================
--- trunk/dna-cnd/pom.xml	2009-06-11 15:19:22 UTC (rev 1043)
+++ trunk/dna-cnd/pom.xml	2009-06-11 15:19:35 UTC (rev 1044)
@@ -2,7 +2,7 @@
   <parent>
     <artifactId>dna</artifactId>
     <groupId>org.jboss.dna</groupId>
-    <version>0.5</version>
+    <version>0.6-SNAPSHOT</version>
   </parent>
   <modelVersion>4.0.0</modelVersion>
   <groupId>org.jboss.dna</groupId>

Modified: trunk/dna-common/pom.xml
===================================================================
--- trunk/dna-common/pom.xml	2009-06-11 15:19:22 UTC (rev 1043)
+++ trunk/dna-common/pom.xml	2009-06-11 15:19:35 UTC (rev 1044)
@@ -3,7 +3,7 @@
   <parent>
     <groupId>org.jboss.dna</groupId>
     <artifactId>dna</artifactId>
-    <version>0.5</version>
+    <version>0.6-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	2009-06-11 15:19:22 UTC (rev 1043)
+++ trunk/dna-graph/pom.xml	2009-06-11 15:19:35 UTC (rev 1044)
@@ -3,7 +3,7 @@
   <parent>
     <groupId>org.jboss.dna</groupId>
     <artifactId>dna</artifactId>
-    <version>0.5</version>
+    <version>0.6-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	2009-06-11 15:19:22 UTC (rev 1043)
+++ trunk/dna-integration-tests/pom.xml	2009-06-11 15:19:35 UTC (rev 1044)
@@ -3,12 +3,12 @@
   <parent>
     <groupId>org.jboss.dna</groupId>
     <artifactId>dna</artifactId>
-    <version>0.5</version>
+    <version>0.6-SNAPSHOT</version>
   </parent>
   <!-- The groupId and version values are inherited from parent -->
   <artifactId>dna-integration-tests</artifactId>
   <packaging>jar</packaging>
-  <version>0.5</version>
+  <version>0.6-SNAPSHOT</version>
   <name>JBoss DNA Integration Tests</name>
   <url>http://labs.jboss.org/dna</url>
   

Modified: trunk/dna-jcr/pom.xml
===================================================================
--- trunk/dna-jcr/pom.xml	2009-06-11 15:19:22 UTC (rev 1043)
+++ trunk/dna-jcr/pom.xml	2009-06-11 15:19:35 UTC (rev 1044)
@@ -4,7 +4,7 @@
   <parent>
     <groupId>org.jboss.dna</groupId>
     <artifactId>dna</artifactId>
-    <version>0.5</version>
+    <version>0.6-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	2009-06-11 15:19:22 UTC (rev 1043)
+++ trunk/dna-repository/pom.xml	2009-06-11 15:19:35 UTC (rev 1044)
@@ -3,7 +3,7 @@
   <parent>
     <groupId>org.jboss.dna</groupId>
     <artifactId>dna</artifactId>
-    <version>0.5</version>
+    <version>0.6-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	2009-06-11 15:19:22 UTC (rev 1043)
+++ trunk/docs/examples/gettingstarted/pom.xml	2009-06-11 15:19:35 UTC (rev 1044)
@@ -4,7 +4,7 @@
   <groupId>org.jboss.dna.examples</groupId>
   <artifactId>getting_started</artifactId>
   <packaging>pom</packaging>
-  <version>0.5</version>
+  <version>0.6-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	2009-06-11 15:19:22 UTC (rev 1043)
+++ trunk/docs/examples/gettingstarted/repositories/pom.xml	2009-06-11 15:19:35 UTC (rev 1044)
@@ -3,14 +3,14 @@
   <parent>
     <groupId>org.jboss.dna.examples</groupId>
     <artifactId>getting_started</artifactId>
-    <version>0.5</version>
+    <version>0.6-SNAPSHOT</version>
     <relativePath>..</relativePath>
   </parent>
 
   <modelVersion>4.0.0</modelVersion>
   <groupId>org.jboss.dna.examples</groupId>
   <artifactId>dna-example-repositories</artifactId>
-  <version>0.5</version>
+  <version>0.6-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	2009-06-11 15:19:22 UTC (rev 1043)
+++ trunk/docs/examples/gettingstarted/sequencers/pom.xml	2009-06-11 15:19:35 UTC (rev 1044)
@@ -3,14 +3,14 @@
   <parent>
     <groupId>org.jboss.dna.examples</groupId>
     <artifactId>getting_started</artifactId>
-    <version>0.5</version>
+    <version>0.6-SNAPSHOT</version>
     <relativePath>..</relativePath>
   </parent>
 
   <modelVersion>4.0.0</modelVersion>
   <groupId>org.jboss.dna.examples</groupId>
   <artifactId>dna-example-sequencers</artifactId>
-  <version>0.5</version>
+  <version>0.6-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	2009-06-11 15:19:22 UTC (rev 1043)
+++ trunk/docs/gettingstarted/pom.xml	2009-06-11 15:19:35 UTC (rev 1044)
@@ -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.5</version>
+  <version>0.6-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	2009-06-11 15:19:22 UTC (rev 1043)
+++ trunk/docs/pom.xml	2009-06-11 15:19:35 UTC (rev 1044)
@@ -2,7 +2,7 @@
   <parent>
     <groupId>org.jboss.dna</groupId>
     <artifactId>dna</artifactId>
-    <version>0.5</version>
+    <version>0.6-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	2009-06-11 15:19:22 UTC (rev 1043)
+++ trunk/docs/reference/pom.xml	2009-06-11 15:19:35 UTC (rev 1044)
@@ -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.5</version>
+  <version>0.6-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	2009-06-11 15:19:22 UTC (rev 1043)
+++ trunk/extensions/dna-classloader-maven/pom.xml	2009-06-11 15:19:35 UTC (rev 1044)
@@ -3,7 +3,7 @@
   <parent>
     <groupId>org.jboss.dna</groupId>
     <artifactId>dna</artifactId>
-    <version>0.5</version>
+    <version>0.6-SNAPSHOT</version>
   </parent>
   <!-- The groupId and version values are inherited from parent -->
   <artifactId>dna-classloader-maven</artifactId>

Modified: trunk/extensions/dna-common-jdbc/pom.xml
===================================================================
--- trunk/extensions/dna-common-jdbc/pom.xml	2009-06-11 15:19:22 UTC (rev 1043)
+++ trunk/extensions/dna-common-jdbc/pom.xml	2009-06-11 15:19:35 UTC (rev 1044)
@@ -3,7 +3,7 @@
   <parent>
     <artifactId>dna</artifactId>
     <groupId>org.jboss.dna</groupId>
-    <version>0.5</version>
+    <version>0.6-SNAPSHOT</version>
     <relativePath>../..</relativePath>
   </parent>
   <!-- The groupId and version values are inherited from parent -->

Modified: trunk/extensions/dna-connector-federation/pom.xml
===================================================================
--- trunk/extensions/dna-connector-federation/pom.xml	2009-06-11 15:19:22 UTC (rev 1043)
+++ trunk/extensions/dna-connector-federation/pom.xml	2009-06-11 15:19:35 UTC (rev 1044)
@@ -4,7 +4,7 @@
   <parent>
     <groupId>org.jboss.dna</groupId>
     <artifactId>dna</artifactId>
-    <version>0.5</version>
+    <version>0.6-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	2009-06-11 15:19:22 UTC (rev 1043)
+++ trunk/extensions/dna-connector-filesystem/pom.xml	2009-06-11 15:19:35 UTC (rev 1044)
@@ -4,7 +4,7 @@
   <parent>
     <groupId>org.jboss.dna</groupId>
     <artifactId>dna</artifactId>
-    <version>0.5</version>
+    <version>0.6-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	2009-06-11 15:19:22 UTC (rev 1043)
+++ trunk/extensions/dna-connector-jbosscache/pom.xml	2009-06-11 15:19:35 UTC (rev 1044)
@@ -4,7 +4,7 @@
   <parent>
     <groupId>org.jboss.dna</groupId>
     <artifactId>dna</artifactId>
-    <version>0.5</version>
+    <version>0.6-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	2009-06-11 15:19:22 UTC (rev 1043)
+++ trunk/extensions/dna-connector-jdbc-metadata/pom.xml	2009-06-11 15:19:35 UTC (rev 1044)
@@ -3,7 +3,7 @@
   <parent>
     <artifactId>dna</artifactId>
     <groupId>org.jboss.dna</groupId>
-    <version>0.5</version>
+    <version>0.6-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	2009-06-11 15:19:22 UTC (rev 1043)
+++ trunk/extensions/dna-connector-store-jpa/pom.xml	2009-06-11 15:19:35 UTC (rev 1044)
@@ -4,7 +4,7 @@
   <parent>
     <groupId>org.jboss.dna</groupId>
     <artifactId>dna</artifactId>
-    <version>0.5</version>
+    <version>0.6-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	2009-06-11 15:19:22 UTC (rev 1043)
+++ trunk/extensions/dna-connector-svn/pom.xml	2009-06-11 15:19:35 UTC (rev 1044)
@@ -3,7 +3,7 @@
 	<parent>
 		<groupId>org.jboss.dna</groupId>
 		<artifactId>dna</artifactId>
-		<version>0.5</version>
+		<version>0.6-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	2009-06-11 15:19:22 UTC (rev 1043)
+++ trunk/extensions/dna-mimetype-detector-aperture/pom.xml	2009-06-11 15:19:35 UTC (rev 1044)
@@ -3,7 +3,7 @@
   <parent>
     <groupId>org.jboss.dna</groupId>
     <artifactId>dna</artifactId>
-    <version>0.5</version>
+    <version>0.6-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	2009-06-11 15:19:22 UTC (rev 1043)
+++ trunk/extensions/dna-sequencer-cnd/pom.xml	2009-06-11 15:19:35 UTC (rev 1044)
@@ -2,7 +2,7 @@
   <parent>
     <artifactId>dna</artifactId>
     <groupId>org.jboss.dna</groupId>
-    <version>0.5</version>
+    <version>0.6-SNAPSHOT</version>
     <relativePath>../..</relativePath>
   </parent>
   <modelVersion>4.0.0</modelVersion>

Modified: trunk/extensions/dna-sequencer-images/pom.xml
===================================================================
--- trunk/extensions/dna-sequencer-images/pom.xml	2009-06-11 15:19:22 UTC (rev 1043)
+++ trunk/extensions/dna-sequencer-images/pom.xml	2009-06-11 15:19:35 UTC (rev 1044)
@@ -3,7 +3,7 @@
   <parent>
     <groupId>org.jboss.dna</groupId>
     <artifactId>dna</artifactId>
-    <version>0.5</version>
+    <version>0.6-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	2009-06-11 15:19:22 UTC (rev 1043)
+++ trunk/extensions/dna-sequencer-java/pom.xml	2009-06-11 15:19:35 UTC (rev 1044)
@@ -3,7 +3,7 @@
 	<parent>
 		<groupId>org.jboss.dna</groupId>
 		<artifactId>dna</artifactId>
-		<version>0.5</version>
+		<version>0.6-SNAPSHOT</version>
 		<relativePath>../..</relativePath>
 	</parent>
 	<!-- The groupId and version values are inherited from parent -->
@@ -47,7 +47,7 @@
 		<dependency>
 			<groupId>org.jboss.dna</groupId>
 			<artifactId>dna-integration-tests</artifactId>
-			<version>0.5</version>
+			<version>0.6-SNAPSHOT</version>
 			<scope>test</scope>
 		</dependency>
 		<!-- 

Modified: trunk/extensions/dna-sequencer-jbpm-jpdl/pom.xml
===================================================================
--- trunk/extensions/dna-sequencer-jbpm-jpdl/pom.xml	2009-06-11 15:19:22 UTC (rev 1043)
+++ trunk/extensions/dna-sequencer-jbpm-jpdl/pom.xml	2009-06-11 15:19:35 UTC (rev 1044)
@@ -3,12 +3,12 @@
 	<parent>
 		<groupId>org.jboss.dna</groupId>
 		<artifactId>dna</artifactId>
-		<version>0.5</version>
+		<version>0.6-SNAPSHOT</version>
 		<relativePath>../..</relativePath>
 	</parent>
 	<artifactId>dna-sequencer-jbpm-jpdl</artifactId>
 	<packaging>jar</packaging>
-	<version>0.5</version>
+	<version>0.6-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	2009-06-11 15:19:22 UTC (rev 1043)
+++ trunk/extensions/dna-sequencer-mp3/pom.xml	2009-06-11 15:19:35 UTC (rev 1044)
@@ -3,7 +3,7 @@
   <parent>
     <artifactId>dna</artifactId>
     <groupId>org.jboss.dna</groupId>
-    <version>0.5</version>
+    <version>0.6-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	2009-06-11 15:19:22 UTC (rev 1043)
+++ trunk/extensions/dna-sequencer-msoffice/pom.xml	2009-06-11 15:19:35 UTC (rev 1044)
@@ -3,7 +3,7 @@
   <parent>
     <artifactId>dna</artifactId>
     <groupId>org.jboss.dna</groupId>
-    <version>0.5</version>
+    <version>0.6-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	2009-06-11 15:19:22 UTC (rev 1043)
+++ trunk/extensions/dna-sequencer-xml/pom.xml	2009-06-11 15:19:35 UTC (rev 1044)
@@ -3,7 +3,7 @@
   <parent>
     <groupId>org.jboss.dna</groupId>
     <artifactId>dna</artifactId>
-    <version>0.5</version>
+    <version>0.6-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	2009-06-11 15:19:22 UTC (rev 1043)
+++ trunk/extensions/dna-sequencer-zip/pom.xml	2009-06-11 15:19:35 UTC (rev 1044)
@@ -3,7 +3,7 @@
   <parent>
     <artifactId>dna</artifactId>
     <groupId>org.jboss.dna</groupId>
-    <version>0.5</version>
+    <version>0.6-SNAPSHOT</version>
     <relativePath>../..</relativePath>
   </parent>
   <!-- The groupId and version values are inherited from parent -->

Modified: trunk/extensions/dna-web-jcr-rest/pom.xml
===================================================================
--- trunk/extensions/dna-web-jcr-rest/pom.xml	2009-06-11 15:19:22 UTC (rev 1043)
+++ trunk/extensions/dna-web-jcr-rest/pom.xml	2009-06-11 15:19:35 UTC (rev 1044)
@@ -3,7 +3,7 @@
 	<parent>
 		<artifactId>dna</artifactId>
 		<groupId>org.jboss.dna</groupId>
-		<version>0.5</version>
+		<version>0.6-SNAPSHOT</version>
 		<relativePath>../..</relativePath>
 	</parent>
 	<artifactId>dna-web-jcr-rest</artifactId>

Modified: trunk/extensions/dna-web-jcr-rest-war/pom.xml
===================================================================
--- trunk/extensions/dna-web-jcr-rest-war/pom.xml	2009-06-11 15:19:22 UTC (rev 1043)
+++ trunk/extensions/dna-web-jcr-rest-war/pom.xml	2009-06-11 15:19:35 UTC (rev 1044)
@@ -3,7 +3,7 @@
 	<parent>
 		<artifactId>dna</artifactId>
 		<groupId>org.jboss.dna</groupId>
-		<version>0.5</version>
+		<version>0.6-SNAPSHOT</version>
 		<relativePath>../..</relativePath>
 	</parent>
 	<artifactId>dna-web-jcr-rest-war</artifactId>

Modified: trunk/pom.xml
===================================================================
--- trunk/pom.xml	2009-06-11 15:19:22 UTC (rev 1043)
+++ trunk/pom.xml	2009-06-11 15:19:35 UTC (rev 1044)
@@ -2,7 +2,7 @@
 	<modelVersion>4.0.0</modelVersion>
 	<groupId>org.jboss.dna</groupId>
 	<artifactId>dna</artifactId>
-	<version>0.5</version>
+	<version>0.6-SNAPSHOT</version>
 	<packaging>pom</packaging>
 	<name>JBoss DNA</name>
 	<url>http://www.jboss.org/dna</url>
@@ -11,7 +11,7 @@
 		JBoss DNA provides tools for working with JCR repositories.
 	</description>
 	<scm>
-		<connection>scm:svn:https://svn.jboss.org/repos/dna/tags/dna-0.5</connection>
+		<connection>scm:svn:https://svn.jboss.org/repos/dna/trunk</connection>
 	</scm>
 	<licenses>
 		<license>



From dna-commits at lists.jboss.org  Thu Jun 11 11:52:25 2009
From: dna-commits at lists.jboss.org (dna-commits at lists.jboss.org)
Date: Thu, 11 Jun 2009 11:52:25 -0400
Subject: [dna-commits] DNA SVN: r1045 - in trunk/docs:
	reference/src/main/docbook/en-US and 1 other directories.
Message-ID: <E1MEmZl-0005wb-0b@committer01.frg.pub.inap.atl.jboss.com>

Author: rhauch
Date: 2009-06-11 11:52:24 -0400 (Thu, 11 Jun 2009)
New Revision: 1045

Modified:
   trunk/docs/gettingstarted/src/main/docbook/en-US/custom.dtd
   trunk/docs/reference/src/main/docbook/en-US/content/developers/tools.xml
   trunk/docs/reference/src/main/docbook/en-US/custom.dtd
Log:
Changed the document versions to 0.6 to reflect the recent release.  Also added a bit more detail about how to deploy the DNA artifacts to the JBoss Maven repository.

Modified: trunk/docs/gettingstarted/src/main/docbook/en-US/custom.dtd
===================================================================
--- trunk/docs/gettingstarted/src/main/docbook/en-US/custom.dtd	2009-06-11 15:19:35 UTC (rev 1044)
+++ trunk/docs/gettingstarted/src/main/docbook/en-US/custom.dtd	2009-06-11 15:52:24 UTC (rev 1045)
@@ -1,4 +1,4 @@
-<!ENTITY versionNumber "0.5">
+<!ENTITY versionNumber "0.6">
 <!ENTITY copyrightYears "2008-2009">
 <!ENTITY copyrightHolder "Red Hat, Inc.">
 

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	2009-06-11 15:19:35 UTC (rev 1044)
+++ trunk/docs/reference/src/main/docbook/en-US/content/developers/tools.xml	2009-06-11 15:52:24 UTC (rev 1045)
@@ -481,7 +481,18 @@
 				</para>
 			</note>
 			<para>
-				The artifacts are deployed to the local file system, which is comprised of a local checkout of the JBoss Maven2 repository 
+				The release has been performed, but we still need to build and deploy the <emphasis>real</emphasis> artifacts
+				to the JBoss Maven repository.  To do
+				this, go to a working area and check out the recently-produced SVN tag (using the correct <code>{release-number}</code>):
+			</para>
+			<programlisting>$ svn checkout https://anonsvn.jboss.org/repos/dna/tags/dna-{release-number}/</programlisting>
+			<para>
+				Then, go into the new directory, and perform a Maven deploy:
+			<para>
+				<programlisting>$ mvn clean deploy</programlisting>
+			<para>
+				This will rebuild all the artifacts (from your local copy of the <emphasis>tagged</emphasis> source) and deploy them
+				to the local file system, which is comprised of a local checkout of the JBoss Maven2 repository 
 				in a location specified by a combination of the <code>&lt;distributionManagement&gt;</code> section of several <code>pom.xml</code> 
 				files and your personal <code>settings.xml</code> file.  Once this Maven command completes, you will need to 
 				commit the new files after they are deployed.  For more information, see the 

Modified: trunk/docs/reference/src/main/docbook/en-US/custom.dtd
===================================================================
--- trunk/docs/reference/src/main/docbook/en-US/custom.dtd	2009-06-11 15:19:35 UTC (rev 1044)
+++ trunk/docs/reference/src/main/docbook/en-US/custom.dtd	2009-06-11 15:52:24 UTC (rev 1045)
@@ -1,4 +1,4 @@
-<!ENTITY versionNumber "0.5">
+<!ENTITY versionNumber "0.6">
 <!ENTITY copyrightYears "2008-2009">
 <!ENTITY copyrightHolder "Red Hat, Inc.">
 



From dna-commits at lists.jboss.org  Thu Jun 11 17:23:34 2009
From: dna-commits at lists.jboss.org (dna-commits at lists.jboss.org)
Date: Thu, 11 Jun 2009 17:23:34 -0400
Subject: [dna-commits] DNA SVN: r1046 -
	trunk/dna-jcr/src/main/java/org/jboss/dna/jcr.
Message-ID: <E1MErkE-0004VP-4H@committer01.frg.pub.inap.atl.jboss.com>

Author: bcarothers
Date: 2009-06-11 17:23:33 -0400 (Thu, 11 Jun 2009)
New Revision: 1046

Modified:
   trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/SessionCache.java
Log:
DNA-459 Mandatory Child Nodes Can Be Removed

Applied patch that conservatively inspects every changed node (and its parent) to determine if node type definitions are violated.

As an aside, by spec, DNA has to let mandatory child nodes be removed, it just cannot allow their parents to be saved if no replacement child node was re-added.

Modified: trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/SessionCache.java
===================================================================
--- trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/SessionCache.java	2009-06-11 15:52:24 UTC (rev 1045)
+++ trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/SessionCache.java	2009-06-11 21:23:33 UTC (rev 1046)
@@ -386,6 +386,12 @@
                                               boolean checkSns )
         throws ConstraintViolationException, ItemExistsException, RepositoryException {
 
+        assert nodeUuid != null;
+        
+        if (this.deletedNodes.containsKey(nodeUuid)) {
+            nodeUuid = this.deletedNodes.get(nodeUuid).getParent();
+        }
+        
         NodeInfo nodeInfo = findNodeInfo(nodeUuid);
         AbstractJcrNode node = findJcrNode(nodeUuid);
 
@@ -631,9 +637,9 @@
      */
     public void save() throws RepositoryException {
         if (operations.isExecuteRequired()) {
-            for (UUID changedUuid : changedNodes.keySet()) {
-                checkAgainstTypeDefinitions(changedUuid, false);
-            }
+			for (UUID changedUuid : this.changedNodes.keySet()) {
+            	checkAgainstTypeDefinitions(changedUuid, false);
+	        }
 
             // Execute the batched operations ...
             try {
@@ -726,6 +732,11 @@
              */
             Set<UUID> uuidsUnderBranch = new HashSet<UUID>();
             LinkedList<UUID> peersToCheck = new LinkedList<UUID>();
+         
+         	for (UUID changedUuid : branchUuids) {
+         		checkAgainstTypeDefinitions(changedUuid, false);
+	        }
+
             for (UUID branchUuid : branchUuids) {
                 uuidsUnderBranch.add(branchUuid);
                 ChangedNodeInfo changedNode = changedNodes.get(branchUuid);
@@ -749,12 +760,6 @@
                 }
             }
 
-            for (UUID changedUuid : uuidsUnderBranch) {
-                if (!this.deletedNodes.containsKey(changedUuid)) {
-                    checkAgainstTypeDefinitions(changedUuid, false);
-                }
-            }
-
             // Now execute the branch ...
             Graph.Batch branchBatch = store.batch(new BatchRequestBuilder(branchRequests));
             try {



From dna-commits at lists.jboss.org  Thu Jun 11 21:07:00 2009
From: dna-commits at lists.jboss.org (dna-commits at lists.jboss.org)
Date: Thu, 11 Jun 2009 21:07:00 -0400
Subject: [dna-commits] DNA SVN: r1047 - in trunk/dna-jcr: .settings and 3
	other directories.
Message-ID: <E1MEvES-00068B-Eo@committer01.frg.pub.inap.atl.jboss.com>

Author: bcarothers
Date: 2009-06-11 21:07:00 -0400 (Thu, 11 Jun 2009)
New Revision: 1047

Added:
   trunk/dna-jcr/.settings/
   trunk/dna-jcr/.settings/org.eclipse.jdt.core.prefs
   trunk/dna-jcr/.settings/org.eclipse.wst.common.component
   trunk/dna-jcr/.settings/org.eclipse.wst.common.project.facet.core.xml
   trunk/dna-jcr/src/test/java/org/jboss/dna/jcr/DnaTckTest.java
Modified:
   trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/AbstractJcrNode.java
   trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/JcrSession.java
   trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/SessionCache.java
   trunk/dna-jcr/src/test/java/org/jboss/dna/jcr/AbstractJcrAccessTest.java
   trunk/dna-jcr/src/test/java/org/jboss/dna/jcr/ImportExportTest.java
   trunk/dna-jcr/src/test/java/org/jboss/dna/jcr/InMemoryRepositoryStub.java
   trunk/dna-jcr/src/test/java/org/jboss/dna/jcr/JcrPropertyDefinitionTest.java
   trunk/dna-jcr/src/test/java/org/jboss/dna/jcr/JcrRepositoryTest.java
   trunk/dna-jcr/src/test/java/org/jboss/dna/jcr/JcrSessionTest.java
   trunk/dna-jcr/src/test/java/org/jboss/dna/jcr/JcrWorkspaceTest.java
   trunk/dna-jcr/src/test/java/org/jboss/dna/jcr/MixinTest.java
   trunk/dna-jcr/src/test/java/org/jboss/dna/jcr/RepositoryNodeTypeManagerTest.java
   trunk/dna-jcr/src/test/resources/security/tck_roles.properties
   trunk/dna-jcr/src/test/resources/security/tck_users.properties
Log:
DNA-399 Need to Add Session.checkPermission Calls to Guard Read, Add Node, Set Property, and Remove Item Access

Applied patch that adds permission checks to item reads, item removes, property modification and node addition calls and adds a new test case that extends the JR TCK framework, and adds a new workspace in RepositoryStubImpl creatively named 'otherWorkspace';

Adding the extra workspace will cause some false regressions in the nightly TCK run as it enables 3 cloning tests that silently passed when there was only one workspace in the repository.

I will leave this defect open for a few days (and probably post a forum topic) to try to get some feedback on if this is sufficient security for the 1.0 release.  I am curious whether there is any interest in being able to assign roles on a per repository and workspace basis in the case of multiple repositories feeding from a single JAAS source, if there is interest in adding an admin role that is required for type and namespace registration, or any other needed enhancements.

Added: trunk/dna-jcr/.settings/org.eclipse.jdt.core.prefs
===================================================================
--- trunk/dna-jcr/.settings/org.eclipse.jdt.core.prefs	                        (rev 0)
+++ trunk/dna-jcr/.settings/org.eclipse.jdt.core.prefs	2009-06-12 01:07:00 UTC (rev 1047)
@@ -0,0 +1,7 @@
+#Fri May 15 17:59:45 EDT 2009
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6
+org.eclipse.jdt.core.compiler.compliance=1.6
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.source=1.6

Added: trunk/dna-jcr/.settings/org.eclipse.wst.common.component
===================================================================
--- trunk/dna-jcr/.settings/org.eclipse.wst.common.component	                        (rev 0)
+++ trunk/dna-jcr/.settings/org.eclipse.wst.common.component	2009-06-12 01:07:00 UTC (rev 1047)
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project-modules id="moduleCoreId" project-version="1.5.0">
+    <wb-module deploy-name="dna-jcr">
+        <wb-resource deploy-path="/" source-path="/src/main/java"/>
+        <wb-resource deploy-path="/" source-path="/src/main/resources"/>
+        <wb-resource deploy-path="/" source-path="/src/test/java"/>
+        <wb-resource deploy-path="/" source-path="/src/test/resources"/>
+    </wb-module>
+</project-modules>

Added: trunk/dna-jcr/.settings/org.eclipse.wst.common.project.facet.core.xml
===================================================================
--- trunk/dna-jcr/.settings/org.eclipse.wst.common.project.facet.core.xml	                        (rev 0)
+++ trunk/dna-jcr/.settings/org.eclipse.wst.common.project.facet.core.xml	2009-06-12 01:07:00 UTC (rev 1047)
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<faceted-project>
+  <installed facet="jst.java" version="6.0"/>
+  <installed facet="jst.utility" version="1.0"/>
+</faceted-project>


Property changes on: trunk/dna-jcr/.settings/org.eclipse.wst.common.project.facet.core.xml
___________________________________________________________________
Name: svn:keywords
   + Id Revision
Name: svn:eol-style
   + LF

Modified: trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/AbstractJcrNode.java
===================================================================
--- trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/AbstractJcrNode.java	2009-06-11 21:23:33 UTC (rev 1046)
+++ trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/AbstractJcrNode.java	2009-06-12 01:07:00 UTC (rev 1047)
@@ -478,7 +478,8 @@
         // It's just a name, so look for it directly ...
         Property property = getProperty(nameFrom(relativePath));
         if (property != null) return property;
-        throw new PathNotFoundException();
+        I18n msg = JcrI18n.pathNotFoundRelativeTo;
+        throw new PathNotFoundException(msg.text(relativePath, getPath(), cache.workspaceName()));
     }
 
     /**

Modified: trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/JcrSession.java
===================================================================
--- trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/JcrSession.java	2009-06-11 21:23:33 UTC (rev 1046)
+++ trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/JcrSession.java	2009-06-12 01:07:00 UTC (rev 1047)
@@ -81,9 +81,14 @@
 
     private static final String[] NO_ATTRIBUTES_NAMES = new String[] {};
 
-    private static final String READ_PERMISSION = "readonly";
-    private static final String WRITE_PERMISSION = "readwrite";
+    public static final String DNA_READ_PERMISSION = "readonly";
+    public static final String DNA_WRITE_PERMISSION = "readwrite";
 
+    public static final String JCR_ADD_NODE_PERMISSION = "add_node";
+    public static final String JCR_SET_PROPERTY_PERMISSION = "set_property";
+    public static final String JCR_REMOVE_PERMISSION = "remove";
+    public static final String JCR_READ_PERMISSION = "read";
+
     /**
      * The repository that created this session.
      */
@@ -305,25 +310,52 @@
         this.checkPermission(executionContext.getValueFactories().getPathFactory().create(path), actions);
     }
 
+    /**
+     * Throws an {@link AccessControlException} if the current user does not have permission for all of the named actions in the
+     * current workspace, otherwise returns silently.
+     * <p>
+     * The {@code path} parameter is included for future use and is currently ignored
+     * </p>
+     * 
+     * @param path the path on which the actions are occurring
+     * @param actions a comma-delimited list of actions to check
+     */
     void checkPermission( Path path,
-                                 String actions ) {
+                          String actions ) {
+        checkPermission(this.workspace().getName(), path, actions);
+    }
 
-        CheckArg.isNotNull(path, "path");
+    /**
+     * Throws an {@link AccessControlException} if the current user does not have permission for all of the named actions in the
+     * named workspace, otherwise returns silently.
+     * <p>
+     * The {@code path} parameter is included for future use and is currently ignored
+     * </p>
+     * 
+     * @param workspaceName the name of the workspace in which the path exists
+     * @param path the path on which the actions are occurring
+     * @param actions a comma-delimited list of actions to check
+     */
+    void checkPermission( String workspaceName,
+                          Path path,
+                          String actions ) {
+
         CheckArg.isNotEmpty(actions, "actions");
 
         if ("read".equals(actions)) {
             // readonly access is sufficient
-            if (hasRole(READ_PERMISSION) || hasRole(READ_PERMISSION + "." + this.workspace.getName())) {
+            if (hasRole(DNA_READ_PERMISSION) || hasRole(DNA_READ_PERMISSION + "." + workspaceName)) {
                 return;
             }
         }
 
         // need readwrite access
-        if (hasRole(WRITE_PERMISSION) || hasRole(WRITE_PERMISSION + "." + this.workspace.getName())) {
+        if (hasRole(DNA_WRITE_PERMISSION) || hasRole(DNA_WRITE_PERMISSION + "." + workspaceName)) {
             return;
         }
 
-        throw new AccessControlException(JcrI18n.permissionDenied.text(path, actions));
+        String pathAsString = path != null ? path.getString(this.namespaces()) : "<unknown>";
+        throw new AccessControlException(JcrI18n.permissionDenied.text(pathAsString, actions));
 
     }
 

Modified: trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/SessionCache.java
===================================================================
--- trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/SessionCache.java	2009-06-11 21:23:33 UTC (rev 1046)
+++ trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/SessionCache.java	2009-06-12 01:07:00 UTC (rev 1047)
@@ -23,6 +23,7 @@
  */
 package org.jboss.dna.jcr;
 
+import java.security.AccessControlException;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
@@ -36,6 +37,7 @@
 import java.util.Set;
 import java.util.Stack;
 import java.util.UUID;
+import javax.jcr.AccessDeniedException;
 import javax.jcr.InvalidItemStateException;
 import javax.jcr.Item;
 import javax.jcr.ItemExistsException;
@@ -229,6 +231,23 @@
     }
 
     /**
+     * Checks whether the current session has the appropriate permissions to perform the given action.
+     * 
+     * @param the node on which the action will be performed
+     * @param action the name of the action to perform, should be "add_node", "remove", or "set_property"
+     * @throws AccessDeniedException if the current session does not have the requisite privileges to perform this task
+     * @throws RepositoryException if any other error occurs
+     */
+    private void checkPermission( NodeInfo node,
+                                  String action ) throws AccessDeniedException, RepositoryException {
+        try {
+            this.session.checkPermission(SessionCache.this.getPathFor(node), action);
+        } catch (AccessControlException ace) {
+            throw new AccessDeniedException(ace);
+        }
+    }
+
+    /**
      * Returns whether the session cache has any pending changes that need to be executed.
      * 
      * @return true if there are pending changes, or false if there is currently no changes
@@ -387,11 +406,11 @@
         throws ConstraintViolationException, ItemExistsException, RepositoryException {
 
         assert nodeUuid != null;
-        
+
         if (this.deletedNodes.containsKey(nodeUuid)) {
             nodeUuid = this.deletedNodes.get(nodeUuid).getParent();
         }
-        
+
         NodeInfo nodeInfo = findNodeInfo(nodeUuid);
         AbstractJcrNode node = findJcrNode(nodeUuid);
 
@@ -637,9 +656,9 @@
      */
     public void save() throws RepositoryException {
         if (operations.isExecuteRequired()) {
-			for (UUID changedUuid : this.changedNodes.keySet()) {
-            	checkAgainstTypeDefinitions(changedUuid, false);
-	        }
+            for (UUID changedUuid : this.changedNodes.keySet()) {
+                checkAgainstTypeDefinitions(changedUuid, false);
+            }
 
             // Execute the batched operations ...
             try {
@@ -732,11 +751,11 @@
              */
             Set<UUID> uuidsUnderBranch = new HashSet<UUID>();
             LinkedList<UUID> peersToCheck = new LinkedList<UUID>();
-         
-         	for (UUID changedUuid : branchUuids) {
-         		checkAgainstTypeDefinitions(changedUuid, false);
-	        }
 
+            for (UUID changedUuid : branchUuids) {
+                checkAgainstTypeDefinitions(changedUuid, false);
+            }
+
             for (UUID branchUuid : branchUuids) {
                 uuidsUnderBranch.add(branchUuid);
                 ChangedNodeInfo changedNode = changedNodes.get(branchUuid);
@@ -1053,18 +1072,38 @@
          * @return the identifier for the property; never null
          * @throws ConstraintViolationException if the property could not be set because of a node type constraint or property
          *         definition constraint
+         * @throws AccessDeniedException if the current session does not have the requisite privileges to perform this task
          * @throws RepositoryException if any other error occurs
          */
         public PropertyId setProperty( Name name,
-                                       JcrValue value ) throws ConstraintViolationException, RepositoryException {
+                                       JcrValue value )
+            throws AccessDeniedException, ConstraintViolationException, RepositoryException {
             return setProperty(name, value, true);
         }
 
+        /**
+         * Set the value for the property. If the property does not exist, it will be added. If the property does exist, the
+         * existing values will be replaced with the supplied value. Protected property definitions may be considered, based on
+         * the {@code skipProtected} flag.
+         * 
+         * @param name the property name; may not be null
+         * @param value the new property values; may not be null
+         * @param skipProtected indicates whether protected property definitions should be ignored
+         * @return the identifier for the property; never null
+         * @throws ConstraintViolationException if the property could not be set because of a node type constraint or property
+         *         definition constraint
+         * @throws AccessDeniedException if the current session does not have the requisite privileges to perform this task
+         * @throws RepositoryException if any other error occurs
+         */
         public PropertyId setProperty( Name name,
                                        JcrValue value,
-                                       boolean skipProtected ) throws ConstraintViolationException, RepositoryException {
+                                       boolean skipProtected )
+            throws AccessDeniedException, ConstraintViolationException, RepositoryException {
             assert name != null;
             assert value != null;
+
+            SessionCache.this.checkPermission(node, JcrSession.JCR_SET_PROPERTY_PERMISSION);
+
             JcrPropertyDefinition definition = null;
             PropertyId id = null;
 
@@ -1146,12 +1185,13 @@
          * @throws ConstraintViolationException if the property could not be set because of a node type constraint or property
          *         definition constraint
          * @throws javax.jcr.ValueFormatException
-         * @throws RepositoryException
+         * @throws AccessDeniedException if the current session does not have the requisite privileges to perform this task
+         * @throws RepositoryException if any other error occurs
          */
         public PropertyId setProperty( Name name,
                                        Value[] values,
                                        int valueType )
-            throws ConstraintViolationException, RepositoryException, javax.jcr.ValueFormatException {
+            throws AccessDeniedException, ConstraintViolationException, RepositoryException, javax.jcr.ValueFormatException {
             return setProperty(name, values, valueType, true);
         }
 
@@ -1169,16 +1209,18 @@
          * @throws ConstraintViolationException if the property could not be set because of a node type constraint or property
          *         definition constraint
          * @throws javax.jcr.ValueFormatException
-         * @throws RepositoryException
+         * @throws AccessDeniedException if the current session does not have the requisite privileges to perform this task
+         * @throws RepositoryException if any other error occurs
          */
         public PropertyId setProperty( Name name,
                                        Value[] values,
                                        int valueType,
                                        boolean skipProtected )
-            throws ConstraintViolationException, RepositoryException, javax.jcr.ValueFormatException {
+            throws AccessDeniedException, ConstraintViolationException, RepositoryException, javax.jcr.ValueFormatException {
             assert name != null;
             assert values != null;
 
+            SessionCache.this.checkPermission(node, JcrSession.JCR_SET_PROPERTY_PERMISSION);
             checkCardinalityOfExistingProperty(name, true);
 
             int len = values.length;
@@ -1321,8 +1363,12 @@
          * 
          * @param name the property name; may not be null
          * @return true if there was a property with the supplied name, or false if no such property existed
+         * @throws AccessDeniedException if the current session does not have the requisite permissions to remove this property
+         * @throws RepositoryException if any other error occurs
          */
-        public boolean removeProperty( Name name ) {
+        public boolean removeProperty( Name name ) throws AccessDeniedException, RepositoryException {
+            SessionCache.this.checkPermission(node, JcrSession.JCR_REMOVE_PERMISSION);
+
             PropertyInfo info = node.removeProperty(name);
             if (info != null) {
                 operations.remove(name).on(currentLocation);
@@ -1416,8 +1462,8 @@
             if (!definition.getId().equals(node.getDefinitionId())) {
                 // The node definition changed, so try to set the property ...
                 try {
-                    JcrValue value = new JcrValue(factories(), SessionCache.this, PropertyType.STRING, definition.getId()
-                                                                                                                 .getString());
+                    JcrValue value = new JcrValue(factories(), SessionCache.this, PropertyType.STRING,
+                                                  definition.getId().getString());
                     setProperty(DnaIntLexicon.NODE_DEFINITON, value);
                 } catch (ConstraintViolationException e) {
                     // We can't set this property on the node (according to the node definition).
@@ -1521,12 +1567,16 @@
          * @throws InvalidItemStateException if the specified child has been marked for deletion within this session
          * @throws ConstraintViolationException if moving the node into this node violates this node's definition
          * @throws NoSuchNodeTypeException if the node type for the primary type could not be found
+         * @throws AccessDeniedException if the current session does not have the requisite privileges to perform this task
          * @throws RepositoryException if any other error occurs while reading information from the repository
          */
         public ChildNode createChild( Name name,
                                       UUID desiredUuid,
                                       Name primaryTypeName )
-            throws InvalidItemStateException, ConstraintViolationException, RepositoryException {
+            throws InvalidItemStateException, ConstraintViolationException, AccessDeniedException, RepositoryException {
+
+            SessionCache.this.checkPermission(node, JcrSession.JCR_ADD_NODE_PERMISSION);
+
             if (desiredUuid == null) desiredUuid = UUID.randomUUID();
 
             // Verify that this node accepts a child of the supplied name (given any existing SNS nodes) ...
@@ -1666,9 +1716,13 @@
          * and haven't been persisted.
          * 
          * @param nodeUuid the UUID of the child node; may not be null
+         * @throws AccessDeniedException if the current session does not have the requisite privileges to perform this task
+         * @throws RepositoryException if any other error occurs
          * @return true if the child was successfully removed, or false if the node did not exist as a child
          */
-        public boolean destroyChild( UUID nodeUuid ) {
+        public boolean destroyChild( UUID nodeUuid ) throws AccessDeniedException, RepositoryException {
+            SessionCache.this.checkPermission(node, JcrSession.JCR_REMOVE_PERMISSION);
+
             ChildNode deleted = node.removeChild(nodeUuid, pathFactory);
 
             if (deleted != null) {
@@ -1812,14 +1866,18 @@
      * @see #findNodeInfo(UUID, Path)
      * @see #findNodeInfoForRoot()
      */
-    NodeInfo findNodeInfo( UUID uuid ) throws ItemNotFoundException, InvalidItemStateException, RepositoryException {
+    NodeInfo findNodeInfo( UUID uuid )
+        throws AccessDeniedException, ItemNotFoundException, InvalidItemStateException, RepositoryException {
         assert uuid != null;
         // See if we already have something in the cache ...
         NodeInfo info = findNodeInfoInCache(uuid);
         if (info == null) {
             // Nope, so go ahead and load it ...
             info = loadFromGraph(uuid, null);
+
         }
+        SessionCache.this.checkPermission(info, JcrSession.JCR_READ_PERMISSION);
+
         return info;
     }
 
@@ -1903,10 +1961,12 @@
 
         // If the relative path is of zero-length ...
         if (relativePath.size() == 0) {
+            SessionCache.this.checkPermission(fromInfo, JcrSession.JCR_READ_PERMISSION);
             return fromInfo;
         }
         // Or it is of length 1 but it is a self reference ...
         if (relativePath.size() == 1 && relativePath.getLastSegment().isSelfReference()) {
+            SessionCache.this.checkPermission(fromInfo, JcrSession.JCR_READ_PERMISSION);
             return fromInfo;
         }
 
@@ -2000,6 +2060,7 @@
                 }
             }
         }
+        SessionCache.this.checkPermission(info, JcrSession.JCR_READ_PERMISSION);
         return info;
     }
 

Modified: trunk/dna-jcr/src/test/java/org/jboss/dna/jcr/AbstractJcrAccessTest.java
===================================================================
--- trunk/dna-jcr/src/test/java/org/jboss/dna/jcr/AbstractJcrAccessTest.java	2009-06-11 21:23:33 UTC (rev 1046)
+++ trunk/dna-jcr/src/test/java/org/jboss/dna/jcr/AbstractJcrAccessTest.java	2009-06-12 01:07:00 UTC (rev 1047)
@@ -26,6 +26,7 @@
 import static org.hamcrest.core.Is.is;
 import static org.junit.Assert.assertThat;
 import java.io.PrintStream;
+import java.util.Collections;
 import java.util.concurrent.TimeUnit;
 import javax.jcr.Node;
 import javax.jcr.NodeIterator;
@@ -33,6 +34,7 @@
 import org.jboss.dna.graph.ExecutionContext;
 import org.jboss.dna.graph.Graph;
 import org.jboss.dna.graph.MockSecurityContext;
+import org.jboss.dna.graph.SecurityContext;
 import org.jboss.dna.graph.connector.RepositoryConnection;
 import org.jboss.dna.graph.connector.RepositoryConnectionFactory;
 import org.jboss.dna.graph.connector.RepositorySourceException;
@@ -90,7 +92,8 @@
 
         repository = new JcrRepository(context, connectionFactory, "unused");
 
-        session = (JcrSession) repository.login(new SecurityContextCredentials(new MockSecurityContext(null)));
+        SecurityContext mockSecurityContext = new MockSecurityContext("testuser", Collections.singleton(JcrSession.DNA_WRITE_PERMISSION));
+        session = (JcrSession) repository.login(new SecurityContextCredentials(mockSecurityContext));
     }
 
     @After

Added: trunk/dna-jcr/src/test/java/org/jboss/dna/jcr/DnaTckTest.java
===================================================================
--- trunk/dna-jcr/src/test/java/org/jboss/dna/jcr/DnaTckTest.java	                        (rev 0)
+++ trunk/dna-jcr/src/test/java/org/jboss/dna/jcr/DnaTckTest.java	2009-06-12 01:07:00 UTC (rev 1047)
@@ -0,0 +1,186 @@
+package org.jboss.dna.jcr;
+
+import javax.jcr.AccessDeniedException;
+import javax.jcr.Credentials;
+import javax.jcr.Node;
+import javax.jcr.NodeIterator;
+import javax.jcr.PathNotFoundException;
+import javax.jcr.Property;
+import javax.jcr.Session;
+import javax.jcr.SimpleCredentials;
+import org.apache.jackrabbit.test.AbstractJCRTest;
+import org.junit.Test;
+
+/**
+ * Additional DNA tests that check for JCR compliance.
+ *
+ */
+public class DnaTckTest extends AbstractJCRTest {
+
+    Session session;
+
+    protected void tearDown() throws Exception {
+        try {
+            superuser.getRootNode().getNode(this.nodeName1).remove();
+            superuser.save();
+        }
+        catch (PathNotFoundException ignore) { } 
+        
+        if (session != null) {
+            session.logout();
+            session = null;
+        }
+        super.tearDown();
+    }
+
+    private void testRead(Session session) throws Exception {
+        Node rootNode = session.getRootNode();
+        
+        for (NodeIterator iter = rootNode.getNodes(); iter.hasNext(); ) {
+            iter.nextNode();
+        }
+    }
+    
+    private void testAddNode(Session session) throws Exception {
+        session.refresh(false);
+        Node root = session.getRootNode();
+        root.addNode(nodeName1, testNodeType);
+        session.save();
+    }
+    
+    private void testRemoveNode(Session session) throws Exception {
+        session.refresh(false);
+        Node root = session.getRootNode();
+        Node node = root.getNode(nodeName1);
+        node.remove();
+        session.save();
+    }
+
+    private void testSetProperty(Session session) throws Exception {
+        session.refresh(false);
+        Node root = session.getRootNode();
+        root.setProperty(this.propertyName1, "test value");
+        session.save();
+        
+    }
+    
+    private void testRemoveProperty(Session session) throws Exception {
+        Session localAdmin = helper.getRepository().login(helper.getSuperuserCredentials(), session.getWorkspace().getName());
+        assertEquals(session.getWorkspace().getName(), superuser.getWorkspace().getName());
+        
+        Node superRoot = localAdmin.getRootNode();
+        Node superNode;
+        try {
+            superNode = superRoot.getNode(this.nodeName1);
+        }
+        catch (PathNotFoundException pnfe) {
+            superNode = superRoot.addNode(nodeName1, testNodeType);
+        }
+        superNode.setProperty(this.propertyName1, "test value");
+
+        localAdmin.save();
+        localAdmin.logout();
+        
+        session.refresh(false);
+        Node root = session.getRootNode();
+        Node node = root.getNode(nodeName1);
+        Property property = node.getProperty(this.propertyName1);
+        property.remove();
+        session.save();
+    }
+    
+    private void testWrite(Session session) throws Exception {
+        testAddNode(session);
+        testSetProperty(session);
+        testRemoveProperty(session);
+        testRemoveNode(session);
+    }
+
+    /**
+     * Tests that read-only sessions can read nodes by loading all of the children of the root node
+     * @throws Exception
+     */
+    public void testShouldAllowReadOnlySessionToRead() throws Exception {
+        session = helper.getReadOnlySession();
+        testRead(session);
+    }
+
+    /**
+     * Tests that read-only sessions cannot add nodes, remove nodes, set nodes, or set properties.
+     * @throws Exception
+     */
+    public void testShouldNotAllowReadOnlySessionToWrite() throws Exception {
+        session = helper.getReadOnlySession();
+        try {
+            testAddNode(session);
+            fail("Read-only sessions should not be able to add nodes");
+        }
+        catch (AccessDeniedException expected) {
+        }
+        try {
+            testSetProperty(session);
+            fail("Read-only sessions should not be able to set properties");
+        }
+        catch (AccessDeniedException expected) {
+        }
+        try {
+            testRemoveProperty(session);
+            fail("Read-only sessions should not be able to remove properties");
+        }
+        catch (AccessDeniedException expected) {
+        }
+        try {
+            testRemoveNode(session);
+            fail("Read-only sessions should not be able to remove nodes");
+        }
+        catch (AccessDeniedException expected) {
+        }
+    }
+    
+    /**
+     * Tests that read-write sessions can read nodes by loading all of the children of the root node
+     * @throws Exception
+     */
+    @Test
+    public void testShouldAllowReadWriteSessionToRead() throws Exception {
+        session = helper.getReadWriteSession();
+        testRead(session);
+    }
+
+    /**
+     * Tests that read-write sessions can add nodes, remove nodes, set nodes, and set properties.
+     * @throws Exception
+     */
+    @Test
+    public void testShouldAllowReadWriteSessionToWrite() throws Exception {
+        session = helper.getReadWriteSession();
+        testWrite(session);
+    }
+
+    /**
+     * User defaultuser is configured to have readwrite in "otherWorkspace" and readonly in the default
+     * workspace.  This test makes sure both work.
+     * @throws Exception
+     */
+    @Test
+    public void testShouldMapRolesToWorkspacesWhenSpecified() throws Exception {
+        Credentials creds = new SimpleCredentials("defaultonly", "defaultonly".toCharArray());
+        session = helper.getRepository().login(creds);
+
+        testRead(session);
+        testWrite(session);
+        
+        session.logout();
+        
+        session = helper.getRepository().login(creds, "otherWorkspace");
+        testRead(session);
+        try {
+            testWrite(session);
+            fail("User 'defaultuser' should not have write access to 'otherWorkspace'");
+        }
+        catch (AccessDeniedException expected) {
+        }
+        session.logout();
+    }
+
+}


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

Modified: trunk/dna-jcr/src/test/java/org/jboss/dna/jcr/ImportExportTest.java
===================================================================
--- trunk/dna-jcr/src/test/java/org/jboss/dna/jcr/ImportExportTest.java	2009-06-11 21:23:33 UTC (rev 1046)
+++ trunk/dna-jcr/src/test/java/org/jboss/dna/jcr/ImportExportTest.java	2009-06-12 01:07:00 UTC (rev 1047)
@@ -27,11 +27,13 @@
 import static org.junit.Assert.assertThat;
 import java.io.ByteArrayInputStream;
 import java.io.ByteArrayOutputStream;
+import java.util.Collections;
 import javax.jcr.ImportUUIDBehavior;
 import javax.jcr.Node;
 import org.jboss.dna.graph.ExecutionContext;
 import org.jboss.dna.graph.Graph;
 import org.jboss.dna.graph.MockSecurityContext;
+import org.jboss.dna.graph.SecurityContext;
 import org.jboss.dna.graph.connector.RepositoryConnection;
 import org.jboss.dna.graph.connector.RepositoryConnectionFactory;
 import org.jboss.dna.graph.connector.RepositorySourceException;
@@ -98,7 +100,8 @@
 
         repository = new JcrRepository(context, connectionFactory, "unused");
 
-        session = (JcrSession) repository.login(new SecurityContextCredentials(new MockSecurityContext(null)));
+        SecurityContext mockSecurityContext = new MockSecurityContext("testuser", Collections.singleton(JcrSession.DNA_WRITE_PERMISSION));
+        session = (JcrSession) repository.login(new SecurityContextCredentials(mockSecurityContext));
     }
 
     @After

Modified: trunk/dna-jcr/src/test/java/org/jboss/dna/jcr/InMemoryRepositoryStub.java
===================================================================
--- trunk/dna-jcr/src/test/java/org/jboss/dna/jcr/InMemoryRepositoryStub.java	2009-06-11 21:23:33 UTC (rev 1046)
+++ trunk/dna-jcr/src/test/java/org/jboss/dna/jcr/InMemoryRepositoryStub.java	2009-06-12 01:07:00 UTC (rev 1047)
@@ -97,6 +97,8 @@
             // URI xmlContent = new File("src/test/resources/repositoryForTckTests.xml").toURI();
             URI xmlContent = getClass().getClassLoader().getResource("repositoryForTckTests.xml").toURI();
             graph.importXmlFrom(xmlContent).into(destinationPath);
+            
+            graph.createWorkspace().named("otherWorkspace");
 
         } catch (Exception ex) {
             // The TCK tries to quash this exception. Print it out to be more obvious.

Modified: trunk/dna-jcr/src/test/java/org/jboss/dna/jcr/JcrPropertyDefinitionTest.java
===================================================================
--- trunk/dna-jcr/src/test/java/org/jboss/dna/jcr/JcrPropertyDefinitionTest.java	2009-06-11 21:23:33 UTC (rev 1046)
+++ trunk/dna-jcr/src/test/java/org/jboss/dna/jcr/JcrPropertyDefinitionTest.java	2009-06-12 01:07:00 UTC (rev 1047)
@@ -41,6 +41,8 @@
 import javax.jcr.nodetype.PropertyDefinition;
 import org.jboss.dna.graph.ExecutionContext;
 import org.jboss.dna.graph.Graph;
+import org.jboss.dna.graph.MockSecurityContext;
+import org.jboss.dna.graph.SecurityContext;
 import org.jboss.dna.graph.connector.RepositoryConnection;
 import org.jboss.dna.graph.connector.RepositoryConnectionFactory;
 import org.jboss.dna.graph.connector.RepositorySourceException;
@@ -148,7 +150,8 @@
         sessionAttributes.put("attribute1", "value1");
 
         // Now create the workspace ...
-        workspace = new JcrWorkspace(repository, workspaceName, context, sessionAttributes);
+        SecurityContext mockSecurityContext = new MockSecurityContext("testuser", Collections.singleton(JcrSession.DNA_WRITE_PERMISSION));
+        workspace = new JcrWorkspace(repository, workspaceName, context.with(mockSecurityContext), sessionAttributes);
 
         // Create the session and log in ...
         session = (JcrSession)workspace.getSession();

Modified: trunk/dna-jcr/src/test/java/org/jboss/dna/jcr/JcrRepositoryTest.java
===================================================================
--- trunk/dna-jcr/src/test/java/org/jboss/dna/jcr/JcrRepositoryTest.java	2009-06-11 21:23:33 UTC (rev 1046)
+++ trunk/dna-jcr/src/test/java/org/jboss/dna/jcr/JcrRepositoryTest.java	2009-06-12 01:07:00 UTC (rev 1047)
@@ -184,6 +184,7 @@
         repository.login();
     }
 
+    @SuppressWarnings("cast")
     @Test
     public void shouldAllowLoginWithNoCredentialsInPrivilegedBlock() throws Exception {
         LoginContext login = new LoginContext("dna-jcr", new UserPasswordCallbackHandler("superuser", "superuser".toCharArray()));

Modified: trunk/dna-jcr/src/test/java/org/jboss/dna/jcr/JcrSessionTest.java
===================================================================
--- trunk/dna-jcr/src/test/java/org/jboss/dna/jcr/JcrSessionTest.java	2009-06-11 21:23:33 UTC (rev 1046)
+++ trunk/dna-jcr/src/test/java/org/jboss/dna/jcr/JcrSessionTest.java	2009-06-12 01:07:00 UTC (rev 1047)
@@ -61,6 +61,8 @@
 import org.jboss.dna.graph.ExecutionContext;
 import org.jboss.dna.graph.Graph;
 import org.jboss.dna.graph.JaasSecurityContext;
+import org.jboss.dna.graph.MockSecurityContext;
+import org.jboss.dna.graph.SecurityContext;
 import org.jboss.dna.graph.connector.RepositoryConnection;
 import org.jboss.dna.graph.connector.RepositoryConnectionFactory;
 import org.jboss.dna.graph.connector.RepositorySourceException;
@@ -154,7 +156,8 @@
         sessionAttributes.put("attribute1", "value1");
 
         // Now create the workspace ...
-        workspace = new JcrWorkspace(repository, workspaceName, context, sessionAttributes);
+        SecurityContext mockSecurityContext = new MockSecurityContext(null, Collections.singleton(JcrSession.DNA_WRITE_PERMISSION));
+        workspace = new JcrWorkspace(repository, workspaceName, context.with(mockSecurityContext), sessionAttributes);
 
         // Create the session and log in ...
         session = (JcrSession)workspace.getSession();

Modified: trunk/dna-jcr/src/test/java/org/jboss/dna/jcr/JcrWorkspaceTest.java
===================================================================
--- trunk/dna-jcr/src/test/java/org/jboss/dna/jcr/JcrWorkspaceTest.java	2009-06-11 21:23:33 UTC (rev 1046)
+++ trunk/dna-jcr/src/test/java/org/jboss/dna/jcr/JcrWorkspaceTest.java	2009-06-12 01:07:00 UTC (rev 1047)
@@ -155,8 +155,8 @@
         workspace.copy("/a/b", "/b/b-copy");
     }
 
-    @Test( expected = UnsupportedOperationException.class )
-    public void shouldNotAllowCopyFromOtherWorkspace() throws Exception {
+    @Test( expected = IllegalArgumentException.class )
+    public void shouldNotAllowCopyFromOtherWorkspaceWithNullWorkspace() throws Exception {
         workspace.copy(null, null, null);
     }
 

Modified: trunk/dna-jcr/src/test/java/org/jboss/dna/jcr/MixinTest.java
===================================================================
--- trunk/dna-jcr/src/test/java/org/jboss/dna/jcr/MixinTest.java	2009-06-11 21:23:33 UTC (rev 1046)
+++ trunk/dna-jcr/src/test/java/org/jboss/dna/jcr/MixinTest.java	2009-06-12 01:07:00 UTC (rev 1047)
@@ -29,6 +29,7 @@
 import static org.mockito.Mockito.stub;
 import java.io.IOException;
 import java.util.Arrays;
+import java.util.Collections;
 import java.util.EnumMap;
 import java.util.HashMap;
 import java.util.List;
@@ -43,6 +44,8 @@
 import org.jboss.dna.graph.ExecutionContext;
 import org.jboss.dna.graph.Graph;
 import org.jboss.dna.graph.JcrNtLexicon;
+import org.jboss.dna.graph.MockSecurityContext;
+import org.jboss.dna.graph.SecurityContext;
 import org.jboss.dna.graph.connector.RepositoryConnection;
 import org.jboss.dna.graph.connector.RepositoryConnectionFactory;
 import org.jboss.dna.graph.connector.RepositorySourceException;
@@ -160,7 +163,8 @@
         sessionAttributes = new HashMap<String, Object>();
 
         // Now create the workspace ...
-        workspace = new JcrWorkspace(repository, workspaceName, context, sessionAttributes);
+        SecurityContext mockSecurityContext = new MockSecurityContext("testuser", Collections.singleton(JcrSession.DNA_WRITE_PERMISSION));
+        workspace = new JcrWorkspace(repository, workspaceName, context.with(mockSecurityContext), sessionAttributes);
 
         // Create the session and log in ...
         session = (JcrSession)workspace.getSession();

Modified: trunk/dna-jcr/src/test/java/org/jboss/dna/jcr/RepositoryNodeTypeManagerTest.java
===================================================================
--- trunk/dna-jcr/src/test/java/org/jboss/dna/jcr/RepositoryNodeTypeManagerTest.java	2009-06-11 21:23:33 UTC (rev 1046)
+++ trunk/dna-jcr/src/test/java/org/jboss/dna/jcr/RepositoryNodeTypeManagerTest.java	2009-06-12 01:07:00 UTC (rev 1047)
@@ -50,6 +50,8 @@
 import javax.jcr.version.OnParentVersionAction;
 import org.jboss.dna.graph.ExecutionContext;
 import org.jboss.dna.graph.Graph;
+import org.jboss.dna.graph.MockSecurityContext;
+import org.jboss.dna.graph.SecurityContext;
 import org.jboss.dna.graph.connector.RepositoryConnection;
 import org.jboss.dna.graph.connector.RepositoryConnectionFactory;
 import org.jboss.dna.graph.connector.RepositorySourceException;
@@ -144,7 +146,8 @@
         sessionAttributes.put("attribute1", "value1");
 
         // Now create the workspace ...
-        workspace = new JcrWorkspace(repository, workspaceName, context, sessionAttributes);
+        SecurityContext mockSecurityContext = new MockSecurityContext("testuser", Collections.singleton(JcrSession.DNA_READ_PERMISSION));
+        workspace = new JcrWorkspace(repository, workspaceName, context.with(mockSecurityContext), sessionAttributes);
 
         // Create the session and log in ...
         session = (JcrSession)workspace.getSession();

Modified: trunk/dna-jcr/src/test/resources/security/tck_roles.properties
===================================================================
--- trunk/dna-jcr/src/test/resources/security/tck_roles.properties	2009-06-11 21:23:33 UTC (rev 1046)
+++ trunk/dna-jcr/src/test/resources/security/tck_roles.properties	2009-06-12 01:07:00 UTC (rev 1047)
@@ -2,3 +2,5 @@
 superuser=readwrite
 readwrite=readwrite
 readonly=readonly
+# default workspace name is the empty string
+defaultonly=readwrite.,readonly.otherWorkspace

Modified: trunk/dna-jcr/src/test/resources/security/tck_users.properties
===================================================================
--- trunk/dna-jcr/src/test/resources/security/tck_users.properties	2009-06-11 21:23:33 UTC (rev 1046)
+++ trunk/dna-jcr/src/test/resources/security/tck_users.properties	2009-06-12 01:07:00 UTC (rev 1047)
@@ -2,3 +2,4 @@
 superuser=superuser
 readwrite=readwrite
 readonly=readonly
+defaultonly=defaultonly



From dna-commits at lists.jboss.org  Thu Jun 11 21:28:17 2009
From: dna-commits at lists.jboss.org (dna-commits at lists.jboss.org)
Date: Thu, 11 Jun 2009 21:28:17 -0400
Subject: [dna-commits] DNA SVN: r1048 -
	trunk/dna-jcr/src/main/java/org/jboss/dna/jcr.
Message-ID: <E1MEvZ3-00074C-Vb@committer01.frg.pub.inap.atl.jboss.com>

Author: bcarothers
Date: 2009-06-11 21:28:17 -0400 (Thu, 11 Jun 2009)
New Revision: 1048

Modified:
   trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/JcrWorkspace.java
Log:
Adding barely-there partial implementation of Workspace.copy(String,String,String) to repair build after DNA-399 checkin

Modified: trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/JcrWorkspace.java
===================================================================
--- trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/JcrWorkspace.java	2009-06-12 01:07:00 UTC (rev 1047)
+++ trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/JcrWorkspace.java	2009-06-12 01:28:17 UTC (rev 1048)
@@ -32,6 +32,7 @@
 import javax.jcr.InvalidSerializedDataException;
 import javax.jcr.ItemExistsException;
 import javax.jcr.NamespaceRegistry;
+import javax.jcr.NoSuchWorkspaceException;
 import javax.jcr.PathNotFoundException;
 import javax.jcr.RepositoryException;
 import javax.jcr.Session;
@@ -326,7 +327,16 @@
      */
     public void copy( String srcWorkspace,
                       String srcAbsPath,
-                      String destAbsPath ) {
+                      String destAbsPath ) throws NoSuchWorkspaceException {
+        CheckArg.isNotNull(srcWorkspace, "source workspace");
+        CheckArg.isNotNull(srcAbsPath, "source path");
+        CheckArg.isNotNull(destAbsPath, "destination path");
+        
+        if (!graph.getWorkspaces().contains(srcWorkspace)) {
+            throw new NoSuchWorkspaceException(JcrI18n.workspaceNameIsInvalid.text(graph.getSourceName(), this.name));
+        }
+                
+        
         throw new UnsupportedOperationException();
     }
 



From dna-commits at lists.jboss.org  Sat Jun 13 11:56:00 2009
From: dna-commits at lists.jboss.org (dna-commits at lists.jboss.org)
Date: Sat, 13 Jun 2009 11:56:00 -0400
Subject: [dna-commits] DNA SVN: r1049 - in trunk/dna-jcr/src:
	main/resources/org/jboss/dna/jcr and 1 other directories.
Message-ID: <E1MFVaK-0002ES-7M@committer01.frg.pub.inap.atl.jboss.com>

Author: bcarothers
Date: 2009-06-13 11:56:00 -0400 (Sat, 13 Jun 2009)
New Revision: 1049

Modified:
   trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/JcrI18n.java
   trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/JcrNode.java
   trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/JcrNodeType.java
   trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/JcrNodeTypeManager.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
   trunk/dna-jcr/src/test/java/org/jboss/dna/jcr/TypeRegistrationTest.java
Log:
Committed most of unregisterTypes method.  Still need to add check that the type is not in use on any nodes, but this should be much easier after queries are implemented.  Leaving this open until that piece of the issue is corrected.


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	2009-06-12 01:28:17 UTC (rev 1048)
+++ trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/JcrI18n.java	2009-06-13 15:56:00 UTC (rev 1049)
@@ -115,6 +115,7 @@
 
     // Type registration messages
     public static I18n invalidNodeTypeName;
+    public static I18n noSuchNodeType;
     public static I18n nodeTypeAlreadyExists;
     public static I18n invalidPrimaryTypeName;
     public static I18n invalidSupertypeName;
@@ -139,6 +140,10 @@
     public static I18n nodeNotReferenceable;
     public static I18n noPendingChangesAllowed;
 
+    public static I18n cannotUnregisterSupertype;
+    public static I18n cannotUnregisterRequiredPrimaryType;
+    public static I18n cannotUnregisterDefaultPrimaryType;
+
     static {
         try {
             I18n.initialize(JcrI18n.class);

Modified: trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/JcrNode.java
===================================================================
--- trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/JcrNode.java	2009-06-12 01:28:17 UTC (rev 1048)
+++ trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/JcrNode.java	2009-06-13 15:56:00 UTC (rev 1049)
@@ -94,5 +94,4 @@
     public void remove() throws RepositoryException {
         editorForParent().destroyChild(nodeUuid);
     }
-
 }

Modified: trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/JcrNodeType.java
===================================================================
--- trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/JcrNodeType.java	2009-06-12 01:28:17 UTC (rev 1048)
+++ trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/JcrNodeType.java	2009-06-13 15:56:00 UTC (rev 1049)
@@ -165,6 +165,10 @@
         return thisAndAllSupertypes;
     }
 
+    List<JcrNodeType> supertypes() {
+        return allSupertypes;
+    }
+
     /**
      * Get the child definitions defined on this node type (excluding inherited definitions).
      * 

Modified: trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/JcrNodeTypeManager.java
===================================================================
--- trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/JcrNodeTypeManager.java	2009-06-12 01:28:17 UTC (rev 1048)
+++ trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/JcrNodeTypeManager.java	2009-06-13 15:56:00 UTC (rev 1049)
@@ -39,6 +39,7 @@
 import net.jcip.annotations.Immutable;
 import org.jboss.dna.graph.ExecutionContext;
 import org.jboss.dna.graph.property.Name;
+import org.jboss.dna.graph.property.NameFactory;
 import org.jboss.dna.jcr.nodetype.InvalidNodeTypeDefinitionException;
 import org.jboss.dna.jcr.nodetype.NodeDefinitionTemplate;
 import org.jboss.dna.jcr.nodetype.NodeTypeDefinition;
@@ -416,6 +417,32 @@
     }
 
     /**
+     * Allows the collection of node types to be unregistered if they are not referenced by other node types as supertypes,
+     * default primary types of child nodes, or required primary types of child nodes.
+     * <p>
+     * <b>NOTE: This method does not check to see if any of the node types are currently being used. Unregistering a node type
+     * that is being used will cause the system to become unstable</b>
+     * </p>
+     * 
+     * @param nodeTypeNames the names of the node types to be unregistered
+     * @throws NoSuchNodeTypeException if any of the node type names do not correspond to a registered node type
+     * @throws InvalidNodeTypeDefinitionException if any of the node types with the given names cannot be unregistered because
+     *         they are the supertype, one of the required primary types, or a default primary type of a node type that is not
+     *         being unregistered.
+     * @throws RepositoryException if any other error occurs
+     */
+    public void unregisterNodeType( Collection<String> nodeTypeNames )
+        throws NoSuchNodeTypeException, InvalidNodeTypeDefinitionException, RepositoryException {
+        NameFactory nameFactory = this.context.getValueFactories().getNameFactory();
+
+        Collection<Name> names = new ArrayList<Name>(nodeTypeNames.size());
+        for (String name : nodeTypeNames) {
+            names.add(nameFactory.create(name));
+        }
+        repositoryTypeManager.unregisterNodeType(names);
+    }
+
+    /**
      * Returns an empty {@code NodeTypeTemplate} which can then be used to define a node type and passed to
      * {@link JcrNodeTypeManager#registerNodeType(NodeTypeDefinition, boolean)}
      * 

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	2009-06-12 01:28:17 UTC (rev 1048)
+++ trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/RepositoryNodeTypeManager.java	2009-06-13 15:56:00 UTC (rev 1049)
@@ -38,6 +38,7 @@
 import javax.jcr.UnsupportedRepositoryOperationException;
 import javax.jcr.Value;
 import javax.jcr.ValueFormatException;
+import javax.jcr.nodetype.NoSuchNodeTypeException;
 import javax.jcr.nodetype.NodeDefinition;
 import javax.jcr.nodetype.NodeType;
 import javax.jcr.nodetype.PropertyDefinition;
@@ -46,6 +47,7 @@
 import net.jcip.annotations.ThreadSafe;
 import org.jboss.dna.common.text.TextEncoder;
 import org.jboss.dna.common.text.XmlNameEncoder;
+import org.jboss.dna.common.util.CheckArg;
 import org.jboss.dna.graph.ExecutionContext;
 import org.jboss.dna.graph.Graph;
 import org.jboss.dna.graph.Location;
@@ -1100,6 +1102,89 @@
     }
 
     /**
+     * Allows the collection of node types to be unregistered if they are not referenced by other node types as supertypes,
+     * default primary types of child nodes, or required primary types of child nodes.
+     * <p>
+     * <b>NOTE: This method does not check to see if any of the node types are currently being used. Unregistering a node type
+     * that is being used will cause the system to become unstable</b>
+     * </p>
+     * 
+     * @param nodeTypeNames the names of the node types to be unregistered
+     * @throws NoSuchNodeTypeException if any of the node type names do not correspond to a registered node type
+     * @throws InvalidNodeTypeDefinitionException if any of the node types with the given names cannot be unregistered because
+     *         they are the supertype, one of the required primary types, or a default primary type of a node type that is not
+     *         being unregistered.
+     * @throws RepositoryException if any other error occurs
+     */
+    void unregisterNodeType( Collection<Name> nodeTypeNames )
+        throws NoSuchNodeTypeException, InvalidNodeTypeDefinitionException, RepositoryException {
+        CheckArg.isNotNull(nodeTypeNames, "nodeTypeNames");
+        try {
+            /*
+             * Grab an exclusive lock on this data to keep other nodes from being added/saved while the unregistration checks are occurring
+             */
+            nodeTypeManagerLock.writeLock().lock();
+
+            for (Name nodeTypeName : nodeTypeNames) {
+                /*
+                 * Check that the type names are valid
+                 */
+                if (nodeTypeName == null) {
+                    throw new NoSuchNodeTypeException(JcrI18n.invalidNodeTypeName.text());
+                }
+                String name = nodeTypeName.getString(context.getNamespaceRegistry());
+
+                if (!this.nodeTypes.containsKey(nodeTypeName)) {
+                    throw new NoSuchNodeTypeException(JcrI18n.noSuchNodeType.text(name));
+                }
+
+                /*
+                 * Check that no other node definitions have dependencies on any of the named types
+                 */
+                for (JcrNodeType nodeType : nodeTypes.values()) {
+                    // If this node is also being unregistered, don't run checks against it
+                    if (nodeTypeNames.contains(nodeType.getInternalName())) {
+                        continue;
+                    }
+
+                    for (JcrNodeType supertype : nodeType.supertypes()) {
+                        if (nodeTypeName.equals(supertype.getInternalName())) {
+                            throw new InvalidNodeTypeDefinitionException(
+                                                                         JcrI18n.cannotUnregisterSupertype.text(name,
+                                                                                                                supertype.getName()));
+                        }
+                    }
+
+                    for (JcrNodeDefinition childNode : nodeType.childNodeDefinitions()) {
+                        NodeType defaultPrimaryType = childNode.getDefaultPrimaryType();
+                        if (defaultPrimaryType != null && name.equals(defaultPrimaryType.getName())) {
+                            throw new InvalidNodeTypeDefinitionException(
+                                                                         JcrI18n.cannotUnregisterDefaultPrimaryType.text(name,
+                                                                                                                         nodeType.getName(),
+                                                                                                                         childNode.getName()));
+                        }
+                        if (childNode.getRequiredPrimaryTypeNames().contains(nodeTypeName)) {
+                            throw new InvalidNodeTypeDefinitionException(
+                                                                         JcrI18n.cannotUnregisterRequiredPrimaryType.text(name,
+                                                                                                                          nodeType.getName(),
+                                                                                                                          childNode.getName()));
+                        }
+                    }
+                }
+            }
+
+            /*
+             * 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);
+
+        } finally {
+            nodeTypeManagerLock.writeLock().unlock();
+        }
+    }
+
+    /**
      * Registers a new node type or updates an existing node type using the specified definition and returns the resulting {@code
      * NodeType} object.
      * <p>
@@ -1803,15 +1888,13 @@
         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"));
 
             }
@@ -1876,16 +1959,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());
@@ -1899,15 +1981,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"));
 
             }
@@ -1918,16 +1998,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	2009-06-12 01:28:17 UTC (rev 1048)
+++ trunk/dna-jcr/src/main/resources/org/jboss/dna/jcr/JcrI18n.properties	2009-06-13 15:56:00 UTC (rev 1049)
@@ -100,6 +100,7 @@
 invalidQueryLanguage="{0}" is not a valid query langauge.  Supported languages are\: {1}
 
 invalidNodeTypeName=Node types cannot have a null or empty name
+noSuchNodeType=Type named '{0}' does not exist
 nodeTypeAlreadyExists=Node type '{0}' already exists
 invalidPrimaryTypeName=Required primary type '{0}' in type '{1}' does not exist
 invalidSupertypeName=Supertype '{0}' from type '{1}' does not exist
@@ -123,3 +124,7 @@
 
 nodeNotReferenceable=Only referenceable nodes may be the value of reference properties
 noPendingChangesAllowed=This operation cannot be performed when the session has pending changes
+
+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}'
\ No newline at end of file

Modified: trunk/dna-jcr/src/test/java/org/jboss/dna/jcr/TypeRegistrationTest.java
===================================================================
--- trunk/dna-jcr/src/test/java/org/jboss/dna/jcr/TypeRegistrationTest.java	2009-06-12 01:28:17 UTC (rev 1048)
+++ trunk/dna-jcr/src/test/java/org/jboss/dna/jcr/TypeRegistrationTest.java	2009-06-13 15:56:00 UTC (rev 1049)
@@ -25,12 +25,15 @@
 
 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.junit.Assert.fail;
 import java.io.IOException;
 import java.util.Arrays;
 import java.util.List;
 import javax.jcr.PropertyType;
 import javax.jcr.RepositoryException;
+import javax.jcr.nodetype.NoSuchNodeTypeException;
 import javax.jcr.nodetype.NodeDefinition;
 import javax.jcr.nodetype.PropertyDefinition;
 import org.jboss.dna.graph.ExecutionContext;
@@ -41,6 +44,7 @@
 import org.jboss.dna.jcr.nodetype.NodeDefinitionTemplate;
 import org.jboss.dna.jcr.nodetype.NodeTypeDefinition;
 import org.jboss.dna.jcr.nodetype.NodeTypeExistsException;
+import org.jboss.dna.jcr.nodetype.NodeTypeTemplate;
 import org.jboss.dna.jcr.nodetype.PropertyDefinitionTemplate;
 import org.junit.Before;
 import org.junit.Test;
@@ -703,6 +707,103 @@
         compareTemplatesToNodeTypes(templates, repoTypeManager.registerNodeTypes(templates, false));
     }
 
+    /*
+     * Unregistration tests
+     */
+
+    @Test (expected=IllegalArgumentException.class)
+    public void shouldNotAllowUnregisteringNullCollection() throws Exception {
+        repoTypeManager.unregisterNodeType(null);
+    }
+    
+    @Test (expected=NoSuchNodeTypeException.class)
+    public void shouldNotAllowUnregisteringInvalidTypeNames() throws Exception {
+        repoTypeManager.unregisterNodeType(Arrays.asList(new Name[] { JcrNtLexicon.FILE, JcrLexicon.DATA}));
+    }
+
+    @Test (expected=InvalidNodeTypeDefinitionException.class)
+    public void shouldNotAllowUnregisteringSupertype() throws Exception {
+        repoTypeManager.unregisterNodeType(Arrays.asList(new Name[] { JcrNtLexicon.HIERARCHY_NODE, }));
+        
+    }
+
+    @Test (expected=InvalidNodeTypeDefinitionException.class)
+    public void shouldNotAllowUnregisteringRequiredPrimaryType() throws Exception {
+        repoTypeManager.unregisterNodeType(Arrays.asList(new Name[] { JcrNtLexicon.FROZEN_NODE, }));
+    }
+    
+    @Test (expected=InvalidNodeTypeDefinitionException.class)
+    public void shouldNotAllowUnregisteringDefaultPrimaryType() throws Exception {
+        ntTemplate.setName(TEST_TYPE_NAME);
+        
+        JcrNodeDefinitionTemplate childNode = new JcrNodeDefinitionTemplate(this.context);
+        childNode.setDefaultPrimaryType(JcrNtLexicon.FILE.getString(this.registry));
+        ntTemplate.getNodeDefinitionTemplates().add(childNode);
+        
+        try {
+            repoTypeManager.registerNodeType(ntTemplate, false);
+        }
+        catch (Exception ex) {
+            fail(ex.getMessage());
+        }
+        
+        repoTypeManager.unregisterNodeType(Arrays.asList(new Name[] { JcrNtLexicon.FILE, }));
+    }
+
+    @Test 
+    public void shouldAllowUnregisteringUnusedType() throws Exception {
+        ntTemplate.setName(TEST_TYPE_NAME);
+        
+        JcrNodeDefinitionTemplate childNode = new JcrNodeDefinitionTemplate(this.context);
+        childNode.setDefaultPrimaryType(JcrNtLexicon.FILE.getString(this.registry));
+        ntTemplate.getNodeDefinitionTemplates().add(childNode);
+        
+        try {
+            repoTypeManager.registerNodeType(ntTemplate, false);
+        }
+        catch (Exception ex) {
+            fail(ex.getMessage());
+        }
+        
+        Name typeNameAsName = nameFactory.create(TEST_TYPE_NAME);
+        int nodeTypeCount = repoTypeManager.getAllNodeTypes().size();
+        repoTypeManager.unregisterNodeType(Arrays.asList(new Name[] { typeNameAsName }));
+        assertThat(repoTypeManager.getAllNodeTypes().size(), is(nodeTypeCount - 1));
+        assertThat(repoTypeManager.getNodeType(typeNameAsName), is(nullValue()));
+    }
+
+    @Test 
+    public void shouldAllowUnregisteringUnusedTypesWithMutualDependencies() throws Exception {
+        ntTemplate.setName(TEST_TYPE_NAME);
+        
+        JcrNodeDefinitionTemplate childNode = new JcrNodeDefinitionTemplate(this.context);
+        childNode.setDefaultPrimaryType(TEST_TYPE_NAME2);
+        ntTemplate.getNodeDefinitionTemplates().add(childNode);
+
+        NodeTypeTemplate ntTemplate2 = new JcrNodeTypeTemplate(this.context);
+        ntTemplate2.setName(TEST_TYPE_NAME2);
+        
+        JcrNodeDefinitionTemplate childNode2 = new JcrNodeDefinitionTemplate(this.context);
+        childNode2.setDefaultPrimaryType(TEST_TYPE_NAME);
+        ntTemplate2.getNodeDefinitionTemplates().add(childNode2);
+
+        try {
+            repoTypeManager.registerNodeTypes(Arrays.asList(new NodeTypeDefinition[] { ntTemplate, ntTemplate2 }), false);
+        }
+        catch (Exception ex) {
+            fail(ex.getMessage());
+        }
+        
+        Name typeNameAsName = nameFactory.create(TEST_TYPE_NAME);
+        Name type2NameAsName = nameFactory.create(TEST_TYPE_NAME2);
+        int nodeTypeCount = repoTypeManager.getAllNodeTypes().size();
+        repoTypeManager.unregisterNodeType(Arrays.asList(new Name[] { typeNameAsName, type2NameAsName }));
+        assertThat(repoTypeManager.getAllNodeTypes().size(), is(nodeTypeCount - 2));
+        assertThat(repoTypeManager.getNodeType(typeNameAsName), is(nullValue()));
+        assertThat(repoTypeManager.getNodeType(type2NameAsName), is(nullValue()));
+        
+    }
+
     private void compareTemplatesToNodeTypes( List<NodeTypeDefinition> templates,
                                               List<JcrNodeType> nodeTypes ) {
         assertThat(templates.size(), is(nodeTypes.size()));
@@ -826,4 +927,5 @@
         // assertThat(template.getRequiredPrimaryTypeNames(), is(definition.getRequiredPrimaryTypeNames()));
 
     }
+
 }



From dna-commits at lists.jboss.org  Sun Jun 14 18:58:58 2009
From: dna-commits at lists.jboss.org (dna-commits at lists.jboss.org)
Date: Sun, 14 Jun 2009 18:58:58 -0400
Subject: [dna-commits] DNA SVN: r1050 - in trunk:
	dna-graph/src/main/java/org/jboss/dna/graph/connector/federation
	and 5 other directories.
Message-ID: <E1MFyfC-0000Ib-7B@committer01.frg.pub.inap.atl.jboss.com>

Author: bcarothers
Date: 2009-06-14 18:58:57 -0400 (Sun, 14 Jun 2009)
New Revision: 1050

Modified:
   trunk/dna-graph/src/main/java/org/jboss/dna/graph/Graph.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/request/BatchRequestBuilder.java
   trunk/dna-graph/src/main/java/org/jboss/dna/graph/request/CopyBranchRequest.java
   trunk/dna-graph/src/main/java/org/jboss/dna/graph/request/RequestBuilder.java
   trunk/dna-graph/src/test/java/org/jboss/dna/graph/GraphTest.java
   trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/JcrWorkspace.java
   trunk/dna-jcr/src/test/java/org/jboss/dna/jcr/DnaTckTest.java
   trunk/dna-jcr/src/test/java/org/jboss/dna/jcr/JcrWorkspaceTest.java
   trunk/extensions/dna-connector-federation/src/main/java/org/jboss/dna/connector/federation/FederatingRequestProcessor.java
Log:
DNA-453 Implement Workspace.copy(String, String, String)

Applied patch that modifies the copy operation in Graph and Graph.Batch to support the "fromWorkspace" construct, allowing users to specify that the source node is in a workspace other than the current workspace.  The patch also moves the JcrWorkspace.copy(String, String) code into JcrWorkspace.copy(String, String, String) and generalizes it to support source nodes in workspaces other than the workspace represented by the JcrWorkspace.  

The patch modifies JcrWorkspace.copy(String, String) to call JcrWorkspace.copy(String, String, String) with the name of the current workspace as the source workspace.  This allows for the corner cases of the JcrWorkspace.copy(String, String, String) to be tested by the JR TCK tests.  Added an additional test to DnaTckTest to test copying from workspace to another.  For some reason the JR TCK tests don't actually do this.

Finally, the patch adds the concept of UuidConflictBehavior to the copy operation and CopyBranchRequest.  This feature is not yet implemented in the request processors, but is needed in order to implement the JcrWorkspace.clone(...)  and update(String) methods as copies from one workspace to another.

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	2009-06-13 15:56:00 UTC (rev 1049)
+++ trunk/dna-graph/src/main/java/org/jboss/dna/graph/Graph.java	2009-06-14 22:58:57 UTC (rev 1050)
@@ -78,6 +78,7 @@
 import org.jboss.dna.graph.request.Request;
 import org.jboss.dna.graph.request.RequestBuilder;
 import org.jboss.dna.graph.request.UnsupportedRequestException;
+import org.jboss.dna.graph.request.UuidConflictBehavior;
 import org.jboss.dna.graph.request.VerifyWorkspaceRequest;
 import org.jboss.dna.graph.request.CloneWorkspaceRequest.CloneConflictBehavior;
 import org.jboss.dna.graph.request.CreateWorkspaceRequest.CreateConflictBehavior;
@@ -564,17 +565,19 @@
     public Copy<Graph> copy( Location from ) {
         return new CopyAction<Graph>(this, from) {
             @Override
-            protected Graph submit( Locations from,
+            protected Graph submit( String fromWorkspaceName,
+                                    Locations from,
                                     Location into,
                                     Name childName ) {
-                String workspaceName = getCurrentWorkspaceName();
+                String workspaceName = fromWorkspaceName != null ? fromWorkspaceName : getCurrentWorkspaceName();
                 do {
                     requests.copyBranch(from.getLocation(),
                                         workspaceName,
                                         into,
-                                        workspaceName,
+                                        getCurrentWorkspaceName(),
                                         childName,
-                                        NodeConflictBehavior.APPEND);
+                                        NodeConflictBehavior.APPEND,
+                                        UuidConflictBehavior.ALWAYS_CREATE_NEW_UUID);
                 } while ((from = from.next()) != null);
                 return and();
             }
@@ -1734,15 +1737,13 @@
                             }
 
                             public List<Location> under( Location at ) {
-                                return requests.readBlockOfChildren(at, getCurrentWorkspaceName(), startingIndex, blockSize)
-                                               .getChildren();
+                                return requests.readBlockOfChildren(at, getCurrentWorkspaceName(), startingIndex, blockSize).getChildren();
                             }
                         };
                     }
 
                     public List<Location> startingAfter( final Location previousSibling ) {
-                        return requests.readNextBlockOfChildren(previousSibling, getCurrentWorkspaceName(), blockSize)
-                                       .getChildren();
+                        return requests.readNextBlockOfChildren(previousSibling, getCurrentWorkspaceName(), blockSize).getChildren();
                     }
 
                     public List<Location> startingAfter( String pathOfPreviousSibling ) {
@@ -2368,12 +2369,19 @@
             assertNotExecuted();
             return new CopyAction<BatchConjunction>(this.nextRequests, from) {
                 @Override
-                protected BatchConjunction submit( Locations from,
+                protected BatchConjunction submit( String fromWorkspaceName,
+                                                   Locations from,
                                                    Location into,
                                                    Name copyName ) {
-                    String workspaceName = getCurrentWorkspaceName();
+                    String workspaceName = fromWorkspaceName != null ? fromWorkspaceName : getCurrentWorkspaceName();
                     do {
-                        requestQueue.copyBranch(from.getLocation(), workspaceName, into, workspaceName, copyName);
+                        requestQueue.copyBranch(from.getLocation(),
+                                                workspaceName,
+                                                into,
+                                                workspaceName,
+                                                copyName,
+                                                null,
+                                                UuidConflictBehavior.ALWAYS_CREATE_NEW_UUID);
                     } while ((from = from.next()) != null);
                     return and();
                 }
@@ -3993,10 +4001,36 @@
      * @param <Next> The interface that is to be returned when this request is completed
      * @author Randall Hauch
      */
-    public interface Copy<Next> extends To<Next>, Into<Next>, And<Copy<Next>> {
+    public interface Copy<Next>
+        extends WithUuids<FromWorkspace<CopyTarget<Next>>>, FromWorkspace<CopyTarget<Next>>, CopyTarget<Next>, And<Copy<Next>> {
     }
 
+    public interface CopyTarget<Next> extends To<Next>, Into<Next> {
+    }
+
     /**
+     * The interface for specifying that a node should come from a workspace other than the current workspace.
+     * 
+     * @param <Next> The interface that is to be returned when this request is completed
+     */
+    public interface FromWorkspace<Next> {
+        Next fromWorkspace( String workspaceName );
+    }
+
+    /**
+     * The interface for specifying how UUID conflicts should be handled.
+     * 
+     * @param <Next> The interface that is to be returned when this request is completed
+     */
+    public interface WithUuids<Next> {
+        Next removingMatchingUuids();
+
+        Next failingIfUuidsMatch();
+
+        Next unlessMatchingUuidExists();
+    }
+
+    /**
      * The interface for defining additional properties on a new node.
      * 
      * @param <Next> The interface that is to be returned when this create request is completed
@@ -5473,10 +5507,7 @@
         }
 
         public SubgraphNode getNode( Name relativePath ) {
-            Path path = getGraph().getContext()
-                                  .getValueFactories()
-                                  .getPathFactory()
-                                  .create(getLocation().getPath(), relativePath);
+            Path path = getGraph().getContext().getValueFactories().getPathFactory().create(getLocation().getPath(), relativePath);
             path = path.getNormalizedPath();
             return getNode(path);
         }
@@ -5762,12 +5793,16 @@
 
     @NotThreadSafe
     protected abstract class CopyAction<T> extends AbstractAction<T> implements Copy<T> {
-        private final Locations from;
+        protected Locations from;
+        protected String fromWorkspaceName;
+        protected UuidConflictBehavior uuidConflictBehavior;
 
         /*package*/CopyAction( T afterConjunction,
                                 Location from ) {
             super(afterConjunction);
             this.from = new Locations(from);
+            this.fromWorkspaceName = Graph.this.getCurrentWorkspaceName();
+            this.uuidConflictBehavior = UuidConflictBehavior.ALWAYS_CREATE_NEW_UUID;
         }
 
         public Copy<T> and( Location from ) {
@@ -5809,38 +5844,61 @@
         /**
          * Submit any requests to move the targets into the supplied parent location
          * 
+         * @param fromWorkspaceName the name of the workspace containing the {@code from} locations
          * @param from the locations that are being copied
          * @param into the parent location
          * @param nameForCopy the name that should be used for the copy, or null if the name should be the same as the original
          * @return this object, for method chaining
          */
-        protected abstract T submit( Locations from,
-                                     Location into,
-                                     Name nameForCopy );
+        protected abstract T submit( String fromWorkspaceName,
+                           Locations from,
+                           Location into,
+                           Name nameForCopy );
 
+        public FromWorkspace<CopyTarget<T>> failingIfUuidsMatch() {
+            this.uuidConflictBehavior = UuidConflictBehavior.THROW_EXCEPTION;
+            return this;
+        }
+
+        public FromWorkspace<CopyTarget<T>> removingMatchingUuids() {
+            this.uuidConflictBehavior = UuidConflictBehavior.REPLACE_EXISTING_NODE;
+            return this;
+        }
+
+        public FromWorkspace<CopyTarget<T>> unlessMatchingUuidExists() {
+            this.uuidConflictBehavior = UuidConflictBehavior.DO_NOT_COPY;
+            return this;
+        }
+
+        public CopyTarget<T> fromWorkspace( String workspaceName ) {
+            this.fromWorkspaceName = workspaceName;
+
+            return this;
+        }
+
         public T into( Location into ) {
-            return submit(from, into, null);
+            return submit(this.fromWorkspaceName, this.from, into, null);
         }
 
         public T into( Path into ) {
-            return submit(from, Location.create(into), null);
+            return submit(this.fromWorkspaceName, this.from, Location.create(into), null);
         }
 
         public T into( UUID into ) {
-            return submit(from, Location.create(into), null);
+            return submit(this.fromWorkspaceName, this.from, Location.create(into), null);
         }
 
         public T into( Property firstIdProperty,
                        Property... additionalIdProperties ) {
-            return submit(from, Location.create(firstIdProperty, additionalIdProperties), null);
+            return submit(this.fromWorkspaceName, this.from, Location.create(firstIdProperty, additionalIdProperties), null);
         }
 
         public T into( Property into ) {
-            return submit(from, Location.create(into), null);
+            return submit(this.fromWorkspaceName, this.from, Location.create(into), null);
         }
 
         public T into( String into ) {
-            return submit(from, Location.create(createPath(into)), null);
+            return submit(this.fromWorkspaceName, this.from, Location.create(createPath(into)), null);
         }
 
         public T to( Location desiredLocation ) {
@@ -5852,7 +5910,7 @@
                 throw new IllegalArgumentException(GraphI18n.unableToCopyToTheRoot.text(this.from, desiredLocation));
             }
             Path parent = desiredPath.getParent();
-            return submit(from, Location.create(parent), desiredPath.getLastSegment().getName());
+            return submit(this.fromWorkspaceName, this.from, Location.create(parent), desiredPath.getLastSegment().getName());
         }
 
         public T to( Path desiredPath ) {
@@ -5860,7 +5918,7 @@
                 throw new IllegalArgumentException(GraphI18n.unableToCopyToTheRoot.text(this.from, desiredPath));
             }
             Path parent = desiredPath.getParent();
-            return submit(from, Location.create(parent), desiredPath.getLastSegment().getName());
+            return submit(this.fromWorkspaceName, this.from, Location.create(parent), desiredPath.getLastSegment().getName());
         }
 
         public T to( String desiredPath ) {

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	2009-06-13 15:56:00 UTC (rev 1049)
+++ trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/federation/ForkRequestProcessor.java	2009-06-14 22:58:57 UTC (rev 1050)
@@ -1262,7 +1262,8 @@
         // Create the pushed-down request ...
         CopyBranchRequest pushDown = new CopyBranchRequest(fromProxy.location(), fromProxy.workspaceName(), intoProxy.location(),
                                                            intoProxy.workspaceName(), request.desiredName(),
-                                                           request.conflictBehavior());
+                                                           request.nodeConflictBehavior(),
+                                                           request.uuidConflictBehavior());
         // Create the federated request ...
         FederatedRequest federatedRequest = new FederatedRequest(request);
         federatedRequest.add(pushDown, sameLocation, false, fromProxy.projection(), intoProxy.projection());

Modified: trunk/dna-graph/src/main/java/org/jboss/dna/graph/request/BatchRequestBuilder.java
===================================================================
--- trunk/dna-graph/src/main/java/org/jboss/dna/graph/request/BatchRequestBuilder.java	2009-06-13 15:56:00 UTC (rev 1049)
+++ trunk/dna-graph/src/main/java/org/jboss/dna/graph/request/BatchRequestBuilder.java	2009-06-14 22:58:57 UTC (rev 1050)
@@ -572,7 +572,8 @@
                                            String intoWorkspace,
                                            Name nameForCopy ) {
         return add(new CopyBranchRequest(from, fromWorkspace, into, intoWorkspace, nameForCopy,
-                                         CopyBranchRequest.DEFAULT_CONFLICT_BEHAVIOR));
+                                         CopyBranchRequest.DEFAULT_NODE_CONFLICT_BEHAVIOR,
+                                         UuidConflictBehavior.ALWAYS_CREATE_NEW_UUID));
     }
 
     /**
@@ -585,7 +586,10 @@
      * @param nameForCopy the desired name for the node that results from the copy, or null if the name of the original should be
      *        used
      * @param conflictBehavior the expected behavior if an equivalently-named child already exists at the <code>into</code>
-     *        location, or null if the default conflict behavior should be used
+     *        location, or null if the default node conflict behavior should be used
+     * @param uuidConflictBehavior the expected behavior if a node with the same UUID as any of the nodes in the branch under the
+     *        {@code from} location in the {@code fromWorkspace} workspace already exists in the workspace, or null if the default
+     *        UUID conflict behavior should be used
      * @return this builder for method chaining; never null
      * @throws IllegalArgumentException if either of the locations or workspace names are null
      */
@@ -594,9 +598,12 @@
                                            Location into,
                                            String intoWorkspace,
                                            Name nameForCopy,
-                                           NodeConflictBehavior conflictBehavior ) {
-        if (conflictBehavior == null) conflictBehavior = CopyBranchRequest.DEFAULT_CONFLICT_BEHAVIOR;
-        return add(new CopyBranchRequest(from, fromWorkspace, into, intoWorkspace, nameForCopy, conflictBehavior));
+                                           NodeConflictBehavior conflictBehavior,
+                                           UuidConflictBehavior uuidConflictBehavior) {
+        if (conflictBehavior == null) conflictBehavior = CopyBranchRequest.DEFAULT_NODE_CONFLICT_BEHAVIOR;
+        if (uuidConflictBehavior == null) uuidConflictBehavior = CopyBranchRequest.DEFAULT_UUID_CONFLICT_BEHAVIOR;
+        return add(new CopyBranchRequest(from, fromWorkspace, into, intoWorkspace, nameForCopy, conflictBehavior,
+                                         uuidConflictBehavior));
     }
 
     /**
@@ -628,7 +635,8 @@
                                            Location into,
                                            String workspaceName,
                                            Name newNameForNode ) {
-        return add(new MoveBranchRequest(from, into, null, workspaceName, newNameForNode, MoveBranchRequest.DEFAULT_CONFLICT_BEHAVIOR));
+        return add(new MoveBranchRequest(from, into, null, workspaceName, newNameForNode,
+                                         MoveBranchRequest.DEFAULT_CONFLICT_BEHAVIOR));
     }
 
     /**
@@ -647,7 +655,8 @@
                                            Location before,
                                            String workspaceName,
                                            Name newNameForNode ) {
-        return add(new MoveBranchRequest(from, into, before, workspaceName, newNameForNode, MoveBranchRequest.DEFAULT_CONFLICT_BEHAVIOR));
+        return add(new MoveBranchRequest(from, into, before, workspaceName, newNameForNode,
+                                         MoveBranchRequest.DEFAULT_CONFLICT_BEHAVIOR));
     }
 
     /**

Modified: trunk/dna-graph/src/main/java/org/jboss/dna/graph/request/CopyBranchRequest.java
===================================================================
--- trunk/dna-graph/src/main/java/org/jboss/dna/graph/request/CopyBranchRequest.java	2009-06-13 15:56:00 UTC (rev 1049)
+++ trunk/dna-graph/src/main/java/org/jboss/dna/graph/request/CopyBranchRequest.java	2009-06-14 22:58:57 UTC (rev 1050)
@@ -41,14 +41,16 @@
 
     private static final long serialVersionUID = 1L;
 
-    public static final NodeConflictBehavior DEFAULT_CONFLICT_BEHAVIOR = NodeConflictBehavior.APPEND;
+    public static final NodeConflictBehavior DEFAULT_NODE_CONFLICT_BEHAVIOR = NodeConflictBehavior.APPEND;
+    public static final UuidConflictBehavior DEFAULT_UUID_CONFLICT_BEHAVIOR = UuidConflictBehavior.ALWAYS_CREATE_NEW_UUID;
 
     private final Location from;
     private final Location into;
     private final String fromWorkspace;
     private final String intoWorkspace;
     private final Name desiredNameForCopy;
-    private final NodeConflictBehavior conflictBehavior;
+    private final NodeConflictBehavior nodeConflictBehavior;
+    private final UuidConflictBehavior uuidConflictBehavior;
     private Location actualFromLocation;
     private Location actualIntoLocation;
 
@@ -66,7 +68,7 @@
                               String fromWorkspace,
                               Location into,
                               String intoWorkspace ) {
-        this(from, fromWorkspace, into, intoWorkspace, null, DEFAULT_CONFLICT_BEHAVIOR);
+        this(from, fromWorkspace, into, intoWorkspace, null, DEFAULT_NODE_CONFLICT_BEHAVIOR, DEFAULT_UUID_CONFLICT_BEHAVIOR);
     }
 
     /**
@@ -85,7 +87,7 @@
                               Location into,
                               String intoWorkspace,
                               Name nameForCopy ) {
-        this(from, fromWorkspace, into, intoWorkspace, nameForCopy, DEFAULT_CONFLICT_BEHAVIOR);
+        this(from, fromWorkspace, into, intoWorkspace, nameForCopy, DEFAULT_NODE_CONFLICT_BEHAVIOR, DEFAULT_UUID_CONFLICT_BEHAVIOR);
     }
 
     /**
@@ -97,8 +99,10 @@
      * @param intoWorkspace the name of the workspace where the <code>into</code> node is to be copied
      * @param nameForCopy the desired name for the node that results from the copy, or null if the name of the original should be
      *        used
-     * @param conflictBehavior the expected behavior if an equivalently-named child already exists at the <code>into</code>
+     * @param nodeConflictBehavior the expected behavior if an equivalently-named child already exists at the <code>into</code>
      *        location
+     * @param uuidConflictBehavior the expected behavior if a node with the same UUID as any of the nodes in the branch under the
+     *        {@code from} location in the {@code fromWorkspace} workspace already exists in the workspace
      * @throws IllegalArgumentException if any of the parameters are null
      */
     public CopyBranchRequest( Location from,
@@ -106,18 +110,21 @@
                               Location into,
                               String intoWorkspace,
                               Name nameForCopy,
-                              NodeConflictBehavior conflictBehavior ) {
+                              NodeConflictBehavior nodeConflictBehavior,
+                              UuidConflictBehavior uuidConflictBehavior ) {
         CheckArg.isNotNull(from, "from");
         CheckArg.isNotNull(into, "into");
         CheckArg.isNotNull(fromWorkspace, "fromWorkspace");
         CheckArg.isNotNull(intoWorkspace, "intoWorkspace");
-        CheckArg.isNotNull(conflictBehavior, "conflictBehavior");
+        CheckArg.isNotNull(nodeConflictBehavior, "nodeConflictBehavior");
+        CheckArg.isNotNull(uuidConflictBehavior, "uuidConflictBehavior");
         this.from = from;
         this.into = into;
         this.fromWorkspace = fromWorkspace;
         this.intoWorkspace = intoWorkspace;
         this.desiredNameForCopy = nameForCopy;
-        this.conflictBehavior = conflictBehavior;
+        this.nodeConflictBehavior = nodeConflictBehavior;
+        this.uuidConflictBehavior = uuidConflictBehavior;
     }
 
     /**
@@ -191,11 +198,20 @@
      * 
      * @return the behavior specification
      */
-    public NodeConflictBehavior conflictBehavior() {
-        return conflictBehavior;
+    public NodeConflictBehavior nodeConflictBehavior() {
+        return nodeConflictBehavior;
     }
 
     /**
+     * Get the expected behavior when one of the nodes in the branch has the same UUID as an existing node in the workspace.
+     * 
+     * @return the behavior specification
+     */
+    public UuidConflictBehavior uuidConflictBehavior() {
+        return uuidConflictBehavior;
+    }
+
+    /**
      * Sets the actual and complete location of the node being renamed and its new location. This method must be called when
      * processing the request, and the actual location must have a {@link Location#getPath() path}.
      * 
@@ -313,7 +329,7 @@
             CopyBranchRequest that = (CopyBranchRequest)obj;
             if (!this.from().equals(that.from())) return false;
             if (!this.into().equals(that.into())) return false;
-            if (!this.conflictBehavior().equals(that.conflictBehavior())) return false;
+            if (!this.nodeConflictBehavior().equals(that.nodeConflictBehavior())) return false;
             if (!this.fromWorkspace.equals(that.fromWorkspace)) return false;
             if (!this.intoWorkspace.equals(that.intoWorkspace)) return false;
             return true;

Modified: trunk/dna-graph/src/main/java/org/jboss/dna/graph/request/RequestBuilder.java
===================================================================
--- trunk/dna-graph/src/main/java/org/jboss/dna/graph/request/RequestBuilder.java	2009-06-13 15:56:00 UTC (rev 1049)
+++ trunk/dna-graph/src/main/java/org/jboss/dna/graph/request/RequestBuilder.java	2009-06-14 22:58:57 UTC (rev 1050)
@@ -432,6 +432,8 @@
      *        used
      * @param conflictBehavior the expected behavior if an equivalently-named child already exists at the <code>into</code>
      *        location, or null if the default conflict behavior should be used
+     * @param uuidConflictBehavior the expected behavior if a node with the same UUID as any of the nodes in the branch under the
+     *        {@code from} location in the {@code fromWorkspace} workspace already exists in the workspace
      * @return the request; never null
      * @throws IllegalArgumentException if either of the locations or workspace names are null
      */
@@ -440,9 +442,11 @@
                                          Location into,
                                          String intoWorkspace,
                                          Name nameForCopy,
-                                         NodeConflictBehavior conflictBehavior ) {
-        if (conflictBehavior == null) conflictBehavior = CopyBranchRequest.DEFAULT_CONFLICT_BEHAVIOR;
-        return process(new CopyBranchRequest(from, fromWorkspace, into, intoWorkspace, nameForCopy, conflictBehavior));
+                                         NodeConflictBehavior conflictBehavior,
+                                         UuidConflictBehavior uuidConflictBehavior) {
+        if (conflictBehavior == null) conflictBehavior = CopyBranchRequest.DEFAULT_NODE_CONFLICT_BEHAVIOR;
+        return process(new CopyBranchRequest(from, fromWorkspace, into, intoWorkspace, nameForCopy, conflictBehavior,
+                                             uuidConflictBehavior));
     }
 
     /**
@@ -474,9 +478,10 @@
                                          Location into,
                                          String workspaceName,
                                          Name newNameForNode ) {
-        return process(new MoveBranchRequest(from, into, null, workspaceName, newNameForNode, MoveBranchRequest.DEFAULT_CONFLICT_BEHAVIOR));
+        return process(new MoveBranchRequest(from, into, null, workspaceName, newNameForNode,
+                                             MoveBranchRequest.DEFAULT_CONFLICT_BEHAVIOR));
     }
-    
+
     /**
      * Create a request to move a branch from one location into another before the given child node of the new location.
      * 
@@ -490,11 +495,13 @@
      */
     public MoveBranchRequest moveBranch( Location from,
                                          Location into,
-                                         Location before, 
+                                         Location before,
                                          String workspaceName,
                                          Name newNameForNode ) {
-        return process(new MoveBranchRequest(from, into, before, workspaceName, newNameForNode, MoveBranchRequest.DEFAULT_CONFLICT_BEHAVIOR));
-    }    
+        return process(new MoveBranchRequest(from, into, before, workspaceName, newNameForNode,
+                                             MoveBranchRequest.DEFAULT_CONFLICT_BEHAVIOR));
+    }
+
     /**
      * Create a request to move a branch from one location into another.
      * 

Modified: trunk/dna-graph/src/test/java/org/jboss/dna/graph/GraphTest.java
===================================================================
--- trunk/dna-graph/src/test/java/org/jboss/dna/graph/GraphTest.java	2009-06-13 15:56:00 UTC (rev 1049)
+++ trunk/dna-graph/src/test/java/org/jboss/dna/graph/GraphTest.java	2009-06-14 22:58:57 UTC (rev 1050)
@@ -72,6 +72,7 @@
 import org.jboss.dna.graph.request.Request;
 import org.jboss.dna.graph.request.SetPropertyRequest;
 import org.jboss.dna.graph.request.UpdatePropertiesRequest;
+import org.jboss.dna.graph.request.UuidConflictBehavior;
 import org.jboss.dna.graph.request.VerifyNodeExistsRequest;
 import org.jboss.dna.graph.request.VerifyWorkspaceRequest;
 import org.jboss.dna.graph.request.CloneWorkspaceRequest.CloneConflictBehavior;
@@ -184,13 +185,28 @@
 
     protected void assertNextRequestIsCopy( Location from,
                                             Location to ) {
+        assertNextRequestIsCopy(this.graph.getCurrentWorkspaceName(), from, to);
+    }
+
+    protected void assertNextRequestIsCopy( String fromWorkspace,
+                                            Location from,
+                                            Location to ) {
+        assertNextRequestIsCopy(fromWorkspace, from, to, UuidConflictBehavior.ALWAYS_CREATE_NEW_UUID);
+    }
+
+    protected void assertNextRequestIsCopy( String fromWorkspace,
+                                            Location from,
+                                            Location to,
+                                            UuidConflictBehavior uuidConflictBehavior) {
         Request request = executedRequests.poll();
         assertThat(request, is(instanceOf(CopyBranchRequest.class)));
         CopyBranchRequest copy = (CopyBranchRequest)request;
+        assertThat(copy.fromWorkspace(), is(fromWorkspace));
         assertThat(copy.from(), is(from));
         assertThat(copy.into(), is(to));
+        assertThat(copy.uuidConflictBehavior(), is(uuidConflictBehavior));
     }
-
+    
     protected void assertNextRequestIsDelete( Location at ) {
         Request request = executedRequests.poll();
         assertThat(request, is(instanceOf(DeleteBranchRequest.class)));
@@ -377,6 +393,24 @@
     }
 
     @Test
+    public void shouldCopyNodeFromOtherWorkspace() {
+        graph.copy(validPath).fromWorkspace("other").into(validIdProperty1, validIdProperty2);
+        assertThat(numberOfExecutions, is(1));
+        assertNextRequestIsCopy("other", Location.create(validPath), Location.create(validIdProperty1, validIdProperty2));
+        assertNoMoreRequests();
+
+        graph.copy(validPathString).into(validIdProperty1, validIdProperty2);
+        assertThat(numberOfExecutions, is(1));
+        assertNextRequestIsCopy(Location.create(validPath), Location.create(validIdProperty1, validIdProperty2));
+        assertNoMoreRequests();
+
+        graph.copy(validUuid).into(validPath);
+        assertThat(numberOfExecutions, is(1));
+        assertNextRequestIsCopy(Location.create(validUuid), Location.create(validPath));
+        assertNoMoreRequests();
+    }
+
+    @Test
     public void shouldDeleteNode() {
         graph.delete(validPath);
         assertThat(numberOfExecutions, is(1));

Modified: trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/JcrWorkspace.java
===================================================================
--- trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/JcrWorkspace.java	2009-06-13 15:56:00 UTC (rev 1049)
+++ trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/JcrWorkspace.java	2009-06-14 22:58:57 UTC (rev 1050)
@@ -28,6 +28,7 @@
 import java.security.AccessControlException;
 import java.util.Map;
 import java.util.Set;
+import java.util.UUID;
 import javax.jcr.AccessDeniedException;
 import javax.jcr.InvalidSerializedDataException;
 import javax.jcr.ItemExistsException;
@@ -53,6 +54,7 @@
 import org.jboss.dna.graph.connector.RepositorySource;
 import org.jboss.dna.graph.connector.RepositorySourceException;
 import org.jboss.dna.graph.property.Name;
+import org.jboss.dna.graph.property.NameFactory;
 import org.jboss.dna.graph.property.Path;
 import org.jboss.dna.graph.property.PathFactory;
 import org.jboss.dna.graph.property.Property;
@@ -270,9 +272,25 @@
                       String destAbsPath )
         throws ConstraintViolationException, VersionException, AccessDeniedException, PathNotFoundException, ItemExistsException,
         LockException, RepositoryException {
-        CheckArg.isNotEmpty(srcAbsPath, "srcAbsPath");
-        CheckArg.isNotEmpty(destAbsPath, "destAbsPath");
+        this.copy(this.name, srcAbsPath, destAbsPath);
+    }
 
+    /**
+     * {@inheritDoc}
+     */
+    public void copy( String srcWorkspace,
+                      String srcAbsPath,
+                      String destAbsPath ) 
+    throws ConstraintViolationException, VersionException, AccessDeniedException, PathNotFoundException, ItemExistsException,
+    LockException, RepositoryException {
+        CheckArg.isNotNull(srcWorkspace, "source workspace name");
+        CheckArg.isNotNull(srcAbsPath, "source path");
+        CheckArg.isNotNull(destAbsPath, "destination path");
+        
+        if (!graph.getWorkspaces().contains(srcWorkspace)) {
+            throw new NoSuchWorkspaceException(JcrI18n.workspaceNameIsInvalid.text(graph.getSourceName(), this.name));
+        }
+
         // Create the paths ...
         PathFactory factory = context.getValueFactories().getPathFactory();
         Path srcPath = null;
@@ -294,8 +312,7 @@
         }
 
         try {
-            // this.session.checkPermission(srcAbsPath.substring(0, srcAbsPath.lastIndexOf('/')), "remove");
-            this.session.checkPermission(destAbsPath, "add_node");
+            this.session.checkPermission(destPath.getParent(), "add_node");
         }
         catch (AccessControlException ace) {
             throw new AccessDeniedException(ace);
@@ -305,7 +322,6 @@
          * Make sure that the node has a definition at the new location
          */
         SessionCache cache = this.session.cache();
-        NodeInfo nodeInfo = cache.findNodeInfo(null, srcPath);
         NodeInfo cacheParent = cache.findNodeInfo(null, destPath.getParent());
 
         // Skip the cache and load the latest parent info directly from the graph
@@ -314,30 +330,22 @@
         String parentPath = destPath.getParent().getString(this.context.getNamespaceRegistry());
 
         // This will check for a definition and throw a ConstraintViolationException or ItemExistsException if none is found
-        this.session.cache().findBestNodeDefinition(parent, parentPath, newNodeName, nodeInfo.getPrimaryTypeName());
+        graph.useWorkspace(srcWorkspace);
+        Property primaryTypeProp = graph.getNodeAt(srcPath).getProperty(JcrLexicon.PRIMARY_TYPE);
+        Property uuidProp = graph.getNodeAt(srcPath).getProperty(DnaLexicon.UUID);
+        graph.useWorkspace(this.name);
+        
+        assert primaryTypeProp != null : "Cannot have a node in a JCR repository with no jcr:primaryType property";
+        assert uuidProp != null : "Cannot have a node in a JCR repository with no UUID";
 
+        NameFactory nameFactory = this.context.getValueFactories().getNameFactory();
+        this.session.cache().findBestNodeDefinition(parent, parentPath, newNodeName, nameFactory.create(primaryTypeProp.getFirstValue()));
+
         // Perform the copy operation, but use the "to" form (not the "into", which takes the parent) ...
-        graph.copy(srcPath).to(destPath);
-        cache.compensateForWorkspaceChildChange(cacheParent.getUuid(), null, nodeInfo.getUuid(), newNodeName);
-
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    public void copy( String srcWorkspace,
-                      String srcAbsPath,
-                      String destAbsPath ) throws NoSuchWorkspaceException {
-        CheckArg.isNotNull(srcWorkspace, "source workspace");
-        CheckArg.isNotNull(srcAbsPath, "source path");
-        CheckArg.isNotNull(destAbsPath, "destination path");
+        graph.copy(srcPath).fromWorkspace(srcWorkspace).to(destPath);
         
-        if (!graph.getWorkspaces().contains(srcWorkspace)) {
-            throw new NoSuchWorkspaceException(JcrI18n.workspaceNameIsInvalid.text(graph.getSourceName(), this.name));
-        }
-                
-        
-        throw new UnsupportedOperationException();
+        // Load the node that we just copied
+        cache.compensateForWorkspaceChildChange(cacheParent.getUuid(), null, UUID.fromString(uuidProp.getFirstValue().toString()), newNodeName);
     }
 
     /**

Modified: trunk/dna-jcr/src/test/java/org/jboss/dna/jcr/DnaTckTest.java
===================================================================
--- trunk/dna-jcr/src/test/java/org/jboss/dna/jcr/DnaTckTest.java	2009-06-13 15:56:00 UTC (rev 1049)
+++ trunk/dna-jcr/src/test/java/org/jboss/dna/jcr/DnaTckTest.java	2009-06-14 22:58:57 UTC (rev 1050)
@@ -9,7 +9,6 @@
 import javax.jcr.Session;
 import javax.jcr.SimpleCredentials;
 import org.apache.jackrabbit.test.AbstractJCRTest;
-import org.junit.Test;
 
 /**
  * Additional DNA tests that check for JCR compliance.
@@ -141,7 +140,6 @@
      * Tests that read-write sessions can read nodes by loading all of the children of the root node
      * @throws Exception
      */
-    @Test
     public void testShouldAllowReadWriteSessionToRead() throws Exception {
         session = helper.getReadWriteSession();
         testRead(session);
@@ -151,7 +149,6 @@
      * Tests that read-write sessions can add nodes, remove nodes, set nodes, and set properties.
      * @throws Exception
      */
-    @Test
     public void testShouldAllowReadWriteSessionToWrite() throws Exception {
         session = helper.getReadWriteSession();
         testWrite(session);
@@ -162,7 +159,6 @@
      * workspace.  This test makes sure both work.
      * @throws Exception
      */
-    @Test
     public void testShouldMapRolesToWorkspacesWhenSpecified() throws Exception {
         Credentials creds = new SimpleCredentials("defaultonly", "defaultonly".toCharArray());
         session = helper.getRepository().login(creds);
@@ -183,4 +179,24 @@
         session.logout();
     }
 
+
+    public void testShouldCopyFromAnotherWorkspace() throws Exception {
+        session = helper.getSuperuserSession("otherWorkspace");
+        String nodetype1 = this.getProperty("nodetype");
+        Node node1 = session.getRootNode().addNode(nodeName1, nodetype1);
+        node1.addNode(nodeName2, nodetype1);
+        session.save();
+        session.logout();
+        
+        superuser.getRootNode().addNode(nodeName4, nodetype1);
+        superuser.save();
+        
+        superuser.getWorkspace().copy("otherWorkspace", "/" + nodeName1, "/" + nodeName4 + "/" + nodeName1);
+        
+        Node node4 = superuser.getRootNode().getNode(nodeName4);
+        Node node4node1 = node4.getNode(nodeName1);
+        Node node4node1node2 = node4node1.getNode(nodeName2);
+        
+        assertNotNull(node4node1node2);
+    }
 }

Modified: trunk/dna-jcr/src/test/java/org/jboss/dna/jcr/JcrWorkspaceTest.java
===================================================================
--- trunk/dna-jcr/src/test/java/org/jboss/dna/jcr/JcrWorkspaceTest.java	2009-06-13 15:56:00 UTC (rev 1049)
+++ trunk/dna-jcr/src/test/java/org/jboss/dna/jcr/JcrWorkspaceTest.java	2009-06-14 22:58:57 UTC (rev 1050)
@@ -98,6 +98,7 @@
         Graph graph = Graph.create(source, context);
         graph.create("/a").and().create("/a/b").and().create("/a/b/c").and().create("/b");
         graph.set("booleanProperty").on("/a/b").to(true);
+        graph.set("jcr:primaryType").on("/a/b").to("nt:unstructured");
         graph.set("stringProperty").on("/a/b/c").to("value");
 
         // Make sure the path to the namespaces exists ...

Modified: trunk/extensions/dna-connector-federation/src/main/java/org/jboss/dna/connector/federation/FederatingRequestProcessor.java
===================================================================
--- trunk/extensions/dna-connector-federation/src/main/java/org/jboss/dna/connector/federation/FederatingRequestProcessor.java	2009-06-13 15:56:00 UTC (rev 1049)
+++ trunk/extensions/dna-connector-federation/src/main/java/org/jboss/dna/connector/federation/FederatingRequestProcessor.java	2009-06-14 22:58:57 UTC (rev 1050)
@@ -367,7 +367,8 @@
         Location intoLocation = Location.create(intoProjection.pathInSource);
         String workspaceName = fromProjection.projection.getWorkspaceName();
         CopyBranchRequest sourceRequest = new CopyBranchRequest(fromLocation, workspaceName, intoLocation, workspaceName,
-                                                                request.desiredName(), request.conflictBehavior());
+                                                                request.desiredName(), request.nodeConflictBehavior(),
+                                                                request.uuidConflictBehavior());
         execute(sourceRequest, fromProjection.projection);
 
         // Copy/transform the results ...



From dna-commits at lists.jboss.org  Mon Jun 15 10:54:13 2009
From: dna-commits at lists.jboss.org (dna-commits at lists.jboss.org)
Date: Mon, 15 Jun 2009 10:54:13 -0400
Subject: [dna-commits] DNA SVN: r1051 -
	trunk/dna-graph/src/main/java/org/jboss/dna/graph/request.
Message-ID: <E1MGDZd-0001p9-Dg@committer01.frg.pub.inap.atl.jboss.com>

Author: bcarothers
Date: 2009-06-15 10:54:13 -0400 (Mon, 15 Jun 2009)
New Revision: 1051

Added:
   trunk/dna-graph/src/main/java/org/jboss/dna/graph/request/UuidConflictBehavior.java
Log:
Added missing file to fix breaks in nightly build

Added: trunk/dna-graph/src/main/java/org/jboss/dna/graph/request/UuidConflictBehavior.java
===================================================================
--- trunk/dna-graph/src/main/java/org/jboss/dna/graph/request/UuidConflictBehavior.java	                        (rev 0)
+++ trunk/dna-graph/src/main/java/org/jboss/dna/graph/request/UuidConflictBehavior.java	2009-06-15 14:54:13 UTC (rev 1051)
@@ -0,0 +1,15 @@
+package org.jboss.dna.graph.request;
+
+/**
+ * An enumeration used by {@link CopyBranchRequest} for the choice of handling duplicate UUIDs, such as when a node is to be
+ * copied to another location where a node already exists.
+ * 
+ * @author Randall Hauch
+ */
+public enum UuidConflictBehavior {
+
+    ALWAYS_CREATE_NEW_UUID,
+    DO_NOT_COPY,
+    REPLACE_EXISTING_NODE,
+    THROW_EXCEPTION;
+}


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



From dna-commits at lists.jboss.org  Wed Jun 17 13:19:39 2009
From: dna-commits at lists.jboss.org (dna-commits at lists.jboss.org)
Date: Wed, 17 Jun 2009 13:19:39 -0400
Subject: [dna-commits] DNA SVN: r1053 -
	trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/federation.
Message-ID: <E1MGynT-0006tc-Od@committer01.frg.pub.inap.atl.jboss.com>

Author: rhauch
Date: 2009-06-17 13:19:39 -0400 (Wed, 17 Jun 2009)
New Revision: 1053

Modified:
   trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/federation/FederatedRequest.java
   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/ProjectedNode.java
Log:
DNA-463 Federation connector incorrectly expects identification properties on all source nodes

Corrected the for loop that is aggregating the identifier properties on source node locations.  If the location does not even have identifier properties, then this aggregation process is not even performed.

Also added toString() implementations for ProjectedNode and FederatedRequest.

Modified: trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/federation/FederatedRequest.java
===================================================================
--- trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/federation/FederatedRequest.java	2009-06-17 17:19:33 UTC (rev 1052)
+++ trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/federation/FederatedRequest.java	2009-06-17 17:19:39 UTC (rev 1053)
@@ -93,6 +93,24 @@
         if (forkLatch != null) forkLatch.await();
     }
 
+    /**
+     * {@inheritDoc}
+     * 
+     * @see java.lang.Object#toString()
+     */
+    @Override
+    public String toString() {
+        StringBuilder sb = new StringBuilder();
+        sb.append("Federated request: ").append(original).append("\n");
+        sb.append("  projected to: ").append("\n");
+        ProjectedRequest projected = first;
+        while (projected != null) {
+            sb.append("  - ").append(projected).append("\n");
+            projected = projected.next();
+        }
+        return sb.toString();
+    }
+
     class ProjectedRequest {
         private final Projection projection;
         private final Projection projection2;

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	2009-06-17 17:19:33 UTC (rev 1052)
+++ trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/federation/JoinRequestProcessor.java	2009-06-17 17:19:39 UTC (rev 1053)
@@ -203,19 +203,20 @@
             }
 
             // Make sure we have an actual location ...
-            actualLocation = determineActualLocation(actualLocation,
-                                                     readFromSource.getActualLocationOfNode(),
-                                                     projectedRequest.getProjection());
+            Location sourceLocation = readFromSource.getActualLocationOfNode();
+            actualLocation = determineActualLocation(actualLocation, sourceLocation, projectedRequest.getProjection());
 
-            // Accumulate the identification properties ...
-            for (Property propertyInSource : readFromSource.getActualLocationOfNode().getIdProperties()) {
-                Name name = propertyInSource.getName();
-                Property existing = actualLocation.getIdProperty(name);
-                if (existing != null) {
-                    // Merge the property values ...
-                    propertyInSource = merge(existing, propertyInSource, propertyFactory, true);
+            if (sourceLocation.hasIdProperties()) {
+                // Accumulate the identification properties ...
+                for (Property propertyInSource : sourceLocation.getIdProperties()) {
+                    Name name = propertyInSource.getName();
+                    Property existing = actualLocation.getIdProperty(name);
+                    if (existing != null) {
+                        // Merge the property values ...
+                        propertyInSource = merge(existing, propertyInSource, propertyFactory, true);
+                    }
+                    actualLocation = actualLocation.with(propertyInSource);
                 }
-                actualLocation = actualLocation.with(propertyInSource);
             }
             setCacheableInfo(request, readFromSource.getCachePolicy());
             projectedRequest = projectedRequest.next();
@@ -268,19 +269,22 @@
                 if (federatedPath == null) federatedPath = childInRepos.getPath().getParent();
             } else {
                 ReadNodeRequest readFromSource = (ReadNodeRequest)sourceRequest;
-                // Accumulate the identification properties ...
-                for (Property propertyInSource : readFromSource.getActualLocationOfNode().getIdProperties()) {
-                    Name name = propertyInSource.getName();
-                    Property existing = actualLocation.getIdProperty(name);
-                    if (existing != null) {
-                        // Merge the property values ...
-                        propertyInSource = merge(existing, propertyInSource, propertyFactory, true);
+                Location sourceLocation = readFromSource.getActualLocationOfNode();
+                if (sourceLocation.hasIdProperties()) {
+                    // Accumulate the identification properties ...
+                    for (Property propertyInSource : sourceLocation.getIdProperties()) {
+                        Name name = propertyInSource.getName();
+                        Property existing = actualLocation.getIdProperty(name);
+                        if (existing != null) {
+                            // Merge the property values ...
+                            propertyInSource = merge(existing, propertyInSource, propertyFactory, true);
+                        }
+                        actualLocation = actualLocation.with(propertyInSource);
                     }
-                    actualLocation = actualLocation.with(propertyInSource);
                 }
 
                 // Make sure we have an actual location ...
-                actualLocation = determineActualLocation(actualLocation, readFromSource.getActualLocationOfNode(), projection);
+                actualLocation = determineActualLocation(actualLocation, sourceLocation, projection);
                 if (federatedPath == null) federatedPath = actualLocation.getPath();
 
                 // Add all the children from the source ...
@@ -416,15 +420,18 @@
                 if (federatedPath == null) federatedPath = childInRepos.getPath().getParent();
             } else {
                 ReadAllChildrenRequest readFromSource = (ReadAllChildrenRequest)sourceRequest;
-                // Accumulate the identification properties ...
-                for (Property propertyInSource : readFromSource.getActualLocationOfNode().getIdProperties()) {
-                    Name name = propertyInSource.getName();
-                    Property existing = actualLocation.getIdProperty(name);
-                    if (existing != null) {
-                        // Merge the property values ...
-                        propertyInSource = merge(existing, propertyInSource, propertyFactory, true);
+                Location sourceLocation = readFromSource.getActualLocationOfNode();
+                if (sourceLocation.hasIdProperties()) {
+                    // Accumulate the identification properties ...
+                    for (Property propertyInSource : sourceLocation.getIdProperties()) {
+                        Name name = propertyInSource.getName();
+                        Property existing = actualLocation.getIdProperty(name);
+                        if (existing != null) {
+                            // Merge the property values ...
+                            propertyInSource = merge(existing, propertyInSource, propertyFactory, true);
+                        }
+                        actualLocation = actualLocation.with(propertyInSource);
                     }
-                    actualLocation = actualLocation.with(propertyInSource);
                 }
 
                 // Make sure we have an actual location ...
@@ -498,19 +505,20 @@
             }
 
             // Make sure we have an actual location ...
-            actualLocation = determineActualLocation(actualLocation,
-                                                     readFromSource.getActualLocationOfNode(),
-                                                     projectedRequest.getProjection());
+            Location sourceLocation = readFromSource.getActualLocationOfNode();
+            actualLocation = determineActualLocation(actualLocation, sourceLocation, projectedRequest.getProjection());
 
-            // Accumulate the identification properties ...
-            for (Property propertyInSource : readFromSource.getActualLocationOfNode().getIdProperties()) {
-                Name name = propertyInSource.getName();
-                Property existing = actualLocation.getIdProperty(name);
-                if (existing != null) {
-                    // Merge the property values ...
-                    propertyInSource = merge(existing, propertyInSource, propertyFactory, true);
+            if (sourceLocation.hasIdProperties()) {
+                // Accumulate the identification properties ...
+                for (Property propertyInSource : sourceLocation.getIdProperties()) {
+                    Name name = propertyInSource.getName();
+                    Property existing = actualLocation.getIdProperty(name);
+                    if (existing != null) {
+                        // Merge the property values ...
+                        propertyInSource = merge(existing, propertyInSource, propertyFactory, true);
+                    }
+                    actualLocation = actualLocation.with(propertyInSource);
                 }
-                actualLocation = actualLocation.with(propertyInSource);
             }
 
             // Add all the properties ...
@@ -559,19 +567,20 @@
             }
 
             // Make sure we have an actual location ...
-            actualLocation = determineActualLocation(actualLocation,
-                                                     readFromSource.getActualLocationOfNode(),
-                                                     projectedRequest.getProjection());
+            Location sourceLocation = readFromSource.getActualLocationOfNode();
+            actualLocation = determineActualLocation(actualLocation, sourceLocation, projectedRequest.getProjection());
 
-            // Accumulate the identification properties ...
-            for (Property propertyInSource : readFromSource.getActualLocationOfNode().getIdProperties()) {
-                Name name = propertyInSource.getName();
-                Property existing = actualLocation.getIdProperty(name);
-                if (existing != null) {
-                    // Merge the property values ...
-                    propertyInSource = merge(existing, propertyInSource, propertyFactory, true);
+            if (sourceLocation.hasIdProperties()) {
+                // Accumulate the identification properties ...
+                for (Property propertyInSource : sourceLocation.getIdProperties()) {
+                    Name name = propertyInSource.getName();
+                    Property existing = actualLocation.getIdProperty(name);
+                    if (existing != null) {
+                        // Merge the property values ...
+                        propertyInSource = merge(existing, propertyInSource, propertyFactory, true);
+                    }
+                    actualLocation = actualLocation.with(propertyInSource);
                 }
-                actualLocation = actualLocation.with(propertyInSource);
             }
 
             // Add all the properties ...
@@ -930,15 +939,18 @@
                 return;
             }
 
-            // Accumulate the identification properties ...
-            for (Property propertyInSource : readFromSource.getActualLocationOfNode().getIdProperties()) {
-                Name name = propertyInSource.getName();
-                Property existing = actualLocation.getIdProperty(name);
-                if (existing != null) {
-                    // Merge the property values ...
-                    propertyInSource = merge(existing, propertyInSource, propertyFactory, true);
+            Location sourceLocation = readFromSource.getActualLocationOfNode();
+            if (sourceLocation.hasIdProperties()) {
+                // Accumulate the identification properties ...
+                for (Property propertyInSource : sourceLocation.getIdProperties()) {
+                    Name name = propertyInSource.getName();
+                    Property existing = actualLocation.getIdProperty(name);
+                    if (existing != null) {
+                        // Merge the property values ...
+                        propertyInSource = merge(existing, propertyInSource, propertyFactory, true);
+                    }
+                    actualLocation = actualLocation.with(propertyInSource);
                 }
-                actualLocation = actualLocation.with(propertyInSource);
             }
             projectedRequest = projectedRequest.next();
         }

Modified: trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/federation/ProjectedNode.java
===================================================================
--- trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/federation/ProjectedNode.java	2009-06-17 17:19:33 UTC (rev 1052)
+++ trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/federation/ProjectedNode.java	2009-06-17 17:19:39 UTC (rev 1053)
@@ -121,6 +121,11 @@
     public ProxyNode asProxy() {
         return null;
     }
+
+    @Override
+    public String toString() {
+        return "Placeholder " + location();
+    }
 }
 
 @NotThreadSafe
@@ -196,4 +201,10 @@
     public boolean isSameLocationAsOriginal() {
         return this.sameLocationAsOriginal;
     }
+
+    @Override
+    public String toString() {
+        return "Proxy for " + federatedLocation() + " projected from " + location() + " in workspace \"" + workspaceName()
+               + "\" in \"" + source() + "\"";
+    }
 }



From dna-commits at lists.jboss.org  Wed Jun 17 13:19:33 2009
From: dna-commits at lists.jboss.org (dna-commits at lists.jboss.org)
Date: Wed, 17 Jun 2009 13:19:33 -0400
Subject: [dna-commits] DNA SVN: r1052 - in trunk/dna-jcr/src:
	test/java/org/jboss/dna/jcr and 1 other directory.
Message-ID: <E1MGynN-0006t6-HD@committer01.frg.pub.inap.atl.jboss.com>

Author: rhauch
Date: 2009-06-17 13:19:33 -0400 (Wed, 17 Jun 2009)
New Revision: 1052

Modified:
   trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/SessionCache.java
   trunk/dna-jcr/src/test/java/org/jboss/dna/jcr/DnaTckTest.java
   trunk/dna-jcr/src/test/java/org/jboss/dna/jcr/JcrRepositoryTest.java
Log:
DNA-399 Need to Add Session.checkPermission Calls to Guard Read, Add Node, Set Property, and Remove Item Access
DNA-453 Implement Workspace.copy(String, String, String)

Corrected JavaDoc and changed private method to protected to eliminate performance warning.

Modified: trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/SessionCache.java
===================================================================
--- trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/SessionCache.java	2009-06-15 14:54:13 UTC (rev 1051)
+++ trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/SessionCache.java	2009-06-17 17:19:33 UTC (rev 1052)
@@ -233,13 +233,13 @@
     /**
      * Checks whether the current session has the appropriate permissions to perform the given action.
      * 
-     * @param the node on which the action will be performed
+     * @param node the node on which the action will be performed
      * @param action the name of the action to perform, should be "add_node", "remove", or "set_property"
      * @throws AccessDeniedException if the current session does not have the requisite privileges to perform this task
      * @throws RepositoryException if any other error occurs
      */
-    private void checkPermission( NodeInfo node,
-                                  String action ) throws AccessDeniedException, RepositoryException {
+    protected void checkPermission( NodeInfo node,
+                                    String action ) throws AccessDeniedException, RepositoryException {
         try {
             this.session.checkPermission(SessionCache.this.getPathFor(node), action);
         } catch (AccessControlException ace) {
@@ -1462,8 +1462,8 @@
             if (!definition.getId().equals(node.getDefinitionId())) {
                 // The node definition changed, so try to set the property ...
                 try {
-                    JcrValue value = new JcrValue(factories(), SessionCache.this, PropertyType.STRING,
-                                                  definition.getId().getString());
+                    JcrValue value = new JcrValue(factories(), SessionCache.this, PropertyType.STRING, definition.getId()
+                                                                                                                 .getString());
                     setProperty(DnaIntLexicon.NODE_DEFINITON, value);
                 } catch (ConstraintViolationException e) {
                     // We can't set this property on the node (according to the node definition).
@@ -1859,6 +1859,7 @@
      * 
      * @param uuid the UUID for the node; may not be null
      * @return the information for the node with the supplied UUID, or null if the information is not in the cache
+     * @throws AccessDeniedException if the node cannot be accessed
      * @throws ItemNotFoundException if there is no node with the supplied UUID
      * @throws InvalidItemStateException if the node with the UUID has been deleted in this session
      * @throws RepositoryException if any other error occurs while reading information from the repository

Modified: trunk/dna-jcr/src/test/java/org/jboss/dna/jcr/DnaTckTest.java
===================================================================
--- trunk/dna-jcr/src/test/java/org/jboss/dna/jcr/DnaTckTest.java	2009-06-15 14:54:13 UTC (rev 1051)
+++ trunk/dna-jcr/src/test/java/org/jboss/dna/jcr/DnaTckTest.java	2009-06-17 17:19:33 UTC (rev 1052)
@@ -12,19 +12,19 @@
 
 /**
  * Additional DNA tests that check for JCR compliance.
- *
  */
 public class DnaTckTest extends AbstractJCRTest {
 
     Session session;
 
+    @Override
     protected void tearDown() throws Exception {
         try {
             superuser.getRootNode().getNode(this.nodeName1).remove();
             superuser.save();
+        } catch (PathNotFoundException ignore) {
         }
-        catch (PathNotFoundException ignore) { } 
-        
+
         if (session != null) {
             session.logout();
             session = null;
@@ -32,22 +32,22 @@
         super.tearDown();
     }
 
-    private void testRead(Session session) throws Exception {
+    private void testRead( Session session ) throws Exception {
         Node rootNode = session.getRootNode();
-        
-        for (NodeIterator iter = rootNode.getNodes(); iter.hasNext(); ) {
+
+        for (NodeIterator iter = rootNode.getNodes(); iter.hasNext();) {
             iter.nextNode();
         }
     }
-    
-    private void testAddNode(Session session) throws Exception {
+
+    private void testAddNode( Session session ) throws Exception {
         session.refresh(false);
         Node root = session.getRootNode();
         root.addNode(nodeName1, testNodeType);
         session.save();
     }
-    
-    private void testRemoveNode(Session session) throws Exception {
+
+    private void testRemoveNode( Session session ) throws Exception {
         session.refresh(false);
         Node root = session.getRootNode();
         Node node = root.getNode(nodeName1);
@@ -55,31 +55,30 @@
         session.save();
     }
 
-    private void testSetProperty(Session session) throws Exception {
+    private void testSetProperty( Session session ) throws Exception {
         session.refresh(false);
         Node root = session.getRootNode();
         root.setProperty(this.propertyName1, "test value");
         session.save();
-        
+
     }
-    
-    private void testRemoveProperty(Session session) throws Exception {
+
+    private void testRemoveProperty( Session session ) throws Exception {
         Session localAdmin = helper.getRepository().login(helper.getSuperuserCredentials(), session.getWorkspace().getName());
         assertEquals(session.getWorkspace().getName(), superuser.getWorkspace().getName());
-        
+
         Node superRoot = localAdmin.getRootNode();
         Node superNode;
         try {
             superNode = superRoot.getNode(this.nodeName1);
-        }
-        catch (PathNotFoundException pnfe) {
+        } catch (PathNotFoundException pnfe) {
             superNode = superRoot.addNode(nodeName1, testNodeType);
         }
         superNode.setProperty(this.propertyName1, "test value");
 
         localAdmin.save();
         localAdmin.logout();
-        
+
         session.refresh(false);
         Node root = session.getRootNode();
         Node node = root.getNode(nodeName1);
@@ -87,8 +86,8 @@
         property.remove();
         session.save();
     }
-    
-    private void testWrite(Session session) throws Exception {
+
+    private void testWrite( Session session ) throws Exception {
         testAddNode(session);
         testSetProperty(session);
         testRemoveProperty(session);
@@ -97,6 +96,7 @@
 
     /**
      * Tests that read-only sessions can read nodes by loading all of the children of the root node
+     * 
      * @throws Exception
      */
     public void testShouldAllowReadOnlySessionToRead() throws Exception {
@@ -106,6 +106,7 @@
 
     /**
      * Tests that read-only sessions cannot add nodes, remove nodes, set nodes, or set properties.
+     * 
      * @throws Exception
      */
     public void testShouldNotAllowReadOnlySessionToWrite() throws Exception {
@@ -113,31 +114,28 @@
         try {
             testAddNode(session);
             fail("Read-only sessions should not be able to add nodes");
+        } catch (AccessDeniedException expected) {
         }
-        catch (AccessDeniedException expected) {
-        }
         try {
             testSetProperty(session);
             fail("Read-only sessions should not be able to set properties");
+        } catch (AccessDeniedException expected) {
         }
-        catch (AccessDeniedException expected) {
-        }
         try {
             testRemoveProperty(session);
             fail("Read-only sessions should not be able to remove properties");
+        } catch (AccessDeniedException expected) {
         }
-        catch (AccessDeniedException expected) {
-        }
         try {
             testRemoveNode(session);
             fail("Read-only sessions should not be able to remove nodes");
+        } catch (AccessDeniedException expected) {
         }
-        catch (AccessDeniedException expected) {
-        }
     }
-    
+
     /**
      * Tests that read-write sessions can read nodes by loading all of the children of the root node
+     * 
      * @throws Exception
      */
     public void testShouldAllowReadWriteSessionToRead() throws Exception {
@@ -147,6 +145,7 @@
 
     /**
      * Tests that read-write sessions can add nodes, remove nodes, set nodes, and set properties.
+     * 
      * @throws Exception
      */
     public void testShouldAllowReadWriteSessionToWrite() throws Exception {
@@ -155,8 +154,9 @@
     }
 
     /**
-     * User defaultuser is configured to have readwrite in "otherWorkspace" and readonly in the default
-     * workspace.  This test makes sure both work.
+     * User defaultuser is configured to have readwrite in "otherWorkspace" and readonly in the default workspace. This test makes
+     * sure both work.
+     * 
      * @throws Exception
      */
     public void testShouldMapRolesToWorkspacesWhenSpecified() throws Exception {
@@ -165,21 +165,19 @@
 
         testRead(session);
         testWrite(session);
-        
+
         session.logout();
-        
+
         session = helper.getRepository().login(creds, "otherWorkspace");
         testRead(session);
         try {
             testWrite(session);
             fail("User 'defaultuser' should not have write access to 'otherWorkspace'");
+        } catch (AccessDeniedException expected) {
         }
-        catch (AccessDeniedException expected) {
-        }
         session.logout();
     }
 
-
     public void testShouldCopyFromAnotherWorkspace() throws Exception {
         session = helper.getSuperuserSession("otherWorkspace");
         String nodetype1 = this.getProperty("nodetype");
@@ -187,16 +185,16 @@
         node1.addNode(nodeName2, nodetype1);
         session.save();
         session.logout();
-        
+
         superuser.getRootNode().addNode(nodeName4, nodetype1);
         superuser.save();
-        
+
         superuser.getWorkspace().copy("otherWorkspace", "/" + nodeName1, "/" + nodeName4 + "/" + nodeName1);
-        
+
         Node node4 = superuser.getRootNode().getNode(nodeName4);
         Node node4node1 = node4.getNode(nodeName1);
         Node node4node1node2 = node4node1.getNode(nodeName2);
-        
+
         assertNotNull(node4node1node2);
     }
 }

Modified: trunk/dna-jcr/src/test/java/org/jboss/dna/jcr/JcrRepositoryTest.java
===================================================================
--- trunk/dna-jcr/src/test/java/org/jboss/dna/jcr/JcrRepositoryTest.java	2009-06-15 14:54:13 UTC (rev 1051)
+++ trunk/dna-jcr/src/test/java/org/jboss/dna/jcr/JcrRepositoryTest.java	2009-06-17 17:19:33 UTC (rev 1052)
@@ -184,7 +184,6 @@
         repository.login();
     }
 
-    @SuppressWarnings("cast")
     @Test
     public void shouldAllowLoginWithNoCredentialsInPrivilegedBlock() throws Exception {
         LoginContext login = new LoginContext("dna-jcr", new UserPasswordCallbackHandler("superuser", "superuser".toCharArray()));



From dna-commits at lists.jboss.org  Fri Jun 19 18:43:42 2009
From: dna-commits at lists.jboss.org (dna-commits at lists.jboss.org)
Date: Fri, 19 Jun 2009 18:43:42 -0400
Subject: [dna-commits] DNA SVN: r1055 - in trunk/dna-jcr/src:
	test/java/org/jboss/dna/jcr and 1 other directory.
Message-ID: <E1MHmoA-0000Xz-Jh@committer01.frg.pub.inap.atl.jboss.com>

Author: rhauch
Date: 2009-06-19 18:43:42 -0400 (Fri, 19 Jun 2009)
New Revision: 1055

Modified:
   trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/JcrWorkspace.java
   trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/SessionCache.java
   trunk/dna-jcr/src/test/java/org/jboss/dna/jcr/SessionCacheTest.java
Log:
DNA-466 JCR requires connectors to expose UUID as identifier property

Changed the JCR implementation to use the path and UUID when both are known.

Modified: trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/JcrWorkspace.java
===================================================================
--- trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/JcrWorkspace.java	2009-06-19 22:43:29 UTC (rev 1054)
+++ trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/JcrWorkspace.java	2009-06-19 22:43:42 UTC (rev 1055)
@@ -280,13 +280,13 @@
      */
     public void copy( String srcWorkspace,
                       String srcAbsPath,
-                      String destAbsPath ) 
-    throws ConstraintViolationException, VersionException, AccessDeniedException, PathNotFoundException, ItemExistsException,
-    LockException, RepositoryException {
+                      String destAbsPath )
+        throws ConstraintViolationException, VersionException, AccessDeniedException, PathNotFoundException, ItemExistsException,
+        LockException, RepositoryException {
         CheckArg.isNotNull(srcWorkspace, "source workspace name");
         CheckArg.isNotNull(srcAbsPath, "source path");
         CheckArg.isNotNull(destAbsPath, "destination path");
-        
+
         if (!graph.getWorkspaces().contains(srcWorkspace)) {
             throw new NoSuchWorkspaceException(JcrI18n.workspaceNameIsInvalid.text(graph.getSourceName(), this.name));
         }
@@ -313,8 +313,7 @@
 
         try {
             this.session.checkPermission(destPath.getParent(), "add_node");
-        }
-        catch (AccessControlException ace) {
+        } catch (AccessControlException ace) {
             throw new AccessDeniedException(ace);
         }
 
@@ -325,7 +324,7 @@
         NodeInfo cacheParent = cache.findNodeInfo(null, destPath.getParent());
 
         // Skip the cache and load the latest parent info directly from the graph
-        NodeInfo parent = cache.loadFromGraph(cacheParent.getUuid(), null);
+        NodeInfo parent = cache.loadFromGraph(destPath.getParent(), cacheParent.getUuid());
         Name newNodeName = destPath.getLastSegment().getName();
         String parentPath = destPath.getParent().getString(this.context.getNamespaceRegistry());
 
@@ -334,18 +333,24 @@
         Property primaryTypeProp = graph.getNodeAt(srcPath).getProperty(JcrLexicon.PRIMARY_TYPE);
         Property uuidProp = graph.getNodeAt(srcPath).getProperty(DnaLexicon.UUID);
         graph.useWorkspace(this.name);
-        
+
         assert primaryTypeProp != null : "Cannot have a node in a JCR repository with no jcr:primaryType property";
         assert uuidProp != null : "Cannot have a node in a JCR repository with no UUID";
 
         NameFactory nameFactory = this.context.getValueFactories().getNameFactory();
-        this.session.cache().findBestNodeDefinition(parent, parentPath, newNodeName, nameFactory.create(primaryTypeProp.getFirstValue()));
+        this.session.cache().findBestNodeDefinition(parent,
+                                                    parentPath,
+                                                    newNodeName,
+                                                    nameFactory.create(primaryTypeProp.getFirstValue()));
 
         // Perform the copy operation, but use the "to" form (not the "into", which takes the parent) ...
         graph.copy(srcPath).fromWorkspace(srcWorkspace).to(destPath);
-        
+
         // Load the node that we just copied
-        cache.compensateForWorkspaceChildChange(cacheParent.getUuid(), null, UUID.fromString(uuidProp.getFirstValue().toString()), newNodeName);
+        cache.compensateForWorkspaceChildChange(cacheParent.getUuid(),
+                                                null,
+                                                UUID.fromString(uuidProp.getFirstValue().toString()),
+                                                newNodeName);
     }
 
     /**
@@ -432,8 +437,7 @@
         try {
             this.session.checkPermission(srcAbsPath.substring(0, srcAbsPath.lastIndexOf('/')), "remove");
             this.session.checkPermission(destAbsPath, "add_node");
-        }
-        catch (AccessControlException ace) {
+        } catch (AccessControlException ace) {
             throw new AccessDeniedException(ace);
         }
 
@@ -446,7 +450,7 @@
         NodeInfo oldParent = cache.findNodeInfo(null, srcPath.getParent());
 
         // Skip the cache and load the latest parent info directly from the graph
-        NodeInfo parent = cache.loadFromGraph(cacheParent.getUuid(), null);
+        NodeInfo parent = cache.loadFromGraph(destPath.getParent(), cacheParent.getUuid());
         Name newNodeName = destPath.getLastSegment().getName();
         String parentPath = destPath.getParent().getString(this.context.getNamespaceRegistry());
 

Modified: trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/SessionCache.java
===================================================================
--- trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/SessionCache.java	2009-06-19 22:43:29 UTC (rev 1054)
+++ trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/SessionCache.java	2009-06-19 22:43:42 UTC (rev 1055)
@@ -156,6 +156,7 @@
     protected final HashMap<UUID, ImmutableNodeInfo> cachedNodes;
     protected final HashMap<UUID, ChangedNodeInfo> changedNodes;
     protected final HashMap<UUID, NodeInfo> deletedNodes;
+    protected final Map<UUID, Path> pathCache;
 
     private LinkedList<Request> requests;
     private BatchRequestBuilder requestBuilder;
@@ -191,6 +192,7 @@
         this.cachedNodes = new HashMap<UUID, ImmutableNodeInfo>();
         this.changedNodes = new HashMap<UUID, ChangedNodeInfo>();
         this.deletedNodes = new HashMap<UUID, NodeInfo>();
+        this.pathCache = new HashMap<UUID, Path>();
 
         // Create the batch operations ...
         this.requests = new LinkedList<Request>();
@@ -1002,7 +1004,7 @@
             // Or in the cache ...
             NodeInfo cached = cachedNodes.get(uuid);
             if (cached == null) {
-                cached = loadFromGraph(uuid, null);
+                cached = loadFromGraph(null, uuid);
             }
             // Now put into the changed nodes ...
             info = new ChangedNodeInfo(cached);
@@ -1400,6 +1402,9 @@
 
         public void orderChildBefore( Path.Segment childToBeMoved,
                                       Path.Segment before ) {
+            // Clear the path cache ...
+            SessionCache.this.pathCache.clear();
+
             PathFactory pathFactory = SessionCache.this.pathFactory;
             Path thisPath = this.currentLocation.getPath();
             UUID fromUuid = this.node.getChildren().getChild(childToBeMoved).getUuid();
@@ -1477,6 +1482,9 @@
                 }
             }
 
+            // Clear the path cache ...
+            SessionCache.this.pathCache.clear();
+
             // Remove the node from the current parent and add it to this ...
             ChangedNodeInfo newChildInfo = newChildEditor.node;
             UUID existingParent = newChildInfo.getParent();
@@ -1874,7 +1882,7 @@
         NodeInfo info = findNodeInfoInCache(uuid);
         if (info == null) {
             // Nope, so go ahead and load it ...
-            info = loadFromGraph(uuid, null);
+            info = loadFromGraph(null, uuid);
 
         }
         SessionCache.this.checkPermission(info, JcrSession.JCR_READ_PERMISSION);
@@ -1919,7 +1927,7 @@
     NodeInfo findNodeInfoForRoot() throws RepositoryException {
         if (root == null) {
             // We haven't found the root yet ...
-            NodeInfo info = loadFromGraph(this.rootPath, null);
+            NodeInfo info = loadFromGraph(this.rootPath, (NodeInfo)null);
             root = info.getUuid();
             this.jcrNodes.put(root, new JcrRootNode(this, root));
             return info;
@@ -2082,23 +2090,36 @@
     }
 
     Path getPathFor( UUID uuid ) throws ItemNotFoundException, InvalidItemStateException, RepositoryException {
-        if (uuid == root) return rootPath;
+        if (uuid.equals(root)) return rootPath;
         return getPathFor(findNodeInfo(uuid));
     }
 
     Path getPathFor( NodeInfo info ) throws ItemNotFoundException, InvalidItemStateException, RepositoryException {
-        if (info != null && info.getUuid() == root) return rootPath;
-        LinkedList<Path.Segment> segments = new LinkedList<Path.Segment>();
-        while (info != null) {
+        if (info == null) {
+            return pathFactory.createRootPath();
+        }
+        UUID uuid = info.getUuid();
+        if (uuid.equals(root)) return rootPath;
+
+        // This isn't the root node ...
+        Path result = pathCache.get(uuid);
+        if (result == null) {
+            // We need to build a path using the parent path ...
             UUID parent = info.getParent();
-            if (parent == null) break;
-            NodeInfo parentInfo = findNodeInfo(parent);
-            ChildNode child = parentInfo.getChildren().getChild(info.getUuid());
-            if (child == null) break;
-            segments.addFirst(child.getSegment());
-            info = parentInfo;
+            if (parent == null) {
+                // Then this node is the root ...
+                root = info.getUuid();
+                result = rootPath;
+            } else {
+                NodeInfo parentInfo = findNodeInfo(parent);
+                Path parentPath = getPathFor(parentInfo);
+                ChildNode child = parentInfo.getChildren().getChild(info.getUuid());
+                result = pathFactory.create(parentPath, child.getSegment());
+            }
+            pathCache.put(uuid, result);
         }
-        return pathFactory.createAbsolutePath(segments);
+        assert result != null;
+        return result;
     }
 
     Path getPathFor( PropertyInfo propertyInfo ) throws ItemNotFoundException, RepositoryException {
@@ -2138,18 +2159,20 @@
      * Note that this method does not check the cache before loading from the repository graph.
      * </p>
      * 
-     * @param uuid the UUID of the node; may not be null
-     * @param parentInfo the parent information; may be null if not known
+     * @param path the path of the node, if known; may be null only if the UUID is supplied
+     * @param uuid the UUID of the node, if known; may be null only if the path is supplied
      * @return the information for the node
      * @throws ItemNotFoundException if the node does not exist in the repository
      * @throws RepositoryException if there was an error obtaining this information from the repository
      */
-    protected ImmutableNodeInfo loadFromGraph( UUID uuid,
-                                               NodeInfo parentInfo ) throws ItemNotFoundException, RepositoryException {
+    protected ImmutableNodeInfo loadFromGraph( Path path,
+                                               UUID uuid ) throws ItemNotFoundException, RepositoryException {
         // Load the node information from the store ...
         try {
-            org.jboss.dna.graph.Node node = store.getNodeAt(uuid);
-            ImmutableNodeInfo info = createNodeInfoFrom(node, parentInfo);
+            // See if there is a path for this uuid ...
+            Location location = Location.create(path, uuid);
+            org.jboss.dna.graph.Node node = store.getNodeAt(location);
+            ImmutableNodeInfo info = createNodeInfoFrom(node, null);
             this.cachedNodes.put(info.getUuid(), info);
             return info;
         } catch (org.jboss.dna.graph.property.PathNotFoundException e) {
@@ -2540,6 +2563,9 @@
             // Whether or not we found an info, add it to the deleted map ...
             this.deletedNodes.put(toDelete, info);
 
+            // Remove it from the path cache ...
+            this.pathCache.remove(toDelete);
+
             if (info != null) {
                 // Get all the children and add them to the queue ...
                 for (ChildNode child : info.getChildren()) {

Modified: trunk/dna-jcr/src/test/java/org/jboss/dna/jcr/SessionCacheTest.java
===================================================================
--- trunk/dna-jcr/src/test/java/org/jboss/dna/jcr/SessionCacheTest.java	2009-06-19 22:43:29 UTC (rev 1054)
+++ trunk/dna-jcr/src/test/java/org/jboss/dna/jcr/SessionCacheTest.java	2009-06-19 22:43:42 UTC (rev 1055)
@@ -373,7 +373,7 @@
             sw.stop();
             assertThat(nodeInfo, is(sameInstance(cache.findNodeInfo(rootUuid))));
         }
-        System.out.println(pad(sourceName) + " ==> " + sw.getSimpleStatistics());
+        // System.out.println(pad(sourceName) + " ==> " + sw.getSimpleStatistics());
     }
 
     @Test
@@ -391,7 +391,7 @@
             sw.stop();
             assertThat(rootInfo, is(notNullValue()));
         }
-        System.out.println(pad(sourceName) + " ==> " + sw.getSimpleStatistics());
+        // System.out.println(pad(sourceName) + " ==> " + sw.getSimpleStatistics());
     }
 
     @Test
@@ -409,7 +409,7 @@
             sw.stop();
             assertThat(rootInfo, is(notNullValue()));
         }
-        System.out.println(pad(sourceName) + " ==> " + sw.getSimpleStatistics());
+        // System.out.println(pad(sourceName) + " ==> " + sw.getSimpleStatistics());
     }
 
     @Test
@@ -437,7 +437,7 @@
         sw.stop();
         assertThat(lr3.getUuid(), is(lr3Node.getLocation().getUuid()));
         assertSameProperties(lr3, lr3Node);
-        System.out.println(pad(sourceName) + " ==> " + sw.getSimpleStatistics());
+        // System.out.println(pad(sourceName) + " ==> " + sw.getSimpleStatistics());
 
         // Verify that this loaded all the intermediate nodes, by walking up ...
         NodeInfo info = lr3;
@@ -761,16 +761,18 @@
 
     @Test
     public void shouldFindInfoForAllNodesInGraph() throws Exception {
-        Stopwatch sw = new Stopwatch();
+        for (int i = 0; i != 3; ++i) {
+            Stopwatch sw = new Stopwatch();
 
-        // Get the root ...
-        sw.start();
-        NodeInfo root = cache.findNodeInfoForRoot();
-        cache.getPathFor(root);
-        sw.stop();
+            // Get the root ...
+            sw.start();
+            NodeInfo root = cache.findNodeInfoForRoot();
+            cache.getPathFor(root);
+            sw.stop();
 
-        // Walk the infos for nodes under the root (this is recursive) ...
-        walkInfosForNodesUnder(root, sw);
-        System.out.println("Statistics for walking nodes using SessionCache: " + sw.getSimpleStatistics());
+            // Walk the infos for nodes under the root (this is recursive) ...
+            walkInfosForNodesUnder(root, sw);
+            System.out.println("Statistics for walking nodes using SessionCache: " + sw.getSimpleStatistics());
+        }
     }
 }



From dna-commits at lists.jboss.org  Fri Jun 19 18:43:29 2009
From: dna-commits at lists.jboss.org (dna-commits at lists.jboss.org)
Date: Fri, 19 Jun 2009 18:43:29 -0400
Subject: [dna-commits] DNA SVN: r1054 - in trunk: dna-jcr/.settings and 5
	other directories.
Message-ID: <E1MHmnx-0000Xq-Ue@committer01.frg.pub.inap.atl.jboss.com>

Author: rhauch
Date: 2009-06-19 18:43:29 -0400 (Fri, 19 Jun 2009)
New Revision: 1054

Removed:
   trunk/dna-jcr/.settings/org.eclipse.jdt.core.prefs
   trunk/dna-jcr/.settings/org.eclipse.wst.common.component
   trunk/dna-jcr/.settings/org.eclipse.wst.common.project.facet.core.xml
Modified:
   trunk/dna-integration-tests/pom.xml
   trunk/dna-jcr-tck/pom.xml
   trunk/dna-jcr/src/test/java/org/jboss/dna/jcr/SessionCacheTest.java
   trunk/docs/examples/gettingstarted/repositories/pom.xml
   trunk/docs/examples/gettingstarted/sequencers/pom.xml
   trunk/extensions/dna-classloader-maven/pom.xml
Log:
Correct several POM files to more accurately reflect direct dependencies and usage

Modified: trunk/dna-integration-tests/pom.xml
===================================================================
--- trunk/dna-integration-tests/pom.xml	2009-06-17 17:19:39 UTC (rev 1053)
+++ trunk/dna-integration-tests/pom.xml	2009-06-19 22:43:29 UTC (rev 1054)
@@ -7,8 +7,8 @@
   </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>
-  <version>0.6-SNAPSHOT</version>
   <name>JBoss DNA Integration Tests</name>
   <url>http://labs.jboss.org/dna</url>
   

Deleted: trunk/dna-jcr/.settings/org.eclipse.jdt.core.prefs
===================================================================
--- trunk/dna-jcr/.settings/org.eclipse.jdt.core.prefs	2009-06-17 17:19:39 UTC (rev 1053)
+++ trunk/dna-jcr/.settings/org.eclipse.jdt.core.prefs	2009-06-19 22:43:29 UTC (rev 1054)
@@ -1,7 +0,0 @@
-#Fri May 15 17:59:45 EDT 2009
-eclipse.preferences.version=1
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6
-org.eclipse.jdt.core.compiler.compliance=1.6
-org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
-org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
-org.eclipse.jdt.core.compiler.source=1.6

Deleted: trunk/dna-jcr/.settings/org.eclipse.wst.common.component
===================================================================
--- trunk/dna-jcr/.settings/org.eclipse.wst.common.component	2009-06-17 17:19:39 UTC (rev 1053)
+++ trunk/dna-jcr/.settings/org.eclipse.wst.common.component	2009-06-19 22:43:29 UTC (rev 1054)
@@ -1,9 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project-modules id="moduleCoreId" project-version="1.5.0">
-    <wb-module deploy-name="dna-jcr">
-        <wb-resource deploy-path="/" source-path="/src/main/java"/>
-        <wb-resource deploy-path="/" source-path="/src/main/resources"/>
-        <wb-resource deploy-path="/" source-path="/src/test/java"/>
-        <wb-resource deploy-path="/" source-path="/src/test/resources"/>
-    </wb-module>
-</project-modules>

Deleted: trunk/dna-jcr/.settings/org.eclipse.wst.common.project.facet.core.xml
===================================================================
--- trunk/dna-jcr/.settings/org.eclipse.wst.common.project.facet.core.xml	2009-06-17 17:19:39 UTC (rev 1053)
+++ trunk/dna-jcr/.settings/org.eclipse.wst.common.project.facet.core.xml	2009-06-19 22:43:29 UTC (rev 1054)
@@ -1,5 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<faceted-project>
-  <installed facet="jst.java" version="6.0"/>
-  <installed facet="jst.utility" version="1.0"/>
-</faceted-project>

Modified: trunk/dna-jcr/src/test/java/org/jboss/dna/jcr/SessionCacheTest.java
===================================================================
--- trunk/dna-jcr/src/test/java/org/jboss/dna/jcr/SessionCacheTest.java	2009-06-17 17:19:39 UTC (rev 1053)
+++ trunk/dna-jcr/src/test/java/org/jboss/dna/jcr/SessionCacheTest.java	2009-06-19 22:43:29 UTC (rev 1054)
@@ -60,6 +60,7 @@
 import org.jboss.dna.graph.property.ValueFactory;
 import org.jboss.dna.jcr.SessionCache.NodeEditor;
 import org.jboss.dna.jcr.Vehicles.Lexicon;
+import org.jboss.dna.jcr.cache.ChildNode;
 import org.jboss.dna.jcr.cache.Children;
 import org.jboss.dna.jcr.cache.NodeInfo;
 import org.jboss.dna.jcr.cache.PropertyInfo;
@@ -744,4 +745,32 @@
         db9 = cache.findNodeInfo(root.getUuid(), path("/vehix:Vehicles/vehix:Cars/vehix:Sports/vehix:Aston Martin DB9"));
         assertNoProperty(db9, Lexicon.LENGTH_IN_INCHES);
     }
+
+    protected void walkInfosForNodesUnder( NodeInfo parentInfo,
+                                           Stopwatch sw ) throws Exception {
+        for (ChildNode child : parentInfo.getChildren()) {
+            sw.start();
+            NodeInfo childInfo = cache.findNodeInfo(child.getUuid());
+            cache.getPathFor(childInfo);
+            sw.stop();
+
+            // Walk the infos for nodes under the child (this is recursive) ...
+            walkInfosForNodesUnder(childInfo, sw);
+        }
+    }
+
+    @Test
+    public void shouldFindInfoForAllNodesInGraph() throws Exception {
+        Stopwatch sw = new Stopwatch();
+
+        // Get the root ...
+        sw.start();
+        NodeInfo root = cache.findNodeInfoForRoot();
+        cache.getPathFor(root);
+        sw.stop();
+
+        // Walk the infos for nodes under the root (this is recursive) ...
+        walkInfosForNodesUnder(root, sw);
+        System.out.println("Statistics for walking nodes using SessionCache: " + sw.getSimpleStatistics());
+    }
 }

Modified: trunk/dna-jcr-tck/pom.xml
===================================================================
--- trunk/dna-jcr-tck/pom.xml	2009-06-17 17:19:39 UTC (rev 1053)
+++ trunk/dna-jcr-tck/pom.xml	2009-06-19 22:43:29 UTC (rev 1054)
@@ -4,7 +4,7 @@
   <parent>
     <groupId>org.jboss.dna</groupId>
     <artifactId>dna</artifactId>
-    <version>0.5-SNAPSHOT</version>
+    <version>0.6-SNAPSHOT</version>
   </parent>
   <!-- The groupId and version values are inherited from parent -->
   <artifactId>dna-jcr-tck</artifactId>

Modified: trunk/docs/examples/gettingstarted/repositories/pom.xml
===================================================================
--- trunk/docs/examples/gettingstarted/repositories/pom.xml	2009-06-17 17:19:39 UTC (rev 1053)
+++ trunk/docs/examples/gettingstarted/repositories/pom.xml	2009-06-19 22:43:29 UTC (rev 1054)
@@ -18,15 +18,15 @@
   <dependencies>
     <dependency>
       <groupId>org.jboss.dna</groupId>
+      <artifactId>dna-graph</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.jboss.dna</groupId>
       <artifactId>dna-repository</artifactId>
-      <version>${pom.version}</version>
-      <scope>compile</scope>
     </dependency>
     <dependency>
       <groupId>org.jboss.dna</groupId>
       <artifactId>dna-jcr</artifactId>
-      <version>${pom.version}</version>
-      <scope>compile</scope>
     </dependency>
     <dependency>
       <groupId>org.jboss.dna</groupId>

Modified: trunk/docs/examples/gettingstarted/sequencers/pom.xml
===================================================================
--- trunk/docs/examples/gettingstarted/sequencers/pom.xml	2009-06-17 17:19:39 UTC (rev 1053)
+++ trunk/docs/examples/gettingstarted/sequencers/pom.xml	2009-06-19 22:43:29 UTC (rev 1054)
@@ -18,9 +18,15 @@
   <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>
-      <version>${pom.version}</version>
-      <scope>compile</scope>
     </dependency>
     <dependency>
       <groupId>org.jboss.dna</groupId>

Modified: trunk/extensions/dna-classloader-maven/pom.xml
===================================================================
--- trunk/extensions/dna-classloader-maven/pom.xml	2009-06-17 17:19:39 UTC (rev 1053)
+++ trunk/extensions/dna-classloader-maven/pom.xml	2009-06-19 22:43:29 UTC (rev 1054)
@@ -4,6 +4,7 @@
     <groupId>org.jboss.dna</groupId>
     <artifactId>dna</artifactId>
     <version>0.6-SNAPSHOT</version>
+    <relativePath>../..</relativePath>
   </parent>
   <!-- The groupId and version values are inherited from parent -->
   <artifactId>dna-classloader-maven</artifactId>



From dna-commits at lists.jboss.org  Sat Jun 20 11:13:30 2009
From: dna-commits at lists.jboss.org (dna-commits at lists.jboss.org)
Date: Sat, 20 Jun 2009 11:13:30 -0400
Subject: [dna-commits] DNA SVN: r1056 - in trunk:
	dna-graph/src/main/java/org/jboss/dna/graph/connector and 17
	other directories.
Message-ID: <E1MI2G2-0005ix-CS@committer01.frg.pub.inap.atl.jboss.com>

Author: bcarothers
Date: 2009-06-20 11:13:29 -0400 (Sat, 20 Jun 2009)
New Revision: 1056

Added:
   trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/UuidAlreadyExistsException.java
Modified:
   trunk/dna-graph/src/main/java/org/jboss/dna/graph/Graph.java
   trunk/dna-graph/src/main/java/org/jboss/dna/graph/GraphI18n.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/inmemory/InMemoryRepository.java
   trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/inmemory/InMemoryRequestProcessor.java
   trunk/dna-graph/src/main/java/org/jboss/dna/graph/request/UuidConflictBehavior.java
   trunk/dna-graph/src/main/resources/org/jboss/dna/graph/GraphI18n.properties
   trunk/dna-graph/src/test/java/org/jboss/dna/graph/connector/test/WritableConnectorTest.java
   trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/AbstractJcrNode.java
   trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/JcrContentHandler.java
   trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/JcrI18n.java
   trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/JcrNode.java
   trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/JcrRootNode.java
   trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/JcrWorkspace.java
   trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/SessionCache.java
   trunk/dna-jcr/src/main/resources/org/jboss/dna/jcr/JcrI18n.properties
   trunk/dna-jcr/src/test/java/org/jboss/dna/jcr/AbstractJcrNodeTest.java
   trunk/dna-jcr/src/test/java/org/jboss/dna/jcr/JcrRepositoryTest.java
   trunk/dna-jcr/src/test/java/org/jboss/dna/jcr/JcrTckTest.java
   trunk/dna-jcr/src/test/java/org/jboss/dna/jcr/JcrWorkspaceTest.java
   trunk/dna-jcr/src/test/resources/repositoryStubImpl.properties
   trunk/extensions/dna-connector-jbosscache/src/main/java/org/jboss/dna/connector/jbosscache/JBossCacheLexicon.java
   trunk/extensions/dna-connector-jbosscache/src/main/java/org/jboss/dna/connector/jbosscache/JBossCacheRequestProcessor.java
   trunk/extensions/dna-connector-jbosscache/src/test/java/org/jboss/dna/connector/jbosscache/JBossCacheRequestProcessorTest.java
   trunk/extensions/dna-connector-store-jpa/src/main/java/org/jboss/dna/connector/store/jpa/JpaConnectorI18n.java
   trunk/extensions/dna-connector-store-jpa/src/main/java/org/jboss/dna/connector/store/jpa/JpaSource.java
   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/ChildEntity.java
   trunk/extensions/dna-connector-store-jpa/src/main/java/org/jboss/dna/connector/store/jpa/model/basic/ChildId.java
   trunk/extensions/dna-connector-store-jpa/src/main/java/org/jboss/dna/connector/store/jpa/model/basic/PropertiesEntity.java
   trunk/extensions/dna-connector-store-jpa/src/main/java/org/jboss/dna/connector/store/jpa/model/basic/ReferenceEntity.java
   trunk/extensions/dna-connector-store-jpa/src/main/java/org/jboss/dna/connector/store/jpa/model/basic/SubgraphNodeEntity.java
   trunk/extensions/dna-connector-store-jpa/src/main/java/org/jboss/dna/connector/store/jpa/model/basic/SubgraphQuery.java
   trunk/extensions/dna-connector-store-jpa/src/main/java/org/jboss/dna/connector/store/jpa/util/RequestProcessorCache.java
   trunk/extensions/dna-connector-store-jpa/src/main/java/org/jboss/dna/connector/store/jpa/util/Serializer.java
   trunk/extensions/dna-connector-store-jpa/src/main/resources/org/jboss/dna/connector/store/jpa/JpaConnectorI18n.properties
   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/model/basic/BasicModelTest.java
   trunk/extensions/dna-connector-store-jpa/src/test/java/org/jboss/dna/connector/store/jpa/model/basic/ChildEntityTest.java
   trunk/extensions/dna-connector-store-jpa/src/test/java/org/jboss/dna/connector/store/jpa/model/basic/SubgraphQueryTest.java
Log:
DNA-370 JcrWorkspace.clone Is Not Implemented

Applied the attached patch (DNA-370_copy_behavior) to add support for UuidConflictBehavior in the graph layer and each of the three connectors that currently support writes. This includes the previous patch to modify the JPA connector and required some fairly heavy modifications of the JBoss Cache connector to support efficient look-ups by UUID.

The patch also corrects some configuration to allow the JR TCK clone tests to start working. This will result in one false negative in the nightly TCK compatibility build, as there is a clone test that assumes the repository supports locking.

There is still some work left to be done to fully support clone. If removeExisting is true, the JCR layer must first identify any conflicts and speculatively remove them to make sure that removing the existing nodes won't violate type constraints. This check cannot be done at the graph or connector layer, as those layers are unaware of the JCR typing semantics. Additionally, the update method must still be implemented.

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	2009-06-19 22:43:42 UTC (rev 1055)
+++ trunk/dna-graph/src/main/java/org/jboss/dna/graph/Graph.java	2009-06-20 15:13:29 UTC (rev 1056)
@@ -568,7 +568,8 @@
             protected Graph submit( String fromWorkspaceName,
                                     Locations from,
                                     Location into,
-                                    Name childName ) {
+                                    Name childName,
+                                    UuidConflictBehavior uuidConflictBehavior ) {
                 String workspaceName = fromWorkspaceName != null ? fromWorkspaceName : getCurrentWorkspaceName();
                 do {
                     requests.copyBranch(from.getLocation(),
@@ -577,7 +578,7 @@
                                         getCurrentWorkspaceName(),
                                         childName,
                                         NodeConflictBehavior.APPEND,
-                                        UuidConflictBehavior.ALWAYS_CREATE_NEW_UUID);
+                                        uuidConflictBehavior);
                 } while ((from = from.next()) != null);
                 return and();
             }
@@ -2372,7 +2373,8 @@
                 protected BatchConjunction submit( String fromWorkspaceName,
                                                    Locations from,
                                                    Location into,
-                                                   Name copyName ) {
+                                                   Name copyName,
+                                                   UuidConflictBehavior uuidConflictBehavior ) {
                     String workspaceName = fromWorkspaceName != null ? fromWorkspaceName : getCurrentWorkspaceName();
                     do {
                         requestQueue.copyBranch(from.getLocation(),
@@ -2381,7 +2383,7 @@
                                                 workspaceName,
                                                 copyName,
                                                 null,
-                                                UuidConflictBehavior.ALWAYS_CREATE_NEW_UUID);
+                                                uuidConflictBehavior);
                     } while ((from = from.next()) != null);
                     return and();
                 }
@@ -4023,11 +4025,11 @@
      * @param <Next> The interface that is to be returned when this request is completed
      */
     public interface WithUuids<Next> {
-        Next removingMatchingUuids();
+        Next withNewUuids();
 
         Next failingIfUuidsMatch();
 
-        Next unlessMatchingUuidExists();
+        Next replacingExistingNodesWithSameUuids();
     }
 
     /**
@@ -5848,25 +5850,28 @@
          * @param from the locations that are being copied
          * @param into the parent location
          * @param nameForCopy the name that should be used for the copy, or null if the name should be the same as the original
+         * @param uuidConflictBehavior the behavior to be used for resolving any UUID collisions that the copy request might
+         *        create
          * @return this object, for method chaining
          */
         protected abstract T submit( String fromWorkspaceName,
-                           Locations from,
-                           Location into,
-                           Name nameForCopy );
+                                     Locations from,
+                                     Location into,
+                                     Name nameForCopy,
+                                     UuidConflictBehavior uuidConflictBehavior );
 
         public FromWorkspace<CopyTarget<T>> failingIfUuidsMatch() {
             this.uuidConflictBehavior = UuidConflictBehavior.THROW_EXCEPTION;
             return this;
         }
 
-        public FromWorkspace<CopyTarget<T>> removingMatchingUuids() {
-            this.uuidConflictBehavior = UuidConflictBehavior.REPLACE_EXISTING_NODE;
+        public FromWorkspace<CopyTarget<T>> withNewUuids() {
+            this.uuidConflictBehavior = UuidConflictBehavior.ALWAYS_CREATE_NEW_UUID;
             return this;
         }
 
-        public FromWorkspace<CopyTarget<T>> unlessMatchingUuidExists() {
-            this.uuidConflictBehavior = UuidConflictBehavior.DO_NOT_COPY;
+        public FromWorkspace<CopyTarget<T>> replacingExistingNodesWithSameUuids() {
+            this.uuidConflictBehavior = UuidConflictBehavior.REPLACE_EXISTING_NODE;
             return this;
         }
 
@@ -5877,28 +5882,32 @@
         }
 
         public T into( Location into ) {
-            return submit(this.fromWorkspaceName, this.from, into, null);
+            return submit(this.fromWorkspaceName, this.from, into, null, this.uuidConflictBehavior);
         }
 
         public T into( Path into ) {
-            return submit(this.fromWorkspaceName, this.from, Location.create(into), null);
+            return submit(this.fromWorkspaceName, this.from, Location.create(into), null, this.uuidConflictBehavior);
         }
 
         public T into( UUID into ) {
-            return submit(this.fromWorkspaceName, this.from, Location.create(into), null);
+            return submit(this.fromWorkspaceName, this.from, Location.create(into), null, this.uuidConflictBehavior);
         }
 
         public T into( Property firstIdProperty,
                        Property... additionalIdProperties ) {
-            return submit(this.fromWorkspaceName, this.from, Location.create(firstIdProperty, additionalIdProperties), null);
+            return submit(this.fromWorkspaceName,
+                          this.from,
+                          Location.create(firstIdProperty, additionalIdProperties),
+                          null,
+                          this.uuidConflictBehavior);
         }
 
         public T into( Property into ) {
-            return submit(this.fromWorkspaceName, this.from, Location.create(into), null);
+            return submit(this.fromWorkspaceName, this.from, Location.create(into), null, this.uuidConflictBehavior);
         }
 
         public T into( String into ) {
-            return submit(this.fromWorkspaceName, this.from, Location.create(createPath(into)), null);
+            return submit(this.fromWorkspaceName, this.from, Location.create(createPath(into)), null, this.uuidConflictBehavior);
         }
 
         public T to( Location desiredLocation ) {
@@ -5910,7 +5919,11 @@
                 throw new IllegalArgumentException(GraphI18n.unableToCopyToTheRoot.text(this.from, desiredLocation));
             }
             Path parent = desiredPath.getParent();
-            return submit(this.fromWorkspaceName, this.from, Location.create(parent), desiredPath.getLastSegment().getName());
+            return submit(this.fromWorkspaceName,
+                          this.from,
+                          Location.create(parent),
+                          desiredPath.getLastSegment().getName(),
+                          this.uuidConflictBehavior);
         }
 
         public T to( Path desiredPath ) {
@@ -5918,7 +5931,11 @@
                 throw new IllegalArgumentException(GraphI18n.unableToCopyToTheRoot.text(this.from, desiredPath));
             }
             Path parent = desiredPath.getParent();
-            return submit(this.fromWorkspaceName, this.from, Location.create(parent), desiredPath.getLastSegment().getName());
+            return submit(this.fromWorkspaceName,
+                          this.from,
+                          Location.create(parent),
+                          desiredPath.getLastSegment().getName(),
+                          this.uuidConflictBehavior);
         }
 
         public T to( String desiredPath ) {

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	2009-06-19 22:43:42 UTC (rev 1055)
+++ trunk/dna-graph/src/main/java/org/jboss/dna/graph/GraphI18n.java	2009-06-20 15:13:29 UTC (rev 1056)
@@ -88,6 +88,7 @@
 
     public static I18n errorImportingContent;
     public static I18n unableToFindRepositorySourceWithName;
+    public static I18n nodeAlreadyExistsWithUuid;
 
     /* In-Memory Connector */
     public static I18n inMemoryNodeDoesNotExist;

Added: trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/UuidAlreadyExistsException.java
===================================================================
--- trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/UuidAlreadyExistsException.java	                        (rev 0)
+++ trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/UuidAlreadyExistsException.java	2009-06-20 15:13:29 UTC (rev 1056)
@@ -0,0 +1,24 @@
+package org.jboss.dna.graph.connector;
+
+import java.util.UUID;
+import org.jboss.dna.graph.GraphI18n;
+import org.jboss.dna.graph.request.CopyBranchRequest;
+import org.jboss.dna.graph.request.UuidConflictBehavior;
+
+/**
+ * Exception that indicates that a copy request failed because one of the UUIDs in the source branch already exists in the target
+ * workspace and the {@link CopyBranchRequest#uuidConflictBehavior() UUID conflict behavior} is set to
+ * {@link UuidConflictBehavior#THROW_EXCEPTION}.
+ */
+public class UuidAlreadyExistsException extends RepositorySourceException {
+
+    private static final long serialVersionUID = 1L;
+
+    public UuidAlreadyExistsException( String repositorySourceName,
+                                       UUID uuid,
+                                       String pathAsString,
+                                       String workspaceName ) {
+        super(repositorySourceName, GraphI18n.nodeAlreadyExistsWithUuid.text(uuid, pathAsString, workspaceName));
+    }
+
+}


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

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	2009-06-19 22:43:42 UTC (rev 1055)
+++ trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/federation/ForkRequestProcessor.java	2009-06-20 15:13:29 UTC (rev 1056)
@@ -1262,8 +1262,7 @@
         // Create the pushed-down request ...
         CopyBranchRequest pushDown = new CopyBranchRequest(fromProxy.location(), fromProxy.workspaceName(), intoProxy.location(),
                                                            intoProxy.workspaceName(), request.desiredName(),
-                                                           request.nodeConflictBehavior(),
-                                                           request.uuidConflictBehavior());
+                                                           request.nodeConflictBehavior(), request.uuidConflictBehavior());
         // Create the federated request ...
         FederatedRequest federatedRequest = new FederatedRequest(request);
         federatedRequest.add(pushDown, sameLocation, false, fromProxy.projection(), intoProxy.projection());

Modified: trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/inmemory/InMemoryRepository.java
===================================================================
--- trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/inmemory/InMemoryRepository.java	2009-06-19 22:43:42 UTC (rev 1055)
+++ trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/inmemory/InMemoryRepository.java	2009-06-20 15:13:29 UTC (rev 1056)
@@ -25,6 +25,7 @@
 
 import java.util.ArrayList;
 import java.util.HashMap;
+import java.util.HashSet;
 import java.util.Iterator;
 import java.util.LinkedList;
 import java.util.List;
@@ -40,6 +41,7 @@
 import org.jboss.dna.graph.ExecutionContext;
 import org.jboss.dna.graph.property.Name;
 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.PropertyType;
@@ -229,6 +231,30 @@
         }
 
         /**
+         * Returns the absolute path to the given node
+         * 
+         * @param pathFactory the path factory to use to create the path from the list of names of all of the nodes on the path
+         *        from the root node to the given node
+         * @param node the node for which the path should be returned
+         * @return the absolute path to the given node
+         */
+        Path pathFor( PathFactory pathFactory,
+                      InMemoryNode node ) {
+            assert node != null;
+            assert pathFactory != null;
+
+            LinkedList<Path.Segment> segments = new LinkedList<Path.Segment>();
+            InMemoryNode root = getRoot();
+
+            do {
+                segments.addFirst(node.getName());
+                node = node.getParent();
+            } while (!node.equals(root));
+
+            return pathFactory.createAbsolutePath(segments);
+        }
+
+        /**
          * Find the lowest existing node along the path.
          * 
          * @param path the path to the node; may not be null
@@ -358,12 +384,12 @@
                               Name desiredNewName,
                               Workspace newWorkspace,
                               InMemoryNode newParent,
-                              InMemoryNode beforeNode) {
+                              InMemoryNode beforeNode ) {
             assert context != null;
             assert newParent != null;
             assert node != null;
-// Why was this restriction here? -- BRC            
-//            assert newWorkspace.getRoot().equals(newParent) != true;
+            // Why was this restriction here? -- BRC
+            // assert newWorkspace.getRoot().equals(newParent) != true;
             assert this.getRoot().equals(node) != true;
             InMemoryNode oldParent = node.getParent();
             Name oldName = node.getName().getName();
@@ -379,16 +405,15 @@
                 newName = desiredNewName;
                 node.setName(context.getValueFactories().getPathFactory().createSegment(desiredNewName, 1));
             }
-            
+
             if (beforeNode == null) {
                 newParent.getChildren().add(node);
-            }
-            else {
+            } else {
                 int index = newParent.getChildren().indexOf(beforeNode);
                 newParent.getChildren().add(index, node);
             }
             correctSameNameSiblingIndexes(context, newParent, newName);
-            
+
             // If the node was moved to a new workspace...
             if (!this.equals(newWorkspace)) {
                 // We need to remove the node from this workspace's map of nodes ...
@@ -434,14 +459,13 @@
             assert original != null;
             assert newParent != null;
             assert newWorkspace != null;
-            if (this.equals(newWorkspace) && oldToNewUuids == null) oldToNewUuids = new HashMap<UUID, UUID>();
             boolean reuseUuids = oldToNewUuids == null;
 
             // Get or create the new node ...
             Name childName = desiredName != null ? desiredName : original.getName().getName();
             UUID uuidForCopy = reuseUuids ? original.getUuid() : UUID.randomUUID();
             InMemoryNode copy = newWorkspace.createNode(context, newParent, childName, uuidForCopy);
-            if (oldToNewUuids != null) {
+            if (!reuseUuids) {
                 oldToNewUuids.put(original.getUuid(), copy.getUuid());
             }
 
@@ -455,7 +479,7 @@
                 }
             }
 
-            if (oldToNewUuids != null) {
+            if (!reuseUuids) {
                 // Now, adjust any references in the new subgraph to objects in the original subgraph
                 // (because they were internal references, and need to be internal to the new subgraph)
                 PropertyFactory propertyFactory = context.getPropertyFactory();
@@ -498,6 +522,22 @@
             return copy;
         }
 
+        public Set<UUID> getUuidsUnderNode( InMemoryNode node ) {
+            Set<UUID> uuids = new HashSet<UUID>();
+            uuidsUnderNode(node, uuids);
+
+            return uuids;
+        }
+
+        private void uuidsUnderNode( InMemoryNode node,
+                                     Set<UUID> accumulator ) {
+            accumulator.add(node.getUuid());
+
+            for (InMemoryNode child : node.getChildren()) {
+                uuidsUnderNode(child, accumulator);
+            }
+        }
+
         protected void correctSameNameSiblingIndexes( ExecutionContext context,
                                                       InMemoryNode parentNode,
                                                       Name name ) {

Modified: trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/inmemory/InMemoryRequestProcessor.java
===================================================================
--- trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/inmemory/InMemoryRequestProcessor.java	2009-06-19 22:43:42 UTC (rev 1055)
+++ trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/inmemory/InMemoryRequestProcessor.java	2009-06-20 15:13:29 UTC (rev 1056)
@@ -38,7 +38,9 @@
 import org.jboss.dna.graph.JcrLexicon;
 import org.jboss.dna.graph.Location;
 import org.jboss.dna.graph.connector.RepositoryContext;
+import org.jboss.dna.graph.connector.UuidAlreadyExistsException;
 import org.jboss.dna.graph.property.Name;
+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;
@@ -119,11 +121,51 @@
         if (workspace == null || newWorkspace == null) return;
         InMemoryNode node = getTargetNode(workspace, request, request.from());
         if (node == null) return;
+
+        Map<UUID, UUID> copyMap = null;
+        Set<UUID> uuidsInFromBranch = null;
+
+        switch (request.uuidConflictBehavior()) {
+            case ALWAYS_CREATE_NEW_UUID:
+
+                /*
+                 * The copyNode method uses the presence of a non-null map as an indicator that new UUIDs should be created
+                 * during the copy operation
+                 */
+                copyMap = new HashMap<UUID, UUID>();
+                break;
+            case REPLACE_EXISTING_NODE:
+                uuidsInFromBranch = workspace.getUuidsUnderNode(node);
+
+                for (UUID uuid : uuidsInFromBranch) {
+                    InMemoryNode existing;
+                    if (null != (existing = newWorkspace.getNode(uuid))) {
+                        newWorkspace.removeNode(this.getExecutionContext(), existing);
+                    }
+                }
+                break;
+            case THROW_EXCEPTION:
+                uuidsInFromBranch = workspace.getUuidsUnderNode(node);
+
+                for (UUID uuid : uuidsInFromBranch) {
+                    InMemoryNode existing;
+                    if (null != (existing = newWorkspace.getNode(uuid))) {
+                        NamespaceRegistry namespaces = this.getExecutionContext().getNamespaceRegistry();
+                        String path = newWorkspace.pathFor(pathFactory, existing).getString(namespaces);
+                        request.setError(new UuidAlreadyExistsException(this.getSourceName(), uuid, path, newWorkspace.getName()));
+                        return;
+                    }
+                }
+                break;
+
+            default:
+                throw new IllegalStateException("Unexpected UUID conflict behavior: " + request.uuidConflictBehavior());
+        }
+
         // Look up the new parent, which must exist ...
         Path newParentPath = request.into().getPath();
         Name desiredName = request.desiredName();
         InMemoryNode newParent = newWorkspace.getNode(newParentPath);
-        Map<UUID, UUID> copyMap = workspace.equals(newWorkspace) ? new HashMap<UUID, UUID>() : null;
         InMemoryNode newNode = workspace.copyNode(getExecutionContext(),
                                                   node,
                                                   newWorkspace,
@@ -222,24 +264,23 @@
         if (node == null) return;
         // Look up the new parent, which must exist ...
         Path newParentPath;
-        
+
         if (request.into() != null) {
             newParentPath = request.into().getPath();
-        }
-        else {
+        } else {
             // into or before cannot both be null
             assert beforeNode != null;
-            
+
             // Build the path from the before node to the root.
             LinkedList<Path.Segment> segments = new LinkedList<Path.Segment>();
             InMemoryNode current = beforeNode.getParent();
             while (current != workspace.getRoot()) {
                 segments.addFirst(current.getName());
                 current = current.getParent();
-            } 
+            }
             newParentPath = getExecutionContext().getValueFactories().getPathFactory().createAbsolutePath(segments);
         }
-        
+
         InMemoryNode newParent = workspace.getNode(newParentPath);
         workspace.moveNode(getExecutionContext(), node, request.desiredName(), workspace, newParent, beforeNode);
         assert node.getParent() == newParent;

Modified: trunk/dna-graph/src/main/java/org/jboss/dna/graph/request/UuidConflictBehavior.java
===================================================================
--- trunk/dna-graph/src/main/java/org/jboss/dna/graph/request/UuidConflictBehavior.java	2009-06-19 22:43:42 UTC (rev 1055)
+++ trunk/dna-graph/src/main/java/org/jboss/dna/graph/request/UuidConflictBehavior.java	2009-06-20 15:13:29 UTC (rev 1056)
@@ -9,7 +9,6 @@
 public enum UuidConflictBehavior {
 
     ALWAYS_CREATE_NEW_UUID,
-    DO_NOT_COPY,
     REPLACE_EXISTING_NODE,
     THROW_EXCEPTION;
 }

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	2009-06-19 22:43:42 UTC (rev 1055)
+++ trunk/dna-graph/src/main/resources/org/jboss/dna/graph/GraphI18n.properties	2009-06-20 15:13:29 UTC (rev 1056)
@@ -75,6 +75,7 @@
 
 errorImportingContent = Error importing {0} content from {1}
 unableToFindRepositorySourceWithName = Unable to find a repository source named "{0}"
+nodeAlreadyExistsWithUuid = A node with UUID "{0}" already exists at path "{1}" in workspace "{2}"
 
 # In-memory connector
 inMemoryNodeDoesNotExist = Could not find an existing node at {0}

Modified: trunk/dna-graph/src/test/java/org/jboss/dna/graph/connector/test/WritableConnectorTest.java
===================================================================
--- trunk/dna-graph/src/test/java/org/jboss/dna/graph/connector/test/WritableConnectorTest.java	2009-06-19 22:43:42 UTC (rev 1055)
+++ trunk/dna-graph/src/test/java/org/jboss/dna/graph/connector/test/WritableConnectorTest.java	2009-06-20 15:13:29 UTC (rev 1056)
@@ -25,12 +25,16 @@
 
 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.jboss.dna.graph.IsNodeWithChildren.hasChild;
 import static org.jboss.dna.graph.IsNodeWithChildren.hasChildren;
 import static org.jboss.dna.graph.IsNodeWithChildren.isEmpty;
 import static org.jboss.dna.graph.IsNodeWithProperty.hasProperty;
 import static org.junit.Assert.assertThat;
+import static org.junit.Assert.fail;
+import static org.junit.Assume.assumeNoException;
+import java.util.UUID;
 import org.jboss.dna.common.statistic.Stopwatch;
 import org.jboss.dna.common.util.IoUtil;
 import org.jboss.dna.graph.DnaLexicon;
@@ -38,8 +42,11 @@
 import org.jboss.dna.graph.Node;
 import org.jboss.dna.graph.Subgraph;
 import org.jboss.dna.graph.connector.RepositorySource;
+import org.jboss.dna.graph.connector.UuidAlreadyExistsException;
+import org.jboss.dna.graph.property.PathNotFoundException;
 import org.jboss.dna.graph.property.Reference;
 import org.junit.Before;
+import org.junit.Ignore;
 import org.junit.Test;
 
 /**
@@ -68,6 +75,14 @@
             IoUtil.read(getClass().getClassLoader().getResourceAsStream("LoremIpsum3.txt"))};
     }
 
+    protected void tryCreatingAWorkspaceNamed( String workspaceName ) {
+        try {
+            graph.createWorkspace().named(workspaceName);
+        } catch (Exception ex) {
+            assumeNoException(ex);
+        }
+    }
+
     /**
      * These tests require that the source supports updates, since all of the tests do some form of updates.
      */
@@ -105,19 +120,9 @@
 
     @Test
     public void shouldAddChildrenAndSettingProperties() {
-        graph.batch()
-             .set("propA")
-             .to("valueA")
-             .on("/")
-             .and()
-             .create("/a")
-             .with("propB", "valueB")
-             .and("propC", "valueC")
-             .and()
-             .create("/b")
-             .with("propD", "valueD")
-             .and("propE", "valueE")
-             .execute();
+        graph.batch().set("propA").to("valueA").on("/").and().create("/a").with("propB", "valueB").and("propC", "valueC").and().create("/b").with("propD",
+                                                                                                                                                  "valueD").and("propE",
+                                                                                                                                                                "valueE").execute();
         // Now look up the root node ...
         Node root = graph.getNodeAt("/");
         assertThat(root, is(notNullValue()));
@@ -303,6 +308,7 @@
         createSubgraph(graph, initialPath, depth, numChildrenPerNode, numPropertiesPerNode, batch, sw, System.out, description);
     }
 
+    @Ignore
     @Test
     public void shouldCreateTreeWith10ChildrenAnd2LevelsDeepUsingIndividualRequests() {
         String initialPath = "";
@@ -314,6 +320,7 @@
         createSubgraph(graph, initialPath, depth, numChildrenPerNode, numPropertiesPerNode, batch, sw, System.out, null);
     }
 
+    @Ignore
     @Test
     public void shouldCreateTreeWith10ChildrenAnd2LevelsDeepUsingOneBatch() {
         String initialPath = "";
@@ -325,6 +332,7 @@
         createSubgraph(graph, initialPath, depth, numChildrenPerNode, numPropertiesPerNode, batch, sw, System.out, null);
     }
 
+    @Ignore
     @Test
     public void shouldCreateTreeWith10ChildrenAnd3LevelsDeepUsingOneBatch() {
         String initialPath = "";
@@ -810,6 +818,178 @@
                                                                          "The quick brown fox jumped over the moon. What? "));
     }
 
+    @Test
+    public void shouldCopyChildrenBetweenWorkspacesWithNewUuids() throws Exception {
+        String defaultWorkspaceName = graph.getCurrentWorkspaceName();
+        String workspaceName = "copyChildrenSource";
+
+        tryCreatingAWorkspaceNamed(workspaceName);
+
+        graph.useWorkspace(workspaceName);
+        String initialPath = "";
+        int depth = 3;
+        int numChildrenPerNode = 3;
+        int numPropertiesPerNode = 3;
+        Stopwatch sw = new Stopwatch();
+        boolean batch = true;
+        createSubgraph(graph, initialPath, depth, numChildrenPerNode, numPropertiesPerNode, batch, sw, System.out, null);
+
+        Subgraph source = graph.getSubgraphOfDepth(3).at("/node1");
+
+        graph.useWorkspace(defaultWorkspaceName);
+
+        graph.create("/newUuids");
+        graph.copy("/node1").withNewUuids().fromWorkspace(workspaceName).to("/newUuids/node1");
+
+        /*
+         * Focus on testing node structure, since shouldCopyNodeWithChildren tests that properties get copied
+         */
+        Subgraph target = graph.getSubgraphOfDepth(3).at("/newUuids/node1");
+        assertThat(target, is(notNullValue()));
+        assertThat(target.getNode(".").getChildren(), hasChildren(segment("node1"), segment("node2"), segment("node3")));
+        assertThat(uuidFor(target.getNode(".")), not(uuidFor(source.getNode("."))));
+        assertThat(target.getNode("node1").getChildren(), hasChildren(segment("node1"), segment("node2"), segment("node3")));
+        assertThat(uuidFor(target.getNode("node1")), not(uuidFor(source.getNode("node1"))));
+        assertThat(target.getNode("node2").getChildren(), hasChildren(segment("node1"), segment("node2"), segment("node3")));
+        assertThat(uuidFor(target.getNode("node2")), not(uuidFor(source.getNode("node2"))));
+        assertThat(target.getNode("node3").getChildren(), hasChildren(segment("node1"), segment("node2"), segment("node3")));
+        assertThat(uuidFor(target.getNode("node3")), not(uuidFor(source.getNode("node3"))));
+
+    }
+
+    @Test
+    public void shouldCopyChildrenBetweenWorkspacesPreservingUuids() throws Exception {
+        String defaultWorkspaceName = graph.getCurrentWorkspaceName();
+        String workspaceName = "copyChildrenSource";
+
+        tryCreatingAWorkspaceNamed(workspaceName);
+
+        graph.useWorkspace(workspaceName);
+        String initialPath = "";
+        int depth = 3;
+        int numChildrenPerNode = 3;
+        int numPropertiesPerNode = 3;
+        Stopwatch sw = new Stopwatch();
+        boolean batch = true;
+        createSubgraph(graph, initialPath, depth, numChildrenPerNode, numPropertiesPerNode, batch, sw, System.out, null);
+
+        Subgraph source = graph.getSubgraphOfDepth(3).at("/node1");
+
+        graph.useWorkspace(defaultWorkspaceName);
+
+        graph.create("/newUuids");
+        graph.copy("/node1").replacingExistingNodesWithSameUuids().fromWorkspace(workspaceName).to("/newUuids/node1");
+
+        /*
+         * Focus on testing node structure, since shouldCopyNodeWithChildren tests that properties get copied
+         */
+        Subgraph target = graph.getSubgraphOfDepth(3).at("/newUuids/node1");
+        assertThat(target, is(notNullValue()));
+        assertThat(target.getNode(".").getChildren(), hasChildren(segment("node1"), segment("node2"), segment("node3")));
+        assertThat(uuidFor(target.getNode(".")), is(uuidFor(source.getNode("."))));
+        assertThat(target.getNode("node1").getChildren(), hasChildren(segment("node1"), segment("node2"), segment("node3")));
+        assertThat(uuidFor(target.getNode("node1")), is(uuidFor(source.getNode("node1"))));
+        assertThat(target.getNode("node2").getChildren(), hasChildren(segment("node1"), segment("node2"), segment("node3")));
+        assertThat(uuidFor(target.getNode("node2")), is(uuidFor(source.getNode("node2"))));
+        assertThat(target.getNode("node3").getChildren(), hasChildren(segment("node1"), segment("node2"), segment("node3")));
+        assertThat(uuidFor(target.getNode("node3")), is(uuidFor(source.getNode("node3"))));
+
+    }
+
+    @Test
+    public void shouldNotCopyChildrenBetweenWorkspacesIfUuidConflictAndFailureBehavior() throws Exception {
+        String defaultWorkspaceName = graph.getCurrentWorkspaceName();
+        String workspaceName = "copyChildrenSource";
+
+        tryCreatingAWorkspaceNamed(workspaceName);
+
+        graph.useWorkspace(workspaceName);
+        String initialPath = "";
+        int depth = 3;
+        int numChildrenPerNode = 3;
+        int numPropertiesPerNode = 3;
+        Stopwatch sw = new Stopwatch();
+        boolean batch = true;
+        createSubgraph(graph, initialPath, depth, numChildrenPerNode, numPropertiesPerNode, batch, sw, System.out, null);
+
+        graph.useWorkspace(defaultWorkspaceName);
+
+        graph.create("/newUuids");
+        // Copy once to get the UUID into the default workspace
+        graph.copy("/node1/node1/node1").failingIfUuidsMatch().fromWorkspace(workspaceName).to("/newUuids/node1");
+
+        try {
+            // Copy again to get the exception since the UUID is already in the default workspace
+            graph.copy("/node1/node1").failingIfUuidsMatch().fromWorkspace(workspaceName).to("/newUuids/shouldNotWork");
+            fail("Should not be able to copy a node into a workspace if another node with the "
+                 + "same UUID already exists in the workspace and UUID behavior is failingIfUuidsMatch");
+        } catch (UuidAlreadyExistsException ex) {
+            // Expected
+        }
+
+    }
+
+    @Test
+    public void shouldCopyChildrenBetweenWorkspacesAndRemoveExistingNodesWithSameUuidIfSpecified() throws Exception {
+        String defaultWorkspaceName = graph.getCurrentWorkspaceName();
+        String workspaceName = "copyChildrenSource";
+
+        tryCreatingAWorkspaceNamed(workspaceName);
+
+        graph.useWorkspace(workspaceName);
+        String initialPath = "";
+        int depth = 3;
+        int numChildrenPerNode = 3;
+        int numPropertiesPerNode = 3;
+        Stopwatch sw = new Stopwatch();
+        boolean batch = true;
+        createSubgraph(graph, initialPath, depth, numChildrenPerNode, numPropertiesPerNode, batch, sw, System.out, null);
+
+        Subgraph source = graph.getSubgraphOfDepth(3).at("/node1");
+
+        graph.useWorkspace(defaultWorkspaceName);
+
+        graph.create("/newUuids");
+        // Copy once to get the UUID into the default workspace
+        graph.copy("/node1").replacingExistingNodesWithSameUuids().fromWorkspace(workspaceName).to("/newUuids/node1");
+        
+        // Create a new child node that in the target workspace that has no corresponding node in the source workspace
+        graph.create("/newUuids/node1/shouldBeRemoved");
+        
+        // Copy again to test the behavior now that the UUIDs are already in the default workspace
+        // This should remove /newUuids/node1/shouldBeRemoved
+        graph.copy("/node1").replacingExistingNodesWithSameUuids().fromWorkspace(workspaceName).to("/newUuids/otherNode");
+
+        /*
+         * Focus on testing node structure, since shouldCopyNodeWithChildren tests that properties get copied
+         */
+        // /newUuids/node1 should have been removed when the new node was added with the same UUID
+        assertThat(graph.getNodeAt("/newUuids").getChildren(), hasChildren(segment("otherNode")));
+
+        try {
+            graph.getNodeAt("/newUuids/node1/shouldBeRemoved");
+            fail("/newUuids/node1/shouldBeRemoved should no longer exist after the copy-with-remove-conflicting-uuids operation");
+        }
+        catch (PathNotFoundException pnfe) {
+            // Expected
+        }
+        
+        Subgraph target = graph.getSubgraphOfDepth(3).at("/newUuids/otherNode");
+        assertThat(target, is(notNullValue()));
+        assertThat(target.getNode(".").getChildren(), hasChildren(segment("node1"), segment("node2"), segment("node3")));
+        assertThat(uuidFor(target.getNode(".")), is(uuidFor(source.getNode("."))));
+        assertThat(target.getNode("node1").getChildren(), hasChildren(segment("node1"), segment("node2"), segment("node3")));
+        assertThat(uuidFor(target.getNode("node1")), is(uuidFor(source.getNode("node1"))));
+        assertThat(target.getNode("node2").getChildren(), hasChildren(segment("node1"), segment("node2"), segment("node3")));
+        assertThat(uuidFor(target.getNode("node2")), is(uuidFor(source.getNode("node2"))));
+        assertThat(target.getNode("node3").getChildren(), hasChildren(segment("node1"), segment("node2"), segment("node3")));
+        assertThat(uuidFor(target.getNode("node3")), is(uuidFor(source.getNode("node3"))));
+    }
+    
+    private UUID uuidFor( Node node ) {
+        return (UUID)node.getProperty(DnaLexicon.UUID).getFirstValue();
+    }
+
     protected void assertReference( String fromNodePath,
                                     String propertyName,
                                     String... toNodePath ) {
@@ -1463,12 +1643,15 @@
         assertThat(graph.getChildren().of("/node3/node3"), hasChildren(segment("node1"), segment("node2"), segment("node3")));
         assertThat(graph.getChildren().of("/node3/node3/node1"), hasChildren());
         assertThat(graph.getChildren().of("/node3/node2[1]"), hasChildren(segment("node1"), segment("node2"), segment("node3")));
-        assertThat(graph.getChildren().of("/node3/node2[1]/node1"),
-                   hasChildren(segment("node1"), segment("node2"), segment("node3")));
-        assertThat(graph.getChildren().of("/node3/node2[1]/node2"),
-                   hasChildren(segment("node1"), segment("node2"), segment("node3")));
-        assertThat(graph.getChildren().of("/node3/node2[1]/node3"),
-                   hasChildren(segment("node1"), segment("node2"), segment("node3")));
+        assertThat(graph.getChildren().of("/node3/node2[1]/node1"), hasChildren(segment("node1"),
+                                                                                segment("node2"),
+                                                                                segment("node3")));
+        assertThat(graph.getChildren().of("/node3/node2[1]/node2"), hasChildren(segment("node1"),
+                                                                                segment("node2"),
+                                                                                segment("node3")));
+        assertThat(graph.getChildren().of("/node3/node2[1]/node3"), hasChildren(segment("node1"),
+                                                                                segment("node2"),
+                                                                                segment("node3")));
         assertThat(graph.getChildren().of("/node3/node2[1]/node1/node1"), hasChildren());
 
         Subgraph subgraph = graph.getSubgraphOfDepth(4).at("/node3");
@@ -1490,80 +1673,89 @@
         assertThat(subgraph.getNode("node2[1]"), hasProperty("property2", "The quick brown fox jumped over the moon. What? "));
         assertThat(subgraph.getNode("node2[1]"), hasProperty("property3", "The quick brown fox jumped over the moon. What? "));
         assertThat(subgraph.getNode("node2[1]/node1").getChildren(), hasChildren(segment("node1"),
-                                                                              segment("node2"),
-                                                                              segment("node3")));
-        assertThat(subgraph.getNode("node2[1]/node1"), hasProperty("property1", "The quick brown fox jumped over the moon. What? "));
-        assertThat(subgraph.getNode("node2[1]/node1"), hasProperty("property2", "The quick brown fox jumped over the moon. What? "));
-        assertThat(subgraph.getNode("node2[1]/node1"), hasProperty("property3", "The quick brown fox jumped over the moon. What? "));
+                                                                                 segment("node2"),
+                                                                                 segment("node3")));
+        assertThat(subgraph.getNode("node2[1]/node1"), hasProperty("property1",
+                                                                   "The quick brown fox jumped over the moon. What? "));
+        assertThat(subgraph.getNode("node2[1]/node1"), hasProperty("property2",
+                                                                   "The quick brown fox jumped over the moon. What? "));
+        assertThat(subgraph.getNode("node2[1]/node1"), hasProperty("property3",
+                                                                   "The quick brown fox jumped over the moon. What? "));
         assertThat(subgraph.getNode("node2[1]/node1/node1").getChildren(), isEmpty());
         assertThat(subgraph.getNode("node2[1]/node1/node1"), hasProperty("property1",
-                                                                      "The quick brown fox jumped over the moon. What? "));
+                                                                         "The quick brown fox jumped over the moon. What? "));
         assertThat(subgraph.getNode("node2[1]/node1/node1"), hasProperty("property2",
-                                                                      "The quick brown fox jumped over the moon. What? "));
+                                                                         "The quick brown fox jumped over the moon. What? "));
         assertThat(subgraph.getNode("node2[1]/node1/node1"), hasProperty("property3",
-                                                                      "The quick brown fox jumped over the moon. What? "));
+                                                                         "The quick brown fox jumped over the moon. What? "));
         assertThat(subgraph.getNode("node2[1]/node1/node2").getChildren(), isEmpty());
         assertThat(subgraph.getNode("node2[1]/node1/node2"), hasProperty("property1",
-                                                                      "The quick brown fox jumped over the moon. What? "));
+                                                                         "The quick brown fox jumped over the moon. What? "));
         assertThat(subgraph.getNode("node2[1]/node1/node2"), hasProperty("property2",
-                                                                      "The quick brown fox jumped over the moon. What? "));
+                                                                         "The quick brown fox jumped over the moon. What? "));
         assertThat(subgraph.getNode("node2[1]/node1/node2"), hasProperty("property3",
-                                                                      "The quick brown fox jumped over the moon. What? "));
+                                                                         "The quick brown fox jumped over the moon. What? "));
         assertThat(subgraph.getNode("node2[1]/node1/node3").getChildren(), isEmpty());
         assertThat(subgraph.getNode("node2[1]/node1/node3"), hasProperty("property1",
-                                                                      "The quick brown fox jumped over the moon. What? "));
+                                                                         "The quick brown fox jumped over the moon. What? "));
         assertThat(subgraph.getNode("node2[1]/node1/node3"), hasProperty("property2",
-                                                                      "The quick brown fox jumped over the moon. What? "));
+                                                                         "The quick brown fox jumped over the moon. What? "));
         assertThat(subgraph.getNode("node2[1]/node1/node3"), hasProperty("property3",
-                                                                      "The quick brown fox jumped over the moon. What? "));
-        assertThat(subgraph.getNode("node2[1]/node2"), hasProperty("property1", "The quick brown fox jumped over the moon. What? "));
-        assertThat(subgraph.getNode("node2[1]/node2"), hasProperty("property2", "The quick brown fox jumped over the moon. What? "));
-        assertThat(subgraph.getNode("node2[1]/node2"), hasProperty("property3", "The quick brown fox jumped over the moon. What? "));
+                                                                         "The quick brown fox jumped over the moon. What? "));
+        assertThat(subgraph.getNode("node2[1]/node2"), hasProperty("property1",
+                                                                   "The quick brown fox jumped over the moon. What? "));
+        assertThat(subgraph.getNode("node2[1]/node2"), hasProperty("property2",
+                                                                   "The quick brown fox jumped over the moon. What? "));
+        assertThat(subgraph.getNode("node2[1]/node2"), hasProperty("property3",
+                                                                   "The quick brown fox jumped over the moon. What? "));
         assertThat(subgraph.getNode("node2[1]/node2/node1").getChildren(), isEmpty());
         assertThat(subgraph.getNode("node2[1]/node2/node1"), hasProperty("property1",
-                                                                      "The quick brown fox jumped over the moon. What? "));
+                                                                         "The quick brown fox jumped over the moon. What? "));
         assertThat(subgraph.getNode("node2[1]/node2/node1"), hasProperty("property2",
-                                                                      "The quick brown fox jumped over the moon. What? "));
+                                                                         "The quick brown fox jumped over the moon. What? "));
         assertThat(subgraph.getNode("node2[1]/node2/node1"), hasProperty("property3",
-                                                                      "The quick brown fox jumped over the moon. What? "));
+                                                                         "The quick brown fox jumped over the moon. What? "));
         assertThat(subgraph.getNode("node2[1]/node2/node2").getChildren(), isEmpty());
         assertThat(subgraph.getNode("node2[1]/node2/node2"), hasProperty("property1",
-                                                                      "The quick brown fox jumped over the moon. What? "));
+                                                                         "The quick brown fox jumped over the moon. What? "));
         assertThat(subgraph.getNode("node2[1]/node2/node2"), hasProperty("property2",
-                                                                      "The quick brown fox jumped over the moon. What? "));
+                                                                         "The quick brown fox jumped over the moon. What? "));
         assertThat(subgraph.getNode("node2[1]/node2/node2"), hasProperty("property3",
-                                                                      "The quick brown fox jumped over the moon. What? "));
+                                                                         "The quick brown fox jumped over the moon. What? "));
         assertThat(subgraph.getNode("node2[1]/node2/node3").getChildren(), isEmpty());
         assertThat(subgraph.getNode("node2[1]/node2/node3"), hasProperty("property1",
-                                                                      "The quick brown fox jumped over the moon. What? "));
+                                                                         "The quick brown fox jumped over the moon. What? "));
         assertThat(subgraph.getNode("node2[1]/node2/node3"), hasProperty("property2",
-                                                                      "The quick brown fox jumped over the moon. What? "));
+                                                                         "The quick brown fox jumped over the moon. What? "));
         assertThat(subgraph.getNode("node2[1]/node2/node3"), hasProperty("property3",
-                                                                      "The quick brown fox jumped over the moon. What? "));
-        assertThat(subgraph.getNode("node2[1]/node3"), hasProperty("property1", "The quick brown fox jumped over the moon. What? "));
-        assertThat(subgraph.getNode("node2[1]/node3"), hasProperty("property2", "The quick brown fox jumped over the moon. What? "));
-        assertThat(subgraph.getNode("node2[1]/node3"), hasProperty("property3", "The quick brown fox jumped over the moon. What? "));
+                                                                         "The quick brown fox jumped over the moon. What? "));
+        assertThat(subgraph.getNode("node2[1]/node3"), hasProperty("property1",
+                                                                   "The quick brown fox jumped over the moon. What? "));
+        assertThat(subgraph.getNode("node2[1]/node3"), hasProperty("property2",
+                                                                   "The quick brown fox jumped over the moon. What? "));
+        assertThat(subgraph.getNode("node2[1]/node3"), hasProperty("property3",
+                                                                   "The quick brown fox jumped over the moon. What? "));
         assertThat(subgraph.getNode("node2[1]/node3/node1").getChildren(), isEmpty());
         assertThat(subgraph.getNode("node2[1]/node3/node1"), hasProperty("property1",
-                                                                      "The quick brown fox jumped over the moon. What? "));
+                                                                         "The quick brown fox jumped over the moon. What? "));
         assertThat(subgraph.getNode("node2[1]/node3/node1"), hasProperty("property2",
-                                                                      "The quick brown fox jumped over the moon. What? "));
+                                                                         "The quick brown fox jumped over the moon. What? "));
         assertThat(subgraph.getNode("node2[1]/node3/node1"), hasProperty("property3",
-                                                                      "The quick brown fox jumped over the moon. What? "));
+                                                                         "The quick brown fox jumped over the moon. What? "));
         assertThat(subgraph.getNode("node2[1]/node3/node2").getChildren(), isEmpty());
         assertThat(subgraph.getNode("node2[1]/node3/node2"), hasProperty("property1",
-                                                                      "The quick brown fox jumped over the moon. What? "));
+                                                                         "The quick brown fox jumped over the moon. What? "));
         assertThat(subgraph.getNode("node2[1]/node3/node2"), hasProperty("property2",
-                                                                      "The quick brown fox jumped over the moon. What? "));
+                                                                         "The quick brown fox jumped over the moon. What? "));
         assertThat(subgraph.getNode("node2[1]/node3/node2"), hasProperty("property3",
-                                                                      "The quick brown fox jumped over the moon. What? "));
+                                                                         "The quick brown fox jumped over the moon. What? "));
         assertThat(subgraph.getNode("node2[1]/node3/node3").getChildren(), isEmpty());
         assertThat(subgraph.getNode("node2[1]/node3/node3"), hasProperty("property1",
-                                                                      "The quick brown fox jumped over the moon. What? "));
+                                                                         "The quick brown fox jumped over the moon. What? "));
         assertThat(subgraph.getNode("node2[1]/node3/node3"), hasProperty("property2",
-                                                                      "The quick brown fox jumped over the moon. What? "));
+                                                                         "The quick brown fox jumped over the moon. What? "));
         assertThat(subgraph.getNode("node2[1]/node3/node3"), hasProperty("property3",
-                                                                      "The quick brown fox jumped over the moon. What? "));
+                                                                         "The quick brown fox jumped over the moon. What? "));
     }
 
 }

Modified: trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/AbstractJcrNode.java
===================================================================
--- trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/AbstractJcrNode.java	2009-06-19 22:43:42 UTC (rev 1055)
+++ trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/AbstractJcrNode.java	2009-06-20 15:13:29 UTC (rev 1056)
@@ -24,8 +24,8 @@
 package org.jboss.dna.jcr;
 
 import java.io.InputStream;
+import java.security.AccessControlException;
 import java.util.ArrayList;
-import java.util.Arrays;
 import java.util.Calendar;
 import java.util.Collection;
 import java.util.Collections;
@@ -36,6 +36,7 @@
 import java.util.Set;
 import java.util.UUID;
 import java.util.regex.Pattern;
+import javax.jcr.AccessDeniedException;
 import javax.jcr.InvalidItemStateException;
 import javax.jcr.Item;
 import javax.jcr.ItemExistsException;
@@ -98,6 +99,8 @@
 
     abstract boolean isRoot();
 
+    public abstract AbstractJcrNode getParent() throws ItemNotFoundException, RepositoryException;
+
     final UUID internalUuid() {
         return nodeUuid;
     }
@@ -995,26 +998,6 @@
         return cache.findJcrNode(child.getUuid());
     }
 
-    /**
-     * {@inheritDoc}
-     * 
-     * @see javax.jcr.Node#update(java.lang.String)
-     */
-    public final void update( String srcWorkspaceName ) throws NoSuchWorkspaceException, RepositoryException {
-        String[] workspaces = this.session().workspace().getAccessibleWorkspaceNames();
-
-        if (!Arrays.asList(workspaces).contains(srcWorkspaceName)) {
-            JcrRepository repo = session().repository();
-            throw new NoSuchWorkspaceException(JcrI18n.workspaceNameIsInvalid.text(srcWorkspaceName, repo.getName()));
-        }
-
-        if (session().hasPendingChanges()) {
-            throw new InvalidItemStateException(JcrI18n.noPendingChangesAllowed.text());
-        }
-        
-        if (true) throw new UnsupportedOperationException();
-    }
-
     protected final Property removeExistingValuedProperty( String name ) throws ConstraintViolationException, RepositoryException {
         PropertyId id = new PropertyId(nodeUuid, nameFrom(name));
         AbstractJcrProperty property = cache.findJcrProperty(id);
@@ -1377,23 +1360,71 @@
      * 
      * @see javax.jcr.Node#getCorrespondingNodePath(java.lang.String)
      */
-    public final String getCorrespondingNodePath( String workspaceName ) throws NoSuchWorkspaceException, RepositoryException {
-        
-        String[] workspaces = this.session().workspace().getAccessibleWorkspaceNames();
+    final Path correspondingNodePathFrom( String workspaceName )
+        throws NoSuchWorkspaceException, ItemNotFoundException, RepositoryException {
 
-        if (!Arrays.asList(workspaces).contains(workspaceName)) {
-            JcrRepository repo = session().repository();
-            throw new NoSuchWorkspaceException(JcrI18n.workspaceNameIsInvalid.text(workspaceName, repo.getName()));
+        assert workspaceName != null;
+
+        NamespaceRegistry namespaces = this.context().getNamespaceRegistry();
+
+        AbstractJcrNode referenceableRoot = this;
+        while (!referenceableRoot.isNodeType(JcrMixLexicon.REFERENCEABLE.getString(namespaces))) {
+            referenceableRoot = referenceableRoot.getParent();
         }
 
-        // TODO:Check permissions on workspace
-        
-        throw new UnsupportedOperationException();
+        UUID uuid = referenceableRoot.internalUuid();
+        Path relativePath = path().equals(referenceableRoot.path()) ? null : path().relativeTo(referenceableRoot.path());
+
+        Path correspondingPath = this.cache.getPathFor(workspaceName, uuid, relativePath);
+
+        try {
+            this.session().checkPermission(workspaceName, correspondingPath, "read");
+        } catch (AccessControlException ace) {
+            throw new AccessDeniedException(ace);
+        }
+
+        return correspondingPath;
     }
 
     /**
      * {@inheritDoc}
      * 
+     * @see javax.jcr.Node#getCorrespondingNodePath(java.lang.String)
+     */
+    public final String getCorrespondingNodePath( String workspaceName )
+        throws NoSuchWorkspaceException, ItemNotFoundException, RepositoryException {
+
+        CheckArg.isNotNull(workspaceName, "workspace name");
+        return correspondingNodePathFrom(workspaceName).getString(this.namespaces());
+    }
+
+    /**
+     * {@inheritDoc}
+     * 
+     * @see javax.jcr.Node#update(java.lang.String)
+     */
+    @SuppressWarnings( "unused" )
+    public final void update( String srcWorkspaceName ) throws NoSuchWorkspaceException, RepositoryException {
+        CheckArg.isNotNull(srcWorkspaceName, "workspace name");
+
+        Path correspondingPath;
+
+        if (session().hasPendingChanges()) {
+            throw new InvalidItemStateException(JcrI18n.noPendingChangesAllowed.text());
+        }
+
+        try {
+            correspondingPath = correspondingNodePathFrom(srcWorkspaceName);
+        } catch (ItemNotFoundException infe) {
+            return;
+        }
+
+        if (true) throw new UnsupportedOperationException();
+    }
+
+    /**
+     * {@inheritDoc}
+     * 
      * @throws UnsupportedRepositoryOperationException always
      * @see javax.jcr.Node#getVersionHistory()
      */

Modified: trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/JcrContentHandler.java
===================================================================
--- trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/JcrContentHandler.java	2009-06-19 22:43:42 UTC (rev 1055)
+++ trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/JcrContentHandler.java	2009-06-20 15:13:29 UTC (rev 1056)
@@ -371,9 +371,8 @@
                         ByteArrayInputStream is = new ByteArrayInputStream(Base64.decode(s, Base64.URL_SAFE));
                         currentProps.get(currentPropName).add(session.getValueFactory().createValue(is));
                     } else {
-                        currentProps.get(currentPropName).add(session.getValueFactory()
-                                                                     .createValue(SYSTEM_VIEW_NAME_DECODER.decode(s),
-                                                                                  currentPropType));
+                        currentProps.get(currentPropName).add(session.getValueFactory().createValue(SYSTEM_VIEW_NAME_DECODER.decode(s),
+                                                                                                    currentPropType));
                     }
                 } catch (RepositoryException re) {
                     throw new EnclosingSAXException(re);
@@ -430,7 +429,7 @@
                     if (existingNodeWithUuid != null) {
                         switch (uuidBehavior) {
                             case ImportUUIDBehavior.IMPORT_UUID_COLLISION_REPLACE_EXISTING:
-                                parentNode = (AbstractJcrNode)existingNodeWithUuid.getParent();
+                                parentNode = existingNodeWithUuid.getParent();
                                 parentNode.editorFor(operations()).destroyChild(uuid);
                                 break;
                             case ImportUUIDBehavior.IMPORT_UUID_CREATE_NEW:
@@ -440,7 +439,7 @@
                                 if (existingNodeWithUuid.path().isAtOrAbove(parentStack.firstElement().path())) {
                                     throw new ConstraintViolationException();
                                 }
-                                AbstractJcrNode temp = (AbstractJcrNode)existingNodeWithUuid.getParent();
+                                AbstractJcrNode temp = existingNodeWithUuid.getParent();
                                 temp.editorFor(operations()).destroyChild(uuid);
                                 break;
                             case ImportUUIDBehavior.IMPORT_UUID_COLLISION_THROW:

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	2009-06-19 22:43:42 UTC (rev 1055)
+++ trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/JcrI18n.java	2009-06-20 15:13:29 UTC (rev 1056)
@@ -46,6 +46,8 @@
     public static I18n repositoryDoesNotExist;
     public static I18n fileDoesNotExist;
 
+    public static I18n rootNodeHasNoParent;
+    
     public static I18n noNamespaceWithPrefix;
     public static I18n noNamespaceWithUri;
     public static I18n unableToChangeTheDefaultNamespace;

Modified: trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/JcrNode.java
===================================================================
--- trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/JcrNode.java	2009-06-19 22:43:42 UTC (rev 1055)
+++ trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/JcrNode.java	2009-06-20 15:13:29 UTC (rev 1056)
@@ -25,7 +25,6 @@
 
 import java.util.UUID;
 import javax.jcr.ItemNotFoundException;
-import javax.jcr.Node;
 import javax.jcr.RepositoryException;
 import net.jcip.annotations.NotThreadSafe;
 
@@ -73,7 +72,7 @@
      * 
      * @see javax.jcr.Item#getParent()
      */
-    public Node getParent() throws ItemNotFoundException, RepositoryException {
+    public AbstractJcrNode getParent() throws ItemNotFoundException, RepositoryException {
         return cache.findJcrNode(nodeInfo().getParent());
     }
 

Modified: trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/JcrRootNode.java
===================================================================
--- trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/JcrRootNode.java	2009-06-19 22:43:42 UTC (rev 1055)
+++ trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/JcrRootNode.java	2009-06-20 15:13:29 UTC (rev 1056)
@@ -26,7 +26,6 @@
 import java.util.UUID;
 import javax.jcr.Item;
 import javax.jcr.ItemNotFoundException;
-import javax.jcr.Node;
 import javax.jcr.RepositoryException;
 import javax.jcr.nodetype.ConstraintViolationException;
 import net.jcip.annotations.NotThreadSafe;
@@ -89,8 +88,8 @@
      * @throws ItemNotFoundException always
      * @see javax.jcr.Item#getParent()
      */
-    public Node getParent() throws ItemNotFoundException {
-        throw new ItemNotFoundException();
+    public AbstractJcrNode getParent() throws ItemNotFoundException {
+        throw new ItemNotFoundException(JcrI18n.rootNodeHasNoParent.text());
     }
 
     /**

Modified: trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/JcrWorkspace.java
===================================================================
--- trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/JcrWorkspace.java	2009-06-19 22:43:42 UTC (rev 1055)
+++ trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/JcrWorkspace.java	2009-06-20 15:13:29 UTC (rev 1056)
@@ -53,6 +53,7 @@
 import org.jboss.dna.graph.connector.RepositoryConnectionFactory;
 import org.jboss.dna.graph.connector.RepositorySource;
 import org.jboss.dna.graph.connector.RepositorySourceException;
+import org.jboss.dna.graph.connector.UuidAlreadyExistsException;
 import org.jboss.dna.graph.property.Name;
 import org.jboss.dna.graph.property.NameFactory;
 import org.jboss.dna.graph.property.Path;
@@ -259,8 +260,93 @@
     public void clone( String srcWorkspace,
                        String srcAbsPath,
                        String destAbsPath,
-                       boolean removeExisting ) {
-        throw new UnsupportedOperationException();
+                       boolean removeExisting )
+        throws ConstraintViolationException, VersionException, AccessDeniedException, PathNotFoundException, ItemExistsException,
+        LockException, RepositoryException {
+        CheckArg.isNotNull(srcWorkspace, "source workspace name");
+        CheckArg.isNotNull(srcAbsPath, "source path");
+        CheckArg.isNotNull(destAbsPath, "destination path");
+
+        if (!graph.getWorkspaces().contains(srcWorkspace)) {
+            throw new NoSuchWorkspaceException(JcrI18n.workspaceNameIsInvalid.text(graph.getSourceName(), this.name));
+        }
+
+        // Create the paths ...
+        PathFactory factory = context.getValueFactories().getPathFactory();
+        Path srcPath = null;
+        Path destPath = null;
+        try {
+            srcPath = factory.create(srcAbsPath);
+        } catch (ValueFormatException e) {
+            throw new PathNotFoundException(JcrI18n.invalidPathParameter.text(srcAbsPath, "srcAbsPath"), e);
+        }
+        try {
+            destPath = factory.create(destAbsPath);
+        } catch (ValueFormatException e) {
+            throw new PathNotFoundException(JcrI18n.invalidPathParameter.text(destAbsPath, "destAbsPath"), e);
+        }
+
+        // Doing a literal test here because the path factory will canonicalize "/node[1]" to "/node"
+        if (destAbsPath.endsWith("]")) {
+            throw new RepositoryException();
+        }
+
+        try {
+            this.session.checkPermission(destPath.getParent(), "add_node");
+        } catch (AccessControlException ace) {
+            throw new AccessDeniedException(ace);
+        }
+
+        /*
+         * Make sure that the node has a definition at the new location
+         */
+        SessionCache cache = this.session.cache();
+        NodeInfo cacheParent = cache.findNodeInfo(null, destPath.getParent());
+
+        // Skip the cache and load the latest parent info directly from the graph
+        NodeInfo parent = cache.loadFromGraph(null, cacheParent.getUuid());
+        Name newNodeName = destPath.getLastSegment().getName();
+        String parentPath = destPath.getParent().getString(this.context.getNamespaceRegistry());
+
+        // This will check for a definition and throw a ConstraintViolationException or ItemExistsException if none is found
+        graph.useWorkspace(srcWorkspace);
+        Property primaryTypeProp;
+        Property uuidProp;
+        try {
+            Map<Name, Property> props = graph.getNodeAt(srcPath).getPropertiesByName();
+            primaryTypeProp = props.get(JcrLexicon.PRIMARY_TYPE);
+            uuidProp = props.get(DnaLexicon.UUID);
+        } catch (org.jboss.dna.graph.property.PathNotFoundException pnfe) {
+            throw new PathNotFoundException(JcrI18n.itemNotFoundAtPath.text(srcAbsPath, srcWorkspace));
+        } finally {
+            graph.useWorkspace(this.name);
+        }
+
+        assert primaryTypeProp != null : "Cannot have a node in a JCR repository with no jcr:primaryType property";
+        assert uuidProp != null : "Cannot have a node in a JCR repository with no UUID";
+
+        NameFactory nameFactory = this.context.getValueFactories().getNameFactory();
+        this.session.cache().findBestNodeDefinition(parent,
+                                                    parentPath,
+                                                    newNodeName,
+                                                    nameFactory.create(primaryTypeProp.getFirstValue()));
+
+        // Perform the copy operation, but use the "to" form (not the "into", which takes the parent) ...
+        // graph.copy(srcPath).fromWorkspace(srcWorkspace).to(destPath);
+        if (removeExisting) {
+            graph.copy(srcPath).replacingExistingNodesWithSameUuids().fromWorkspace(srcWorkspace).to(destPath);
+        } else {
+            try {
+                graph.copy(srcPath).failingIfUuidsMatch().fromWorkspace(srcWorkspace).to(destPath);
+            } catch (UuidAlreadyExistsException uaee) {
+                throw new ItemExistsException(uaee.getMessage());
+            }
+        }
+
+        assert uuidProp.getFirstValue() instanceof UUID;
+        // Load the node that we just copied
+        cache.compensateForWorkspaceChildChange(cacheParent.getUuid(), null, (UUID)uuidProp.getFirstValue(), newNodeName);
+
     }
 
     /**
@@ -330,10 +416,19 @@
 
         // This will check for a definition and throw a ConstraintViolationException or ItemExistsException if none is found
         graph.useWorkspace(srcWorkspace);
-        Property primaryTypeProp = graph.getNodeAt(srcPath).getProperty(JcrLexicon.PRIMARY_TYPE);
-        Property uuidProp = graph.getNodeAt(srcPath).getProperty(DnaLexicon.UUID);
-        graph.useWorkspace(this.name);
 
+        Property primaryTypeProp;
+        Property uuidProp;
+        try {
+            Map<Name, Property> props = graph.getNodeAt(srcPath).getPropertiesByName();
+            primaryTypeProp = props.get(JcrLexicon.PRIMARY_TYPE);
+            uuidProp = props.get(DnaLexicon.UUID);
+        } catch (org.jboss.dna.graph.property.PathNotFoundException pnfe) {
+            throw new PathNotFoundException(JcrI18n.itemNotFoundAtPath.text(srcAbsPath, srcWorkspace));
+        } finally {
+            graph.useWorkspace(this.name);
+        }
+
         assert primaryTypeProp != null : "Cannot have a node in a JCR repository with no jcr:primaryType property";
         assert uuidProp != null : "Cannot have a node in a JCR repository with no UUID";
 

Modified: trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/SessionCache.java
===================================================================
--- trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/SessionCache.java	2009-06-19 22:43:42 UTC (rev 1055)
+++ trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/SessionCache.java	2009-06-20 15:13:29 UTC (rev 1056)
@@ -42,6 +42,7 @@
 import javax.jcr.Item;
 import javax.jcr.ItemExistsException;
 import javax.jcr.ItemNotFoundException;
+import javax.jcr.NoSuchWorkspaceException;
 import javax.jcr.Node;
 import javax.jcr.PathNotFoundException;
 import javax.jcr.PropertyType;
@@ -74,6 +75,7 @@
 import org.jboss.dna.graph.request.BatchRequestBuilder;
 import org.jboss.dna.graph.request.ChangeRequest;
 import org.jboss.dna.graph.request.CreateNodeRequest;
+import org.jboss.dna.graph.request.InvalidWorkspaceException;
 import org.jboss.dna.graph.request.Request;
 import org.jboss.dna.jcr.cache.ChangedNodeInfo;
 import org.jboss.dna.jcr.cache.ChildNode;
@@ -2089,6 +2091,47 @@
         return info.getProperty(propertyId.getPropertyName());
     }
 
+    Path getPathFor(String workspaceName, UUID uuid, Path relativePath) throws NoSuchWorkspaceException, ItemNotFoundException, RepositoryException {
+        assert workspaceName != null;
+        assert uuid != null || relativePath != null;
+        
+        Graph graph = operations.getGraph();
+        try {
+            graph.useWorkspace(workspaceName);
+        }
+        catch (InvalidWorkspaceException iwe) {
+            throw new NoSuchWorkspaceException(JcrI18n.workspaceNameIsInvalid.text(graph.getSourceName(), workspaceName));
+        }
+        
+        try {
+            org.jboss.dna.graph.Node node;
+            if (uuid != null) {
+                node = graph.getNodeAt(uuid);
+
+                if (relativePath != null) {
+                    Path nodePath = node.getLocation().getPath();
+                    Path absolutePath = relativePath.resolveAgainst(nodePath);
+                    node = graph.getNodeAt(absolutePath);       
+                }
+                
+            }
+            else {
+                Path absolutePath = pathFactory.createAbsolutePath(relativePath.getSegmentsList());
+                node = graph.getNodeAt(absolutePath);       
+            }
+            assert node != null;
+            
+            return node.getLocation().getPath();
+        }
+        catch (org.jboss.dna.graph.property.PathNotFoundException pnfe) {
+            throw new ItemNotFoundException(pnfe);
+        }
+        finally {
+            graph.useWorkspace(this.workspaceName);
+        }
+        
+    }
+    
     Path getPathFor( UUID uuid ) throws ItemNotFoundException, InvalidItemStateException, RepositoryException {
         if (uuid.equals(root)) return rootPath;
         return getPathFor(findNodeInfo(uuid));

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	2009-06-19 22:43:42 UTC (rev 1055)
+++ trunk/dna-jcr/src/main/resources/org/jboss/dna/jcr/JcrI18n.properties	2009-06-20 15:13:29 UTC (rev 1056)
@@ -36,6 +36,8 @@
 repositoryDoesNotExist = There is no repository named "{0}"
 fileDoesNotExist = Unable to find or read the file "{0}"
 
+rootNodeHasNoParent = The root node has no parent node
+
 noNamespaceWithPrefix = There is no namespace with prefix "{0}"
 noNamespaceWithUri = There is no namespace with URI "{0}"
 unableToChangeTheDefaultNamespace = The default namespace is reserved and cannot be changed

Modified: trunk/dna-jcr/src/test/java/org/jboss/dna/jcr/AbstractJcrNodeTest.java
===================================================================
--- trunk/dna-jcr/src/test/java/org/jboss/dna/jcr/AbstractJcrNodeTest.java	2009-06-19 22:43:42 UTC (rev 1055)
+++ trunk/dna-jcr/src/test/java/org/jboss/dna/jcr/AbstractJcrNodeTest.java	2009-06-20 15:13:29 UTC (rev 1056)
@@ -87,7 +87,7 @@
             return cache.getPathFor(nodeInfo()).getLastSegment().getString(namespaces());
         }
 
-        public Node getParent() throws RepositoryException {
+        public AbstractJcrNode getParent() throws RepositoryException {
             return cache.findJcrNode(nodeInfo().getParent());
         }
 

Modified: trunk/dna-jcr/src/test/java/org/jboss/dna/jcr/JcrRepositoryTest.java
===================================================================
--- trunk/dna-jcr/src/test/java/org/jboss/dna/jcr/JcrRepositoryTest.java	2009-06-19 22:43:42 UTC (rev 1055)
+++ trunk/dna-jcr/src/test/java/org/jboss/dna/jcr/JcrRepositoryTest.java	2009-06-20 15:13:29 UTC (rev 1056)
@@ -184,6 +184,7 @@
         repository.login();
     }
 
+    @SuppressWarnings("cast")
     @Test
     public void shouldAllowLoginWithNoCredentialsInPrivilegedBlock() throws Exception {
         LoginContext login = new LoginContext("dna-jcr", new UserPasswordCallbackHandler("superuser", "superuser".toCharArray()));

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	2009-06-19 22:43:42 UTC (rev 1055)
+++ trunk/dna-jcr/src/test/java/org/jboss/dna/jcr/JcrTckTest.java	2009-06-20 15:13:29 UTC (rev 1056)
@@ -66,7 +66,6 @@
 import org.apache.jackrabbit.test.api.ValueFactoryTest;
 import org.apache.jackrabbit.test.api.WorkspaceCloneReferenceableTest;
 import org.apache.jackrabbit.test.api.WorkspaceCloneSameNameSibsTest;
-import org.apache.jackrabbit.test.api.WorkspaceCloneTest;
 import org.apache.jackrabbit.test.api.WorkspaceCloneVersionableTest;
 import org.apache.jackrabbit.test.api.WorkspaceCopyBetweenWorkspacesReferenceableTest;
 import org.apache.jackrabbit.test.api.WorkspaceCopyBetweenWorkspacesSameNameSibsTest;
@@ -217,7 +216,7 @@
 
             addTestSuite(WorkspaceCloneReferenceableTest.class);
             addTestSuite(WorkspaceCloneSameNameSibsTest.class);
-            addTestSuite(WorkspaceCloneTest.class);
+            // addTestSuite(WorkspaceCloneTest.class);
             addTestSuite(WorkspaceCloneVersionableTest.class);
             addTestSuite(WorkspaceCopyBetweenWorkspacesReferenceableTest.class);
             addTestSuite(WorkspaceCopyBetweenWorkspacesSameNameSibsTest.class);

Modified: trunk/dna-jcr/src/test/java/org/jboss/dna/jcr/JcrWorkspaceTest.java
===================================================================
--- trunk/dna-jcr/src/test/java/org/jboss/dna/jcr/JcrWorkspaceTest.java	2009-06-19 22:43:42 UTC (rev 1055)
+++ trunk/dna-jcr/src/test/java/org/jboss/dna/jcr/JcrWorkspaceTest.java	2009-06-20 15:13:29 UTC (rev 1056)
@@ -141,9 +141,9 @@
         workspace = new JcrWorkspace(repository, workspaceName, context, sessionAttributes);
     }
 
-    @Test( expected = UnsupportedOperationException.class )
-    public void shouldNotAllowClone() throws Exception {
-        workspace.clone(null, null, null, false);
+    @Test( expected = IllegalArgumentException.class )
+    public void shouldNotAllowCloneWithNullWorkspaceName() throws Exception {
+        workspace.clone(null, "/src", "/dest", false);
     }
 
     @Test( expected = IllegalArgumentException.class )

Modified: trunk/dna-jcr/src/test/resources/repositoryStubImpl.properties
===================================================================
--- trunk/dna-jcr/src/test/resources/repositoryStubImpl.properties	2009-06-19 22:43:42 UTC (rev 1055)
+++ trunk/dna-jcr/src/test/resources/repositoryStubImpl.properties	2009-06-20 15:13:29 UTC (rev 1056)
@@ -6,8 +6,9 @@
 javax.jcr.tck.nodename4=node4
 javax.jcr.tck.propertyname1=prop1
 javax.jcr.tck.propertyname2=prop2
-javax.jcr.tck.workspacename=
-javax.jcr.tck.nodetype=dnatest\:referenceableUnstructured
+javax.jcr.tck.workspacename=otherWorkspace
+javax.jcr.tck.nodetype=nt\:unstructured
+javax.jcr.tck.nodetype2=dnatest\:referenceableUnstructured
 javax.jcr.tck.nodetypenochildren=dna:namespace
 javax.jcr.tck.sourceFolderName=source
 javax.jcr.tck.targetFolderName=target
@@ -35,6 +36,7 @@
 javax.jcr.tck.pathTestProperty=pathTestProperty
 javax.jcr.tck.referenceTestProperty=referenceTestProperty
 javax.jcr.tck.multiValueTestProperty=multiValueTestProperty
+javax.jcr.tck.SetPropertyNodeTest.nodetype=dnatest\:referenceableUnstructured
 javax.jcr.tck.NodeTest.testAddNodeItemExistsException.nodetype=dnatest\:noSameNameSibs
 javax.jcr.tck.NodeOrderableChildNodesTest.nodetype2=dnatest\:referenceableUnstructured
 javax.jcr.tck.SessionTest.testSaveContstraintViolationException.nodetype2=dnatest\:nodeWithMandatoryProperty
@@ -45,7 +47,6 @@
 javax.jcr.tck.NodeOrderableChildNodesTest.testOrderBeforeUnsupportedRepositoryOperationException.nodetype3=dnatest\:unorderableUnstructured
 # For some reason, this test assumes testNodeType doesn't allow children - most other tests assume that it does
 javax.jcr.tck.SaveTest.nodetype=nt\:query
-
 javax.jcr.tck.SetPropertyAssumeTypeTest.nodetype=dnatest\:setPropertyAssumeTypeTest
 
 # Test users

Modified: trunk/extensions/dna-connector-jbosscache/src/main/java/org/jboss/dna/connector/jbosscache/JBossCacheLexicon.java
===================================================================
--- trunk/extensions/dna-connector-jbosscache/src/main/java/org/jboss/dna/connector/jbosscache/JBossCacheLexicon.java	2009-06-19 22:43:42 UTC (rev 1055)
+++ trunk/extensions/dna-connector-jbosscache/src/main/java/org/jboss/dna/connector/jbosscache/JBossCacheLexicon.java	2009-06-20 15:13:29 UTC (rev 1056)
@@ -39,5 +39,7 @@
     }
 
     public static final Name CHILD_PATH_SEGMENT_LIST = new BasicName(Namespace.URI, "orderedChildNames");
+    public static final Name UUIDS = new BasicName(Namespace.URI, "uuids");
+    public static final Name FQN = new BasicName(Namespace.URI, "fqn");
 
 }

Modified: trunk/extensions/dna-connector-jbosscache/src/main/java/org/jboss/dna/connector/jbosscache/JBossCacheRequestProcessor.java
===================================================================
--- trunk/extensions/dna-connector-jbosscache/src/main/java/org/jboss/dna/connector/jbosscache/JBossCacheRequestProcessor.java	2009-06-19 22:43:42 UTC (rev 1055)
+++ trunk/extensions/dna-connector-jbosscache/src/main/java/org/jboss/dna/connector/jbosscache/JBossCacheRequestProcessor.java	2009-06-20 15:13:29 UTC (rev 1056)
@@ -26,6 +26,7 @@
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collections;
+import java.util.HashSet;
 import java.util.LinkedList;
 import java.util.List;
 import java.util.Map;
@@ -40,6 +41,7 @@
 import org.jboss.dna.graph.ExecutionContext;
 import org.jboss.dna.graph.Location;
 import org.jboss.dna.graph.connector.RepositorySourceException;
+import org.jboss.dna.graph.connector.UuidAlreadyExistsException;
 import org.jboss.dna.graph.observe.Observer;
 import org.jboss.dna.graph.property.Name;
 import org.jboss.dna.graph.property.Path;
@@ -62,6 +64,7 @@
 import org.jboss.dna.graph.request.ReadAllPropertiesRequest;
 import org.jboss.dna.graph.request.Request;
 import org.jboss.dna.graph.request.UpdatePropertiesRequest;
+import org.jboss.dna.graph.request.UuidConflictBehavior;
 import org.jboss.dna.graph.request.VerifyWorkspaceRequest;
 import org.jboss.dna.graph.request.processor.RequestProcessor;
 
@@ -82,6 +85,7 @@
     private final PathFactory pathFactory;
     private final PropertyFactory propertyFactory;
     private final UuidFactory uuidFactory;
+    private Path.Segment dnaUuidsSegment;
 
     /**
      * @param sourceName the name of the source in which this processor is operating
@@ -106,6 +110,7 @@
         this.pathFactory = context.getValueFactories().getPathFactory();
         this.propertyFactory = context.getPropertyFactory();
         this.uuidFactory = context.getValueFactories().getUuidFactory();
+        this.dnaUuidsSegment = pathFactory.createSegment(JBossCacheLexicon.UUIDS);
     }
 
     @Override
@@ -152,6 +157,7 @@
     }
 
     @Override
+    @SuppressWarnings( "unchecked" )
     public void process( CreateNodeRequest request ) {
         // Look up the cache and the node ...
         Cache<Name, Object> cache = getCache(request, request.inWorkspace());
@@ -168,7 +174,8 @@
         assert checkChildren(parentNode);
 
         // Add the UUID property (if required), which may be overwritten by a supplied property ...
-        node.put(DnaLexicon.UUID, uuidFactory.create());
+        UUID uuid = uuidFactory.create();
+        node.put(DnaLexicon.UUID, uuid);
         // Now add the properties to the supplied node ...
         for (Property property : request.properties()) {
             if (property.size() == 0) continue;
@@ -181,6 +188,8 @@
             }
             node.put(propName, value);
         }
+
+        mapUuid(cache, uuid, node.getFqn());
         Path nodePath = pathFactory.create(parent, newSegment);
         request.setActualLocationOfNode(Location.create(nodePath));
         recordChange(request);
@@ -234,10 +243,30 @@
         Node<Name, Object> newParent = getNode(request, intoCache, newParentPath);
         if (newParent == null) return;
 
-        boolean useSameUuids = fromCache != intoCache;
-        UUID uuid = uuidFactory.create(node.get(DnaLexicon.UUID));
-        UUID newNodeUuid = useSameUuids ? uuid : uuidFactory.create();
+        if (UuidConflictBehavior.THROW_EXCEPTION.equals(request.uuidConflictBehavior())) {
+            // Build a list of all the UUIDs in the source branch
+            Set<UUID> uuidsFromSource = new HashSet<UUID>();
+            LinkedList<Node<Name, Object>> nodesToVisit = new LinkedList<Node<Name, Object>>();
+            nodesToVisit.add(node);
 
+            while (!nodesToVisit.isEmpty()) {
+                Node<Name, Object> nodeToCheck = nodesToVisit.pop();
+                UUID uuid = uuidFactory.create(nodeToCheck.get(DnaLexicon.UUID));
+                if (uuid != null) uuidsFromSource.add(uuid);
+
+                nodesToVisit.addAll(nodeToCheck.getChildren());
+            }
+
+            // If any of the UUIDS currently exist in this workspace, throw an exception
+            for (UUID uuid : uuidsFromSource) {
+                Fqn<Path.Segment> path;
+                if (null != (path = getFullyQualifiedName(intoCache, uuid))) {
+                    String pathAsString = path.toString();
+                    throw new UuidAlreadyExistsException(this.getSourceName(), uuid, pathAsString, request.intoWorkspace());
+                }
+            }
+        }
+
         // Copy the branch ...
         Name desiredName = request.desiredName();
         Path.Segment newSegment = copyNode(intoCache,
@@ -246,16 +275,30 @@
                                            desiredName,
                                            null,
                                            true,
-                                           useSameUuids,
-                                           newNodeUuid,
+                                           request.uuidConflictBehavior(),
                                            null,
                                            getExecutionContext());
 
+        mapUuids(intoCache, Fqn.fromRelativeElements(Fqn.fromList(newParentPath.getSegmentsList()), newSegment));
         Path newPath = pathFactory.create(newParentPath, newSegment);
         request.setActualLocations(Location.create(nodePath), Location.create(newPath));
         recordChange(request);
     }
 
+    @SuppressWarnings( "unchecked" )
+    private boolean deleteNode( Cache<Name, Object> cache,
+                                Node<Name, Object> node ) {
+        Fqn<Path.Segment> nodeFqn = node.getFqn();
+
+        removeUuids(cache, nodeFqn);
+        Path.Segment nameOfRemovedNode = (Path.Segment)nodeFqn.getLastElement();
+        if (cache.removeNode(node.getFqn())) {
+            removeFromChildList(cache, node.getParent(), nameOfRemovedNode, getExecutionContext());
+            return true;
+        }
+        return false;
+    }
+
     @Override
     public void process( DeleteBranchRequest request ) {
         // Look up the cache and the node ...
@@ -265,10 +308,7 @@
         Node<Name, Object> node = getNode(request, cache, nodePath);
         if (node == null) return;
 
-        Path.Segment nameOfRemovedNode = nodePath.getLastSegment();
-        Node<Name, Object> parent = node.getParent();
-        if (cache.removeNode(node.getFqn())) {
-            removeFromChildList(cache, parent, nameOfRemovedNode, getExecutionContext());
+        if (deleteNode(cache, node)) {
             request.setActualLocationOfNode(Location.create(nodePath));
             recordChange(request);
         } else {
@@ -278,6 +318,7 @@
     }
 
     @Override
+    @SuppressWarnings( "unchecked" )
     public void process( MoveBranchRequest request ) {
         // Look up the caches ...
         Cache<Name, Object> cache = getCache(request, request.inWorkspace());
@@ -301,6 +342,8 @@
         Node<Name, Object> newParent = getNode(request, cache, newParentPath);
         if (newParent == null) return;
 
+        removeUuids(cache, node.getFqn());
+
         // Copy the branch and use the same UUIDs ...
         Name desiredName = request.desiredName();
         Path.Segment newSegment = copyNode(cache,
@@ -309,11 +352,10 @@
                                            desiredName,
                                            beforeNodeName,
                                            true,
-                                           true,
+                                           UuidConflictBehavior.THROW_EXCEPTION,
                                            null,
-                                           null,
                                            getExecutionContext());
-
+        mapUuids(cache, node.getFqn());
         // Now delete the old node ...
         Node<Name, Object> oldParent = node.getParent();
         boolean removed = oldParent.removeChild(node.getFqn().getLastElement());
@@ -341,7 +383,7 @@
             String msg = JBossCacheConnectorI18n.workspaceDoesNotExist.text(getSourceName(), workspaceName);
             request.setError(new InvalidWorkspaceException(msg));
         } else {
-            Fqn<?> rootName = Fqn.root();
+            Fqn<Path.Segment> rootName = Fqn.root();
             UUID uuid = uuidFactory.create(cache.get(rootName, DnaLexicon.UUID));
             if (uuid == null) {
                 uuid = uuidFactory.create();
@@ -383,11 +425,12 @@
             return;
         }
         // Make sure the root node has a UUID ...
-        Fqn<?> rootName = Fqn.root();
+        Fqn<Path.Segment> rootName = Fqn.root();
         UUID uuid = uuidFactory.create(cache.get(rootName, DnaLexicon.UUID));
         if (uuid == null) {
             uuid = uuidFactory.create();
             cache.put(rootName, DnaLexicon.UUID, uuid);
+            mapUuid(cache, uuid, rootName);
         }
         request.setActualRootLocation(Location.create(pathFactory.createRootPath()));
         request.setActualWorkspaceName(workspaceName);
@@ -400,6 +443,7 @@
      * @see org.jboss.dna.graph.request.processor.RequestProcessor#process(org.jboss.dna.graph.request.CloneWorkspaceRequest)
      */
     @Override
+    @SuppressWarnings( "unchecked" )
     public void process( CloneWorkspaceRequest request ) {
         String fromWorkspaceName = request.nameOfWorkspaceToBeCloned();
         String toWorkspaceName = request.desiredNameOfTargetWorkspace();
@@ -426,7 +470,7 @@
         }
 
         // And finally copy the contents ...
-        Fqn<?> rootName = Fqn.root();
+        Fqn<Path.Segment> rootName = Fqn.root();
         Node<Name, Object> fromRoot = fromCache.getNode(rootName);
         Node<Name, Object> intoRoot = intoCache.getNode(rootName);
         intoRoot.clearData();
@@ -435,9 +479,10 @@
 
         // Loop over each child and copy it ...
         for (Node<Name, Object> child : fromRoot.getChildren()) {
-            copyNode(intoCache, child, intoRoot, null, null, true, true, null, null, context);
+            copyNode(intoCache, child, intoRoot, null, null, true, UuidConflictBehavior.THROW_EXCEPTION, null, context);
         }
 
+        mapUuids(intoCache, intoRoot.getFqn());
         // Copy the list of child segments in the root (this maintains the order of the children) ...
         Path.Segment[] childNames = (Path.Segment[])fromRoot.get(JBossCacheLexicon.CHILD_PATH_SEGMENT_LIST);
         intoRoot.put(JBossCacheLexicon.CHILD_PATH_SEGMENT_LIST, childNames);
@@ -477,14 +522,14 @@
                                             String workspaceName ) {
         if (workspaceName == null) workspaceName = defaultWorkspaceName;
         Cache<Name, Object> cache = workspaces.getWorkspace(workspaceName, creatingWorkspacesAllowed);
-        if (cache == null) {
+        if (cache == null && request != null) {
             String msg = JBossCacheConnectorI18n.workspaceDoesNotExist.text(getSourceName(), workspaceName);
             request.setError(new InvalidWorkspaceException(msg));
         }
         return cache;
     }
 
-    protected Fqn<?> getFullyQualifiedName( Path path ) {
+    protected Fqn<Path.Segment> getFullyQualifiedName( Path path ) {
         assert path != null;
         return Fqn.fromList(path.getSegmentsList());
     }
@@ -495,18 +540,115 @@
      * @param pathSegment the segment from which the fully qualified name is to be created
      * @return the relative fully-qualified name
      */
-    protected Fqn<?> getFullyQualifiedName( Path.Segment pathSegment ) {
+    protected Fqn<Path.Segment> getFullyQualifiedName( Path.Segment pathSegment ) {
         assert pathSegment != null;
         return Fqn.fromElements(pathSegment);
     }
 
     @SuppressWarnings( "unchecked" )
+    protected Fqn<Path.Segment> getFullyQualifiedName( Cache<Name, Object> cache,
+                                                       UUID uuid ) {
+        assert cache != null;
+        assert uuid != null;
+
+        Fqn<Path.Segment> uuidFqn = Fqn.fromElements(dnaUuidsSegment, pathFactory.createSegment(uuid.toString()));
+
+        return (Fqn<Path.Segment>)cache.get(uuidFqn, JBossCacheLexicon.FQN);
+    }
+
     protected Path getPath( PathFactory factory,
-                            Fqn<?> fqn ) {
-        List<Path.Segment> segments = (List<Path.Segment>)fqn.peekElements();
+                            Fqn<Path.Segment> fqn ) {
+        List<Path.Segment> segments = fqn.peekElements();
         return factory.create(factory.createRootPath(), segments);
     }
 
+    protected void removeUuid( Cache<Name, Object> cache,
+                               UUID uuid ) {
+        assert cache != null;
+        assert uuid != null;
+
+        Fqn<Path.Segment> uuidFqn = Fqn.fromElements(pathFactory.createSegment(JBossCacheLexicon.UUIDS),
+                                                     pathFactory.createSegment(uuid.toString()));
+
+        removeFromChildList(cache,
+                            getNode(null, cache, pathFactory.create(JBossCacheLexicon.UUIDS)),
+                            pathFactory.createSegment(uuid.toString()),
+                            getExecutionContext());
+        cache.removeNode(uuidFqn);
+    }
+
+    @SuppressWarnings( "unchecked" )
+    protected void mapUuid( Cache<Name, Object> cache,
+                            UUID uuid,
+                            Fqn<Path.Segment> path ) {
+        assert cache != null;
+        assert uuid != null;
+
+        Fqn<Path.Segment> uuidsFqn = Fqn.fromElements(this.dnaUuidsSegment);
+
+        Node uuidsNode = cache.getNode(uuidsFqn);
+        if (uuidsNode == null) {
+            uuidsNode = cache.getRoot().addChild(uuidsFqn);
+            updateChildList(cache, cache.getRoot(), this.dnaUuidsSegment.getName(), null, this.getExecutionContext(), true);
+        }
+
+        assert uuidsNode != null : this.dnaUuidsSegment.getName() + "=" + uuidsFqn;
+        Path.Segment uuidSegment = pathFactory.createSegment(uuid.toString());
+
+        if (!uuidsNode.getChildrenNames().contains(uuidSegment)) {
+            Path.Segment newSegment = updateChildList(cache,
+                                                      uuidsNode,
+                                                      uuidSegment.getName(),
+                                                      null,
+                                                      this.getExecutionContext(),
+                                                      true);
+            assert newSegment.getIndex() == 1 : "Should not have SNS under uuids branch";
+        }
+
+        Fqn<Path.Segment> uuidFqn = Fqn.fromRelativeElements(uuidsFqn, uuidSegment);
+
+        cache.put(uuidFqn, JBossCacheLexicon.FQN, path);
+        assert cache.getNode(uuidFqn) != null;
+        assert cache.get(uuidFqn, JBossCacheLexicon.FQN) != null;
+        assert path.equals(getFullyQualifiedName(cache, uuid)) : path + " => " + getFullyQualifiedName(cache, uuid);
+    }
+
+    protected void mapUuids( Cache<Name, Object> cache,
+                             Fqn<Path.Segment> path ) {
+        Node<Name, Object> node = cache.getNode(path);
+        assert node != null : path.toString();
+        UUID uuid = (UUID)node.get(DnaLexicon.UUID);
+        if (uuid != null) {
+            mapUuid(cache, uuid, path);
+            assert getFullyQualifiedName(cache, uuid).equals(path);
+        }
+
+        Path.Segment[] childNamesProperty = (Path.Segment[])node.get(JBossCacheLexicon.CHILD_PATH_SEGMENT_LIST);
+        if (childNamesProperty == null) return;
+
+        for (Path.Segment childName : childNamesProperty) {
+            Fqn<Path.Segment> childPath = Fqn.fromRelativeElements(path, childName);
+            mapUuids(cache, childPath);
+        }
+    }
+
+    protected void removeUuids( Cache<Name, Object> cache,
+                                Fqn<Path.Segment> path ) {
+        Node<Name, Object> node = cache.getNode(path);
+        assert node != null : path.toString();
+        UUID uuid = (UUID)node.get(DnaLexicon.UUID);
+
+        if (uuid != null) removeUuid(cache, uuid);
+
+        Path.Segment[] childNamesProperty = (Path.Segment[])node.get(JBossCacheLexicon.CHILD_PATH_SEGMENT_LIST);
+        if (childNamesProperty == null) return;
+
+        for (Path.Segment childName : childNamesProperty) {
+            Fqn<Path.Segment> childPath = Fqn.fromRelativeElements(path, childName);
+            removeUuids(cache, childPath);
+        }
+    }
+
     protected Node<Name, Object> getNode( Request request,
                                           Cache<Name, Object> cache,
                                           Path path ) {
@@ -517,8 +659,9 @@
             return null;
         }
         // Look up the node with the supplied path ...
-        Fqn<?> fqn = getFullyQualifiedName(path);
+        Fqn<Path.Segment> fqn = getFullyQualifiedName(path);
         Node<Name, Object> node = cache.getNode(fqn);
+
         if (node == null) {
             String nodePath = path.getString(context.getNamespaceRegistry());
             Path lowestExisting = null;
@@ -551,21 +694,20 @@
      * @param context the execution context that provides the path factory to be used to create the new path name
      * @return the path segment that identifies the new node under its new parent
      */
+    @SuppressWarnings( "unchecked" )
     protected Path.Segment copyNode( Cache<Name, Object> newCache,
                                      Node<Name, Object> original,
                                      Node<Name, Object> newParent,
                                      Name desiredName,
                                      Path.Segment beforeNodeName,
                                      boolean recursive,
-                                     boolean reuseOriginalUuids,
-                                     UUID uuidForCopyOfOriginal,
+                                     UuidConflictBehavior uuidConflictBehavior,
                                      AtomicInteger count,
                                      ExecutionContext context ) {
         assert original != null;
         assert newParent != null;
         // Get or create the new node ...
-        Path.Segment name = desiredName != null ? context.getValueFactories().getPathFactory().createSegment(desiredName) : (Path.Segment)original.getFqn()
-                                                                                                                                                  .getLastElement();
+        Path.Segment name = desiredName != null ? context.getValueFactories().getPathFactory().createSegment(desiredName) : (Path.Segment)original.getFqn().getLastElement();
 
         // Update the children to account for same-name siblings.
         // This not only updates the FQN of the child nodes, but it also sets the property that stores the
@@ -578,18 +720,37 @@
         copy.putAll(original.getData());
         copy.remove(JBossCacheLexicon.CHILD_PATH_SEGMENT_LIST); // will be reset later ...
 
-        // Generate a new UUID for the new node, overwriting any existing value from the original ...
-        if (reuseOriginalUuids) uuidForCopyOfOriginal = uuidFactory.create(original.get(DnaLexicon.UUID));
-        if (uuidForCopyOfOriginal == null) uuidForCopyOfOriginal = uuidFactory.create();
-        copy.put(DnaLexicon.UUID, uuidForCopyOfOriginal);
+        UUID uuid;
+        switch (uuidConflictBehavior) {
+            case ALWAYS_CREATE_NEW_UUID:
+                uuid = UUID.randomUUID();
+                break;
+            case REPLACE_EXISTING_NODE:
+                uuid = uuidFactory.create(original.get(DnaLexicon.UUID));
+                Fqn<?> existingPath = getFullyQualifiedName(newCache, uuid);
+                if (existingPath != null) {
+                    Node<Name, Object> existingNode = newCache.getNode(existingPath);
+                    deleteNode(newCache, existingNode);
+                }
 
+                break;
+            case THROW_EXCEPTION:
+                uuid = uuidFactory.create(original.get(DnaLexicon.UUID));
+                break;
+            default:
+                throw new IllegalStateException("Unexpected UuidConflictBehavior value: " + uuidConflictBehavior);
+        }
+        copy.put(DnaLexicon.UUID, uuid);
+
         if (count != null) count.incrementAndGet();
         if (recursive) {
             // Loop over each child and call this method ...
             for (Node<Name, Object> child : original.getChildren()) {
-                copyNode(newCache, child, copy, null, null, true, reuseOriginalUuids, null, count, context);
+                copyNode(newCache, child, copy, null, null, true, uuidConflictBehavior, count, context);
             }
         }
+        mapUuids(newCache, copy.getFqn());
+        assert getFullyQualifiedName(newCache, uuid) != null;
         return newSegment;
     }
 
@@ -748,6 +909,7 @@
         int index = 0;
         Path.Segment[] newChildNames = new Path.Segment[childNames.length - 1];
         for (Path.Segment childName : childNames) {
+
             if (!childName.getName().equals(removedNode.getName())) {
                 newChildNames[index] = childName;
                 index++;
@@ -761,9 +923,8 @@
                     // don't copy ...
                 } else {
                     // Append an updated segment ...
-                    Path.Segment newSegment = context.getValueFactories()
-                                                     .getPathFactory()
-                                                     .createSegment(childName.getName(), childName.getIndex() - 1);
+                    Path.Segment newSegment = context.getValueFactories().getPathFactory().createSegment(childName.getName(),
+                                                                                                         childName.getIndex() - 1);
                     newChildNames[index] = newSegment;
                     // Replace the child with the correct FQN ...
                     changeNodeName(cache, parent, childName, newSegment, context);
@@ -779,18 +940,22 @@
         Set<Object> childNames = parent.getChildrenNames();
         boolean result = true;
         if (childNamesProperty.length != childNames.size()) result = false;
+        if (!result) throw new IllegalStateException(parent.getFqn().toString());
         for (int i = 0; i != childNamesProperty.length; ++i) {
             if (!childNames.contains(childNamesProperty[i])) result = false;
         }
+        if (!result) throw new IllegalStateException(parent.getFqn().toString());
         if (!result) {
             List<Path.Segment> names = new ArrayList<Path.Segment>();
             for (Object name : childNames) {
+                assert name instanceof Path.Segment : parent.getFqn().toString() + "/" + name.toString();
                 names.add((Path.Segment)name);
             }
             Collections.sort(names);
             Logger.getLogger(getClass()).trace("Child list on {0} is: {1}", parent.getFqn(), childNamesProperty);
             Logger.getLogger(getClass()).trace("Children of {0} is: {1}", parent.getFqn(), names);
         }
+        if (!result) throw new IllegalStateException(parent.getFqn().toString());
         return result;
     }
 
@@ -827,6 +992,7 @@
      * @param newSegment
      * @param context
      */
+    @SuppressWarnings( "unchecked" )
     protected void changeNodeName( Cache<Name, Object> cache,
                                    Node<Name, Object> parent,
                                    Path.Segment existing,
@@ -840,7 +1006,7 @@
         if (existing.equals(newSegment)) return;
         context.getLogger(getClass()).trace("Renaming {0} to {1} under {2}", existing, newSegment, parent.getFqn());
         Node<Name, Object> existingChild = parent.getChild(existing);
-        assert existingChild != null;
+        assert existingChild != null : parent.getFqn().toString() + "/" + existing;
 
         // JBoss Cache can move a node from one node to another node, but the move doesn't change the name;
         // since you provide the FQN of the parent location, the name of the node cannot be changed.
@@ -849,7 +1015,7 @@
 
         // Create the new node ...
         Node<Name, Object> newChild = parent.addChild(Fqn.fromElements(newSegment));
-        Fqn<?> newChildFqn = newChild.getFqn();
+        Fqn<Path.Segment> newChildFqn = newChild.getFqn();
 
         // Copy the data ...
         newChild.putAll(existingChild.getData());

Modified: trunk/extensions/dna-connector-jbosscache/src/test/java/org/jboss/dna/connector/jbosscache/JBossCacheRequestProcessorTest.java
===================================================================
--- trunk/extensions/dna-connector-jbosscache/src/test/java/org/jboss/dna/connector/jbosscache/JBossCacheRequestProcessorTest.java	2009-06-19 22:43:42 UTC (rev 1055)
+++ trunk/extensions/dna-connector-jbosscache/src/test/java/org/jboss/dna/connector/jbosscache/JBossCacheRequestProcessorTest.java	2009-06-20 15:13:29 UTC (rev 1056)
@@ -107,14 +107,14 @@
     @Test
     public void shouldCreatePathFromFullyQualifiedNode() {
         Path path = pathFactory.create("/a/b/c/d");
-        Fqn<?> fqn = processor.getFullyQualifiedName(path);
+        Fqn<Path.Segment> fqn = processor.getFullyQualifiedName(path);
         assertThat(processor.getPath(pathFactory, fqn), is(path));
     }
 
     @Test
     public void shouldCreateRootPathFromRootFullyQualifiedNode() {
         Path path = pathFactory.createRootPath();
-        Fqn<?> fqn = processor.getFullyQualifiedName(path);
+        Fqn<Path.Segment> fqn = processor.getFullyQualifiedName(path);
         assertThat(processor.getPath(pathFactory, fqn), is(path));
     }
 }

Modified: trunk/extensions/dna-connector-store-jpa/src/main/java/org/jboss/dna/connector/store/jpa/JpaConnectorI18n.java
===================================================================
--- trunk/extensions/dna-connector-store-jpa/src/main/java/org/jboss/dna/connector/store/jpa/JpaConnectorI18n.java	2009-06-19 22:43:42 UTC (rev 1055)
+++ trunk/extensions/dna-connector-store-jpa/src/main/java/org/jboss/dna/connector/store/jpa/JpaConnectorI18n.java	2009-06-20 15:13:29 UTC (rev 1056)
@@ -43,6 +43,7 @@
     public static I18n unableToReadLargeValue;
     public static I18n unableToMoveRootNode;
     public static I18n locationShouldHavePathAndOrProperty;
+    public static I18n invalidUuidForWorkspace;
     public static I18n invalidReferences;
     public static I18n unableToDeleteBecauseOfReferences;
 

Modified: trunk/extensions/dna-connector-store-jpa/src/main/java/org/jboss/dna/connector/store/jpa/JpaSource.java
===================================================================
--- trunk/extensions/dna-connector-store-jpa/src/main/java/org/jboss/dna/connector/store/jpa/JpaSource.java	2009-06-19 22:43:42 UTC (rev 1055)
+++ trunk/extensions/dna-connector-store-jpa/src/main/java/org/jboss/dna/connector/store/jpa/JpaSource.java	2009-06-20 15:13:29 UTC (rev 1056)
@@ -857,8 +857,7 @@
                     Context context = new InitialContext();
                     dataSource = (DataSource)context.lookup(this.dataSourceJndiName);
                 } catch (Throwable t) {
-                    Logger.getLogger(getClass())
-                          .error(t, JpaConnectorI18n.errorFindingDataSourceInJndi, name, dataSourceJndiName);
+                    Logger.getLogger(getClass()).error(t, JpaConnectorI18n.errorFindingDataSourceInJndi, name, dataSourceJndiName);
                 }
             }
 
@@ -887,6 +886,7 @@
                 setProperty(configurator, "hibernate.connection.url", this.url);
                 setProperty(configurator, "hibernate.connection.max_fetch_depth", DEFAULT_MAXIMUM_FETCH_DEPTH);
                 setProperty(configurator, "hibernate.connection.pool_size", 0); // don't use the built-in pool
+                setProperty(configurator, "hibernate.show_sql", "false");
             }
 
             entityManagerFactory = configurator.buildEntityManagerFactory();

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	2009-06-19 22:43:42 UTC (rev 1055)
+++ trunk/extensions/dna-connector-store-jpa/src/main/java/org/jboss/dna/connector/store/jpa/model/basic/BasicRequestProcessor.java	2009-06-20 15:13:29 UTC (rev 1056)
@@ -66,6 +66,7 @@
 import org.jboss.dna.graph.ExecutionContext;
 import org.jboss.dna.graph.JcrLexicon;
 import org.jboss.dna.graph.Location;
+import org.jboss.dna.graph.connector.UuidAlreadyExistsException;
 import org.jboss.dna.graph.observe.Observer;
 import org.jboss.dna.graph.property.Binary;
 import org.jboss.dna.graph.property.Name;
@@ -101,6 +102,7 @@
 import org.jboss.dna.graph.request.ReadPropertyRequest;
 import org.jboss.dna.graph.request.Request;
 import org.jboss.dna.graph.request.UpdatePropertiesRequest;
+import org.jboss.dna.graph.request.UuidConflictBehavior;
 import org.jboss.dna.graph.request.VerifyWorkspaceRequest;
 import org.jboss.dna.graph.request.processor.RequestProcessor;
 
@@ -200,7 +202,7 @@
 
             // Create nodes have to be defined via a path ...
             Location parentLocation = request.under();
-            ActualLocation actual = getActualLocation(workspace.getId(), parentLocation);
+            ActualLocation actual = getActualLocation(workspace, parentLocation);
             String parentUuidString = actual.uuid;
             assert parentUuidString != null;
 
@@ -215,7 +217,7 @@
             }
             if (uuidString == null) uuidString = UUID.randomUUID().toString();
             assert uuidString != null;
-            createProperties(workspaceId, uuidString, request.properties());
+            createProperties(workspace, uuidString, request.properties());
 
             // Find or create the namespace for the child ...
             Name childName = request.named();
@@ -226,7 +228,7 @@
             assert parentPath != null;
 
             // Figure out the next SNS index and index-in-parent for this new child ...
-            actualLocation = addNewChild(workspaceId, actual, uuidString, childName, true);
+            actualLocation = addNewChild(workspaceId, actual, uuidString, childName, true).location;
 
             // Since we've just created this node, we know about all the children (actually, there are none).
             cache.setAllChildren(workspace.getId(), actualLocation.getPath(), new LinkedList<Location>());
@@ -251,13 +253,13 @@
      * @param childUuid the UUID of the child
      * @param childName the name of the child
      * @param allowSameNameChildrenInNewNode
-     * @return the location of the new child
+     * @return the actual location of the new child
      */
-    protected Location addNewChild( Long workspaceId,
-                                    ActualLocation parent,
-                                    String childUuid,
-                                    Name childName,
-                                    boolean allowSameNameChildrenInNewNode ) {
+    protected ActualLocation addNewChild( Long workspaceId,
+                                          ActualLocation parent,
+                                          String childUuid,
+                                          Name childName,
+                                          boolean allowSameNameChildrenInNewNode ) {
         int nextSnsIndex = 1; // SNS index is 1-based
         int nextIndexInParent = 0; // index-in-parent is 0-based
         String childNsUri = childName.getNamespaceUri();
@@ -269,7 +271,7 @@
         String parentUuid = null;
         ChildEntity parentEntity = null;
         if (parent == null) {
-            return Location.create(pathFactory.createRootPath(), UUID.fromString(childUuid));
+            return new ActualLocation(Location.create(pathFactory.createRootPath(), UUID.fromString(childUuid)), childUuid, null);
         }
         parentPath = parent.location.getPath();
         parentUuid = parent.uuid;
@@ -277,7 +279,7 @@
 
         assert workspaceId != null;
 
-        ChildId id = new ChildId(workspaceId, parentUuid, childUuid);
+        ChildId id = new ChildId(workspaceId, childUuid);
         ChildEntity entity = null;
 
         // Look in the cache for the children of the parent node.
@@ -331,7 +333,7 @@
             }
 
             // Create the new ChildEntity ...
-            entity = new ChildEntity(id, nextIndexInParent, ns, childName.getLocalName(), nextSnsIndex);
+            entity = new ChildEntity(id, parentUuid, nextIndexInParent, ns, childName.getLocalName(), nextSnsIndex);
         } else {
             // The parent does not allow same-name-siblings, so we only need to find the next index ...
             // Find the largest child index in the existing ChildEntity objects ...
@@ -352,7 +354,7 @@
             }
 
             // Create the new child entity ...
-            entity = new ChildEntity(id, nextIndexInParent, ns, childName.getLocalName(), 1);
+            entity = new ChildEntity(id, parentUuid, nextIndexInParent, ns, childName.getLocalName(), 1);
         }
 
         // Persist the new child entity ...
@@ -370,7 +372,7 @@
         } else {
             cache.setAllChildren(workspaceId, parentPath, null);
         }
-        return actualLocation;
+        return new ActualLocation(actualLocation, entity.getId().getChildUuidString(), entity);
     }
 
     protected class NextChildIndexes {
@@ -401,7 +403,7 @@
             assert workspaceId != null;
 
             Location location = request.at();
-            ActualLocation actual = getActualLocation(workspaceId, location);
+            ActualLocation actual = getActualLocation(workspace, location);
             String parentUuidString = actual.uuid;
             actualLocation = actual.location;
 
@@ -469,7 +471,7 @@
             assert workspaceId != null;
 
             Location location = request.of();
-            ActualLocation actual = getActualLocation(workspaceId, location);
+            ActualLocation actual = getActualLocation(workspace, location);
             actualLocation = actual.location;
 
             // Get the children for this node ...
@@ -545,7 +547,7 @@
             assert workspaceId != null;
 
             Location parentLocation = request.of();
-            ActualLocation actualParent = getActualLocation(workspaceId, parentLocation);
+            ActualLocation actualParent = getActualLocation(workspace, parentLocation);
             actualLocation = actualParent.location;
 
             Path parentPath = actualParent.location.getPath();
@@ -610,7 +612,7 @@
             Long workspaceId = workspace.getId();
             assert workspaceId != null;
 
-            ActualLocation actualSibling = getActualLocation(workspaceId, previousSibling);
+            ActualLocation actualSibling = getActualLocation(workspace, previousSibling);
             actualLocation = actualSibling.location;
             if (!actualLocation.getPath().isRoot()) {
                 // First look in the cache for the children of the parent ...
@@ -647,7 +649,7 @@
                         previousChild = (ChildEntity)query.getSingleResult();
                     }
                     int startingIndex = previousChild.getIndexInParent() + 1;
-                    String parentUuid = previousChild.getId().getParentUuidString();
+                    String parentUuid = previousChild.getParentUuidString();
 
                     // Now search the database for the children ...
                     Query query = entities.createNamedQuery("ChildEntity.findRangeUnderParent");
@@ -713,7 +715,7 @@
             assert workspaceId != null;
 
             Location location = request.at();
-            ActualLocation actual = getActualLocation(workspaceId, location);
+            ActualLocation actual = getActualLocation(workspace, location);
             String uuidString = actual.uuid;
             actualLocation = actual.location;
 
@@ -778,7 +780,7 @@
                 try {
                     // Just get the UUID ...
                     Location location = request.on();
-                    ActualLocation actual = getActualLocation(workspaceId, location); // verifies the UUID
+                    ActualLocation actual = getActualLocation(workspace, location); // verifies the UUID
                     UUID uuid = actual.location.getUuid();
                     Property uuidProperty = getExecutionContext().getPropertyFactory().create(propertyName, uuid);
                     request.setProperty(uuidProperty);
@@ -791,7 +793,7 @@
             }
 
             Location location = request.on();
-            ActualLocation actual = getActualLocation(workspaceId, location);
+            ActualLocation actual = getActualLocation(workspace, location);
             String uuidString = actual.uuid;
             actualLocation = actual.location;
 
@@ -848,7 +850,7 @@
             assert workspaceId != null;
 
             Location location = request.on();
-            ActualLocation actual = getActualLocation(workspaceId, location);
+            ActualLocation actual = getActualLocation(workspace, location);
             actualLocation = actual.location;
 
             // Find the properties entity for this node ...
@@ -907,7 +909,7 @@
                         // Remove any existing references ...
                         if (refs.hasRemoved()) {
                             for (Reference reference : refs.getRemoved()) {
-                                String toUuid = resolveToUuid(workspaceId, reference);
+                                String toUuid = resolveToUuid(workspace, reference);
                                 if (toUuid != null) {
                                     ReferenceId id = new ReferenceId(workspaceId, actual.uuid, toUuid);
                                     ReferenceEntity refEntity = entities.find(ReferenceEntity.class, id);
@@ -932,7 +934,7 @@
                     if (newReferences.size() != 0) {
                         // Now save the new references ...
                         for (Reference reference : newReferences) {
-                            String toUuid = resolveToUuid(workspaceId, reference);
+                            String toUuid = resolveToUuid(workspace, reference);
                             if (toUuid != null) {
                                 ReferenceId id = new ReferenceId(workspaceId, actual.uuid, toUuid);
                                 ReferenceEntity refEntity = new ReferenceEntity(id);
@@ -944,7 +946,7 @@
                 }
             } catch (NoResultException e) {
                 // there are no properties yet ...
-                createProperties(workspaceId, actual.uuid, request.properties().values());
+                createProperties(workspace, actual.uuid, request.properties().values());
             }
 
         } catch (Throwable e) { // Includes PathNotFoundException
@@ -972,7 +974,7 @@
             assert workspaceId != null;
 
             Location location = request.at();
-            ActualLocation actual = getActualLocation(workspaceId, location);
+            ActualLocation actual = getActualLocation(workspace, location);
             actualLocation = actual.location;
             Path path = actualLocation.getPath();
 
@@ -1004,7 +1006,7 @@
                     Name childName = nameFactory.create(namespaceUri, localName);
                     int sns = child.getSameNameSiblingIndex();
                     // Figure out who the parent is ...
-                    String childParentUuid = child.getId().getParentUuidString();
+                    String childParentUuid = child.getParentUuidString();
                     if (!parentUuid.equals(childParentUuid)) {
                         // Find the correct parent ...
                         parentLocation = locationsByUuid.get(childParentUuid);
@@ -1075,6 +1077,86 @@
         setCacheableInfo(request);
     }
 
+    private ActualLocation copyNode( EntityManager entities,
+                                     WorkspaceEntity fromWorkspace,
+                                     WorkspaceEntity intoWorkspace,
+                                     ChildEntity original,
+                                     ActualLocation actualNewParent,
+                                     UuidConflictBehavior uuidConflictBehavior,
+                                     Name desiredName,
+                                     Map<String, String> oldUuidsToNewUuids,
+                                     Map<String, ChildEntity> addedLocations,
+                                     Map<String, Location> deletedLocations ) {
+        assert fromWorkspace != null;
+        assert intoWorkspace != null;
+        assert original != null;
+        assert desiredName != null;
+        assert oldUuidsToNewUuids != null;
+
+        // Assume that UUID isn't changing. If the conflict behavior says that it does change, the switch statement will handle it
+        String newUuid = original.getId().getChildUuidString();
+        ActualLocation newLocation = null;
+        ActualLocation existingLocation = null;
+
+        UUID oldUuid = UUID.fromString(original.getId().getChildUuidString());
+
+        switch (uuidConflictBehavior) {
+            case ALWAYS_CREATE_NEW_UUID:
+                newUuid = UUID.randomUUID().toString();
+
+                break;
+            case THROW_EXCEPTION:
+                try {
+                    existingLocation = getActualLocation(intoWorkspace, Location.create(oldUuid));
+                    String pathAsString = existingLocation.toString();
+                    throw new UuidAlreadyExistsException(this.getSourceName(), oldUuid, pathAsString, intoWorkspace.getName());
+                } catch (PathNotFoundException pnfe) {
+
+                }
+                break;
+            case REPLACE_EXISTING_NODE:
+                try {
+                    existingLocation = getActualLocation(intoWorkspace, Location.create(oldUuid));
+                    deletedLocations.putAll(computeDeletedLocations(intoWorkspace, existingLocation.location, true));
+                } catch (PathNotFoundException pnfe) {
+
+                }
+                break;
+            default:
+                throw new IllegalStateException("Unexpected UuidConflictBehavior value: " + uuidConflictBehavior);
+        }
+        oldUuidsToNewUuids.put(original.getId().getChildUuidString(), newUuid);
+
+        if (existingLocation != null && existingLocation.childEntity.getParentUuidString().equals(actualNewParent.uuid)) {
+            NamespaceEntity namespace = NamespaceEntity.findByUri(entities, desiredName.getNamespaceUri());
+
+            ChildEntity existingChild = existingLocation.childEntity;
+            existingChild.setChildName(desiredName.getLocalName());
+            existingChild.setChildNamespace(namespace);
+            existingChild.setParentUuidString(actualNewParent.uuid);
+            existingChild.setAllowsSameNameChildren(original.getAllowsSameNameChildren());
+            existingChild.setIndexInParent(original.getIndexInParent());
+            existingChild.setSameNameSiblingIndex(original.getSameNameSiblingIndex());
+            Location parentLocation = actualNewParent.location;
+            assert parentLocation.hasPath();
+
+            Name segmentName = nameFactory.create(existingChild.getChildNamespace().getUri(), existingChild.getChildName());
+            Path.Segment newSegment = pathFactory.createSegment(segmentName, existingChild.getSameNameSiblingIndex());
+            Path newPath = pathFactory.create(parentLocation.getPath(), newSegment);
+            newLocation = new ActualLocation(Location.create(newPath, UUID.fromString(newUuid)), newUuid, existingChild);
+
+        } else {
+            // Now add the new copy of the original ...
+            boolean allowSnS = original.getAllowsSameNameChildren();
+            newLocation = addNewChild(intoWorkspace.getId(), actualNewParent, newUuid, desiredName, allowSnS);
+        }
+
+        assert newLocation != null;
+        addedLocations.put(newLocation.uuid, newLocation.childEntity);
+
+        return newLocation;
+    }
+
     /**
      * {@inheritDoc}
      * 
@@ -1095,15 +1177,14 @@
             Long intoWorkspaceId = intoWorkspace.getId();
             assert fromWorkspaceId != null;
             assert intoWorkspaceId != null;
-            final boolean isSameWorkspace = fromWorkspaceId == intoWorkspaceId;
 
             Location fromLocation = request.from();
-            ActualLocation actualFrom = getActualLocation(fromWorkspaceId, fromLocation);
+            ActualLocation actualFrom = getActualLocation(fromWorkspace, fromLocation);
             actualFromLocation = actualFrom.location;
             Path fromPath = actualFromLocation.getPath();
 
             Location newParentLocation = request.into();
-            ActualLocation actualNewParent = getActualLocation(intoWorkspaceId, newParentLocation);
+            ActualLocation actualNewParent = getActualLocation(intoWorkspace, newParentLocation);
             assert actualNewParent != null;
 
             // Create a map that we'll use to record the new UUID for each of the original nodes ...
@@ -1120,84 +1201,111 @@
                 // Walk through the original nodes, creating new ChildEntity object (i.e., copy) for each original ...
                 List<ChildEntity> originalNodes = query.getNodes(true, true);
                 Iterator<ChildEntity> originalIter = originalNodes.iterator();
+                Map<String, ChildEntity> addedLocations = new HashMap<String, ChildEntity>();
+                Map<String, Location> deletedLocations = new HashMap<String, Location>();
 
                 // Start with the original (top-level) node first, since we need to add it to the list of children ...
                 if (originalIter.hasNext()) {
                     ChildEntity original = originalIter.next();
 
-                    // Create a new UUID for the copy ...
-                    String copyUuid = original.getId().getChildUuidString();
-                    if (isSameWorkspace) {
-                        copyUuid = UUID.randomUUID().toString();
-                        originalToNewUuid.put(original.getId().getChildUuidString(), copyUuid);
-                    }
-
-                    // Now add the new copy of the original ...
-                    Name childName = request.desiredName();
-                    if (childName == null) childName = fromPath.getLastSegment().getName();
-                    boolean allowSnS = original.getAllowsSameNameChildren();
-                    actualToLocation = addNewChild(intoWorkspaceId, actualNewParent, copyUuid, childName, allowSnS);
+                    Name desiredName = request.desiredName();
+                    if (desiredName == null) desiredName = fromPath.getLastSegment().getName();
+                    actualToLocation = this.copyNode(entities,
+                                                     fromWorkspace,
+                                                     intoWorkspace,
+                                                     original,
+                                                     actualNewParent,
+                                                     request.uuidConflictBehavior(),
+                                                     desiredName,
+                                                     originalToNewUuid,
+                                                     addedLocations,
+                                                     deletedLocations).location;
                 }
 
                 // Now create copies of all children in the subgraph.
-                // We assign new UUIDs to each new child only if the 'from' and 'into' workspaces are the same ...
                 while (originalIter.hasNext()) {
                     ChildEntity original = originalIter.next();
-                    String newParentUuidOfCopy = original.getId().getParentUuidString();
-                    if (isSameWorkspace) newParentUuidOfCopy = originalToNewUuid.get(newParentUuidOfCopy);
+                    String newParentUuidOfCopy = originalToNewUuid.get(original.getParentUuidString());
                     assert newParentUuidOfCopy != null;
 
-                    // Create a new UUID for the copy ...
-                    String copyUuid = original.getId().getChildUuidString();
-                    if (isSameWorkspace) {
-                        copyUuid = UUID.randomUUID().toString();
-                        originalToNewUuid.put(original.getId().getChildUuidString(), copyUuid);
-                    }
+                    actualNewParent = getActualLocation(intoWorkspace, Location.create(UUID.fromString(newParentUuidOfCopy)));
 
-                    // Create the copy ...
-                    ChildEntity copy = new ChildEntity(new ChildId(intoWorkspaceId, newParentUuidOfCopy, copyUuid),
-                                                       original.getIndexInParent(), original.getChildNamespace(),
-                                                       original.getChildName(), original.getSameNameSiblingIndex());
-                    entities.persist(copy);
+                    Name desiredName = nameFactory.create(original.getChildNamespace().getUri(), original.getChildName());
+                    this.copyNode(entities,
+                                  fromWorkspace,
+                                  intoWorkspace,
+                                  original,
+                                  actualNewParent,
+                                  request.uuidConflictBehavior(),
+                                  desiredName,
+                                  originalToNewUuid,
+                                  addedLocations,
+                                  deletedLocations);
                 }
                 entities.flush();
 
                 Set<String> newNodesWithReferenceProperties = new HashSet<String>();
-                if (isSameWorkspace) {
-                    // Now create copies of all the intra-subgraph references, replacing the UUIDs on both ends ...
-                    for (ReferenceEntity reference : query.getInternalReferences()) {
-                        String newFromUuid = originalToNewUuid.get(reference.getId().getFromUuidString());
-                        assert newFromUuid != null;
-                        String newToUuid = originalToNewUuid.get(reference.getId().getToUuidString());
-                        assert newToUuid != null;
-                        ReferenceEntity copy = new ReferenceEntity(new ReferenceId(intoWorkspaceId, newFromUuid, newToUuid));
-                        entities.persist(copy);
-                        newNodesWithReferenceProperties.add(newFromUuid);
+                // Now create copies of all the intra-subgraph references, replacing the UUIDs on both ends ...
+                for (ReferenceEntity reference : query.getInternalReferences()) {
+                    String newFromUuid = originalToNewUuid.get(reference.getId().getFromUuidString());
+                    assert newFromUuid != null;
+                    String newToUuid = originalToNewUuid.get(reference.getId().getToUuidString());
+                    assert newToUuid != null;
+                    ReferenceEntity copy = new ReferenceEntity(new ReferenceId(intoWorkspaceId, newFromUuid, newToUuid));
+                    entities.persist(copy);
+                    newNodesWithReferenceProperties.add(newFromUuid);
+                }
+
+                // Now create copies of all the references owned by the subgraph but pointing to non-subgraph nodes,
+                // so we only replaced the 'from' UUID ...
+                for (ReferenceEntity reference : query.getOutwardReferences()) {
+                    String oldToUuid = reference.getId().getToUuidString();
+                    String newFromUuid = originalToNewUuid.get(reference.getId().getFromUuidString());
+                    assert newFromUuid != null;
+
+                    ActualLocation refTargetLocation = getActualLocation(intoWorkspace,
+                                                                         Location.create(UUID.fromString(oldToUuid)));
+                    if (refTargetLocation == null) {
+                        // Some of the references that remain will be invalid, since they point to nodes that
+                        // have just been deleted. Build up the information necessary to produce a useful exception ...
+                        ValueFactory<Reference> refFactory = getExecutionContext().getValueFactories().getReferenceFactory();
+                        Map<Location, List<Reference>> invalidRefs = new HashMap<Location, List<Reference>>();
+                        UUID fromUuid = UUID.fromString(reference.getId().getFromUuidString());
+                        ActualLocation actualRefFromLocation = getActualLocation(intoWorkspace, Location.create(fromUuid));
+                        Location refFromLocation = actualRefFromLocation.location;
+                        List<Reference> refs = invalidRefs.get(fromLocation);
+                        if (refs == null) {
+                            refs = new ArrayList<Reference>();
+                            invalidRefs.put(refFromLocation, refs);
+                        }
+                        UUID toUuid = UUID.fromString(oldToUuid);
+                        refs.add(refFactory.create(toUuid));
+
+                        String msg = JpaConnectorI18n.invalidReferences.text(reference.getId().getFromUuidString());
+                        throw new ReferentialIntegrityException(invalidRefs, msg);
                     }
 
-                    // Now create copies of all the references owned by the subgraph but pointing to non-subgraph nodes,
-                    // so we only replaced the 'from' UUID ...
-                    for (ReferenceEntity reference : query.getOutwardReferences()) {
-                        String oldToUuid = reference.getId().getToUuidString();
-                        String newFromUuid = originalToNewUuid.get(reference.getId().getFromUuidString());
-                        assert newFromUuid != null;
-                        ReferenceEntity copy = new ReferenceEntity(new ReferenceId(intoWorkspaceId, newFromUuid, oldToUuid));
-                        entities.persist(copy);
-                        newNodesWithReferenceProperties.add(newFromUuid);
-                    }
+                    ReferenceEntity copy = new ReferenceEntity(new ReferenceId(intoWorkspaceId, newFromUuid, oldToUuid));
+                    entities.persist(copy);
+                    newNodesWithReferenceProperties.add(newFromUuid);
                 }
 
+                Set<PropertiesEntity> addedProps = new HashSet<PropertiesEntity>();
                 // Now process the properties, creating a copy (note references are not changed) ...
                 for (PropertiesEntity original : query.getProperties(true, true)) {
                     // Find the UUID of the copy ...
-                    String copyUuid = original.getId().getUuidString();
-                    if (isSameWorkspace) copyUuid = originalToNewUuid.get(copyUuid);
+                    String copyUuid = originalToNewUuid.get(original.getId().getUuidString());
                     assert copyUuid != null;
 
                     // Create the copy ...
                     boolean compressed = original.isCompressed();
                     byte[] originalData = original.getData();
-                    PropertiesEntity copy = new PropertiesEntity(new NodeId(intoWorkspaceId, copyUuid));
+                    NodeId propertiesId = new NodeId(intoWorkspaceId, copyUuid);
+                    PropertiesEntity copy = entities.find(PropertiesEntity.class, propertiesId);
+
+                    if (copy == null) {
+                        copy = new PropertiesEntity(propertiesId);
+                    }
                     copy.setCompressed(compressed);
                     if (newNodesWithReferenceProperties.contains(copyUuid)) {
 
@@ -1224,10 +1332,70 @@
                     }
                     copy.setPropertyCount(original.getPropertyCount());
                     copy.setReferentialIntegrityEnforced(original.isReferentialIntegrityEnforced());
+                    addedProps.add(copy);
                     entities.persist(copy);
                 }
                 entities.flush();
 
+                if (request.uuidConflictBehavior() == UuidConflictBehavior.REPLACE_EXISTING_NODE) {
+                    /*
+                    * We may have deleted some old copies of nodes and replaced them with new copies.
+                    * Now we need to clean up any nodes that were descendants of the old copies of the
+                    * nodes but are not descendants of the new copies.
+                    */
+                    deletedLocations.keySet().removeAll(addedLocations.keySet());
+
+                    if (deletedLocations.size() > 0) {
+                        // Verify referential integrity: that none of the deleted nodes are referenced by nodes not being deleted.
+                        List<ReferenceEntity> invalidReferences = ReferenceEntity.getReferencesToUuids(intoWorkspace.getId(),
+                                                                                                       deletedLocations.keySet(),
+                                                                                                       entities);
+
+                        for (Iterator<ReferenceEntity> iter = invalidReferences.iterator(); iter.hasNext();) {
+                            ReferenceEntity invalidRef = iter.next();
+                            if (deletedLocations.keySet().contains(invalidRef.getId().getFromUuidString())) {
+                                iter.remove();
+                            }
+                        }
+
+                        if (invalidReferences.size() > 0) {
+                            // Some of the references that remain will be invalid, since they point to nodes that
+                            // have just been deleted. Build up the information necessary to produce a useful exception ...
+                            ValueFactory<Reference> refFactory = getExecutionContext().getValueFactories().getReferenceFactory();
+                            Map<Location, List<Reference>> invalidRefs = new HashMap<Location, List<Reference>>();
+                            for (ReferenceEntity entity : invalidReferences) {
+                                UUID fromUuid = UUID.fromString(entity.getId().getFromUuidString());
+                                ActualLocation actualRefFromLocation = getActualLocation(intoWorkspace, Location.create(fromUuid));
+                                Location refFromLocation = actualRefFromLocation.location;
+                                List<Reference> refs = invalidRefs.get(fromLocation);
+                                if (refs == null) {
+                                    refs = new ArrayList<Reference>();
+                                    invalidRefs.put(refFromLocation, refs);
+                                }
+                                UUID toUuid = UUID.fromString(entity.getId().getToUuidString());
+                                refs.add(refFactory.create(toUuid));
+                            }
+                            String msg = JpaConnectorI18n.unableToDeleteBecauseOfReferences.text();
+                            throw new ReferentialIntegrityException(invalidRefs, msg);
+                        }
+
+                        /*
+                         * This list of values that were deleted is expected to be fairly small
+                         */
+                        for (Location location : deletedLocations.values()) {
+                            ActualLocation node = getActualLocation(intoWorkspace, location);
+                            entities.remove(node.childEntity);
+                            PropertiesEntity.deletePropertiesFor(intoWorkspace.getId(), node.uuid, entities);
+
+                        }
+                        // Remove from the cache of children locations all entries for deleted nodes ...
+                        cache.removeBranch(intoWorkspaceId, deletedLocations.values());
+                    }
+                    LargeValueEntity.deleteUnused(entities);
+                }
+
+                // cache.clear(intoWorkspace.getId());
+
             } finally {
                 // Close and release the temporary data used for this operation ...
                 query.close();
@@ -1283,7 +1451,7 @@
             Long workspaceId = workspace.getId();
             assert workspaceId != null;
 
-            ActualLocation actual = getActualLocation(workspaceId, location);
+            ActualLocation actual = getActualLocation(workspace, location);
             actualLocation = actual.location;
             Path path = actualLocation.getPath();
 
@@ -1296,7 +1464,7 @@
                                                        0);
             try {
                 ChildEntity deleted = query.getNode();
-                String parentUuidString = deleted.getId().getParentUuidString();
+                String parentUuidString = deleted.getParentUuidString();
                 String childName = deleted.getChildName();
                 long nsId = deleted.getChildNamespace().getId();
                 int indexInParent = deleted.getIndexInParent();
@@ -1316,7 +1484,7 @@
                     Map<Location, List<Reference>> invalidRefs = new HashMap<Location, List<Reference>>();
                     for (ReferenceEntity entity : invalidReferences) {
                         UUID fromUuid = UUID.fromString(entity.getId().getFromUuidString());
-                        ActualLocation actualFromLocation = getActualLocation(workspaceId, Location.create(fromUuid));
+                        ActualLocation actualFromLocation = getActualLocation(workspace, Location.create(fromUuid));
                         Location fromLocation = actualFromLocation.location;
                         List<Reference> refs = invalidRefs.get(fromLocation);
                         if (refs == null) {
@@ -1355,6 +1523,43 @@
         return actualLocation;
     }
 
+    protected Map<String, Location> computeDeletedLocations( WorkspaceEntity workspace,
+                                                             Location topNodeLocation,
+                                                             boolean deleteTopOfBranch ) {
+        Location actualLocation = null;
+
+        // Find the workspace ...
+        if (workspace == null) return null;
+        Long workspaceId = workspace.getId();
+        assert workspaceId != null;
+
+        ActualLocation actual = getActualLocation(workspace, topNodeLocation);
+        actualLocation = actual.location;
+        Path path = actualLocation.getPath();
+
+        // Compute the subgraph, including the top node in the subgraph ...
+        SubgraphQuery query = SubgraphQuery.create(getExecutionContext(),
+                                                   entities,
+                                                   workspaceId,
+                                                   actualLocation.getUuid(),
+                                                   path,
+                                                   0);
+        try {
+            // Get the locations of all deleted nodes, which will be required by events ...
+            List<Location> deletedLocations = query.getNodeLocations(true, true);
+
+            Map<String, Location> results = new HashMap<String, Location>(deletedLocations.size());
+            for (Location location : deletedLocations) {
+                results.put(location.getUuid().toString(), location);
+            }
+
+            return results;
+        } finally {
+            // Close and release the temporary data used for this operation ...
+            query.close();
+        }
+    }
+
     /**
      * {@inheritDoc}
      * 
@@ -1374,8 +1579,7 @@
             assert workspaceId != null;
 
             Location fromLocation = request.from();
-            ActualLocation actualLocation = getActualLocation(workspaceId, fromLocation);
-            String fromUuidString = actualLocation.uuid;
+            ActualLocation actualLocation = getActualLocation(workspace, fromLocation);
             actualOldLocation = actualLocation.location;
             Path oldPath = actualOldLocation.getPath();
 
@@ -1387,7 +1591,7 @@
 
             // Find the ChildEntity of the existing 'from' node ...
             ChildEntity fromEntity = actualLocation.childEntity;
-            final String oldParentUuid = fromEntity.getId().getParentUuidString();
+            final String oldParentUuid = fromEntity.getParentUuidString();
 
             // Find the actual new location ...
             Location toLocation = request.into();
@@ -1397,7 +1601,7 @@
                 if (beforeLocation.hasPath()) {
                     toLocation = Location.create(beforeLocation.getPath().getParent());
                 } else {
-                    ActualLocation actualBeforeLocation = getActualLocation(workspaceId, beforeLocation);
+                    ActualLocation actualBeforeLocation = getActualLocation(workspace, beforeLocation);
 
                     // Ensure that the beforeLocation has a path - actualBeforeLocation has a path
                     beforeLocation = actualBeforeLocation.location;
@@ -1410,7 +1614,7 @@
                 actualNewLocation = actualOldLocation;
             } else {
                 // We have to proceed as normal ...
-                ActualLocation actualIntoLocation = getActualLocation(workspaceId, toLocation);
+                ActualLocation actualIntoLocation = getActualLocation(workspace, toLocation);
                 toUuidString = actualIntoLocation.uuid;
                 if (!toUuidString.equals(oldParentUuid)) {
                     // Now we know that the new parent is not the existing parent ...
@@ -1473,18 +1677,16 @@
                             boolean foundBefore = false;
                             for (ChildEntity child : children) {
                                 NamespaceEntity namespace = child.getChildNamespace();
-                                if (namespace.getUri().equals(ns.getUri())
-                                    && child.getChildName().equals(childLocalName)
+                                if (namespace.getUri().equals(ns.getUri()) && child.getChildName().equals(childLocalName)
                                     && child.getSameNameSiblingIndex() == beforeSegment.getIndex()) {
                                     foundBefore = true;
                                     nextIndexInParent = child.getIndexInParent();
-                                    nextSnsIndex = beforeSegment.getIndex();                                    
+                                    nextSnsIndex = beforeSegment.getIndex();
                                 }
 
                                 if (foundBefore) {
                                     child.setIndexInParent(child.getIndexInParent() + 1);
-                                    if (child.getChildName().equals(childLocalName)
-                                        && namespace.getUri().equals(ns.getUri())) {
+                                    if (child.getChildName().equals(childLocalName) && namespace.getUri().equals(ns.getUri())) {
                                         child.setSameNameSiblingIndex(child.getSameNameSiblingIndex() + 1);
                                     }
                                     entities.persist(child);
@@ -1496,22 +1698,11 @@
 
                     }
 
-                    ChildId movedId = new ChildId(workspaceId, toUuidString, fromUuidString);
-                    if (fromEntity.getId().equals(movedId)) {
-                        // The node is being renamed, but not moved ...
-                        fromEntity.setChildName(childLocalName);
-                        fromEntity.setChildNamespace(ns);
-                        fromEntity.setIndexInParent(nextIndexInParent);
-                        fromEntity.setSameNameSiblingIndex(nextSnsIndex);
-                    } else {
-                        // We won't be able to move the entity to a different parent, because that would involve
-                        // changing the PK for the entity, which is not possible. Instead, we have to create a
-                        // new entity with the same identity information, then delete 'fromEntity'
-                        ChildEntity movedEntity = new ChildEntity(movedId, nextIndexInParent, ns, childLocalName, nextSnsIndex);
-                        movedEntity.setAllowsSameNameChildren(fromEntity.getAllowsSameNameChildren());
-                        entities.persist(movedEntity);
-                        entities.remove(fromEntity);
-                    }
+                    fromEntity.setParentUuidString(toUuidString);
+                    fromEntity.setChildName(childLocalName);
+                    fromEntity.setChildNamespace(ns);
+                    fromEntity.setIndexInParent(nextIndexInParent);
+                    fromEntity.setSameNameSiblingIndex(nextSnsIndex);
 
                     // Flush the entities to the database ...
                     entities.flush();
@@ -1536,6 +1727,10 @@
             }
 
         } catch (Throwable e) { // Includes PathNotFoundException
+            System.err.flush();
+            System.out.flush();
+            e.printStackTrace();
+            System.err.flush();
             request.setError(e);
             return;
         }
@@ -1557,7 +1752,7 @@
         if (workspace != null) {
             Long workspaceId = workspace.getId();
             assert workspaceId != null;
-            ActualLocation actual = getActualLocation(workspaceId, Location.create(pathFactory.createRootPath()));
+            ActualLocation actual = getActualLocation(workspace, Location.create(pathFactory.createRootPath()));
             request.setActualRootLocation(actual.location);
             request.setActualWorkspaceName(workspace.getName());
         }
@@ -1612,7 +1807,7 @@
         request.setActualWorkspaceName(entity.getName());
         // Create the root node ...
         Location root = Location.create(pathFactory.createRootPath());
-        request.setActualRootLocation(getActualLocation(entity.getId(), root).location);
+        request.setActualRootLocation(getActualLocation(entity, root).location);
         recordChange(request);
     }
 
@@ -1672,9 +1867,9 @@
             List<ChildEntity> childEntities = query.getResultList();
             for (ChildEntity child : childEntities) {
                 ChildId origId = child.getId();
-                ChildId copyId = new ChildId(intoWorkspaceId, origId.getParentUuidString(), origId.getChildUuidString());
-                ChildEntity copy = new ChildEntity(copyId, child.getIndexInParent(), child.getChildNamespace(),
-                                                   child.getChildName());
+                ChildId copyId = new ChildId(intoWorkspaceId, origId.getChildUuidString());
+                ChildEntity copy = new ChildEntity(copyId, child.getParentUuidString(), child.getIndexInParent(),
+                                                   child.getChildNamespace(), child.getChildName());
                 copy.setAllowsSameNameChildren(child.getAllowsSameNameChildren());
                 copy.setSameNameSiblingIndex(child.getSameNameSiblingIndex());
                 entities.persist(copy);
@@ -1712,7 +1907,7 @@
 
         // Finish up the request ...
         Location root = Location.create(pathFactory.createRootPath(), rootNodeUuid);
-        request.setActualRootLocation(getActualLocation(intoWorkspace.getId(), root).location);
+        request.setActualRootLocation(getActualLocation(intoWorkspace, root).location);
         recordChange(request);
     }
 
@@ -1730,7 +1925,7 @@
         assert workspaceId != null;
 
         // Get the actual location of the root node ...
-        ActualLocation actual = getActualLocation(workspaceId, Location.create(pathFactory.createRootPath()));
+        ActualLocation actual = getActualLocation(workspace, Location.create(pathFactory.createRootPath()));
 
         // Delete the workspace ...
         workspaces.destroy(workspace.getName());
@@ -1816,7 +2011,10 @@
                         ReferenceId id = entity.getId();
                         UUID fromUuid = UUID.fromString(id.getFromUuidString());
                         Location location = Location.create(fromUuid);
-                        location = getActualLocation(id.getWorkspaceId(), location).location;
+                        WorkspaceEntity dummyWorkspaceReference = new WorkspaceEntity();
+                        dummyWorkspaceReference.setId(id.getWorkspaceId());
+                        dummyWorkspaceReference.setName("<unknown>");
+                        location = getActualLocation(dummyWorkspaceReference, location).location;
                         List<Reference> refs = invalidRefs.get(location);
                         if (refs == null) {
                             refs = new ArrayList<Reference>();
@@ -1837,13 +2035,13 @@
         }
     }
 
-    protected String createProperties( Long workspaceId,
+    protected String createProperties( WorkspaceEntity workspace,
                                        String uuidString,
                                        Collection<Property> properties ) throws IOException {
         assert uuidString != null;
 
         // Create the PropertiesEntity ...
-        NodeId nodeId = new NodeId(workspaceId, uuidString);
+        NodeId nodeId = new NodeId(workspace.getId(), uuidString);
         PropertiesEntity props = new PropertiesEntity(nodeId);
 
         // If there are properties ...
@@ -1871,12 +2069,12 @@
             // Record the changes to the references ...
             if (refs != null && refs.hasWritten()) {
                 for (Reference reference : refs.getWritten()) {
-                    String toUuid = resolveToUuid(workspaceId, reference);
+                    String toUuid = resolveToUuid(workspace, reference);
                     if (toUuid != null) {
-                        ReferenceId id = new ReferenceId(workspaceId, uuidString, toUuid);
+                        ReferenceId id = new ReferenceId(workspace.getId(), uuidString, toUuid);
                         ReferenceEntity refEntity = new ReferenceEntity(id);
                         entities.persist(refEntity);
-                        workspaceIdsWithChangedReferences.add(workspaceId);
+                        workspaceIdsWithChangedReferences.add(workspace.getId());
                     }
                 }
             }
@@ -1900,12 +2098,12 @@
      * @param reference the reference
      * @return the UUID of the node to which the reference points, or null if the reference could not be resolved
      */
-    protected String resolveToUuid( Long workspaceId,
+    protected String resolveToUuid( WorkspaceEntity workspace,
                                     Reference reference ) {
         // See if the reference is by UUID ...
         try {
             UUID uuid = uuidFactory.create(reference);
-            ActualLocation actualLocation = getActualLocation(workspaceId, Location.create(uuid));
+            ActualLocation actualLocation = getActualLocation(workspace, Location.create(uuid));
             return actualLocation.uuid;
         } catch (ValueFormatException e) {
             // Unknown kind of reference, which we don't track
@@ -1943,10 +2141,12 @@
      *         be usable after this method is called
      * @throws PathNotFoundException if the location does not represent a location that could be found
      */
-    protected ActualLocation getActualLocation( Long workspaceId,
+    protected ActualLocation getActualLocation( WorkspaceEntity workspace,
                                                 Location original ) throws PathNotFoundException {
         assert original != null;
 
+        long workspaceId = workspace.getId();
+
         // Look for the UUID in the original ...
         Property uuidProperty = original.getIdProperty(DnaLexicon.UUID);
         String uuidString = uuidProperty != null && !uuidProperty.isEmpty() ? stringFactory.create(uuidProperty.getFirstValue()) : null;
@@ -1981,9 +2181,13 @@
                     int sns = entity.getSameNameSiblingIndex();
                     Name name = nameFactory.create(uri, localName);
                     segments.addFirst(pathFactory.createSegment(name, sns));
-                    uuidString = entity.getId().getParentUuidString();
+                    uuidString = entity.getParentUuidString();
                 } catch (NoResultException e) {
-                    uuidString = null;
+                    if (!uuidString.equals(this.rootNodeUuidString)) {
+                        String workspaceName = workspace.getName();
+                        String msg = JpaConnectorI18n.invalidUuidForWorkspace.text(uuidString, workspaceName);
+                        throw new PathNotFoundException(original, pathFactory.createRootPath(), msg);
+                    }
                 }
             }
             Path fullPath = pathFactory.createAbsolutePath(segments);

Modified: trunk/extensions/dna-connector-store-jpa/src/main/java/org/jboss/dna/connector/store/jpa/model/basic/ChildEntity.java
===================================================================
--- trunk/extensions/dna-connector-store-jpa/src/main/java/org/jboss/dna/connector/store/jpa/model/basic/ChildEntity.java	2009-06-19 22:43:42 UTC (rev 1055)
+++ trunk/extensions/dna-connector-store-jpa/src/main/java/org/jboss/dna/connector/store/jpa/model/basic/ChildEntity.java	2009-06-20 15:13:29 UTC (rev 1056)
@@ -42,7 +42,7 @@
 /**
  * An entity representing the parent-child relationship between two nodes. In addition to the references to the parent and child
  * nodes, this entity also maintains the indexInParent of the indexInParent within the parent node's list of all children, the
- * child's name ( {@link #getChildName() local part} and {@link #getChildNamespace() namespace}), and the same-name-sibiling
+ * child's name ( {@link #getChildName() local part} and {@link #getChildNamespace() namespace}), and the same-name-sibling
  * indexInParent (if there is one).
  * 
  * @author Randall Hauch
@@ -51,23 +51,25 @@
 @Table( name = "DNA_BASIC_CHILDREN" )
 @org.hibernate.annotations.Table( appliesTo = "DNA_BASIC_CHILDREN", indexes = {
     @Index( name = "CHILDINDEX_INX", columnNames = {"WORKSPACE_ID", "PARENT_UUID", "CHILD_INDEX"} ),
-    @Index( name = "CHILDUUID_INX", columnNames = {"WORKSPACE_ID", "CHILD_UUID"} ),
     @Index( name = "CHILDNAME_INX", columnNames = {"WORKSPACE_ID", "PARENT_UUID", "CHILD_NAME_NS_ID", "CHILD_NAME_LOCAL",
         "SNS_INDEX"} )} )
 @NamedQueries( {
-    @NamedQuery( name = "ChildEntity.findByPathSegment", query = "select child from ChildEntity as child where child.id.workspaceId = :workspaceId and child.id.parentUuidString = :parentUuidString AND child.childNamespace.id = :ns AND child.childName = :childName AND child.sameNameSiblingIndex = :sns" ),
-    @NamedQuery( name = "ChildEntity.findAllUnderParent", query = "select child from ChildEntity as child where child.id.workspaceId = :workspaceId and child.id.parentUuidString = :parentUuidString order by child.indexInParent" ),
-    @NamedQuery( name = "ChildEntity.findRangeUnderParent", query = "select child from ChildEntity as child where child.id.workspaceId = :workspaceId and child.id.parentUuidString = :parentUuidString and child.indexInParent >= :firstIndex and child.indexInParent < :afterIndex order by child.indexInParent" ),
-    @NamedQuery( name = "ChildEntity.findChildrenAfterIndexUnderParent", query = "select child from ChildEntity as child where child.id.workspaceId = :workspaceId and child.id.parentUuidString = :parentUuidString and child.indexInParent >= :afterIndex order by child.indexInParent" ),
+    @NamedQuery( name = "ChildEntity.findByPathSegment", query = "select child from ChildEntity as child where child.id.workspaceId = :workspaceId and child.parentUuidString = :parentUuidString AND child.childNamespace.id = :ns AND child.childName = :childName AND child.sameNameSiblingIndex = :sns" ),
+    @NamedQuery( name = "ChildEntity.findAllUnderParent", query = "select child from ChildEntity as child where child.id.workspaceId = :workspaceId and child.parentUuidString = :parentUuidString order by child.indexInParent" ),
+    @NamedQuery( name = "ChildEntity.findRangeUnderParent", query = "select child from ChildEntity as child where child.id.workspaceId = :workspaceId and child.parentUuidString = :parentUuidString and child.indexInParent >= :firstIndex and child.indexInParent < :afterIndex order by child.indexInParent" ),
+    @NamedQuery( name = "ChildEntity.findChildrenAfterIndexUnderParent", query = "select child from ChildEntity as child where child.id.workspaceId = :workspaceId and child.parentUuidString = :parentUuidString and child.indexInParent >= :afterIndex order by child.indexInParent" ),
     @NamedQuery( name = "ChildEntity.findByChildUuid", query = "select child from ChildEntity as child where child.id.workspaceId = :workspaceId and child.id.childUuidString = :childUuidString" ),
-    @NamedQuery( name = "ChildEntity.findMaximumSnsIndex", query = "select max(child.sameNameSiblingIndex) from ChildEntity as child where child.id.workspaceId = :workspaceId and child.id.parentUuidString = :parentUuid AND child.childNamespace.id = :ns AND child.childName = :childName" ),
-    @NamedQuery( name = "ChildEntity.findMaximumChildIndex", query = "select max(child.indexInParent) from ChildEntity as child where child.id.workspaceId = :workspaceId and child.id.parentUuidString = :parentUuid" ),
+    @NamedQuery( name = "ChildEntity.findMaximumSnsIndex", query = "select max(child.sameNameSiblingIndex) from ChildEntity as child where child.id.workspaceId = :workspaceId and child.parentUuidString = :parentUuid AND child.childNamespace.id = :ns AND child.childName = :childName" ),
+    @NamedQuery( name = "ChildEntity.findMaximumChildIndex", query = "select max(child.indexInParent) from ChildEntity as child where child.id.workspaceId = :workspaceId and child.parentUuidString = :parentUuid" ),
     @NamedQuery( name = "ChildEntity.findInWorkspace", query = "select child from ChildEntity as child where child.id.workspaceId = :workspaceId" )} )
 public class ChildEntity {
 
     @Id
     private ChildId id;
 
+    @Column( name = "PARENT_UUID", nullable = false, length = 36 )
+    private String parentUuidString;
+
     /** The zero-based index */
     @Column( name = "CHILD_INDEX", nullable = false, unique = false )
     private int indexInParent;
@@ -93,10 +95,12 @@
     }
 
     public ChildEntity( ChildId id,
+                        String parentUuidString,
                         int indexInParent,
                         NamespaceEntity ns,
                         String name ) {
         this.id = id;
+        this.parentUuidString = parentUuidString;
         this.indexInParent = indexInParent;
         this.childNamespace = ns;
         this.childName = name;
@@ -104,11 +108,13 @@
     }
 
     public ChildEntity( ChildId id,
+                        String parentUuidString,
                         int indexInParent,
                         NamespaceEntity ns,
                         String name,
                         int sameNameSiblingIndex ) {
         this.id = id;
+        this.parentUuidString = parentUuidString;
         this.indexInParent = indexInParent;
         this.childNamespace = ns;
         this.childName = name;
@@ -130,6 +136,24 @@
     }
 
     /**
+     * Returns the parent UUID string
+     * 
+     * @return the parent UUID string
+     */
+    public String getParentUuidString() {
+        return parentUuidString;
+    }
+
+    /**
+     * Sets the parent UUID string
+     * 
+     * @param parentUuidString the parent UUID string
+     */
+    public void setParentUuidString( String parentUuidString ) {
+        this.parentUuidString = parentUuidString;
+    }
+
+    /**
      * Get the zero-based index of this child within the parent's list of children
      * 
      * @return the zero-based index of this child
@@ -248,7 +272,7 @@
         }
         if (id != null) {
             sb.append(" (id=").append(id.getChildUuidString()).append(")");
-            String parentId = id.getParentUuidString();
+            String parentId = getParentUuidString();
             if (parentId != null) {
                 sb.append(" is ");
                 sb.append(Inflector.getInstance().ordinalize(indexInParent));

Modified: trunk/extensions/dna-connector-store-jpa/src/main/java/org/jboss/dna/connector/store/jpa/model/basic/ChildId.java
===================================================================
--- trunk/extensions/dna-connector-store-jpa/src/main/java/org/jboss/dna/connector/store/jpa/model/basic/ChildId.java	2009-06-19 22:43:42 UTC (rev 1055)
+++ trunk/extensions/dna-connector-store-jpa/src/main/java/org/jboss/dna/connector/store/jpa/model/basic/ChildId.java	2009-06-20 15:13:29 UTC (rev 1056)
@@ -30,7 +30,7 @@
 import org.jboss.dna.common.util.HashCode;
 
 /**
- * A unique identifer for a parent-child relationship.
+ * A unique identifier for a parent-child relationship.
  * 
  * @author Randall Hauch
  */
@@ -47,9 +47,6 @@
     @Column( name = "WORKSPACE_ID", nullable = false )
     private Long workspaceId;
 
-    @Column( name = "PARENT_UUID", nullable = false, length = 36 )
-    private String parentUuidString;
-
     @Column( name = "CHILD_UUID", nullable = false, length = 36 )
     private String childUuidString;
 
@@ -57,29 +54,18 @@
     }
 
     public ChildId( Long workspaceId,
-                    NodeId parentId,
                     NodeId childId ) {
         this.workspaceId = workspaceId;
-        if (parentId != null) this.parentUuidString = parentId.getUuidString();
         if (childId != null) this.childUuidString = childId.getUuidString();
     }
 
     public ChildId( Long workspaceId,
-                    String parentUuid,
                     String childUuid ) {
         this.workspaceId = workspaceId;
-        this.parentUuidString = parentUuid;
         this.childUuidString = childUuid;
     }
 
     /**
-     * @return parentUuidString
-     */
-    public String getParentUuidString() {
-        return parentUuidString;
-    }
-
-    /**
      * @return childUuidString
      */
     public String getChildUuidString() {
@@ -100,7 +86,7 @@
      */
     @Override
     public int hashCode() {
-        return HashCode.compute(parentUuidString, childUuidString);
+        return HashCode.compute(workspaceId, childUuidString);
     }
 
     /**
@@ -118,11 +104,6 @@
             } else {
                 if (!this.workspaceId.equals(that.workspaceId)) return false;
             }
-            if (this.parentUuidString == null) {
-                if (that.parentUuidString != null) return false;
-            } else {
-                if (!this.parentUuidString.equals(that.parentUuidString)) return false;
-            }
             if (this.childUuidString == null) {
                 if (that.childUuidString != null) return false;
             } else {
@@ -140,7 +121,7 @@
      */
     @Override
     public String toString() {
-        return "Child " + childUuidString + " of " + parentUuidString + " in workspace " + workspaceId;
+        return "Node " + childUuidString + " in workspace " + workspaceId;
     }
 
 }

Modified: trunk/extensions/dna-connector-store-jpa/src/main/java/org/jboss/dna/connector/store/jpa/model/basic/PropertiesEntity.java
===================================================================
--- trunk/extensions/dna-connector-store-jpa/src/main/java/org/jboss/dna/connector/store/jpa/model/basic/PropertiesEntity.java	2009-06-19 22:43:42 UTC (rev 1055)
+++ trunk/extensions/dna-connector-store-jpa/src/main/java/org/jboss/dna/connector/store/jpa/model/basic/PropertiesEntity.java	2009-06-20 15:13:29 UTC (rev 1056)
@@ -27,6 +27,7 @@
 import java.util.HashSet;
 import javax.persistence.Column;
 import javax.persistence.Entity;
+import javax.persistence.EntityManager;
 import javax.persistence.FetchType;
 import javax.persistence.Id;
 import javax.persistence.JoinColumn;
@@ -34,6 +35,7 @@
 import javax.persistence.Lob;
 import javax.persistence.NamedQueries;
 import javax.persistence.NamedQuery;
+import javax.persistence.Query;
 import javax.persistence.Table;
 import org.jboss.dna.connector.store.jpa.util.Serializer;
 
@@ -206,4 +208,24 @@
     public String toString() {
         return "Properties for " + this.id;
     }
+
+    /**
+     * Delete all properties for the node with the supplied UUID.
+     * 
+     * @param workspaceId the ID of the workspace; may not be null
+     * @param uuid the UUID of the node from which the references start
+     * @param manager the manager; may not be null
+     * @return the number of deleted references
+     */
+    public static int deletePropertiesFor( Long workspaceId,
+                                           String uuid,
+                                           EntityManager manager ) {
+        assert manager != null;
+        Query delete = manager.createNamedQuery("PropertiesEntity.deleteByUuid");
+        delete.setParameter("uuid", uuid);
+        delete.setParameter("workspaceId", workspaceId);
+        int result = delete.executeUpdate();
+        manager.flush();
+        return result;
+    }
 }

Modified: trunk/extensions/dna-connector-store-jpa/src/main/java/org/jboss/dna/connector/store/jpa/model/basic/ReferenceEntity.java
===================================================================
--- trunk/extensions/dna-connector-store-jpa/src/main/java/org/jboss/dna/connector/store/jpa/model/basic/ReferenceEntity.java	2009-06-19 22:43:42 UTC (rev 1055)
+++ trunk/extensions/dna-connector-store-jpa/src/main/java/org/jboss/dna/connector/store/jpa/model/basic/ReferenceEntity.java	2009-06-20 15:13:29 UTC (rev 1056)
@@ -23,6 +23,7 @@
  */
 package org.jboss.dna.connector.store.jpa.model.basic;
 
+import java.util.Collection;
 import java.util.List;
 import javax.persistence.Entity;
 import javax.persistence.EntityManager;
@@ -49,7 +50,8 @@
     @NamedQuery( name = "ReferenceEntity.removeNonEnforcedReferences", query = "delete ReferenceEntity as ref where ref.id.workspaceId = :workspaceId and ref.id.fromUuidString not in ( select props.id.uuidString from PropertiesEntity props where props.referentialIntegrityEnforced = true and props.id.workspaceId = :workspaceId )" ),
     @NamedQuery( name = "ReferenceEntity.countUnresolveReferences", query = "select count(*) from ReferenceEntity as ref where ref.id.workspaceId = :workspaceId and ref.id.toUuidString not in ( select props.id.uuidString from PropertiesEntity props where props.referentialIntegrityEnforced = true and props.id.workspaceId = :workspaceId )" ),
     @NamedQuery( name = "ReferenceEntity.getUnresolveReferences", query = "select ref from ReferenceEntity as ref where ref.id.workspaceId = :workspaceId and ref.id.toUuidString not in ( select props.id.uuidString from PropertiesEntity props where props.referentialIntegrityEnforced = true and props.id.workspaceId = :workspaceId )" ),
-    @NamedQuery( name = "ReferenceEntity.findInWorkspace", query = "select ref from ReferenceEntity as ref where ref.id.workspaceId = :workspaceId" )} )
+    @NamedQuery( name = "ReferenceEntity.findInWorkspace", query = "select ref from ReferenceEntity as ref where ref.id.workspaceId = :workspaceId" ),
+    @NamedQuery( name = "ReferenceEntity.getInwardReferencesForList", query = "select ref from ReferenceEntity as ref where ref.id.workspaceId = :workspaceId and ref.id.toUuidString in (:toUuidList)" )} )
 public class ReferenceEntity {
 
     @Id
@@ -188,4 +190,24 @@
         query.setParameter("workspaceId", workspaceId);
         return query.getResultList();
     }
+
+    /**
+     * Returns a list of all references to UUIDs in the given list within the given workspace
+     * 
+     * @param workspaceId the ID of the workspace; may not be null
+     * @param uuids the UUIDs (as strings) of the nodes to check; may not be null
+     * @param manager the manager; may not be null
+     * @return the number of deleted references
+     */
+    @SuppressWarnings( "unchecked" )
+    public static List<ReferenceEntity> getReferencesToUuids( Long workspaceId,
+                                                              Collection<String> uuids,
+                                                              EntityManager manager ) {
+        assert manager != null;
+
+        Query query = manager.createNamedQuery("ReferenceEntity.getInwardReferencesForList");
+        query.setParameter("workspaceId", workspaceId);
+        query.setParameter("toUuidList", uuids);
+        return query.getResultList();
+    }
 }

Modified: trunk/extensions/dna-connector-store-jpa/src/main/java/org/jboss/dna/connector/store/jpa/model/basic/SubgraphNodeEntity.java
===================================================================
--- trunk/extensions/dna-connector-store-jpa/src/main/java/org/jboss/dna/connector/store/jpa/model/basic/SubgraphNodeEntity.java	2009-06-19 22:43:42 UTC (rev 1055)
+++ trunk/extensions/dna-connector-store-jpa/src/main/java/org/jboss/dna/connector/store/jpa/model/basic/SubgraphNodeEntity.java	2009-06-20 15:13:29 UTC (rev 1056)
@@ -44,7 +44,7 @@
 @org.hibernate.annotations.Table( appliesTo = "DNA_SUBGRAPH_NODES", indexes = @Index( name = "QUERYID_INX", columnNames = {
     "QUERY_ID", "UUID"} ) )
 @NamedQueries( {
-    @NamedQuery( name = "SubgraphNodeEntity.insertChildren", query = "insert into SubgraphNodeEntity(queryId,nodeUuid,depth,parentIndexInParent,indexInParent) select parentNode.queryId, child.id.childUuidString, parentNode.depth+1, parentNode.indexInParent, child.indexInParent from ChildEntity child, SubgraphNodeEntity parentNode where child.id.workspaceId = :workspaceId and child.id.parentUuidString = parentNode.nodeUuid and parentNode.queryId = :queryId and parentNode.depth = :parentDepth" ),
+    @NamedQuery( name = "SubgraphNodeEntity.insertChildren", query = "insert into SubgraphNodeEntity(queryId,nodeUuid,depth,parentIndexInParent,indexInParent) select parentNode.queryId, child.id.childUuidString, parentNode.depth+1, parentNode.indexInParent, child.indexInParent from ChildEntity child, SubgraphNodeEntity parentNode where child.id.workspaceId = :workspaceId and child.parentUuidString = parentNode.nodeUuid and parentNode.queryId = :queryId and parentNode.depth = :parentDepth" ),
     @NamedQuery( name = "SubgraphNodeEntity.getCount", query = "select count(*) from SubgraphNodeEntity where queryId = :queryId" ),
     @NamedQuery( name = "SubgraphNodeEntity.getPropertiesEntities", query = "select props from PropertiesEntity props, SubgraphNodeEntity node where props.id.workspaceId = :workspaceId and props.id.uuidString = node.nodeUuid and node.queryId = :queryId and node.depth >= :depth and node.depth <= :maxDepth order by node.depth, node.parentIndexInParent, node.indexInParent" ),
     @NamedQuery( name = "SubgraphNodeEntity.getPropertiesEntitiesWithLargeValues", query = "select props from PropertiesEntity props, SubgraphNodeEntity node where props.id.workspaceId = :workspaceId and props.id.uuidString = node.nodeUuid and node.queryId = :queryId and node.depth >= :depth and size(props.largeValues) > 0" ),

Modified: trunk/extensions/dna-connector-store-jpa/src/main/java/org/jboss/dna/connector/store/jpa/model/basic/SubgraphQuery.java
===================================================================
--- trunk/extensions/dna-connector-store-jpa/src/main/java/org/jboss/dna/connector/store/jpa/model/basic/SubgraphQuery.java	2009-06-19 22:43:42 UTC (rev 1055)
+++ trunk/extensions/dna-connector-store-jpa/src/main/java/org/jboss/dna/connector/store/jpa/model/basic/SubgraphQuery.java	2009-06-20 15:13:29 UTC (rev 1056)
@@ -279,7 +279,7 @@
         final PathFactory pathFactory = context.getValueFactories().getPathFactory();
         final NameFactory nameFactory = context.getValueFactories().getNameFactory();
         for (ChildEntity entity : getNodes(false, includeChildrenOfMaxDepthNodes)) {
-            String parentUuid = entity.getId().getParentUuidString();
+            String parentUuid = entity.getParentUuidString();
             Path parentPath = pathByUuid.get(parentUuid);
             assert parentPath != null;
             String nsUri = entity.getChildNamespace().getUri();

Modified: trunk/extensions/dna-connector-store-jpa/src/main/java/org/jboss/dna/connector/store/jpa/util/RequestProcessorCache.java
===================================================================
--- trunk/extensions/dna-connector-store-jpa/src/main/java/org/jboss/dna/connector/store/jpa/util/RequestProcessorCache.java	2009-06-19 22:43:42 UTC (rev 1055)
+++ trunk/extensions/dna-connector-store-jpa/src/main/java/org/jboss/dna/connector/store/jpa/util/RequestProcessorCache.java	2009-06-20 15:13:29 UTC (rev 1056)
@@ -73,6 +73,10 @@
         cache.addNewNode(location);
     }
 
+    public void clear( Long workspaceId ) {
+        workspaceCaches.remove(workspaceId);
+    }
+
     public LinkedList<Location> getAllChildren( Long workspaceId,
                                                 Path parent ) {
         WorkspaceCache cache = workspaceCaches.get(workspaceId);

Modified: trunk/extensions/dna-connector-store-jpa/src/main/java/org/jboss/dna/connector/store/jpa/util/Serializer.java
===================================================================
--- trunk/extensions/dna-connector-store-jpa/src/main/java/org/jboss/dna/connector/store/jpa/util/Serializer.java	2009-06-19 22:43:42 UTC (rev 1055)
+++ trunk/extensions/dna-connector-store-jpa/src/main/java/org/jboss/dna/connector/store/jpa/util/Serializer.java	2009-06-20 15:13:29 UTC (rev 1056)
@@ -31,7 +31,6 @@
 import java.net.URI;
 import java.security.NoSuchAlgorithmException;
 import java.util.Collection;
-import java.util.Collections;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.Map;
@@ -426,7 +425,7 @@
      * 
      * @param input the stream from which the existing properties are to be deserialized; may not be null
      * @param output the stream to which the updated properties are to be serialized; may not be null
-     * @param oldUuidToNewUuid the map of old-to-new UUIDs
+     * @param oldUuidToNewUuid the map of old-to-new UUIDs; may not be null
      * @throws IOException if there is an error writing to the <code>stream</code> or <code>largeValues</code>
      * @throws ClassNotFoundException if the class for the value's object could not be found
      */
@@ -435,7 +434,7 @@
                                            Map<String, String> oldUuidToNewUuid ) throws IOException, ClassNotFoundException {
         assert input != null;
         assert output != null;
-        if (oldUuidToNewUuid == null) oldUuidToNewUuid = Collections.emptyMap();
+        assert oldUuidToNewUuid != null;
 
         UuidFactory uuidFactory = valueFactories.getUuidFactory();
         ValueFactory<Reference> referenceFactory = valueFactories.getReferenceFactory();

Modified: trunk/extensions/dna-connector-store-jpa/src/main/resources/org/jboss/dna/connector/store/jpa/JpaConnectorI18n.properties
===================================================================
--- trunk/extensions/dna-connector-store-jpa/src/main/resources/org/jboss/dna/connector/store/jpa/JpaConnectorI18n.properties	2009-06-19 22:43:42 UTC (rev 1055)
+++ trunk/extensions/dna-connector-store-jpa/src/main/resources/org/jboss/dna/connector/store/jpa/JpaConnectorI18n.properties	2009-06-20 15:13:29 UTC (rev 1056)
@@ -29,10 +29,11 @@
 repositorySourceMustHaveName = The JPA Graph Store repository source must have a name
 unknownModelName = The model name "{0}" is unknown; expected one of {1}
 errorSettingContextClassLoader = Error while setting the current context class loader for JAP repository source {0} to classloader name {1}
-existingStoreSpecifiesUnknownModel = The JPA repository source {0} uses a model that is not known: {1} 
+existingStoreSpecifiesUnknownModel = The JPA repository source {0} uses a model that is not known\: {1} 
 unableToReadLargeValue = Unable to read from {0} the large property with hash = {1}
 unableToMoveRootNode = Unable to move the root node to another location in {0}
 locationShouldHavePathAndOrProperty = The source {0} is unable to find a node without a path or a {1} property
+invalidUuidForWorkspace = There is no node with UUID "{0}" in workspace "{1}"
 invalidReferences = One or more references were invalid in {0}
 unableToDeleteBecauseOfReferences = At least one deleted node is referenced by a node that is not being deleted
 

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	2009-06-19 22:43:42 UTC (rev 1055)
+++ trunk/extensions/dna-connector-store-jpa/src/test/java/org/jboss/dna/connector/store/jpa/JpaConnectorWritingTest.java	2009-06-20 15:13:29 UTC (rev 1056)
@@ -23,9 +23,12 @@
  */
 package org.jboss.dna.connector.store.jpa;
 
+import org.jboss.dna.common.statistic.Stopwatch;
 import org.jboss.dna.graph.Graph;
 import org.jboss.dna.graph.connector.RepositorySource;
 import org.jboss.dna.graph.connector.test.WritableConnectorTest;
+import org.jboss.dna.graph.property.ReferentialIntegrityException;
+import org.junit.Test;
 
 /**
  * @author Randall Hauch
@@ -47,7 +50,7 @@
         source.setUsername("sa");
         source.setPassword("");
         source.setUrl("jdbc:hsqldb:.");
-        source.setMaximumConnectionsInPool(3);
+        source.setMaximumConnectionsInPool(1);
         source.setMinimumConnectionsInPool(0);
         source.setNumberOfConnectionsToAcquireAsNeeded(1);
         source.setMaximumSizeOfStatementCache(100);
@@ -68,40 +71,39 @@
         graph.createWorkspace().named("default");
     }
 
-    // @Test
-    // public void shouldCreateFlatAndReallyWideTreeUsingOneBatch() {
-    // String initialPath = "";
-    // int depth = 1;
-    // int numChildren = 10000;
-    // int numBatches = 100;
-    // int numChildrenPerNodePerBatch = numChildren / numBatches;
-    // int numPropertiesPerNode = 7;
-    // int total = 0;
-    // Stopwatch sw = new Stopwatch();
-    // System.out.println("" + numChildren + " children under a node");
-    // for (int i = 0; i != numBatches; ++i) {
-    // Graph.Batch batch = graph.batch();
-    // total += createChildren(batch, initialPath, "node", numChildrenPerNodePerBatch, numPropertiesPerNode, depth, null);
-    // Stopwatch sw2 = new Stopwatch();
-    // sw.start();
-    // sw2.start();
-    // batch.execute();
-    // sw.stop();
-    // sw2.stop();
-    // System.out.println(" ... created " + (total - numChildrenPerNodePerBatch + 1) + "-" + total + " in "
-    // + sw2.getTotalDuration().getDuration(TimeUnit.MILLISECONDS) + " milliseconds");
-    // }
-    // System.out.println("  " + getTotalAndAverageDuration(sw));
-    // assert total == numChildren;
-    //
-    // // Create 10 more ...
-    // System.out.println(" Extra nodes (" + (total + 1) + "-" + (total + 10) + "):");
-    // sw = new Stopwatch();
-    // Graph.Batch batch = graph.batch();
-    // createChildren(batch, initialPath, "added node", 10, numPropertiesPerNode, 1, null);
-    // sw.start();
-    // batch.execute();
-    // sw.stop();
-    // System.out.println("  " + getTotalAndAverageDuration(sw));
-    // }
+    @Test( expected = ReferentialIntegrityException.class )
+    public void shouldNotCopyChildrenBetweenWorkspacesAndRemoveExistingNodesWithSameUuidIfSpecifiedIfReferentialIntegrityIsViolated()
+        throws Exception {
+        String defaultWorkspaceName = graph.getCurrentWorkspaceName();
+        String workspaceName = "copyChildrenSource";
+
+        tryCreatingAWorkspaceNamed(workspaceName);
+
+        graph.useWorkspace(workspaceName);
+        String initialPath = "";
+        int depth = 3;
+        int numChildrenPerNode = 3;
+        int numPropertiesPerNode = 3;
+        Stopwatch sw = new Stopwatch();
+        boolean batch = true;
+        createSubgraph(graph, initialPath, depth, numChildrenPerNode, numPropertiesPerNode, batch, sw, System.out, null);
+
+        graph.useWorkspace(defaultWorkspaceName);
+
+        graph.create("/newUuids");
+        // Copy once to get the UUID into the default workspace
+        graph.copy("/node1").replacingExistingNodesWithSameUuids().fromWorkspace(workspaceName).to("/newUuids/node1");
+
+        // Create a new child node that in the target workspace that has no corresponding node in the source workspace
+        graph.create("/newUuids/node1/shouldBeRemoved");
+        graph.create("/refererringNode");
+        graph.set("refProp").on("/refererringNode").to(graph.getNodeAt("/newUuids/node1/shouldBeRemoved"));
+
+        // Now create a reference to this new node
+
+        // Copy again to test the behavior now that the UUIDs are already in the default workspace
+        // This should fail because /newUuids/node1/shouldBeRemoved must be removed by the copy, but can't be removed
+        // because there is a reference to it.
+        graph.copy("/node1").replacingExistingNodesWithSameUuids().fromWorkspace(workspaceName).to("/newUuids/otherNode");
+    }
 }

Modified: trunk/extensions/dna-connector-store-jpa/src/test/java/org/jboss/dna/connector/store/jpa/model/basic/BasicModelTest.java
===================================================================
--- trunk/extensions/dna-connector-store-jpa/src/test/java/org/jboss/dna/connector/store/jpa/model/basic/BasicModelTest.java	2009-06-19 22:43:42 UTC (rev 1055)
+++ trunk/extensions/dna-connector-store-jpa/src/test/java/org/jboss/dna/connector/store/jpa/model/basic/BasicModelTest.java	2009-06-20 15:13:29 UTC (rev 1056)
@@ -310,9 +310,9 @@
         UUID parentId = UUID.randomUUID();
 
         // Create UUIDs for several children ...
-        ChildId childId1 = new ChildId(workspaceId, parentId.toString(), UUID.randomUUID().toString());
-        ChildId childId2 = new ChildId(workspaceId, parentId.toString(), UUID.randomUUID().toString());
-        ChildId childId3 = new ChildId(workspaceId, parentId.toString(), UUID.randomUUID().toString());
+        ChildId childId1 = new ChildId(workspaceId, UUID.randomUUID().toString());
+        ChildId childId2 = new ChildId(workspaceId, UUID.randomUUID().toString());
+        ChildId childId3 = new ChildId(workspaceId, UUID.randomUUID().toString());
         assertThat(childId1, is(not(childId2)));
         assertThat(childId1, is(not(childId3)));
         assertThat(childId2, is(not(childId3)));
@@ -322,9 +322,9 @@
             NamespaceEntity ns = NamespaceEntity.findByUri(manager, "http://www.example.com");
 
             // Create the child entities ...
-            ChildEntity child1 = new ChildEntity(childId1, 1, ns, "child1");
-            ChildEntity child2 = new ChildEntity(childId2, 2, ns, "child2");
-            ChildEntity child3 = new ChildEntity(childId3, 3, ns, "child3", 1);
+            ChildEntity child1 = new ChildEntity(childId1, parentId.toString(), 1, ns, "child1");
+            ChildEntity child2 = new ChildEntity(childId2, parentId.toString(), 2, ns, "child2");
+            ChildEntity child3 = new ChildEntity(childId3, parentId.toString(), 3, ns, "child3", 1);
 
             // Save a properties entities ...
             manager.persist(child1);

Modified: trunk/extensions/dna-connector-store-jpa/src/test/java/org/jboss/dna/connector/store/jpa/model/basic/ChildEntityTest.java
===================================================================
--- trunk/extensions/dna-connector-store-jpa/src/test/java/org/jboss/dna/connector/store/jpa/model/basic/ChildEntityTest.java	2009-06-19 22:43:42 UTC (rev 1055)
+++ trunk/extensions/dna-connector-store-jpa/src/test/java/org/jboss/dna/connector/store/jpa/model/basic/ChildEntityTest.java	2009-06-20 15:13:29 UTC (rev 1056)
@@ -107,13 +107,13 @@
             // Create the child entities ...
             for (int i = 0; i != numChildren; ++i) {
                 int indexInParent = i + startingIndex;
-                ChildId id = new ChildId(workspaceId, parentUuid.toString(), UUID.randomUUID().toString());
+                ChildId id = new ChildId(workspaceId, UUID.randomUUID().toString());
                 ChildEntity child = null;
                 if (useSns) {
-                    child = new ChildEntity(id, indexInParent, ns, localName, i + 1);
+                    child = new ChildEntity(id, parentUuid.toString(), indexInParent, ns, localName, i + 1);
                 } else {
                     String name = numChildren == 1 ? localName : localName + indexInParent;
-                    child = new ChildEntity(id, indexInParent, ns, name);
+                    child = new ChildEntity(id, parentUuid.toString(), indexInParent, ns, name);
                 }
                 result[i] = id;
                 manager.persist(child);

Modified: trunk/extensions/dna-connector-store-jpa/src/test/java/org/jboss/dna/connector/store/jpa/model/basic/SubgraphQueryTest.java
===================================================================
--- trunk/extensions/dna-connector-store-jpa/src/test/java/org/jboss/dna/connector/store/jpa/model/basic/SubgraphQueryTest.java	2009-06-19 22:43:42 UTC (rev 1055)
+++ trunk/extensions/dna-connector-store-jpa/src/test/java/org/jboss/dna/connector/store/jpa/model/basic/SubgraphQueryTest.java	2009-06-20 15:13:29 UTC (rev 1056)
@@ -209,8 +209,9 @@
         int snsIndex = path.getLastSegment().getIndex();
         NamespaceEntity namespace = namespaces.get(childName.getNamespaceUri(), true);
         UUID childUuid = UUID.randomUUID();
-        ChildId id = new ChildId(workspaceId, parentUuid.toString(), childUuid.toString());
-        ChildEntity entity = new ChildEntity(id, ++numChildren, namespace, childName.getLocalName(), snsIndex);
+        ChildId id = new ChildId(workspaceId, childUuid.toString());
+        ChildEntity entity = new ChildEntity(id, parentUuid.toString(), ++numChildren, namespace, childName.getLocalName(),
+                                             snsIndex);
         manager.persist(entity);
 
         // Create the properties ...



From dna-commits at lists.jboss.org  Sat Jun 20 20:16:03 2009
From: dna-commits at lists.jboss.org (dna-commits at lists.jboss.org)
Date: Sat, 20 Jun 2009 20:16:03 -0400
Subject: [dna-commits] DNA SVN: r1057 -
	trunk/dna-jcr/src/main/java/org/jboss/dna/jcr.
Message-ID: <E1MIAj5-0007hE-Pg@committer01.frg.pub.inap.atl.jboss.com>

Author: bcarothers
Date: 2009-06-20 20:16:03 -0400 (Sat, 20 Jun 2009)
New Revision: 1057

Modified:
   trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/SessionCache.java
Log:
DNA-469 SessionCache Does Not Handle Node Definitions Correctly After Move

Applied patch that fixed the issue above. It also properly clears the jcrNodes cache on a session refresh, sets the correct cardinality on the dnaint:nodeDefinition property from multi-valued to single-valued, and fixes a few cosmetic issues.

Modified: trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/SessionCache.java
===================================================================
--- trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/SessionCache.java	2009-06-20 15:13:29 UTC (rev 1056)
+++ trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/SessionCache.java	2009-06-21 00:16:03 UTC (rev 1057)
@@ -277,12 +277,14 @@
 
             // Removed any cached nodes not already in the changed or deleted set
             this.cachedNodes.keySet().retainAll(retainedSet);
+            this.jcrNodes.keySet().retainAll(retainedSet);
         } else {
             // Throw out the old pending operations
             this.requests.clear();
             this.changedNodes.clear();
             this.cachedNodes.clear();
             this.deletedNodes.clear();
+            this.jcrNodes.clear();
         }
 
     }
@@ -364,6 +366,7 @@
             this.cachedNodes.keySet().removeAll(nodesUnderBranch);
             this.changedNodes.keySet().removeAll(nodesUnderBranch);
             this.deletedNodes.keySet().removeAll(nodesUnderBranch);
+            this.jcrNodes.keySet().removeAll(nodesUnderBranch);
 
             // Throw out the old pending operations
             if (operations.isExecuteRequired()) {
@@ -1060,8 +1063,8 @@
                                                                       workspaceName));
                 }
                 I18n msg = JcrI18n.unableToSetMultiValuedPropertyUsingSingleValue;
-                throw new javax.jcr.ValueFormatException(msg.text(getPathFor(this.node).getString(namespaces),
-                                                                  propertyName,
+                throw new javax.jcr.ValueFormatException(msg.text(propertyName.getString(namespaces),
+                                                                  getPathFor(this.node).getString(namespaces),
                                                                   workspaceName));
             }
 
@@ -1461,7 +1464,7 @@
             ChildNode existingChild = node.getChildren().getChild(nodeUuid);
             if (existingChild != null && nameDoesNotChange) return existingChild;
 
-            JcrNodeDefinition definition = findBestNodeDefinition(node.getUuid(), newNodeName, null);
+            JcrNodeDefinition definition = findBestNodeDefinition(node.getUuid(), newNodeName, child.getPrimaryTypeName());
 
             // Get an editor for the child (in its current location) and one for its parent ...
             NodeEditor newChildEditor = getEditorFor(nodeUuid);
@@ -1469,9 +1472,9 @@
             if (!definition.getId().equals(node.getDefinitionId())) {
                 // The node definition changed, so try to set the property ...
                 try {
-                    JcrValue value = new JcrValue(factories(), SessionCache.this, PropertyType.STRING, definition.getId()
-                                                                                                                 .getString());
-                    setProperty(DnaIntLexicon.NODE_DEFINITON, value);
+                    JcrValue value = new JcrValue(factories(), SessionCache.this, PropertyType.STRING,
+                                                  definition.getId().getString());
+                    newChildEditor.setProperty(DnaIntLexicon.NODE_DEFINITON, value);
                 } catch (ConstraintViolationException e) {
                     // We can't set this property on the node (according to the node definition).
                     // But we still want the node info to have the correct node definition.
@@ -1693,15 +1696,17 @@
                                                                            node.getMixinTypeNames(),
                                                                            nodeDefinitionProp,
                                                                            PropertyType.STRING,
-                                                                           false,
+                                                                           true,
                                                                            false);
+
             if (nodeDefnDefn != null) {
                 PropertyDefinitionId nodeDefnDefinitionId = nodeDefnDefn.getId();
                 PropertyInfo nodeDefinitionInfo = new PropertyInfo(new PropertyId(desiredUuid, nodeDefinitionProp.getName()),
                                                                    nodeDefnDefinitionId, PropertyType.STRING, nodeDefinitionProp,
-                                                                   true, true, false);
+                                                                   false, true, false);
                 properties.put(nodeDefinitionProp.getName(), nodeDefinitionInfo);
             }
+            assert nodeDefnDefn != null && nodeDefnDefn.getInternalName().equals(DnaIntLexicon.NODE_DEFINITON);
 
             // Now create the child node info, putting it in the changed map (and not the cache map!) ...
             NewNodeInfo newInfo = new NewNodeInfo(location, primaryTypeName, definition.getId(), node.getUuid(), properties);
@@ -1710,13 +1715,10 @@
             // ---------------------------------------
             // Now record the changes to the store ...
             // ---------------------------------------
-            Graph.Create<Graph.Batch> create = operations.createUnder(currentLocation)
-                                                         .nodeNamed(name)
-                                                         .with(desiredUuid)
-                                                         .with(primaryTypeProp);
-            if (nodeDefnDefn != null) {
-                create = create.with(nodeDefinitionProp);
-            }
+            Graph.Create<Graph.Batch> create = operations.createUnder(currentLocation).nodeNamed(name).with(desiredUuid).with(primaryTypeProp);
+            // if (nodeDefnDefn != null) {
+            create = create.with(nodeDefinitionProp);
+            // }
             create.and();
             return result;
         }
@@ -2091,18 +2093,19 @@
         return info.getProperty(propertyId.getPropertyName());
     }
 
-    Path getPathFor(String workspaceName, UUID uuid, Path relativePath) throws NoSuchWorkspaceException, ItemNotFoundException, RepositoryException {
+    Path getPathFor( String workspaceName,
+                     UUID uuid,
+                     Path relativePath ) throws NoSuchWorkspaceException, ItemNotFoundException, RepositoryException {
         assert workspaceName != null;
         assert uuid != null || relativePath != null;
-        
+
         Graph graph = operations.getGraph();
         try {
             graph.useWorkspace(workspaceName);
-        }
-        catch (InvalidWorkspaceException iwe) {
+        } catch (InvalidWorkspaceException iwe) {
             throw new NoSuchWorkspaceException(JcrI18n.workspaceNameIsInvalid.text(graph.getSourceName(), workspaceName));
         }
-        
+
         try {
             org.jboss.dna.graph.Node node;
             if (uuid != null) {
@@ -2111,27 +2114,24 @@
                 if (relativePath != null) {
                     Path nodePath = node.getLocation().getPath();
                     Path absolutePath = relativePath.resolveAgainst(nodePath);
-                    node = graph.getNodeAt(absolutePath);       
+                    node = graph.getNodeAt(absolutePath);
                 }
-                
-            }
-            else {
+
+            } else {
                 Path absolutePath = pathFactory.createAbsolutePath(relativePath.getSegmentsList());
-                node = graph.getNodeAt(absolutePath);       
+                node = graph.getNodeAt(absolutePath);
             }
             assert node != null;
-            
+
             return node.getLocation().getPath();
-        }
-        catch (org.jboss.dna.graph.property.PathNotFoundException pnfe) {
+        } catch (org.jboss.dna.graph.property.PathNotFoundException pnfe) {
             throw new ItemNotFoundException(pnfe);
-        }
-        finally {
+        } finally {
             graph.useWorkspace(this.workspaceName);
         }
-        
+
     }
-    
+
     Path getPathFor( UUID uuid ) throws ItemNotFoundException, InvalidItemStateException, RepositoryException {
         if (uuid.equals(root)) return rootPath;
         return getPathFor(findNodeInfo(uuid));
@@ -2537,8 +2537,8 @@
                                                                                    DnaIntLexicon.MULTI_VALUED_PROPERTIES,
                                                                                    values,
                                                                                    false);
-        Property dnaProp = propertyFactory.create(DnaIntLexicon.MULTI_VALUED_PROPERTIES, newSingleMultiPropertyNames.iterator()
-                                                                                                                    .next());
+        Property dnaProp = propertyFactory.create(DnaIntLexicon.MULTI_VALUED_PROPERTIES,
+                                                  newSingleMultiPropertyNames.iterator().next());
         PropertyId propId = new PropertyId(uuid, dnaProp.getName());
         JcrPropertyDefinition defn = (JcrPropertyDefinition)propertyDefinition;
         return new PropertyInfo(propId, defn.getId(), PropertyType.STRING, dnaProp, defn.isMultiple(), true, false);



From dna-commits at lists.jboss.org  Sat Jun 20 20:45:14 2009
From: dna-commits at lists.jboss.org (dna-commits at lists.jboss.org)
Date: Sat, 20 Jun 2009 20:45:14 -0400
Subject: [dna-commits] DNA SVN: r1058 - in trunk:
	dna-jcr/src/main/java/org/jboss/dna/jcr and 2 other directories.
Message-ID: <E1MIBBK-0000de-CC@committer01.frg.pub.inap.atl.jboss.com>

Author: bcarothers
Date: 2009-06-20 20:45:14 -0400 (Sat, 20 Jun 2009)
New Revision: 1058

Modified:
   trunk/dna-graph/src/main/java/org/jboss/dna/graph/request/SetPropertyRequest.java
   trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/JcrI18n.java
   trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/JcrNodeType.java
   trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/JcrWorkspace.java
   trunk/dna-jcr/src/main/resources/org/jboss/dna/jcr/JcrI18n.properties
   trunk/dna-jcr/src/test/java/org/jboss/dna/jcr/DnaTckTest.java
Log:
DNA-370 JcrWorkspace.clone Is Not Implemented

Committed patch to add constraint checking to clone with removeExisting = true. 

Modified: trunk/dna-graph/src/main/java/org/jboss/dna/graph/request/SetPropertyRequest.java
===================================================================
--- trunk/dna-graph/src/main/java/org/jboss/dna/graph/request/SetPropertyRequest.java	2009-06-21 00:16:03 UTC (rev 1057)
+++ trunk/dna-graph/src/main/java/org/jboss/dna/graph/request/SetPropertyRequest.java	2009-06-21 00:45:14 UTC (rev 1058)
@@ -23,6 +23,7 @@
  */
 package org.jboss.dna.graph.request;
 
+import java.util.Arrays;
 import org.jboss.dna.common.util.CheckArg;
 import org.jboss.dna.common.util.HashCode;
 import org.jboss.dna.graph.GraphI18n;
@@ -209,6 +210,6 @@
     @Override
     public String toString() {
         return "set property " + property().getName() + " on " + on() + " in the \"" + workspaceName + "\" workspace to "
-               + property().getValuesAsArray();
+               + Arrays.asList(property().getValuesAsArray()).toString();
     }
 }

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	2009-06-21 00:16:03 UTC (rev 1057)
+++ trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/JcrI18n.java	2009-06-21 00:45:14 UTC (rev 1058)
@@ -89,6 +89,7 @@
     public static I18n unableToSetSingleValuedPropertyUsingMultipleValues;
     public static I18n unableToRefreshBranchSinceAtLeastOneNodeMovedToParentOutsideOfBranch;
     public static I18n allPropertyValuesMustHaveSameType;
+    public static I18n cannotRemoveNodeFromClone;
 
     public static I18n unableToRemoveRootNode;
     public static I18n unableToMoveNodeToBeChildOfDecendent;

Modified: trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/JcrNodeType.java
===================================================================
--- trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/JcrNodeType.java	2009-06-21 00:16:03 UTC (rev 1057)
+++ trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/JcrNodeType.java	2009-06-21 00:45:14 UTC (rev 1058)
@@ -24,6 +24,7 @@
 package org.jboss.dna.jcr;
 
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.HashMap;
@@ -113,7 +114,7 @@
                  boolean mixin,
                  boolean orderableChildNodes ) {
         assert context != null;
-        
+
         this.context = context;
         this.nodeTypeManager = nodeTypeManager;
         this.name = name;
@@ -140,12 +141,12 @@
             JcrNodeType superType = thisAndAllSupertypes.get(i);
             for (NodeType superSuperType : superType.getDeclaredSupertypes()) {
                 JcrNodeType jcrSuperSuperType = (JcrNodeType)superSuperType;
-                
+
                 if (jcrSuperSuperType == null) {
                     assert JcrNtLexicon.BASE.equals(name);
                     continue;
                 }
-                
+
                 if (typeNames.add(jcrSuperSuperType.getInternalName())) {
                     thisAndAllSupertypes.add(jcrSuperSuperType);
                 }
@@ -208,6 +209,17 @@
         return allDefinitions.allChildNodeDefinitions(childName);
     }
 
+    JcrNodeDefinition childNodeDefinition( NodeDefinitionId nodeDefnId ) {
+        List<Name> requiredPrimaryTypeNames = Arrays.asList(nodeDefnId.getRequiredPrimaryTypes());
+        for (JcrNodeDefinition nodeDefn : allChildNodeDefinitions(nodeDefnId.getChildDefinitionName())) {
+            if (nodeDefn.getRequiredPrimaryTypeNames().size() == requiredPrimaryTypeNames.size()
+                && nodeDefn.getRequiredPrimaryTypeNames().containsAll(requiredPrimaryTypeNames)) {
+                return nodeDefn;
+            }
+        }
+        return null;
+    }
+
     /**
      * {@inheritDoc}
      * 

Modified: trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/JcrWorkspace.java
===================================================================
--- trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/JcrWorkspace.java	2009-06-21 00:16:03 UTC (rev 1057)
+++ trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/JcrWorkspace.java	2009-06-21 00:45:14 UTC (rev 1058)
@@ -26,12 +26,15 @@
 import java.io.IOException;
 import java.io.InputStream;
 import java.security.AccessControlException;
+import java.util.HashSet;
+import java.util.LinkedList;
 import java.util.Map;
 import java.util.Set;
 import java.util.UUID;
 import javax.jcr.AccessDeniedException;
 import javax.jcr.InvalidSerializedDataException;
 import javax.jcr.ItemExistsException;
+import javax.jcr.ItemNotFoundException;
 import javax.jcr.NamespaceRegistry;
 import javax.jcr.NoSuchWorkspaceException;
 import javax.jcr.PathNotFoundException;
@@ -50,6 +53,8 @@
 import org.jboss.dna.common.util.CheckArg;
 import org.jboss.dna.graph.ExecutionContext;
 import org.jboss.dna.graph.Graph;
+import org.jboss.dna.graph.Subgraph;
+import org.jboss.dna.graph.SubgraphNode;
 import org.jboss.dna.graph.connector.RepositoryConnectionFactory;
 import org.jboss.dna.graph.connector.RepositorySource;
 import org.jboss.dna.graph.connector.RepositorySourceException;
@@ -60,8 +65,10 @@
 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.UuidFactory;
 import org.jboss.dna.graph.property.ValueFormatException;
 import org.jboss.dna.graph.property.basic.GraphNamespaceRegistry;
+import org.jboss.dna.graph.request.ReadBranchRequest;
 import org.jboss.dna.jcr.JcrContentHandler.EnclosingSAXException;
 import org.jboss.dna.jcr.JcrContentHandler.SaveMode;
 import org.jboss.dna.jcr.JcrRepository.Option;
@@ -308,12 +315,20 @@
         Name newNodeName = destPath.getLastSegment().getName();
         String parentPath = destPath.getParent().getString(this.context.getNamespaceRegistry());
 
+        Subgraph sourceTree = null;
         // This will check for a definition and throw a ConstraintViolationException or ItemExistsException if none is found
         graph.useWorkspace(srcWorkspace);
         Property primaryTypeProp;
         Property uuidProp;
         try {
-            Map<Name, Property> props = graph.getNodeAt(srcPath).getPropertiesByName();
+            Map<Name, Property> props;
+
+            if (removeExisting) {
+                sourceTree = graph.getSubgraphOfDepth(ReadBranchRequest.NO_MAXIMUM_DEPTH).at(srcPath);
+                props = sourceTree.getRoot().getPropertiesByName();
+            } else {
+                props = graph.getNodeAt(srcPath).getPropertiesByName();
+            }
             primaryTypeProp = props.get(JcrLexicon.PRIMARY_TYPE);
             uuidProp = props.get(DnaLexicon.UUID);
         } catch (org.jboss.dna.graph.property.PathNotFoundException pnfe) {
@@ -331,12 +346,56 @@
                                                     newNodeName,
                                                     nameFactory.create(primaryTypeProp.getFirstValue()));
 
-        // Perform the copy operation, but use the "to" form (not the "into", which takes the parent) ...
-        // graph.copy(srcPath).fromWorkspace(srcWorkspace).to(destPath);
         if (removeExisting) {
+            assert sourceTree != null;
+
+            // Find all of the UUIDS in the source tree
+            UuidFactory uuidFactory = context().getValueFactories().getUuidFactory();
+            PathFactory pathFactory = context().getValueFactories().getPathFactory();
+
+            Set<UUID> sourceUuids = new HashSet<UUID>();
+            LinkedList<SubgraphNode> nodesToVisit = new LinkedList<SubgraphNode>();
+            nodesToVisit.push(sourceTree.getRoot());
+
+            while (!nodesToVisit.isEmpty()) {
+                SubgraphNode node = nodesToVisit.pop();
+
+                UUID uuid = uuidFactory.create(node.getProperty(DnaLexicon.UUID).getFirstValue().toString());
+                if (uuid != null) {
+                    sourceUuids.add(uuid);
+                }
+                for (Path.Segment childSegment : node.getChildrenSegments()) {
+                    nodesToVisit.add(node.getNode(pathFactory.createRelativePath(childSegment)));
+                }
+            }
+
+            // See if the nodes exist in the current workspace outside of the current tree
+            for (UUID uuid : sourceUuids) {
+                NodeInfo nodeInfo = null;
+                try {
+                    nodeInfo = session.cache().findNodeInfo(uuid);
+                } catch (ItemNotFoundException infe) {
+                    continue;
+                }
+                assert nodeInfo != null;
+
+                NodeDefinitionId nodeDefnId = nodeInfo.getDefinitionId();
+
+                JcrNodeType nodeType = nodeTypeManager.getNodeType(nodeDefnId.getNodeTypeName());
+                JcrNodeDefinition nodeDefn = nodeType.childNodeDefinition(nodeDefnId);
+                if (nodeDefn.isMandatory()) {
+                    // We can't just remove a mandatory node... unless its parent will be removed too!
+                    String path = session.cache().getPathFor(nodeInfo).getString(context().getNamespaceRegistry());
+                    throw new ConstraintViolationException(JcrI18n.cannotRemoveNodeFromClone.text(path, uuid));
+
+                }
+            }
+
+            // Perform the copy operation, but use the "to" form (not the "into", which takes the parent) ...
             graph.copy(srcPath).replacingExistingNodesWithSameUuids().fromWorkspace(srcWorkspace).to(destPath);
         } else {
             try {
+                // Perform the copy operation, but use the "to" form (not the "into", which takes the parent) ...
                 graph.copy(srcPath).failingIfUuidsMatch().fromWorkspace(srcWorkspace).to(destPath);
             } catch (UuidAlreadyExistsException uaee) {
                 throw new ItemExistsException(uaee.getMessage());

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	2009-06-21 00:16:03 UTC (rev 1057)
+++ trunk/dna-jcr/src/main/resources/org/jboss/dna/jcr/JcrI18n.properties	2009-06-21 00:45:14 UTC (rev 1058)
@@ -79,6 +79,7 @@
 unableToSetSingleValuedPropertyUsingMultipleValues = Unable to set existing single-valued property "{0}" on node "{1}" in workspace "{2}" using multi-value setter methods
 unableToRefreshBranchSinceAtLeastOneNodeMovedToParentOutsideOfBranch = Unable to refresh "{0}" in workspace "{2}" because at least one of its decendants was moved to another node outside of the branch that is not being refreshed 
 allPropertyValuesMustHaveSameType = All values of property "{0}" on node "{3}" in workspace "{4}" must all be {2} values (values were: {1})
+cannotRemoveNodeFromClone = The node at "{0}" with UUID "{1}" exists in the current workspace but cannot be removed because it is a mandatory child node
 
 unableToRemoveRootNode = Unable to remove the root node in workspace "{1}"
 unableToMoveNodeToBeChildOfDecendent = Node "{0}" in workspace "{2}" cannot be moved under a decendant node ("{1}") 

Modified: trunk/dna-jcr/src/test/java/org/jboss/dna/jcr/DnaTckTest.java
===================================================================
--- trunk/dna-jcr/src/test/java/org/jboss/dna/jcr/DnaTckTest.java	2009-06-21 00:16:03 UTC (rev 1057)
+++ trunk/dna-jcr/src/test/java/org/jboss/dna/jcr/DnaTckTest.java	2009-06-21 00:45:14 UTC (rev 1058)
@@ -1,5 +1,7 @@
 package org.jboss.dna.jcr;
 
+import static org.hamcrest.core.Is.is;
+import static org.junit.Assert.assertThat;
 import javax.jcr.AccessDeniedException;
 import javax.jcr.Credentials;
 import javax.jcr.Node;
@@ -8,6 +10,7 @@
 import javax.jcr.Property;
 import javax.jcr.Session;
 import javax.jcr.SimpleCredentials;
+import javax.jcr.nodetype.ConstraintViolationException;
 import org.apache.jackrabbit.test.AbstractJCRTest;
 
 /**
@@ -197,4 +200,74 @@
 
         assertNotNull(node4node1node2);
     }
+
+    /**
+     * A clone operation with removeExisting = true should fail if it would require removing an existing node that is a mandatory
+     * child node of some other parent (and not replacing it as part of the clone operation).
+     * 
+     * @throws Exception if an error occurs
+     */
+    public void testShouldNotCloneIfItWouldViolateTypeSemantics() throws Exception {
+        session = helper.getSuperuserSession("otherWorkspace");
+        assertThat(session.getWorkspace().getName(), is("otherWorkspace"));
+
+        String nodetype1 = this.getProperty("nodetype");
+        Node node1 = session.getRootNode().addNode("cloneSource", nodetype1);
+        // This node is not a mandatory child of nodetype1 (dnatest:referenceableUnstructured)
+        node1.addNode("dnatest:mandatoryChild", nodetype1);
+
+        session.save();
+        session.logout();
+
+        // /node4 in the default workspace is type dna:referenceableUnstructured
+        superuser.getRootNode().addNode("cloneTarget", nodetype1);
+
+        // /node3 in the default workspace is type dna:referenceableUnstructured
+        superuser.getRootNode().addNode(nodeName3, nodetype1);
+        superuser.save();
+
+        // Throw the cloned items under node4
+        superuser.getWorkspace().clone("otherWorkspace", "/cloneSource", "/cloneTarget/cloneSource", false);
+
+        superuser.refresh(false);
+        Node node3 = (Node)superuser.getItem("/node3");
+        assertThat(node3.getNodes().getSize(), is(0L));
+
+        Node node4node1 = (Node)superuser.getItem("/cloneTarget/cloneSource");
+        assertThat(node4node1.getNodes().getSize(), is(1L));
+
+        // Now clone from the same source under node3 and remove the existing records
+        superuser.getWorkspace().clone("otherWorkspace", "/cloneSource", "/" + nodeName3 + "/cloneSource", true);
+        superuser.refresh(false);
+
+        Node node3node1 = (Node)superuser.getItem("/node3/cloneSource");
+        assertThat(node3node1.getNodes().getSize(), is(1L));
+
+        // Check that the nodes were indeed removed
+        Node node4 = (Node)superuser.getItem("/cloneTarget");
+
+        assertThat(node4.getNodes().getSize(), is(0L));
+
+        superuser.getRootNode().addNode("nodeWithMandatoryChild", "dnatest:nodeWithMandatoryChild");
+        try {
+            superuser.save();
+            fail("A node with type dnatest:nodeWithMandatoryChild should not be savable until the child is added");
+        } catch (ConstraintViolationException cve) {
+            // Expected
+        }
+
+        superuser.move("/node3/cloneSource/dnatest:mandatoryChild", "/nodeWithMandatoryChild/dnatest:mandatoryChild");
+        superuser.save();
+        superuser.refresh(false);
+
+        // Now clone from the same source under node3 and remove the existing records
+        try {
+            superuser.getWorkspace().clone("otherWorkspace", "/cloneSource", "/" + nodeName3 + "/cloneSource", true);
+            fail("Should not be able to use clone to remove the mandatory child node at /nodeWithMandatoryChild/dnatest:mandatoryChild");
+        } catch (ConstraintViolationException cve) {
+            // expected
+        }
+
+    }
+
 }



From dna-commits at lists.jboss.org  Mon Jun 22 12:50:22 2009
From: dna-commits at lists.jboss.org (dna-commits at lists.jboss.org)
Date: Mon, 22 Jun 2009 12:50:22 -0400
Subject: [dna-commits] DNA SVN: r1059 - in trunk:
	dna-graph/src/main/java/org/jboss/dna/graph/connector/inmemory
	and 4 other directories.
Message-ID: <E1MImis-0006uq-TH@committer01.frg.pub.inap.atl.jboss.com>

Author: rhauch
Date: 2009-06-22 12:50:22 -0400 (Mon, 22 Jun 2009)
New Revision: 1059

Modified:
   trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/UuidAlreadyExistsException.java
   trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/inmemory/InMemoryRepository.java
   trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/AbstractJcrNode.java
   trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/JcrNode.java
   trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/JcrRootNode.java
   trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/JcrWorkspace.java
   trunk/dna-jcr/src/test/java/org/jboss/dna/jcr/AbstractJcrNodeTest.java
   trunk/dna-jcr/src/test/java/org/jboss/dna/jcr/JcrRepositoryTest.java
   trunk/extensions/dna-connector-jbosscache/src/main/java/org/jboss/dna/connector/jbosscache/JBossCacheRequestProcessor.java
   trunk/extensions/dna-connector-store-jpa/src/main/java/org/jboss/dna/connector/store/jpa/model/basic/BasicRequestProcessor.java
Log:
DNA-370 JcrWorkspace.clone Is Not Implemented

Corrected compilation warnings and errors.  The errors were due primarily to JDK 6 methods being used.

Modified: trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/UuidAlreadyExistsException.java
===================================================================
--- trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/UuidAlreadyExistsException.java	2009-06-21 00:45:14 UTC (rev 1058)
+++ trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/UuidAlreadyExistsException.java	2009-06-22 16:50:22 UTC (rev 1059)
@@ -1,3 +1,26 @@
+/*
+ * 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;
 
 import java.util.UUID;

Modified: trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/inmemory/InMemoryRepository.java
===================================================================
--- trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/inmemory/InMemoryRepository.java	2009-06-21 00:45:14 UTC (rev 1058)
+++ trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/inmemory/InMemoryRepository.java	2009-06-22 16:50:22 UTC (rev 1059)
@@ -466,6 +466,7 @@
             UUID uuidForCopy = reuseUuids ? original.getUuid() : UUID.randomUUID();
             InMemoryNode copy = newWorkspace.createNode(context, newParent, childName, uuidForCopy);
             if (!reuseUuids) {
+                assert oldToNewUuids != null;
                 oldToNewUuids.put(original.getUuid(), copy.getUuid());
             }
 
@@ -480,6 +481,7 @@
             }
 
             if (!reuseUuids) {
+                assert oldToNewUuids != null;
                 // Now, adjust any references in the new subgraph to objects in the original subgraph
                 // (because they were internal references, and need to be internal to the new subgraph)
                 PropertyFactory propertyFactory = context.getPropertyFactory();

Modified: trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/AbstractJcrNode.java
===================================================================
--- trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/AbstractJcrNode.java	2009-06-21 00:45:14 UTC (rev 1058)
+++ trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/AbstractJcrNode.java	2009-06-22 16:50:22 UTC (rev 1059)
@@ -717,7 +717,8 @@
                 JcrNodeDefinition match = this.cache.nodeTypes().findChildNodeDefinition(mixinCandidateType.getInternalName(),
                                                                                          Collections.<Name>emptyList(),
                                                                                          nodeName,
-                                                                                         childNode.getPrimaryNodeType().getInternalName(),
+                                                                                         childNode.getPrimaryNodeType()
+                                                                                                  .getInternalName(),
                                                                                          snsCount,
                                                                                          false);
 
@@ -1356,9 +1357,13 @@
     }
 
     /**
-     * {@inheritDoc}
+     * Obtain the corresponding node path from the supplied workspace name.
      * 
-     * @see javax.jcr.Node#getCorrespondingNodePath(java.lang.String)
+     * @param workspaceName
+     * @return the path of the corresponding node in the supplied workspace
+     * @throws NoSuchWorkspaceException if the workspace does not exist
+     * @throws ItemNotFoundException if there is no corresponding node in the supplied workspace
+     * @throws RepositoryException if there is another problem
      */
     final Path correspondingNodePathFrom( String workspaceName )
         throws NoSuchWorkspaceException, ItemNotFoundException, RepositoryException {

Modified: trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/JcrNode.java
===================================================================
--- trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/JcrNode.java	2009-06-21 00:45:14 UTC (rev 1058)
+++ trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/JcrNode.java	2009-06-22 16:50:22 UTC (rev 1059)
@@ -72,6 +72,7 @@
      * 
      * @see javax.jcr.Item#getParent()
      */
+    @Override
     public AbstractJcrNode getParent() throws ItemNotFoundException, RepositoryException {
         return cache.findJcrNode(nodeInfo().getParent());
     }

Modified: trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/JcrRootNode.java
===================================================================
--- trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/JcrRootNode.java	2009-06-21 00:45:14 UTC (rev 1058)
+++ trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/JcrRootNode.java	2009-06-22 16:50:22 UTC (rev 1059)
@@ -88,6 +88,7 @@
      * @throws ItemNotFoundException always
      * @see javax.jcr.Item#getParent()
      */
+    @Override
     public AbstractJcrNode getParent() throws ItemNotFoundException {
         throw new ItemNotFoundException(JcrI18n.rootNodeHasNoParent.text());
     }

Modified: trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/JcrWorkspace.java
===================================================================
--- trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/JcrWorkspace.java	2009-06-21 00:45:14 UTC (rev 1058)
+++ trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/JcrWorkspace.java	2009-06-22 16:50:22 UTC (rev 1059)
@@ -355,10 +355,10 @@
 
             Set<UUID> sourceUuids = new HashSet<UUID>();
             LinkedList<SubgraphNode> nodesToVisit = new LinkedList<SubgraphNode>();
-            nodesToVisit.push(sourceTree.getRoot());
+            nodesToVisit.addFirst(sourceTree.getRoot());
 
             while (!nodesToVisit.isEmpty()) {
-                SubgraphNode node = nodesToVisit.pop();
+                SubgraphNode node = nodesToVisit.removeFirst();
 
                 UUID uuid = uuidFactory.create(node.getProperty(DnaLexicon.UUID).getFirstValue().toString());
                 if (uuid != null) {

Modified: trunk/dna-jcr/src/test/java/org/jboss/dna/jcr/AbstractJcrNodeTest.java
===================================================================
--- trunk/dna-jcr/src/test/java/org/jboss/dna/jcr/AbstractJcrNodeTest.java	2009-06-21 00:45:14 UTC (rev 1058)
+++ trunk/dna-jcr/src/test/java/org/jboss/dna/jcr/AbstractJcrNodeTest.java	2009-06-22 16:50:22 UTC (rev 1059)
@@ -87,6 +87,7 @@
             return cache.getPathFor(nodeInfo()).getLastSegment().getString(namespaces());
         }
 
+        @Override
         public AbstractJcrNode getParent() throws RepositoryException {
             return cache.findJcrNode(nodeInfo().getParent());
         }

Modified: trunk/dna-jcr/src/test/java/org/jboss/dna/jcr/JcrRepositoryTest.java
===================================================================
--- trunk/dna-jcr/src/test/java/org/jboss/dna/jcr/JcrRepositoryTest.java	2009-06-21 00:45:14 UTC (rev 1058)
+++ trunk/dna-jcr/src/test/java/org/jboss/dna/jcr/JcrRepositoryTest.java	2009-06-22 16:50:22 UTC (rev 1059)
@@ -184,7 +184,6 @@
         repository.login();
     }
 
-    @SuppressWarnings("cast")
     @Test
     public void shouldAllowLoginWithNoCredentialsInPrivilegedBlock() throws Exception {
         LoginContext login = new LoginContext("dna-jcr", new UserPasswordCallbackHandler("superuser", "superuser".toCharArray()));

Modified: trunk/extensions/dna-connector-jbosscache/src/main/java/org/jboss/dna/connector/jbosscache/JBossCacheRequestProcessor.java
===================================================================
--- trunk/extensions/dna-connector-jbosscache/src/main/java/org/jboss/dna/connector/jbosscache/JBossCacheRequestProcessor.java	2009-06-21 00:45:14 UTC (rev 1058)
+++ trunk/extensions/dna-connector-jbosscache/src/main/java/org/jboss/dna/connector/jbosscache/JBossCacheRequestProcessor.java	2009-06-22 16:50:22 UTC (rev 1059)
@@ -250,7 +250,7 @@
             nodesToVisit.add(node);
 
             while (!nodesToVisit.isEmpty()) {
-                Node<Name, Object> nodeToCheck = nodesToVisit.pop();
+                Node<Name, Object> nodeToCheck = nodesToVisit.removeFirst();
                 UUID uuid = uuidFactory.create(nodeToCheck.get(DnaLexicon.UUID));
                 if (uuid != null) uuidsFromSource.add(uuid);
 
@@ -688,8 +688,7 @@
      * @param desiredName the desired name of the node in the new location
      * @param beforeNodeName the node before which the new node should be placed
      * @param recursive if this is a deep copy
-     * @param reuseOriginalUuids indicates whether the original UUIDs should be used for the copies or new UUIDs should be used
-     * @param uuidForCopyOfOriginal pre-determined UUID for copy of node; ignored if reuseOriginalUuids is true
+     * @param uuidConflictBehavior indicates whether the original UUIDs should be used for the copies or new UUIDs should be used
      * @param count the count of nodes affected by the operation
      * @param context the execution context that provides the path factory to be used to create the new path name
      * @return the path segment that identifies the new node under its new parent
@@ -707,7 +706,8 @@
         assert original != null;
         assert newParent != null;
         // Get or create the new node ...
-        Path.Segment name = desiredName != null ? context.getValueFactories().getPathFactory().createSegment(desiredName) : (Path.Segment)original.getFqn().getLastElement();
+        Path.Segment name = desiredName != null ? context.getValueFactories().getPathFactory().createSegment(desiredName) : (Path.Segment)original.getFqn()
+                                                                                                                                                  .getLastElement();
 
         // Update the children to account for same-name siblings.
         // This not only updates the FQN of the child nodes, but it also sets the property that stores the
@@ -923,8 +923,9 @@
                     // don't copy ...
                 } else {
                     // Append an updated segment ...
-                    Path.Segment newSegment = context.getValueFactories().getPathFactory().createSegment(childName.getName(),
-                                                                                                         childName.getIndex() - 1);
+                    Path.Segment newSegment = context.getValueFactories()
+                                                     .getPathFactory()
+                                                     .createSegment(childName.getName(), childName.getIndex() - 1);
                     newChildNames[index] = newSegment;
                     // Replace the child with the correct FQN ...
                     changeNodeName(cache, parent, childName, newSegment, context);

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	2009-06-21 00:45:14 UTC (rev 1058)
+++ trunk/extensions/dna-connector-store-jpa/src/main/java/org/jboss/dna/connector/store/jpa/model/basic/BasicRequestProcessor.java	2009-06-22 16:50:22 UTC (rev 1059)
@@ -2094,7 +2094,7 @@
     /**
      * Attempt to resolve the reference.
      * 
-     * @param workspaceId the ID of the workspace in which the reference occurs; may not be null
+     * @param workspace the workspace in which the reference occurs; may not be null
      * @param reference the reference
      * @return the UUID of the node to which the reference points, or null if the reference could not be resolved
      */
@@ -2135,7 +2135,7 @@
      * This method will also find the path when the location contains just the UUID.
      * </p>
      * 
-     * @param workspaceId the ID of the workspace; may not be null
+     * @param workspace the workspace; may not be null
      * @param original the original location; may not be null
      * @return the actual location, which includes the verified location and additional information needed by this method that may
      *         be usable after this method is called



From dna-commits at lists.jboss.org  Mon Jun 22 17:28:39 2009
From: dna-commits at lists.jboss.org (dna-commits at lists.jboss.org)
Date: Mon, 22 Jun 2009 17:28:39 -0400
Subject: [dna-commits] DNA SVN: r1060 - in
	branches/eclipse/org.jboss.dna.publish: META-INF and 7 other
	directories.
Message-ID: <E1MIr4B-0003Kf-QI@committer01.frg.pub.inap.atl.jboss.com>

Author: elvisisking
Date: 2009-06-22 17:28:39 -0400 (Mon, 22 Jun 2009)
New Revision: 1060

Added:
   branches/eclipse/org.jboss.dna.publish/src/org/jboss/dna/publish/Messages.properties
   branches/eclipse/org.jboss.dna.publish/src/org/jboss/dna/publish/Publisher.java
   branches/eclipse/org.jboss.dna.publish/src/org/jboss/dna/publish/Status.java
   branches/eclipse/org.jboss.dna.publish/src/org/jboss/dna/publish/domain/validation/
   branches/eclipse/org.jboss.dna.publish/src/org/jboss/dna/publish/domain/validation/RepositoryValidator.java
   branches/eclipse/org.jboss.dna.publish/src/org/jboss/dna/publish/domain/validation/ServerValidator.java
   branches/eclipse/org.jboss.dna.publish/src/org/jboss/dna/publish/domain/validation/WorkspaceValidator.java
Removed:
   branches/eclipse/org.jboss.dna.publish/icons/
   branches/eclipse/org.jboss.dna.publish/plugin.xml
   branches/eclipse/org.jboss.dna.publish/src/org/jboss/dna/publish/Activator.java
   branches/eclipse/org.jboss.dna.publish/src/org/jboss/dna/publish/I18n.java
   branches/eclipse/org.jboss.dna.publish/src/org/jboss/dna/publish/actions/PublishAction.java
   branches/eclipse/org.jboss.dna.publish/src/org/jboss/dna/publish/actions/UnpublishAction.java
   branches/eclipse/org.jboss.dna.publish/src/org/jboss/dna/publish/i18n.properties
   branches/eclipse/org.jboss.dna.publish/src/org/jboss/dna/publish/ui/IUiConstants.java
   branches/eclipse/org.jboss.dna.publish/src/org/jboss/dna/publish/ui/UiUtil.java
   branches/eclipse/org.jboss.dna.publish/src/org/jboss/dna/publish/ui/dialogs/DeleteServerDialog.java
   branches/eclipse/org.jboss.dna.publish/src/org/jboss/dna/publish/ui/dialogs/ServerDialog.java
   branches/eclipse/org.jboss.dna.publish/src/org/jboss/dna/publish/ui/views/RepositoryContentProvider.java
   branches/eclipse/org.jboss.dna.publish/src/org/jboss/dna/publish/ui/views/RepositoryView.java
Modified:
   branches/eclipse/org.jboss.dna.publish/META-INF/MANIFEST.MF
   branches/eclipse/org.jboss.dna.publish/build.properties
   branches/eclipse/org.jboss.dna.publish/plugin.properties
   branches/eclipse/org.jboss.dna.publish/src/org/jboss/dna/publish/IConstants.java
   branches/eclipse/org.jboss.dna.publish/src/org/jboss/dna/publish/ServerManager.java
   branches/eclipse/org.jboss.dna.publish/src/org/jboss/dna/publish/domain/Repository.java
   branches/eclipse/org.jboss.dna.publish/src/org/jboss/dna/publish/domain/Server.java
   branches/eclipse/org.jboss.dna.publish/src/org/jboss/dna/publish/domain/Workspace.java
Log:
Refactored UI code to new project.

Modified: branches/eclipse/org.jboss.dna.publish/META-INF/MANIFEST.MF
===================================================================
--- branches/eclipse/org.jboss.dna.publish/META-INF/MANIFEST.MF	2009-06-22 16:50:22 UTC (rev 1059)
+++ branches/eclipse/org.jboss.dna.publish/META-INF/MANIFEST.MF	2009-06-22 21:28:39 UTC (rev 1060)
@@ -3,13 +3,12 @@
 Bundle-Name: %bundleName
 Bundle-SymbolicName: org.jboss.dna.publish; singleton:=true
 Bundle-Version: 1.0.0
-Bundle-Activator: org.jboss.dna.publish.Activator
 Bundle-Vendor: %bundleVendor
-Require-Bundle: org.eclipse.ui,
- org.eclipse.core.runtime,
- org.eclipse.core.resources
 Bundle-RequiredExecutionEnvironment: JavaSE-1.6
 Bundle-ActivationPolicy: lazy
 Bundle-Localization: plugin
 Bundle-ClassPath: dnaPublish.jar,
  jettison-1.1.jar
+Export-Package: org.jboss.dna.publish,
+ org.jboss.dna.publish.domain,
+ org.jboss.dna.publish.domain.validation

Modified: branches/eclipse/org.jboss.dna.publish/build.properties
===================================================================
--- branches/eclipse/org.jboss.dna.publish/build.properties	2009-06-22 16:50:22 UTC (rev 1059)
+++ branches/eclipse/org.jboss.dna.publish/build.properties	2009-06-22 21:28:39 UTC (rev 1060)
@@ -1,8 +1,6 @@
-bin.includes = plugin.xml,\
-               META-INF/,\
+bin.includes = META-INF/,\
                plugin.properties,\
                jettison-1.1.jar,\
-               icons/,\
                dnaPublish.jar
 jars.compile.order = dnaPublish.jar
 src.includes = src/

Modified: branches/eclipse/org.jboss.dna.publish/plugin.properties
===================================================================
--- branches/eclipse/org.jboss.dna.publish/plugin.properties	2009-06-22 16:50:22 UTC (rev 1059)
+++ branches/eclipse/org.jboss.dna.publish/plugin.properties	2009-06-22 21:28:39 UTC (rev 1060)
@@ -23,8 +23,3 @@
 #
 bundleName = DNA Eclipse Publishing Plug-in
 bundleVendor = Red Hat, Inc.
-contextMenu.label = DNA
-dnaCategory = DNA
-publishAction.label = Publish
-repositoryView = DNA Repositories
-unpublishAction.label = Unpublish
\ No newline at end of file

Deleted: branches/eclipse/org.jboss.dna.publish/plugin.xml
===================================================================
--- branches/eclipse/org.jboss.dna.publish/plugin.xml	2009-06-22 16:50:22 UTC (rev 1059)
+++ branches/eclipse/org.jboss.dna.publish/plugin.xml	2009-06-22 21:28:39 UTC (rev 1060)
@@ -1,59 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<?eclipse version="3.2"?>
-<plugin>
-
-<!-- Define the IResource object contribution actions to all popup menus -->
-   <extension
-         point="org.eclipse.ui.popupMenus">
-      <objectContribution
-            id="org.jboss.dna.publish.iresourcepopupmenucontribution"
-            objectClass="org.eclipse.core.resources.IResource">
-         <menu
-               id="org.jboss.dna.publish.contextMenu"
-               label="%contextMenu.label"
-               path="additions">
-            <separator
-                  name="group1">
-            </separator>
-         </menu>
-         
-         <!-- Unpublish action -->
-         <action
-               id="org.jboss.dna.publish.unpublishAction"
-               label="%unpublishAction.label"
-               class="org.jboss.dna.publish.actions.UnpublishAction"
-               menubarPath="org.jboss.dna.publish.contextMenu/group1"
-               enablesFor="*">
-         </action>
-         
-         <!-- Publish action -->
-         <action
-               id="org.jboss.dna.publish.publishAction"
-               label="%publishAction.label"
-               class="org.jboss.dna.publish.actions.PublishAction"
-               menubarPath="org.jboss.dna.publish.contextMenu/group1"
-               enablesFor="*">
-         </action>
-      </objectContribution>
-   </extension>
-
-<!-- View extensions -->
-   <extension
-         point="org.eclipse.ui.views">
-      <category
-            id="org.jboss.dna"
-            name="%dnaCategory">
-      </category>
-      
-      <!-- Repository view -->
-      <view
-            id="respositoryView"
-            name="%repositoryView"
-            category="org.jboss.dna"
-            class="org.jboss.dna.publish.ui.views.RepositoryView"
-            fastViewWidthRatio="0.25"
-            icon="icons/full/cview16/repository.gif">
-      </view>
-   </extension>
-
-</plugin>

Deleted: branches/eclipse/org.jboss.dna.publish/src/org/jboss/dna/publish/Activator.java
===================================================================
--- branches/eclipse/org.jboss.dna.publish/src/org/jboss/dna/publish/Activator.java	2009-06-22 16:50:22 UTC (rev 1059)
+++ branches/eclipse/org.jboss.dna.publish/src/org/jboss/dna/publish/Activator.java	2009-06-22 21:28:39 UTC (rev 1060)
@@ -1,216 +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.publish;
-
-import static org.jboss.dna.publish.IConstants.PLUGIN_ID;
-import java.net.MalformedURLException;
-import java.net.URL;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jface.resource.ImageRegistry;
-import org.eclipse.swt.SWTException;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.ui.plugin.AbstractUIPlugin;
-import org.osgi.framework.BundleContext;
-
-/**
- * The activator class controls the plug-in life cycle.
- * 
- * @author Dan Florian
- * @since 0.6
- */
-public final class Activator extends AbstractUIPlugin {
-
-    // ===========================================================================================================================
-    // Class Fields
-    // ===========================================================================================================================
-
-    /**
-     * The shared plugin instance.
-     * 
-     * @since 0.6
-     */
-    private static Activator plugin;
-
-    // ===========================================================================================================================
-    // Class Methods
-    // ===========================================================================================================================
-
-    /**
-     * @param key the relative path to the image file
-     * @return the image descriptor or <code>null</code>
-     * @since 0.6
-     */
-    private ImageDescriptor createImageDescriptor( String key ) {
-        try {
-            URL url = new URL(getBundle().getEntry("/").toString() + key); //$NON-NLS-1$
-            ImageDescriptor descriptor = ImageDescriptor.createFromURL(url);
-            ImageRegistry registry = getImageRegistry();
-            registry.put(key, descriptor);
-            return descriptor;
-        } catch (final MalformedURLException e) {
-            // TODO log this or return missing image
-            return null;
-        }
-    }
-
-    /**
-     * @return the shared instance or <code>null</code> if bundle is not started
-     * @since 0.6
-     */
-    public static Activator getDefault() {
-        return plugin;
-    }
-
-    /**
-     * @param path the path
-     * @return the image descriptor for the image file at the given plug-in relative path
-     * @since 0.6
-     */
-    public static ImageDescriptor getImageDescriptor( String path ) {
-        return imageDescriptorFromPlugin(PLUGIN_ID, path);
-    }
-
-    /**
-     * Retrieves the image associated with the specified key from the {@link org.eclipse.jface.resource.ImageRegistry image
-     * registry}, creating the image and registering it if it doesn't already exist. A <code>null</code> key will cause the
-     * missing image descriptor to be returned.
-     * 
-     * @param relativePathToImage the relative path to the image to retrieve. This must be in the form of the path to the image
-     *        file relative to this plug-in's folder (can be <code>null</code>).
-     * @return the image associated with the specified path or the default missing image
-     * @since 0.6
-     */
-    public final Image getImage( String relativePathToImage ) {
-        final ImageRegistry registry = getImageRegistry();
-        Image img = registry.get(relativePathToImage);
-
-        if (img != null) {
-            return img;
-        }
-
-        // image has never been cached
-        try {
-            createImageDescriptor(relativePathToImage);
-            img = registry.get(relativePathToImage);
-            return (img != null ? img : ImageDescriptor.getMissingImageDescriptor().createImage());
-        } catch (SWTException e) {
-            // TODO log this or return missing image
-            return null;
-        }
-    }
-
-    // ===========================================================================================================================
-    // Fields
-    // ===========================================================================================================================
-
-    /**
-     * The server manager of this plugin.
-     * 
-     * @since 0.6
-     */
-    private ServerManager serverMgr;
-
-    // ===========================================================================================================================
-    // Constructors
-    // ===========================================================================================================================
-
-    /**
-     * Constructs the plugin activator.
-     * <p>
-     * Note: If this is called outside the OSGi framework you <strong>MUST</strong> also call {@link #initialize(String)}.
-     * 
-     * @since 0.6
-     * @see #initialize(String)
-     */
-    public Activator() {
-        // nothing to do but wanted javadocs for the default constructor
-    }
-
-    // ===========================================================================================================================
-    // Methods
-    // ===========================================================================================================================
-
-    /**
-     * @return the {@link ServerManager Server Manager} or <code>null</code> if not plugin is not initialized
-     * @see #initialize(String)
-     * @since 0.6
-     */
-    public ServerManager getServerManager() {
-        return this.serverMgr;
-    }
-
-    /**
-     * Performs plugin initialization. One thing it does is initialize the {@link ServerManager}.
-     * <p>
-     * Note: This should <strong>ONLY</strong> be called when the OSGi framework is not running (i.e., {@link BundleContext bundle
-     * context} is <code>null</code>).
-     * 
-     * @since 0.6
-     */
-    public void initialize( String stateLocationPath ) {
-        plugin = this;
-        serverMgr = new ServerManager(stateLocationPath);
-    }
-
-    /**
-     * {@inheritDoc}
-     * <p>
-     * When the OSGi framework is not running (i.e., <code>context</code> is <code>null</code>) you <strong>MUST</strong> also
-     * call {@link #initialize(String)}.
-     * 
-     * @see org.eclipse.ui.plugin.AbstractUIPlugin#start(org.osgi.framework.BundleContext)
-     * @since 0.6
-     * @see #initialize(String)
-     */
-    @Override
-    public void start( BundleContext context ) throws Exception {
-        if (context != null) {
-            super.start(context);
-            initialize(plugin.getStateLocation().toFile().getAbsolutePath());
-        }
-    }
-
-    /**
-     * {@inheritDoc}
-     * <p>
-     * Also informs the {@link ServerManager} to shutdown.
-     * <p>
-     * Note: This can safely be called when the OSGi framework is not running (i.e., <code>context</code> is <code>null</code>).
-     * 
-     * @see org.eclipse.ui.plugin.AbstractUIPlugin#stop(org.osgi.framework.BundleContext)
-     * @since 0.6
-     */
-    @Override
-    public void stop( BundleContext context ) throws Exception {
-        serverMgr.saveState();
-
-        if (context != null) {
-            super.stop(context);
-        }
-
-        plugin = null;
-        serverMgr = null;
-    }
-
-}

Deleted: branches/eclipse/org.jboss.dna.publish/src/org/jboss/dna/publish/I18n.java
===================================================================
--- branches/eclipse/org.jboss.dna.publish/src/org/jboss/dna/publish/I18n.java	2009-06-22 16:50:22 UTC (rev 1059)
+++ branches/eclipse/org.jboss.dna.publish/src/org/jboss/dna/publish/I18n.java	2009-06-22 21:28:39 UTC (rev 1060)
@@ -1,76 +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.publish;
-
-import org.eclipse.osgi.util.NLS;
-
-/**
- * The I18n class handles localization messages.
- * 
- * @author Dan Florian
- * @since 0.6
- */
-public final class I18n extends NLS {
-
-    public static String CollapseActionToolTip;
-
-    public static String DeleteServerActionText;
-    public static String DeleteServerActionToolTip;
-
-    public static String DeleteServerDialogTitle;
-    public static String DeleteServerDialogOneServerMessage;
-    public static String DeleteServerDialogMultipleServersMessage;
-
-    public static String EditServerActionText;
-    public static String EditServerActionToolTip;
-
-    public static String ServerDialogEditTitle;
-    public static String ServerDialogNewTitle;
-    public static String ServerDialogPasswordLabel;
-    public static String ServerDialogSavePasswordButton;
-    public static String ServerDialogSavePasswordLabel;
-    public static String ServerDialogUserLabel;
-    public static String ServerDialogUrlLabel;
-    
-    public static String NewServerActionText;
-    public static String NewServerActionToolTip;
-
-    public static String RepositoryInvalidNameMsg;
-    public static String RepositoryInvalidServerMsg;
-    public static String RepositoryShortDescription;
-
-    public static String ServerShortDescription;
-    public static String ServerInvalidPasswordMsg;
-    public static String ServerInvalidUrlMsg;
-    public static String ServerInvalidUserMsg;
-
-    public static String WorkspaceInvalidNameMsg;
-    public static String WorkspaceInvalidRepositoryMsg;
-    public static String WorkspaceShortDescription;
-
-    static {
-        // load message bundle
-        NLS.initializeMessages(I18n.class.getPackage() + "i18n", I18n.class); //$NON-NLS-1$
-    }
-}

Modified: branches/eclipse/org.jboss.dna.publish/src/org/jboss/dna/publish/IConstants.java
===================================================================
--- branches/eclipse/org.jboss.dna.publish/src/org/jboss/dna/publish/IConstants.java	2009-06-22 16:50:22 UTC (rev 1059)
+++ branches/eclipse/org.jboss.dna.publish/src/org/jboss/dna/publish/IConstants.java	2009-06-22 21:28:39 UTC (rev 1060)
@@ -1,12 +1,60 @@
+/*
+ * 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.publish;
 
+import java.util.ResourceBundle;
+
+/**
+ * @author Dan Florian
+ * @since 0.6
+ */
 public interface IConstants {
+    
+    ResourceBundle MESSAGES = ResourceBundle.getBundle(IConstants.class.getPackage().getName() + ".Messages"); //$NON-NLS-1$
+    
+    String RemovingServerProblemMsg = "RemovingServerProblemMsg"; //$NON-NLS-1$
+    
+    String RepositoryEmptyNameMsg = "RepositoryEmptyNameMsg"; //$NON-NLS-1$
+    
+    String RepositoryNullServerMsg = "RepositoryNullServerMsg"; //$NON-NLS-1$
+    
+    String RepositoryShortDescription = "RepositoryShortDescription"; //$NON-NLS-1$
+    
+    String ServerEmptyUrlMsg = "ServerEmptyUrlMsg"; //$NON-NLS-1$
+    
+    String ServerInvalidUrlMsg = "ServerInvalidUrlMsg"; //$NON-NLS-1$
+    
+    String ServerEmptyUserMsg = "ServerEmptyUserMsg"; //$NON-NLS-1$
+    
+    String ServerExistsMsg = "ServerExistsMsg"; //$NON-NLS-1$
+    
+    String ServerShortDescription = "ServerShortDescription"; //$NON-NLS-1$
+    
+    String WorkspaceEmptyNameMsg = "WorkspaceEmptyNameMsg"; //$NON-NLS-1$
+    
+    String WorkspaceNullRepositoryMsg = "WorkspaceNullRepositoryMsg"; //$NON-NLS-1$
+    
+    String WorkspaceShortDescription = "WorkspaceShortDescription"; //$NON-NLS-1$
 
-    /**
-     * The Plug-in's identifier.
-     * 
-     * @since 0.6
-     */
-    public static final String PLUGIN_ID = "org.jboss.dna.publish"; //$NON-NLS-1$
-
 }

Added: branches/eclipse/org.jboss.dna.publish/src/org/jboss/dna/publish/Messages.properties
===================================================================
--- branches/eclipse/org.jboss.dna.publish/src/org/jboss/dna/publish/Messages.properties	                        (rev 0)
+++ branches/eclipse/org.jboss.dna.publish/src/org/jboss/dna/publish/Messages.properties	2009-06-22 21:28:39 UTC (rev 1060)
@@ -0,0 +1,15 @@
+RemovingServerProblemMsg = {0} cannot be removed as it has not been registered
+
+RepositoryEmptyNameMsg = A repository name cannot be empty
+RepositoryNullServerMsg = A repository server cannot be null
+RepositoryShortDescription = DNA Repository: Name: {0}, {1}
+
+ServerEmptyUserMsg = The user cannot be empty
+ServerEmptyUrlMsg = A server URL cannot be empty
+ServerExistsMsg = {0} already exists so it cannot be added
+ServerInvalidUrlMsg = The  value "{0}" is not a valid server URL
+ServerShortDescription = DNA Server: URL={0} User={1}
+
+WorkspaceEmptyNameMsg = A workspace name cannot be empty
+WorkspaceNullRepositoryMsg = A workspace repository cannot be null
+WorkspaceShortDescription = DNA Repository Workspace: Name: {0}, {1}


Property changes on: branches/eclipse/org.jboss.dna.publish/src/org/jboss/dna/publish/Messages.properties
___________________________________________________________________
Name: svn:mime-type
   + text/plain

Added: branches/eclipse/org.jboss.dna.publish/src/org/jboss/dna/publish/Publisher.java
===================================================================
--- branches/eclipse/org.jboss.dna.publish/src/org/jboss/dna/publish/Publisher.java	                        (rev 0)
+++ branches/eclipse/org.jboss.dna.publish/src/org/jboss/dna/publish/Publisher.java	2009-06-22 21:28:39 UTC (rev 1060)
@@ -0,0 +1,48 @@
+/*
+ * 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.publish;
+
+import java.io.File;
+import java.util.Collection;
+import org.jboss.dna.publish.domain.Server;
+
+/**
+ * @author Dan Florian
+ * @since 0.6
+ */
+public class Publisher {
+
+    public Status publish( Server server,
+                           Collection<File> files ) {
+        // TODO implement
+        return null;
+    }
+
+    public Status unpublish( Server server,
+                             Collection<File> files ) {
+        // TODO implement
+        return null;
+    }
+
+}


Property changes on: branches/eclipse/org.jboss.dna.publish/src/org/jboss/dna/publish/Publisher.java
___________________________________________________________________
Name: svn:mime-type
   + text/plain

Modified: branches/eclipse/org.jboss.dna.publish/src/org/jboss/dna/publish/ServerManager.java
===================================================================
--- branches/eclipse/org.jboss.dna.publish/src/org/jboss/dna/publish/ServerManager.java	2009-06-22 16:50:22 UTC (rev 1059)
+++ branches/eclipse/org.jboss.dna.publish/src/org/jboss/dna/publish/ServerManager.java	2009-06-22 21:28:39 UTC (rev 1060)
@@ -23,13 +23,27 @@
  */
 package org.jboss.dna.publish;
 
+import java.io.File;
+import java.io.FileOutputStream;
+import java.text.MessageFormat;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.List;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
+import javax.xml.transform.OutputKeys;
+import javax.xml.transform.Transformer;
+import javax.xml.transform.TransformerFactory;
+import javax.xml.transform.dom.DOMSource;
+import javax.xml.transform.stream.StreamResult;
+import org.jboss.dna.publish.Status.Severity;
 import org.jboss.dna.publish.domain.Server;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.w3c.dom.NamedNodeMap;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
 
 /**
  * The Server Manager class managers the creation, deletion, and editing of servers.
@@ -37,9 +51,55 @@
  * @author Dan Florian
  * @since 0.6
  */
-public final class ServerManager {
+public final class ServerManager implements IConstants {
 
     // ===========================================================================================================================
+    // Constants
+    // ===========================================================================================================================
+
+    /**
+     * The tag used to persist a server's login password.
+     * 
+     * @since 0.6
+     */
+    private static final String PASSWORD_TAG = "password"; //$NON-NLS-1$
+
+    /**
+     * The file name used when persisting the server registry.
+     * 
+     * @since 0.6
+     */
+    private static final String REGISTRY_FILE = "serverRegistry.xml"; //$NON-NLS-1$
+
+    /**
+     * The tag used when persisting a server.
+     * 
+     * @since 0.6
+     */
+    private static final String SERVER_TAG = "server"; //$NON-NLS-1$
+
+    /**
+     * The server collection tag used when persisting the server registry.
+     * 
+     * @since 0.6
+     */
+    private static final String SERVERS_TAG = "servers"; //$NON-NLS-1$
+
+    /**
+     * The tag used to persist a server's URL.
+     * 
+     * @since 0.6
+     */
+    private static final String URL_TAG = "url"; //$NON-NLS-1$
+
+    /**
+     * The tag used to persist a server's login user.
+     * 
+     * @since 0.6
+     */
+    private static final String USER_TAG = "user"; //$NON-NLS-1$
+
+    // ===========================================================================================================================
     // Fields
     // ===========================================================================================================================
 
@@ -62,9 +122,9 @@
      *        persistence is not desired)
      * @since 0.6
      */
-    public ServerManager( String path ) {
+    public ServerManager( String stateLocationPath ) {
         this.servers = Collections.synchronizedList(new ArrayList<Server>());
-        this.stateLocationPath = path;
+        this.stateLocationPath = stateLocationPath;
         restoreState();
     }
 
@@ -79,14 +139,17 @@
      * @return a status indicating if the server was added to the registry
      * @since 0.6
      */
-    public IStatus addServer( Server server ) {
+    public Status addServer( Server server ) {
         if (!this.servers.contains(server)) {
             this.servers.add(server);
             return Status.OK_STATUS;
         }
 
-        // TODO implement error status
-        return null;
+        // server already exists
+        String pattern = MESSAGES.getString(ServerExistsMsg);
+        String msg = MessageFormat.format(pattern, server.getShortDescription());
+        Status status = new Status(Severity.ERROR, msg, null);
+        return status;
     }
 
     /**
@@ -96,27 +159,75 @@
     public Collection<Server> getServers() {
         return Collections.unmodifiableCollection(this.servers);
     }
+    
+    /**
+     * @return the name of the state file that the server registry is persisted to
+     * @since 0.6
+     */
+    private String getStateFileName() {
+        return this.stateLocationPath + File.separatorChar + REGISTRY_FILE;
+    }
 
     /**
+     * @param server the server being tested
+     * @return <code>true</code> if the server has been registered
+     * @since 0.6
+     */
+    public boolean isRegistered( Server server ) {
+        return this.servers.contains(server);
+    }
+
+    /**
      * @param server the server being removed
      * @return a status indicating if the specified server was removed from the registry
      * @since 0.6
      */
-    public IStatus removeServer( Server server ) {
+    public Status removeServer( Server server ) {
         if (this.servers.remove(server)) {
             return Status.OK_STATUS;
         }
 
-        // TODO implement error status
-        return null;
+        // server could not be removed
+        String pattern = MESSAGES.getString(RemovingServerProblemMsg);
+        String msg = MessageFormat.format(pattern, server.getShortDescription());
+        Status status = new Status(Severity.ERROR, msg, null);
+        return status;
     }
 
     /**
+     * @return a status indicating if the previous session state was restored
      * @since 0.6
      */
-    private IStatus restoreState() {
+    private Status restoreState() {
         if (this.stateLocationPath != null) {
-            // TODO implement
+            if (stateFileExists()) {
+                try {
+                    DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
+                    DocumentBuilder docBuilder = factory.newDocumentBuilder();
+                    Document doc = docBuilder.parse(new File(getStateFileName()));
+                    Node root = doc.getDocumentElement();
+                    NodeList servers = root.getChildNodes();
+                    
+                    for (int size = servers.getLength(), i = 0; i < size; ++i) {
+                        Node server = servers.item(i);
+                        
+                        if (server.getNodeType() != Node.TEXT_NODE) {
+                            NamedNodeMap attributeMap = server.getAttributes();
+                            
+                            if (attributeMap == null) continue;
+                            
+                            for (int numAttrs = attributeMap.getLength(), j = 0; j < numAttrs; ++j) {
+                                Node urlNode = attributeMap.getNamedItem(URL_TAG);
+                                Node userNode = attributeMap.getNamedItem(USER_TAG);
+                                Node passwordNode = attributeMap.getNamedItem(PASSWORD_TAG);
+                                addServer(new Server(urlNode.getNodeValue(), userNode.getNodeValue(), passwordNode.getNodeValue()));
+                            }
+                        }
+                    }
+                } catch (Exception e) {
+                    // TODO log
+                }
+            }
         }
 
         // do nothing of there is no save location
@@ -129,13 +240,67 @@
      * @return a status indicating if the registry was successfully saved
      * @since 0.6
      */
-    public IStatus saveState() {
-        if (this.stateLocationPath != null) {
-            // TODO implement
+    public Status saveState() {
+        try {
+            if ((this.stateLocationPath != null) && !getServers().isEmpty()) {
+                DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
+                DocumentBuilder docBuilder = factory.newDocumentBuilder();
+                Document doc = docBuilder.newDocument();
+
+                // create root element
+                Element root = doc.createElement(SERVERS_TAG);
+                doc.appendChild(root);
+
+                for (Server server : getServers()) {
+                    Element serverElement = doc.createElement(SERVER_TAG);
+                    root.appendChild(serverElement);
+
+                    serverElement.setAttribute(URL_TAG, server.getUrl());
+                    serverElement.setAttribute(USER_TAG, server.getUser());
+                    serverElement.setAttribute(PASSWORD_TAG, server.getPassword());
+                }
+                
+                DOMSource source = new DOMSource(doc);
+                StreamResult resultXML = new StreamResult(new FileOutputStream(getStateFileName()));
+                TransformerFactory transFactory = TransformerFactory.newInstance();
+                Transformer transformer = transFactory.newTransformer();
+                transformer.setOutputProperty(OutputKeys.INDENT, "yes"); //$NON-NLS-1$
+                transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "2"); //$NON-NLS-1$ //$NON-NLS-2$
+                transformer.transform(source, resultXML);
+            } else if ((this.stateLocationPath != null) && stateFileExists()) {
+                // delete current registry file is all servers have been deleted
+                new File(getStateFileName()).delete();
+            }
+        } catch (Exception e) {
+            // TODO log
         }
 
-        // do nothing of there is no save location
         return Status.OK_STATUS;
     }
 
+    /**
+     * @return <code>true</code> if the state file already exists
+     * @since 0.6
+     */
+    private boolean stateFileExists() {
+        return new File(getStateFileName()).exists();
+    }
+
+    // ===========================================================================================================================
+    // Methods
+    // ===========================================================================================================================
+
+    public static void main( String[] args ) {
+        ServerManager mgr = new ServerManager("/home/dan"); //$NON-NLS-1$
+
+        // populate registry
+        if (mgr.servers.isEmpty()) {
+            for (int i = 0; i < 10; ++i) {
+                mgr.addServer(new Server("http://server" + i + ".com", "user" + i, "password" + i)); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
+            }
+        }
+        
+        mgr.saveState();
+    }
+
 }

Added: branches/eclipse/org.jboss.dna.publish/src/org/jboss/dna/publish/Status.java
===================================================================
--- branches/eclipse/org.jboss.dna.publish/src/org/jboss/dna/publish/Status.java	                        (rev 0)
+++ branches/eclipse/org.jboss.dna.publish/src/org/jboss/dna/publish/Status.java	2009-06-22 21:28:39 UTC (rev 1060)
@@ -0,0 +1,198 @@
+/*
+ * 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.publish;
+
+/**
+ * @author Dan Florian
+ * @since 0.6
+ */
+public class Status {
+
+    // ===========================================================================================================================
+    // Constants
+    // ===========================================================================================================================
+
+    /**
+     * The status severity levels.
+     * 
+     * @since 0.6
+     */
+    public enum Severity {
+        /**
+         * Indicates an error status.
+         * 
+         * @since 0.6
+         */
+        ERROR,
+
+        /**
+         * Indicates an informational status.
+         * 
+         * @since 0.6
+         */
+        INFO,
+
+        /**
+         * Indicates an OK status.
+         * 
+         * @since 0.6
+         */
+        OK,
+
+        /**
+         * Indicates an unknown status. This is automatically assigned if status is constructed with a <code>null</code> severity.
+         * 
+         * @since 0.6
+         */
+        UNKNOWN,
+
+        /**
+         * Indicates a warning status.
+         * 
+         * @since 0.6
+         */
+        WARNING
+    }
+
+    /**
+     * A status with an OK severity and no message and no exception.
+     * 
+     * @see Severity#OK
+     * @since 0.6
+     */
+    public static final Status OK_STATUS = new Status(Severity.OK, null, null);
+
+    // ===========================================================================================================================
+    // Fields
+    // ===========================================================================================================================
+
+    /**
+     * The exception of this status or <code>null</code>.
+     * 
+     * @since 0.6
+     */
+    private final Throwable exception;
+
+    /**
+     * The localized message of this status (never <code>null</code>).
+     * 
+     * @since 0.6
+     */
+    private final String message;
+
+    /**
+     * The severity level of this status.
+     * 
+     * @since 0.6
+     */
+    private final Severity severity;
+
+    // ===========================================================================================================================
+    // Constructors
+    // ===========================================================================================================================
+
+    /**
+     * @param severity the status severity (<code>null</code> will be converted to {@link Severity#UNKNOWN}.
+     * @param message the status message or <code>null</code>
+     * @param exception the status exception or <code>null</code>
+     * @since 0.6
+     */
+    public Status( Severity severity,
+                   String message,
+                   Throwable exception ) {
+        this.severity = ((severity == null) ? Severity.UNKNOWN : severity);
+        this.message = message;
+        this.exception = exception;
+    }
+
+    // ===========================================================================================================================
+    // Methods
+    // ===========================================================================================================================
+
+    /**
+     * @return the status exception (may be <code>null</code>)
+     * @since 0.6
+     */
+    public Throwable getException() {
+        return this.exception;
+    }
+
+    /**
+     * @return the status message (never <code>null</code> but can be empty)
+     * @since 0.6
+     */
+    public String getMessage() {
+        return ((this.message == null) ? "" : this.message); //$NON-NLS-1$
+    }
+
+    /**
+     * @return <code>true</code> if the status is an error
+     * @see Severity#ERROR
+     * @since 0.6
+     */
+    public boolean isError() {
+        return (this.severity == Severity.ERROR);
+    }
+
+    /**
+     * @return <code>true</code> if the status is an info
+     * @see Severity#INFO
+     * @since 0.6
+     */
+    public boolean isInfo() {
+        return (this.severity == Severity.INFO);
+    }
+
+    /**
+     * @return <code>true</code> if the status is OK
+     * @see Severity#OK
+     * @since 0.6
+     */
+    public boolean isOk() {
+        return (this.severity == Severity.OK);
+    }
+
+    /**
+     * @return <code>true</code> if the status is a warning
+     * @see Severity#WARNING
+     * @since 0.6
+     */
+    public boolean isWarning() {
+        return (this.severity == Severity.WARNING);
+    }
+
+    /**
+     * {@inheritDoc}
+     * 
+     * @see java.lang.Object#toString()
+     * @since 0.6
+     */
+    @Override
+    public String toString() {
+        StringBuilder txt = new StringBuilder("Status "); //$NON-NLS-1$
+        txt.append(this.severity.toString()).append(": ").append(getMessage()).append(": ").append(getException()); //$NON-NLS-1$ //$NON-NLS-2$
+        return txt.toString();
+    }
+
+}


Property changes on: branches/eclipse/org.jboss.dna.publish/src/org/jboss/dna/publish/Status.java
___________________________________________________________________
Name: svn:mime-type
   + text/plain

Deleted: branches/eclipse/org.jboss.dna.publish/src/org/jboss/dna/publish/actions/PublishAction.java
===================================================================
--- branches/eclipse/org.jboss.dna.publish/src/org/jboss/dna/publish/actions/PublishAction.java	2009-06-22 16:50:22 UTC (rev 1059)
+++ branches/eclipse/org.jboss.dna.publish/src/org/jboss/dna/publish/actions/PublishAction.java	2009-06-22 21:28:39 UTC (rev 1060)
@@ -1,78 +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.publish.actions;
-
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.ui.IObjectActionDelegate;
-import org.eclipse.ui.IWorkbenchPart;
-
-/**
- * The PublishAction controls the publishing of one or more {@link org.eclipse.core.resources.IResource}s to a DNA repository.
- * 
- * @author Dan Florian
- * @since 0.6
- */
-public final class PublishAction implements IObjectActionDelegate {
-
-    /**
-     * The active part's Shell.
-     * 
-     * @since 0.6
-     */
-//    private Shell shell;
-
-    /**
-     * {@inheritDoc}
-     * 
-     * @see org.eclipse.ui.IActionDelegate#run(org.eclipse.jface.action.IAction)
-     * @since 0.6
-     */
-    public void run( IAction action ) {
-        // TODO implement
-    }
-
-    /**
-     * {@inheritDoc}
-     * 
-     * @see org.eclipse.ui.IActionDelegate#selectionChanged(org.eclipse.jface.action.IAction,
-     *      org.eclipse.jface.viewers.ISelection)
-     * @since 0.6
-     */
-    public void selectionChanged( IAction action,
-                                  ISelection selection ) {
-    }
-
-    /**
-     * {@inheritDoc}
-     * 
-     * @see org.eclipse.ui.IObjectActionDelegate#setActivePart(org.eclipse.jface.action.IAction, org.eclipse.ui.IWorkbenchPart)
-     * @since 0.6
-     */
-    public void setActivePart( IAction action,
-                               IWorkbenchPart targetPart ) {
-//        this.shell = targetPart.getSite().getShell();
-    }
-
-}

Deleted: branches/eclipse/org.jboss.dna.publish/src/org/jboss/dna/publish/actions/UnpublishAction.java
===================================================================
--- branches/eclipse/org.jboss.dna.publish/src/org/jboss/dna/publish/actions/UnpublishAction.java	2009-06-22 16:50:22 UTC (rev 1059)
+++ branches/eclipse/org.jboss.dna.publish/src/org/jboss/dna/publish/actions/UnpublishAction.java	2009-06-22 21:28:39 UTC (rev 1060)
@@ -1,79 +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.publish.actions;
-
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.ui.IObjectActionDelegate;
-import org.eclipse.ui.IWorkbenchPart;
-
-/**
- * The UnpublishAction controls the unpublishing of on or more {@link org.eclipse.core.resources.IResource}s from a DNA
- * repository.
- * 
- * @author Dan Florian
- * @since 0.6
- */
-public final class UnpublishAction implements IObjectActionDelegate {
-
-    /**
-     * The active part's Shell.
-     * 
-     * @since 0.6
-     */
-//    private Shell shell;
-
-    /**
-     * {@inheritDoc}
-     * 
-     * @see org.eclipse.ui.IActionDelegate#run(org.eclipse.jface.action.IAction)
-     * @since 0.6
-     */
-    public void run( IAction action ) {
-        // TODO implement
-    }
-
-    /**
-     * {@inheritDoc}
-     * 
-     * @see org.eclipse.ui.IActionDelegate#selectionChanged(org.eclipse.jface.action.IAction,
-     *      org.eclipse.jface.viewers.ISelection)
-     * @since 0.6
-     */
-    public void selectionChanged( IAction action,
-                                  ISelection selection ) {
-    }
-
-    /**
-     * {@inheritDoc}
-     * 
-     * @see org.eclipse.ui.IObjectActionDelegate#setActivePart(org.eclipse.jface.action.IAction, org.eclipse.ui.IWorkbenchPart)
-     * @since 0.6
-     */
-    public void setActivePart( IAction action,
-                               IWorkbenchPart targetPart ) {
-//        this.shell = targetPart.getSite().getShell();
-    }
-
-}

Modified: branches/eclipse/org.jboss.dna.publish/src/org/jboss/dna/publish/domain/Repository.java
===================================================================
--- branches/eclipse/org.jboss.dna.publish/src/org/jboss/dna/publish/domain/Repository.java	2009-06-22 16:50:22 UTC (rev 1059)
+++ branches/eclipse/org.jboss.dna.publish/src/org/jboss/dna/publish/domain/Repository.java	2009-06-22 21:28:39 UTC (rev 1060)
@@ -23,12 +23,14 @@
  */
 package org.jboss.dna.publish.domain;
 
+import java.text.MessageFormat;
 import java.util.Arrays;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.List;
-import org.eclipse.osgi.util.NLS;
-import org.jboss.dna.publish.I18n;
+import org.jboss.dna.publish.IConstants;
+import org.jboss.dna.publish.Status;
+import org.jboss.dna.publish.domain.validation.RepositoryValidator;
 
 /**
  * The Repository class is the business object for a DNA repository.
@@ -36,34 +38,9 @@
  * @author Dan Florian
  * @since 0.6
  */
-public final class Repository implements IDnaObject {
+public final class Repository implements IConstants, IDnaObject {
 
     // ===========================================================================================================================
-    // Class Methods
-    // ===========================================================================================================================
-
-    /**
-     * This method validates a proposed name and should be called before constructing a {@link Repository}.
-     * 
-     * @param proposedName the name being validated
-     * @return <code>true</code> if the name is valid
-     * @since 0.6
-     */
-    public static boolean validateName( String proposedName ) {
-        return ((proposedName != null) && (proposedName.length() != 0));
-    }
-
-    /**
-     * This method validates a proposed {@link Server server} and should be called before constructing a {@link Repository}.
-     * 
-     * @param proposedServer the server being tested
-     * @return <code>true</code> if the server is valid
-     */
-    public static boolean validateServer( Server proposedServer ) {
-        return (proposedServer != null);
-    }
-
-    // ===========================================================================================================================
     // Fields
     // ===========================================================================================================================
 
@@ -92,23 +69,20 @@
      * 
      * @param name the repository name
      * @param server the server where this repository resides
-     * @see #validateName(String)
-     * @see #validateServer(Server)
+     * @see RepositoryValidator
      * @throws RuntimeException if any of the input parameters are invalid
      * @since 0.6
      */
     public Repository( String name,
                        Server server ) {
-        // validate inputs first
-        if (!validateName(name)) {
-            throw new RuntimeException(NLS.bind(I18n.RepositoryInvalidNameMsg, name));
+        // validate inputs
+        Status status = RepositoryValidator.isValid(name, server);
+        
+        if (status.isError()) {
+            throw new RuntimeException(status.getMessage(), status.getException());
         }
 
-        if (!validateServer(server)) {
-            throw new RuntimeException(I18n.RepositoryInvalidServerMsg);
-        }
-
-        // OK to construct
+        // valid so construct
         this.name = name;
         this.server = server;
     }
@@ -185,7 +159,8 @@
      */
     @Override
     public String getShortDescription() {
-        return NLS.bind(I18n.RepositoryShortDescription, this.name, this.server.getShortDescription());
+        String pattern = MESSAGES.getString(RepositoryShortDescription);
+        return MessageFormat.format(pattern, this.name, this.server.getShortDescription());
     }
 
     /**
@@ -193,7 +168,7 @@
      * @since 0.6
      */
     public Collection<Workspace> getWorkspaces() {
-        // TODO implement
+        // TODO implement getWorkspaces()
         return Collections.emptyList();
     }
 

Modified: branches/eclipse/org.jboss.dna.publish/src/org/jboss/dna/publish/domain/Server.java
===================================================================
--- branches/eclipse/org.jboss.dna.publish/src/org/jboss/dna/publish/domain/Server.java	2009-06-22 16:50:22 UTC (rev 1059)
+++ branches/eclipse/org.jboss.dna.publish/src/org/jboss/dna/publish/domain/Server.java	2009-06-22 21:28:39 UTC (rev 1060)
@@ -23,12 +23,16 @@
  */
 package org.jboss.dna.publish.domain;
 
+import java.text.MessageFormat;
 import java.util.Arrays;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.List;
-import org.eclipse.osgi.util.NLS;
-import org.jboss.dna.publish.I18n;
+import org.jboss.dna.publish.IConstants;
+import org.jboss.dna.publish.ServerManager;
+import org.jboss.dna.publish.Status;
+import org.jboss.dna.publish.domain.validation.RepositoryValidator;
+import org.jboss.dna.publish.domain.validation.ServerValidator;
 
 /**
  * The Server class is the business object for a server that is hosting one or more DNA repositories.
@@ -36,50 +40,27 @@
  * @author Dan Florian
  * @since 0.6
  */
-public final class Server implements IDnaObject {
+public final class Server implements IConstants, IDnaObject {
 
     // ===========================================================================================================================
-    // Class Methods
+    // Fields
     // ===========================================================================================================================
 
     /**
-     * This method validates a proposed server URL and should be called before constructing a {@link Server}.
+     * The password to use when logging on to the server.
      * 
-     * @param proposedUrl the URL being validated
-     * @return <code>true</code> if the URL is valid
      * @since 0.6
      */
-    public static boolean validateUrl( String proposedUrl ) {
-        return ((proposedUrl != null) && (proposedUrl.length() != 0));
-    }
-
+    private final String password;
+    
     /**
-     * This method validates a proposed server authentication user and should be called before constructing a {@link Server}.
+     * The server manager that manages the server registry.
      * 
-     * @param proposedUser the user being validated
-     * @return <code>true</code> if the user is valid
      * @since 0.6
      */
-    public static boolean validateUser( String proposedUser ) {
-        return ((proposedUser != null) && (proposedUser.length() != 0));
-    }
+    private ServerManager serverManager;
 
     /**
-     * This method validates a proposed server authentication password and should be called before constructing a {@link Server}.
-     * 
-     * @param proposedPassword the password being validated
-     * @return <code>true</code> if the password is valid
-     * @since 0.6
-     */
-    public static boolean validatePassword( String proposedPassword ) {
-        return ((proposedPassword != null) && (proposedPassword.length() != 0));
-    }
-
-    // ===========================================================================================================================
-    // Fields
-    // ===========================================================================================================================
-
-    /**
      * The server URL.
      * 
      * @since 0.6
@@ -93,13 +74,6 @@
      */
     private final String user;
 
-    /**
-     * The password to use when logging on to the server.
-     * 
-     * @since 0.6
-     */
-    private final String pswd;
-
     // ===========================================================================================================================
     // Constructors
     // ===========================================================================================================================
@@ -108,34 +82,26 @@
      * Constructs on new <code>Server</code>.
      * 
      * @param url the server URL
-     * @param user the server authentication user
-     * @param pswd the server authentication password
-     * @see #validateUrl(String)
-     * @see #validateUser(String)
-     * @see #validatePassword(String)
+     * @param user the server user
+     * @param password the server password
+     * @see RepositoryValidator
      * @throws RuntimeException if any of the input parameters are invalid
      * @since 0.6
      */
     public Server( String url,
                    String user,
-                   String pswd ) {
-        // valid inputs first
-        if (!validateUrl(url)) {
-            throw new RuntimeException(NLS.bind(I18n.ServerInvalidUrlMsg, url));
-        }
+                   String password ) {
+        // valid inputs
+        Status status = ServerValidator.isValid(url, user, password);
 
-        if (!validateUrl(user)) {
-            throw new RuntimeException(NLS.bind(I18n.ServerInvalidUserMsg, user));
+        if (status.isError()) {
+            throw new RuntimeException(status.getMessage(), status.getException());
         }
 
-        if (!validateUrl(pswd)) {
-            throw new RuntimeException(NLS.bind(I18n.ServerInvalidPasswordMsg, pswd));
-        }
-
-        // OK to construct
+        // valid so construct
         this.url = url;
         this.user = user;
-        this.pswd = pswd;
+        this.password = password;
     }
 
     // ===========================================================================================================================
@@ -200,7 +166,7 @@
      * @since 0.6
      */
     public String getPassword() {
-        return this.pswd;
+        return this.password;
     }
 
     /**
@@ -208,7 +174,10 @@
      * @since 0.6
      */
     public Collection<Repository> getRepositories() {
-        // TODO implement
+        if (this.serverManager != null) {
+            // TODO implement getRepositories()
+        }
+        
         return Collections.emptyList();
     }
 
@@ -220,7 +189,8 @@
      */
     @Override
     public String getShortDescription() {
-        return NLS.bind(I18n.ServerShortDescription, this.url, this.user);
+        String pattern = MESSAGES.getString(ServerShortDescription);
+        return MessageFormat.format(pattern, this.url, this.user);
     }
 
     /**
@@ -253,4 +223,12 @@
         return hash;
     }
 
+    /**
+     * @param serverManager the server manager (may be <code>null</code>)
+     * @since 0.6
+     */
+    public void setServerManager( ServerManager serverManager ) {
+        this.serverManager = serverManager;
+    }
+
 }

Modified: branches/eclipse/org.jboss.dna.publish/src/org/jboss/dna/publish/domain/Workspace.java
===================================================================
--- branches/eclipse/org.jboss.dna.publish/src/org/jboss/dna/publish/domain/Workspace.java	2009-06-22 16:50:22 UTC (rev 1059)
+++ branches/eclipse/org.jboss.dna.publish/src/org/jboss/dna/publish/domain/Workspace.java	2009-06-22 21:28:39 UTC (rev 1060)
@@ -23,10 +23,12 @@
  */
 package org.jboss.dna.publish.domain;
 
+import java.text.MessageFormat;
 import java.util.Collections;
 import java.util.List;
-import org.eclipse.osgi.util.NLS;
-import org.jboss.dna.publish.I18n;
+import org.jboss.dna.publish.IConstants;
+import org.jboss.dna.publish.Status;
+import org.jboss.dna.publish.domain.validation.WorkspaceValidator;
 
 /**
  * The Workspace class is the business object for a DNA repository workspace.
@@ -34,35 +36,9 @@
  * @author Dan Florian
  * @since 0.6
  */
-public class Workspace implements IDnaObject {
+public final class Workspace implements IConstants, IDnaObject {
 
     // ===========================================================================================================================
-    // Class Methods
-    // ===========================================================================================================================
-
-    /**
-     * This method validates a proposed name and should be called before constructing a {@link Workspace}.
-     * 
-     * @param proposedName the name being validated
-     * @return <code>true</code> if the name is valid
-     * @since 0.6
-     */
-    public static boolean validateName( String proposedName ) {
-        return ((proposedName != null) && (proposedName.length() != 0));
-    }
-
-    /**
-     * This method validates a proposed {@link Repository repository} and should be called before constructing a {@link Workspace}
-     * .
-     * 
-     * @param proposedRepository the repository being tested
-     * @return <code>true</code> if the repository is valid
-     */
-    public static boolean validateRepository( Repository proposedRepository ) {
-        return (proposedRepository != null);
-    }
-
-    // ===========================================================================================================================
     // Fields
     // ===========================================================================================================================
 
@@ -88,24 +64,21 @@
      * Constructs a new <code>Workspace</code>.
      * 
      * @param name the workspace name
-     * @param server the repository where this workspace resides
-     * @see #validateName(String)
-     * @see #validateRepository(Server)
+     * @param repository the repository where this workspace resides
+     * @see WorkspaceValidator
      * @throws RuntimeException if any of the input parameters are invalid
      * @since 0.6
      */
     public Workspace( String name,
                       Repository repository ) {
-        // validate inputs first
-        if (!validateName(name)) {
-            throw new RuntimeException(NLS.bind(I18n.WorkspaceInvalidNameMsg, name));
+        // validate inputs
+        Status status = WorkspaceValidator.isValid(name, repository);
+        
+        if (status.isError()) {
+            throw new RuntimeException(status.getMessage(), status.getException());
         }
 
-        if (!validateRepository(repository)) {
-            throw new RuntimeException(I18n.WorkspaceInvalidRepositoryMsg);
-        }
-
-        // OK to construct
+        // valid so construct
         this.name = name;
         this.repository = repository;
     }
@@ -173,7 +146,22 @@
      */
     @Override
     public String getShortDescription() {
-        return NLS.bind(I18n.WorkspaceShortDescription, this.name, this.repository.getShortDescription());
+        String pattern = MESSAGES.getString(WorkspaceShortDescription);
+        return MessageFormat.format(pattern, this.name, this.repository.getShortDescription());
     }
+    
+    /**
+     * {@inheritDoc}
+     *
+     * @see java.lang.Object#hashCode()
+     * @since 0.6
+     */
+    @Override
+    public int hashCode() {
+        int hash = 7;
+        hash = 31 * hash + this.name.hashCode();
+        hash = 31 * hash + this.repository.hashCode();
+        return hash;
+     }
 
 }

Added: branches/eclipse/org.jboss.dna.publish/src/org/jboss/dna/publish/domain/validation/RepositoryValidator.java
===================================================================
--- branches/eclipse/org.jboss.dna.publish/src/org/jboss/dna/publish/domain/validation/RepositoryValidator.java	                        (rev 0)
+++ branches/eclipse/org.jboss.dna.publish/src/org/jboss/dna/publish/domain/validation/RepositoryValidator.java	2009-06-22 21:28:39 UTC (rev 1060)
@@ -0,0 +1,97 @@
+/*
+ * 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.publish.domain.validation;
+
+import org.jboss.dna.publish.IConstants;
+import org.jboss.dna.publish.Status;
+import org.jboss.dna.publish.Status.Severity;
+import org.jboss.dna.publish.domain.Server;
+
+/**
+ * @author Dan Florian
+ * @since 0.6
+ */
+public final class RepositoryValidator implements IConstants {
+
+    // ===========================================================================================================================
+    // Class Methods
+    // ===========================================================================================================================
+
+    /**
+     * @param name the name being validated
+     * @return a validation status (never <code>null</code>)
+     * @since 0.6
+     */
+    public static Status isNameValid( String name ) {
+        if ((name == null) || (name.length() == 0)) {
+            return new Status(Severity.ERROR, MESSAGES.getString(RepositoryEmptyNameMsg), null);
+        }
+
+        return Status.OK_STATUS;
+    }
+
+    /**
+     * @param server the server being validated
+     * @return a validation status (never <code>null</code>)
+     * @since 0.6
+     */
+    public static Status isServerValid( Server server ) {
+        if (server == null) {
+            return new Status(Severity.ERROR, MESSAGES.getString(RepositoryNullServerMsg), null);
+        }
+
+        return Status.OK_STATUS;
+    }
+
+    /**
+     * @param name the name being validated
+     * @param server the server being validated
+     * @return a validation status (never <code>null</code>)
+     * @since 0.6
+     */
+    public static Status isValid( String name,
+                                  Server server ) {
+        Status status = isNameValid(name);
+
+        if (!status.isError()) {
+            status = isServerValid(server);
+        }
+
+        return status;
+    }
+
+    // ===========================================================================================================================
+    // Constructors
+    // ===========================================================================================================================
+
+    /**
+     * Disallow construction.
+     * 
+     * @since 0.6
+     */
+    private RepositoryValidator() {
+        // nothing to do
+    }
+    
+}


Property changes on: branches/eclipse/org.jboss.dna.publish/src/org/jboss/dna/publish/domain/validation/RepositoryValidator.java
___________________________________________________________________
Name: svn:mime-type
   + text/plain

Added: branches/eclipse/org.jboss.dna.publish/src/org/jboss/dna/publish/domain/validation/ServerValidator.java
===================================================================
--- branches/eclipse/org.jboss.dna.publish/src/org/jboss/dna/publish/domain/validation/ServerValidator.java	                        (rev 0)
+++ branches/eclipse/org.jboss.dna.publish/src/org/jboss/dna/publish/domain/validation/ServerValidator.java	2009-06-22 21:28:39 UTC (rev 1060)
@@ -0,0 +1,152 @@
+/*
+ * 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.publish.domain.validation;
+
+import java.net.URL;
+import java.text.MessageFormat;
+import org.jboss.dna.publish.IConstants;
+import org.jboss.dna.publish.ServerManager;
+import org.jboss.dna.publish.Status;
+import org.jboss.dna.publish.Status.Severity;
+import org.jboss.dna.publish.domain.Server;
+
+/**
+ * @author Dan Florian
+ * @since 0.6
+ */
+public final class ServerValidator implements IConstants {
+
+    // ===========================================================================================================================
+    // Class Methods
+    // ===========================================================================================================================
+
+    /**
+     * @param password the password being validated
+     * @return a validation status (never <code>null</code>)
+     * @since 0.6
+     */
+    public static Status isPasswordValid( String password ) {
+        return Status.OK_STATUS;
+    }
+
+    /**
+     * @param url the URL being validated
+     * @return a validation status (never <code>null</code>)
+     * @since 0.6
+     */
+    public static Status isUrlValid( String url ) {
+        if ((url == null) || (url.length() == 0)) {
+            return new Status(Severity.ERROR, MESSAGES.getString(ServerEmptyUrlMsg), null);
+        }
+
+        try {
+            new URL(url);
+        } catch (Exception e) {
+            String pattern = MESSAGES.getString(ServerInvalidUrlMsg);
+            String msg = MessageFormat.format(pattern, url);
+            return new Status(Severity.ERROR, msg, null);
+        }
+
+        return Status.OK_STATUS;
+    }
+
+    /**
+     * @param user the user being validated
+     * @return a validation status (never <code>null</code>)
+     * @since 0.6
+     */
+    public static Status isUserValid( String user ) {
+        if ((user == null) || (user.length() == 0)) {
+            return new Status(Severity.ERROR, MESSAGES.getString(ServerEmptyUserMsg), null);
+        }
+
+        return Status.OK_STATUS;
+    }
+
+    /**
+     * @param url the URL being validated
+     * @param user the user being validated
+     * @param password the password being validated
+     * @return a validation status (never <code>null</code>)
+     * @since 0.6
+     */
+    public static Status isValid( String url,
+                                  String user,
+                                  String password ) {
+        Status status = isUrlValid(url);
+
+        if (!status.isError()) {
+            status = isUserValid(user);
+
+            if (!status.isError()) {
+                status = isPasswordValid(password);
+            }
+        }
+
+        return status;
+    }
+
+    /**
+     * @param url the URL being validated
+     * @param user the user being validated
+     * @param password the password being validated
+     * @param serverManager the server manager controlling the server registry (may not be <code>null</code>)
+     * @return a validation status (never <code>null</code>)
+     * @see #isValid(String, String, String)
+     * @since 0.6
+     */
+    public static Status isValid( String url,
+                                  String user,
+                                  String password,
+                                  ServerManager serverManager ) {
+        Status status = isValid(url, user, password);
+
+        // make sure a server with the same properties does not exist
+        if (!status.isError()) {
+            Server newServer = new Server(url, user, password);
+
+            if (serverManager.isRegistered(newServer)) {
+                String pattern = MESSAGES.getString(ServerExistsMsg);
+                String msg = MessageFormat.format(pattern, newServer.getShortDescription());
+                status = new Status(Severity.ERROR, msg, null);
+            }
+        }
+
+        return status;
+    }
+
+    // ===========================================================================================================================
+    // Constructors
+    // ===========================================================================================================================
+
+    /**
+     * Disallow construction.
+     * 
+     * @since 0.6
+     */
+    private ServerValidator() {
+        // nothing to do
+    }
+
+}


Property changes on: branches/eclipse/org.jboss.dna.publish/src/org/jboss/dna/publish/domain/validation/ServerValidator.java
___________________________________________________________________
Name: svn:mime-type
   + text/plain

Added: branches/eclipse/org.jboss.dna.publish/src/org/jboss/dna/publish/domain/validation/WorkspaceValidator.java
===================================================================
--- branches/eclipse/org.jboss.dna.publish/src/org/jboss/dna/publish/domain/validation/WorkspaceValidator.java	                        (rev 0)
+++ branches/eclipse/org.jboss.dna.publish/src/org/jboss/dna/publish/domain/validation/WorkspaceValidator.java	2009-06-22 21:28:39 UTC (rev 1060)
@@ -0,0 +1,97 @@
+/*
+ * 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.publish.domain.validation;
+
+import org.jboss.dna.publish.IConstants;
+import org.jboss.dna.publish.Status;
+import org.jboss.dna.publish.Status.Severity;
+import org.jboss.dna.publish.domain.Repository;
+
+/**
+ * @author Dan Florian
+ * @since 0.6
+ */
+public final class WorkspaceValidator implements IConstants {
+
+    // ===========================================================================================================================
+    // Class Methods
+    // ===========================================================================================================================
+
+    /**
+     * @param name the name being validated
+     * @return a validation status (never <code>null</code>)
+     * @since 0.6
+     */
+    public static Status isNameValid( String name ) {
+        if ((name == null) || (name.length() == 0)) {
+            return new Status(Severity.ERROR, MESSAGES.getString(WorkspaceEmptyNameMsg), null);
+        }
+
+        return Status.OK_STATUS;
+    }
+
+    /**
+     * @param repository the repository being validated
+     * @return a validation status (never <code>null</code>)
+     * @since 0.6
+     */
+    public static Status isRepositoryValid( Repository repository ) {
+        if (repository == null) {
+            return new Status(Severity.ERROR, MESSAGES.getString(WorkspaceNullRepositoryMsg), null);
+        }
+
+        return Status.OK_STATUS;
+    }
+
+    /**
+     * @param name the name being validated
+     * @param repository the repository being validated
+     * @return a validation status (never <code>null</code>)
+     * @since 0.6
+     */
+    public static Status isValid( String name,
+                                  Repository repository ) {
+        Status status = isNameValid(name);
+
+        if (!status.isError()) {
+            status = isRepositoryValid(repository);
+        }
+
+        return status;
+    }
+
+    // ===========================================================================================================================
+    // Constructors
+    // ===========================================================================================================================
+
+    /**
+     * Disallow construction.
+     * 
+     * @since 0.6
+     */
+    private WorkspaceValidator() {
+        // nothing to do
+    }
+
+}


Property changes on: branches/eclipse/org.jboss.dna.publish/src/org/jboss/dna/publish/domain/validation/WorkspaceValidator.java
___________________________________________________________________
Name: svn:mime-type
   + text/plain

Deleted: branches/eclipse/org.jboss.dna.publish/src/org/jboss/dna/publish/i18n.properties
===================================================================
--- branches/eclipse/org.jboss.dna.publish/src/org/jboss/dna/publish/i18n.properties	2009-06-22 16:50:22 UTC (rev 1059)
+++ branches/eclipse/org.jboss.dna.publish/src/org/jboss/dna/publish/i18n.properties	2009-06-22 21:28:39 UTC (rev 1060)
@@ -1,35 +0,0 @@
-CollapseActionToolTip = Collapse All
-
-DeleteServerActionText = Delete Server
-DeleteServerActionToolTip = Delete Server
-
-DeleteServerDialogTitle = Confirm Delete Server
-DeleteServerDialogOneServerMessage = Are you sure you want to delete the "{0}" server?
-DeleteServerDialogMultipleServersMessage = Are you sure you want to delete these {0} servers?
-
-EditServerActionText = Edit Server
-EditServerActionToolTip = Edit Server
-
-NewServerActionText = New Server
-NewServerActionToolTip = New Server
-
-RepositoryInvalidNameMsg = The value "{0}" is not a valid repository name
-RepositoryInvalidServerMsg = A repository server cannot be null
-RepositoryShortDescription = DNA Repository: Name: {0}, {1}
-
-ServerDialogEditTitle = Edit Server
-ServerDialogNewTitle = New Server
-ServerDialogPasswordLabel = Password:
-ServerDialogSavePasswordButton = Save password
-ServerDialogSavePasswordLabel = Saved secret data is stored on your computer in a file that's difficult, but not impossible, for an intruder to read.
-ServerDialogUserLabel = User:
-ServerDialogUrlLabel = URL:
-
-ServerShortDescription = DNA Server: URL={0} User={1}
-ServerInvalidPasswordMsg = The value "{0}" is not a valid server authentication password 
-ServerInvalidUrlMsg = The  value "{0}" is not a valid server URL
-ServerInvalidUserMsg = The value "{0}" is not a valid server authentication user
-
-WorkspaceInvalidNameMsg = The value "{0}" is not a valid repository name
-WorkspaceInvalidRepositoryMsg = A workspace repository cannot be null
-WorkspaceShortDescription = DNA Repository Workspace: Name: {0}, {1}

Deleted: branches/eclipse/org.jboss.dna.publish/src/org/jboss/dna/publish/ui/IUiConstants.java
===================================================================
--- branches/eclipse/org.jboss.dna.publish/src/org/jboss/dna/publish/ui/IUiConstants.java	2009-06-22 16:50:22 UTC (rev 1059)
+++ branches/eclipse/org.jboss.dna.publish/src/org/jboss/dna/publish/ui/IUiConstants.java	2009-06-22 21:28:39 UTC (rev 1060)
@@ -1,27 +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.publish.ui;
-
-public interface IUiConstants {
-}

Deleted: branches/eclipse/org.jboss.dna.publish/src/org/jboss/dna/publish/ui/UiUtil.java
===================================================================
--- branches/eclipse/org.jboss.dna.publish/src/org/jboss/dna/publish/ui/UiUtil.java	2009-06-22 16:50:22 UTC (rev 1059)
+++ branches/eclipse/org.jboss.dna.publish/src/org/jboss/dna/publish/ui/UiUtil.java	2009-06-22 21:28:39 UTC (rev 1060)
@@ -1,94 +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.publish.ui;
-
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.jboss.dna.publish.Activator;
-import org.jboss.dna.publish.domain.IDnaObject;
-import org.jboss.dna.publish.domain.Repository;
-import org.jboss.dna.publish.domain.Server;
-import org.jboss.dna.publish.domain.Workspace;
-
-/**
- * @author Dan Florian
- * @since 0.6
- */
-public final class UiUtil {
-    
-    // ===========================================================================================================================
-    // Constants
-    // ===========================================================================================================================
-
-    private static final String ICON_PATH = "icons/full/"; //$NON-NLS-1$
-
-    public static final String OBJ16 = ICON_PATH + "obj16/"; //$NON-NLS-1$
-    
-    private static final String REPOSITORY_IMAGE_PATH = OBJ16 + "repository.gif"; //$NON-NLS-1$
-
-    private static final String SERVER_IMAGE_PATH = OBJ16 + "server.gif"; //$NON-NLS-1$
-
-    private static final String WORKSPACE_IMAGE_PATH = OBJ16 + "workspace.gif"; //$NON-NLS-1$
-
-    // ===========================================================================================================================
-    // Class Methods
-    // ===========================================================================================================================
-
-    /**
-     * @param obj the object whose image is being requested
-     * @return the image or <code>null</code>
-     * @since 0.6
-     */
-    public static ImageDescriptor getImage( Object obj ) {
-        if (obj instanceof Workspace) {
-            return Activator.getImageDescriptor(WORKSPACE_IMAGE_PATH);
-        }
-
-        if (obj instanceof Repository) {
-            return Activator.getImageDescriptor(REPOSITORY_IMAGE_PATH);
-        }
-
-        if (obj instanceof Server) {
-            return Activator.getImageDescriptor(SERVER_IMAGE_PATH);
-        }
-
-        // should have an icon for every business object
-        assert (!(obj instanceof IDnaObject));
-
-        return null;
-    }
-
-    // ===========================================================================================================================
-    // Constructors
-    // ===========================================================================================================================
-
-    /**
-     * Don't allow public construction.
-     * 
-     * @since 0.6
-     */
-    private UiUtil() {
-        // nothing to do
-    }
-
-}

Deleted: branches/eclipse/org.jboss.dna.publish/src/org/jboss/dna/publish/ui/dialogs/DeleteServerDialog.java
===================================================================
--- branches/eclipse/org.jboss.dna.publish/src/org/jboss/dna/publish/ui/dialogs/DeleteServerDialog.java	2009-06-22 16:50:22 UTC (rev 1059)
+++ branches/eclipse/org.jboss.dna.publish/src/org/jboss/dna/publish/ui/dialogs/DeleteServerDialog.java	2009-06-22 21:28:39 UTC (rev 1060)
@@ -1,121 +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.publish.ui.dialogs;
-
-import java.util.Collection;
-import org.eclipse.jface.dialogs.IDialogConstants;
-import org.eclipse.jface.dialogs.MessageDialog;
-import org.eclipse.osgi.util.NLS;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.List;
-import org.eclipse.swt.widgets.Shell;
-import org.jboss.dna.publish.I18n;
-import org.jboss.dna.publish.domain.IDnaObject;
-import org.jboss.dna.publish.domain.Server;
-
-/**
- * The <code>DeleteServerDialog</code> class provides a UI for deleting a {@link org.jboss.dna.publish.domain.Server server}.
- * 
- * @author Dan Florian
- * @since 0.6
- */
-public class DeleteServerDialog extends MessageDialog {
-
-    // ===========================================================================================================================
-    // Fields
-    // ===========================================================================================================================
-
-    /**
-     * Collection of servers which will be deleted.
-     * 
-     * @since 0.6
-     */
-    private final Collection<Server> serversBeingDeleted;
-
-    // ===========================================================================================================================
-    // Constructors
-    // ===========================================================================================================================
-
-    /**
-     * @param parentShell the dialog parent
-     * @param serversBeingDeleted the servers being deleted (may not be <code>null</code>)
-     * @since 0.6
-     */
-    public DeleteServerDialog( Shell parentShell,
-                               Collection<Server> serversBeingDeleted ) {
-        super(parentShell, I18n.DeleteServerDialogTitle, null, null, MessageDialog.QUESTION, new String[] {
-            IDialogConstants.OK_LABEL, IDialogConstants.CANCEL_LABEL}, 0);
-        this.serversBeingDeleted = serversBeingDeleted;
-    }
-
-    // ===========================================================================================================================
-    // Methods
-    // ===========================================================================================================================
-
-    /**
-     * {@inheritDoc}
-     * 
-     * @see org.eclipse.jface.dialogs.MessageDialog#configureShell(org.eclipse.swt.widgets.Shell)
-     * @since 0.6
-     */
-    @Override
-    protected void configureShell( Shell shell ) {
-        super.configureShell(shell);
-
-        // now set title
-        String title;
-
-        if (this.serversBeingDeleted.size() == 1) {
-            IDnaObject server = this.serversBeingDeleted.iterator().next();
-            title = NLS.bind(I18n.DeleteServerDialogOneServerMessage, server.getName());
-        } else {
-            title = NLS.bind(I18n.DeleteServerDialogOneServerMessage, this.serversBeingDeleted.size());
-        }
-
-        shell.setText(title);
-    }
-
-    /**
-     * {@inheritDoc}
-     * 
-     * @see org.eclipse.jface.dialogs.MessageDialog#createCustomArea(org.eclipse.swt.widgets.Composite)
-     * @since 0.6
-     */
-    @Override
-    protected Control createCustomArea( Composite parent ) {
-        if (this.serversBeingDeleted.size() != 1) {
-            List serverList = new List(parent, SWT.NONE);
-            serverList.setBackground(Display.getDefault().getSystemColor(SWT.COLOR_WIDGET_BACKGROUND));
-
-            for (IDnaObject server : this.serversBeingDeleted) {
-                serverList.add(server.getName());
-            }
-        }
-
-        return null;
-    }
-}

Deleted: branches/eclipse/org.jboss.dna.publish/src/org/jboss/dna/publish/ui/dialogs/ServerDialog.java
===================================================================
--- branches/eclipse/org.jboss.dna.publish/src/org/jboss/dna/publish/ui/dialogs/ServerDialog.java	2009-06-22 16:50:22 UTC (rev 1059)
+++ branches/eclipse/org.jboss.dna.publish/src/org/jboss/dna/publish/ui/dialogs/ServerDialog.java	2009-06-22 21:28:39 UTC (rev 1060)
@@ -1,192 +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.publish.ui.dialogs;
-
-import org.eclipse.jface.dialogs.Dialog;
-import org.eclipse.jface.window.Window;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.custom.StyledText;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Group;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Shell;
-import org.jboss.dna.publish.I18n;
-import org.jboss.dna.publish.domain.Server;
-
-/**
- * The <code>EditServerDialog</code> class provides a UI for editing a {@link org.jboss.dna.publish.domain.Server server}'s
- * properties.
- * 
- * @author Dan Florian
- * @since 0.6
- */
-public class ServerDialog extends Dialog {
-
-    // ===========================================================================================================================
-    // Fields
-    // ===========================================================================================================================
-
-    private String pswd;
-
-    private String url;
-
-    private String user;
-
-    // ===========================================================================================================================
-    // Constructors
-    // ===========================================================================================================================
-
-    public ServerDialog( Shell parent ) {
-        super(parent);
-        setShellStyle(getShellStyle() | SWT.RESIZE);
-    }
-
-    public ServerDialog( Shell parent,
-                         Server server ) {
-        this(parent);
-
-        this.url = server.getUrl();
-        this.user = server.getUser();
-        this.pswd = server.getPassword();
-    }
-
-    // ===========================================================================================================================
-    // Methods
-    // ===========================================================================================================================
-
-    /**
-     * {@inheritDoc}
-     * 
-     * @see org.eclipse.jface.dialogs.Dialog#close()
-     */
-    @Override
-    public boolean close() {
-        boolean closed = super.close();
-
-        // make sure if cancel was pressed that the call to get classpath jars does not return anything
-        if (getReturnCode() != Window.OK) {
-            this.pswd = null;
-            this.url = null;
-            this.user = null;
-        }
-
-        return closed;
-    }
-
-    /**
-     * {@inheritDoc}
-     * 
-     * @see org.eclipse.jface.window.Window#configureShell(org.eclipse.swt.widgets.Shell)
-     * @since 0.6
-     */
-    @Override
-    protected void configureShell( Shell shell ) {
-        super.configureShell(shell);
-        shell.setText(this.url == null ? I18n.ServerDialogNewTitle : I18n.ServerDialogEditTitle);
-    }
-
-    private void constructAuthenticationPanel( Composite parent ) {
-        Group pnl = new Group(parent, SWT.NONE);
-        GridLayout layout = new GridLayout(2, false);
-        layout.marginWidth = 0;
-        layout.marginHeight = 0;
-        pnl.setLayout(layout);
-
-        GridData gd = new GridData(SWT.LEFT, SWT.TOP, true, false);
-        pnl.setLayoutData(gd);
-
-        // user row
-        Label lbl = new Label(pnl, SWT.LEFT);
-        lbl.setText(I18n.ServerDialogUserLabel);
-
-        // password row
-        lbl = new Label(pnl, SWT.LEFT);
-        lbl.setText(I18n.ServerDialogPasswordLabel);
-
-        // save password row
-        Button btn = new Button(parent, SWT.CHECK | SWT.LEFT);
-        btn.setText(I18n.ServerDialogSavePasswordButton);
-
-        // save password message row
-        StyledText st = new StyledText(parent, SWT.READ_ONLY | SWT.MULTI | SWT.NO_FOCUS | SWT.WRAP);
-        st.setText(I18n.ServerDialogSavePasswordLabel);
-        st.setBackground(Display.getDefault().getSystemColor(SWT.COLOR_WIDGET_BACKGROUND));
-        st.setCaret(null);
-        gd = new GridData(GridData.FILL_BOTH);
-        gd.grabExcessVerticalSpace = false;
-        gd.horizontalIndent = 4;
-        gd.verticalIndent = 8;
-        st.setLayoutData(gd);
-    }
-
-    private void constructUrlPanel( Composite parent ) {
-        // Composite pnl = new Composite(parent, SWT.NONE);
-
-    }
-
-    /**
-     * {@inheritDoc}
-     * 
-     * @see org.eclipse.jface.dialogs.Dialog#createDialogArea(org.eclipse.swt.widgets.Composite)
-     * @since 0.6
-     */
-    @Override
-    protected Control createDialogArea( Composite parent ) {
-        Composite pnlMain = new Composite(parent, SWT.NONE);
-        constructUrlPanel(parent);
-        constructAuthenticationPanel(parent);
-
-        return pnlMain;
-    }
-
-    /**
-     * @return the server authentication password
-     * @since 0.6
-     */
-    public String getPassword() {
-        return this.pswd;
-    }
-
-    /**
-     * @return the server authentication user
-     * @since 0.6
-     */
-    public String getUser() {
-        return this.user;
-    }
-
-    /**
-     * @return the server URL
-     * @since 0.6
-     */
-    public String getUrl() {
-        return this.url;
-    }
-
-}

Deleted: branches/eclipse/org.jboss.dna.publish/src/org/jboss/dna/publish/ui/views/RepositoryContentProvider.java
===================================================================
--- branches/eclipse/org.jboss.dna.publish/src/org/jboss/dna/publish/ui/views/RepositoryContentProvider.java	2009-06-22 16:50:22 UTC (rev 1059)
+++ branches/eclipse/org.jboss.dna.publish/src/org/jboss/dna/publish/ui/views/RepositoryContentProvider.java	2009-06-22 21:28:39 UTC (rev 1060)
@@ -1,181 +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.publish.ui.views;
-
-import org.eclipse.jface.viewers.ILabelProvider;
-import org.eclipse.jface.viewers.ILabelProviderListener;
-import org.eclipse.jface.viewers.ITreeContentProvider;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.swt.graphics.Image;
-import org.jboss.dna.publish.Activator;
-import org.jboss.dna.publish.domain.IDnaObject;
-
-/**
- * The RepositoryContentProvider is a content and label provider for DNA repositories.
- * 
- * @author Dan Florian
- * @since 0.6
- */
-public final class RepositoryContentProvider implements ITreeContentProvider, ILabelProvider {
-
-    /**
-     * {@inheritDoc}
-     * 
-     * @see org.eclipse.jface.viewers.IBaseLabelProvider#addListener(org.eclipse.jface.viewers.ILabelProviderListener)
-     * @since 0.6
-     */
-    @Override
-    public void addListener( ILabelProviderListener listener ) {
-        // nothing to do
-    }
-
-    /**
-     * {@inheritDoc}
-     * 
-     * @see org.eclipse.jface.viewers.IContentProvider#dispose()
-     * @since 0.6
-     */
-    @Override
-    public void dispose() {
-        // nothing to do
-    }
-
-    /**
-     * {@inheritDoc}
-     * 
-     * @see org.eclipse.jface.viewers.ITreeContentProvider#getChildren(java.lang.Object)
-     * @since 0.6
-     */
-    @Override
-    public Object[] getChildren( Object parentElement ) {
-        if (parentElement instanceof IDnaObject) {
-            return ((IDnaObject)parentElement).getChildren().toArray();
-        }
-
-        // should not happen
-        assert false;
-        return null;
-    }
-
-    /**
-     * {@inheritDoc}
-     * 
-     * @see org.eclipse.jface.viewers.IStructuredContentProvider#getElements(java.lang.Object)
-     * @since 0.6
-     */
-    @Override
-    public Object[] getElements( Object inputElement ) {
-        return Activator.getDefault().getServerManager().getServers().toArray();
-    }
-
-    /**
-     * {@inheritDoc}
-     * 
-     * @see org.eclipse.jface.viewers.ILabelProvider#getImage(java.lang.Object)
-     * @since 0.6
-     */
-    @Override
-    public Image getImage( Object element ) {
-        // TODO implement
-        return null;
-    }
-
-    /**
-     * {@inheritDoc}
-     * 
-     * @see org.eclipse.jface.viewers.ITreeContentProvider#getParent(java.lang.Object)
-     * @since 0.6
-     */
-    @Override
-    public Object getParent( Object element ) {
-        if (element instanceof IDnaObject) {
-            return ((IDnaObject)element).getParent();
-        }
-
-        // should not happen
-        assert false;
-        return null;
-    }
-
-    /**
-     * {@inheritDoc}
-     * 
-     * @see org.eclipse.jface.viewers.ILabelProvider#getText(java.lang.Object)
-     * @since 0.6
-     */
-    @Override
-    public String getText( Object element ) {
-        assert (element instanceof IDnaObject);
-        return ((IDnaObject)element).getName();
-    }
-
-    /**
-     * {@inheritDoc}
-     * 
-     * @see org.eclipse.jface.viewers.ITreeContentProvider#hasChildren(java.lang.Object)
-     * @since 0.6
-     */
-    @Override
-    public boolean hasChildren( Object element ) {
-        return getChildren(element).length > 0;
-    }
-
-    /**
-     * {@inheritDoc}
-     * 
-     * @see org.eclipse.jface.viewers.IContentProvider#inputChanged(org.eclipse.jface.viewers.Viewer, java.lang.Object,
-     *      java.lang.Object)
-     * @since 0.6
-     */
-    @Override
-    public void inputChanged( Viewer viewer,
-                              Object oldInput,
-                              Object newInput ) {
-        // nothing to do
-    }
-
-    /**
-     * {@inheritDoc}
-     * 
-     * @see org.eclipse.jface.viewers.IBaseLabelProvider#isLabelProperty(java.lang.Object, java.lang.String)
-     * @since 0.6
-     */
-    @Override
-    public boolean isLabelProperty( Object element,
-                                    String property ) {
-        return false;
-    }
-
-    /**
-     * {@inheritDoc}
-     * 
-     * @see org.eclipse.jface.viewers.IBaseLabelProvider#removeListener(org.eclipse.jface.viewers.ILabelProviderListener)
-     * @since 0.6
-     */
-    @Override
-    public void removeListener( ILabelProviderListener listener ) {
-        // nothing to do
-    }
-
-}

Deleted: branches/eclipse/org.jboss.dna.publish/src/org/jboss/dna/publish/ui/views/RepositoryView.java
===================================================================
--- branches/eclipse/org.jboss.dna.publish/src/org/jboss/dna/publish/ui/views/RepositoryView.java	2009-06-22 16:50:22 UTC (rev 1059)
+++ branches/eclipse/org.jboss.dna.publish/src/org/jboss/dna/publish/ui/views/RepositoryView.java	2009-06-22 21:28:39 UTC (rev 1060)
@@ -1,256 +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.publish.ui.views;
-
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.action.IToolBarManager;
-import org.eclipse.jface.action.MenuManager;
-import org.eclipse.jface.viewers.ISelectionChangedListener;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
-import org.eclipse.jface.viewers.TreeViewer;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Menu;
-import org.eclipse.ui.part.ViewPart;
-import org.jboss.dna.publish.I18n;
-import org.jboss.dna.publish.domain.IDnaObject;
-import org.jboss.dna.publish.domain.Server;
-
-/**
- * The RepositoryView shows all defined servers and their DNA repositories.
- * 
- * @author Dan Florian
- * @since 0.6
- */
-public final class RepositoryView extends ViewPart {
-
-    // ===========================================================================================================================
-    // Fields
-    // ===========================================================================================================================
-
-    /**
-     * Collapses all tree nodes.
-     * 
-     * @since 0.6
-     */
-    private IAction collapseAllAction;
-
-    /**
-     * Deletes a server.
-     * 
-     * @since 0.6
-     */
-    private IAction deleteAction;
-
-    /**
-     * Edits a server's properties.
-     * 
-     * @since 0.6
-     */
-    private IAction editAction;
-
-    /**
-     * Creates a new server.
-     * 
-     * @since 0.6
-     */
-    private IAction newAction;
-
-    /**
-     * The viewer's content and label provider.
-     * 
-     * @since 0.6
-     */
-    private RepositoryContentProvider provider;
-
-    /**
-     * @since 0.6
-     */
-    private TreeViewer viewer;
-
-    // ===========================================================================================================================
-    // Methods
-    // ===========================================================================================================================
-
-    /**
-     * @since 0.6
-     */
-    private void constructActions() {
-        // the collapse all action is always enabled
-        this.collapseAllAction = new Action() {
-            @Override
-            public void run() {
-                getViewer().collapseAll();
-            }
-        };
-
-        this.collapseAllAction.setToolTipText(I18n.CollapseActionToolTip);
-        this.collapseAllAction.setImageDescriptor(null);
-
-        // the delete action will delete one or more servers
-        this.deleteAction = null;
-        this.deleteAction.setText(I18n.DeleteServerActionText);
-        this.deleteAction.setToolTipText(I18n.DeleteServerActionToolTip);
-        this.deleteAction.setImageDescriptor(null);
-        this.deleteAction.setEnabled(false);
-
-        // the edit action is only enabled when one server is selected
-        this.editAction = null;
-        this.editAction.setText(I18n.EditServerActionText);
-        this.editAction.setToolTipText(I18n.EditServerActionToolTip);
-        this.editAction.setImageDescriptor(null);
-        this.editAction.setEnabled(false);
-
-        // the new server action is always enabled
-        this.newAction = null;
-        this.newAction.setText(I18n.NewServerActionText);
-        this.newAction.setToolTipText(I18n.NewServerActionToolTip);
-        this.newAction.setImageDescriptor(null);
-    }
-
-    /**
-     * @since 0.6
-     */
-    private void constructContextMenu() {
-        MenuManager menuMgr = new MenuManager();
-        menuMgr.add(this.newAction);
-        menuMgr.add(this.editAction);
-        menuMgr.add(this.deleteAction);
-        // menuMgr.setRemoveAllWhenShown(true);
-
-        Menu menu = menuMgr.createContextMenu(this.viewer.getTree());
-        this.viewer.getTree().setMenu(menu);
-        getSite().registerContextMenu(menuMgr, this.viewer);
-    }
-
-    /**
-     * @since 0.6
-     */
-    private void constructToolBar() {
-        IToolBarManager toolBar = getViewSite().getActionBars().getToolBarManager();
-        toolBar.add(this.newAction);
-        toolBar.add(this.editAction);
-        toolBar.add(this.deleteAction);
-        toolBar.add(this.collapseAllAction);
-    }
-
-    /**
-     * @param parent the viewer's parent
-     * @since 0.6
-     */
-    private void constructTreeViewer( Composite parent ) {
-        this.provider = new RepositoryContentProvider();
-        this.viewer = new TreeViewer(parent, SWT.H_SCROLL | SWT.V_SCROLL);
-        this.viewer.setContentProvider(this.provider);
-        this.viewer.setLabelProvider(this.provider);
-        this.viewer.addSelectionChangedListener(new ISelectionChangedListener() {
-
-            /**
-             * {@inheritDoc}
-             * 
-             * @see org.eclipse.jface.viewers.ISelectionChangedListener#selectionChanged(org.eclipse.jface.viewers.SelectionChangedEvent)
-             */
-            @Override
-            public void selectionChanged( SelectionChangedEvent event ) {
-                handleSelectionChanged(event);
-            }
-        });
-    }
-
-    /**
-     * {@inheritDoc}
-     * 
-     * @see org.eclipse.ui.part.WorkbenchPart#createPartControl(org.eclipse.swt.widgets.Composite)
-     * @since 0.6
-     */
-    @Override
-    public void createPartControl( Composite parent ) {
-        constructTreeViewer(parent);
-        constructActions();
-        constructToolBar();
-        constructContextMenu();
-    }
-    
-    /**
-     * @return the tree viewer
-     * @since 0.6
-     */
-    TreeViewer getViewer() {
-        return this.viewer;
-    }
-
-    /**
-     * @param event the event being processed
-     * @since 0.6
-     */
-    void handleSelectionChanged( SelectionChangedEvent event ) {
-        IStructuredSelection selection = (IStructuredSelection)event.getSelection();
-        updateStatusLine(selection);
-        updateActionBars(selection);
-    }
-
-    /**
-     * {@inheritDoc}
-     * 
-     * @see org.eclipse.ui.part.WorkbenchPart#setFocus()
-     * @since 0.6
-     */
-    @Override
-    public void setFocus() {
-        if (!this.viewer.getControl().isDisposed()) {
-            this.viewer.getControl().setFocus();
-        }
-    }
-
-    /**
-     * @param selection the current viewer selection (never <code>null</code>)
-     * @since 0.6
-     */
-    private void updateActionBars( IStructuredSelection selection ) {
-        if (selection.isEmpty()) {
-            this.deleteAction.setEnabled(false);
-            this.editAction.setEnabled(false);
-        } else {
-            assert (selection.size() == 1);
-
-            IDnaObject obj = (IDnaObject)selection.getFirstElement();
-            boolean enable = (obj instanceof Server);
-            this.deleteAction.setEnabled(enable);
-            this.editAction.setEnabled(enable);
-        }
-    }
-
-    /**
-     * @param selection the current viewer selection (never <code>null</code>)
-     * @since 0.6
-     */
-    private void updateStatusLine( IStructuredSelection selection ) {
-        assert (selection.size() < 2);
-
-        String msg = (selection.isEmpty() ? "" : ((IDnaObject)selection.getFirstElement()).getShortDescription()); //$NON-NLS-1$
-        getViewSite().getActionBars().getStatusLineManager().setMessage(msg);
-    }
-}



From dna-commits at lists.jboss.org  Tue Jun 23 14:44:56 2009
From: dna-commits at lists.jboss.org (dna-commits at lists.jboss.org)
Date: Tue, 23 Jun 2009 14:44:56 -0400
Subject: [dna-commits] DNA SVN: r1062 - in
	branches/eclipse/org.jboss.dna.publish.ui.swt: .settings and
	16 other directories.
Message-ID: <E1MJAzI-0007Nn-Lb@committer01.frg.pub.inap.atl.jboss.com>

Author: elvisisking
Date: 2009-06-23 14:44:56 -0400 (Tue, 23 Jun 2009)
New Revision: 1062

Added:
   branches/eclipse/org.jboss.dna.publish.ui.swt/.classpath
   branches/eclipse/org.jboss.dna.publish.ui.swt/.project
   branches/eclipse/org.jboss.dna.publish.ui.swt/.settings/
   branches/eclipse/org.jboss.dna.publish.ui.swt/.settings/org.eclipse.jdt.core.prefs
   branches/eclipse/org.jboss.dna.publish.ui.swt/META-INF/
   branches/eclipse/org.jboss.dna.publish.ui.swt/META-INF/MANIFEST.MF
   branches/eclipse/org.jboss.dna.publish.ui.swt/build.properties
   branches/eclipse/org.jboss.dna.publish.ui.swt/icons/
   branches/eclipse/org.jboss.dna.publish.ui.swt/icons/full/
   branches/eclipse/org.jboss.dna.publish.ui.swt/icons/full/cview16/
   branches/eclipse/org.jboss.dna.publish.ui.swt/icons/full/cview16/repository.gif
   branches/eclipse/org.jboss.dna.publish.ui.swt/icons/full/obj16/
   branches/eclipse/org.jboss.dna.publish.ui.swt/icons/full/obj16/repository.gif
   branches/eclipse/org.jboss.dna.publish.ui.swt/icons/full/obj16/server.gif
   branches/eclipse/org.jboss.dna.publish.ui.swt/icons/full/obj16/workspace.gif
   branches/eclipse/org.jboss.dna.publish.ui.swt/plugin.properties
   branches/eclipse/org.jboss.dna.publish.ui.swt/plugin.xml
   branches/eclipse/org.jboss.dna.publish.ui.swt/slf4j-api-1.5.8-sources.jar
   branches/eclipse/org.jboss.dna.publish.ui.swt/slf4j-api-1.5.8.jar
   branches/eclipse/org.jboss.dna.publish.ui.swt/src/
   branches/eclipse/org.jboss.dna.publish.ui.swt/src/org/
   branches/eclipse/org.jboss.dna.publish.ui.swt/src/org/jboss/
   branches/eclipse/org.jboss.dna.publish.ui.swt/src/org/jboss/dna/
   branches/eclipse/org.jboss.dna.publish.ui.swt/src/org/jboss/dna/publish/
   branches/eclipse/org.jboss.dna.publish.ui.swt/src/org/jboss/dna/publish/ui/
   branches/eclipse/org.jboss.dna.publish.ui.swt/src/org/jboss/dna/publish/ui/swt/
   branches/eclipse/org.jboss.dna.publish.ui.swt/src/org/jboss/dna/publish/ui/swt/Activator.java
   branches/eclipse/org.jboss.dna.publish.ui.swt/src/org/jboss/dna/publish/ui/swt/I18n.java
   branches/eclipse/org.jboss.dna.publish.ui.swt/src/org/jboss/dna/publish/ui/swt/IUiConstants.java
   branches/eclipse/org.jboss.dna.publish.ui.swt/src/org/jboss/dna/publish/ui/swt/actions/
   branches/eclipse/org.jboss.dna.publish.ui.swt/src/org/jboss/dna/publish/ui/swt/actions/PublishAction.java
   branches/eclipse/org.jboss.dna.publish.ui.swt/src/org/jboss/dna/publish/ui/swt/actions/UnpublishAction.java
   branches/eclipse/org.jboss.dna.publish.ui.swt/src/org/jboss/dna/publish/ui/swt/dialogs/
   branches/eclipse/org.jboss.dna.publish.ui.swt/src/org/jboss/dna/publish/ui/swt/dialogs/DeleteServerDialog.java
   branches/eclipse/org.jboss.dna.publish.ui.swt/src/org/jboss/dna/publish/ui/swt/i18n.properties
   branches/eclipse/org.jboss.dna.publish.ui.swt/src/org/jboss/dna/publish/ui/swt/views/
   branches/eclipse/org.jboss.dna.publish.ui.swt/src/org/jboss/dna/publish/ui/swt/views/RepositoryContentProvider.java
   branches/eclipse/org.jboss.dna.publish.ui.swt/src/org/jboss/dna/publish/ui/swt/views/RepositoryView.java
   branches/eclipse/org.jboss.dna.publish.ui.swt/src/org/jboss/dna/publish/ui/swt/wizards/
   branches/eclipse/org.jboss.dna.publish.ui.swt/src/org/jboss/dna/publish/ui/swt/wizards/PublishPage.java
   branches/eclipse/org.jboss.dna.publish.ui.swt/src/org/jboss/dna/publish/ui/swt/wizards/PublishWizard.java
   branches/eclipse/org.jboss.dna.publish.ui.swt/src/org/jboss/dna/publish/ui/swt/wizards/ServerPage.java
   branches/eclipse/org.jboss.dna.publish.ui.swt/src/org/jboss/dna/publish/ui/swt/wizards/ServerWizard.java
Log:


Added: branches/eclipse/org.jboss.dna.publish.ui.swt/.classpath
===================================================================
--- branches/eclipse/org.jboss.dna.publish.ui.swt/.classpath	                        (rev 0)
+++ branches/eclipse/org.jboss.dna.publish.ui.swt/.classpath	2009-06-23 18:44:56 UTC (rev 1062)
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.6"/>
+	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+	<classpathentry kind="src" path="src"/>
+	<classpathentry kind="output" path="bin"/>
+</classpath>


Property changes on: branches/eclipse/org.jboss.dna.publish.ui.swt/.classpath
___________________________________________________________________
Name: svn:mime-type
   + text/plain

Added: branches/eclipse/org.jboss.dna.publish.ui.swt/.project
===================================================================
--- branches/eclipse/org.jboss.dna.publish.ui.swt/.project	                        (rev 0)
+++ branches/eclipse/org.jboss.dna.publish.ui.swt/.project	2009-06-23 18:44:56 UTC (rev 1062)
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>org.jboss.dna.publish.ui.swt.swt</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.jdt.core.javabuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.pde.ManifestBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.pde.SchemaBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.pde.PluginNature</nature>
+		<nature>org.eclipse.jdt.core.javanature</nature>
+	</natures>
+</projectDescription>


Property changes on: branches/eclipse/org.jboss.dna.publish.ui.swt/.project
___________________________________________________________________
Name: svn:mime-type
   + text/plain

Added: branches/eclipse/org.jboss.dna.publish.ui.swt/.settings/org.eclipse.jdt.core.prefs
===================================================================
--- branches/eclipse/org.jboss.dna.publish.ui.swt/.settings/org.eclipse.jdt.core.prefs	                        (rev 0)
+++ branches/eclipse/org.jboss.dna.publish.ui.swt/.settings/org.eclipse.jdt.core.prefs	2009-06-23 18:44:56 UTC (rev 1062)
@@ -0,0 +1,7 @@
+#Wed Jun 17 07:47:51 CDT 2009
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6
+org.eclipse.jdt.core.compiler.compliance=1.6
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.source=1.6


Property changes on: branches/eclipse/org.jboss.dna.publish.ui.swt/.settings/org.eclipse.jdt.core.prefs
___________________________________________________________________
Name: svn:mime-type
   + text/plain

Added: branches/eclipse/org.jboss.dna.publish.ui.swt/META-INF/MANIFEST.MF
===================================================================
--- branches/eclipse/org.jboss.dna.publish.ui.swt/META-INF/MANIFEST.MF	                        (rev 0)
+++ branches/eclipse/org.jboss.dna.publish.ui.swt/META-INF/MANIFEST.MF	2009-06-23 18:44:56 UTC (rev 1062)
@@ -0,0 +1,13 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: %bundleName
+Bundle-SymbolicName: org.jboss.dna.publish.ui.swt;singleton:=true
+Bundle-Version: 1.0.0
+Bundle-Activator: org.jboss.dna.publish.ui.swt.Activator
+Bundle-Vendor: %bundleVendor
+Require-Bundle: org.eclipse.ui,
+ org.eclipse.core.runtime,
+ org.jboss.dna.publish,
+ org.eclipse.core.resources;bundle-version="3.4.2"
+Bundle-RequiredExecutionEnvironment: JavaSE-1.6
+Bundle-ActivationPolicy: lazy


Property changes on: branches/eclipse/org.jboss.dna.publish.ui.swt/META-INF/MANIFEST.MF
___________________________________________________________________
Name: svn:mime-type
   + text/plain

Added: branches/eclipse/org.jboss.dna.publish.ui.swt/build.properties
===================================================================
--- branches/eclipse/org.jboss.dna.publish.ui.swt/build.properties	                        (rev 0)
+++ branches/eclipse/org.jboss.dna.publish.ui.swt/build.properties	2009-06-23 18:44:56 UTC (rev 1062)
@@ -0,0 +1,7 @@
+source.. = src/
+output.. = bin/
+bin.includes = META-INF/,\
+               .,\
+               plugin.properties,\
+               icons/,\
+               plugin.xml


Property changes on: branches/eclipse/org.jboss.dna.publish.ui.swt/build.properties
___________________________________________________________________
Name: svn:mime-type
   + text/plain

Added: branches/eclipse/org.jboss.dna.publish.ui.swt/icons/full/cview16/repository.gif
===================================================================
(Binary files differ)


Property changes on: branches/eclipse/org.jboss.dna.publish.ui.swt/icons/full/cview16/repository.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/eclipse/org.jboss.dna.publish.ui.swt/icons/full/obj16/repository.gif
===================================================================
(Binary files differ)


Property changes on: branches/eclipse/org.jboss.dna.publish.ui.swt/icons/full/obj16/repository.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/eclipse/org.jboss.dna.publish.ui.swt/icons/full/obj16/server.gif
===================================================================
(Binary files differ)


Property changes on: branches/eclipse/org.jboss.dna.publish.ui.swt/icons/full/obj16/server.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/eclipse/org.jboss.dna.publish.ui.swt/icons/full/obj16/workspace.gif
===================================================================
(Binary files differ)


Property changes on: branches/eclipse/org.jboss.dna.publish.ui.swt/icons/full/obj16/workspace.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/eclipse/org.jboss.dna.publish.ui.swt/plugin.properties
===================================================================
--- branches/eclipse/org.jboss.dna.publish.ui.swt/plugin.properties	                        (rev 0)
+++ branches/eclipse/org.jboss.dna.publish.ui.swt/plugin.properties	2009-06-23 18:44:56 UTC (rev 1062)
@@ -0,0 +1,30 @@
+#
+# 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.
+#
+bundleName = DNA Eclipse Publishing UI Plug-in
+bundleVendor = Red Hat, Inc.
+contextMenu.label = DNA
+dnaCategory = DNA
+publishAction.label = Publish
+repositoryView = DNA Repositories
+unpublishAction.label = Unpublish
\ No newline at end of file


Property changes on: branches/eclipse/org.jboss.dna.publish.ui.swt/plugin.properties
___________________________________________________________________
Name: svn:mime-type
   + text/plain

Added: branches/eclipse/org.jboss.dna.publish.ui.swt/plugin.xml
===================================================================
--- branches/eclipse/org.jboss.dna.publish.ui.swt/plugin.xml	                        (rev 0)
+++ branches/eclipse/org.jboss.dna.publish.ui.swt/plugin.xml	2009-06-23 18:44:56 UTC (rev 1062)
@@ -0,0 +1,59 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse version="3.2"?>
+<plugin>
+
+<!-- Define the IResource object contribution actions to all popup menus -->
+   <extension
+         point="org.eclipse.ui.popupMenus">
+      <objectContribution
+            id="org.jboss.dna.publish.iresourcepopupmenucontribution"
+            objectClass="org.eclipse.core.resources.IResource">
+         <menu
+               id="org.jboss.dna.publish.contextMenu"
+               label="%contextMenu.label"
+               path="additions">
+            <separator
+                  name="group1">
+            </separator>
+         </menu>
+         
+         <!-- Unpublish action -->
+         <action
+               id="org.jboss.dna.publish.ui.swt.unpublishAction"
+               label="%unpublishAction.label"
+               class="org.jboss.dna.publish.ui.swt.actions.UnpublishAction"
+               menubarPath="org.jboss.dna.publish.contextMenu/group1"
+               enablesFor="*">
+         </action>
+         
+         <!-- Publish action -->
+         <action
+               id="org.jboss.dna.publish.ui.swt.publishAction"
+               label="%publishAction.label"
+               class="org.jboss.dna.publish.ui.swt.actions.PublishAction"
+               menubarPath="org.jboss.dna.publish.contextMenu/group1"
+               enablesFor="*">
+         </action>
+      </objectContribution>
+   </extension>
+
+<!-- View extensions -->
+   <extension
+         point="org.eclipse.ui.views">
+      <category
+            id="org.jboss.dna"
+            name="%dnaCategory">
+      </category>
+      
+      <!-- Repository view -->
+      <view
+            id="respositoryView"
+            name="%repositoryView"
+            category="org.jboss.dna"
+            class="org.jboss.dna.publish.ui.swt.views.RepositoryView"
+            fastViewWidthRatio="0.25"
+            icon="icons/full/cview16/repository.gif">
+      </view>
+   </extension>
+
+</plugin>


Property changes on: branches/eclipse/org.jboss.dna.publish.ui.swt/plugin.xml
___________________________________________________________________
Name: svn:mime-type
   + text/plain

Added: branches/eclipse/org.jboss.dna.publish.ui.swt/slf4j-api-1.5.8-sources.jar
===================================================================
(Binary files differ)


Property changes on: branches/eclipse/org.jboss.dna.publish.ui.swt/slf4j-api-1.5.8-sources.jar
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/eclipse/org.jboss.dna.publish.ui.swt/slf4j-api-1.5.8.jar
===================================================================
(Binary files differ)


Property changes on: branches/eclipse/org.jboss.dna.publish.ui.swt/slf4j-api-1.5.8.jar
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/eclipse/org.jboss.dna.publish.ui.swt/src/org/jboss/dna/publish/ui/swt/Activator.java
===================================================================
--- branches/eclipse/org.jboss.dna.publish.ui.swt/src/org/jboss/dna/publish/ui/swt/Activator.java	                        (rev 0)
+++ branches/eclipse/org.jboss.dna.publish.ui.swt/src/org/jboss/dna/publish/ui/swt/Activator.java	2009-06-23 18:44:56 UTC (rev 1062)
@@ -0,0 +1,216 @@
+/*
+ * 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.publish.ui.swt;
+
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.ui.plugin.AbstractUIPlugin;
+import org.jboss.dna.publish.ServerManager;
+import org.jboss.dna.publish.domain.IDnaObject;
+import org.jboss.dna.publish.domain.Repository;
+import org.jboss.dna.publish.domain.Server;
+import org.jboss.dna.publish.domain.Workspace;
+import org.osgi.framework.BundleContext;
+
+/**
+ * The activator class controls the plug-in life cycle.
+ * 
+ * @author Dan Florian
+ * @since 0.6
+ */
+public class Activator extends AbstractUIPlugin implements IUiConstants {
+
+    // ===========================================================================================================================
+    // Class Fields
+    // ===========================================================================================================================
+
+    /**
+     * The shared plugin instance.
+     * 
+     * @since 0.6
+     */
+    private static Activator plugin;
+
+    // ===========================================================================================================================
+    // Class Methods
+    // ===========================================================================================================================
+
+    /**
+     * @return the shared instance or <code>null</code> if not constructed
+     * @since 0.6
+     */
+    public static Activator getDefault() {
+        return plugin;
+    }
+
+    // ===========================================================================================================================
+    // Fields
+    // ===========================================================================================================================
+
+    /**
+     * The manager in charge of the server registry.
+     * 
+     * @since 0.6
+     */
+    private ServerManager serverMgr;
+
+    // ===========================================================================================================================
+    // Constructors
+    // ===========================================================================================================================
+
+    /**
+     * Constructs the plugin activator. If constructed outside of Eclipse the {@link #initialize(String)} method must be called to
+     * construct the {@link ServerManager server manager}.
+     * 
+     * @since 0.6
+     */
+    public Activator() {
+        super();
+        plugin = this;
+    }
+
+    // ===========================================================================================================================
+    // Methods
+    // ===========================================================================================================================
+
+    /**
+     * @param object the object whose image is being requested
+     * @return the image or <code>null</code> if not found
+     * @since 0.6
+     */
+    public Image getImage( Object object ) {
+        String key = null;
+
+        if (object instanceof Workspace) {
+            key = WORKSPACE_IMAGE_PATH;
+        } else if (object instanceof Repository) {
+            key = REPOSITORY_IMAGE_PATH;
+        } else if (object instanceof Server) {
+            key = SERVER_IMAGE_PATH;
+        } else if (object instanceof IDnaObject) {
+            // should have an icon for every business object
+            assert false;
+        } else if (object instanceof String) {
+            key = (String)object;
+        }
+
+        if (key != null) {
+            return getImageRegistry().get(key);
+        }
+
+        return null;
+    }
+
+    /**
+     * @param object the object whose image descriptor is being requested
+     * @return the image descriptor or <code>null</code> if not found
+     * @since 0.6
+     */
+    public ImageDescriptor getImageDescriptor( Object object ) {
+        String key = null;
+
+        if (object instanceof Workspace) {
+            key = WORKSPACE_IMAGE_PATH;
+        } else if (object instanceof Repository) {
+            key = REPOSITORY_IMAGE_PATH;
+        } else if (object instanceof Server) {
+            key = SERVER_IMAGE_PATH;
+        } else if (object instanceof IDnaObject) {
+            // should have an icon for every business object
+            assert false;
+        } else if (object instanceof String) {
+            key = (String)object;
+        }
+
+        if (key != null) {
+            return AbstractUIPlugin.imageDescriptorFromPlugin(PLUGIN_ID, ((String)object));
+        }
+
+        return null;
+    }
+
+    /**
+     * @return the server manager or <code>null</code> if activator has not been initialized or started
+     * @see #initialize(String)
+     * @see #start(BundleContext)
+     * @since 0.6
+     */
+    public ServerManager getServerManager() {
+        return this.serverMgr;
+    }
+
+    /**
+     * Performs plugin initialization. One thing it does is initialize the {@link ServerManager server manager}.
+     * <p>
+     * Note: This should <strong>ONLY</strong> be called when the OSGi framework is not running (i.e., {@link BundleContext bundle
+     * context} is <code>null</code>) and should be called instead of calling {@link #start(BundleContext)}.
+     * 
+     * @param stateLocationPath
+     * @since 0.6
+     */
+    public void initialize( String stateLocationPath ) {
+        this.serverMgr = new ServerManager(stateLocationPath);
+    }
+
+    /**
+     * {@inheritDoc}
+     * <p>
+     * If OSGi is not running this does nothing.
+     * 
+     * @see org.eclipse.ui.plugin.AbstractUIPlugin#start(org.osgi.framework.BundleContext)
+     * @since 0.6
+     */
+    @Override
+    public void start( BundleContext context ) throws Exception {
+        if (context != null) {
+            // OSGi is running
+            super.start(context);
+            initialize(plugin.getStateLocation().toFile().getAbsolutePath());
+        }
+    }
+
+    /**
+     * {@inheritDoc}
+     * 
+     * @see org.eclipse.ui.plugin.AbstractUIPlugin#stop(org.osgi.framework.BundleContext)
+     * @since 0.6
+     */
+    @Override
+    public void stop( BundleContext context ) throws Exception {
+        if (this.serverMgr != null) {
+            if (this.serverMgr.saveState().isError()) {
+                // TODO log this
+            }
+
+            this.serverMgr = null;
+        }
+
+        if (context != null) {
+            super.stop(context);
+        }
+
+        plugin = null;
+    }
+
+}


Property changes on: branches/eclipse/org.jboss.dna.publish.ui.swt/src/org/jboss/dna/publish/ui/swt/Activator.java
___________________________________________________________________
Name: svn:mime-type
   + text/plain

Added: branches/eclipse/org.jboss.dna.publish.ui.swt/src/org/jboss/dna/publish/ui/swt/I18n.java
===================================================================
--- branches/eclipse/org.jboss.dna.publish.ui.swt/src/org/jboss/dna/publish/ui/swt/I18n.java	                        (rev 0)
+++ branches/eclipse/org.jboss.dna.publish.ui.swt/src/org/jboss/dna/publish/ui/swt/I18n.java	2009-06-23 18:44:56 UTC (rev 1062)
@@ -0,0 +1,98 @@
+/*
+ * 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.publish.ui.swt;
+
+import org.eclipse.osgi.util.NLS;
+
+/**
+ * The I18n class handles localization messages.
+ * 
+ * @author Dan Florian
+ * @since 0.6
+ */
+public final class I18n extends NLS {
+
+    public static String CollapseActionToolTip;
+
+    public static String DeleteServerActionText;
+    public static String DeleteServerActionToolTip;
+
+    public static String DeleteServerDialogTitle;
+    public static String DeleteServerDialogOneServerMessage;
+    public static String DeleteServerDialogMultipleServersMessage;
+
+    public static String EditServerActionText;
+    public static String EditServerActionToolTip;
+    
+    public static String PublishPagePublishTitle;
+    public static String PublishPageLocationGroupTitle;
+    public static String PublishPageMissingRepositoryStatusMsg;
+    public static String PublishPageMissingServerStatusMsg;
+    public static String PublishPageMissingWorkspaceStatusMsg;
+    public static String PublishPageNoAvailableRepositoriesStatusMsg;
+    public static String PublishPageNoAvailableServersStatusMsg;
+    public static String PublishPageNoAvailableWorkspacesStatusMsg;
+    public static String PublishPageNoResourcesStatusMsg;
+    public static String PublishPagePublishOkStatusMsg;
+    public static String PublishPagePublishResourcesLabel;
+    public static String PublishPageRepositoryLabel;
+    public static String PublishPageRepositoryToolTip;
+    public static String PublishPageServerLabel;
+    public static String PublishPageServerToolTip;
+    public static String PublishPageUnpublishOkStatusMsg;
+    public static String PublishPageUnpublishResourcesLabel;
+    public static String PublishPageUnpublishTitle;
+    public static String PublishPageWorkspaceLabel;
+    public static String PublishPageWorkspacePublishToolTip;
+    public static String PublishPageWorkspaceUnpublishToolTip;
+
+    public static String PublishWizardPublishTitle;
+    public static String PublishWizardUnpublishTitle;
+    
+    public static String ServerPageAuthenticationGroupTitle;
+    public static String ServerPageInvalidServerProperties;
+    public static String ServerPageOkStatusMsg;
+    public static String ServerPagePasswordLabel;
+    public static String ServerPagePasswordToolTip;
+    public static String ServerPageSavePasswordButton;
+    public static String ServerPageSavePasswordLabel;
+    public static String ServerPageSavePasswordToolTip;
+    public static String ServerPageTitle;
+    public static String ServerPageUrlLabel;
+    public static String ServerPageUrlToolTip;
+    public static String ServerPageUserLabel;
+    public static String ServerPageUserToolTip;
+
+    public static String ServerWizardEditServerTitle;
+    public static String ServerWizardNewServerTitle;
+    
+    public static String NewServerActionText;
+    public static String NewServerActionToolTip;
+
+    static {
+        // load message bundle
+        NLS.initializeMessages(I18n.class.getPackage().getName() + ".i18n", I18n.class); //$NON-NLS-1$
+    }
+
+}


Property changes on: branches/eclipse/org.jboss.dna.publish.ui.swt/src/org/jboss/dna/publish/ui/swt/I18n.java
___________________________________________________________________
Name: svn:mime-type
   + text/plain

Added: branches/eclipse/org.jboss.dna.publish.ui.swt/src/org/jboss/dna/publish/ui/swt/IUiConstants.java
===================================================================
--- branches/eclipse/org.jboss.dna.publish.ui.swt/src/org/jboss/dna/publish/ui/swt/IUiConstants.java	                        (rev 0)
+++ branches/eclipse/org.jboss.dna.publish.ui.swt/src/org/jboss/dna/publish/ui/swt/IUiConstants.java	2009-06-23 18:44:56 UTC (rev 1062)
@@ -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.publish.ui.swt;
+
+/**
+ * @author Dan Florian
+ * @since 0.6
+ */
+public interface IUiConstants {
+
+    /**
+     * The Plug-in's identifier.
+     * 
+     * @since 0.6
+     */
+    String PLUGIN_ID = "org.jboss.dna.publish.ui.swt"; //$NON-NLS-1$
+
+    String ICON_PATH = "icons/full/"; //$NON-NLS-1$
+
+    String OBJ16 = ICON_PATH + "obj16/"; //$NON-NLS-1$
+
+    String REPOSITORY_IMAGE_PATH = OBJ16 + "repository.gif"; //$NON-NLS-1$
+
+    String SERVER_IMAGE_PATH = OBJ16 + "server.gif"; //$NON-NLS-1$
+
+    String WORKSPACE_IMAGE_PATH = OBJ16 + "workspace.gif"; //$NON-NLS-1$
+
+}


Property changes on: branches/eclipse/org.jboss.dna.publish.ui.swt/src/org/jboss/dna/publish/ui/swt/IUiConstants.java
___________________________________________________________________
Name: svn:mime-type
   + text/plain

Added: branches/eclipse/org.jboss.dna.publish.ui.swt/src/org/jboss/dna/publish/ui/swt/actions/PublishAction.java
===================================================================
--- branches/eclipse/org.jboss.dna.publish.ui.swt/src/org/jboss/dna/publish/ui/swt/actions/PublishAction.java	                        (rev 0)
+++ branches/eclipse/org.jboss.dna.publish.ui.swt/src/org/jboss/dna/publish/ui/swt/actions/PublishAction.java	2009-06-23 18:44:56 UTC (rev 1062)
@@ -0,0 +1,103 @@
+/*
+ * 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.publish.ui.swt.actions;
+
+import java.util.Iterator;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.ui.IObjectActionDelegate;
+import org.eclipse.ui.IWorkbenchPart;
+
+/**
+ * The PublishAction controls the publishing of one or more {@link org.eclipse.core.resources.IResource}s to a DNA repository.
+ * 
+ * @author Dan Florian
+ * @since 0.6
+ */
+public final class PublishAction implements IObjectActionDelegate {
+
+    // ===========================================================================================================================
+    // Fields
+    // ===========================================================================================================================
+
+    private IStructuredSelection selection;
+
+    /**
+     * The active part's Shell.
+     * 
+     * @since 0.6
+     */
+//    private Shell shell;
+
+    // ===========================================================================================================================
+    // Constants
+    // ===========================================================================================================================
+
+    /**
+     * {@inheritDoc}
+     *
+     * @see org.eclipse.ui.IActionDelegate#run(org.eclipse.jface.action.IAction)
+     * @since 0.6
+     */
+    @Override
+    @SuppressWarnings("unchecked")
+    public void run( IAction action ) {
+        for (Iterator itr = this.selection.iterator(); itr.hasNext();) {
+            // TODO implement run(IAction) - display publish wizard
+            IResource resource = (IResource)itr.next();
+            resource.getFullPath().toFile();
+        }
+    }
+    
+    /**
+     * {@inheritDoc}
+     *
+     * @see org.eclipse.ui.IActionDelegate#selectionChanged(org.eclipse.jface.action.IAction, org.eclipse.jface.viewers.ISelection)
+     * @since 0.6
+     */
+    @Override
+    public void selectionChanged( IAction action,
+                                  ISelection selection ) {
+        if (selection instanceof IStructuredSelection) {
+            this.selection = (IStructuredSelection)selection;
+        } else {
+            this.selection = null;
+        }
+    }
+    
+    /**
+     * {@inheritDoc}
+     * 
+     * @see org.eclipse.ui.IObjectActionDelegate#setActivePart(org.eclipse.jface.action.IAction, org.eclipse.ui.IWorkbenchPart)
+     * @since 0.6
+     */
+    @Override
+    public void setActivePart( IAction action,
+                               IWorkbenchPart targetPart ) {
+//        this.shell = targetPart.getSite().getShell();
+    }
+
+}


Property changes on: branches/eclipse/org.jboss.dna.publish.ui.swt/src/org/jboss/dna/publish/ui/swt/actions/PublishAction.java
___________________________________________________________________
Name: svn:mime-type
   + text/plain

Added: branches/eclipse/org.jboss.dna.publish.ui.swt/src/org/jboss/dna/publish/ui/swt/actions/UnpublishAction.java
===================================================================
--- branches/eclipse/org.jboss.dna.publish.ui.swt/src/org/jboss/dna/publish/ui/swt/actions/UnpublishAction.java	                        (rev 0)
+++ branches/eclipse/org.jboss.dna.publish.ui.swt/src/org/jboss/dna/publish/ui/swt/actions/UnpublishAction.java	2009-06-23 18:44:56 UTC (rev 1062)
@@ -0,0 +1,79 @@
+/*
+ * 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.publish.ui.swt.actions;
+
+import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.ui.IObjectActionDelegate;
+import org.eclipse.ui.IWorkbenchPart;
+
+/**
+ * The UnpublishAction controls the unpublishing of on or more {@link org.eclipse.core.resources.IResource}s from a DNA
+ * repository.
+ * 
+ * @author Dan Florian
+ * @since 0.6
+ */
+public final class UnpublishAction implements IObjectActionDelegate {
+
+    /**
+     * The active part's Shell.
+     * 
+     * @since 0.6
+     */
+//    private Shell shell;
+
+    /**
+     * {@inheritDoc}
+     * 
+     * @see org.eclipse.ui.IActionDelegate#run(org.eclipse.jface.action.IAction)
+     * @since 0.6
+     */
+    public void run( IAction action ) {
+        // TODO implement
+    }
+
+    /**
+     * {@inheritDoc}
+     * 
+     * @see org.eclipse.ui.IActionDelegate#selectionChanged(org.eclipse.jface.action.IAction,
+     *      org.eclipse.jface.viewers.ISelection)
+     * @since 0.6
+     */
+    public void selectionChanged( IAction action,
+                                  ISelection selection ) {
+    }
+
+    /**
+     * {@inheritDoc}
+     * 
+     * @see org.eclipse.ui.IObjectActionDelegate#setActivePart(org.eclipse.jface.action.IAction, org.eclipse.ui.IWorkbenchPart)
+     * @since 0.6
+     */
+    public void setActivePart( IAction action,
+                               IWorkbenchPart targetPart ) {
+//        this.shell = targetPart.getSite().getShell();
+    }
+
+}


Property changes on: branches/eclipse/org.jboss.dna.publish.ui.swt/src/org/jboss/dna/publish/ui/swt/actions/UnpublishAction.java
___________________________________________________________________
Name: svn:mime-type
   + text/plain

Added: branches/eclipse/org.jboss.dna.publish.ui.swt/src/org/jboss/dna/publish/ui/swt/dialogs/DeleteServerDialog.java
===================================================================
--- branches/eclipse/org.jboss.dna.publish.ui.swt/src/org/jboss/dna/publish/ui/swt/dialogs/DeleteServerDialog.java	                        (rev 0)
+++ branches/eclipse/org.jboss.dna.publish.ui.swt/src/org/jboss/dna/publish/ui/swt/dialogs/DeleteServerDialog.java	2009-06-23 18:44:56 UTC (rev 1062)
@@ -0,0 +1,122 @@
+/*
+ * 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.publish.ui.swt.dialogs;
+
+import java.util.Collection;
+import org.eclipse.jface.dialogs.IDialogConstants;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.osgi.util.NLS;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.List;
+import org.eclipse.swt.widgets.Shell;
+import org.jboss.dna.publish.domain.IDnaObject;
+import org.jboss.dna.publish.domain.Server;
+import org.jboss.dna.publish.ui.swt.I18n;
+
+/**
+ * The <code>DeleteServerDialog</code> class provides a UI for deleting a {@link org.jboss.dna.publish.domain.Server server}.
+ * 
+ * @author Dan Florian
+ * @since 0.6
+ */
+public class DeleteServerDialog extends MessageDialog {
+
+    // ===========================================================================================================================
+    // Fields
+    // ===========================================================================================================================
+
+    /**
+     * Collection of servers which will be deleted.
+     * 
+     * @since 0.6
+     */
+    private final Collection<Server> serversBeingDeleted;
+
+    // ===========================================================================================================================
+    // Constructors
+    // ===========================================================================================================================
+
+    /**
+     * @param parentShell the dialog parent
+     * @param serversBeingDeleted the servers being deleted (may not be <code>null</code>)
+     * @since 0.6
+     */
+    public DeleteServerDialog( Shell parentShell,
+                               Collection<Server> serversBeingDeleted ) {
+        super(parentShell, I18n.DeleteServerDialogTitle, null, null, MessageDialog.QUESTION, new String[] {
+            IDialogConstants.OK_LABEL, IDialogConstants.CANCEL_LABEL}, 0);
+        this.serversBeingDeleted = serversBeingDeleted;
+    }
+
+    // ===========================================================================================================================
+    // Methods
+    // ===========================================================================================================================
+
+    /**
+     * {@inheritDoc}
+     * 
+     * @see org.eclipse.jface.dialogs.MessageDialog#configureShell(org.eclipse.swt.widgets.Shell)
+     * @since 0.6
+     */
+    @Override
+    protected void configureShell( Shell shell ) {
+        super.configureShell(shell);
+
+        // now set title
+        String title;
+
+        if (this.serversBeingDeleted.size() == 1) {
+            IDnaObject server = this.serversBeingDeleted.iterator().next();
+            title = NLS.bind(I18n.DeleteServerDialogOneServerMessage, server.getName());
+        } else {
+            title = NLS.bind(I18n.DeleteServerDialogOneServerMessage, this.serversBeingDeleted.size());
+        }
+
+        shell.setText(title);
+    }
+
+    /**
+     * {@inheritDoc}
+     * 
+     * @see org.eclipse.jface.dialogs.MessageDialog#createCustomArea(org.eclipse.swt.widgets.Composite)
+     * @since 0.6
+     */
+    @Override
+    protected Control createCustomArea( Composite parent ) {
+        if (this.serversBeingDeleted.size() != 1) {
+            List serverList = new List(parent, SWT.NONE);
+            serverList.setBackground(Display.getDefault().getSystemColor(SWT.COLOR_WIDGET_BACKGROUND));
+
+            for (IDnaObject server : this.serversBeingDeleted) {
+                serverList.add(server.getName());
+            }
+        }
+
+        return null;
+    }
+
+}


Property changes on: branches/eclipse/org.jboss.dna.publish.ui.swt/src/org/jboss/dna/publish/ui/swt/dialogs/DeleteServerDialog.java
___________________________________________________________________
Name: svn:mime-type
   + text/plain

Added: branches/eclipse/org.jboss.dna.publish.ui.swt/src/org/jboss/dna/publish/ui/swt/i18n.properties
===================================================================
--- branches/eclipse/org.jboss.dna.publish.ui.swt/src/org/jboss/dna/publish/ui/swt/i18n.properties	                        (rev 0)
+++ branches/eclipse/org.jboss.dna.publish.ui.swt/src/org/jboss/dna/publish/ui/swt/i18n.properties	2009-06-23 18:44:56 UTC (rev 1062)
@@ -0,0 +1,56 @@
+CollapseActionToolTip = Collapse All
+
+DeleteServerActionText = Delete Server
+DeleteServerActionToolTip = Delete Server
+
+DeleteServerDialogTitle = Confirm Delete Server
+DeleteServerDialogOneServerMessage = Are you sure you want to delete the "{0}" server?
+DeleteServerDialogMultipleServersMessage = Are you sure you want to delete these {0} servers?
+
+EditServerActionText = Edit Server
+EditServerActionToolTip = Edit Server
+
+NewServerActionText = New Server
+NewServerActionToolTip = New Server
+
+PublishPagePublishTitle = Publish the selected resources
+PublishPageLocationGroupTitle = Location
+PublishPageMissingRepositoryStatusMsg = A repository must be selected
+PublishPageMissingServerStatusMsg = A server must be selected
+PublishPageMissingWorkspaceStatusMsg = A workspace must be selected
+PublishPageNoAvailableRepositoriesStatusMsg = There are no repositories available on that server
+PublishPageNoAvailableServersStatusMsg = A server must be created first
+PublishPageNoAvailableWorkspacesStatusMsg = There are no workspaces availabe on that server and repository
+PublishPageNoResourcesStatusMsg = You must select one or more workspace resources
+PublishPagePublishOkStatusMsg = Choose the server, repository, and workspace where the selected resources will be published.
+PublishPagePublishResourcesLabel = These resources will be published to the specified DNA repository:
+PublishPageRepositoryLabel = Repository:
+PublishPageRepositoryToolTip = The repository where the workspace is located
+PublishPageServerLabel = Server:
+PublishPageServerToolTip = The server where the repository is located
+PublishPageUnpublishOkStatusMsg = Choose the server, repository, and workspace where the selected resources will be unpublished.
+PublishPageUnpublishResourcesLabel = These resources will be unpublished from the specified DNA repository:
+PublishPageUnpublishTitle = Unpublish the selected resources
+PublishPageWorkspaceLabel = Workspace:
+PublishPageWorkspacePublishToolTip = The workspace where the resources are being published
+PublishPageWorkspaceUnpublishToolTip = The workspace where the resources are being unpublished
+
+PublishWizardPublishTitle = Publish
+PublishWizardUnpublishTitle = Unpublish
+
+ServerPageAuthenticationGroupTitle = Authentication
+ServerPageInvalidServerProperties = Cannot construct a server because all server properties are not valid
+ServerPageOkStatusMsg = Define the server information where the DNA repositories are located.
+ServerPagePasswordLabel = Password:
+ServerPagePasswordToolTip = The password used to authenticate the user when connecting to the server
+ServerPageSavePasswordButton = Save password
+ServerPageSavePasswordLabel = Saved secret data is stored on your computer in a file that's difficult, but not impossible, for an intruder to read.
+ServerPageSavePasswordToolTip = Indicates if the clear text password should be stored on the local file system
+ServerPageTitle = Enter Server Information
+ServerPageUrlLabel = URL:
+ServerPageUrlToolTip = The URL used to connect to the server
+ServerPageUserLabel = User:
+ServerPageUserToolTip = The user login used when connecting to the server
+
+ServerWizardEditServerTitle = Edit Server
+ServerWizardNewServerTitle = New Server


Property changes on: branches/eclipse/org.jboss.dna.publish.ui.swt/src/org/jboss/dna/publish/ui/swt/i18n.properties
___________________________________________________________________
Name: svn:mime-type
   + text/plain

Added: branches/eclipse/org.jboss.dna.publish.ui.swt/src/org/jboss/dna/publish/ui/swt/views/RepositoryContentProvider.java
===================================================================
--- branches/eclipse/org.jboss.dna.publish.ui.swt/src/org/jboss/dna/publish/ui/swt/views/RepositoryContentProvider.java	                        (rev 0)
+++ branches/eclipse/org.jboss.dna.publish.ui.swt/src/org/jboss/dna/publish/ui/swt/views/RepositoryContentProvider.java	2009-06-23 18:44:56 UTC (rev 1062)
@@ -0,0 +1,184 @@
+/*
+ * 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.publish.ui.swt.views;
+
+import org.eclipse.jface.viewers.ILabelProvider;
+import org.eclipse.jface.viewers.ILabelProviderListener;
+import org.eclipse.jface.viewers.ITreeContentProvider;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.swt.graphics.Image;
+import org.jboss.dna.publish.domain.IDnaObject;
+import org.jboss.dna.publish.ui.swt.Activator;
+
+/**
+ * The RepositoryContentProvider is a content and label provider for DNA repositories.
+ * 
+ * @author Dan Florian
+ * @since 0.6
+ */
+public final class RepositoryContentProvider implements ITreeContentProvider, ILabelProvider {
+
+    // ===========================================================================================================================
+    // Methods
+    // ===========================================================================================================================
+
+    /**
+     * {@inheritDoc}
+     * 
+     * @see org.eclipse.jface.viewers.IBaseLabelProvider#addListener(org.eclipse.jface.viewers.ILabelProviderListener)
+     * @since 0.6
+     */
+    @Override
+    public void addListener( ILabelProviderListener listener ) {
+        // nothing to do
+    }
+
+    /**
+     * {@inheritDoc}
+     * 
+     * @see org.eclipse.jface.viewers.IContentProvider#dispose()
+     * @since 0.6
+     */
+    @Override
+    public void dispose() {
+        // nothing to do
+    }
+
+    /**
+     * {@inheritDoc}
+     * 
+     * @see org.eclipse.jface.viewers.ITreeContentProvider#getChildren(java.lang.Object)
+     * @since 0.6
+     */
+    @Override
+    public Object[] getChildren( Object parentElement ) {
+        if (parentElement instanceof IDnaObject) {
+            return ((IDnaObject)parentElement).getChildren().toArray();
+        }
+
+        // should not happen
+        assert false;
+        return null;
+    }
+
+    /**
+     * {@inheritDoc}
+     * 
+     * @see org.eclipse.jface.viewers.IStructuredContentProvider#getElements(java.lang.Object)
+     * @since 0.6
+     */
+    @Override
+    public Object[] getElements( Object inputElement ) {
+        return Activator.getDefault().getServerManager().getServers().toArray();
+    }
+
+    /**
+     * {@inheritDoc}
+     * 
+     * @see org.eclipse.jface.viewers.ILabelProvider#getImage(java.lang.Object)
+     * @since 0.6
+     */
+    @Override
+    public Image getImage( Object element ) {
+        return Activator.getDefault().getImage(element);
+    }
+
+    /**
+     * {@inheritDoc}
+     * 
+     * @see org.eclipse.jface.viewers.ITreeContentProvider#getParent(java.lang.Object)
+     * @since 0.6
+     */
+    @Override
+    public Object getParent( Object element ) {
+        if (element instanceof IDnaObject) {
+            return ((IDnaObject)element).getParent();
+        }
+
+        // should not happen
+        assert false;
+        return null;
+    }
+
+    /**
+     * {@inheritDoc}
+     * 
+     * @see org.eclipse.jface.viewers.ILabelProvider#getText(java.lang.Object)
+     * @since 0.6
+     */
+    @Override
+    public String getText( Object element ) {
+        assert (element instanceof IDnaObject);
+        return ((IDnaObject)element).getName();
+    }
+
+    /**
+     * {@inheritDoc}
+     * 
+     * @see org.eclipse.jface.viewers.ITreeContentProvider#hasChildren(java.lang.Object)
+     * @since 0.6
+     */
+    @Override
+    public boolean hasChildren( Object element ) {
+        return getChildren(element).length > 0;
+    }
+
+    /**
+     * {@inheritDoc}
+     * 
+     * @see org.eclipse.jface.viewers.IContentProvider#inputChanged(org.eclipse.jface.viewers.Viewer, java.lang.Object,
+     *      java.lang.Object)
+     * @since 0.6
+     */
+    @Override
+    public void inputChanged( Viewer viewer,
+                              Object oldInput,
+                              Object newInput ) {
+        // nothing to do
+    }
+
+    /**
+     * {@inheritDoc}
+     * 
+     * @see org.eclipse.jface.viewers.IBaseLabelProvider#isLabelProperty(java.lang.Object, java.lang.String)
+     * @since 0.6
+     */
+    @Override
+    public boolean isLabelProperty( Object element,
+                                    String property ) {
+        return false;
+    }
+
+    /**
+     * {@inheritDoc}
+     * 
+     * @see org.eclipse.jface.viewers.IBaseLabelProvider#removeListener(org.eclipse.jface.viewers.ILabelProviderListener)
+     * @since 0.6
+     */
+    @Override
+    public void removeListener( ILabelProviderListener listener ) {
+        // nothing to do
+    }
+
+}


Property changes on: branches/eclipse/org.jboss.dna.publish.ui.swt/src/org/jboss/dna/publish/ui/swt/views/RepositoryContentProvider.java
___________________________________________________________________
Name: svn:mime-type
   + text/plain

Added: branches/eclipse/org.jboss.dna.publish.ui.swt/src/org/jboss/dna/publish/ui/swt/views/RepositoryView.java
===================================================================
--- branches/eclipse/org.jboss.dna.publish.ui.swt/src/org/jboss/dna/publish/ui/swt/views/RepositoryView.java	                        (rev 0)
+++ branches/eclipse/org.jboss.dna.publish.ui.swt/src/org/jboss/dna/publish/ui/swt/views/RepositoryView.java	2009-06-23 18:44:56 UTC (rev 1062)
@@ -0,0 +1,257 @@
+/*
+ * 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.publish.ui.swt.views;
+
+import org.eclipse.jface.action.Action;
+import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.action.IToolBarManager;
+import org.eclipse.jface.action.MenuManager;
+import org.eclipse.jface.viewers.ISelectionChangedListener;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.SelectionChangedEvent;
+import org.eclipse.jface.viewers.TreeViewer;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Menu;
+import org.eclipse.ui.part.ViewPart;
+import org.jboss.dna.publish.domain.IDnaObject;
+import org.jboss.dna.publish.domain.Server;
+import org.jboss.dna.publish.ui.swt.I18n;
+
+/**
+ * The RepositoryView shows all defined servers and their DNA repositories.
+ * 
+ * @author Dan Florian
+ * @since 0.6
+ */
+public final class RepositoryView extends ViewPart {
+
+    // ===========================================================================================================================
+    // Fields
+    // ===========================================================================================================================
+
+    /**
+     * Collapses all tree nodes.
+     * 
+     * @since 0.6
+     */
+    private IAction collapseAllAction;
+
+    /**
+     * Deletes a server.
+     * 
+     * @since 0.6
+     */
+    private IAction deleteAction;
+
+    /**
+     * Edits a server's properties.
+     * 
+     * @since 0.6
+     */
+    private IAction editAction;
+
+    /**
+     * Creates a new server.
+     * 
+     * @since 0.6
+     */
+    private IAction newAction;
+
+    /**
+     * The viewer's content and label provider.
+     * 
+     * @since 0.6
+     */
+    private RepositoryContentProvider provider;
+
+    /**
+     * @since 0.6
+     */
+    private TreeViewer viewer;
+
+    // ===========================================================================================================================
+    // Methods
+    // ===========================================================================================================================
+
+    /**
+     * @since 0.6
+     */
+    private void constructActions() {
+        // the collapse all action is always enabled
+        this.collapseAllAction = new Action() {
+            @Override
+            public void run() {
+                getViewer().collapseAll();
+            }
+        };
+
+        this.collapseAllAction.setToolTipText(I18n.CollapseActionToolTip);
+        this.collapseAllAction.setImageDescriptor(null);
+
+        // the delete action will delete one or more servers
+        this.deleteAction = null;
+        this.deleteAction.setText(I18n.DeleteServerActionText);
+        this.deleteAction.setToolTipText(I18n.DeleteServerActionToolTip);
+        this.deleteAction.setImageDescriptor(null);
+        this.deleteAction.setEnabled(false);
+
+        // the edit action is only enabled when one server is selected
+        this.editAction = null;
+        this.editAction.setText(I18n.EditServerActionText);
+        this.editAction.setToolTipText(I18n.EditServerActionToolTip);
+        this.editAction.setImageDescriptor(null);
+        this.editAction.setEnabled(false);
+
+        // the new server action is always enabled
+        this.newAction = null;
+        this.newAction.setText(I18n.NewServerActionText);
+        this.newAction.setToolTipText(I18n.NewServerActionToolTip);
+        this.newAction.setImageDescriptor(null);
+    }
+
+    /**
+     * @since 0.6
+     */
+    private void constructContextMenu() {
+        MenuManager menuMgr = new MenuManager();
+        menuMgr.add(this.newAction);
+        menuMgr.add(this.editAction);
+        menuMgr.add(this.deleteAction);
+        // menuMgr.setRemoveAllWhenShown(true);
+
+        Menu menu = menuMgr.createContextMenu(this.viewer.getTree());
+        this.viewer.getTree().setMenu(menu);
+        getSite().registerContextMenu(menuMgr, this.viewer);
+    }
+
+    /**
+     * @since 0.6
+     */
+    private void constructToolBar() {
+        IToolBarManager toolBar = getViewSite().getActionBars().getToolBarManager();
+        toolBar.add(this.newAction);
+        toolBar.add(this.editAction);
+        toolBar.add(this.deleteAction);
+        toolBar.add(this.collapseAllAction);
+    }
+
+    /**
+     * @param parent the viewer's parent
+     * @since 0.6
+     */
+    private void constructTreeViewer( Composite parent ) {
+        this.provider = new RepositoryContentProvider();
+        this.viewer = new TreeViewer(parent, SWT.H_SCROLL | SWT.V_SCROLL);
+        this.viewer.setContentProvider(this.provider);
+        this.viewer.setLabelProvider(this.provider);
+        this.viewer.addSelectionChangedListener(new ISelectionChangedListener() {
+
+            /**
+             * {@inheritDoc}
+             * 
+             * @see org.eclipse.jface.viewers.ISelectionChangedListener#selectionChanged(org.eclipse.jface.viewers.SelectionChangedEvent)
+             */
+            @Override
+            public void selectionChanged( SelectionChangedEvent event ) {
+                handleSelectionChanged(event);
+            }
+        });
+    }
+
+    /**
+     * {@inheritDoc}
+     * 
+     * @see org.eclipse.ui.part.WorkbenchPart#createPartControl(org.eclipse.swt.widgets.Composite)
+     * @since 0.6
+     */
+    @Override
+    public void createPartControl( Composite parent ) {
+        constructTreeViewer(parent);
+        constructActions();
+        constructToolBar();
+        constructContextMenu();
+    }
+    
+    /**
+     * @return the tree viewer
+     * @since 0.6
+     */
+    TreeViewer getViewer() {
+        return this.viewer;
+    }
+
+    /**
+     * @param event the event being processed
+     * @since 0.6
+     */
+    void handleSelectionChanged( SelectionChangedEvent event ) {
+        IStructuredSelection selection = (IStructuredSelection)event.getSelection();
+        updateStatusLine(selection);
+        updateActionBars(selection);
+    }
+
+    /**
+     * {@inheritDoc}
+     * 
+     * @see org.eclipse.ui.part.WorkbenchPart#setFocus()
+     * @since 0.6
+     */
+    @Override
+    public void setFocus() {
+        if (!this.viewer.getControl().isDisposed()) {
+            this.viewer.getControl().setFocus();
+        }
+    }
+
+    /**
+     * @param selection the current viewer selection (never <code>null</code>)
+     * @since 0.6
+     */
+    private void updateActionBars( IStructuredSelection selection ) {
+        if (selection.isEmpty()) {
+            this.deleteAction.setEnabled(false);
+            this.editAction.setEnabled(false);
+        } else {
+            assert (selection.size() == 1);
+
+            IDnaObject obj = (IDnaObject)selection.getFirstElement();
+            boolean enable = (obj instanceof Server);
+            this.deleteAction.setEnabled(enable);
+            this.editAction.setEnabled(enable);
+        }
+    }
+
+    /**
+     * @param selection the current viewer selection (never <code>null</code>)
+     * @since 0.6
+     */
+    private void updateStatusLine( IStructuredSelection selection ) {
+        assert (selection.size() < 2);
+
+        String msg = (selection.isEmpty() ? "" : ((IDnaObject)selection.getFirstElement()).getShortDescription()); //$NON-NLS-1$
+        getViewSite().getActionBars().getStatusLineManager().setMessage(msg);
+    }
+
+}


Property changes on: branches/eclipse/org.jboss.dna.publish.ui.swt/src/org/jboss/dna/publish/ui/swt/views/RepositoryView.java
___________________________________________________________________
Name: svn:mime-type
   + text/plain

Added: branches/eclipse/org.jboss.dna.publish.ui.swt/src/org/jboss/dna/publish/ui/swt/wizards/PublishPage.java
===================================================================
--- branches/eclipse/org.jboss.dna.publish.ui.swt/src/org/jboss/dna/publish/ui/swt/wizards/PublishPage.java	                        (rev 0)
+++ branches/eclipse/org.jboss.dna.publish.ui.swt/src/org/jboss/dna/publish/ui/swt/wizards/PublishPage.java	2009-06-23 18:44:56 UTC (rev 1062)
@@ -0,0 +1,415 @@
+/*
+ * 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.publish.ui.swt.wizards;
+
+import java.util.List;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.jface.dialogs.IMessageProvider;
+import org.eclipse.jface.wizard.WizardPage;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.ModifyEvent;
+import org.eclipse.swt.events.ModifyListener;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Combo;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Group;
+import org.eclipse.swt.widgets.Label;
+import org.jboss.dna.publish.Status;
+import org.jboss.dna.publish.Status.Severity;
+import org.jboss.dna.publish.ui.swt.I18n;
+import org.jboss.dna.publish.ui.swt.wizards.PublishWizard.Type;
+
+/**
+ * @author Dan Florian
+ * @since 0.6
+ */
+public final class PublishPage extends WizardPage implements ModifyListener {
+
+    // ===========================================================================================================================
+    // Fields
+    // ===========================================================================================================================
+
+    /**
+     * The repository control.
+     * 
+     * @since 0.6
+     */
+    private Combo cbxRepository;
+
+    /**
+     * The server control.
+     * 
+     * @since 0.6
+     */
+    private Combo cbxServer;
+
+    /**
+     * The workspace control.
+     * 
+     * @since 0.6
+     */
+    private Combo cbxWorkspace;
+
+    /**
+     * Indicates if the resources are being published or unpublished.
+     * 
+     * @since 0.6
+     */
+    private final Type type;
+
+    /**
+     * The repository where the workspace is located.
+     * 
+     * @since 0.6
+     */
+    private String repository;
+
+    /**
+     * The server where the repository is located.
+     * 
+     * @since 0.6
+     */
+    private String server;
+
+    /**
+     * The workspace where the resources are being published/unpublished.
+     * 
+     * @since 0.6
+     */
+    private String workspace;
+
+    /**
+     * The collection of resources being published/unpublished.
+     * 
+     * @since 0.6
+     */
+    private final List<IResource> resources;
+
+    /**
+     * The current validation status.
+     * 
+     * @since 0.6
+     */
+    private Status status;
+
+    // ===========================================================================================================================
+    // Constructors
+    // ===========================================================================================================================
+
+    /**
+     * @param type the publish or unpublish indicator
+     * @param resources the resources being published or unpublished (never <code>null</code>)
+     * @since 0.6
+     */
+    public PublishPage( Type type,
+                        List<IResource> resources ) {
+        super(PublishPage.class.getSimpleName());
+        setTitle((type == Type.PUBLISH) ? I18n.PublishPagePublishTitle : I18n.PublishPageUnpublishTitle);
+
+        this.type = type;
+        this.resources = resources;
+    }
+
+    // ===========================================================================================================================
+    // Methods
+    // ===========================================================================================================================
+
+    private void constructLocationPanel( Composite parent ) {
+        Group pnl = new Group(parent, SWT.NONE);
+        pnl.setText(I18n.PublishPageLocationGroupTitle);
+        pnl.setLayout(new GridLayout(2, false));
+        pnl.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
+
+        { // server row
+            Label lblServer = new Label(pnl, SWT.LEFT);
+            lblServer.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, false, false));
+            lblServer.setText(I18n.PublishPageServerLabel);
+
+            this.cbxServer = new Combo(pnl, SWT.DROP_DOWN | SWT.READ_ONLY);
+            this.cbxServer.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, false));
+            this.cbxServer.setToolTipText(I18n.PublishPageServerToolTip);
+        }
+
+        { // repository row
+            Label lblRepository = new Label(pnl, SWT.LEFT);
+            lblRepository.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, false, false));
+            lblRepository.setText(I18n.PublishPageRepositoryLabel);
+
+            this.cbxRepository = new Combo(pnl, SWT.DROP_DOWN | SWT.READ_ONLY);
+            this.cbxRepository.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, false));
+            this.cbxRepository.setToolTipText(I18n.PublishPageRepositoryToolTip);
+        }
+
+        { // workspace row
+            Label lblWorkspace = new Label(pnl, SWT.LEFT);
+            lblWorkspace.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, false, false));
+            lblWorkspace.setText(I18n.PublishPageWorkspaceLabel);
+
+            this.cbxWorkspace = new Combo(pnl, SWT.DROP_DOWN | SWT.READ_ONLY);
+            this.cbxWorkspace.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, false));
+
+            if (type == Type.PUBLISH) {
+                this.cbxWorkspace.setToolTipText(I18n.PublishPageWorkspacePublishToolTip);
+            } else {
+                this.cbxWorkspace.setToolTipText(I18n.PublishPageWorkspaceUnpublishToolTip);
+            }
+        }
+    }
+
+    private void constructResourcesPanel( Composite parent ) {
+        Composite pnl = new Composite(parent, SWT.NONE);
+        pnl.setLayout(new GridLayout());
+        pnl.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
+
+        Label lbl = new Label(pnl, SWT.LEFT);
+        lbl.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, false, false));
+
+        if (type == Type.PUBLISH) {
+            lbl.setText(I18n.PublishPagePublishResourcesLabel);
+        } else {
+            lbl.setText(I18n.PublishPageUnpublishResourcesLabel);
+        }
+
+        org.eclipse.swt.widgets.List lstResources = new org.eclipse.swt.widgets.List(pnl, SWT.BORDER | SWT.H_SCROLL
+                                                                                          | SWT.V_SCROLL);
+        lstResources.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
+
+        // set initial value
+        // TODO implement load resources
+        String[]  data = new String[20];
+        for (int i = 0; i < 20; ++i) data[i] = "my/resource" + i + ".xmi"; //$NON-NLS-1$ //$NON-NLS-2$
+        lstResources.setItems(data);
+    }
+
+    /**
+     * {@inheritDoc}
+     * 
+     * @see org.eclipse.jface.dialogs.IDialogPage#createControl(org.eclipse.swt.widgets.Composite)
+     */
+    @Override
+    public void createControl( Composite parent ) {
+        Composite pnlMain = new Composite(parent, SWT.NONE);
+        pnlMain.setLayout(new GridLayout());
+        pnlMain.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
+        constructLocationPanel(pnlMain);
+        constructResourcesPanel(pnlMain);
+        setControl(pnlMain);
+
+        loadServers();
+        installLocationListeners();
+    }
+
+    /**
+     * Handler for when the repository control value is modified
+     * 
+     * @since 0.6
+     */
+    void handleRepositoryModified() {
+        this.repository = this.cbxRepository.getText();
+        this.workspace = null;
+
+        // clear loaded workspaces
+        uninstallLocationListeners();
+        this.cbxWorkspace.removeAll();
+        reloadWorkspaces();
+        installLocationListeners();
+
+        updateState();
+    }
+
+    /**
+     * Handler for when the server control value is modified
+     * 
+     * @since 0.6
+     */
+    void handleServerModified() {
+        this.server = this.cbxServer.getText();
+        this.repository = null;
+        this.workspace = null;
+
+        // clear loaded repositories and workspaces
+        uninstallLocationListeners();
+        this.cbxRepository.removeAll();
+        this.cbxWorkspace.removeAll();
+        reloadRepositories();
+        installLocationListeners();
+
+        updateState();
+    }
+
+    /**
+     * Handler for when the workspace control value is modified
+     * 
+     * @since 0.6
+     */
+    void handleWorkspaceModified() {
+        this.workspace = this.cbxWorkspace.getText();
+        updateState();
+    }
+
+    /**
+     * Installs the combobox listeners.
+     * 
+     * @since 0.6
+     */
+    private void installLocationListeners() {
+        this.cbxRepository.addModifyListener(this);
+        this.cbxServer.addModifyListener(this);
+        this.cbxWorkspace.addModifyListener(this);
+    }
+
+    private void loadServers() {
+        // TODO implement loadServers()
+        String[]  data = new String[20];
+        for (int i = 0; i < 20; ++i) data[i] = "server" + i; //$NON-NLS-1$
+        this.cbxServer.setItems(data);
+    }
+
+    /**
+     * {@inheritDoc}
+     * 
+     * @see org.eclipse.swt.events.ModifyListener#modifyText(org.eclipse.swt.events.ModifyEvent)
+     */
+    @Override
+    public void modifyText( ModifyEvent e ) {
+        if (e.widget == this.cbxServer) {
+            handleServerModified();
+        } else if (e.widget == this.cbxRepository) {
+            handleRepositoryModified();
+        } else if (e.widget == this.cbxRepository) {
+            handleWorkspaceModified();
+        } else {
+            // should not happen
+            // TODO log
+        }
+    }
+
+    /**
+     * Reloads the repository combobox based on the newly selected server.
+     * 
+     * @since 0.6
+     */
+    private void reloadRepositories() {
+        // TODO implement reloadRepositories()
+        // if only one repository set it on the combobox
+        // if no repositories ???
+    }
+
+    /**
+     * Reloads the repository combobox based on the newly selected server.
+     * 
+     * @since 0.6
+     */
+    private void reloadWorkspaces() {
+        // TODO implement reloadRepositories()
+        // if only one workspace set it on the combobox
+        // if no workspaces ???
+    }
+
+    /**
+     * {@inheritDoc}
+     * 
+     * @see org.eclipse.jface.dialogs.DialogPage#setVisible(boolean)
+     * @since 0.6
+     */
+    @Override
+    public void setVisible( boolean visible ) {
+        super.setVisible(visible);
+
+        if (visible) {
+            // set initial state
+            validate();
+
+            // set initial message
+            setMessage((type == Type.PUBLISH) ? I18n.PublishPagePublishOkStatusMsg : I18n.PublishPageUnpublishOkStatusMsg);
+        }
+    }
+
+    /**
+     * Uninstalls the combobox listeners.
+     * 
+     * @since 0.6
+     */
+    private void uninstallLocationListeners() {
+        this.cbxRepository.removeModifyListener(this);
+        this.cbxServer.removeModifyListener(this);
+        this.cbxWorkspace.removeModifyListener(this);
+    }
+
+    /**
+     * Updates message, message icon, and OK button enablement based on validation results
+     * 
+     * @since 0.6
+     */
+    private void updateState() {
+        // get the current state
+        validate();
+
+        // update OK/Finish button enablement
+        setPageComplete(!this.status.isError());
+
+        // update page message
+        if (this.status.isError()) {
+            setMessage(this.status.getMessage(), IMessageProvider.ERROR);
+        } else {
+            if (this.status.isWarning()) {
+                setMessage(this.status.getMessage(), IMessageProvider.WARNING);
+            } else if (this.status.isInfo()) {
+                setMessage(this.status.getMessage(), IMessageProvider.INFORMATION);
+            } else {
+                setMessage(I18n.ServerPageOkStatusMsg);
+            }
+        }
+    }
+
+    /**
+     * Validates all inputs and sets the validation status.
+     * 
+     * @since 0.6
+     */
+    private void validate() {
+        String msg = null;
+        Severity severity = Severity.ERROR;
+
+        if (this.resources != null && this.resources.isEmpty()) {
+            // should not happen since action should not enable if nothing selected
+            msg = I18n.PublishPageNoResourcesStatusMsg;
+        } else if (this.server == null) {
+            int count = this.cbxServer.getItemCount();
+            msg = ((count == 0) ? I18n.PublishPageNoAvailableServersStatusMsg : I18n.PublishPageMissingServerStatusMsg);
+        } else if (this.repository == null) {
+            int count = this.cbxRepository.getItemCount();
+            msg = ((count == 0) ? I18n.PublishPageNoAvailableRepositoriesStatusMsg : I18n.PublishPageMissingRepositoryStatusMsg);
+        } else if (this.workspace == null) {
+            int count = this.cbxServer.getItemCount();
+            msg = ((count == 0) ? I18n.PublishPageNoAvailableWorkspacesStatusMsg : I18n.PublishPageMissingWorkspaceStatusMsg);
+        } else {
+            severity = Severity.OK;
+            msg = ((type == Type.PUBLISH) ? I18n.PublishPagePublishOkStatusMsg : I18n.PublishPageUnpublishOkStatusMsg);
+        }
+
+        this.status = new Status(severity, msg, null);
+    }
+}


Property changes on: branches/eclipse/org.jboss.dna.publish.ui.swt/src/org/jboss/dna/publish/ui/swt/wizards/PublishPage.java
___________________________________________________________________
Name: svn:mime-type
   + text/plain

Added: branches/eclipse/org.jboss.dna.publish.ui.swt/src/org/jboss/dna/publish/ui/swt/wizards/PublishWizard.java
===================================================================
--- branches/eclipse/org.jboss.dna.publish.ui.swt/src/org/jboss/dna/publish/ui/swt/wizards/PublishWizard.java	                        (rev 0)
+++ branches/eclipse/org.jboss.dna.publish.ui.swt/src/org/jboss/dna/publish/ui/swt/wizards/PublishWizard.java	2009-06-23 18:44:56 UTC (rev 1062)
@@ -0,0 +1,160 @@
+/*
+ * 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.publish.ui.swt.wizards;
+
+import java.util.List;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.jface.wizard.Wizard;
+import org.eclipse.jface.wizard.WizardDialog;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Shell;
+import org.jboss.dna.publish.ServerManager;
+import org.jboss.dna.publish.ui.swt.I18n;
+
+/**
+ * @author Dan Florian
+ * @since 0.6
+ */
+public final class PublishWizard extends Wizard {
+
+    // ===========================================================================================================================
+    // Constants
+    // ===========================================================================================================================
+
+    /**
+     * The wizard type.
+     * 
+     * @since 0.6
+     */
+    public enum Type {
+        /**
+         * Indicates the wizard will be used to publish.
+         * 
+         * @since 0.6
+         */
+        PUBLISH,
+
+        /**
+         * Indicates the wizard will be used to unpublish.
+         * 
+         * @since 0.6
+         */
+        UNPUBLISH
+    }
+
+    // ===========================================================================================================================
+    // Fields
+    // ===========================================================================================================================
+
+    /**
+     * The wizard page containing all the controls that allow publishing/unpublishing of resources.
+     * 
+     * @since 0.6
+     */
+    private final PublishPage page;
+
+    /**
+     * The manager in charge of the server registry.
+     * 
+     * @since 0.6
+     */
+    private final ServerManager serverManager;
+
+    // ===========================================================================================================================
+    // Constructors
+    // ===========================================================================================================================
+
+    /**
+     * @param type the publishing or unpublishing indicator
+     * @param resources the resources being published or unpublished (never <code>null</code>)
+     * @param serverManager the server manager in charge of the server registry (never <code>null</code>)
+     * @since 0.6
+     */
+    public PublishWizard( Type type,
+                          List<IResource> resources,
+                          ServerManager serverManager ) {
+        this.page = new PublishPage(type, resources);
+        this.serverManager = serverManager;
+        setWindowTitle((type == Type.PUBLISH) ? I18n.PublishWizardPublishTitle : I18n.PublishWizardUnpublishTitle);
+    }
+
+    // ===========================================================================================================================
+    // Methods
+    // ===========================================================================================================================
+
+    /**
+     * {@inheritDoc}
+     * 
+     * @see org.eclipse.jface.wizard.Wizard#addPages()
+     * @since 0.6
+     */
+    @Override
+    public void addPages() {
+        addPage(this.page);
+    }
+
+    /**
+     * @return the server manager (never <code>null</code>)
+     * @since 0.6
+     */
+    protected ServerManager getServerManager() {
+        return this.serverManager;
+    }
+
+    /**
+     * {@inheritDoc}
+     * 
+     * @see org.eclipse.jface.wizard.Wizard#performFinish()
+     * @since 0.6
+     */
+    @Override
+    public boolean performFinish() {
+        // TODO implement performFinish()
+        // Status status = null;
+        return true; //!status.isError();
+    }
+
+    // ===========================================================================================================================
+    // Test UI
+    // ===========================================================================================================================
+
+    public static void main( String[] args ) {
+        Display display = new Display();
+
+        Shell shell = new Shell(display);
+        shell.setText("Shell"); //$NON-NLS-1$
+        shell.setSize(200, 200);
+        shell.open();
+        
+        WizardDialog dialog = new WizardDialog(shell, new PublishWizard(Type.PUBLISH, null, new ServerManager("/home/dan"))); //$NON-NLS-1$
+        dialog.open();
+
+        while (!shell.isDisposed()) {
+            if (!display.readAndDispatch()) display.sleep();
+        }
+
+        display.dispose();
+    }
+
+}


Property changes on: branches/eclipse/org.jboss.dna.publish.ui.swt/src/org/jboss/dna/publish/ui/swt/wizards/PublishWizard.java
___________________________________________________________________
Name: svn:mime-type
   + text/plain

Added: branches/eclipse/org.jboss.dna.publish.ui.swt/src/org/jboss/dna/publish/ui/swt/wizards/ServerPage.java
===================================================================
--- branches/eclipse/org.jboss.dna.publish.ui.swt/src/org/jboss/dna/publish/ui/swt/wizards/ServerPage.java	                        (rev 0)
+++ branches/eclipse/org.jboss.dna.publish.ui.swt/src/org/jboss/dna/publish/ui/swt/wizards/ServerPage.java	2009-06-23 18:44:56 UTC (rev 1062)
@@ -0,0 +1,334 @@
+/*
+ * 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.publish.ui.swt.wizards;
+
+import org.eclipse.jface.dialogs.IMessageProvider;
+import org.eclipse.jface.wizard.WizardPage;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.custom.StyledText;
+import org.eclipse.swt.events.ModifyEvent;
+import org.eclipse.swt.events.ModifyListener;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Group;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Text;
+import org.jboss.dna.publish.ServerManager;
+import org.jboss.dna.publish.Status;
+import org.jboss.dna.publish.domain.Server;
+import org.jboss.dna.publish.domain.validation.ServerValidator;
+import org.jboss.dna.publish.ui.swt.I18n;
+
+/**
+ * @author Dan Florian
+ * @since 0.6
+ */
+public final class ServerPage extends WizardPage {
+
+    // ===========================================================================================================================
+    // Fields
+    // ===========================================================================================================================
+
+    /**
+     * The user password needed to login to the server.
+     * 
+     * @since 0.6
+     */
+    private String password;
+
+    /**
+     * The current validation status.
+     * 
+     * @since 0.6
+     */
+    private Status status;
+
+    /**
+     * The server URL.
+     * 
+     * @since 0.6
+     */
+    private String url;
+
+    /**
+     * The user needed to login to the server.
+     * 
+     * @since 0.6
+     */
+    private String user;
+
+    // ===========================================================================================================================
+    // Constructors
+    // ===========================================================================================================================
+
+    public ServerPage() {
+        super(ServerPage.class.getSimpleName());
+        setTitle(I18n.ServerPageTitle);
+    }
+
+    public ServerPage( Server server ) {
+        super(ServerPage.class.getSimpleName());
+        setTitle(I18n.ServerPageTitle);
+
+        this.url = server.getUrl();
+        this.user = server.getUser();
+        this.password = server.getPassword();
+    }
+
+    // ===========================================================================================================================
+    // Methods
+    // ===========================================================================================================================
+
+    private void constructAuthenticationPanel( Composite parent ) {
+        Group pnl = new Group(parent, SWT.NONE);
+        pnl.setText(I18n.ServerPageAuthenticationGroupTitle);
+        pnl.setLayout(new GridLayout(2, false));
+        pnl.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
+
+        { // user row
+            Label lblUser = new Label(pnl, SWT.LEFT);
+            lblUser.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, false, false));
+            lblUser.setText(I18n.ServerPageUserLabel);
+
+            Text txtUser = new Text(pnl, SWT.BORDER);
+            txtUser.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, false));
+            txtUser.setToolTipText(I18n.ServerPageUserToolTip);
+
+            // set initial value
+            if (this.user != null) {
+                txtUser.setText(this.user);
+            }
+
+            txtUser.addModifyListener(new ModifyListener() {
+                @Override
+                public void modifyText( ModifyEvent e ) {
+                    handleUserModified(((Text)e.widget).getText());
+                }
+            });
+        }
+
+        { // password row
+            Label lblPassword = new Label(pnl, SWT.LEFT);
+            lblPassword.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, false, false));
+            lblPassword.setText(I18n.ServerPagePasswordLabel);
+
+            Text txtPassword = new Text(pnl, SWT.BORDER);
+            txtPassword.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
+            txtPassword.setToolTipText(I18n.ServerPagePasswordToolTip);
+            txtPassword.setEchoChar('*');
+
+            // set initial value
+            if (this.password != null) {
+                txtPassword.setText(this.password);
+            }
+
+            txtPassword.addModifyListener(new ModifyListener() {
+                @Override
+                public void modifyText( ModifyEvent e ) {
+                    handlePasswordModified(((Text)e.widget).getText());
+                }
+            });
+        }
+
+        { // save button row
+            Button btn = new Button(pnl, SWT.CHECK | SWT.LEFT);
+            btn.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, false, false));
+            ((GridData)btn.getLayoutData()).horizontalSpan = 2;
+            btn.setText(I18n.ServerPageSavePasswordButton);
+            btn.setToolTipText(I18n.ServerPageSavePasswordToolTip);
+        }
+
+        { // save password message row
+            Label lblImage = new Label(pnl, SWT.NONE);
+            lblImage.setLayoutData(new GridData(SWT.CENTER, SWT.CENTER, false, false));
+            lblImage.setImage(Display.getDefault().getSystemImage(SWT.ICON_INFORMATION));
+            
+            StyledText st = new StyledText(pnl, SWT.READ_ONLY | SWT.MULTI | SWT.NO_FOCUS | SWT.WRAP);
+            st.setText(I18n.ServerPageSavePasswordLabel);
+            st.setBackground(Display.getDefault().getSystemColor(SWT.COLOR_WIDGET_BACKGROUND));
+            st.setCaret(null);
+            GridData gd = new GridData(SWT.FILL, SWT.CENTER, true, true);
+            gd.grabExcessVerticalSpace = false;
+            gd.horizontalIndent = 4;
+            gd.verticalIndent = 8;
+            gd.widthHint = 100;
+            st.setLayoutData(gd);
+        }
+    }
+
+    private void constructUrlPanel( Composite parent ) {
+        Composite pnl = new Composite(parent, SWT.NONE);
+        pnl.setLayout(new GridLayout(2, false));
+        pnl.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
+
+        Label lblUrl = new Label(pnl, SWT.LEFT);
+        lblUrl.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, false, false));
+        lblUrl.setText(I18n.ServerPageUrlLabel);
+
+        Text txtUrl = new Text(pnl, SWT.BORDER);
+        txtUrl.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
+        txtUrl.setToolTipText(I18n.ServerPageUrlToolTip);
+
+        // set initial value
+        if (this.url != null) {
+            txtUrl.setText(this.url);
+        }
+
+        txtUrl.addModifyListener(new ModifyListener() {
+            @Override
+            public void modifyText( ModifyEvent e ) {
+                handleUrlModified(((Text)e.widget).getText());
+            }
+        });
+    }
+
+    /**
+     * {@inheritDoc}
+     * 
+     * @see org.eclipse.jface.dialogs.IDialogPage#createControl(org.eclipse.swt.widgets.Composite)
+     */
+    @Override
+    public void createControl( Composite parent ) {
+        Composite pnlMain = new Composite(parent, SWT.NONE);
+        pnlMain.setLayout(new GridLayout());
+        pnlMain.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
+        constructUrlPanel(pnlMain);
+        constructAuthenticationPanel(pnlMain);
+        setControl(pnlMain);
+    }
+
+    /**
+     * @return the server represented by the dialog inputs
+     * @throws RuntimeException if called when all inputs are not valid
+     * @see #isPageComplete()
+     * @since 0.6
+     */
+    public Server getServer() {
+        if (!this.status.isError()) {
+            return new Server(this.url, this.user, this.password);
+        }
+
+        // should never be called if error status
+        throw new RuntimeException(I18n.ServerPageInvalidServerProperties);
+    }
+
+    /**
+     * @return the server manager obtained from the wizard
+     * @since 0.6
+     */
+    private ServerManager getServerManager() {
+        return ((ServerWizard)getWizard()).getServerManager();
+    }
+
+    /**
+     * Handler for when the password control value is modified
+     * 
+     * @param newPassword the new password value
+     * @since 0.6
+     */
+    void handlePasswordModified( String newPassword ) {
+        this.password = newPassword;
+        updateState();
+    }
+
+    /**
+     * Handler for when the URL control value is modified
+     * 
+     * @param newUrl the new URL value
+     * @since 0.6
+     */
+    void handleUrlModified( String newUrl ) {
+        this.url = newUrl;
+        updateState();
+    }
+
+    /**
+     * Handler for when the user control value is modified
+     * 
+     * @param newUser the new user value
+     * @since 0.6
+     */
+    void handleUserModified( String newUser ) {
+        this.user = newUser;
+        updateState();
+    }
+
+    /**
+     * {@inheritDoc}
+     * 
+     * @see org.eclipse.jface.dialogs.DialogPage#setVisible(boolean)
+     * @since 0.6
+     */
+    @Override
+    public void setVisible( boolean visible ) {
+        super.setVisible(visible);
+
+        if (visible) {
+           // set initial state
+           validate();
+            
+            // set initial message
+            setMessage(I18n.ServerPageOkStatusMsg);
+        }
+    }
+
+    /**
+     * Updates message, message icon, and OK button enablement based on validation results
+     * 
+     * @since 0.6
+     */
+    private void updateState() {
+        // get the current status
+        validate();
+
+        // update OK/Finish button enablement
+        setPageComplete(!this.status.isError());
+
+        // update message
+        if (this.status.isError()) {
+            setMessage(this.status.getMessage(), IMessageProvider.ERROR);
+        } else {
+            if (this.status.isWarning()) {
+                setMessage(this.status.getMessage(), IMessageProvider.WARNING);
+            } else if (this.status.isInfo()) {
+                setMessage(this.status.getMessage(), IMessageProvider.INFORMATION);
+            } else {
+                setMessage(I18n.ServerPageOkStatusMsg);
+            }
+        }
+    }
+
+    /**
+     * Validates all inputs and sets the validation status.
+     * 
+     * @since 0.6
+     */
+    private void validate() {
+        this.status = ServerValidator.isValid(this.url, this.user, this.password, getServerManager());
+    }
+
+}


Property changes on: branches/eclipse/org.jboss.dna.publish.ui.swt/src/org/jboss/dna/publish/ui/swt/wizards/ServerPage.java
___________________________________________________________________
Name: svn:mime-type
   + text/plain

Added: branches/eclipse/org.jboss.dna.publish.ui.swt/src/org/jboss/dna/publish/ui/swt/wizards/ServerWizard.java
===================================================================
--- branches/eclipse/org.jboss.dna.publish.ui.swt/src/org/jboss/dna/publish/ui/swt/wizards/ServerWizard.java	                        (rev 0)
+++ branches/eclipse/org.jboss.dna.publish.ui.swt/src/org/jboss/dna/publish/ui/swt/wizards/ServerWizard.java	2009-06-23 18:44:56 UTC (rev 1062)
@@ -0,0 +1,144 @@
+/*
+ * 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.publish.ui.swt.wizards;
+
+import org.eclipse.jface.wizard.Wizard;
+import org.eclipse.jface.wizard.WizardDialog;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Shell;
+import org.jboss.dna.publish.ServerManager;
+import org.jboss.dna.publish.Status;
+import org.jboss.dna.publish.domain.Server;
+import org.jboss.dna.publish.ui.swt.I18n;
+
+/**
+ * @author Dan Florian
+ * @since 0.6
+ */
+public final class ServerWizard extends Wizard {
+
+    // ===========================================================================================================================
+    // Fields
+    // ===========================================================================================================================
+
+    /**
+     * The wizard page containing all the controls that allow editing of server properties.
+     * 
+     * @since 0.6
+     */
+    private final ServerPage page;
+
+    /**
+     * The manager in charge of the server registry.
+     * 
+     * @since 0.6
+     */
+    private final ServerManager serverManager;
+
+    // ===========================================================================================================================
+    // Constructors
+    // ===========================================================================================================================
+
+    /**
+     * @param serverManager the server manager in charge of the server registry (never <code>null</code>)
+     * @since 0.6
+     */
+    public ServerWizard( ServerManager serverManager ) {
+        this.page = new ServerPage();
+        this.serverManager = serverManager;
+        setWindowTitle(I18n.ServerWizardNewServerTitle);
+    }
+
+    /**
+     * @param serverManager the server manager in charge of the server registry (never <code>null</code>)
+     * @param server the server whose properties are being edited (never <code>null</code>)
+     * @since 0.6
+     */
+    public ServerWizard( ServerManager serverManager,
+                         Server server ) {
+        this.page = new ServerPage(server);
+        this.serverManager = serverManager;
+        setWindowTitle(I18n.ServerWizardEditServerTitle);
+    }
+
+    // ===========================================================================================================================
+    // Methods
+    // ===========================================================================================================================
+
+    /**
+     * {@inheritDoc}
+     * 
+     * @see org.eclipse.jface.wizard.Wizard#addPages()
+     * @since 0.6
+     */
+    @Override
+    public void addPages() {
+        addPage(this.page);
+    }
+
+    /**
+     * @return the server manager (never <code>null</code>)
+     * @since 0.6
+     */
+    protected ServerManager getServerManager() {
+        return this.serverManager;
+    }
+
+    /**
+     * {@inheritDoc}
+     * 
+     * @see org.eclipse.jface.wizard.Wizard#performFinish()
+     * @since 0.6
+     */
+    @Override
+    public boolean performFinish() {
+        Server server = this.page.getServer();
+        Status status = this.serverManager.addServer(server);
+        return !status.isError();
+    }
+
+    // ===========================================================================================================================
+    // Test UI
+    // ===========================================================================================================================
+
+    public static void main( String[] args ) {
+        Display display = new Display();
+
+        Shell shell = new Shell(display);
+        shell.setText("Shell"); //$NON-NLS-1$
+        shell.setSize(200, 200);
+        shell.open();
+
+        WizardDialog dialog = new WizardDialog(shell, new ServerWizard(new ServerManager("/home/dan"))); //$NON-NLS-1$
+//        WizardDialog dialog = new WizardDialog(shell, new ServerWizard(new ServerManager("/home/dan"), new Server("file:", "user", null)));
+        dialog.open();
+
+        while (!shell.isDisposed()) {
+            if (!display.readAndDispatch()) display.sleep();
+        }
+
+        display.dispose();
+    }
+
+}


Property changes on: branches/eclipse/org.jboss.dna.publish.ui.swt/src/org/jboss/dna/publish/ui/swt/wizards/ServerWizard.java
___________________________________________________________________
Name: svn:mime-type
   + text/plain



From dna-commits at lists.jboss.org  Tue Jun 23 14:44:42 2009
From: dna-commits at lists.jboss.org (dna-commits at lists.jboss.org)
Date: Tue, 23 Jun 2009 14:44:42 -0400
Subject: [dna-commits] DNA SVN:  r1061 - branches/eclipse.
Message-ID: <E1MJAz4-0007My-59@committer01.frg.pub.inap.atl.jboss.com>

Author: elvisisking
Date: 2009-06-23 14:44:42 -0400 (Tue, 23 Jun 2009)
New Revision: 1061

Added:
   branches/eclipse/org.jboss.dna.publish.ui.swt/
Log:
Share project "org.jboss.dna.publish.ui.swt" into "https://svn.jboss.org/repos/dna"



From dna-commits at lists.jboss.org  Wed Jun 24 14:31:41 2009
From: dna-commits at lists.jboss.org (dna-commits at lists.jboss.org)
Date: Wed, 24 Jun 2009 14:31:41 -0400
Subject: [dna-commits] DNA SVN: r1063 - in branches/eclipse:
	org.jboss.dna.publish/META-INF and 5 other directories.
Message-ID: <E1MJXG1-00016j-0p@committer01.frg.pub.inap.atl.jboss.com>

Author: elvisisking
Date: 2009-06-24 14:31:40 -0400 (Wed, 24 Jun 2009)
New Revision: 1063

Added:
   branches/eclipse/org.jboss.dna.publish.ui.swt/src/org/jboss/dna/publish/ui/swt/EclipseStatus.java
   branches/eclipse/org.jboss.dna.publish/slf4j-api-1.5.8-sources.jar
   branches/eclipse/org.jboss.dna.publish/slf4j-api-1.5.8.jar
   branches/eclipse/org.jboss.dna.publish/src/org/jboss/dna/publish/Logger.java
Modified:
   branches/eclipse/org.jboss.dna.publish.ui.swt/src/org/jboss/dna/publish/ui/swt/Activator.java
   branches/eclipse/org.jboss.dna.publish.ui.swt/src/org/jboss/dna/publish/ui/swt/actions/PublishAction.java
   branches/eclipse/org.jboss.dna.publish.ui.swt/src/org/jboss/dna/publish/ui/swt/wizards/PublishPage.java
   branches/eclipse/org.jboss.dna.publish/.classpath
   branches/eclipse/org.jboss.dna.publish/META-INF/MANIFEST.MF
   branches/eclipse/org.jboss.dna.publish/build.properties
   branches/eclipse/org.jboss.dna.publish/src/org/jboss/dna/publish/IConstants.java
   branches/eclipse/org.jboss.dna.publish/src/org/jboss/dna/publish/Messages.properties
   branches/eclipse/org.jboss.dna.publish/src/org/jboss/dna/publish/Publisher.java
   branches/eclipse/org.jboss.dna.publish/src/org/jboss/dna/publish/ServerManager.java
   branches/eclipse/org.jboss.dna.publish/src/org/jboss/dna/publish/Status.java
   branches/eclipse/org.jboss.dna.publish/src/org/jboss/dna/publish/domain/Repository.java
   branches/eclipse/org.jboss.dna.publish/src/org/jboss/dna/publish/domain/Workspace.java
Log:
Added logging and more UI implementation.

Modified: branches/eclipse/org.jboss.dna.publish/.classpath
===================================================================
--- branches/eclipse/org.jboss.dna.publish/.classpath	2009-06-23 18:44:56 UTC (rev 1062)
+++ branches/eclipse/org.jboss.dna.publish/.classpath	2009-06-24 18:31:40 UTC (rev 1063)
@@ -1,5 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <classpath>
+	<classpathentry exported="true" kind="lib" path="slf4j-api-1.5.8.jar"/>
 	<classpathentry exported="true" kind="lib" path="jettison-1.1.jar"/>
 	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.6"/>
 	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>

Modified: branches/eclipse/org.jboss.dna.publish/META-INF/MANIFEST.MF
===================================================================
--- branches/eclipse/org.jboss.dna.publish/META-INF/MANIFEST.MF	2009-06-23 18:44:56 UTC (rev 1062)
+++ branches/eclipse/org.jboss.dna.publish/META-INF/MANIFEST.MF	2009-06-24 18:31:40 UTC (rev 1063)
@@ -8,7 +8,8 @@
 Bundle-ActivationPolicy: lazy
 Bundle-Localization: plugin
 Bundle-ClassPath: dnaPublish.jar,
- jettison-1.1.jar
+ jettison-1.1.jar,
+ slf4j-api-1.5.8.jar
 Export-Package: org.jboss.dna.publish,
  org.jboss.dna.publish.domain,
  org.jboss.dna.publish.domain.validation

Modified: branches/eclipse/org.jboss.dna.publish/build.properties
===================================================================
--- branches/eclipse/org.jboss.dna.publish/build.properties	2009-06-23 18:44:56 UTC (rev 1062)
+++ branches/eclipse/org.jboss.dna.publish/build.properties	2009-06-24 18:31:40 UTC (rev 1063)
@@ -1,7 +1,8 @@
 bin.includes = META-INF/,\
                plugin.properties,\
                jettison-1.1.jar,\
-               dnaPublish.jar
+               dnaPublish.jar,\
+               slf4j-api-1.5.8.jar
 jars.compile.order = dnaPublish.jar
 src.includes = src/
 source.dnaPublish.jar = src/

Added: branches/eclipse/org.jboss.dna.publish/slf4j-api-1.5.8-sources.jar
===================================================================
(Binary files differ)


Property changes on: branches/eclipse/org.jboss.dna.publish/slf4j-api-1.5.8-sources.jar
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/eclipse/org.jboss.dna.publish/slf4j-api-1.5.8.jar
===================================================================
(Binary files differ)


Property changes on: branches/eclipse/org.jboss.dna.publish/slf4j-api-1.5.8.jar
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Modified: branches/eclipse/org.jboss.dna.publish/src/org/jboss/dna/publish/IConstants.java
===================================================================
--- branches/eclipse/org.jboss.dna.publish/src/org/jboss/dna/publish/IConstants.java	2009-06-23 18:44:56 UTC (rev 1062)
+++ branches/eclipse/org.jboss.dna.publish/src/org/jboss/dna/publish/IConstants.java	2009-06-24 18:31:40 UTC (rev 1063)
@@ -33,6 +33,12 @@
     
     ResourceBundle MESSAGES = ResourceBundle.getBundle(IConstants.class.getPackage().getName() + ".Messages"); //$NON-NLS-1$
     
+    String ErrorDeletingServerRegistryFile = "ErrorDeletingServerRegistryFile"; //$NON-NLS-1$
+    
+    String ErrorRestoringServerRegistry = "ErrorRestoringServerRegistry"; //$NON-NLS-1$
+    
+    String ErrorSavingServerRegistry = "ErrorSavingServerRegistry"; //$NON-NLS-1$
+    
     String RemovingServerProblemMsg = "RemovingServerProblemMsg"; //$NON-NLS-1$
     
     String RepositoryEmptyNameMsg = "RepositoryEmptyNameMsg"; //$NON-NLS-1$

Added: branches/eclipse/org.jboss.dna.publish/src/org/jboss/dna/publish/Logger.java
===================================================================
--- branches/eclipse/org.jboss.dna.publish/src/org/jboss/dna/publish/Logger.java	                        (rev 0)
+++ branches/eclipse/org.jboss.dna.publish/src/org/jboss/dna/publish/Logger.java	2009-06-24 18:31:40 UTC (rev 1063)
@@ -0,0 +1,84 @@
+/*
+ * 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.publish;
+
+import java.text.MessageFormat;
+import org.slf4j.LoggerFactory;
+
+/**
+ * @author Dan Florian
+ */
+public final class Logger {
+
+    // ===========================================================================================================================
+    // Class Methods
+    // ===========================================================================================================================
+
+    /**
+     * @param clazz the class whose logger will be used
+     * @param error the error being logged
+     * @param message the message being logged
+     * @since 0.6
+     */
+    public static void error( Class<?> clazz,
+                              Throwable error,
+                              String message ) {
+        org.slf4j.Logger delegate = LoggerFactory.getLogger(clazz);
+
+        if (delegate.isErrorEnabled()) {
+            delegate.error(message, error);
+        }
+    }
+
+    /**
+     * @param clazz the class whose logger will be used
+     * @param error the error being logged
+     * @param pattern the message format pattern
+     * @param arguments the arguments to be inserted into the pattern
+     * @since 0.6
+     */
+    public static void error( Class<?> clazz,
+                              Throwable error,
+                              String pattern,
+                              Object... arguments ) {
+        org.slf4j.Logger delegate = LoggerFactory.getLogger(clazz);
+
+        if (delegate.isErrorEnabled()) {
+            delegate.error(MessageFormat.format(pattern, arguments), error);
+        }
+    }
+
+    // ===========================================================================================================================
+    // Constructors
+    // ===========================================================================================================================
+
+    /**
+     * Don't allow construction.
+     * 
+     * @since 0.6
+     */
+    private Logger() {
+        // nothing to do
+    }
+}


Property changes on: branches/eclipse/org.jboss.dna.publish/src/org/jboss/dna/publish/Logger.java
___________________________________________________________________
Name: svn:mime-type
   + text/plain

Modified: branches/eclipse/org.jboss.dna.publish/src/org/jboss/dna/publish/Messages.properties
===================================================================
--- branches/eclipse/org.jboss.dna.publish/src/org/jboss/dna/publish/Messages.properties	2009-06-23 18:44:56 UTC (rev 1062)
+++ branches/eclipse/org.jboss.dna.publish/src/org/jboss/dna/publish/Messages.properties	2009-06-24 18:31:40 UTC (rev 1063)
@@ -1,3 +1,7 @@
+ErrorDeletingServerRegistryFile = There was a problem deleting server registry file "{0}"
+ErrorRestoringServerRegistry = Error trying to restore the server registry from file "{0}"
+ErrorSavingServerRegistry = Error trying to save the server registry to "{0}"
+
 RemovingServerProblemMsg = {0} cannot be removed as it has not been registered
 
 RepositoryEmptyNameMsg = A repository name cannot be empty

Modified: branches/eclipse/org.jboss.dna.publish/src/org/jboss/dna/publish/Publisher.java
===================================================================
--- branches/eclipse/org.jboss.dna.publish/src/org/jboss/dna/publish/Publisher.java	2009-06-23 18:44:56 UTC (rev 1062)
+++ branches/eclipse/org.jboss.dna.publish/src/org/jboss/dna/publish/Publisher.java	2009-06-24 18:31:40 UTC (rev 1063)
@@ -24,8 +24,11 @@
 package org.jboss.dna.publish;
 
 import java.io.File;
+import java.net.Authenticator;
+import java.net.PasswordAuthentication;
 import java.util.Collection;
 import org.jboss.dna.publish.domain.Server;
+import org.jboss.dna.publish.domain.Workspace;
 
 /**
  * @author Dan Florian
@@ -33,13 +36,39 @@
  */
 public class Publisher {
 
-    public Status publish( Server server,
+    // ===========================================================================================================================
+    // Constants
+    // ===========================================================================================================================
+
+//    private static final String SERVER_CONTEXT = "/resources"; //$NON-NLS-1$
+
+    // ===========================================================================================================================
+    // Class Methods
+    // ===========================================================================================================================
+
+    private static void setAuthenticator(final Server server) {
+        Authenticator.setDefault(new Authenticator() {
+            @Override
+            protected PasswordAuthentication getPasswordAuthentication() {
+                return new PasswordAuthentication(server.getUser(), server.getPassword().toCharArray());
+            }
+        });        
+    }
+
+    // ===========================================================================================================================
+    // Methods
+    // ===========================================================================================================================
+
+    public Status publish( Workspace workspace,
                            Collection<File> files ) {
         // TODO implement
+        Server server = workspace.getServer();
+        setAuthenticator(server);
+
         return null;
     }
 
-    public Status unpublish( Server server,
+    public Status unpublish( Workspace workspace,
                              Collection<File> files ) {
         // TODO implement
         return null;

Modified: branches/eclipse/org.jboss.dna.publish/src/org/jboss/dna/publish/ServerManager.java
===================================================================
--- branches/eclipse/org.jboss.dna.publish/src/org/jboss/dna/publish/ServerManager.java	2009-06-23 18:44:56 UTC (rev 1062)
+++ branches/eclipse/org.jboss.dna.publish/src/org/jboss/dna/publish/ServerManager.java	2009-06-24 18:31:40 UTC (rev 1063)
@@ -125,7 +125,6 @@
     public ServerManager( String stateLocationPath ) {
         this.servers = Collections.synchronizedList(new ArrayList<Server>());
         this.stateLocationPath = stateLocationPath;
-        restoreState();
     }
 
     // ===========================================================================================================================
@@ -159,13 +158,19 @@
     public Collection<Server> getServers() {
         return Collections.unmodifiableCollection(this.servers);
     }
-    
+
     /**
-     * @return the name of the state file that the server registry is persisted to
+     * @return the name of the state file that the server registry is persisted to or <code>null</code>
      * @since 0.6
      */
     private String getStateFileName() {
-        return this.stateLocationPath + File.separatorChar + REGISTRY_FILE;
+        String name = this.stateLocationPath;
+
+        if (this.stateLocationPath != null) {
+            name += File.separatorChar + REGISTRY_FILE;
+        }
+
+        return name;
     }
 
     /**
@@ -195,10 +200,10 @@
     }
 
     /**
-     * @return a status indicating if the previous session state was restored
+     * @return a status indicating if the previous session state was restored successfully
      * @since 0.6
      */
-    private Status restoreState() {
+    public Status restoreState() {
         if (this.stateLocationPath != null) {
             if (stateFileExists()) {
                 try {
@@ -207,15 +212,15 @@
                     Document doc = docBuilder.parse(new File(getStateFileName()));
                     Node root = doc.getDocumentElement();
                     NodeList servers = root.getChildNodes();
-                    
+
                     for (int size = servers.getLength(), i = 0; i < size; ++i) {
                         Node server = servers.item(i);
-                        
+
                         if (server.getNodeType() != Node.TEXT_NODE) {
                             NamedNodeMap attributeMap = server.getAttributes();
-                            
+
                             if (attributeMap == null) continue;
-                            
+
                             for (int numAttrs = attributeMap.getLength(), j = 0; j < numAttrs; ++j) {
                                 Node urlNode = attributeMap.getNamedItem(URL_TAG);
                                 Node userNode = attributeMap.getNamedItem(USER_TAG);
@@ -225,12 +230,13 @@
                         }
                     }
                 } catch (Exception e) {
-                    // TODO log
+                    String pattern = MESSAGES.getString(ErrorRestoringServerRegistry);
+                    return new Status(Severity.ERROR, MessageFormat.format(pattern, getStateFileName()), e);
                 }
             }
         }
 
-        // do nothing of there is no save location
+        // do nothing of there is no save location or state file does not exist
         return Status.OK_STATUS;
     }
 
@@ -241,8 +247,8 @@
      * @since 0.6
      */
     public Status saveState() {
-        try {
-            if ((this.stateLocationPath != null) && !getServers().isEmpty()) {
+        if ((this.stateLocationPath != null) && !getServers().isEmpty()) {
+            try {
                 DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
                 DocumentBuilder docBuilder = factory.newDocumentBuilder();
                 Document doc = docBuilder.newDocument();
@@ -259,7 +265,7 @@
                     serverElement.setAttribute(USER_TAG, server.getUser());
                     serverElement.setAttribute(PASSWORD_TAG, server.getPassword());
                 }
-                
+
                 DOMSource source = new DOMSource(doc);
                 StreamResult resultXML = new StreamResult(new FileOutputStream(getStateFileName()));
                 TransformerFactory transFactory = TransformerFactory.newInstance();
@@ -267,12 +273,18 @@
                 transformer.setOutputProperty(OutputKeys.INDENT, "yes"); //$NON-NLS-1$
                 transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "2"); //$NON-NLS-1$ //$NON-NLS-2$
                 transformer.transform(source, resultXML);
-            } else if ((this.stateLocationPath != null) && stateFileExists()) {
-                // delete current registry file is all servers have been deleted
+            } catch (Exception e) {
+                String pattern = MESSAGES.getString(ErrorSavingServerRegistry);
+                return new Status(Severity.ERROR, MessageFormat.format(pattern, getStateFileName()), e);
+            }
+        } else if ((this.stateLocationPath != null) && stateFileExists()) {
+            // delete current registry file since all servers have been deleted
+            try {
                 new File(getStateFileName()).delete();
+            } catch (Exception e) {
+                String pattern = MESSAGES.getString(ErrorDeletingServerRegistryFile);
+                return new Status(Severity.ERROR, MessageFormat.format(pattern, getStateFileName()), e);
             }
-        } catch (Exception e) {
-            // TODO log
         }
 
         return Status.OK_STATUS;
@@ -299,7 +311,7 @@
                 mgr.addServer(new Server("http://server" + i + ".com", "user" + i, "password" + i)); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
             }
         }
-        
+
         mgr.saveState();
     }
 

Modified: branches/eclipse/org.jboss.dna.publish/src/org/jboss/dna/publish/Status.java
===================================================================
--- branches/eclipse/org.jboss.dna.publish/src/org/jboss/dna/publish/Status.java	2009-06-23 18:44:56 UTC (rev 1062)
+++ branches/eclipse/org.jboss.dna.publish/src/org/jboss/dna/publish/Status.java	2009-06-24 18:31:40 UTC (rev 1063)
@@ -92,27 +92,34 @@
      * 
      * @since 0.6
      */
-    private final Throwable exception;
+    protected Throwable exception;
 
     /**
      * The localized message of this status (never <code>null</code>).
      * 
      * @since 0.6
      */
-    private final String message;
+    protected String message;
 
     /**
      * The severity level of this status.
      * 
      * @since 0.6
      */
-    private final Severity severity;
+    protected Severity severity;
 
     // ===========================================================================================================================
     // Constructors
     // ===========================================================================================================================
 
     /**
+     * @since 0.6
+     */
+    protected Status() {
+        // nothing to do
+    }
+
+    /**
      * @param severity the status severity (<code>null</code> will be converted to {@link Severity#UNKNOWN}.
      * @param message the status message or <code>null</code>
      * @param exception the status exception or <code>null</code>
@@ -147,6 +154,14 @@
     }
 
     /**
+     * @return severity the status severity
+     * @since 0.6
+     */
+    public Severity getSeverity() {
+        return severity;
+    }
+
+    /**
      * @return <code>true</code> if the status is an error
      * @see Severity#ERROR
      * @since 0.6

Modified: branches/eclipse/org.jboss.dna.publish/src/org/jboss/dna/publish/domain/Repository.java
===================================================================
--- branches/eclipse/org.jboss.dna.publish/src/org/jboss/dna/publish/domain/Repository.java	2009-06-23 18:44:56 UTC (rev 1062)
+++ branches/eclipse/org.jboss.dna.publish/src/org/jboss/dna/publish/domain/Repository.java	2009-06-24 18:31:40 UTC (rev 1063)
@@ -144,7 +144,7 @@
     }
 
     /**
-     * @return the server where this repository is located
+     * @return the server where this repository is located (never <code>null</code>)
      * @since 0.6
      */
     public Server getServer() {

Modified: branches/eclipse/org.jboss.dna.publish/src/org/jboss/dna/publish/domain/Workspace.java
===================================================================
--- branches/eclipse/org.jboss.dna.publish/src/org/jboss/dna/publish/domain/Workspace.java	2009-06-23 18:44:56 UTC (rev 1062)
+++ branches/eclipse/org.jboss.dna.publish/src/org/jboss/dna/publish/domain/Workspace.java	2009-06-24 18:31:40 UTC (rev 1063)
@@ -134,9 +134,24 @@
      */
     @Override
     public IDnaObject getParent() {
-        // a workspace's parent is a repository
+        return getRepository();
+    }
+    
+    /**
+     * @return the repository where this workspace is located (never <code>null</code>)
+     * @since 0.6
+     */
+    public Repository getRepository() {
         return this.repository;
     }
+    
+    /**
+     * @return the server where this workspace is located (never <code>null</code>)
+     * @since 0.6
+     */
+    public Server getServer() {
+        return this.repository.getServer();
+    }
 
     /**
      * {@inheritDoc}

Modified: branches/eclipse/org.jboss.dna.publish.ui.swt/src/org/jboss/dna/publish/ui/swt/Activator.java
===================================================================
--- branches/eclipse/org.jboss.dna.publish.ui.swt/src/org/jboss/dna/publish/ui/swt/Activator.java	2009-06-23 18:44:56 UTC (rev 1062)
+++ branches/eclipse/org.jboss.dna.publish.ui.swt/src/org/jboss/dna/publish/ui/swt/Activator.java	2009-06-24 18:31:40 UTC (rev 1063)
@@ -23,10 +23,14 @@
  */
 package org.jboss.dna.publish.ui.swt;
 
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Platform;
 import org.eclipse.jface.resource.ImageDescriptor;
 import org.eclipse.swt.graphics.Image;
 import org.eclipse.ui.plugin.AbstractUIPlugin;
+import org.jboss.dna.publish.Logger;
 import org.jboss.dna.publish.ServerManager;
+import org.jboss.dna.publish.Status;
 import org.jboss.dna.publish.domain.IDnaObject;
 import org.jboss.dna.publish.domain.Repository;
 import org.jboss.dna.publish.domain.Server;
@@ -166,13 +170,44 @@
      * Note: This should <strong>ONLY</strong> be called when the OSGi framework is not running (i.e., {@link BundleContext bundle
      * context} is <code>null</code>) and should be called instead of calling {@link #start(BundleContext)}.
      * 
-     * @param stateLocationPath
+     * @param stateLocationPath the file system directory where state files can be stored or <code>null</code> if saving state is
+     *        not desired
      * @since 0.6
      */
     public void initialize( String stateLocationPath ) {
         this.serverMgr = new ServerManager(stateLocationPath);
+        Status status = this.serverMgr.restoreState();
+
+        // problem restoring server registry
+        if (status.isError()) {
+            log(getClass(), status);
+        }
     }
 
+    public void log( Class<?> sourceClass,
+                     Status status ) {
+        if (Platform.isRunning()) {
+            IStatus eclipseStatus;
+
+            if (status instanceof EclipseStatus) {
+                eclipseStatus = ((EclipseStatus)status).getDelegate();
+            } else {
+                eclipseStatus = new org.eclipse.core.runtime.Status(EclipseStatus.convertSeverity(status.getSeverity()),
+                                                                    IUiConstants.PLUGIN_ID, status.getMessage(),
+                                                                    status.getException());
+            }
+
+            getLog().log(eclipseStatus);
+        } else {
+            Logger.error(getClass(), status.getException(), status.getMessage());
+        }
+    }
+
+    public void log( Class<?> sourceClass,
+                     IStatus status ) {
+        log(sourceClass, new EclipseStatus(status));
+    }
+
     /**
      * {@inheritDoc}
      * <p>
@@ -199,8 +234,10 @@
     @Override
     public void stop( BundleContext context ) throws Exception {
         if (this.serverMgr != null) {
-            if (this.serverMgr.saveState().isError()) {
-                // TODO log this
+            Status status = this.serverMgr.saveState();
+            
+            if (status.isError()) {
+                log(getClass(), status);
             }
 
             this.serverMgr = null;

Added: branches/eclipse/org.jboss.dna.publish.ui.swt/src/org/jboss/dna/publish/ui/swt/EclipseStatus.java
===================================================================
--- branches/eclipse/org.jboss.dna.publish.ui.swt/src/org/jboss/dna/publish/ui/swt/EclipseStatus.java	                        (rev 0)
+++ branches/eclipse/org.jboss.dna.publish.ui.swt/src/org/jboss/dna/publish/ui/swt/EclipseStatus.java	2009-06-24 18:31:40 UTC (rev 1063)
@@ -0,0 +1,112 @@
+/*
+ * 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.publish.ui.swt;
+
+import org.eclipse.core.runtime.IStatus;
+import org.jboss.dna.publish.Status;
+
+/**
+ * Converts an Eclipse status into an non-Eclipse status.
+ * 
+ * @author Dan Florian
+ * @since 0.6
+ */
+public class EclipseStatus extends Status {
+
+    // ===========================================================================================================================
+    // Class Methods
+    // ===========================================================================================================================
+
+    /**
+     * Converts the non-Eclipse status severity to an Eclipse severity level. An {@link Status.Severity#UNKNOWN unknown status} is
+     * converted to {@link IStatus#CANCEL cancel}. A {@link Status.Severity} is
+     * 
+     * @param severity the eclipse status severity level
+     * @return the converted severity level
+     * @see IStatus
+     * @since 0.6
+     */
+    public static int convertSeverity( Severity severity ) {
+        if (severity == Severity.OK) return IStatus.OK;
+        if (severity == Severity.ERROR) return IStatus.ERROR;
+        if (severity == Severity.WARNING) return IStatus.WARNING;
+        if (severity == Severity.INFO) return IStatus.INFO;
+        return IStatus.CANCEL;
+    }
+
+    /**
+     * Converts the Eclipse status severity level to a non-Eclipse severity.
+     * 
+     * @param severity the eclipse status severity level
+     * @return the converted severity level
+     * @see IStatus
+     * @since 0.6
+     */
+    public static Severity convertSeverity( int severity ) {
+        if (severity == IStatus.OK) return Severity.OK;
+        if (severity == IStatus.ERROR) return Severity.ERROR;
+        if (severity == IStatus.WARNING) return Severity.WARNING;
+        if (severity == IStatus.INFO) return Severity.INFO;
+        return Severity.UNKNOWN;
+    }
+
+    // ===========================================================================================================================
+    // Fields
+    // ===========================================================================================================================
+
+    /**
+     * The Eclipse status.
+     * 
+     * @since 0.6
+     */
+    private final IStatus delegate;
+
+    // ===========================================================================================================================
+    // Constructors
+    // ===========================================================================================================================
+
+    /**
+     * @param delegate the eclipse status delegate
+     * @since 0.6
+     */
+    public EclipseStatus( IStatus delegate ) {
+        this.delegate = delegate;
+        this.severity = convertSeverity(delegate.getSeverity());
+        this.message = delegate.getMessage();
+        this.exception = delegate.getException();
+    }
+
+    // ===========================================================================================================================
+    // Methods
+    // ===========================================================================================================================
+
+    /**
+     * @return the Eclipse status object
+     * @since 0.6
+     */
+    public IStatus getDelegate() {
+        return this.delegate;
+    }
+
+}


Property changes on: branches/eclipse/org.jboss.dna.publish.ui.swt/src/org/jboss/dna/publish/ui/swt/EclipseStatus.java
___________________________________________________________________
Name: svn:mime-type
   + text/plain

Modified: branches/eclipse/org.jboss.dna.publish.ui.swt/src/org/jboss/dna/publish/ui/swt/actions/PublishAction.java
===================================================================
--- branches/eclipse/org.jboss.dna.publish.ui.swt/src/org/jboss/dna/publish/ui/swt/actions/PublishAction.java	2009-06-23 18:44:56 UTC (rev 1062)
+++ branches/eclipse/org.jboss.dna.publish.ui.swt/src/org/jboss/dna/publish/ui/swt/actions/PublishAction.java	2009-06-24 18:31:40 UTC (rev 1063)
@@ -23,13 +23,20 @@
  */
 package org.jboss.dna.publish.ui.swt.actions;
 
-import java.util.Iterator;
+import java.util.Collections;
+import java.util.List;
 import org.eclipse.core.resources.IResource;
 import org.eclipse.jface.action.IAction;
 import org.eclipse.jface.viewers.ISelection;
 import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.window.Window;
+import org.eclipse.jface.wizard.WizardDialog;
+import org.eclipse.swt.widgets.Shell;
 import org.eclipse.ui.IObjectActionDelegate;
 import org.eclipse.ui.IWorkbenchPart;
+import org.jboss.dna.publish.ui.swt.Activator;
+import org.jboss.dna.publish.ui.swt.wizards.PublishWizard;
+import org.jboss.dna.publish.ui.swt.wizards.PublishWizard.Type;
 
 /**
  * The PublishAction controls the publishing of one or more {@link org.eclipse.core.resources.IResource}s to a DNA repository.
@@ -50,7 +57,7 @@
      * 
      * @since 0.6
      */
-//    private Shell shell;
+    private Shell shell;
 
     // ===========================================================================================================================
     // Constants
@@ -58,24 +65,37 @@
 
     /**
      * {@inheritDoc}
-     *
+     * 
      * @see org.eclipse.ui.IActionDelegate#run(org.eclipse.jface.action.IAction)
      * @since 0.6
      */
     @Override
-    @SuppressWarnings("unchecked")
+    @SuppressWarnings( "unchecked" )
     public void run( IAction action ) {
-        for (Iterator itr = this.selection.iterator(); itr.hasNext();) {
-            // TODO implement run(IAction) - display publish wizard
-            IResource resource = (IResource)itr.next();
-            resource.getFullPath().toFile();
+        assert (this.selection != null);
+        assert (!this.selection.isEmpty());
+
+        List<IResource> resources;
+
+        if (this.selection.size() == 1) {
+            resources = Collections.singletonList((IResource)this.selection.getFirstElement());
+        } else {
+            resources = this.selection.toList();
         }
+
+        WizardDialog dialog = new WizardDialog(shell, new PublishWizard(Type.PUBLISH, resources,
+                                                                        Activator.getDefault().getServerManager()));
+
+        if (dialog.getReturnCode() == Window.OK) {
+            // TODO implement run publish
+        }
     }
-    
+
     /**
      * {@inheritDoc}
-     *
-     * @see org.eclipse.ui.IActionDelegate#selectionChanged(org.eclipse.jface.action.IAction, org.eclipse.jface.viewers.ISelection)
+     * 
+     * @see org.eclipse.ui.IActionDelegate#selectionChanged(org.eclipse.jface.action.IAction,
+     *      org.eclipse.jface.viewers.ISelection)
      * @since 0.6
      */
     @Override
@@ -87,7 +107,7 @@
             this.selection = null;
         }
     }
-    
+
     /**
      * {@inheritDoc}
      * 
@@ -97,7 +117,7 @@
     @Override
     public void setActivePart( IAction action,
                                IWorkbenchPart targetPart ) {
-//        this.shell = targetPart.getSite().getShell();
+        this.shell = targetPart.getSite().getShell();
     }
 
 }

Modified: branches/eclipse/org.jboss.dna.publish.ui.swt/src/org/jboss/dna/publish/ui/swt/wizards/PublishPage.java
===================================================================
--- branches/eclipse/org.jboss.dna.publish.ui.swt/src/org/jboss/dna/publish/ui/swt/wizards/PublishPage.java	2009-06-23 18:44:56 UTC (rev 1062)
+++ branches/eclipse/org.jboss.dna.publish.ui.swt/src/org/jboss/dna/publish/ui/swt/wizards/PublishPage.java	2009-06-24 18:31:40 UTC (rev 1063)
@@ -23,6 +23,8 @@
  */
 package org.jboss.dna.publish.ui.swt.wizards;
 
+import java.util.ArrayList;
+import java.util.Collections;
 import java.util.List;
 import org.eclipse.core.resources.IResource;
 import org.eclipse.jface.dialogs.IMessageProvider;
@@ -36,8 +38,12 @@
 import org.eclipse.swt.widgets.Composite;
 import org.eclipse.swt.widgets.Group;
 import org.eclipse.swt.widgets.Label;
+import org.jboss.dna.publish.ServerManager;
 import org.jboss.dna.publish.Status;
 import org.jboss.dna.publish.Status.Severity;
+import org.jboss.dna.publish.domain.Repository;
+import org.jboss.dna.publish.domain.Server;
+import org.jboss.dna.publish.domain.Workspace;
 import org.jboss.dna.publish.ui.swt.I18n;
 import org.jboss.dna.publish.ui.swt.wizards.PublishWizard.Type;
 
@@ -84,22 +90,28 @@
      * 
      * @since 0.6
      */
-    private String repository;
+    private Repository repository;
 
+    private List<Repository> repositories;
+
     /**
      * The server where the repository is located.
      * 
      * @since 0.6
      */
-    private String server;
+    private Server server;
 
+    private List<Server> servers;
+
     /**
      * The workspace where the resources are being published/unpublished.
      * 
      * @since 0.6
      */
-    private String workspace;
+    private Workspace workspace;
 
+    private List<Workspace> workspaces;
+
     /**
      * The collection of resources being published/unpublished.
      * 
@@ -198,8 +210,9 @@
 
         // set initial value
         // TODO implement load resources
-        String[]  data = new String[20];
-        for (int i = 0; i < 20; ++i) data[i] = "my/resource" + i + ".xmi"; //$NON-NLS-1$ //$NON-NLS-2$
+        String[] data = new String[20];
+        for (int i = 0; i < 20; ++i)
+            data[i] = "my/resource" + i + ".xmi"; //$NON-NLS-1$ //$NON-NLS-2$
         lstResources.setItems(data);
     }
 
@@ -217,25 +230,40 @@
         constructResourcesPanel(pnlMain);
         setControl(pnlMain);
 
-        loadServers();
+        resetServers();
         installLocationListeners();
     }
 
     /**
+     * @return the server manager obtained from the wizard
+     * @since 0.6
+     */
+    private ServerManager getServerManager() {
+        return ((ServerWizard)getWizard()).getServerManager();
+    }
+
+    /**
+     * @return thw workspace to use when publishing or unpublishing
+     * @since 0.6
+     */
+    public Workspace getWorkspace() {
+        assert isPageComplete();
+        return this.workspace;
+    }
+
+    /**
      * Handler for when the repository control value is modified
      * 
      * @since 0.6
      */
     void handleRepositoryModified() {
-        this.repository = this.cbxRepository.getText();
-        this.workspace = null;
+        int index = this.cbxRepository.getSelectionIndex();
+        this.repository = this.repositories.get(index);
 
         // clear loaded workspaces
-        uninstallLocationListeners();
-        this.cbxWorkspace.removeAll();
-        reloadWorkspaces();
-        installLocationListeners();
+        resetWorkspaces();
 
+        // update page state
         updateState();
     }
 
@@ -245,17 +273,12 @@
      * @since 0.6
      */
     void handleServerModified() {
-        this.server = this.cbxServer.getText();
-        this.repository = null;
-        this.workspace = null;
+        this.server = this.servers.get(this.cbxServer.getSelectionIndex());
 
-        // clear loaded repositories and workspaces
-        uninstallLocationListeners();
-        this.cbxRepository.removeAll();
-        this.cbxWorkspace.removeAll();
-        reloadRepositories();
-        installLocationListeners();
+        // need to reload repositories since server changed
+        resetRepositories();
 
+        // update page state
         updateState();
     }
 
@@ -265,7 +288,7 @@
      * @since 0.6
      */
     void handleWorkspaceModified() {
-        this.workspace = this.cbxWorkspace.getText();
+        this.workspace = this.workspaces.get(this.cbxWorkspace.getSelectionIndex());
         updateState();
     }
 
@@ -280,13 +303,6 @@
         this.cbxWorkspace.addModifyListener(this);
     }
 
-    private void loadServers() {
-        // TODO implement loadServers()
-        String[]  data = new String[20];
-        for (int i = 0; i < 20; ++i) data[i] = "server" + i; //$NON-NLS-1$
-        this.cbxServer.setItems(data);
-    }
-
     /**
      * {@inheritDoc}
      * 
@@ -301,34 +317,155 @@
         } else if (e.widget == this.cbxRepository) {
             handleWorkspaceModified();
         } else {
-            // should not happen
-            // TODO log
+            assert false; // should not happen
         }
     }
 
     /**
-     * Reloads the repository combobox based on the newly selected server.
+     * Resets the repository-related fields and controls.
      * 
      * @since 0.6
      */
-    private void reloadRepositories() {
-        // TODO implement reloadRepositories()
-        // if only one repository set it on the combobox
-        // if no repositories ???
+    private void resetRepositories() {
+        this.repository = null;
+
+        if (this.server == null) {
+            this.repositories = Collections.emptyList();
+        } else {
+            this.repositories = new ArrayList<Repository>(this.server.getRepositories());
+        }
+
+        // uninstall listeners to prevent handling events
+        uninstallLocationListeners();
+
+        // clear items
+        this.cbxRepository.removeAll();
+
+        // reload
+        if (this.repositories.isEmpty()) {
+            // disable control if necessary
+            if (this.cbxRepository.getEnabled()) {
+                this.cbxRepository.setEnabled(false);
+            }
+        } else if (this.repositories.size() == 1) {
+            this.repository = this.repositories.get(0);
+            this.cbxRepository.add(this.repository.getName());
+            this.cbxRepository.select(0);
+
+            // enable control if necessary
+            if (!this.cbxRepository.getEnabled()) {
+                this.cbxRepository.setEnabled(true);
+            }
+        } else {
+            // add an item for each repository
+            for (Repository repository : this.repositories) {
+                this.cbxRepository.add(repository.getName());
+            }
+
+            // enable control if necessary
+            if (!this.cbxRepository.getEnabled()) {
+                this.cbxRepository.setEnabled(true);
+            }
+        }
+
+        // must reload workspaces
+        resetWorkspaces();
+
+        // reinstall listening
+        installLocationListeners();
     }
 
     /**
-     * Reloads the repository combobox based on the newly selected server.
+     * Resets the server-related fields and controls.
      * 
      * @since 0.6
      */
-    private void reloadWorkspaces() {
-        // TODO implement reloadRepositories()
-        // if only one workspace set it on the combobox
-        // if no workspaces ???
+    private void resetServers() {
+        this.server = null;
+        this.servers = new ArrayList<Server>(getServerManager().getServers());
+
+        if (this.servers.size() == 0) {
+            // disable control if necessary
+            if (this.cbxServer.getEnabled()) {
+                this.cbxServer.setEnabled(false);
+            }
+        } else if (this.servers.size() == 1) {
+            this.server = this.servers.get(0);
+            this.cbxServer.add(this.server.getName());
+            this.cbxServer.select(0);
+
+            // enable control if necessary
+            if (!this.cbxServer.getEnabled()) {
+                this.cbxServer.setEnabled(true);
+            }
+        } else {
+            // add an item for each server
+            for (Server server : this.servers) {
+                this.cbxServer.add(server.getName());
+            }
+
+            // enable control if necessary
+            if (!this.cbxServer.getEnabled()) {
+                this.cbxServer.setEnabled(true);
+            }
+        }
+
+        // must reload repositories
+        resetRepositories();
     }
 
     /**
+     * Resets the workspace-related fields and controls.
+     * 
+     * @since 0.6
+     */
+    private void resetWorkspaces() {
+        this.workspace = null;
+
+        if (this.repository == null) {
+            this.workspaces = Collections.emptyList();
+        } else {
+            this.workspaces = new ArrayList<Workspace>(this.repository.getWorkspaces());
+        }
+
+        // uninstall listeners to prevent handling events
+        uninstallLocationListeners();
+
+        // clear items
+        this.cbxWorkspace.removeAll();
+
+        // reload
+        if (this.workspaces.isEmpty()) {
+            // disable control if necessary
+            if (this.cbxWorkspace.getEnabled()) {
+                this.cbxWorkspace.setEnabled(false);
+            }
+        } else if (this.workspaces.size() == 1) {
+            this.workspace = this.workspaces.get(0);
+            this.cbxWorkspace.add(this.workspace.getName());
+            this.cbxWorkspace.select(0);
+
+            // enable control if necessary
+            if (!this.cbxWorkspace.getEnabled()) {
+                this.cbxWorkspace.setEnabled(true);
+            }
+        } else {
+            // add an item for each workspace
+            for (Workspace workspace : this.workspaces) {
+                this.cbxWorkspace.add(workspace.getName());
+            }
+
+            // enable control if necessary
+            if (!this.cbxWorkspace.getEnabled()) {
+                this.cbxWorkspace.setEnabled(true);
+            }
+        }
+
+        // reinstall listening
+        installLocationListeners();
+    }
+
+    /**
      * {@inheritDoc}
      * 
      * @see org.eclipse.jface.dialogs.DialogPage#setVisible(boolean)
@@ -403,7 +540,7 @@
             int count = this.cbxRepository.getItemCount();
             msg = ((count == 0) ? I18n.PublishPageNoAvailableRepositoriesStatusMsg : I18n.PublishPageMissingRepositoryStatusMsg);
         } else if (this.workspace == null) {
-            int count = this.cbxServer.getItemCount();
+            int count = this.cbxWorkspace.getItemCount();
             msg = ((count == 0) ? I18n.PublishPageNoAvailableWorkspacesStatusMsg : I18n.PublishPageMissingWorkspaceStatusMsg);
         } else {
             severity = Severity.OK;
@@ -412,4 +549,5 @@
 
         this.status = new Status(severity, msg, null);
     }
+
 }



From dna-commits at lists.jboss.org  Wed Jun 24 18:14:12 2009
From: dna-commits at lists.jboss.org (dna-commits at lists.jboss.org)
Date: Wed, 24 Jun 2009 18:14:12 -0400
Subject: [dna-commits] DNA SVN: r1064 - in
	branches/eclipse/org.jboss.dna.publish.ui.swt/src/org/jboss/dna/publish/ui/swt:
	actions and 1 other directories.
Message-ID: <E1MJajM-0003jy-E8@committer01.frg.pub.inap.atl.jboss.com>

Author: elvisisking
Date: 2009-06-24 18:14:12 -0400 (Wed, 24 Jun 2009)
New Revision: 1064

Added:
   branches/eclipse/org.jboss.dna.publish.ui.swt/src/org/jboss/dna/publish/ui/swt/actions/BasePublishingAction.java
   branches/eclipse/org.jboss.dna.publish.ui.swt/src/org/jboss/dna/publish/ui/swt/wizards/PublishOperation.java
Modified:
   branches/eclipse/org.jboss.dna.publish.ui.swt/src/org/jboss/dna/publish/ui/swt/I18n.java
   branches/eclipse/org.jboss.dna.publish.ui.swt/src/org/jboss/dna/publish/ui/swt/actions/PublishAction.java
   branches/eclipse/org.jboss.dna.publish.ui.swt/src/org/jboss/dna/publish/ui/swt/actions/UnpublishAction.java
   branches/eclipse/org.jboss.dna.publish.ui.swt/src/org/jboss/dna/publish/ui/swt/i18n.properties
   branches/eclipse/org.jboss.dna.publish.ui.swt/src/org/jboss/dna/publish/ui/swt/wizards/PublishPage.java
   branches/eclipse/org.jboss.dna.publish.ui.swt/src/org/jboss/dna/publish/ui/swt/wizards/PublishWizard.java
Log:
More UI implementation.

Modified: branches/eclipse/org.jboss.dna.publish.ui.swt/src/org/jboss/dna/publish/ui/swt/I18n.java
===================================================================
--- branches/eclipse/org.jboss.dna.publish.ui.swt/src/org/jboss/dna/publish/ui/swt/I18n.java	2009-06-24 18:31:40 UTC (rev 1063)
+++ branches/eclipse/org.jboss.dna.publish.ui.swt/src/org/jboss/dna/publish/ui/swt/I18n.java	2009-06-24 22:14:12 UTC (rev 1064)
@@ -45,6 +45,13 @@
     public static String EditServerActionText;
     public static String EditServerActionToolTip;
     
+    public static String ErrorDialogTitle;
+
+    public static String PublishOperationPublishTaskName;
+    public static String PublishOperationPublishTitle;
+    public static String PublishOperationUnpublishTaskName;
+    public static String PublishOperationUnpublishTitle;
+    
     public static String PublishPagePublishTitle;
     public static String PublishPageLocationGroupTitle;
     public static String PublishPageMissingRepositoryStatusMsg;
@@ -67,8 +74,10 @@
     public static String PublishPageWorkspacePublishToolTip;
     public static String PublishPageWorkspaceUnpublishToolTip;
 
+    public static String PublishWizardPublishErrorMsg;
     public static String PublishWizardPublishTitle;
     public static String PublishWizardUnpublishTitle;
+    public static String PublishWizardUnpublishErrorMsg;
     
     public static String ServerPageAuthenticationGroupTitle;
     public static String ServerPageInvalidServerProperties;

Added: branches/eclipse/org.jboss.dna.publish.ui.swt/src/org/jboss/dna/publish/ui/swt/actions/BasePublishingAction.java
===================================================================
--- branches/eclipse/org.jboss.dna.publish.ui.swt/src/org/jboss/dna/publish/ui/swt/actions/BasePublishingAction.java	                        (rev 0)
+++ branches/eclipse/org.jboss.dna.publish.ui.swt/src/org/jboss/dna/publish/ui/swt/actions/BasePublishingAction.java	2009-06-24 22:14:12 UTC (rev 1064)
@@ -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.publish.ui.swt.actions;
+
+import java.util.Collections;
+import java.util.List;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.wizard.WizardDialog;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.ui.IObjectActionDelegate;
+import org.eclipse.ui.IWorkbenchPart;
+import org.jboss.dna.publish.ui.swt.Activator;
+import org.jboss.dna.publish.ui.swt.wizards.PublishWizard;
+import org.jboss.dna.publish.ui.swt.wizards.PublishOperation.Type;
+
+/**
+ * @author Dan Florian
+ * @since 0.6
+ */
+public abstract class BasePublishingAction implements IObjectActionDelegate {
+
+    // ===========================================================================================================================
+    // Fields
+    // ===========================================================================================================================
+
+    /**
+     * The current workspace selection.
+     * 
+     * @since 0.6
+     */
+    private IStructuredSelection selection;
+
+    /**
+     * The active part's Shell.
+     * 
+     * @since 0.6
+     */
+    private Shell shell;
+    
+    /**
+     * Indicates if this is a publishing or unpublishing action.
+     * 
+     * @since 0.6
+     */
+    private final Type type;
+
+    // ===========================================================================================================================
+    // Constructors
+    // ===========================================================================================================================
+
+    /**
+     * @param type indicates the type of action
+     * @since 0.6
+     */
+    public BasePublishingAction(Type type) {
+        this.type = type;
+    }
+    
+    // ===========================================================================================================================
+    // Methods
+    // ===========================================================================================================================
+
+    /**
+     * {@inheritDoc}
+     * 
+     * @see org.eclipse.ui.IActionDelegate#run(org.eclipse.jface.action.IAction)
+     * @since 0.6
+     */
+    @Override
+    @SuppressWarnings( "unchecked" )
+    public void run( IAction action ) {
+        assert (this.selection != null);
+        assert (!this.selection.isEmpty());
+
+        List<IResource> resources;
+
+        if (this.selection.size() == 1) {
+            resources = Collections.singletonList((IResource)this.selection.getFirstElement());
+        } else {
+            resources = this.selection.toList();
+        }
+
+        // run wizard
+        new WizardDialog(shell, new PublishWizard(this.type, resources, Activator.getDefault().getServerManager()));
+    }
+
+    /**
+     * {@inheritDoc}
+     * 
+     * @see org.eclipse.ui.IActionDelegate#selectionChanged(org.eclipse.jface.action.IAction,
+     *      org.eclipse.jface.viewers.ISelection)
+     * @since 0.6
+     */
+    @Override
+    public void selectionChanged( IAction action,
+                                  ISelection selection ) {
+        if (selection instanceof IStructuredSelection) {
+            this.selection = (IStructuredSelection)selection;
+        } else {
+            this.selection = null;
+        }
+    }
+
+    /**
+     * {@inheritDoc}
+     * 
+     * @see org.eclipse.ui.IObjectActionDelegate#setActivePart(org.eclipse.jface.action.IAction, org.eclipse.ui.IWorkbenchPart)
+     * @since 0.6
+     */
+    @Override
+    public void setActivePart( IAction action,
+                               IWorkbenchPart targetPart ) {
+        this.shell = targetPart.getSite().getShell();
+    }
+
+}


Property changes on: branches/eclipse/org.jboss.dna.publish.ui.swt/src/org/jboss/dna/publish/ui/swt/actions/BasePublishingAction.java
___________________________________________________________________
Name: svn:mime-type
   + text/plain

Modified: branches/eclipse/org.jboss.dna.publish.ui.swt/src/org/jboss/dna/publish/ui/swt/actions/PublishAction.java
===================================================================
--- branches/eclipse/org.jboss.dna.publish.ui.swt/src/org/jboss/dna/publish/ui/swt/actions/PublishAction.java	2009-06-24 18:31:40 UTC (rev 1063)
+++ branches/eclipse/org.jboss.dna.publish.ui.swt/src/org/jboss/dna/publish/ui/swt/actions/PublishAction.java	2009-06-24 22:14:12 UTC (rev 1064)
@@ -23,20 +23,7 @@
  */
 package org.jboss.dna.publish.ui.swt.actions;
 
-import java.util.Collections;
-import java.util.List;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.window.Window;
-import org.eclipse.jface.wizard.WizardDialog;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.IObjectActionDelegate;
-import org.eclipse.ui.IWorkbenchPart;
-import org.jboss.dna.publish.ui.swt.Activator;
-import org.jboss.dna.publish.ui.swt.wizards.PublishWizard;
-import org.jboss.dna.publish.ui.swt.wizards.PublishWizard.Type;
+import org.jboss.dna.publish.ui.swt.wizards.PublishOperation.Type;
 
 /**
  * The PublishAction controls the publishing of one or more {@link org.eclipse.core.resources.IResource}s to a DNA repository.
@@ -44,80 +31,17 @@
  * @author Dan Florian
  * @since 0.6
  */
-public final class PublishAction implements IObjectActionDelegate {
+public final class PublishAction extends BasePublishingAction {
 
     // ===========================================================================================================================
-    // Fields
+    // Constructors
     // ===========================================================================================================================
 
-    private IStructuredSelection selection;
-
     /**
-     * The active part's Shell.
-     * 
      * @since 0.6
      */
-    private Shell shell;
-
-    // ===========================================================================================================================
-    // Constants
-    // ===========================================================================================================================
-
-    /**
-     * {@inheritDoc}
-     * 
-     * @see org.eclipse.ui.IActionDelegate#run(org.eclipse.jface.action.IAction)
-     * @since 0.6
-     */
-    @Override
-    @SuppressWarnings( "unchecked" )
-    public void run( IAction action ) {
-        assert (this.selection != null);
-        assert (!this.selection.isEmpty());
-
-        List<IResource> resources;
-
-        if (this.selection.size() == 1) {
-            resources = Collections.singletonList((IResource)this.selection.getFirstElement());
-        } else {
-            resources = this.selection.toList();
-        }
-
-        WizardDialog dialog = new WizardDialog(shell, new PublishWizard(Type.PUBLISH, resources,
-                                                                        Activator.getDefault().getServerManager()));
-
-        if (dialog.getReturnCode() == Window.OK) {
-            // TODO implement run publish
-        }
+    public PublishAction() {
+        super(Type.PUBLISH);
     }
 
-    /**
-     * {@inheritDoc}
-     * 
-     * @see org.eclipse.ui.IActionDelegate#selectionChanged(org.eclipse.jface.action.IAction,
-     *      org.eclipse.jface.viewers.ISelection)
-     * @since 0.6
-     */
-    @Override
-    public void selectionChanged( IAction action,
-                                  ISelection selection ) {
-        if (selection instanceof IStructuredSelection) {
-            this.selection = (IStructuredSelection)selection;
-        } else {
-            this.selection = null;
-        }
-    }
-
-    /**
-     * {@inheritDoc}
-     * 
-     * @see org.eclipse.ui.IObjectActionDelegate#setActivePart(org.eclipse.jface.action.IAction, org.eclipse.ui.IWorkbenchPart)
-     * @since 0.6
-     */
-    @Override
-    public void setActivePart( IAction action,
-                               IWorkbenchPart targetPart ) {
-        this.shell = targetPart.getSite().getShell();
-    }
-
 }

Modified: branches/eclipse/org.jboss.dna.publish.ui.swt/src/org/jboss/dna/publish/ui/swt/actions/UnpublishAction.java
===================================================================
--- branches/eclipse/org.jboss.dna.publish.ui.swt/src/org/jboss/dna/publish/ui/swt/actions/UnpublishAction.java	2009-06-24 18:31:40 UTC (rev 1063)
+++ branches/eclipse/org.jboss.dna.publish.ui.swt/src/org/jboss/dna/publish/ui/swt/actions/UnpublishAction.java	2009-06-24 22:14:12 UTC (rev 1064)
@@ -23,10 +23,7 @@
  */
 package org.jboss.dna.publish.ui.swt.actions;
 
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.ui.IObjectActionDelegate;
-import org.eclipse.ui.IWorkbenchPart;
+import org.jboss.dna.publish.ui.swt.wizards.PublishOperation.Type;
 
 /**
  * The UnpublishAction controls the unpublishing of on or more {@link org.eclipse.core.resources.IResource}s from a DNA
@@ -35,45 +32,17 @@
  * @author Dan Florian
  * @since 0.6
  */
-public final class UnpublishAction implements IObjectActionDelegate {
+public final class UnpublishAction extends BasePublishingAction {
 
-    /**
-     * The active part's Shell.
-     * 
-     * @since 0.6
-     */
-//    private Shell shell;
+    // ===========================================================================================================================
+    // Constructors
+    // ===========================================================================================================================
 
     /**
-     * {@inheritDoc}
-     * 
-     * @see org.eclipse.ui.IActionDelegate#run(org.eclipse.jface.action.IAction)
      * @since 0.6
      */
-    public void run( IAction action ) {
-        // TODO implement
+    public UnpublishAction() {
+        super(Type.UNPUBLISH);
     }
 
-    /**
-     * {@inheritDoc}
-     * 
-     * @see org.eclipse.ui.IActionDelegate#selectionChanged(org.eclipse.jface.action.IAction,
-     *      org.eclipse.jface.viewers.ISelection)
-     * @since 0.6
-     */
-    public void selectionChanged( IAction action,
-                                  ISelection selection ) {
-    }
-
-    /**
-     * {@inheritDoc}
-     * 
-     * @see org.eclipse.ui.IObjectActionDelegate#setActivePart(org.eclipse.jface.action.IAction, org.eclipse.ui.IWorkbenchPart)
-     * @since 0.6
-     */
-    public void setActivePart( IAction action,
-                               IWorkbenchPart targetPart ) {
-//        this.shell = targetPart.getSite().getShell();
-    }
-
 }

Modified: branches/eclipse/org.jboss.dna.publish.ui.swt/src/org/jboss/dna/publish/ui/swt/i18n.properties
===================================================================
--- branches/eclipse/org.jboss.dna.publish.ui.swt/src/org/jboss/dna/publish/ui/swt/i18n.properties	2009-06-24 18:31:40 UTC (rev 1063)
+++ branches/eclipse/org.jboss.dna.publish.ui.swt/src/org/jboss/dna/publish/ui/swt/i18n.properties	2009-06-24 22:14:12 UTC (rev 1064)
@@ -10,9 +10,16 @@
 EditServerActionText = Edit Server
 EditServerActionToolTip = Edit Server
 
+ErrorDialogTitle = Error
+
 NewServerActionText = New Server
 NewServerActionToolTip = New Server
 
+PublishOperationPublishTaskName = Publishing resources
+PublishOperationPublishTitle = Publish
+PublishOperationUnpublishTaskName = Unpublishing resources
+PublishOperationUnpublishTitle = Unpublish
+
 PublishPagePublishTitle = Publish the selected resources
 PublishPageLocationGroupTitle = Location
 PublishPageMissingRepositoryStatusMsg = A repository must be selected
@@ -35,7 +42,9 @@
 PublishPageWorkspacePublishToolTip = The workspace where the resources are being published
 PublishPageWorkspaceUnpublishToolTip = The workspace where the resources are being unpublished
 
+PublishWizardPublishErrorMsg = Error Publishing
 PublishWizardPublishTitle = Publish
+PublishWizardUnpublishErrorMsg = Error Unpublishing
 PublishWizardUnpublishTitle = Unpublish
 
 ServerPageAuthenticationGroupTitle = Authentication

Added: branches/eclipse/org.jboss.dna.publish.ui.swt/src/org/jboss/dna/publish/ui/swt/wizards/PublishOperation.java
===================================================================
--- branches/eclipse/org.jboss.dna.publish.ui.swt/src/org/jboss/dna/publish/ui/swt/wizards/PublishOperation.java	                        (rev 0)
+++ branches/eclipse/org.jboss.dna.publish.ui.swt/src/org/jboss/dna/publish/ui/swt/wizards/PublishOperation.java	2009-06-24 22:14:12 UTC (rev 1064)
@@ -0,0 +1,168 @@
+/*
+ * 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.publish.ui.swt.wizards;
+
+import java.lang.reflect.InvocationTargetException;
+import java.util.Collection;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.jface.operation.IRunnableWithProgress;
+import org.jboss.dna.publish.domain.Workspace;
+import org.jboss.dna.publish.ui.swt.I18n;
+
+/**
+ * @author Dan Florian
+ * @since 0.6
+ */
+public class PublishOperation implements IRunnableWithProgress {
+
+    // ===========================================================================================================================
+    // Constants
+    // ===========================================================================================================================
+
+    /**
+     * The wizard type.
+     * 
+     * @since 0.6
+     */
+    public enum Type {
+        /**
+         * Indicates the wizard will be used to publish.
+         * 
+         * @since 0.6
+         */
+        PUBLISH,
+
+        /**
+         * Indicates the wizard will be used to unpublish.
+         * 
+         * @since 0.6
+         */
+        UNPUBLISH
+    }
+
+    // ===========================================================================================================================
+    // Fields
+    // ===========================================================================================================================
+
+    /**
+     * The resources being published or unpublished.
+     * 
+     * @since 0.6
+     */
+    private final Collection<IResource> resources;
+
+    /**
+     * The operation type.
+     * 
+     * @since 0.6
+     */
+    private final Type type;
+
+    /**
+     * The workspace to use when publishing or unpublishing.
+     * 
+     * @since 0.6
+     */
+    private Workspace workspace;
+
+    // ===========================================================================================================================
+    // Constructors
+    // ===========================================================================================================================
+
+    /**
+     * @param type the operation type
+     * @param resources the resources being published or unpublished
+     */
+    public PublishOperation( Type type,
+                             Collection<IResource> resources ) {
+        this.type = type;
+        this.resources = resources;
+    }
+
+    // ===========================================================================================================================
+    // Methods
+    // ===========================================================================================================================
+
+    /**
+     * @return the operation title
+     * @since 0.6
+     */
+    public String getTitle() {
+        return ((this.type == Type.PUBLISH) ? I18n.PublishOperationPublishTitle : I18n.PublishOperationUnpublishTitle);
+    }
+
+    /**
+     * @return <code>true</code> if a publishing operation
+     * @since 0.6
+     */
+    public boolean isPublishing() {
+        return (this.type == Type.PUBLISH);
+    }
+
+    /**
+     * @return <code>true</code> if an unpublishing operation
+     * @since 0.6
+     */
+    public boolean isUnpublishing() {
+        return this.type == Type.UNPUBLISH;
+    }
+
+    /**
+     * {@inheritDoc}
+     * 
+     * @see org.eclipse.jface.operation.IRunnableWithProgress#run(org.eclipse.core.runtime.IProgressMonitor)
+     * @since 0.6
+     */
+    @Override
+    public void run( IProgressMonitor monitor ) throws InvocationTargetException, InterruptedException {
+        assert (this.workspace != null);
+        
+        try {
+            // TODO
+            String name = (isPublishing() ? I18n.PublishOperationPublishTaskName : I18n.PublishOperationUnpublishTaskName);
+            monitor.beginTask(name, this.resources.size());
+            
+            for (IResource resource : this.resources) {
+                // TODO call publisher here
+                monitor.worked(1);
+            }
+        } catch (Exception e) {
+            throw new InvocationTargetException(e);
+        } finally {
+            monitor.done();
+        }
+    }
+
+    /**
+     * The workspace must be set prior to executing the operation.
+     * 
+     * @param workspace the workspace used when publishing or unpublishing (never <code>null</code>)
+     * @since 0.6
+     */
+    protected void setWorkspace( Workspace workspace ) {
+        this.workspace = workspace;
+    }
+
+}


Property changes on: branches/eclipse/org.jboss.dna.publish.ui.swt/src/org/jboss/dna/publish/ui/swt/wizards/PublishOperation.java
___________________________________________________________________
Name: svn:mime-type
   + text/plain

Modified: branches/eclipse/org.jboss.dna.publish.ui.swt/src/org/jboss/dna/publish/ui/swt/wizards/PublishPage.java
===================================================================
--- branches/eclipse/org.jboss.dna.publish.ui.swt/src/org/jboss/dna/publish/ui/swt/wizards/PublishPage.java	2009-06-24 18:31:40 UTC (rev 1063)
+++ branches/eclipse/org.jboss.dna.publish.ui.swt/src/org/jboss/dna/publish/ui/swt/wizards/PublishPage.java	2009-06-24 22:14:12 UTC (rev 1064)
@@ -45,7 +45,7 @@
 import org.jboss.dna.publish.domain.Server;
 import org.jboss.dna.publish.domain.Workspace;
 import org.jboss.dna.publish.ui.swt.I18n;
-import org.jboss.dna.publish.ui.swt.wizards.PublishWizard.Type;
+import org.jboss.dna.publish.ui.swt.wizards.PublishOperation.Type;
 
 /**
  * @author Dan Florian
@@ -79,19 +79,31 @@
     private Combo cbxWorkspace;
 
     /**
-     * Indicates if the resources are being published or unpublished.
+     * Indicates if publishing or unpublishing is being done.
      * 
      * @since 0.6
      */
     private final Type type;
 
     /**
+     * The collection of resources being published/unpublished.
+     * 
+     * @since 0.6
+     */
+    private final List<IResource> resources;
+
+    /**
      * The repository where the workspace is located.
      * 
      * @since 0.6
      */
     private Repository repository;
 
+    /**
+     * A collection of repositories for the selected server (never <code>null</code>).
+     * 
+     * @since 0.6
+     */
     private List<Repository> repositories;
 
     /**
@@ -101,37 +113,40 @@
      */
     private Server server;
 
+    /**
+     * A collection of servers from the server registry (never <code>null</code>).
+     * 
+     * @since 0.6
+     */
     private List<Server> servers;
 
     /**
-     * The workspace where the resources are being published/unpublished.
+     * The current validation status.
      * 
      * @since 0.6
      */
-    private Workspace workspace;
+    private Status status;
 
-    private List<Workspace> workspaces;
-
     /**
-     * The collection of resources being published/unpublished.
+     * The workspace where the resources are being published/unpublished (may be <code>null</code>).
      * 
      * @since 0.6
      */
-    private final List<IResource> resources;
+    private Workspace workspace;
 
     /**
-     * The current validation status.
+     * A collection of workspaces for the selected server repository (never <code>null</code>).
      * 
      * @since 0.6
      */
-    private Status status;
+    private List<Workspace> workspaces;
 
     // ===========================================================================================================================
     // Constructors
     // ===========================================================================================================================
 
     /**
-     * @param type the publish or unpublish indicator
+     * @param type indicates if publishing or unpublishing is being done
      * @param resources the resources being published or unpublished (never <code>null</code>)
      * @since 0.6
      */

Modified: branches/eclipse/org.jboss.dna.publish.ui.swt/src/org/jboss/dna/publish/ui/swt/wizards/PublishWizard.java
===================================================================
--- branches/eclipse/org.jboss.dna.publish.ui.swt/src/org/jboss/dna/publish/ui/swt/wizards/PublishWizard.java	2009-06-24 18:31:40 UTC (rev 1063)
+++ branches/eclipse/org.jboss.dna.publish.ui.swt/src/org/jboss/dna/publish/ui/swt/wizards/PublishWizard.java	2009-06-24 22:14:12 UTC (rev 1064)
@@ -23,14 +23,21 @@
  */
 package org.jboss.dna.publish.ui.swt.wizards;
 
+import java.lang.reflect.InvocationTargetException;
 import java.util.List;
 import org.eclipse.core.resources.IResource;
+import org.eclipse.jface.dialogs.MessageDialog;
 import org.eclipse.jface.wizard.Wizard;
 import org.eclipse.jface.wizard.WizardDialog;
 import org.eclipse.swt.widgets.Display;
 import org.eclipse.swt.widgets.Shell;
 import org.jboss.dna.publish.ServerManager;
+import org.jboss.dna.publish.Status;
+import org.jboss.dna.publish.Status.Severity;
+import org.jboss.dna.publish.domain.Workspace;
+import org.jboss.dna.publish.ui.swt.Activator;
 import org.jboss.dna.publish.ui.swt.I18n;
+import org.jboss.dna.publish.ui.swt.wizards.PublishOperation.Type;
 
 /**
  * @author Dan Florian
@@ -39,34 +46,16 @@
 public final class PublishWizard extends Wizard {
 
     // ===========================================================================================================================
-    // Constants
+    // Fields
     // ===========================================================================================================================
 
     /**
-     * The wizard type.
+     * The publishing or unpublishing operation.
      * 
      * @since 0.6
      */
-    public enum Type {
-        /**
-         * Indicates the wizard will be used to publish.
-         * 
-         * @since 0.6
-         */
-        PUBLISH,
-
-        /**
-         * Indicates the wizard will be used to unpublish.
-         * 
-         * @since 0.6
-         */
-        UNPUBLISH
-    }
-
-    // ===========================================================================================================================
-    // Fields
-    // ===========================================================================================================================
-
+    private final PublishOperation operation;
+    
     /**
      * The wizard page containing all the controls that allow publishing/unpublishing of resources.
      * 
@@ -94,9 +83,11 @@
     public PublishWizard( Type type,
                           List<IResource> resources,
                           ServerManager serverManager ) {
+        this.operation = new PublishOperation(type, resources);
         this.page = new PublishPage(type, resources);
         this.serverManager = serverManager;
-        setWindowTitle((type == Type.PUBLISH) ? I18n.PublishWizardPublishTitle : I18n.PublishWizardUnpublishTitle);
+
+        setWindowTitle(this.operation.isPublishing() ? I18n.PublishWizardPublishTitle : I18n.PublishWizardUnpublishTitle);
     }
 
     // ===========================================================================================================================
@@ -130,8 +121,20 @@
      */
     @Override
     public boolean performFinish() {
-        // TODO implement performFinish()
-        // Status status = null;
+        Workspace workspace = this.page.getWorkspace();
+        this.operation.setWorkspace(workspace);
+        
+        try {
+            getContainer().run(true, true, this.operation);
+        } catch (InterruptedException e) {
+            return false;
+        } catch (InvocationTargetException e) {
+            String message = (this.operation.isPublishing() ? I18n.PublishWizardPublishErrorMsg : I18n.PublishWizardUnpublishErrorMsg);
+            Activator.getDefault().log(getClass(), new Status(Severity.ERROR, message, e.getTargetException()));
+            MessageDialog.openError(getContainer().getShell(), I18n.ErrorDialogTitle, message);
+            return false;
+        }
+        
         return true; //!status.isError();
     }
 



From dna-commits at lists.jboss.org  Fri Jun 26 22:54:06 2009
From: dna-commits at lists.jboss.org (dna-commits at lists.jboss.org)
Date: Fri, 26 Jun 2009 22:54:06 -0400
Subject: [dna-commits] DNA SVN: r1065 - in trunk:
	dna-graph/src/main/java/org/jboss/dna/graph/connector/inmemory
	and 4 other directories.
Message-ID: <200906270254.n5R2s6Ns016149@svn01.web.mwc.hst.phx2.redhat.com>

Author: bcarothers
Date: 2009-06-26 22:54:06 -0400 (Fri, 26 Jun 2009)
New Revision: 1065

Added:
   trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/map/
   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/MapNode.java
   trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/map/MapRepository.java
   trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/map/MapRepositoryConnection.java
   trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/map/MapRepositorySource.java
   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/MapWorkspace.java
   trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/map/package-info.java
   trunk/extensions/dna-connector-jbosscache/src/main/java/org/jboss/dna/connector/jbosscache/JBossCacheRepository.java
Removed:
   trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/inmemory/InMemoryNode.java
   trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/inmemory/InMemoryRepositoryConnection.java
   trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/inmemory/InMemoryRequestProcessor.java
   trunk/extensions/dna-connector-jbosscache/src/main/java/org/jboss/dna/connector/jbosscache/JBossCacheConnection.java
   trunk/extensions/dna-connector-jbosscache/src/main/java/org/jboss/dna/connector/jbosscache/JBossCacheLexicon.java
   trunk/extensions/dna-connector-jbosscache/src/main/java/org/jboss/dna/connector/jbosscache/JBossCacheRequestProcessor.java
   trunk/extensions/dna-connector-jbosscache/src/main/java/org/jboss/dna/connector/jbosscache/JBossCacheWorkspaces.java
   trunk/extensions/dna-connector-jbosscache/src/test/java/org/jboss/dna/connector/jbosscache/JBossCacheRequestProcessorTest.java
Modified:
   trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/inmemory/InMemoryRepository.java
   trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/inmemory/InMemoryRepositorySource.java
   trunk/dna-graph/src/test/java/org/jboss/dna/graph/connector/inmemory/InMemoryRepositoryTest.java
   trunk/dna-graph/src/test/java/org/jboss/dna/graph/connector/inmemory/InMemoryRepositoryWorkspaceTest.java
   trunk/extensions/dna-connector-jbosscache/src/main/java/org/jboss/dna/connector/jbosscache/JBossCacheSource.java
Log:
DNA-470 Provide Base Set of Connector Classes for All Map-Based Connectors

Applied patch that creates a new MapRepository class (and associated classes) based on the original InMemoryRepository implementation and refactors the In-Memory connector and JBoss Cache connector to utilize the new MapRepository.


Deleted: trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/inmemory/InMemoryNode.java
===================================================================
--- trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/inmemory/InMemoryNode.java	2009-06-24 22:14:12 UTC (rev 1064)
+++ trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/inmemory/InMemoryNode.java	2009-06-27 02:54:06 UTC (rev 1065)
@@ -1,173 +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.inmemory;
-
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.LinkedList;
-import java.util.Map;
-import java.util.Set;
-import java.util.UUID;
-import net.jcip.annotations.NotThreadSafe;
-import org.jboss.dna.graph.ExecutionContext;
-import org.jboss.dna.graph.property.Name;
-import org.jboss.dna.graph.property.Path;
-import org.jboss.dna.graph.property.Property;
-import org.jboss.dna.graph.property.PropertyFactory;
-
-/**
- * @author Randall Hauch
- */
- at NotThreadSafe
-public class InMemoryNode {
-
-    private final UUID uuid;
-    private InMemoryNode parent;
-    private Path.Segment name;
-    private final Map<Name, Property> properties = new HashMap<Name, Property>();
-    private final LinkedList<InMemoryNode> children = new LinkedList<InMemoryNode>();
-    final Set<Name> existingNames = new HashSet<Name>();
-
-    public InMemoryNode( UUID uuid ) {
-        assert uuid != null;
-        this.uuid = uuid;
-    }
-
-    /**
-     * @return uuid
-     */
-    public UUID getUuid() {
-        return uuid;
-    }
-
-    /**
-     * @return name
-     */
-    public Path.Segment getName() {
-        return name;
-    }
-
-    /**
-     * @param name Sets name to the specified value.
-     */
-    protected void setName( Path.Segment name ) {
-        this.name = name;
-    }
-
-    /**
-     * @return parent
-     */
-    public InMemoryNode getParent() {
-        return parent;
-    }
-
-    /**
-     * @param parent Sets parent to the specified value.
-     */
-    protected void setParent( InMemoryNode parent ) {
-        this.parent = parent;
-    }
-
-    /**
-     * @return children
-     */
-    LinkedList<InMemoryNode> getChildren() {
-        return children;
-    }
-
-    /**
-     * @return properties
-     */
-    protected Map<Name, Property> getProperties() {
-        return properties;
-    }
-
-    public InMemoryNode setProperty( Property property ) {
-        if (property != null) {
-            this.properties.put(property.getName(), property);
-        }
-        return this;
-    }
-
-    public InMemoryNode setProperty( ExecutionContext context,
-                                     String name,
-                                     Object... values ) {
-        PropertyFactory propertyFactory = context.getPropertyFactory();
-        Name propertyName = context.getValueFactories().getNameFactory().create(name);
-        return setProperty(propertyFactory.create(propertyName, values));
-    }
-
-    public Property getProperty( ExecutionContext context,
-                                 String name ) {
-        Name propertyName = context.getValueFactories().getNameFactory().create(name);
-        return getProperty(propertyName);
-    }
-
-    public Property getProperty( Name name ) {
-        return this.properties.get(name);
-    }
-
-    /**
-     * {@inheritDoc}
-     * 
-     * @see java.lang.Object#hashCode()
-     */
-    @Override
-    public int hashCode() {
-        return uuid.hashCode();
-    }
-
-    /**
-     * {@inheritDoc}
-     * 
-     * @see java.lang.Object#equals(java.lang.Object)
-     */
-    @Override
-    public boolean equals( Object obj ) {
-        if (obj == this) return true;
-        if (obj instanceof InMemoryNode) {
-            InMemoryNode that = (InMemoryNode)obj;
-            if (!this.getUuid().equals(that.getUuid())) return false;
-            return true;
-        }
-        return false;
-    }
-
-    /**
-     * {@inheritDoc}
-     * 
-     * @see java.lang.Object#toString()
-     */
-    @Override
-    public String toString() {
-        StringBuilder sb = new StringBuilder();
-        if (this.name == null) {
-            sb.append("");
-        } else {
-            sb.append(this.name);
-        }
-        sb.append(" (").append(uuid).append(")");
-        return sb.toString();
-    }
-}

Modified: trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/inmemory/InMemoryRepository.java
===================================================================
--- trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/inmemory/InMemoryRepository.java	2009-06-24 22:14:12 UTC (rev 1064)
+++ trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/inmemory/InMemoryRepository.java	2009-06-27 02:54:06 UTC (rev 1065)
@@ -23,420 +23,80 @@
  */
 package org.jboss.dna.graph.connector.inmemory;
 
-import java.util.ArrayList;
 import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.ListIterator;
 import java.util.Map;
-import java.util.Set;
 import java.util.UUID;
-import java.util.concurrent.locks.ReadWriteLock;
-import java.util.concurrent.locks.ReentrantReadWriteLock;
 import net.jcip.annotations.GuardedBy;
 import net.jcip.annotations.NotThreadSafe;
-import org.jboss.dna.common.util.CheckArg;
 import org.jboss.dna.graph.ExecutionContext;
+import org.jboss.dna.graph.connector.map.AbstractMapWorkspace;
+import org.jboss.dna.graph.connector.map.MapNode;
+import org.jboss.dna.graph.connector.map.MapRepository;
+import org.jboss.dna.graph.connector.map.MapWorkspace;
 import org.jboss.dna.graph.property.Name;
-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.PropertyType;
-import org.jboss.dna.graph.property.Reference;
-import org.jboss.dna.graph.property.UuidFactory;
-import org.jboss.dna.graph.property.ValueFactory;
-import org.jboss.dna.graph.property.basic.RootPath;
-import org.jboss.dna.graph.request.CreateWorkspaceRequest.CreateConflictBehavior;
 
 /**
  * @author Randall Hauch
  */
 @NotThreadSafe
-public class InMemoryRepository {
+public class InMemoryRepository extends MapRepository {
 
-    protected final ReadWriteLock lock = new ReentrantReadWriteLock();
-    protected final UUID rootNodeUuid;
-    private final String sourceName;
-    private final String defaultWorkspaceName;
-    private final Map<String, Workspace> workspaces = new HashMap<String, Workspace>();
-
     public InMemoryRepository( String sourceName,
                                UUID rootNodeUuid ) {
-        this(sourceName, rootNodeUuid, null);
+        super(sourceName, rootNodeUuid, null);
+        initialize();
     }
 
     public InMemoryRepository( 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 : "";
-        // Create the default workspace ...
-        workspaces.put(this.defaultWorkspaceName, new Workspace(this.defaultWorkspaceName));
+        super(sourceName, rootNodeUuid, defaultWorkspaceName);
+        initialize();
     }
 
-    /**
-     * @return sourceName
-     */
-    public String getSourceName() {
-        return sourceName;
-    }
-
-    /**
-     * @return lock
-     */
-    public ReadWriteLock getLock() {
-        return lock;
-    }
-
     @GuardedBy( "getLock()" )
-    public Set<String> getWorkspaceNames() {
-        return workspaces.keySet();
+    protected MapWorkspace createWorkspace( ExecutionContext context,
+                                            String name ) {
+        return new Workspace(this, name);
     }
 
-    @GuardedBy( "getLock()" )
-    public Workspace getWorkspace( ExecutionContext context,
-                                   String name ) {
-        if (name == null) name = defaultWorkspaceName;
-        return workspaces.get(name);
-    }
+    protected class Workspace extends AbstractMapWorkspace {
+        private final Map<UUID, MapNode> nodesByUuid = new HashMap<UUID, MapNode>();
 
-    @GuardedBy( "getLock()" )
-    public Workspace createWorkspace( ExecutionContext context,
-                                      String name,
-                                      CreateConflictBehavior behavior ) {
-        String newName = name;
-        boolean conflictingName = workspaces.containsKey(newName);
-        if (conflictingName) {
-            switch (behavior) {
-                case DO_NOT_CREATE:
-                    return null;
-                case CREATE_WITH_ADJUSTED_NAME:
-                    int counter = 0;
-                    do {
-                        newName = name + (++counter);
-                    } while (workspaces.containsKey(newName));
-                    break;
-            }
-        }
-        assert workspaces.containsKey(newName) == false;
-        Workspace workspace = new Workspace(newName);
-        workspaces.put(newName, workspace);
-        return workspace;
-    }
+        public Workspace( MapRepository repository,
+                          String name ) {
+            super(repository, name);
 
-    @GuardedBy( "getLock()" )
-    public Workspace createWorkspace( ExecutionContext context,
-                                      String name,
-                                      CreateConflictBehavior existingWorkspaceBehavior,
-                                      String nameOfWorkspaceToClone ) {
-        Workspace workspace = createWorkspace(context, name, existingWorkspaceBehavior);
-        if (workspace == null) {
-            // Unable to create because of a duplicate name ...
-            return null;
+            initialize();
         }
-        Workspace original = getWorkspace(context, nameOfWorkspaceToClone);
-        if (original != null) {
-            // Copy the properties of the root node ...
-            InMemoryNode root = workspace.getRoot();
-            InMemoryNode origRoot = original.getRoot();
-            root.getProperties().clear();
-            root.getProperties().putAll(origRoot.getProperties());
 
-            // Loop over each child and call this method to copy the immediate children (and below).
-            // Note that this makes the copy have the same UUID as the original.
-            for (InMemoryNode originalNode : origRoot.getChildren()) {
-                original.copyNode(context, originalNode, workspace, root, originalNode.getName().getName(), true, null);
-            }
-        }
-        return workspace;
-    }
-
-    @GuardedBy( "getLock()" )
-    public boolean destroyWorkspace( String name ) {
-        return workspaces.remove(name) != null;
-    }
-
-    protected class Workspace {
-        private final Map<UUID, InMemoryNode> nodesByUuid = new HashMap<UUID, InMemoryNode>();
-        private final String name;
-
-        protected Workspace( String name ) {
-            assert name != null;
-            this.name = name;
-            // Create the root node ...
-            InMemoryNode root = new InMemoryNode(rootNodeUuid);
-            nodesByUuid.put(root.getUuid(), root);
-        }
-
-        /**
-         * @return name
-         */
-        public String getName() {
-            return name;
-        }
-
-        public InMemoryNode getRoot() {
-            return nodesByUuid.get(rootNodeUuid);
-        }
-
-        public InMemoryNode getNode( UUID uuid ) {
-            assert uuid != null;
-            return nodesByUuid.get(uuid);
-        }
-
-        protected Map<UUID, InMemoryNode> getNodesByUuid() {
-            return nodesByUuid;
-        }
-
-        public InMemoryNode getNode( ExecutionContext context,
-                                     String path ) {
-            assert context != null;
-            assert path != null;
-            return getNode(context.getValueFactories().getPathFactory().create(path));
-        }
-
-        /**
-         * Find a node with the given path.
-         * 
-         * @param path the path to the node; may not be null
-         * @return the node with the path, or null if the node does not exist
-         */
-        public InMemoryNode getNode( Path path ) {
-            assert path != null;
-            InMemoryNode node = getRoot();
-            for (Path.Segment segment : path) {
-                InMemoryNode desiredChild = null;
-                for (InMemoryNode child : node.getChildren()) {
-                    if (child == null) continue;
-                    Path.Segment childName = child.getName();
-                    if (childName == null) continue;
-                    if (childName.equals(segment)) {
-                        desiredChild = child;
-                        break;
-                    }
-                }
-                if (desiredChild != null) {
-                    node = desiredChild;
-                } else {
-                    return null;
-                }
-            }
-            return node;
-        }
-
-        /**
-         * Returns the absolute path to the given node
-         * 
-         * @param pathFactory the path factory to use to create the path from the list of names of all of the nodes on the path
-         *        from the root node to the given node
-         * @param node the node for which the path should be returned
-         * @return the absolute path to the given node
-         */
-        Path pathFor( PathFactory pathFactory,
-                      InMemoryNode node ) {
+        protected void addNodeToMap( MapNode node ) {
             assert node != null;
-            assert pathFactory != null;
-
-            LinkedList<Path.Segment> segments = new LinkedList<Path.Segment>();
-            InMemoryNode root = getRoot();
-
-            do {
-                segments.addFirst(node.getName());
-                node = node.getParent();
-            } while (!node.equals(root));
-
-            return pathFactory.createAbsolutePath(segments);
+            assert nodesByUuid != null;
+            nodesByUuid.put(node.getUuid(), node);
         }
 
-        /**
-         * Find the lowest existing node along the path.
-         * 
-         * @param path the path to the node; may not be null
-         * @return the lowest existing node along the path, or the root node if no node exists on the path
-         */
-        public Path getLowestExistingPath( Path path ) {
-            assert path != null;
-            InMemoryNode node = getRoot();
-            int segmentNumber = 0;
-            for (Path.Segment segment : path) {
-                InMemoryNode desiredChild = null;
-                for (InMemoryNode child : node.getChildren()) {
-                    if (child == null) continue;
-                    Path.Segment childName = child.getName();
-                    if (childName == null) continue;
-                    if (childName.equals(segment)) {
-                        desiredChild = child;
-                        break;
-                    }
-                }
-                if (desiredChild != null) {
-                    node = desiredChild;
-                } else {
-                    return path.subpath(0, segmentNumber);
-                }
-                ++segmentNumber;
-            }
-            return RootPath.INSTANCE;
+        protected MapNode removeNodeFromMap( UUID nodeUuid ) {
+            assert nodeUuid != null;
+            return nodesByUuid.remove(nodeUuid);
         }
 
-        public void removeNode( ExecutionContext context,
-                                InMemoryNode node ) {
-            assert context != null;
-            assert node != null;
-            if (getRoot().equals(node)) {
-                nodesByUuid.clear();
-                // Create the root node ...
-                InMemoryNode root = new InMemoryNode(rootNodeUuid);
-                nodesByUuid.put(root.getUuid(), root);
-                return;
-            }
-            InMemoryNode parent = node.getParent();
-            assert parent != null;
-            parent.getChildren().remove(node);
-            correctSameNameSiblingIndexes(context, parent, node.getName().getName());
-            removeUuidReference(node);
+        protected void removeAllNodesFromMap() {
+            nodesByUuid.clear();
         }
 
-        protected void removeUuidReference( InMemoryNode node ) {
-            nodesByUuid.remove(node.getUuid());
-            for (InMemoryNode child : node.getChildren()) {
-                removeUuidReference(child);
-            }
+        public MapNode getNode( UUID nodeUuid ) {
+            assert nodeUuid != null;
+            return nodesByUuid.get(nodeUuid);
         }
 
         /**
-         * Create a node at the supplied path. The parent of the new node must already exist.
-         * 
-         * @param context the environment; may not be null
-         * @param pathToNewNode the path to the new node; may not be null
-         * @return the new node (or root if the path specified the root)
-         */
-        public InMemoryNode createNode( ExecutionContext context,
-                                        String pathToNewNode ) {
-            assert context != null;
-            assert pathToNewNode != null;
-            Path path = context.getValueFactories().getPathFactory().create(pathToNewNode);
-            if (path.isRoot()) return getRoot();
-            Path parentPath = path.getParent();
-            InMemoryNode parentNode = getNode(parentPath);
-            Name name = path.getLastSegment().getName();
-            return createNode(context, parentNode, name, null);
-        }
-
-        /**
-         * Create a new node with the supplied name, as a child of the supplied parent.
-         * 
-         * @param context the execution context
-         * @param parentNode the parent node; may not be null
-         * @param name the name; may not be null
-         * @param uuid the UUID of the node, or null if the UUID is to be generated
-         * @return the new node
-         */
-        public InMemoryNode createNode( ExecutionContext context,
-                                        InMemoryNode parentNode,
-                                        Name name,
-                                        UUID uuid ) {
-            assert context != null;
-            assert name != null;
-            if (parentNode == null) parentNode = getRoot();
-            if (uuid == null) uuid = UUID.randomUUID();
-            InMemoryNode node = new InMemoryNode(uuid);
-            nodesByUuid.put(node.getUuid(), node);
-            node.setParent(parentNode);
-            // Find the last node with this same name ...
-            int nextIndex = 1;
-            if (parentNode.existingNames.contains(name)) {
-                ListIterator<InMemoryNode> iter = parentNode.getChildren().listIterator(parentNode.getChildren().size());
-                while (iter.hasPrevious()) {
-                    InMemoryNode prev = iter.previous();
-                    if (prev.getName().getName().equals(name)) {
-                        nextIndex = prev.getName().getIndex() + 1;
-                        break;
-                    }
-                }
-            }
-            Path.Segment newName = context.getValueFactories().getPathFactory().createSegment(name, nextIndex);
-            node.setName(newName);
-            parentNode.getChildren().add(node);
-            parentNode.existingNames.add(name);
-            return node;
-        }
-
-        /**
-         * Move the supplied node to the new parent. This method automatically removes the node from its existing parent, and also
-         * correctly adjusts the {@link Path.Segment#getIndex() index} to be correct in the new parent.
-         * 
-         * @param context
-         * @param node the node to be moved; may not be the {@link Workspace#getRoot() root}
-         * @param desiredNewName the new name for the node, if it is to be changed; may be null
-         * @param newWorkspace the workspace containing the new parent node
-         * @param newParent the new parent; may not be the {@link Workspace#getRoot() root}
-         * @param beforeNode the node before which this new node should be placed
-         */
-        public void moveNode( ExecutionContext context,
-                              InMemoryNode node,
-                              Name desiredNewName,
-                              Workspace newWorkspace,
-                              InMemoryNode newParent,
-                              InMemoryNode beforeNode ) {
-            assert context != null;
-            assert newParent != null;
-            assert node != null;
-            // Why was this restriction here? -- BRC
-            // assert newWorkspace.getRoot().equals(newParent) != true;
-            assert this.getRoot().equals(node) != true;
-            InMemoryNode oldParent = node.getParent();
-            Name oldName = node.getName().getName();
-            if (oldParent != null) {
-                boolean removed = oldParent.getChildren().remove(node);
-                assert removed == true;
-                node.setParent(null);
-                correctSameNameSiblingIndexes(context, oldParent, oldName);
-            }
-            node.setParent(newParent);
-            Name newName = oldName;
-            if (desiredNewName != null) {
-                newName = desiredNewName;
-                node.setName(context.getValueFactories().getPathFactory().createSegment(desiredNewName, 1));
-            }
-
-            if (beforeNode == null) {
-                newParent.getChildren().add(node);
-            } else {
-                int index = newParent.getChildren().indexOf(beforeNode);
-                newParent.getChildren().add(index, node);
-            }
-            correctSameNameSiblingIndexes(context, newParent, newName);
-
-            // If the node was moved to a new workspace...
-            if (!this.equals(newWorkspace)) {
-                // We need to remove the node from this workspace's map of nodes ...
-                this.moveNodeToWorkspace(node, newWorkspace);
-            }
-        }
-
-        protected void moveNodeToWorkspace( InMemoryNode node,
-                                            Workspace newWorkspace ) {
-            assert this.nodesByUuid.containsKey(node.getUuid());
-            assert !newWorkspace.nodesByUuid.containsKey(node.getUuid());
-
-            this.nodesByUuid.remove(node.getUuid());
-            newWorkspace.nodesByUuid.put(node.getUuid(), node);
-            for (InMemoryNode child : node.getChildren()) {
-                moveNodeToWorkspace(child, newWorkspace);
-            }
-        }
-
-        /**
          * This should copy the subgraph given by the original node and place the new copy under the supplied new parent. Note
          * that internal references between nodes within the original subgraph must be reflected as internal nodes within the new
          * subgraph.
+         * <p>
+         * This method is trivially overridden for testing purposes.
+         * </p>
          * 
          * @param context the context; may not be null
          * @param original the node to be copied; may not be null
@@ -448,152 +108,24 @@
          *        null if the UUIDs are to be maintained
          * @return the new node, which is the top of the new subgraph
          */
-        public InMemoryNode copyNode( ExecutionContext context,
-                                      InMemoryNode original,
-                                      Workspace newWorkspace,
-                                      InMemoryNode newParent,
-                                      Name desiredName,
-                                      boolean recursive,
-                                      Map<UUID, UUID> oldToNewUuids ) {
-            assert context != null;
-            assert original != null;
-            assert newParent != null;
-            assert newWorkspace != null;
-            boolean reuseUuids = oldToNewUuids == null;
-
-            // Get or create the new node ...
-            Name childName = desiredName != null ? desiredName : original.getName().getName();
-            UUID uuidForCopy = reuseUuids ? original.getUuid() : UUID.randomUUID();
-            InMemoryNode copy = newWorkspace.createNode(context, newParent, childName, uuidForCopy);
-            if (!reuseUuids) {
-                assert oldToNewUuids != null;
-                oldToNewUuids.put(original.getUuid(), copy.getUuid());
-            }
-
-            // Copy the properties ...
-            copy.getProperties().clear();
-            copy.getProperties().putAll(original.getProperties());
-            if (recursive) {
-                // Loop over each child and call this method ...
-                for (InMemoryNode child : original.getChildren()) {
-                    copyNode(context, child, newWorkspace, copy, null, true, oldToNewUuids);
-                }
-            }
-
-            if (!reuseUuids) {
-                assert oldToNewUuids != null;
-                // Now, adjust any references in the new subgraph to objects in the original subgraph
-                // (because they were internal references, and need to be internal to the new subgraph)
-                PropertyFactory propertyFactory = context.getPropertyFactory();
-                UuidFactory uuidFactory = context.getValueFactories().getUuidFactory();
-                ValueFactory<Reference> referenceFactory = context.getValueFactories().getReferenceFactory();
-                for (Map.Entry<UUID, UUID> oldToNew : oldToNewUuids.entrySet()) {
-                    InMemoryNode oldNode = this.getNode(oldToNew.getKey());
-                    InMemoryNode newNode = newWorkspace.getNode(oldToNew.getValue());
-                    assert oldNode != null;
-                    assert newNode != null;
-                    // Iterate over the properties of the new ...
-                    for (Map.Entry<Name, Property> entry : newNode.getProperties().entrySet()) {
-                        Property property = entry.getValue();
-                        // Now see if any of the property values are references ...
-                        List<Object> newValues = new ArrayList<Object>();
-                        boolean foundReference = false;
-                        for (Iterator<?> iter = property.getValues(); iter.hasNext();) {
-                            Object value = iter.next();
-                            PropertyType type = PropertyType.discoverType(value);
-                            if (type == PropertyType.REFERENCE) {
-                                UUID oldReferencedUuid = uuidFactory.create(value);
-                                UUID newReferencedUuid = oldToNewUuids.get(oldReferencedUuid);
-                                if (newReferencedUuid != null) {
-                                    newValues.add(referenceFactory.create(newReferencedUuid));
-                                    foundReference = true;
-                                }
-                            } else {
-                                newValues.add(value);
-                            }
-                        }
-                        // If we found at least one reference, we have to build a new Property object ...
-                        if (foundReference) {
-                            Property newProperty = propertyFactory.create(property.getName(), newValues);
-                            entry.setValue(newProperty);
-                        }
-                    }
-                }
-            }
-
-            return copy;
-        }
-
-        public Set<UUID> getUuidsUnderNode( InMemoryNode node ) {
-            Set<UUID> uuids = new HashSet<UUID>();
-            uuidsUnderNode(node, uuids);
-
-            return uuids;
-        }
-
-        private void uuidsUnderNode( InMemoryNode node,
-                                     Set<UUID> accumulator ) {
-            accumulator.add(node.getUuid());
-
-            for (InMemoryNode child : node.getChildren()) {
-                uuidsUnderNode(child, accumulator);
-            }
-        }
-
-        protected void correctSameNameSiblingIndexes( ExecutionContext context,
-                                                      InMemoryNode parentNode,
-                                                      Name name ) {
-            if (parentNode == null) return;
-            // Look for the highest existing index ...
-            List<InMemoryNode> childrenWithSameNames = new LinkedList<InMemoryNode>();
-            for (InMemoryNode child : parentNode.getChildren()) {
-                if (child.getName().getName().equals(name)) childrenWithSameNames.add(child);
-            }
-            if (childrenWithSameNames.size() == 0) return;
-            if (childrenWithSameNames.size() == 1) {
-                InMemoryNode childWithSameName = childrenWithSameNames.get(0);
-                Path.Segment newName = context.getValueFactories().getPathFactory().createSegment(name, Path.DEFAULT_INDEX);
-                childWithSameName.setName(newName);
-                return;
-            }
-            int index = 1;
-            for (InMemoryNode childWithSameName : childrenWithSameNames) {
-                Path.Segment segment = childWithSameName.getName();
-                if (segment.getIndex() != index) {
-                    Path.Segment newName = context.getValueFactories().getPathFactory().createSegment(name, index);
-                    childWithSameName.setName(newName);
-                }
-                ++index;
-            }
-        }
-
-        /**
-         * {@inheritDoc}
-         * 
-         * @see java.lang.Object#equals(java.lang.Object)
-         */
         @Override
-        public boolean equals( Object obj ) {
-            if (obj == this) return true;
-            if (obj instanceof Workspace) {
-                Workspace that = (Workspace)obj;
-                // Assume the workspaces are in the same repository ...
-                if (!this.name.equals(that.name)) return false;
-                return true;
-            }
-            return false;
+        protected MapNode copyNode( ExecutionContext context,
+                                    MapNode original,
+                                    MapWorkspace newWorkspace,
+                                    MapNode newParent,
+                                    Name desiredName,
+                                    boolean recursive,
+                                    Map<UUID, UUID> oldToNewUuids ) {
+            return super.copyNode(context, original, newWorkspace, newParent, desiredName, recursive, oldToNewUuids);
         }
 
         /**
-         * {@inheritDoc}
+         * Method added to support testing
          * 
-         * @see java.lang.Object#toString()
+         * @return the number of nodes in the backing map
          */
-        @Override
-        public String toString() {
-            return InMemoryRepository.this.getSourceName() + "/" + this.getName();
+        final int size() {
+            return nodesByUuid.size();
         }
-
     }
-
 }

Deleted: trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/inmemory/InMemoryRepositoryConnection.java
===================================================================
--- trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/inmemory/InMemoryRepositoryConnection.java	2009-06-24 22:14:12 UTC (rev 1064)
+++ trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/inmemory/InMemoryRepositoryConnection.java	2009-06-27 02:54:06 UTC (rev 1065)
@@ -1,135 +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.inmemory;
-
-import java.util.concurrent.TimeUnit;
-import java.util.concurrent.locks.Lock;
-import javax.transaction.xa.XAResource;
-import org.jboss.dna.common.statistic.Stopwatch;
-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.RepositorySourceException;
-import org.jboss.dna.graph.request.Request;
-import org.jboss.dna.graph.request.processor.RequestProcessor;
-
-/**
- * @author Randall Hauch
- */
-public class InMemoryRepositoryConnection implements RepositoryConnection {
-
-    private final InMemoryRepositorySource source;
-    private final InMemoryRepository repository;
-
-    InMemoryRepositoryConnection( InMemoryRepositorySource source,
-                                  InMemoryRepository repository ) {
-        assert source != null;
-        assert repository != null;
-        this.source = source;
-        this.repository = repository;
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    public String getSourceName() {
-        return source.getName();
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    public CachePolicy getDefaultCachePolicy() {
-        return source.getDefaultCachePolicy();
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    public XAResource getXAResource() {
-        return null;
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    public boolean ping( long time,
-                         TimeUnit unit ) {
-        return true;
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    public void close() {
-        // do nothing
-    }
-
-    /**
-     * {@inheritDoc}
-     * 
-     * @see org.jboss.dna.graph.connector.RepositoryConnection#execute(org.jboss.dna.graph.ExecutionContext,
-     *      org.jboss.dna.graph.request.Request)
-     */
-    public void execute( ExecutionContext context,
-                         Request request ) throws RepositorySourceException {
-        Logger logger = context.getLogger(getClass());
-        Stopwatch sw = null;
-        if (logger.isTraceEnabled()) {
-            sw = new Stopwatch();
-            sw.start();
-        }
-        // Do any commands update/write?
-        RequestProcessor processor = new InMemoryRequestProcessor(context, this.repository, this.source.getRepositoryContext());
-
-        Lock lock = request.isReadOnly() ? repository.getLock().readLock() : repository.getLock().writeLock();
-        lock.lock();
-        try {
-            // Obtain the lock and execute the commands ...
-            processor.process(request);
-        } finally {
-            try {
-                processor.close();
-            } finally {
-                lock.unlock();
-            }
-        }
-        if (logger.isTraceEnabled()) {
-            assert sw != null;
-            sw.stop();
-            logger.trace("InMemoryRepositoryConnection.execute(...) took " + sw.getTotalDuration());
-        }
-    }
-
-    /**
-     * {@inheritDoc}
-     * 
-     * @see java.lang.Object#toString()
-     */
-    @Override
-    public String toString() {
-        return "Connection to the \"" + getSourceName() + "\" in-memory repository";
-    }
-}

Modified: trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/inmemory/InMemoryRepositorySource.java
===================================================================
--- trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/inmemory/InMemoryRepositorySource.java	2009-06-24 22:14:12 UTC (rev 1064)
+++ trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/inmemory/InMemoryRepositorySource.java	2009-06-27 02:54:06 UTC (rev 1065)
@@ -52,6 +52,8 @@
 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.map.MapRepositoryConnection;
+import org.jboss.dna.graph.connector.map.MapRepositorySource;
 
 /**
  * A {@link RepositorySource} for an in-memory repository. Each {@link InMemoryRepositorySource} instance contains its own
@@ -59,7 +61,7 @@
  * 
  * @author Randall Hauch
  */
-public class InMemoryRepositorySource implements RepositorySource, ObjectFactory {
+public class InMemoryRepositorySource implements MapRepositorySource, ObjectFactory {
 
     /**
      * The initial version is 1
@@ -258,7 +260,7 @@
         if (repository == null) {
             repository = new InMemoryRepository(name, rootNodeUuid, defaultWorkspaceName);
         }
-        return new InMemoryRepositoryConnection(this, repository);
+        return new MapRepositoryConnection(this, repository);
     }
 
     /**

Deleted: trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/inmemory/InMemoryRequestProcessor.java
===================================================================
--- trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/inmemory/InMemoryRequestProcessor.java	2009-06-24 22:14:12 UTC (rev 1064)
+++ trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/inmemory/InMemoryRequestProcessor.java	2009-06-27 02:54:06 UTC (rev 1065)
@@ -1,498 +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.
- *
- * 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.inmemory;
-
-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 java.util.UUID;
-import org.jboss.dna.common.i18n.I18n;
-import org.jboss.dna.common.util.CheckArg;
-import org.jboss.dna.graph.DnaLexicon;
-import org.jboss.dna.graph.ExecutionContext;
-import org.jboss.dna.graph.GraphI18n;
-import org.jboss.dna.graph.JcrLexicon;
-import org.jboss.dna.graph.Location;
-import org.jboss.dna.graph.connector.RepositoryContext;
-import org.jboss.dna.graph.connector.UuidAlreadyExistsException;
-import org.jboss.dna.graph.property.Name;
-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.Path.Segment;
-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.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.Request;
-import org.jboss.dna.graph.request.UpdatePropertiesRequest;
-import org.jboss.dna.graph.request.VerifyWorkspaceRequest;
-import org.jboss.dna.graph.request.processor.RequestProcessor;
-
-/**
- * A {@link RequestProcessor} implementation that operates on an {@link InMemoryRepository} and its
- * {@link InMemoryRepository.Workspace workspaces}.
- */
-public class InMemoryRequestProcessor extends RequestProcessor {
-    private final PathFactory pathFactory;
-    private final PropertyFactory propertyFactory;
-    private final InMemoryRepository repository;
-
-    protected InMemoryRequestProcessor( ExecutionContext context,
-                                        InMemoryRepository repository,
-                                        RepositoryContext repositoryContext ) {
-        super(repository.getSourceName(), context, repositoryContext != null ? repositoryContext.getObserver() : null);
-        this.repository = repository;
-        pathFactory = context.getValueFactories().getPathFactory();
-        propertyFactory = context.getPropertyFactory();
-    }
-
-    @Override
-    public void process( ReadAllChildrenRequest request ) {
-        InMemoryRepository.Workspace workspace = getWorkspace(request, request.inWorkspace());
-        InMemoryNode node = getTargetNode(workspace, request, request.of());
-        if (node == null) return;
-        Location actualLocation = getActualLocation(request.of().getPath(), node);
-        Path path = actualLocation.getPath();
-        // Get the names of the children ...
-        List<InMemoryNode> children = node.getChildren();
-        for (InMemoryNode child : children) {
-            Segment childName = child.getName();
-            Path childPath = pathFactory.create(path, childName);
-            request.addChild(childPath, propertyFactory.create(DnaLexicon.UUID, child.getUuid()));
-        }
-        request.setActualLocationOfNode(actualLocation);
-        setCacheableInfo(request);
-    }
-
-    @Override
-    public void process( ReadAllPropertiesRequest request ) {
-        InMemoryRepository.Workspace workspace = getWorkspace(request, request.inWorkspace());
-        InMemoryNode node = getTargetNode(workspace, request, request.at());
-        if (node == null) return;
-        // Get the properties of the node ...
-        Location actualLocation = getActualLocation(request.at().getPath(), node);
-        request.addProperty(propertyFactory.create(DnaLexicon.UUID, node.getUuid()));
-        for (Property property : node.getProperties().values()) {
-            request.addProperty(property);
-        }
-        request.setActualLocationOfNode(actualLocation);
-        setCacheableInfo(request);
-    }
-
-    @Override
-    public void process( CopyBranchRequest request ) {
-        InMemoryRepository.Workspace workspace = getWorkspace(request, request.fromWorkspace());
-        InMemoryRepository.Workspace newWorkspace = getWorkspace(request, request.intoWorkspace());
-        if (workspace == null || newWorkspace == null) return;
-        InMemoryNode node = getTargetNode(workspace, request, request.from());
-        if (node == null) return;
-
-        Map<UUID, UUID> copyMap = null;
-        Set<UUID> uuidsInFromBranch = null;
-
-        switch (request.uuidConflictBehavior()) {
-            case ALWAYS_CREATE_NEW_UUID:
-
-                /*
-                 * The copyNode method uses the presence of a non-null map as an indicator that new UUIDs should be created
-                 * during the copy operation
-                 */
-                copyMap = new HashMap<UUID, UUID>();
-                break;
-            case REPLACE_EXISTING_NODE:
-                uuidsInFromBranch = workspace.getUuidsUnderNode(node);
-
-                for (UUID uuid : uuidsInFromBranch) {
-                    InMemoryNode existing;
-                    if (null != (existing = newWorkspace.getNode(uuid))) {
-                        newWorkspace.removeNode(this.getExecutionContext(), existing);
-                    }
-                }
-                break;
-            case THROW_EXCEPTION:
-                uuidsInFromBranch = workspace.getUuidsUnderNode(node);
-
-                for (UUID uuid : uuidsInFromBranch) {
-                    InMemoryNode existing;
-                    if (null != (existing = newWorkspace.getNode(uuid))) {
-                        NamespaceRegistry namespaces = this.getExecutionContext().getNamespaceRegistry();
-                        String path = newWorkspace.pathFor(pathFactory, existing).getString(namespaces);
-                        request.setError(new UuidAlreadyExistsException(this.getSourceName(), uuid, path, newWorkspace.getName()));
-                        return;
-                    }
-                }
-                break;
-
-            default:
-                throw new IllegalStateException("Unexpected UUID conflict behavior: " + request.uuidConflictBehavior());
-        }
-
-        // Look up the new parent, which must exist ...
-        Path newParentPath = request.into().getPath();
-        Name desiredName = request.desiredName();
-        InMemoryNode newParent = newWorkspace.getNode(newParentPath);
-        InMemoryNode newNode = workspace.copyNode(getExecutionContext(),
-                                                  node,
-                                                  newWorkspace,
-                                                  newParent,
-                                                  desiredName,
-                                                  true,
-                                                  copyMap);
-        Path newPath = getExecutionContext().getValueFactories().getPathFactory().create(newParentPath, newNode.getName());
-        Location oldLocation = getActualLocation(request.from().getPath(), node);
-        Location newLocation = Location.create(newPath, newNode.getUuid());
-        request.setActualLocations(oldLocation, newLocation);
-        recordChange(request);
-    }
-
-    @Override
-    public void process( CreateNodeRequest request ) {
-        InMemoryRepository.Workspace workspace = getWorkspace(request, request.inWorkspace());
-        if (workspace == null) return;
-        Path parent = request.under().getPath();
-        CheckArg.isNotNull(parent, "request.under().getPath()");
-        InMemoryNode node = null;
-        // Look up the parent node, which must exist ...
-        // System.err.println(request.toString());
-        InMemoryNode parentNode = workspace.getNode(parent);
-        if (parentNode == null) {
-            Path lowestExisting = workspace.getLowestExistingPath(parent);
-            request.setError(new PathNotFoundException(request.under(), lowestExisting,
-                                                       GraphI18n.inMemoryNodeDoesNotExist.text(parent)));
-            return;
-        }
-        UUID uuid = null;
-        for (Property property : request.properties()) {
-            if (property.getName().equals(DnaLexicon.UUID) || property.getName().equals(JcrLexicon.UUID)) {
-                uuid = getExecutionContext().getValueFactories().getUuidFactory().create(property.getValues().next());
-                break;
-            }
-        }
-        switch (request.conflictBehavior()) {
-            case APPEND:
-            case DO_NOT_REPLACE:
-                node = workspace.createNode(getExecutionContext(), parentNode, request.named(), uuid);
-                break;
-            case REPLACE:
-                // See if the node already exists (this doesn't record an error on the request) ...
-                node = getTargetNode(workspace, null, Location.create(pathFactory.create(parent, request.named()), uuid));
-                if (node != null) {
-                    workspace.removeNode(getExecutionContext(), node);
-                }
-                node = workspace.createNode(getExecutionContext(), parentNode, request.named(), uuid);
-                break;
-            case UPDATE:
-                // See if the node already exists (this doesn't record an error on the request) ...
-                node = getTargetNode(workspace, null, Location.create(pathFactory.create(parent, request.named()), uuid));
-                if (node == null) {
-                    node = workspace.createNode(getExecutionContext(), parentNode, request.named(), uuid);
-                } // otherwise, we found it and we're setting any properties below
-                break;
-        }
-        assert node != null;
-        Path path = getExecutionContext().getValueFactories().getPathFactory().create(parent, node.getName());
-        // Now add the properties to the supplied node ...
-        for (Property property : request.properties()) {
-            Name propName = property.getName();
-            if (property.size() == 0) {
-                node.getProperties().remove(propName);
-                continue;
-            }
-            if (!propName.equals(DnaLexicon.UUID)) {
-                node.getProperties().put(propName, property);
-            }
-        }
-        Location actualLocation = getActualLocation(path, node);
-        request.setActualLocationOfNode(actualLocation);
-        recordChange(request);
-    }
-
-    @Override
-    public void process( DeleteBranchRequest request ) {
-        InMemoryRepository.Workspace workspace = getWorkspace(request, request.inWorkspace());
-        if (workspace == null) return;
-        InMemoryNode node = getTargetNode(workspace, request, request.at());
-        if (node == null) return;
-        workspace.removeNode(getExecutionContext(), node);
-        Location actualLocation = getActualLocation(request.at().getPath(), node);
-        request.setActualLocationOfNode(actualLocation);
-        recordChange(request);
-    }
-
-    @Override
-    public void process( MoveBranchRequest request ) {
-        InMemoryRepository.Workspace workspace = getWorkspace(request, request.inWorkspace());
-        if (workspace == null) return;
-
-        InMemoryNode beforeNode = request.before() != null ? getTargetNode(workspace, request, request.before()) : null;
-        InMemoryNode node = getTargetNode(workspace, request, request.from());
-        if (node == null) return;
-        // Look up the new parent, which must exist ...
-        Path newParentPath;
-
-        if (request.into() != null) {
-            newParentPath = request.into().getPath();
-        } else {
-            // into or before cannot both be null
-            assert beforeNode != null;
-
-            // Build the path from the before node to the root.
-            LinkedList<Path.Segment> segments = new LinkedList<Path.Segment>();
-            InMemoryNode current = beforeNode.getParent();
-            while (current != workspace.getRoot()) {
-                segments.addFirst(current.getName());
-                current = current.getParent();
-            }
-            newParentPath = getExecutionContext().getValueFactories().getPathFactory().createAbsolutePath(segments);
-        }
-
-        InMemoryNode newParent = workspace.getNode(newParentPath);
-        workspace.moveNode(getExecutionContext(), node, request.desiredName(), workspace, newParent, beforeNode);
-        assert node.getParent() == newParent;
-        Path newPath = getExecutionContext().getValueFactories().getPathFactory().create(newParentPath, node.getName());
-        Location oldLocation = getActualLocation(request.from().getPath(), node);
-        Location newLocation = Location.create(newPath, node.getUuid());
-        request.setActualLocations(oldLocation, newLocation);
-        recordChange(request);
-    }
-
-    @Override
-    public void process( UpdatePropertiesRequest request ) {
-        InMemoryRepository.Workspace workspace = getWorkspace(request, request.inWorkspace());
-        InMemoryNode node = getTargetNode(workspace, request, request.on());
-        if (node == null) return;
-        // Now set (or remove) the properties to the supplied node ...
-        for (Map.Entry<Name, Property> propertyEntry : request.properties().entrySet()) {
-            Property property = propertyEntry.getValue();
-            if (property == null) {
-                node.getProperties().remove(propertyEntry.getKey());
-                continue;
-            }
-            Name propName = property.getName();
-            if (!propName.equals(DnaLexicon.UUID)) {
-                node.getProperties().put(propName, property);
-            }
-        }
-        Location actualLocation = getActualLocation(request.on().getPath(), node);
-        request.setActualLocationOfNode(actualLocation);
-        recordChange(request);
-    }
-
-    /**
-     * {@inheritDoc}
-     * 
-     * @see org.jboss.dna.graph.request.processor.RequestProcessor#process(org.jboss.dna.graph.request.CreateWorkspaceRequest)
-     */
-    @Override
-    public void process( CreateWorkspaceRequest request ) {
-        InMemoryRepository.Workspace workspace = repository.createWorkspace(getExecutionContext(),
-                                                                            request.desiredNameOfNewWorkspace(),
-                                                                            request.conflictBehavior());
-        if (workspace == null) {
-            String msg = GraphI18n.workspaceAlreadyExistsInRepository.text(request.desiredNameOfNewWorkspace(),
-                                                                           repository.getSourceName());
-            request.setError(new InvalidWorkspaceException(msg));
-        } else {
-            InMemoryNode root = workspace.getRoot();
-            request.setActualRootLocation(Location.create(pathFactory.createRootPath(), root.getUuid()));
-            request.setActualWorkspaceName(workspace.getName());
-            recordChange(request);
-        }
-    }
-
-    /**
-     * {@inheritDoc}
-     * 
-     * @see org.jboss.dna.graph.request.processor.RequestProcessor#process(org.jboss.dna.graph.request.DestroyWorkspaceRequest)
-     */
-    @Override
-    public void process( DestroyWorkspaceRequest request ) {
-        InMemoryRepository.Workspace workspace = repository.getWorkspace(getExecutionContext(), request.workspaceName());
-        if (workspace != null) {
-            InMemoryNode root = workspace.getRoot();
-            request.setActualRootLocation(Location.create(pathFactory.createRootPath(), root.getUuid()));
-            recordChange(request);
-        } else {
-            String msg = GraphI18n.workspaceDoesNotExistInRepository.text(request.workspaceName(), repository.getSourceName());
-            request.setError(new InvalidWorkspaceException(msg));
-        }
-    }
-
-    /**
-     * {@inheritDoc}
-     * 
-     * @see org.jboss.dna.graph.request.processor.RequestProcessor#process(org.jboss.dna.graph.request.GetWorkspacesRequest)
-     */
-    @Override
-    public void process( GetWorkspacesRequest request ) {
-        Set<String> names = repository.getWorkspaceNames();
-        request.setAvailableWorkspaceNames(new HashSet<String>(names));
-        setCacheableInfo(request);
-    }
-
-    /**
-     * {@inheritDoc}
-     * 
-     * @see org.jboss.dna.graph.request.processor.RequestProcessor#process(org.jboss.dna.graph.request.VerifyWorkspaceRequest)
-     */
-    @Override
-    public void process( VerifyWorkspaceRequest request ) {
-        InMemoryRepository.Workspace original = getWorkspace(request, request.workspaceName());
-        if (original != null) {
-            Path path = getExecutionContext().getValueFactories().getPathFactory().createRootPath();
-            request.setActualRootLocation(Location.create(path, original.getRoot().getUuid()));
-            request.setActualWorkspaceName(original.getName());
-        }
-    }
-
-    /**
-     * {@inheritDoc}
-     * 
-     * @see org.jboss.dna.graph.request.processor.RequestProcessor#process(org.jboss.dna.graph.request.CloneWorkspaceRequest)
-     */
-    @Override
-    public void process( CloneWorkspaceRequest request ) {
-        // Find the original workspace that we're cloning ...
-        final ExecutionContext context = getExecutionContext();
-        String targetWorkspaceName = request.desiredNameOfTargetWorkspace();
-        String nameOfWorkspaceToBeCloned = request.nameOfWorkspaceToBeCloned();
-        InMemoryRepository.Workspace original = repository.getWorkspace(context, nameOfWorkspaceToBeCloned);
-        InMemoryRepository.Workspace target = repository.getWorkspace(context, targetWorkspaceName);
-        if (original == null) {
-            switch (request.cloneConflictBehavior()) {
-                case DO_NOT_CLONE:
-                    String msg = GraphI18n.workspaceDoesNotExistInRepository.text(nameOfWorkspaceToBeCloned,
-                                                                                  repository.getSourceName());
-                    request.setError(new InvalidWorkspaceException(msg));
-                    return;
-                case SKIP_CLONE:
-                    target = repository.createWorkspace(context, targetWorkspaceName, request.targetConflictBehavior());
-                    if (target == null) {
-                        msg = GraphI18n.workspaceAlreadyExistsInRepository.text(targetWorkspaceName, repository.getSourceName());
-                        request.setError(new InvalidWorkspaceException(msg));
-                    } else {
-                        InMemoryNode root = target.getRoot();
-                        request.setActualRootLocation(Location.create(pathFactory.createRootPath(), root.getUuid()));
-                        request.setActualWorkspaceName(target.getName());
-                    }
-                    return;
-            }
-        }
-        assert original != null;
-        target = repository.createWorkspace(context,
-                                            targetWorkspaceName,
-                                            request.targetConflictBehavior(),
-                                            nameOfWorkspaceToBeCloned);
-        if (target == null) {
-            // Since the original was there, the only reason the target wasn't created was because the workspace already existed
-            // ...
-            String msg = GraphI18n.workspaceAlreadyExistsInRepository.text(targetWorkspaceName, repository.getSourceName());
-            request.setError(new InvalidWorkspaceException(msg));
-        } else {
-            InMemoryNode root = target.getRoot();
-            request.setActualRootLocation(Location.create(pathFactory.createRootPath(), root.getUuid()));
-            request.setActualWorkspaceName(target.getName());
-            recordChange(request);
-        }
-    }
-
-    protected Location getActualLocation( Path path,
-                                          InMemoryNode node ) {
-        if (path == null) {
-            // Find the path on the node ...
-            LinkedList<Path.Segment> segments = new LinkedList<Path.Segment>();
-            InMemoryNode n = node;
-            while (n != null) {
-                if (n.getParent() == null) break;
-                segments.addFirst(n.getName());
-                n = n.getParent();
-            }
-            path = pathFactory.createAbsolutePath(segments);
-        }
-        return Location.create(path, node.getUuid());
-    }
-
-    protected InMemoryRepository.Workspace getWorkspace( Request request,
-                                                         String workspaceName ) {
-        // Get the workspace for this request ...
-        InMemoryRepository.Workspace workspace = repository.getWorkspace(getExecutionContext(), workspaceName);
-        if (workspace == null) {
-            String msg = GraphI18n.workspaceDoesNotExistInRepository.text(workspaceName, repository.getSourceName());
-            request.setError(new InvalidWorkspaceException(msg));
-        }
-        return workspace;
-    }
-
-    protected InMemoryNode getTargetNode( InMemoryRepository.Workspace workspace,
-                                          Request request,
-                                          Location location ) {
-        if (workspace == null) return null;
-        // Check first for the UUID ...
-        InMemoryNode node = null;
-        UUID uuid = location.getUuid();
-        if (uuid != null) {
-            node = workspace.getNode(uuid);
-        }
-        Path path = null;
-        if (node == null) {
-            // Look up the node with the supplied path ...
-            path = location.getPath();
-            if (path != null) {
-                node = workspace.getNode(path);
-            }
-        }
-        if (node == null && request != null) {
-            if (path == null) {
-                if (uuid == null) {
-                    // Missing both path and UUID ...
-                    I18n msg = GraphI18n.inMemoryConnectorRequestsMustHavePathOrUuid;
-                    request.setError(new IllegalArgumentException(msg.text()));
-                    return null;
-                }
-                // Missing path, and could not find by UUID ...
-                request.setError(new PathNotFoundException(location, pathFactory.createRootPath(),
-                                                           GraphI18n.inMemoryNodeDoesNotExist.text(path)));
-                return null;
-            }
-            // Could not find the node given the supplied path, so find the lowest path that does exist ...
-            Path lowestExisting = workspace.getLowestExistingPath(path);
-            request.setError(new PathNotFoundException(location, lowestExisting, GraphI18n.inMemoryNodeDoesNotExist.text(path)));
-        }
-        return node;
-    }
-}

Added: 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	                        (rev 0)
+++ trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/map/AbstractMapWorkspace.java	2009-06-27 02:54:06 UTC (rev 1065)
@@ -0,0 +1,642 @@
+/*
+ * 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.map;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.ListIterator;
+import java.util.Map;
+import java.util.Set;
+import java.util.UUID;
+import org.jboss.dna.graph.ExecutionContext;
+import org.jboss.dna.graph.connector.UuidAlreadyExistsException;
+import org.jboss.dna.graph.property.Name;
+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.PropertyType;
+import org.jboss.dna.graph.property.Reference;
+import org.jboss.dna.graph.property.UuidFactory;
+import org.jboss.dna.graph.property.ValueFactory;
+import org.jboss.dna.graph.property.basic.RootPath;
+import org.jboss.dna.graph.request.UuidConflictBehavior;
+
+/**
+ * A default implementation of {@link MapWorkspace} that only requires the user to implement some simple, map-like operations.
+ */
+public abstract class AbstractMapWorkspace implements MapWorkspace {
+
+    private final MapRepository repository;
+    private final String name;
+
+    protected AbstractMapWorkspace( MapRepository repository,
+                                    String name ) {
+        assert repository != null;
+        assert name != null;
+
+        this.repository = repository;
+        this.name = name;
+    }
+
+    protected void initialize() {
+
+        // Create the root node ...
+        MapNode root = createMapNode(repository.getRootNodeUuid());
+        assert root != null;
+        addNodeToMap(root);
+
+    }
+
+    /**
+     * Adds the given node to the backing map, replacing any node already in the backing map with the same UUID.
+     * 
+     * @param node the node to add to the map; may not be null
+     */
+    protected abstract void addNodeToMap( MapNode node );
+
+    /**
+     * Removes the node with the given UUID from the backing map, returning the node if it exists
+     * 
+     * @param nodeUuid the UUID of the node to replace; may not be null
+     * @return if a node with that UUID exists in the backing map (prior to removal), that node is returned; otherwise null
+     */
+    protected abstract MapNode removeNodeFromMap( UUID nodeUuid );
+
+    /**
+     * Removes all of the nodes from the backing map
+     */
+    protected abstract void removeAllNodesFromMap();
+
+    /**
+     * Gets the node with the given UUID from the backing map, if one exists
+     * 
+     * @param nodeUuid the UUID of the node to be retrieved; may not be null
+     * @return the node that exists in the backing map with the given UUID
+     */
+    public abstract MapNode getNode( UUID nodeUuid );
+
+    /**
+     * Creates an empty {@link MapNode node} with the given UUID.
+     * <p>
+     * This method does not add the new map node to the map. That must be done with a separate call to
+     * {@link #addNodeToMap(MapNode)}.
+     * </p>
+     * 
+     * @param uuid the UUID that identifies the new node; may not be null
+     * @return the new node with the given UUID
+     */
+    protected MapNode createMapNode( UUID uuid ) {
+        assert uuid != null;
+        return new MapNode(uuid);
+    }
+
+    /**
+     * @return name
+     */
+    public String getName() {
+        return name;
+    }
+
+    /**
+     * {@inheritDoc}
+     * 
+     * @see MapWorkspace#getRoot()
+     */
+    public MapNode getRoot() {
+        return getNode(repository.getRootNodeUuid());
+    }
+
+    /**
+     * Find a node with the given path.
+     * 
+     * @param context the execution context to use to convert {@code path} to a {@link Path}; may not be null
+     * @param path the path to the node; may not be null
+     * @return the node with the path, or null if the node does not exist
+     */
+    public MapNode getNode( ExecutionContext context,
+                            String path ) {
+        assert context != null;
+        assert path != null;
+        return getNode(context.getValueFactories().getPathFactory().create(path));
+    }
+
+    /**
+     * Find a node with the given path.
+     * 
+     * @param path the path to the node; may not be null
+     * @return the node with the path, or null if the node does not exist
+     */
+    public MapNode getNode( Path path ) {
+        assert path != null;
+        MapNode node = getRoot();
+        for (Path.Segment segment : path) {
+            MapNode desiredChild = null;
+            for (MapNode child : node.getChildren()) {
+                if (child == null) continue;
+                Path.Segment childName = child.getName();
+                if (childName == null) continue;
+                if (childName.equals(segment)) {
+                    desiredChild = child;
+                    break;
+                }
+            }
+            if (desiredChild != null) {
+                node = desiredChild;
+            } else {
+                return null;
+            }
+        }
+        return node;
+    }
+
+    /**
+     * Returns the absolute path to the given node
+     * 
+     * @param pathFactory the path factory to use to create the path from the list of names of all of the nodes on the path from
+     *        the root node to the given node
+     * @param node the node for which the path should be returned
+     * @return the absolute path to the given node
+     */
+    public Path pathFor( PathFactory pathFactory,
+                         MapNode node ) {
+        assert node != null;
+        assert pathFactory != null;
+
+        LinkedList<Path.Segment> segments = new LinkedList<Path.Segment>();
+        MapNode root = getRoot();
+
+        do {
+            segments.addFirst(node.getName());
+            node = node.getParent();
+        } while (!node.equals(root));
+
+        return pathFactory.createAbsolutePath(segments);
+    }
+
+    /**
+     * Find the lowest existing node along the path.
+     * 
+     * @param path the path to the node; may not be null
+     * @return the lowest existing node along the path, or the root node if no node exists on the path
+     */
+    public Path getLowestExistingPath( Path path ) {
+        assert path != null;
+        MapNode node = getRoot();
+        int segmentNumber = 0;
+        for (Path.Segment segment : path) {
+            MapNode desiredChild = null;
+            for (MapNode child : node.getChildren()) {
+                if (child == null) continue;
+                Path.Segment childName = child.getName();
+                if (childName == null) continue;
+                if (childName.equals(segment)) {
+                    desiredChild = child;
+                    break;
+                }
+            }
+            if (desiredChild != null) {
+                node = desiredChild;
+            } else {
+                return path.subpath(0, segmentNumber);
+            }
+            ++segmentNumber;
+        }
+        return RootPath.INSTANCE;
+    }
+
+    /**
+     * Removes the given node and its children, correcting the SNS and child indices for its parent.
+     * 
+     * @param context the current execution context
+     * @param node the node to be removed
+     */
+    public void removeNode( ExecutionContext context,
+                            MapNode node ) {
+        assert context != null;
+        assert node != null;
+        if (getRoot().equals(node)) {
+            removeAllNodesFromMap();
+            // Recreate the root node ...
+            addNodeToMap(createMapNode(repository.getRootNodeUuid()));
+            return;
+        }
+        MapNode parent = node.getParent();
+        assert parent != null;
+        parent.getChildren().remove(node);
+        correctSameNameSiblingIndexes(context, parent, node.getName().getName());
+        removeUuidReference(node);
+    }
+
+    /**
+     * Recursively removes the given node and its children from the backing map
+     * 
+     * @param node the root of the branch to be removed
+     */
+    protected void removeUuidReference( MapNode node ) {
+        assert node != null;
+        removeNodeFromMap(node.getUuid());
+
+        for (MapNode child : node.getChildren()) {
+            removeUuidReference(child);
+        }
+    }
+
+    /**
+     * Create a node at the supplied path. The parent of the new node must already exist.
+     * 
+     * @param context the environment; may not be null
+     * @param pathToNewNode the path to the new node; may not be null
+     * @return the new node (or root if the path specified the root)
+     */
+    public MapNode createNode( ExecutionContext context,
+                               String pathToNewNode ) {
+        assert context != null;
+        assert pathToNewNode != null;
+        Path path = context.getValueFactories().getPathFactory().create(pathToNewNode);
+        if (path.isRoot()) return getRoot();
+        Path parentPath = path.getParent();
+        MapNode parentNode = getNode(parentPath);
+        Name name = path.getLastSegment().getName();
+        return createNode(context, parentNode, name, null);
+    }
+
+    /**
+     * Create a new node with the supplied name, as a child of the supplied parent.
+     * 
+     * @param context the execution context
+     * @param parentNode the parent node; may not be null
+     * @param name the name; may not be null
+     * @param uuid the UUID of the node, or null if the UUID is to be generated
+     * @return the new node
+     */
+    public MapNode createNode( ExecutionContext context,
+                               MapNode parentNode,
+                               Name name,
+                               UUID uuid ) {
+        assert context != null;
+        assert name != null;
+        if (parentNode == null) parentNode = getRoot();
+        if (uuid == null) uuid = UUID.randomUUID();
+
+        MapNode node = createMapNode(uuid);
+        addNodeToMap(node);
+
+        node.setParent(parentNode);
+        // Find the last node with this same name ...
+        int nextIndex = 1;
+        if (parentNode.existingNames.contains(name)) {
+            ListIterator<MapNode> iter = parentNode.getChildren().listIterator(parentNode.getChildren().size());
+            while (iter.hasPrevious()) {
+                MapNode prev = iter.previous();
+                if (prev.getName().getName().equals(name)) {
+                    nextIndex = prev.getName().getIndex() + 1;
+                    break;
+                }
+            }
+        }
+        Path.Segment newName = context.getValueFactories().getPathFactory().createSegment(name, nextIndex);
+        node.setName(newName);
+        parentNode.getChildren().add(node);
+        parentNode.existingNames.add(name);
+        return node;
+    }
+
+    /**
+     * Move the supplied node to the new parent. This method automatically removes the node from its existing parent, and also
+     * correctly adjusts the {@link Path.Segment#getIndex() index} to be correct in the new parent.
+     * 
+     * @param context
+     * @param node the node to be moved; may not be the {@link AbstractMapWorkspace#getRoot() root}
+     * @param desiredNewName the new name for the node, if it is to be changed; may be null
+     * @param newWorkspace the workspace containing the new parent node
+     * @param newParent the new parent; may not be the {@link AbstractMapWorkspace#getRoot() root}
+     * @param beforeNode the node before which this new node should be placed
+     */
+    public void moveNode( ExecutionContext context,
+                          MapNode node,
+                          Name desiredNewName,
+                          MapWorkspace newWorkspace,
+                          MapNode newParent,
+                          MapNode beforeNode ) {
+        assert context != null;
+        assert newParent != null;
+        assert node != null;
+        assert newWorkspace instanceof AbstractMapWorkspace;
+
+        AbstractMapWorkspace newAbstractMapWorkspace = (AbstractMapWorkspace)newWorkspace;
+
+        // Why was this restriction here? -- BRC
+        // assert newAbstractMapWorkspace.getRoot().equals(newParent) != true;
+        assert this.getRoot().equals(node) != true;
+        MapNode oldParent = node.getParent();
+        Name oldName = node.getName().getName();
+        if (oldParent != null) {
+            boolean removed = oldParent.getChildren().remove(node);
+            assert removed == true;
+            node.setParent(null);
+            correctSameNameSiblingIndexes(context, oldParent, oldName);
+        }
+        node.setParent(newParent);
+        Name newName = oldName;
+        if (desiredNewName != null) {
+            newName = desiredNewName;
+            node.setName(context.getValueFactories().getPathFactory().createSegment(desiredNewName, 1));
+        }
+
+        if (beforeNode == null) {
+            newParent.getChildren().add(node);
+        } else {
+            int index = newParent.getChildren().indexOf(beforeNode);
+            newParent.getChildren().add(index, node);
+        }
+        correctSameNameSiblingIndexes(context, newParent, newName);
+
+        // If the node was moved to a new workspace...
+        if (!this.equals(newAbstractMapWorkspace)) {
+            // We need to remove the node from this workspace's map of nodes ...
+            this.moveNodeToWorkspace(node, newAbstractMapWorkspace);
+        }
+    }
+
+    /**
+     * Moves the branch rooted at the given node to the new workspace, removing it from this workspace. If a node with any of the
+     * UUIDs in the branch already exists in the new workspace, it will be replaced by the node from the branch.
+     * 
+     * @param node the root node of the branch to be moved
+     * @param newWorkspace the workspace to which the branch should be moved
+     */
+    protected void moveNodeToWorkspace( MapNode node,
+                                        AbstractMapWorkspace newWorkspace ) {
+        assert getNode(node.getUuid()) != null;
+        assert newWorkspace.getNode(node.getUuid()) == null;
+
+        removeNodeFromMap(node.getUuid());
+        newWorkspace.addNodeToMap(node);
+
+        for (MapNode child : node.getChildren()) {
+            moveNodeToWorkspace(child, newWorkspace);
+        }
+    }
+
+    /**
+     * This should copy the subgraph given by the original node and place the new copy under the supplied new parent. Note that
+     * internal references between nodes within the original subgraph must be reflected as internal nodes within the new subgraph.
+     * 
+     * @param context the context; may not be null
+     * @param original the node to be copied; may not be null
+     * @param newWorkspace the workspace containing the new parent node; may not be null
+     * @param newParent the parent where the copy is to be placed; may not be null
+     * @param desiredName the desired name for the node; if null, the name will be obtained from the original node
+     * @param recursive true if the copy should be recursive
+     * @param uuidConflictBehavior the behavior to use if a UUID in the branch rooted at {@code original} already exists in the
+     *        new workspace
+     * @return the new node, which is the top of the new subgraph
+     */
+    public MapNode copyNode( ExecutionContext context,
+                             MapNode original,
+                             MapWorkspace newWorkspace,
+                             MapNode newParent,
+                             Name desiredName,
+                             boolean recursive,
+                             UuidConflictBehavior uuidConflictBehavior ) throws UuidAlreadyExistsException {
+        Map<UUID, UUID> copyMap = null;
+        Set<UUID> uuidsInFromBranch = null;
+
+        switch (uuidConflictBehavior) {
+            case ALWAYS_CREATE_NEW_UUID:
+
+                /*
+                 * The copyNode method uses the presence of a non-null map as an indicator that new UUIDs should be created
+                 * during the copy operation
+                 */
+                copyMap = new HashMap<UUID, UUID>();
+                break;
+            case REPLACE_EXISTING_NODE:
+                uuidsInFromBranch = getUuidsUnderNode(original);
+
+                for (UUID uuid : uuidsInFromBranch) {
+                    MapNode existing;
+                    if (null != (existing = newWorkspace.getNode(uuid))) {
+                        newWorkspace.removeNode(context, existing);
+                    }
+                }
+                break;
+            case THROW_EXCEPTION:
+                uuidsInFromBranch = getUuidsUnderNode(original);
+                PathFactory pathFactory = context.getValueFactories().getPathFactory();
+                for (UUID uuid : uuidsInFromBranch) {
+                    MapNode existing;
+                    if (null != (existing = newWorkspace.getNode(uuid))) {
+                        NamespaceRegistry namespaces = context.getNamespaceRegistry();
+                        String path = newWorkspace.pathFor(pathFactory, existing).getString(namespaces);
+                        throw new UuidAlreadyExistsException(repository.getSourceName(), uuid, path, newWorkspace.getName());
+                    }
+                }
+                break;
+
+            default:
+                throw new IllegalStateException("Unexpected UUID conflict behavior: " + uuidConflictBehavior);
+        }
+
+        return copyNode(context, original, newWorkspace, newParent, desiredName, true, copyMap);
+    }
+
+    /**
+     * This should copy the subgraph given by the original node and place the new copy under the supplied new parent. Note that
+     * internal references between nodes within the original subgraph must be reflected as internal nodes within the new subgraph.
+     * 
+     * @param context the context; may not be null
+     * @param original the node to be copied; may not be null
+     * @param newWorkspace the workspace containing the new parent node; may not be null
+     * @param newParent the parent where the copy is to be placed; may not be null
+     * @param desiredName the desired name for the node; if null, the name will be obtained from the original node
+     * @param recursive true if the copy should be recursive
+     * @param oldToNewUuids the map of UUIDs of nodes in the new subgraph keyed by the UUIDs of nodes in the original; may be null
+     *        if the UUIDs are to be maintained
+     * @return the new node, which is the top of the new subgraph
+     */
+    protected MapNode copyNode( ExecutionContext context,
+                              MapNode original,
+                              MapWorkspace newWorkspace,
+                              MapNode newParent,
+                              Name desiredName,
+                              boolean recursive,
+                              Map<UUID, UUID> oldToNewUuids ) {
+        assert context != null;
+        assert original != null;
+        assert newParent != null;
+        assert newWorkspace != null;
+        boolean reuseUuids = oldToNewUuids == null;
+
+        // Get or create the new node ...
+        Name childName = desiredName != null ? desiredName : original.getName().getName();
+        UUID uuidForCopy = reuseUuids ? original.getUuid() : UUID.randomUUID();
+        MapNode copy = newWorkspace.createNode(context, newParent, childName, uuidForCopy);
+        if (!reuseUuids) {
+            oldToNewUuids.put(original.getUuid(), copy.getUuid());
+        }
+
+        // Copy the properties ...
+        copy.getProperties().clear();
+        copy.getProperties().putAll(original.getProperties());
+        if (recursive) {
+            // Loop over each child and call this method ...
+            for (MapNode child : original.getChildren()) {
+                copyNode(context, child, newWorkspace, copy, null, true, oldToNewUuids);
+            }
+        }
+
+        if (!reuseUuids) {
+            // Now, adjust any references in the new subgraph to objects in the original subgraph
+            // (because they were internal references, and need to be internal to the new subgraph)
+            PropertyFactory propertyFactory = context.getPropertyFactory();
+            UuidFactory uuidFactory = context.getValueFactories().getUuidFactory();
+            ValueFactory<Reference> referenceFactory = context.getValueFactories().getReferenceFactory();
+            for (Map.Entry<UUID, UUID> oldToNew : oldToNewUuids.entrySet()) {
+                MapNode oldNode = this.getNode(oldToNew.getKey());
+                MapNode newNode = newWorkspace.getNode(oldToNew.getValue());
+                assert oldNode != null;
+                assert newNode != null;
+                // Iterate over the properties of the new ...
+                for (Map.Entry<Name, Property> entry : newNode.getProperties().entrySet()) {
+                    Property property = entry.getValue();
+                    // Now see if any of the property values are references ...
+                    List<Object> newValues = new ArrayList<Object>();
+                    boolean foundReference = false;
+                    for (Iterator<?> iter = property.getValues(); iter.hasNext();) {
+                        Object value = iter.next();
+                        PropertyType type = PropertyType.discoverType(value);
+                        if (type == PropertyType.REFERENCE) {
+                            UUID oldReferencedUuid = uuidFactory.create(value);
+                            UUID newReferencedUuid = oldToNewUuids.get(oldReferencedUuid);
+                            if (newReferencedUuid != null) {
+                                newValues.add(referenceFactory.create(newReferencedUuid));
+                                foundReference = true;
+                            }
+                        } else {
+                            newValues.add(value);
+                        }
+                    }
+                    // If we found at least one reference, we have to build a new Property object ...
+                    if (foundReference) {
+                        Property newProperty = propertyFactory.create(property.getName(), newValues);
+                        entry.setValue(newProperty);
+                    }
+                }
+            }
+        }
+
+        return copy;
+    }
+
+    /**
+     * Returns all of the UUIDs in the branch rooted at {@code node}
+     * 
+     * @param node the root of the branch
+     * @return all of the UUIDs in the branch rooted at {@code node}
+     */
+    public Set<UUID> getUuidsUnderNode( MapNode node ) {
+        Set<UUID> uuids = new HashSet<UUID>();
+        uuidsUnderNode(node, uuids);
+
+        return uuids;
+    }
+
+    private void uuidsUnderNode( MapNode node,
+                                 Set<UUID> accumulator ) {
+        accumulator.add(node.getUuid());
+
+        for (MapNode child : node.getChildren()) {
+            uuidsUnderNode(child, accumulator);
+        }
+    }
+
+    /**
+     * Corrects the SNS indices for all children of the node with the given name
+     * 
+     * @param context the execution context
+     * @param parentNode the parent node
+     * @param name the name of the child nodes for which the SNS indices should be recalculated
+     */
+    protected void correctSameNameSiblingIndexes( ExecutionContext context,
+                                                  MapNode parentNode,
+                                                  Name name ) {
+        if (parentNode == null) return;
+        // Look for the highest existing index ...
+        List<MapNode> childrenWithSameNames = new LinkedList<MapNode>();
+        for (MapNode child : parentNode.getChildren()) {
+            if (child.getName().getName().equals(name)) childrenWithSameNames.add(child);
+        }
+        if (childrenWithSameNames.size() == 0) return;
+        if (childrenWithSameNames.size() == 1) {
+            MapNode childWithSameName = childrenWithSameNames.get(0);
+            Path.Segment newName = context.getValueFactories().getPathFactory().createSegment(name, Path.DEFAULT_INDEX);
+            childWithSameName.setName(newName);
+            return;
+        }
+        int index = 1;
+        for (MapNode childWithSameName : childrenWithSameNames) {
+            Path.Segment segment = childWithSameName.getName();
+            if (segment.getIndex() != index) {
+                Path.Segment newName = context.getValueFactories().getPathFactory().createSegment(name, index);
+                childWithSameName.setName(newName);
+            }
+            ++index;
+        }
+    }
+
+    /**
+     * {@inheritDoc}
+     * 
+     * @see java.lang.Object#equals(java.lang.Object)
+     */
+    @Override
+    public boolean equals( Object obj ) {
+        if (obj == this) return true;
+        if (obj instanceof AbstractMapWorkspace) {
+            AbstractMapWorkspace that = (AbstractMapWorkspace)obj;
+            // Assume the workspaces are in the same repository ...
+            if (!this.name.equals(that.name)) return false;
+            return true;
+        }
+        return false;
+    }
+
+    /**
+     * {@inheritDoc}
+     * 
+     * @see java.lang.Object#toString()
+     */
+    @Override
+    public String toString() {
+        return repository.getSourceName() + "/" + this.getName();
+    }
+
+}


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

Added: trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/map/MapNode.java
===================================================================
--- trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/map/MapNode.java	                        (rev 0)
+++ trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/map/MapNode.java	2009-06-27 02:54:06 UTC (rev 1065)
@@ -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.
+ */
+package org.jboss.dna.graph.connector.map;
+
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.LinkedList;
+import java.util.Map;
+import java.util.Set;
+import java.util.UUID;
+import org.jboss.dna.graph.ExecutionContext;
+import org.jboss.dna.graph.property.Name;
+import org.jboss.dna.graph.property.NameFactory;
+import org.jboss.dna.graph.property.Path;
+import org.jboss.dna.graph.property.Property;
+import org.jboss.dna.graph.property.PropertyFactory;
+
+public class MapNode {
+
+    private final UUID uuid;
+    private MapNode parent;
+    private Path.Segment name;
+    private final Map<Name, Property> properties = new HashMap<Name, Property>();
+    private final LinkedList<MapNode> children = new LinkedList<MapNode>();
+    final Set<Name> existingNames = new HashSet<Name>();
+
+    public MapNode( UUID uuid ) {
+        assert uuid != null;
+        this.uuid = uuid;
+    }
+
+    /* (non-Javadoc)
+     * @see org.jboss.dna.graph.connector.map.MapNode#getUuid()
+     */
+    public UUID getUuid() {
+        return uuid;
+    }
+
+    /* (non-Javadoc)
+     * @see org.jboss.dna.graph.connector.map.MapNode#getName()
+     */
+    public Path.Segment getName() {
+        return name;
+    }
+
+    /**
+     * @param name Sets name to the specified value.
+     */
+    public void setName( Path.Segment name ) {
+        this.name = name;
+    }
+
+    public Set<Name> getUniqueChildNames() {
+        return existingNames;
+    }
+
+    /* (non-Javadoc)
+     * @see org.jboss.dna.graph.connector.map.MapNode#getParent()
+     */
+    public MapNode getParent() {
+        return parent;
+    }
+
+    /**
+     * @param parent Sets parent to the specified value.
+     */
+    public void setParent( MapNode parent ) {
+        this.parent = parent;
+    }
+
+    /**
+     * @return children
+     */
+    public LinkedList<MapNode> getChildren() {
+        return children;
+    }
+
+    /**
+     * @return properties
+     */
+    protected Map<Name, Property> getProperties() {
+        return properties;
+    }
+
+    /**
+     * Sets the property with the given name, overwriting any previous property for the given name
+     * 
+     * @param property the property to set
+     * @return this map node
+     */
+    public MapNode setProperty( Property property ) {
+        if (property != null) {
+            this.properties.put(property.getName(), property);
+        }
+        return this;
+    }
+
+    /**
+     * Sets the property with the given name, overwriting any previous property for the given name
+     * 
+     * @param context the current execution context, used to get a {@link NameFactory name factory} and {@link PropertyFactory
+     *        property factory}.
+     * @param name the name of the property
+     * @param values the values for the property
+     * @return this map node
+     */
+    public MapNode setProperty( ExecutionContext context,
+                                String name,
+                                Object... values ) {
+        PropertyFactory propertyFactory = context.getPropertyFactory();
+        Name propertyName = context.getValueFactories().getNameFactory().create(name);
+        return setProperty(propertyFactory.create(propertyName, values));
+    }
+
+    /**
+     * Returns the named property
+     * 
+     * @param context the current execution context, used to get a {@link NameFactory name factory}
+     * @param name the name of the property to return
+     * @return the property for the given name
+     */
+    public Property getProperty( ExecutionContext context,
+                                 String name ) {
+        Name propertyName = context.getValueFactories().getNameFactory().create(name);
+        return getProperty(propertyName);
+    }
+
+    /**
+     * Returns the named property
+     * 
+     * @param name the name of the property to return
+     * @return the property for the given name
+     */
+    public Property getProperty( Name name ) {
+        return this.properties.get(name);
+    }
+
+    /**
+     * {@inheritDoc}
+     * 
+     * @see java.lang.Object#hashCode()
+     */
+    @Override
+    public int hashCode() {
+        return uuid.hashCode();
+    }
+
+    /**
+     * {@inheritDoc}
+     * 
+     * @see java.lang.Object#equals(java.lang.Object)
+     */
+    @Override
+    public boolean equals( Object obj ) {
+        if (obj == this) return true;
+        if (obj instanceof MapNode) {
+            MapNode that = (MapNode)obj;
+            if (!this.getUuid().equals(that.getUuid())) return false;
+            return true;
+        }
+        return false;
+    }
+
+    /**
+     * {@inheritDoc}
+     * 
+     * @see java.lang.Object#toString()
+     */
+    @Override
+    public String toString() {
+        StringBuilder sb = new StringBuilder();
+        if (this.name == null) {
+            sb.append("");
+        } else {
+            sb.append(this.name);
+        }
+        sb.append(" (").append(uuid).append(")");
+        return sb.toString();
+    }
+
+}


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

Added: trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/map/MapRepository.java
===================================================================
--- trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/map/MapRepository.java	                        (rev 0)
+++ trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/map/MapRepository.java	2009-06-27 02:54:06 UTC (rev 1065)
@@ -0,0 +1,271 @@
+/*
+ * 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.map;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Set;
+import java.util.UUID;
+import java.util.concurrent.locks.ReadWriteLock;
+import java.util.concurrent.locks.ReentrantReadWriteLock;
+import net.jcip.annotations.GuardedBy;
+import org.jboss.dna.common.util.CheckArg;
+import org.jboss.dna.graph.ExecutionContext;
+import org.jboss.dna.graph.request.UuidConflictBehavior;
+import org.jboss.dna.graph.request.CreateWorkspaceRequest.CreateConflictBehavior;
+
+/**
+ * A default implementation of a map-based repository.
+ * <p>
+ * {@code MapRepository} provides means for creating, retrieving, and destroying {@link MapWorkspace map-based workspaces},
+ * including providing the locking primitives required for safe control of the workspaces.
+ * </p>
+ */
+public abstract class MapRepository {
+
+    protected final ReadWriteLock lock = new ReentrantReadWriteLock();
+    protected final UUID rootNodeUuid;
+    private final String sourceName;
+    private final String defaultWorkspaceName;
+    private final Map<String, MapWorkspace> workspaces = new HashMap<String, MapWorkspace>();
+
+    /**
+     * Creates a {@code MapRepository} with the given repository source name, root node UUID, and a default workspace named
+     * {@code ""} (the empty string).
+     * 
+     * @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
+     */
+    public MapRepository( String sourceName,
+                          UUID rootNodeUuid ) {
+        this(sourceName, rootNodeUuid, null);
+    }
+
+    /**
+     * Creates a {@code MapRepository} 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
+     */
+    public MapRepository( 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 : "";
+    }
+
+    /**
+     * Initializes the repository by creating the default workspace.
+     * <p>
+     * Due to the ordering restrictions on constructor chaining, this method cannot be called until the repository is fully
+     * initialized. <b>This method MUST be called at the end of the constructor by any class that implements {@code MapRepository}
+     * .</b>
+     */
+    protected void initialize() {
+        // Create the default workspace ...
+        workspaces.put(this.defaultWorkspaceName, createWorkspace(null,
+                                                                  this.defaultWorkspaceName,
+                                                                  CreateConflictBehavior.DO_NOT_CREATE));
+
+    }
+
+    /**
+     * 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
+     * does not imply a change to the root nodes of any other workspaces. However, the JCR specification mandates that all
+     * referenceable root nodes in a repository use a common UUID (in support of node correspondence); therefore this must be
+     * supported by DNA.
+     * 
+     * @return the root node UUID
+     */
+    public final UUID getRootNodeUuid() {
+        return rootNodeUuid;
+    }
+
+    /**
+     * Returns the logical name (as opposed to the class name) of the repository source that defined this instance of the
+     * repository for use in error, informational, and other contextual messages.
+     * 
+     * @return sourceName the logical name for the repository source name
+     */
+    public String getSourceName() {
+        return sourceName;
+    }
+
+    /**
+     * Returns the lock that must be used to ensure consistent access to the repository
+     * 
+     * @return lock the lock that must be used to ensure consistent access to the repository
+     */
+    public ReadWriteLock getLock() {
+        return lock;
+    }
+
+    /**
+     * Returns a list of the names of the currently created workspaces
+     * 
+     * @return a list of the names of the currently created workspaces
+     */
+    @GuardedBy( "getLock()" )
+    public Set<String> getWorkspaceNames() {
+        return workspaces.keySet();
+    }
+
+    /**
+     * Returns the workspace with the given name
+     * 
+     * @param name the name of the workspace to return
+     * @return the workspace with the given name; may be null if no workspace with the given name exists
+     */
+    @GuardedBy( "getLock()" )
+    public MapWorkspace getWorkspace( String name ) {
+        if (name == null) name = defaultWorkspaceName;
+        return workspaces.get(name);
+    }
+
+    /**
+     * Creates a new workspace with the given name containing only a root node.
+     * <p>
+     * <b>This method does NOT automatically add the newly created workspace to the {@link #workspaces workspace map} or check to
+     * see if a workspace already exists in this repository with the same name.</b>
+     * </p>
+     * 
+     * @param context the context in which the workspace is to be created
+     * @param name the name of the workspace
+     * @return the newly created workspace; may not be null
+     */
+    @GuardedBy( "getLock()" )
+    protected abstract MapWorkspace createWorkspace( ExecutionContext context,
+                                                     String name );
+
+    /**
+     * Attempts to create a workspace with the given name with name-collision behavior determined by the behavior parameter.
+     * <p>
+     * This method will first check to see if a workspace already exists with the given name. If no such workspace exists, the
+     * method will create a new workspace with the given name, add it to the {@code #workspaces workspaces map}, and return it. If
+     * a workspace with the requested name already exists and the {@code behavior} is {@link CreateConflictBehavior#DO_NOT_CREATE}
+     * , this method will return {@code null} without modifying the state of the repository. If a workspace with the requested
+     * name already exists and the {@code behavior} is {@link CreateConflictBehavior#CREATE_WITH_ADJUSTED_NAME}, this method will
+     * generate a unique new name for the workspace, create a new workspace with the given name, added it to the {@code
+     * #workspaces workspaces map}, and return it.
+     * 
+     * @param context the context in which the workspace is to be created; may not be null
+     * @param name the requested name of the workspace. The name of the workspace that is returned from this method may not be the
+     *        same as the requested name; may not be null
+     * @param behavior the behavior to use in case a workspace with the requested name already exists in the repository
+     * @return the newly created workspace or {@code null} if a workspace with the requested name already exists in the repository
+     *         and {@code behavior == CreateConflictBehavior#DO_NOT_CREATE}.
+     */
+    @GuardedBy( "getLock()" )
+    public MapWorkspace createWorkspace( ExecutionContext context,
+                                         String name,
+                                         CreateConflictBehavior behavior ) {
+        String newName = name;
+        boolean conflictingName = workspaces.containsKey(newName);
+        if (conflictingName) {
+            switch (behavior) {
+                case DO_NOT_CREATE:
+                    return null;
+                case CREATE_WITH_ADJUSTED_NAME:
+                    int counter = 0;
+                    do {
+                        newName = name + (++counter);
+                    } while (workspaces.containsKey(newName));
+                    break;
+            }
+        }
+        assert workspaces.containsKey(newName) == false;
+
+        MapWorkspace workspace = createWorkspace(context, name);
+        workspaces.put(name, workspace);
+        return workspace;
+    }
+
+    /**
+     * Attempts to create a workspace with the requested name as in the
+     * {@link #createWorkspace(ExecutionContext, String, CreateConflictBehavior)} method and then clones the content from the
+     * given source workspace into the new workspace if the creation was successful.
+     * <p>
+     * If no workspace with the name {@code nameOfWorkspaceToClone} exists, the method will return an empty workspace.
+     * </p>
+     * 
+     * @param context the context in which the workspace is to be created; may not be null
+     * @param name the requested name of the workspace. The name of the workspace that is returned from this method may not be the
+     *        same as the requested name; may not be null
+     * @param existingWorkspaceBehavior the behavior to use in case a workspace with the requested name already exists in the
+     *        repository
+     * @param nameOfWorkspaceToClone the name of the workspace from which the content should be cloned; may not be null
+     * @return the newly created workspace with an exact copy of the contents from the workspace named {@code
+     *         nameOfWorkspaceToClone} or {@code null} if a workspace with the requested name already exists in the repository and
+     *         {@code behavior == CreateConflictBehavior#DO_NOT_CREATE}.
+     */
+    @GuardedBy( "getLock()" )
+    public MapWorkspace createWorkspace( ExecutionContext context,
+                                         String name,
+                                         CreateConflictBehavior existingWorkspaceBehavior,
+                                         String nameOfWorkspaceToClone ) {
+        MapWorkspace workspace = createWorkspace(context, name, existingWorkspaceBehavior);
+        if (workspace == null) {
+            // Unable to create because of a duplicate name ...
+            return null;
+        }
+        MapWorkspace original = getWorkspace(nameOfWorkspaceToClone);
+        if (original != null) {
+            // Copy the properties of the root node ...
+            MapNode root = workspace.getRoot();
+            MapNode origRoot = original.getRoot();
+            root.getProperties().clear();
+            root.getProperties().putAll(origRoot.getProperties());
+
+            // Loop over each child and call this method to copy the immediate children (and below).
+            // Note that this makes the copy have the same UUID as the original.
+            for (MapNode originalNode : origRoot.getChildren()) {
+                original.copyNode(context, originalNode, workspace, root, originalNode.getName().getName(), true, UuidConflictBehavior.REPLACE_EXISTING_NODE);
+            }
+        }
+
+        workspaces.put(name, workspace);
+        return workspace;
+    }
+
+    /**
+     * Removes the named workspace from the {@code #workspaces workspaces map}.
+     * 
+     * @param name the name of the workspace to remove
+     * @return {@code true} if a workspace with that name previously existed in the map
+     */
+    @GuardedBy( "getLock()" )
+    public boolean destroyWorkspace( String name ) {
+        return workspaces.remove(name) != null;
+    }
+
+}


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

Added: trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/map/MapRepositoryConnection.java
===================================================================
--- trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/map/MapRepositoryConnection.java	                        (rev 0)
+++ trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/map/MapRepositoryConnection.java	2009-06-27 02:54:06 UTC (rev 1065)
@@ -0,0 +1,132 @@
+/*
+ * 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.map;
+
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.locks.Lock;
+import javax.transaction.xa.XAResource;
+import org.jboss.dna.common.statistic.Stopwatch;
+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.RepositorySourceException;
+import org.jboss.dna.graph.request.Request;
+import org.jboss.dna.graph.request.processor.RequestProcessor;
+
+public class MapRepositoryConnection implements RepositoryConnection {
+    private final MapRepositorySource source;
+    private final MapRepository repository;
+
+    public MapRepositoryConnection( MapRepositorySource source,
+                                  MapRepository repository ) {
+        assert source != null;
+        assert repository != null;
+        this.source = source;
+        this.repository = repository;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public String getSourceName() {
+        return source.getName();
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public CachePolicy getDefaultCachePolicy() {
+        return source.getDefaultCachePolicy();
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public XAResource getXAResource() {
+        return null;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public boolean ping( long time,
+                         TimeUnit unit ) {
+        return true;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void close() {
+        // do nothing
+    }
+
+    /**
+     * {@inheritDoc}
+     * 
+     * @see org.jboss.dna.graph.connector.RepositoryConnection#execute(org.jboss.dna.graph.ExecutionContext,
+     *      org.jboss.dna.graph.request.Request)
+     */
+    public void execute( ExecutionContext context,
+                         Request request ) throws RepositorySourceException {
+        Logger logger = context.getLogger(getClass());
+        Stopwatch sw = null;
+        if (logger.isTraceEnabled()) {
+            sw = new Stopwatch();
+            sw.start();
+        }
+        // Do any commands update/write?
+        RequestProcessor processor = new MapRequestProcessor(context, this.repository, this.source.getRepositoryContext());
+
+        Lock lock = request.isReadOnly() ? repository.getLock().readLock() : repository.getLock().writeLock();
+        lock.lock();
+        try {
+            // Obtain the lock and execute the commands ...
+            processor.process(request);
+        } finally {
+            try {
+                processor.close();
+            } finally {
+                lock.unlock();
+            }
+        }
+        if (logger.isTraceEnabled()) {
+            assert sw != null;
+            sw.stop();
+            logger.trace("MapRepositoryConnection.execute(...) took " + sw.getTotalDuration());
+        }
+    }
+
+    /**
+     * {@inheritDoc}
+     * 
+     * @see java.lang.Object#toString()
+     */
+    @Override
+    public String toString() {
+        return "Connection to the \"" + getSourceName() + "\" " + repository.getClass().getSimpleName();
+    }
+
+}


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

Added: trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/map/MapRepositorySource.java
===================================================================
--- trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/map/MapRepositorySource.java	                        (rev 0)
+++ trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/map/MapRepositorySource.java	2009-06-27 02:54:06 UTC (rev 1065)
@@ -0,0 +1,48 @@
+/*
+ * 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.map;
+
+import org.jboss.dna.graph.cache.CachePolicy;
+import org.jboss.dna.graph.connector.RepositoryContext;
+import org.jboss.dna.graph.connector.RepositorySource;
+
+/**
+ * An extension of the {@link RepositorySource} class that provides a {@link CachePolicy cache policy} and a
+ * {@link RepositoryContext repository context}.
+ */
+public interface MapRepositorySource extends RepositorySource {
+
+    /**
+     * Returns the {@link CachePolicy cache policy} for the repository source 
+     * @return the {@link CachePolicy cache policy} for the repository source
+     */
+    CachePolicy getDefaultCachePolicy();
+
+    /**
+     * Returns the {@link RepositoryContext repository context} for the repository source
+     * @return the {@link RepositoryContext repository context} for the repository source
+     */
+    RepositoryContext getRepositoryContext();
+
+}


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

Added: 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	                        (rev 0)
+++ trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/map/MapRequestProcessor.java	2009-06-27 02:54:06 UTC (rev 1065)
@@ -0,0 +1,485 @@
+/*
+ * 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.map;
+
+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.common.util.CheckArg;
+import org.jboss.dna.graph.DnaLexicon;
+import org.jboss.dna.graph.ExecutionContext;
+import org.jboss.dna.graph.GraphI18n;
+import org.jboss.dna.graph.JcrLexicon;
+import org.jboss.dna.graph.Location;
+import org.jboss.dna.graph.connector.RepositoryContext;
+import org.jboss.dna.graph.property.Name;
+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.Path.Segment;
+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.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.Request;
+import org.jboss.dna.graph.request.UpdatePropertiesRequest;
+import org.jboss.dna.graph.request.VerifyWorkspaceRequest;
+import org.jboss.dna.graph.request.processor.RequestProcessor;
+
+/**
+ * The default implementation of the {@link RequestProcessor} for map repositories.
+ *
+ */
+public class MapRequestProcessor extends RequestProcessor {
+    private final PathFactory pathFactory;
+    private final PropertyFactory propertyFactory;
+    private final MapRepository repository;
+
+    public MapRequestProcessor( ExecutionContext context,
+                                   MapRepository repository,
+                                   RepositoryContext repositoryContext ) {
+        super(repository.getSourceName(), context, repositoryContext != null ? repositoryContext.getObserver() : null);
+        this.repository = repository;
+        pathFactory = context.getValueFactories().getPathFactory();
+        propertyFactory = context.getPropertyFactory();
+    }
+
+    /**
+     * {@inheritDoc}
+     * 
+     * @see org.jboss.dna.graph.request.processor.RequestProcessor#process(org.jboss.dna.graph.request.ReadAllChildrenRequest)
+     */
+    @Override
+    public void process( ReadAllChildrenRequest request ) {
+        MapWorkspace workspace = getWorkspace(request, request.inWorkspace());
+        MapNode node = getTargetNode(workspace, request, request.of());
+        if (node == null) return;
+        Location actualLocation = getActualLocation(request.of().getPath(), node);
+        Path path = actualLocation.getPath();
+        // Get the names of the children ...
+        List<MapNode> children = node.getChildren();
+        for (MapNode child : children) {
+            Segment childName = child.getName();
+            Path childPath = pathFactory.create(path, childName);
+            request.addChild(childPath, propertyFactory.create(DnaLexicon.UUID, child.getUuid()));
+        }
+        request.setActualLocationOfNode(actualLocation);
+        setCacheableInfo(request);
+    }
+
+    @Override
+    public void process( ReadAllPropertiesRequest request ) {
+        MapWorkspace workspace = getWorkspace(request, request.inWorkspace());
+        MapNode node = getTargetNode(workspace, request, request.at());
+        if (node == null) return;
+        // Get the properties of the node ...
+        Location actualLocation = getActualLocation(request.at().getPath(), node);
+        request.addProperty(propertyFactory.create(DnaLexicon.UUID, node.getUuid()));
+        for (Property property : node.getProperties().values()) {
+            request.addProperty(property);
+        }
+        request.setActualLocationOfNode(actualLocation);
+        setCacheableInfo(request);
+    }
+
+    /**
+     * {@inheritDoc}
+     * 
+     * @see org.jboss.dna.graph.request.processor.RequestProcessor#process(org.jboss.dna.graph.request.CopyBranchRequest)
+     */
+    @Override
+    public void process( CopyBranchRequest request ) {
+        MapWorkspace workspace = getWorkspace(request, request.fromWorkspace());
+        MapWorkspace newWorkspace = getWorkspace(request, request.intoWorkspace());
+        if (workspace == null || newWorkspace == null) return;
+        MapNode node = getTargetNode(workspace, request, request.from());
+        if (node == null) return;
+
+        // Look up the new parent, which must exist ...
+        Path newParentPath = request.into().getPath();
+        Name desiredName = request.desiredName();
+        MapNode newParent = newWorkspace.getNode(newParentPath);
+        MapNode newNode = workspace.copyNode(getExecutionContext(),
+                                             node,
+                                             newWorkspace,
+                                             newParent,
+                                             desiredName,
+                                             true,
+                                             request.uuidConflictBehavior());
+        Path newPath = getExecutionContext().getValueFactories().getPathFactory().create(newParentPath, newNode.getName());
+        Location oldLocation = getActualLocation(request.from().getPath(), node);
+        Location newLocation = Location.create(newPath, newNode.getUuid());
+        request.setActualLocations(oldLocation, newLocation);
+        recordChange(request);
+    }
+
+    /**
+     * {@inheritDoc}
+     * 
+     * @see org.jboss.dna.graph.request.processor.RequestProcessor#process(org.jboss.dna.graph.request.CreateNodeRequest)
+     */
+    @Override
+    public void process( CreateNodeRequest request ) {
+        MapWorkspace workspace = getWorkspace(request, request.inWorkspace());
+        if (workspace == null) return;
+        Path parent = request.under().getPath();
+        CheckArg.isNotNull(parent, "request.under().getPath()");
+        MapNode node = null;
+        // Look up the parent node, which must exist ...
+
+        MapNode parentNode = workspace.getNode(parent);
+        if (parentNode == null) {
+            Path lowestExisting = workspace.getLowestExistingPath(parent);
+            request.setError(new PathNotFoundException(request.under(), lowestExisting,
+                                                       GraphI18n.inMemoryNodeDoesNotExist.text(parent)));
+            return;
+        }
+        UUID uuid = null;
+        for (Property property : request.properties()) {
+            if (property.getName().equals(DnaLexicon.UUID) || property.getName().equals(JcrLexicon.UUID)) {
+                uuid = getExecutionContext().getValueFactories().getUuidFactory().create(property.getValues().next());
+                break;
+            }
+        }
+        switch (request.conflictBehavior()) {
+            case APPEND:
+            case DO_NOT_REPLACE:
+                node = workspace.createNode(getExecutionContext(), parentNode, request.named(), uuid);
+                break;
+            case REPLACE:
+                // See if the node already exists (this doesn't record an error on the request) ...
+                node = getTargetNode(workspace, null, Location.create(pathFactory.create(parent, request.named()), uuid));
+                if (node != null) {
+                    workspace.removeNode(getExecutionContext(), node);
+                }
+                node = workspace.createNode(getExecutionContext(), parentNode, request.named(), uuid);
+                break;
+            case UPDATE:
+                // See if the node already exists (this doesn't record an error on the request) ...
+                node = getTargetNode(workspace, null, Location.create(pathFactory.create(parent, request.named()), uuid));
+                if (node == null) {
+                    node = workspace.createNode(getExecutionContext(), parentNode, request.named(), uuid);
+                } // otherwise, we found it and we're setting any properties below
+                break;
+        }
+        assert node != null;
+        Path path = getExecutionContext().getValueFactories().getPathFactory().create(parent, node.getName());
+        // Now add the properties to the supplied node ...
+        for (Property property : request.properties()) {
+            Name propName = property.getName();
+            if (property.size() == 0) {
+                node.getProperties().remove(propName);
+                continue;
+            }
+            if (!propName.equals(DnaLexicon.UUID)) {
+                node.getProperties().put(propName, property);
+            }
+        }
+        Location actualLocation = getActualLocation(path, node);
+        request.setActualLocationOfNode(actualLocation);
+        recordChange(request);
+    }
+
+    /**
+     * {@inheritDoc}
+     * 
+     * @see org.jboss.dna.graph.request.processor.RequestProcessor#process(org.jboss.dna.graph.request.DeleteBranchRequest)
+     */
+    @Override
+    public void process( DeleteBranchRequest request ) {
+        MapWorkspace workspace = getWorkspace(request, request.inWorkspace());
+        if (workspace == null) return;
+        MapNode node = getTargetNode(workspace, request, request.at());
+        if (node == null) return;
+        workspace.removeNode(getExecutionContext(), node);
+        Location actualLocation = getActualLocation(request.at().getPath(), node);
+        request.setActualLocationOfNode(actualLocation);
+        recordChange(request);
+    }
+
+    /**
+     * {@inheritDoc}
+     * 
+     * @see org.jboss.dna.graph.request.processor.RequestProcessor#process(org.jboss.dna.graph.request.MoveBranchRequest)
+     */
+    @Override
+    public void process( MoveBranchRequest request ) {
+        MapWorkspace workspace = getWorkspace(request, request.inWorkspace());
+        if (workspace == null) return;
+
+        MapNode beforeNode = request.before() != null ? getTargetNode(workspace, request, request.before()) : null;
+        MapNode node = getTargetNode(workspace, request, request.from());
+        if (node == null) return;
+        // Look up the new parent, which must exist ...
+        Path newParentPath;
+
+        if (request.into() != null) {
+            newParentPath = request.into().getPath();
+        } else {
+            // into or before cannot both be null
+            assert beforeNode != null;
+
+            // Build the path from the before node to the root.
+            LinkedList<Path.Segment> segments = new LinkedList<Path.Segment>();
+            MapNode current = beforeNode.getParent();
+            while (current != workspace.getRoot()) {
+                segments.addFirst(current.getName());
+                current = current.getParent();
+            }
+            newParentPath = getExecutionContext().getValueFactories().getPathFactory().createAbsolutePath(segments);
+        }
+
+        MapNode newParent = workspace.getNode(newParentPath);
+        workspace.moveNode(getExecutionContext(), node, request.desiredName(), workspace, newParent, beforeNode);
+        assert node.getParent() == newParent;
+        Path newPath = getExecutionContext().getValueFactories().getPathFactory().create(newParentPath, node.getName());
+        Location oldLocation = getActualLocation(request.from().getPath(), node);
+        Location newLocation = Location.create(newPath, node.getUuid());
+        request.setActualLocations(oldLocation, newLocation);
+        recordChange(request);
+    }
+
+    /**
+     * {@inheritDoc}
+     * 
+     * @see org.jboss.dna.graph.request.processor.RequestProcessor#process(org.jboss.dna.graph.request.UpdatePropertiesRequest)
+     */
+    @Override
+    public void process( UpdatePropertiesRequest request ) {
+        MapWorkspace workspace = getWorkspace(request, request.inWorkspace());
+        MapNode node = getTargetNode(workspace, request, request.on());
+        if (node == null) return;
+        // Now set (or remove) the properties to the supplied node ...
+        for (Map.Entry<Name, Property> propertyEntry : request.properties().entrySet()) {
+            Property property = propertyEntry.getValue();
+            if (property == null) {
+                node.getProperties().remove(propertyEntry.getKey());
+                continue;
+            }
+            Name propName = property.getName();
+            if (!propName.equals(DnaLexicon.UUID)) {
+                node.getProperties().put(propName, property);
+            }
+        }
+        Location actualLocation = getActualLocation(request.on().getPath(), node);
+        request.setActualLocationOfNode(actualLocation);
+        recordChange(request);
+    }
+
+    /**
+     * {@inheritDoc}
+     * 
+     * @see org.jboss.dna.graph.request.processor.RequestProcessor#process(org.jboss.dna.graph.request.CreateWorkspaceRequest)
+     */
+    @Override
+    public void process( CreateWorkspaceRequest request ) {
+        MapWorkspace workspace = repository.createWorkspace(getExecutionContext(),
+                                                            request.desiredNameOfNewWorkspace(),
+                                                            request.conflictBehavior());
+        if (workspace == null) {
+            String msg = GraphI18n.workspaceAlreadyExistsInRepository.text(request.desiredNameOfNewWorkspace(),
+                                                                           repository.getSourceName());
+            request.setError(new InvalidWorkspaceException(msg));
+        } else {
+            MapNode root = workspace.getRoot();
+            request.setActualRootLocation(Location.create(pathFactory.createRootPath(), root.getUuid()));
+            request.setActualWorkspaceName(workspace.getName());
+            recordChange(request);
+        }
+    }
+
+    /**
+     * {@inheritDoc}
+     * 
+     * @see org.jboss.dna.graph.request.processor.RequestProcessor#process(org.jboss.dna.graph.request.DestroyWorkspaceRequest)
+     */
+    @Override
+    public void process( DestroyWorkspaceRequest request ) {
+        MapWorkspace workspace = repository.getWorkspace(request.workspaceName());
+        if (workspace != null) {
+            MapNode root = workspace.getRoot();
+            request.setActualRootLocation(Location.create(pathFactory.createRootPath(), root.getUuid()));
+            recordChange(request);
+        } else {
+            String msg = GraphI18n.workspaceDoesNotExistInRepository.text(request.workspaceName(), repository.getSourceName());
+            request.setError(new InvalidWorkspaceException(msg));
+        }
+    }
+
+    /**
+     * {@inheritDoc}
+     * 
+     * @see org.jboss.dna.graph.request.processor.RequestProcessor#process(org.jboss.dna.graph.request.GetWorkspacesRequest)
+     */
+    @Override
+    public void process( GetWorkspacesRequest request ) {
+        Set<String> names = repository.getWorkspaceNames();
+        request.setAvailableWorkspaceNames(new HashSet<String>(names));
+        setCacheableInfo(request);
+    }
+
+    /**
+     * {@inheritDoc}
+     * 
+     * @see org.jboss.dna.graph.request.processor.RequestProcessor#process(org.jboss.dna.graph.request.VerifyWorkspaceRequest)
+     */
+    @Override
+    public void process( VerifyWorkspaceRequest request ) {
+        MapWorkspace original = getWorkspace(request, request.workspaceName());
+        if (original != null) {
+            Path path = getExecutionContext().getValueFactories().getPathFactory().createRootPath();
+            request.setActualRootLocation(Location.create(path, original.getRoot().getUuid()));
+            request.setActualWorkspaceName(original.getName());
+        }
+    }
+
+    /**
+     * {@inheritDoc}
+     * 
+     * @see org.jboss.dna.graph.request.processor.RequestProcessor#process(org.jboss.dna.graph.request.CloneWorkspaceRequest)
+     */
+    @Override
+    public void process( CloneWorkspaceRequest request ) {
+        // Find the original workspace that we're cloning ...
+        final ExecutionContext context = getExecutionContext();
+        String targetWorkspaceName = request.desiredNameOfTargetWorkspace();
+        String nameOfWorkspaceToBeCloned = request.nameOfWorkspaceToBeCloned();
+        MapWorkspace original = repository.getWorkspace(nameOfWorkspaceToBeCloned);
+        MapWorkspace target = repository.getWorkspace(targetWorkspaceName);
+        if (original == null) {
+            switch (request.cloneConflictBehavior()) {
+                case DO_NOT_CLONE:
+                    String msg = GraphI18n.workspaceDoesNotExistInRepository.text(nameOfWorkspaceToBeCloned,
+                                                                                  repository.getSourceName());
+                    request.setError(new InvalidWorkspaceException(msg));
+                    return;
+                case SKIP_CLONE:
+                    target = repository.createWorkspace(context, targetWorkspaceName, request.targetConflictBehavior());
+                    if (target == null) {
+                        msg = GraphI18n.workspaceAlreadyExistsInRepository.text(targetWorkspaceName, repository.getSourceName());
+                        request.setError(new InvalidWorkspaceException(msg));
+                    } else {
+                        MapNode root = target.getRoot();
+                        request.setActualRootLocation(Location.create(pathFactory.createRootPath(), root.getUuid()));
+                        request.setActualWorkspaceName(target.getName());
+                    }
+                    return;
+            }
+        }
+        assert original != null;
+        target = repository.createWorkspace(context,
+                                            targetWorkspaceName,
+                                            request.targetConflictBehavior(),
+                                            nameOfWorkspaceToBeCloned);
+        if (target == null) {
+            // Since the original was there, the only reason the target wasn't created was because the workspace already existed
+            // ...
+            String msg = GraphI18n.workspaceAlreadyExistsInRepository.text(targetWorkspaceName, repository.getSourceName());
+            request.setError(new InvalidWorkspaceException(msg));
+        } else {
+            MapNode root = target.getRoot();
+            request.setActualRootLocation(Location.create(pathFactory.createRootPath(), root.getUuid()));
+            request.setActualWorkspaceName(target.getName());
+            recordChange(request);
+        }
+    }
+
+    protected Location getActualLocation( Path path,
+                                          MapNode node ) {
+        if (path == null) {
+            // Find the path on the node ...
+            LinkedList<Path.Segment> segments = new LinkedList<Path.Segment>();
+            MapNode n = node;
+            while (n != null) {
+                if (n.getParent() == null) break;
+                segments.addFirst(n.getName());
+                n = n.getParent();
+            }
+            path = pathFactory.createAbsolutePath(segments);
+        }
+        return Location.create(path, node.getUuid());
+    }
+
+    protected MapWorkspace getWorkspace( Request request,
+                                         String workspaceName ) {
+        // Get the workspace for this request ...
+        MapWorkspace workspace = repository.getWorkspace(workspaceName);
+        if (workspace == null) {
+            String msg = GraphI18n.workspaceDoesNotExistInRepository.text(workspaceName, repository.getSourceName());
+            request.setError(new InvalidWorkspaceException(msg));
+        }
+        return workspace;
+    }
+
+    protected MapNode getTargetNode( MapWorkspace workspace,
+                                     Request request,
+                                     Location location ) {
+        if (workspace == null) return null;
+        // Check first for the UUID ...
+        MapNode node = null;
+        UUID uuid = location.getUuid();
+        if (uuid != null) {
+            node = workspace.getNode(uuid);
+        }
+        Path path = null;
+        if (node == null) {
+            // Look up the node with the supplied path ...
+            path = location.getPath();
+            if (path != null) {
+                node = workspace.getNode(path);
+            }
+        }
+        if (node == null && request != null) {
+            if (path == null) {
+                if (uuid == null) {
+                    // Missing both path and UUID ...
+                    I18n msg = GraphI18n.inMemoryConnectorRequestsMustHavePathOrUuid;
+                    request.setError(new IllegalArgumentException(msg.text()));
+                    return null;
+                }
+                // Missing path, and could not find by UUID ...
+                request.setError(new PathNotFoundException(location, pathFactory.createRootPath(),
+                                                           GraphI18n.inMemoryNodeDoesNotExist.text(path)));
+                return null;
+            }
+            // Could not find the node given the supplied path, so find the lowest path that does exist ...
+            Path lowestExisting = workspace.getLowestExistingPath(path);
+            request.setError(new PathNotFoundException(location, lowestExisting, GraphI18n.inMemoryNodeDoesNotExist.text(path)));
+        }
+        return node;
+    }
+}


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

Added: trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/map/MapWorkspace.java
===================================================================
--- trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/map/MapWorkspace.java	                        (rev 0)
+++ trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/map/MapWorkspace.java	2009-06-27 02:54:06 UTC (rev 1065)
@@ -0,0 +1,172 @@
+/*
+ * 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.map;
+
+import java.util.UUID;
+import org.jboss.dna.graph.ExecutionContext;
+import org.jboss.dna.graph.connector.UuidAlreadyExistsException;
+import org.jboss.dna.graph.property.Name;
+import org.jboss.dna.graph.property.Path;
+import org.jboss.dna.graph.property.PathFactory;
+import org.jboss.dna.graph.request.UuidConflictBehavior;
+
+/**
+ * The {@code MapWorkspace} defines the required methods for workspaces in a {@link MapRepository map repository}. By default, a
+ * map repository supports multiple workspaces, each equating logically to a map of UUIDs to {@link MapNode map nodes}.
+ * <p>
+ * As each map node (except the root-node for the workspace) has a non-null parent and a set of children, the {@link MapNode map
+ * nodes} naturally construct a tree within the workspace.
+ * </p>
+ */
+public interface MapWorkspace {
+
+    /**
+     * Returns the name of the workspace. There can only be one workspace with a given name per repository.
+     * 
+     * @return the name of the workspace
+     */
+    String getName();
+
+    /**
+     * Returns the root node in the workspace. This returns a {@link MapNode map node} where {@code node.getParent() == null} and
+     * {@code node.getUuid() == repository.getRootNodeUuid()}.
+     * 
+     * @return the root node in the workspace
+     */
+    MapNode getRoot();
+
+    /**
+     * Returns the node with the given UUID, if one exists or {@code null} if no {@MapNode node} with the given UUID
+     * exists in the workspace.
+     * <p>
+     * That is, {@code node == null || node.getUuid().equals(uuid)} for the returned node.
+     * </p>
+     * 
+     * @param uuid the UUID of the node to be retrieved; may not be null
+     * @return the node with the given UUID, if one exists or {@code null} if no {@MapNode node} with the given UUID
+     *         exists in the workspace.
+     */
+    MapNode getNode( UUID uuid );
+
+    /**
+     * Returns the node at the given path, if one exists of {@code null} if no {@MapNode node} exists at the given path.
+     * 
+     * @param path the path of the node to retrieve; may not be null
+     * @return the node at the given path, if one exists of {@code null} if no {@MapNode node} exists at the given path.
+     */
+    MapNode getNode( Path path );
+
+    /**
+     * Removes the given node. This method will return silently if the given node does not exist in this workspace.
+     * 
+     * @param context the current execution context; may not be null
+     * @param node the node to be removed; may not be null
+     */
+    void removeNode( ExecutionContext context,
+                     MapNode node );
+
+    /**
+     * Create a node at the supplied path. The parent of the new node must already exist.
+     * 
+     * @param context the environment; may not be null
+     * @param pathToNewNode the path to the new node; may not be null
+     * @return the new node (or root if the path specified the root)
+     */
+    MapNode createNode( ExecutionContext context,
+                        String pathToNewNode );
+
+    /**
+     * Create a new node with the supplied name, as a child of the supplied parent.
+     * 
+     * @param context the execution context
+     * @param parentNode the parent node; may not be null
+     * @param name the name; may not be null
+     * @param uuid the UUID of the node, or null if the UUID is to be generated
+     * @return the new node
+     */
+    MapNode createNode( ExecutionContext context,
+                        MapNode parentNode,
+                        Name name,
+                        UUID uuid );
+
+    /**
+     * Move the supplied node to the new parent. This method automatically removes the node from its existing parent, and also
+     * correctly adjusts the {@link Path.Segment#getIndex() index} to be correct in the new parent.
+     * 
+     * @param context
+     * @param node the node to be moved; may not be the {@link MapWorkspace#getRoot() root}
+     * @param desiredNewName the new name for the node, if it is to be changed; may be null
+     * @param newWorkspace the workspace containing the new parent node
+     * @param newParent the new parent; may not be the {@link MapWorkspace#getRoot() root}
+     * @param beforeNode the node before which this new node should be placed
+     */
+    void moveNode( ExecutionContext context,
+                   MapNode node,
+                   Name desiredNewName,
+                   MapWorkspace newWorkspace,
+                   MapNode newParent,
+                   MapNode beforeNode );
+
+    /**
+     * This should copy the subgraph given by the original node and place the new copy under the supplied new parent. Note that
+     * internal references between nodes within the original subgraph must be reflected as internal nodes within the new subgraph.
+     * 
+     * @param context the context; may not be null
+     * @param original the node to be copied; may not be null
+     * @param newWorkspace the workspace containing the new parent node; may not be null
+     * @param newParent the parent where the copy is to be placed; may not be null
+     * @param desiredName the desired name for the node; if null, the name will be obtained from the original node
+     * @param recursive true if the copy should be recursive
+     * @param uuidConflictBehavior the behavior to use to manage UUIDs from the source into the target
+     * @return the new node, which is the top of the new subgraph
+     * @throws UuidAlreadyExistsException if {@code uuidConflictBehavior} is true and and a UUID in the source tree alread exists
+     *         in the new workspace
+     */
+    MapNode copyNode( ExecutionContext context,
+                      MapNode original,
+                      MapWorkspace newWorkspace,
+                      MapNode newParent,
+                      Name desiredName,
+                      boolean recursive,
+                      UuidConflictBehavior uuidConflictBehavior ) throws UuidAlreadyExistsException;
+
+    /**
+     * Find the lowest existing node along the path.
+     * 
+     * @param path the path to the node; may not be null
+     * @return the lowest existing node along the path, or the root node if no node exists on the path
+     */
+    Path getLowestExistingPath( Path path );
+
+    /**
+     * Returns the path for the given node with this workspace if one exists, or a {@code null} if no node exists at the given
+     * path.
+     * 
+     * @param pathFactory the path factory to use to construct the path; may not be null
+     * @param node the node for which the path should be retrieved; may not be null
+     * @return the path for the given node with this workspace if one exists or null if the node does not exist in this workspace
+     */
+    Path pathFor( PathFactory pathFactory,
+                  MapNode node );
+}


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

Added: trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/map/package-info.java
===================================================================
--- trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/map/package-info.java	                        (rev 0)
+++ trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/map/package-info.java	2009-06-27 02:54:06 UTC (rev 1065)
@@ -0,0 +1,72 @@
+/*
+ * 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 MapRepository} class and its supporting classes provide a default implementation of the connector
+ * classes for connectors that support the transient or persistent mapping of a UUID to a {@link MapNode standard
+ * representation of a node}.
+ * To implement a connector based on this framework, one must create an implementation of {@link MapRepositorySource the repository source},
+ * an implementation of {@link MapRepository the repository itself}, and an implementation of {@link MapWorkspace the workspace}.
+ * <p>
+ * The {@link MapRepositorySource repository source implementation} contains properties for the repository configuration and caching policies.  A key
+ * method in the {@code MapRepositorySource} implementation if the {@link org.jboss.dna.graph.connector.RepositorySource#getConnection()} method,
+ * which should generally be implemented using the {@link MapRepositoryConnection default connection implementation}.
+ * <pre>
+ * if (repository == null) {
+ *  repository = new InMemoryRepository(name, rootNodeUuid, defaultWorkspaceName);
+ * }
+ * return new MapRepositoryConnection(this, repository); 
+ * </pre>
+ * </p>
+ * <p>
+ * The {@link MapRepository repository implementation} is only required to provide an implementation of the {@link MapRepository#createWorkspace(org.jboss.dna.graph.ExecutionContext, String)}
+ * method that returns the appropriate {@link MapWorkspace workspace} implementation for the connector.  However, all constructors for the repository must 
+ * call {@link MapRepository#initialize()} after the constructor has completed its initialization, as demonstrated below:
+ * <pre>
+ * public InMemoryRepository( String sourceName,
+ *                            UUID rootNodeUuid,
+ *                            String defaultWorkspaceName ) {
+ *   initialize();
+ * }
+ * </pre>
+ * </p>
+ * <p>
+ * Finally, the {@link MapWorkspace workspace implementation} must be created.  Implementors should consider extending the {@link AbstractMapWorkspace} class, which provides reasonable default implementations (assuming that the backing map provides O(1) lookups - a sine qua non for maps) for almost
+ * this class imposes a requirement that its {@link AbstractMapWorkspace#initialize()} method also be called at the end of each constructor, like so:
+ * <pre>
+ *  public Workspace( MapRepository repository,
+ *                    String name ) {
+ *      super(repository, name);
+ *
+ *      initialize();
+ *  }
+ * </pre>
+ * </p>
+ * 
+ * @see org.jboss.dna.graph.connector.inmemory.InMemoryRepository
+ * @see org.jboss.dna.graph.connector.inmemory.InMemoryRepositorySource
+ * @see org.jboss.dna.graph.connector.inmemory.InMemoryRepository#Workspace
+ */
+
+package org.jboss.dna.graph.connector.map;
+


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

Modified: trunk/dna-graph/src/test/java/org/jboss/dna/graph/connector/inmemory/InMemoryRepositoryTest.java
===================================================================
--- trunk/dna-graph/src/test/java/org/jboss/dna/graph/connector/inmemory/InMemoryRepositoryTest.java	2009-06-24 22:14:12 UTC (rev 1064)
+++ trunk/dna-graph/src/test/java/org/jboss/dna/graph/connector/inmemory/InMemoryRepositoryTest.java	2009-06-27 02:54:06 UTC (rev 1065)
@@ -31,7 +31,8 @@
 import static org.junit.matchers.JUnitMatchers.hasItems;
 import java.util.UUID;
 import org.jboss.dna.graph.ExecutionContext;
-import org.jboss.dna.graph.connector.inmemory.InMemoryRepository.Workspace;
+import org.jboss.dna.graph.connector.map.MapNode;
+import org.jboss.dna.graph.connector.map.MapWorkspace;
 import org.jboss.dna.graph.property.Name;
 import org.jboss.dna.graph.property.NameFactory;
 import org.jboss.dna.graph.property.PathFactory;
@@ -99,7 +100,7 @@
         String workspaceName = "New Workspace";
         assertThat(repository.createWorkspace(context, workspaceName, CreateConflictBehavior.DO_NOT_CREATE), is(notNullValue()));
         assertThat(repository.getWorkspaceNames(), hasItems(workspaceName));
-        Workspace secondWorkspace = repository.createWorkspace(context,
+        MapWorkspace secondWorkspace = repository.createWorkspace(context,
                                                                workspaceName,
                                                                CreateConflictBehavior.CREATE_WITH_ADJUSTED_NAME);
         assertThat(secondWorkspace, is(notNullValue()));
@@ -124,25 +125,25 @@
     @Test
     public void shouldCloneWorkspaceAndCopyContentsIfWorkspaceWithSpecifiedNameExists() {
         String workspaceName = "Original Workspace";
-        Workspace workspace = repository.createWorkspace(context, workspaceName, CreateConflictBehavior.DO_NOT_CREATE);
+        MapWorkspace workspace = repository.createWorkspace(context, workspaceName, CreateConflictBehavior.DO_NOT_CREATE);
         assertThat(workspace, is(notNullValue()));
         assertThat(repository.getWorkspaceNames(), hasItems(workspaceName));
 
         // Populate the workspace with a few nodes ...
-        InMemoryNode root = workspace.getRoot();
-        InMemoryNode node_a = workspace.createNode(context, root, nameFactory.create("a"), null);
-        InMemoryNode node_b = workspace.createNode(context, node_a, nameFactory.create("b"), null);
-        InMemoryNode node_c = workspace.createNode(context, node_b, nameFactory.create("c"), null);
-        InMemoryNode node_d = workspace.createNode(context, root, nameFactory.create("d"), null);
-        InMemoryNode node_e = workspace.createNode(context, node_d, nameFactory.create("e"), null);
-        InMemoryNode node_b2 = workspace.createNode(context, node_d, nameFactory.create("b"), null);
+        MapNode root = workspace.getRoot();
+        MapNode node_a = workspace.createNode(context, root, nameFactory.create("a"), null);
+        MapNode node_b = workspace.createNode(context, node_a, nameFactory.create("b"), null);
+        MapNode node_c = workspace.createNode(context, node_b, nameFactory.create("c"), null);
+        MapNode node_d = workspace.createNode(context, root, nameFactory.create("d"), null);
+        MapNode node_e = workspace.createNode(context, node_d, nameFactory.create("e"), null);
+        MapNode node_b2 = workspace.createNode(context, node_d, nameFactory.create("b"), null);
 
         ValueFactory<String> stringFactory = context.getValueFactories().getStringFactory();
         Name propertyName = nameFactory.create("something");
         Property property = propertyFactory.create(propertyName, stringFactory.create("Worth the wait"));
-        node_b.getProperties().put(propertyName, property);
+        node_b.setProperty(property);
 
-        assertThat(workspace.getNodesByUuid().size(), is(7));
+        assertThat(((InMemoryRepository.Workspace) workspace).size(), is(7));
         assertThat(workspace.getNode(pathFactory.create("/")), is(sameInstance(workspace.getRoot())));
         assertThat(workspace.getNode(pathFactory.create("/a")), is(sameInstance(node_a)));
         assertThat(workspace.getNode(pathFactory.create("/a/b")), is(sameInstance(node_b)));
@@ -150,11 +151,11 @@
         assertThat(workspace.getNode(pathFactory.create("/d")), is(sameInstance(node_d)));
         assertThat(workspace.getNode(pathFactory.create("/d/e")), is(sameInstance(node_e)));
         assertThat(workspace.getNode(pathFactory.create("/d/b")), is(sameInstance(node_b2)));
-        assertThat(workspace.getNode(pathFactory.create("/a/b")).getProperties().get(propertyName), is(property));
+        assertThat(workspace.getNode(pathFactory.create("/a/b")).getProperty(propertyName), is(property));
 
         // Now clone the workspace ...
         String newWorkspaceName = "New Workspace";
-        Workspace new_workspace = repository.createWorkspace(context,
+        MapWorkspace new_workspace = repository.createWorkspace(context,
                                                              newWorkspaceName,
                                                              CreateConflictBehavior.DO_NOT_CREATE,
                                                              workspaceName);
@@ -162,7 +163,7 @@
         assertThat(repository.getWorkspaceNames(), hasItems(workspaceName, newWorkspaceName));
 
         // Now check that the original workspace still has its content ...
-        assertThat(workspace.getNodesByUuid().size(), is(7));
+        assertThat(((InMemoryRepository.Workspace) workspace).size(), is(7));
         assertThat(workspace.getNode(pathFactory.create("/")), is(sameInstance(workspace.getRoot())));
         assertThat(workspace.getNode(pathFactory.create("/a")), is(sameInstance(node_a)));
         assertThat(workspace.getNode(pathFactory.create("/a/b")), is(sameInstance(node_b)));
@@ -170,10 +171,10 @@
         assertThat(workspace.getNode(pathFactory.create("/d")), is(sameInstance(node_d)));
         assertThat(workspace.getNode(pathFactory.create("/d/e")), is(sameInstance(node_e)));
         assertThat(workspace.getNode(pathFactory.create("/d/b")), is(sameInstance(node_b2)));
-        assertThat(workspace.getNode(pathFactory.create("/a/b")).getProperties().get(propertyName), is(property));
+        assertThat(workspace.getNode(pathFactory.create("/a/b")).getProperty(propertyName), is(property));
 
         // Now check that the new workspace has its content ...
-        assertThat(new_workspace.getNodesByUuid().size(), is(7));
+        assertThat(((InMemoryRepository.Workspace) new_workspace).size(), is(7));
 
         // Since we cloned workspaces, the UUIDs should be the same in each workspace ...
         assertThat(workspace.getNode(pathFactory.create("/")).getUuid(),
@@ -195,25 +196,25 @@
     @Test
     public void shouldCloneWorkspaceButShouldNotCopyContentsIfWorkspaceWithSpecifiedNameDoesNotExist() {
         String workspaceName = "Original Workspace";
-        Workspace workspace = repository.createWorkspace(context, workspaceName, CreateConflictBehavior.DO_NOT_CREATE);
+        MapWorkspace workspace = repository.createWorkspace(context, workspaceName, CreateConflictBehavior.DO_NOT_CREATE);
         assertThat(workspace, is(notNullValue()));
         assertThat(repository.getWorkspaceNames(), hasItems(workspaceName));
 
         // Populate the workspace with a few nodes ...
-        InMemoryNode root = workspace.getRoot();
-        InMemoryNode node_a = workspace.createNode(context, root, nameFactory.create("a"), null);
-        InMemoryNode node_b = workspace.createNode(context, node_a, nameFactory.create("b"), null);
-        InMemoryNode node_c = workspace.createNode(context, node_b, nameFactory.create("c"), null);
-        InMemoryNode node_d = workspace.createNode(context, root, nameFactory.create("d"), null);
-        InMemoryNode node_e = workspace.createNode(context, node_d, nameFactory.create("e"), null);
-        InMemoryNode node_b2 = workspace.createNode(context, node_d, nameFactory.create("b"), null);
+        MapNode root = workspace.getRoot();
+        MapNode node_a = workspace.createNode(context, root, nameFactory.create("a"), null);
+        MapNode node_b = workspace.createNode(context, node_a, nameFactory.create("b"), null);
+        MapNode node_c = workspace.createNode(context, node_b, nameFactory.create("c"), null);
+        MapNode node_d = workspace.createNode(context, root, nameFactory.create("d"), null);
+        MapNode node_e = workspace.createNode(context, node_d, nameFactory.create("e"), null);
+        MapNode node_b2 = workspace.createNode(context, node_d, nameFactory.create("b"), null);
 
         ValueFactory<String> stringFactory = context.getValueFactories().getStringFactory();
         Name propertyName = nameFactory.create("something");
         Property property = propertyFactory.create(propertyName, stringFactory.create("Worth the wait"));
-        node_b.getProperties().put(propertyName, property);
+        node_b.setProperty(property);
 
-        assertThat(workspace.getNodesByUuid().size(), is(7));
+        assertThat(((InMemoryRepository.Workspace) workspace).size(), is(7));
         assertThat(workspace.getNode(pathFactory.create("/")), is(sameInstance(workspace.getRoot())));
         assertThat(workspace.getNode(pathFactory.create("/a")), is(sameInstance(node_a)));
         assertThat(workspace.getNode(pathFactory.create("/a/b")), is(sameInstance(node_b)));
@@ -221,11 +222,11 @@
         assertThat(workspace.getNode(pathFactory.create("/d")), is(sameInstance(node_d)));
         assertThat(workspace.getNode(pathFactory.create("/d/e")), is(sameInstance(node_e)));
         assertThat(workspace.getNode(pathFactory.create("/d/b")), is(sameInstance(node_b2)));
-        assertThat(workspace.getNode(pathFactory.create("/a/b")).getProperties().get(propertyName), is(property));
+        assertThat(workspace.getNode(pathFactory.create("/a/b")).getProperty(propertyName), is(property));
 
         // Now clone the workspace ...
         String newWorkspaceName = "New Workspace";
-        Workspace new_workspace = repository.createWorkspace(context,
+        MapWorkspace new_workspace = repository.createWorkspace(context,
                                                              newWorkspaceName,
                                                              CreateConflictBehavior.DO_NOT_CREATE,
                                                              "non-existant workspace");

Modified: trunk/dna-graph/src/test/java/org/jboss/dna/graph/connector/inmemory/InMemoryRepositoryWorkspaceTest.java
===================================================================
--- trunk/dna-graph/src/test/java/org/jboss/dna/graph/connector/inmemory/InMemoryRepositoryWorkspaceTest.java	2009-06-24 22:14:12 UTC (rev 1064)
+++ trunk/dna-graph/src/test/java/org/jboss/dna/graph/connector/inmemory/InMemoryRepositoryWorkspaceTest.java	2009-06-27 02:54:06 UTC (rev 1065)
@@ -34,7 +34,7 @@
 import java.util.Map;
 import java.util.UUID;
 import org.jboss.dna.graph.ExecutionContext;
-import org.jboss.dna.graph.connector.inmemory.InMemoryRepository.Workspace;
+import org.jboss.dna.graph.connector.map.MapNode;
 import org.jboss.dna.graph.property.Name;
 import org.jboss.dna.graph.property.NameFactory;
 import org.jboss.dna.graph.property.PathFactory;
@@ -75,7 +75,7 @@
         rootUuid = UUID.randomUUID();
         repository = new InMemoryRepository(repositoryName, rootUuid);
         workspaceName = "My Workspace";
-        workspace = repository.createWorkspace(context, workspaceName, CreateConflictBehavior.DO_NOT_CREATE);
+        workspace = (InMemoryRepository.Workspace) repository.createWorkspace(context, workspaceName, CreateConflictBehavior.DO_NOT_CREATE);
     }
 
     @Test
@@ -97,33 +97,33 @@
     public void shouldAllowRootToBeRemoved() {
         workspace.removeNode(context, workspace.getRoot());
         assertThat(workspace.getRoot().getChildren().size(), is(0));
-        assertThat(workspace.getRoot().getProperties().size(), is(0));
+        // assertThat(workspace.getRoot().getProperties().size(), is(0));
     }
 
     @Test
     public void shouldCreateNodesByPath() {
         Name name_a = nameFactory.create("a");
-        InMemoryNode node_a = workspace.createNode(context, workspace.getRoot(), name_a, null);
+        MapNode node_a = workspace.createNode(context, workspace.getRoot(), name_a, null);
         assertThat(node_a, is(notNullValue()));
         assertThat(node_a.getParent(), is(workspace.getRoot()));
         assertThat(node_a.getName().getName(), is(name_a));
         assertThat(node_a.getName().hasIndex(), is(false));
 
         Name name_b = nameFactory.create("b");
-        InMemoryNode node_b = workspace.createNode(context, node_a, name_b, null);
+        MapNode node_b = workspace.createNode(context, node_a, name_b, null);
         assertThat(node_b, is(notNullValue()));
         assertThat(node_b.getParent(), is(node_a));
         assertThat(node_b.getName().getName(), is(name_b));
         assertThat(node_b.getName().hasIndex(), is(false));
 
         Name name_c = nameFactory.create("c");
-        InMemoryNode node_c = workspace.createNode(context, node_b, name_c, null);
+        MapNode node_c = workspace.createNode(context, node_b, name_c, null);
         assertThat(node_c, is(notNullValue()));
         assertThat(node_c.getParent(), is(node_b));
         assertThat(node_c.getName().getName(), is(name_c));
         assertThat(node_c.getName().hasIndex(), is(false));
 
-        assertThat(workspace.getNodesByUuid().size(), is(4));
+        assertThat(workspace.size(), is(4));
         assertThat(workspace.getNode(pathFactory.create("/")), is(sameInstance(workspace.getRoot())));
         assertThat(workspace.getNode(pathFactory.create("/a")), is(sameInstance(node_a)));
         assertThat(workspace.getNode(pathFactory.create("/a/b")), is(sameInstance(node_b)));
@@ -132,11 +132,11 @@
 
     @Test
     public void shouldNotFindNodesThatDoNotExist() {
-        InMemoryNode node_a = workspace.createNode(context, workspace.getRoot(), nameFactory.create("a"), null);
-        InMemoryNode node_b = workspace.createNode(context, node_a, nameFactory.create("b"), null);
+        MapNode node_a = workspace.createNode(context, workspace.getRoot(), nameFactory.create("a"), null);
+        MapNode node_b = workspace.createNode(context, node_a, nameFactory.create("b"), null);
         /*Node node_c =*/workspace.createNode(context, node_b, nameFactory.create("c"), null);
 
-        assertThat(workspace.getNodesByUuid().size(), is(4));
+        assertThat(workspace.size(), is(4));
         assertThat(workspace.getNode(pathFactory.create("/a")), is(node_a));
         assertThat(workspace.getNode(pathFactory.create("/a/b")), is(node_b));
         assertThat(workspace.getNode(pathFactory.create("/a[1]")), is(node_a));
@@ -150,50 +150,50 @@
     @Test
     public void shouldCorrectlyManageIndexesOfSiblingsWithSameNames() {
         Name name_a1 = nameFactory.create("a");
-        InMemoryNode node_a1 = workspace.createNode(context, workspace.getRoot(), name_a1, null);
+        MapNode node_a1 = workspace.createNode(context, workspace.getRoot(), name_a1, null);
         assertThat(node_a1, is(notNullValue()));
         assertThat(node_a1.getParent(), is(workspace.getRoot()));
         assertThat(node_a1.getName().getName(), is(name_a1));
         assertThat(node_a1.getName().hasIndex(), is(false));
 
         Name name_a2 = nameFactory.create("a");
-        InMemoryNode node_a2 = workspace.createNode(context, workspace.getRoot(), name_a2, null);
+        MapNode node_a2 = workspace.createNode(context, workspace.getRoot(), name_a2, null);
         assertThat(node_a2, is(notNullValue()));
         assertThat(node_a2.getParent(), is(workspace.getRoot()));
         assertThat(node_a2.getName().getName(), is(name_a2));
         assertThat(node_a2.getName().hasIndex(), is(true));
         assertThat(node_a2.getName().getIndex(), is(2));
 
-        // node 1 should now have an index ...
+        // node 1 should now have an index ..
         assertThat(node_a1.getName().getIndex(), is(1));
 
-        // Add another node without the same name ...
+        // Add another node without the same name ..
         Name name_b = nameFactory.create("b");
-        InMemoryNode node_b = workspace.createNode(context, workspace.getRoot(), name_b, null);
+        MapNode node_b = workspace.createNode(context, workspace.getRoot(), name_b, null);
         assertThat(node_b, is(notNullValue()));
         assertThat(node_b.getParent(), is(workspace.getRoot()));
         assertThat(node_b.getName().getName(), is(name_b));
         assertThat(node_b.getName().hasIndex(), is(false));
 
-        // Add a third node with the same name ...
+        // Add a third node with the same name ..
         Name name_a3 = nameFactory.create("a");
-        InMemoryNode node_a3 = workspace.createNode(context, workspace.getRoot(), name_a3, null);
+        MapNode node_a3 = workspace.createNode(context, workspace.getRoot(), name_a3, null);
         assertThat(node_a3, is(notNullValue()));
         assertThat(node_a3.getParent(), is(workspace.getRoot()));
         assertThat(node_a3.getName().getName(), is(name_a3));
         assertThat(node_a3.getName().hasIndex(), is(true));
         assertThat(node_a3.getName().getIndex(), is(3));
 
-        // Check the number of children ...
+        // Check the number of children ..
         assertThat(workspace.getRoot().getChildren().size(), is(4));
         assertThat(workspace.getRoot().getChildren(), hasItems(node_a1, node_a2, node_b, node_a3));
-        assertThat(workspace.getNodesByUuid().size(), is(5));
+        assertThat(workspace.size(), is(5));
         assertThat(workspace.getNode(pathFactory.create("/a[1]")), is(sameInstance(node_a1)));
         assertThat(workspace.getNode(pathFactory.create("/a[2]")), is(sameInstance(node_a2)));
         assertThat(workspace.getNode(pathFactory.create("/a[3]")), is(sameInstance(node_a3)));
         assertThat(workspace.getNode(pathFactory.create("/b")), is(sameInstance(node_b)));
 
-        // Removing a node with the same name will reduce the index ...
+        // Removing a node with the same name will reduce the index ..
         workspace.removeNode(context, node_a2);
         assertThat(workspace.getRoot().getChildren().size(), is(3));
         assertThat(workspace.getRoot().getChildren(), hasItems(node_a1, node_b, node_a3));
@@ -201,26 +201,26 @@
         assertThat(node_b.getName().hasIndex(), is(false));
         assertThat(node_a3.getName().getIndex(), is(2));
 
-        // Removing a node with the same name will reduce the index ...
+        // Removing a node with the same name will reduce the index ..
         workspace.removeNode(context, node_a1);
         assertThat(workspace.getRoot().getChildren().size(), is(2));
         assertThat(workspace.getRoot().getChildren(), hasItems(node_b, node_a3));
         assertThat(node_b.getName().hasIndex(), is(false));
         assertThat(node_a3.getName().hasIndex(), is(false));
-        assertThat(workspace.getNodesByUuid().size(), is(3));
+        assertThat(workspace.size(), is(3));
     }
 
     @Test
     public void shouldMoveNodesWithinSameWorkspace() {
-        InMemoryNode root = workspace.getRoot();
-        InMemoryNode node_a = workspace.createNode(context, root, nameFactory.create("a"), null);
-        InMemoryNode node_b = workspace.createNode(context, node_a, nameFactory.create("b"), null);
-        InMemoryNode node_c = workspace.createNode(context, node_b, nameFactory.create("c"), null);
-        InMemoryNode node_d = workspace.createNode(context, root, nameFactory.create("d"), null);
-        InMemoryNode node_e = workspace.createNode(context, node_d, nameFactory.create("e"), null);
-        InMemoryNode node_b2 = workspace.createNode(context, node_d, nameFactory.create("b"), null);
+        MapNode root = workspace.getRoot();
+        MapNode node_a = workspace.createNode(context, root, nameFactory.create("a"), null);
+        MapNode node_b = workspace.createNode(context, node_a, nameFactory.create("b"), null);
+        MapNode node_c = workspace.createNode(context, node_b, nameFactory.create("c"), null);
+        MapNode node_d = workspace.createNode(context, root, nameFactory.create("d"), null);
+        MapNode node_e = workspace.createNode(context, node_d, nameFactory.create("e"), null);
+        MapNode node_b2 = workspace.createNode(context, node_d, nameFactory.create("b"), null);
 
-        assertThat(workspace.getNodesByUuid().size(), is(7));
+        assertThat(workspace.size(), is(7));
         assertThat(workspace.getNode(pathFactory.create("/")), is(sameInstance(workspace.getRoot())));
         assertThat(workspace.getNode(pathFactory.create("/a")), is(sameInstance(node_a)));
         assertThat(workspace.getNode(pathFactory.create("/a/b")), is(sameInstance(node_b)));
@@ -252,18 +252,18 @@
 
     @Test
     public void shouldMoveNodeBeforeAnother() {
-        InMemoryNode root = workspace.getRoot();
-        InMemoryNode node_a = workspace.createNode(context, root, nameFactory.create("a"), null);
-        InMemoryNode node_b = workspace.createNode(context, node_a, nameFactory.create("b"), null);
-        InMemoryNode node_c = workspace.createNode(context, node_b, nameFactory.create("c"), null);
-        InMemoryNode node_d = workspace.createNode(context, root, nameFactory.create("d"), null);
-        InMemoryNode node_e = workspace.createNode(context, node_d, nameFactory.create("e"), null);
-        InMemoryNode node_b2 = workspace.createNode(context, node_d, nameFactory.create("b"), null);
+        MapNode root = workspace.getRoot();
+        MapNode node_a = workspace.createNode(context, root, nameFactory.create("a"), null);
+        MapNode node_b = workspace.createNode(context, node_a, nameFactory.create("b"), null);
+        MapNode node_c = workspace.createNode(context, node_b, nameFactory.create("c"), null);
+        MapNode node_d = workspace.createNode(context, root, nameFactory.create("d"), null);
+        MapNode node_e = workspace.createNode(context, node_d, nameFactory.create("e"), null);
+        MapNode node_b2 = workspace.createNode(context, node_d, nameFactory.create("b"), null);
         Name propName = nameFactory.create("prop");
         node_b.setProperty(propertyFactory.create(propName, "node_b"));
         node_b2.setProperty(propertyFactory.create(propName, "node_b2"));
 
-        assertThat(workspace.getNodesByUuid().size(), is(7));
+        assertThat(workspace.size(), is(7));
         assertThat(workspace.getNode(pathFactory.create("/")), is(sameInstance(workspace.getRoot())));
         assertThat(workspace.getNode(pathFactory.create("/a")), is(sameInstance(node_a)));
         assertThat(workspace.getNode(pathFactory.create("/a/b")), is(sameInstance(node_b)));
@@ -303,16 +303,16 @@
 
     @Test
     public void shouldMoveNodesFromOneWorkspaceToAnother() {
-        // Populate the workspace with some content ...
-        InMemoryNode root = workspace.getRoot();
-        InMemoryNode node_a = workspace.createNode(context, root, nameFactory.create("a"), null);
-        InMemoryNode node_b = workspace.createNode(context, node_a, nameFactory.create("b"), null);
-        InMemoryNode node_c = workspace.createNode(context, node_b, nameFactory.create("c"), null);
-        InMemoryNode node_d = workspace.createNode(context, root, nameFactory.create("d"), null);
-        InMemoryNode node_e = workspace.createNode(context, node_d, nameFactory.create("e"), null);
-        InMemoryNode node_b2 = workspace.createNode(context, node_d, nameFactory.create("b"), null);
+        // Populate the workspace with some content ..
+        MapNode root = workspace.getRoot();
+        MapNode node_a = workspace.createNode(context, root, nameFactory.create("a"), null);
+        MapNode node_b = workspace.createNode(context, node_a, nameFactory.create("b"), null);
+        MapNode node_c = workspace.createNode(context, node_b, nameFactory.create("c"), null);
+        MapNode node_d = workspace.createNode(context, root, nameFactory.create("d"), null);
+        MapNode node_e = workspace.createNode(context, node_d, nameFactory.create("e"), null);
+        MapNode node_b2 = workspace.createNode(context, node_d, nameFactory.create("b"), null);
 
-        assertThat(workspace.getNodesByUuid().size(), is(7));
+        assertThat(workspace.size(), is(7));
         assertThat(workspace.getNode(pathFactory.create("/")), is(sameInstance(workspace.getRoot())));
         assertThat(workspace.getNode(pathFactory.create("/a")), is(sameInstance(node_a)));
         assertThat(workspace.getNode(pathFactory.create("/a/b")), is(sameInstance(node_b)));
@@ -321,19 +321,19 @@
         assertThat(workspace.getNode(pathFactory.create("/d/e")), is(sameInstance(node_e)));
         assertThat(workspace.getNode(pathFactory.create("/d/b")), is(sameInstance(node_b2)));
 
-        // Create the second workspace and populate it with some content ...
-        Workspace new_workspace = repository.createWorkspace(context, "Second Workspace", CreateConflictBehavior.DO_NOT_CREATE);
+        // Create the second workspace and populate it with some content ..
+        InMemoryRepository.Workspace new_workspace = (InMemoryRepository.Workspace) repository.createWorkspace(context, "Second Workspace", CreateConflictBehavior.DO_NOT_CREATE);
         assertThat(new_workspace, is(notNullValue()));
 
-        InMemoryNode new_root = new_workspace.getRoot();
-        InMemoryNode new_node_a = new_workspace.createNode(context, new_root, nameFactory.create("a"), null);
-        InMemoryNode new_node_b = new_workspace.createNode(context, new_node_a, nameFactory.create("b"), null);
-        InMemoryNode new_node_c = new_workspace.createNode(context, new_node_b, nameFactory.create("c"), null);
-        InMemoryNode new_node_d = new_workspace.createNode(context, new_root, nameFactory.create("d"), null);
-        InMemoryNode new_node_e = new_workspace.createNode(context, new_node_d, nameFactory.create("e"), null);
-        InMemoryNode new_node_b2 = new_workspace.createNode(context, new_node_d, nameFactory.create("b"), null);
+        MapNode new_root = new_workspace.getRoot();
+        MapNode new_node_a = new_workspace.createNode(context, new_root, nameFactory.create("a"), null);
+        MapNode new_node_b = new_workspace.createNode(context, new_node_a, nameFactory.create("b"), null);
+        MapNode new_node_c = new_workspace.createNode(context, new_node_b, nameFactory.create("c"), null);
+        MapNode new_node_d = new_workspace.createNode(context, new_root, nameFactory.create("d"), null);
+        MapNode new_node_e = new_workspace.createNode(context, new_node_d, nameFactory.create("e"), null);
+        MapNode new_node_b2 = new_workspace.createNode(context, new_node_d, nameFactory.create("b"), null);
 
-        assertThat(new_workspace.getNodesByUuid().size(), is(7));
+        assertThat(new_workspace.size(), is(7));
         assertThat(new_workspace.getNode(pathFactory.create("/")), is(sameInstance(new_root)));
         assertThat(new_workspace.getNode(pathFactory.create("/a")), is(sameInstance(new_node_a)));
         assertThat(new_workspace.getNode(pathFactory.create("/a/b")), is(sameInstance(new_node_b)));
@@ -345,14 +345,14 @@
         // Move 'workspace::/a/b' into 'newWorkspace::/d'
         workspace.moveNode(context, node_b, null, new_workspace, new_node_d, null);
 
-        assertThat(workspace.getNodesByUuid().size(), is(5));
+        assertThat(workspace.size(), is(5));
         assertThat(workspace.getNode(pathFactory.create("/")), is(sameInstance(workspace.getRoot())));
         assertThat(workspace.getNode(pathFactory.create("/a")), is(sameInstance(node_a)));
         assertThat(workspace.getNode(pathFactory.create("/d")), is(sameInstance(node_d)));
         assertThat(workspace.getNode(pathFactory.create("/d/e")), is(sameInstance(node_e)));
         assertThat(workspace.getNode(pathFactory.create("/d/b")), is(sameInstance(node_b2)));
 
-        assertThat(new_workspace.getNodesByUuid().size(), is(9));
+        assertThat(new_workspace.size(), is(9));
         assertThat(new_workspace.getNode(pathFactory.create("/")), is(sameInstance(new_root)));
         assertThat(new_workspace.getNode(pathFactory.create("/a")), is(sameInstance(new_node_a)));
         assertThat(new_workspace.getNode(pathFactory.create("/d")), is(sameInstance(new_node_d)));
@@ -364,20 +364,20 @@
 
     @Test
     public void shouldCopyNodesWithinSameWorkspace() {
-        InMemoryNode root = workspace.getRoot();
-        InMemoryNode node_a = workspace.createNode(context, root, nameFactory.create("a"), null);
-        InMemoryNode node_b = workspace.createNode(context, node_a, nameFactory.create("b"), null);
-        InMemoryNode node_c = workspace.createNode(context, node_b, nameFactory.create("c"), null);
-        InMemoryNode node_d = workspace.createNode(context, root, nameFactory.create("d"), null);
-        InMemoryNode node_e = workspace.createNode(context, node_d, nameFactory.create("e"), null);
-        InMemoryNode node_b2 = workspace.createNode(context, node_d, nameFactory.create("b"), null);
+        MapNode root = workspace.getRoot();
+        MapNode node_a = workspace.createNode(context, root, nameFactory.create("a"), null);
+        MapNode node_b = workspace.createNode(context, node_a, nameFactory.create("b"), null);
+        MapNode node_c = workspace.createNode(context, node_b, nameFactory.create("c"), null);
+        MapNode node_d = workspace.createNode(context, root, nameFactory.create("d"), null);
+        MapNode node_e = workspace.createNode(context, node_d, nameFactory.create("e"), null);
+        MapNode node_b2 = workspace.createNode(context, node_d, nameFactory.create("b"), null);
 
         ValueFactory<String> stringFactory = valueFactories.getStringFactory();
         Name propertyName = nameFactory.create("something");
         Property property = propertyFactory.create(propertyName, stringFactory.create("Worth the wait"));
-        node_b.getProperties().put(propertyName, property);
+        node_b.setProperty(property);
 
-        assertThat(workspace.getNodesByUuid().size(), is(7));
+        assertThat(workspace.size(), is(7));
         assertThat(workspace.getNode(pathFactory.create("/")), is(sameInstance(workspace.getRoot())));
         assertThat(workspace.getNode(pathFactory.create("/a")), is(sameInstance(node_a)));
         assertThat(workspace.getNode(pathFactory.create("/a/b")), is(sameInstance(node_b)));
@@ -386,11 +386,11 @@
         assertThat(workspace.getNode(pathFactory.create("/d/e")), is(sameInstance(node_e)));
         assertThat(workspace.getNode(pathFactory.create("/d/b")), is(sameInstance(node_b2)));
 
-        assertThat(workspace.getNode(pathFactory.create("/a/b")).getProperties().get(propertyName), is(property));
+        assertThat(workspace.getNode(pathFactory.create("/a/b")).getProperty(propertyName), is(property));
 
         workspace.copyNode(context, node_b, workspace, node_d, null, true, new HashMap<UUID, UUID>());
 
-        assertThat(workspace.getNodesByUuid().size(), is(9));
+        assertThat(workspace.size(), is(9));
         assertThat(workspace.getNode(pathFactory.create("/")), is(sameInstance(workspace.getRoot())));
         assertThat(workspace.getNode(pathFactory.create("/a")), is(sameInstance(node_a)));
         assertThat(workspace.getNode(pathFactory.create("/a/b")), is(sameInstance(node_b)));
@@ -401,27 +401,27 @@
         assertThat(workspace.getNode(pathFactory.create("/d/b[2]")), is(notNullValue()));
         assertThat(workspace.getNode(pathFactory.create("/d/b[2]/c")), is(notNullValue()));
 
-        assertThat(workspace.getNode(pathFactory.create("/a/b")).getProperties().get(propertyName), is(property));
-        assertThat(workspace.getNode(pathFactory.create("/d/b[2]")).getProperties().get(propertyName), is(property));
+        assertThat(workspace.getNode(pathFactory.create("/a/b")).getProperty(propertyName), is(property));
+        assertThat(workspace.getNode(pathFactory.create("/d/b[2]")).getProperty(propertyName), is(property));
     }
 
     @Test
     public void shouldCopyNodesFromOneWorkspaceToAnotherAndKeepSameUuids() {
-        // Populate the workspace with some content ...
-        InMemoryNode root = workspace.getRoot();
-        InMemoryNode node_a = workspace.createNode(context, root, nameFactory.create("a"), null);
-        InMemoryNode node_b = workspace.createNode(context, node_a, nameFactory.create("b"), null);
-        InMemoryNode node_c = workspace.createNode(context, node_b, nameFactory.create("c"), null);
-        InMemoryNode node_d = workspace.createNode(context, root, nameFactory.create("d"), null);
-        InMemoryNode node_e = workspace.createNode(context, node_d, nameFactory.create("e"), null);
-        InMemoryNode node_b2 = workspace.createNode(context, node_d, nameFactory.create("b"), null);
+        // Populate the workspace with some content ..
+        MapNode root = workspace.getRoot();
+        MapNode node_a = workspace.createNode(context, root, nameFactory.create("a"), null);
+        MapNode node_b = workspace.createNode(context, node_a, nameFactory.create("b"), null);
+        MapNode node_c = workspace.createNode(context, node_b, nameFactory.create("c"), null);
+        MapNode node_d = workspace.createNode(context, root, nameFactory.create("d"), null);
+        MapNode node_e = workspace.createNode(context, node_d, nameFactory.create("e"), null);
+        MapNode node_b2 = workspace.createNode(context, node_d, nameFactory.create("b"), null);
 
         ValueFactory<String> stringFactory = valueFactories.getStringFactory();
         Name propertyName = nameFactory.create("something");
         Property property = propertyFactory.create(propertyName, stringFactory.create("Worth the wait"));
-        node_b.getProperties().put(propertyName, property);
+        node_b.setProperty(property);
 
-        assertThat(workspace.getNodesByUuid().size(), is(7));
+        assertThat(workspace.size(), is(7));
         assertThat(workspace.getNode(pathFactory.create("/")), is(sameInstance(workspace.getRoot())));
         assertThat(workspace.getNode(pathFactory.create("/a")), is(sameInstance(node_a)));
         assertThat(workspace.getNode(pathFactory.create("/a/b")), is(sameInstance(node_b)));
@@ -430,21 +430,21 @@
         assertThat(workspace.getNode(pathFactory.create("/d/e")), is(sameInstance(node_e)));
         assertThat(workspace.getNode(pathFactory.create("/d/b")), is(sameInstance(node_b2)));
 
-        assertThat(workspace.getNode(pathFactory.create("/a/b")).getProperties().get(propertyName), is(property));
+        assertThat(workspace.getNode(pathFactory.create("/a/b")).getProperty(propertyName), is(property));
 
-        // Create the second workspace and populate it with some content ...
-        Workspace new_workspace = repository.createWorkspace(context, "Second Workspace", CreateConflictBehavior.DO_NOT_CREATE);
+        // Create the second workspace and populate it with some content ..
+        InMemoryRepository.Workspace new_workspace = (InMemoryRepository.Workspace) repository.createWorkspace(context, "Second Workspace", CreateConflictBehavior.DO_NOT_CREATE);
         assertThat(new_workspace, is(notNullValue()));
 
-        InMemoryNode new_root = new_workspace.getRoot();
-        InMemoryNode new_node_a = new_workspace.createNode(context, new_root, nameFactory.create("a"), null);
-        InMemoryNode new_node_b = new_workspace.createNode(context, new_node_a, nameFactory.create("b"), null);
-        InMemoryNode new_node_c = new_workspace.createNode(context, new_node_b, nameFactory.create("c"), null);
-        InMemoryNode new_node_d = new_workspace.createNode(context, new_root, nameFactory.create("d"), null);
-        InMemoryNode new_node_e = new_workspace.createNode(context, new_node_d, nameFactory.create("e"), null);
-        InMemoryNode new_node_b2 = new_workspace.createNode(context, new_node_d, nameFactory.create("b"), null);
+        MapNode new_root = new_workspace.getRoot();
+        MapNode new_node_a = new_workspace.createNode(context, new_root, nameFactory.create("a"), null);
+        MapNode new_node_b = new_workspace.createNode(context, new_node_a, nameFactory.create("b"), null);
+        MapNode new_node_c = new_workspace.createNode(context, new_node_b, nameFactory.create("c"), null);
+        MapNode new_node_d = new_workspace.createNode(context, new_root, nameFactory.create("d"), null);
+        MapNode new_node_e = new_workspace.createNode(context, new_node_d, nameFactory.create("e"), null);
+        MapNode new_node_b2 = new_workspace.createNode(context, new_node_d, nameFactory.create("b"), null);
 
-        assertThat(new_workspace.getNodesByUuid().size(), is(7));
+        assertThat(new_workspace.size(), is(7));
         assertThat(new_workspace.getNode(pathFactory.create("/")), is(sameInstance(new_root)));
         assertThat(new_workspace.getNode(pathFactory.create("/a")), is(sameInstance(new_node_a)));
         assertThat(new_workspace.getNode(pathFactory.create("/a/b")), is(sameInstance(new_node_b)));
@@ -454,9 +454,9 @@
         assertThat(new_workspace.getNode(pathFactory.create("/d/b")), is(sameInstance(new_node_b2)));
 
         // Copy 'workspace::/a/b' into 'newWorkspace::/d'
-        workspace.copyNode(context, node_b, new_workspace, new_node_d, null, true, null);
+        workspace.copyNode(context, node_b, new_workspace, new_node_d, null, true, (Map<UUID, UUID>) null);
 
-        assertThat(workspace.getNodesByUuid().size(), is(7));
+        assertThat(workspace.size(), is(7));
         assertThat(workspace.getNode(pathFactory.create("/")), is(sameInstance(workspace.getRoot())));
         assertThat(workspace.getNode(pathFactory.create("/a")), is(sameInstance(node_a)));
         assertThat(workspace.getNode(pathFactory.create("/a/b")), is(sameInstance(node_b)));
@@ -464,9 +464,9 @@
         assertThat(workspace.getNode(pathFactory.create("/d")), is(sameInstance(node_d)));
         assertThat(workspace.getNode(pathFactory.create("/d/e")), is(sameInstance(node_e)));
         assertThat(workspace.getNode(pathFactory.create("/d/b")), is(sameInstance(node_b2)));
-        assertThat(workspace.getNode(pathFactory.create("/a/b")).getProperties().get(propertyName), is(property));
+        assertThat(workspace.getNode(pathFactory.create("/a/b")).getProperty(propertyName), is(property));
 
-        assertThat(new_workspace.getNodesByUuid().size(), is(9));
+        assertThat(new_workspace.size(), is(9));
         assertThat(new_workspace.getNode(pathFactory.create("/")), is(sameInstance(new_root)));
         assertThat(new_workspace.getNode(pathFactory.create("/a")), is(sameInstance(new_node_a)));
         assertThat(new_workspace.getNode(pathFactory.create("/a/b")), is(sameInstance(new_node_b)));
@@ -477,11 +477,11 @@
         assertThat(new_workspace.getNode(pathFactory.create("/d/b[2]")), is(notNullValue()));
         assertThat(new_workspace.getNode(pathFactory.create("/d/b[2]/c")), is(notNullValue()));
 
-        assertThat(new_workspace.getNode(pathFactory.create("/d/b[2]")).getProperties().get(propertyName), is(property));
+        assertThat(new_workspace.getNode(pathFactory.create("/d/b[2]")).getProperty(propertyName), is(property));
 
-        // The new copy should have the same UUIDs as in the original, since we specified no UUID map ...
-        InMemoryNode new_copy_b = new_workspace.getNode(pathFactory.create("/d/b[2]"));
-        InMemoryNode new_copy_c = new_workspace.getNode(pathFactory.create("/d/b[2]/c"));
+        // The new copy should have the same UUIDs as in the original, since we specified no UUID map ..
+        MapNode new_copy_b = new_workspace.getNode(pathFactory.create("/d/b[2]"));
+        MapNode new_copy_c = new_workspace.getNode(pathFactory.create("/d/b[2]/c"));
         assertThat(new_copy_b, is(notNullValue()));
         assertThat(new_copy_c, is(notNullValue()));
         assertThat(new_copy_b.getUuid(), is(node_b.getUuid()));
@@ -490,21 +490,21 @@
 
     @Test
     public void shouldCopyNodesFromOneWorkspaceToAnotherAndGenerateNewUuids() {
-        // Populate the workspace with some content ...
-        InMemoryNode root = workspace.getRoot();
-        InMemoryNode node_a = workspace.createNode(context, root, nameFactory.create("a"), null);
-        InMemoryNode node_b = workspace.createNode(context, node_a, nameFactory.create("b"), null);
-        InMemoryNode node_c = workspace.createNode(context, node_b, nameFactory.create("c"), null);
-        InMemoryNode node_d = workspace.createNode(context, root, nameFactory.create("d"), null);
-        InMemoryNode node_e = workspace.createNode(context, node_d, nameFactory.create("e"), null);
-        InMemoryNode node_b2 = workspace.createNode(context, node_d, nameFactory.create("b"), null);
+        // Populate the workspace with some content ..
+        MapNode root = workspace.getRoot();
+        MapNode node_a = workspace.createNode(context, root, nameFactory.create("a"), null);
+        MapNode node_b = workspace.createNode(context, node_a, nameFactory.create("b"), null);
+        MapNode node_c = workspace.createNode(context, node_b, nameFactory.create("c"), null);
+        MapNode node_d = workspace.createNode(context, root, nameFactory.create("d"), null);
+        MapNode node_e = workspace.createNode(context, node_d, nameFactory.create("e"), null);
+        MapNode node_b2 = workspace.createNode(context, node_d, nameFactory.create("b"), null);
 
         ValueFactory<String> stringFactory = valueFactories.getStringFactory();
         Name propertyName = nameFactory.create("something");
         Property property = propertyFactory.create(propertyName, stringFactory.create("Worth the wait"));
-        node_b.getProperties().put(propertyName, property);
+        node_b.setProperty(property);
 
-        assertThat(workspace.getNodesByUuid().size(), is(7));
+        assertThat(workspace.size(), is(7));
         assertThat(workspace.getNode(pathFactory.create("/")), is(sameInstance(workspace.getRoot())));
         assertThat(workspace.getNode(pathFactory.create("/a")), is(sameInstance(node_a)));
         assertThat(workspace.getNode(pathFactory.create("/a/b")), is(sameInstance(node_b)));
@@ -513,21 +513,21 @@
         assertThat(workspace.getNode(pathFactory.create("/d/e")), is(sameInstance(node_e)));
         assertThat(workspace.getNode(pathFactory.create("/d/b")), is(sameInstance(node_b2)));
 
-        assertThat(workspace.getNode(pathFactory.create("/a/b")).getProperties().get(propertyName), is(property));
+        assertThat(workspace.getNode(pathFactory.create("/a/b")).getProperty(propertyName), is(property));
 
-        // Create the second workspace and populate it with some content ...
-        Workspace new_workspace = repository.createWorkspace(context, "Second Workspace", CreateConflictBehavior.DO_NOT_CREATE);
+        // Create the second workspace and populate it with some content ..
+        InMemoryRepository.Workspace new_workspace = (InMemoryRepository.Workspace) repository.createWorkspace(context, "Second Workspace", CreateConflictBehavior.DO_NOT_CREATE);
         assertThat(new_workspace, is(notNullValue()));
 
-        InMemoryNode new_root = new_workspace.getRoot();
-        InMemoryNode new_node_a = new_workspace.createNode(context, new_root, nameFactory.create("a"), null);
-        InMemoryNode new_node_b = new_workspace.createNode(context, new_node_a, nameFactory.create("b"), null);
-        InMemoryNode new_node_c = new_workspace.createNode(context, new_node_b, nameFactory.create("c"), null);
-        InMemoryNode new_node_d = new_workspace.createNode(context, new_root, nameFactory.create("d"), null);
-        InMemoryNode new_node_e = new_workspace.createNode(context, new_node_d, nameFactory.create("e"), null);
-        InMemoryNode new_node_b2 = new_workspace.createNode(context, new_node_d, nameFactory.create("b"), null);
+        MapNode new_root = new_workspace.getRoot();
+        MapNode new_node_a = new_workspace.createNode(context, new_root, nameFactory.create("a"), null);
+        MapNode new_node_b = new_workspace.createNode(context, new_node_a, nameFactory.create("b"), null);
+        MapNode new_node_c = new_workspace.createNode(context, new_node_b, nameFactory.create("c"), null);
+        MapNode new_node_d = new_workspace.createNode(context, new_root, nameFactory.create("d"), null);
+        MapNode new_node_e = new_workspace.createNode(context, new_node_d, nameFactory.create("e"), null);
+        MapNode new_node_b2 = new_workspace.createNode(context, new_node_d, nameFactory.create("b"), null);
 
-        assertThat(new_workspace.getNodesByUuid().size(), is(7));
+        assertThat(new_workspace.size(), is(7));
         assertThat(new_workspace.getNode(pathFactory.create("/")), is(sameInstance(new_root)));
         assertThat(new_workspace.getNode(pathFactory.create("/a")), is(sameInstance(new_node_a)));
         assertThat(new_workspace.getNode(pathFactory.create("/a/b")), is(sameInstance(new_node_b)));
@@ -540,7 +540,7 @@
         Map<UUID, UUID> oldToNewUuids = new HashMap<UUID, UUID>();
         workspace.copyNode(context, node_b, new_workspace, new_node_d, null, true, oldToNewUuids);
 
-        assertThat(workspace.getNodesByUuid().size(), is(7));
+        assertThat(workspace.size(), is(7));
         assertThat(workspace.getNode(pathFactory.create("/")), is(sameInstance(workspace.getRoot())));
         assertThat(workspace.getNode(pathFactory.create("/a")), is(sameInstance(node_a)));
         assertThat(workspace.getNode(pathFactory.create("/a/b")), is(sameInstance(node_b)));
@@ -549,9 +549,9 @@
         assertThat(workspace.getNode(pathFactory.create("/d/e")), is(sameInstance(node_e)));
         assertThat(workspace.getNode(pathFactory.create("/d/b")), is(sameInstance(node_b2)));
 
-        assertThat(workspace.getNode(pathFactory.create("/a/b")).getProperties().get(propertyName), is(property));
+        assertThat(workspace.getNode(pathFactory.create("/a/b")).getProperty(propertyName), is(property));
 
-        assertThat(new_workspace.getNodesByUuid().size(), is(9));
+        assertThat(new_workspace.size(), is(9));
         assertThat(new_workspace.getNode(pathFactory.create("/")), is(sameInstance(new_root)));
         assertThat(new_workspace.getNode(pathFactory.create("/a")), is(sameInstance(new_node_a)));
         assertThat(new_workspace.getNode(pathFactory.create("/a/b")), is(sameInstance(new_node_b)));
@@ -562,11 +562,11 @@
         assertThat(new_workspace.getNode(pathFactory.create("/d/b[2]")), is(notNullValue()));
         assertThat(new_workspace.getNode(pathFactory.create("/d/b[2]/c")), is(notNullValue()));
 
-        assertThat(new_workspace.getNode(pathFactory.create("/d/b[2]")).getProperties().get(propertyName), is(property));
+        assertThat(new_workspace.getNode(pathFactory.create("/d/b[2]")).getProperty(propertyName), is(property));
 
-        // The new copy should have different UUIDs than in the original, since we did specify a UUID map ...
-        InMemoryNode new_copy_b = new_workspace.getNode(pathFactory.create("/d/b[2]"));
-        InMemoryNode new_copy_c = new_workspace.getNode(pathFactory.create("/d/b[2]/c"));
+        // The new copy should have different UUIDs than in the original, since we did specify a UUID map ..
+        MapNode new_copy_b = new_workspace.getNode(pathFactory.create("/d/b[2]"));
+        MapNode new_copy_c = new_workspace.getNode(pathFactory.create("/d/b[2]/c"));
         assertThat(new_copy_b, is(notNullValue()));
         assertThat(new_copy_c, is(notNullValue()));
         assertThat(new_copy_b.getUuid(), is(not(node_b.getUuid())));
@@ -577,20 +577,20 @@
 
     @Test
     public void shouldCopyNodesWhenDesiredNameIsSpecified() {
-        InMemoryNode root = workspace.getRoot();
-        InMemoryNode node_a = workspace.createNode(context, root, nameFactory.create("a"), null);
-        InMemoryNode node_b = workspace.createNode(context, node_a, nameFactory.create("b"), null);
-        InMemoryNode node_c = workspace.createNode(context, node_b, nameFactory.create("c"), null);
-        InMemoryNode node_d = workspace.createNode(context, root, nameFactory.create("d"), null);
-        InMemoryNode node_e = workspace.createNode(context, node_d, nameFactory.create("e"), null);
-        InMemoryNode node_b2 = workspace.createNode(context, node_d, nameFactory.create("b"), null);
+        MapNode root = workspace.getRoot();
+        MapNode node_a = workspace.createNode(context, root, nameFactory.create("a"), null);
+        MapNode node_b = workspace.createNode(context, node_a, nameFactory.create("b"), null);
+        MapNode node_c = workspace.createNode(context, node_b, nameFactory.create("c"), null);
+        MapNode node_d = workspace.createNode(context, root, nameFactory.create("d"), null);
+        MapNode node_e = workspace.createNode(context, node_d, nameFactory.create("e"), null);
+        MapNode node_b2 = workspace.createNode(context, node_d, nameFactory.create("b"), null);
 
         ValueFactory<String> stringFactory = valueFactories.getStringFactory();
         Name propertyName = nameFactory.create("something");
         Property property = propertyFactory.create(propertyName, stringFactory.create("Worth the wait"));
-        node_b.getProperties().put(propertyName, property);
+        node_b.setProperty(property);
 
-        assertThat(workspace.getNodesByUuid().size(), is(7));
+        assertThat(workspace.size(), is(7));
         assertThat(workspace.getNode(pathFactory.create("/")), is(sameInstance(workspace.getRoot())));
         assertThat(workspace.getNode(pathFactory.create("/a")), is(sameInstance(node_a)));
         assertThat(workspace.getNode(pathFactory.create("/a/b")), is(sameInstance(node_b)));
@@ -599,11 +599,11 @@
         assertThat(workspace.getNode(pathFactory.create("/d/e")), is(sameInstance(node_e)));
         assertThat(workspace.getNode(pathFactory.create("/d/b")), is(sameInstance(node_b2)));
 
-        assertThat(workspace.getNode(pathFactory.create("/a/b")).getProperties().get(propertyName), is(property));
+        assertThat(workspace.getNode(pathFactory.create("/a/b")).getProperty(propertyName), is(property));
 
         workspace.copyNode(context, node_b, workspace, node_d, nameFactory.create("x"), true, new HashMap<UUID, UUID>());
 
-        assertThat(workspace.getNodesByUuid().size(), is(9));
+        assertThat(workspace.size(), is(9));
         assertThat(workspace.getNode(pathFactory.create("/")), is(sameInstance(workspace.getRoot())));
         assertThat(workspace.getNode(pathFactory.create("/a")), is(sameInstance(node_a)));
         assertThat(workspace.getNode(pathFactory.create("/a/b")), is(sameInstance(node_b)));
@@ -614,8 +614,8 @@
         assertThat(workspace.getNode(pathFactory.create("/d/x")), is(notNullValue()));
         assertThat(workspace.getNode(pathFactory.create("/d/x/c")), is(notNullValue()));
 
-        assertThat(workspace.getNode(pathFactory.create("/a/b")).getProperties().get(propertyName), is(property));
-        assertThat(workspace.getNode(pathFactory.create("/d/x")).getProperties().get(propertyName), is(property));
+        assertThat(workspace.getNode(pathFactory.create("/a/b")).getProperty(propertyName), is(property));
+        assertThat(workspace.getNode(pathFactory.create("/d/x")).getProperty(propertyName), is(property));
     }
 
     @Test

Deleted: trunk/extensions/dna-connector-jbosscache/src/main/java/org/jboss/dna/connector/jbosscache/JBossCacheConnection.java
===================================================================
--- trunk/extensions/dna-connector-jbosscache/src/main/java/org/jboss/dna/connector/jbosscache/JBossCacheConnection.java	2009-06-24 22:14:12 UTC (rev 1064)
+++ trunk/extensions/dna-connector-jbosscache/src/main/java/org/jboss/dna/connector/jbosscache/JBossCacheConnection.java	2009-06-27 02:54:06 UTC (rev 1065)
@@ -1,108 +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.jbosscache;
-
-import java.util.concurrent.TimeUnit;
-import javax.transaction.xa.XAResource;
-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.observe.Observer;
-import org.jboss.dna.graph.request.Request;
-import org.jboss.dna.graph.request.processor.RequestProcessor;
-
-/**
- * The repository connection to a JBoss Cache instance.
- * 
- * @author Randall Hauch
- */
-public class JBossCacheConnection implements RepositoryConnection {
-
-    private final JBossCacheSource source;
-    private final JBossCacheWorkspaces workspaces;
-
-    JBossCacheConnection( JBossCacheSource source,
-                          JBossCacheWorkspaces workspaces ) {
-        assert source != null;
-        assert workspaces != null;
-        this.source = source;
-        this.workspaces = workspaces;
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    public String getSourceName() {
-        return source.getName();
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    public CachePolicy getDefaultCachePolicy() {
-        return source.getDefaultCachePolicy();
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    public XAResource getXAResource() {
-        return null;
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    public boolean ping( long time,
-                         TimeUnit unit ) {
-        return true;
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    public void close() {
-        // do nothing
-    }
-
-    /**
-     * {@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 {
-        Observer observer = source.getObserver();
-        RequestProcessor processor = new JBossCacheRequestProcessor(getSourceName(), context, observer, workspaces,
-                                                                    source.getNameOfDefaultWorkspace(),
-                                                                    source.isCreatingWorkspacesAllowed());
-        try {
-            processor.process(request);
-        } finally {
-            processor.close();
-        }
-    }
-}

Deleted: trunk/extensions/dna-connector-jbosscache/src/main/java/org/jboss/dna/connector/jbosscache/JBossCacheLexicon.java
===================================================================
--- trunk/extensions/dna-connector-jbosscache/src/main/java/org/jboss/dna/connector/jbosscache/JBossCacheLexicon.java	2009-06-24 22:14:12 UTC (rev 1064)
+++ trunk/extensions/dna-connector-jbosscache/src/main/java/org/jboss/dna/connector/jbosscache/JBossCacheLexicon.java	2009-06-27 02:54:06 UTC (rev 1065)
@@ -1,45 +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.jbosscache;
-
-import org.jboss.dna.graph.property.Name;
-import org.jboss.dna.graph.property.basic.BasicName;
-
-/**
- * The namespace and property names used within a {@link JBossCacheSource} to store internal information.
- * 
- * @author Randall Hauch
- */
-public class JBossCacheLexicon {
-
-    public static class Namespace {
-        public static final String URI = "http://www.jboss.org/dna/connector/jbosscache";
-        public static final String PREFIX = "dnajbcc";
-    }
-
-    public static final Name CHILD_PATH_SEGMENT_LIST = new BasicName(Namespace.URI, "orderedChildNames");
-    public static final Name UUIDS = new BasicName(Namespace.URI, "uuids");
-    public static final Name FQN = new BasicName(Namespace.URI, "fqn");
-
-}

Added: trunk/extensions/dna-connector-jbosscache/src/main/java/org/jboss/dna/connector/jbosscache/JBossCacheRepository.java
===================================================================
--- trunk/extensions/dna-connector-jbosscache/src/main/java/org/jboss/dna/connector/jbosscache/JBossCacheRepository.java	                        (rev 0)
+++ trunk/extensions/dna-connector-jbosscache/src/main/java/org/jboss/dna/connector/jbosscache/JBossCacheRepository.java	2009-06-27 02:54:06 UTC (rev 1065)
@@ -0,0 +1,79 @@
+package org.jboss.dna.connector.jbosscache;
+
+import java.util.UUID;
+import org.jboss.cache.Cache;
+import org.jboss.cache.Fqn;
+import org.jboss.cache.Node;
+import org.jboss.dna.graph.ExecutionContext;
+import org.jboss.dna.graph.connector.map.AbstractMapWorkspace;
+import org.jboss.dna.graph.connector.map.MapNode;
+import org.jboss.dna.graph.connector.map.MapRepository;
+import org.jboss.dna.graph.connector.map.MapWorkspace;
+
+public class JBossCacheRepository extends MapRepository {
+
+    private final Cache<UUID, MapNode> cache;
+
+    public JBossCacheRepository( String sourceName,
+                                 UUID rootNodeUuid,
+                                 Cache<UUID, MapNode> cache ) {
+        super(sourceName, rootNodeUuid, null);
+        assert cache != null;
+        this.cache = cache;
+        initialize();
+    }
+
+    public JBossCacheRepository( String sourceName,
+                                 UUID rootNodeUuid,
+                                 String defaultWorkspaceName,
+                                 Cache<UUID, MapNode> cache ) {
+        super(sourceName, rootNodeUuid, defaultWorkspaceName);
+
+        assert cache != null;
+        this.cache = cache;
+        
+        initialize();
+    }
+
+    @Override
+    protected MapWorkspace createWorkspace( ExecutionContext context,
+                                            String name ) {
+        assert name != null;
+        assert cache != null;
+        Node<UUID, MapNode> newWorkspaceNode = cache.getRoot().addChild(Fqn.fromElements(name));
+        return new Workspace(this, name, newWorkspaceNode);
+    }
+
+    protected class Workspace extends AbstractMapWorkspace {
+        private final Node<UUID, MapNode> workspaceNode;
+
+        public Workspace( MapRepository repository,
+                          String name,
+                          Node<UUID, MapNode> workspaceNode ) {
+            super(repository, name);
+
+            this.workspaceNode = workspaceNode;
+            initialize();
+        }
+
+        protected void addNodeToMap( MapNode node ) {
+            assert node != null;
+            workspaceNode.put(node.getUuid(), node);
+        }
+
+        protected MapNode removeNodeFromMap( UUID nodeUuid ) {
+            assert nodeUuid != null;
+            return workspaceNode.remove(nodeUuid);
+        }
+
+        protected void removeAllNodesFromMap() {
+            workspaceNode.clearData();
+        }
+
+        public MapNode getNode( UUID nodeUuid ) {
+            assert nodeUuid != null;
+            return workspaceNode.get(nodeUuid);
+        }
+    }
+
+}


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

Deleted: trunk/extensions/dna-connector-jbosscache/src/main/java/org/jboss/dna/connector/jbosscache/JBossCacheRequestProcessor.java
===================================================================
--- trunk/extensions/dna-connector-jbosscache/src/main/java/org/jboss/dna/connector/jbosscache/JBossCacheRequestProcessor.java	2009-06-24 22:14:12 UTC (rev 1064)
+++ trunk/extensions/dna-connector-jbosscache/src/main/java/org/jboss/dna/connector/jbosscache/JBossCacheRequestProcessor.java	2009-06-27 02:54:06 UTC (rev 1065)
@@ -1,1032 +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.
- *
- * 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.jbosscache;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-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 java.util.concurrent.atomic.AtomicInteger;
-import org.jboss.cache.Cache;
-import org.jboss.cache.Fqn;
-import org.jboss.cache.Node;
-import org.jboss.dna.common.util.Logger;
-import org.jboss.dna.graph.DnaLexicon;
-import org.jboss.dna.graph.ExecutionContext;
-import org.jboss.dna.graph.Location;
-import org.jboss.dna.graph.connector.RepositorySourceException;
-import org.jboss.dna.graph.connector.UuidAlreadyExistsException;
-import org.jboss.dna.graph.observe.Observer;
-import org.jboss.dna.graph.property.Name;
-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.UuidFactory;
-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.Request;
-import org.jboss.dna.graph.request.UpdatePropertiesRequest;
-import org.jboss.dna.graph.request.UuidConflictBehavior;
-import org.jboss.dna.graph.request.VerifyWorkspaceRequest;
-import org.jboss.dna.graph.request.processor.RequestProcessor;
-
-/**
- * A {@link RequestProcessor} implementation that operates upon a {@link Cache JBoss Cache} instance for each workspace in the
- * {@link JBossCacheSource source}.
- * <p>
- * This processor only uses {@link Location} objects with {@link Location#getPath() paths}. Even though every node in the cache is
- * automatically assigned a UUID (and all operations properly handle UUIDs), these UUIDs are not included in the {@link Location}
- * objects because the processor is unable to search the cache to find nodes by UUID.
- * </p>
- */
-public class JBossCacheRequestProcessor extends RequestProcessor {
-
-    private final JBossCacheWorkspaces workspaces;
-    private final boolean creatingWorkspacesAllowed;
-    private final String defaultWorkspaceName;
-    private final PathFactory pathFactory;
-    private final PropertyFactory propertyFactory;
-    private final UuidFactory uuidFactory;
-    private Path.Segment dnaUuidsSegment;
-
-    /**
-     * @param sourceName the name of the source in which this processor is operating
-     * @param context the execution context in which this processor operates
-     * @param observer the observer to which events should be published; may be null if the events are not be published
-     * @param workspaces the manager for the workspaces
-     * @param defaultWorkspaceName the name of the default workspace; never null
-     * @param creatingWorkspacesAllowed true if clients can create new workspaces, or false otherwise
-     */
-    JBossCacheRequestProcessor( String sourceName,
-                                ExecutionContext context,
-                                Observer observer,
-                                JBossCacheWorkspaces workspaces,
-                                String defaultWorkspaceName,
-                                boolean creatingWorkspacesAllowed ) {
-        super(sourceName, context, observer);
-        assert workspaces != null;
-        assert defaultWorkspaceName != null;
-        this.workspaces = workspaces;
-        this.creatingWorkspacesAllowed = creatingWorkspacesAllowed;
-        this.defaultWorkspaceName = defaultWorkspaceName;
-        this.pathFactory = context.getValueFactories().getPathFactory();
-        this.propertyFactory = context.getPropertyFactory();
-        this.uuidFactory = context.getValueFactories().getUuidFactory();
-        this.dnaUuidsSegment = pathFactory.createSegment(JBossCacheLexicon.UUIDS);
-    }
-
-    @Override
-    public void process( ReadAllChildrenRequest request ) {
-        // Look up the cache and the node ...
-        Cache<Name, Object> cache = getCache(request, request.inWorkspace());
-        if (cache == null) return;
-        Path nodePath = request.of().getPath();
-        Node<Name, Object> node = getNode(request, cache, nodePath);
-        if (node == null) return;
-
-        // Get the names of the children, using the child list ...
-        Path.Segment[] childList = (Path.Segment[])node.get(JBossCacheLexicon.CHILD_PATH_SEGMENT_LIST);
-        if (childList != null) {
-            for (Path.Segment child : childList) {
-                request.addChild(Location.create(pathFactory.create(nodePath, child)));
-            }
-        }
-        request.setActualLocationOfNode(Location.create(nodePath));
-        setCacheableInfo(request);
-    }
-
-    @Override
-    public void process( ReadAllPropertiesRequest request ) {
-        // Look up the cache and the node ...
-        Cache<Name, Object> cache = getCache(request, request.inWorkspace());
-        if (cache == null) return;
-        Path nodePath = request.at().getPath();
-        Node<Name, Object> node = getNode(request, cache, nodePath);
-        if (node == null) return;
-
-        // Get the properties on the node ...
-        Map<Name, Object> dataMap = node.getData();
-        for (Map.Entry<Name, Object> data : dataMap.entrySet()) {
-            Name propertyName = data.getKey();
-            // Don't allow the child list property to be accessed
-            if (propertyName.equals(JBossCacheLexicon.CHILD_PATH_SEGMENT_LIST)) continue;
-            Object values = data.getValue();
-            Property property = propertyFactory.create(propertyName, values);
-            request.addProperty(property);
-        }
-        request.setActualLocationOfNode(Location.create(nodePath));
-        setCacheableInfo(request);
-    }
-
-    @Override
-    @SuppressWarnings( "unchecked" )
-    public void process( CreateNodeRequest request ) {
-        // Look up the cache and the node ...
-        Cache<Name, Object> cache = getCache(request, request.inWorkspace());
-        if (cache == null) return;
-        Path parent = request.under().getPath();
-        Node<Name, Object> parentNode = getNode(request, cache, parent);
-        if (parentNode == null) return;
-
-        // Update the children to account for same-name siblings.
-        // This not only updates the FQN of the child nodes, but it also sets the property that stores the
-        // the array of Path.Segment for the children (since the cache doesn't maintain order).
-        Path.Segment newSegment = updateChildList(cache, parentNode, request.named(), null, getExecutionContext(), true);
-        Node<Name, Object> node = parentNode.addChild(Fqn.fromElements(newSegment));
-        assert checkChildren(parentNode);
-
-        // Add the UUID property (if required), which may be overwritten by a supplied property ...
-        UUID uuid = uuidFactory.create();
-        node.put(DnaLexicon.UUID, uuid);
-        // Now add the properties to the supplied node ...
-        for (Property property : request.properties()) {
-            if (property.size() == 0) continue;
-            Name propName = property.getName();
-            Object value = null;
-            if (property.size() == 1) {
-                value = property.iterator().next();
-            } else {
-                value = property.getValuesAsArray();
-            }
-            node.put(propName, value);
-        }
-
-        mapUuid(cache, uuid, node.getFqn());
-        Path nodePath = pathFactory.create(parent, newSegment);
-        request.setActualLocationOfNode(Location.create(nodePath));
-        recordChange(request);
-    }
-
-    @Override
-    public void process( UpdatePropertiesRequest request ) {
-        // Look up the cache and the node ...
-        Cache<Name, Object> cache = getCache(request, request.inWorkspace());
-        if (cache == null) return;
-        Path nodePath = request.on().getPath();
-        Node<Name, Object> node = getNode(request, cache, nodePath);
-        if (node == null) return;
-
-        // Now set (or remove) the properties to the supplied node ...
-        for (Map.Entry<Name, Property> entry : request.properties().entrySet()) {
-            Name propName = entry.getKey();
-            // Don't allow the child list property to be removed or changed
-            if (propName.equals(JBossCacheLexicon.CHILD_PATH_SEGMENT_LIST)) continue;
-
-            Property property = entry.getValue();
-            if (property == null) {
-                node.remove(propName);
-                continue;
-            }
-            Object value = null;
-            if (property.isSingle()) {
-                value = property.iterator().next();
-            } else {
-                value = property.getValuesAsArray();
-            }
-            node.put(propName, value);
-        }
-        request.setActualLocationOfNode(Location.create(nodePath));
-        recordChange(request);
-    }
-
-    @Override
-    public void process( CopyBranchRequest request ) {
-        // Look up the caches ...
-        Cache<Name, Object> fromCache = getCache(request, request.fromWorkspace());
-        if (fromCache == null) return;
-        Cache<Name, Object> intoCache = getCache(request, request.intoWorkspace());
-        if (intoCache == null) return;
-
-        // Look up the current node and the new parent (both of which must exist) ...
-        Path nodePath = request.from().getPath();
-        Node<Name, Object> node = getNode(request, fromCache, nodePath);
-        if (node == null) return;
-        Path newParentPath = request.into().getPath();
-        Node<Name, Object> newParent = getNode(request, intoCache, newParentPath);
-        if (newParent == null) return;
-
-        if (UuidConflictBehavior.THROW_EXCEPTION.equals(request.uuidConflictBehavior())) {
-            // Build a list of all the UUIDs in the source branch
-            Set<UUID> uuidsFromSource = new HashSet<UUID>();
-            LinkedList<Node<Name, Object>> nodesToVisit = new LinkedList<Node<Name, Object>>();
-            nodesToVisit.add(node);
-
-            while (!nodesToVisit.isEmpty()) {
-                Node<Name, Object> nodeToCheck = nodesToVisit.removeFirst();
-                UUID uuid = uuidFactory.create(nodeToCheck.get(DnaLexicon.UUID));
-                if (uuid != null) uuidsFromSource.add(uuid);
-
-                nodesToVisit.addAll(nodeToCheck.getChildren());
-            }
-
-            // If any of the UUIDS currently exist in this workspace, throw an exception
-            for (UUID uuid : uuidsFromSource) {
-                Fqn<Path.Segment> path;
-                if (null != (path = getFullyQualifiedName(intoCache, uuid))) {
-                    String pathAsString = path.toString();
-                    throw new UuidAlreadyExistsException(this.getSourceName(), uuid, pathAsString, request.intoWorkspace());
-                }
-            }
-        }
-
-        // Copy the branch ...
-        Name desiredName = request.desiredName();
-        Path.Segment newSegment = copyNode(intoCache,
-                                           node,
-                                           newParent,
-                                           desiredName,
-                                           null,
-                                           true,
-                                           request.uuidConflictBehavior(),
-                                           null,
-                                           getExecutionContext());
-
-        mapUuids(intoCache, Fqn.fromRelativeElements(Fqn.fromList(newParentPath.getSegmentsList()), newSegment));
-        Path newPath = pathFactory.create(newParentPath, newSegment);
-        request.setActualLocations(Location.create(nodePath), Location.create(newPath));
-        recordChange(request);
-    }
-
-    @SuppressWarnings( "unchecked" )
-    private boolean deleteNode( Cache<Name, Object> cache,
-                                Node<Name, Object> node ) {
-        Fqn<Path.Segment> nodeFqn = node.getFqn();
-
-        removeUuids(cache, nodeFqn);
-        Path.Segment nameOfRemovedNode = (Path.Segment)nodeFqn.getLastElement();
-        if (cache.removeNode(node.getFqn())) {
-            removeFromChildList(cache, node.getParent(), nameOfRemovedNode, getExecutionContext());
-            return true;
-        }
-        return false;
-    }
-
-    @Override
-    public void process( DeleteBranchRequest request ) {
-        // Look up the cache and the node ...
-        Cache<Name, Object> cache = getCache(request, request.inWorkspace());
-        if (cache == null) return;
-        Path nodePath = request.at().getPath();
-        Node<Name, Object> node = getNode(request, cache, nodePath);
-        if (node == null) return;
-
-        if (deleteNode(cache, node)) {
-            request.setActualLocationOfNode(Location.create(nodePath));
-            recordChange(request);
-        } else {
-            String msg = JBossCacheConnectorI18n.unableToDeleteBranch.text(getSourceName(), request.inWorkspace(), nodePath);
-            request.setError(new RepositorySourceException(msg));
-        }
-    }
-
-    @Override
-    @SuppressWarnings( "unchecked" )
-    public void process( MoveBranchRequest request ) {
-        // Look up the caches ...
-        Cache<Name, Object> cache = getCache(request, request.inWorkspace());
-        if (cache == null) return;
-
-        // Look up the current node and the new parent (both of which must exist) ...
-        Path nodePath = request.from().getPath();
-        Node<Name, Object> node = getNode(request, cache, nodePath);
-        if (node == null) return;
-        Path newParentPath;
-
-        if (request.into() != null) {
-            newParentPath = request.into().getPath();
-        } else {
-            // into() and before() can't both be null
-            assert request.before() != null;
-            newParentPath = request.before().getPath().getParent();
-        }
-
-        Path.Segment beforeNodeName = request.before() != null ? request.before().getPath().getLastSegment() : null;
-        Node<Name, Object> newParent = getNode(request, cache, newParentPath);
-        if (newParent == null) return;
-
-        removeUuids(cache, node.getFqn());
-
-        // Copy the branch and use the same UUIDs ...
-        Name desiredName = request.desiredName();
-        Path.Segment newSegment = copyNode(cache,
-                                           node,
-                                           newParent,
-                                           desiredName,
-                                           beforeNodeName,
-                                           true,
-                                           UuidConflictBehavior.THROW_EXCEPTION,
-                                           null,
-                                           getExecutionContext());
-        mapUuids(cache, node.getFqn());
-        // Now delete the old node ...
-        Node<Name, Object> oldParent = node.getParent();
-        boolean removed = oldParent.removeChild(node.getFqn().getLastElement());
-        assert removed;
-        Path.Segment nameOfRemovedNode = nodePath.getLastSegment();
-        removeFromChildList(cache, oldParent, nameOfRemovedNode, getExecutionContext());
-
-        Path newPath = pathFactory.create(newParentPath, newSegment);
-        request.setActualLocations(Location.create(nodePath), Location.create(newPath));
-        recordChange(request);
-    }
-
-    /**
-     * {@inheritDoc}
-     * 
-     * @see org.jboss.dna.graph.request.processor.RequestProcessor#process(org.jboss.dna.graph.request.VerifyWorkspaceRequest)
-     */
-    @Override
-    public void process( VerifyWorkspaceRequest request ) {
-        String workspaceName = request.workspaceName();
-        if (workspaceName == null) workspaceName = defaultWorkspaceName;
-
-        Cache<Name, Object> cache = workspaces.getWorkspace(workspaceName, false);
-        if (cache == null) {
-            String msg = JBossCacheConnectorI18n.workspaceDoesNotExist.text(getSourceName(), workspaceName);
-            request.setError(new InvalidWorkspaceException(msg));
-        } else {
-            Fqn<Path.Segment> rootName = Fqn.root();
-            UUID uuid = uuidFactory.create(cache.get(rootName, DnaLexicon.UUID));
-            if (uuid == null) {
-                uuid = uuidFactory.create();
-                cache.put(rootName, DnaLexicon.UUID, uuid);
-            }
-            request.setActualRootLocation(Location.create(pathFactory.createRootPath()));
-            request.setActualWorkspaceName(workspaceName);
-        }
-    }
-
-    /**
-     * {@inheritDoc}
-     * 
-     * @see org.jboss.dna.graph.request.processor.RequestProcessor#process(org.jboss.dna.graph.request.GetWorkspacesRequest)
-     */
-    @Override
-    public void process( GetWorkspacesRequest request ) {
-        request.setAvailableWorkspaceNames(workspaces.getWorkspaceNames());
-    }
-
-    /**
-     * {@inheritDoc}
-     * 
-     * @see org.jboss.dna.graph.request.processor.RequestProcessor#process(org.jboss.dna.graph.request.CreateWorkspaceRequest)
-     */
-    @Override
-    public void process( CreateWorkspaceRequest request ) {
-        String workspaceName = request.desiredNameOfNewWorkspace();
-        if (!creatingWorkspacesAllowed) {
-            String msg = JBossCacheConnectorI18n.unableToCreateWorkspaces.text(getSourceName(), workspaceName);
-            request.setError(new InvalidRequestException(msg));
-            return;
-        }
-        // Try to create the workspace ...
-        Cache<Name, Object> cache = workspaces.getWorkspace(workspaceName, creatingWorkspacesAllowed);
-        if (cache == null) {
-            String msg = JBossCacheConnectorI18n.unableToCreateWorkspace.text(getSourceName(), workspaceName);
-            request.setError(new InvalidWorkspaceException(msg));
-            return;
-        }
-        // Make sure the root node has a UUID ...
-        Fqn<Path.Segment> rootName = Fqn.root();
-        UUID uuid = uuidFactory.create(cache.get(rootName, DnaLexicon.UUID));
-        if (uuid == null) {
-            uuid = uuidFactory.create();
-            cache.put(rootName, DnaLexicon.UUID, uuid);
-            mapUuid(cache, uuid, rootName);
-        }
-        request.setActualRootLocation(Location.create(pathFactory.createRootPath()));
-        request.setActualWorkspaceName(workspaceName);
-        recordChange(request);
-    }
-
-    /**
-     * {@inheritDoc}
-     * 
-     * @see org.jboss.dna.graph.request.processor.RequestProcessor#process(org.jboss.dna.graph.request.CloneWorkspaceRequest)
-     */
-    @Override
-    @SuppressWarnings( "unchecked" )
-    public void process( CloneWorkspaceRequest request ) {
-        String fromWorkspaceName = request.nameOfWorkspaceToBeCloned();
-        String toWorkspaceName = request.desiredNameOfTargetWorkspace();
-        if (!creatingWorkspacesAllowed) {
-            String msg = JBossCacheConnectorI18n.unableToCloneWorkspaces.text(getSourceName(), fromWorkspaceName, toWorkspaceName);
-            request.setError(new InvalidRequestException(msg));
-            return;
-        }
-        // Make sure there is already a workspace that we're cloning ...
-        Cache<Name, Object> fromCache = workspaces.getWorkspace(fromWorkspaceName, false);
-        if (fromCache == null) {
-            String msg = JBossCacheConnectorI18n.workspaceDoesNotExist.text(getSourceName(), fromWorkspaceName);
-            request.setError(new InvalidWorkspaceException(msg));
-            return;
-        }
-
-        // Try to create a new workspace with the target name ...
-        Cache<Name, Object> intoCache = workspaces.createWorkspace(toWorkspaceName);
-        if (intoCache == null) {
-            // Couldn't create it because one already exists ...
-            String msg = JBossCacheConnectorI18n.workspaceAlreadyExists.text(getSourceName(), toWorkspaceName);
-            request.setError(new InvalidWorkspaceException(msg));
-            return;
-        }
-
-        // And finally copy the contents ...
-        Fqn<Path.Segment> rootName = Fqn.root();
-        Node<Name, Object> fromRoot = fromCache.getNode(rootName);
-        Node<Name, Object> intoRoot = intoCache.getNode(rootName);
-        intoRoot.clearData();
-        intoRoot.putAll(fromRoot.getData());
-        ExecutionContext context = getExecutionContext();
-
-        // Loop over each child and copy it ...
-        for (Node<Name, Object> child : fromRoot.getChildren()) {
-            copyNode(intoCache, child, intoRoot, null, null, true, UuidConflictBehavior.THROW_EXCEPTION, null, context);
-        }
-
-        mapUuids(intoCache, intoRoot.getFqn());
-        // Copy the list of child segments in the root (this maintains the order of the children) ...
-        Path.Segment[] childNames = (Path.Segment[])fromRoot.get(JBossCacheLexicon.CHILD_PATH_SEGMENT_LIST);
-        intoRoot.put(JBossCacheLexicon.CHILD_PATH_SEGMENT_LIST, childNames);
-        recordChange(request);
-    }
-
-    /**
-     * {@inheritDoc}
-     * 
-     * @see org.jboss.dna.graph.request.processor.RequestProcessor#process(org.jboss.dna.graph.request.DestroyWorkspaceRequest)
-     */
-    @Override
-    public void process( DestroyWorkspaceRequest request ) {
-        Cache<Name, Object> fromCache = workspaces.getWorkspace(request.workspaceName(), false);
-        if (fromCache == null) {
-            String msg = JBossCacheConnectorI18n.workspaceDoesNotExist.text(getSourceName(), request.workspaceName());
-            request.setError(new InvalidWorkspaceException(msg));
-            return;
-        }
-        request.setActualRootLocation(Location.create(pathFactory.createRootPath()));
-        recordChange(request);
-    }
-
-    // ----------------------------------------------------------------------------------------------------------------
-    // Utility methods
-    // ----------------------------------------------------------------------------------------------------------------
-
-    /**
-     * Obtain the appropriate cache for the supplied workspace name, or set an error on the request if the workspace does not
-     * exist (and could not or should not be created).
-     * 
-     * @param request the request
-     * @param workspaceName the workspace name
-     * @return the cache, or null if there is no such workspace
-     */
-    protected Cache<Name, Object> getCache( Request request,
-                                            String workspaceName ) {
-        if (workspaceName == null) workspaceName = defaultWorkspaceName;
-        Cache<Name, Object> cache = workspaces.getWorkspace(workspaceName, creatingWorkspacesAllowed);
-        if (cache == null && request != null) {
-            String msg = JBossCacheConnectorI18n.workspaceDoesNotExist.text(getSourceName(), workspaceName);
-            request.setError(new InvalidWorkspaceException(msg));
-        }
-        return cache;
-    }
-
-    protected Fqn<Path.Segment> getFullyQualifiedName( Path path ) {
-        assert path != null;
-        return Fqn.fromList(path.getSegmentsList());
-    }
-
-    /**
-     * Get a relative fully-qualified name that consists only of the supplied segment.
-     * 
-     * @param pathSegment the segment from which the fully qualified name is to be created
-     * @return the relative fully-qualified name
-     */
-    protected Fqn<Path.Segment> getFullyQualifiedName( Path.Segment pathSegment ) {
-        assert pathSegment != null;
-        return Fqn.fromElements(pathSegment);
-    }
-
-    @SuppressWarnings( "unchecked" )
-    protected Fqn<Path.Segment> getFullyQualifiedName( Cache<Name, Object> cache,
-                                                       UUID uuid ) {
-        assert cache != null;
-        assert uuid != null;
-
-        Fqn<Path.Segment> uuidFqn = Fqn.fromElements(dnaUuidsSegment, pathFactory.createSegment(uuid.toString()));
-
-        return (Fqn<Path.Segment>)cache.get(uuidFqn, JBossCacheLexicon.FQN);
-    }
-
-    protected Path getPath( PathFactory factory,
-                            Fqn<Path.Segment> fqn ) {
-        List<Path.Segment> segments = fqn.peekElements();
-        return factory.create(factory.createRootPath(), segments);
-    }
-
-    protected void removeUuid( Cache<Name, Object> cache,
-                               UUID uuid ) {
-        assert cache != null;
-        assert uuid != null;
-
-        Fqn<Path.Segment> uuidFqn = Fqn.fromElements(pathFactory.createSegment(JBossCacheLexicon.UUIDS),
-                                                     pathFactory.createSegment(uuid.toString()));
-
-        removeFromChildList(cache,
-                            getNode(null, cache, pathFactory.create(JBossCacheLexicon.UUIDS)),
-                            pathFactory.createSegment(uuid.toString()),
-                            getExecutionContext());
-        cache.removeNode(uuidFqn);
-    }
-
-    @SuppressWarnings( "unchecked" )
-    protected void mapUuid( Cache<Name, Object> cache,
-                            UUID uuid,
-                            Fqn<Path.Segment> path ) {
-        assert cache != null;
-        assert uuid != null;
-
-        Fqn<Path.Segment> uuidsFqn = Fqn.fromElements(this.dnaUuidsSegment);
-
-        Node uuidsNode = cache.getNode(uuidsFqn);
-        if (uuidsNode == null) {
-            uuidsNode = cache.getRoot().addChild(uuidsFqn);
-            updateChildList(cache, cache.getRoot(), this.dnaUuidsSegment.getName(), null, this.getExecutionContext(), true);
-        }
-
-        assert uuidsNode != null : this.dnaUuidsSegment.getName() + "=" + uuidsFqn;
-        Path.Segment uuidSegment = pathFactory.createSegment(uuid.toString());
-
-        if (!uuidsNode.getChildrenNames().contains(uuidSegment)) {
-            Path.Segment newSegment = updateChildList(cache,
-                                                      uuidsNode,
-                                                      uuidSegment.getName(),
-                                                      null,
-                                                      this.getExecutionContext(),
-                                                      true);
-            assert newSegment.getIndex() == 1 : "Should not have SNS under uuids branch";
-        }
-
-        Fqn<Path.Segment> uuidFqn = Fqn.fromRelativeElements(uuidsFqn, uuidSegment);
-
-        cache.put(uuidFqn, JBossCacheLexicon.FQN, path);
-        assert cache.getNode(uuidFqn) != null;
-        assert cache.get(uuidFqn, JBossCacheLexicon.FQN) != null;
-        assert path.equals(getFullyQualifiedName(cache, uuid)) : path + " => " + getFullyQualifiedName(cache, uuid);
-    }
-
-    protected void mapUuids( Cache<Name, Object> cache,
-                             Fqn<Path.Segment> path ) {
-        Node<Name, Object> node = cache.getNode(path);
-        assert node != null : path.toString();
-        UUID uuid = (UUID)node.get(DnaLexicon.UUID);
-        if (uuid != null) {
-            mapUuid(cache, uuid, path);
-            assert getFullyQualifiedName(cache, uuid).equals(path);
-        }
-
-        Path.Segment[] childNamesProperty = (Path.Segment[])node.get(JBossCacheLexicon.CHILD_PATH_SEGMENT_LIST);
-        if (childNamesProperty == null) return;
-
-        for (Path.Segment childName : childNamesProperty) {
-            Fqn<Path.Segment> childPath = Fqn.fromRelativeElements(path, childName);
-            mapUuids(cache, childPath);
-        }
-    }
-
-    protected void removeUuids( Cache<Name, Object> cache,
-                                Fqn<Path.Segment> path ) {
-        Node<Name, Object> node = cache.getNode(path);
-        assert node != null : path.toString();
-        UUID uuid = (UUID)node.get(DnaLexicon.UUID);
-
-        if (uuid != null) removeUuid(cache, uuid);
-
-        Path.Segment[] childNamesProperty = (Path.Segment[])node.get(JBossCacheLexicon.CHILD_PATH_SEGMENT_LIST);
-        if (childNamesProperty == null) return;
-
-        for (Path.Segment childName : childNamesProperty) {
-            Fqn<Path.Segment> childPath = Fqn.fromRelativeElements(path, childName);
-            removeUuids(cache, childPath);
-        }
-    }
-
-    protected Node<Name, Object> getNode( Request request,
-                                          Cache<Name, Object> cache,
-                                          Path path ) {
-        ExecutionContext context = getExecutionContext();
-        if (path == null) {
-            String msg = JBossCacheConnectorI18n.locationsMustHavePath.text(getSourceName(), request);
-            request.setError(new InvalidRequestException(msg));
-            return null;
-        }
-        // Look up the node with the supplied path ...
-        Fqn<Path.Segment> fqn = getFullyQualifiedName(path);
-        Node<Name, Object> node = cache.getNode(fqn);
-
-        if (node == null) {
-            String nodePath = path.getString(context.getNamespaceRegistry());
-            Path lowestExisting = null;
-            while (fqn != null) {
-                fqn = fqn.getParent();
-                node = cache.getNode(fqn);
-                if (node != null) {
-                    lowestExisting = getPath(context.getValueFactories().getPathFactory(), fqn);
-                    fqn = null;
-                }
-            }
-            request.setError(new PathNotFoundException(Location.create(path), lowestExisting,
-                                                       JBossCacheConnectorI18n.nodeDoesNotExist.text(nodePath)));
-            node = null;
-        }
-        return node;
-
-    }
-
-    /**
-     * @param newCache the cache into which the node is to be copied
-     * @param original the node to be copied
-     * @param newParent the new parent of the node to be copied
-     * @param desiredName the desired name of the node in the new location
-     * @param beforeNodeName the node before which the new node should be placed
-     * @param recursive if this is a deep copy
-     * @param uuidConflictBehavior indicates whether the original UUIDs should be used for the copies or new UUIDs should be used
-     * @param count the count of nodes affected by the operation
-     * @param context the execution context that provides the path factory to be used to create the new path name
-     * @return the path segment that identifies the new node under its new parent
-     */
-    @SuppressWarnings( "unchecked" )
-    protected Path.Segment copyNode( Cache<Name, Object> newCache,
-                                     Node<Name, Object> original,
-                                     Node<Name, Object> newParent,
-                                     Name desiredName,
-                                     Path.Segment beforeNodeName,
-                                     boolean recursive,
-                                     UuidConflictBehavior uuidConflictBehavior,
-                                     AtomicInteger count,
-                                     ExecutionContext context ) {
-        assert original != null;
-        assert newParent != null;
-        // Get or create the new node ...
-        Path.Segment name = desiredName != null ? context.getValueFactories().getPathFactory().createSegment(desiredName) : (Path.Segment)original.getFqn()
-                                                                                                                                                  .getLastElement();
-
-        // Update the children to account for same-name siblings.
-        // This not only updates the FQN of the child nodes, but it also sets the property that stores the
-        // the array of Path.Segment for the children (since the cache doesn't maintain order).
-        Path.Segment newSegment = updateChildList(newCache, newParent, name.getName(), beforeNodeName, context, true);
-        Node<Name, Object> copy = newParent.addChild(getFullyQualifiedName(newSegment));
-        assert checkChildren(newParent);
-        // Copy the properties ...
-        copy.clearData();
-        copy.putAll(original.getData());
-        copy.remove(JBossCacheLexicon.CHILD_PATH_SEGMENT_LIST); // will be reset later ...
-
-        UUID uuid;
-        switch (uuidConflictBehavior) {
-            case ALWAYS_CREATE_NEW_UUID:
-                uuid = UUID.randomUUID();
-                break;
-            case REPLACE_EXISTING_NODE:
-                uuid = uuidFactory.create(original.get(DnaLexicon.UUID));
-                Fqn<?> existingPath = getFullyQualifiedName(newCache, uuid);
-                if (existingPath != null) {
-                    Node<Name, Object> existingNode = newCache.getNode(existingPath);
-                    deleteNode(newCache, existingNode);
-                }
-
-                break;
-            case THROW_EXCEPTION:
-                uuid = uuidFactory.create(original.get(DnaLexicon.UUID));
-                break;
-            default:
-                throw new IllegalStateException("Unexpected UuidConflictBehavior value: " + uuidConflictBehavior);
-        }
-        copy.put(DnaLexicon.UUID, uuid);
-
-        if (count != null) count.incrementAndGet();
-        if (recursive) {
-            // Loop over each child and call this method ...
-            for (Node<Name, Object> child : original.getChildren()) {
-                copyNode(newCache, child, copy, null, null, true, uuidConflictBehavior, count, context);
-            }
-        }
-        mapUuids(newCache, copy.getFqn());
-        assert getFullyQualifiedName(newCache, uuid) != null;
-        return newSegment;
-    }
-
-    /**
-     * Update (or create) the array of {@link Path.Segment path segments} for the children of the supplied node. This array
-     * maintains the ordered list of children (since the {@link Cache} does not maintain the order). Invoking this method will
-     * change any existing children that a {@link Path.Segment#getName() name part} that matches the supplied
-     * <code>changedName</code> to have the appropriate {@link Path.Segment#getIndex() same-name sibling index}.
-     * 
-     * @param cache the cache in which the parent exists ...
-     * @param parent the parent node; may not be null
-     * @param changedName the name that should be compared to the existing node siblings to determine whether the same-name
-     *        sibling indexes should be updated; may not be null
-     * @param beforeNodeName the name of the node before which this node should be placed; null indicates that this node should be
-     *        added as the last child under the node
-     * @param context the execution context; may not be null
-     * @param addChildWithName true if a new child with the supplied name is to be added to the children (but which does not yet
-     *        exist in the node's children)
-     * @return the path segment for the new child, or null if <code>addChildWithName</code> was false
-     */
-    protected Path.Segment updateChildList( Cache<Name, Object> cache,
-                                            Node<Name, Object> parent,
-                                            Name changedName,
-                                            Path.Segment beforeNodeName,
-                                            ExecutionContext context,
-                                            boolean addChildWithName ) {
-        assert parent != null;
-        assert changedName != null;
-        assert context != null;
-        Set<Node<Name, Object>> children = parent.getChildren();
-        if (children.isEmpty() && !addChildWithName) return null;
-
-        // Go through the children, looking for any children with the same name as the 'changedName'
-        List<ChildInfo> childrenWithChangedName = new LinkedList<ChildInfo>();
-        Path.Segment[] childNames = (Path.Segment[])parent.get(JBossCacheLexicon.CHILD_PATH_SEGMENT_LIST);
-        int index = 0;
-        int snsIndex = 0;
-        boolean foundBeforeNode = false;
-        if (childNames != null) {
-            for (Path.Segment childName : childNames) {
-                if (childName.equals(beforeNodeName)) {
-                    foundBeforeNode = true;
-                    // And add a child info for the new node ...
-                    ChildInfo info = new ChildInfo(null, snsIndex++);
-                    childrenWithChangedName.add(info);
-                }
-                if (childName.getName().equals(changedName)) {
-                    ChildInfo info = new ChildInfo(childName, snsIndex);
-                    childrenWithChangedName.add(info);
-                }
-
-                snsIndex++;
-                if (!foundBeforeNode) index++;
-            }
-
-        }
-        if (addChildWithName) {
-            // Make room for the new child at the end of the array ...
-            if (childNames == null) {
-                childNames = new Path.Segment[1];
-            } else {
-                int numExisting = childNames.length;
-                Path.Segment[] newChildNames = new Path.Segment[numExisting + 1];
-                System.arraycopy(childNames, 0, newChildNames, 0, index);
-
-                if (index != numExisting) {
-                    System.arraycopy(childNames, index, newChildNames, index + 1, numExisting - index);
-                }
-                childNames = newChildNames;
-            }
-
-            if (!foundBeforeNode) {
-                // Make sure that we add a record for the new node if it hasn't previously been added
-                ChildInfo info = new ChildInfo(null, index);
-                childrenWithChangedName.add(info);
-
-            }
-            Path.Segment newSegment = context.getValueFactories().getPathFactory().createSegment(changedName);
-            childNames[index] = newSegment;
-        }
-        assert childNames != null;
-
-        // Now process the children with the same name, which may include a child info for the new node ...
-        assert childrenWithChangedName.isEmpty() == false;
-        if (childrenWithChangedName.size() == 1) {
-            // The child should have no indexes ...
-            ChildInfo child = childrenWithChangedName.get(0);
-            if (child.segment != null && child.segment.hasIndex()) {
-                // The existing child needs to have a new index ..
-                Path.Segment newSegment = context.getValueFactories().getPathFactory().createSegment(changedName);
-                // Replace the child with the correct FQN ...
-                changeNodeName(cache, parent, child.segment, newSegment, context);
-                // Change the segment in the child list ...
-                childNames[child.childIndex] = newSegment;
-            }
-        } else {
-            // There is more than one child with the same name ...
-            int i = 0;
-            for (ChildInfo child : childrenWithChangedName) {
-                if (child.segment != null) {
-                    // Determine the new name and index ...
-                    Path.Segment newSegment = context.getValueFactories().getPathFactory().createSegment(changedName, i + 1);
-                    // Replace the child with the correct FQN ...
-                    changeNodeName(cache, parent, child.segment, newSegment, context);
-                    // Change the segment in the child list ...
-                    childNames[child.childIndex] = newSegment;
-                } else {
-                    // Determine the new name and index ...
-                    Path.Segment newSegment = context.getValueFactories().getPathFactory().createSegment(changedName, i + 1);
-                    childNames[child.childIndex] = newSegment;
-                }
-                ++i;
-            }
-        }
-
-        // Record the list of children as a property on the parent ...
-        // (Do this last, as it doesn't need to be done if there's an exception in the above logic)
-        context.getLogger(getClass()).trace("Updating child list of {0} to: {1}", parent.getFqn(), Arrays.asList(childNames));
-        parent.put(JBossCacheLexicon.CHILD_PATH_SEGMENT_LIST, childNames); // replaces any existing value
-
-        if (addChildWithName) {
-            // Return the segment for the new node ...
-            return childNames[index];
-        }
-        return null;
-    }
-
-    /**
-     * Update the array of {@link Path.Segment path segments} for the children of the supplied node, based upon a node being
-     * removed. This array maintains the ordered list of children (since the {@link Cache} does not maintain the order). Invoking
-     * this method will change any existing children that a {@link Path.Segment#getName() name part} that matches the supplied
-     * <code>changedName</code> to have the appropriate {@link Path.Segment#getIndex() same-name sibling index}.
-     * 
-     * @param cache the cache in which the parent exists ...
-     * @param parent the parent node; may not be null
-     * @param removedNode the segment of the node that was removed, which signals to look for node with the same name; may not be
-     *        null
-     * @param context the execution context; may not be null
-     */
-    protected void removeFromChildList( Cache<Name, Object> cache,
-                                        Node<Name, Object> parent,
-                                        Path.Segment removedNode,
-                                        ExecutionContext context ) {
-        assert parent != null;
-        assert context != null;
-        Set<Node<Name, Object>> children = parent.getChildren();
-        if (children.isEmpty()) {
-            parent.put(JBossCacheLexicon.CHILD_PATH_SEGMENT_LIST, null); // replaces any existing value
-            return;
-        }
-
-        // Go through the children, looking for any children with the same name as the 'changedName'
-        Path.Segment[] childNames = (Path.Segment[])parent.get(JBossCacheLexicon.CHILD_PATH_SEGMENT_LIST);
-        assert childNames != null;
-        int snsIndex = removedNode.getIndex();
-        int index = 0;
-        Path.Segment[] newChildNames = new Path.Segment[childNames.length - 1];
-        for (Path.Segment childName : childNames) {
-
-            if (!childName.getName().equals(removedNode.getName())) {
-                newChildNames[index] = childName;
-                index++;
-            } else {
-                // The name matches ...
-                if (childName.getIndex() < snsIndex) {
-                    // Just copy ...
-                    newChildNames[index] = childName;
-                    index++;
-                } else if (childName.getIndex() == snsIndex) {
-                    // don't copy ...
-                } else {
-                    // Append an updated segment ...
-                    Path.Segment newSegment = context.getValueFactories()
-                                                     .getPathFactory()
-                                                     .createSegment(childName.getName(), childName.getIndex() - 1);
-                    newChildNames[index] = newSegment;
-                    // Replace the child with the correct FQN ...
-                    changeNodeName(cache, parent, childName, newSegment, context);
-                    index++;
-                }
-            }
-        }
-        parent.put(JBossCacheLexicon.CHILD_PATH_SEGMENT_LIST, newChildNames); // replaces any existing value
-    }
-
-    protected boolean checkChildren( Node<Name, Object> parent ) {
-        Path.Segment[] childNamesProperty = (Path.Segment[])parent.get(JBossCacheLexicon.CHILD_PATH_SEGMENT_LIST);
-        Set<Object> childNames = parent.getChildrenNames();
-        boolean result = true;
-        if (childNamesProperty.length != childNames.size()) result = false;
-        if (!result) throw new IllegalStateException(parent.getFqn().toString());
-        for (int i = 0; i != childNamesProperty.length; ++i) {
-            if (!childNames.contains(childNamesProperty[i])) result = false;
-        }
-        if (!result) throw new IllegalStateException(parent.getFqn().toString());
-        if (!result) {
-            List<Path.Segment> names = new ArrayList<Path.Segment>();
-            for (Object name : childNames) {
-                assert name instanceof Path.Segment : parent.getFqn().toString() + "/" + name.toString();
-                names.add((Path.Segment)name);
-            }
-            Collections.sort(names);
-            Logger.getLogger(getClass()).trace("Child list on {0} is: {1}", parent.getFqn(), childNamesProperty);
-            Logger.getLogger(getClass()).trace("Children of {0} is: {1}", parent.getFqn(), names);
-        }
-        if (!result) throw new IllegalStateException(parent.getFqn().toString());
-        return result;
-    }
-
-    /**
-     * Utility class used by the
-     * {@link JBossCacheRequestProcessor#updateChildList(Cache, Node, Name, org.jboss.dna.graph.property.Path.Segment, ExecutionContext, boolean)}
-     * method.
-     * 
-     * @author Randall Hauch
-     */
-    private static class ChildInfo {
-        protected final Path.Segment segment;
-        protected final int childIndex;
-
-        protected ChildInfo( Path.Segment childSegment,
-                             int childIndex ) {
-            this.segment = childSegment;
-            this.childIndex = childIndex;
-        }
-
-        @Override
-        public String toString() {
-            return (segment != null ? segment.getString() : "null") + "@" + childIndex;
-        }
-
-    }
-
-    /**
-     * Changes the name of the node in the cache (but does not update the list of child segments stored on the parent).
-     * 
-     * @param cache
-     * @param parent
-     * @param existing
-     * @param newSegment
-     * @param context
-     */
-    @SuppressWarnings( "unchecked" )
-    protected void changeNodeName( Cache<Name, Object> cache,
-                                   Node<Name, Object> parent,
-                                   Path.Segment existing,
-                                   Path.Segment newSegment,
-                                   ExecutionContext context ) {
-        assert parent != null;
-        assert existing != null;
-        assert newSegment != null;
-        assert context != null;
-
-        if (existing.equals(newSegment)) return;
-        context.getLogger(getClass()).trace("Renaming {0} to {1} under {2}", existing, newSegment, parent.getFqn());
-        Node<Name, Object> existingChild = parent.getChild(existing);
-        assert existingChild != null : parent.getFqn().toString() + "/" + existing;
-
-        // JBoss Cache can move a node from one node to another node, but the move doesn't change the name;
-        // since you provide the FQN of the parent location, the name of the node cannot be changed.
-        // Therefore, to compensate, we need to create a new child, copy all of the data, move all of the child
-        // nodes of the old node, then remove the old node.
-
-        // Create the new node ...
-        Node<Name, Object> newChild = parent.addChild(Fqn.fromElements(newSegment));
-        Fqn<Path.Segment> newChildFqn = newChild.getFqn();
-
-        // Copy the data ...
-        newChild.putAll(existingChild.getData());
-
-        // Move the children ...
-        for (Node<Name, Object> grandChild : existingChild.getChildren()) {
-            cache.move(grandChild.getFqn(), newChildFqn);
-        }
-
-        // Remove the existing ...
-        parent.removeChild(existing);
-    }
-}

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	2009-06-24 22:14:12 UTC (rev 1064)
+++ trunk/extensions/dna-connector-jbosscache/src/main/java/org/jboss/dna/connector/jbosscache/JBossCacheSource.java	2009-06-27 02:54:06 UTC (rev 1065)
@@ -45,11 +45,14 @@
 import javax.naming.Referenceable;
 import javax.naming.StringRefAddr;
 import javax.naming.spi.ObjectFactory;
+import net.jcip.annotations.GuardedBy;
 import net.jcip.annotations.ThreadSafe;
 import org.jboss.cache.Cache;
 import org.jboss.cache.CacheFactory;
 import org.jboss.cache.DefaultCacheFactory;
+import org.jboss.cache.config.ConfigurationException;
 import org.jboss.dna.common.i18n.I18n;
+import org.jboss.dna.common.util.Logger;
 import org.jboss.dna.common.util.StringUtil;
 import org.jboss.dna.graph.DnaLexicon;
 import org.jboss.dna.graph.cache.CachePolicy;
@@ -58,8 +61,11 @@
 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.map.MapNode;
+import org.jboss.dna.graph.connector.map.MapRepositoryConnection;
+import org.jboss.dna.graph.connector.map.MapRepositorySource;
 import org.jboss.dna.graph.observe.Observer;
-import org.jboss.dna.graph.property.Name;
+import org.jboss.dna.graph.request.CreateWorkspaceRequest.CreateConflictBehavior;
 
 /**
  * A repository source that uses a JBoss Cache instance to manage the content. This source is capable of using an existing
@@ -79,7 +85,7 @@
  * @author Randall Hauch
  */
 @ThreadSafe
-public class JBossCacheSource implements RepositorySource, ObjectFactory {
+public class JBossCacheSource implements MapRepositorySource, ObjectFactory {
 
     private static final long serialVersionUID = 2L;
     /**
@@ -114,9 +120,10 @@
     private volatile String defaultWorkspace;
     private volatile String[] predefinedWorkspaces = new String[] {};
     private volatile RepositorySourceCapabilities capabilities = new RepositorySourceCapabilities(true, true, false, true, false);
-    private transient JBossCacheWorkspaces workspaces;
+    private transient JBossCacheRepository repository;
     private transient Context jndiContext;
     private transient RepositoryContext repositoryContext;
+    private final Set<String> repositoryNamesForConfigurationNameProblems = new HashSet<String>();
 
     /**
      * Create a repository source instance.
@@ -435,7 +442,7 @@
             I18n msg = JBossCacheConnectorI18n.propertyIsRequired;
             throw new RepositorySourceException(getName(), msg.text("name"));
         }
-        if (this.workspaces == null) {
+        if (this.repository == null) {
             Context context = getContext();
             if (context == null) {
                 try {
@@ -446,13 +453,13 @@
             }
 
             // Look for a cache factory in JNDI ...
-            CacheFactory<Name, Object> cacheFactory = null;
+            CacheFactory<UUID, MapNode> cacheFactory = null;
             String jndiName = getCacheFactoryJndiName();
             if (jndiName != null && jndiName.trim().length() != 0) {
                 Object object = null;
                 try {
                     object = context.lookup(jndiName);
-                    if (object != null) cacheFactory = (CacheFactory<Name, Object>)object;
+                    if (object != null) cacheFactory = (CacheFactory<UUID, MapNode>)object;
                 } catch (ClassCastException err) {
                     I18n msg = JBossCacheConnectorI18n.objectFoundInJndiWasNotCacheFactory;
                     String className = object != null ? object.getClass().getName() : "null";
@@ -462,27 +469,65 @@
                     throw new RepositorySourceException(getName(), err);
                 }
             }
-            if (cacheFactory == null) cacheFactory = new DefaultCacheFactory<Name, Object>();
+            if (cacheFactory == null) cacheFactory = new DefaultCacheFactory<UUID, MapNode>();
 
-            // Get the default cache configuration name
-            String configName = this.getCacheConfigurationName();
+            // Now create the repository ...
+            this.repository = new JBossCacheRepository(getName(), this.rootNodeUuid, createNewCache(cacheFactory, getName()));
 
             // Create the set of initial names ...
-            Set<String> initialNames = new HashSet<String>();
             for (String initialName : getPredefinedWorkspaceNames())
-                initialNames.add(initialName);
+                repository.createWorkspace(null, initialName, CreateConflictBehavior.DO_NOT_CREATE);
+        
+        }
 
-            // Now create the workspace manager ...
-            this.workspaces = new JBossCacheWorkspaces(getName(), cacheFactory, configName, initialNames, context);
+        return new MapRepositoryConnection(this, this.repository);
+    }
+
+    /**
+     * Method that is responsible for attempting to create a new cache given the supplied workspace name. Note that this is
+     * probably called at most once for each workspace name (except if this method fails to create a cache for a given workspace
+     * name).
+     * 
+     * @param workspaceName the name of the workspace
+     * @return the new cache that corresponds to the workspace name
+     */
+    @GuardedBy( "writeLock" )
+    protected Cache<UUID, MapNode> createNewCache( CacheFactory<UUID, MapNode> cacheFactory, String repositoryName ) {
+        assert repositoryName != null;
+        if (cacheFactory == null) return null;
+
+        // Try to create the cache using the workspace name as the configuration ...
+        try {
+            return cacheFactory.createCache(repositoryName);
+        } catch (ConfigurationException error) {
+            // The workspace name is probably not the name of a configuration ...
+            I18n msg = JBossCacheConnectorI18n.workspaceNameWasNotValidConfiguration;
+            Logger.getLogger(getClass()).debug(msg.text(repositoryName, error.getMessage()));
         }
 
-        return new JBossCacheConnection(this, this.workspaces);
+        if (this.cacheConfigurationName != null) {
+            // Try to create the cache using the default configuration name ...
+            try {
+                return cacheFactory.createCache(getCacheConfigurationName());
+            } catch (ConfigurationException error) {
+                // The default configuration name is not valid ...
+                if (this.repositoryNamesForConfigurationNameProblems.add(repositoryName)) {
+                    // Log this problem only the first time ...
+                    I18n msg = JBossCacheConnectorI18n.defaultCacheFactoryConfigurationNameWasNotValidConfiguration;
+                    Logger.getLogger(getClass()).debug(msg.text(repositoryName));
+                }
+            }
+        }
+
+        // Just create a new cache with the default configuration ...
+        return cacheFactory.createCache();
     }
 
+    
     /**
      * @return repositoryContext
      */
-    protected RepositoryContext getRepositoryContext() {
+    public RepositoryContext getRepositoryContext() {
         return repositoryContext;
     }
 

Deleted: trunk/extensions/dna-connector-jbosscache/src/main/java/org/jboss/dna/connector/jbosscache/JBossCacheWorkspaces.java
===================================================================
--- trunk/extensions/dna-connector-jbosscache/src/main/java/org/jboss/dna/connector/jbosscache/JBossCacheWorkspaces.java	2009-06-24 22:14:12 UTC (rev 1064)
+++ trunk/extensions/dna-connector-jbosscache/src/main/java/org/jboss/dna/connector/jbosscache/JBossCacheWorkspaces.java	2009-06-27 02:54:06 UTC (rev 1065)
@@ -1,297 +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.
- *
- * 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.jbosscache;
-
-import java.net.URI;
-import java.net.URISyntaxException;
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.Set;
-import java.util.concurrent.ConcurrentHashMap;
-import java.util.concurrent.locks.Lock;
-import java.util.concurrent.locks.ReentrantLock;
-import javax.naming.Context;
-import net.jcip.annotations.GuardedBy;
-import net.jcip.annotations.ThreadSafe;
-import org.jboss.cache.Cache;
-import org.jboss.cache.CacheFactory;
-import org.jboss.cache.config.ConfigurationException;
-import org.jboss.dna.common.i18n.I18n;
-import org.jboss.dna.common.util.Logger;
-import org.jboss.dna.graph.connector.RepositorySourceException;
-import org.jboss.dna.graph.property.Name;
-
-/**
- * This class represents a set of workspaces used by the {@link JBossCacheSource JBoss Cache connector}.
- */
- at ThreadSafe
-public class JBossCacheWorkspaces {
-
-    private final String sourceName;
-    private final ConcurrentHashMap<String, Cache<Name, Object>> caches = new ConcurrentHashMap<String, Cache<Name, Object>>();
-    private final Set<String> initialNames;
-    private final CacheFactory<Name, Object> cacheFactory;
-    private final String defaultCacheFactoryConfigurationName;
-    private final Context jndi;
-    private final Set<String> workspaceNamesForJndiClassCastProblems = new HashSet<String>();
-    private final Set<String> workspaceNamesForConfigurationNameProblems = new HashSet<String>();
-    private final Lock writeLock = new ReentrantLock();
-
-    /**
-     * Create a new instance of the workspace and cache manager for the JBoss Cache connector.
-     * 
-     * @param sourceName the name of the source that uses this object; may not be null
-     * @param cacheFactory the factory that should be used to create new caches; may not be null
-     * @param defaultCacheFactoryConfigurationName the name of the configuration that is supplied to the {@link CacheFactory cache
-     *        factory} to {@link CacheFactory#createCache(String) create the new cache} if the workspace name does not correspond
-     *        to a configuration; may be null
-     * @param initialNames the initial names for the workspaces; may be null or empty
-     * @param jndiContext the JNDI context that should be used, or null if JNDI should not be used at all
-     */
-    public JBossCacheWorkspaces( String sourceName,
-                                 CacheFactory<Name, Object> cacheFactory,
-                                 String defaultCacheFactoryConfigurationName,
-                                 Set<String> initialNames,
-                                 Context jndiContext ) {
-        assert sourceName != null;
-        this.sourceName = sourceName;
-        if (initialNames == null) initialNames = Collections.emptySet();
-        this.initialNames = initialNames;
-        this.cacheFactory = cacheFactory;
-        this.defaultCacheFactoryConfigurationName = defaultCacheFactoryConfigurationName;
-        this.jndi = jndiContext;
-    }
-
-    /**
-     * Attempt to create a new workspace with the supplied name.
-     * 
-     * @param workspaceName the name of the new workspace, which may be a valid URI if the cache is to be found in JNDI
-     * @return the new workspace, or null if there is already a workspace with the name
-     */
-    public Cache<Name, Object> createWorkspace( String workspaceName ) {
-        try {
-            writeLock.lock();
-            // First, see if there is already an existing cache ...
-            Cache<Name, Object> cache = caches.get(workspaceName);
-            if (cache != null) {
-                // There is already a workspace, so we can't create ...
-                return null;
-            }
-
-            // There isn't already a cache, but next check the list of initial names ...
-            if (initialNames.contains(workspaceName)) {
-                // The workspace already exists, but we just haven't accessed it yet
-                return null;
-            }
-
-            // Time to create a new cache. First see if we're supposed to use a cache already in JNDI ...
-            cache = findCacheInJndi(workspaceName);
-            if (cache == null) {
-                // Try to create one ...
-                cache = createNewCache(workspaceName);
-            }
-
-            if (cache != null) {
-                // Manage this cache ...
-                Cache<Name, Object> existing = caches.putIfAbsent(workspaceName, cache);
-                if (existing != null) cache = existing;
-            }
-            return cache; // may still be null if we couldn't create a new cache
-
-        } finally {
-            writeLock.unlock();
-        }
-    }
-
-    /**
-     * Get the cache that corresponds to the supplied workspace name, and optionally create a new cache if no such cache already
-     * exists. This method first checks for {@link Cache} instances previously found for the same workspace name. If no cache is
-     * found, this method then checks whether the supplied workspace name is a valid URI, and if so the method looks for a
-     * {@link Cache} instance in JNDI at that URI. If none is found (or the name is not a valid URI), this method then creates a
-     * new {@link Cache} instance using the {@link CacheFactory} supplied in the constructor.
-     * 
-     * @param workspaceName the name of the workspace, which may be a valid URI if the cache is to be found in JNDI
-     * @param createIfMissing true if the cache should be created if no such cache already exists
-     * @return the cache that corresponds to the workspace with the supplied name, or null if there is no cache for that workspace
-     *         (and one could not be or was not created)
-     */
-    public Cache<Name, Object> getWorkspace( String workspaceName,
-                                             boolean createIfMissing ) {
-        // First, see if there is already an existing cache ...
-        Cache<Name, Object> cache = caches.get(workspaceName);
-        if (cache != null) return cache;
-
-        try {
-            writeLock.lock();
-            // Ensure one didn't get created while we waited for the lock ...
-            cache = caches.get(workspaceName);
-            if (cache != null) return cache;
-
-            // We've not yet come across the cache for the workspace.
-
-            // Check whether the workspace name was one of the initial set of names...
-            if (this.initialNames.contains(workspaceName)) {
-                // This workspace/cache was one of those defined at startup to be available,
-                // so we really don't consider this to be "creating a new cache"; it's just the first time we've used it
-                // and we're lazily finding the instances. So, just mark 'createIfMissing' to true and continue ...
-                createIfMissing = true;
-            }
-
-            if (!createIfMissing) return null;
-
-            // First see if we can find a cache in JNDI ...
-            cache = findCacheInJndi(workspaceName);
-
-            if (cache == null) {
-                // Try to create one ...
-                cache = createNewCache(workspaceName);
-            }
-
-            if (cache != null) {
-                Cache<Name, Object> existing = caches.putIfAbsent(workspaceName, cache);
-                if (existing != null) cache = existing;
-            }
-            return cache; // may still be null if we couldn't create a new cache
-        } finally {
-            writeLock.unlock();
-        }
-    }
-
-    /**
-     * Attempt to find an existing {@link Cache} object in JNDI, using the supplied workspace name as the JNDI name.
-     * 
-     * @param workspaceName the name of the workspace
-     * @return the cache found in JNDI that corresponds to the workspace name
-     */
-    @SuppressWarnings( "unchecked" )
-    @GuardedBy( "writeLock" )
-    protected Cache<Name, Object> findCacheInJndi( String workspaceName ) {
-        assert workspaceName != null;
-        if (jndi == null) return null;
-
-        // Try to look up the cache instance in JDNI ...
-        workspaceName = workspaceName.trim();
-        if (workspaceName.length() != 0) {
-            try {
-                new URI(workspaceName.trim());
-                Object object = null;
-                try {
-                    object = jndi.lookup(workspaceName);
-                    if (object != null && object instanceof Cache) {
-                        return (Cache<Name, Object>)object;
-                    }
-                } catch (ClassCastException err) {
-                    // The object found in JNDI was not a JBoss Cache instance ...
-                    if (this.workspaceNamesForJndiClassCastProblems.add(workspaceName)) {
-                        // Log this problem only the first time ...
-                        String className = object != null ? object.getClass().getName() : "null";
-                        I18n msg = JBossCacheConnectorI18n.objectFoundInJndiWasNotCache;
-                        Logger.getLogger(getClass()).warn(msg, workspaceName, sourceName, className);
-                    }
-                } catch (Throwable error) {
-                    // try loading
-                    if (error instanceof RuntimeException) throw (RuntimeException)error;
-                    throw new RepositorySourceException(sourceName, error);
-                }
-
-            } catch (URISyntaxException err) {
-                // Not a valid URI, so just continue ...
-            }
-        }
-        return null;
-    }
-
-    /**
-     * Method that is responsible for attempting to create a new cache given the supplied workspace name. Note that this is
-     * probably called at most once for each workspace name (except if this method fails to create a cache for a given workspace
-     * name).
-     * 
-     * @param workspaceName the name of the workspace
-     * @return the new cache that corresponds to the workspace name
-     */
-    @GuardedBy( "writeLock" )
-    protected Cache<Name, Object> createNewCache( String workspaceName ) {
-        assert workspaceName != null;
-        if (this.cacheFactory == null) return null;
-
-        // Try to create the cache using the workspace name as the configuration ...
-        try {
-            return this.cacheFactory.createCache(workspaceName);
-        } catch (ConfigurationException error) {
-            // The workspace name is probably not the name of a configuration ...
-            I18n msg = JBossCacheConnectorI18n.workspaceNameWasNotValidConfiguration;
-            Logger.getLogger(getClass()).debug(msg.text(workspaceName, error.getMessage()));
-        }
-
-        if (this.defaultCacheFactoryConfigurationName != null) {
-            // Try to create the cache using the default configuration name ...
-            try {
-                return this.cacheFactory.createCache(this.defaultCacheFactoryConfigurationName);
-            } catch (ConfigurationException error) {
-                // The default configuration name is not valid ...
-                if (this.workspaceNamesForConfigurationNameProblems.add(workspaceName)) {
-                    // Log this problem only the first time ...
-                    I18n msg = JBossCacheConnectorI18n.defaultCacheFactoryConfigurationNameWasNotValidConfiguration;
-                    Logger.getLogger(getClass()).debug(msg.text(workspaceName));
-                }
-            }
-        }
-
-        // Just create a new cache with the default configuration ...
-        return this.cacheFactory.createCache();
-    }
-
-    /**
-     * Return an immutable set of names for the currently available workspaces.
-     * 
-     * @return the immutable set of workspace names; never null
-     */
-    public Set<String> getWorkspaceNames() {
-        Set<String> names = new HashSet<String>();
-        if (!initialNames.isEmpty()) names.addAll(initialNames);
-        names.addAll(caches.keySet());
-        return Collections.unmodifiableSet(names);
-    }
-
-    /**
-     * Remove the cache that corresponds to the supplied workspace name as no longer being available. This will remove the cache
-     * even if the workspace name is one of the "initial names" provided to this object's constructor.
-     * 
-     * @param workspaceName the name of the existing workspace that is to be removed
-     * @return true if there was an existing workspace that was removed by this call, or false if there was no workspace with the
-     *         supplied name
-     */
-    public boolean removeWorkspace( String workspaceName ) {
-        try {
-            writeLock.lock();
-
-            // Remove this from both the cache and initialNames ...
-            boolean removed = initialNames.remove(workspaceName);
-            if (caches.remove(workspaceName) != null) removed = true;
-            return removed;
-        } finally {
-            writeLock.unlock();
-        }
-    }
-}

Deleted: trunk/extensions/dna-connector-jbosscache/src/test/java/org/jboss/dna/connector/jbosscache/JBossCacheRequestProcessorTest.java
===================================================================
--- trunk/extensions/dna-connector-jbosscache/src/test/java/org/jboss/dna/connector/jbosscache/JBossCacheRequestProcessorTest.java	2009-06-24 22:14:12 UTC (rev 1064)
+++ trunk/extensions/dna-connector-jbosscache/src/test/java/org/jboss/dna/connector/jbosscache/JBossCacheRequestProcessorTest.java	2009-06-27 02:54:06 UTC (rev 1065)
@@ -1,120 +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.jbosscache;
-
-import static org.hamcrest.core.Is.is;
-import static org.junit.Assert.assertThat;
-import java.util.HashSet;
-import java.util.Set;
-import javax.naming.Context;
-import org.jboss.cache.CacheFactory;
-import org.jboss.cache.DefaultCacheFactory;
-import org.jboss.cache.Fqn;
-import org.jboss.dna.graph.DnaLexicon;
-import org.jboss.dna.graph.ExecutionContext;
-import org.jboss.dna.graph.property.Name;
-import org.jboss.dna.graph.property.Path;
-import org.jboss.dna.graph.property.PathFactory;
-import org.junit.Before;
-import org.junit.Test;
-import org.mockito.MockitoAnnotations;
-import org.mockito.MockitoAnnotations.Mock;
-
-/**
- * @author Randall Hauch
- */
-public class JBossCacheRequestProcessorTest {
-
-    private JBossCacheRequestProcessor processor;
-    private JBossCacheWorkspaces workspaces;
-    private Set<String> initialWorkspaceNames;
-    private String defaultWorkspaceName;
-    private String defaultConfigName;
-    private CacheFactory<Name, Object> cacheFactory;
-    private ExecutionContext context;
-    private PathFactory pathFactory;
-    @Mock
-    private Context jndi;
-
-    @Before
-    public void beforeEach() throws Exception {
-        MockitoAnnotations.initMocks(this);
-        context = new ExecutionContext();
-        context.getNamespaceRegistry().register(DnaLexicon.Namespace.PREFIX, DnaLexicon.Namespace.URI);
-        context.getNamespaceRegistry().register(JBossCacheLexicon.Namespace.PREFIX, JBossCacheLexicon.Namespace.URI);
-
-        cacheFactory = new DefaultCacheFactory<Name, Object>();
-        defaultConfigName = null;
-        initialWorkspaceNames = new HashSet<String>();
-        initialWorkspaceNames.add("workspace1");
-        initialWorkspaceNames.add("workspace2");
-        defaultWorkspaceName = initialWorkspaceNames.iterator().next();
-        workspaces = new JBossCacheWorkspaces("source", cacheFactory, defaultConfigName, initialWorkspaceNames, jndi);
-        processor = new JBossCacheRequestProcessor("source", context, null, workspaces, defaultWorkspaceName, true);
-
-        pathFactory = context.getValueFactories().getPathFactory();
-    }
-
-    @Test
-    public void shouldCreateFullyQualifiedNodeOfPathSegmentsFromPath() {
-        Path path = pathFactory.create("/a/b/c/d");
-        Fqn<?> fqn = processor.getFullyQualifiedName(path);
-        assertThat(fqn.size(), is(4));
-        assertThat(fqn.isRoot(), is(false));
-        for (int i = 0; i != path.size(); ++i) {
-            assertThat((Path.Segment)fqn.get(i), is(path.getSegment(i)));
-        }
-    }
-
-    @Test
-    public void shouldCreateFullyQualifiedNodeOfPathSegmentsFromRootPath() {
-        Path path = pathFactory.createRootPath();
-        Fqn<?> fqn = processor.getFullyQualifiedName(path);
-        assertThat(fqn.size(), is(0));
-        assertThat(fqn.isRoot(), is(true));
-    }
-
-    @Test
-    public void shouldCreateFullyQualifiedNodeFromPathSegment() {
-        Path.Segment segment = pathFactory.createSegment("a");
-        Fqn<?> fqn = processor.getFullyQualifiedName(segment);
-        assertThat(fqn.size(), is(1));
-        assertThat(fqn.isRoot(), is(false));
-        assertThat((Path.Segment)fqn.get(0), is(segment));
-    }
-
-    @Test
-    public void shouldCreatePathFromFullyQualifiedNode() {
-        Path path = pathFactory.create("/a/b/c/d");
-        Fqn<Path.Segment> fqn = processor.getFullyQualifiedName(path);
-        assertThat(processor.getPath(pathFactory, fqn), is(path));
-    }
-
-    @Test
-    public void shouldCreateRootPathFromRootFullyQualifiedNode() {
-        Path path = pathFactory.createRootPath();
-        Fqn<Path.Segment> fqn = processor.getFullyQualifiedName(path);
-        assertThat(processor.getPath(pathFactory, fqn), is(path));
-    }
-}



From dna-commits at lists.jboss.org  Sat Jun 27 20:33:33 2009
From: dna-commits at lists.jboss.org (dna-commits at lists.jboss.org)
Date: Sat, 27 Jun 2009 20:33:33 -0400
Subject: [dna-commits] DNA SVN: r1066 - in trunk:
	dna-graph/src/main/java/org/jboss/dna/graph/connector and 16
	other directories.
Message-ID: <200906280033.n5S0XXSC013106@svn01.web.mwc.hst.phx2.redhat.com>

Author: bcarothers
Date: 2009-06-27 20:33:32 -0400 (Sat, 27 Jun 2009)
New Revision: 1066

Added:
   trunk/dna-graph/src/main/java/org/jboss/dna/graph/request/CloneBranchRequest.java
Removed:
   trunk/dna-graph/src/main/java/org/jboss/dna/graph/request/UuidConflictBehavior.java
Modified:
   trunk/dna-graph/src/main/java/org/jboss/dna/graph/Graph.java
   trunk/dna-graph/src/main/java/org/jboss/dna/graph/GraphI18n.java
   trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/UuidAlreadyExistsException.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/JoinMirrorRequestProcessor.java
   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/map/AbstractMapWorkspace.java
   trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/map/MapRepository.java
   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/MapWorkspace.java
   trunk/dna-graph/src/main/java/org/jboss/dna/graph/request/BatchRequestBuilder.java
   trunk/dna-graph/src/main/java/org/jboss/dna/graph/request/CopyBranchRequest.java
   trunk/dna-graph/src/main/java/org/jboss/dna/graph/request/RequestBuilder.java
   trunk/dna-graph/src/main/java/org/jboss/dna/graph/request/processor/LoggingRequestProcessor.java
   trunk/dna-graph/src/main/java/org/jboss/dna/graph/request/processor/RequestProcessor.java
   trunk/dna-graph/src/main/resources/org/jboss/dna/graph/GraphI18n.properties
   trunk/dna-graph/src/test/java/org/jboss/dna/graph/GraphTest.java
   trunk/dna-graph/src/test/java/org/jboss/dna/graph/connector/MockRepositoryRequestProcessor.java
   trunk/dna-graph/src/test/java/org/jboss/dna/graph/connector/test/WritableConnectorTest.java
   trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/AbstractJcrNode.java
   trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/JcrWorkspace.java
   trunk/dna-jcr/src/test/java/org/jboss/dna/jcr/JcrTckTest.java
   trunk/extensions/dna-connector-federation/src/main/java/org/jboss/dna/connector/federation/FederatingRequestProcessor.java
   trunk/extensions/dna-connector-filesystem/src/main/java/org/jboss/dna/connector/filesystem/FileSystemRequestProcessor.java
   trunk/extensions/dna-connector-jdbc-metadata/src/main/java/org/jboss/dna/connector/jdbc/JdbcRequestProcesor.java
   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/test/java/org/jboss/dna/connector/store/jpa/JpaConnectorWritingTest.java
   trunk/extensions/dna-connector-svn/src/main/java/org/jboss/dna/connector/svn/SVNRepositoryRequestProcessor.java
Log:
DNA-370 JcrWorkspace.clone Is Not Implemented

I tried to make workspace.update work with the existing CopyBranchRequest, but it required some changes that would have made the semantics of to(...) and into(...) ambiguous and dependent on whether the UUID conflict behavior was ALWAYS_CREATE_NEW or not. Instead, I pulled the UUID behavior out of the CopyBranchRequest and added it into a new request - CloneBranchRequest. This provides clear semantics for copy (always creates new UUIDs, may be between workspaces or within a single workspace, may function at the property or node level) and clone (always preserves UUIDs, only works between workspaces, may remove nodes from target workspace, only works at the node level).

Committed the patch that adds the new request and all of the associated changes on the graph side (adding clone operation) and the connector (implementing clone behavior for writable connectors) and modifies the workspace.clone and node.update operations accordingly.

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	2009-06-27 02:54:06 UTC (rev 1065)
+++ trunk/dna-graph/src/main/java/org/jboss/dna/graph/Graph.java	2009-06-28 00:33:32 UTC (rev 1066)
@@ -78,7 +78,6 @@
 import org.jboss.dna.graph.request.Request;
 import org.jboss.dna.graph.request.RequestBuilder;
 import org.jboss.dna.graph.request.UnsupportedRequestException;
-import org.jboss.dna.graph.request.UuidConflictBehavior;
 import org.jboss.dna.graph.request.VerifyWorkspaceRequest;
 import org.jboss.dna.graph.request.CloneWorkspaceRequest.CloneConflictBehavior;
 import org.jboss.dna.graph.request.CreateWorkspaceRequest.CreateConflictBehavior;
@@ -525,7 +524,7 @@
      * </p>
      * 
      * @param firstIdProperty the first identification property of the node that is to be moved
-     * @param additionalIdProperties the remaining idenficiation properties of the node that is to be moved
+     * @param additionalIdProperties the remaining identification properties of the node that is to be moved
      * @return the object that can be used to specify addition nodes to be moved or the location of the node where the node is to
      *         be moved
      */
@@ -535,6 +534,174 @@
     }
 
     /**
+     * Begin the request to clone a node at the specified location into a parent node at a different location, which is specified
+     * via the <code>into(...)</code> method on the returned {@link Clone} object.
+     * <p>
+     * Like all other methods on the {@link Graph}, the clone request will be performed immediately when the {@link WithUuids UUID
+     * behavior} is specified.
+     * </p>
+     * <p>
+     * The clone operation differs from the copy operation in that it must replicate nodes from one workspace to another (the copy
+     * operations supports replicating nodes within a workspace as well as across workspaces) and that it preserves UUIDs (the
+     * copy operation always generates new UUIDs).
+     * </p>
+     * 
+     * @param from the location of the node that is to be cloned.
+     * @return the object that can be used to specify the location of the node where the node is to be cloned
+     */
+    public Clone<Graph> clone( Location from ) {
+        return new CloneAction<Graph>(this, from) {
+            @Override
+            protected Graph submit( String fromWorkspaceName,
+                                    Location from,
+                                    String intoWorkspaceName,
+                                    Location into,
+                                    Name desiredName,
+                                    Segment desiredSegment,
+                                    boolean removeExisting ) {
+                requests.cloneBranch(from,
+                                     fromWorkspaceName,
+                                     into,
+                                     intoWorkspaceName,
+                                     desiredName,
+                                     desiredSegment,
+                                     removeExisting);
+                return and();
+            }
+        };
+    }
+
+    /**
+     * Begin the request to clone the specified node into a parent node at a different location, which is specified via the
+     * <code>into(...)</code> method on the returned {@link Clone} object.
+     * <p>
+     * Like all other methods on the {@link Graph}, the clone request will be performed immediately when the {@link WithUuids UUID
+     * behavior} is specified.
+     * </p>
+     * <p>
+     * The clone operation differs from the copy operation in that it must replicate nodes from one workspace to another (the copy
+     * operations supports replicating nodes within a workspace as well as across workspaces) and that it preserves UUIDs (the
+     * copy operation always generates new UUIDs).
+     * </p>
+     * 
+     * @param from the node that is to be copied.
+     * @return the object that can be used to specify addition nodes to be copied or the location of the node where the node is to
+     *         be copied
+     */
+    public Clone<Graph> clone( Node from ) {
+        return clone(from.getLocation());
+    }
+
+    /**
+     * Begin the request to clone a node located at the supplied path into a parent node at a different location, which is
+     * specified via the <code>into(...)</code> method on the returned {@link Clone} object.
+     * <p>
+     * Like all other methods on the {@link Graph}, the clone request will be performed immediately when the {@link WithUuids UUID
+     * behavior} is specified.
+     * </p>
+     * <p>
+     * The clone operation differs from the copy operation in that it must replicate nodes from one workspace to another (the copy
+     * operations supports replicating nodes within a workspace as well as across workspaces) and that it preserves UUIDs (the
+     * copy operation always generates new UUIDs).
+     * </p>
+     * 
+     * @param fromPath the path to the node that is to be copied.
+     * @return the object that can be used to specify addition nodes to be copied or the location of the node where the node is to
+     *         be copied
+     */
+    public Clone<Graph> clone( String fromPath ) {
+        return clone(Location.create(createPath(fromPath)));
+    }
+
+    /**
+     * Begin the request to clone a node located at the supplied path into a parent node at a different location, which is
+     * specified via the <code>into(...)</code> method on the returned {@link Clone} object.
+     * <p>
+     * Like all other methods on the {@link Graph}, the clone request will be performed immediately when the {@link WithUuids UUID
+     * behavior} is specified.
+     * </p>
+     * <p>
+     * The clone operation differs from the copy operation in that it must replicate nodes from one workspace to another (the copy
+     * operations supports replicating nodes within a workspace as well as across workspaces) and that it preserves UUIDs (the
+     * copy operation always generates new UUIDs).
+     * </p>
+     * 
+     * @param from the path to the node that is to be copied.
+     * @return the object that can be used to specify addition nodes to be copied or the location of the node where the node is to
+     *         be copied
+     */
+    public Clone<Graph> clone( Path from ) {
+        return clone(Location.create(from));
+    }
+
+    /**
+     * Begin the request to clone a node with the specified unique identifier into a parent node at a different location, which is
+     * specified via the <code>into(...)</code> method on the returned {@link Clone} object.
+     * <p>
+     * Like all other methods on the {@link Graph}, the clone request will be performed immediately when the {@link WithUuids UUID
+     * behavior} is specified.
+     * </p>
+     * <p>
+     * The clone operation differs from the copy operation in that it must replicate nodes from one workspace to another (the copy
+     * operations supports replicating nodes within a workspace as well as across workspaces) and that it preserves UUIDs (the
+     * copy operation always generates new UUIDs).
+     * </p>
+     * 
+     * @param from the UUID of the node that is to be copied.
+     * @return the object that can be used to specify addition nodes to be copied or the location of the node where the node is to
+     *         be copied
+     */
+    public Clone<Graph> clone( UUID from ) {
+        return clone(Location.create(from));
+    }
+
+    /**
+     * Begin the request to clone a node with the specified unique identification property into a parent node at a different
+     * location, which is specified via the <code>into(...)</code> method on the returned {@link Clone} object. The identification
+     * property should uniquely identify a single node.
+     * <p>
+     * Like all other methods on the {@link Graph}, the clone request will be performed immediately when the {@link WithUuids UUID
+     * behavior} is specified.
+     * </p>
+     * <p>
+     * The clone operation differs from the copy operation in that it must replicate nodes from one workspace to another (the copy
+     * operations supports replicating nodes within a workspace as well as across workspaces) and that it preserves UUIDs (the
+     * copy operation always generates new UUIDs).
+     * </p>
+     * 
+     * @param idProperty the unique identification property of the node that is to be copied.
+     * @return the object that can be used to specify addition nodes to be copied or the location of the node where the node is to
+     *         be copied
+     */
+    public Clone<Graph> clone( Property idProperty ) {
+        return clone(Location.create(idProperty));
+    }
+
+    /**
+     * Begin the request to clone a node with the specified identification properties into a parent node at a different location,
+     * which is specified via the <code>into(...)</code> method on the returned {@link Clone} object. The identification
+     * properties should uniquely identify a single node.
+     * <p>
+     * Like all other methods on the {@link Graph}, the clone request will be performed immediately when the {@link WithUuids UUID
+     * behavior} is specified.
+     * </p>
+     * <p>
+     * The clone operation differs from the copy operation in that it must replicate nodes from one workspace to another (the copy
+     * operations supports replicating nodes within a workspace as well as across workspaces) and that it preserves UUIDs (the
+     * copy operation always generates new UUIDs).
+     * </p>
+     * 
+     * @param firstIdProperty the first identification property of the node that is to be copied
+     * @param additionalIdProperties the remaining identification properties of the node that is to be copied
+     * @return the object that can be used to specify addition nodes to be copied or the location of the node where the node is to
+     *         be copied
+     */
+    public Clone<Graph> clone( Property firstIdProperty,
+                               Property... additionalIdProperties ) {
+        return clone(Location.create(firstIdProperty, additionalIdProperties));
+    }
+
+    /**
      * Begin the request to copy the specified node into a parent node at a different location, which is specified via the
      * <code>into(...)</code> method on the returned {@link Copy} object.
      * <p>
@@ -568,8 +735,7 @@
             protected Graph submit( String fromWorkspaceName,
                                     Locations from,
                                     Location into,
-                                    Name childName,
-                                    UuidConflictBehavior uuidConflictBehavior ) {
+                                    Name childName ) {
                 String workspaceName = fromWorkspaceName != null ? fromWorkspaceName : getCurrentWorkspaceName();
                 do {
                     requests.copyBranch(from.getLocation(),
@@ -577,8 +743,7 @@
                                         into,
                                         getCurrentWorkspaceName(),
                                         childName,
-                                        NodeConflictBehavior.APPEND,
-                                        uuidConflictBehavior);
+                                        NodeConflictBehavior.APPEND);
                 } while ((from = from.next()) != null);
                 return and();
             }
@@ -660,7 +825,7 @@
      * </p>
      * 
      * @param firstIdProperty the first identification property of the node that is to be copied
-     * @param additionalIdProperties the remaining idenficiation properties of the node that is to be copied
+     * @param additionalIdProperties the remaining identification properties of the node that is to be copied
      * @return the object that can be used to specify addition nodes to be copied or the location of the node where the node is to
      *         be copied
      */
@@ -737,7 +902,7 @@
      * a single node. This request is submitted to the repository immediately.
      * 
      * @param firstIdProperty the first identification property of the node that is to be copied
-     * @param additionalIdProperties the remaining idenficiation properties of the node that is to be copied
+     * @param additionalIdProperties the remaining identification properties of the node that is to be copied
      * @return an object that may be used to start another request
      */
     public Conjunction<Graph> delete( Property firstIdProperty,
@@ -2312,7 +2477,7 @@
          * </p>
          * 
          * @param firstIdProperty the first identification property of the node that is to be moved
-         * @param additionalIdProperties the remaining idenficiation properties of the node that is to be moved
+         * @param additionalIdProperties the remaining identification properties of the node that is to be moved
          * @return the object that can be used to specify addition nodes to be moved or the location of the node where the node is
          *         to be moved
          */
@@ -2330,7 +2495,7 @@
          * called.
          * </p>
          * 
-         * @param idProperties the idenficiation properties of the node that is to be moved
+         * @param idProperties the identification properties of the node that is to be moved
          * @return the object that can be used to specify addition nodes to be moved or the location of the node where the node is
          *         to be moved
          */
@@ -2339,6 +2504,158 @@
         }
 
         /**
+         * Begin the request to clone the specified node into a parent node at a different location, which is specified via the
+         * <code>into(...)</code> method on the returned {@link Clone} object.
+         * <p>
+         * Like all other methods on the {@link Batch}, the request will be performed when the {@link #execute()} method is
+         * called.
+         * </p>
+         * 
+         * @param from the node that is to be copied.
+         * @return the object that can be used to specify addition nodes to be copied or the location of the node where the node
+         *         is to be copied
+         */
+        public Clone<BatchConjunction> clone( Node from ) {
+            return clone(from.getLocation());
+        }
+
+        /**
+         * Begin the request to clone a node at the specified location into a parent node at a different location, which is
+         * specified via the <code>into(...)</code> method on the returned {@link Clone} object.
+         * <p>
+         * Like all other methods on the {@link Batch}, the request will be performed when the {@link #execute()} method is
+         * called.
+         * </p>
+         * 
+         * @param from the location of the node that is to be copied.
+         * @return the object that can be used to specify addition nodes to be copied or the location of the node where the node
+         *         is to be copied
+         */
+        public Clone<BatchConjunction> clone( Location from ) {
+            assertNotExecuted();
+            return new CloneAction<BatchConjunction>(this.nextRequests, from) {
+                @Override
+                protected BatchConjunction submit( String fromWorkspaceName,
+                                                   Location from,
+                                                   String intoWorkspaceName,
+                                                   Location into,
+                                                   Name desiredName,
+                                                   Segment desiredSegment,
+                                                   boolean removeExisting ) {
+                    requests.cloneBranch(from,
+                                         fromWorkspaceName,
+                                         into,
+                                         intoWorkspaceName,
+                                         desiredName,
+                                         desiredSegment,
+                                         removeExisting);
+                    return and();
+                }
+            };
+        }
+
+        /**
+         * Begin the request to clone a node located at the supplied path into a parent node at a different location, which is
+         * specified via the <code>into(...)</code> method on the returned {@link Clone} object.
+         * <p>
+         * Like all other methods on the {@link Batch}, the request will be performed when the {@link #execute()} method is
+         * called.
+         * </p>
+         * 
+         * @param fromPath the path to the node that is to be copied.
+         * @return the object that can be used to specify addition nodes to be copied or the location of the node where the node
+         *         is to be copied
+         */
+        public Clone<BatchConjunction> clone( String fromPath ) {
+            return clone(Location.create(createPath(fromPath)));
+        }
+
+        /**
+         * Begin the request to clone a node located at the supplied path into a parent node at a different location, which is
+         * specified via the <code>into(...)</code> method on the returned {@link Clone} object.
+         * <p>
+         * Like all other methods on the {@link Graph}, the clone request will be performed immediately when the
+         * <code>into(...)</code> method is called.
+         * </p>
+         * 
+         * @param from the path to the node that is to be copied.
+         * @return the object that can be used to specify addition nodes to be copied or the location of the node where the node
+         *         is to be copied
+         */
+        public Clone<BatchConjunction> clone( Path from ) {
+            return clone(Location.create(from));
+        }
+
+        /**
+         * Begin the request to clone a node with the specified unique identifier into a parent node at a different location,
+         * which is specified via the <code>into(...)</code> method on the returned {@link Clone} object.
+         * <p>
+         * Like all other methods on the {@link Batch}, the request will be performed when the {@link #execute()} method is
+         * called.
+         * </p>
+         * 
+         * @param from the UUID of the node that is to be copied.
+         * @return the object that can be used to specify addition nodes to be copied or the location of the node where the node
+         *         is to be copied
+         */
+        public Clone<BatchConjunction> clone( UUID from ) {
+            return clone(Location.create(from));
+        }
+
+        /**
+         * Begin the request to clone a node with the specified unique identification property into a parent node at a different
+         * location, which is specified via the <code>into(...)</code> method on the returned {@link Clone} object. The
+         * identification property should uniquely identify a single node.
+         * <p>
+         * Like all other methods on the {@link Batch}, the request will be performed when the {@link #execute()} method is
+         * called.
+         * </p>
+         * 
+         * @param idProperty the unique identification property of the node that is to be copied.
+         * @return the object that can be used to specify addition nodes to be copied or the location of the node where the node
+         *         is to be copied
+         */
+        public Clone<BatchConjunction> clone( Property idProperty ) {
+            return clone(Location.create(idProperty));
+        }
+
+        /**
+         * Begin the request to clone a node with the specified identification properties into a parent node at a different
+         * location, which is specified via the <code>into(...)</code> method on the returned {@link Clone} object. The
+         * identification properties should uniquely identify a single node.
+         * <p>
+         * Like all other methods on the {@link Batch}, the request will be performed when the {@link #execute()} method is
+         * called.
+         * </p>
+         * 
+         * @param firstIdProperty the first identification property of the node that is to be copied
+         * @param additionalIdProperties the remaining identification properties of the node that is to be copied
+         * @return the object that can be used to specify addition nodes to be copied or the location of the node where the node
+         *         is to be copied
+         */
+        public Clone<BatchConjunction> clone( Property firstIdProperty,
+                                              Property... additionalIdProperties ) {
+            return clone(Location.create(firstIdProperty, additionalIdProperties));
+        }
+
+        /**
+         * Begin the request to clone a node with the specified identification properties into a parent node at a different
+         * location, which is specified via the <code>into(...)</code> method on the returned {@link Clone} object. The
+         * identification properties should uniquely identify a single node.
+         * <p>
+         * Like all other methods on the {@link Batch}, the request will be performed when the {@link #execute()} method is
+         * called.
+         * </p>
+         * 
+         * @param idProperties the identification properties of the node that is to be copied
+         * @return the object that can be used to specify addition nodes to be copied or the location of the node where the node
+         *         is to be copied
+         */
+        public Clone<BatchConjunction> clone( Iterable<Property> idProperties ) {
+            return clone(Location.create(idProperties));
+        }
+
+        /**
          * Begin the request to copy the specified node into a parent node at a different location, which is specified via the
          * <code>into(...)</code> method on the returned {@link Copy} object.
          * <p>
@@ -2373,17 +2690,10 @@
                 protected BatchConjunction submit( String fromWorkspaceName,
                                                    Locations from,
                                                    Location into,
-                                                   Name copyName,
-                                                   UuidConflictBehavior uuidConflictBehavior ) {
+                                                   Name copyName ) {
                     String workspaceName = fromWorkspaceName != null ? fromWorkspaceName : getCurrentWorkspaceName();
                     do {
-                        requestQueue.copyBranch(from.getLocation(),
-                                                workspaceName,
-                                                into,
-                                                workspaceName,
-                                                copyName,
-                                                null,
-                                                uuidConflictBehavior);
+                        requestQueue.copyBranch(from.getLocation(), workspaceName, into, workspaceName, copyName, null);
                     } while ((from = from.next()) != null);
                     return and();
                 }
@@ -2465,7 +2775,7 @@
          * </p>
          * 
          * @param firstIdProperty the first identification property of the node that is to be copied
-         * @param additionalIdProperties the remaining idenficiation properties of the node that is to be copied
+         * @param additionalIdProperties the remaining identification properties of the node that is to be copied
          * @return the object that can be used to specify addition nodes to be copied or the location of the node where the node
          *         is to be copied
          */
@@ -2586,7 +2896,7 @@
          * </p>
          * 
          * @param firstIdProperty the first identification property of the node that is to be copied
-         * @param additionalIdProperties the remaining idenficiation properties of the node that is to be copied
+         * @param additionalIdProperties the remaining identification properties of the node that is to be copied
          * @return an object that may be used to start another request
          */
         public BatchConjunction delete( Property firstIdProperty,
@@ -3894,6 +4204,31 @@
     }
 
     /**
+     * A component that defines a new child name for a node.
+     * 
+     * @param <Next> The interface that is to be returned when this request is completed
+     */
+    public interface AsChild<Next> {
+        /**
+         * Finish the request by specifying the exact segment for the new child node. If no segment already exists, this request
+         * should fail.
+         * 
+         * @param newSegment the new name
+         * @return the interface for additional requests or actions
+         */
+        Next as( Path.Segment newSegment );
+
+        /**
+         * Finish the request by specifying the name of the new child node. This method indicates that the child should be added
+         * as a new node with the given name at the end of the parents children
+         * 
+         * @param newName the new name
+         * @return the interface for additional requests or actions
+         */
+        Next as( Name newName );
+    }
+
+    /**
      * A component that defines a new name for a node.
      * 
      * @param <Next> The interface that is to be returned when this request is completed
@@ -4003,14 +4338,32 @@
      * @param <Next> The interface that is to be returned when this request is completed
      * @author Randall Hauch
      */
-    public interface Copy<Next>
-        extends WithUuids<FromWorkspace<CopyTarget<Next>>>, FromWorkspace<CopyTarget<Next>>, CopyTarget<Next>, And<Copy<Next>> {
+    public interface Copy<Next> extends FromWorkspace<CopyTarget<Next>>, CopyTarget<Next>, And<Copy<Next>> {
     }
 
     public interface CopyTarget<Next> extends To<Next>, Into<Next> {
     }
 
     /**
+     * The interface for defining a branch of nodes to be cloned and the location where the clone is to be placed. Cloning a
+     * branch differs from copying a branch in that:
+     * <ol>
+     * <li>Nodes can be copied within the same workspace or to another workspace; cloned nodes must be copied from one workspace
+     * into another.</li>
+     * <li>Copied nodes always get new UUIDs; cloned nodes always maintain their UUIDs and hence must define the behavior that
+     * occurs if a node with the same UUID already exists in the new workspace.</li>
+     * <li>Nodes can be copied to a specific name under a specific parent, but can only be added as a new child node at the end of
+     * the new parent's children; nodes can be cloned to an exact location among the parent's children, replacing the existing
+     * node at that location.</li>
+     * </ol>
+     * 
+     * @param <Next>
+     */
+    public interface Clone<Next> extends FromWorkspace<AsChild<Into<WithUuids<Next>>>> {
+
+    }
+
+    /**
      * The interface for specifying that a node should come from a workspace other than the current workspace.
      * 
      * @param <Next> The interface that is to be returned when this request is completed
@@ -4025,10 +4378,8 @@
      * @param <Next> The interface that is to be returned when this request is completed
      */
     public interface WithUuids<Next> {
-        Next withNewUuids();
+        Next failingIfAnyUuidsMatch();
 
-        Next failingIfUuidsMatch();
-
         Next replacingExistingNodesWithSameUuids();
     }
 
@@ -5797,14 +6148,12 @@
     protected abstract class CopyAction<T> extends AbstractAction<T> implements Copy<T> {
         protected Locations from;
         protected String fromWorkspaceName;
-        protected UuidConflictBehavior uuidConflictBehavior;
 
         /*package*/CopyAction( T afterConjunction,
                                 Location from ) {
             super(afterConjunction);
             this.from = new Locations(from);
             this.fromWorkspaceName = Graph.this.getCurrentWorkspaceName();
-            this.uuidConflictBehavior = UuidConflictBehavior.ALWAYS_CREATE_NEW_UUID;
         }
 
         public Copy<T> and( Location from ) {
@@ -5850,31 +6199,13 @@
          * @param from the locations that are being copied
          * @param into the parent location
          * @param nameForCopy the name that should be used for the copy, or null if the name should be the same as the original
-         * @param uuidConflictBehavior the behavior to be used for resolving any UUID collisions that the copy request might
-         *        create
          * @return this object, for method chaining
          */
         protected abstract T submit( String fromWorkspaceName,
                                      Locations from,
                                      Location into,
-                                     Name nameForCopy,
-                                     UuidConflictBehavior uuidConflictBehavior );
+                                     Name nameForCopy );
 
-        public FromWorkspace<CopyTarget<T>> failingIfUuidsMatch() {
-            this.uuidConflictBehavior = UuidConflictBehavior.THROW_EXCEPTION;
-            return this;
-        }
-
-        public FromWorkspace<CopyTarget<T>> withNewUuids() {
-            this.uuidConflictBehavior = UuidConflictBehavior.ALWAYS_CREATE_NEW_UUID;
-            return this;
-        }
-
-        public FromWorkspace<CopyTarget<T>> replacingExistingNodesWithSameUuids() {
-            this.uuidConflictBehavior = UuidConflictBehavior.REPLACE_EXISTING_NODE;
-            return this;
-        }
-
         public CopyTarget<T> fromWorkspace( String workspaceName ) {
             this.fromWorkspaceName = workspaceName;
 
@@ -5882,32 +6213,28 @@
         }
 
         public T into( Location into ) {
-            return submit(this.fromWorkspaceName, this.from, into, null, this.uuidConflictBehavior);
+            return submit(this.fromWorkspaceName, this.from, into, null);
         }
 
         public T into( Path into ) {
-            return submit(this.fromWorkspaceName, this.from, Location.create(into), null, this.uuidConflictBehavior);
+            return submit(this.fromWorkspaceName, this.from, Location.create(into), null);
         }
 
         public T into( UUID into ) {
-            return submit(this.fromWorkspaceName, this.from, Location.create(into), null, this.uuidConflictBehavior);
+            return submit(this.fromWorkspaceName, this.from, Location.create(into), null);
         }
 
         public T into( Property firstIdProperty,
                        Property... additionalIdProperties ) {
-            return submit(this.fromWorkspaceName,
-                          this.from,
-                          Location.create(firstIdProperty, additionalIdProperties),
-                          null,
-                          this.uuidConflictBehavior);
+            return submit(this.fromWorkspaceName, this.from, Location.create(firstIdProperty, additionalIdProperties), null);
         }
 
         public T into( Property into ) {
-            return submit(this.fromWorkspaceName, this.from, Location.create(into), null, this.uuidConflictBehavior);
+            return submit(this.fromWorkspaceName, this.from, Location.create(into), null);
         }
 
         public T into( String into ) {
-            return submit(this.fromWorkspaceName, this.from, Location.create(createPath(into)), null, this.uuidConflictBehavior);
+            return submit(this.fromWorkspaceName, this.from, Location.create(createPath(into)), null);
         }
 
         public T to( Location desiredLocation ) {
@@ -5919,11 +6246,7 @@
                 throw new IllegalArgumentException(GraphI18n.unableToCopyToTheRoot.text(this.from, desiredLocation));
             }
             Path parent = desiredPath.getParent();
-            return submit(this.fromWorkspaceName,
-                          this.from,
-                          Location.create(parent),
-                          desiredPath.getLastSegment().getName(),
-                          this.uuidConflictBehavior);
+            return submit(this.fromWorkspaceName, this.from, Location.create(parent), desiredPath.getLastSegment().getName());
         }
 
         public T to( Path desiredPath ) {
@@ -5931,11 +6254,7 @@
                 throw new IllegalArgumentException(GraphI18n.unableToCopyToTheRoot.text(this.from, desiredPath));
             }
             Path parent = desiredPath.getParent();
-            return submit(this.fromWorkspaceName,
-                          this.from,
-                          Location.create(parent),
-                          desiredPath.getLastSegment().getName(),
-                          this.uuidConflictBehavior);
+            return submit(this.fromWorkspaceName, this.from, Location.create(parent), desiredPath.getLastSegment().getName());
         }
 
         public T to( String desiredPath ) {
@@ -5944,6 +6263,103 @@
     }
 
     @NotThreadSafe
+    public abstract class CloneAction<T> extends AbstractAction<T> implements Clone<T> {
+        private final Location from;
+
+        /*package*/CloneAction( T afterConjunction,
+                                 Location from ) {
+            super(afterConjunction);
+            this.from = from;
+        }
+
+        protected abstract T submit( String fromWorkspaceName,
+                                     Location from,
+                                     String intoWorkspaceName,
+                                     Location into,
+                                     Name desiredName,
+                                     Segment desiredSegment,
+                                     boolean removeExisting );
+
+        public AsChild<Into<WithUuids<T>>> fromWorkspace( final String workspaceName ) {
+            final CloneAction<T> source = this;
+            return new AsChild<Into<WithUuids<T>>>() {
+                public Into<WithUuids<T>> as( final Name name ) {
+                    return new CloneTargetAction<T>(afterConjunction(), source) {
+                        @Override
+                        protected T submit( Location into,
+                                            boolean removeExisting ) {
+                            String intoWorkspaceName = getCurrentWorkspaceName();
+                            return source.submit(workspaceName, from, intoWorkspaceName, into, name, null, removeExisting);
+                        }
+                    };
+                }
+
+                public Into<WithUuids<T>> as( final Segment segment ) {
+                    return new CloneTargetAction<T>(afterConjunction(), source) {
+                        @Override
+                        protected T submit( Location into,
+                                            boolean removeExisting ) {
+                            String intoWorkspaceName = getCurrentWorkspaceName();
+                            return source.submit(workspaceName, from, intoWorkspaceName, into, null, segment, removeExisting);
+                        }
+                    };
+                }
+
+            };
+        }
+    }
+
+    @NotThreadSafe
+    public abstract class CloneTargetAction<T> extends AbstractAction<T> implements Into<WithUuids<T>> {
+        protected final CloneAction<T> source;
+
+        /*package*/CloneTargetAction( T afterConjunction,
+                                       CloneAction<T> source ) {
+            super(afterConjunction);
+            this.source = source;
+        }
+
+        protected abstract T submit( Location into,
+                                     boolean removeExisting );
+
+        public WithUuids<T> into( final Location into ) {
+            return new WithUuids<T>() {
+                public T failingIfAnyUuidsMatch() {
+                    submit(into, false);
+                    return and();
+                }
+
+                public T replacingExistingNodesWithSameUuids() {
+                    submit(into, true);
+                    return and();
+
+                }
+            };
+        }
+
+        public WithUuids<T> into( Path into ) {
+            return into(Location.create(into));
+        }
+
+        public WithUuids<T> into( UUID into ) {
+            return into(Location.create(into));
+        }
+
+        public WithUuids<T> into( Property firstIdProperty,
+                                  Property... additionalIdProperties ) {
+            return into(Location.create(firstIdProperty, additionalIdProperties));
+        }
+
+        public WithUuids<T> into( Property into ) {
+            return into(Location.create(into));
+        }
+
+        public WithUuids<T> into( String into ) {
+            return into(Location.create(createPath(into)));
+        }
+    }
+
+    @NotThreadSafe
     protected abstract class CreateAction<T> extends AbstractAction<T> implements Create<T> {
         private final String workspaceName;
         private final Location parent;

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	2009-06-27 02:54:06 UTC (rev 1065)
+++ trunk/dna-graph/src/main/java/org/jboss/dna/graph/GraphI18n.java	2009-06-28 00:33:32 UTC (rev 1066)
@@ -77,6 +77,8 @@
     public static I18n unableToCopyToTheRoot;
     public static I18n actualLocationIsNotSameAsInputLocation;
     public static I18n actualLocationIsNotChildOfInputLocation;
+    public static I18n actualLocationIsNotAtCorrectChildSegment;
+    public static I18n actualLocationDoesNotHaveCorrectChildName;
     public static I18n actualLocationMustHavePath;
     public static I18n actualNewLocationIsNotSameAsInputLocation;
     public static I18n actualNewLocationMustHavePath;
@@ -117,6 +119,7 @@
     public static I18n unableToDeletePlaceholder;
     public static I18n copyLimitedToBeWithinSingleSource;
     public static I18n moveLimitedToBeWithinSingleSource;
+    public static I18n cloneLimitedToBeWithinSingleSource;
 
     static {
         try {

Modified: trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/UuidAlreadyExistsException.java
===================================================================
--- trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/UuidAlreadyExistsException.java	2009-06-27 02:54:06 UTC (rev 1065)
+++ trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/UuidAlreadyExistsException.java	2009-06-28 00:33:32 UTC (rev 1066)
@@ -25,13 +25,12 @@
 
 import java.util.UUID;
 import org.jboss.dna.graph.GraphI18n;
-import org.jboss.dna.graph.request.CopyBranchRequest;
-import org.jboss.dna.graph.request.UuidConflictBehavior;
+import org.jboss.dna.graph.request.CloneBranchRequest;
 
 /**
  * Exception that indicates that a copy request failed because one of the UUIDs in the source branch already exists in the target
- * workspace and the {@link CopyBranchRequest#uuidConflictBehavior() UUID conflict behavior} is set to
- * {@link UuidConflictBehavior#THROW_EXCEPTION}.
+ * workspace and the {@link CloneBranchRequest#removeExisting() UUID conflict behavior} is set to throw an exception instead of
+ * removing the existing nodes.
  */
 public class UuidAlreadyExistsException extends RepositorySourceException {
 

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	2009-06-27 02:54:06 UTC (rev 1065)
+++ trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/federation/ForkRequestProcessor.java	2009-06-28 00:33:32 UTC (rev 1066)
@@ -54,6 +54,7 @@
 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.request.CloneBranchRequest;
 import org.jboss.dna.graph.request.CloneWorkspaceRequest;
 import org.jboss.dna.graph.request.CompositeRequest;
 import org.jboss.dna.graph.request.CopyBranchRequest;
@@ -1262,7 +1263,7 @@
         // Create the pushed-down request ...
         CopyBranchRequest pushDown = new CopyBranchRequest(fromProxy.location(), fromProxy.workspaceName(), intoProxy.location(),
                                                            intoProxy.workspaceName(), request.desiredName(),
-                                                           request.nodeConflictBehavior(), request.uuidConflictBehavior());
+                                                           request.nodeConflictBehavior());
         // Create the federated request ...
         FederatedRequest federatedRequest = new FederatedRequest(request);
         federatedRequest.add(pushDown, sameLocation, false, fromProxy.projection(), intoProxy.projection());
@@ -1274,6 +1275,65 @@
     /**
      * {@inheritDoc}
      * 
+     * @see org.jboss.dna.graph.request.processor.RequestProcessor#process(org.jboss.dna.graph.request.CloneBranchRequest)
+     */
+    @Override
+    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;
+        ProjectedNode projectedIntoNode = project(request.into(), request.intoWorkspace(), request, true);
+        if (projectedIntoNode == null) return;
+
+        // Limitation: only able to project the copy if the 'from' and 'into' are in the same source & projection ...
+        while (projectedFromNode != null) {
+            if (projectedFromNode.isProxy()) {
+                ProxyNode fromProxy = projectedFromNode.asProxy();
+                // Look for a projectedIntoNode that has the same source/projection ...
+                while (projectedIntoNode != null) {
+                    if (projectedIntoNode.isProxy()) {
+                        // Both are proxies, so compare the projection ...
+                        ProxyNode intoProxy = projectedIntoNode.asProxy();
+                        if (fromProxy.projection().getSourceName().equals(intoProxy.projection().getSourceName())) break;
+                    }
+                    projectedIntoNode = projectedIntoNode.next();
+                }
+                if (projectedIntoNode != null) break;
+            }
+            projectedFromNode = projectedFromNode.next();
+        }
+        if (projectedFromNode == null || projectedIntoNode == null) {
+            // The copy is not done within a single source ...
+            String msg = GraphI18n.cloneLimitedToBeWithinSingleSource.text(readable(request.from()),
+                                                                           request.fromWorkspace(),
+                                                                           readable(request.into()),
+                                                                           request.intoWorkspace(),
+                                                                           getSourceName());
+            request.setError(new UnsupportedRequestException(msg));
+            return;
+        }
+
+        ProxyNode fromProxy = projectedFromNode.asProxy();
+        ProxyNode intoProxy = projectedIntoNode.asProxy();
+        assert fromProxy.projection().getSourceName().equals(intoProxy.projection().getSourceName());
+        boolean sameLocation = fromProxy.isSameLocationAsOriginal() && intoProxy.isSameLocationAsOriginal();
+
+        // Create the pushed-down request ...
+        CloneBranchRequest pushDown = new CloneBranchRequest(fromProxy.location(), fromProxy.workspaceName(),
+                                                             intoProxy.location(), intoProxy.workspaceName(),
+                                                             request.desiredName(), request.desiredSegment(),
+                                                             request.removeExisting());
+        // Create the federated request ...
+        FederatedRequest federatedRequest = new FederatedRequest(request);
+        federatedRequest.add(pushDown, sameLocation, false, fromProxy.projection(), intoProxy.projection());
+
+        // Submit the requests for processing and then STOP ...
+        submit(federatedRequest);
+    }
+
+    /**
+     * {@inheritDoc}
+     * 
      * @see org.jboss.dna.graph.request.processor.RequestProcessor#process(org.jboss.dna.graph.request.MoveBranchRequest)
      */
     @Override

Modified: trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/federation/JoinMirrorRequestProcessor.java
===================================================================
--- trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/federation/JoinMirrorRequestProcessor.java	2009-06-27 02:54:06 UTC (rev 1065)
+++ trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/federation/JoinMirrorRequestProcessor.java	2009-06-28 00:33:32 UTC (rev 1066)
@@ -33,6 +33,7 @@
 import org.jboss.dna.graph.property.Name;
 import org.jboss.dna.graph.property.Property;
 import org.jboss.dna.graph.request.CacheableRequest;
+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;
@@ -173,8 +174,7 @@
      */
     @Override
     public void process( ReadNextBlockOfChildrenRequest request ) {
-        ReadNextBlockOfChildrenRequest source = (ReadNextBlockOfChildrenRequest)federatedRequest.getFirstProjectedRequest()
-                                                                                                .getRequest();
+        ReadNextBlockOfChildrenRequest source = (ReadNextBlockOfChildrenRequest)federatedRequest.getFirstProjectedRequest().getRequest();
         if (checkErrorOrCancel(request, source)) return;
         request.setActualLocationOfStartingAfterNode(source.getActualLocationOfStartingAfterNode());
         for (Location childInSource : source.getChildren()) {
@@ -317,6 +317,18 @@
     /**
      * {@inheritDoc}
      * 
+     * @see org.jboss.dna.graph.request.processor.RequestProcessor#process(org.jboss.dna.graph.request.CloneBranchRequest)
+     */
+    @Override
+    public void process( CloneBranchRequest request ) {
+        CloneBranchRequest source = (CloneBranchRequest)federatedRequest.getFirstProjectedRequest().getRequest();
+        if (checkErrorOrCancel(request, source)) return;
+        request.setActualLocations(source.getActualLocationBefore(), source.getActualLocationAfter());
+    }
+
+    /**
+     * {@inheritDoc}
+     * 
      * @see org.jboss.dna.graph.request.processor.RequestProcessor#process(org.jboss.dna.graph.request.DeleteBranchRequest)
      */
     @Override

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	2009-06-27 02:54:06 UTC (rev 1065)
+++ trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/federation/JoinRequestProcessor.java	2009-06-28 00:33:32 UTC (rev 1066)
@@ -45,6 +45,7 @@
 import org.jboss.dna.graph.property.PropertyFactory;
 import org.jboss.dna.graph.property.ValueComparators;
 import org.jboss.dna.graph.request.CacheableRequest;
+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;
@@ -902,6 +903,24 @@
     /**
      * {@inheritDoc}
      * 
+     * @see org.jboss.dna.graph.request.processor.RequestProcessor#process(org.jboss.dna.graph.request.CloneBranchRequest)
+     */
+    @Override
+    public void process( CloneBranchRequest request ) {
+        ProjectedRequest projected = federatedRequest.getFirstProjectedRequest();
+        assert !projected.hasNext();
+        CloneBranchRequest source = (CloneBranchRequest)projected.getRequest();
+        if (checkErrorOrCancel(request, source)) return;
+        Location locationBefore = source.getActualLocationBefore();
+        Location locationAfter = source.getActualLocationBefore();
+        locationBefore = projectToFederated(request.from(), projected.getProjection(), locationBefore, request);
+        locationAfter = projectToFederated(request.into(), projected.getSecondProjection(), locationAfter, request);
+        request.setActualLocations(locationBefore, locationAfter);
+    }
+
+    /**
+     * {@inheritDoc}
+     * 
      * @see org.jboss.dna.graph.request.processor.RequestProcessor#process(org.jboss.dna.graph.request.MoveBranchRequest)
      */
     @Override

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	2009-06-27 02:54:06 UTC (rev 1065)
+++ trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/map/AbstractMapWorkspace.java	2009-06-28 00:33:32 UTC (rev 1066)
@@ -45,8 +45,8 @@
 import org.jboss.dna.graph.property.Reference;
 import org.jboss.dna.graph.property.UuidFactory;
 import org.jboss.dna.graph.property.ValueFactory;
+import org.jboss.dna.graph.property.Path.Segment;
 import org.jboss.dna.graph.property.basic.RootPath;
-import org.jboss.dna.graph.request.UuidConflictBehavior;
 
 /**
  * A default implementation of {@link MapWorkspace} that only requires the user to implement some simple, map-like operations.
@@ -415,8 +415,6 @@
      * @param newParent the parent where the copy is to be placed; may not be null
      * @param desiredName the desired name for the node; if null, the name will be obtained from the original node
      * @param recursive true if the copy should be recursive
-     * @param uuidConflictBehavior the behavior to use if a UUID in the branch rooted at {@code original} already exists in the
-     *        new workspace
      * @return the new node, which is the top of the new subgraph
      */
     public MapNode copyNode( ExecutionContext context,
@@ -424,48 +422,8 @@
                              MapWorkspace newWorkspace,
                              MapNode newParent,
                              Name desiredName,
-                             boolean recursive,
-                             UuidConflictBehavior uuidConflictBehavior ) throws UuidAlreadyExistsException {
-        Map<UUID, UUID> copyMap = null;
-        Set<UUID> uuidsInFromBranch = null;
-
-        switch (uuidConflictBehavior) {
-            case ALWAYS_CREATE_NEW_UUID:
-
-                /*
-                 * The copyNode method uses the presence of a non-null map as an indicator that new UUIDs should be created
-                 * during the copy operation
-                 */
-                copyMap = new HashMap<UUID, UUID>();
-                break;
-            case REPLACE_EXISTING_NODE:
-                uuidsInFromBranch = getUuidsUnderNode(original);
-
-                for (UUID uuid : uuidsInFromBranch) {
-                    MapNode existing;
-                    if (null != (existing = newWorkspace.getNode(uuid))) {
-                        newWorkspace.removeNode(context, existing);
-                    }
-                }
-                break;
-            case THROW_EXCEPTION:
-                uuidsInFromBranch = getUuidsUnderNode(original);
-                PathFactory pathFactory = context.getValueFactories().getPathFactory();
-                for (UUID uuid : uuidsInFromBranch) {
-                    MapNode existing;
-                    if (null != (existing = newWorkspace.getNode(uuid))) {
-                        NamespaceRegistry namespaces = context.getNamespaceRegistry();
-                        String path = newWorkspace.pathFor(pathFactory, existing).getString(namespaces);
-                        throw new UuidAlreadyExistsException(repository.getSourceName(), uuid, path, newWorkspace.getName());
-                    }
-                }
-                break;
-
-            default:
-                throw new IllegalStateException("Unexpected UUID conflict behavior: " + uuidConflictBehavior);
-        }
-
-        return copyNode(context, original, newWorkspace, newParent, desiredName, true, copyMap);
+                             boolean recursive ) {
+        return copyNode(context, original, newWorkspace, newParent, desiredName, true, new HashMap<UUID, UUID>());
     }
 
     /**
@@ -483,12 +441,12 @@
      * @return the new node, which is the top of the new subgraph
      */
     protected MapNode copyNode( ExecutionContext context,
-                              MapNode original,
-                              MapWorkspace newWorkspace,
-                              MapNode newParent,
-                              Name desiredName,
-                              boolean recursive,
-                              Map<UUID, UUID> oldToNewUuids ) {
+                                MapNode original,
+                                MapWorkspace newWorkspace,
+                                MapNode newParent,
+                                Name desiredName,
+                                boolean recursive,
+                                Map<UUID, UUID> oldToNewUuids ) {
         assert context != null;
         assert original != null;
         assert newParent != null;
@@ -557,8 +515,83 @@
     }
 
     /**
-     * Returns all of the UUIDs in the branch rooted at {@code node}
+     * {@inheritDoc}
      * 
+     * @see MapWorkspace#cloneNode(ExecutionContext, MapNode, MapWorkspace, MapNode, Name, Segment, boolean)
+     */
+    public MapNode cloneNode( ExecutionContext context,
+                              MapNode original,
+                              MapWorkspace newWorkspace,
+                              MapNode newParent,
+                              Name desiredName,
+                              Segment desiredSegment,
+                              boolean removeExisting ) throws UuidAlreadyExistsException {
+        assert context != null;
+        assert original != null;
+        assert newWorkspace != null;
+        assert newParent != null;
+
+        Set<UUID> uuidsInFromBranch = getUuidsUnderNode(original);
+        MapNode existing;
+
+        // TODO: Need to handle removing/throwing root node
+        if (removeExisting) {
+
+            for (UUID uuid : uuidsInFromBranch) {
+                if (null != (existing = newWorkspace.getNode(uuid))) {
+                    newWorkspace.removeNode(context, existing);
+                }
+            }
+        } else {
+            PathFactory pathFactory = context.getValueFactories().getPathFactory();
+            uuidsInFromBranch.add(original.getUuid());
+            for (UUID uuid : uuidsInFromBranch) {
+                if (null != (existing = newWorkspace.getNode(uuid))) {
+                    NamespaceRegistry namespaces = context.getNamespaceRegistry();
+                    String path = newWorkspace.pathFor(pathFactory, existing).getString(namespaces);
+                    throw new UuidAlreadyExistsException(repository.getSourceName(), uuid, path, newWorkspace.getName());
+                }
+            }
+        }
+
+        if (desiredSegment != null) {
+            MapNode newRoot = null;
+            for (MapNode child : newParent.getChildren()) {
+                if (desiredSegment.equals(child.getName())) {
+                    newRoot = child;
+                    break;
+                }
+            }
+
+            assert newRoot != null;
+
+            newRoot.getProperties().clear();
+            for (MapNode child : newRoot.getChildren()) {
+                newWorkspace.removeNode(context, child);
+            }
+
+            for (Property property : original.getProperties().values()) {
+                newRoot.setProperty(property);
+            }
+
+            for (MapNode child : original.getChildren()) {
+                copyNode(context, child, newWorkspace, newRoot, null, true, (Map<UUID, UUID>)null);
+            }
+            return newRoot;
+        }
+
+        existing = newWorkspace.getNode(original.getUuid());
+
+        if (existing != null) {
+            newWorkspace.removeNode(context, existing);
+        }
+        return copyNode(context, original, newWorkspace, newParent, desiredName, true, (Map<UUID, UUID>)null);
+    }
+
+    /**
+     * Returns all of the UUIDs in the branch rooted at {@code node}. The UUID of {@code node} will not be included in the set of
+     * returned UUIDs.
+     * 
      * @param node the root of the branch
      * @return all of the UUIDs in the branch rooted at {@code node}
      */
@@ -571,9 +604,8 @@
 
     private void uuidsUnderNode( MapNode node,
                                  Set<UUID> accumulator ) {
-        accumulator.add(node.getUuid());
-
         for (MapNode child : node.getChildren()) {
+            accumulator.add(child.getUuid());
             uuidsUnderNode(child, accumulator);
         }
     }

Modified: trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/map/MapRepository.java
===================================================================
--- trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/map/MapRepository.java	2009-06-27 02:54:06 UTC (rev 1065)
+++ trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/map/MapRepository.java	2009-06-28 00:33:32 UTC (rev 1066)
@@ -32,7 +32,6 @@
 import net.jcip.annotations.GuardedBy;
 import org.jboss.dna.common.util.CheckArg;
 import org.jboss.dna.graph.ExecutionContext;
-import org.jboss.dna.graph.request.UuidConflictBehavior;
 import org.jboss.dna.graph.request.CreateWorkspaceRequest.CreateConflictBehavior;
 
 /**
@@ -249,7 +248,7 @@
             // Loop over each child and call this method to copy the immediate children (and below).
             // Note that this makes the copy have the same UUID as the original.
             for (MapNode originalNode : origRoot.getChildren()) {
-                original.copyNode(context, originalNode, workspace, root, originalNode.getName().getName(), true, UuidConflictBehavior.REPLACE_EXISTING_NODE);
+                original.cloneNode(context, originalNode, workspace, root, originalNode.getName().getName(), null, true);
             }
         }
 

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	2009-06-27 02:54:06 UTC (rev 1065)
+++ trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/map/MapRequestProcessor.java	2009-06-28 00:33:32 UTC (rev 1066)
@@ -44,6 +44,7 @@
 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.CloneBranchRequest;
 import org.jboss.dna.graph.request.CloneWorkspaceRequest;
 import org.jboss.dna.graph.request.CopyBranchRequest;
 import org.jboss.dna.graph.request.CreateNodeRequest;
@@ -62,7 +63,6 @@
 
 /**
  * The default implementation of the {@link RequestProcessor} for map repositories.
- *
  */
 public class MapRequestProcessor extends RequestProcessor {
     private final PathFactory pathFactory;
@@ -70,8 +70,8 @@
     private final MapRepository repository;
 
     public MapRequestProcessor( ExecutionContext context,
-                                   MapRepository repository,
-                                   RepositoryContext repositoryContext ) {
+                                MapRepository repository,
+                                RepositoryContext repositoryContext ) {
         super(repository.getSourceName(), context, repositoryContext != null ? repositoryContext.getObserver() : null);
         this.repository = repository;
         pathFactory = context.getValueFactories().getPathFactory();
@@ -119,6 +119,36 @@
     /**
      * {@inheritDoc}
      * 
+     * @see org.jboss.dna.graph.request.processor.RequestProcessor#process(org.jboss.dna.graph.request.CloneBranchRequest)
+     */
+    @Override
+    public void process( CloneBranchRequest request ) {
+        MapWorkspace workspace = getWorkspace(request, request.fromWorkspace());
+        MapWorkspace newWorkspace = getWorkspace(request, request.intoWorkspace());
+        if (workspace == null || newWorkspace == null) return;
+        MapNode node = getTargetNode(workspace, request, request.from());
+        if (node == null) return;
+
+        // Look up the new parent, which must exist ...
+        Path newParentPath = request.into().getPath();
+        MapNode newParent = newWorkspace.getNode(newParentPath);
+        MapNode newNode = workspace.cloneNode(getExecutionContext(),
+                                              node,
+                                              newWorkspace,
+                                              newParent,
+                                              request.desiredName(),
+                                              request.desiredSegment(),
+                                              request.removeExisting());
+        Path newPath = getExecutionContext().getValueFactories().getPathFactory().create(newParentPath, newNode.getName());
+        Location oldLocation = getActualLocation(request.from().getPath(), node);
+        Location newLocation = Location.create(newPath, newNode.getUuid());
+        request.setActualLocations(oldLocation, newLocation);
+        recordChange(request);
+    }
+
+    /**
+     * {@inheritDoc}
+     * 
      * @see org.jboss.dna.graph.request.processor.RequestProcessor#process(org.jboss.dna.graph.request.CopyBranchRequest)
      */
     @Override
@@ -133,13 +163,7 @@
         Path newParentPath = request.into().getPath();
         Name desiredName = request.desiredName();
         MapNode newParent = newWorkspace.getNode(newParentPath);
-        MapNode newNode = workspace.copyNode(getExecutionContext(),
-                                             node,
-                                             newWorkspace,
-                                             newParent,
-                                             desiredName,
-                                             true,
-                                             request.uuidConflictBehavior());
+        MapNode newNode = workspace.copyNode(getExecutionContext(), node, newWorkspace, newParent, desiredName, true);
         Path newPath = getExecutionContext().getValueFactories().getPathFactory().create(newParentPath, newNode.getName());
         Location oldLocation = getActualLocation(request.from().getPath(), node);
         Location newLocation = Location.create(newPath, newNode.getUuid());

Modified: trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/map/MapWorkspace.java
===================================================================
--- trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/map/MapWorkspace.java	2009-06-27 02:54:06 UTC (rev 1065)
+++ trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/map/MapWorkspace.java	2009-06-28 00:33:32 UTC (rev 1066)
@@ -29,7 +29,6 @@
 import org.jboss.dna.graph.property.Name;
 import org.jboss.dna.graph.property.Path;
 import org.jboss.dna.graph.property.PathFactory;
-import org.jboss.dna.graph.request.UuidConflictBehavior;
 
 /**
  * The {@code MapWorkspace} defines the required methods for workspaces in a {@link MapRepository map repository}. By default, a
@@ -138,20 +137,44 @@
      * @param newParent the parent where the copy is to be placed; may not be null
      * @param desiredName the desired name for the node; if null, the name will be obtained from the original node
      * @param recursive true if the copy should be recursive
-     * @param uuidConflictBehavior the behavior to use to manage UUIDs from the source into the target
      * @return the new node, which is the top of the new subgraph
-     * @throws UuidAlreadyExistsException if {@code uuidConflictBehavior} is true and and a UUID in the source tree alread exists
-     *         in the new workspace
      */
     MapNode copyNode( ExecutionContext context,
                       MapNode original,
                       MapWorkspace newWorkspace,
                       MapNode newParent,
                       Name desiredName,
-                      boolean recursive,
-                      UuidConflictBehavior uuidConflictBehavior ) throws UuidAlreadyExistsException;
+                      boolean recursive );
 
     /**
+     * This should clone the subgraph given by the original node and place the cloned copy under the supplied new parent. Note
+     * that internal references between nodes within the original subgraph must be reflected as internal nodes within the new
+     * subgraph.
+     * 
+     * @param context the context; may not be null
+     * @param original the node to be cloned; may not be null
+     * @param newWorkspace the workspace containing the new parent node; may not be null
+     * @param newParent the parent where the clone is to be placed; may not be null
+     * @param desiredName the desired name for the node; if null, the name will be calculated from {@code desiredSegment}; Exactly
+     *        one of {@code desiredSegment} and {@code desiredName} must be non-null
+     * @param desiredSegment the exact segment at which the clone should be rooted; if null, the name will be inferred from
+     *        {@code desiredName}; Exactly one of {@code desiredSegment} and {@code desiredName} must be non-null
+     * @param removeExisting true if existing nodes in the new workspace with the same UUIDs as nodes in the branch rooted at
+     *        {@code original} should be removed; if false, a UuidAlreadyExistsException will be thrown if a UUID conflict is
+     *        detected
+     * @return the new node, which is the top of the new subgraph
+     * @throws UuidAlreadyExistsException if {@code removeExisting} is true and and a UUID in the source tree already exists in
+     *         the new workspace
+     */
+    MapNode cloneNode( ExecutionContext context,
+                       MapNode original,
+                       MapWorkspace newWorkspace,
+                       MapNode newParent,
+                       Name desiredName,
+                       Path.Segment desiredSegment,
+                       boolean removeExisting ) throws UuidAlreadyExistsException;
+
+    /**
      * Find the lowest existing node along the path.
      * 
      * @param path the path to the node; may not be null

Modified: trunk/dna-graph/src/main/java/org/jboss/dna/graph/request/BatchRequestBuilder.java
===================================================================
--- trunk/dna-graph/src/main/java/org/jboss/dna/graph/request/BatchRequestBuilder.java	2009-06-27 02:54:06 UTC (rev 1065)
+++ trunk/dna-graph/src/main/java/org/jboss/dna/graph/request/BatchRequestBuilder.java	2009-06-28 00:33:32 UTC (rev 1066)
@@ -572,8 +572,7 @@
                                            String intoWorkspace,
                                            Name nameForCopy ) {
         return add(new CopyBranchRequest(from, fromWorkspace, into, intoWorkspace, nameForCopy,
-                                         CopyBranchRequest.DEFAULT_NODE_CONFLICT_BEHAVIOR,
-                                         UuidConflictBehavior.ALWAYS_CREATE_NEW_UUID));
+                                         CopyBranchRequest.DEFAULT_NODE_CONFLICT_BEHAVIOR));
     }
 
     /**
@@ -587,9 +586,6 @@
      *        used
      * @param conflictBehavior the expected behavior if an equivalently-named child already exists at the <code>into</code>
      *        location, or null if the default node conflict behavior should be used
-     * @param uuidConflictBehavior the expected behavior if a node with the same UUID as any of the nodes in the branch under the
-     *        {@code from} location in the {@code fromWorkspace} workspace already exists in the workspace, or null if the default
-     *        UUID conflict behavior should be used
      * @return this builder for method chaining; never null
      * @throws IllegalArgumentException if either of the locations or workspace names are null
      */
@@ -598,12 +594,9 @@
                                            Location into,
                                            String intoWorkspace,
                                            Name nameForCopy,
-                                           NodeConflictBehavior conflictBehavior,
-                                           UuidConflictBehavior uuidConflictBehavior) {
+                                           NodeConflictBehavior conflictBehavior ) {
         if (conflictBehavior == null) conflictBehavior = CopyBranchRequest.DEFAULT_NODE_CONFLICT_BEHAVIOR;
-        if (uuidConflictBehavior == null) uuidConflictBehavior = CopyBranchRequest.DEFAULT_UUID_CONFLICT_BEHAVIOR;
-        return add(new CopyBranchRequest(from, fromWorkspace, into, intoWorkspace, nameForCopy, conflictBehavior,
-                                         uuidConflictBehavior));
+        return add(new CopyBranchRequest(from, fromWorkspace, into, intoWorkspace, nameForCopy, conflictBehavior));
     }
 
     /**

Added: trunk/dna-graph/src/main/java/org/jboss/dna/graph/request/CloneBranchRequest.java
===================================================================
--- trunk/dna-graph/src/main/java/org/jboss/dna/graph/request/CloneBranchRequest.java	                        (rev 0)
+++ trunk/dna-graph/src/main/java/org/jboss/dna/graph/request/CloneBranchRequest.java	2009-06-28 00:33:32 UTC (rev 1066)
@@ -0,0 +1,313 @@
+package org.jboss.dna.graph.request;
+
+import org.jboss.dna.common.util.CheckArg;
+import org.jboss.dna.common.util.HashCode;
+import org.jboss.dna.graph.GraphI18n;
+import org.jboss.dna.graph.Location;
+import org.jboss.dna.graph.connector.UuidAlreadyExistsException;
+import org.jboss.dna.graph.property.Name;
+import org.jboss.dna.graph.property.Path;
+
+/**
+ * Instruction that a branch be cloned from one workspace into another. Cloning a branch differs from cloning a branch in that:
+ * <ol>
+ * <li>Nodes can be cloned within the same workspace or to another workspace; cloned nodes must be cloned from one workspace into
+ * another.</li>
+ * <li>Copied nodes always get new UUIDs; cloned nodes always maintain their UUIDs and hence must define the behavior that occurs
+ * if a node with the same UUID already exists in the new workspace.</li>
+ * <li>Nodes can be cloned to a specific name under a specific parent, but can only be added as a new child node at the end of the
+ * new parent's children; nodes can be cloned to an exact location among the parent's children, replacing the existing node at
+ * that location.</li>
+ * </ol>
+ * 
+ * @author Brian Carothers
+ */
+public class CloneBranchRequest extends ChangeRequest {
+
+    private static final long serialVersionUID = 1L;
+
+    private final String fromWorkspace;
+    private final String intoWorkspace;
+    private final Location from;
+    private final Location into;
+    private final Name desiredName;
+    private final Path.Segment desiredSegment;
+    private final boolean removeExisting;
+    private Location actualFromLocation;
+    private Location actualIntoLocation;
+
+    /**
+     * Create a request to clone a branch to another.
+     * 
+     * @param from the location of the top node in the existing branch that is to be cloned
+     * @param fromWorkspace the name of the workspace where the <code>from</code> node exists
+     * @param into the location of the existing node into which the clone should be placed
+     * @param intoWorkspace the name of the workspace where the <code>into</code> node is to be cloned
+     * @param nameForClone the desired name for the node that results from the clone, or null if the name of the original should
+     *        be used
+     * @param exactSegmentForClone the exact {@link Path.Segment segment} at which the cloned tree should be rooted.
+     * @param removeExisting whether any nodes in the intoWorkspace with the same UUIDs as a node in the source branch should be
+     *        removed (if true) or a {@link UuidAlreadyExistsException} should be thrown.
+     * @throws IllegalArgumentException if any of the parameters are null except for {@code nameForClone} or {@code
+     *         exactSegmentForClone}. Exactly one of {@code nameForClone} and {@code exactSegmentForClone} must be null.
+     */
+    public CloneBranchRequest( Location from,
+                               String fromWorkspace,
+                               Location into,
+                               String intoWorkspace,
+                               Name nameForClone,
+                               Path.Segment exactSegmentForClone,
+                               boolean removeExisting ) {
+        CheckArg.isNotNull(from, "from");
+        CheckArg.isNotNull(into, "into");
+        CheckArg.isNotNull(fromWorkspace, "fromWorkspace");
+        CheckArg.isNotNull(intoWorkspace, "intoWorkspace");
+        CheckArg.isNotSame(from, fromWorkspace, into, intoWorkspace);
+        assert nameForClone == null ? exactSegmentForClone != null : exactSegmentForClone == null;
+        this.from = from;
+        this.into = into;
+        this.fromWorkspace = fromWorkspace;
+        this.intoWorkspace = intoWorkspace;
+        this.desiredName = nameForClone;
+        this.desiredSegment = exactSegmentForClone;
+        this.removeExisting = removeExisting;
+    }
+
+    /**
+     * Get the location defining the top of the branch to be cloned
+     * 
+     * @return the from location; never null
+     */
+    public Location from() {
+        return from;
+    }
+
+    /**
+     * Get the location defining the parent where the new clone is to be placed
+     * 
+     * @return the to location; never null
+     */
+    public Location into() {
+        return into;
+    }
+
+    /**
+     * Get the name of the workspace containing the branch to be cloned.
+     * 
+     * @return the name of the workspace containing the branch to be cloned; never null
+     */
+    public String fromWorkspace() {
+        return fromWorkspace;
+    }
+
+    /**
+     * Get the name of the workspace where the clone is to be placed
+     * 
+     * @return the name of the workspace where the clone is to be placed; never null
+     */
+    public String intoWorkspace() {
+        return intoWorkspace;
+    }
+
+    /**
+     * Determine whether this clone operation is within the same workspace.
+     * 
+     * @return true if this operation is to be performed within the same workspace, or false if the workspace of the
+     *         {@link #from() original} is different than that of the {@link #into() clone}
+     */
+    public boolean isSameWorkspace() {
+        return false;
+    }
+
+    /**
+     * Get the name of the clone if it is to be different than that of the original.
+     * 
+     * @return the desired name of the clone, or null if an {@link #desiredSegment() exact segment} is specified.
+     */
+    public Name desiredName() {
+        return desiredName;
+    }
+
+    /**
+     * Get the exact {@link Path.Segment segment} at which the clone should be rooted
+     * 
+     * @return the desired segment of the clone, or null if the desired name should be used to generate a new child node for the
+     *         {@code into} location
+     */
+    public Path.Segment desiredSegment() {
+        return desiredSegment;
+    }
+
+    /**
+     * Gets whether the clone should remove existing nodes in the {@link #intoWorkspace new workspace} with the same UUID as any
+     * of the nodes in the source branch or should throw an exception if such conflict is detected.
+     * 
+     * @return whether the clone should remove existing nodes in the {@link #intoWorkspace new workspace} with the same UUID as
+     *         any of the nodes in the source branch or should throw an exception if such conflict is detected; true indicates
+     *         that the nodes should be removed and false indicates that an exception should be thrown
+     */
+    public boolean removeExisting() {
+        return removeExisting;
+    }
+
+    /**
+     * {@inheritDoc}
+     * 
+     * @see org.jboss.dna.graph.request.Request#isReadOnly()
+     */
+    @Override
+    public boolean isReadOnly() {
+        return false;
+    }
+
+    /**
+     * Sets the actual and complete location of the node being renamed and its new location. This method must be called when
+     * processing the request, and the actual location must have a {@link Location#getPath() path}.
+     * 
+     * @param fromLocation the actual location of the node being cloned
+     * @param intoLocation the actual location of the new clone of the node
+     * @throws IllegalArgumentException if the either location is null; if the old location does not represent the
+     *         {@link Location#isSame(Location) same location} as the {@link #from() from location}; if the new location does not
+     *         represent the {@link Location#isSame(Location) same location} as the {@link #into() into location}; if the either
+     *         location does not have a path
+     * @throws IllegalStateException if the request is frozen
+     */
+    public void setActualLocations( Location fromLocation,
+                                    Location intoLocation ) {
+        checkNotFrozen();
+        if (!from.isSame(fromLocation)) { // not same if actual is null
+            throw new IllegalArgumentException(GraphI18n.actualLocationIsNotSameAsInputLocation.text(fromLocation, from));
+        }
+        CheckArg.isNotNull(intoLocation, "intoLocation");
+        assert fromLocation != null;
+        assert intoLocation != null;
+        if (!fromLocation.hasPath()) {
+            throw new IllegalArgumentException(GraphI18n.actualOldLocationMustHavePath.text(fromLocation));
+        }
+        if (!intoLocation.hasPath()) {
+            throw new IllegalArgumentException(GraphI18n.actualNewLocationMustHavePath.text(intoLocation));
+        }
+        // The 'into' should be the parent of the 'newLocation' ...
+        if (into.hasPath() && !intoLocation.getPath().getParent().equals(into.getPath())) {
+            throw new IllegalArgumentException(GraphI18n.actualLocationIsNotChildOfInputLocation.text(intoLocation, into));
+        }
+
+        if (desiredSegment != null && !desiredSegment.equals(intoLocation.getPath().getLastSegment())) {
+            throw new IllegalArgumentException(GraphI18n.actualLocationIsNotAtCorrectChildSegment.text(intoLocation,
+                                                                                                       desiredSegment));
+        }
+
+        if (desiredName != null && !desiredName.equals(intoLocation.getPath().getLastSegment().getName())) {
+            throw new IllegalArgumentException(
+                                               GraphI18n.actualLocationDoesNotHaveCorrectChildName.text(intoLocation, desiredName));
+        }
+
+        this.actualFromLocation = fromLocation;
+        this.actualIntoLocation = intoLocation;
+    }
+
+    /**
+     * Get the actual location of the node before being cloned.
+     * 
+     * @return the actual location of the node before being moved, or null if the actual location was not set
+     */
+    public Location getActualLocationBefore() {
+        return actualFromLocation;
+    }
+
+    /**
+     * Get the actual location of the node after being cloned.
+     * 
+     * @return the actual location of the node after being cloned, or null if the actual location was not set
+     */
+    public Location getActualLocationAfter() {
+        return actualIntoLocation;
+    }
+
+    /**
+     * {@inheritDoc}
+     * 
+     * @see org.jboss.dna.graph.request.ChangeRequest#changes(java.lang.String, org.jboss.dna.graph.property.Path)
+     */
+    @Override
+    public boolean changes( String workspace,
+                            Path path ) {
+        return into.hasPath() && into.getPath().isAtOrBelow(path);
+    }
+
+    /**
+     * {@inheritDoc}
+     * 
+     * @see org.jboss.dna.graph.request.ChangeRequest#changedLocation()
+     */
+    @Override
+    public Location changedLocation() {
+        return into;
+    }
+
+    /**
+     * {@inheritDoc}
+     * 
+     * @see org.jboss.dna.graph.request.ChangeRequest#changedWorkspace()
+     */
+    @Override
+    public String changedWorkspace() {
+        return intoWorkspace();
+    }
+
+    /**
+     * {@inheritDoc}
+     * 
+     * @see java.lang.Object#hashCode()
+     */
+    @Override
+    public int hashCode() {
+        return HashCode.compute(from, fromWorkspace, into, intoWorkspace);
+    }
+
+    /**
+     * {@inheritDoc}
+     * 
+     * @see org.jboss.dna.graph.request.Request#cancel()
+     */
+    @Override
+    public void cancel() {
+        super.cancel();
+        this.actualFromLocation = null;
+        this.actualIntoLocation = null;
+    }
+
+    /**
+     * {@inheritDoc}
+     * 
+     * @see java.lang.Object#equals(java.lang.Object)
+     */
+    @Override
+    public boolean equals( Object obj ) {
+        if (obj == this) return true;
+        if (this.getClass().isInstance(obj)) {
+            CloneBranchRequest that = (CloneBranchRequest)obj;
+            if (!this.from().equals(that.from())) return false;
+            if (!this.into().equals(that.into())) return false;
+            if (!this.fromWorkspace.equals(that.fromWorkspace)) return false;
+            if (!this.intoWorkspace.equals(that.intoWorkspace)) return false;
+            return true;
+        }
+        return false;
+    }
+
+    /**
+     * {@inheritDoc}
+     * 
+     * @see java.lang.Object#toString()
+     */
+    @Override
+    public String toString() {
+        if (desiredName != null) {
+            return "clone branch " + from() + " in the \"" + fromWorkspace + "\" workspace into " + into() + " with name "
+                   + desiredName + " in the \"" + intoWorkspace + "\" workspace";
+        }
+        return "clone branch " + from() + " in the \"" + fromWorkspace + "\" workspace into " + into() + " in the \""
+               + intoWorkspace + "\" workspace as child " + desiredSegment();
+    }
+}


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

Modified: trunk/dna-graph/src/main/java/org/jboss/dna/graph/request/CopyBranchRequest.java
===================================================================
--- trunk/dna-graph/src/main/java/org/jboss/dna/graph/request/CopyBranchRequest.java	2009-06-27 02:54:06 UTC (rev 1065)
+++ trunk/dna-graph/src/main/java/org/jboss/dna/graph/request/CopyBranchRequest.java	2009-06-28 00:33:32 UTC (rev 1066)
@@ -33,16 +33,18 @@
 
 /**
  * Instruction that a branch be copied from one location into another. This request can copy a branch in one workspace into
- * another workspace, or it can copy a branch in the same workspace.
+ * another workspace, or it can copy a branch in the same workspace. Copying a branch always results in the generation of new
+ * UUIDs for the copied nodes. {@link CloneBranchRequest Cloning a branch} provides functionality similar to copy, but with the
+ * ability to preserve UUIDs in the move.
  * 
  * @author Randall Hauch
+ * @see CloneBranchRequest
  */
 public class CopyBranchRequest extends ChangeRequest {
 
     private static final long serialVersionUID = 1L;
 
     public static final NodeConflictBehavior DEFAULT_NODE_CONFLICT_BEHAVIOR = NodeConflictBehavior.APPEND;
-    public static final UuidConflictBehavior DEFAULT_UUID_CONFLICT_BEHAVIOR = UuidConflictBehavior.ALWAYS_CREATE_NEW_UUID;
 
     private final Location from;
     private final Location into;
@@ -50,7 +52,6 @@
     private final String intoWorkspace;
     private final Name desiredNameForCopy;
     private final NodeConflictBehavior nodeConflictBehavior;
-    private final UuidConflictBehavior uuidConflictBehavior;
     private Location actualFromLocation;
     private Location actualIntoLocation;
 
@@ -68,7 +69,7 @@
                               String fromWorkspace,
                               Location into,
                               String intoWorkspace ) {
-        this(from, fromWorkspace, into, intoWorkspace, null, DEFAULT_NODE_CONFLICT_BEHAVIOR, DEFAULT_UUID_CONFLICT_BEHAVIOR);
+        this(from, fromWorkspace, into, intoWorkspace, null, DEFAULT_NODE_CONFLICT_BEHAVIOR);
     }
 
     /**
@@ -87,7 +88,7 @@
                               Location into,
                               String intoWorkspace,
                               Name nameForCopy ) {
-        this(from, fromWorkspace, into, intoWorkspace, nameForCopy, DEFAULT_NODE_CONFLICT_BEHAVIOR, DEFAULT_UUID_CONFLICT_BEHAVIOR);
+        this(from, fromWorkspace, into, intoWorkspace, nameForCopy, DEFAULT_NODE_CONFLICT_BEHAVIOR);
     }
 
     /**
@@ -101,8 +102,6 @@
      *        used
      * @param nodeConflictBehavior the expected behavior if an equivalently-named child already exists at the <code>into</code>
      *        location
-     * @param uuidConflictBehavior the expected behavior if a node with the same UUID as any of the nodes in the branch under the
-     *        {@code from} location in the {@code fromWorkspace} workspace already exists in the workspace
      * @throws IllegalArgumentException if any of the parameters are null
      */
     public CopyBranchRequest( Location from,
@@ -110,21 +109,18 @@
                               Location into,
                               String intoWorkspace,
                               Name nameForCopy,
-                              NodeConflictBehavior nodeConflictBehavior,
-                              UuidConflictBehavior uuidConflictBehavior ) {
+                              NodeConflictBehavior nodeConflictBehavior ) {
         CheckArg.isNotNull(from, "from");
         CheckArg.isNotNull(into, "into");
         CheckArg.isNotNull(fromWorkspace, "fromWorkspace");
         CheckArg.isNotNull(intoWorkspace, "intoWorkspace");
         CheckArg.isNotNull(nodeConflictBehavior, "nodeConflictBehavior");
-        CheckArg.isNotNull(uuidConflictBehavior, "uuidConflictBehavior");
         this.from = from;
         this.into = into;
         this.fromWorkspace = fromWorkspace;
         this.intoWorkspace = intoWorkspace;
         this.desiredNameForCopy = nameForCopy;
         this.nodeConflictBehavior = nodeConflictBehavior;
-        this.uuidConflictBehavior = uuidConflictBehavior;
     }
 
     /**
@@ -203,15 +199,6 @@
     }
 
     /**
-     * Get the expected behavior when one of the nodes in the branch has the same UUID as an existing node in the workspace.
-     * 
-     * @return the behavior specification
-     */
-    public UuidConflictBehavior uuidConflictBehavior() {
-        return uuidConflictBehavior;
-    }
-
-    /**
      * Sets the actual and complete location of the node being renamed and its new location. This method must be called when
      * processing the request, and the actual location must have a {@link Location#getPath() path}.
      * 

Modified: trunk/dna-graph/src/main/java/org/jboss/dna/graph/request/RequestBuilder.java
===================================================================
--- trunk/dna-graph/src/main/java/org/jboss/dna/graph/request/RequestBuilder.java	2009-06-27 02:54:06 UTC (rev 1065)
+++ trunk/dna-graph/src/main/java/org/jboss/dna/graph/request/RequestBuilder.java	2009-06-28 00:33:32 UTC (rev 1066)
@@ -28,6 +28,7 @@
 import java.util.Map;
 import org.jboss.dna.graph.Location;
 import org.jboss.dna.graph.NodeConflictBehavior;
+import org.jboss.dna.graph.connector.UuidAlreadyExistsException;
 import org.jboss.dna.graph.property.Name;
 import org.jboss.dna.graph.property.Path;
 import org.jboss.dna.graph.property.Property;
@@ -432,8 +433,6 @@
      *        used
      * @param conflictBehavior the expected behavior if an equivalently-named child already exists at the <code>into</code>
      *        location, or null if the default conflict behavior should be used
-     * @param uuidConflictBehavior the expected behavior if a node with the same UUID as any of the nodes in the branch under the
-     *        {@code from} location in the {@code fromWorkspace} workspace already exists in the workspace
      * @return the request; never null
      * @throws IllegalArgumentException if either of the locations or workspace names are null
      */
@@ -442,14 +441,39 @@
                                          Location into,
                                          String intoWorkspace,
                                          Name nameForCopy,
-                                         NodeConflictBehavior conflictBehavior,
-                                         UuidConflictBehavior uuidConflictBehavior) {
+                                         NodeConflictBehavior conflictBehavior ) {
         if (conflictBehavior == null) conflictBehavior = CopyBranchRequest.DEFAULT_NODE_CONFLICT_BEHAVIOR;
-        return process(new CopyBranchRequest(from, fromWorkspace, into, intoWorkspace, nameForCopy, conflictBehavior,
-                                             uuidConflictBehavior));
+        return process(new CopyBranchRequest(from, fromWorkspace, into, intoWorkspace, nameForCopy, conflictBehavior));
     }
 
     /**
+     * Add a request to clone a branch to another.
+     * 
+     * @param from the location of the top node in the existing branch that is to be cloned
+     * @param fromWorkspace the name of the workspace where the <code>from</code> node exists
+     * @param into the location of the existing node into which the clone should be placed
+     * @param intoWorkspace the name of the workspace where the <code>into</code> node is to be cloned
+     * @param nameForClone the desired name for the node that results from the clone, or null if the name of the original should
+     *        be used
+     * @param exactSegmentForClone the exact {@link Path.Segment segment} at which the cloned tree should be rooted.
+     * @param removeExisting whether any nodes in the intoWorkspace with the same UUIDs as a node in the source branch should be
+     *        removed (if true) or a {@link UuidAlreadyExistsException} should be thrown.
+     * @return the request; never null
+     * @throws IllegalArgumentException if any of the parameters are null except for {@code nameForClone} or {@code
+     *         exactSegmentForClone}. Exactly one of {@code nameForClone} and {@code exactSegmentForClone} must be null.
+     */
+    public CloneBranchRequest cloneBranch( Location from,
+                                           String fromWorkspace,
+                                           Location into,
+                                           String intoWorkspace,
+                                           Name nameForClone,
+                                           Path.Segment exactSegmentForClone,
+                                           boolean removeExisting ) {
+        return process(new CloneBranchRequest(from, fromWorkspace, into, intoWorkspace, nameForClone, exactSegmentForClone,
+                                              removeExisting));
+    }
+
+    /**
      * Create a request to move a branch from one location into another.
      * 
      * @param from the location of the top node in the existing branch that is to be moved

Deleted: trunk/dna-graph/src/main/java/org/jboss/dna/graph/request/UuidConflictBehavior.java
===================================================================
--- trunk/dna-graph/src/main/java/org/jboss/dna/graph/request/UuidConflictBehavior.java	2009-06-27 02:54:06 UTC (rev 1065)
+++ trunk/dna-graph/src/main/java/org/jboss/dna/graph/request/UuidConflictBehavior.java	2009-06-28 00:33:32 UTC (rev 1066)
@@ -1,14 +0,0 @@
-package org.jboss.dna.graph.request;
-
-/**
- * An enumeration used by {@link CopyBranchRequest} for the choice of handling duplicate UUIDs, such as when a node is to be
- * copied to another location where a node already exists.
- * 
- * @author Randall Hauch
- */
-public enum UuidConflictBehavior {
-
-    ALWAYS_CREATE_NEW_UUID,
-    REPLACE_EXISTING_NODE,
-    THROW_EXCEPTION;
-}

Modified: trunk/dna-graph/src/main/java/org/jboss/dna/graph/request/processor/LoggingRequestProcessor.java
===================================================================
--- trunk/dna-graph/src/main/java/org/jboss/dna/graph/request/processor/LoggingRequestProcessor.java	2009-06-27 02:54:06 UTC (rev 1065)
+++ trunk/dna-graph/src/main/java/org/jboss/dna/graph/request/processor/LoggingRequestProcessor.java	2009-06-28 00:33:32 UTC (rev 1066)
@@ -26,6 +26,7 @@
 import org.jboss.dna.common.util.CheckArg;
 import org.jboss.dna.common.util.Logger;
 import org.jboss.dna.graph.GraphI18n;
+import org.jboss.dna.graph.request.CloneBranchRequest;
 import org.jboss.dna.graph.request.CloneWorkspaceRequest;
 import org.jboss.dna.graph.request.CompositeRequest;
 import org.jboss.dna.graph.request.CopyBranchRequest;
@@ -115,6 +116,18 @@
     /**
      * {@inheritDoc}
      * 
+     * @see org.jboss.dna.graph.request.processor.RequestProcessor#process(org.jboss.dna.graph.request.CloneBranchRequest)
+     */
+    @Override
+    public void process( CloneBranchRequest request ) {
+        logger.log(level, GraphI18n.executingRequest, request);
+        delegate.process(request);
+        logger.log(level, GraphI18n.executedRequest, request);
+    }
+
+    /**
+     * {@inheritDoc}
+     * 
      * @see org.jboss.dna.graph.request.processor.RequestProcessor#process(org.jboss.dna.graph.request.CloneWorkspaceRequest)
      */
     @Override

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	2009-06-27 02:54:06 UTC (rev 1065)
+++ trunk/dna-graph/src/main/java/org/jboss/dna/graph/request/processor/RequestProcessor.java	2009-06-28 00:33:32 UTC (rev 1066)
@@ -44,6 +44,7 @@
 import org.jboss.dna.graph.property.ReferentialIntegrityException;
 import org.jboss.dna.graph.request.CacheableRequest;
 import org.jboss.dna.graph.request.ChangeRequest;
+import org.jboss.dna.graph.request.CloneBranchRequest;
 import org.jboss.dna.graph.request.CloneWorkspaceRequest;
 import org.jboss.dna.graph.request.CompositeRequest;
 import org.jboss.dna.graph.request.CopyBranchRequest;
@@ -253,6 +254,8 @@
                 process((GetWorkspacesRequest)request);
             } else if (request instanceof CreateWorkspaceRequest) {
                 process((CreateWorkspaceRequest)request);
+            } else if (request instanceof CloneBranchRequest) {
+                process((CloneBranchRequest)request);
             } else if (request instanceof CloneWorkspaceRequest) {
                 process((CloneWorkspaceRequest)request);
             } else if (request instanceof DestroyWorkspaceRequest) {
@@ -358,6 +361,16 @@
     public abstract void process( CreateWorkspaceRequest request );
 
     /**
+     * Process a request to clone a branch into a new workspace.
+     * <p>
+     * This method does nothing if the request is null.
+     * </p>
+     * 
+     * @param request the request
+     */
+    public abstract void process( CloneBranchRequest request );
+
+    /**
      * Process a request to clone an existing workspace as a new workspace.
      * <p>
      * This method does nothing if the request is null.
@@ -786,7 +799,7 @@
     public void close() {
         // Publish any changes ...
         if (observer != null && !this.changes.isEmpty()) {
-            String userName = context.getSecurityContext() != null ? context.getSecurityContext().getUserName() : null; 
+            String userName = context.getSecurityContext() != null ? context.getSecurityContext().getUserName() : null;
             Changes changes = new Changes(userName, getSourceName(), getNowInUtc(), this.changes);
             observer.notify(changes);
         }

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	2009-06-27 02:54:06 UTC (rev 1065)
+++ trunk/dna-graph/src/main/resources/org/jboss/dna/graph/GraphI18n.properties	2009-06-28 00:33:32 UTC (rev 1066)
@@ -64,6 +64,8 @@
 unableToCopyToTheRoot = Unable to copy node "{0}" to "{1}" since the desired location is the root node
 actualLocationIsNotSameAsInputLocation = The actual location of {0} is not the same as the current location of {1}
 actualLocationIsNotChildOfInputLocation = The actual location of {0} is not a child of the specified location {1}
+actualLocationIsNotAtCorrectChildSegment = The last segment of the actual location of {0} does not have the requested child segment {1}
+actualLocationDoesNotHaveCorrectChildName = The last segment of the actual location of {0} does not have the requested child name {1}
 actualLocationMustHavePath = The actual location of {0} must have a path
 actualNewLocationIsNotSameAsInputLocation = The actual new location of {0} is not the same as the input location of {1}
 actualNewLocationMustHavePath = The actual new location of {0} must have a path
@@ -99,8 +101,9 @@
 federatedSourceDoesNotSupportCloningWorkspaces = {0} is a source that does not allow cloning workspaces
 federatedSourceDoesNotSupportDestroyingWorkspaces = {0} is a source that does not allow destroying workspaces
 unableToProjectSourceInformationIntoWorkspace = Unable to project source information at {0} in the "{1} federated repository source using projection {2}
-unableToCreateNodeUnderPlaceholder = Unable to create node "{0}" under {1} in the "{2}" workspace of the "{3}" federarted repository because the parent is a placeholder
-unableToUpdatePlaceholder = Unable to update node {0} in the "{1}" workspace of the "{2}" federarted repository because the node is a placeholder
-unableToDeletePlaceholder = Unable to delete node {0} in the "{1}" workspace of the "{2}" federarted repository because the node is a placeholder
-copyLimitedToBeWithinSingleSource = Unable to copy {0} in the "{1}" workspace of the "{3}" federarted repository into {2} in the "{3}" workspace: copy is only supported when the original and new locations are within the same source
-moveLimitedToBeWithinSingleSource = Unable to move {0} in the "{1}" workspace of the "{3}" federarted repository into {2} in the "{3}" workspace: move is only supported when the original and new locations are within the same source
+unableToCreateNodeUnderPlaceholder = Unable to create node "{0}" under {1} in the "{2}" workspace of the "{3}" federated repository because the parent is a placeholder
+unableToUpdatePlaceholder = Unable to update node {0} in the "{1}" workspace of the "{2}" federated repository because the node is a placeholder
+unableToDeletePlaceholder = Unable to delete node {0} in the "{1}" workspace of the "{2}" federated repository because the node is a placeholder
+copyLimitedToBeWithinSingleSource = Unable to copy {0} in the "{1}" workspace of the "{3}" federated repository into {2} in the "{3}" workspace: copy is only supported when the original and new locations are within the same source
+moveLimitedToBeWithinSingleSource = Unable to move {0} in the "{1}" workspace of the "{3}" federated repository into {2} in the "{3}" workspace: move is only supported when the original and new locations are within the same source
+cloneLimitedToBeWithinSingleSource = Unable to clone {0} in the "{1}" workspace of the "{3}" federated repository into {2} in the "{3}" workspace: clone is only supported when the original and new locations are within the same source

Modified: trunk/dna-graph/src/test/java/org/jboss/dna/graph/GraphTest.java
===================================================================
--- trunk/dna-graph/src/test/java/org/jboss/dna/graph/GraphTest.java	2009-06-27 02:54:06 UTC (rev 1065)
+++ trunk/dna-graph/src/test/java/org/jboss/dna/graph/GraphTest.java	2009-06-28 00:33:32 UTC (rev 1066)
@@ -54,6 +54,7 @@
 import org.jboss.dna.graph.property.Name;
 import org.jboss.dna.graph.property.Path;
 import org.jboss.dna.graph.property.Property;
+import org.jboss.dna.graph.request.CloneBranchRequest;
 import org.jboss.dna.graph.request.CloneWorkspaceRequest;
 import org.jboss.dna.graph.request.CompositeRequest;
 import org.jboss.dna.graph.request.CopyBranchRequest;
@@ -72,7 +73,6 @@
 import org.jboss.dna.graph.request.Request;
 import org.jboss.dna.graph.request.SetPropertyRequest;
 import org.jboss.dna.graph.request.UpdatePropertiesRequest;
-import org.jboss.dna.graph.request.UuidConflictBehavior;
 import org.jboss.dna.graph.request.VerifyNodeExistsRequest;
 import org.jboss.dna.graph.request.VerifyWorkspaceRequest;
 import org.jboss.dna.graph.request.CloneWorkspaceRequest.CloneConflictBehavior;
@@ -191,22 +191,14 @@
     protected void assertNextRequestIsCopy( String fromWorkspace,
                                             Location from,
                                             Location to ) {
-        assertNextRequestIsCopy(fromWorkspace, from, to, UuidConflictBehavior.ALWAYS_CREATE_NEW_UUID);
-    }
-
-    protected void assertNextRequestIsCopy( String fromWorkspace,
-                                            Location from,
-                                            Location to,
-                                            UuidConflictBehavior uuidConflictBehavior) {
         Request request = executedRequests.poll();
         assertThat(request, is(instanceOf(CopyBranchRequest.class)));
         CopyBranchRequest copy = (CopyBranchRequest)request;
         assertThat(copy.fromWorkspace(), is(fromWorkspace));
         assertThat(copy.from(), is(from));
         assertThat(copy.into(), is(to));
-        assertThat(copy.uuidConflictBehavior(), is(uuidConflictBehavior));
     }
-    
+
     protected void assertNextRequestIsDelete( Location at ) {
         Request request = executedRequests.poll();
         assertThat(request, is(instanceOf(DeleteBranchRequest.class)));
@@ -1112,6 +1104,23 @@
         }
 
         @Override
+        public void process( CloneBranchRequest request ) {
+            // Create a child under the new parent ...
+            if (request.into().hasPath()) {
+                Name childName = request.desiredName();
+                if (childName == null) childName = request.desiredSegment().getName();
+                
+                Path childPath = context.getValueFactories().getPathFactory().create(request.into().getPath(), childName);
+                Location newChild = actualLocationOf(Location.create(childPath));
+                // Just update the actual location
+                request.setActualLocations(actualLocationOf(request.from()), newChild);
+            } else {
+                // Just update the actual location
+                request.setActualLocations(actualLocationOf(request.from()), actualLocationOf(request.into()));
+            }
+        }
+
+        @Override
         public void process( CreateNodeRequest request ) {
             // Just update the actual location ...
             Location parent = actualLocationOf(request.under()); // just make sure it has a path ...

Modified: trunk/dna-graph/src/test/java/org/jboss/dna/graph/connector/MockRepositoryRequestProcessor.java
===================================================================
--- trunk/dna-graph/src/test/java/org/jboss/dna/graph/connector/MockRepositoryRequestProcessor.java	2009-06-27 02:54:06 UTC (rev 1065)
+++ trunk/dna-graph/src/test/java/org/jboss/dna/graph/connector/MockRepositoryRequestProcessor.java	2009-06-28 00:33:32 UTC (rev 1066)
@@ -25,6 +25,7 @@
 
 import java.util.Queue;
 import org.jboss.dna.graph.ExecutionContext;
+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;
@@ -136,6 +137,16 @@
     /**
      * {@inheritDoc}
      * 
+     * @see org.jboss.dna.graph.request.processor.RequestProcessor#process(org.jboss.dna.graph.request.CloneBranchRequest)
+     */
+    @Override
+    public void process( CloneBranchRequest request ) {
+        recordChange(request);
+    }
+
+    /**
+     * {@inheritDoc}
+     * 
      * @see org.jboss.dna.graph.request.processor.RequestProcessor#process(org.jboss.dna.graph.request.CreateNodeRequest)
      */
     @Override

Modified: trunk/dna-graph/src/test/java/org/jboss/dna/graph/connector/test/WritableConnectorTest.java
===================================================================
--- trunk/dna-graph/src/test/java/org/jboss/dna/graph/connector/test/WritableConnectorTest.java	2009-06-27 02:54:06 UTC (rev 1065)
+++ trunk/dna-graph/src/test/java/org/jboss/dna/graph/connector/test/WritableConnectorTest.java	2009-06-28 00:33:32 UTC (rev 1066)
@@ -27,6 +27,7 @@
 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.jboss.dna.graph.IsNodeWithChildren.hasChild;
 import static org.jboss.dna.graph.IsNodeWithChildren.hasChildren;
 import static org.jboss.dna.graph.IsNodeWithChildren.isEmpty;
@@ -44,9 +45,9 @@
 import org.jboss.dna.graph.connector.RepositorySource;
 import org.jboss.dna.graph.connector.UuidAlreadyExistsException;
 import org.jboss.dna.graph.property.PathNotFoundException;
+import org.jboss.dna.graph.property.PropertyFactory;
 import org.jboss.dna.graph.property.Reference;
 import org.junit.Before;
-import org.junit.Ignore;
 import org.junit.Test;
 
 /**
@@ -75,14 +76,6 @@
             IoUtil.read(getClass().getClassLoader().getResourceAsStream("LoremIpsum3.txt"))};
     }
 
-    protected void tryCreatingAWorkspaceNamed( String workspaceName ) {
-        try {
-            graph.createWorkspace().named(workspaceName);
-        } catch (Exception ex) {
-            assumeNoException(ex);
-        }
-    }
-
     /**
      * These tests require that the source supports updates, since all of the tests do some form of updates.
      */
@@ -308,7 +301,6 @@
         createSubgraph(graph, initialPath, depth, numChildrenPerNode, numPropertiesPerNode, batch, sw, System.out, description);
     }
 
-    @Ignore
     @Test
     public void shouldCreateTreeWith10ChildrenAnd2LevelsDeepUsingIndividualRequests() {
         String initialPath = "";
@@ -320,7 +312,6 @@
         createSubgraph(graph, initialPath, depth, numChildrenPerNode, numPropertiesPerNode, batch, sw, System.out, null);
     }
 
-    @Ignore
     @Test
     public void shouldCreateTreeWith10ChildrenAnd2LevelsDeepUsingOneBatch() {
         String initialPath = "";
@@ -332,7 +323,6 @@
         createSubgraph(graph, initialPath, depth, numChildrenPerNode, numPropertiesPerNode, batch, sw, System.out, null);
     }
 
-    @Ignore
     @Test
     public void shouldCreateTreeWith10ChildrenAnd3LevelsDeepUsingOneBatch() {
         String initialPath = "";
@@ -839,7 +829,7 @@
         graph.useWorkspace(defaultWorkspaceName);
 
         graph.create("/newUuids");
-        graph.copy("/node1").withNewUuids().fromWorkspace(workspaceName).to("/newUuids/node1");
+        graph.copy("/node1").fromWorkspace(workspaceName).to("/newUuids/node1");
 
         /*
          * Focus on testing node structure, since shouldCopyNodeWithChildren tests that properties get copied
@@ -858,7 +848,7 @@
     }
 
     @Test
-    public void shouldCopyChildrenBetweenWorkspacesPreservingUuids() throws Exception {
+    public void shouldNotCloneChildrenIfUuidConflictAndFailureBehavior() throws Exception {
         String defaultWorkspaceName = graph.getCurrentWorkspaceName();
         String workspaceName = "copyChildrenSource";
 
@@ -873,31 +863,27 @@
         boolean batch = true;
         createSubgraph(graph, initialPath, depth, numChildrenPerNode, numPropertiesPerNode, batch, sw, System.out, null);
 
-        Subgraph source = graph.getSubgraphOfDepth(3).at("/node1");
-
         graph.useWorkspace(defaultWorkspaceName);
 
         graph.create("/newUuids");
-        graph.copy("/node1").replacingExistingNodesWithSameUuids().fromWorkspace(workspaceName).to("/newUuids/node1");
+        // Copy once to get the UUID into the default workspace
+        //graph.copy("/node1/node1/node1").failingIfUuidsMatch().fromWorkspace(workspaceName).to("/newUuids/node1");
+        graph.clone("/node1/node1/node1").fromWorkspace(workspaceName).as(name("node1")).into("/newUuids").failingIfAnyUuidsMatch();
 
-        /*
-         * Focus on testing node structure, since shouldCopyNodeWithChildren tests that properties get copied
-         */
-        Subgraph target = graph.getSubgraphOfDepth(3).at("/newUuids/node1");
-        assertThat(target, is(notNullValue()));
-        assertThat(target.getNode(".").getChildren(), hasChildren(segment("node1"), segment("node2"), segment("node3")));
-        assertThat(uuidFor(target.getNode(".")), is(uuidFor(source.getNode("."))));
-        assertThat(target.getNode("node1").getChildren(), hasChildren(segment("node1"), segment("node2"), segment("node3")));
-        assertThat(uuidFor(target.getNode("node1")), is(uuidFor(source.getNode("node1"))));
-        assertThat(target.getNode("node2").getChildren(), hasChildren(segment("node1"), segment("node2"), segment("node3")));
-        assertThat(uuidFor(target.getNode("node2")), is(uuidFor(source.getNode("node2"))));
-        assertThat(target.getNode("node3").getChildren(), hasChildren(segment("node1"), segment("node2"), segment("node3")));
-        assertThat(uuidFor(target.getNode("node3")), is(uuidFor(source.getNode("node3"))));
+        try {
+            // Copy again to get the exception since the UUID is already in the default workspace
+            // graph.copy("/node1/node1").failingIfUuidsMatch().fromWorkspace(workspaceName).to("/newUuids/shouldNotWork");
+            graph.clone("/node1/node1/node1").fromWorkspace(workspaceName).as(name("shouldNotWork")).into("/newUuids").failingIfAnyUuidsMatch();
+            fail("Should not be able to copy a node into a workspace if another node with the "
+                 + "same UUID already exists in the workspace and UUID behavior is failingIfUuidsMatch");
+        } catch (UuidAlreadyExistsException ex) {
+            // Expected
+        }
 
     }
 
     @Test
-    public void shouldNotCopyChildrenBetweenWorkspacesIfUuidConflictAndFailureBehavior() throws Exception {
+    public void shouldCloneChildrenAndRemoveExistingNodesWithSameUuidIfSpecified() throws Exception {
         String defaultWorkspaceName = graph.getCurrentWorkspaceName();
         String workspaceName = "copyChildrenSource";
 
@@ -912,25 +898,56 @@
         boolean batch = true;
         createSubgraph(graph, initialPath, depth, numChildrenPerNode, numPropertiesPerNode, batch, sw, System.out, null);
 
+        Subgraph source = graph.getSubgraphOfDepth(3).at("/node1");
+
         graph.useWorkspace(defaultWorkspaceName);
 
         graph.create("/newUuids");
         // Copy once to get the UUID into the default workspace
-        graph.copy("/node1/node1/node1").failingIfUuidsMatch().fromWorkspace(workspaceName).to("/newUuids/node1");
+        // graph.copy("/node1").replacingExistingNodesWithSameUuids().fromWorkspace(workspaceName).to("/newUuids/node1");
+        graph.clone("/node1").fromWorkspace(workspaceName).as(name("node1")).into("/newUuids").replacingExistingNodesWithSameUuids();
+        
+        // Make sure that the node wasn't moved by the clone
+        graph.useWorkspace(workspaceName);
+        graph.getNodeAt("/node1");
+        graph.useWorkspace(defaultWorkspaceName);
+        
+        // Create a new child node that in the target workspace that has no corresponding node in the source workspace
+        graph.create("/newUuids/node1/shouldBeRemoved");
+        
+        // Copy again to test the behavior now that the UUIDs are already in the default workspace
+        // This should remove /newUuids/node1/shouldBeRemoved
+        // graph.copy("/node1").replacingExistingNodesWithSameUuids().fromWorkspace(workspaceName).to("/newUuids/otherNode");
+        graph.clone("/node1").fromWorkspace(workspaceName).as(name("otherNode")).into("/newUuids").replacingExistingNodesWithSameUuids();
 
+        /*
+         * Focus on testing node structure, since shouldCopyNodeWithChildren tests that properties get copied
+         */
+        // /newUuids/node1 should have been removed when the new node was added with the same UUID
+        assertThat(graph.getNodeAt("/newUuids").getChildren(), hasChildren(segment("otherNode")));
+
         try {
-            // Copy again to get the exception since the UUID is already in the default workspace
-            graph.copy("/node1/node1").failingIfUuidsMatch().fromWorkspace(workspaceName).to("/newUuids/shouldNotWork");
-            fail("Should not be able to copy a node into a workspace if another node with the "
-                 + "same UUID already exists in the workspace and UUID behavior is failingIfUuidsMatch");
-        } catch (UuidAlreadyExistsException ex) {
+            graph.getNodeAt("/newUuids/node1/shouldBeRemoved");
+            fail("/newUuids/node1/shouldBeRemoved should no longer exist after the copy-with-remove-conflicting-uuids operation");
+        }
+        catch (PathNotFoundException pnfe) {
             // Expected
         }
-
+        
+        Subgraph target = graph.getSubgraphOfDepth(3).at("/newUuids/otherNode");
+        assertThat(target, is(notNullValue()));
+        assertThat(target.getNode(".").getChildren(), hasChildren(segment("node1"), segment("node2"), segment("node3")));
+        assertThat(uuidFor(target.getNode(".")), is(uuidFor(source.getNode("."))));
+        assertThat(target.getNode("node1").getChildren(), hasChildren(segment("node1"), segment("node2"), segment("node3")));
+        assertThat(uuidFor(target.getNode("node1")), is(uuidFor(source.getNode("node1"))));
+        assertThat(target.getNode("node2").getChildren(), hasChildren(segment("node1"), segment("node2"), segment("node3")));
+        assertThat(uuidFor(target.getNode("node2")), is(uuidFor(source.getNode("node2"))));
+        assertThat(target.getNode("node3").getChildren(), hasChildren(segment("node1"), segment("node2"), segment("node3")));
+        assertThat(uuidFor(target.getNode("node3")), is(uuidFor(source.getNode("node3"))));
     }
 
     @Test
-    public void shouldCopyChildrenBetweenWorkspacesAndRemoveExistingNodesWithSameUuidIfSpecified() throws Exception {
+    public void shouldCloneNodeIntoExactLocationIfSpecified() throws Exception {
         String defaultWorkspaceName = graph.getCurrentWorkspaceName();
         String workspaceName = "copyChildrenSource";
 
@@ -949,32 +966,27 @@
 
         graph.useWorkspace(defaultWorkspaceName);
 
-        graph.create("/newUuids");
+        graph.create("/segmentTestUuids");
         // Copy once to get the UUID into the default workspace
-        graph.copy("/node1").replacingExistingNodesWithSameUuids().fromWorkspace(workspaceName).to("/newUuids/node1");
+        graph.clone("/node1").fromWorkspace(workspaceName).as(name("node1")).into("/segmentTestUuids").failingIfAnyUuidsMatch();
         
         // Create a new child node that in the target workspace that has no corresponding node in the source workspace
-        graph.create("/newUuids/node1/shouldBeRemoved");
-        
+        PropertyFactory propFactory = context.getPropertyFactory();
+        graph.create("/segmentTestUuids/node1", propFactory.create(name("identifier"), "backup copy"));
+
         // Copy again to test the behavior now that the UUIDs are already in the default workspace
         // This should remove /newUuids/node1/shouldBeRemoved
-        graph.copy("/node1").replacingExistingNodesWithSameUuids().fromWorkspace(workspaceName).to("/newUuids/otherNode");
+        graph.clone("/node1").fromWorkspace(workspaceName).as(segment("node1[1]")).into("/segmentTestUuids").replacingExistingNodesWithSameUuids();
 
         /*
          * Focus on testing node structure, since shouldCopyNodeWithChildren tests that properties get copied
          */
         // /newUuids/node1 should have been removed when the new node was added with the same UUID
-        assertThat(graph.getNodeAt("/newUuids").getChildren(), hasChildren(segment("otherNode")));
-
-        try {
-            graph.getNodeAt("/newUuids/node1/shouldBeRemoved");
-            fail("/newUuids/node1/shouldBeRemoved should no longer exist after the copy-with-remove-conflicting-uuids operation");
-        }
-        catch (PathNotFoundException pnfe) {
-            // Expected
-        }
+        assertThat(graph.getNodeAt("/segmentTestUuids").getChildren(), hasChildren(segment("node1"), segment("node1[2]")));
+        assertThat(graph.getNodeAt("/segmentTestUuids/node1[1]").getProperty("identifier"), is(nullValue()));
+        assertThat(graph.getNodeAt("/segmentTestUuids/node1[2]").getProperty("identifier").getFirstValue().toString(), is("backup copy"));
         
-        Subgraph target = graph.getSubgraphOfDepth(3).at("/newUuids/otherNode");
+        Subgraph target = graph.getSubgraphOfDepth(3).at("/segmentTestUuids/node1[1]");
         assertThat(target, is(notNullValue()));
         assertThat(target.getNode(".").getChildren(), hasChildren(segment("node1"), segment("node2"), segment("node3")));
         assertThat(uuidFor(target.getNode(".")), is(uuidFor(source.getNode("."))));
@@ -985,7 +997,15 @@
         assertThat(target.getNode("node3").getChildren(), hasChildren(segment("node1"), segment("node2"), segment("node3")));
         assertThat(uuidFor(target.getNode("node3")), is(uuidFor(source.getNode("node3"))));
     }
-    
+
+    protected void tryCreatingAWorkspaceNamed( String workspaceName ) {
+        try {
+            graph.createWorkspace().named(workspaceName);
+        } catch (Exception ex) {
+            assumeNoException(ex);
+        }
+    }
+
     private UUID uuidFor( Node node ) {
         return (UUID)node.getProperty(DnaLexicon.UUID).getFirstValue();
     }

Modified: trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/AbstractJcrNode.java
===================================================================
--- trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/AbstractJcrNode.java	2009-06-27 02:54:06 UTC (rev 1065)
+++ trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/AbstractJcrNode.java	2009-06-28 00:33:32 UTC (rev 1066)
@@ -717,8 +717,7 @@
                 JcrNodeDefinition match = this.cache.nodeTypes().findChildNodeDefinition(mixinCandidateType.getInternalName(),
                                                                                          Collections.<Name>emptyList(),
                                                                                          nodeName,
-                                                                                         childNode.getPrimaryNodeType()
-                                                                                                  .getInternalName(),
+                                                                                         childNode.getPrimaryNodeType().getInternalName(),
                                                                                          snsCount,
                                                                                          false);
 
@@ -1408,7 +1407,6 @@
      * 
      * @see javax.jcr.Node#update(java.lang.String)
      */
-    @SuppressWarnings( "unused" )
     public final void update( String srcWorkspaceName ) throws NoSuchWorkspaceException, RepositoryException {
         CheckArg.isNotNull(srcWorkspaceName, "workspace name");
 
@@ -1424,7 +1422,10 @@
             return;
         }
 
-        if (true) throw new UnsupportedOperationException();
+        // Need to force remove in case this node is not referenceable
+        this.session().workspace().clone(srcWorkspaceName, correspondingPath, path(), true, true);
+
+        session().refresh(false);
     }
 
     /**

Modified: trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/JcrWorkspace.java
===================================================================
--- trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/JcrWorkspace.java	2009-06-27 02:54:06 UTC (rev 1065)
+++ trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/JcrWorkspace.java	2009-06-28 00:33:32 UTC (rev 1066)
@@ -304,6 +304,17 @@
             throw new AccessDeniedException(ace);
         }
 
+        clone(srcWorkspace, srcPath, destPath, removeExisting, false);
+    }
+
+    void clone( String srcWorkspace,
+                Path srcPath,
+                Path destPath,
+                boolean removeExisting,
+                boolean destPathIncludesSegment )
+        throws ConstraintViolationException, VersionException, AccessDeniedException, PathNotFoundException, ItemExistsException,
+        LockException, RepositoryException {
+
         /*
          * Make sure that the node has a definition at the new location
          */
@@ -332,6 +343,7 @@
             primaryTypeProp = props.get(JcrLexicon.PRIMARY_TYPE);
             uuidProp = props.get(DnaLexicon.UUID);
         } catch (org.jboss.dna.graph.property.PathNotFoundException pnfe) {
+            String srcAbsPath = srcPath.getString(this.context.getNamespaceRegistry());
             throw new PathNotFoundException(JcrI18n.itemNotFoundAtPath.text(srcAbsPath, srcWorkspace));
         } finally {
             graph.useWorkspace(this.name);
@@ -391,12 +403,19 @@
                 }
             }
 
-            // Perform the copy operation, but use the "to" form (not the "into", which takes the parent) ...
-            graph.copy(srcPath).replacingExistingNodesWithSameUuids().fromWorkspace(srcWorkspace).to(destPath);
+            if (destPathIncludesSegment) {
+                graph.clone(srcPath).fromWorkspace(srcWorkspace).as(destPath.getLastSegment()).into(destPath.getParent()).replacingExistingNodesWithSameUuids();
+            } else {
+                graph.clone(srcPath).fromWorkspace(srcWorkspace).as(newNodeName).into(destPath.getParent()).replacingExistingNodesWithSameUuids();
+            }
         } else {
             try {
-                // Perform the copy operation, but use the "to" form (not the "into", which takes the parent) ...
-                graph.copy(srcPath).failingIfUuidsMatch().fromWorkspace(srcWorkspace).to(destPath);
+                if (destPathIncludesSegment) {
+                    graph.clone(srcPath).fromWorkspace(srcWorkspace).as(destPath.getLastSegment()).into(destPath.getParent()).replacingExistingNodesWithSameUuids();
+                } else {
+                    graph.clone(srcPath).fromWorkspace(srcWorkspace).as(newNodeName).into(destPath.getParent()).failingIfAnyUuidsMatch();
+                }
+
             } catch (UuidAlreadyExistsException uaee) {
                 throw new ItemExistsException(uaee.getMessage());
             }

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	2009-06-27 02:54:06 UTC (rev 1065)
+++ trunk/dna-jcr/src/test/java/org/jboss/dna/jcr/JcrTckTest.java	2009-06-28 00:33:32 UTC (rev 1066)
@@ -37,6 +37,7 @@
 import org.apache.jackrabbit.test.api.NodeItemIsNewTest;
 import org.apache.jackrabbit.test.api.NodeOrderableChildNodesTest;
 import org.apache.jackrabbit.test.api.NodeRemoveMixinTest;
+import org.apache.jackrabbit.test.api.NodeTest;
 import org.apache.jackrabbit.test.api.PropertyItemIsModifiedTest;
 import org.apache.jackrabbit.test.api.PropertyItemIsNewTest;
 import org.apache.jackrabbit.test.api.PropertyTest;
@@ -178,7 +179,7 @@
             // addTestSuite(ReferencesTest.class);
             addTestSuite(SessionTest.class);
             // addTestSuite(SessionUUIDTest.class);
-            // addTestSuite(NodeTest.class);
+            addTestSuite(NodeTest.class);
             // addTestSuite(NodeUUIDTest.class);
             addTestSuite(NodeOrderableChildNodesTest.class);
             addTestSuite(PropertyTest.class);

Modified: trunk/extensions/dna-connector-federation/src/main/java/org/jboss/dna/connector/federation/FederatingRequestProcessor.java
===================================================================
--- trunk/extensions/dna-connector-federation/src/main/java/org/jboss/dna/connector/federation/FederatingRequestProcessor.java	2009-06-27 02:54:06 UTC (rev 1065)
+++ trunk/extensions/dna-connector-federation/src/main/java/org/jboss/dna/connector/federation/FederatingRequestProcessor.java	2009-06-28 00:33:32 UTC (rev 1066)
@@ -62,6 +62,7 @@
 import org.jboss.dna.graph.property.Property;
 import org.jboss.dna.graph.property.PropertyFactory;
 import org.jboss.dna.graph.request.ChangeRequest;
+import org.jboss.dna.graph.request.CloneBranchRequest;
 import org.jboss.dna.graph.request.CloneWorkspaceRequest;
 import org.jboss.dna.graph.request.CompositeRequest;
 import org.jboss.dna.graph.request.CopyBranchRequest;
@@ -324,8 +325,8 @@
         }
 
         // Delete in the cache ...
-        DeleteBranchRequest cacheRequest = new DeleteBranchRequest(request.at(), workspace.getCacheProjection()
-                                                                                          .getWorkspaceName());
+        DeleteBranchRequest cacheRequest = new DeleteBranchRequest(request.at(),
+                                                                   workspace.getCacheProjection().getWorkspaceName());
         executeInCache(cacheRequest, workspace);
     }
 
@@ -367,8 +368,7 @@
         Location intoLocation = Location.create(intoProjection.pathInSource);
         String workspaceName = fromProjection.projection.getWorkspaceName();
         CopyBranchRequest sourceRequest = new CopyBranchRequest(fromLocation, workspaceName, intoLocation, workspaceName,
-                                                                request.desiredName(), request.nodeConflictBehavior(),
-                                                                request.uuidConflictBehavior());
+                                                                request.desiredName(), request.nodeConflictBehavior());
         execute(sourceRequest, fromProjection.projection);
 
         // Copy/transform the results ...
@@ -380,14 +380,70 @@
         }
 
         // Delete from the cache the parent of the new location ...
-        DeleteBranchRequest cacheRequest = new DeleteBranchRequest(request.into(), fromWorkspace.getCacheProjection()
-                                                                                                .getWorkspaceName());
+        DeleteBranchRequest cacheRequest = new DeleteBranchRequest(request.into(),
+                                                                   fromWorkspace.getCacheProjection().getWorkspaceName());
         executeInCache(cacheRequest, fromWorkspace);
     }
 
     /**
      * {@inheritDoc}
      * 
+     * @see org.jboss.dna.graph.request.processor.RequestProcessor#process(org.jboss.dna.graph.request.CloneBranchRequest)
+     */
+    @Override
+    public void process( CloneBranchRequest request ) {
+        FederatedWorkspace fromWorkspace = getWorkspace(request, request.fromWorkspace());
+        if (fromWorkspace == null) return;
+        FederatedWorkspace intoWorkspace = getWorkspace(request, request.intoWorkspace());
+        if (intoWorkspace == null) return;
+        if (!fromWorkspace.equals(intoWorkspace)) {
+            // Otherwise there wasn't a single projection with a single path ...
+            String msg = FederationI18n.unableToPerformOperationSpanningWorkspaces.text(fromWorkspace.getName(),
+                                                                                        intoWorkspace.getName());
+            request.setError(new UnsupportedRequestException(msg));
+        }
+
+        // Can push this down if and only if the entire request is within a single federated source ...
+        SingleProjection fromProjection = asSingleProjection(fromWorkspace, request.from(), request);
+        if (fromProjection == null) return;
+        SingleProjection intoProjection = asSingleProjection(intoWorkspace, request.into(), request);
+        if (intoProjection == null) return;
+        if (!intoProjection.projection.equals(fromProjection.projection)) {
+            // Otherwise there wasn't a single projection with a single path ...
+            String msg = FederationI18n.unableToPerformOperationUnlessLocationsAreFromSingleProjection.text(request.from(),
+                                                                                                            request.into(),
+                                                                                                            fromWorkspace.getName(),
+                                                                                                            fromProjection.projection.getRules(),
+                                                                                                            intoProjection.projection.getRules());
+            request.setError(new UnsupportedRequestException(msg));
+        }
+
+        // Push down the request ...
+        Location fromLocation = Location.create(fromProjection.pathInSource);
+        Location intoLocation = Location.create(intoProjection.pathInSource);
+        String workspaceName = fromProjection.projection.getWorkspaceName();
+        CloneBranchRequest sourceRequest = new CloneBranchRequest(fromLocation, workspaceName, intoLocation, workspaceName,
+                                                                  request.desiredName(), request.desiredSegment(),
+                                                                  request.removeExisting());
+        execute(sourceRequest, fromProjection.projection);
+
+        // Copy/transform the results ...
+        if (sourceRequest.hasError()) {
+            request.setError(sourceRequest.getError());
+        } else {
+            request.setActualLocations(fromProjection.convertToRepository(sourceRequest.getActualLocationBefore()),
+                                       intoProjection.convertToRepository(sourceRequest.getActualLocationAfter()));
+        }
+
+        // Delete from the cache the parent of the new location ...
+        DeleteBranchRequest cacheRequest = new DeleteBranchRequest(request.into(),
+                                                                   fromWorkspace.getCacheProjection().getWorkspaceName());
+        executeInCache(cacheRequest, fromWorkspace);
+    }
+
+    /**
+     * {@inheritDoc}
+     * 
      * @see org.jboss.dna.graph.request.processor.RequestProcessor#process(org.jboss.dna.graph.request.MoveBranchRequest)
      */
     @Override
@@ -411,14 +467,13 @@
         }
         SingleProjection beforeProjection = request.before() != null ? asSingleProjection(workspace, request.before(), request) : null;
 
-        
         // Push down the request ...
         Location fromLocation = Location.create(fromProjection.pathInSource);
         Location intoLocation = Location.create(intoProjection.pathInSource);
         Location beforeLocation = beforeProjection != null ? Location.create(beforeProjection.pathInSource) : null;
         String workspaceName = fromProjection.projection.getWorkspaceName();
-        MoveBranchRequest sourceRequest = new MoveBranchRequest(fromLocation, intoLocation, beforeLocation, workspaceName, request.desiredName(),
-                                                                request.conflictBehavior());
+        MoveBranchRequest sourceRequest = new MoveBranchRequest(fromLocation, intoLocation, beforeLocation, workspaceName,
+                                                                request.desiredName(), request.conflictBehavior());
         execute(sourceRequest, fromProjection.projection);
 
         // Copy/transform the results ...
@@ -429,8 +484,8 @@
                                        intoProjection.convertToRepository(sourceRequest.getActualLocationAfter()));
         }
         // Delete from the cache ...
-        DeleteBranchRequest cacheRequest = new DeleteBranchRequest(request.from(), workspace.getCacheProjection()
-                                                                                            .getWorkspaceName());
+        DeleteBranchRequest cacheRequest = new DeleteBranchRequest(request.from(),
+                                                                   workspace.getCacheProjection().getWorkspaceName());
         executeInCache(cacheRequest, workspace);
         // Mark the new parent node as being expired ...
         cacheRequest = new DeleteBranchRequest(request.into(), workspace.getCacheProjection().getWorkspaceName());
@@ -465,8 +520,8 @@
         }
 
         // Update the cache ...
-        UpdatePropertiesRequest cacheRequest = new UpdatePropertiesRequest(request.on(), workspace.getCacheProjection()
-                                                                                                  .getWorkspaceName(),
+        UpdatePropertiesRequest cacheRequest = new UpdatePropertiesRequest(request.on(),
+                                                                           workspace.getCacheProjection().getWorkspaceName(),
                                                                            request.properties());
         executeInCache(cacheRequest, workspace);
     }
@@ -1151,9 +1206,9 @@
                              readable(registry, create.properties()));
             } else if (request instanceof UpdatePropertiesRequest) {
                 UpdatePropertiesRequest update = (UpdatePropertiesRequest)request;
-                logger.trace("  updating {0} with properties {1}", update.on().getString(registry), readable(registry,
-                                                                                                             update.properties()
-                                                                                                                   .values()));
+                logger.trace("  updating {0} with properties {1}",
+                             update.on().getString(registry),
+                             readable(registry, update.properties().values()));
             } else {
                 logger.trace("  " + request.toString());
             }
@@ -1172,9 +1227,9 @@
                          readable(registry, create.properties()));
         } else if (request instanceof UpdatePropertiesRequest) {
             UpdatePropertiesRequest update = (UpdatePropertiesRequest)request;
-            logger.trace("  updating {0} with properties {1}", update.on().getString(registry), readable(registry,
-                                                                                                         update.properties()
-                                                                                                               .values()));
+            logger.trace("  updating {0} with properties {1}",
+                         update.on().getString(registry),
+                         readable(registry, update.properties().values()));
         } else {
             logger.trace("  " + request.toString());
         }

Modified: trunk/extensions/dna-connector-filesystem/src/main/java/org/jboss/dna/connector/filesystem/FileSystemRequestProcessor.java
===================================================================
--- trunk/extensions/dna-connector-filesystem/src/main/java/org/jboss/dna/connector/filesystem/FileSystemRequestProcessor.java	2009-06-27 02:54:06 UTC (rev 1065)
+++ trunk/extensions/dna-connector-filesystem/src/main/java/org/jboss/dna/connector/filesystem/FileSystemRequestProcessor.java	2009-06-28 00:33:32 UTC (rev 1066)
@@ -47,6 +47,7 @@
 import org.jboss.dna.graph.property.PathFactory;
 import org.jboss.dna.graph.property.PathNotFoundException;
 import org.jboss.dna.graph.property.PropertyFactory;
+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;
@@ -283,6 +284,16 @@
     /**
      * {@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

Modified: trunk/extensions/dna-connector-jdbc-metadata/src/main/java/org/jboss/dna/connector/jdbc/JdbcRequestProcesor.java
===================================================================
--- trunk/extensions/dna-connector-jdbc-metadata/src/main/java/org/jboss/dna/connector/jdbc/JdbcRequestProcesor.java	2009-06-27 02:54:06 UTC (rev 1065)
+++ trunk/extensions/dna-connector-jdbc-metadata/src/main/java/org/jboss/dna/connector/jdbc/JdbcRequestProcesor.java	2009-06-28 00:33:32 UTC (rev 1066)
@@ -28,6 +28,7 @@
 import org.jboss.dna.common.util.Logger;
 import org.jboss.dna.graph.ExecutionContext;
 import org.jboss.dna.graph.property.DateTime;
+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;
@@ -100,6 +101,15 @@
     /**
      * {@inheritDoc}
      * 
+     * @see org.jboss.dna.graph.request.processor.RequestProcessor#process(org.jboss.dna.graph.request.CloneBranchRequest)
+     */
+    @Override
+    public void process( CloneBranchRequest request ) {
+    }
+
+    /**
+     * {@inheritDoc}
+     * 
      * @see org.jboss.dna.graph.request.processor.RequestProcessor#process(org.jboss.dna.graph.request.CreateNodeRequest)
      */
     @Override

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	2009-06-27 02:54:06 UTC (rev 1065)
+++ trunk/extensions/dna-connector-store-jpa/src/main/java/org/jboss/dna/connector/store/jpa/model/basic/BasicRequestProcessor.java	2009-06-28 00:33:32 UTC (rev 1066)
@@ -82,6 +82,7 @@
 import org.jboss.dna.graph.property.ValueFactories;
 import org.jboss.dna.graph.property.ValueFactory;
 import org.jboss.dna.graph.property.ValueFormatException;
+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;
@@ -102,7 +103,6 @@
 import org.jboss.dna.graph.request.ReadPropertyRequest;
 import org.jboss.dna.graph.request.Request;
 import org.jboss.dna.graph.request.UpdatePropertiesRequest;
-import org.jboss.dna.graph.request.UuidConflictBehavior;
 import org.jboss.dna.graph.request.VerifyWorkspaceRequest;
 import org.jboss.dna.graph.request.processor.RequestProcessor;
 
@@ -132,6 +132,12 @@
     protected final boolean enforceReferentialIntegrity;
     private final Set<Long> workspaceIdsWithChangedReferences = new HashSet<Long>();
 
+    private enum UuidConflictBehavior {
+        ALWAYS_CREATE_NEW_UUID,
+        REPLACE_EXISTING_NODE,
+        THROW_EXCEPTION
+    }
+    
     /**
      * @param sourceName
      * @param context
@@ -1215,7 +1221,7 @@
                                                      intoWorkspace,
                                                      original,
                                                      actualNewParent,
-                                                     request.uuidConflictBehavior(),
+                                                     UuidConflictBehavior.ALWAYS_CREATE_NEW_UUID,
                                                      desiredName,
                                                      originalToNewUuid,
                                                      addedLocations,
@@ -1236,7 +1242,7 @@
                                   intoWorkspace,
                                   original,
                                   actualNewParent,
-                                  request.uuidConflictBehavior(),
+                                  UuidConflictBehavior.ALWAYS_CREATE_NEW_UUID,
                                   desiredName,
                                   originalToNewUuid,
                                   addedLocations,
@@ -1336,8 +1342,202 @@
                     entities.persist(copy);
                 }
                 entities.flush();
+            } finally {
+                // Close and release the temporary data used for this operation ...
+                query.close();
+            }
 
-                if (request.uuidConflictBehavior() == UuidConflictBehavior.REPLACE_EXISTING_NODE) {
+        } catch (Throwable e) { // Includes PathNotFoundException
+            request.setError(e);
+            return;
+        }
+        request.setActualLocations(actualFromLocation, actualToLocation);
+        recordChange(request);
+    }
+
+    /**
+     * {@inheritDoc}
+     * 
+     * @see org.jboss.dna.graph.request.processor.RequestProcessor#process(org.jboss.dna.graph.request.CloneBranchRequest)
+     */
+    @Override
+    public void process( CloneBranchRequest request ) {
+        logger.trace(request.toString());
+        Location actualFromLocation = null;
+        Location actualToLocation = null;
+        try {
+            // Find the workspaces ...
+            WorkspaceEntity fromWorkspace = getExistingWorkspace(request.fromWorkspace(), request);
+            if (fromWorkspace == null) return;
+            WorkspaceEntity intoWorkspace = getExistingWorkspace(request.intoWorkspace(), request);
+            if (intoWorkspace == null) return;
+            Long fromWorkspaceId = fromWorkspace.getId();
+            Long intoWorkspaceId = intoWorkspace.getId();
+            assert fromWorkspaceId != null;
+            assert intoWorkspaceId != null;
+
+            Location fromLocation = request.from();
+            ActualLocation actualFrom = getActualLocation(fromWorkspace, fromLocation);
+            actualFromLocation = actualFrom.location;
+            Path fromPath = actualFromLocation.getPath();
+
+            Location newParentLocation = request.into();
+            ActualLocation actualNewParent = getActualLocation(intoWorkspace, newParentLocation);
+            assert actualNewParent != null;
+
+            // Create a map that we'll use to record the new UUID for each of the original nodes ...
+            Map<String, String> originalToNewUuid = new HashMap<String, String>();
+
+            // Compute the subgraph, including the top node in the subgraph ...
+            SubgraphQuery query = SubgraphQuery.create(getExecutionContext(),
+                                                       entities,
+                                                       fromWorkspaceId,
+                                                       actualFromLocation.getUuid(),
+                                                       fromPath,
+                                                       0);
+
+            UuidConflictBehavior conflictBehavior = request.removeExisting() ? UuidConflictBehavior.REPLACE_EXISTING_NODE : UuidConflictBehavior.THROW_EXCEPTION;
+            try {
+                // Walk through the original nodes, creating new ChildEntity object (i.e., copy) for each original ...
+                List<ChildEntity> originalNodes = query.getNodes(true, true);
+                Iterator<ChildEntity> originalIter = originalNodes.iterator();
+                Map<String, ChildEntity> addedLocations = new HashMap<String, ChildEntity>();
+                Map<String, Location> deletedLocations = new HashMap<String, Location>();
+
+                // Start with the original (top-level) node first, since we need to add it to the list of children ...
+                if (originalIter.hasNext()) {
+                    ChildEntity original = originalIter.next();
+
+                    Name desiredName = request.desiredName();
+                    if (desiredName == null) desiredName = fromPath.getLastSegment().getName();
+                    actualToLocation = this.copyNode(entities,
+                                                     fromWorkspace,
+                                                     intoWorkspace,
+                                                     original,
+                                                     actualNewParent,
+                                                     conflictBehavior,
+                                                     desiredName,
+                                                     originalToNewUuid,
+                                                     addedLocations,
+                                                     deletedLocations).location;
+                }
+
+                // Now create copies of all children in the subgraph.
+                while (originalIter.hasNext()) {
+                    ChildEntity original = originalIter.next();
+                    String newParentUuidOfCopy = originalToNewUuid.get(original.getParentUuidString());
+                    assert newParentUuidOfCopy != null;
+
+                    actualNewParent = getActualLocation(intoWorkspace, Location.create(UUID.fromString(newParentUuidOfCopy)));
+
+                    Name desiredName = nameFactory.create(original.getChildNamespace().getUri(), original.getChildName());
+                    this.copyNode(entities,
+                                  fromWorkspace,
+                                  intoWorkspace,
+                                  original,
+                                  actualNewParent,
+                                  conflictBehavior,
+                                  desiredName,
+                                  originalToNewUuid,
+                                  addedLocations,
+                                  deletedLocations);
+                }
+                entities.flush();
+
+                Set<String> newNodesWithReferenceProperties = new HashSet<String>();
+                // Now create copies of all the intra-subgraph references, replacing the UUIDs on both ends ...
+                for (ReferenceEntity reference : query.getInternalReferences()) {
+                    String newFromUuid = originalToNewUuid.get(reference.getId().getFromUuidString());
+                    assert newFromUuid != null;
+                    String newToUuid = originalToNewUuid.get(reference.getId().getToUuidString());
+                    assert newToUuid != null;
+                    ReferenceEntity copy = new ReferenceEntity(new ReferenceId(intoWorkspaceId, newFromUuid, newToUuid));
+                    entities.persist(copy);
+                    newNodesWithReferenceProperties.add(newFromUuid);
+                }
+
+                // Now create copies of all the references owned by the subgraph but pointing to non-subgraph nodes,
+                // so we only replaced the 'from' UUID ...
+                for (ReferenceEntity reference : query.getOutwardReferences()) {
+                    String oldToUuid = reference.getId().getToUuidString();
+                    String newFromUuid = originalToNewUuid.get(reference.getId().getFromUuidString());
+                    assert newFromUuid != null;
+
+                    ActualLocation refTargetLocation = getActualLocation(intoWorkspace,
+                                                                         Location.create(UUID.fromString(oldToUuid)));
+                    if (refTargetLocation == null) {
+                        // Some of the references that remain will be invalid, since they point to nodes that
+                        // have just been deleted. Build up the information necessary to produce a useful exception ...
+                        ValueFactory<Reference> refFactory = getExecutionContext().getValueFactories().getReferenceFactory();
+                        Map<Location, List<Reference>> invalidRefs = new HashMap<Location, List<Reference>>();
+                        UUID fromUuid = UUID.fromString(reference.getId().getFromUuidString());
+                        ActualLocation actualRefFromLocation = getActualLocation(intoWorkspace, Location.create(fromUuid));
+                        Location refFromLocation = actualRefFromLocation.location;
+                        List<Reference> refs = invalidRefs.get(fromLocation);
+                        if (refs == null) {
+                            refs = new ArrayList<Reference>();
+                            invalidRefs.put(refFromLocation, refs);
+                        }
+                        UUID toUuid = UUID.fromString(oldToUuid);
+                        refs.add(refFactory.create(toUuid));
+
+                        String msg = JpaConnectorI18n.invalidReferences.text(reference.getId().getFromUuidString());
+                        throw new ReferentialIntegrityException(invalidRefs, msg);
+                    }
+
+                    ReferenceEntity copy = new ReferenceEntity(new ReferenceId(intoWorkspaceId, newFromUuid, oldToUuid));
+                    entities.persist(copy);
+                    newNodesWithReferenceProperties.add(newFromUuid);
+                }
+
+                Set<PropertiesEntity> addedProps = new HashSet<PropertiesEntity>();
+                // Now process the properties, creating a copy (note references are not changed) ...
+                for (PropertiesEntity original : query.getProperties(true, true)) {
+                    // Find the UUID of the copy ...
+                    String copyUuid = originalToNewUuid.get(original.getId().getUuidString());
+                    assert copyUuid != null;
+
+                    // Create the copy ...
+                    boolean compressed = original.isCompressed();
+                    byte[] originalData = original.getData();
+                    NodeId propertiesId = new NodeId(intoWorkspaceId, copyUuid);
+                    PropertiesEntity copy = entities.find(PropertiesEntity.class, propertiesId);
+
+                    if (copy == null) {
+                        copy = new PropertiesEntity(propertiesId);
+                    }
+                    copy.setCompressed(compressed);
+                    if (newNodesWithReferenceProperties.contains(copyUuid)) {
+
+                        // This node has internal or outward references that must be adjusted ...
+                        ByteArrayOutputStream baos = new ByteArrayOutputStream();
+                        OutputStream os = compressed ? new GZIPOutputStream(baos) : baos;
+                        ObjectOutputStream oos = new ObjectOutputStream(os);
+                        ByteArrayInputStream bais = new ByteArrayInputStream(originalData);
+                        InputStream is = compressed ? new GZIPInputStream(bais) : bais;
+                        ObjectInputStream ois = new ObjectInputStream(is);
+                        try {
+                            serializer.adjustReferenceProperties(ois, oos, originalToNewUuid);
+                        } finally {
+                            try {
+                                ois.close();
+                            } finally {
+                                oos.close();
+                            }
+                        }
+                        copy.setData(baos.toByteArray());
+                    } else {
+                        // No references to adjust, so just copy the original data ...
+                        copy.setData(originalData);
+                    }
+                    copy.setPropertyCount(original.getPropertyCount());
+                    copy.setReferentialIntegrityEnforced(original.isReferentialIntegrityEnforced());
+                    addedProps.add(copy);
+                    entities.persist(copy);
+                }
+                entities.flush();
+
+                if (request.removeExisting()) {
                     /*
                     * We may have deleted some old copies of nodes and replaced them with new copies.
                     * Now we need to clean up any nodes that were descendants of the old copies of the

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	2009-06-27 02:54:06 UTC (rev 1065)
+++ trunk/extensions/dna-connector-store-jpa/src/test/java/org/jboss/dna/connector/store/jpa/JpaConnectorWritingTest.java	2009-06-28 00:33:32 UTC (rev 1066)
@@ -92,7 +92,8 @@
 
         graph.create("/newUuids");
         // Copy once to get the UUID into the default workspace
-        graph.copy("/node1").replacingExistingNodesWithSameUuids().fromWorkspace(workspaceName).to("/newUuids/node1");
+        //graph.copy("/node1").replacingExistingNodesWithSameUuids().fromWorkspace(workspaceName).to("/newUuids/node1");
+        graph.clone("/node1").fromWorkspace(workspaceName).as(name("node1")).into("/newUuids").replacingExistingNodesWithSameUuids();
 
         // Create a new child node that in the target workspace that has no corresponding node in the source workspace
         graph.create("/newUuids/node1/shouldBeRemoved");
@@ -104,6 +105,7 @@
         // Copy again to test the behavior now that the UUIDs are already in the default workspace
         // This should fail because /newUuids/node1/shouldBeRemoved must be removed by the copy, but can't be removed
         // because there is a reference to it.
-        graph.copy("/node1").replacingExistingNodesWithSameUuids().fromWorkspace(workspaceName).to("/newUuids/otherNode");
+        //graph.copy("/node1").replacingExistingNodesWithSameUuids().fromWorkspace(workspaceName).to("/newUuids/otherNode");
+        graph.clone("/node1").fromWorkspace(workspaceName).as(name("otherNode")).into("/newUuids").replacingExistingNodesWithSameUuids();
     }
 }

Modified: 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	2009-06-27 02:54:06 UTC (rev 1065)
+++ trunk/extensions/dna-connector-svn/src/main/java/org/jboss/dna/connector/svn/SVNRepositoryRequestProcessor.java	2009-06-28 00:33:32 UTC (rev 1066)
@@ -50,6 +50,7 @@
 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;
@@ -346,6 +347,16 @@
     /**
      * {@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



From dna-commits at lists.jboss.org  Sat Jun 27 22:14:25 2009
From: dna-commits at lists.jboss.org (dna-commits at lists.jboss.org)
Date: Sat, 27 Jun 2009 22:14:25 -0400
Subject: [dna-commits] DNA SVN: r1067 - in trunk/dna-jcr/src:
	test/java/org/jboss/dna/jcr and 1 other directories.
Message-ID: <200906280214.n5S2EP6i032082@svn01.web.mwc.hst.phx2.redhat.com>

Author: bcarothers
Date: 2009-06-27 22:14:25 -0400 (Sat, 27 Jun 2009)
New Revision: 1067

Modified:
   trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/JcrNamespaceRegistry.java
   trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/JcrNodeTypeManager.java
   trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/JcrRepository.java
   trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/JcrSession.java
   trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/JcrWorkspace.java
   trunk/dna-jcr/src/test/java/org/jboss/dna/jcr/DnaTckTest.java
   trunk/dna-jcr/src/test/java/org/jboss/dna/jcr/JcrNamespaceRegistryTest.java
   trunk/dna-jcr/src/test/java/org/jboss/dna/jcr/JcrRepositoryTest.java
   trunk/dna-jcr/src/test/java/org/jboss/dna/jcr/SessionCacheTest.java
   trunk/dna-jcr/src/test/resources/security/tck_roles.properties
   trunk/dna-jcr/src/test/resources/security/tck_users.properties
Log:
DNA-399 Need to Add Session.checkPermission Calls to Guard Read, Add Node, Set Property, and Remove Item Access

Applied patch that incorporates the feedback-to-date from the forum topic.  An additional "admin" role is added and security checks for permanently registering and unregistering types and namespaces were added that check for this role.  The admin role is a superset of the readwrite role, which is itself a superset of the readonly role.  The pattern for mapping roles was changed to be <role name>[.<repository name>[.<workspace name>]] instead of <role name>[.<workspace name>].  Finally, JcrRepository.login was modified to not allow users to log into workspaces to which they do not have at least readonly access.  JcrWorkspace.getAccessibleWorkspaceNames() was also modified to filter out workspace names to which the user does not have at least readonly access.

Modified: trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/JcrNamespaceRegistry.java
===================================================================
--- trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/JcrNamespaceRegistry.java	2009-06-28 00:33:32 UTC (rev 1066)
+++ trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/JcrNamespaceRegistry.java	2009-06-28 02:14:25 UTC (rev 1067)
@@ -23,6 +23,7 @@
  */
 package org.jboss.dna.jcr;
 
+import java.security.AccessControlException;
 import java.util.Collections;
 import java.util.HashMap;
 import java.util.HashSet;
@@ -39,6 +40,7 @@
 import org.jboss.dna.graph.JcrMixLexicon;
 import org.jboss.dna.graph.JcrNtLexicon;
 import org.jboss.dna.graph.property.NamespaceRegistry;
+import org.jboss.dna.graph.property.Path;
 import org.jboss.dna.graph.property.NamespaceRegistry.Namespace;
 
 /**
@@ -108,17 +110,22 @@
     private final Behavior behavior;
     private final NamespaceRegistry registry;
     private final NamespaceRegistry workspaceRegistry;
+    private final JcrSession session;
 
-    JcrNamespaceRegistry( NamespaceRegistry workspaceRegistry ) {
-        this(Behavior.WORKSPACE, null, workspaceRegistry);
+    JcrNamespaceRegistry( NamespaceRegistry workspaceRegistry,
+                          JcrSession session ) {
+        this(Behavior.WORKSPACE, null, workspaceRegistry, session);
     }
 
     JcrNamespaceRegistry( Behavior behavior,
                           NamespaceRegistry localRegistry,
-                          NamespaceRegistry workspaceRegistry ) {
+                          NamespaceRegistry workspaceRegistry,
+                          JcrSession session ) {
         this.behavior = behavior;
         this.registry = localRegistry != null ? localRegistry : workspaceRegistry;
         this.workspaceRegistry = workspaceRegistry;
+        this.session = session;
+
         // Add the built-ins, ensuring we overwrite any badly-initialized values ...
         for (Map.Entry<String, String> builtIn : STANDARD_BUILT_IN_NAMESPACES_BY_PREFIX.entrySet()) {
             this.registry.register(builtIn.getKey(), builtIn.getValue());
@@ -126,6 +133,7 @@
         assert this.behavior != null;
         assert this.registry != null;
         assert this.workspaceRegistry != null;
+        assert this.session != null;
     }
 
     /**
@@ -272,6 +280,12 @@
                 // JSR-170 & JSR-283 Workspace namespace registry ...
                 // --------------------------------------------------
 
+                try {
+                    session.checkPermission((Path)null, JcrSession.DNA_REGISTER_NAMESPACE_PERMISSION);
+                } catch (AccessControlException ace) {
+                    throw new AccessDeniedException(ace);
+                }
+
                 // Check the zero-length prefix and zero-length URI ...
                 if (DEFAULT_NAMESPACE_PREFIX.equals(prefix) || DEFAULT_NAMESPACE_URI.equals(uri)) {
                     throw new NamespaceException(JcrI18n.unableToChangeTheDefaultNamespace.text());
@@ -319,6 +333,16 @@
     public synchronized void unregisterNamespace( String prefix )
         throws NamespaceException, AccessDeniedException, RepositoryException {
         CheckArg.isNotNull(prefix, "prefix");
+
+        // Don't need to check permissions for transient registration/unregistration
+        if (behavior.equals(Behavior.WORKSPACE)) {
+            try {
+                session.checkPermission((Path)null, JcrSession.DNA_REGISTER_NAMESPACE_PERMISSION);
+            } catch (AccessControlException ace) {
+                throw new AccessDeniedException(ace);
+            }
+        }
+
         // Look to see whether the prefix is registered ...
         String uri = registry.getNamespaceForPrefix(prefix);
         // It is an error to unregister a namespace that is not registered ...

Modified: trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/JcrNodeTypeManager.java
===================================================================
--- trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/JcrNodeTypeManager.java	2009-06-28 00:33:32 UTC (rev 1066)
+++ trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/JcrNodeTypeManager.java	2009-06-28 02:14:25 UTC (rev 1067)
@@ -23,9 +23,11 @@
  */
 package org.jboss.dna.jcr;
 
+import java.security.AccessControlException;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.List;
+import javax.jcr.AccessDeniedException;
 import javax.jcr.PropertyType;
 import javax.jcr.RepositoryException;
 import javax.jcr.UnsupportedRepositoryOperationException;
@@ -40,6 +42,7 @@
 import org.jboss.dna.graph.ExecutionContext;
 import org.jboss.dna.graph.property.Name;
 import org.jboss.dna.graph.property.NameFactory;
+import org.jboss.dna.graph.property.Path;
 import org.jboss.dna.jcr.nodetype.InvalidNodeTypeDefinitionException;
 import org.jboss.dna.jcr.nodetype.NodeDefinitionTemplate;
 import org.jboss.dna.jcr.nodetype.NodeTypeDefinition;
@@ -58,15 +61,19 @@
 @Immutable
 class JcrNodeTypeManager implements NodeTypeManager {
 
-    private final ExecutionContext context;
+    private final JcrSession session;
     private final RepositoryNodeTypeManager repositoryTypeManager;
 
-    JcrNodeTypeManager( ExecutionContext context,
+    JcrNodeTypeManager( JcrSession session,
                         RepositoryNodeTypeManager repositoryTypeManager ) {
-        this.context = context;
+        this.session = session;
         this.repositoryTypeManager = repositoryTypeManager;
     }
 
+    private final ExecutionContext context() {
+        return session.getExecutionContext();
+    }
+
     /**
      * {@inheritDoc}
      * 
@@ -87,7 +94,7 @@
 
         // Need to return a version of the node type with the current context
         for (JcrNodeType type : rawTypes) {
-            types.add(type.with(context));
+            types.add(type.with(context()));
         }
 
         return new JcrNodeTypeIterator(types);
@@ -99,10 +106,10 @@
      * @see javax.jcr.nodetype.NodeTypeManager#getNodeType(java.lang.String)
      */
     public JcrNodeType getNodeType( String nodeTypeName ) throws NoSuchNodeTypeException, RepositoryException {
-        Name ntName = context.getValueFactories().getNameFactory().create(nodeTypeName);
+        Name ntName = context().getValueFactories().getNameFactory().create(nodeTypeName);
         JcrNodeType type = repositoryTypeManager.getNodeType(ntName);
         if (type != null) {
-            type = type.with(context);
+            type = type.with(context());
             return type;
         }
         throw new NoSuchNodeTypeException(JcrI18n.typeNotFound.text(nodeTypeName));
@@ -119,7 +126,7 @@
         JcrNodeType nodeType = repositoryTypeManager.getNodeType(nodeTypeName);
 
         if (nodeType != null) {
-            nodeType = nodeType.with(context);
+            nodeType = nodeType.with(context());
         }
 
         return nodeType;
@@ -136,7 +143,7 @@
 
         // Need to return a version of the node type with the current context
         for (JcrNodeType type : rawTypes) {
-            types.add(type.with(context));
+            types.add(type.with(context()));
         }
 
         return new JcrNodeTypeIterator(types);
@@ -383,12 +390,20 @@
      *         name that already exists
      * @throws UnsupportedRepositoryOperationException if {@code allowUpdate} is true; DNA does not allow updating node types at
      *         this time.
+     * @throws AccessDeniedException if the current session does not have the {@link JcrSession#DNA_REGISTER_TYPE_PERMISSION
+     *         register type permission}.
      * @throws RepositoryException if another error occurs
      */
     public NodeType registerNodeType( NodeTypeDefinition template,
                                       boolean allowUpdate )
         throws InvalidNodeTypeDefinitionException, NodeTypeExistsException, UnsupportedRepositoryOperationException,
-        RepositoryException {
+        AccessDeniedException, RepositoryException {
+
+        try {
+            session.checkPermission((Path)null, JcrSession.DNA_REGISTER_TYPE_PERMISSION);
+        } catch (AccessControlException ace) {
+            throw new AccessDeniedException(ace);
+        }
         return this.repositoryTypeManager.registerNodeType(template, allowUpdate);
     }
 
@@ -407,12 +422,21 @@
      *         specifies a node type name that already exists
      * @throws UnsupportedRepositoryOperationException if {@code allowUpdate} is true; DNA does not allow updating node types at
      *         this time.
+     * @throws AccessDeniedException if the current session does not have the {@link JcrSession#DNA_REGISTER_TYPE_PERMISSION
+     *         register type permission}.
      * @throws RepositoryException if another error occurs
      */
     public NodeTypeIterator registerNodeTypes( Collection<NodeTypeDefinition> templates,
                                                boolean allowUpdates )
         throws InvalidNodeTypeDefinitionException, NodeTypeExistsException, UnsupportedRepositoryOperationException,
-        RepositoryException {
+        AccessDeniedException, RepositoryException {
+
+        try {
+            session.checkPermission((Path)null, JcrSession.DNA_REGISTER_TYPE_PERMISSION);
+        } catch (AccessControlException ace) {
+            throw new AccessDeniedException(ace);
+        }
+
         return new JcrNodeTypeIterator(this.repositoryTypeManager.registerNodeTypes(templates, allowUpdates));
     }
 
@@ -433,8 +457,14 @@
      */
     public void unregisterNodeType( Collection<String> nodeTypeNames )
         throws NoSuchNodeTypeException, InvalidNodeTypeDefinitionException, RepositoryException {
-        NameFactory nameFactory = this.context.getValueFactories().getNameFactory();
+        NameFactory nameFactory = context().getValueFactories().getNameFactory();
 
+        try {
+            session.checkPermission((Path)null, JcrSession.DNA_REGISTER_TYPE_PERMISSION);
+        } catch (AccessControlException ace) {
+            throw new AccessDeniedException(ace);
+        }
+
         Collection<Name> names = new ArrayList<Name>(nodeTypeNames.size());
         for (String name : nodeTypeNames) {
             names.add(nameFactory.create(name));
@@ -451,7 +481,7 @@
      * @throws RepositoryException if another error occurs
      */
     public NodeTypeTemplate createNodeTypeTemplate() throws RepositoryException {
-        return new JcrNodeTypeTemplate(this.context);
+        return new JcrNodeTypeTemplate(context());
     }
 
     /**
@@ -463,7 +493,7 @@
      * @throws RepositoryException if another error occurs
      */
     public NodeDefinitionTemplate createNodeDefinitionTemplate() throws RepositoryException {
-        return new JcrNodeDefinitionTemplate(this.context);
+        return new JcrNodeDefinitionTemplate(context());
     }
 
     /**
@@ -475,6 +505,6 @@
      * @throws RepositoryException if another error occurs
      */
     public PropertyDefinitionTemplate createPropertyDefinitionTemplate() throws RepositoryException {
-        return new JcrPropertyDefinitionTemplate(this.context);
+        return new JcrPropertyDefinitionTemplate(context());
     }
 }

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	2009-06-28 00:33:32 UTC (rev 1066)
+++ trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/JcrRepository.java	2009-06-28 02:14:25 UTC (rev 1067)
@@ -26,6 +26,7 @@
 import java.io.IOException;
 import java.lang.reflect.Method;
 import java.security.AccessControlContext;
+import java.security.AccessControlException;
 import java.security.AccessController;
 import java.util.Collections;
 import java.util.EnumMap;
@@ -428,6 +429,7 @@
                     // Per JCR 1.0 6.1.1, if the workspaceName is not recognized, a NoSuchWorkspaceException is thrown
                     throw new NoSuchWorkspaceException(JcrI18n.workspaceNameIsInvalid.text(sourceName, workspaceName));
                 }
+                
                 graph.useWorkspace(workspaceName);
             } catch (InvalidWorkspaceException e) {
                 throw new NoSuchWorkspaceException(JcrI18n.workspaceNameIsInvalid.text(sourceName, workspaceName), e);
@@ -440,7 +442,17 @@
         // Create the workspace, which will create its own session ...
         sessionAttributes = Collections.unmodifiableMap(sessionAttributes);
         JcrWorkspace workspace = new JcrWorkspace(this, workspaceName, execContext, sessionAttributes);
-        return workspace.getSession();
+        
+        JcrSession session = (JcrSession) workspace.getSession();
+        
+        // Need to make sure that the user has access to this session
+        try {
+            session.checkPermission(workspaceName, null, JcrSession.JCR_READ_PERMISSION);
+        }
+        catch (AccessControlException ace) {
+            throw new NoSuchWorkspaceException(JcrI18n.workspaceNameIsInvalid.text(sourceName, workspaceName));
+        }
+        return session;
     }
 
     /**

Modified: trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/JcrSession.java
===================================================================
--- trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/JcrSession.java	2009-06-28 00:33:32 UTC (rev 1066)
+++ trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/JcrSession.java	2009-06-28 02:14:25 UTC (rev 1067)
@@ -83,7 +83,11 @@
 
     public static final String DNA_READ_PERMISSION = "readonly";
     public static final String DNA_WRITE_PERMISSION = "readwrite";
+    public static final String DNA_ADMIN_PERMISSION = "admin";
 
+    public static final String DNA_REGISTER_NAMESPACE_PERMISSION = "register_namespace";
+    public static final String DNA_REGISTER_TYPE_PERMISSION = "register_type";
+
     public static final String JCR_ADD_NODE_PERMISSION = "add_node";
     public static final String JCR_SET_PROPERTY_PERMISSION = "set_property";
     public static final String JCR_REMOVE_PERMISSION = "remove";
@@ -145,7 +149,7 @@
         NamespaceRegistry workspaceRegistry = workspaceContext.getNamespaceRegistry();
         NamespaceRegistry local = new LocalNamespaceRegistry(workspaceRegistry);
         this.executionContext = workspaceContext.with(local);
-        this.sessionRegistry = new JcrNamespaceRegistry(Behavior.JSR170_SESSION, local, workspaceRegistry);
+        this.sessionRegistry = new JcrNamespaceRegistry(Behavior.JSR170_SESSION, local, workspaceRegistry, this);
         this.rootPath = this.executionContext.getValueFactories().getPathFactory().createRootPath();
 
         // Set up the graph to use for this session (which uses the session's namespace registry and context) ...
@@ -291,10 +295,16 @@
      * Returns whether the authenticated user has the given role.
      * 
      * @param roleName the name of the role to check
+     * @param workspaceName the workspace under which the user must have the role. This may be different from the current
+     *        workspace.
      * @return true if the user has the role and is logged in; false otherwise
      */
-    final boolean hasRole( String roleName ) {
-        return getExecutionContext().getSecurityContext().hasRole(roleName);
+    final boolean hasRole( String roleName,
+                           String workspaceName ) {
+        SecurityContext context = getExecutionContext().getSecurityContext();
+
+        return context.hasRole(roleName) || context.hasRole(roleName + "." + this.repository.getName())
+               || context.hasRole(roleName + "." + this.repository.getName() + "." + workspaceName);
     }
 
     /**
@@ -342,17 +352,19 @@
 
         CheckArg.isNotEmpty(actions, "actions");
 
-        if ("read".equals(actions)) {
-            // readonly access is sufficient
-            if (hasRole(DNA_READ_PERMISSION) || hasRole(DNA_READ_PERMISSION + "." + workspaceName)) {
-                return;
+        boolean hasPermission = true;
+        for (String action : actions.split(",")) {
+            if (JCR_READ_PERMISSION.equals(action)) {
+                hasPermission &= hasRole(DNA_READ_PERMISSION, workspaceName) || hasRole(DNA_WRITE_PERMISSION, workspaceName)
+                                 || hasRole(DNA_ADMIN_PERMISSION, workspaceName);
+            } else if (DNA_REGISTER_NAMESPACE_PERMISSION.equals(action) || DNA_REGISTER_TYPE_PERMISSION.equals(action)) {
+                hasPermission &= hasRole(DNA_ADMIN_PERMISSION, workspaceName);
+            } else {
+                hasPermission &= hasRole(DNA_ADMIN_PERMISSION, workspaceName) || hasRole(DNA_WRITE_PERMISSION, workspaceName);
             }
         }
 
-        // need readwrite access
-        if (hasRole(DNA_WRITE_PERMISSION) || hasRole(DNA_WRITE_PERMISSION + "." + workspaceName)) {
-            return;
-        }
+        if (hasPermission) return;
 
         String pathAsString = path != null ? path.getString(this.namespaces()) : "<unknown>";
         throw new AccessControlException(JcrI18n.permissionDenied.text(pathAsString, actions));

Modified: trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/JcrWorkspace.java
===================================================================
--- trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/JcrWorkspace.java	2009-06-28 00:33:32 UTC (rev 1066)
+++ trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/JcrWorkspace.java	2009-06-28 02:14:25 UTC (rev 1067)
@@ -170,9 +170,6 @@
                                                                                                        uriProperty, namespaceType);
         this.context = context.with(persistentRegistry);
 
-        // Set up and initialize the persistent JCR namespace registry ...
-        this.workspaceRegistry = new JcrNamespaceRegistry(persistentRegistry);
-
         // Now create a graph with this new execution context ...
         this.graph = Graph.create(this.repository.getRepositorySourceName(), this.repository.getConnectionFactory(), this.context);
         this.graph.useWorkspace(workspaceName);
@@ -182,13 +179,17 @@
 
         // This must be initialized after the session
         RepositoryNodeTypeManager repoTypeManager = repository.getRepositoryTypeManager();
-        this.nodeTypeManager = new JcrNodeTypeManager(session.getExecutionContext(), repoTypeManager);
+        this.nodeTypeManager = new JcrNodeTypeManager(session, repoTypeManager);
         this.queryManager = new JcrQueryManager(this.session);
 
         if (Boolean.valueOf(repository.getOptions().get(Option.PROJECT_NODE_TYPES))) {
             Path parentOfTypeNodes = context.getValueFactories().getPathFactory().create(systemPath, JcrLexicon.NODE_TYPES);
             repoTypeManager.projectOnto(this.graph, parentOfTypeNodes);
         }
+
+        // Set up and initialize the persistent JCR namespace registry ...
+        this.workspaceRegistry = new JcrNamespaceRegistry(persistentRegistry, this.session);
+
     }
 
     final String getSourceName() {
@@ -231,8 +232,20 @@
      */
     public String[] getAccessibleWorkspaceNames() throws RepositoryException {
         try {
-            Set<String> workspaces = graph.getWorkspaces();
-            return workspaces.toArray(new String[workspaces.size()]);
+            Set<String> workspaceNamesFromGraph = graph.getWorkspaces();
+            Set<String> workspaceNames = new HashSet<String>(workspaceNamesFromGraph.size());
+            
+            for(String workspaceName : workspaceNamesFromGraph) {
+                try {
+                    session.checkPermission(workspaceName, null, JcrSession.JCR_READ_PERMISSION);
+                    workspaceNames.add(workspaceName);
+                }
+                catch (AccessControlException ace) {
+                    // Can happen if user doesn't have the privileges to read from the workspace
+                }
+            }
+            
+            return workspaceNames.toArray(new String[workspaceNames.size()]);
         } catch (RepositorySourceException e) {
             throw new RepositoryException(JcrI18n.errorObtainingWorkspaceNames.text(getSourceName(), e.getMessage()), e);
         }

Modified: trunk/dna-jcr/src/test/java/org/jboss/dna/jcr/DnaTckTest.java
===================================================================
--- trunk/dna-jcr/src/test/java/org/jboss/dna/jcr/DnaTckTest.java	2009-06-28 00:33:32 UTC (rev 1066)
+++ trunk/dna-jcr/src/test/java/org/jboss/dna/jcr/DnaTckTest.java	2009-06-28 02:14:25 UTC (rev 1067)
@@ -2,8 +2,10 @@
 
 import static org.hamcrest.core.Is.is;
 import static org.junit.Assert.assertThat;
+import java.util.Collections;
 import javax.jcr.AccessDeniedException;
 import javax.jcr.Credentials;
+import javax.jcr.NoSuchWorkspaceException;
 import javax.jcr.Node;
 import javax.jcr.NodeIterator;
 import javax.jcr.PathNotFoundException;
@@ -12,6 +14,7 @@
 import javax.jcr.SimpleCredentials;
 import javax.jcr.nodetype.ConstraintViolationException;
 import org.apache.jackrabbit.test.AbstractJCRTest;
+import org.jboss.dna.jcr.nodetype.NodeTypeTemplate;
 
 /**
  * Additional DNA tests that check for JCR compliance.
@@ -68,6 +71,7 @@
 
     private void testRemoveProperty( Session session ) throws Exception {
         Session localAdmin = helper.getRepository().login(helper.getSuperuserCredentials(), session.getWorkspace().getName());
+
         assertEquals(session.getWorkspace().getName(), superuser.getWorkspace().getName());
 
         Node superRoot = localAdmin.getRootNode();
@@ -90,6 +94,21 @@
         session.save();
     }
 
+    private void testRegisterNamespace( Session session ) throws Exception {
+        String unusedPrefix = session.getUserID();
+        session.getWorkspace().getNamespaceRegistry().registerNamespace(unusedPrefix, unusedPrefix);
+        session.getWorkspace().getNamespaceRegistry().unregisterNamespace(unusedPrefix);
+    }
+
+    private void testRegisterType( Session session ) throws Exception {
+        JcrNodeTypeManager nodeTypes = (JcrNodeTypeManager)session.getWorkspace().getNodeTypeManager();
+        NodeTypeTemplate newType = nodeTypes.createNodeTypeTemplate();
+        String nodeTypeName = session.getUserID() + "Type";
+        newType.setName(nodeTypeName);
+        nodeTypes.registerNodeType(newType, false);
+        nodeTypes.unregisterNodeType(Collections.singleton(nodeTypeName));
+    }
+
     private void testWrite( Session session ) throws Exception {
         testAddNode(session);
         testSetProperty(session);
@@ -97,6 +116,11 @@
         testRemoveNode(session);
     }
 
+    private void testAdmin( Session session ) throws Exception {
+        testRegisterNamespace(session);
+        testRegisterType(session);
+    }
+
     /**
      * Tests that read-only sessions can read nodes by loading all of the children of the root node
      * 
@@ -137,6 +161,25 @@
     }
 
     /**
+     * Tests that read-only sessions cannot register namespaces or types
+     * 
+     * @throws Exception
+     */
+    public void testShouldNotAllowReadOnlySessionToAdmin() throws Exception {
+        session = helper.getReadOnlySession();
+        try {
+            testRegisterNamespace(session);
+            fail("Read-only sessions should not be able to register namespaces");
+        } catch (AccessDeniedException expected) {
+        }
+        try {
+            testRegisterType(session);
+            fail("Read-only sessions should not be able to register types");
+        } catch (AccessDeniedException expected) {
+        }
+    }
+
+    /**
      * Tests that read-write sessions can read nodes by loading all of the children of the root node
      * 
      * @throws Exception
@@ -157,6 +200,55 @@
     }
 
     /**
+     * Tests that read-write sessions cannot register namespaces or types
+     * 
+     * @throws Exception
+     */
+    public void testShouldNotAllowReadWriteSessionToAdmin() throws Exception {
+        session = helper.getReadWriteSession();
+        try {
+            testRegisterNamespace(session);
+            fail("Read-write sessions should not be able to register namespaces");
+        } catch (AccessDeniedException expected) {
+        }
+        try {
+            testRegisterType(session);
+            fail("Read-write sessions should not be able to register types");
+        } catch (AccessDeniedException expected) {
+        }
+    }
+
+    /**
+     * Tests that admin sessions can read nodes by loading all of the children of the root node
+     * 
+     * @throws Exception
+     */
+    public void testShouldAllowAdminSessionToRead() throws Exception {
+        session = helper.getSuperuserSession();
+        testRead(session);
+    }
+
+    /**
+     * Tests that admin sessions can add nodes, remove nodes, set nodes, and set properties.
+     * 
+     * @throws Exception
+     */
+    public void testShouldAllowAdminSessionToWrite() throws Exception {
+        session = helper.getSuperuserSession();
+        testWrite(session);
+    }
+
+    /**
+     * Tests that admin sessions can register namespaces and types
+     * 
+     * @throws Exception
+     */
+    public void testShouldAllowAdminSessionToAdmin() throws Exception {
+        session = helper.getSuperuserSession();
+        testAdmin(session);
+    }
+
+    /**
      * User defaultuser is configured to have readwrite in "otherWorkspace" and readonly in the default workspace. This test makes
      * sure both work.
      * 
@@ -181,6 +273,32 @@
         session.logout();
     }
 
+    /**
+     * Users should not be able to see workspaces to which they don't at least have read access.
+     * User 'noaccess' has no access to the default workspace.
+     * @throws Exception
+     */
+    public void testShouldNotSeeWorkspacesWithoutReadPermission() throws Exception {
+        Credentials creds = new SimpleCredentials("noaccess", "noaccess".toCharArray());
+        
+        try {
+            session = helper.getRepository().login(creds);
+            fail("User 'noaccess' with no access to the default workspace should not be able to log into that workspace");
+        }
+        catch (NoSuchWorkspaceException le) {
+            // Expected
+        }
+        
+        session = helper.getRepository().login(creds, "otherWorkspace");
+
+        String[] workspaceNames = session.getWorkspace().getAccessibleWorkspaceNames();
+
+        assertThat(workspaceNames.length, is(1));
+        assertThat(workspaceNames[0], is("otherWorkspace"));
+        
+        session.logout();
+    }
+    
     public void testShouldCopyFromAnotherWorkspace() throws Exception {
         session = helper.getSuperuserSession("otherWorkspace");
         String nodetype1 = this.getProperty("nodetype");

Modified: trunk/dna-jcr/src/test/java/org/jboss/dna/jcr/JcrNamespaceRegistryTest.java
===================================================================
--- trunk/dna-jcr/src/test/java/org/jboss/dna/jcr/JcrNamespaceRegistryTest.java	2009-06-28 00:33:32 UTC (rev 1066)
+++ trunk/dna-jcr/src/test/java/org/jboss/dna/jcr/JcrNamespaceRegistryTest.java	2009-06-28 02:14:25 UTC (rev 1067)
@@ -31,6 +31,8 @@
 import org.jboss.dna.graph.ExecutionContext;
 import org.junit.Before;
 import org.junit.Test;
+import org.mockito.MockitoAnnotations;
+import org.mockito.MockitoAnnotations.Mock;
 
 /**
  * @author jverhaeg
@@ -39,11 +41,15 @@
 
     private ExecutionContext executionContext;
     private JcrNamespaceRegistry registry;
+    @Mock
+    private JcrSession session;
 
     @Before
     public void before() {
+        MockitoAnnotations.initMocks(this);
         executionContext = new ExecutionContext();
-        registry = new JcrNamespaceRegistry(executionContext.getNamespaceRegistry());
+        registry = new JcrNamespaceRegistry(executionContext.getNamespaceRegistry(), session);
+
     }
 
     protected void assertThatNamespaceIsRegistered( String prefix,

Modified: trunk/dna-jcr/src/test/java/org/jboss/dna/jcr/JcrRepositoryTest.java
===================================================================
--- trunk/dna-jcr/src/test/java/org/jboss/dna/jcr/JcrRepositoryTest.java	2009-06-28 00:33:32 UTC (rev 1066)
+++ trunk/dna-jcr/src/test/java/org/jboss/dna/jcr/JcrRepositoryTest.java	2009-06-28 02:14:25 UTC (rev 1067)
@@ -30,6 +30,7 @@
 import java.security.AccessControlContext;
 import java.security.AccessController;
 import java.security.PrivilegedExceptionAction;
+import java.util.Collections;
 import java.util.HashMap;
 import java.util.Map;
 import javax.jcr.Credentials;
@@ -208,7 +209,10 @@
     @Test
     public void shouldAllowLoginWithProperCredentials() throws Exception {
         repository.login(credentials);
-        repository.login(new SecurityContextCredentials(new MockSecurityContext(null)));
+        repository.login(new SecurityContextCredentials(
+                                                        new MockSecurityContext(
+                                                                                null,
+                                                                                Collections.singleton(JcrSession.DNA_ADMIN_PERMISSION))));
     }
 
     @Test
@@ -216,7 +220,11 @@
         Session session = repository.login(credentials, null);
         assertThat(session, notNullValue());
         session.logout();
-        session = repository.login(new SecurityContextCredentials(new MockSecurityContext(null)), (String)null);
+        session = repository.login(new SecurityContextCredentials(
+                                                                  new MockSecurityContext(
+                                                                                          null,
+                                                                                          Collections.singleton(JcrSession.DNA_ADMIN_PERMISSION))),
+                                   (String)null);
         assertThat(session, notNullValue());
         session.logout();
     }

Modified: trunk/dna-jcr/src/test/java/org/jboss/dna/jcr/SessionCacheTest.java
===================================================================
--- trunk/dna-jcr/src/test/java/org/jboss/dna/jcr/SessionCacheTest.java	2009-06-28 00:33:32 UTC (rev 1066)
+++ trunk/dna-jcr/src/test/java/org/jboss/dna/jcr/SessionCacheTest.java	2009-06-28 02:14:25 UTC (rev 1067)
@@ -114,7 +114,7 @@
             throw new IllegalStateException("Could not access node type definition files", ioe);
         }
 
-        nodeTypes = new JcrNodeTypeManager(this.context, repoTypes);
+        nodeTypes = new JcrNodeTypeManager(this.session, repoTypes);
         stub(session.nodeTypeManager()).toReturn(nodeTypes);
 
         // Now set up the graph and session cache ...

Modified: trunk/dna-jcr/src/test/resources/security/tck_roles.properties
===================================================================
--- trunk/dna-jcr/src/test/resources/security/tck_roles.properties	2009-06-28 00:33:32 UTC (rev 1066)
+++ trunk/dna-jcr/src/test/resources/security/tck_roles.properties	2009-06-28 02:14:25 UTC (rev 1067)
@@ -1,6 +1,7 @@
 #<userName>=[readonly[.<workspaceName>] | readwrite[.<workspaceName>]][, [readonly[.<workspaceName>] | readwrite[.<workspaceName>]]]*
-superuser=readwrite
+superuser=admin
 readwrite=readwrite
 readonly=readonly
 # default workspace name is the empty string
-defaultonly=readwrite.,readonly.otherWorkspace
+defaultonly=readwrite.Store.,readonly.Store.otherWorkspace
+noaccess=readonly.Store.otherWorkspace

Modified: trunk/dna-jcr/src/test/resources/security/tck_users.properties
===================================================================
--- trunk/dna-jcr/src/test/resources/security/tck_users.properties	2009-06-28 00:33:32 UTC (rev 1066)
+++ trunk/dna-jcr/src/test/resources/security/tck_users.properties	2009-06-28 02:14:25 UTC (rev 1067)
@@ -3,3 +3,4 @@
 readwrite=readwrite
 readonly=readonly
 defaultonly=defaultonly
+noaccess=noaccess



