You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jackrabbit.apache.org by mr...@apache.org on 2006/12/05 13:59:40 UTC
svn commit: r482631 - in /jackrabbit/trunk/contrib/spi:
jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/
jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/observation/
jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/
spi/src/main/java/o...
Author: mreutegg
Date: Tue Dec 5 04:59:39 2006
New Revision: 482631
URL: http://svn.apache.org/viewvc?view=rev&rev=482631
Log:
Work in progress
- Add SessionInfo parameter to RepositoryService.createEventFilter()
- Move creation of event filter in ObservationManagerImpl.addEventListener() out of synchronized block
- Make sure subscription is in place before batch
- NodeTypeDefinitions are not cached in RepositoryServiceImpl
- Return empty EventBundle array if there were no events
- Decide whether an event bundle is local based on lastBatchId in SessionInfo and transactionId in EventBundle.
Modified:
jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/WorkspaceManager.java
jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/observation/ObservationManagerImpl.java
jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/WorkspaceItemStateManager.java
jackrabbit/trunk/contrib/spi/spi/src/main/java/org/apache/jackrabbit/spi/RepositoryService.java
jackrabbit/trunk/contrib/spi/spi2dav/src/main/java/org/apache/jackrabbit/spi2dav/RepositoryServiceImpl.java
jackrabbit/trunk/contrib/spi/spi2dav/src/main/java/org/apache/jackrabbit/spi2dav/SessionInfoImpl.java
Modified: jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/WorkspaceManager.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/WorkspaceManager.java?view=diff&rev=482631&r1=482630&r2=482631
==============================================================================
--- jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/WorkspaceManager.java (original)
+++ jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/WorkspaceManager.java Tue Dec 5 04:59:39 2006
@@ -294,8 +294,8 @@
public EventFilter createEventFilter(int eventTypes, Path path, boolean isDeep,
String[] uuids, QName[] nodeTypes,
boolean noLocal)
- throws UnsupportedRepositoryOperationException {
- return service.createEventFilter(eventTypes, path, isDeep, uuids, nodeTypes, noLocal);
+ throws UnsupportedRepositoryOperationException, RepositoryException {
+ return service.createEventFilter(sessionInfo, eventTypes, path, isDeep, uuids, nodeTypes, noLocal);
}
//--------------------------------------------------------------------------
/**
Modified: jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/observation/ObservationManagerImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/observation/ObservationManagerImpl.java?view=diff&rev=482631&r1=482630&r2=482631
==============================================================================
--- jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/observation/ObservationManagerImpl.java (original)
+++ jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/observation/ObservationManagerImpl.java Tue Dec 5 04:59:39 2006
@@ -127,8 +127,8 @@
}
}
+ EventFilter filter = wspManager.createEventFilter(eventTypes, path, isDeep, uuids, nodeTypeQNames, noLocal);
synchronized (subscriptions) {
- EventFilter filter = wspManager.createEventFilter(eventTypes, path, isDeep, uuids, nodeTypeQNames, noLocal);
subscriptions.put(listener, filter);
readOnlySubscriptions = null;
}
Modified: jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/WorkspaceItemStateManager.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/WorkspaceItemStateManager.java?view=diff&rev=482631&r1=482630&r2=482631
==============================================================================
--- jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/WorkspaceItemStateManager.java (original)
+++ jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/WorkspaceItemStateManager.java Tue Dec 5 04:59:39 2006
@@ -29,6 +29,7 @@
import org.slf4j.LoggerFactory;
import javax.jcr.UnsupportedRepositoryOperationException;
+import javax.jcr.RepositoryException;
import java.util.Set;
import java.util.HashSet;
import java.util.Iterator;
@@ -56,8 +57,8 @@
try {
// todo for now listen to everything
filter = wspManager.createEventFilter(Event.ALL_TYPES, Path.ROOT, true, null, null, false);
- } catch (UnsupportedRepositoryOperationException e) {
- // spi does not support observation
+ } catch (RepositoryException e) {
+ // spi does not support observation, or another error occurred.
}
this.eventFilter = (filter == null) ? Collections.EMPTY_LIST : Collections.singletonList(filter);
} else {
Modified: jackrabbit/trunk/contrib/spi/spi/src/main/java/org/apache/jackrabbit/spi/RepositoryService.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/contrib/spi/spi/src/main/java/org/apache/jackrabbit/spi/RepositoryService.java?view=diff&rev=482631&r1=482630&r2=482631
==============================================================================
--- jackrabbit/trunk/contrib/spi/spi/src/main/java/org/apache/jackrabbit/spi/RepositoryService.java (original)
+++ jackrabbit/trunk/contrib/spi/spi/src/main/java/org/apache/jackrabbit/spi/RepositoryService.java Tue Dec 5 04:59:39 2006
@@ -530,6 +530,7 @@
* the corresponding {@link javax.jcr.Repository#OPTION_OBSERVATION_SUPPORTED repository descriptor}
* does not return 'true'.
*
+ * @param sessionInfo the session info which requests an event filter.
* @param eventTypes A combination of one or more event type constants
* encoded as a bitmask.
* @param absPath An absolute path.
@@ -540,12 +541,15 @@
* @return the event filter instance with the given parameters.
* @throws UnsupportedRepositoryOperationException if this SPI implementation
* does not allow to create event filters.
+ * @throws RepositoryException if an error occurs while creating the
+ * EventFilter.
* @see javax.jcr.observation.ObservationManager#addEventListener(javax.jcr.observation.EventListener, int, String, boolean, String[], String[], boolean)
*/
- public EventFilter createEventFilter(int eventTypes, Path absPath,
- boolean isDeep, String[] uuid,
- QName[] nodeTypeName, boolean noLocal)
- throws UnsupportedRepositoryOperationException;
+ public EventFilter createEventFilter(SessionInfo sessionInfo, int eventTypes,
+ Path absPath, boolean isDeep,
+ String[] uuid, QName[] nodeTypeName,
+ boolean noLocal)
+ throws UnsupportedRepositoryOperationException, RepositoryException;
/**
* Retrieves the external events that occurred since the last call to this
Modified: jackrabbit/trunk/contrib/spi/spi2dav/src/main/java/org/apache/jackrabbit/spi2dav/RepositoryServiceImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/contrib/spi/spi2dav/src/main/java/org/apache/jackrabbit/spi2dav/RepositoryServiceImpl.java?view=diff&rev=482631&r1=482630&r2=482631
==============================================================================
--- jackrabbit/trunk/contrib/spi/spi2dav/src/main/java/org/apache/jackrabbit/spi2dav/RepositoryServiceImpl.java (original)
+++ jackrabbit/trunk/contrib/spi/spi2dav/src/main/java/org/apache/jackrabbit/spi2dav/RepositoryServiceImpl.java Tue Dec 5 04:59:39 2006
@@ -1155,20 +1155,25 @@
}
/**
- * @see RepositoryService#createEventFilter(int, org.apache.jackrabbit.name.Path, boolean, String[], org.apache.jackrabbit.name.QName[], boolean)
+ * @see RepositoryService#createEventFilter(SessionInfo, int, org.apache.jackrabbit.name.Path, boolean, String[], org.apache.jackrabbit.name.QName[], boolean)
*/
- public EventFilter createEventFilter(int eventTypes,
+ public EventFilter createEventFilter(SessionInfo sessionInfo,
+ int eventTypes,
Path absPath,
boolean isDeep,
String[] uuids,
QName[] nodeTypeNames,
boolean noLocal)
- throws UnsupportedRepositoryOperationException {
+ throws UnsupportedRepositoryOperationException, RepositoryException {
// resolve node type names
// todo what if new node types become available while event filter is still in use?
Set resolvedTypeNames = null;
if (nodeTypeNames != null) {
resolvedTypeNames = new HashSet();
+ // make sure node type definitions are available
+ if (nodeTypeDefinitions.size() == 0) {
+ getNodeTypeDefinitions(sessionInfo);
+ }
synchronized (nodeTypeDefinitions) {
for (int i = 0; i < nodeTypeNames.length; i++) {
resolveNodeType(resolvedTypeNames, nodeTypeNames[i]);
@@ -1195,7 +1200,7 @@
sessionInfoImpl.setSubscriptionId(subscriptionId);
}
- return poll(rootUri, subscriptionId, sessionInfo);
+ return poll(rootUri, subscriptionId, (SessionInfoImpl) sessionInfo);
// todo timeout is not respected
}
@@ -1260,7 +1265,7 @@
}
}
- private EventBundle[] poll(String uri, String subscriptionId, SessionInfo sessionInfo) throws RepositoryException {
+ private EventBundle[] poll(String uri, String subscriptionId, SessionInfoImpl sessionInfo) throws RepositoryException {
PollMethod method = null;
try {
method = new PollMethod(uri, subscriptionId);
@@ -1270,7 +1275,7 @@
EventDiscovery disc = method.getResponseAsEventDiscovery();
EventBundle[] events;
if (disc.isEmpty()) {
- events = new EventBundle[]{EventBundleImpl.EMPTY};
+ events = new EventBundle[0];
} else {
Element discEl = disc.toXml(domFactory);
ElementIterator it = DomUtil.getChildren(discEl,
@@ -1279,9 +1284,14 @@
List bundles = new ArrayList();
while (it.hasNext()) {
Element bundleElement = it.nextElement();
- String value = DomUtil.getAttribute(bundleElement, ObservationConstants.XML_EVENT_IS_LOCAL, NAMESPACE);
- boolean isLocal = (value != null) ? Boolean.valueOf(value).booleanValue() : false;
-
+ String value = DomUtil.getAttribute(bundleElement,
+ ObservationConstants.XML_EVENT_TRANSACTION_ID,
+ ObservationConstants.NAMESPACE);
+ // check if it matches a batch id recently submitted
+ boolean isLocal = false;
+ if (value != null && sessionInfo instanceof SessionInfoImpl) {
+ isLocal = value.equals(sessionInfo.getLastBatchId());
+ }
bundles.add(new EventBundleImpl(buildEventList(bundleElement, sessionInfo), isLocal));
}
events = (EventBundle[]) bundles.toArray(new EventBundle[bundles.size()]);
@@ -1483,7 +1493,7 @@
// refresh node type definitions map
synchronized (nodeTypeDefinitions) {
nodeTypeDefinitions.clear();
- for (Iterator defIt = ntDefs.iterator(); it.hasNext(); ) {
+ for (Iterator defIt = ntDefs.iterator(); defIt.hasNext(); ) {
QNodeTypeDefinition def = (QNodeTypeDefinition) defIt.next();
nodeTypeDefinitions.put(def.getQName(), def);
}
@@ -1589,6 +1599,9 @@
method.setRequestBody(new TransactionInfo(commit));
client.executeMethod(method);
method.checkSuccess();
+ if (sessionInfo instanceof SessionInfoImpl) {
+ ((SessionInfoImpl) sessionInfo).setLastBatchId(batchId);
+ }
} catch (IOException e) {
throw new RepositoryException(e);
} catch (DavException e) {
Modified: jackrabbit/trunk/contrib/spi/spi2dav/src/main/java/org/apache/jackrabbit/spi2dav/SessionInfoImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/contrib/spi/spi2dav/src/main/java/org/apache/jackrabbit/spi2dav/SessionInfoImpl.java?view=diff&rev=482631&r1=482630&r2=482631
==============================================================================
--- jackrabbit/trunk/contrib/spi/spi2dav/src/main/java/org/apache/jackrabbit/spi2dav/SessionInfoImpl.java (original)
+++ jackrabbit/trunk/contrib/spi/spi2dav/src/main/java/org/apache/jackrabbit/spi2dav/SessionInfoImpl.java Tue Dec 5 04:59:39 2006
@@ -38,6 +38,8 @@
private String lastEventBundleId;
+ private String lastBatchId;
+
/**
* The subscriptionId if this session info is subscribed to observation
* events.
@@ -125,5 +127,24 @@
String old = this.subscriptionId;
this.subscriptionId = subscriptionId;
return old;
+ }
+
+ /**
+ * Returns the id of the most recently submitted batch or <code>null</code>
+ * it no batch has been submitted yet.
+ *
+ * @return the batch id of the most recently submitted batch.
+ */
+ String getLastBatchId() {
+ return lastBatchId;
+ }
+
+ /**
+ * Sets the id of the most recently submitted batch.
+ *
+ * @param batchId the batch id.
+ */
+ void setLastBatchId(String batchId) {
+ this.lastBatchId = batchId;
}
}