[dna-commits] DNA SVN: r917 - in trunk: dna-graph/src/main/java/org/jboss/dna/graph/connector/inmemory and 16 other directories.

dna-commits at lists.jboss.org dna-commits at lists.jboss.org
Thu May 21 12:44:07 EDT 2009


Author: rhauch
Date: 2009-05-21 12:44:06 -0400 (Thu, 21 May 2009)
New Revision: 917

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/FederatedRepositorySource.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/inmemory/InMemoryRepositoryConnection.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/observe/Changes.java
   trunk/dna-graph/src/main/java/org/jboss/dna/graph/request/CloneWorkspaceRequest.java
   trunk/dna-graph/src/main/java/org/jboss/dna/graph/request/CreateWorkspaceRequest.java
   trunk/dna-graph/src/main/java/org/jboss/dna/graph/request/DestroyWorkspaceRequest.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/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/federation/FederatedRepositoryConnectionTest.java
   trunk/dna-graph/src/test/java/org/jboss/dna/graph/connector/federation/JoinRequestProcessorTest.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-jbosscache/src/main/java/org/jboss/dna/connector/jbosscache/JBossCacheConnection.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/JBossCacheSource.java
   trunk/extensions/dna-connector-jbosscache/src/test/java/org/jboss/dna/connector/jbosscache/JBossCacheRequestProcessorTest.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/JpaConnection.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.java
   trunk/extensions/dna-connector-store-jpa/src/main/java/org/jboss/dna/connector/store/jpa/model/basic/BasicModel.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/ModelTest.java
   trunk/extensions/dna-connector-store-jpa/src/test/java/org/jboss/dna/connector/store/jpa/model/basic/BasicModelTest.java
   trunk/extensions/dna-connector-svn/src/main/java/org/jboss/dna/connector/svn/SVNRepositoryRequestProcessor.java
Log:
DNA-252 Complete support for events to the connector framework

Changed the connectors to publish their change requests as events, if the RepositoryContext provides an Observer reference.

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-05-20 21:38:18 UTC (rev 916)
+++ trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/federation/FederatedRepositoryConnection.java	2009-05-21 16:44:06 UTC (rev 917)
@@ -37,6 +37,7 @@
 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.property.DateTime;
 import org.jboss.dna.graph.request.CompositeRequest;
 import org.jboss.dna.graph.request.Request;
@@ -76,11 +77,14 @@
     private final FederatedRepository repository;
     private final Stopwatch stopwatch;
     private final Logger logger;
+    private final Observer observer;
 
