diff --git a/jackrabbit-jcr-rmi/pom.xml b/jackrabbit-jcr-rmi/pom.xml --- a/jackrabbit-jcr-rmi/pom.xml +++ b/jackrabbit-jcr-rmi/pom.xml @@ -171,9 +171,6 @@ org.apache.jackrabbit.test.api.nodetype.NodeTypeCreationTest#testResidualNames org.apache.jackrabbit.test.api.nodetype.NodeTypeCreationTest#testSetDefaultValues -org.apache.jackrabbit.test.api.observation.GetUserDataTest#testSave -org.apache.jackrabbit.test.api.observation.GetUserDataTest#testVersioning -org.apache.jackrabbit.test.api.observation.GetUserDataTest#testWorkspaceOperation org.apache.jackrabbit.test.api.observation.NodeReorderTest#testNodeReorderMove org.apache.jackrabbit.test.api.PathTest#testResolvedIdentifierBasedPropertyValue @@ -504,8 +501,6 @@ org.apache.jackrabbit.test.api.security.AccessControlListTest#testAddAccessControlEntryAgain org.apache.jackrabbit.test.api.security.AccessControlListTest#testExtendPrivileges org.apache.jackrabbit.test.api.security.RSessionAccessControlPolicyTest#testSetPolicy - -org.apache.jackrabbit.test.api.observation.EventJournalTest diff --git a/jackrabbit-jcr-rmi/src/main/java/org/apache/jackrabbit/rmi/client/ClientObservationManager.java b/jackrabbit-jcr-rmi/src/main/java/org/apache/jackrabbit/rmi/client/ClientObservationManager.java --- a/jackrabbit-jcr-rmi/src/main/java/org/apache/jackrabbit/rmi/client/ClientObservationManager.java +++ b/jackrabbit-jcr-rmi/src/main/java/org/apache/jackrabbit/rmi/client/ClientObservationManager.java @@ -19,7 +19,6 @@ import java.rmi.RemoteException; import javax.jcr.RepositoryException; -import javax.jcr.UnsupportedRepositoryOperationException; import javax.jcr.Workspace; import javax.jcr.observation.EventJournal; import javax.jcr.observation.EventListener; @@ -50,13 +49,13 @@ public class ClientObservationManager extends ClientObject implements ObservationManager { - /** The remote observation manager */ + /** The remote observation manager. */ private final RemoteObservationManager remote; /** The Workspace to which this observation manager belongs. */ private final Workspace workspace; - /** The ClientEventPoll class internally used for event dispatching */ + /** The ClientEventPoll class internally used for event dispatching. */ private ClientEventPoll poller; /** @@ -108,18 +107,37 @@ return new ArrayEventListenerIterator(listeners); } + /** {@inheritDoc} */ public EventJournal getEventJournal() throws RepositoryException { - throw new UnsupportedRepositoryOperationException("TODO: JCR-3206"); + try { + return new ClientEventJournal(remote.getEventJournal(), + getFactory()); + } catch (RemoteException ex) { + throw new RemoteRepositoryException(ex); + } } + /** {@inheritDoc} */ public EventJournal getEventJournal( int eventTypes, String absPath, boolean isDeep, String[] uuid, String[] nodeTypeName) throws RepositoryException { - throw new UnsupportedRepositoryOperationException("TODO: JCR-3206"); + try { + return new ClientEventJournal( + remote.getEventJournal( + eventTypes, absPath, isDeep, uuid, nodeTypeName), + getFactory()); + } catch (RemoteException ex) { + throw new RemoteRepositoryException(ex); + } } + /** {@inheritDoc} */ public void setUserData(String userData) throws RepositoryException { - throw new UnsupportedRepositoryOperationException("TODO: JCR-3206"); + try { + remote.setUserData(userData); + } catch (RemoteException ex) { + throw new RemoteRepositoryException(ex); + } } //---------- internal ------------------------------------------------------ diff --git a/jackrabbit-jcr-rmi/src/main/java/org/apache/jackrabbit/rmi/client/iterator/ClientIterator.java b/jackrabbit-jcr-rmi/src/main/java/org/apache/jackrabbit/rmi/client/iterator/ClientIterator.java --- a/jackrabbit-jcr-rmi/src/main/java/org/apache/jackrabbit/rmi/client/iterator/ClientIterator.java +++ b/jackrabbit-jcr-rmi/src/main/java/org/apache/jackrabbit/rmi/client/iterator/ClientIterator.java @@ -45,19 +45,19 @@ * size is unknown, or -2 if the size has not been retrieved from the * remote iterator. */ - private long size; + protected long size; /** The position of the buffer within the iteration. */ - private long positionOfBuffer; + protected long positionOfBuffer; /** The position within the buffer of the iteration. */ - private int positionInBuffer; + protected int positionInBuffer; /** * The element buffer. Set to null when the end of the * iteration has been reached. */ - private Object[] buffer; + protected Object[] buffer; /** * Creates a local adapter for the given remote iterator. The element @@ -149,7 +149,7 @@ * * @throws RemoteException on RMI errors */ - private void advance() throws RemoteException { + protected void advance() throws RemoteException { if (buffer != null && positionInBuffer == buffer.length) { positionOfBuffer += buffer.length; positionInBuffer = 0; diff --git a/jackrabbit-jcr-rmi/src/main/java/org/apache/jackrabbit/rmi/observation/ClientEventPoll.java b/jackrabbit-jcr-rmi/src/main/java/org/apache/jackrabbit/rmi/observation/ClientEventPoll.java --- a/jackrabbit-jcr-rmi/src/main/java/org/apache/jackrabbit/rmi/observation/ClientEventPoll.java +++ b/jackrabbit-jcr-rmi/src/main/java/org/apache/jackrabbit/rmi/observation/ClientEventPoll.java @@ -20,17 +20,14 @@ import java.util.HashMap; import java.util.Map; -import javax.jcr.RepositoryException; import javax.jcr.Session; -import javax.jcr.observation.Event; import javax.jcr.observation.EventIterator; import javax.jcr.observation.EventListener; -import org.apache.jackrabbit.rmi.client.RemoteRepositoryException; -import org.apache.jackrabbit.rmi.client.RemoteRuntimeException; import org.apache.jackrabbit.rmi.iterator.ArrayEventIterator; import org.apache.jackrabbit.rmi.remote.RemoteEventCollection; import org.apache.jackrabbit.rmi.remote.RemoteObservationManager; +import org.apache.jackrabbit.rmi.serializable.SerializableEvent; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -219,8 +216,8 @@ // otherwise convert the remote events into an EventIterator // and the listener is called - RemoteEventCollection.RemoteEvent[] remoteEvents = remoteEvent.getEvents(); - EventIterator events = toEvents(remoteEvents); + SerializableEvent[] serEvents = remoteEvent.getEvents(); + EventIterator events = toEvents(serEvents); try { listener.onEvent(events); } catch (Exception e) { @@ -236,109 +233,17 @@ //---------- internal ----------------------------------------------------- /** - * Converts an array of {@link RemoteEventCollection.RemoteEvent} instances to an + * Converts an array of {@link SerializableEvent} instances to an * instance of EventIterator suitable to be sent to the * event listener. * - * @param remoteEvents array of remote events + * @param events array of serializable events * @return event iterator * @throws RemoteException on RMI errors */ - private EventIterator toEvents(RemoteEventCollection.RemoteEvent[] remoteEvents) + private EventIterator toEvents(final SerializableEvent[] events) throws RemoteException { - Event[] events = new Event[remoteEvents.length]; - for (int i = 0; i < events.length; i++) { - events[i] = new JCREvent(remoteEvents[i]); - } return new ArrayEventIterator(events); } - /** - * The JCREvent class is a simple implementation of the JCR - * Event interface to be sent to the locally registered - * event listeners. - * - * @author Felix Meschberger - */ - private static class JCREvent implements Event { - - /** The adapted remote event. */ - private final RemoteEventCollection.RemoteEvent remote; - - /** - * Creates an instance of this class from the contents of the given - * remoteEvent. - * - * @param remoteEvent The {@link RemoteEventCollection.RemoteEvent} instance - * providing the data for this event. - * - * @throws RemoteException if an RMI error occurrs. - */ - private JCREvent(RemoteEventCollection.RemoteEvent remoteEvent) throws RemoteException { - remote = remoteEvent; - } - - /** {@inheritDoc} */ - public int getType() { - try { - return remote.getType(); - } catch (RemoteException ex) { - throw new RemoteRuntimeException(ex); - } - } - - /** {@inheritDoc} */ - public String getPath() throws RepositoryException { - try { - return remote.getPath(); - } catch (RemoteException ex) { - throw new RemoteRepositoryException(ex); - } - } - - /** {@inheritDoc} */ - public String getUserID() { - try { - return remote.getUserID(); - } catch (RemoteException ex) { - throw new RemoteRuntimeException(ex); - } - } - - /** {@inheritDoc} */ - public long getDate() throws RepositoryException { - try { - return remote.getDate(); - } catch (RemoteException ex) { - throw new RemoteRepositoryException(ex); - } - } - - /** {@inheritDoc} */ - public String getIdentifier() throws RepositoryException { - try { - return remote.getIdentifier(); - } catch (RemoteException ex) { - throw new RemoteRepositoryException(ex); - } - } - - /** {@inheritDoc} */ - public Map getInfo() throws RepositoryException { - try { - return remote.getInfo(); - } catch (RemoteException ex) { - throw new RemoteRepositoryException(ex); - } - } - - /** {@inheritDoc} */ - public String getUserData() throws RepositoryException { - try { - return remote.getUserData(); - } catch (RemoteException ex) { - throw new RemoteRepositoryException(ex); - } - } - } } diff --git a/jackrabbit-jcr-rmi/src/main/java/org/apache/jackrabbit/rmi/remote/RemoteEventCollection.java b/jackrabbit-jcr-rmi/src/main/java/org/apache/jackrabbit/rmi/remote/RemoteEventCollection.java --- a/jackrabbit-jcr-rmi/src/main/java/org/apache/jackrabbit/rmi/remote/RemoteEventCollection.java +++ b/jackrabbit-jcr-rmi/src/main/java/org/apache/jackrabbit/rmi/remote/RemoteEventCollection.java @@ -18,9 +18,8 @@ import java.rmi.Remote; import java.rmi.RemoteException; -import java.util.Map; -import javax.jcr.RepositoryException; +import org.apache.jackrabbit.rmi.serializable.SerializableEvent; /** * The RemoteEventCollection class serves as a container for @@ -47,83 +46,6 @@ * @return list of events * @throws RemoteException on RMI errors */ - RemoteEvent[] getEvents() throws RemoteException; - - /** - * The RemoteEvent class provides an encapsulation of single - * events in an event list sent to a registered listener. - */ - public static interface RemoteEvent extends Remote { - /** - * Remote version of the - * {@link javax.jcr.Event#getType() Event.getType()} method. - * - * @return the type of this event. - * @throws RemoteException on RMI errors - */ - int getType() throws RemoteException; - - /** - * Remote version of the - * {@link javax.jcr.Event#getPath() Event.getPath()} method. - * - * @return the absolute path associated with this event or - * null. - * @throws RepositoryException on repository errors - * @throws RemoteException on RMI errors - */ - String getPath() throws RepositoryException, RemoteException; - - /** - * Remote version of the - * {@link javax.jcr.Event#getUserID() Event.getUserID()} method. - * - * @return the user ID. - * @throws RemoteException on RMI errors - */ - String getUserID() throws RemoteException; - - /** - * Remote version of the - * {@link javax.jcr.Event#getIdentifier() Event.getIdentifier()} method. - * - * @return the identifier associated with this event or null. - * @throws RepositoryException on repository errors - * @throws RemoteException on RMI errors - */ - String getIdentifier() throws RepositoryException, RemoteException; - - /** - * Remote version of the - * {@link javax.jcr.Event#getInfo() Event.getInfo()} method. - * - * @return A Map containing parameter information for instances - * of a NODE_MOVED event. - * @throws RepositoryException on repository errors - * @throws RemoteException on RMI errors - */ - Map getInfo() throws RepositoryException, RemoteException; - - /** - * Remote version of the - * {@link javax.jcr.Event#getUserData() Event.getUserData()} method. - * - * @return The user data string. - * @throws RepositoryException on repository errors - * @throws RemoteException on RMI errors - */ - String getUserData() throws RepositoryException, RemoteException; - - /** - * Remote version of the - * {@link javax.jcr.Event#getDate() Event.getDate()} method. - * - * @return the date when the change was persisted that caused this event. - * @throws RepositoryException on repository errors - * @throws RemoteException on RMI errors - */ - long getDate() throws RepositoryException, RemoteException; - - } + SerializableEvent[] getEvents() throws RemoteException; } diff --git a/jackrabbit-jcr-rmi/src/main/java/org/apache/jackrabbit/rmi/remote/RemoteObservationManager.java b/jackrabbit-jcr-rmi/src/main/java/org/apache/jackrabbit/rmi/remote/RemoteObservationManager.java --- a/jackrabbit-jcr-rmi/src/main/java/org/apache/jackrabbit/rmi/remote/RemoteObservationManager.java +++ b/jackrabbit-jcr-rmi/src/main/java/org/apache/jackrabbit/rmi/remote/RemoteObservationManager.java @@ -101,4 +101,50 @@ */ RemoteEventCollection getNextEvent(long timeout) throws RemoteException; + + /** + * Remote version of the + * {@link javax.jcr.observation.ObservationManager.setUserData(String) + * ObservationManager.setUserData(String)} method. + * + * @param userData the user data to set + * + * @throws RepositoryException on repository errors + * @throws RemoteException on RMI errors + */ + void setUserData(String userData) + throws RepositoryException, RemoteException; + + /** + * Remote version of the {@link + * javax.jcr.observation.ObservationManager.getEventJournal() + * ObservationManager.getEventJournal(String)} method. + * + * @return The {@link RemoteEventJournal} of the current workspace. + * @throws RepositoryException on repository errors + * @throws RemoteException on RMI errors + */ + RemoteEventJournal getEventJournal() + throws RepositoryException, RemoteException; + + /** + * Remote version of the {@link + * javax.jcr.observation.ObservationManager.getEventJournal() + * ObservationManager.getEventJournal(String)} method. + * + * @param eventTypes A combination of one or more event type constants + * encoded as a bitmask. + * @param absPath an absolute path. + * @param isDeep a boolean. + * @param uuid array of identifiers. + * @param nodeTypeName array of node type names. + * + * @return The {@link RemoteEventJournal} of the current workspace. + * @throws RepositoryException on repository errors + * @throws RemoteException on RMI errors + */ + RemoteEventJournal getEventJournal(int eventTypes, String absPath, + boolean isDeep, String[] uuid, String[] nodeTypeName) + throws RepositoryException, RemoteException; + } diff --git a/jackrabbit-jcr-rmi/src/main/java/org/apache/jackrabbit/rmi/server/RemoteAdapterFactory.java b/jackrabbit-jcr-rmi/src/main/java/org/apache/jackrabbit/rmi/server/RemoteAdapterFactory.java --- a/jackrabbit-jcr-rmi/src/main/java/org/apache/jackrabbit/rmi/server/RemoteAdapterFactory.java +++ b/jackrabbit-jcr-rmi/src/main/java/org/apache/jackrabbit/rmi/server/RemoteAdapterFactory.java @@ -39,6 +39,7 @@ import javax.jcr.nodetype.NodeTypeManager; import javax.jcr.nodetype.PropertyDefinition; import javax.jcr.observation.EventIterator; +import javax.jcr.observation.EventJournal; import javax.jcr.observation.ObservationManager; import javax.jcr.query.Query; import javax.jcr.query.QueryManager; @@ -56,6 +57,7 @@ import javax.jcr.version.VersionManager; import org.apache.jackrabbit.rmi.remote.RemoteEventCollection; +import org.apache.jackrabbit.rmi.remote.RemoteEventJournal; import org.apache.jackrabbit.rmi.remote.RemoteItem; import org.apache.jackrabbit.rmi.remote.RemoteItemDefinition; import org.apache.jackrabbit.rmi.remote.RemoteIterator; @@ -485,6 +487,16 @@ final Iterator principals) throws RemoteException; /** + * Returns a remote adapter for the given local event journal. + * + * @param journal local event journal + * @return remote event journal + * @throws RemoteException on RMI errors + */ + RemoteEventJournal getRemoteEventJournal( + final EventJournal journal) throws RemoteException; + + /** * Returns the local jcr object represented by the given remote stub or * serializable object. * diff --git a/jackrabbit-jcr-rmi/src/main/java/org/apache/jackrabbit/rmi/server/ServerAdapterFactory.java b/jackrabbit-jcr-rmi/src/main/java/org/apache/jackrabbit/rmi/server/ServerAdapterFactory.java --- a/jackrabbit-jcr-rmi/src/main/java/org/apache/jackrabbit/rmi/server/ServerAdapterFactory.java +++ b/jackrabbit-jcr-rmi/src/main/java/org/apache/jackrabbit/rmi/server/ServerAdapterFactory.java @@ -43,6 +43,7 @@ import javax.jcr.nodetype.PropertyDefinition; import javax.jcr.observation.Event; import javax.jcr.observation.EventIterator; +import javax.jcr.observation.EventJournal; import javax.jcr.observation.ObservationManager; import javax.jcr.query.Query; import javax.jcr.query.QueryManager; @@ -66,6 +67,7 @@ import org.apache.jackrabbit.rmi.remote.ArrayIterator; import org.apache.jackrabbit.rmi.remote.BufferIterator; import org.apache.jackrabbit.rmi.remote.RemoteEventCollection; +import org.apache.jackrabbit.rmi.remote.RemoteEventJournal; import org.apache.jackrabbit.rmi.remote.RemoteItem; import org.apache.jackrabbit.rmi.remote.RemoteItemDefinition; import org.apache.jackrabbit.rmi.remote.RemoteIterator; @@ -94,6 +96,7 @@ import org.apache.jackrabbit.rmi.remote.security.RemoteAccessControlManager; import org.apache.jackrabbit.rmi.remote.security.RemoteAccessControlPolicy; import org.apache.jackrabbit.rmi.remote.security.RemotePrivilege; +import org.apache.jackrabbit.rmi.serializable.SerializableEvent; import org.apache.jackrabbit.rmi.server.iterator.ServerNodeIterator; import org.apache.jackrabbit.rmi.server.iterator.ServerNodeTypeIterator; import org.apache.jackrabbit.rmi.server.iterator.ServerPropertyIterator; @@ -469,21 +472,18 @@ */ public RemoteEventCollection getRemoteEvent(long listenerId, EventIterator events) throws RemoteException { - RemoteEventCollection.RemoteEvent[] remoteEvents; + SerializableEvent[] serEvents; if (events != null) { - List eventList = new ArrayList(); + List eventList = new ArrayList(); while (events.hasNext()) { Event event = events.nextEvent(); - eventList - .add(new ServerEventCollection.ServerEvent(event, this)); + eventList.add(new SerializableEvent(event)); } - remoteEvents = eventList.toArray(new RemoteEventCollection.RemoteEvent[eventList.size()]); + serEvents = eventList.toArray(new SerializableEvent[eventList.size()]); } else { - remoteEvents = new RemoteEventCollection.RemoteEvent[0]; // for - // safety + serEvents = new SerializableEvent[0]; // for safety } - - return new ServerEventCollection(listenerId, remoteEvents, this); + return new ServerEventCollection(listenerId, serEvents, this); } /** @@ -705,4 +705,16 @@ localCache.put(stub, jcrObject); } + /** {@inheritDoc} */ + public RemoteEventJournal getRemoteEventJournal(EventJournal journal) + throws RemoteException { + ServerEventJournal remote = + (ServerEventJournal) getRemoteObject(journal); + if (remote == null) { + remote = new ServerEventJournal(journal, this, bufferSize); + addToCache(journal, remote); + } + return remote; + } + } diff --git a/jackrabbit-jcr-rmi/src/main/java/org/apache/jackrabbit/rmi/server/ServerEventCollection.java b/jackrabbit-jcr-rmi/src/main/java/org/apache/jackrabbit/rmi/server/ServerEventCollection.java --- a/jackrabbit-jcr-rmi/src/main/java/org/apache/jackrabbit/rmi/server/ServerEventCollection.java +++ b/jackrabbit-jcr-rmi/src/main/java/org/apache/jackrabbit/rmi/server/ServerEventCollection.java @@ -17,12 +17,9 @@ package org.apache.jackrabbit.rmi.server; import java.rmi.RemoteException; -import java.util.Map; - -import javax.jcr.RepositoryException; -import javax.jcr.observation.Event; import org.apache.jackrabbit.rmi.remote.RemoteEventCollection; +import org.apache.jackrabbit.rmi.serializable.SerializableEvent; /** * The ServerEventCollection class implements the @@ -44,7 +41,7 @@ * The list of * {@link org.apache.jackrabbit.rmi.remote.RemoteEventCollection.RemoteEvent}. */ - private final RemoteEvent[] events; + private final SerializableEvent[] events; /** * Creates an instance of this class. @@ -56,7 +53,7 @@ * @throws RemoteException on RMI errors */ ServerEventCollection( - long listenerId, RemoteEvent[] events, RemoteAdapterFactory factory) + long listenerId, SerializableEvent[] events, RemoteAdapterFactory factory) throws RemoteException { super(factory); @@ -70,68 +67,8 @@ } /** {@inheritDoc} */ - public RemoteEvent[] getEvents() { + public SerializableEvent[] getEvents() { return events; } - /** - * Server side implementation of the {@link RemoteEvent} interface. - * - * {@inheritDoc} - */ - public static class ServerEvent extends ServerObject implements RemoteEvent { - - /** The adapted local event. */ - private Event event; - - /** - * Creates an instance of this class. - * @param type The event type. - * @param path The absolute path to the underlying item. - * @param userId The userID of the originating session. - * @param factory remote adapter factory - * @throws RemoteException on RMI errors - */ - ServerEvent(Event event, RemoteAdapterFactory factory) - throws RemoteException { - super(factory); - this.event = event; - } - - /** {@inheritDoc} */ - public String getPath() throws RepositoryException { - return event.getPath(); - } - - /** {@inheritDoc} */ - public int getType() { - return event.getType(); - } - - /** {@inheritDoc} */ - public String getUserID() { - return event.getUserID(); - } - - /** {@inheritDoc} */ - public String getIdentifier() throws RepositoryException, - RemoteException { - return event.getIdentifier(); - } - - /** {@inheritDoc} */ - public Map getInfo() throws RepositoryException, RemoteException { - return event.getInfo(); - } - - /** {@inheritDoc} */ - public String getUserData() throws RepositoryException, RemoteException { - return event.getUserData(); - } - - /** {@inheritDoc} */ - public long getDate() throws RepositoryException, RemoteException { - return event.getDate(); - } - } } diff --git a/jackrabbit-jcr-rmi/src/main/java/org/apache/jackrabbit/rmi/server/ServerObservationManager.java b/jackrabbit-jcr-rmi/src/main/java/org/apache/jackrabbit/rmi/server/ServerObservationManager.java --- a/jackrabbit-jcr-rmi/src/main/java/org/apache/jackrabbit/rmi/server/ServerObservationManager.java +++ b/jackrabbit-jcr-rmi/src/main/java/org/apache/jackrabbit/rmi/server/ServerObservationManager.java @@ -26,6 +26,7 @@ import org.apache.jackrabbit.rmi.observation.Queue; import org.apache.jackrabbit.rmi.observation.ServerEventListenerProxy; import org.apache.jackrabbit.rmi.remote.RemoteEventCollection; +import org.apache.jackrabbit.rmi.remote.RemoteEventJournal; import org.apache.jackrabbit.rmi.remote.RemoteObservationManager; /** @@ -141,6 +142,37 @@ return null; } + /** {@inheritDoc} */ + public void setUserData(String userData) throws RepositoryException, + RemoteException { + try { + observationManager.setUserData(userData); + } catch (RepositoryException ex) { + throw getRepositoryException(ex); + } + } + + /** {@inheritDoc} */ + public RemoteEventJournal getEventJournal() throws RepositoryException, + RemoteException { + try { + return getFactory().getRemoteEventJournal(observationManager.getEventJournal()); + } catch (RepositoryException ex) { + throw getRepositoryException(ex); + } + } + + /** {@inheritDoc} */ + public RemoteEventJournal getEventJournal(int eventTypes, String absPath, + boolean isDeep, String[] uuid, String[] nodeTypeName) + throws RepositoryException, RemoteException { + try { + return getFactory().getRemoteEventJournal(observationManager.getEventJournal(eventTypes, absPath, isDeep, uuid, nodeTypeName)); + } catch (RepositoryException ex) { + throw getRepositoryException(ex); + } + } + //---------- internal ------------------------------------------------------ /**