You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jackrabbit.apache.org by an...@apache.org on 2009/08/12 13:02:11 UTC

svn commit: r803444 - in /jackrabbit/trunk: jackrabbit-jcr-client/src/test/java/org/apache/jackrabbit/client/ jackrabbit-jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/ jackrabbit-jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/hierarchy/ jack...

Author: angela
Date: Wed Aug 12 11:02:10 2009
New Revision: 803444

URL: http://svn.apache.org/viewvc?rev=803444&view=rev
Log:
JCR-2104:  JSR 283 Full Versioning (work in progress)

- setActivity
- checkout with activity param -> spi level
- more checks in version manager
- invalidation after sucessful mergeActivity

Modified:
    jackrabbit/trunk/jackrabbit-jcr-client/src/test/java/org/apache/jackrabbit/client/RepositoryFactoryImplTest.java
    jackrabbit/trunk/jackrabbit-jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/JcrVersionManager.java
    jackrabbit/trunk/jackrabbit-jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/NodeImpl.java
    jackrabbit/trunk/jackrabbit-jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/WorkspaceManager.java
    jackrabbit/trunk/jackrabbit-jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/hierarchy/EntryFactory.java
    jackrabbit/trunk/jackrabbit-jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/operation/Checkout.java
    jackrabbit/trunk/jackrabbit-jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/operation/Merge.java
    jackrabbit/trunk/jackrabbit-jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/version/VersionManager.java
    jackrabbit/trunk/jackrabbit-jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/version/VersionManagerImpl.java
    jackrabbit/trunk/jackrabbit-jcr2spi/src/test/java/org/apache/jackrabbit/jcr2spi/AbstractJCR2SPITest.java
    jackrabbit/trunk/jackrabbit-spi-commons/src/main/java/org/apache/jackrabbit/spi/commons/AbstractReadableRepositoryService.java
    jackrabbit/trunk/jackrabbit-spi-commons/src/main/java/org/apache/jackrabbit/spi/commons/logging/RepositoryServiceLogger.java
    jackrabbit/trunk/jackrabbit-spi/src/main/java/org/apache/jackrabbit/spi/RepositoryService.java
    jackrabbit/trunk/jackrabbit-spi2dav/src/main/java/org/apache/jackrabbit/spi2dav/RepositoryServiceImpl.java
    jackrabbit/trunk/jackrabbit-spi2jcr/pom.xml
    jackrabbit/trunk/jackrabbit-spi2jcr/src/main/java/org/apache/jackrabbit/spi2jcr/RepositoryServiceImpl.java

Modified: jackrabbit/trunk/jackrabbit-jcr-client/src/test/java/org/apache/jackrabbit/client/RepositoryFactoryImplTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-jcr-client/src/test/java/org/apache/jackrabbit/client/RepositoryFactoryImplTest.java?rev=803444&r1=803443&r2=803444&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-jcr-client/src/test/java/org/apache/jackrabbit/client/RepositoryFactoryImplTest.java (original)
+++ jackrabbit/trunk/jackrabbit-jcr-client/src/test/java/org/apache/jackrabbit/client/RepositoryFactoryImplTest.java Wed Aug 12 11:02:10 2009
@@ -264,6 +264,9 @@
         public void checkout(SessionInfo sessionInfo, NodeId nodeId) throws UnsupportedRepositoryOperationException, LockException, RepositoryException {
         }
 
+        public void checkout(SessionInfo sessionInfo, NodeId nodeId, NodeId activityId) throws UnsupportedRepositoryOperationException, LockException, RepositoryException {
+        }
+
         public NodeId checkpoint(SessionInfo sessionInfo, NodeId nodeId) throws UnsupportedRepositoryOperationException, RepositoryException {
             return null;
         }

Modified: jackrabbit/trunk/jackrabbit-jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/JcrVersionManager.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/JcrVersionManager.java?rev=803444&r1=803443&r2=803444&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/JcrVersionManager.java (original)
+++ jackrabbit/trunk/jackrabbit-jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/JcrVersionManager.java Wed Aug 12 11:02:10 2009
@@ -22,6 +22,9 @@
 import org.apache.jackrabbit.jcr2spi.version.VersionManager;
 import org.apache.jackrabbit.jcr2spi.hierarchy.NodeEntry;
 import org.apache.jackrabbit.spi.commons.conversion.PathResolver;
+import org.apache.jackrabbit.spi.commons.name.NameConstants;
+import org.apache.jackrabbit.spi.NodeId;
+import org.apache.jackrabbit.spi.ItemId;
 import org.apache.jackrabbit.commons.iterator.NodeIteratorAdapter;
 
 import javax.jcr.version.Version;
@@ -37,6 +40,8 @@
 import javax.jcr.AccessDeniedException;
 import javax.jcr.MergeException;
 import javax.jcr.Node;
