You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jackrabbit.apache.org by ju...@apache.org on 2005/04/01 11:23:41 UTC

svn commit: r159670 - in incubator/jackrabbit/trunk/contrib/jcr-rmi/src/java/org/apache/jackrabbit/rmi: client/ iterator/ remote/ server/

Author: jukka
Date: Fri Apr  1 01:23:37 2005
New Revision: 159670

URL: http://svn.apache.org/viewcvs?view=rev&rev=159670
Log:
JCR-94: Versioning support for JCR-RMI, contributed by Felix Meschberger.

Added:
    incubator/jackrabbit/trunk/contrib/jcr-rmi/src/java/org/apache/jackrabbit/rmi/client/ClientVersion.java
    incubator/jackrabbit/trunk/contrib/jcr-rmi/src/java/org/apache/jackrabbit/rmi/client/ClientVersionHistory.java
    incubator/jackrabbit/trunk/contrib/jcr-rmi/src/java/org/apache/jackrabbit/rmi/iterator/ArrayVersionIterator.java
    incubator/jackrabbit/trunk/contrib/jcr-rmi/src/java/org/apache/jackrabbit/rmi/remote/RemoteVersion.java
    incubator/jackrabbit/trunk/contrib/jcr-rmi/src/java/org/apache/jackrabbit/rmi/remote/RemoteVersionHistory.java
    incubator/jackrabbit/trunk/contrib/jcr-rmi/src/java/org/apache/jackrabbit/rmi/server/ServerVersion.java
    incubator/jackrabbit/trunk/contrib/jcr-rmi/src/java/org/apache/jackrabbit/rmi/server/ServerVersionHistory.java
Modified:
    incubator/jackrabbit/trunk/contrib/jcr-rmi/src/java/org/apache/jackrabbit/rmi/client/ClientAdapterFactory.java
    incubator/jackrabbit/trunk/contrib/jcr-rmi/src/java/org/apache/jackrabbit/rmi/client/ClientItem.java
    incubator/jackrabbit/trunk/contrib/jcr-rmi/src/java/org/apache/jackrabbit/rmi/client/ClientNode.java
    incubator/jackrabbit/trunk/contrib/jcr-rmi/src/java/org/apache/jackrabbit/rmi/client/ClientObject.java
    incubator/jackrabbit/trunk/contrib/jcr-rmi/src/java/org/apache/jackrabbit/rmi/client/ClientQueryResult.java
    incubator/jackrabbit/trunk/contrib/jcr-rmi/src/java/org/apache/jackrabbit/rmi/client/ClientSession.java
    incubator/jackrabbit/trunk/contrib/jcr-rmi/src/java/org/apache/jackrabbit/rmi/client/LocalAdapterFactory.java
    incubator/jackrabbit/trunk/contrib/jcr-rmi/src/java/org/apache/jackrabbit/rmi/remote/RemoteNode.java
    incubator/jackrabbit/trunk/contrib/jcr-rmi/src/java/org/apache/jackrabbit/rmi/server/RemoteAdapterFactory.java
    incubator/jackrabbit/trunk/contrib/jcr-rmi/src/java/org/apache/jackrabbit/rmi/server/ServerAdapterFactory.java
    incubator/jackrabbit/trunk/contrib/jcr-rmi/src/java/org/apache/jackrabbit/rmi/server/ServerItem.java
    incubator/jackrabbit/trunk/contrib/jcr-rmi/src/java/org/apache/jackrabbit/rmi/server/ServerNode.java
    incubator/jackrabbit/trunk/contrib/jcr-rmi/src/java/org/apache/jackrabbit/rmi/server/ServerObject.java
    incubator/jackrabbit/trunk/contrib/jcr-rmi/src/java/org/apache/jackrabbit/rmi/server/ServerQueryResult.java
    incubator/jackrabbit/trunk/contrib/jcr-rmi/src/java/org/apache/jackrabbit/rmi/server/ServerSession.java

Modified: incubator/jackrabbit/trunk/contrib/jcr-rmi/src/java/org/apache/jackrabbit/rmi/client/ClientAdapterFactory.java
URL: http://svn.apache.org/viewcvs/incubator/jackrabbit/trunk/contrib/jcr-rmi/src/java/org/apache/jackrabbit/rmi/client/ClientAdapterFactory.java?view=diff&r1=159669&r2=159670
==============================================================================
--- incubator/jackrabbit/trunk/contrib/jcr-rmi/src/java/org/apache/jackrabbit/rmi/client/ClientAdapterFactory.java (original)
+++ incubator/jackrabbit/trunk/contrib/jcr-rmi/src/java/org/apache/jackrabbit/rmi/client/ClientAdapterFactory.java Fri Apr  1 01:23:37 2005
@@ -33,6 +33,8 @@
 import javax.jcr.query.QueryManager;
 import javax.jcr.query.QueryResult;
 import javax.jcr.query.Row;
+import javax.jcr.version.Version;
+import javax.jcr.version.VersionHistory;
 
 import org.apache.jackrabbit.rmi.remote.RemoteItem;
 import org.apache.jackrabbit.rmi.remote.RemoteItemDef;
@@ -50,6 +52,8 @@
 import org.apache.jackrabbit.rmi.remote.RemoteRepository;
 import org.apache.jackrabbit.rmi.remote.RemoteRow;
 import org.apache.jackrabbit.rmi.remote.RemoteSession;
