You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jackrabbit.apache.org by re...@apache.org on 2011/11/15 15:17:52 UTC
svn commit: r1202201 - in /jackrabbit/trunk:
jackrabbit-core/src/main/java/org/apache/jackrabbit/core/observation/
jackrabbit-jcr-server/
jackrabbit-jcr-server/src/main/java/org/apache/jackrabbit/webdav/jcr/observation/
jackrabbit-jcr2dav/ jackrabbit-s...
Author: reschke
Date: Tue Nov 15 14:17:52 2011
New Revision: 1202201
URL: http://svn.apache.org/viewvc?rev=1202201&view=rev
Log:
JCR-2542: spi2dav: EventFilters not respected
Add node type information to Jackrabbit events through an extension interface; serialize them in JCR server, process them in spi2dav repository service; this fixes filtering by node types.
Added:
jackrabbit/trunk/jackrabbit-spi-commons/src/main/java/org/apache/jackrabbit/spi/commons/AdditionalEventInfo.java
Modified:
jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/observation/EventImpl.java
jackrabbit/trunk/jackrabbit-jcr-server/pom.xml
jackrabbit/trunk/jackrabbit-jcr-server/src/main/java/org/apache/jackrabbit/webdav/jcr/observation/SubscriptionImpl.java
jackrabbit/trunk/jackrabbit-jcr2dav/pom.xml
jackrabbit/trunk/jackrabbit-spi2dav/pom.xml
jackrabbit/trunk/jackrabbit-spi2dav/src/main/java/org/apache/jackrabbit/spi2dav/EventImpl.java
jackrabbit/trunk/jackrabbit-spi2dav/src/main/java/org/apache/jackrabbit/spi2dav/RepositoryServiceImpl.java
Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/observation/EventImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/observation/EventImpl.java?rev=1202201&r1=1202200&r2=1202201&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/observation/EventImpl.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/observation/EventImpl.java Tue Nov 15 14:17:52 2011
@@ -18,13 +18,16 @@ package org.apache.jackrabbit.core.obser
import java.util.Map;
import java.util.HashMap;
+import java.util.Set;
import org.apache.jackrabbit.api.observation.JackrabbitEvent;
import javax.jcr.observation.Event;
import org.apache.jackrabbit.core.id.NodeId;
import org.apache.jackrabbit.core.SessionImpl;
import org.apache.jackrabbit.core.value.InternalValue;
+import org.apache.jackrabbit.spi.commons.AdditionalEventInfo;
import org.apache.jackrabbit.spi.commons.conversion.MalformedPathException;
+import org.apache.jackrabbit.spi.Name;
import org.apache.jackrabbit.spi.Path;
import org.apache.jackrabbit.spi.commons.name.PathFactoryImpl;
import org.apache.jackrabbit.spi.commons.value.ValueFormat;
@@ -37,7 +40,7 @@ import javax.jcr.RepositoryException;
* Implementation of the {@link javax.jcr.observation.Event} and
* the {@link JackrabbitEvent} interface.
*/
-public final class EventImpl implements JackrabbitEvent, Event {
+public final class EventImpl implements JackrabbitEvent, AdditionalEventInfo, Event {
/**
* Logger instance for this class
@@ -221,6 +224,22 @@ public final class EventImpl implements
}
/**
+ * @return the primary node type of the node associated with the event
+ * @see AdditionalEventInfo#getPrimaryNodeTypeName()
+ */
+ public Name getPrimaryNodeTypeName() {
+ return eventState.getNodeType();
+ }
+
+ /**
+ * @return the mixin node types of the node associated with the event
+ * @see AdditionalEventInfo#getMixinTypeNames()
+ */
+ public Set<Name> getMixinTypeNames() {
+ return eventState.getMixinNames();
+ }
+
+ /**
* Returns a String representation of this <code>Event</code>.
*
* @return a String representation of this <code>Event</code>.
Modified: jackrabbit/trunk/jackrabbit-jcr-server/pom.xml
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-jcr-server/pom.xml?rev=1202201&r1=1202200&r2=1202201&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-jcr-server/pom.xml (original)
+++ jackrabbit/trunk/jackrabbit-jcr-server/pom.xml Tue Nov 15 14:17:52 2011
@@ -95,6 +95,11 @@
</dependency>
<dependency>
<groupId>org.apache.jackrabbit</groupId>
+ <artifactId>jackrabbit-spi-commons</artifactId>
+ <version>2.4-SNAPSHOT</version>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.jackrabbit</groupId>
<artifactId>jackrabbit-jcr-commons</artifactId>
<version>2.4-SNAPSHOT</version>
</dependency>
Modified: jackrabbit/trunk/jackrabbit-jcr-server/src/main/java/org/apache/jackrabbit/webdav/jcr/observation/SubscriptionImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-jcr-server/src/main/java/org/apache/jackrabbit/webdav/jcr/observation/SubscriptionImpl.java?rev=1202201&r1=1202200&r2=1202201&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-jcr-server/src/main/java/org/apache/jackrabbit/webdav/jcr/observation/SubscriptionImpl.java (original)
+++ jackrabbit/trunk/jackrabbit-jcr-server/src/main/java/org/apache/jackrabbit/webdav/jcr/observation/SubscriptionImpl.java Tue Nov 15 14:17:52 2011
@@ -17,13 +17,15 @@
package org.apache.jackrabbit.webdav.jcr.observation;
import org.apache.jackrabbit.commons.webdav.EventUtil;
+import org.apache.jackrabbit.spi.Name;
+import org.apache.jackrabbit.spi.commons.AdditionalEventInfo;
import org.apache.jackrabbit.webdav.DavException;
import org.apache.jackrabbit.webdav.DavResourceLocator;
import org.apache.jackrabbit.webdav.DavServletResponse;
import org.apache.jackrabbit.webdav.transaction.TransactionResource;
import org.apache.jackrabbit.webdav.jcr.transaction.TransactionListener;
-import org.apache.jackrabbit.webdav.jcr.JcrDavSession;
import org.apache.jackrabbit.webdav.jcr.JcrDavException;
+import org.apache.jackrabbit.webdav.jcr.JcrDavSession;
import org.apache.jackrabbit.webdav.observation.EventBundle;
import org.apache.jackrabbit.webdav.observation.EventDiscovery;
import org.apache.jackrabbit.webdav.observation.EventType;
@@ -450,6 +452,15 @@ public class SubscriptionImpl implements
// user id
DomUtil.addChildElement(eventElem, XML_EVENTUSERID, NAMESPACE, event.getUserID());
+ if (event instanceof AdditionalEventInfo) {
+ DomUtil.addChildElement(eventElem, "primarynodetype", NAMESPACE,
+ ((AdditionalEventInfo)event).getPrimaryNodeTypeName().toString());
+ for (Name mixin : ((AdditionalEventInfo)event).getMixinTypeNames()) {
+ DomUtil.addChildElement(eventElem, "mixinnodetype", NAMESPACE,
+ mixin.toString());
+ }
+ }
+
// Additional JCR 2.0 event information
// user data
try {
Modified: jackrabbit/trunk/jackrabbit-jcr2dav/pom.xml
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-jcr2dav/pom.xml?rev=1202201&r1=1202200&r2=1202201&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-jcr2dav/pom.xml (original)
+++ jackrabbit/trunk/jackrabbit-jcr2dav/pom.xml Tue Nov 15 14:17:52 2011
@@ -81,7 +81,6 @@
<!-- JCR-2541 : event journal -->
org.apache.jackrabbit.test.api.observation.EventJournalTest
<!-- JCR-2542 : event filter -->
- org.apache.jackrabbit.test.api.observation.AddEventListenerTest#testNodeType
org.apache.jackrabbit.test.api.observation.AddEventListenerTest#testNoLocalTrue
<!-- JCR-2533 : missing impl of checkQueryStatement -->
org.apache.jackrabbit.test.api.query.CreateQueryTest#testUnknownQueryLanguage
Added: jackrabbit/trunk/jackrabbit-spi-commons/src/main/java/org/apache/jackrabbit/spi/commons/AdditionalEventInfo.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-spi-commons/src/main/java/org/apache/jackrabbit/spi/commons/AdditionalEventInfo.java?rev=1202201&view=auto
==============================================================================
--- jackrabbit/trunk/jackrabbit-spi-commons/src/main/java/org/apache/jackrabbit/spi/commons/AdditionalEventInfo.java (added)
+++ jackrabbit/trunk/jackrabbit-spi-commons/src/main/java/org/apache/jackrabbit/spi/commons/AdditionalEventInfo.java Tue Nov 15 14:17:52 2011
@@ -0,0 +1,38 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.jackrabbit.spi.commons;
+
+import java.util.Set;
+
+import org.apache.jackrabbit.spi.Event;
+import org.apache.jackrabbit.spi.Name;
+
+/**
+ * Provides additional information for an {@link Event}.
+ */
+public interface AdditionalEventInfo {
+
+ /**
+ * @return the name of the primary node type of the node associated with the event
+ */
+ public Name getPrimaryNodeTypeName();
+
+ /**
+ * @return the names of the mixin node types of the node associated with the event
+ */
+ public Set<Name> getMixinTypeNames();
+}
Modified: jackrabbit/trunk/jackrabbit-spi2dav/pom.xml
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-spi2dav/pom.xml?rev=1202201&r1=1202200&r2=1202201&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-spi2dav/pom.xml (original)
+++ jackrabbit/trunk/jackrabbit-spi2dav/pom.xml Tue Nov 15 14:17:52 2011
@@ -78,7 +78,6 @@
<!-- JCR-2541 : event journal -->
org.apache.jackrabbit.test.api.observation.EventJournalTest
<!-- JCR-2542 : event filter -->
- org.apache.jackrabbit.test.api.observation.AddEventListenerTest#testNodeType
org.apache.jackrabbit.test.api.observation.AddEventListenerTest#testNoLocalTrue
<!-- JCR-2533 : missing impl of checkQueryStatement -->
org.apache.jackrabbit.test.api.query.CreateQueryTest#testUnknownQueryLanguage
Modified: jackrabbit/trunk/jackrabbit-spi2dav/src/main/java/org/apache/jackrabbit/spi2dav/EventImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-spi2dav/src/main/java/org/apache/jackrabbit/spi2dav/EventImpl.java?rev=1202201&r1=1202200&r2=1202201&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-spi2dav/src/main/java/org/apache/jackrabbit/spi2dav/EventImpl.java (original)
+++ jackrabbit/trunk/jackrabbit-spi2dav/src/main/java/org/apache/jackrabbit/spi2dav/EventImpl.java Tue Nov 15 14:17:52 2011
@@ -24,6 +24,7 @@ import org.apache.jackrabbit.spi.NodeId;
import org.apache.jackrabbit.spi.Path;
import org.apache.jackrabbit.spi.QValue;
import org.apache.jackrabbit.spi.QValueFactory;
+import org.apache.jackrabbit.spi.commons.conversion.IllegalNameException;
import org.apache.jackrabbit.spi.commons.conversion.NamePathResolver;
import org.apache.jackrabbit.spi.commons.name.NameFactoryImpl;
import org.apache.jackrabbit.spi.commons.value.ValueFormat;
@@ -35,10 +36,14 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.w3c.dom.Element;
+import javax.jcr.NamespaceException;
import javax.jcr.PropertyType;
import javax.jcr.RepositoryException;
+
+import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
+import java.util.List;
import java.util.Map;
/**
@@ -53,10 +58,10 @@ public class EventImpl
private static final NameFactory N_FACTORY = NameFactoryImpl.getInstance();
public EventImpl(ItemId eventId, Path eventPath, NodeId parentId, int eventType,
- Element eventElement, NamePathResolver resolver, QValueFactory qvFactory) {
+ Element eventElement, NamePathResolver resolver, QValueFactory qvFactory) throws NamespaceException, IllegalNameException {
super(getSpiEventType(eventType), eventPath, eventId, parentId,
- null, // TODO not available from XML_EVENT element
- null, // TODO not available from XML_EVENT element
+ resolver.getQName(DomUtil.getChildTextTrim(eventElement, "primarynodetype", NAMESPACE)),
+ getNames(DomUtil.getChildren(eventElement, "mixinnodetype", NAMESPACE), resolver),
DomUtil.getChildTextTrim(eventElement, XML_EVENTUSERID, NAMESPACE),
DomUtil.getChildTextTrim(eventElement, XML_EVENTUSERDATA, NAMESPACE),
Long.parseLong(DomUtil.getChildTextTrim(eventElement, XML_EVENTDATE, NAMESPACE)),
@@ -115,4 +120,32 @@ public class EventImpl
}
return info;
}
-}
+
+ private static Name[] getNames(ElementIterator elements,
+ NamePathResolver resolver) {
+
+ List<Name> results = Collections.emptyList();
+
+ while (elements.hasNext()) {
+ String rawname = DomUtil.getText(elements.nextElement());
+ Name name = null;
+
+ try {
+ name = resolver.getQName(rawname);
+
+ if (results.size() == 0) {
+ results = Collections.singletonList(name);
+ } else if (results.size() == 1) {
+ results = new ArrayList<Name>(results);
+ results.add(name);
+ } else {
+ results.add(name);
+ }
+ } catch (Exception ex) {
+ log.error("Exception converting name " + rawname, ex);
+ }
+ }
+
+ return results.toArray(new Name[results.size()]);
+ }
+}
\ No newline at end of file
Modified: jackrabbit/trunk/jackrabbit-spi2dav/src/main/java/org/apache/jackrabbit/spi2dav/RepositoryServiceImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-spi2dav/src/main/java/org/apache/jackrabbit/spi2dav/RepositoryServiceImpl.java?rev=1202201&r1=1202200&r2=1202201&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-spi2dav/src/main/java/org/apache/jackrabbit/spi2dav/RepositoryServiceImpl.java (original)
+++ jackrabbit/trunk/jackrabbit-spi2dav/src/main/java/org/apache/jackrabbit/spi2dav/RepositoryServiceImpl.java Tue Nov 15 14:17:52 2011
@@ -2025,9 +2025,7 @@ public class RepositoryServiceImpl imple
for (EventFilter ef : filters) {
if (ef instanceof EventFilterImpl) {
EventFilterImpl efi = (EventFilterImpl)ef;
- if (efi.getNodeTypeNames() != null && ! efi.getNodeTypeNames().isEmpty()) {
- throw new UnsupportedRepositoryOperationException("This SPI implementation does not support filtering by node types (see issue JCR-2542)");
- }
+ // TODO: add code that verifies that the remote server can send node type information
if (efi.getNoLocal()) {
throw new UnsupportedRepositoryOperationException("This SPI implementation does not support filtering using the 'noLocal' flag (see issue JCR-2542)");
}
@@ -2150,7 +2148,7 @@ public class RepositoryServiceImpl imple
}
}
- private List<Event> buildEventList(Element bundleElement, SessionInfoImpl sessionInfo) {
+ private List<Event> buildEventList(Element bundleElement, SessionInfoImpl sessionInfo) throws IllegalNameException, NamespaceException {
List<Event> events = new ArrayList<Event>();
ElementIterator eventElementIterator = DomUtil.getChildren(bundleElement, ObservationConstants.XML_EVENT, ObservationConstants.NAMESPACE);
while (eventElementIterator.hasNext()) {