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/05/12 10:59:35 UTC

svn commit: r773828 - in /jackrabbit/trunk: jackrabbit-core/src/main/java/org/apache/jackrabbit/core/version/ jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/commons/iterator/ jackrabbit-jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/ j...

Author: angela
Date: Tue May 12 08:59:34 2009
New Revision: 773828

URL: http://svn.apache.org/viewvc?rev=773828&view=rev
Log:
JCR-2104: JSR 283 Versioning
   - VersionHistory.getAllFrozenNodes()  (move iteratoradaptor from core to jcr-commons), VersionHistory.getVersionableIdentifier()
   - Version.getFrozenNode, Version.getLinearPredecessor()
   - VersionManager (work in progress): 170-methods, shallow merge, checkpoint
      -> extend SPI interfaces accordingly

JCR-2003: JCR2SPI / SPI: Add support for JCR 2.0
   - Session.hasPermission()
   - Node.getProperties/getNodes with glob
   - Node.getIdentifier()

JCR-2004: Update SPI locking to match JCR 2.0
   - separate JCR LockManager from the internal lock manager

Added:
    jackrabbit/trunk/jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/commons/iterator/FrozenNodeIteratorAdapter.java   (contents, props changed)
      - copied, changed from r773800, jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/version/FrozenNodeIteratorAdapter.java
    jackrabbit/trunk/jackrabbit-jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/JcrLockManager.java
    jackrabbit/trunk/jackrabbit-jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/JcrVersionManager.java   (contents, props changed)
      - copied, changed from r772858, jackrabbit/trunk/jackrabbit-jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/version/VersionManagerImpl.java
Removed:
    jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/version/FrozenNodeIteratorAdapter.java
    jackrabbit/trunk/jackrabbit-jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/version/DefaultVersionManager.java
Modified:
    jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/version/JcrVersionManagerImpl.java
    jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/version/VersionHistoryImpl.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/SessionImpl.java
    jackrabbit/trunk/jackrabbit-jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/WorkspaceImpl.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/lock/LockManagerImpl.java
    jackrabbit/trunk/jackrabbit-jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/lock/LockStateManager.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/operation/OperationVisitor.java
    jackrabbit/trunk/jackrabbit-jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/SessionItemStateManager.java
    jackrabbit/trunk/jackrabbit-jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/version/VersionHistoryImpl.java
    jackrabbit/trunk/jackrabbit-jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/version/VersionImpl.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-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/src/main/java/org/apache/jackrabbit/spi2jcr/RepositoryServiceImpl.java

Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/version/JcrVersionManagerImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/version/JcrVersionManagerImpl.java?rev=773828&r1=773827&r2=773828&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/version/JcrVersionManagerImpl.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/version/JcrVersionManagerImpl.java Tue May 12 08:59:34 2009
@@ -20,20 +20,11 @@
 import javax.jcr.NodeIterator;
 import javax.jcr.RepositoryException;
 import javax.jcr.UnsupportedRepositoryOperationException;
-import javax.jcr.InvalidItemStateException;
-import javax.jcr.PropertyType;
-import javax.jcr.lock.LockException;
-import javax.jcr.version.VersionException;
 
 import org.apache.jackrabbit.core.NodeImpl;
 import org.apache.jackrabbit.core.SessionImpl;
-import org.apache.jackrabbit.core.ItemValidator;
-import org.apache.jackrabbit.core.value.InternalValue;
-import org.apache.jackrabbit.core.security.authorization.Permission;
 import javax.jcr.version.Version;
 import javax.jcr.version.VersionHistory;
-import org.apache.jackrabbit.spi.commons.name.NameConstants;
-import org.apache.jackrabbit.uuid.UUID;
 import org.slf4j.LoggerFactory;
 import org.slf4j.Logger;
 

Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/version/VersionHistoryImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/version/VersionHistoryImpl.java?rev=773828&r1=773827&r2=773828&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/version/VersionHistoryImpl.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/version/VersionHistoryImpl.java Tue May 12 08:59:34 2009
@@ -24,6 +24,8 @@
 import org.apache.jackrabbit.core.security.authorization.Permission;
 import org.apache.jackrabbit.spi.Name;
 import org.apache.jackrabbit.spi.commons.conversion.NameException;
+import org.apache.jackrabbit.commons.iterator.FrozenNodeIteratorAdapter;
+
 import javax.jcr.version.VersionHistory;
 import javax.jcr.version.Version;
 import org.slf4j.Logger;

Copied: jackrabbit/trunk/jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/commons/iterator/FrozenNodeIteratorAdapter.java (from r773800, jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/version/FrozenNodeIteratorAdapter.java)
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/commons/iterator/FrozenNodeIteratorAdapter.java?p2=jackrabbit/trunk/jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/commons/iterator/FrozenNodeIteratorAdapter.java&p1=jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/version/FrozenNodeIteratorAdapter.java&r1=773800&r2=773828&rev=773828&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/version/FrozenNodeIteratorAdapter.java (original)
+++ jackrabbit/trunk/jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/commons/iterator/FrozenNodeIteratorAdapter.java Tue May 12 08:59:34 2009
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.jackrabbit.core.version;
+package org.apache.jackrabbit.commons.iterator;
 
 import javax.jcr.Node;
 import javax.jcr.NodeIterator;
@@ -22,7 +22,6 @@
 import javax.jcr.version.VersionIterator;
 
 import javax.jcr.version.Version;
-import org.apache.jackrabbit.commons.iterator.RangeIteratorAdapter;
 
 /**
  * Implements a node iterator that takes a version iterator and returns the

Propchange: jackrabbit/trunk/jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/commons/iterator/FrozenNodeIteratorAdapter.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: jackrabbit/trunk/jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/commons/iterator/FrozenNodeIteratorAdapter.java
------------------------------------------------------------------------------
    svn:keywords = Author Date Id Revision Rev Url

Added: jackrabbit/trunk/jackrabbit-jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/JcrLockManager.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/JcrLockManager.java?rev=773828&view=auto
==============================================================================
--- jackrabbit/trunk/jackrabbit-jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/JcrLockManager.java (added)
+++ jackrabbit/trunk/jackrabbit-jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/JcrLockManager.java Tue May 12 08:59:34 2009
@@ -0,0 +1,125 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.jackrabbit.jcr2spi;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.apache.jackrabbit.jcr2spi.lock.LockStateManager;
+import org.apache.jackrabbit.spi.commons.conversion.PathResolver;
+
+import javax.jcr.lock.LockManager;
+import javax.jcr.lock.LockException;
+import javax.jcr.RepositoryException;
+import javax.jcr.Node;
+
+/**
+ * <code>JcrLockManager</code>...
+ */
+public class JcrLockManager implements LockManager {
+
+    /**
+     * logger instance
+     */
+    private static final Logger log = LoggerFactory.getLogger(JcrLockManager.class);
+
+    private final LockStateManager lockStateMgr;
+    private final ItemManager itemManager;
+    private final PathResolver resolver;
+
+    protected JcrLockManager(SessionImpl session) {
+        lockStateMgr = session.getLockStateManager();
+        itemManager = session.getItemManager();
+        resolver = session.getPathResolver();
+    }
+
+    //--------------------------------------------------------< LockManager >---
+    /**
+     * @see javax.jcr.lock.LockManager#getLock(String)
+     */
+    public javax.jcr.lock.Lock getLock(String absPath) throws LockException, RepositoryException {
+        Node n = itemManager.getNode(resolver.getQPath(absPath));
+        return n.getLock();
+    }
+
+    /**
+     * @see javax.jcr.lock.LockManager#isLocked(String)
+     */
+    public boolean isLocked(String absPath) throws RepositoryException {
+        Node n = itemManager.getNode(resolver.getQPath(absPath));
+        return n.isLocked();
+    }
+
+    /**
+     * @see javax.jcr.lock.LockManager#holdsLock(String)
+     */
+    public boolean holdsLock(String absPath) throws RepositoryException {
+        Node n = itemManager.getNode(resolver.getQPath(absPath));
+        return n.holdsLock();
+    }
+
+    /**
+     * @see javax.jcr.lock.LockManager#lock(String, boolean, boolean, long, String)
+     */
+    public javax.jcr.lock.Lock lock(String absPath, boolean isDeep, boolean isSessionScoped, long timeoutHint, String ownerInfo) throws RepositoryException {
+        Node n = itemManager.getNode(resolver.getQPath(absPath));
+        return ((NodeImpl) n).lock(isDeep, isSessionScoped, timeoutHint, ownerInfo);
+    }
+
+    /**
+     * @see javax.jcr.lock.LockManager#unlock(String)
+     */
+    public void unlock(String absPath) throws LockException, RepositoryException {
+        Node n = itemManager.getNode(resolver.getQPath(absPath));
+        n.unlock();
+    }
+
+    /**
+     * Returns the lock tokens present on the <code>SessionInfo</code> this
+     * manager has been created with.
+     *
+     * @see javax.jcr.lock.LockManager#getLockTokens()
+     */
+    public String[] getLockTokens() {
+        return lockStateMgr.getLockTokens();
+    }
+
+    /**
+     * Delegates this call to {@link WorkspaceManager#addLockToken(String)}.
+     * If this succeeds this method will inform all locks stored in the local
+     * map in order to give them the chance to update their lock information.
+     *
+     * @see javax.jcr.lock.LockManager#addLockToken(String)
+     */
+    public void addLockToken(String lt) throws LockException, RepositoryException {
+        lockStateMgr.addLockToken(lt);
+    }
+
+    /**
+     * If the lock addressed by the token is session-scoped, this method will
+     * throw a LockException, such as defined by JSR170 v.1.0.1 for
+     * {@link javax.jcr.Session#removeLockToken(String)}.<br>Otherwise the call is
+     * delegated to {@link WorkspaceManager#removeLockToken(String)}.
+     * All locks stored in the local lock map are notified by the removed
+     * token in order have them updated their lock information.
+     *
+     * @see javax.jcr.lock.LockManager#removeLockToken(String)
+     */
+    public void removeLockToken(String lt) throws LockException, RepositoryException {
+        lockStateMgr.removeLockToken(lt);
+    }
+
+}
\ No newline at end of file

