You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by st...@apache.org on 2016/11/29 11:19:05 UTC

svn commit: r1771884 - in /sling/trunk/bundles/jcr/resource: ./ src/main/java/org/apache/sling/jcr/resource/internal/ src/main/java/org/apache/sling/jcr/resource/internal/helper/jcr/ src/test/java/org/apache/sling/jcr/resource/internal/

Author: stefanegli
Date: Tue Nov 29 11:19:04 2016
New Revision: 1771884

URL: http://svn.apache.org/viewvc?rev=1771884&view=rev
Log:
SLING-6174 : Use Jackrabbit/Oak globbing support : applying patch from Carsten

Modified:
    sling/trunk/bundles/jcr/resource/pom.xml
    sling/trunk/bundles/jcr/resource/src/main/java/org/apache/sling/jcr/resource/internal/JcrListenerBaseConfig.java
    sling/trunk/bundles/jcr/resource/src/main/java/org/apache/sling/jcr/resource/internal/JcrResourceListener.java
    sling/trunk/bundles/jcr/resource/src/main/java/org/apache/sling/jcr/resource/internal/helper/jcr/JcrProviderState.java
    sling/trunk/bundles/jcr/resource/src/main/java/org/apache/sling/jcr/resource/internal/helper/jcr/JcrProviderStateFactory.java
    sling/trunk/bundles/jcr/resource/src/main/java/org/apache/sling/jcr/resource/internal/helper/jcr/JcrResourceProvider.java
    sling/trunk/bundles/jcr/resource/src/test/java/org/apache/sling/jcr/resource/internal/JcrResourceListenerTest.java

Modified: sling/trunk/bundles/jcr/resource/pom.xml
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/jcr/resource/pom.xml?rev=1771884&r1=1771883&r2=1771884&view=diff
==============================================================================
--- sling/trunk/bundles/jcr/resource/pom.xml (original)
+++ sling/trunk/bundles/jcr/resource/pom.xml Tue Nov 29 11:19:04 2016
@@ -50,8 +50,8 @@
     <properties>
         <site.jira.version.id>12314286</site.jira.version.id>
         <site.javadoc.exclude>**.internal.**</site.javadoc.exclude>
-        <oak.version>1.3.10</oak.version>
-        <jackrabbit.version>2.11.2</jackrabbit.version>
+        <oak.version>1.5.13</oak.version>
+        <jackrabbit.version>2.13.4</jackrabbit.version>
     </properties>
 
     <build>
@@ -135,6 +135,13 @@
         </dependency>
         <dependency>
             <groupId>org.apache.jackrabbit</groupId>
+            <artifactId>oak-jcr</artifactId>
+            <version>${oak.version}</version>
+            <scope>provided</scope>
+        </dependency>
+
+        <dependency>
+            <groupId>org.apache.jackrabbit</groupId>
             <artifactId>oak-core</artifactId>
             <version>${oak.version}</version>
             <scope>test</scope>
@@ -247,12 +254,6 @@
             <version>1.4</version>
             <scope>test</scope>
         </dependency>
-        <dependency>
-            <groupId>org.apache.jackrabbit</groupId>
-            <artifactId>oak-jcr</artifactId>
-            <version>${oak.version}</version>
-            <scope>test</scope>
-        </dependency>
     </dependencies>
 </project>
 

Modified: sling/trunk/bundles/jcr/resource/src/main/java/org/apache/sling/jcr/resource/internal/JcrListenerBaseConfig.java
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/jcr/resource/src/main/java/org/apache/sling/jcr/resource/internal/JcrListenerBaseConfig.java?rev=1771884&r1=1771883&r2=1771884&view=diff
==============================================================================
--- sling/trunk/bundles/jcr/resource/src/main/java/org/apache/sling/jcr/resource/internal/JcrListenerBaseConfig.java (original)
+++ sling/trunk/bundles/jcr/resource/src/main/java/org/apache/sling/jcr/resource/internal/JcrListenerBaseConfig.java Tue Nov 29 11:19:04 2016
@@ -25,13 +25,13 @@ import java.util.Set;
 import javax.jcr.RepositoryException;
 import javax.jcr.Session;
 import javax.jcr.observation.Event;
