[dna-commits] DNA SVN: r1036 - in trunk: docs/examples/gettingstarted/repositories/src/main/java/org/jboss/example/dna/repository and 2 other directories.

dna-commits at lists.jboss.org dna-commits at lists.jboss.org
Thu Jun 11 05:19:30 EDT 2009


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}
      * 




More information about the dna-commits mailing list