Copied: jackrabbit/trunk/jackrabbit-jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/JcrVersionManager.java (from r772858, 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/JcrVersionManager.java?p2=jackrabbit/trunk/jackrabbit-jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/JcrVersionManager.java&p1=jackrabbit/trunk/jackrabbit-jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/version/VersionManagerImpl.java&r1=772858&r2=773828&rev=773828&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/JcrVersionManager.java Tue May 12 08:59:34 2009
@@ -14,186 +14,224 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.jackrabbit.jcr2spi.version;
+package org.apache.jackrabbit.jcr2spi;
 
-import org.apache.jackrabbit.jcr2spi.state.NodeState;
-import org.apache.jackrabbit.jcr2spi.state.Status;
-import org.apache.jackrabbit.jcr2spi.state.PropertyState;
-import org.apache.jackrabbit.jcr2spi.operation.Operation;
-import org.apache.jackrabbit.jcr2spi.operation.Checkout;
-import org.apache.jackrabbit.jcr2spi.operation.Checkin;
-import org.apache.jackrabbit.jcr2spi.operation.Restore;
-import org.apache.jackrabbit.jcr2spi.operation.ResolveMergeConflict;
-import org.apache.jackrabbit.jcr2spi.operation.Merge;
-import org.apache.jackrabbit.jcr2spi.operation.AddLabel;
-import org.apache.jackrabbit.jcr2spi.operation.RemoveLabel;
-import org.apache.jackrabbit.jcr2spi.operation.RemoveVersion;
-import org.apache.jackrabbit.jcr2spi.WorkspaceManager;
-import org.apache.jackrabbit.jcr2spi.hierarchy.NodeEntry;
-import org.slf4j.LoggerFactory;
 import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.apache.jackrabbit.jcr2spi.state.NodeState;
+import org.apache.jackrabbit.jcr2spi.version.VersionManager;
+import org.apache.jackrabbit.spi.commons.conversion.PathResolver;
 
-import javax.jcr.RepositoryException;
-import javax.jcr.ItemNotFoundException;
+import javax.jcr.version.Version;
 import javax.jcr.version.VersionException;
-
-import org.apache.jackrabbit.spi.Name;
-import org.apache.jackrabbit.spi.Path;
-import org.apache.jackrabbit.spi.NodeId;
-import org.apache.jackrabbit.spi.QValue;
-import org.apache.jackrabbit.spi.commons.name.NameConstants;
-
-import java.util.Iterator;
+import javax.jcr.version.VersionHistory;
+import javax.jcr.UnsupportedRepositoryOperationException;
+import javax.jcr.InvalidItemStateException;
+import javax.jcr.RepositoryException;
+import javax.jcr.ItemExistsException;
+import javax.jcr.PathNotFoundException;
+import javax.jcr.NodeIterator;
+import javax.jcr.NoSuchWorkspaceException;
+import javax.jcr.AccessDeniedException;
+import javax.jcr.MergeException;
+import javax.jcr.Node;
+import javax.jcr.nodetype.ConstraintViolationException;
+import javax.jcr.lock.LockException;
 
 /**
  * <code>VersionManagerImpl</code>...
  */
-public class VersionManagerImpl implements VersionManager {
+public class JcrVersionManager implements javax.jcr.version.VersionManager {
 
-    private static Logger log = LoggerFactory.getLogger(VersionManagerImpl.class);
+    /**
+     * logger instance
+     */
+    private static final Logger log = LoggerFactory.getLogger(JcrVersionManager.class);
 
-    private final WorkspaceManager workspaceManager;
+    private final VersionManager vMgr;
+    private final SessionImpl session;
+    private final ItemManager itemManager;
+    private final PathResolver resolver;
 
-    public VersionManagerImpl(WorkspaceManager workspaceManager) {
-        this.workspaceManager = workspaceManager;
+    protected JcrVersionManager(SessionImpl session) {
+        this.session = session;
+        vMgr = session.getVersionStateManager();
+        itemManager = session.getItemManager();
+        resolver = session.getPathResolver();
     }
 
-    public NodeEntry checkin(NodeState nodeState) throws RepositoryException {
-        Checkin ci = Checkin.create(nodeState, this);
-        workspaceManager.execute(ci);
-        return workspaceManager.getHierarchyManager().getNodeEntry(ci.getNewVersionId());
+    //-----------------------------------------------------< VersionManager >---
+    /**
+     * @see javax.jcr.version.VersionManager#checkin(String)
+     */
+    public Version checkin(String absPath) throws VersionException, UnsupportedRepositoryOperationException, InvalidItemStateException, LockException, RepositoryException {
+        Node n = itemManager.getNode(resolver.getQPath(absPath));
+        return n.checkin();
     }
 
-    public void checkout(NodeState nodeState) throws RepositoryException {
-        Operation co = Checkout.create(nodeState, this);
-        workspaceManager.execute(co);
+    /**
+     * @see javax.jcr.version.VersionManager#checkout(String)
+     */
+    public void checkout(String absPath) throws UnsupportedRepositoryOperationException, LockException, RepositoryException {
+        Node n = itemManager.getNode(resolver.getQPath(absPath));
+        n.checkout();
     }
 
     /**
-     * Search nearest ancestor that is versionable. If no versionable ancestor
-     * can be found, <code>true</code> is returned.
-     *
-     * @param nodeState
-     * @return
-     * @throws RepositoryException
+     * @see javax.jcr.version.VersionManager#checkpoint(String)
      */
-    public boolean isCheckedOut(NodeState nodeState) throws RepositoryException {
-        // shortcut: if state is new, its ancestor must be checkout
-        if (nodeState.getStatus() == Status.NEW) {
-            return true;
-        }
+    public Version checkpoint(String absPath) throws VersionException, UnsupportedRepositoryOperationException, InvalidItemStateException, LockException, RepositoryException {
+        session.checkIsAlive();
+        NodeImpl n = (NodeImpl) itemManager.getNode(resolver.getQPath(absPath));
+        return n.checkpoint();
+    }
 
-        NodeEntry nodeEntry = nodeState.getNodeEntry();
-        try {
-            // NOTE: since the hierarchy might not be completely loaded or some
-            // entry might even not be accessible, the check may not detect
-            // a checked-in parent. ok, as long as the 'server' finds out upon
-            // save or upon executing the workspace operation.
-            while (!nodeEntry.hasPropertyEntry(NameConstants.JCR_ISCHECKEDOUT)) {
-                NodeEntry parent = nodeEntry.getParent();
-                if (parent == null) {
-                    // reached root state without finding a jcr:isCheckedOut property
-                    return true;
-                }
-                nodeEntry = parent;
-            }
-            PropertyState propState = nodeEntry.getPropertyEntry(NameConstants.JCR_ISCHECKEDOUT).getPropertyState();
-            Boolean b = Boolean.valueOf(propState.getValue().getString());
-            return b.booleanValue();
-        } catch (ItemNotFoundException e) {
-            // error while accessing jcr:isCheckedOut property state.
-            // -> assume that checkedOut status is ok. see above for general
-            // notes about the capabilities of the jcr2spi implementation.
-        }
-        return true;
+    /**
+     * @see javax.jcr.version.VersionManager#isCheckedOut(String)
+     */
+    public boolean isCheckedOut(String absPath) throws RepositoryException {
+        Node n = itemManager.getNode(resolver.getQPath(absPath));
+        return n.isCheckedOut();
     }
 
-    public void checkIsCheckedOut(NodeState nodeState) throws VersionException, RepositoryException {
-        if (!isCheckedOut(nodeState)) {
-            throw new VersionException(nodeState + " is checked-in");
-        }
+    /**
+     * @see javax.jcr.version.VersionManager#getVersionHistory(String)
+     */
+    public VersionHistory getVersionHistory(String absPath) throws UnsupportedRepositoryOperationException, RepositoryException {
+        Node n = itemManager.getNode(resolver.getQPath(absPath));
+        return n.getVersionHistory();
+    }
+
+    /**
+     * @see javax.jcr.version.VersionManager#getBaseVersion(String)
+     */
+    public Version getBaseVersion(String absPath) throws UnsupportedRepositoryOperationException, RepositoryException {
+        Node n = itemManager.getNode(resolver.getQPath(absPath));
+        return n.getBaseVersion();
     }
 
-    public void removeVersion(NodeState versionHistoryState, NodeState versionState) throws RepositoryException {
-        Operation op = RemoveVersion.create(versionState, versionHistoryState, this);
-        workspaceManager.execute(op);
+    /**
+     * @see javax.jcr.version.VersionManager#restore(Version[], boolean)
+     */
+    public void restore(Version[] versions, boolean removeExisting) throws ItemExistsException, UnsupportedRepositoryOperationException, VersionException, LockException, InvalidItemStateException, RepositoryException {
+        session.checkIsAlive();
+        session.checkHasPendingChanges();
+
+        NodeState[] versionStates = new NodeState[versions.length];
+        for (int i = 0; i < versions.length; i++) {
+            versionStates[i] = session.getVersionState(versions[i]);
+        }
+        vMgr.restore(versionStates, removeExisting);
     }
 
-    public void addVersionLabel(NodeState versionHistoryState, NodeState versionState, Name qLabel, boolean moveLabel) throws RepositoryException {
-        Operation op = AddLabel.create(versionHistoryState, versionState, qLabel, moveLabel);
-        workspaceManager.execute(op);
+    /**
+     * @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 {
+        Node n = itemManager.getNode(resolver.getQPath(absPath));
+        n.restore(versionName, removeExisting);
     }
 
-    public void removeVersionLabel(NodeState versionHistoryState, NodeState versionState, Name qLabel) throws RepositoryException {
-        Operation op = RemoveLabel.create(versionHistoryState, versionState, qLabel);
-        workspaceManager.execute(op);
+    /**
+     * @see javax.jcr.version.VersionManager#restore(Version, boolean)
+     */
+    public void restore(Version version, boolean removeExisting) throws VersionException, ItemExistsException, UnsupportedRepositoryOperationException, LockException, RepositoryException {
+        restore(new Version[]{version}, removeExisting);
     }
 
-    public void restore(NodeState nodeState, Path relativePath, NodeState versionState, boolean removeExisting) throws RepositoryException {
-        Operation op = Restore.create(nodeState, relativePath, versionState, removeExisting);
-        workspaceManager.execute(op);
+    /**
+     * @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 {
+        Node n = itemManager.getNode(resolver.getQPath(absPath));
+        n.restore(version, removeExisting);
     }
 
-    public void restore(NodeState[] versionStates, boolean removeExisting) throws RepositoryException {
-        Operation op = Restore.create(versionStates, removeExisting);
-        workspaceManager.execute(op);
+    /**
+     * @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 {
+        Node n = itemManager.getNode(resolver.getQPath(absPath));
+        n.restoreByLabel(versionLabel, removeExisting);
     }
 
-    public Iterator merge(NodeState nodeState, String workspaceName, boolean bestEffort) throws RepositoryException {
-        Merge op = Merge.create(nodeState, workspaceName, bestEffort, this);
-        workspaceManager.execute(op);
-        return op.getFailedIds();
+    /**
+     * @see javax.jcr.version.VersionManager#merge(String, String, boolean)
+     */
+    public NodeIterator merge(String absPath, String srcWorkspace, boolean bestEffort) throws NoSuchWorkspaceException, AccessDeniedException, MergeException, LockException, InvalidItemStateException, RepositoryException {
+        return merge(absPath, srcWorkspace, bestEffort, false);
     }
 
-    public void resolveMergeConflict(NodeState nodeState, NodeState versionState,
-                                     boolean done) throws RepositoryException {
-        NodeId vId = versionState.getNodeId();
+    /**
+     * @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 {
+        // TODO: improve
+        NodeImpl n = (NodeImpl) itemManager.getNode(resolver.getQPath(absPath));
+        return n.merge(srcWorkspace, bestEffort, isShallow);
+    }
 
-        PropertyState mergeFailedState = nodeState.getPropertyState(NameConstants.JCR_MERGEFAILED);
-        QValue[] vs = mergeFailedState.getValues();
+    /**
+     * @see javax.jcr.version.VersionManager#doneMerge(String, Version)
+     */
+    public void doneMerge(String absPath, Version version) throws VersionException, InvalidItemStateException, UnsupportedRepositoryOperationException, RepositoryException {
+        Node n = itemManager.getNode(resolver.getQPath(absPath));
+        n.doneMerge(version);
+    }
 
-        NodeId[] mergeFailedIds = new NodeId[vs.length - 1];
-        for (int i = 0, j = 0; i < vs.length; i++) {
-            NodeId id = workspaceManager.getIdFactory().createNodeId(vs[i].getString());
-            if (!id.equals(vId)) {
-                mergeFailedIds[j] = id;
-                j++;
-            }
-            // else: the version id is being solved by this call and not
-            // part of 'jcr:mergefailed' any more
-        }
+    /**
+     * @see javax.jcr.version.VersionManager#cancelMerge(String, Version)
+     */
+    public void cancelMerge(String absPath, Version version) throws VersionException, InvalidItemStateException, UnsupportedRepositoryOperationException, RepositoryException {
+        Node n = itemManager.getNode(resolver.getQPath(absPath));
+        n.cancelMerge(version);
+    }
 
-        PropertyState predecessorState = nodeState.getPropertyState(NameConstants.JCR_PREDECESSORS);
-        vs = predecessorState.getValues();
+    /**
+     * @see javax.jcr.version.VersionManager#createConfiguration(String, Version)
+     */
+    public Node createConfiguration(String absPath, Version baseline) throws UnsupportedRepositoryOperationException, RepositoryException {
+        // TODO
+        throw new UnsupportedOperationException("JCR-2104: JSR 283 Versioning. Implementation missing");
+    }
 
-        int noOfPredecessors = (done) ? vs.length + 1 : vs.length;
-        NodeId[] predecessorIds = new NodeId[noOfPredecessors];
+    /**
+     * @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");
+    }
 
-        int i = 0;
-        while (i < vs.length) {
-            predecessorIds[i] = workspaceManager.getIdFactory().createNodeId(vs[i].getString());
-            i++;
-        }
-        if (done) {
-            predecessorIds[i] = vId;
-        }
-        Operation op = ResolveMergeConflict.create(nodeState, mergeFailedIds, predecessorIds, done);
-        workspaceManager.execute(op);
+    /**
+     * @see javax.jcr.version.VersionManager#getActivity()
+     */
+    public Node getActivity() throws UnsupportedRepositoryOperationException, RepositoryException {
+        // TODO
+        throw new UnsupportedOperationException("JCR-2104: JSR 283 Versioning. Implementation missing");
     }
 
-    public NodeEntry getVersionableNodeEntry(NodeState versionState) throws RepositoryException {
-        NodeState ns = versionState.getChildNodeState(NameConstants.JCR_FROZENNODE, Path.INDEX_DEFAULT);
-        PropertyState ps = ns.getPropertyState(NameConstants.JCR_FROZENUUID);
-        String uniqueID = ps.getValue().getString();
+    /**
+     * @see javax.jcr.version.VersionManager#createActivity(String)
+     */
+    public Node createActivity(String title) throws UnsupportedRepositoryOperationException, RepositoryException {
+        // TODO
+        throw new UnsupportedOperationException("JCR-2104: JSR 283 Versioning. Implementation missing");
+    }
 
-        NodeId versionableId = workspaceManager.getIdFactory().createNodeId(uniqueID);
-        return workspaceManager.getHierarchyManager().getNodeEntry(versionableId);
+    /**
+     * @see javax.jcr.version.VersionManager#removeActivity(String)
+     */
+    public Node removeActivity(String title) throws UnsupportedRepositoryOperationException, RepositoryException {
+        // TODO
+        throw new UnsupportedOperationException("JCR-2104: JSR 283 Versioning. Implementation missing");
     }
 
-    public NodeEntry getVersionHistoryEntry(NodeState versionableState) throws RepositoryException {
-        PropertyState ps = versionableState.getPropertyState(NameConstants.JCR_VERSIONHISTORY);
-        String uniqueID = ps.getValue().getString();
-        NodeId vhId = workspaceManager.getIdFactory().createNodeId(uniqueID);
-        return workspaceManager.getHierarchyManager().getNodeEntry(vhId);
+    /**
+     * @see javax.jcr.version.VersionManager#merge(Node)
+     */
+    public NodeIterator merge(Node activityNode) throws VersionException, AccessDeniedException, MergeException, LockException, InvalidItemStateException, RepositoryException {
+        // TODO
+       throw new UnsupportedOperationException("JCR-2104: JSR 283 Versioning. Implementation missing");
     }
 }
\ No newline at end of file

Propchange: jackrabbit/trunk/jackrabbit-jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/JcrVersionManager.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: jackrabbit/trunk/jackrabbit-jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/JcrVersionManager.java
------------------------------------------------------------------------------
    svn:keywords = author date id revision url

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=773828&r1=773827&r2=773828&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 Tue May 12 08:59:34 2009
@@ -799,6 +799,14 @@
         }
     }
 
+    Version checkpoint() throws RepositoryException {
+        checkIsVersionable();
+        checkHasPendingChanges();
+        checkIsLocked();
+        NodeEntry newVersion = session.getVersionStateManager().checkpoint(getNodeState());
+        return (Version) getItemManager().getItem(newVersion);
+    }
+    
     /**
      * @see Node#doneMerge(Version)
      */
@@ -881,6 +889,15 @@
      * @see Node#merge(String, boolean)
      */
     public NodeIterator merge(String srcWorkspace, boolean bestEffort) throws NoSuchWorkspaceException, AccessDeniedException, VersionException, LockException, InvalidItemStateException, RepositoryException {
+        return merge(srcWorkspace, bestEffort, false);
+    }
+
+
+    /**
+     * TODO: Issue 728 of the pfd... this method is a leftover and will be removed in the final version.
+     * -> change to package protected then
+     */
+    public NodeIterator merge(String srcWorkspace, boolean bestEffort, boolean isShallow) throws RepositoryException {
         checkIsWritable();
         checkSessionHasPendingChanges();
 
@@ -891,7 +908,7 @@
         // make sure the workspace exists and is accessible for this session.
         session.checkAccessibleWorkspace(srcWorkspace);
 
-        Iterator failedIds = session.getVersionStateManager().merge(getNodeState(), srcWorkspace, bestEffort);
+        Iterator failedIds = session.getVersionStateManager().merge(getNodeState(), srcWorkspace, bestEffort, isShallow);
         return new LazyItemIterator(getItemManager(), session.getHierarchyManager(), failedIds);
     }
 
@@ -1150,8 +1167,9 @@
      * @see Node#getIdentifier()
      */
     public String getIdentifier() throws RepositoryException {
-        // TODO: implementation missing
-        throw new UnsupportedRepositoryOperationException("JCR-1104");
+        checkStatus();
+        // TODO: check again and add SPI method to create Node-Identifier from String
+        return getNodeEntry().getId().toString();
     }
 
     /**
@@ -1174,8 +1192,11 @@
      * @see javax.jcr.Node#getNodes(String[])
      */
     public NodeIterator getNodes(String[] nameGlobs) throws RepositoryException {
-        // TODO: implementation missing
-        throw new UnsupportedRepositoryOperationException("JCR-1104");
+        checkStatus();
+        List nodes = new ArrayList();
+        // traverse child nodes using a filtering collector
+        accept(new ChildrenCollectorFilter(nameGlobs, nodes, true, false, 1));
+        return new NodeIteratorAdapter(nodes);
     }
 
     /**
@@ -1183,8 +1204,11 @@
      * @see javax.jcr.Node#getProperty(String)
      */
     public PropertyIterator getProperty(String[] nameGlobs) throws RepositoryException {
-        // TODO: implementation missing
-        throw new UnsupportedRepositoryOperationException("JCR-1104");
+        checkStatus();
+        List properties = new ArrayList();
+        // traverse child properties using a filtering collector
+        accept(new ChildrenCollectorFilter(nameGlobs, properties, true, false, 1));
+        return new PropertyIteratorAdapter(properties);
     }
 
     /**
@@ -1196,14 +1220,6 @@
     }
 
     /**
-     * @see javax.jcr.Node#getSharedSet()
-     */
-    public NodeIterator getSharedSet() throws RepositoryException {
-        // TODO: implementation missing
-        throw new UnsupportedRepositoryOperationException("JCR-1104");
-    }
-
-    /**
      * @see javax.jcr.Node#getWeakReferences()
      */
     public PropertyIterator getWeakReferences() throws RepositoryException {
@@ -1220,9 +1236,9 @@
     }
 
     /**
-     * TODO: Issue 728 of the pfd... this method is a leftover and will be removed in the final version.
+     * @see javax.jcr.Node#getSharedSet()
      */
-    public NodeIterator merge(String srcWorkspace, boolean bestEffort, boolean isShallow) throws RepositoryException {
+    public NodeIterator getSharedSet() throws RepositoryException {
         // TODO: implementation missing
         throw new UnsupportedRepositoryOperationException("JCR-1104");
     }
@@ -1422,6 +1438,28 @@
         return (Node) getItemManager().getItem(nState.getHierarchyEntry());
     }
 
+    // TODO: protected due to usage within VersionImpl, VersionHistoryImpl (check for alternatives)
+    /**
+     *
+     * @param nodeName
+     * @param index
+     * @return
+     * @throws PathNotFoundException
+     * @throws RepositoryException
+     */
+    protected Node getNode(Name nodeName, int index) throws PathNotFoundException, RepositoryException {
+        checkStatus();
+        try {
+            NodeEntry nEntry = getNodeEntry().getNodeEntry(nodeName, index);
+            if (nEntry == null) {
+                throw new PathNotFoundException(LogUtil.saveGetJCRName(nodeName, session.getNameResolver()));
+            }
+            return (Node) getItemManager().getItem(nEntry);
+        } catch (AccessDeniedException e) {
+            throw new PathNotFoundException(LogUtil.saveGetJCRName(nodeName, session.getNameResolver()));
+        }
+    }
+
     /**
      *
      * @param qName

Modified: jackrabbit/trunk/jackrabbit-jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/SessionImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/SessionImpl.java?rev=773828&r1=773827&r2=773828&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/SessionImpl.java (original)
+++ jackrabbit/trunk/jackrabbit-jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/SessionImpl.java Tue May 12 08:59:34 2009
@@ -357,35 +357,7 @@
      * @see javax.jcr.Session#checkPermission(String, String)
      */
     public void checkPermission(String absPath, String actions) throws AccessControlException, RepositoryException {
-        checkIsAlive();
-        // build the array of actions to be checked
-        String[] actionsArr = actions.split(",");
-
-        Path targetPath = getQPath(absPath);
-
-        boolean isGranted;
-        // The given abs-path may point to a non-existing item
-        if (itemManager.nodeExists(targetPath)) {
-            NodeState nState = getHierarchyManager().getNodeState(targetPath);
-            isGranted = getAccessManager().isGranted(nState, actionsArr);
-        } else if (itemManager.propertyExists(targetPath)) {
-            PropertyState pState = getHierarchyManager().getPropertyState(targetPath);
-            isGranted = getAccessManager().isGranted(pState, actionsArr);
-        } else {
-            NodeState parentState = null;
-            Path parentPath = targetPath;
-            while (parentState == null) {
-                parentPath = parentPath.getAncestor(1);
-                if (itemManager.nodeExists(parentPath)) {
-                    parentState = getHierarchyManager().getNodeState(parentPath);
-                }
-            }
-            // parentState is the nearest existing nodeState or the root state.
-            Path relPath = parentPath.computeRelativePath(targetPath);
-            isGranted = getAccessManager().isGranted(parentState, relPath, actionsArr);
-        }
-
-        if (!isGranted) {
+        if (!hasPermission(absPath, actions)) {
             throw new AccessControlException("Access control violation: path = " + absPath + ", actions = " + actions);
         }
     }
@@ -569,10 +541,35 @@
     /**
      * @see Session#hasPermission(String, String)
      */
-    public boolean hasPermission(String absPath, String actions)
-            throws RepositoryException {
-        // TODO: implementation missing
-        throw new UnsupportedRepositoryOperationException("JCR-1104");
+    public boolean hasPermission(String absPath, String actions) throws RepositoryException {
+        checkIsAlive();
+        // build the array of actions to be checked
+        String[] actionsArr = actions.split(",");
+
+        Path targetPath = getQPath(absPath);
+
+        boolean isGranted;
+        // The given abs-path may point to a non-existing item
+        if (itemManager.nodeExists(targetPath)) {
+            NodeState nState = getHierarchyManager().getNodeState(targetPath);
+            isGranted = getAccessManager().isGranted(nState, actionsArr);
+        } else if (itemManager.propertyExists(targetPath)) {
+            PropertyState pState = getHierarchyManager().getPropertyState(targetPath);
+            isGranted = getAccessManager().isGranted(pState, actionsArr);
+        } else {
+            NodeState parentState = null;
+            Path parentPath = targetPath;
+            while (parentState == null) {
+                parentPath = parentPath.getAncestor(1);
+                if (itemManager.nodeExists(parentPath)) {
+                    parentState = getHierarchyManager().getNodeState(parentPath);
+                }
+            }
+            // parentState is the nearest existing nodeState or the root state.
+            Path relPath = parentPath.computeRelativePath(targetPath);
+            isGranted = getAccessManager().isGranted(parentState, relPath, actionsArr);
+        }
+        return isGranted;
     }
 
     /**

Modified: jackrabbit/trunk/jackrabbit-jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/WorkspaceImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/WorkspaceImpl.java?rev=773828&r1=773827&r2=773828&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/WorkspaceImpl.java (original)
+++ jackrabbit/trunk/jackrabbit-jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/WorkspaceImpl.java Tue May 12 08:59:34 2009
@@ -105,6 +105,9 @@
     private QueryManager qManager;
     private VersionManager versionManager;
 
+    private LockManager jcrLockManager;
+    private javax.jcr.version.VersionManager jcrVersionManager;
+
     public WorkspaceImpl(String name, SessionImpl session, RepositoryConfig config, SessionInfo sessionInfo) throws RepositoryException {
         this.name = name;
         this.session = session;
@@ -245,13 +248,7 @@
      * @see javax.jcr.Workspace#restore(Version[], boolean)
      */
     public void restore(Version[] versions, boolean removeExisting) throws ItemExistsException, UnsupportedRepositoryOperationException, VersionException, LockException, InvalidItemStateException, RepositoryException {
-        session.checkHasPendingChanges();
-
-        NodeState[] versionStates = new NodeState[versions.length];
-        for (int i = 0; i < versions.length; i++) {
-            versionStates[i] = session.getVersionState(versions[i]);
-        }
-        getVersionStateManager().restore(versionStates, removeExisting);
+        getVersionManager().restore(versions, removeExisting);
     }
 
     /**
@@ -379,16 +376,23 @@
     public LockManager getLockManager() throws RepositoryException {
         session.checkIsAlive();
         session.checkSupportedOption(Repository.OPTION_LOCKING_SUPPORTED);
-        return getLockStateManager();
+        if (jcrLockManager == null) {
+            jcrLockManager = new JcrLockManager(session);
+        }
+        return jcrLockManager;
     }
 
     /**
      * @see javax.jcr.Workspace#getVersionManager()
      */
-    public javax.jcr.version.VersionManager getVersionManager()
+    public synchronized javax.jcr.version.VersionManager getVersionManager()
             throws RepositoryException {
-        // TODO: implementation missing
-        throw new UnsupportedRepositoryOperationException("JCR-1104");
+        session.checkIsAlive();
+        session.checkSupportedOption(Repository.OPTION_VERSIONING_SUPPORTED);
+        if (jcrVersionManager == null) {
+            jcrVersionManager = new JcrVersionManager(session);
+        }
+        return jcrVersionManager;
     }
 
     //----------------------------------------------------< ManagerProvider >---
@@ -537,10 +541,10 @@
      *
      * @param wspManager
      * @param itemManager
-     * @return a new <code>LockManager</code> instance.
+     * @return a new <code>LockStateManager</code> instance.
      */
     protected LockStateManager createLockManager(WorkspaceManager wspManager, ItemManager itemManager) {
-        LockManagerImpl lMgr = new LockManagerImpl(wspManager, itemManager, session.getCacheBehaviour(), getPathResolver());
+        LockManagerImpl lMgr = new LockManagerImpl(wspManager, itemManager, session.getCacheBehaviour());
         session.addListener(lMgr);
         return lMgr;
     }

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=773828&r1=773827&r2=773828&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 Tue May 12 08:59:34 2009
@@ -56,6 +56,7 @@
 import org.apache.jackrabbit.jcr2spi.operation.RemoveLabel;
 import org.apache.jackrabbit.jcr2spi.operation.RemoveVersion;
 import org.apache.jackrabbit.jcr2spi.operation.WorkspaceImport;
+import org.apache.jackrabbit.jcr2spi.operation.Checkpoint;
 import org.apache.jackrabbit.jcr2spi.security.AccessManager;
 import org.apache.jackrabbit.jcr2spi.observation.InternalEventListener;
 import org.apache.jackrabbit.jcr2spi.config.CacheBehaviour;
@@ -902,6 +903,15 @@
 
         /**
          * @inheritDoc
+         * @see OperationVisitor#visit(Checkpoint)
+         */
+        public void visit(Checkpoint operation) throws UnsupportedRepositoryOperationException, LockException, InvalidItemStateException, RepositoryException {
+            NodeId newId = service.checkpoint(sessionInfo, operation.getNodeId());
+            operation.setNewVersionId(newId);
+        }
+
+        /**
+         * @inheritDoc
          * @see OperationVisitor#visit(Restore)
          */
         public void visit(Restore operation) throws VersionException, PathNotFoundException, ItemExistsException, UnsupportedRepositoryOperationException, LockException, InvalidItemStateException, RepositoryException {
@@ -927,7 +937,7 @@
          */
         public void visit(Merge operation) throws NoSuchWorkspaceException, AccessDeniedException, MergeException, LockException, InvalidItemStateException, RepositoryException {
             NodeId nId = operation.getNodeId();
-            Iterator failed = service.merge(sessionInfo, nId, operation.getSourceWorkspaceName(), operation.bestEffort());
+            Iterator failed = service.merge(sessionInfo, nId, operation.getSourceWorkspaceName(), operation.bestEffort(), operation.isShallow());
             operation.setFailedIds(failed);
         }
 

Modified: jackrabbit/trunk/jackrabbit-jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/lock/LockManagerImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/lock/LockManagerImpl.java?rev=773828&r1=773827&r2=773828&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/lock/LockManagerImpl.java (original)
+++ jackrabbit/trunk/jackrabbit-jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/lock/LockManagerImpl.java Tue May 12 08:59:34 2009
@@ -19,7 +19,6 @@
 import org.apache.jackrabbit.jcr2spi.ItemManager;
 import org.apache.jackrabbit.jcr2spi.SessionListener;
 import org.apache.jackrabbit.jcr2spi.WorkspaceManager;
-import org.apache.jackrabbit.jcr2spi.NodeImpl;
 import org.apache.jackrabbit.jcr2spi.config.CacheBehaviour;
 import org.apache.jackrabbit.jcr2spi.hierarchy.NodeEntry;
 import org.apache.jackrabbit.jcr2spi.operation.LockOperation;
@@ -69,7 +68,6 @@
     private final WorkspaceManager wspManager;
     private final ItemManager itemManager;
     private final CacheBehaviour cacheBehaviour;
-    private final PathResolver resolver;
 
     /**
      * Map holding all locks that where created by this <code>Session</code> upon
@@ -81,115 +79,15 @@
     private final Map lockMap;
 
     public LockManagerImpl(WorkspaceManager wspManager, ItemManager itemManager,
-                           CacheBehaviour cacheBehaviour, PathResolver pathResolver) {
+                           CacheBehaviour cacheBehaviour) {
         this.wspManager = wspManager;
         this.itemManager = itemManager;
         this.cacheBehaviour = cacheBehaviour;
-        this.resolver = pathResolver;
         // use hard references in order to make sure, that entries refering
         // to locks created by the current session are not removed.
         lockMap = new HashMap();
     }
 
-    //--------------------------------------------------------< LockManager >---
-    /**
-     * @see javax.jcr.lock.LockManager#getLock(String)
-     */
-    public javax.jcr.lock.Lock getLock(String absPath) throws LockException, RepositoryException {
-        Node n = itemManager.getNode(resolver.getQPath(absPath));
-        return (javax.jcr.lock.Lock) n.getLock();
-    }
-
-    /**
-     * @see javax.jcr.lock.LockManager#isLocked(String)
-     */
-    public boolean isLocked(String absPath) throws RepositoryException {
-        Node n = itemManager.getNode(resolver.getQPath(absPath));
-        return n.isLocked();
-    }
-
-    /**
-     * @see javax.jcr.lock.LockManager#holdsLock(String)
-     */
-    public boolean holdsLock(String absPath) throws RepositoryException {
-        Node n = itemManager.getNode(resolver.getQPath(absPath));
-        return n.holdsLock();
-    }
-
-    /**
-     * @see javax.jcr.lock.LockManager#lock(String, boolean, boolean, long, String)
-     */
-    public javax.jcr.lock.Lock lock(String absPath, boolean isDeep, boolean isSessionScoped, long timeoutHint, String ownerInfo) throws RepositoryException {
-        Node n = itemManager.getNode(resolver.getQPath(absPath));
-        return (javax.jcr.lock.Lock) ((NodeImpl) n).lock(isDeep, isSessionScoped, timeoutHint, ownerInfo);
-    }
-
-    /**
-     * @see javax.jcr.lock.LockManager#unlock(String) 
-     */
-    public void unlock(String absPath) throws LockException, RepositoryException {
-        Node n = itemManager.getNode(resolver.getQPath(absPath));
-        n.unlock();
-    }
-
-    /**
-     * Returns the lock tokens present on the <code>SessionInfo</code> this
-     * manager has been created with.
-     *
-     * @see javax.jcr.lock.LockManager#getLockTokens()
-     */
-    public String[] getLockTokens() {
-        return wspManager.getLockTokens();
-    }
-
-    /**
-     * Delegates this call to {@link WorkspaceManager#addLockToken(String)}.
-     * If this succeeds this method will inform all locks stored in the local
-     * map in order to give them the chance to update their lock information.
-     *
-     * @see javax.jcr.lock.LockManager#addLockToken(String)
-     */
-    public void addLockToken(String lt) throws LockException, RepositoryException {
-        wspManager.addLockToken(lt);
-        notifyTokenAdded(lt);
-    }
-
-    /**
-     * If the lock addressed by the token is session-scoped, this method will
-     * throw a LockException, such as defined by JSR170 v.1.0.1 for
-     * {@link Session#removeLockToken(String)}.<br>Otherwise the call is
-     * delegated to {@link WorkspaceManager#removeLockToken(String)}.
-     * All locks stored in the local lock map are notified by the removed
-     * token in order have them updated their lock information.
-     *
-     * @see javax.jcr.lock.LockManager#removeLockToken(String)
-     */
-    public void removeLockToken(String lt) throws LockException, RepositoryException {
-        // JSR170 v. 1.0.1 defines that the token of a session-scoped lock may
-        // not be moved over to another session. thus removal ist not possible
-        // and the lock is always present in the lock map.
-        Iterator it = lockMap.values().iterator();
-        boolean found = false;
-        // loop over cached locks to determine if the token belongs to a session
-        // scoped lock, in which case the removal must fail immediately.
-        while (it.hasNext() && !found) {
-            LockImpl l = (LockImpl) it.next();
-            if (lt.equals(l.getLockToken())) {
-                // break as soon as the lock associated with the given token was found.
-                found = true;
-                if (l.isSessionScoped()) {
-                    throw new LockException("Cannot remove lock token associated with a session scoped lock.");
-                }
-            }
-        }
-
-        // remove lock token from sessionInfo. call will fail, if the session
-        // is not lock holder.
-        wspManager.removeLockToken(lt);
-        // inform about this lt being removed from this session
-        notifyTokenRemoved(lt);
-    }
-
     //----------------< org.apache.jackrabbit.jcr2spi.lock.LockStateManager >---
     /**
      * @see LockStateManager#lock(NodeState,boolean,boolean)
@@ -287,6 +185,65 @@
         } // else: state is not locked at all || session is lock-holder
     }
 
+
+    /**
+     * Returns the lock tokens present on the <code>SessionInfo</code> this
+     * manager has been created with.
+     *
+     * @see LockStateManager#getLockTokens()
+     */
+    public String[] getLockTokens() {
+        return wspManager.getLockTokens();
+    }
+
+    /**
+     * Delegates this call to {@link WorkspaceManager#addLockToken(String)}.
+     * If this succeeds this method will inform all locks stored in the local
+     * map in order to give them the chance to update their lock information.
+     *
+     * @see LockStateManager#addLockToken(String)
+     */
+    public void addLockToken(String lt) throws LockException, RepositoryException {
+        wspManager.addLockToken(lt);
+        notifyTokenAdded(lt);
+    }
+
+    /**
+     * If the lock addressed by the token is session-scoped, this method will
+     * throw a LockException, such as defined by JSR170 v.1.0.1 for
+     * {@link Session#removeLockToken(String)}.<br>Otherwise the call is
+     * delegated to {@link WorkspaceManager#removeLockToken(String)}.
+     * All locks stored in the local lock map are notified by the removed
+     * token in order have them updated their lock information.
+     *
+     * @see LockStateManager#removeLockToken(String)
+     */
+    public void removeLockToken(String lt) throws LockException, RepositoryException {
+        // JSR170 v. 1.0.1 defines that the token of a session-scoped lock may
+        // not be moved over to another session. thus removal ist not possible
+        // and the lock is always present in the lock map.
+        Iterator it = lockMap.values().iterator();
+        boolean found = false;
+        // loop over cached locks to determine if the token belongs to a session
+        // scoped lock, in which case the removal must fail immediately.
+        while (it.hasNext() && !found) {
+            LockImpl l = (LockImpl) it.next();
+            if (lt.equals(l.getLockToken())) {
+                // break as soon as the lock associated with the given token was found.
+                found = true;
+                if (l.isSessionScoped()) {
+                    throw new LockException("Cannot remove lock token associated with a session scoped lock.");
+                }
+            }
+        }
+
+        // remove lock token from sessionInfo. call will fail, if the session
+        // is not lock holder.
+        wspManager.removeLockToken(lt);
+        // inform about this lt being removed from this session
+        notifyTokenRemoved(lt);
+    }
+
     //----------------------------------------------------< SessionListener >---
     /**
      * @see SessionListener#loggingOut(Session)

Modified: jackrabbit/trunk/jackrabbit-jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/lock/LockStateManager.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/lock/LockStateManager.java?rev=773828&r1=773827&r2=773828&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/lock/LockStateManager.java (original)
+++ jackrabbit/trunk/jackrabbit-jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/lock/LockStateManager.java Tue May 12 08:59:34 2009
@@ -19,14 +19,13 @@
 import javax.jcr.RepositoryException;
 import javax.jcr.lock.Lock;
 import javax.jcr.lock.LockException;
-import javax.jcr.lock.LockManager;
 
 import org.apache.jackrabbit.jcr2spi.state.NodeState;
 
 /**
  * Defines the functionality needed for locking and unlocking nodes.
  */
-public interface LockStateManager extends LockManager {
+public interface LockStateManager {
 
     /**
      * Lock a node. Checks whether the node is not locked and then

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=773828&r1=773827&r2=773828&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 Tue May 12 08:59:34 2009
@@ -42,14 +42,16 @@
     private final NodeState nodeState;
     private final String srcWorkspaceName;
     private final boolean bestEffort;
+    private final boolean isShallow;
     private final VersionManager mgr;
 
     private Iterator failedIds = null;
 
-    private Merge(NodeState nodeState, String srcWorkspaceName, boolean bestEffort, VersionManager mgr) {
+    private Merge(NodeState nodeState, String srcWorkspaceName, boolean bestEffort, boolean isShallow, VersionManager mgr) {
         this.nodeState = nodeState;
         this.srcWorkspaceName = srcWorkspaceName;
         this.bestEffort = bestEffort;
+        this.isShallow = isShallow;
         this.mgr = mgr;
 
         // NOTE: affected-states only needed for transient modifications
@@ -96,6 +98,10 @@
         return bestEffort;
     }
 
+    public boolean isShallow() {
+        return isShallow;
+    }
+
     public void setFailedIds(Iterator failedIds) {
         if (failedIds == null) {
             throw new IllegalArgumentException("IdIterator must not be null.");
@@ -119,7 +125,7 @@
      * @param srcWorkspaceName
      * @return
      */
-    public static Merge create(NodeState nodeState, String srcWorkspaceName, boolean bestEffort, VersionManager mgr) {
-        return new Merge(nodeState, srcWorkspaceName, bestEffort, mgr);
+    public static Merge create(NodeState nodeState, String srcWorkspaceName, boolean bestEffort, boolean isShallow, VersionManager mgr) {
+        return new Merge(nodeState, srcWorkspaceName, bestEffort, isShallow, mgr);
     }
 }
\ No newline at end of file

Modified: jackrabbit/trunk/jackrabbit-jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/operation/OperationVisitor.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/operation/OperationVisitor.java?rev=773828&r1=773827&r2=773828&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/operation/OperationVisitor.java (original)
+++ jackrabbit/trunk/jackrabbit-jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/operation/OperationVisitor.java Tue May 12 08:59:34 2009
@@ -58,6 +58,8 @@
 
     public void visit(Checkin operation) throws UnsupportedRepositoryOperationException, LockException, InvalidItemStateException, RepositoryException;
 
+    public void visit(Checkpoint operation) throws RepositoryException;
+
     public void visit(Restore operation) throws VersionException, PathNotFoundException, ItemExistsException, UnsupportedRepositoryOperationException, LockException, InvalidItemStateException, RepositoryException;
 
     public void visit(Merge operation) throws NoSuchWorkspaceException, AccessDeniedException, MergeException, LockException, InvalidItemStateException, RepositoryException;

Modified: jackrabbit/trunk/jackrabbit-jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/SessionItemStateManager.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/SessionItemStateManager.java?rev=773828&r1=773827&r2=773828&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/SessionItemStateManager.java (original)
+++ jackrabbit/trunk/jackrabbit-jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/SessionItemStateManager.java Tue May 12 08:59:34 2009
@@ -43,6 +43,7 @@
 import org.apache.jackrabbit.jcr2spi.operation.RemoveLabel;
 import org.apache.jackrabbit.jcr2spi.operation.RemoveVersion;
 import org.apache.jackrabbit.jcr2spi.operation.WorkspaceImport;
+import org.apache.jackrabbit.jcr2spi.operation.Checkpoint;
 import org.apache.jackrabbit.jcr2spi.hierarchy.NodeEntry;
 import org.apache.jackrabbit.jcr2spi.hierarchy.PropertyEntry;
 import org.apache.jackrabbit.jcr2spi.ManagerProvider;
@@ -416,7 +417,7 @@
 
     /**
      * @throws UnsupportedOperationException
-     * @see OperationVisitor#visit(Clone)
+     * @see OperationVisitor#visit(Copy)
      */
     public void visit(Copy operation) throws NoSuchWorkspaceException, LockException, ConstraintViolationException, AccessDeniedException, ItemExistsException, UnsupportedRepositoryOperationException, VersionException, RepositoryException {
         throw new UnsupportedOperationException("Internal error: Copy cannot be handled by session ItemStateManager.");
@@ -424,7 +425,7 @@
 
     /**
      * @throws UnsupportedOperationException
-     * @see OperationVisitor#visit(Clone)
+     * @see OperationVisitor#visit(Checkout)
      */
     public void visit(Checkout operation) throws RepositoryException, UnsupportedRepositoryOperationException {
         throw new UnsupportedOperationException("Internal error: Checkout cannot be handled by session ItemStateManager.");
@@ -432,7 +433,7 @@
 
     /**
      * @throws UnsupportedOperationException
-     * @see OperationVisitor#visit(Clone)
+     * @see OperationVisitor#visit(Checkin)
      */
     public void visit(Checkin operation) throws UnsupportedRepositoryOperationException, LockException, InvalidItemStateException, RepositoryException {
         throw new UnsupportedOperationException("Internal error: Checkin cannot be handled by session ItemStateManager.");
@@ -440,6 +441,14 @@
 
     /**
      * @throws UnsupportedOperationException
+     * @see OperationVisitor#visit(Checkpoint)
+     */
+    public void visit(Checkpoint operation) throws UnsupportedRepositoryOperationException, LockException, InvalidItemStateException, RepositoryException {
+        throw new UnsupportedOperationException("Internal error: Checkin cannot be handled by session ItemStateManager.");
+    }
+
+    /**
+     * @throws UnsupportedOperationException
      * @see OperationVisitor#visit(Update)
      */
     public void visit(Update operation) throws NoSuchWorkspaceException, AccessDeniedException, LockException, InvalidItemStateException, RepositoryException {

Modified: jackrabbit/trunk/jackrabbit-jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/version/VersionHistoryImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/version/VersionHistoryImpl.java?rev=773828&r1=773827&r2=773828&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/version/VersionHistoryImpl.java (original)
+++ jackrabbit/trunk/jackrabbit-jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/version/VersionHistoryImpl.java Tue May 12 08:59:34 2009
@@ -35,6 +35,7 @@
 import javax.jcr.version.VersionIterator;
 
 import org.apache.jackrabbit.commons.iterator.RangeIteratorAdapter;
+import org.apache.jackrabbit.commons.iterator.FrozenNodeIteratorAdapter;
 import org.apache.jackrabbit.jcr2spi.ItemLifeCycleListener;
 import org.apache.jackrabbit.jcr2spi.LazyItemIterator;
 import org.apache.jackrabbit.jcr2spi.NodeImpl;
@@ -78,8 +79,7 @@
      * @see VersionHistory#getVersionableUUID()
      */
     public String getVersionableUUID() throws RepositoryException {
-        checkStatus();
-        return getProperty(NameConstants.JCR_VERSIONABLEUUID).getString();
+        return getVersionableIdentifier();
     }
 
     /**
@@ -237,14 +237,13 @@
      * @see VersionHistory#getAllFrozenNodes()
      */
     public NodeIterator getAllFrozenNodes() throws RepositoryException {
-        // TODO
-        throw new UnsupportedRepositoryOperationException("JCR-1104");
+        return new FrozenNodeIteratorAdapter(getAllVersions());
     }
 
     /**
      * @see VersionHistory#getAllLinearFrozenNodes()
      */
-    public NodeIterator getAllLinearFrozenNodes() throws RepositoryException {
+    public NodeIterator getAllLinearFrozenNodes() throws RepositoryException {        
         // TODO
         throw new UnsupportedRepositoryOperationException("JCR-1104");
     }
@@ -261,8 +260,8 @@
      * @see VersionHistory#getVersionableIdentifier()
      */
     public String getVersionableIdentifier() throws RepositoryException {
-        // TODO
-        throw new UnsupportedRepositoryOperationException("JCR-1104");
+        checkStatus();
+        return getProperty(NameConstants.JCR_VERSIONABLEUUID).getString();
     }
     
     //---------------------------------------------------------------< Item >---

Modified: jackrabbit/trunk/jackrabbit-jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/version/VersionImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/version/VersionImpl.java?rev=773828&r1=773827&r2=773828&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/version/VersionImpl.java (original)
+++ jackrabbit/trunk/jackrabbit-jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/version/VersionImpl.java Tue May 12 08:59:34 2009
@@ -79,6 +79,14 @@
     }
 
     /**
+     * @see Version#getLinearSuccessor()
+     */
+    public Version getLinearSuccessor() throws RepositoryException {
+        // TODO
+        throw new UnsupportedRepositoryOperationException("JCR-1104");
+    }
+    
+    /**
      *
      * @return
      * @throws RepositoryException
@@ -89,27 +97,28 @@
     }
 
     /**
-     * @see Version#getFrozenNode()
-     */
-    public Node getFrozenNode() throws RepositoryException {
-        // TODO
-        throw new UnsupportedRepositoryOperationException("JCR-1104");
-    }
-
-    /**
      * @see Version#getLinearPredecessor()
      */
     public Version getLinearPredecessor() throws RepositoryException {
-        // TODO
-        throw new UnsupportedRepositoryOperationException("JCR-1104");
+        Value[] values = getProperty(NameConstants.JCR_PREDECESSORS).getValues();
+        if (values != null && values.length > 0) {
+            Node n = session.getNodeByUUID(values[0].getString());
+            if (n instanceof Version) {
+                return (Version) n;
+            } else {
+                throw new RepositoryException("Version property contains invalid value not pointing to a 'Version'");
+            }
+        } else {
+            return null;
+        }
     }
 
     /**
-     * @see Version#getLinearSuccessor()
+     * @see Version#getFrozenNode()
      */
-    public Version getLinearSuccessor() throws RepositoryException {
-        // TODO
-        throw new UnsupportedRepositoryOperationException("JCR-1104");
+    public Node getFrozenNode() throws RepositoryException {
+        return getNode(NameConstants.JCR_FROZENNODE, 1);
+
     }
 
     //---------------------------------------------------------------< Item >---

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=773828&r1=773827&r2=773828&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 Tue May 12 08:59:34 2009
@@ -62,6 +62,13 @@
 
     /**
      * @param nodeState
+     * @throws RepositoryException
+     * @see javax.jcr.version.VersionManager#checkpoint(String)
+     */
+    public NodeEntry checkpoint(NodeState nodeState) throws RepositoryException;
+
+    /**
+     * @param nodeState
      * @return
      * @throws RepositoryException
      * @see javax.jcr.Node#isCheckedOut()
@@ -160,6 +167,25 @@
 
     /**
      * @param nodeState
+     * @param workspaceName
+     * @param bestEffort
+     * @param isShallow
+     * @return An Iterator over <code>NodeId</code>s of all <code>Node</code>s
+     * that failed to be merged and need manual resolution by the user of the API.
+     * @throws NoSuchWorkspaceException
+     * @throws AccessDeniedException
+     * @throws MergeException
+     * @throws LockException
+     * @throws InvalidItemStateException
+     * @throws RepositoryException
+     * @see #resolveMergeConflict(NodeState,NodeState,boolean)
+     * @see javax.jcr.Node#merge(String, boolean)
+     */
+    public Iterator merge(NodeState nodeState, String workspaceName, boolean bestEffort, boolean isShallow) throws NoSuchWorkspaceException, AccessDeniedException, MergeException, LockException, InvalidItemStateException, RepositoryException;
+
+
+    /**
+     * @param nodeState
      * @param versionState
      * @param done
      * @throws VersionException

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=773828&r1=773827&r2=773828&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 Tue May 12 08:59:34 2009
@@ -28,6 +28,7 @@
 import org.apache.jackrabbit.jcr2spi.operation.AddLabel;
 import org.apache.jackrabbit.jcr2spi.operation.RemoveLabel;
 import org.apache.jackrabbit.jcr2spi.operation.RemoveVersion;
+import org.apache.jackrabbit.jcr2spi.operation.Checkpoint;
 import org.apache.jackrabbit.jcr2spi.WorkspaceManager;
 import org.apache.jackrabbit.jcr2spi.hierarchy.NodeEntry;
 import org.slf4j.LoggerFactory;
@@ -35,6 +36,11 @@
 
 import javax.jcr.RepositoryException;
 import javax.jcr.ItemNotFoundException;
+import javax.jcr.NoSuchWorkspaceException;
+import javax.jcr.AccessDeniedException;
+import javax.jcr.MergeException;
+import javax.jcr.InvalidItemStateException;
+import javax.jcr.lock.LockException;
 import javax.jcr.version.VersionException;
 
 import org.apache.jackrabbit.spi.Name;
@@ -69,6 +75,12 @@
         workspaceManager.execute(co);
     }
 
+    public NodeEntry checkpoint(NodeState nodeState) throws RepositoryException {
+        Checkpoint cp = Checkpoint.create(nodeState, this);
+        workspaceManager.execute(cp);
+        return workspaceManager.getHierarchyManager().getNodeEntry(cp.getNewVersionId());
+    }
+
     /**
      * Search nearest ancestor that is versionable. If no versionable ancestor
      * can be found, <code>true</code> is returned.
@@ -140,7 +152,11 @@
     }
 
     public Iterator merge(NodeState nodeState, String workspaceName, boolean bestEffort) throws RepositoryException {
-        Merge op = Merge.create(nodeState, workspaceName, bestEffort, this);
+        return merge(nodeState, workspaceName, bestEffort, false);
+    }
+
+    public Iterator merge(NodeState nodeState, String workspaceName, boolean bestEffort, boolean isShallow) throws NoSuchWorkspaceException, AccessDeniedException, MergeException, LockException, InvalidItemStateException, RepositoryException {
+        Merge op = Merge.create(nodeState, workspaceName, bestEffort, isShallow, this);
         workspaceManager.execute(op);
         return op.getFailedIds();
     }

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=773828&r1=773827&r2=773828&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 Tue May 12 08:59:34 2009
@@ -547,6 +547,14 @@
     /**
      * @throws UnsupportedRepositoryOperationException always.
      */
+    public NodeId checkpoint(SessionInfo sessionInfo, NodeId nodeId)
+            throws UnsupportedRepositoryOperationException, LockException, RepositoryException {
+        throw new UnsupportedRepositoryOperationException();
+    }
+
+    /**
+     * @throws UnsupportedRepositoryOperationException always.
+     */
     public void removeVersion(SessionInfo sessionInfo,
                               NodeId versionHistoryId,
                               NodeId versionId)
@@ -586,6 +594,17 @@
     /**
      * @throws UnsupportedRepositoryOperationException always.
      */
+    public Iterator merge(SessionInfo sessionInfo,
+                          NodeId nodeId,
+                          String srcWorkspaceName,
+                          boolean bestEffort,
+                          boolean isShallow) throws NoSuchWorkspaceException, AccessDeniedException, MergeException, LockException, InvalidItemStateException, RepositoryException {
+        throw new UnsupportedRepositoryOperationException();
+    }
+
+    /**
+     * @throws UnsupportedRepositoryOperationException always.
+     */
     public void resolveMergeConflict(SessionInfo sessionInfo,
                                      NodeId nodeId,
                                      NodeId[] mergeFailedIds,

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=773828&r1=773827&r2=773828&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 Tue May 12 08:59:34 2009
@@ -22,6 +22,7 @@
 
 import javax.jcr.Credentials;
 import javax.jcr.RepositoryException;
+import javax.jcr.UnsupportedRepositoryOperationException;
 
 import org.apache.jackrabbit.spi.Batch;
 import org.apache.jackrabbit.spi.EventBundle;
@@ -384,6 +385,14 @@
         }, "checkout(SessionInfo, NodeId)", new Object[]{unwrap(sessionInfo), nodeId});
     }
 
+    public NodeId checkpoint(final SessionInfo sessionInfo, final NodeId nodeId) throws UnsupportedRepositoryOperationException, RepositoryException {
+        return (NodeId) execute(new Callable() {
+            public Object call() throws RepositoryException {
+                return service.checkpoint(unwrap(sessionInfo), nodeId);
+            }
+        }, "checkpoint(SessionInfo, NodeId)", new Object[]{unwrap(sessionInfo), nodeId});
+    }
+
     public void removeVersion(final SessionInfo sessionInfo, final NodeId versionHistoryId,
             final NodeId versionId) throws RepositoryException {
 
@@ -431,6 +440,17 @@
                 new Object[]{unwrap(sessionInfo), nodeId, srcWorkspaceName, Boolean.valueOf(bestEffort)});
     }
 
+    public Iterator merge(final SessionInfo sessionInfo, final NodeId nodeId, final String srcWorkspaceName,
+            final boolean bestEffort, final boolean isShallow) throws RepositoryException {
+
+        return (Iterator) execute(new Callable() {
+            public Object call() throws RepositoryException {
+                return service.merge(unwrap(sessionInfo), nodeId, srcWorkspaceName, bestEffort, isShallow);
+            }
+        }, "merge(SessionInfo, NodeId, String, boolean, boolean)",
+                new Object[]{unwrap(sessionInfo), nodeId, srcWorkspaceName, Boolean.valueOf(bestEffort)});
+    }
+
     public void resolveMergeConflict(final SessionInfo sessionInfo, final NodeId nodeId,
             final NodeId[] mergeFailedIds, final NodeId[] predecessorIds) 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=773828&r1=773827&r2=773828&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 Tue May 12 08:59:34 2009
@@ -601,6 +601,19 @@
     public void checkout(SessionInfo sessionInfo, NodeId nodeId) throws UnsupportedRepositoryOperationException, LockException, RepositoryException;
 
     /**
+     * Performs a checkpoint for the <code>Node</code> identified by the given
+     * <code>NodeId</code>.
+     *
+     * @param sessionInfo
+     * @param nodeId
+     * @throws javax.jcr.UnsupportedRepositoryOperationException
+     * @throws javax.jcr.lock.LockException
+     * @throws javax.jcr.RepositoryException
+     * @see javax.jcr.version.VersionManager#checkpoint(String)
+     */
+    public NodeId checkpoint(SessionInfo sessionInfo, NodeId nodeId) throws UnsupportedRepositoryOperationException, RepositoryException;
+
+    /**
      * Remove the version inditified by the specified <code>versionId</code>.
      *
      * @param sessionInfo
@@ -687,6 +700,27 @@
     public Iterator merge(SessionInfo sessionInfo, NodeId nodeId, String srcWorkspaceName, boolean bestEffort) throws NoSuchWorkspaceException, AccessDeniedException, MergeException, LockException, InvalidItemStateException, RepositoryException;
 
     /**
+      * Merge the node identified by the given <code>NodeId</code> and its subtree
+      * with the corresponding node present in the workspace with the name of
+      * <code>srcWorkspaceName</code>.
+      *
+      * @param sessionInfo
+      * @param nodeId
+      * @param srcWorkspaceName
+      * @param bestEffort
+      * @return an <code>Iterator</code> over the {@link NodeId}s of all nodes that
+      * received a merge result of "fail" in the course of this operation.
+      * @throws javax.jcr.NoSuchWorkspaceException
+      * @throws javax.jcr.AccessDeniedException
+      * @throws javax.jcr.MergeException
+      * @throws javax.jcr.lock.LockException
+      * @throws javax.jcr.InvalidItemStateException
+      * @throws javax.jcr.RepositoryException
+      * @see javax.jcr.version.VersionManager#merge(String, String, boolean, boolean)
+      */
+     public Iterator merge(SessionInfo sessionInfo, NodeId nodeId, String srcWorkspaceName, boolean bestEffort, boolean isShallow) throws NoSuchWorkspaceException, AccessDeniedException, MergeException, LockException, InvalidItemStateException, RepositoryException;
+
+    /**
      * Resolve an existing merge conflict present with the node 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=773828&r1=773827&r2=773828&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 Tue May 12 08:59:34 2009
@@ -1394,6 +1394,11 @@
         execute(method, sessionInfo);
     }
 
+    public NodeId checkpoint(SessionInfo sessionInfo, NodeId nodeId) throws UnsupportedRepositoryOperationException, RepositoryException {
+        // TODO
+        throw new UnsupportedOperationException("JCR-2104: JSR 283 Versioning. Implementation missing");
+    }
+
     /**
      * @see RepositoryService#removeVersion(SessionInfo, NodeId, NodeId)
      */
@@ -1471,6 +1476,11 @@
         }
     }
 
+    public Iterator merge(SessionInfo sessionInfo, NodeId nodeId, String srcWorkspaceName, boolean bestEffort, boolean isShallow) throws NoSuchWorkspaceException, AccessDeniedException, MergeException, LockException, InvalidItemStateException, RepositoryException {
+        // TODO
+        throw new UnsupportedOperationException("JCR-2104: JSR 283 Versioning. Implementation missing");
+    }
+
     /**
      * @see RepositoryService#resolveMergeConflict(SessionInfo, NodeId, NodeId[], NodeId[])
      */

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=773828&r1=773827&r2=773828&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 Tue May 12 08:59:34 2009
@@ -88,6 +88,7 @@
 import javax.jcr.version.VersionException;
 import javax.jcr.version.VersionHistory;
 import javax.jcr.version.Version;
+import javax.jcr.version.VersionManager;
 import javax.jcr.nodetype.NoSuchNodeTypeException;
 import javax.jcr.nodetype.ConstraintViolationException;
 import javax.jcr.nodetype.NodeTypeManager;
@@ -659,6 +660,17 @@
         }, sInfo);
     }
 
+    public NodeId checkpoint(SessionInfo sessionInfo, final NodeId nodeId) throws UnsupportedRepositoryOperationException, RepositoryException {
+        final SessionInfoImpl sInfo = getSessionInfoImpl(sessionInfo);
+        Version newVersion = (Version) executeWithLocalEvents(new Callable() {
+            public Object run() throws RepositoryException {
+                VersionManager vMgr = sInfo.getSession().getWorkspace().getVersionManager();
+                return vMgr.checkpoint(getNodePath(nodeId, sInfo));
+            }
+        }, sInfo);
+        return idFactory.createNodeId(newVersion, sInfo.getNamePathResolver());
+    }
+
     /**
      * {@inheritDoc}
      */
@@ -789,6 +801,30 @@
     /**
      * {@inheritDoc}
      */
+    public Iterator merge(final SessionInfo sessionInfo,
+                          final NodeId nodeId,
+                          final String srcWorkspaceName,
+                          final boolean bestEffort,
+                          final boolean isShallow)
+            throws NoSuchWorkspaceException, AccessDeniedException, MergeException, LockException, InvalidItemStateException, RepositoryException {
+        final SessionInfoImpl sInfo = getSessionInfoImpl(sessionInfo);
+        return (Iterator) executeWithLocalEvents(new Callable() {
+            public Object run() throws RepositoryException {
+                VersionManager vMgr = sInfo.getSession().getWorkspace().getVersionManager();
+                NodeIterator it = vMgr.merge(getNodePath(nodeId, sInfo), srcWorkspaceName, bestEffort, isShallow);
+                List ids = new ArrayList();
+                while (it.hasNext()) {
+                    ids.add(idFactory.createNodeId(it.nextNode(),
+                            sInfo.getNamePathResolver()));
+                }
+                return ids.iterator();
+            }
+        }, sInfo);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
     public void resolveMergeConflict(final SessionInfo sessionInfo,
                                      final NodeId nodeId,
                                      final NodeId[] mergeFailedIds,
@@ -1454,6 +1490,11 @@
         return n.getNode(jcrPath);
     }
 
+    private String getNodePath(NodeId nodeId, SessionInfoImpl sessionInfo) throws RepositoryException {
+        // TODO: improve. avoid roundtrip over node access.
+        return getNode(nodeId, sessionInfo).getPath();
+    }
+
     private Property getProperty(PropertyId id, SessionInfoImpl sessionInfo) throws ItemNotFoundException, PathNotFoundException, RepositoryException {
         Session session = sessionInfo.getSession();
         Node n;