Author: mduerig
Date: Wed Mar 12 11:38:06 2014
New Revision: 1576700

URL: http://svn.apache.org/r1576700
Log:
OAK-1497: JackrabbitEvent#isExternal() returns true for internal changes for 
slow listeners
Make length of revision queue configurable

Modified:
    
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/Oak.java
    
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/osgi/ObserverTracker.java
    
jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/Jcr.java
    
jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/observation/ChangeProcessor.java
    
jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/observation/ObservationManagerImpl.java
    
jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/osgi/OsgiRepository.java
    
jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/osgi/RepositoryManager.java
    
jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/repository/RepositoryImpl.java
    
jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/session/SessionContext.java

Modified: 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/Oak.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/Oak.java?rev=1576700&r1=1576699&r2=1576700&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/Oak.java 
(original)
+++ 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/Oak.java 
Wed Mar 12 11:38:06 2014
@@ -21,6 +21,7 @@ import static com.google.common.collect.
 
 import java.io.IOException;
 import java.util.ArrayList;
+import java.util.Collections;
 import java.util.List;
 import java.util.Map;
 import java.util.concurrent.Executor;
@@ -56,7 +57,6 @@ import org.apache.jackrabbit.oak.plugins
 import org.apache.jackrabbit.oak.plugins.index.IndexEditorProvider;
 import org.apache.jackrabbit.oak.plugins.index.IndexUpdateProvider;
 import org.apache.jackrabbit.oak.plugins.memory.MemoryNodeStore;
-import org.apache.jackrabbit.oak.spi.commit.BackgroundObserver;
 import org.apache.jackrabbit.oak.spi.commit.CommitHook;
 import org.apache.jackrabbit.oak.spi.commit.CommitInfo;
 import org.apache.jackrabbit.oak.spi.commit.CompositeEditorProvider;
@@ -221,10 +221,7 @@ public class Oak {
                     }
                 }
             } else if (type == Observer.class && store instanceof Observable) {
-                BackgroundObserver backgroundObserver =
-                        new BackgroundObserver((Observer) service, executor);
-                observerSubscription.register(backgroundObserver);
-                observerSubscription.register(((Observable) 
store).addObserver(backgroundObserver));
+                observerSubscription.register(((Observable) 
store).addObserver((Observer) service));
             }
 
             ObjectName objectName = null;