-import javax.jcr.observation.EventIterator;
 import javax.jcr.observation.EventListener;
 import javax.jcr.observation.ObservationManager;
 
 import org.apache.jackrabbit.api.observation.JackrabbitEventFilter;
 import org.apache.jackrabbit.api.observation.JackrabbitObservationManager;
-import org.apache.sling.api.resource.ResourceUtil;
+import org.apache.jackrabbit.oak.jcr.observation.filter.FilterFactory;
+import org.apache.jackrabbit.oak.jcr.observation.filter.OakEventFilter;
 import org.apache.sling.api.resource.observation.ResourceChange.ChangeType;
 import org.apache.sling.api.resource.path.Path;
 import org.apache.sling.jcr.api.SlingRepository;
@@ -63,6 +63,7 @@ public class JcrListenerBaseConfig imple
     throws RepositoryException {
         this.pathMapper = pathMapper;
         this.reporter = reporter;
+        // The session should have read access on the whole repository
         this.session = repository.loginAdministrative(repository.getDefaultWorkspace());
     }
 
@@ -75,107 +76,47 @@ public class JcrListenerBaseConfig imple
         this.session.logout();
     }
 
-    public void register(final JcrResourceListener listener, final ObserverConfiguration config)
+    /**
+     * Register a JCR event listener
+     * @param listener The listener
+     * @param config The configuration
+     * @throws RepositoryException If registration fails.
+     */
+    public void register(final EventListener listener, final ObserverConfiguration config)
     throws RepositoryException {
         final ObservationManager mgr = this.session.getWorkspace().getObservationManager();
         if ( mgr instanceof JackrabbitObservationManager ) {
-            final JackrabbitEventFilter filter = new JackrabbitEventFilter();
-
+            final OakEventFilter filter = FilterFactory.wrap(new JackrabbitEventFilter());
             // paths
             final Set<String> paths = config.getPaths().toStringSet();
-            final String[] pathArray = new String[paths.size()];
-            int i=0;
-            // remove global prefix
-            boolean hasGlob = false;
+            int globCount = 0, pathCount = 0;
             for(final String p : paths) {
                 if ( p.startsWith(Path.GLOB_PREFIX )) {
-                    hasGlob = true;
+                    globCount++;
+                } else {
+                    pathCount++;
                 }
-                pathArray[i] = (p.startsWith(Path.GLOB_PREFIX) ? p.substring(Path.GLOB_PREFIX.length()) : p);
-                i++;
             }
-            final EventListener regListener;
-            if ( hasGlob ) {
-                // TODO we can't use glob patterns directly here
-                filter.setAbsPath("/");
-                regListener = new EventListener() {
-
-                    @Override
-                    public void onEvent(final EventIterator events) {
-                        listener.onEvent(new EventIterator() {
-
-                            Event next = seek();
-
-                            private Event seek() {
-                                while ( events.hasNext() ) {
-                                    final Event e = events.nextEvent();
-                                    String path = null;
-                                    try {
-                                        path = e.getPath();
-                                        if ( e.getType() == Event.PROPERTY_ADDED
-                                                || e.getType() == Event.PROPERTY_CHANGED
-                                                || e.getType() == Event.PROPERTY_REMOVED ) {
-                                                  path = ResourceUtil.getParent(path);
-                                        }
-                                        if ( config.getPaths().matches(path) != null ) {
-                                            return e;
-                                        }
-                                        if ( path.endsWith("/jcr:content") && config.getPaths().matches(path.substring(0, path.length() - 12)) != null ) {
-                                            return e;
-
-                                        }
-                                    } catch (RepositoryException e1) {
-                                        // ignore
-                                    }
-                                }
-                                return null;
-                            }
-
-                            @Override
-                            public void remove() {
-                                // we don't support this -> NOP
-                            }
-
-                            @Override
-                            public Object next() {
-                                return nextEvent();
-                            }
-
-                            @Override
-                            public boolean hasNext() {
-                                return next != null;
-                            }
-
-                            @Override
-                            public void skip(long skipNum) {
-                                // we don't support this -> NOP
-                            }
-
-                            @Override
-                            public long getSize() {
-                                // we don't support this -> 0
-                                return 0;
-                            }
-
-                            @Override
-                            public long getPosition() {
-                                // we don't support this -> 0
-                                return 0;
-                            }
-
-                            @Override
-                            public Event nextEvent() {
-                                final Event result = next;
-                                next = seek();
-                                return result;
-                            }
-                        });
-                    }
-                };
+            final String[] pathArray = pathCount > 0 ? new String[pathCount] : null;
+            final String[] globArray = globCount > 0 ? new String[globCount] : null;
+            pathCount = 0;
+            globCount = 0;
 
-            } else {
+            // create arrays and remove global prefix
+            for(final String p : paths) {
+                if ( p.startsWith(Path.GLOB_PREFIX )) {
+                    globArray[globCount] = p.substring(Path.GLOB_PREFIX.length());
+                    globCount++;
+                } else {
+                    pathArray[pathCount] = p;
+                    pathCount++;
+                }
+            }
+            if ( globArray != null ) {
+                filter.withIncludeGlobPaths(globArray);
+            }
+            if ( pathArray != null ) {
                 filter.setAdditionalPaths(pathArray);
-                regListener = listener;
             }
             filter.setIsDeep(true);
 
@@ -191,13 +132,24 @@ public class JcrListenerBaseConfig imple
             // types
             filter.setEventTypes(this.getTypes(config));
 
-            ((JackrabbitObservationManager)mgr).addEventListener(regListener, filter);
+            // nt:file handling
+            filter.withNodeTypeAggregate(new String[] {"nt:file"}, new String[] {"", "jcr:content"});
+
+            // anchestor removes
+            filter.withIncludeAncestorsRemove();
+
+            ((JackrabbitObservationManager)mgr).addEventListener(listener, filter);
         } else {
             throw new RepositoryException("Observation manager is not a JackrabbitObservationManager");
         }
 
     }
 
+    /**
+     * Get the event types based on the configuraiton
+     * @param c The configuration
+     * @return The event type mask
+     */
     private int getTypes(final ObserverConfiguration c) {
         int result = 0;
         for (ChangeType t : c.getChangeTypes()) {
@@ -220,18 +172,22 @@ public class JcrListenerBaseConfig imple
         return result;
     }
 
-    public void unregister(final JcrResourceListener listener) {
+    /**
+     * Unregister the listener.
+     * @param listener The listener
+     */
+    public void unregister(final EventListener listener) {
         try {
             this.session.getWorkspace().getObservationManager().removeEventListener(listener);
-        } catch (RepositoryException e) {
+        } catch (final RepositoryException e) {
             logger.warn("Unable to remove session listener: " + this, e);
         }
     }
 
-    public Logger getLogger() {
-        return this.logger;
-    }
-
+    /**
+     * The observation reporter
+     * @return The observation reporter.
+     */
     public ObservationReporter getReporter() {
         return this.reporter;
     }
@@ -239,8 +195,4 @@ public class JcrListenerBaseConfig imple
     public PathMapper getPathMapper() {
         return this.pathMapper;
     }
-
-    public Session getSession() {
-        return this.session;
-    }
 }

Modified: sling/trunk/bundles/jcr/resource/src/main/java/org/apache/sling/jcr/resource/internal/JcrResourceListener.java
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/jcr/resource/src/main/java/org/apache/sling/jcr/resource/internal/JcrResourceListener.java?rev=1771884&r1=1771883&r2=1771884&view=diff
==============================================================================
--- sling/trunk/bundles/jcr/resource/src/main/java/org/apache/sling/jcr/resource/internal/JcrResourceListener.java (original)
+++ sling/trunk/bundles/jcr/resource/src/main/java/org/apache/sling/jcr/resource/internal/JcrResourceListener.java Tue Nov 29 11:19:04 2016
@@ -30,15 +30,12 @@ import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
-import java.util.concurrent.atomic.AtomicBoolean;
 
-import javax.jcr.Node;
 import javax.jcr.RepositoryException;
 import javax.jcr.observation.Event;
 import javax.jcr.observation.EventIterator;
 import javax.jcr.observation.EventListener;
 
-import org.apache.jackrabbit.JcrConstants;
 import org.apache.jackrabbit.api.observation.JackrabbitEvent;
 import org.apache.sling.api.resource.observation.ResourceChange;
 import org.apache.sling.api.resource.observation.ResourceChange.ChangeType;
@@ -64,11 +61,24 @@ public class JcrResourceListener impleme
         this.baseConfig.register(this, config);
     }
 
+    /**
+     * Update the observation configuration.
+     *
+     * @param cfg The updated config
+     */
     public void update(final ObserverConfiguration cfg) {
         this.config = cfg;
     }
 
     /**
+     * Get the observation configuration
+     * @return The observation configuration
+     */
+    public ObserverConfiguration getConfig() {
+        return this.config;
+    }
+
+    /**
      * Dispose this listener.
      */
     @Override
@@ -86,39 +96,55 @@ public class JcrResourceListener impleme
         final Map<String, ResourceChange> changedEvents = new HashMap<String, ResourceChange>();
         final Map<String, ResourceChange> removedEvents = new HashMap<String, ResourceChange>();
 
-        AtomicBoolean refreshedSession = new AtomicBoolean(false);
         while ( events.hasNext() ) {
             final Event event = events.nextEvent();
 
+            final String identifier;
+            final String path;
             try {
-                final String eventPath = event.getPath();
-                final int type = event.getType();
+                identifier = event.getIdentifier();
+                path =  event.getPath();
+            } catch (final RepositoryException e) {
+                // event.getPath or event.getIdentifier threw an exception
+                // there is nothing we can do about it anyway
+                continue;
+            }
+
+            final String eventPath = (identifier != null && identifier.startsWith("/") ? identifier : path);
+            final int type = event.getType();
 
-                if ( type == PROPERTY_ADDED
+            if ( type == PROPERTY_ADDED && path.endsWith("/jcr:primaryType") ) {
+                final int lastSlash = path.lastIndexOf('/');
+                final String rsrcPath = path.substring(0, lastSlash);
+
+                // add is stronger than update
+                changedEvents.remove(rsrcPath);
+                addedEvents.put(rsrcPath, createResourceChange(event, rsrcPath, ChangeType.ADDED));
+            } else if ( type == PROPERTY_ADDED
                      || type == PROPERTY_REMOVED
                      || type == PROPERTY_CHANGED ) {
+                final String rsrcPath;
+                if ( identifier == null || !identifier.startsWith("/") ) {
                     final int lastSlash = eventPath.lastIndexOf('/');
-                    final String rsrcPath = stripNtFilePath(eventPath.substring(0, lastSlash), refreshedSession);
-                    if ( !addedEvents.containsKey(rsrcPath)
-                      && !removedEvents.containsKey(rsrcPath)
-                      && !changedEvents.containsKey(rsrcPath) ) {
-
-                        changedEvents.put(rsrcPath, createResourceChange(event, rsrcPath, ChangeType.CHANGED));
-                    }
+                    rsrcPath = eventPath.substring(0, lastSlash);
                 } else {
-                    if ( type == NODE_ADDED ) {
-                        // add is stronger than update
-                        changedEvents.remove(eventPath);
-                        addedEvents.put(eventPath, createResourceChange(event, eventPath, ChangeType.ADDED));
-                    } else if ( type == NODE_REMOVED) {
-                        // remove is stronger than add and change
-                        addedEvents.remove(eventPath);
-                        changedEvents.remove(eventPath);
-                        removedEvents.put(eventPath, createResourceChange(event, eventPath, ChangeType.REMOVED));
-                    }
+                    rsrcPath = eventPath;
                 }
-            } catch (final RepositoryException e) {
-                this.baseConfig.getLogger().error("Error during modification: {}", e);
+                if ( !addedEvents.containsKey(rsrcPath)
+                  && !removedEvents.containsKey(rsrcPath)
+                  && !changedEvents.containsKey(rsrcPath) ) {
+
+                    changedEvents.put(rsrcPath, createResourceChange(event, rsrcPath, ChangeType.CHANGED));
+                }
+            } else if ( type == NODE_ADDED ) {
+                // add is stronger than update
+                changedEvents.remove(eventPath);
+                addedEvents.put(eventPath, createResourceChange(event, eventPath, ChangeType.ADDED));
+            } else if ( type == NODE_REMOVED) {
+                // remove is stronger than add and change
+                addedEvents.remove(eventPath);
+                changedEvents.remove(eventPath);
+                removedEvents.put(eventPath, createResourceChange(event, eventPath, ChangeType.REMOVED));
             }
         }
 
@@ -152,31 +178,8 @@ public class JcrResourceListener impleme
         return false;
     }
 
-    private static final String JCR_CONTENT_POSTFIX = "/" + JcrConstants.JCR_CONTENT;
-
-    private String stripNtFilePath(final String path, final AtomicBoolean refreshedSession) {
-        if (!path.endsWith(JCR_CONTENT_POSTFIX)) {
-            return path;
-        }
-        try {
-            if ( refreshedSession.compareAndSet(false, true) ) {
-                baseConfig.getSession().refresh(false);
-            }
-            final Node node = baseConfig.getSession().getNode(path);
-            final Node parent = node.getParent();
-            if (parent.isNodeType(JcrConstants.NT_FILE)) {
-                return parent.getPath();
-            } else {
-                return path;
-            }
-        } catch (final RepositoryException e) {
-            return path;
-        }
-    }
-
     @Override
     public String toString() {
         return "JcrResourceListener [" + config + "]";
     }
-
 }

