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