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