@@ -475,6 +472,8 @@ public class Oak {
     }
 
     public ContentRepository createContentRepository() {
+        whiteboard.register(Executor.class, executor, Collections.emptyMap());
+
         IndexEditorProvider indexEditors = 
CompositeIndexEditorProvider.compose(indexEditorProviders);
         OakInitializer.initialize(store, new 
CompositeInitializer(initializers), indexEditors);
 

Modified: 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/osgi/ObserverTracker.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/osgi/ObserverTracker.java?rev=1576700&r1=1576699&r2=1576700&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/osgi/ObserverTracker.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/osgi/ObserverTracker.java
 Wed Mar 12 11:38:06 2014
@@ -29,12 +29,8 @@ import java.util.Map;
 import javax.annotation.Nonnull;
 
 import com.google.common.io.Closeables;
-import com.google.common.io.Closer;
-
-import org.apache.jackrabbit.oak.spi.commit.BackgroundObserver;
 import org.apache.jackrabbit.oak.spi.commit.Observable;
 import org.apache.jackrabbit.oak.spi.commit.Observer;
-import org.apache.jackrabbit.oak.spi.whiteboard.WhiteboardExecutor;
 import org.osgi.framework.BundleContext;
 import org.osgi.framework.ServiceReference;
 import org.osgi.util.tracker.ServiceTracker;
@@ -42,7 +38,6 @@ import org.osgi.util.tracker.ServiceTrac
 
 public class ObserverTracker implements ServiceTrackerCustomizer {
     private final Map<ServiceReference, Closeable> subscriptions = 
newHashMap();
-    private final WhiteboardExecutor executor = new WhiteboardExecutor();
     private final Observable observable;
 
     private BundleContext bundleContext;
@@ -55,7 +50,6 @@ public class ObserverTracker implements 
     public void start(@Nonnull BundleContext bundleContext) {
         checkState(this.bundleContext == null);
         this.bundleContext = checkNotNull(bundleContext);
-        executor.start(new OsgiWhiteboard(bundleContext));
         observerTracker = new ServiceTracker(bundleContext, 
Observer.class.getName(), this);
         observerTracker.open();
     }
@@ -63,7 +57,6 @@ public class ObserverTracker implements 
     public void stop() {
         checkState(this.bundleContext != null);
         observerTracker.close();
-        executor.stop();
     }
 
     //------------------------< ServiceTrackerCustomizer 
>----------------------
@@ -71,14 +64,8 @@ public class ObserverTracker implements 
     @Override
     public Object addingService(ServiceReference reference) {
         Object service = bundleContext.getService(reference);
-
         if (service instanceof Observer) {
-            Closer subscription = Closer.create();
-            BackgroundObserver observer = subscription.register(
-                    new BackgroundObserver((Observer) service, executor));
-            subscription.register(
-                    observable.addObserver(observer));
-            subscriptions.put(reference, subscription);
+            subscriptions.put(reference, observable.addObserver((Observer) 
service));
             return service;
         } else {
             bundleContext.ungetService(reference);

Modified: 
jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/Jcr.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/Jcr.java?rev=1576700&r1=1576699&r2=1576700&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/Jcr.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/Jcr.java
 Wed Mar 12 11:38:06 2014
@@ -54,10 +54,12 @@ import org.apache.jackrabbit.oak.spi.sec
 import org.apache.jackrabbit.oak.spi.state.NodeStore;
 
 public class Jcr {
+    private static final int DEFAULT_OBSERVATION_QUEUE_LENGTH = 1000;
 
     private final Oak oak;
 
     private SecurityProvider securityProvider;
+    private int observationQueueLength = DEFAULT_OBSERVATION_QUEUE_LENGTH;
 
     public Jcr(Oak oak) {
         this.oak = oak;
@@ -160,16 +162,24 @@ public class Jcr {
         return this;
     }
 
+    @Nonnull
     public Jcr withAsyncIndexing() {
         oak.withAsyncIndexing();
         return this;
     }
 
+    @Nonnull
+    public Jcr withObservationQueueLength(int observationQueueLength) {
+        this.observationQueueLength = observationQueueLength;
+        return this;
+    }
+
     public Repository createRepository() {
         return new RepositoryImpl(
                 oak.createContentRepository(), 
                 oak.getWhiteboard(),
-                securityProvider);
+                securityProvider,
+                observationQueueLength);
     }
 
 }

Modified: 
jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/observation/ChangeProcessor.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/observation/ChangeProcessor.java?rev=1576700&r1=1576699&r2=1576700&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/observation/ChangeProcessor.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/observation/ChangeProcessor.java
 Wed Mar 12 11:38:06 2014
@@ -21,6 +21,8 @@ package org.apache.jackrabbit.oak.jcr.ob
 import static com.google.common.base.Preconditions.checkState;
 import static 
org.apache.jackrabbit.api.stats.RepositoryStatistics.Type.OBSERVATION_EVENT_COUNTER;
 import static 
org.apache.jackrabbit.api.stats.RepositoryStatistics.Type.OBSERVATION_EVENT_DURATION;
+import static 
org.apache.jackrabbit.oak.spi.whiteboard.WhiteboardUtils.registerMBean;
+import static 
org.apache.jackrabbit.oak.spi.whiteboard.WhiteboardUtils.registerObserver;
 
 import java.util.Iterator;
 import java.util.concurrent.TimeUnit;
@@ -43,13 +45,15 @@ import org.apache.jackrabbit.oak.plugins
 import org.apache.jackrabbit.oak.plugins.observation.filter.EventFilter;
 import org.apache.jackrabbit.oak.plugins.observation.filter.FilterProvider;
 import org.apache.jackrabbit.oak.plugins.observation.filter.Filters;
+import org.apache.jackrabbit.oak.spi.commit.BackgroundObserver;
 import org.apache.jackrabbit.oak.spi.commit.CommitInfo;
 import org.apache.jackrabbit.oak.spi.commit.Observer;
 import 
org.apache.jackrabbit.oak.spi.security.authorization.permission.PermissionProvider;
 import org.apache.jackrabbit.oak.spi.state.NodeState;
+import org.apache.jackrabbit.oak.spi.whiteboard.CompositeRegistration;
 import org.apache.jackrabbit.oak.spi.whiteboard.Registration;
 import org.apache.jackrabbit.oak.spi.whiteboard.Whiteboard;
-import org.apache.jackrabbit.oak.spi.whiteboard.WhiteboardUtils;
+import org.apache.jackrabbit.oak.spi.whiteboard.WhiteboardExecutor;
 import org.apache.jackrabbit.oak.stats.StatisticManager;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -73,9 +77,9 @@ class ChangeProcessor implements Observe
     private final AtomicReference<FilterProvider> filterProvider;
     private final AtomicLong eventCount;
     private final AtomicLong eventDuration;
+    private final int queueLength;
 
-    private Registration observerSubscription;
-    private Registration mBeanSubscription;
+    private CompositeRegistration registration;
     private NodeState previousRoot;
 
     public ChangeProcessor(
@@ -84,7 +88,8 @@ class ChangeProcessor implements Observe
             PermissionProvider permissionProvider,
             ListenerTracker tracker,
             FilterProvider filter,
-            StatisticManager statisticManager) {
+            StatisticManager statisticManager,
+            int queueLength) {
         this.contentSession = contentSession;
         this.namePathMapper = namePathMapper;
         this.permissionProvider = permissionProvider;
@@ -93,6 +98,7 @@ class ChangeProcessor implements Observe
         filterProvider = new AtomicReference<FilterProvider>(filter);
         this.eventCount = 
statisticManager.getCounter(OBSERVATION_EVENT_COUNTER);
         this.eventDuration = 
statisticManager.getCounter(OBSERVATION_EVENT_DURATION);
+        this.queueLength = queueLength;
     }
 
     /**
@@ -110,10 +116,19 @@ class ChangeProcessor implements Observe
      * @throws IllegalStateException if started already
      */
     public synchronized void start(Whiteboard whiteboard) {
-        checkState(observerSubscription == null, "Change processor started 
already");
-        observerSubscription = WhiteboardUtils.registerObserver(whiteboard, 
this);
-        mBeanSubscription = WhiteboardUtils.registerMBean(whiteboard, 
EventListenerMBean.class,
-                tracker.getListenerMBean(), "EventListener", 
tracker.toString());
+        checkState(registration == null, "Change processor started already");
+        final WhiteboardExecutor executor = new WhiteboardExecutor();
+        executor.start(whiteboard);
+        registration = new CompositeRegistration(
+            registerObserver(whiteboard, new BackgroundObserver(this, 
executor, queueLength)),
+            registerMBean(whiteboard, EventListenerMBean.class,
+                    tracker.getListenerMBean(), "EventListener", 
tracker.toString()),
+            new Registration() {
+        @Override
+        public void unregister() {
+            executor.stop();
+        }
+    });
     }
 
     private final Monitor runningMonitor = new Monitor();
@@ -133,11 +148,10 @@ class ChangeProcessor implements Observe
      * @throws IllegalStateException if not yet started or stopped already
      */
     public synchronized boolean stopAndWait(int timeOut, TimeUnit unit) {
-        checkState(observerSubscription != null, "Change processor not 
started");
+        checkState(registration != null, "Change processor not started");
         running.stop();
         if (runningMonitor.enter(timeOut, unit)) {
-            mBeanSubscription.unregister();
-            observerSubscription.unregister();
+            registration.unregister();
             runningMonitor.leave();
             return true;
         } else {
@@ -152,10 +166,9 @@ class ChangeProcessor implements Observe
      * complete.
      */
     public synchronized void stop() {
-        checkState(observerSubscription != null, "Change processor not 
started");
+        checkState(registration != null, "Change processor not started");
         running.stop();
-        mBeanSubscription.unregister();
-        observerSubscription.unregister();
+        registration.unregister();
         runningMonitor.leave();
     }
 

Modified: 
jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/observation/ObservationManagerImpl.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/observation/ObservationManagerImpl.java?rev=1576700&r1=1576699&r2=1576700&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/observation/ObservationManagerImpl.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/observation/ObservationManagerImpl.java
 Wed Mar 12 11:38:06 2014
@@ -76,6 +76,7 @@ public class ObservationManagerImpl impl
     private final NamePathMapper namePathMapper;
     private final Whiteboard whiteboard;
     private final StatisticManager statisticManager;
+    private final int queueLength;
 
     /**
      * Create a new instance based on a {@link ContentSession} that needs to 
implement
@@ -89,15 +90,16 @@ public class ObservationManagerImpl impl
      */
     public ObservationManagerImpl(
             SessionContext sessionContext, ReadOnlyNodeTypeManager 
nodeTypeManager,
-            PermissionProvider permissionProvider,
-            Whiteboard whiteboard) {
+            PermissionProvider permissionProvider, Whiteboard whiteboard,
+            int queueLength) {
 
         this.sessionDelegate = sessionContext.getSessionDelegate();
         this.ntMgr = nodeTypeManager;
         this.permissionProvider = permissionProvider;
         this.namePathMapper = sessionContext;
         this.whiteboard = whiteboard;
-        statisticManager = sessionContext.getStatisticManager();
+        this.statisticManager = sessionContext.getStatisticManager();
+        this.queueLength = queueLength;
     }
 
     public void dispose() {
@@ -120,7 +122,7 @@ public class ObservationManagerImpl impl
             LOG.debug(OBSERVATION,
                     "Registering event listener {} with filter {}", listener, 
filterProvider);
             processor = new 
ChangeProcessor(sessionDelegate.getContentSession(), namePathMapper,
-                    permissionProvider, tracker, filterProvider, 
statisticManager);
+                    permissionProvider, tracker, filterProvider, 
statisticManager, queueLength);
             processors.put(listener, processor);
             processor.start(whiteboard);
         } else {

Modified: 
jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/osgi/OsgiRepository.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/osgi/OsgiRepository.java?rev=1576700&r1=1576699&r2=1576700&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/osgi/OsgiRepository.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/osgi/OsgiRepository.java
 Wed Mar 12 11:38:06 2014
@@ -35,8 +35,9 @@ public class OsgiRepository extends Repo
 
     public OsgiRepository(ContentRepository repository,
                           Whiteboard whiteboard,
-                          SecurityProvider securityProvider) {
-        super(repository, whiteboard, securityProvider);
+                          SecurityProvider securityProvider,
+                          int observationQueueLength) {
+        super(repository, whiteboard, securityProvider, 
observationQueueLength);
     }
 
     @Override

Modified: 
jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/osgi/RepositoryManager.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/osgi/RepositoryManager.java?rev=1576700&r1=1576699&r2=1576700&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/osgi/RepositoryManager.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/osgi/RepositoryManager.java
 Wed Mar 12 11:38:06 2014
@@ -18,6 +18,7 @@
  */
 package org.apache.jackrabbit.oak.jcr.osgi;
 
+import java.util.Map;
 import java.util.Properties;
 
 import javax.jcr.Repository;
@@ -26,9 +27,11 @@ import org.apache.felix.scr.annotations.
 import org.apache.felix.scr.annotations.Component;
 import org.apache.felix.scr.annotations.ConfigurationPolicy;
 import org.apache.felix.scr.annotations.Deactivate;
+import org.apache.felix.scr.annotations.Property;
 import org.apache.felix.scr.annotations.Reference;
 import org.apache.jackrabbit.oak.Oak;
 import org.apache.jackrabbit.oak.api.ContentRepository;
+import org.apache.jackrabbit.oak.commons.PropertiesUtil;
 import org.apache.jackrabbit.oak.osgi.OsgiWhiteboard;
 import org.apache.jackrabbit.oak.plugins.commit.JcrConflictHandler;
 import org.apache.jackrabbit.oak.plugins.nodetype.write.InitialContent;
@@ -50,6 +53,7 @@ import org.osgi.framework.ServiceRegistr
  */
 @Component(policy = ConfigurationPolicy.REQUIRE)
 public class RepositoryManager {
+    private static final int DEFAULT_OBSERVATION_QUEUE_LENGTH = 1000;
 
     private final WhiteboardEditorProvider editorProvider =
             new WhiteboardEditorProvider();
@@ -66,14 +70,25 @@ public class RepositoryManager {
 
     private ServiceRegistration registration;
 
+    private int observationQueueLength;
+
     @Reference
     private SecurityProvider securityProvider;
 
     @Reference
     private NodeStore store;
 
+    @Property(
+            intValue = DEFAULT_OBSERVATION_QUEUE_LENGTH,
+            name = "Observation queue length",
+            description = "Maximum number of pending revisions in a 
observation listener queue")
+    private static final String OBSERVATION_QUEUE_LENGTH = 
"oak.observation-queue-length";
+
     @Activate
-    public void activate(BundleContext bundleContext) {
+    public void activate(BundleContext bundleContext, Map<String, ?> config) 
throws Exception {
+        observationQueueLength = PropertiesUtil.toInteger(prop(
+                config, bundleContext, OBSERVATION_QUEUE_LENGTH), 
DEFAULT_OBSERVATION_QUEUE_LENGTH);
+
         whiteboard = new OsgiWhiteboard(bundleContext);
         editorProvider.start(whiteboard);
         indexEditorProvider.start(whiteboard);
@@ -82,6 +97,18 @@ public class RepositoryManager {
         registration = registerRepository(bundleContext);
     }
 
+    private static Object prop(Map<String, ?> config, BundleContext 
bundleContext, String name) {
+        //Prefer framework property first
+        Object value = bundleContext.getProperty(name);
+        if (value != null) {
+            return value;
+        }
+
+        //Fallback to one from config
+        return config.get(name);
+    }
+
+
     @Deactivate
     public void deactivate() {
         if (registration != null) {
@@ -109,7 +136,7 @@ public class RepositoryManager {
 
         return bundleContext.registerService(
                 Repository.class.getName(),
-                new OsgiRepository(cr, whiteboard, securityProvider),
+                new OsgiRepository(cr, whiteboard, securityProvider, 
observationQueueLength),
                 new Properties());
     }
 }

Modified: 
jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/repository/RepositoryImpl.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/repository/RepositoryImpl.java?rev=1576700&r1=1576699&r2=1576700&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/repository/RepositoryImpl.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/repository/RepositoryImpl.java
 Wed Mar 12 11:38:06 2014
@@ -83,6 +83,7 @@ public class RepositoryImpl implements J
     private final ContentRepository contentRepository;
     protected final Whiteboard whiteboard;
     private final SecurityProvider securityProvider;
+    private final int observationQueueLength;
 
     private final Clock clock;
 
@@ -105,10 +106,12 @@ public class RepositoryImpl implements J
 
     public RepositoryImpl(@Nonnull ContentRepository contentRepository,
                           @Nonnull Whiteboard whiteboard,
-                          @Nonnull SecurityProvider securityProvider) {
+                          @Nonnull SecurityProvider securityProvider,
+                          int observationQueueLength) {
         this.contentRepository = checkNotNull(contentRepository);
         this.whiteboard = checkNotNull(whiteboard);
         this.securityProvider = checkNotNull(securityProvider);
+        this.observationQueueLength = observationQueueLength;
         this.descriptors = determineDescriptors();
         this.statisticManager = new StatisticManager(whiteboard, 
scheduledExecutor);
         this.clock = new Clock.Fast(scheduledExecutor);
@@ -238,7 +241,8 @@ public class RepositoryImpl implements J
             ContentSession contentSession = 
contentRepository.login(credentials, workspaceName);
             SessionDelegate sessionDelegate = 
createSessionDelegate(refreshStrategy, contentSession);
             SessionContext context = createSessionContext(
-                    statisticManager, securityProvider, 
createAttributes(refreshInterval), sessionDelegate);
+                    statisticManager, securityProvider, 
createAttributes(refreshInterval),
+                    sessionDelegate, observationQueueLength);
             return context.getSession();
         } catch (LoginException e) {
             throw new javax.jcr.LoginException(e.getMessage(), e);
@@ -294,8 +298,9 @@ public class RepositoryImpl implements J
      */
     protected SessionContext createSessionContext(
             StatisticManager statisticManager, SecurityProvider 
securityProvider,
-            Map<String, Object> attributes, SessionDelegate delegate) {
-        return new SessionContext(this, statisticManager, securityProvider, 
whiteboard, attributes, delegate);
+            Map<String, Object> attributes, SessionDelegate delegate, int 
observationQueueLength) {
+        return new SessionContext(this, statisticManager, securityProvider, 
whiteboard, attributes,
+                delegate, observationQueueLength);
     }
 
     /**

Modified: 
jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/session/SessionContext.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/session/SessionContext.java?rev=1576700&r1=1576699&r2=1576700&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/session/SessionContext.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/session/SessionContext.java
 Wed Mar 12 11:38:06 2014
@@ -87,6 +87,7 @@ public class SessionContext implements N
     private final Whiteboard whiteboard;
     private final Map<String, Object> attributes;
     private final SessionDelegate delegate;
+    private final int observationQueueLength;
 
     private final SessionNamespaces namespaces;
     private final NamePathMapper namePathMapper;
@@ -112,13 +113,15 @@ public class SessionContext implements N
     public SessionContext(
             @Nonnull Repository repository, @Nonnull StatisticManager 
statisticManager,
             @Nonnull SecurityProvider securityProvider, @Nonnull Whiteboard 
whiteboard,
-            @Nonnull Map<String, Object> attributes, @Nonnull final 
SessionDelegate delegate) {
+            @Nonnull Map<String, Object> attributes, @Nonnull final 
SessionDelegate delegate,
+            int observationQueueLength) {
         this.repository = checkNotNull(repository);
         this.statisticManager = statisticManager;
         this.securityProvider = checkNotNull(securityProvider);
         this.whiteboard = checkNotNull(whiteboard);
         this.attributes = checkNotNull(attributes);
         this.delegate = checkNotNull(delegate);
+        this.observationQueueLength = observationQueueLength;
         SessionStats sessionStats = delegate.getSessionStats();
         sessionStats.setAttributes(attributes);
 
@@ -264,8 +267,7 @@ public class SessionContext implements N
             observationManager = new ObservationManagerImpl(
                 this,
                 ReadOnlyNodeTypeManager.getInstance(delegate.getRoot(), 
namePathMapper),
-                getPermissionProvider(),
-                whiteboard);
+                getPermissionProvider(), whiteboard, observationQueueLength);
         }
         return observationManager;
     }


Reply via email to