Modified: sling/trunk/bundles/jcr/resource/src/main/java/org/apache/sling/jcr/resource/internal/helper/jcr/JcrProviderState.java
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/jcr/resource/src/main/java/org/apache/sling/jcr/resource/internal/helper/jcr/JcrProviderState.java?rev=1771884&r1=1771883&r2=1771884&view=diff
==============================================================================
--- sling/trunk/bundles/jcr/resource/src/main/java/org/apache/sling/jcr/resource/internal/helper/jcr/JcrProviderState.java (original)
+++ sling/trunk/bundles/jcr/resource/src/main/java/org/apache/sling/jcr/resource/internal/helper/jcr/JcrProviderState.java Tue Nov 29 11:19:04 2016
@@ -23,6 +23,7 @@ import java.io.IOException;
 
 import javax.jcr.Session;
 
+import org.apache.sling.jcr.api.SlingRepository;
 import org.apache.sling.jcr.resource.internal.HelperData;
 import org.osgi.framework.BundleContext;
 import org.osgi.framework.ServiceReference;
@@ -33,7 +34,7 @@ class JcrProviderState implements Closea
 
     private final BundleContext bundleContext;
 
-    private final ServiceReference repositoryRef;
+    private final ServiceReference<SlingRepository> repositoryRef;
 
     private final boolean logout;
 