-    FederatedRepositoryConnection( FederatedRepository repository ) {
+    FederatedRepositoryConnection( FederatedRepository repository,
+                                   Observer observer ) {
         this.repository = repository;
         this.logger = Logger.getLogger(getClass());
         this.stopwatch = logger.isTraceEnabled() ? new Stopwatch() : null;
+        this.observer = observer;
     }
 
     /**
@@ -208,7 +212,7 @@
             // ----------------------------------------------------------------------------------------------------
             // Step 2: Join the results of the source-specific (forked) requests back into the submitted requests
             // ----------------------------------------------------------------------------------------------------
-            JoinRequestProcessor join = new JoinRequestProcessor(repository, context, nowInUtc);
+            JoinRequestProcessor join = new JoinRequestProcessor(repository, context, observer, nowInUtc);
             try {
                 if (awaitAllSubtasks) {
                     join.process(requests);

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-05-20 21:38:18 UTC (rev 916)
+++ trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/federation/FederatedRepositorySource.java	2009-05-21 16:44:06 UTC (rev 917)
@@ -57,6 +57,7 @@
 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.observe.Observer;
 import org.jboss.dna.graph.property.NamespaceRegistry;
 import org.jboss.dna.graph.property.Path;
 import org.jboss.dna.graph.property.Property;
@@ -309,7 +310,8 @@
                 config = this.configuration;
             }
         }
-        return new FederatedRepositoryConnection(config);
+        Observer observer = this.context != null ? this.context.getObserver() : null;
+        return new FederatedRepositoryConnection(config, observer);
     }
 
     /**

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-20 21:38:18 UTC (rev 916)
+++ trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/federation/ForkRequestProcessor.java	2009-05-21 16:44:06 UTC (rev 917)
@@ -497,7 +497,7 @@
                                  ExecutionContext context,
                                  DateTime now,
                                  Queue<FederatedRequest> federatedRequestQueue ) {
-        super(repository.getSourceName(), context, now);
+        super(repository.getSourceName(), context, null, now);
         this.repository = repository;
         this.executor = this.repository.getExecutor();
         this.connectionFactory = this.repository.getConnectionFactory();

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-05-20 21:38:18 UTC (rev 916)
+++ trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/federation/JoinMirrorRequestProcessor.java	2009-05-21 16:44:06 UTC (rev 917)
@@ -28,6 +28,7 @@
 import org.jboss.dna.graph.ExecutionContext;
 import org.jboss.dna.graph.Location;
 import org.jboss.dna.graph.cache.CachePolicy;
+import org.jboss.dna.graph.observe.Observer;
 import org.jboss.dna.graph.property.DateTime;
 import org.jboss.dna.graph.property.Name;
 import org.jboss.dna.graph.property.Property;
@@ -67,9 +68,10 @@
 
     JoinMirrorRequestProcessor( String sourceName,
                                 ExecutionContext context,
+                                Observer observer,
                                 DateTime now,
                                 CachePolicy defaultCachePolicy ) {
-        super(sourceName, context, now, defaultCachePolicy);
+        super(sourceName, context, observer, now, defaultCachePolicy);
 
     }
 
@@ -171,7 +173,8 @@
      */
     @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()) {

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-05-20 21:38:18 UTC (rev 916)
+++ trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/federation/JoinRequestProcessor.java	2009-05-21 16:44:06 UTC (rev 917)
@@ -35,6 +35,7 @@
 import org.jboss.dna.graph.GraphI18n;
 import org.jboss.dna.graph.Location;
 import org.jboss.dna.graph.connector.federation.FederatedRequest.ProjectedRequest;
+import org.jboss.dna.graph.observe.Observer;
 import org.jboss.dna.graph.property.DateTime;
 import org.jboss.dna.graph.property.Name;
 import org.jboss.dna.graph.property.Path;
@@ -81,16 +82,18 @@
      * 
      * @param repository the federated repository configuration; never null
      * @param context the execution context in which this processor is executing; may not be null
+     * @param observer the observer for change events; may be null
      * @param now the timestamp representing the current time in UTC; may not be null
      */
     public JoinRequestProcessor( FederatedRepository repository,
                                  ExecutionContext context,
+                                 Observer observer,
                                  DateTime now ) {
-        super(repository.getSourceName(), context, now, repository.getDefaultCachePolicy());
+        super(repository.getSourceName(), context, observer, now, repository.getDefaultCachePolicy());
         // this.repository = repository;
         this.propertyFactory = context.getPropertyFactory();
         this.pathFactory = context.getValueFactories().getPathFactory();
-        this.mirrorProcessor = new JoinMirrorRequestProcessor(repository.getSourceName(), context, now,
+        this.mirrorProcessor = new JoinMirrorRequestProcessor(repository.getSourceName(), context, observer, now,
                                                               repository.getDefaultCachePolicy());
     }
 

Modified: 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-05-20 21:38:18 UTC (rev 916)
+++ trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/inmemory/InMemoryRepositoryConnection.java	2009-05-21 16:44:06 UTC (rev 917)
@@ -102,7 +102,7 @@
             sw.start();
         }
         // Do any commands update/write?
-        RequestProcessor processor = new InMemoryRequestProcessor(context, this.repository);
+        RequestProcessor processor = new InMemoryRequestProcessor(context, this.repository, this.source.getRepositoryContext());
 
         Lock lock = request.isReadOnly() ? repository.getLock().readLock() : repository.getLock().writeLock();
         lock.lock();

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-20 21:38:18 UTC (rev 916)
+++ trunk/dna-graph/src/main/java/org/jboss/dna/graph/connector/inmemory/InMemoryRequestProcessor.java	2009-05-21 16:44:06 UTC (rev 917)
@@ -37,6 +37,7 @@
 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;
@@ -70,8 +71,9 @@
     private final InMemoryRepository repository;
 
     protected InMemoryRequestProcessor( ExecutionContext context,
-                                        InMemoryRepository repository ) {
-        super(repository.getSourceName(), context);
+                                        InMemoryRepository repository,
+                                        RepositoryContext repositoryContext ) {
+        super(repository.getSourceName(), context, repositoryContext != null ? repositoryContext.getObserver() : null);
         this.repository = repository;
         pathFactory = context.getValueFactories().getPathFactory();
         propertyFactory = context.getPropertyFactory();
@@ -133,6 +135,7 @@
         Location oldLocation = getActualLocation(request.from().getPath(), node);
         Location newLocation = Location.create(newPath, newNode.getUuid());
         request.setActualLocations(oldLocation, newLocation);
+        record(request);
     }
 
     @Override
@@ -149,6 +152,7 @@
             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()) {
@@ -193,6 +197,7 @@
         }
         Location actualLocation = getActualLocation(path, node);
         request.setActualLocationOfNode(actualLocation);
+        record(request);
     }
 
     @Override
@@ -204,6 +209,7 @@
         workspace.removeNode(getExecutionContext(), node);
         Location actualLocation = getActualLocation(request.at().getPath(), node);
         request.setActualLocationOfNode(actualLocation);
+        record(request);
     }
 
     @Override
@@ -222,6 +228,7 @@
         Location oldLocation = getActualLocation(request.from().getPath(), node);
         Location newLocation = Location.create(newPath, newParent.getUuid());
         request.setActualLocations(oldLocation, newLocation);
+        record(request);
     }
 
     @Override
@@ -243,6 +250,7 @@
         }
         Location actualLocation = getActualLocation(request.on().getPath(), node);
         request.setActualLocationOfNode(actualLocation);
+        record(request);
     }
 
     /**
@@ -263,6 +271,7 @@
             InMemoryNode root = workspace.getRoot();
             request.setActualRootLocation(Location.create(pathFactory.createRootPath(), root.getUuid()));
             request.setActualWorkspaceName(workspace.getName());
+            record(request);
         }
     }
 
@@ -273,7 +282,12 @@
      */
     @Override
     public void process( DestroyWorkspaceRequest request ) {
-        if (!repository.destroyWorkspace(request.workspaceName())) {
+        InMemoryRepository.Workspace workspace = repository.getWorkspace(getExecutionContext(), request.workspaceName());
+        if (workspace != null) {
+            InMemoryNode root = workspace.getRoot();
+            request.setActualRootLocation(Location.create(pathFactory.createRootPath(), root.getUuid()));
+            record(request);
+        } else {
             String msg = GraphI18n.workspaceDoesNotExistInRepository.text(request.workspaceName(), repository.getSourceName());
             request.setError(new InvalidWorkspaceException(msg));
         }
@@ -353,6 +367,7 @@
             InMemoryNode root = target.getRoot();
             request.setActualRootLocation(Location.create(pathFactory.createRootPath(), root.getUuid()));
             request.setActualWorkspaceName(target.getName());
+            record(request);
         }
     }
 

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-05-20 21:38:18 UTC (rev 916)
+++ trunk/dna-graph/src/main/java/org/jboss/dna/graph/observe/Changes.java	2009-05-21 16:44:06 UTC (rev 917)
@@ -45,6 +45,13 @@
     private final DateTime timestamp;
     private final List<ChangeRequest> changeRequests;
 
