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 2010/09/24 15:40:56 UTC
svn commit: r1000867 - in
/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core:
./ observation/
Author: jukka
Date: Fri Sep 24 13:40:55 2010
New Revision: 1000867
URL: http://svn.apache.org/viewvc?rev=1000867&view=rev
Log:
JCR-515: Enhance test data
Use the FilteredRangeIterator class to implement FilteredEventIterator so that getSize() will return a good value and we can run more tests.
Modified:
jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/SessionImpl.java
jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/observation/EventConsumer.java
jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/observation/EventFilter.java
jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/observation/EventJournalImpl.java
jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/observation/FilteredEventIterator.java
jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/observation/ObservationManagerImpl.java
Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/SessionImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/SessionImpl.java?rev=1000867&r1=1000866&r2=1000867&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/SessionImpl.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/SessionImpl.java Fri Sep 24 13:40:55 2010
@@ -281,8 +281,7 @@ public class SessionImpl extends Abstrac
try {
return new ObservationManagerImpl(
context.getRepository().getObservationDispatcher(wspName),
- this, context.getItemManager(),
- context.getRepositoryContext().getClusterNode());
+ this, context.getRepositoryContext().getClusterNode());
} catch (NoSuchWorkspaceException e) {
// should never get here
throw new RepositoryException(
Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/observation/EventConsumer.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/observation/EventConsumer.java?rev=1000867&r1=1000866&r2=1000867&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/observation/EventConsumer.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/observation/EventConsumer.java Fri Sep 24 13:40:55 2010
@@ -219,6 +219,10 @@ class EventConsumer {
void consumeEvents(EventStateCollection events) throws RepositoryException {
// Set of ItemIds of denied ItemStates
Set<ItemId> denied = accessDenied.remove(events);
+ if (denied == null) {
+ denied = new HashSet<ItemId>();
+ }
+
// check permissions
for (Iterator<EventState> it = events.iterator(); it.hasNext() && session.isLive();) {
EventState state = it.next();
@@ -227,9 +231,6 @@ class EventConsumer {
|| state.getType() == Event.PROPERTY_CHANGED) {
ItemId targetId = state.getTargetId();
if (!canRead(state)) {
- if (denied == null) {
- denied = new HashSet<ItemId>();
- }
denied.add(targetId);
}
}
@@ -239,8 +240,9 @@ class EventConsumer {
return;
}
// check if filtered iterator has at least one event
- EventIterator it = new FilteredEventIterator(events.iterator(),
- events.getTimestamp(), events.getUserData(), filter, denied);
+ EventIterator it = new FilteredEventIterator(
+ session, events.iterator(), events.getTimestamp(),
+ events.getUserData(), filter, denied);
if (it.hasNext()) {
long time = System.currentTimeMillis();
listener.onEvent(it);
Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/observation/EventFilter.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/observation/EventFilter.java?rev=1000867&r1=1000866&r2=1000867&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/observation/EventFilter.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/observation/EventFilter.java Fri Sep 24 13:40:55 2010
@@ -19,11 +19,9 @@ package org.apache.jackrabbit.core.obser
import java.util.Iterator;
import java.util.Set;
-import org.apache.jackrabbit.core.ItemManager;
import org.apache.jackrabbit.core.SessionImpl;
import org.apache.jackrabbit.core.id.NodeId;
import org.apache.jackrabbit.core.nodetype.NodeTypeImpl;
-import org.apache.jackrabbit.spi.commons.conversion.MalformedPathException;
import org.apache.jackrabbit.spi.Path;
import javax.jcr.RepositoryException;
@@ -38,11 +36,6 @@ public class EventFilter {
static final EventFilter BLOCK_ALL = new BlockAllFilter();
/**
- * The ItemManager of the session
- */
- private final ItemManager itemMgr;
-
- /**
* The session this EventFilter belongs to.
*/
private final SessionImpl session;
@@ -83,7 +76,6 @@ public class EventFilter {
/**
* Creates a new <code>EventFilter</code> instance.
*
- * @param itemMgr the <code>ItemManager</code> of the <code>session</code>.
* @param session the <code>Session</code> that registered the {@link
* javax.jcr.observation.EventListener}.
* @param eventTypes only allow specified {@link javax.jcr.observation.Event} types.
@@ -101,16 +93,13 @@ public class EventFilter {
* created from changes related to the <code>Session</code>
* that registered the {@link javax.jcr.observation.EventListener}.
*/
- EventFilter(ItemManager itemMgr,
- SessionImpl session,
+ EventFilter(SessionImpl session,
long eventTypes,
Path path,
boolean isDeep,
NodeId[] ids,
NodeTypeImpl[] nodeTypes,
boolean noLocal) {
-
- this.itemMgr = itemMgr;
this.session = session;
this.eventTypes = eventTypes;
this.path = path;
@@ -121,29 +110,6 @@ public class EventFilter {
}
/**
- * Returns the <code>Session</code> associated with this
- * <code>EventFilter</code>.
- *
- * @return the <code>Session</code> associated with this
- * <code>EventFilter</code>.
- */
- SessionImpl getSession() {
- return session;
- }
-
- /**
- * TODO: remove this unused method.
- * Returns the <code>ItemManager</code> associated with this
- * <code>EventFilter</code>.
- *
- * @return the <code>ItemManager</code> associated with this
- * <code>EventFilter</code>.
- */
- ItemManager getItemManager() {
- return itemMgr;
- }
-
- /**
* Returns <code>true</code> if this <code>EventFilter</code> does not allow
* the specified <code>EventState</code>; <code>false</code> otherwise.
*
@@ -196,18 +162,13 @@ public class EventFilter {
}
// finally check path
- try {
- Path eventPath = eventState.getParentPath();
- boolean match = eventPath.equals(path);
- if (!match && isDeep) {
- match = eventPath.isDescendantOf(path);
- }
-
- return !match;
- } catch (MalformedPathException mpe) {
- // should never get here...
- throw new RepositoryException("internal error: failed to check path filter", mpe);
+ Path eventPath = eventState.getParentPath();
+ boolean match = eventPath.equals(path);
+ if (!match && isDeep) {
+ match = eventPath.isDescendantOf(path);
}
+
+ return !match;
}
/**
@@ -220,7 +181,7 @@ public class EventFilter {
* Creates a new <code>BlockAllFilter</code>.
*/
BlockAllFilter() {
- super(null, null, 0, null, true, null, null, true);
+ super(null, 0, null, true, null, null, true);
}
/**
Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/observation/EventJournalImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/observation/EventJournalImpl.java?rev=1000867&r1=1000866&r2=1000867&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/observation/EventJournalImpl.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/observation/EventJournalImpl.java Fri Sep 24 13:40:55 2010
@@ -31,6 +31,8 @@ import javax.jcr.observation.Event;
import javax.jcr.observation.EventIterator;
import javax.jcr.observation.EventJournal;
+
+import org.apache.jackrabbit.core.SessionImpl;
import org.apache.jackrabbit.core.journal.Journal;
import org.apache.jackrabbit.core.journal.RecordIterator;
import org.apache.jackrabbit.core.journal.JournalException;
@@ -90,9 +92,9 @@ public class EventJournalImpl implements
private final String producerId;
/**
- * The name of the workspace to filter journal records.
+ * Target session.
*/
- private final String wspName;
+ private final SessionImpl session;
/**
* Buffer of {@link EventBundle}s.
@@ -110,14 +112,15 @@ public class EventJournalImpl implements
* @param filter for filtering the events read from the journal.
* @param journal the cluster journal.
* @param producerId the producer id of the cluster node.
+ * @param session target session
*/
- public EventJournalImpl(EventFilter filter,
- Journal journal,
- String producerId) {
+ public EventJournalImpl(
+ EventFilter filter, Journal journal,
+ String producerId, SessionImpl session) {
this.filter = filter;
this.journal = journal;
this.producerId = producerId;
- this.wspName = filter.getSession().getWorkspace().getName();
+ this.session = session;
}
//------------------------< EventJournal >---------------------------------
@@ -269,8 +272,8 @@ public class EventJournalImpl implements
public void process(ChangeLogRecord record) {
List<EventState> events = record.getEvents();
if (!events.isEmpty()) {
- EventBundle bundle = new EventBundle(events,
- record.getTimestamp(), record.getUserData(), filter);
+ EventBundle bundle = new EventBundle(
+ events, record.getTimestamp(), record.getUserData());
if (bundle.events.hasNext()) {
// only queue bundle if there is an event
eventBundleBuffer.add(bundle);
@@ -336,7 +339,7 @@ public class EventJournalImpl implements
Record record = records.nextRecord();
if (record.getProducerId().equals(producerId)) {
ClusterRecord cr = deserializer.deserialize(record);
- if (!wspName.equals(cr.getWorkspace())) {
+ if (!session.getWorkspace().getName().equals(cr.getWorkspace())) {
continue;
}
cr.process(processor);
@@ -383,7 +386,7 @@ public class EventJournalImpl implements
/**
* Simple class to associate an {@link EventState} iterator with a timestamp.
*/
- private static final class EventBundle {
+ private final class EventBundle {
/**
* An iterator of {@link Event}s.
@@ -403,12 +406,11 @@ public class EventJournalImpl implements
* @param userData the user data associated with this event.
* @param filter the event filter.
*/
- private EventBundle(List<EventState> eventStates,
- long timestamp,
- String userData,
- EventFilter filter) {
- this.events = new FilteredEventIterator(eventStates.iterator(),
- timestamp, userData, filter, Collections.EMPTY_SET);
+ private EventBundle(
+ List<EventState> eventStates, long timestamp, String userData) {
+ this.events = new FilteredEventIterator(
+ session, eventStates.iterator(),
+ timestamp, userData, filter, Collections.emptySet());
this.timestamp = timestamp;
}
}
Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/observation/FilteredEventIterator.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/observation/FilteredEventIterator.java?rev=1000867&r1=1000866&r2=1000867&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/observation/FilteredEventIterator.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/observation/FilteredEventIterator.java Fri Sep 24 13:40:55 2010
@@ -17,18 +17,20 @@
package org.apache.jackrabbit.core.observation;
import java.util.Iterator;
-import java.util.NoSuchElementException;
import java.util.Set;
import javax.jcr.RepositoryException;
-import javax.jcr.observation.Event;
+import org.apache.jackrabbit.commons.iterator.EventIteratorAdapter;
+import org.apache.jackrabbit.commons.iterator.FilteredRangeIterator;
+import org.apache.jackrabbit.commons.predicate.Predicate;
+import org.apache.jackrabbit.core.SessionImpl;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
*/
-class FilteredEventIterator implements javax.jcr.observation.EventIterator {
+class FilteredEventIterator extends EventIteratorAdapter {
/**
* Logger instance for this class
@@ -37,34 +39,14 @@ class FilteredEventIterator implements j
= LoggerFactory.getLogger(FilteredEventIterator.class);
/**
- * The actual {@link EventState}s fired by the workspace (unfiltered)
+ * Target session
*/
- private final Iterator actualEvents;
+ private final SessionImpl session;
/**
- * For filtering the {@link javax.jcr.observation.Event}s.
+ * The timestamp when the events occurred.
*/
- private final EventFilter filter;
-
- /**
- * Set of <code>ItemId</code>s of denied <code>ItemState</code>s.
- */
- private final Set denied;
-
- /**
- * The next {@link javax.jcr.observation.Event} in this iterator
- */
- private Event next;
-
- /**
- * Current position
- */
- private long pos;
-
- /**
- * The timestamp when the events occured.
- */
- private long timestamp;
+ private final long timestamp;
/**
* The user data associated with these events.
@@ -74,111 +56,40 @@ class FilteredEventIterator implements j
/**
* Creates a new <code>FilteredEventIterator</code>.
*
+ * @param session target session
* @param eventStates an iterator over unfiltered {@link EventState}s.
* @param timestamp the time when the event were created.
* @param userData the user data associated with these events.
* @param filter only event that pass the filter will be dispatched to the
* event listener.
* @param denied <code>Set</code> of <code>ItemId</code>s of denied <code>ItemState</code>s
- * rejected by the <code>AccessManager</code>. If
- * <code>null</code> no <code>ItemState</code> is denied.
+ * rejected by the <code>AccessManager</code>
*/
- public FilteredEventIterator(Iterator eventStates,
- long timestamp,
- String userData,
- EventFilter filter,
- Set denied) {
- this.actualEvents = eventStates;
- this.filter = filter;
- this.denied = denied;
+ public FilteredEventIterator(
+ SessionImpl session, Iterator<?> eventStates,
+ long timestamp, String userData,
+ final EventFilter filter, final Set<?> denied) {
+ super(new FilteredRangeIterator(eventStates, new Predicate() {
+ public boolean evaluate(Object object) {
+ try {
+ EventState state = (EventState) object;
+ return !denied.contains(state.getTargetId())
+ && !filter.blocks(state);
+ } catch (RepositoryException e) {
+ log.error("Exception while applying event filter", e);
+ return false;
+ }
+ }
+ }));
+ this.session = session;
this.timestamp = timestamp;
this.userData = userData;
- fetchNext();
}
- /**
- * {@inheritDoc}
- */
+ @Override
public Object next() {
- if (next == null) {
- throw new NoSuchElementException();
- }
- Event e = next;
- fetchNext();
- pos++;
- return e;
- }
-
- /**
- * {@inheritDoc}
- */
- public Event nextEvent() {
- return (Event) next();
- }
-
- /**
- * {@inheritDoc}
- */
- public void skip(long skipNum) {
- while (skipNum-- > 0) {
- next();
- }
+ return new EventImpl(
+ session, (EventState) super.next(), timestamp, userData);
}
- /**
- * Always returns <code>-1</code>.
- *
- * @return <code>-1</code>.
- */
- public long getSize() {
- return -1;
- }
-
- /**
- * {@inheritDoc}
- */
- public long getPosition() {
- return pos;
- }
-
- /**
- * This method is not supported.
- * Always throws a <code>UnsupportedOperationException</code>.
- */
- public void remove() {
- throw new UnsupportedOperationException("EventIterator.remove()");
- }
-
- /**
- * Returns <tt>true</tt> if the iteration has more elements. (In other
- * words, returns <tt>true</tt> if <tt>next</tt> would return an element
- * rather than throwing an exception.)
- *
- * @return <tt>true</tt> if the iterator has more elements.
- */
- public boolean hasNext() {
- return (next != null);
- }
-
- /**
- * Fetches the next Event from the collection of events
- * passed in the constructor of <code>FilteredEventIterator</code>
- * that is allowed by the {@link EventFilter}.
- */
- private void fetchNext() {
- EventState state;
- next = null;
- while (next == null && actualEvents.hasNext()) {
- state = (EventState) actualEvents.next();
- // check denied set
- if (denied == null || !denied.contains(state.getTargetId())) {
- try {
- next = filter.blocks(state) ? null : new EventImpl(
- filter.getSession(), state, timestamp, userData);
- } catch (RepositoryException e) {
- log.error("Exception while applying filter.", e);
- }
- }
- }
- }
}
Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/observation/ObservationManagerImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/observation/ObservationManagerImpl.java?rev=1000867&r1=1000866&r2=1000867&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/observation/ObservationManagerImpl.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/observation/ObservationManagerImpl.java Fri Sep 24 13:40:55 2010
@@ -16,7 +16,6 @@
*/
package org.apache.jackrabbit.core.observation;
-import org.apache.jackrabbit.core.ItemManager;
import org.apache.jackrabbit.core.SessionImpl;
import org.apache.jackrabbit.core.id.NodeId;
import org.apache.jackrabbit.core.cluster.ClusterNode;
@@ -55,11 +54,6 @@ public class ObservationManagerImpl impl
private final SessionImpl session;
/**
- * The <code>ItemManager</code> for this <code>ObservationManager</code>.
- */
- private final ItemManager itemMgr;
-
- /**
* The cluster node where this session is running.
*/
private final ClusterNode clusterNode;
@@ -92,20 +86,16 @@ public class ObservationManagerImpl impl
*/
public ObservationManagerImpl(
ObservationDispatcher dispatcher, SessionImpl session,
- ItemManager itemMgr, ClusterNode clusterNode) {
+ ClusterNode clusterNode) {
if (dispatcher == null) {
throw new NullPointerException("dispatcher");
}
if (session == null) {
throw new NullPointerException("session");
}
- if (itemMgr == null) {
- throw new NullPointerException("itemMgr");
- }
-
+
this.dispatcher = dispatcher;
this.session = session;
- this.itemMgr = itemMgr;
this.clusterNode = clusterNode;
}
@@ -230,8 +220,8 @@ public class ObservationManagerImpl impl
}
}
// create filter
- return new EventFilter(itemMgr, session, eventTypes, path,
- isDeep, ids, nodeTypes, noLocal);
+ return new EventFilter(
+ session, eventTypes, path, isDeep, ids, nodeTypes, noLocal);
}
/**
@@ -267,7 +257,7 @@ public class ObservationManagerImpl impl
EventFilter filter = createEventFilter(
eventTypes, absPath, isDeep, uuid, nodeTypeName, false);
return new EventJournalImpl(
- filter, clusterNode.getJournal(), clusterNode.getId());
+ filter, clusterNode.getJournal(), clusterNode.getId(), session);
}
/**