@@ -41,11 +42,15 @@ class JcrProviderState implements Closea
 
     private final HelperData helperData;
 
-    JcrProviderState(Session session, HelperData helperData, boolean logout) {
+    JcrProviderState(final Session session, final HelperData helperData, final boolean logout) {
         this(session, helperData, logout, null, null);
     }
 
-    JcrProviderState(Session session, HelperData helperData, boolean logout, BundleContext bundleContext, ServiceReference repositoryRef) {
+    JcrProviderState(final Session session,
+            final HelperData helperData,
+            final boolean logout,
+            final BundleContext bundleContext,
+            final ServiceReference<SlingRepository> repositoryRef) {
         this.session = session;
         this.bundleContext = bundleContext;
         this.repositoryRef = repositoryRef;

Modified: sling/trunk/bundles/jcr/resource/src/main/java/org/apache/sling/jcr/resource/internal/helper/jcr/JcrProviderStateFactory.java
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/jcr/resource/src/main/java/org/apache/sling/jcr/resource/internal/helper/jcr/JcrProviderStateFactory.java?rev=1771884&r1=1771883&r2=1771884&view=diff
==============================================================================
--- sling/trunk/bundles/jcr/resource/src/main/java/org/apache/sling/jcr/resource/internal/helper/jcr/JcrProviderStateFactory.java (original)
+++ sling/trunk/bundles/jcr/resource/src/main/java/org/apache/sling/jcr/resource/internal/helper/jcr/JcrProviderStateFactory.java Tue Nov 29 11:19:04 2016
@@ -50,7 +50,7 @@ public class JcrProviderStateFactory {
 
     private final Logger logger = LoggerFactory.getLogger(JcrProviderStateFactory.class);
 
-    private final ServiceReference repositoryReference;
+    private final ServiceReference<SlingRepository> repositoryReference;
 
     private final SlingRepository repository;
 
@@ -58,7 +58,7 @@ public class JcrProviderStateFactory {
 
     private final PathMapper pathMapper;
 
-    public JcrProviderStateFactory(final ServiceReference repositoryReference,
+    public JcrProviderStateFactory(final ServiceReference<SlingRepository> repositoryReference,
             final SlingRepository repository,
             final AtomicReference<DynamicClassLoaderManager> dynamicClassLoaderManagerReference,
             final PathMapper pathMapper) {
@@ -67,8 +67,8 @@ public class JcrProviderStateFactory {
         this.dynamicClassLoaderManagerReference = dynamicClassLoaderManagerReference;
         this.pathMapper = pathMapper;
     }
-    
-    /** Get the calling Bundle from auth info, fail if not provided 
+
+    /** Get the calling Bundle from auth info, fail if not provided
      *  @throws LoginException if no calling bundle info provided
      */
     @CheckForNull
@@ -98,7 +98,7 @@ public class JcrProviderStateFactory {
             final Bundle bundle = extractCallingBundle(authenticationInfo);
             if (bundle != null) {
                 bc = bundle.getBundleContext();
-                final SlingRepository repo = (SlingRepository) bc.getService(repositoryReference);
+                final SlingRepository repo = bc.getService(repositoryReference);
                 if (repo == null) {
                     logger.warn("Cannot login {} because cannot get SlingRepository on behalf of bundle {} ({})",
                             isLoginAdministrative ? "admin" : "service",

Modified: sling/trunk/bundles/jcr/resource/src/main/java/org/apache/sling/jcr/resource/internal/helper/jcr/JcrResourceProvider.java
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/jcr/resource/src/main/java/org/apache/sling/jcr/resource/internal/helper/jcr/JcrResourceProvider.java?rev=1771884&r1=1771883&r2=1771884&view=diff
==============================================================================
--- sling/trunk/bundles/jcr/resource/src/main/java/org/apache/sling/jcr/resource/internal/helper/jcr/JcrResourceProvider.java (original)
+++ sling/trunk/bundles/jcr/resource/src/main/java/org/apache/sling/jcr/resource/internal/helper/jcr/JcrResourceProvider.java Tue Nov 29 11:19:04 2016
@@ -60,6 +60,7 @@ import org.apache.sling.spi.resource.pro
 import org.apache.sling.spi.resource.provider.ResolveContext;
 import org.apache.sling.spi.resource.provider.ResourceContext;
 import org.apache.sling.spi.resource.provider.ResourceProvider;
+import org.osgi.framework.Constants;
 import org.osgi.framework.ServiceReference;
 import org.osgi.service.component.ComponentContext;
 import org.osgi.service.component.annotations.Activate;
@@ -80,7 +81,8 @@ import org.slf4j.LoggerFactory;
                    ResourceProvider.PROPERTY_ADAPTABLE + ":Boolean=true",
                    ResourceProvider.PROPERTY_ATTRIBUTABLE + ":Boolean=true",
                    ResourceProvider.PROPERTY_REFRESHABLE + ":Boolean=true",
-                   ResourceProvider.PROPERTY_AUTHENTICATE + "=" + ResourceProvider.AUTHENTICATE_REQUIRED
+                   ResourceProvider.PROPERTY_AUTHENTICATE + "=" + ResourceProvider.AUTHENTICATE_REQUIRED,
+                   Constants.SERVICE_VENDOR + "=The Apache Software Foundation"
            })
 public class JcrResourceProvider extends ResourceProvider<JcrProviderState> {
 
@@ -111,7 +113,7 @@ public class JcrResourceProvider extends
     private volatile JcrListenerBaseConfig listenerConfig;
 
     /** The JCR observation listeners. */
-    private volatile Map<ObserverConfiguration, Closeable> listeners = new HashMap<>();
+    private final Map<ObserverConfiguration, Closeable> listeners = new HashMap<>();
 
     private volatile SlingRepository repository;
 
@@ -190,11 +192,13 @@ public class JcrResourceProvider extends
      */
     private void registerListeners() {
         if ( this.repository != null ) {
+            logger.debug("Registering resource listeners...");
             try {
                 this.listenerConfig = new JcrListenerBaseConfig(this.getProviderContext().getObservationReporter(),
                     this.pathMapper,
                     this.repository);
                 for(final ObserverConfiguration config : this.getProviderContext().getObservationReporter().getObserverConfigurations()) {
+                    logger.debug("Registering listener for {}", config.getPaths());
                     final Closeable listener = new JcrResourceListener(this.listenerConfig,
                             config);
                     this.listeners.put(config, listener);
@@ -202,6 +206,7 @@ public class JcrResourceProvider extends
             } catch (final RepositoryException e) {
                 throw new SlingException("Can't create the JCR event listener.", e);
             }
+            logger.debug("Registered resource listeners");
         }
     }
 
@@ -209,8 +214,10 @@ public class JcrResourceProvider extends
      * Unregister all observation listeners.
      */
     private void unregisterListeners() {
+        logger.debug("Unregistering resource listeners...");
         for(final Closeable c : this.listeners.values()) {
             try {
+                logger.debug("Removing listener for {}", ((JcrResourceListener)c).getConfig().getPaths());
                 c.close();
             } catch (final IOException e) {
                 // ignore this as the method above does not throw it
@@ -225,6 +232,7 @@ public class JcrResourceProvider extends
             }
             this.listenerConfig = null;
         }
+        logger.debug("Unregistered resource listeners");
     }
 
     /**
@@ -235,6 +243,7 @@ public class JcrResourceProvider extends
             this.unregisterListeners();
             this.registerListeners();
         } else {
+            logger.debug("Updating resource listeners...");
             final Map<ObserverConfiguration, Closeable> oldMap = new HashMap<>(this.listeners);
             this.listeners.clear();
             try {
@@ -242,8 +251,10 @@ public class JcrResourceProvider extends
                     // check if such a listener already exists
                     Closeable listener = oldMap.remove(config);
                     if ( listener == null ) {
+                        logger.debug("Registering listener for {}", config.getPaths());
                         listener = new JcrResourceListener(this.listenerConfig, config);
                     } else {
+                        logger.debug("Updating listener for {}", config.getPaths());
                         ((JcrResourceListener)listener).update(config);
                     }
                     this.listeners.put(config, listener);
@@ -253,11 +264,13 @@ public class JcrResourceProvider extends
             }
             for(final Closeable c : oldMap.values()) {
                 try {
+                    logger.debug("Removing listener for {}", ((JcrResourceListener)c).getConfig().getPaths());
                     c.close();
                 } catch (final IOException e) {
                     // ignore this as the method above does not throw it
                 }
             }
+            logger.debug("Updated resource listeners");
         }
     }
 

Modified: sling/trunk/bundles/jcr/resource/src/test/java/org/apache/sling/jcr/resource/internal/JcrResourceListenerTest.java
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/jcr/resource/src/test/java/org/apache/sling/jcr/resource/internal/JcrResourceListenerTest.java?rev=1771884&r1=1771883&r2=1771884&view=diff
==============================================================================
--- sling/trunk/bundles/jcr/resource/src/test/java/org/apache/sling/jcr/resource/internal/JcrResourceListenerTest.java (original)
+++ sling/trunk/bundles/jcr/resource/src/test/java/org/apache/sling/jcr/resource/internal/JcrResourceListenerTest.java Tue Nov 29 11:19:04 2016
@@ -160,7 +160,7 @@ public class JcrResourceListenerTest {
         };
         this.config.unregister(this.listener);
         this.listener = null;
-        final Session session = this.config.getSession();
+        final Session session = this.adminSession;
         if ( !session.nodeExists("/libs") ) {
             createNode(session, "/libs");
         }