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 2006/08/17 15:28:59 UTC

svn commit: r432234 [2/2] - in /jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi: ./ lock/ operation/ state/ version/

Modified: jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/version/VersionManagerImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/version/VersionManagerImpl.java?rev=432234&r1=432233&r2=432234&view=diff
==============================================================================
--- jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/version/VersionManagerImpl.java (original)
+++ jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/version/VersionManagerImpl.java Thu Aug 17 06:28:58 2006
@@ -17,9 +17,9 @@
 package org.apache.jackrabbit.jcr2spi.version;
 
 import org.apache.jackrabbit.jcr2spi.state.NodeState;
-import org.apache.jackrabbit.jcr2spi.state.UpdatableItemStateManager;
 import org.apache.jackrabbit.jcr2spi.state.PropertyState;
 import org.apache.jackrabbit.jcr2spi.state.ItemStateException;
+import org.apache.jackrabbit.jcr2spi.state.ItemState;
 import org.apache.jackrabbit.jcr2spi.observation.InternalEventListener;
 import org.apache.jackrabbit.jcr2spi.operation.Operation;
 import org.apache.jackrabbit.jcr2spi.operation.Checkout;
@@ -30,14 +30,17 @@
 import org.apache.jackrabbit.jcr2spi.operation.Remove;
 import org.apache.jackrabbit.jcr2spi.operation.AddLabel;
 import org.apache.jackrabbit.jcr2spi.operation.RemoveLabel;
+import org.apache.jackrabbit.jcr2spi.WorkspaceManager;
 import org.slf4j.LoggerFactory;
 import org.slf4j.Logger;
 
 import javax.jcr.RepositoryException;
+import javax.jcr.version.VersionException;
+
 import org.apache.jackrabbit.name.QName;
+import org.apache.jackrabbit.name.Path;
 import org.apache.jackrabbit.spi.EventIterator;
 import org.apache.jackrabbit.spi.Event;
-import org.apache.jackrabbit.spi.NodeId;
 
 import java.util.Collection;
 import java.util.List;
@@ -50,20 +53,22 @@
 
     private static Logger log = LoggerFactory.getLogger(VersionManagerImpl.class);
 
-    private final UpdatableItemStateManager stateManager;
+    private final WorkspaceManager workspaceManager;
 