+import org.apache.jackrabbit.rmi.remote.RemoteVersion;
+import org.apache.jackrabbit.rmi.remote.RemoteVersionHistory;
 import org.apache.jackrabbit.rmi.remote.RemoteWorkspace;
 
 /**
@@ -139,6 +143,25 @@
      */
     public Node getNode(Session session, RemoteNode remote) {
         return new ClientNode(session, remote, this);
+    }
+
+    /**
+     * Creates and returns a {@link ClientVersion ClientVersion} instance.
+     *
+     * {@inheritDoc}
+     */
+    public Version getVersion(Session session, RemoteVersion remote) {
+        return new ClientVersion(session, remote, this);
+    }
+    
+    /**
+     * Creates and returns a {@link ClientVersionHistory ClientVersionHistory}
+     * instance.
+     *
+     * {@inheritDoc}
+     */
+    public VersionHistory getVersionHistory(Session session, RemoteVersionHistory remote) {
+        return new ClientVersionHistory(session, remote, this);
     }
 
     /**

Modified: incubator/jackrabbit/trunk/contrib/jcr-rmi/src/java/org/apache/jackrabbit/rmi/client/ClientItem.java
URL: http://svn.apache.org/viewcvs/incubator/jackrabbit/trunk/contrib/jcr-rmi/src/java/org/apache/jackrabbit/rmi/client/ClientItem.java?view=diff&r1=159669&r2=159670
==============================================================================
--- incubator/jackrabbit/trunk/contrib/jcr-rmi/src/java/org/apache/jackrabbit/rmi/client/ClientItem.java (original)
+++ incubator/jackrabbit/trunk/contrib/jcr-rmi/src/java/org/apache/jackrabbit/rmi/client/ClientItem.java Fri Apr  1 01:23:37 2005
@@ -102,7 +102,7 @@
     /** {@inheritDoc} */
     public Node getParent() throws RepositoryException {
         try {
-            return getFactory().getNode(getSession(), remote.getParent());
+            return getNode(getSession(), remote.getParent());
         } catch (RemoteException ex) {
             throw new RemoteRepositoryException(ex);
         }

Modified: incubator/jackrabbit/trunk/contrib/jcr-rmi/src/java/org/apache/jackrabbit/rmi/client/ClientNode.java
URL: http://svn.apache.org/viewcvs/incubator/jackrabbit/trunk/contrib/jcr-rmi/src/java/org/apache/jackrabbit/rmi/client/ClientNode.java?view=diff&r1=159669&r2=159670
==============================================================================
--- incubator/jackrabbit/trunk/contrib/jcr-rmi/src/java/org/apache/jackrabbit/rmi/client/ClientNode.java (original)
+++ incubator/jackrabbit/trunk/contrib/jcr-rmi/src/java/org/apache/jackrabbit/rmi/client/ClientNode.java Fri Apr  1 01:23:37 2005
@@ -99,7 +99,7 @@
     /** {@inheritDoc} */
     public Node addNode(String path) throws RepositoryException {
         try {
-            return getFactory().getNode(getSession(), remote.addNode(path));
+            return getNode(getSession(), remote.addNode(path));
         } catch (RemoteException ex) {
             throw new RemoteRepositoryException(ex);
         }
@@ -109,7 +109,7 @@
     public Node addNode(String path, String type) throws RepositoryException {
         try {
             RemoteNode node = remote.addNode(path, type);
-            return getFactory().getNode(getSession(), node);
+            return getNode(getSession(), node);
         } catch (RemoteException ex) {
             throw new RemoteRepositoryException(ex);
         }
@@ -203,7 +203,7 @@
     /** {@inheritDoc} */
     public Node getNode(String path) throws RepositoryException {
         try {
-            return getFactory().getNode(getSession(), remote.getNode(path));
+            return getNode(getSession(), remote.getNode(path));
         } catch (RemoteException ex) {
             throw new RemoteRepositoryException(ex);
         }
@@ -385,9 +385,11 @@
 
     /** {@inheritDoc} */
     public Version checkin() throws RepositoryException {
-        // TODO Auto-generated method stub
-        // return null;
-        throw new UnsupportedRepositoryOperationException();
+        try {
+            return getFactory().getVersion(getSession(), remote.checkin());
+        } catch (RemoteException ex) {
+            throw new RemoteRepositoryException(ex);
+        }
     }
 
     /** {@inheritDoc} */
@@ -420,14 +422,20 @@
 
     /** {@inheritDoc} */
     public void cancelMerge(Version version) throws RepositoryException {
-        // TODO Auto-generated method stub
-        throw new UnsupportedRepositoryOperationException();
+        try {
+            remote.cancelMerge(version.getUUID());
+        } catch (RemoteException ex) {
+            throw new RemoteRepositoryException(ex);
+        }
     }
 
     /** {@inheritDoc} */
     public void doneMerge(Version version) throws RepositoryException {
-        // TODO Auto-generated method stub
-        throw new UnsupportedRepositoryOperationException();
+        try {
+            remote.doneMerge(version.getUUID());
+        } catch (RemoteException ex) {
+            throw new RemoteRepositoryException(ex);
+        }
     }
 
     /** {@inheritDoc} */
@@ -462,15 +470,21 @@
     /** {@inheritDoc} */
     public void restore(Version version, boolean removeExisting)
             throws RepositoryException {
-        // TODO Auto-generated method stub
-        throw new UnsupportedRepositoryOperationException();
+        try {
+            remote.restoreByUUID(version.getUUID(), removeExisting);
+        } catch (RemoteException ex) {
+            throw new RemoteRepositoryException(ex);
+        }
     }
 
     /** {@inheritDoc} */
     public void restore(Version version, String path, boolean removeExisting)
             throws RepositoryException {
-        // TODO Auto-generated method stub
-        throw new UnsupportedRepositoryOperationException();
+        try {
+            remote.restore(version.getUUID(), path, removeExisting);
+        } catch (RemoteException ex) {
+            throw new RemoteRepositoryException(ex);
+        }
     }
 
     /** {@inheritDoc} */
@@ -516,16 +530,20 @@
 
     /** {@inheritDoc} */
     public VersionHistory getVersionHistory() throws RepositoryException {
-        // TODO Auto-generated method stub
-        // return null;
-        throw new UnsupportedRepositoryOperationException();
+        try {
+            return getFactory().getVersionHistory(getSession(), remote.getVersionHistory());
+        } catch (RemoteException ex) {
+            throw new RemoteRepositoryException(ex);
+        }
     }
 
     /** {@inheritDoc} */
     public Version getBaseVersion() throws RepositoryException {
-        // TODO Auto-generated method stub
-        // return null;
-        throw new UnsupportedRepositoryOperationException();
+        try {
+            return getFactory().getVersion(getSession(), remote.getBaseVersion());
+        } catch (RemoteException ex) {
+            throw new RemoteRepositoryException(ex);
+        }
     }
 
     /** {@inheritDoc} */

Modified: incubator/jackrabbit/trunk/contrib/jcr-rmi/src/java/org/apache/jackrabbit/rmi/client/ClientObject.java
URL: http://svn.apache.org/viewcvs/incubator/jackrabbit/trunk/contrib/jcr-rmi/src/java/org/apache/jackrabbit/rmi/client/ClientObject.java?view=diff&r1=159669&r2=159670
==============================================================================
--- incubator/jackrabbit/trunk/contrib/jcr-rmi/src/java/org/apache/jackrabbit/rmi/client/ClientObject.java (original)
+++ incubator/jackrabbit/trunk/contrib/jcr-rmi/src/java/org/apache/jackrabbit/rmi/client/ClientObject.java Fri Apr  1 01:23:37 2005
@@ -26,16 +26,21 @@
 import javax.jcr.nodetype.NodeType;
 import javax.jcr.nodetype.NodeTypeIterator;
 import javax.jcr.nodetype.PropertyDef;
+import javax.jcr.version.Version;
+import javax.jcr.version.VersionIterator;
 
 import org.apache.jackrabbit.rmi.iterator.ArrayNodeIterator;
 import org.apache.jackrabbit.rmi.iterator.ArrayNodeTypeIterator;
 import org.apache.jackrabbit.rmi.iterator.ArrayPropertyIterator;
+import org.apache.jackrabbit.rmi.iterator.ArrayVersionIterator;
 import org.apache.jackrabbit.rmi.remote.RemoteItem;
 import org.apache.jackrabbit.rmi.remote.RemoteNode;
 import org.apache.jackrabbit.rmi.remote.RemoteNodeDef;
 import org.apache.jackrabbit.rmi.remote.RemoteNodeType;
 import org.apache.jackrabbit.rmi.remote.RemoteProperty;
 import org.apache.jackrabbit.rmi.remote.RemotePropertyDef;
+import org.apache.jackrabbit.rmi.remote.RemoteVersion;
+import org.apache.jackrabbit.rmi.remote.RemoteVersionHistory;
 
 /**
  * Base class for client adapter objects. The only purpose of
@@ -75,6 +80,9 @@
      * whether to instantiate a {@link Property Property},
      * a {@link Node Node}, or an {@link Item Item} adapter using
      * the local adapter factory.
+     * <p>
+     * If the remote item is a {@link RemoteNode}, this method delegates
+     * to {@link #getNode(Session, RemoteNode)}.
      *
      * @param session current session
      * @param remote remote item
@@ -84,13 +92,35 @@
         if (remote instanceof RemoteProperty) {
             return factory.getProperty(session, (RemoteProperty) remote);
         } else if (remote instanceof RemoteNode) {
-            return factory.getNode(session, (RemoteNode) remote);
+            return getNode(session, (RemoteNode) remote);
         } else {
             return factory.getItem(session, remote);
         }
     }
 
     /**
+     * Utility method to create a local adapter for a remote node.
+     * This method introspects the remote reference to determine
+     * whether to instantiate a {@link Node Node},
+     * a {@link javax.jcr.version.VersionHistory VersionHistory}, or a
+     *  {@link Version Version} adapter using
+     * the local adapter factory.
+     *
+     * @param session current session
+     * @param remote remote node
+     * @return local node, version, or version history adapter
+     */
+    protected Node getNode(Session session, RemoteNode remote) {
+        if (remote instanceof RemoteVersion) {
+            return factory.getVersion(session, (RemoteVersion) remote);
+        } else if (remote instanceof RemoteVersionHistory) {
+            return factory.getVersionHistory(session, (RemoteVersionHistory) remote);
+        } else {
+            return factory.getNode(session, (RemoteNode) remote);
+        }
+    }
+
+    /**
      * Utility method for creating a property iterator for an array
      * of remote properties. The properties in the returned iterator
      * are created using the local adapter factory.
@@ -130,12 +160,52 @@
         if (remotes != null) {
             Node[] nodes = new Node[remotes.length];
             for (int i = 0; i < remotes.length; i++) {
-                nodes[i] = factory.getNode(session, remotes[i]);
+                nodes[i] = getNode(session, remotes[i]);
             }
             return new ArrayNodeIterator(nodes);
         } else {
             return new ArrayNodeIterator(new Node[0]); // for safety
         }
+    }
+
+    /**
+     * Utility method for creating a version array for an array
+     * of remote versions. The versions in the returned array
+     * are created using the local adapter factory.
+     * <p>
+     * A <code>null</code> input is treated as an empty array.
+     *
+     * @param session current session
+     * @param remotes remote versions
+     * @return local version array
+     */
+    protected Version[] getVersionArray(
+            Session session, RemoteVersion[] remotes) {
+        if (remotes != null) {
+            Version[] versions = new Version[remotes.length];
+            for (int i = 0; i < remotes.length; i++) {
+                versions[i] = factory.getVersion(session, remotes[i]);
+            }
+            return versions;
+        } else {
+            return new Version[0]; // for safety
+        }
+    }
+
+    /**
+     * Utility method for creating a version iterator for an array
+     * of remote versions. The versions in the returned iterator
+     * are created using the local adapter factory.
+     * <p>
+     * A <code>null</code> input is treated as an empty array.
+     *
+     * @param session current session
+     * @param remotes remote versions
+     * @return local version iterator
+     */
+    protected VersionIterator getVersionIterator(
+            Session session, RemoteVersion[] remotes) {
+        return new ArrayVersionIterator(getVersionArray(session, remotes));
     }
 
     /**

Modified: incubator/jackrabbit/trunk/contrib/jcr-rmi/src/java/org/apache/jackrabbit/rmi/client/ClientQueryResult.java
URL: http://svn.apache.org/viewcvs/incubator/jackrabbit/trunk/contrib/jcr-rmi/src/java/org/apache/jackrabbit/rmi/client/ClientQueryResult.java?view=diff&r1=159669&r2=159670
==============================================================================
--- incubator/jackrabbit/trunk/contrib/jcr-rmi/src/java/org/apache/jackrabbit/rmi/client/ClientQueryResult.java (original)
+++ incubator/jackrabbit/trunk/contrib/jcr-rmi/src/java/org/apache/jackrabbit/rmi/client/ClientQueryResult.java Fri Apr  1 01:23:37 2005
@@ -99,7 +99,7 @@
             if (remotes != null) {
                 Node[] nodes = new Node[remotes.length];
                 for (int i = 0; i < nodes.length; i++) {
-                    nodes[i] = getFactory().getNode(session, remotes[i]);
+                    nodes[i] = getNode(session, remotes[i]);
                 }
                 return new ArrayNodeIterator(nodes);
             } else {

Modified: incubator/jackrabbit/trunk/contrib/jcr-rmi/src/java/org/apache/jackrabbit/rmi/client/ClientSession.java
URL: http://svn.apache.org/viewcvs/incubator/jackrabbit/trunk/contrib/jcr-rmi/src/java/org/apache/jackrabbit/rmi/client/ClientSession.java?view=diff&r1=159669&r2=159670
==============================================================================
--- incubator/jackrabbit/trunk/contrib/jcr-rmi/src/java/org/apache/jackrabbit/rmi/client/ClientSession.java (original)
+++ incubator/jackrabbit/trunk/contrib/jcr-rmi/src/java/org/apache/jackrabbit/rmi/client/ClientSession.java Fri Apr  1 01:23:37 2005
@@ -136,7 +136,7 @@
     /** {@inheritDoc} */
     public Node getRootNode() throws RepositoryException {
         try {
-            return getFactory().getNode(this, remote.getRootNode());
+            return getNode(this, remote.getRootNode());
         } catch (RemoteException ex) {
             throw new RemoteRepositoryException(ex);
         }
@@ -145,7 +145,7 @@
     /** {@inheritDoc} */
     public Node getNodeByUUID(String uuid) throws RepositoryException {
         try {
-            return getFactory().getNode(this, remote.getNodeByUUID(uuid));
+            return getNode(this, remote.getNodeByUUID(uuid));
         } catch (RemoteException ex) {
             throw new RemoteRepositoryException(ex);
         }

Added: incubator/jackrabbit/trunk/contrib/jcr-rmi/src/java/org/apache/jackrabbit/rmi/client/ClientVersion.java
URL: http://svn.apache.org/viewcvs/incubator/jackrabbit/trunk/contrib/jcr-rmi/src/java/org/apache/jackrabbit/rmi/client/ClientVersion.java?view=auto&rev=159670
==============================================================================
--- incubator/jackrabbit/trunk/contrib/jcr-rmi/src/java/org/apache/jackrabbit/rmi/client/ClientVersion.java (added)
+++ incubator/jackrabbit/trunk/contrib/jcr-rmi/src/java/org/apache/jackrabbit/rmi/client/ClientVersion.java Fri Apr  1 01:23:37 2005
@@ -0,0 +1,82 @@
+/*
+ * Copyright 2004-2005 The Apache Software Foundation or its licensors,
+ *                     as applicable.
+ *
+ * Licensed 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.rmi.client;
+
+import java.rmi.RemoteException;
+import java.util.Calendar;
+
+import javax.jcr.RepositoryException;
+import javax.jcr.Session;
+import javax.jcr.version.Version;
+
+import org.apache.jackrabbit.rmi.remote.RemoteVersion;
+
+/**
+ * Local adapter for the JCR-RMI
+ * {@link org.apache.jackrabbit.rmi.remote.RemoteVersion RemoteVersion}
+ * interface. This class makes a remote version locally available using
+ * the JCR {@link javax.jcr.version.Version Version} interface.
+ *
+ * @author Felix Meschberger
+ * @see javax.jcr.version.Version
+ * @see org.apache.jackrabbit.rmi.remote.RemoteVersion
+ */
+public class ClientVersion extends ClientNode implements Version {
+
+    /** The adapted remote version. */
+    private RemoteVersion remote;
+
+    /**
+     * Creates a local adapter for the given remote version.
+     *
+     * @param session current session
+     * @param remote  remote version
+     * @param factory local adapter factory
+     */
+    public ClientVersion(Session session, RemoteVersion remote,
+        LocalAdapterFactory factory) {
+        super(session, remote, factory);
+        this.remote = remote;
+    }
+
+    /** {@inheritDoc} */
+    public Calendar getCreated() throws RepositoryException {
+        try {
+            return remote.getCreated();
+        } catch (RemoteException ex) {
+            throw new RemoteRepositoryException(ex);
+        }
+    }
+
+    /** {@inheritDoc} */
+    public Version[] getSuccessors() throws RepositoryException {
+        try {
+            return getVersionArray(getSession(), remote.getSuccessors());
+        } catch (RemoteException ex) {
+            throw new RemoteRepositoryException(ex);
+        }
+    }
+
+    /** {@inheritDoc} */
+    public Version[] getPredecessors() throws RepositoryException {
+        try {
+            return getVersionArray(getSession(), remote.getPredecessors());
+        } catch (RemoteException ex) {
+            throw new RemoteRepositoryException(ex);
+        }
+    }
+}
\ No newline at end of file

Added: incubator/jackrabbit/trunk/contrib/jcr-rmi/src/java/org/apache/jackrabbit/rmi/client/ClientVersionHistory.java
URL: http://svn.apache.org/viewcvs/incubator/jackrabbit/trunk/contrib/jcr-rmi/src/java/org/apache/jackrabbit/rmi/client/ClientVersionHistory.java?view=auto&rev=159670
==============================================================================
--- incubator/jackrabbit/trunk/contrib/jcr-rmi/src/java/org/apache/jackrabbit/rmi/client/ClientVersionHistory.java (added)
+++ incubator/jackrabbit/trunk/contrib/jcr-rmi/src/java/org/apache/jackrabbit/rmi/client/ClientVersionHistory.java Fri Apr  1 01:23:37 2005
@@ -0,0 +1,169 @@
+/*
+ * Copyright 2004-2005 The Apache Software Foundation or its licensors,
+ *                     as applicable.
+ *
+ * Licensed 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.rmi.client;
+
+import java.rmi.RemoteException;
+
+import javax.jcr.RepositoryException;
+import javax.jcr.Session;
+import javax.jcr.UnsupportedRepositoryOperationException;
+import javax.jcr.version.Version;
+import javax.jcr.version.VersionException;
+import javax.jcr.version.VersionHistory;
+import javax.jcr.version.VersionIterator;
+
+import org.apache.jackrabbit.rmi.remote.RemoteNode;
+import org.apache.jackrabbit.rmi.remote.RemoteVersion;
+import org.apache.jackrabbit.rmi.remote.RemoteVersionHistory;
+
+/**
+ * Local adapter for the JCR-RMI
+ * {@link org.apache.jackrabbit.rmi.remote.RemoteVersionHistory RemoteVersionHistory}
+ * interface. This class makes a remote version history locally available using
+ * the JCR {@link javax.jcr.version.VersionHistory VersionHistory} interface.
+ *
+ * @author Felix Meschberger
+ * @see javax.jcr.version.VersionHistory
+ * @see org.apache.jackrabbit.rmi.remote.RemoteVersionHistory
+ */
+public class ClientVersionHistory extends ClientNode implements VersionHistory {
+
+    /** The adapted remote version history. */
+    private RemoteVersionHistory remote;
+
+    /**
+     * Creates a local adapter for the given remote version history.
+     *
+     * @param session current session
+     * @param remote  remote version history
+     * @param factory local adapter factory
+     */
+    public ClientVersionHistory(Session session, RemoteVersionHistory remote,
+        LocalAdapterFactory factory) {
+        super(session, remote, factory);
+        this.remote = remote;
+    }
+
+    public Version getRootVersion() throws RepositoryException {
+        try {
+            return getFactory().getVersion(getSession(), remote.getRootVersion());
+        } catch (RemoteException ex) {
+            throw new RemoteRepositoryException(ex);
+        }
+    }
+
+    /** {@inheritDoc} */
+    public VersionIterator getAllVersions() throws RepositoryException {
+        try {
+            return getVersionIterator(getSession(), remote.getAllVersions());
+        } catch (RemoteException ex) {
+            throw new RemoteRepositoryException(ex);
+        }
+    }
+
+    /** {@inheritDoc} */
+    public Version getVersion(String versionName) throws VersionException,
+        RepositoryException {
+        try {
+            return getFactory().getVersion(getSession(), remote.getVersion(versionName));
+        } catch (RemoteException ex) {
+            throw new RemoteRepositoryException(ex);
+        }
+    }
+
+    /** {@inheritDoc} */
+    public Version getVersionByLabel(String label) throws RepositoryException {
+        try {
+            return getFactory().getVersion(getSession(), remote.getVersionByLabel(label));
+        } catch (RemoteException ex) {
+            throw new RemoteRepositoryException(ex);
+        }
+    }
+
+    /** {@inheritDoc} */
+    public void addVersionLabel(String versionName, String label,
+            boolean moveLabel) throws VersionException, RepositoryException {
+        try {
+            remote.addVersionLabel(versionName, label, moveLabel);
+        } catch (RemoteException ex) {
+            throw new RemoteRepositoryException(ex);
+        }
+    }
+
+    /** {@inheritDoc} */
+    public void removeVersionLabel(String label)
+            throws VersionException, RepositoryException {
+        try {
+            remote.removeVersionLabel(label);
+        } catch (RemoteException ex) {
+            throw new RemoteRepositoryException(ex);
+        }
+    }
+
+    /** {@inheritDoc} */
+    public boolean hasVersionLabel(String label) {
+        try {
+            return remote.hasVersionLabel(label);
+        } catch (RemoteException ex) {
+            // grok the exception and assume label is missing
+            return false;
+        }
+    }
+
+    /** {@inheritDoc} */
+    public boolean hasVersionLabel(Version version, String label)
+            throws VersionException, RepositoryException {
+        try {
+            String versionUUID = version.getUUID();
+            return remote.hasVersionLabel(versionUUID, label);
+        } catch (RemoteException ex) {
+            throw new RemoteRepositoryException(ex);
+        }
+    }
+
+    /** {@inheritDoc} */
+    public String[] getVersionLabels() {
+        try {
+            return remote.getVersionLabels();
+        } catch (RemoteException ex) {
+            // grok the exception and return an empty array
+            return new String[0];
+        }
+    }
+
+    /** {@inheritDoc} */
+    public String[] getVersionLabels(Version version)
+            throws VersionException, RepositoryException {
+        try {
+            String versionUUID = version.getUUID();
+            return remote.getVersionLabels(versionUUID);
+        } catch (RemoteException ex) {
+            throw new RemoteRepositoryException(ex);
+        }
+    }
+
+    /** {@inheritDoc} */
+    public void removeVersion(String versionName)
+            throws UnsupportedRepositoryOperationException, VersionException,
+            RepositoryException {
+        try {
+            remote.removeVersion(versionName);
+        } catch (RemoteException ex) {
+            throw new RemoteRepositoryException(ex);
+        }
+    }
+}

Modified: incubator/jackrabbit/trunk/contrib/jcr-rmi/src/java/org/apache/jackrabbit/rmi/client/LocalAdapterFactory.java
URL: http://svn.apache.org/viewcvs/incubator/jackrabbit/trunk/contrib/jcr-rmi/src/java/org/apache/jackrabbit/rmi/client/LocalAdapterFactory.java?view=diff&r1=159669&r2=159670
==============================================================================
--- incubator/jackrabbit/trunk/contrib/jcr-rmi/src/java/org/apache/jackrabbit/rmi/client/LocalAdapterFactory.java (original)
+++ incubator/jackrabbit/trunk/contrib/jcr-rmi/src/java/org/apache/jackrabbit/rmi/client/LocalAdapterFactory.java Fri Apr  1 01:23:37 2005
@@ -33,6 +33,8 @@
 import javax.jcr.query.QueryManager;
 import javax.jcr.query.QueryResult;
 import javax.jcr.query.Row;
+import javax.jcr.version.Version;
+import javax.jcr.version.VersionHistory;
 
 import org.apache.jackrabbit.rmi.remote.RemoteItem;
 import org.apache.jackrabbit.rmi.remote.RemoteItemDef;
@@ -50,6 +52,8 @@
 import org.apache.jackrabbit.rmi.remote.RemoteRepository;
 import org.apache.jackrabbit.rmi.remote.RemoteRow;
 import org.apache.jackrabbit.rmi.remote.RemoteSession;
+import org.apache.jackrabbit.rmi.remote.RemoteVersion;
+import org.apache.jackrabbit.rmi.remote.RemoteVersionHistory;
 import org.apache.jackrabbit.rmi.remote.RemoteWorkspace;
 
 /**
@@ -149,6 +153,24 @@
      * @return local node adapter
      */
     Node getNode(Session session, RemoteNode remote);
+
+    /**
+     * Factory method for creating a local adapter for a remote version.
+     *
+     * @param session current session
+     * @param remote remote version
+     * @return local version adapter
+     */
+    Version getVersion(Session session, RemoteVersion remote);
+
+    /**
+     * Factory method for creating a local adapter for a remote version history.
+     *
+     * @param session current session
+     * @param remote remote version history
+     * @return local version history adapter
+     */
+    VersionHistory getVersionHistory(Session session, RemoteVersionHistory remote);
 
     /**
      * Factory method for creating a local adapter for a remote node type.

Added: incubator/jackrabbit/trunk/contrib/jcr-rmi/src/java/org/apache/jackrabbit/rmi/iterator/ArrayVersionIterator.java
URL: http://svn.apache.org/viewcvs/incubator/jackrabbit/trunk/contrib/jcr-rmi/src/java/org/apache/jackrabbit/rmi/iterator/ArrayVersionIterator.java?view=auto&rev=159670
==============================================================================
--- incubator/jackrabbit/trunk/contrib/jcr-rmi/src/java/org/apache/jackrabbit/rmi/iterator/ArrayVersionIterator.java (added)
+++ incubator/jackrabbit/trunk/contrib/jcr-rmi/src/java/org/apache/jackrabbit/rmi/iterator/ArrayVersionIterator.java Fri Apr  1 01:23:37 2005
@@ -0,0 +1,46 @@
+/*
+ * Copyright 2004-2005 The Apache Software Foundation or its licensors,
+ *                     as applicable.
+ *
+ * Licensed 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.rmi.iterator;
+
+import javax.jcr.version.Version;
+import javax.jcr.version.VersionIterator;
+
+/**
+ * Array implementation of the JCR
+ * {@link javax.jcr.version.VersionIterator VersionIterator} interface.
+ * This class is used by the JCR-RMI client adapters to convert
+ * version arrays to iterators.
+ *
+ * @author Felix Meschberger
+ */
+public class ArrayVersionIterator extends ArrayIterator implements VersionIterator {
+
+    /**
+     * Creates an iterator for the given array of nodes.
+     *
+     * @param nodes the nodes to iterate
+     */
+    public ArrayVersionIterator(Version[] versions) {
+        super(versions);
+    }
+
+    /** {@inheritDoc} */
+    public Version nextVersion() {
+        return (Version) next();
+    }
+
+}

Modified: incubator/jackrabbit/trunk/contrib/jcr-rmi/src/java/org/apache/jackrabbit/rmi/remote/RemoteNode.java
URL: http://svn.apache.org/viewcvs/incubator/jackrabbit/trunk/contrib/jcr-rmi/src/java/org/apache/jackrabbit/rmi/remote/RemoteNode.java?view=diff&r1=159669&r2=159670
==============================================================================
--- incubator/jackrabbit/trunk/contrib/jcr-rmi/src/java/org/apache/jackrabbit/rmi/remote/RemoteNode.java (original)
+++ incubator/jackrabbit/trunk/contrib/jcr-rmi/src/java/org/apache/jackrabbit/rmi/remote/RemoteNode.java Fri Apr  1 01:23:37 2005
@@ -351,6 +351,15 @@
 
     /**
      * Remote version of the
+     * {@link javax.jcr.Node#checkin() Node.checkin()} method.
+     *
+     * @throws RepositoryException on repository errors
+     * @throws RemoteException on RMI errors
+     */
+    RemoteVersion checkin() throws RepositoryException, RemoteException;
+
+    /**
+     * Remote version of the
      * {@link javax.jcr.Node#checkout() Node.checkout()} method.
      *
      * @throws RepositoryException on repository errors
@@ -383,6 +392,30 @@
 
     /**
      * Remote version of the
+     * {@link javax.jcr.Node#cancelMerge(javax.jcr.version.Version) Node.cancelMerge(Version)}
+     * method.
+     *
+     * @param versionUUID The UUID of the version whose labels are to be returned.
+     * @throws RepositoryException on repository errors
+     * @throws RemoteException on RMI errors
+     */
+    void cancelMerge(String versionUUID)
+            throws RepositoryException, RemoteException;
+
+    /**
+     * Remote version of the
+     * {@link javax.jcr.Node#doneMerge(javax.jcr.version.Version) Node.doneMerge(Version)}
+     * method.
+     *
+     * @param versionUUID The UUID of the version whose labels are to be returned.
+     * @throws RepositoryException on repository errors
+     * @throws RemoteException on RMI errors
+     */
+    void doneMerge(String versionUUID)
+            throws RepositoryException, RemoteException;
+
+    /**
+     * Remote version of the
      * {@link javax.jcr.Node#getCorrespondingNodePath(String) Node.getCorrespondingNodePath(String)}
      * method.
      *
@@ -419,6 +452,36 @@
 
     /**
      * Remote version of the
+     * {@link javax.jcr.Node#restore(javax.jcr.version.Version, boolean) Node.restore(Version,boolean)}
+     * method.
+     * <p>
+     * This method has been rename to prevent a naming clash with
+     * {@link #restore(String, boolean)}.
+     *
+     * @param versionUUID The UUID of the version whose labels are to be returned.
+     * @param removeExisting flag to remove conflicting nodes
+     * @throws RepositoryException on repository errors
+     * @throws RemoteException on RMI errors
+     */
+    void restoreByUUID(String versionUUID, boolean removeExisting)
+            throws RepositoryException, RemoteException;
+
+    /**
+     * Remote version of the
+     * {@link javax.jcr.Node#restore(javax.jcr.version.Version, String, boolean) Node.restore(Version,String,boolean)}
+     * method.
+     *
+     * @param versionUUID The UUID of the version whose labels are to be returned.
+     * @param path the path to which the version is to be restored
+     * @param removeExisting flag to remove conflicting nodes
+     * @throws RepositoryException on repository errors
+     * @throws RemoteException on RMI errors
+     */
+    void restore(String versionUUID, String path, boolean removeExisting)
+            throws RepositoryException, RemoteException;
+
+    /**
+     * Remote version of the
      * {@link javax.jcr.Node#restoreByLabel(String,boolean) Node.restoreByLabel(String,boolean)}
      * method.
      *
@@ -471,6 +534,26 @@
      * @throws RemoteException on RMI errors
      */
     boolean isCheckedOut() throws RepositoryException, RemoteException;
+
+    /**
+     * Remote version of the
+     * {@link javax.jcr.Node#getVersionHistory() Node.getVersionHistory()} method.
+     *
+     * @return the remote version history.
+     * @throws RepositoryException on repository errors
+     * @throws RemoteException on RMI errors
+     */
+    RemoteVersionHistory getVersionHistory() throws RepositoryException, RemoteException;
+
+    /**
+     * Remote version of the
+     * {@link javax.jcr.Node#getBaseVersion() Node.getBaseVersion()} method.
+     *
+     * @return the remote base version
+     * @throws RepositoryException on repository errors
+     * @throws RemoteException on RMI errors
+     */
+    RemoteVersion getBaseVersion() throws RepositoryException, RemoteException;
 
     /**
      * Remote version of the

Added: incubator/jackrabbit/trunk/contrib/jcr-rmi/src/java/org/apache/jackrabbit/rmi/remote/RemoteVersion.java
URL: http://svn.apache.org/viewcvs/incubator/jackrabbit/trunk/contrib/jcr-rmi/src/java/org/apache/jackrabbit/rmi/remote/RemoteVersion.java?view=auto&rev=159670
==============================================================================
--- incubator/jackrabbit/trunk/contrib/jcr-rmi/src/java/org/apache/jackrabbit/rmi/remote/RemoteVersion.java (added)
+++ incubator/jackrabbit/trunk/contrib/jcr-rmi/src/java/org/apache/jackrabbit/rmi/remote/RemoteVersion.java Fri Apr  1 01:23:37 2005
@@ -0,0 +1,90 @@
+/*
+ * Copyright 2004-2005 The Apache Software Foundation or its licensors,
+ *                     as applicable.
+ *
+ * Licensed 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.rmi.remote;
+
+import java.rmi.RemoteException;
+import java.util.Calendar;
+
+import javax.jcr.RepositoryException;
+
+
+/**
+ * Remote version of the JCR {@link javax.jcr.version.Version Version} interface.
+ * Used by the {@link org.apache.jackrabbit.rmi.server.ServerVersion ServerVersion}
+ * and {@link org.apache.jackrabbit.rmi.client.ClientVersion ClientVersion}
+ * adapters to provide transparent RMI access to remote versions.
+ * <p>
+ * The methods in this interface are documented only with a reference
+ * to a corresponding Version method. The remote object will simply forward
+ * the method call to the underlying Version instance. Argument and return
+ * values, as well as possible exceptions, are copied over the network.
+ * Complex return values (like Versions) are returned as remote
+ * references to the corresponding remote interfaces. Iterator values
+ * are transmitted as object arrays. RMI errors are signalled with
+ * RemoteExceptions.
+ *
+ * @author Felix Meschberger
+ * @see javax.jcr.version.Version
+ * @see org.apache.jackrabbit.rmi.client.ClientVersion
+ * @see org.apache.jackrabbit.rmi.server.ServerVersion
+ */
+public interface RemoteVersion extends RemoteNode {
+
+    /**
+     * Remote version of the
+     * {@link javax.jcr.version.Version#getContainingHistory() Version.getContainingHistory()} method.
+     *
+     * @return a <code>RemoteVersionHistory</code> object.
+     * 
+     * @throws RepositoryException on repository errors
+     * @throws RemoteException on RMI errors
+     */
+//     public RemoteVersionHistory getContainingHistory() throws RepositoryException;
+
+    /**
+     * Remote version of the
+     * {@link javax.jcr.version.Version#getCreated() Version.getCreated()} method.
+     *
+     * @return a <code>Calendar</code> object.
+     * 
+     * @throws RepositoryException on repository errors
+     * @throws RemoteException on RMI errors
+     */
+    public Calendar getCreated() throws RepositoryException, RemoteException;
+
+    /**
+     * Remote version of the
+     * {@link javax.jcr.version.Version#getSuccessors() Version.getSuccessors()} method.
+     *
+     * @return a <code>RemoteVersion</code> array.
+     * 
+     * @throws RepositoryException on repository errors
+     * @throws RemoteException on RMI errors
+     */
+    public RemoteVersion[] getSuccessors() throws RepositoryException, RemoteException;
+
+    /**
+     * Remote version of the
+     * {@link javax.jcr.version.Version#getPredecessors() Version.getPredecessors()} method.
+     *
+     * @return a <code>RemoteVersion</code> array.
+     * 
+     * @throws RepositoryException on repository errors
+     * @throws RemoteException on RMI errors
+     */
+    public RemoteVersion[] getPredecessors() throws RepositoryException, RemoteException;
+}

Added: incubator/jackrabbit/trunk/contrib/jcr-rmi/src/java/org/apache/jackrabbit/rmi/remote/RemoteVersionHistory.java
URL: http://svn.apache.org/viewcvs/incubator/jackrabbit/trunk/contrib/jcr-rmi/src/java/org/apache/jackrabbit/rmi/remote/RemoteVersionHistory.java?view=auto&rev=159670
==============================================================================
--- incubator/jackrabbit/trunk/contrib/jcr-rmi/src/java/org/apache/jackrabbit/rmi/remote/RemoteVersionHistory.java (added)
+++ incubator/jackrabbit/trunk/contrib/jcr-rmi/src/java/org/apache/jackrabbit/rmi/remote/RemoteVersionHistory.java Fri Apr  1 01:23:37 2005
@@ -0,0 +1,198 @@
+/*
+ * Copyright 2004-2005 The Apache Software Foundation or its licensors,
+ *                     as applicable.
+ *
+ * Licensed 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.rmi.remote;
+
+import java.rmi.RemoteException;
+
+import javax.jcr.RepositoryException;
+
+/**
+ * Remote version of the JCR 
+ * {@link javax.jcr.version.VersionHistory VersionHistory} interface. Used by
+ * the 
+ * {@link org.apache.jackrabbit.rmi.server.ServerVersionHistory ServerVersionHistory}
+ * and
+ * {@link org.apache.jackrabbit.rmi.client.ClientVersionHistory ClientVersionHistory}
+ * adapters to provide transparent RMI access to remote version histories.
+ * <p>
+ * The methods in this interface are documented only with a reference
+ * to a corresponding VersionHistory method. The remote object will simply
+ * forward the method call to the underlying VersionHistory instance. Argument
+ * and return values, as well as possible exceptions, are copied over the
+ * network. Complex return values (like Versions) are returned as remote
+ * references to the corresponding remote interfaces. Iterator values
+ * are transmitted as object arrays. RMI errors are signalled with
+ * RemoteExceptions.
+ *
+ * @author Felix Meschberger
+ * @see javax.jcr.version.Version
+ * @see org.apache.jackrabbit.rmi.client.ClientVersionHistory
+ * @see org.apache.jackrabbit.rmi.server.ServerVersionHistory
+ */
+public interface RemoteVersionHistory extends RemoteNode {
+
+    /**
+     * Remote version of the
+     * {@link javax.jcr.version.VersionHistory#getVersionableUUID() VersionHistory.getVersionableUUID()}
+     * method.
+     *
+     * @return the UUID of the versionable node for which this is the version history.
+     * @throws RepositoryException if an error occurs.
+     * @throws RemoteException on RMI errors
+     */
+//    public String getVersionableUUID() 
+//            throws RepositoryException, RemoteException;
+
+    /**
+     * Remote version of the
+     * {@link javax.jcr.version.VersionHistory#getRootVersion() VersionHistory.getRootVersion()}
+     * method.
+     *
+     * @return a <code>Version</code> object.
+     * @throws RepositoryException if an error occurs.
+     * @throws RemoteException on RMI errors
+     */
+    public RemoteVersion getRootVersion() 
+            throws RepositoryException, RemoteException;
+
+    /**
+     * Remote version of the
+     * {@link javax.jcr.version.VersionHistory#getAllVersions() VersionHistory.getAllVersions()}
+     * method.
+     *
+     * @return a <code>VersionIterator</code> object.
+     * @throws RepositoryException if an error occurs.
+     * @throws RemoteException on RMI errors
+     */
+    public RemoteVersion[] getAllVersions() 
+            throws RepositoryException, RemoteException;
+
+    /**
+     * Remote version of the
+     * {@link javax.jcr.version.VersionHistory#getVersion(String) VersionHistory.getVersion(String)}
+     * method.
+     *
+     * @param versionName a version name
+     * @return a <code>Version</code> object.
+     * @throws RepositoryException if an error occurs.
+     * @throws RemoteException on RMI errors
+     */
+    public RemoteVersion getVersion(String versionName)
+            throws RepositoryException, RemoteException;
+
+    /**
+     * Remote version of the
+     * {@link javax.jcr.version.VersionHistory#getVersionByLabel(String) VersionHistory.getVersionByLabel(String)}
+     * method.
+     *
+     * @param label a version label
+     * @return a <code>Version</code> object.
+     * @throws RepositoryException if an error occurs.
+     * @throws RemoteException on RMI errors
+     */
+    public RemoteVersion getVersionByLabel(String label)
+            throws RepositoryException, RemoteException;
+
+    /**
+     * Remote version of the
+     * {@link javax.jcr.version.VersionHistory#addVersionLabel(String, String, boolean) VersionHistory.addVersionLabel(String, String, boolean)}
+     * method.
+     *
+     * @param versionName the name of the version to which the label is to be added.
+     * @param label the label to be added.
+     * @param moveLabel if <code>true</code>, then if <code>label</code> is already assigned to a version in
+     * this version history, it is moved to the new version specified; if <code>false</code>, then attempting
+     * to assign an already used label will throw a <code>VersionException</code>.
+     *
+     * @throws RepositoryException if another error occurs.
+     * @throws RemoteException on RMI errors
+     */
+    public void addVersionLabel(String versionName, String label, boolean moveLabel)
+            throws RepositoryException, RemoteException;
+
+    /**
+     * Remote version of the
+     * {@link javax.jcr.version.VersionHistory#removeVersionLabel(String) VersionHistory.removeVersionLabel(String)}
+     * method.
+     *
+     * @param label a version label
+     * @throws RepositoryException if another error occurs.
+     * @throws RemoteException on RMI errors
+     */
+    public void removeVersionLabel(String label)
+            throws RepositoryException, RemoteException;
+
+    /**
+     * Remote version of the
+     * {@link javax.jcr.version.VersionHistory#hasVersionLabel(String) VersionHistory.hasVersionLabel(String)}
+     * method.
+     *
+     * @param label a version label
+     * @return a <code>boolean</code>
+     * @throws RemoteException on RMI errors
+     */
+    public boolean hasVersionLabel(String label) throws RemoteException;
+
+    /**
+     * Remote version of the
+     * {@link javax.jcr.version.VersionHistory#hasVersionLabel(RemoteVersion, String) hasVersionLabel(RemoteVersion, String)}
+     * method.
+     *
+     * @param versionUUID The UUID of the version whose labels are to be returned.
+     * @param label a version label
+     * @return a <code>boolean</code>.
+     * @throws RepositoryException if another error occurs.
+     * @throws RemoteException on RMI errors
+     */
+    public boolean hasVersionLabel(String versionUUID, String label)
+            throws RepositoryException, RemoteException;
+
+    /**
+     * Remote version of the
+     * {@link javax.jcr.version.VersionHistory#getVersionLabels() VersionHistory.getVersionLabels()}
+     * method.
+     *
+     * @return a <code>String</code> array containing all the labels of the version history
+     * @throws RemoteException on RMI errors
+     */
+    public String[] getVersionLabels() throws RemoteException;
+
+    /**
+     * Remote version of the
+     * {@link javax.jcr.version.VersionHistory#getVersionLabels(RemoteVersion) VersionHistory.getVersionLabels(RemoteVersion)}
+     * method.
+     *
+     * @param versionUUID The UUID of the version whose labels are to be returned.
+     * @return a <code>String</code> array containing all the labels of the given version
+     * @throws RepositoryException if another error occurs.
+     * @throws RemoteException on RMI errors
+     */
+    public String[] getVersionLabels(String versionUUID)
+            throws RepositoryException, RemoteException;
+
+    /**
+     * Remote version of the
+     * {@link javax.jcr.version.VersionHistory#removeVersion(String) VersionHistory.removeVersion(String)}
+     * method.
+     *
+     * @param versionName the name of a version in this version history.
+     * @throws RepositoryException if another error occurs.
+     * @throws RemoteException on RMI errors
+     */
+    public void removeVersion(String versionName)
+            throws RepositoryException, RemoteException;
+}

Modified: incubator/jackrabbit/trunk/contrib/jcr-rmi/src/java/org/apache/jackrabbit/rmi/server/RemoteAdapterFactory.java
URL: http://svn.apache.org/viewcvs/incubator/jackrabbit/trunk/contrib/jcr-rmi/src/java/org/apache/jackrabbit/rmi/server/RemoteAdapterFactory.java?view=diff&r1=159669&r2=159670
==============================================================================
--- incubator/jackrabbit/trunk/contrib/jcr-rmi/src/java/org/apache/jackrabbit/rmi/server/RemoteAdapterFactory.java (original)
+++ incubator/jackrabbit/trunk/contrib/jcr-rmi/src/java/org/apache/jackrabbit/rmi/server/RemoteAdapterFactory.java Fri Apr  1 01:23:37 2005
@@ -35,6 +35,8 @@
 import javax.jcr.query.QueryManager;
 import javax.jcr.query.QueryResult;
 import javax.jcr.query.Row;
+import javax.jcr.version.Version;
+import javax.jcr.version.VersionHistory;
 
 import org.apache.jackrabbit.rmi.remote.RemoteItem;
 import org.apache.jackrabbit.rmi.remote.RemoteItemDef;
@@ -52,6 +54,8 @@
 import org.apache.jackrabbit.rmi.remote.RemoteRepository;
 import org.apache.jackrabbit.rmi.remote.RemoteRow;
 import org.apache.jackrabbit.rmi.remote.RemoteSession;
+import org.apache.jackrabbit.rmi.remote.RemoteVersion;
+import org.apache.jackrabbit.rmi.remote.RemoteVersionHistory;
 import org.apache.jackrabbit.rmi.remote.RemoteWorkspace;
 
 /**
@@ -155,6 +159,25 @@
      */
     RemoteNode getRemoteNode(Node node) throws RemoteException;
 
+    /**
+     * Returns a remote adapter for the given local version.
+     *
+     * @param version local version
+     * @return remote version adapter
+     * @throws RemoteException on RMI errors
+     */
+    RemoteVersion getRemoteVersion(Version version) throws RemoteException;
+
+    /**
+     * Returns a remote adapter for the given local version history.
+     *
+     * @param versionHistory local version history
+     * @return remote version history adapter
+     * @throws RemoteException on RMI errors
+     */
+    RemoteVersionHistory getRemoteVersionHistory(VersionHistory versionHistory) 
+            throws RemoteException;
+    
     /**
      * Returns a remote adapter for the given local node type.
      *

Modified: incubator/jackrabbit/trunk/contrib/jcr-rmi/src/java/org/apache/jackrabbit/rmi/server/ServerAdapterFactory.java
URL: http://svn.apache.org/viewcvs/incubator/jackrabbit/trunk/contrib/jcr-rmi/src/java/org/apache/jackrabbit/rmi/server/ServerAdapterFactory.java?view=diff&r1=159669&r2=159670
==============================================================================
--- incubator/jackrabbit/trunk/contrib/jcr-rmi/src/java/org/apache/jackrabbit/rmi/server/ServerAdapterFactory.java (original)
+++ incubator/jackrabbit/trunk/contrib/jcr-rmi/src/java/org/apache/jackrabbit/rmi/server/ServerAdapterFactory.java Fri Apr  1 01:23:37 2005
@@ -35,6 +35,8 @@
 import javax.jcr.query.QueryManager;
 import javax.jcr.query.QueryResult;
 import javax.jcr.query.Row;
+import javax.jcr.version.Version;
+import javax.jcr.version.VersionHistory;
 
 import org.apache.jackrabbit.rmi.remote.RemoteItem;
 import org.apache.jackrabbit.rmi.remote.RemoteItemDef;
@@ -52,6 +54,8 @@
 import org.apache.jackrabbit.rmi.remote.RemoteRepository;
 import org.apache.jackrabbit.rmi.remote.RemoteRow;
 import org.apache.jackrabbit.rmi.remote.RemoteSession;
+import org.apache.jackrabbit.rmi.remote.RemoteVersion;
+import org.apache.jackrabbit.rmi.remote.RemoteVersionHistory;
 import org.apache.jackrabbit.rmi.remote.RemoteWorkspace;
 
 /**
@@ -139,6 +143,23 @@
         return new ServerNode(node, this);
     }
 
+    /**
+     * Creates a {@link ServerVersion ServerVersion} instance.
+     * {@inheritDoc}
+     */
+    public RemoteVersion getRemoteVersion(Version version) throws RemoteException {
+        return new ServerVersion(version, this);
+    }
+    
+    /**
+     * Creates a {@link ServerVersionHistory ServerVersionHistory} instance.
+     * {@inheritDoc}
+     */
+    public RemoteVersionHistory getRemoteVersionHistory(VersionHistory versionHistory)
+            throws RemoteException {
+        return new ServerVersionHistory(versionHistory, this);
+    }
+    
     /**
      * Creates a {@link ServerNodeType ServerNodeType} instance.
      * {@inheritDoc}

Modified: incubator/jackrabbit/trunk/contrib/jcr-rmi/src/java/org/apache/jackrabbit/rmi/server/ServerItem.java
URL: http://svn.apache.org/viewcvs/incubator/jackrabbit/trunk/contrib/jcr-rmi/src/java/org/apache/jackrabbit/rmi/server/ServerItem.java?view=diff&r1=159669&r2=159670
==============================================================================
--- incubator/jackrabbit/trunk/contrib/jcr-rmi/src/java/org/apache/jackrabbit/rmi/server/ServerItem.java (original)
+++ incubator/jackrabbit/trunk/contrib/jcr-rmi/src/java/org/apache/jackrabbit/rmi/server/ServerItem.java Fri Apr  1 01:23:37 2005
@@ -104,7 +104,7 @@
     /** {@inheritDoc} */
     public RemoteNode getParent() throws RepositoryException, RemoteException {
         try {
-            return getFactory().getRemoteNode(item.getParent());
+            return getRemoteNode(item.getParent());
         } catch (RepositoryException ex) {
             throw getRepositoryException(ex);
         }

Modified: incubator/jackrabbit/trunk/contrib/jcr-rmi/src/java/org/apache/jackrabbit/rmi/server/ServerNode.java
URL: http://svn.apache.org/viewcvs/incubator/jackrabbit/trunk/contrib/jcr-rmi/src/java/org/apache/jackrabbit/rmi/server/ServerNode.java?view=diff&r1=159669&r2=159670
==============================================================================
--- incubator/jackrabbit/trunk/contrib/jcr-rmi/src/java/org/apache/jackrabbit/rmi/server/ServerNode.java (original)
+++ incubator/jackrabbit/trunk/contrib/jcr-rmi/src/java/org/apache/jackrabbit/rmi/server/ServerNode.java Fri Apr  1 01:23:37 2005
@@ -21,8 +21,10 @@
 import javax.jcr.Node;
 import javax.jcr.Property;
 import javax.jcr.RepositoryException;
+import javax.jcr.Session;
 import javax.jcr.Value;
 import javax.jcr.lock.Lock;
+import javax.jcr.version.Version;
 
 import org.apache.jackrabbit.rmi.remote.RemoteItem;
 import org.apache.jackrabbit.rmi.remote.RemoteLock;
@@ -30,6 +32,8 @@
 import org.apache.jackrabbit.rmi.remote.RemoteNodeDef;
 import org.apache.jackrabbit.rmi.remote.RemoteNodeType;
 import org.apache.jackrabbit.rmi.remote.RemoteProperty;
+import org.apache.jackrabbit.rmi.remote.RemoteVersion;
+import org.apache.jackrabbit.rmi.remote.RemoteVersionHistory;
 
 /**
  * Remote adapter for the JCR {@link javax.jcr.Node Node} interface.
@@ -63,7 +67,7 @@
     public RemoteNode addNode(String path)
             throws RepositoryException, RemoteException {
         try {
-            return getFactory().getRemoteNode(node.addNode(path));
+            return getRemoteNode(node.addNode(path));
         } catch (RepositoryException ex) {
             throw getRepositoryException(ex);
         }
@@ -73,7 +77,7 @@
     public RemoteNode addNode(String path, String type)
             throws RepositoryException, RemoteException {
         try {
-            return getFactory().getRemoteNode(node.addNode(path, type));
+            return getRemoteNode(node.addNode(path, type));
         } catch (RepositoryException ex) {
             throw getRepositoryException(ex);
         }
@@ -219,7 +223,7 @@
     public RemoteNode getNode(String path)
             throws RepositoryException, RemoteException {
         try {
-            return getFactory().getRemoteNode(node.getNode(path));
+            return getRemoteNode(node.getNode(path));
         } catch (RepositoryException ex) {
             throw getRepositoryException(ex);
         }
@@ -307,6 +311,15 @@
     }
 
     /** {@inheritDoc} */
+    public RemoteVersion checkin() throws RepositoryException, RemoteException {
+        try {
+            return getFactory().getRemoteVersion(node.checkin());
+        } catch (RepositoryException ex) {
+            throw getRepositoryException(ex);
+        }
+    }
+
+    /** {@inheritDoc} */
     public void checkout() throws RepositoryException, RemoteException {
         try {
             node.checkout();
@@ -345,6 +358,26 @@
     }
 
     /** {@inheritDoc} */
+    public void cancelMerge(String versionUUID)
+            throws RepositoryException, RemoteException {
+        try {
+            node.cancelMerge(getVersionByUUID(versionUUID));
+        } catch (RepositoryException ex) {
+            throw getRepositoryException(ex);
+        }
+    }
+
+    /** {@inheritDoc} */
+    public void doneMerge(String versionUUID)
+            throws RepositoryException, RemoteException {
+        try {
+            node.doneMerge(getVersionByUUID(versionUUID));
+        } catch (RepositoryException ex) {
+            throw getRepositoryException(ex);
+        }
+    }
+
+    /** {@inheritDoc} */
     public void restore(String version, boolean removeExisting)
             throws RepositoryException, RemoteException {
         try {
@@ -355,6 +388,26 @@
     }
 
     /** {@inheritDoc} */
+    public void restoreByUUID(String versionUUID, boolean removeExisting)
+            throws RepositoryException, RemoteException {
+        try {
+            node.restore(getVersionByUUID(versionUUID), removeExisting);
+        } catch (RepositoryException ex) {
+            throw getRepositoryException(ex);
+        }
+    }
+
+    /** {@inheritDoc} */
+    public void restore(String versionUUID, String path, boolean removeExisting)
+            throws RepositoryException, RemoteException {
+        try {
+            node.restore(getVersionByUUID(versionUUID), path, removeExisting);
+        } catch (RepositoryException ex) {
+            throw getRepositoryException(ex);
+        }
+    }
+
+    /** {@inheritDoc} */
     public void restoreByLabel(String label, boolean removeExisting)
             throws RepositoryException, RemoteException {
         try {
@@ -393,6 +446,26 @@
     }
 
     /** {@inheritDoc} */
+    public RemoteVersionHistory getVersionHistory()
+            throws RepositoryException, RemoteException {
+        try {
+            return getFactory().getRemoteVersionHistory(node.getVersionHistory());
+        } catch (RepositoryException ex) {
+            throw getRepositoryException(ex);
+        }
+    }
+    
+    /** {@inheritDoc} */
+    public RemoteVersion getBaseVersion()
+            throws RepositoryException, RemoteException {
+        try {
+            return getFactory().getRemoteVersion(node.getBaseVersion());
+        } catch (RepositoryException ex) {
+            throw getRepositoryException(ex);
+        }
+    }
+    
+    /** {@inheritDoc} */
     public boolean isLocked() throws RepositoryException, RemoteException {
         try {
             return node.isLocked();
@@ -441,4 +514,33 @@
         }
     }
 
+    //---------- Implementation helper -----------------------------------------
+    
+    /**
+     * Returns the {@link Version} instance for the given UUID.
+     * 
+     * @param versionUUID The UUID of the version.
+     * 
+     * @return The version node.
+     * 
+     * @throws RepositoryException if an error occurrs accessing the version
+     *      node or if the UUID does not denote a version.
+     */
+    protected Version getVersionByUUID(String versionUUID)
+            throws RepositoryException {
+        
+        // get the version node by its UUID from the version history's session
+        Session session = node.getSession();
+        Node versionNode = session.getNodeByUUID(versionUUID);
+        
+        // check whether the node is a session, which it should be according
+        // to the spec (methods returning nodes should automatically return
+        // the correct type).
+        if (versionNode instanceof Version) {
+            return (Version) versionNode;
+        }
+        
+        // otherwise fail
+        throw new RepositoryException("Cannot find version " + versionUUID);
+    }
 }

Modified: incubator/jackrabbit/trunk/contrib/jcr-rmi/src/java/org/apache/jackrabbit/rmi/server/ServerObject.java
URL: http://svn.apache.org/viewcvs/incubator/jackrabbit/trunk/contrib/jcr-rmi/src/java/org/apache/jackrabbit/rmi/server/ServerObject.java?view=diff&r1=159669&r2=159670
==============================================================================
--- incubator/jackrabbit/trunk/contrib/jcr-rmi/src/java/org/apache/jackrabbit/rmi/server/ServerObject.java (original)
+++ incubator/jackrabbit/trunk/contrib/jcr-rmi/src/java/org/apache/jackrabbit/rmi/server/ServerObject.java Fri Apr  1 01:23:37 2005
@@ -46,7 +46,10 @@
 import javax.jcr.nodetype.NodeTypeIterator;
 import javax.jcr.nodetype.PropertyDef;
 import javax.jcr.query.InvalidQueryException;
+import javax.jcr.version.Version;
 import javax.jcr.version.VersionException;
+import javax.jcr.version.VersionHistory;
+import javax.jcr.version.VersionIterator;
 
 import org.apache.jackrabbit.rmi.remote.RemoteItem;
 import org.apache.jackrabbit.rmi.remote.RemoteNode;
@@ -54,6 +57,7 @@
 import org.apache.jackrabbit.rmi.remote.RemoteNodeType;
 import org.apache.jackrabbit.rmi.remote.RemoteProperty;
 import org.apache.jackrabbit.rmi.remote.RemotePropertyDef;
+import org.apache.jackrabbit.rmi.remote.RemoteVersion;
 
 /**
  * Base class for remote adapters. The purpose of this class is to
@@ -151,6 +155,9 @@
      * method introspects the type of the local item and returns the
      * corresponding node, property, or item remote reference using the
      * remote adapter factory.
+     * <p>
+     * If the <code>item</code>, this method calls the
+     * {@link #getRemoteNode(Node)} to return the correct remote type.
      *
      * @param item local node, property, or item
      * @return remote node, property, or item reference
@@ -160,13 +167,34 @@
         if (item instanceof Property) {
             return factory.getRemoteProperty((Property) item);
         } else if (item instanceof Node) {
-            return factory.getRemoteNode((Node) item);
+            return getRemoteNode((Node) item);
         } else {
             return factory.getRemoteItem(item);
         }
     }
 
     /**
+     * Utility method for creating a remote reference for a local node.
+     * Unlike the factory method for creating remote node references, this
+     * method introspects the type of the local node and returns the
+     * corresponding node, version, or version history remote reference using
+     * the remote adapter factory.
+     *
+     * @param item local node, property, or item
+     * @return remote node, property, or item reference
+     * @throws RemoteException on RMI errors
+     */
+    protected RemoteNode getRemoteNode(Node node) throws RemoteException {
+        if (node instanceof Version) {
+            return factory.getRemoteVersion((Version) node);
+        } else if (node instanceof VersionHistory) {
+            return factory.getRemoteVersionHistory((VersionHistory) node);
+        } else {
+            return factory.getRemoteNode(node);
+        }
+    }
+
+    /**
      * Utility method for creating an array of remote references for
      * local properties. The remote references are created using the
      * remote adapter factory.
@@ -206,11 +234,59 @@
         if (iterator != null) {
             RemoteNode[] remotes = new RemoteNode[(int) iterator.getSize()];
             for (int i = 0; iterator.hasNext(); i++) {
-                remotes[i] = factory.getRemoteNode(iterator.nextNode());
+                remotes[i] = getRemoteNode(iterator.nextNode());
             }
             return remotes;
         } else {
             return new RemoteNode[0]; // for safety
+        }
+    }
+
+    /**
+     * Utility method for creating an array of remote references for
+     * local versions. The remote references are created using the
+     * remote adapter factory.
+     * <p>
+     * A <code>null</code> input is treated as an empty array.
+     *
+     * @param versions local version array
+     * @return remote version array
+     * @throws RemoteException on RMI errors
+     */
+    protected RemoteVersion[] getRemoteVersionArray(Version[] versions)
+            throws RemoteException {
+        if (versions != null) {
+            RemoteVersion[] remotes = new RemoteVersion[versions.length];
+            for (int i = 0; i < remotes.length; i++) {
+                remotes[i] = factory.getRemoteVersion(versions[i]);
+            }
+            return remotes;
+        } else {
+            return new RemoteVersion[0]; // for safety
+        }
+    }
+
+    /**
+     * Utility method for creating an array of remote references for
+     * local versions. The remote references are created using the
+     * remote adapter factory.
+     * <p>
+     * A <code>null</code> input is treated as an empty iterator.
+     *
+     * @param iterator local version iterator
+     * @return remote version array
+     * @throws RemoteException on RMI errors
+     */
+    protected RemoteVersion[] getRemoteVersionArray(VersionIterator iterator)
+            throws RemoteException {
+        if (iterator != null) {
+            RemoteVersion[] remotes = new RemoteVersion[(int) iterator.getSize()];
+            for (int i = 0; iterator.hasNext(); i++) {
+                remotes[i] = factory.getRemoteVersion(iterator.nextVersion());
+            }
+            return remotes;
+        } else {
+            return new RemoteVersion[0]; // for safety
         }
     }
 

Modified: incubator/jackrabbit/trunk/contrib/jcr-rmi/src/java/org/apache/jackrabbit/rmi/server/ServerQueryResult.java
URL: http://svn.apache.org/viewcvs/incubator/jackrabbit/trunk/contrib/jcr-rmi/src/java/org/apache/jackrabbit/rmi/server/ServerQueryResult.java?view=diff&r1=159669&r2=159670
==============================================================================
--- incubator/jackrabbit/trunk/contrib/jcr-rmi/src/java/org/apache/jackrabbit/rmi/server/ServerQueryResult.java (original)
+++ incubator/jackrabbit/trunk/contrib/jcr-rmi/src/java/org/apache/jackrabbit/rmi/server/ServerQueryResult.java Fri Apr  1 01:23:37 2005
@@ -82,7 +82,7 @@
         if (iterator != null) {
             RemoteNode[] remotes = new RemoteNode[(int) iterator.getSize()];
             for (int i = 0; iterator.hasNext(); i++) {
-                remotes[i] = getFactory().getRemoteNode(iterator.nextNode());
+                remotes[i] = getRemoteNode(iterator.nextNode());
             }
             return remotes;
         } else {

Modified: incubator/jackrabbit/trunk/contrib/jcr-rmi/src/java/org/apache/jackrabbit/rmi/server/ServerSession.java
URL: http://svn.apache.org/viewcvs/incubator/jackrabbit/trunk/contrib/jcr-rmi/src/java/org/apache/jackrabbit/rmi/server/ServerSession.java?view=diff&r1=159669&r2=159670
==============================================================================
--- incubator/jackrabbit/trunk/contrib/jcr-rmi/src/java/org/apache/jackrabbit/rmi/server/ServerSession.java (original)
+++ incubator/jackrabbit/trunk/contrib/jcr-rmi/src/java/org/apache/jackrabbit/rmi/server/ServerSession.java Fri Apr  1 01:23:37 2005
@@ -145,7 +145,7 @@
     public RemoteNode getNodeByUUID(String uuid)
             throws RepositoryException, RemoteException {
         try {
-            return getFactory().getRemoteNode(session.getNodeByUUID(uuid));
+            return getRemoteNode(session.getNodeByUUID(uuid));
         } catch (RepositoryException ex) {
             throw getRepositoryException(ex);
         }
@@ -155,7 +155,7 @@
     public RemoteNode getRootNode()
             throws RepositoryException, RemoteException {
         try {
-            return getFactory().getRemoteNode(session.getRootNode());
+            return getRemoteNode(session.getRootNode());
         } catch (RepositoryException ex) {
             throw getRepositoryException(ex);
         }

Added: incubator/jackrabbit/trunk/contrib/jcr-rmi/src/java/org/apache/jackrabbit/rmi/server/ServerVersion.java
URL: http://svn.apache.org/viewcvs/incubator/jackrabbit/trunk/contrib/jcr-rmi/src/java/org/apache/jackrabbit/rmi/server/ServerVersion.java?view=auto&rev=159670
==============================================================================
--- incubator/jackrabbit/trunk/contrib/jcr-rmi/src/java/org/apache/jackrabbit/rmi/server/ServerVersion.java (added)
+++ incubator/jackrabbit/trunk/contrib/jcr-rmi/src/java/org/apache/jackrabbit/rmi/server/ServerVersion.java Fri Apr  1 01:23:37 2005
@@ -0,0 +1,91 @@
+/*
+ * Copyright 2004-2005 The Apache Software Foundation or its licensors,
+ *                     as applicable.
+ *
+ * Licensed 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.rmi.server;
+
+import java.rmi.RemoteException;
+import java.util.Calendar;
+
+import javax.jcr.RepositoryException;
+import javax.jcr.version.Version;
+
+import org.apache.jackrabbit.rmi.remote.RemoteVersion;
+
+/**
+ * Remote adapter for the JCR {@link javax.jcr.version.Version Version} interface.
+ * This class makes a local version available as an RMI service using
+ * the {@link org.apache.jackrabbit.rmi.remote.RemoteVersion RemoteVersion}
+ * interface.
+ *
+ * @author Felix Meschberger
+ * @see javax.jcr.version.Version
+ * @see org.apache.jackrabbit.rmi.remote.RemoteVersion
+ */
+public class ServerVersion extends ServerNode implements RemoteVersion {
+    
+    /** The adapted local version. */
+    private Version version;
+
+    /**
+     * Creates a remote adapter for the given local version.
+     *
+     * @param version local version
+     * @param factory remote adapter factory
+     * @throws RemoteException on RMI errors
+     */
+    public ServerVersion(Version version, RemoteAdapterFactory factory)
+            throws RemoteException {
+        super(version, factory);
+        this.version = version;
+    }
+
+//  This is only available after 0.16.2
+//    /** {@inheritDoc} */
+//    public RemoteVersionHistory getContainingHistory() throws RepositoryException {
+//        try {
+//            return getFactory().getRemoteVersionHistory(version.getContainingHistory());
+//        } catch (RepositoryException ex) {
+//            throw getRepositoryException(ex);
+//        }
+//    }
+
+    /** {@inheritDoc} */
+    public Calendar getCreated() throws RepositoryException {
+        try {
+            return version.getCreated();
+        } catch (RepositoryException ex) {
+            throw getRepositoryException(ex);
+        }
+    }
+
+    /** {@inheritDoc} */
+    public RemoteVersion[] getSuccessors() throws RepositoryException, RemoteException {
+        try {
+            return getRemoteVersionArray(version.getSuccessors());
+        } catch (RepositoryException ex) {
+            throw getRepositoryException(ex);
+        }
+    }
+
+    /** {@inheritDoc} */
+    public RemoteVersion[] getPredecessors() throws RepositoryException, RemoteException {
+        try {
+            return getRemoteVersionArray(version.getPredecessors());
+        } catch (RepositoryException ex) {
+            throw getRepositoryException(ex);
+        }
+    }
+}

Added: incubator/jackrabbit/trunk/contrib/jcr-rmi/src/java/org/apache/jackrabbit/rmi/server/ServerVersionHistory.java
URL: http://svn.apache.org/viewcvs/incubator/jackrabbit/trunk/contrib/jcr-rmi/src/java/org/apache/jackrabbit/rmi/server/ServerVersionHistory.java?view=auto&rev=159670
==============================================================================
--- incubator/jackrabbit/trunk/contrib/jcr-rmi/src/java/org/apache/jackrabbit/rmi/server/ServerVersionHistory.java (added)
+++ incubator/jackrabbit/trunk/contrib/jcr-rmi/src/java/org/apache/jackrabbit/rmi/server/ServerVersionHistory.java Fri Apr  1 01:23:37 2005
@@ -0,0 +1,176 @@
+/*
+ * Copyright 2004-2005 The Apache Software Foundation or its licensors,
+ *                     as applicable.
+ *
+ * Licensed 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.rmi.server;
+
+import java.rmi.RemoteException;
+
+import javax.jcr.Node;
+import javax.jcr.RepositoryException;
+import javax.jcr.Session;
+import javax.jcr.version.Version;
+import javax.jcr.version.VersionHistory;
+
+import org.apache.jackrabbit.rmi.remote.RemoteVersion;
+import org.apache.jackrabbit.rmi.remote.RemoteVersionHistory;
+
+/**
+ * Remote adapter for the JCR {@link javax.jcr.version.VersionHistory VersionHistory}
+ * interface. This class makes a local version history available as an RMI
+ * service using the 
+ * {@link org.apache.jackrabbit.rmi.remote.RemoteVersionHistory RemoteVersionHistory}
+ * interface.
+ *
+ * @author Felix Meschberger
+ * @see javax.jcr.version.VersionHistory
+ * @see org.apache.jackrabbit.rmi.remote.RemoteVersionHistory
+ */
+public class ServerVersionHistory extends ServerNode
+        implements RemoteVersionHistory {
+
+    /** The adapted local version history. */
+    private VersionHistory versionHistory;
+
+    /**
+     * Creates a remote adapter for the given local version history.
+     *
+     * @param versionHistory local version history
+     * @param factory remote adapter factory
+     * @throws RemoteException on RMI errors
+     */
+    public ServerVersionHistory(VersionHistory versionHistory,
+            RemoteAdapterFactory factory) throws RemoteException {
+        super(versionHistory, factory);
+        this.versionHistory = versionHistory;
+    }
+
+    /** {@inheritDoc} */
+//    public String getVersionableUUID()
+//            throws RepositoryException, RemoteException {
+//        try {
+//            return versionHistory.getVersionableUUID();
+//        } catch (RepositoryException ex) {
+//            throw getRepositoryException(ex);
+//        }
+//    }
+
+    /** {@inheritDoc} */
+    public RemoteVersion getRootVersion()
+            throws RepositoryException, RemoteException {
+        try {
+            return getFactory().getRemoteVersion(versionHistory.getRootVersion());
+        } catch (RepositoryException ex) {
+            throw getRepositoryException(ex);
+        }
+    }
+
+    /** {@inheritDoc} */
+    public RemoteVersion[] getAllVersions() 
+            throws RepositoryException, RemoteException {
+        try {
+            return getRemoteVersionArray(versionHistory.getAllVersions());
+        } catch (RepositoryException ex) {
+            throw getRepositoryException(ex);
+        }
+    }
+
+    /** {@inheritDoc} */
+    public RemoteVersion getVersion(String versionName)
+        throws RepositoryException, RemoteException {
+        try {
+            Version version = versionHistory.getVersion(versionName);
+            return getFactory().getRemoteVersion(version);
+        } catch (RepositoryException ex) {
+            throw getRepositoryException(ex);
+        }
+    }
+
+    /** {@inheritDoc} */
+    public RemoteVersion getVersionByLabel(String label)
+            throws RepositoryException, RemoteException {
+        try {
+            Version version = versionHistory.getVersionByLabel(label);
+            return getFactory().getRemoteVersion(version);
+        } catch (RepositoryException ex) {
+            throw getRepositoryException(ex);
+        }
+    }
+
+    /** {@inheritDoc} */
+    public void addVersionLabel(String versionName, String label,
+            boolean moveLabel) throws RepositoryException, RemoteException {
+        try {
+            versionHistory.addVersionLabel(versionName, label, moveLabel);
+        } catch (RepositoryException ex) {
+            throw getRepositoryException(ex);
+        }
+    }
+
+    /** {@inheritDoc} */
+    public void removeVersionLabel(String label) throws RepositoryException,
+        RemoteException {
+        try {
+            versionHistory.removeVersionLabel(label);
+        } catch (RepositoryException ex) {
+            throw getRepositoryException(ex);
+        }
+    }
+
+    /** {@inheritDoc} */
+    public boolean hasVersionLabel(String label) throws RemoteException {
+        return versionHistory.hasVersionLabel(label);
+    }
+
+    /** {@inheritDoc} */
+    public boolean hasVersionLabel(String versionUUID, String label)
+        throws RepositoryException, RemoteException {
+        try {
+            Version version = getVersionByUUID(versionUUID);
+            return versionHistory.hasVersionLabel(version, label);
+        } catch (RepositoryException ex) {
+            throw getRepositoryException(ex);
+        }
+    }
+
+    /** {@inheritDoc} */
+    public String[] getVersionLabels() throws RemoteException {
+        return versionHistory.getVersionLabels();
+    }
+
+    /** {@inheritDoc} */
+    public String[] getVersionLabels(String versionUUID)
+            throws RepositoryException, RemoteException {
+        try {
+            Version version = getVersionByUUID(versionUUID);
+            return versionHistory.getVersionLabels(version);
+        } catch (ClassCastException cce) {
+            // we do not expect this here as nodes should be returned correctly
+            throw getRepositoryException(new RepositoryException(cce));
+        } catch (RepositoryException ex) {
+            throw getRepositoryException(ex);
+        }
+    }
+
+    /** {@inheritDoc} */
+    public void removeVersion(String versionName)
+            throws RepositoryException, RemoteException {
+        try {
+            versionHistory.removeVersion(versionName);
+        } catch (RepositoryException ex) {
+            throw getRepositoryException(ex);
+        }
+    }
+}