+    public Changes( Subject subject,
+                    String sourceName,
+                    DateTime timestamp,
+                    List<ChangeRequest> requests ) {
+        this("", subject, sourceName, timestamp, requests);
+    }
+
     public Changes( String processId,
                     Subject subject,
                     String sourceName,

Modified: trunk/dna-graph/src/main/java/org/jboss/dna/graph/request/CloneWorkspaceRequest.java
===================================================================
--- trunk/dna-graph/src/main/java/org/jboss/dna/graph/request/CloneWorkspaceRequest.java	2009-05-20 21:38:18 UTC (rev 916)
+++ trunk/dna-graph/src/main/java/org/jboss/dna/graph/request/CloneWorkspaceRequest.java	2009-05-21 16:44:06 UTC (rev 917)
@@ -26,6 +26,7 @@
 import org.jboss.dna.common.util.CheckArg;
 import org.jboss.dna.common.util.HashCode;
 import org.jboss.dna.graph.Location;
+import org.jboss.dna.graph.property.Path;
 import org.jboss.dna.graph.request.CreateWorkspaceRequest.CreateConflictBehavior;
 
 /**
@@ -33,7 +34,7 @@
  * the {@link #targetConflictBehavior() target conflict behavior} defines the behavior to be followed. If the workspace being
  * cloned does not exist, the {@link #cloneConflictBehavior() clone conflict behavior} defines the behavior to be followed.
  */
-public final class CloneWorkspaceRequest extends Request {
+public final class CloneWorkspaceRequest extends ChangeRequest {
 
     private static final long serialVersionUID = 1L;
 
@@ -228,4 +229,25 @@
     public String toString() {
         return "clone workspace \"" + nameOfWorkspaceToBeCloned() + "\" as workspace \"" + desiredNameOfTargetWorkspace() + "\"";
     }
+
+    /**
+     * {@inheritDoc}
+     * 
+     * @see org.jboss.dna.graph.request.ChangeRequest#changedLocation()
+     */
+    @Override
+    public Location changedLocation() {
+        return actualLocationOfRoot;
+    }
+
+    /**
+     * {@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 actualWorkspaceName != null && actualWorkspaceName.equals(workspace);
+    }
 }

Modified: trunk/dna-graph/src/main/java/org/jboss/dna/graph/request/CreateWorkspaceRequest.java
===================================================================
--- trunk/dna-graph/src/main/java/org/jboss/dna/graph/request/CreateWorkspaceRequest.java	2009-05-20 21:38:18 UTC (rev 916)
+++ trunk/dna-graph/src/main/java/org/jboss/dna/graph/request/CreateWorkspaceRequest.java	2009-05-21 16:44:06 UTC (rev 917)
@@ -25,12 +25,13 @@
 
 import org.jboss.dna.common.util.CheckArg;
 import org.jboss.dna.graph.Location;
+import org.jboss.dna.graph.property.Path;
 
 /**
  * Request that a new workspace be created with the supplied name. The request also specifies the desired
  * {@link #conflictBehavior() behavior} for the recipient if a workspace already exists with the name.
  */
-public final class CreateWorkspaceRequest extends Request {
+public final class CreateWorkspaceRequest extends ChangeRequest {
 
     private static final long serialVersionUID = 1L;
 
@@ -189,4 +190,25 @@
     public String toString() {
         return "create new workspace \"" + desiredNameOfNewWorkspace() + "\"";
     }
+
+    /**
+     * {@inheritDoc}
+     * 
+     * @see org.jboss.dna.graph.request.ChangeRequest#changedLocation()
+     */
+    @Override
+    public Location changedLocation() {
+        return actualLocationOfRoot;
+    }
+
+    /**
+     * {@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 actualWorkspaceName != null && actualWorkspaceName.equals(workspace);
+    }
 }

Modified: trunk/dna-graph/src/main/java/org/jboss/dna/graph/request/DestroyWorkspaceRequest.java
===================================================================
--- trunk/dna-graph/src/main/java/org/jboss/dna/graph/request/DestroyWorkspaceRequest.java	2009-05-20 21:38:18 UTC (rev 916)
+++ trunk/dna-graph/src/main/java/org/jboss/dna/graph/request/DestroyWorkspaceRequest.java	2009-05-21 16:44:06 UTC (rev 917)
@@ -24,15 +24,18 @@
 package org.jboss.dna.graph.request;
 
 import org.jboss.dna.common.util.CheckArg;
+import org.jboss.dna.graph.Location;
+import org.jboss.dna.graph.property.Path;
 
 /**
  * Request that an existing workspace with the supplied name be destroyed.
  */
-public final class DestroyWorkspaceRequest extends Request {
+public final class DestroyWorkspaceRequest extends ChangeRequest {
 
     private static final long serialVersionUID = 1L;
 
     private final String workspaceName;
+    private Location actualLocationOfRoot;
 
     /**
      * Create a request to destroy an existing workspace.
@@ -55,6 +58,26 @@
     }
 
     /**
+     * Get the actual location of the root node in the new workspace, or null if the workspace was not (yet) created.
+     * 
+     * @return the actual location of the root node in the new workspace, or null if the workspace was not (yet) created
+     */
+    public Location getActualLocationOfRoot() {
+        return actualLocationOfRoot;
+    }
+
+    /**
+     * Set the actual location of the root node in the new workspace.
+     * 
+     * @param actualLocationOfRoot the actual location of the workspace's root node.
+     * @throws IllegalStateException if the request is frozen
+     */
+    public void setActualRootLocation( Location actualLocationOfRoot ) {
+        checkNotFrozen();
+        this.actualLocationOfRoot = actualLocationOfRoot;
+    }
+
+    /**
      * {@inheritDoc}
      * 
      * @see org.jboss.dna.graph.request.Request#isReadOnly()
@@ -99,4 +122,25 @@
     public String toString() {
         return "destroy workspace \"" + workspaceName() + "\"";
     }
+
+    /**
+     * {@inheritDoc}
+     * 
+     * @see org.jboss.dna.graph.request.ChangeRequest#changedLocation()
+     */
+    @Override
+    public Location changedLocation() {
+        return actualLocationOfRoot;
+    }
+
+    /**
+     * {@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 workspaceName().equals(workspace);
+    }
 }

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-05-20 21:38:18 UTC (rev 916)
+++ trunk/dna-graph/src/main/java/org/jboss/dna/graph/request/processor/LoggingRequestProcessor.java	2009-05-21 16:44:06 UTC (rev 917)
@@ -69,7 +69,7 @@
     public LoggingRequestProcessor( RequestProcessor delegate,
                                     Logger logger,
                                     Logger.Level level ) {
-        super(delegate.getSourceName(), delegate.getExecutionContext());
+        super(delegate.getSourceName(), delegate.getExecutionContext(), null);
         CheckArg.isNotNull(logger, "logger");
         this.delegate = delegate;
         this.logger = logger;

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-05-20 21:38:18 UTC (rev 916)
+++ trunk/dna-graph/src/main/java/org/jboss/dna/graph/request/processor/RequestProcessor.java	2009-05-21 16:44:06 UTC (rev 917)
@@ -35,12 +35,15 @@
 import org.jboss.dna.graph.Location;
 import org.jboss.dna.graph.cache.CachePolicy;
 import org.jboss.dna.graph.connector.RepositorySourceException;
+import org.jboss.dna.graph.observe.Changes;
+import org.jboss.dna.graph.observe.Observer;
 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.Property;
 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.CloneWorkspaceRequest;
 import org.jboss.dna.graph.request.CompositeRequest;
 import org.jboss.dna.graph.request.CopyBranchRequest;
@@ -82,20 +85,25 @@
     private final String sourceName;
     private final DateTime nowInUtc;
     private final CachePolicy defaultCachePolicy;
+    private final List<ChangeRequest> changes;
+    private final Observer observer;
 
     protected RequestProcessor( String sourceName,
-                                ExecutionContext context ) {
-        this(sourceName, context, null, null);
+                                ExecutionContext context,
+                                Observer observer ) {
+        this(sourceName, context, observer, null, null);
     }
 
     protected RequestProcessor( String sourceName,
                                 ExecutionContext context,
+                                Observer observer,
                                 DateTime now ) {
-        this(sourceName, context, now, null);
+        this(sourceName, context, observer, now, null);
     }
 
     protected RequestProcessor( String sourceName,
                                 ExecutionContext context,
+                                Observer observer,
                                 DateTime now,
                                 CachePolicy defaultCachePolicy ) {
         CheckArg.isNotEmpty(sourceName, "sourceName");
@@ -104,9 +112,23 @@
         this.sourceName = sourceName;
         this.nowInUtc = now != null ? now : context.getValueFactories().getDateFactory().createUtc();
         this.defaultCachePolicy = defaultCachePolicy;
+        this.changes = observer != null ? new LinkedList<ChangeRequest>() : null;
+        this.observer = observer;
     }
 
     /**
+     * Record the supplied change request for publishing through the event mechanism.
+     * 
+     * @param request the completed change request; may not be null
+     */
+    protected void record( ChangeRequest request ) {
+        assert request != null;
+        assert !request.isCancelled();
+        assert !request.hasError();
+        if (changes != null) changes.add(request);
+    }
+
+    /**
      * Get the name of the source against which this processor is executing.
      * 
      * @return the repository source name; never null or empty
@@ -761,7 +783,11 @@
      * Close this processor, allowing it to clean up any open resources.
      */
     public void close() {
-        // do nothing
+        // Publish any changes ...
+        if (observer != null && !this.changes.isEmpty()) {
+            Changes changes = new Changes(context.getSubject(), getSourceName(), getNowInUtc(), this.changes);
+            observer.notify(changes);
+        }
     }
 
     /**

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-05-20 21:38:18 UTC (rev 916)
+++ trunk/dna-graph/src/test/java/org/jboss/dna/graph/GraphTest.java	2009-05-21 16:44:06 UTC (rev 917)
@@ -1058,7 +1058,7 @@
     @SuppressWarnings( "synthetic-access" )
     class Processor extends RequestProcessor {
         protected Processor() {
-            super(sourceName, context);
+            super(sourceName, context, null);
         }
 
         @Override

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-05-20 21:38:18 UTC (rev 916)
+++ trunk/dna-graph/src/test/java/org/jboss/dna/graph/connector/MockRepositoryRequestProcessor.java	2009-05-21 16:44:06 UTC (rev 917)
@@ -64,7 +64,7 @@
     public MockRepositoryRequestProcessor( String sourceName,
                                            ExecutionContext context,
                                            Queue<Request> processed ) {
-        super(sourceName, context);
+        super(sourceName, context, null);
         assert processed != null;
         this.processed = processed;
     }

Modified: trunk/dna-graph/src/test/java/org/jboss/dna/graph/connector/federation/FederatedRepositoryConnectionTest.java
===================================================================
--- trunk/dna-graph/src/test/java/org/jboss/dna/graph/connector/federation/FederatedRepositoryConnectionTest.java	2009-05-20 21:38:18 UTC (rev 916)
+++ trunk/dna-graph/src/test/java/org/jboss/dna/graph/connector/federation/FederatedRepositoryConnectionTest.java	2009-05-21 16:44:06 UTC (rev 917)
@@ -50,7 +50,7 @@
     @Before
     public void beforeEach() {
         MockitoAnnotations.initMocks(this);
-        connection = new FederatedRepositoryConnection(repository);
+        connection = new FederatedRepositoryConnection(repository, null);
     }
 
     @Test

Modified: trunk/dna-graph/src/test/java/org/jboss/dna/graph/connector/federation/JoinRequestProcessorTest.java
===================================================================
--- trunk/dna-graph/src/test/java/org/jboss/dna/graph/connector/federation/JoinRequestProcessorTest.java	2009-05-20 21:38:18 UTC (rev 916)
+++ trunk/dna-graph/src/test/java/org/jboss/dna/graph/connector/federation/JoinRequestProcessorTest.java	2009-05-21 16:44:06 UTC (rev 917)
@@ -338,7 +338,7 @@
         protected JoinRequestProcessorWithUnknownHandler( FederatedRepository repository,
                                                           ExecutionContext context,
                                                           DateTime now ) {
-            super(repository, context, now);
+            super(repository, context, null, now);
         }
 
         @Override

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-20 21:38:18 UTC (rev 916)
+++ trunk/extensions/dna-connector-federation/src/main/java/org/jboss/dna/connector/federation/FederatingRequestProcessor.java	2009-05-21 16:44:06 UTC (rev 917)
@@ -116,7 +116,7 @@
                                        Map<String, FederatedWorkspace> workspaces,
                                        FederatedWorkspace defaultWorkspace,
                                        RepositoryConnectionFactory connectionFactory ) {
-        super(sourceName, context);
+        super(sourceName, context, null);
         CheckArg.isNotEmpty(workspaces, "workspaces");
         CheckArg.isNotNull(connectionFactory, "connectionFactory");
         this.workspaces = workspaces;

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-05-20 21:38:18 UTC (rev 916)
+++ trunk/extensions/dna-connector-filesystem/src/main/java/org/jboss/dna/connector/filesystem/FileSystemRequestProcessor.java	2009-05-21 16:44:06 UTC (rev 917)
@@ -100,7 +100,7 @@
                                           ExecutionContext context,
                                           FilenameFilter filenameFilter,
                                           boolean updatesAllowed ) {
-        super(sourceName, context);
+        super(sourceName, context, null);
         assert defaultWorkspace != null;
         assert defaultWorkspace.exists();
         assert defaultWorkspace.canRead();
@@ -391,9 +391,7 @@
      */
     @Override
     public void process( CloneWorkspaceRequest request ) {
-        if (!updatesAllowed) {
-            request.setError(new InvalidRequestException(FileSystemI18n.sourceIsReadOnly.text(getSourceName())));
-        }
+        updatesAllowed(request);
     }
 
     /**
@@ -416,6 +414,7 @@
             request.setActualWorkspaceName(getCanonicalWorkspaceName(directory));
             request.setActualRootLocation(Location.create(pathFactory().createRootPath()));
             availableWorkspaceNames.add(workspaceName);
+            record(request);
         } else {
             request.setError(new InvalidWorkspaceException(FileSystemI18n.workspaceDoesNotExist.text(workspaceName)));
         }
@@ -436,6 +435,9 @@
         // This doesn't delete the file/directory; rather, it just remove the workspace from the available set ...
         if (!this.availableWorkspaceNames.remove(workspaceName)) {
             request.setError(new InvalidWorkspaceException(FileSystemI18n.workspaceDoesNotExist.text(workspaceName)));
+        } else {
+            request.setActualRootLocation(Location.create(pathFactory().createRootPath()));
+            record(request);
         }
     }
 

Modified: 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-05-20 21:38:18 UTC (rev 916)
+++ trunk/extensions/dna-connector-jbosscache/src/main/java/org/jboss/dna/connector/jbosscache/JBossCacheConnection.java	2009-05-21 16:44:06 UTC (rev 917)
@@ -29,6 +29,7 @@
 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;
 
@@ -94,7 +95,8 @@
      */
     public void execute( final ExecutionContext context,
                          final Request request ) throws RepositorySourceException {
-        RequestProcessor processor = new JBossCacheRequestProcessor(getSourceName(), context, workspaces,
+        Observer observer = source.getObserver();
+        RequestProcessor processor = new JBossCacheRequestProcessor(getSourceName(), context, observer, workspaces,
                                                                     source.getNameOfDefaultWorkspace(),
                                                                     source.isCreatingWorkspacesAllowed());
         try {

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-20 21:38:18 UTC (rev 916)
+++ trunk/extensions/dna-connector-jbosscache/src/main/java/org/jboss/dna/connector/jbosscache/JBossCacheRequestProcessor.java	2009-05-21 16:44:06 UTC (rev 917)
@@ -40,6 +40,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.observe.Observer;
 import org.jboss.dna.graph.property.Name;
 import org.jboss.dna.graph.property.Path;
 import org.jboss.dna.graph.property.PathFactory;
@@ -85,16 +86,18 @@
     /**
      * @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);
+        super(sourceName, context, observer);
         assert workspaces != null;
         assert defaultWorkspaceName != null;
         this.workspaces = workspaces;
@@ -180,6 +183,7 @@
         }
         Path nodePath = pathFactory.create(parent, newSegment);
         request.setActualLocationOfNode(Location.create(nodePath));
+        record(request);
     }
 
     @Override
@@ -211,6 +215,7 @@
             node.put(propName, value);
         }
         request.setActualLocationOfNode(Location.create(nodePath));
+        record(request);
     }
 
     @Override
@@ -247,6 +252,7 @@
 
         Path newPath = pathFactory.create(newParentPath, newSegment);
         request.setActualLocations(Location.create(nodePath), Location.create(newPath));
+        record(request);
     }
 
     @Override
@@ -263,6 +269,7 @@
         if (cache.removeNode(node.getFqn())) {
             removeFromChildList(cache, parent, nameOfRemovedNode, getExecutionContext());
             request.setActualLocationOfNode(Location.create(nodePath));
+            record(request);
         } else {
             String msg = JBossCacheConnectorI18n.unableToDeleteBranch.text(getSourceName(), request.inWorkspace(), nodePath);
             request.setError(new RepositorySourceException(msg));
@@ -296,6 +303,7 @@
 
         Path newPath = pathFactory.create(newParentPath, newSegment);
         request.setActualLocations(Location.create(nodePath), Location.create(newPath));
+        record(request);
     }
 
     /**
@@ -363,6 +371,7 @@
         }
         request.setActualRootLocation(Location.create(pathFactory.createRootPath()));
         request.setActualWorkspaceName(workspaceName);
+        record(request);
     }
 
     /**
@@ -412,6 +421,7 @@
         // 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);
+        record(request);
     }
 
     /**
@@ -421,10 +431,14 @@
      */
     @Override
     public void process( DestroyWorkspaceRequest request ) {
-        if (!this.workspaces.removeWorkspace(request.workspaceName())) {
-            String msg = JBossCacheConnectorI18n.workspaceDoesNotExist.text(request.workspaceName());
+        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()));
+        record(request);
     }
 
     // ----------------------------------------------------------------------------------------------------------------

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-05-20 21:38:18 UTC (rev 916)
+++ trunk/extensions/dna-connector-jbosscache/src/main/java/org/jboss/dna/connector/jbosscache/JBossCacheSource.java	2009-05-21 16:44:06 UTC (rev 917)
@@ -58,6 +58,7 @@
 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.observe.Observer;
 import org.jboss.dna.graph.property.Name;
 
 /**
@@ -115,6 +116,7 @@
     private volatile RepositorySourceCapabilities capabilities = new RepositorySourceCapabilities(true, true, false, true, false);
     private transient JBossCacheWorkspaces workspaces;
     private transient Context jndiContext;
+    private transient RepositoryContext repositoryContext;
 
     /**
      * Create a repository source instance.
@@ -128,6 +130,7 @@
      * @see org.jboss.dna.graph.connector.RepositorySource#initialize(org.jboss.dna.graph.connector.RepositoryContext)
      */
     public void initialize( RepositoryContext context ) throws RepositorySourceException {
+        this.repositoryContext = context;
     }
 
     /**
@@ -476,6 +479,17 @@
         return new JBossCacheConnection(this, this.workspaces);
     }
 
+    /**
+     * @return repositoryContext
+     */
+    protected RepositoryContext getRepositoryContext() {
+        return repositoryContext;
+    }
+
+    protected Observer getObserver() {
+        return repositoryContext != null ? repositoryContext.getObserver() : null;
+    }
+
     protected Context getContext() {
         return this.jndiContext;
     }

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-05-20 21:38:18 UTC (rev 916)
+++ trunk/extensions/dna-connector-jbosscache/src/test/java/org/jboss/dna/connector/jbosscache/JBossCacheRequestProcessorTest.java	2009-05-21 16:44:06 UTC (rev 917)
@@ -71,7 +71,7 @@
         initialWorkspaceNames.add("workspace2");
         defaultWorkspaceName = initialWorkspaceNames.iterator().next();
         workspaces = new JBossCacheWorkspaces("source", cacheFactory, defaultConfigName, initialWorkspaceNames, jndi);
-        processor = new JBossCacheRequestProcessor("source", context, workspaces, defaultWorkspaceName, true);
+        processor = new JBossCacheRequestProcessor("source", context, null, workspaces, defaultWorkspaceName, true);
 
         pathFactory = context.getValueFactories().getPathFactory();
     }

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-05-20 21:38:18 UTC (rev 916)
+++ trunk/extensions/dna-connector-jdbc-metadata/src/main/java/org/jboss/dna/connector/jdbc/JdbcRequestProcesor.java	2009-05-21 16:44:06 UTC (rev 917)
@@ -66,7 +66,7 @@
                                 ExecutionContext context,
                                 Connection connection,
                                 UUID rootNodeUuid ) {
-        super(sourceName, context);
+        super(sourceName, context, null);
         this.connection = connection;
         this.rootNodeUuid = rootNodeUuid;
     }
@@ -83,7 +83,7 @@
                                 Connection connection,
                                 UUID rootNodeUuid,
                                 DateTime now ) {
-        super(sourceName, context, now);
+        super(sourceName, context, null, now);
         this.connection = connection;
         this.rootNodeUuid = rootNodeUuid;
     }

Modified: trunk/extensions/dna-connector-store-jpa/src/main/java/org/jboss/dna/connector/store/jpa/JpaConnection.java
===================================================================
--- trunk/extensions/dna-connector-store-jpa/src/main/java/org/jboss/dna/connector/store/jpa/JpaConnection.java	2009-05-20 21:38:18 UTC (rev 916)
+++ trunk/extensions/dna-connector-store-jpa/src/main/java/org/jboss/dna/connector/store/jpa/JpaConnection.java	2009-05-21 16:44:06 UTC (rev 917)
@@ -31,6 +31,7 @@
 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;
 
@@ -50,8 +51,10 @@
     private final long largeValueMinimumSizeInBytes;
     private final boolean compressData;
     private final boolean enforceReferentialIntegrity;
+    private final Observer observer;
 
     /*package*/JpaConnection( String sourceName,
+                               Observer observer,
                                CachePolicy cachePolicy,
                                EntityManager entityManager,
                                Model model,
@@ -66,6 +69,7 @@
         assert entityManager != null;
         assert model != null;
         assert rootNodeUuid != null;
+        this.observer = observer;
         this.name = sourceName;
         this.cachePolicy = cachePolicy; // may be null
         this.entityManager = entityManager;
@@ -127,6 +131,7 @@
         long size = largeValueMinimumSizeInBytes;
         RequestProcessor proc = model.createRequestProcessor(name,
                                                              context,
+                                                             observer,
                                                              entityManager,
                                                              rootNodeUuid,
                                                              nameOfDefaultWorkspace,

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-05-20 21:38:18 UTC (rev 916)
+++ trunk/extensions/dna-connector-store-jpa/src/main/java/org/jboss/dna/connector/store/jpa/JpaSource.java	2009-05-21 16:44:06 UTC (rev 917)
@@ -58,6 +58,7 @@
 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.observe.Observer;
 
 /**
  * The {@link RepositorySource} for the connector that stores content in a (custom) relational database. This connector uses Java
@@ -929,7 +930,8 @@
         if (entityManager == null) {
             entityManager = entityManagerFactory.createEntityManager();
         }
-        return new JpaConnection(getName(), cachePolicy, entityManager, model, rootUuid, defaultWorkspace,
+        Observer observer = repositoryContext != null ? repositoryContext.getObserver() : null;
+        return new JpaConnection(getName(), observer, cachePolicy, entityManager, model, rootUuid, defaultWorkspace,
                                  getPredefinedWorkspaceNames(), largeValueSizeInBytes, isCreatingWorkspacesAllowed(),
                                  compressData, referentialIntegrityEnforced);
     }

Modified: trunk/extensions/dna-connector-store-jpa/src/main/java/org/jboss/dna/connector/store/jpa/Model.java
===================================================================
--- trunk/extensions/dna-connector-store-jpa/src/main/java/org/jboss/dna/connector/store/jpa/Model.java	2009-05-20 21:38:18 UTC (rev 916)
+++ trunk/extensions/dna-connector-store-jpa/src/main/java/org/jboss/dna/connector/store/jpa/Model.java	2009-05-21 16:44:06 UTC (rev 917)
@@ -30,6 +30,7 @@
 import org.jboss.dna.common.i18n.I18n;
 import org.jboss.dna.common.util.CheckArg;
 import org.jboss.dna.graph.ExecutionContext;
+import org.jboss.dna.graph.observe.Observer;
 import org.jboss.dna.graph.request.processor.RequestProcessor;
 
 /**
@@ -78,6 +79,7 @@
 
     public abstract RequestProcessor createRequestProcessor( String sourceName,
                                                              ExecutionContext context,
+                                                             Observer observer,
                                                              EntityManager entityManager,
                                                              UUID rootNodeUuid,
                                                              String nameOfDefaultWorkspace,

Modified: trunk/extensions/dna-connector-store-jpa/src/main/java/org/jboss/dna/connector/store/jpa/model/basic/BasicModel.java
===================================================================
--- trunk/extensions/dna-connector-store-jpa/src/main/java/org/jboss/dna/connector/store/jpa/model/basic/BasicModel.java	2009-05-20 21:38:18 UTC (rev 916)
+++ trunk/extensions/dna-connector-store-jpa/src/main/java/org/jboss/dna/connector/store/jpa/model/basic/BasicModel.java	2009-05-21 16:44:06 UTC (rev 917)
@@ -32,6 +32,7 @@
 import org.jboss.dna.connector.store.jpa.model.common.NamespaceEntity;
 import org.jboss.dna.connector.store.jpa.model.common.WorkspaceEntity;
 import org.jboss.dna.graph.ExecutionContext;
+import org.jboss.dna.graph.observe.Observer;
 import org.jboss.dna.graph.request.CopyBranchRequest;
 import org.jboss.dna.graph.request.DeleteBranchRequest;
 import org.jboss.dna.graph.request.MoveBranchRequest;
@@ -101,12 +102,13 @@
     /**
      * {@inheritDoc}
      * 
-     * @see org.jboss.dna.connector.store.jpa.Model#createRequestProcessor(String, ExecutionContext, EntityManager, UUID, String,
-     *      String[], long, boolean, boolean, boolean)
+     * @see org.jboss.dna.connector.store.jpa.Model#createRequestProcessor(String, ExecutionContext, Observer, EntityManager,
+     *      UUID, String, String[], long, boolean, boolean, boolean)
      */
     @Override
     public RequestProcessor createRequestProcessor( String sourceName,
                                                     ExecutionContext context,
+                                                    Observer observer,
                                                     EntityManager entityManager,
                                                     UUID rootNodeUuid,
                                                     String nameOfDefaultWorkspace,
@@ -115,7 +117,7 @@
                                                     boolean creatingWorkspacesAllowed,
                                                     boolean compressData,
                                                     boolean enforceReferentialIntegrity ) {
-        return new BasicRequestProcessor(sourceName, context, entityManager, rootNodeUuid, nameOfDefaultWorkspace,
+        return new BasicRequestProcessor(sourceName, context, observer, entityManager, rootNodeUuid, nameOfDefaultWorkspace,
                                          predefinedWorkspaceNames, largeValueMinimumSizeInBytes, creatingWorkspacesAllowed,
                                          compressData, enforceReferentialIntegrity);
     }

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-20 21:38:18 UTC (rev 916)
+++ trunk/extensions/dna-connector-store-jpa/src/main/java/org/jboss/dna/connector/store/jpa/model/basic/BasicRequestProcessor.java	2009-05-21 16:44:06 UTC (rev 917)
@@ -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.observe.Observer;
 import org.jboss.dna.graph.property.Binary;
 import org.jboss.dna.graph.property.Name;
 import org.jboss.dna.graph.property.NameFactory;
@@ -132,6 +133,7 @@
     /**
      * @param sourceName
      * @param context
+     * @param observer
      * @param entityManager
      * @param rootNodeUuid
      * @param nameOfDefaultWorkspace
@@ -143,6 +145,7 @@
      */
     public BasicRequestProcessor( String sourceName,
                                   ExecutionContext context,
+                                  Observer observer,
                                   EntityManager entityManager,
                                   UUID rootNodeUuid,
                                   String nameOfDefaultWorkspace,
@@ -151,7 +154,7 @@
                                   boolean creatingWorkspacesAllowed,
                                   boolean compressData,
                                   boolean enforceReferentialIntegrity ) {
-        super(sourceName, context);
+        super(sourceName, context, observer);
         assert entityManager != null;
         assert rootNodeUuid != null;
         assert predefinedWorkspaceNames != null;
@@ -949,6 +952,7 @@
             return;
         }
         if (actualLocation != null) request.setActualLocationOfNode(actualLocation);
+        record(request);
     }
 
     /**
@@ -1234,6 +1238,7 @@
             return;
         }
         request.setActualLocations(actualFromLocation, actualToLocation);
+        record(request);
     }
 
     /**
@@ -1245,7 +1250,10 @@
     public void process( DeleteBranchRequest request ) {
         logger.trace(request.toString());
         Location location = delete(request, request.at(), request.inWorkspace(), true);
-        if (location != null) request.setActualLocationOfNode(location);
+        if (location != null) {
+            request.setActualLocationOfNode(location);
+            record(request);
+        }
     }
 
     /**
@@ -1257,7 +1265,10 @@
     public void process( DeleteChildrenRequest request ) {
         logger.trace(request.toString());
         Location location = delete(request, request.at(), request.inWorkspace(), false);
-        if (location != null) request.setActualLocationOfNode(location);
+        if (location != null) {
+            request.setActualLocationOfNode(location);
+            record(request);
+        }
     }
 
     protected Location delete( Request request,
@@ -1473,6 +1484,7 @@
             return;
         }
         request.setActualLocations(actualOldLocation, actualNewLocation);
+        record(request);
     }
 
     /**
@@ -1523,6 +1535,7 @@
         if (!creatingWorkspacesAllowed) {
             String msg = JpaConnectorI18n.unableToCreateWorkspaces.text(getSourceName());
             request.setError(new InvalidRequestException(msg));
+            return;
         }
         Set<String> existingNames = workspaces.getWorkspaceNames();
         int counter = 0;
@@ -1544,6 +1557,7 @@
         // Create the root node ...
         Location root = Location.create(pathFactory.createRootPath());
         request.setActualRootLocation(getActualLocation(entity.getId(), root).location);
+        record(request);
     }
 
     /**
@@ -1557,6 +1571,7 @@
         if (!creatingWorkspacesAllowed) {
             String msg = JpaConnectorI18n.unableToCreateWorkspaces.text(getSourceName());
             request.setError(new InvalidRequestException(msg));
+            return;
         }
         Set<String> existingNames = workspaces.getWorkspaceNames();
         String name = request.desiredNameOfTargetWorkspace();
@@ -1642,6 +1657,7 @@
         // Finish up the request ...
         Location root = Location.create(pathFactory.createRootPath(), rootNodeUuid);
         request.setActualRootLocation(getActualLocation(intoWorkspace.getId(), root).location);
+        record(request);
     }
 
     /**
@@ -1657,6 +1673,9 @@
         Long workspaceId = workspace.getId();
         assert workspaceId != null;
 
+        // Get the actual location of the root node ...
+        ActualLocation actual = getActualLocation(workspaceId, Location.create(pathFactory.createRootPath()));
+
         // Delete the workspace ...
         workspaces.destroy(workspace.getName());
 
@@ -1675,6 +1694,10 @@
 
         // Delete unused large values ...
         LargeValueEntity.deleteUnused(entities);
+
+        // Finish the request ...
+        request.setActualRootLocation(actual.location);
+        record(request);
     }
 
     /**

Modified: trunk/extensions/dna-connector-store-jpa/src/test/java/org/jboss/dna/connector/store/jpa/ModelTest.java
===================================================================
--- trunk/extensions/dna-connector-store-jpa/src/test/java/org/jboss/dna/connector/store/jpa/ModelTest.java	2009-05-20 21:38:18 UTC (rev 916)
+++ trunk/extensions/dna-connector-store-jpa/src/test/java/org/jboss/dna/connector/store/jpa/ModelTest.java	2009-05-21 16:44:06 UTC (rev 917)
@@ -31,6 +31,7 @@
 import org.hibernate.ejb.Ejb3Configuration;
 import org.jboss.dna.common.i18n.I18n;
 import org.jboss.dna.graph.ExecutionContext;
+import org.jboss.dna.graph.observe.Observer;
 import org.jboss.dna.graph.request.processor.RequestProcessor;
 import org.junit.Before;
 import org.junit.Test;
@@ -107,6 +108,7 @@
         @Override
         public RequestProcessor createRequestProcessor( String sourceName,
                                                         ExecutionContext context,
+                                                        Observer observer,
                                                         EntityManager entityManager,
                                                         UUID rootNodeUuid,
                                                         String nameOfDefaultWorkspace,

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-05-20 21:38:18 UTC (rev 916)
+++ trunk/extensions/dna-connector-store-jpa/src/test/java/org/jboss/dna/connector/store/jpa/model/basic/BasicModelTest.java	2009-05-21 16:44:06 UTC (rev 917)
@@ -128,6 +128,7 @@
         stub(manager.getTransaction()).toReturn(txn);
         RequestProcessor proc = model.createRequestProcessor("test source",
                                                              context,
+                                                             null,
                                                              manager,
                                                              UUID.randomUUID(),
                                                              "default workspace",

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-05-20 21:38:18 UTC (rev 916)
+++ trunk/extensions/dna-connector-svn/src/main/java/org/jboss/dna/connector/svn/SVNRepositoryRequestProcessor.java	2009-05-21 16:44:06 UTC (rev 917)
@@ -103,7 +103,7 @@
                                              ExecutionContext context,
                                              SVNRepository repository,
                                              boolean updatesAllowed ) {
-        super(sourceName, context);
+        super(sourceName, context, null);
         this.defaultNamespaceUri = getExecutionContext().getNamespaceRegistry().getDefaultNamespaceUri();
         this.updatesAllowed = updatesAllowed;
         this.repository = repository;




More information about the dna-commits mailing list