-    public VersionManagerImpl(UpdatableItemStateManager stateManager) {
-        this.stateManager = stateManager;
+    public VersionManagerImpl(WorkspaceManager workspaceManager) {
+        this.workspaceManager = workspaceManager;
     }
 
     public void checkin(NodeState nodeState) throws RepositoryException {
-        Operation ci = Checkin.create(nodeState);
-        stateManager.execute(ci);
+        NodeState wspState = getWorkspaceState(nodeState);
+        Operation ci = Checkin.create(wspState);
+        workspaceManager.execute(ci);
     }
 
     public void checkout(NodeState nodeState) throws RepositoryException {
-        Operation co = Checkout.create(nodeState);
-        stateManager.execute(co);
+        NodeState wspState = getWorkspaceState(nodeState);
+        Operation co = Checkout.create(wspState);
+        workspaceManager.execute(co);
     }
 
     /**
@@ -75,21 +80,27 @@
      * @throws RepositoryException
      */
     public boolean isCheckedOut(NodeState nodeState) throws RepositoryException {
+        // shortcut: if state is new, its ancestor must be checkout
+        if (nodeState.getStatus() == ItemState.STATUS_NEW) {
+            return true;
+        }
+
+        NodeState wspState = getWorkspaceState(nodeState);
         try {
             /**
              * FIXME should not only rely on existence of jcr:isCheckedOut property
              * but also verify that node.isNodeType("mix:versionable")==true;
              * this would have a negative impact on performance though...
              */
-            while (!nodeState.hasPropertyName(QName.JCR_ISCHECKEDOUT)) {
-                NodeState parentState = nodeState.getParent();
+            while (!wspState.hasPropertyName(QName.JCR_ISCHECKEDOUT)) {
+                NodeState parentState = wspState.getParent();
                 if (parentState == null) {
                     // reached root state without finding a jcr:isCheckedOut property
                     return true;
                 }
-                nodeState = parentState;
+                wspState = parentState;
             }
-            PropertyState propState = nodeState.getPropertyState(QName.JCR_ISCHECKEDOUT);
+            PropertyState propState = wspState.getPropertyState(QName.JCR_ISCHECKEDOUT);
             Boolean b = Boolean.valueOf(propState.getValue().getString());
             return b.booleanValue();
         } catch (ItemStateException e) {
@@ -98,32 +109,51 @@
         }
     }
 
+    public void checkIsCheckedOut(NodeState nodeState) throws VersionException, RepositoryException {
+        if (!isCheckedOut(nodeState)) {
+            throw new VersionException(nodeState + " is checked-in");
+        }
+    }
+
     public void removeVersion(NodeState versionHistoryState, NodeState versionState) throws RepositoryException {
-        Operation op = Remove.create(versionState);
-        stateManager.execute(op);
+        NodeState wspVersionState = getWorkspaceState(versionState);
+        Operation op = Remove.create(wspVersionState);
+        workspaceManager.execute(op);
     }
 
     public void addVersionLabel(NodeState versionHistoryState, NodeState versionState, QName qLabel, boolean moveLabel) throws RepositoryException {
-        Operation op = AddLabel.create(versionHistoryState, versionState, qLabel, moveLabel);
-        stateManager.execute(op);
+        NodeState wspVHState = getWorkspaceState(versionHistoryState);
+        NodeState wspVState = getWorkspaceState(versionState);
+        Operation op = AddLabel.create(wspVHState, wspVState, qLabel, moveLabel);
+        workspaceManager.execute(op);
     }
 
     public void removeVersionLabel(NodeState versionHistoryState, NodeState versionState, QName qLabel) throws RepositoryException {
-        Operation op = RemoveLabel.create(versionHistoryState, versionState, qLabel);
-        stateManager.execute(op);
-    }
-
-    public void restore(NodeId nodeId, NodeId versionId, boolean removeExisting) throws RepositoryException {
-        Operation op = Restore.create(nodeId, versionId, removeExisting);
-        stateManager.execute(op);
-    }
+        NodeState wspVHState = getWorkspaceState(versionHistoryState);
+        NodeState wspVState = getWorkspaceState(versionState);
+        Operation op = RemoveLabel.create(wspVHState, wspVState, qLabel);
+        workspaceManager.execute(op);
+    }
+
+    public void restore(NodeState nodeState, Path relativePath, NodeState versionState, boolean removeExisting) throws RepositoryException {
+        NodeState wspState = getWorkspaceState(nodeState);
+        NodeState wspVState = getWorkspaceState(versionState);
+        Operation op = Restore.create(wspState, relativePath, wspVState, removeExisting);
+        workspaceManager.execute(op);
+    }
+
+    public void restore(NodeState[] versionStates, boolean removeExisting) throws RepositoryException {
+        NodeState[] wspStates = new NodeState[versionStates.length];
+        for (int i = 0; i < versionStates.length; i++) {
+            wspStates[i] = getWorkspaceState(versionStates[i]);
+        }
 
-    public void restore(NodeId[] versionIds, boolean removeExisting) throws RepositoryException {
-        Operation op = Restore.create(versionIds, removeExisting);
-        stateManager.execute(op);
+        Operation op = Restore.create(wspStates, removeExisting);
+        workspaceManager.execute(op);
     }
 
     public Collection merge(NodeState nodeState, String workspaceName, boolean bestEffort) throws RepositoryException {
+        NodeState wspState = getWorkspaceState(nodeState);
         // TODO find better solution to build the mergeFailed-collection
         final List failedIds = new ArrayList();
         InternalEventListener mergeFailedCollector = new InternalEventListener() {
@@ -139,13 +169,34 @@
             }
         };
 
-        Operation op = Merge.create(nodeState, workspaceName, bestEffort, mergeFailedCollector);
-        stateManager.execute(op);
+        Operation op = Merge.create(wspState, workspaceName, bestEffort, mergeFailedCollector);
+        workspaceManager.execute(op);
         return failedIds;
     }
 
     public void resolveMergeConflict(NodeState nodeState, NodeState versionState, boolean done) throws RepositoryException {
-        Operation op = ResolveMergeConflict.create(nodeState, versionState, done);
-        stateManager.execute(op);
+        NodeState wspState = getWorkspaceState(nodeState);
+        NodeState wspVState = getWorkspaceState(versionState);
+        Operation op = ResolveMergeConflict.create(wspState, wspVState, done);
+        workspaceManager.execute(op);
+    }
+
+    //------------------------------------------------------------< private >---
+    /**
+     * If the given <code>NodeState</code> has an overlayed state, the overlayed
+     * (workspace) state will be returned. Otherwise the given state is returned.
+     *
+     * @param nodeState
+     * @return The overlayed state or the given state, if this one does not have
+     * an overlayed state.
+     */
+    private NodeState getWorkspaceState(NodeState nodeState) {
+        if (nodeState.hasOverlayedState()) {
+            // nodestate has been obtained from  Session-ISM
+            return (NodeState) nodeState.getOverlayedState();
+        } else {
+            // nodestate has been obtained from Workspace-ISM already
+            return nodeState;
+        }
     }
 }