Author: jukka
Date: Wed Dec 11 17:28:20 2013
New Revision: 1550196

URL: http://svn.apache.org/r1550196
Log:
OAK-867: Oak whiteboard

Add service tracker functionality to the whiteboard and generalize the 
AbstractServiceTracker to work also in non-OSGi envionments
Drop the RepositoryInitializer tracking, as it's quite complex, doesn't work, 
and (thus) is currently not used

Added:
    
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/whiteboard/AbstractServiceTracker.java
    
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/whiteboard/Tracker.java
      - copied, changed from r1550185, 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/whiteboard/Whiteboard.java
Removed:
    
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/osgi/AbstractServiceTracker.java
    
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/osgi/OsgiRepositoryInitializer.java
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/Activator.java
    
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/osgi/OsgiAuthorizableActionProvider.java
    
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/osgi/OsgiEditorProvider.java
    
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/osgi/OsgiIndexEditorProvider.java
    
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/osgi/OsgiIndexProvider.java
    
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/osgi/OsgiRestrictionProvider.java
    
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/osgi/OsgiSecurityProvider.java
    
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/osgi/OsgiWhiteboard.java
    
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/nodetype/write/InitialContent.java
    
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/whiteboard/DefaultWhiteboard.java
    
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/whiteboard/Whiteboard.java
    
jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/osgi/Activator.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=1550196&r1=1550195&r2=1550196&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 Dec 11 17:28:20 2013
@@ -44,6 +44,7 @@ import javax.security.auth.login.LoginEx
 import com.google.common.base.Function;
 import com.google.common.collect.Iterables;
 import com.google.common.io.Closer;
+
 import org.apache.jackrabbit.mk.api.MicroKernel;
 import org.apache.jackrabbit.mk.core.MicroKernelImpl;
 import org.apache.jackrabbit.oak.api.ContentRepository;
@@ -77,6 +78,7 @@ import org.apache.jackrabbit.oak.spi.sec
 import org.apache.jackrabbit.oak.spi.state.NodeBuilder;
 import org.apache.jackrabbit.oak.spi.state.NodeState;
 import org.apache.jackrabbit.oak.spi.state.NodeStore;
+import org.apache.jackrabbit.oak.spi.whiteboard.DefaultWhiteboard;
 import org.apache.jackrabbit.oak.spi.whiteboard.Registration;
 import org.apache.jackrabbit.oak.spi.whiteboard.Whiteboard;
 import org.apache.jackrabbit.oak.spi.whiteboard.WhiteboardUtils;
@@ -191,10 +193,13 @@ public class Oak {
         return getValue(properties, name, type, null);
     }
 
