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); }