+import javax.jcr.ItemNotFoundException;
+import javax.jcr.Repository;
 import javax.jcr.nodetype.ConstraintViolationException;
 import javax.jcr.lock.LockException;
 import java.util.Iterator;
@@ -56,6 +61,12 @@
     private final ItemManager itemManager;
     private final PathResolver resolver;
 
+    /**
+     * The ID of the activity currently in effect for the session this
+     * manager has been created for.
+     */
+    private NodeId activityId;
+
     protected JcrVersionManager(SessionImpl session) {
         this.session = session;
         vMgr = session.getVersionStateManager();
@@ -68,6 +79,8 @@
      * @see javax.jcr.version.VersionManager#checkin(String)
      */
     public Version checkin(String absPath) throws VersionException, UnsupportedRepositoryOperationException, InvalidItemStateException, LockException, RepositoryException {
+        session.checkIsAlive();
+        
         Node n = itemManager.getNode(resolver.getQPath(absPath));
         return n.checkin();
     }
@@ -76,6 +89,8 @@
      * @see javax.jcr.version.VersionManager#checkout(String)
      */
     public void checkout(String absPath) throws UnsupportedRepositoryOperationException, LockException, RepositoryException {
+        session.checkIsAlive();
+
         Node n = itemManager.getNode(resolver.getQPath(absPath));
         n.checkout();
     }
@@ -85,6 +100,7 @@
      */
     public Version checkpoint(String absPath) throws VersionException, UnsupportedRepositoryOperationException, InvalidItemStateException, LockException, RepositoryException {
         session.checkIsAlive();
+
         NodeImpl n = (NodeImpl) itemManager.getNode(resolver.getQPath(absPath));
         return n.checkpoint();
     }
@@ -93,6 +109,8 @@
      * @see javax.jcr.version.VersionManager#isCheckedOut(String)
      */
     public boolean isCheckedOut(String absPath) throws RepositoryException {
+        session.checkIsAlive();
+
         Node n = itemManager.getNode(resolver.getQPath(absPath));
         return n.isCheckedOut();
     }
@@ -101,6 +119,8 @@
      * @see javax.jcr.version.VersionManager#getVersionHistory(String)
      */
     public VersionHistory getVersionHistory(String absPath) throws UnsupportedRepositoryOperationException, RepositoryException {
+        session.checkIsAlive();
+
         Node n = itemManager.getNode(resolver.getQPath(absPath));
         return n.getVersionHistory();
     }
@@ -109,6 +129,8 @@
      * @see javax.jcr.version.VersionManager#getBaseVersion(String)
      */
     public Version getBaseVersion(String absPath) throws UnsupportedRepositoryOperationException, RepositoryException {
+        session.checkIsAlive();
+
         Node n = itemManager.getNode(resolver.getQPath(absPath));
         return n.getBaseVersion();
     }
@@ -131,6 +153,8 @@
      * @see javax.jcr.version.VersionManager#restore(String, String, boolean)
      */
     public void restore(String absPath, String versionName, boolean removeExisting) throws VersionException, ItemExistsException, UnsupportedRepositoryOperationException, LockException, InvalidItemStateException, RepositoryException {
+        session.checkIsAlive();
+
         Node n = itemManager.getNode(resolver.getQPath(absPath));
         n.restore(versionName, removeExisting);
     }
@@ -146,6 +170,8 @@
      * @see javax.jcr.version.VersionManager#restore(String, Version, boolean)
      */
     public void restore(String absPath, Version version, boolean removeExisting) throws PathNotFoundException, ItemExistsException, VersionException, ConstraintViolationException, UnsupportedRepositoryOperationException, LockException, InvalidItemStateException, RepositoryException {
+        session.checkIsAlive();
+
         Node n = itemManager.getNode(resolver.getQPath(absPath));
         n.restore(version, removeExisting);
     }
@@ -154,6 +180,8 @@
      * @see javax.jcr.version.VersionManager#restoreByLabel(String, String, boolean)
      */
     public void restoreByLabel(String absPath, String versionLabel, boolean removeExisting) throws VersionException, ItemExistsException, UnsupportedRepositoryOperationException, LockException, InvalidItemStateException, RepositoryException {
+        session.checkIsAlive();
+
         Node n = itemManager.getNode(resolver.getQPath(absPath));
         n.restoreByLabel(versionLabel, removeExisting);
     }
@@ -169,6 +197,8 @@
      * @see javax.jcr.version.VersionManager#merge(String, String, boolean, boolean)
      */
     public NodeIterator merge(String absPath, String srcWorkspace, boolean bestEffort, boolean isShallow) throws NoSuchWorkspaceException, AccessDeniedException, MergeException, LockException, InvalidItemStateException, RepositoryException {
+        session.checkIsAlive();        
+
         NodeImpl n = (NodeImpl) itemManager.getNode(resolver.getQPath(absPath));
         n.checkIsWritable();
         session.checkHasPendingChanges();
@@ -188,6 +218,8 @@
      * @see javax.jcr.version.VersionManager#doneMerge(String, Version)
      */
     public void doneMerge(String absPath, Version version) throws VersionException, InvalidItemStateException, UnsupportedRepositoryOperationException, RepositoryException {
+        session.checkIsAlive();
+
         Node n = itemManager.getNode(resolver.getQPath(absPath));
         n.doneMerge(version);
     }
@@ -196,6 +228,8 @@
      * @see javax.jcr.version.VersionManager#cancelMerge(String, Version)
      */
     public void cancelMerge(String absPath, Version version) throws VersionException, InvalidItemStateException, UnsupportedRepositoryOperationException, RepositoryException {
+        session.checkIsAlive();                                  
+
         Node n = itemManager.getNode(resolver.getQPath(absPath));
         n.cancelMerge(version);
     }
@@ -204,7 +238,8 @@
      * @see javax.jcr.version.VersionManager#createConfiguration(String)
      */
     public Node createConfiguration(String absPath) throws UnsupportedRepositoryOperationException, RepositoryException {
-        // TODO: add validation
+        session.checkIsAlive();
+
         NodeImpl n = (NodeImpl) itemManager.getNode(resolver.getQPath(absPath));
         NodeEntry entry = vMgr.createConfiguration((NodeState) n.getItemState());
         return (Node) itemManager.getItem(entry);
@@ -214,23 +249,47 @@
      * @see javax.jcr.version.VersionManager#setActivity(Node)
      */
     public Node setActivity(Node activity) throws UnsupportedRepositoryOperationException, RepositoryException {
-        // TODO
-        throw new UnsupportedOperationException("JCR-2104: JSR 283 Versioning. Implementation missing");
+        session.checkIsAlive();
+        session.checkSupportedOption(Repository.OPTION_ACTIVITIES_SUPPORTED);
+
+
+        Node oldActivity = getActivity();
+        if (activity == null) {
+            activityId = null;
+        } else {
+            NodeImpl activityNode = getValidActivity(activity, "set");
+            activityId = (NodeId) activityNode.getItemState().getId();
+        }
+        return oldActivity;
     }
 
     /**
      * @see javax.jcr.version.VersionManager#getActivity()
      */
     public Node getActivity() throws UnsupportedRepositoryOperationException, RepositoryException {
-        // TODO
-        throw new UnsupportedOperationException("JCR-2104: JSR 283 Versioning. Implementation missing");
+        session.checkIsAlive();
+        session.checkSupportedOption(Repository.OPTION_ACTIVITIES_SUPPORTED);
+
+        if (activityId == null) {
+            return null;
+        } else {
+            try {
+                return (Node) itemManager.getItem(session.getHierarchyManager().getNodeEntry(activityId));
+            } catch (ItemNotFoundException e) {
+                // the activity doesn't exist any more.
+                log.warn("Activity node with id " + activityId + " doesn't exist any more.");
+                activityId = null;
+                return null;
+            }
+        }
     }
 
     /**
      * @see javax.jcr.version.VersionManager#createActivity(String)
      */
     public Node createActivity(String title) throws UnsupportedRepositoryOperationException, RepositoryException {
-        // TODO: add validation
+        session.checkIsAlive();
+
         NodeEntry entry = vMgr.createActivity(title);
         return (Node) itemManager.getItem(entry);
     }
@@ -239,16 +298,57 @@
      * @see javax.jcr.version.VersionManager#removeActivity(Node)
      */
     public void removeActivity(Node activityNode) throws UnsupportedRepositoryOperationException, RepositoryException {
-        vMgr.removeActivity((NodeState) ((NodeImpl) activityNode).getItemState());
+        session.checkIsAlive();
+        NodeImpl activity = getValidActivity(activityNode, "remove");
+
+        NodeState nState = (NodeState) activity.getItemState();
+        ItemId removeId = nState.getId();
+        vMgr.removeActivity(nState);
+
+        // if the removal succeeded, make sure there is no current activity
+        // setting on this session, that points to the removed activity.
+        if (activityId != null && activityId.equals(removeId)) {
+            activityId = null;
+        }
     }
 
     /**
      * @see javax.jcr.version.VersionManager#merge(Node)
      */
     public NodeIterator merge(Node activityNode) throws VersionException, AccessDeniedException, MergeException, LockException, InvalidItemStateException, RepositoryException {
-        // TODO: add validation
-        Iterator failedIds = vMgr.mergeActivity((NodeState) ((NodeImpl) activityNode).getItemState());
+        session.checkIsAlive();
+        NodeImpl activity = getValidActivity(activityNode, "merge");
+        Iterator failedIds = vMgr.mergeActivity((NodeState) activity.getItemState());
         return new LazyItemIterator(itemManager, session.getHierarchyManager(), failedIds);
     }
 
+    /**
+     * Assert that activity nodes passes to any of the activity methods have
+     * been obtained from the session this version manager has been created for.
+     * This is particularly important for workspace operations that are followed
+     * by internal updated of modified items: The hierarchy entries invalidated
+     * after successful completion of the operation must reside within scope
+     * defined by this session.
+     * <br>
+     * In addition this method varifies that the passed node is of type nt:activity.
+     *
+     * @param activityNode
+     * @param methodName
+     * @return
+     * @throws RepositoryException
+     */
+    private NodeImpl getValidActivity(Node activityNode, String methodName) throws UnsupportedRepositoryOperationException, RepositoryException {
+        NodeImpl activity;
+        if (session != activityNode.getSession()) {
+            String msg = "Attempt to " +methodName+ " an activity node that has been retrieved by another session.";
+            log.warn(msg);
+            activity = (NodeImpl) session.getNodeByIdentifier(activityNode.getIdentifier());
+        } else {
+            activity = (NodeImpl) activityNode;
+        }
+        if (!activity.isNodeType(NameConstants.NT_ACTIVITY)) {
+            throw new UnsupportedRepositoryOperationException("Given node is not an activity.");
+        }
+        return activity;
+    }
 }
\ No newline at end of file

Modified: jackrabbit/trunk/jackrabbit-jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/NodeImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/NodeImpl.java?rev=803444&r1=803443&r2=803444&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/NodeImpl.java (original)
+++ jackrabbit/trunk/jackrabbit-jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/NodeImpl.java Wed Aug 12 11:02:10 2009
@@ -42,6 +42,7 @@
 import javax.jcr.UnsupportedRepositoryOperationException;
 import javax.jcr.Value;
 import javax.jcr.ValueFormatException;
+import javax.jcr.Repository;
 import javax.jcr.lock.Lock;
 import javax.jcr.lock.LockException;
 import javax.jcr.nodetype.ConstraintViolationException;
@@ -77,6 +78,7 @@
 import org.apache.jackrabbit.spi.QPropertyDefinition;
 import org.apache.jackrabbit.spi.QValue;
 import org.apache.jackrabbit.spi.PropertyId;
+import org.apache.jackrabbit.spi.NodeId;
 import org.apache.jackrabbit.spi.commons.conversion.NameException;
 import org.apache.jackrabbit.spi.commons.name.NameConstants;
 import org.apache.jackrabbit.spi.commons.value.ValueFormat;
@@ -876,7 +878,13 @@
         checkIsVersionable();
         checkIsLocked();
         if (!isCheckedOut()) {
-            session.getVersionStateManager().checkout(getNodeState());
+            if (session.isSupportedOption(Repository.OPTION_ACTIVITIES_SUPPORTED)) {
+                NodeImpl activity = (NodeImpl) session.getWorkspace().getVersionManager().getActivity();
+                NodeId activityId = (activity == null) ? null : activity.getNodeState().getNodeId();
+                session.getVersionStateManager().checkout(getNodeState(), activityId);
+            } else {
+                session.getVersionStateManager().checkout(getNodeState());
+            }
         } else {
             // nothing to do
             log.debug("Node " + safeGetJCRPath() + " is already checked out.");

Modified: jackrabbit/trunk/jackrabbit-jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/WorkspaceManager.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/WorkspaceManager.java?rev=803444&r1=803443&r2=803444&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/WorkspaceManager.java (original)
+++ jackrabbit/trunk/jackrabbit-jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/WorkspaceManager.java Wed Aug 12 11:02:10 2009
@@ -963,7 +963,11 @@
          * @see OperationVisitor#visit(Checkout)
          */
         public void visit(Checkout operation) throws UnsupportedRepositoryOperationException, LockException, RepositoryException {
-            service.checkout(sessionInfo, operation.getNodeId());
+            if (operation.supportsActivity()) {
+                service.checkout(sessionInfo, operation.getNodeId(), operation.getActivityId());
+            } else {
+                service.checkout(sessionInfo, operation.getNodeId());
+            }
         }
 
         /**

Modified: jackrabbit/trunk/jackrabbit-jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/hierarchy/EntryFactory.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/hierarchy/EntryFactory.java?rev=803444&r1=803443&r2=803444&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/hierarchy/EntryFactory.java (original)
+++ jackrabbit/trunk/jackrabbit-jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/hierarchy/EntryFactory.java Wed Aug 12 11:02:10 2009
@@ -23,16 +23,12 @@
 import org.apache.jackrabbit.spi.Path;
 import org.apache.jackrabbit.spi.PathFactory;
 import org.apache.jackrabbit.spi.commons.conversion.NamePathResolver;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 
 /**
  * <code>EntryFactory</code>...
  */
 public class EntryFactory {
 
-    private static Logger log = LoggerFactory.getLogger(EntryFactory.class);
-
     /**
      * IdFactory to create an ItemId based on the parent NodeId.
      */
@@ -43,7 +39,7 @@
     private final NodeEntry rootEntry;
 
     /**
-     *
+     * Listener to creation and uid-changes of node entries.
      */
     private final NodeEntryListener listener;
 

Modified: jackrabbit/trunk/jackrabbit-jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/operation/Checkout.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/operation/Checkout.java?rev=803444&r1=803443&r2=803444&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/operation/Checkout.java (original)
+++ jackrabbit/trunk/jackrabbit-jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/operation/Checkout.java Wed Aug 12 11:02:10 2009
@@ -41,11 +41,23 @@
     private static Logger log = LoggerFactory.getLogger(Checkout.class);
 
     private final NodeState nodeState;
+    private final NodeId activityId;
+    private final boolean supportsActivity;
     private final VersionManager mgr;
 
     private Checkout(NodeState nodeState, VersionManager mgr) {
         this.nodeState = nodeState;
         this.mgr = mgr;
+        supportsActivity = false;
+        activityId = null;
+        // NOTE: affected-states only needed for transient modifications
+    }
+
+    private Checkout(NodeState nodeState, NodeId activityId, VersionManager mgr) {
+        this.nodeState = nodeState;
+        this.activityId = activityId;
+        this.mgr = mgr;
+        supportsActivity = true;
         // NOTE: affected-states only needed for transient modifications
     }
 
@@ -90,8 +102,32 @@
         return nodeState.getNodeEntry().getWorkspaceId();
     }
 
+    /**
+     * The id of the current activity present on the editing session or <code>null</code>.
+     *
+     * @return id of the current activity present on the editing session or <code>null</code>.
+     */
+    public NodeId getActivityId() {
+        return activityId;
+    }
+
+    /**
+     * Returns <code>true</code>, if activities are supported, 
+     * <code>false</code> otherwise.
+     *
+     * @return  <code>true</code>, if activities are supported,
+     * <code>false</code> otherwise.
+     */
+    public boolean supportsActivity() {
+        return supportsActivity;
+    }
+
     //------------------------------------------------------------< Factory >---
     public static Operation create(NodeState nodeState, VersionManager mgr) {
         return new Checkout(nodeState, mgr);
     }
+
+    public static Operation create(NodeState nodeState, NodeId activityId, VersionManager mgr) {
+        return new Checkout(nodeState, activityId, mgr);
+    }
 }
\ No newline at end of file

Modified: jackrabbit/trunk/jackrabbit-jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/operation/Merge.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/operation/Merge.java?rev=803444&r1=803443&r2=803444&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/operation/Merge.java (original)
+++ jackrabbit/trunk/jackrabbit-jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/operation/Merge.java Wed Aug 12 11:02:10 2009
@@ -19,6 +19,7 @@
 import org.apache.jackrabbit.jcr2spi.state.NodeState;
 import org.apache.jackrabbit.jcr2spi.version.VersionManager;
 import org.apache.jackrabbit.jcr2spi.hierarchy.NodeEntry;
+import org.apache.jackrabbit.jcr2spi.hierarchy.HierarchyEntry;
 import org.apache.jackrabbit.spi.NodeId;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -75,7 +76,13 @@
         assert status == STATUS_PENDING;
         status = STATUS_PERSISTED;
         if (isActivityMerge()) {
-            // TODO invalidate
+            // TODO be more specific about what needs to be invalidated
+            // look for the root entry and invalidate the complete tree
+            HierarchyEntry entry = nodeState.getNodeEntry();
+            while (entry.getParent() != null) {
+                entry = entry.getParent();
+            }
+            entry.invalidate(true);
         } else {
             try {
                 NodeEntry vhe = mgr.getVersionHistoryEntry(nodeState);

Modified: jackrabbit/trunk/jackrabbit-jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/version/VersionManager.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/version/VersionManager.java?rev=803444&r1=803443&r2=803444&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/version/VersionManager.java (original)
+++ jackrabbit/trunk/jackrabbit-jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/version/VersionManager.java Wed Aug 12 11:02:10 2009
@@ -18,6 +18,7 @@
 
 import org.apache.jackrabbit.spi.Name;
 import org.apache.jackrabbit.spi.Path;
+import org.apache.jackrabbit.spi.NodeId;
 import org.apache.jackrabbit.jcr2spi.state.NodeState;
 import org.apache.jackrabbit.jcr2spi.hierarchy.NodeEntry;
 
@@ -61,6 +62,14 @@
     public void checkout(NodeState nodeState) throws UnsupportedRepositoryOperationException, LockException, RepositoryException;
 
     /**
+     * 
+     * @param nodeState
+     * @param activityId
+     * @throws RepositoryException
+     */
+    public void checkout(NodeState nodeState, NodeId activityId) throws RepositoryException;
+
+    /**
      * @param nodeState
      * @throws RepositoryException
      * @see javax.jcr.version.VersionManager#checkpoint(String)

Modified: jackrabbit/trunk/jackrabbit-jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/version/VersionManagerImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/version/VersionManagerImpl.java?rev=803444&r1=803443&r2=803444&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/version/VersionManagerImpl.java (original)
+++ jackrabbit/trunk/jackrabbit-jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/version/VersionManagerImpl.java Wed Aug 12 11:02:10 2009
@@ -34,8 +34,6 @@
 import org.apache.jackrabbit.jcr2spi.operation.RemoveActivity;
 import org.apache.jackrabbit.jcr2spi.WorkspaceManager;
 import org.apache.jackrabbit.jcr2spi.hierarchy.NodeEntry;
-import org.slf4j.LoggerFactory;
-import org.slf4j.Logger;
 
 import javax.jcr.RepositoryException;
 import javax.jcr.ItemNotFoundException;
@@ -60,8 +58,6 @@
  */
 public class VersionManagerImpl implements VersionManager {
 
-    private static Logger log = LoggerFactory.getLogger(VersionManagerImpl.class);
-
     private final WorkspaceManager workspaceManager;
 
     public VersionManagerImpl(WorkspaceManager workspaceManager) {
@@ -75,7 +71,11 @@
     }
 
     public void checkout(NodeState nodeState) throws RepositoryException {
-        Operation co = Checkout.create(nodeState, this);
+        checkout(nodeState, null);
+    }
+
+    public void checkout(NodeState nodeState, NodeId activityId) throws RepositoryException {
+        Operation co = Checkout.create(nodeState, activityId, this);
         workspaceManager.execute(co);
     }
 

Modified: jackrabbit/trunk/jackrabbit-jcr2spi/src/test/java/org/apache/jackrabbit/jcr2spi/AbstractJCR2SPITest.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-jcr2spi/src/test/java/org/apache/jackrabbit/jcr2spi/AbstractJCR2SPITest.java?rev=803444&r1=803443&r2=803444&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-jcr2spi/src/test/java/org/apache/jackrabbit/jcr2spi/AbstractJCR2SPITest.java (original)
+++ jackrabbit/trunk/jackrabbit-jcr2spi/src/test/java/org/apache/jackrabbit/jcr2spi/AbstractJCR2SPITest.java Wed Aug 12 11:02:10 2009
@@ -362,9 +362,12 @@
         repositoryService.checkout(sessionInfo, nodeId);
     }
 
+    public void checkout(SessionInfo sessionInfo, NodeId nodeId, NodeId activityId) throws RepositoryException {
+        repositoryService.checkout(sessionInfo, nodeId, activityId);
+    }
+
     public NodeId checkpoint(SessionInfo sessionInfo, NodeId nodeId)
             throws RepositoryException {
-
         return repositoryService.checkpoint(sessionInfo, nodeId);
     }
 
@@ -418,7 +421,6 @@
 
     public NodeId createActivity(SessionInfo sessionInfo, String title)
             throws RepositoryException {
-
         return repositoryService.createActivity(sessionInfo, title);
     }
 
@@ -436,10 +438,9 @@
 
     public NodeId createConfiguration(SessionInfo sessionInfo, NodeId nodeId)
             throws RepositoryException {
-
         return repositoryService.createConfiguration(sessionInfo, nodeId);
     }
-
+    
     //----------------------------------------------------------< Searching >---
 
     public String[] getSupportedQueryLanguages(SessionInfo sessionInfo) throws RepositoryException {

Modified: jackrabbit/trunk/jackrabbit-spi-commons/src/main/java/org/apache/jackrabbit/spi/commons/AbstractReadableRepositoryService.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-spi-commons/src/main/java/org/apache/jackrabbit/spi/commons/AbstractReadableRepositoryService.java?rev=803444&r1=803443&r2=803444&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-spi-commons/src/main/java/org/apache/jackrabbit/spi/commons/AbstractReadableRepositoryService.java (original)
+++ jackrabbit/trunk/jackrabbit-spi-commons/src/main/java/org/apache/jackrabbit/spi/commons/AbstractReadableRepositoryService.java Wed Aug 12 11:02:10 2009
@@ -558,6 +558,14 @@
     /**
      * @throws UnsupportedRepositoryOperationException always.
      */
+    public void checkout(SessionInfo sessionInfo, NodeId nodeId, NodeId activityId)
+            throws UnsupportedRepositoryOperationException, LockException, RepositoryException {
+        throw new UnsupportedRepositoryOperationException();
+    }
+
+    /**
+     * @throws UnsupportedRepositoryOperationException always.
+     */
     public NodeId checkpoint(SessionInfo sessionInfo, NodeId nodeId)
             throws UnsupportedRepositoryOperationException, LockException, RepositoryException {
         throw new UnsupportedRepositoryOperationException();

Modified: jackrabbit/trunk/jackrabbit-spi-commons/src/main/java/org/apache/jackrabbit/spi/commons/logging/RepositoryServiceLogger.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-spi-commons/src/main/java/org/apache/jackrabbit/spi/commons/logging/RepositoryServiceLogger.java?rev=803444&r1=803443&r2=803444&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-spi-commons/src/main/java/org/apache/jackrabbit/spi/commons/logging/RepositoryServiceLogger.java (original)
+++ jackrabbit/trunk/jackrabbit-spi-commons/src/main/java/org/apache/jackrabbit/spi/commons/logging/RepositoryServiceLogger.java Wed Aug 12 11:02:10 2009
@@ -398,6 +398,17 @@
         }, "checkout(SessionInfo, NodeId)", new Object[]{unwrap(sessionInfo), nodeId});
     }
 
+    public void checkout(final SessionInfo sessionInfo, final NodeId nodeId, final NodeId activityId)
+            throws RepositoryException {
+
+        execute(new Callable() {
+            public Object call() throws RepositoryException {
+                service.checkout(unwrap(sessionInfo), nodeId, activityId);
+                return null;
+            }
+        }, "checkout(SessionInfo, NodeId, NodeId)", new Object[]{unwrap(sessionInfo), nodeId, activityId});
+    }
+
     public NodeId checkpoint(final SessionInfo sessionInfo, final NodeId nodeId) throws UnsupportedRepositoryOperationException, RepositoryException {
         return (NodeId) execute(new Callable() {
             public Object call() throws RepositoryException {

Modified: jackrabbit/trunk/jackrabbit-spi/src/main/java/org/apache/jackrabbit/spi/RepositoryService.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-spi/src/main/java/org/apache/jackrabbit/spi/RepositoryService.java?rev=803444&r1=803443&r2=803444&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-spi/src/main/java/org/apache/jackrabbit/spi/RepositoryService.java (original)
+++ jackrabbit/trunk/jackrabbit-spi/src/main/java/org/apache/jackrabbit/spi/RepositoryService.java Wed Aug 12 11:02:10 2009
@@ -613,7 +613,8 @@
 
     /**
      * Performs a checkout for the <code>Node</code> identified by the given
-     * <code>NodeId</code>.
+     * <code>NodeId</code>. Same as {@link #checkout(SessionInfo, NodeId, NodeId)}
+     * where the <code>activityId</code> is <code>null</code>.
      *
      * @param sessionInfo
      * @param nodeId
@@ -625,6 +626,23 @@
     public void checkout(SessionInfo sessionInfo, NodeId nodeId) throws UnsupportedRepositoryOperationException, LockException, RepositoryException;
 
     /**
+     * Performs a checkout for the <code>Node</code> identified by the given
+     * <code>NodeId</code> and for activity identified by the specified
+     * <code>activityId</code>. If the <code>activityId</code> is <code>null</code>
+     * this corresponds to {@link #checkout(SessionInfo, NodeId)}
+     *
+     * @param sessionInfo
+     * @param nodeId
+     * @param activityId  Id of the activity node set to the editing session or
+     * <code>null</code> if no activity is in effect.
+     * @throws UnsupportedRepositoryOperationException
+     * @throws LockException
+     * @throws RepositoryException
+     * @since JCR 2.0
+     */
+    public void checkout(SessionInfo sessionInfo, NodeId nodeId, NodeId activityId) throws UnsupportedRepositoryOperationException, LockException, RepositoryException;
+
+    /**
      * Performs a checkpoint for the <code>Node</code> identified by the given
      * <code>NodeId</code>.
      *

Modified: jackrabbit/trunk/jackrabbit-spi2dav/src/main/java/org/apache/jackrabbit/spi2dav/RepositoryServiceImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-spi2dav/src/main/java/org/apache/jackrabbit/spi2dav/RepositoryServiceImpl.java?rev=803444&r1=803443&r2=803444&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-spi2dav/src/main/java/org/apache/jackrabbit/spi2dav/RepositoryServiceImpl.java (original)
+++ jackrabbit/trunk/jackrabbit-spi2dav/src/main/java/org/apache/jackrabbit/spi2dav/RepositoryServiceImpl.java Wed Aug 12 11:02:10 2009
@@ -1463,6 +1463,17 @@
         execute(method, sessionInfo);
     }
 
+    /**
+     * @see RepositoryService#checkout(SessionInfo, NodeId, NodeId)
+     */
+    public void checkout(SessionInfo sessionInfo, NodeId nodeId, NodeId activityOd) throws UnsupportedRepositoryOperationException, LockException, RepositoryException {
+        // TODO
+        throw new UnsupportedOperationException("JCR-2104: JSR 283 Versioning. Implementation missing");
+    }
+
+    /**
+     * @see RepositoryService#checkpoint(SessionInfo, NodeId)
+     */
     public NodeId checkpoint(SessionInfo sessionInfo, NodeId nodeId) throws UnsupportedRepositoryOperationException, RepositoryException {
         // TODO
         throw new UnsupportedOperationException("JCR-2104: JSR 283 Versioning. Implementation missing");

Modified: jackrabbit/trunk/jackrabbit-spi2jcr/pom.xml
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-spi2jcr/pom.xml?rev=803444&r1=803443&r2=803444&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-spi2jcr/pom.xml (original)
+++ jackrabbit/trunk/jackrabbit-spi2jcr/pom.xml Wed Aug 12 11:02:10 2009
@@ -71,9 +71,9 @@
                 org.apache.jackrabbit.jcr2spi.name.NamespaceRegistryTest#testRegisteredNamespaceVisibility
                 org.apache.jackrabbit.test.api.ShareableNodeTest
                 org.apache.jackrabbit.test.api.version.simple
-                org.apache.jackrabbit.test.api.version.ActivitiesTest
-                org.apache.jackrabbit.test.api.version.MergeActivityTest
-                org.apache.jackrabbit.test.api.version.ConfigurationsTest
+                org.apache.jackrabbit.test.api.version.ActivitiesTest#testActivitiesPath
+                org.apache.jackrabbit.test.api.version.ActivitiesTest#testActivitiesRelation
+                org.apache.jackrabbit.test.api.version.ConfigurationsTest#testCreateConfigWithBaseline
                 org.apache.jackrabbit.test.api.LifecycleTest
                 org.apache.jackrabbit.test.api.RepositoryDescriptorTest#testRequiredDescriptors
                 org.apache.jackrabbit.test.api.RepositoryDescriptorTest#testGetDescriptorValues

Modified: jackrabbit/trunk/jackrabbit-spi2jcr/src/main/java/org/apache/jackrabbit/spi2jcr/RepositoryServiceImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-spi2jcr/src/main/java/org/apache/jackrabbit/spi2jcr/RepositoryServiceImpl.java?rev=803444&r1=803443&r2=803444&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-spi2jcr/src/main/java/org/apache/jackrabbit/spi2jcr/RepositoryServiceImpl.java (original)
+++ jackrabbit/trunk/jackrabbit-spi2jcr/src/main/java/org/apache/jackrabbit/spi2jcr/RepositoryServiceImpl.java Wed Aug 12 11:02:10 2009
@@ -684,7 +684,22 @@
         final SessionInfoImpl sInfo = getSessionInfoImpl(sessionInfo);
         executeWithLocalEvents(new Callable() {
             public Object run() throws RepositoryException {
-                getNode(nodeId, getSessionInfoImpl(sessionInfo)).checkout();
+                getNode(nodeId, sInfo).checkout();
+                return null;
+            }
+        }, sInfo);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void checkout(final SessionInfo sessionInfo, final NodeId nodeId, NodeId activityId) throws UnsupportedRepositoryOperationException, LockException, RepositoryException {
+        final SessionInfoImpl sInfo = getSessionInfoImpl(sessionInfo);
+        Node activity = (activityId == null) ? null : getNode(activityId, sInfo);
+        sInfo.getSession().getWorkspace().getVersionManager().setActivity(activity);
+        executeWithLocalEvents(new Callable() {
+            public Object run() throws RepositoryException {
+                getNode(nodeId, sInfo).checkout();
                 return null;
             }
         }, sInfo);
@@ -966,11 +981,10 @@
     public void removeActivity(SessionInfo sessionInfo, final NodeId activityId) throws UnsupportedRepositoryOperationException, RepositoryException {
         final SessionInfoImpl sInfo = getSessionInfoImpl(sessionInfo);
         final VersionManager vMgr = getVersionManager(sInfo);
-        Node activity = (Node) executeWithLocalEvents(new Callable() {
+        executeWithLocalEvents(new Callable() {
             public Object run() throws RepositoryException {
-                // TODO: uncomment as soon as removeActivity method is fixed in jsr 283
-                // return vMgr.removeActivity(getNode(activityId, sInfo));
-                throw new UnsupportedOperationException("Impl missing... waiting for updated jsr 283 jar.");
+                vMgr.removeActivity(getNode(activityId, sInfo));
+                return null;
             }
         }, getSessionInfoImpl(sessionInfo));
     }