-    private Whiteboard whiteboard = new Whiteboard() {
+    private Whiteboard whiteboard = new DefaultWhiteboard() {
         @Override
         public <T> Registration register(
                 Class<T> type, T service, Map<?, ?> properties) {
+            final Registration registration =
+                    super.register(type, service, properties);
+
             final Closer observerSubscription = Closer.create();
             Future<?> future = null;
             if (scheduledExecutor != null && type == Runnable.class) {
@@ -257,6 +262,8 @@ public class Oak {
                     } catch (IOException e) {
                         LOG.warn("Unexpected IOException while unsubscribing 
observer", e);
                     }
+
+                    registration.unregister();
                 }
             };
         }

Modified: 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/osgi/Activator.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/osgi/Activator.java?rev=1550196&r1=1550195&r2=1550196&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/osgi/Activator.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/osgi/Activator.java
 Wed Dec 11 17:28:20 2013
@@ -24,11 +24,7 @@ import java.util.Properties;
 
 import org.apache.jackrabbit.mk.api.MicroKernel;
 import org.apache.jackrabbit.oak.api.jmx.CacheStatsMBean;
-import org.apache.jackrabbit.oak.core.ContentRepositoryImpl;
 import org.apache.jackrabbit.oak.kernel.KernelNodeStore;
-import 
org.apache.jackrabbit.oak.osgi.OsgiRepositoryInitializer.RepositoryInitializerObserver;
-import org.apache.jackrabbit.oak.spi.lifecycle.OakInitializer;
-import org.apache.jackrabbit.oak.spi.lifecycle.RepositoryInitializer;
 import org.apache.jackrabbit.oak.spi.state.NodeStore;
 import org.apache.jackrabbit.oak.spi.whiteboard.Registration;
 import org.apache.jackrabbit.oak.spi.whiteboard.Whiteboard;
@@ -41,7 +37,7 @@ import org.osgi.util.tracker.ServiceTrac
 
 import static 
org.apache.jackrabbit.oak.spi.whiteboard.WhiteboardUtils.registerMBean;
 
-public class Activator implements BundleActivator, ServiceTrackerCustomizer, 
RepositoryInitializerObserver {
+public class Activator implements BundleActivator, ServiceTrackerCustomizer {
 
     private BundleContext context;
 
@@ -55,8 +51,6 @@ public class Activator implements Bundle
 
     private final OsgiEditorProvider validatorProvider = new 
OsgiEditorProvider();
 
-    private final OsgiRepositoryInitializer repositoryInitializerTracker = new 
OsgiRepositoryInitializer();
-
     private final Map<ServiceReference, ServiceRegistration> services = new 
HashMap<ServiceReference, ServiceRegistration>();
 
     private final List<Registration> registrations = new 
ArrayList<Registration>();
@@ -71,11 +65,9 @@ public class Activator implements Bundle
         context = bundleContext;
         whiteboard = new OsgiWhiteboard(bundleContext);
 
-        indexProvider.start(bundleContext);
-        indexEditorProvider.start(bundleContext);
-        validatorProvider.start(bundleContext);
-        repositoryInitializerTracker.setObserver(this);
-        repositoryInitializerTracker.start(bundleContext);
+        indexProvider.start(whiteboard);
+        indexEditorProvider.start(whiteboard);
+        validatorProvider.start(whiteboard);
 
         microKernelTracker = new ServiceTracker(context, 
MicroKernel.class.getName(), this);
         microKernelTracker.open();
@@ -87,7 +79,6 @@ public class Activator implements Bundle
         indexProvider.stop();
         indexEditorProvider.stop();
         validatorProvider.stop();
-        repositoryInitializerTracker.stop();
 
         for(Registration r : registrations){
             r.unregister();
@@ -123,18 +114,4 @@ public class Activator implements Bundle
         context.ungetService(reference);
     }
 
-    //----------------------------------------< RepositoryInitializerObserver 
>---
-
-    @Override
-    public void newRepositoryInitializer(RepositoryInitializer ri) {
-        List<ServiceReference> mkRefs = new 
ArrayList<ServiceReference>(services.keySet());
-        for (ServiceReference ref : mkRefs) {
-            Object service = context.getService(ref);
-            if (service instanceof ContentRepositoryImpl) {
-                ContentRepositoryImpl repository = (ContentRepositoryImpl) 
service;
-                OakInitializer.initialize(repository.getNodeStore(), ri,
-                        indexEditorProvider);
-            }
-        }
-    }
 }

Modified: 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/osgi/OsgiAuthorizableActionProvider.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/osgi/OsgiAuthorizableActionProvider.java?rev=1550196&r1=1550195&r2=1550196&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/osgi/OsgiAuthorizableActionProvider.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/osgi/OsgiAuthorizableActionProvider.java
 Wed Dec 11 17:28:20 2013
@@ -17,17 +17,21 @@
 package org.apache.jackrabbit.oak.osgi;
 
 import java.util.List;
+
 import javax.annotation.Nonnull;
 
 import org.apache.jackrabbit.oak.spi.security.SecurityProvider;
 import org.apache.jackrabbit.oak.spi.security.user.action.AuthorizableAction;
 import 
org.apache.jackrabbit.oak.spi.security.user.action.AuthorizableActionProvider;
 import 
org.apache.jackrabbit.oak.spi.security.user.action.CompositeActionProvider;
+import org.apache.jackrabbit.oak.spi.whiteboard.AbstractServiceTracker;
 
 /**
  * OsgiAuthorizableActionProvider... TODO
  */
-public class OsgiAuthorizableActionProvider extends 
AbstractServiceTracker<AuthorizableActionProvider> implements 
AuthorizableActionProvider {
+public class OsgiAuthorizableActionProvider
+        extends AbstractServiceTracker<AuthorizableActionProvider>
+        implements AuthorizableActionProvider {
 
     public OsgiAuthorizableActionProvider() {
         super(AuthorizableActionProvider.class);

Modified: 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/osgi/OsgiEditorProvider.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/osgi/OsgiEditorProvider.java?rev=1550196&r1=1550195&r2=1550196&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/osgi/OsgiEditorProvider.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/osgi/OsgiEditorProvider.java
 Wed Dec 11 17:28:20 2013
@@ -26,6 +26,7 @@ import org.apache.jackrabbit.oak.spi.com
 import org.apache.jackrabbit.oak.spi.commit.EditorProvider;
 import org.apache.jackrabbit.oak.spi.state.NodeBuilder;
 import org.apache.jackrabbit.oak.spi.state.NodeState;
+import org.apache.jackrabbit.oak.spi.whiteboard.AbstractServiceTracker;
 
 /**
  * This editor provider combines all editors of all available OSGi editor

Modified: 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/osgi/OsgiIndexEditorProvider.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/osgi/OsgiIndexEditorProvider.java?rev=1550196&r1=1550195&r2=1550196&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/osgi/OsgiIndexEditorProvider.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/osgi/OsgiIndexEditorProvider.java
 Wed Dec 11 17:28:20 2013
@@ -24,13 +24,15 @@ import org.apache.jackrabbit.oak.plugins
 import org.apache.jackrabbit.oak.spi.commit.Editor;
 import org.apache.jackrabbit.oak.spi.state.NodeBuilder;
 import org.apache.jackrabbit.oak.spi.state.NodeState;
+import org.apache.jackrabbit.oak.spi.whiteboard.AbstractServiceTracker;
 
 /**
  * This IndexEditor provider combines all index editors of all available OSGi
  * IndexEditor providers.
  */
-public class OsgiIndexEditorProvider extends
-        AbstractServiceTracker<IndexEditorProvider> implements 
IndexEditorProvider {
+public class OsgiIndexEditorProvider
+        extends AbstractServiceTracker<IndexEditorProvider>
+        implements IndexEditorProvider {
 
     public OsgiIndexEditorProvider() {
         super(IndexEditorProvider.class);

Modified: 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/osgi/OsgiIndexProvider.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/osgi/OsgiIndexProvider.java?rev=1550196&r1=1550195&r2=1550196&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/osgi/OsgiIndexProvider.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/osgi/OsgiIndexProvider.java
 Wed Dec 11 17:28:20 2013
@@ -26,6 +26,7 @@ import org.apache.jackrabbit.oak.spi.que
 import org.apache.jackrabbit.oak.spi.query.QueryIndex;
 import org.apache.jackrabbit.oak.spi.query.QueryIndexProvider;
 import org.apache.jackrabbit.oak.spi.state.NodeState;
+import org.apache.jackrabbit.oak.spi.whiteboard.AbstractServiceTracker;
 
 /**
  * This index provider combines all indexes of all available OSGi index

Modified: 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/osgi/OsgiRestrictionProvider.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/osgi/OsgiRestrictionProvider.java?rev=1550196&r1=1550195&r2=1550196&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/osgi/OsgiRestrictionProvider.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/osgi/OsgiRestrictionProvider.java
 Wed Dec 11 17:28:20 2013
@@ -17,6 +17,7 @@
 package org.apache.jackrabbit.oak.osgi;
 
 import java.util.Set;
+
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
 import javax.jcr.RepositoryException;
@@ -29,12 +30,15 @@ import org.apache.jackrabbit.oak.spi.sec
 import 
org.apache.jackrabbit.oak.spi.security.authorization.restriction.RestrictionDefinition;
 import 
org.apache.jackrabbit.oak.spi.security.authorization.restriction.RestrictionPattern;
 import 
org.apache.jackrabbit.oak.spi.security.authorization.restriction.RestrictionProvider;
+import org.apache.jackrabbit.oak.spi.whiteboard.AbstractServiceTracker;
 
 /**
  * {@link RestrictionProvider} implementation that combines all available OSGi
  * restriction providers.
  */
-public class OsgiRestrictionProvider  extends 
AbstractServiceTracker<RestrictionProvider> implements RestrictionProvider {
+public class OsgiRestrictionProvider
+        extends AbstractServiceTracker<RestrictionProvider>
+        implements RestrictionProvider {
 
     public OsgiRestrictionProvider() {
         super(RestrictionProvider.class);

Modified: 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/osgi/OsgiSecurityProvider.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/osgi/OsgiSecurityProvider.java?rev=1550196&r1=1550195&r2=1550196&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/osgi/OsgiSecurityProvider.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/osgi/OsgiSecurityProvider.java
 Wed Dec 11 17:28:20 2013
@@ -19,10 +19,12 @@ package org.apache.jackrabbit.oak.osgi;
 import java.util.HashSet;
 import java.util.Map;
 import java.util.Set;
+
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
 
 import com.google.common.collect.ImmutableMap;
+
 import org.apache.felix.scr.annotations.Activate;
 import org.apache.felix.scr.annotations.Component;
 import org.apache.felix.scr.annotations.Deactivate;
@@ -45,7 +47,7 @@ import org.apache.jackrabbit.oak.spi.sec
 import org.apache.jackrabbit.oak.spi.security.user.AuthorizableNodeName;
 import org.apache.jackrabbit.oak.spi.security.user.UserConfiguration;
 import org.apache.jackrabbit.oak.spi.security.user.UserConstants;
-import org.osgi.framework.BundleContext;
+import org.apache.jackrabbit.oak.spi.whiteboard.Whiteboard;
 import org.osgi.framework.ServiceReference;
 import org.osgi.service.component.ComponentContext;
 
@@ -159,10 +161,9 @@ public class OsgiSecurityProvider implem
 //----------------------------------------------------< SCR Integration >---
     @Activate
     protected void activate(ComponentContext context) throws Exception {
-        BundleContext bundleContext = context.getBundleContext();
-
-        authorizableActionProvider.start(bundleContext);
-        restrictionProvider.start(bundleContext);
+        Whiteboard whiteboard = new OsgiWhiteboard(context.getBundleContext());
+        authorizableActionProvider.start(whiteboard);
+        restrictionProvider.start(whiteboard);
     }
 
     @Deactivate

Modified: 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/osgi/OsgiWhiteboard.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/osgi/OsgiWhiteboard.java?rev=1550196&r1=1550195&r2=1550196&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/osgi/OsgiWhiteboard.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/osgi/OsgiWhiteboard.java
 Wed Dec 11 17:28:20 2013
@@ -16,18 +16,23 @@
  */
 package org.apache.jackrabbit.oak.osgi;
 
+import static com.google.common.base.Preconditions.checkArgument;
 import static com.google.common.base.Preconditions.checkNotNull;
+import static java.util.Arrays.asList;
 
 import java.util.Dictionary;
 import java.util.Hashtable;
+import java.util.List;
 import java.util.Map;
 
 import javax.annotation.Nonnull;
 
 import org.apache.jackrabbit.oak.spi.whiteboard.Registration;
+import org.apache.jackrabbit.oak.spi.whiteboard.Tracker;
 import org.apache.jackrabbit.oak.spi.whiteboard.Whiteboard;
 import org.osgi.framework.BundleContext;
 import org.osgi.framework.ServiceRegistration;
+import org.osgi.util.tracker.ServiceTracker;
 
 /**
  * OSGi-based whiteboard implementation.
@@ -43,6 +48,11 @@ public class OsgiWhiteboard implements W
     @Override
     public <T> Registration register(
             Class<T> type, T service, Map<?, ?> properties) {
+        checkNotNull(type);
+        checkNotNull(service);
+        checkNotNull(properties);
+        checkArgument(type.isInstance(service));
+
         Dictionary<Object, Object> dictionary = new Hashtable<Object, 
Object>();
         for (Map.Entry<?, ?> entry : properties.entrySet()) {
             dictionary.put(entry.getKey(), entry.getValue());
@@ -58,4 +68,22 @@ public class OsgiWhiteboard implements W
         };
     }
 
+    @Override
+    public <T> Tracker<T> track(Class<T> type) {
+        checkNotNull(type);
+        final ServiceTracker tracker =
+                new ServiceTracker(context, type.getName(), null);
+        tracker.open();
+        return new Tracker<T>() {
+            @Override @SuppressWarnings("unchecked")
+            public List<T> getServices() {
+                return (List<T>) asList(tracker.getServices());
+            }
+            @Override
+            public void stop() {
+                tracker.close();
+            }
+        };
+    }
+
 }

Modified: 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/nodetype/write/InitialContent.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/nodetype/write/InitialContent.java?rev=1550196&r1=1550195&r2=1550196&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/nodetype/write/InitialContent.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/nodetype/write/InitialContent.java
 Wed Dec 11 17:28:20 2013
@@ -45,8 +45,6 @@ import org.apache.jackrabbit.oak.spi.sta
  * {@code InitialContent} implements a {@link RepositoryInitializer} and
  * registers built-in node types when the micro kernel becomes available.
  */
-@Component
-@Service(RepositoryInitializer.class)
 public class InitialContent implements RepositoryInitializer, 
NodeTypeConstants {
 
     public static final NodeState INITIAL_CONTENT = createInitialContent();

Added: 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/whiteboard/AbstractServiceTracker.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/whiteboard/AbstractServiceTracker.java?rev=1550196&view=auto
==============================================================================
--- 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/whiteboard/AbstractServiceTracker.java
 (added)
+++ 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/whiteboard/AbstractServiceTracker.java
 Wed Dec 11 17:28:20 2013
@@ -0,0 +1,64 @@
+/*
+ * 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.oak.spi.whiteboard;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+import static com.google.common.base.Preconditions.checkState;
+
+import java.util.List;
+
+import javax.annotation.Nonnull;
+
+/**
+ * {@code AbstractServiceTracker} is a base class for composite components
+ * that dynamically look up the available component services from the
+ * whiteboard.
+ */
+public abstract class AbstractServiceTracker<T> {
+
+    private final Class<T> type;
+
+    private Tracker<T> tracker = null;
+
+    public AbstractServiceTracker(@Nonnull Class<T> type) {
+        this.type = checkNotNull(type);
+    }
+
+    public synchronized void start(Whiteboard whiteboard) {
+        checkState(tracker == null);
+        tracker = whiteboard.track(type);
+    }
+
+    public synchronized void stop() {
+        checkState(tracker != null);
+        tracker.stop();
+        tracker = null;
+    }
+
+    /**
+     * Returns all services of type {@code T} currently available.
+     *
+     * @return services currently available.
+     */
+    protected synchronized List<T> getServices() {
+        checkState(tracker != null);
+        return tracker.getServices();
+    }
+
+}

Modified: 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/whiteboard/DefaultWhiteboard.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/whiteboard/DefaultWhiteboard.java?rev=1550196&r1=1550195&r2=1550196&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/whiteboard/DefaultWhiteboard.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/whiteboard/DefaultWhiteboard.java
 Wed Dec 11 17:28:20 2013
@@ -16,30 +16,76 @@
  */
 package org.apache.jackrabbit.oak.spi.whiteboard;
 
+import static com.google.common.base.Preconditions.checkArgument;
+import static com.google.common.base.Preconditions.checkNotNull;
+import static com.google.common.collect.Lists.newArrayList;
+import static com.google.common.collect.Maps.newHashMap;
+import static com.google.common.collect.Sets.newIdentityHashSet;
+import static java.util.Collections.emptyList;
+
+import java.util.List;
 import java.util.Map;
+import java.util.Set;
 
 public class DefaultWhiteboard implements Whiteboard {
 
+    private final Map<Class<?>, Set<Object>> registry = newHashMap();
+
+    private synchronized <T> void registered(Class<T> type, T service) {
+        Set<Object> services = registry.get(type);
+        if (services == null) {
+            services = newIdentityHashSet();
+            registry.put(type, services);
+        }
+        services.add(service);
+    }
+
+    private synchronized <T> void unregistered(Class<T> type, T service) {
+        Set<Object> services = registry.get(type);
+        if (services != null) {
+            services.remove(service);
+        }
+    }
+
+    @SuppressWarnings("unchecked")
+    private synchronized <T> List<T> lookup(Class<T> type) {
+        Set<Object> services = registry.get(type);
+        if (services != null) {
+            return (List<T>) newArrayList(services);
+        } else {
+            return emptyList();
+        }
+    }
+
+    //--------------------------------------------------------< Whiteboard >--
+
     @Override
     public <T> Registration register(
-            final Class<T> type, final T service, final Map<?, ?> properties) {
-        registered(type, service, properties);
+            final Class<T> type, final T service, Map<?, ?> properties) {
+        checkNotNull(type);
+        checkNotNull(service);
+        checkArgument(type.isInstance(service));
+        registered(type, service);
         return new Registration() {
             @Override
             public void unregister() {
-                unregistered(type, service, properties);
+                unregistered(type, service);
             }
         };
     }
 
-    //---------------------------------------------------------< protected >--
-
-    protected void registered(
-            Class<?> type, Object service, Map<?, ?> properties) {
-    }
-
-    protected void unregistered(
-            Class<?> type, Object service, Map<?, ?> properties) {
+    @Override
+    public <T> Tracker<T> track(final Class<T> type) {
+        checkNotNull(type);
+        return new Tracker<T>() {
+            @Override
+            public List<T> getServices() {
+                return lookup(type);
+            }
+            @Override
+            public void stop() {
+            }
+        };
     }
 
 }

Copied: 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/whiteboard/Tracker.java
 (from r1550185, 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/whiteboard/Whiteboard.java)
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/whiteboard/Tracker.java?p2=jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/whiteboard/Tracker.java&p1=jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/whiteboard/Whiteboard.java&r1=1550185&r2=1550196&rev=1550196&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/whiteboard/Whiteboard.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/whiteboard/Tracker.java
 Wed Dec 11 17:28:20 2013
@@ -16,19 +16,23 @@
  */
 package org.apache.jackrabbit.oak.spi.whiteboard;
 
-import java.util.Map;
+import java.util.List;
 
-public interface Whiteboard {
+/**
+ * Tracker for whiteboard services.
+ */
+public interface Tracker<T> {
 
     /**
-     * Publishes the given service to the whiteboard. Use the returned
-     * registration object to unregister the service.
+     * Returns the currently available services of the tracked type.
      *
-     * @param type type of the service
-     * @param service service instance
-     * @param properties service properties
-     * @return service registration
+     * @return available services
+     */
+    List<T> getServices();
+
+    /**
+     * Stops tracking.
      */
-    <T> Registration register(Class<T> type, T service, Map<?, ?> properties);
+    void stop();
 
 }

Modified: 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/whiteboard/Whiteboard.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/whiteboard/Whiteboard.java?rev=1550196&r1=1550195&r2=1550196&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/whiteboard/Whiteboard.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/whiteboard/Whiteboard.java
 Wed Dec 11 17:28:20 2013
@@ -31,4 +31,12 @@ public interface Whiteboard {
      */
     <T> Registration register(Class<T> type, T service, Map<?, ?> properties);
 
+    /**
+     * Starts tracking services of the given type.
+     *
+     * @param type type of the services to track
+     * @return service tracker
+     */
+    <T> Tracker<T> track(Class<T> type);
+
 }

Modified: 
jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/osgi/Activator.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/osgi/Activator.java?rev=1550196&r1=1550195&r2=1550196&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/osgi/Activator.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/osgi/Activator.java
 Wed Dec 11 17:28:20 2013
@@ -97,9 +97,10 @@ public class Activator implements Bundle
         tracker = new ServiceTracker(context, NodeStore.class.getName(), this);
         tracker.open();
 
-        editorProvider.start(bundleContext);
-        indexEditorProvider.start(bundleContext);
-        indexProvider.start(bundleContext);
+        Whiteboard whiteboard = new OsgiWhiteboard(bundleContext);
+        editorProvider.start(whiteboard);
+        indexEditorProvider.start(whiteboard);
+        indexProvider.start(whiteboard);
         executor.start(bundleContext);
     }
 


Reply via email to