Several small performance enhancements.
git-svn-id: https://svn.apache.org/repos/asf/felix/trunk@1364521 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/dependencymanager/core/src/main/java/org/apache/felix/dm/InvocationUtil.java b/dependencymanager/core/src/main/java/org/apache/felix/dm/InvocationUtil.java
index e6664d2..9435c7f 100644
--- a/dependencymanager/core/src/main/java/org/apache/felix/dm/InvocationUtil.java
+++ b/dependencymanager/core/src/main/java/org/apache/felix/dm/InvocationUtil.java
@@ -45,7 +45,7 @@
public static Object invokeCallbackMethod(Object instance, String methodName, Class[][] signatures, Object[][] parameters) throws NoSuchMethodException, IllegalArgumentException, IllegalAccessException, InvocationTargetException {
Class currentClazz = instance.getClass();
- while (currentClazz != null) {
+ while (currentClazz != null && currentClazz != Object.class) {
try {
return invokeMethod(instance, currentClazz, methodName, signatures, parameters, false);
}
diff --git a/dependencymanager/core/src/main/java/org/apache/felix/dm/impl/AdapterServiceImpl.java b/dependencymanager/core/src/main/java/org/apache/felix/dm/impl/AdapterServiceImpl.java
index fda794b..5b2d628 100644
--- a/dependencymanager/core/src/main/java/org/apache/felix/dm/impl/AdapterServiceImpl.java
+++ b/dependencymanager/core/src/main/java/org/apache/felix/dm/impl/AdapterServiceImpl.java
@@ -52,7 +52,8 @@
.add(dm.createServiceDependency()
.setService(adapteeInterface, adapteeFilter)
.setAutoConfig(false)
- .setCallbacks("added", null, "removed", "swapped"));
+ .setCallbacks("added", null, "removed", "swapped"))
+ .setCallbacks("init", null, "stop", null);
}
public AdapterServiceImpl(DependencyManager dm, Class adapteeInterface, String adapteeFilter, String autoConfig, String add, String change, String remove) {
@@ -61,7 +62,8 @@
.add(dm.createServiceDependency()
.setService(adapteeInterface, adapteeFilter)
.setAutoConfig(false)
- .setCallbacks("added", null, "removed", "swapped"));
+ .setCallbacks("added", null, "removed", "swapped"))
+ .setCallbacks("init", null, "stop", null);
}
public class AdapterImpl extends AbstractDecorator {
diff --git a/dependencymanager/core/src/main/java/org/apache/felix/dm/impl/AspectServiceImpl.java b/dependencymanager/core/src/main/java/org/apache/felix/dm/impl/AspectServiceImpl.java
index 504552e..d46f8db 100644
--- a/dependencymanager/core/src/main/java/org/apache/felix/dm/impl/AspectServiceImpl.java
+++ b/dependencymanager/core/src/main/java/org/apache/felix/dm/impl/AspectServiceImpl.java
@@ -45,7 +45,8 @@
.add(dm.createServiceDependency()
.setService(aspectInterface, createDependencyFilterForAspect(aspectFilter))
.setAutoConfig(false)
- .setCallbacks("added", "removed"));
+ .setCallbacks("added", "removed"))
+ .setCallbacks("init", null, "stop", null);
}
private String createDependencyFilterForAspect(String filter) {
diff --git a/dependencymanager/core/src/main/java/org/apache/felix/dm/impl/BundleAdapterServiceImpl.java b/dependencymanager/core/src/main/java/org/apache/felix/dm/impl/BundleAdapterServiceImpl.java
index 84b7ce6..76390a0 100644
--- a/dependencymanager/core/src/main/java/org/apache/felix/dm/impl/BundleAdapterServiceImpl.java
+++ b/dependencymanager/core/src/main/java/org/apache/felix/dm/impl/BundleAdapterServiceImpl.java
@@ -46,7 +46,8 @@
.add(dm.createBundleDependency()
.setFilter(bundleFilter)
.setStateMask(bundleStateMask)
- .setCallbacks("added", "removed"));
+ .setCallbacks("added", "removed"))
+ .setCallbacks("init", null, "stop", null);
}
public class BundleAdapterImpl extends AbstractDecorator {
diff --git a/dependencymanager/core/src/main/java/org/apache/felix/dm/impl/FactoryConfigurationAdapterServiceImpl.java b/dependencymanager/core/src/main/java/org/apache/felix/dm/impl/FactoryConfigurationAdapterServiceImpl.java
index 0f1ca5e..faf6489 100644
--- a/dependencymanager/core/src/main/java/org/apache/felix/dm/impl/FactoryConfigurationAdapterServiceImpl.java
+++ b/dependencymanager/core/src/main/java/org/apache/felix/dm/impl/FactoryConfigurationAdapterServiceImpl.java
@@ -51,7 +51,8 @@
props.put(Constants.SERVICE_PID, factoryPid);
m_component
.setInterface(ManagedServiceFactory.class.getName(), props)
- .setImplementation(new AdapterImpl(factoryPid, update, propagate));
+ .setImplementation(new AdapterImpl(factoryPid, update, propagate))
+ .setCallbacks("init", null, "stop", null);
}
public FactoryConfigurationAdapterServiceImpl(DependencyManager dm, String factoryPid, String update, boolean propagate,
@@ -63,7 +64,8 @@
.setInterface(ManagedServiceFactory.class.getName(), props)
.setImplementation(new MetaTypeAdapterImpl(factoryPid, update, propagate,
bctx, logger, heading, description,
- localization, properyMetaData));
+ localization, properyMetaData))
+ .setCallbacks("init", null, "stop", null);
}
/**
diff --git a/dependencymanager/core/src/main/java/org/apache/felix/dm/impl/ResourceAdapterServiceImpl.java b/dependencymanager/core/src/main/java/org/apache/felix/dm/impl/ResourceAdapterServiceImpl.java
index 093acdb..b0a5698 100644
--- a/dependencymanager/core/src/main/java/org/apache/felix/dm/impl/ResourceAdapterServiceImpl.java
+++ b/dependencymanager/core/src/main/java/org/apache/felix/dm/impl/ResourceAdapterServiceImpl.java
@@ -53,7 +53,8 @@
.add(dm.createResourceDependency()
.setFilter(resourceFilter)
.setAutoConfig(false)
- .setCallbacks("added", "removed"));
+ .setCallbacks("added", "removed"))
+ .setCallbacks("init", null, "stop", null);
}
public ResourceAdapterServiceImpl(DependencyManager dm, String resourceFilter, Object propagateCallbackInstance, String propagateCallbackMethod, Object callbackInstance, String callbackSet, String callbackChanged) {
@@ -65,7 +66,8 @@
.add(dm.createResourceDependency()
.setFilter(resourceFilter)
.setAutoConfig(false)
- .setCallbacks("added", "removed"));
+ .setCallbacks("added", "removed"))
+ .setCallbacks("init", null, "stop", null);
}
public class ResourceAdapterImpl extends AbstractDecorator {
diff --git a/dependencymanager/core/src/main/java/org/apache/felix/dm/impl/dependencies/ServiceDependencyImpl.java b/dependencymanager/core/src/main/java/org/apache/felix/dm/impl/dependencies/ServiceDependencyImpl.java
index 2888b72..b3db89e 100644
--- a/dependencymanager/core/src/main/java/org/apache/felix/dm/impl/dependencies/ServiceDependencyImpl.java
+++ b/dependencymanager/core/src/main/java/org/apache/felix/dm/impl/dependencies/ServiceDependencyImpl.java
@@ -740,7 +740,7 @@
}
private synchronized boolean makeUnavailable() {
- if ((isAvailable()) && (m_tracker.getServiceReference() == null)) {
+ if ((isAvailable()) && (!m_tracker.hasReference())) {
m_isAvailable = false;
return true;
}
diff --git a/dependencymanager/core/src/main/java/org/apache/felix/dm/impl/index/AdapterFilterIndex.java b/dependencymanager/core/src/main/java/org/apache/felix/dm/impl/index/AdapterFilterIndex.java
index 2543746..36447e5 100644
--- a/dependencymanager/core/src/main/java/org/apache/felix/dm/impl/index/AdapterFilterIndex.java
+++ b/dependencymanager/core/src/main/java/org/apache/felix/dm/impl/index/AdapterFilterIndex.java
@@ -165,6 +165,7 @@
m_sidToListenersMap.put(sidObject, listeners);
}
listeners.add(listener);
+ m_listenerToFilterMap.put(listener, filter);
}
}
}
diff --git a/dependencymanager/core/src/main/java/org/apache/felix/dm/tracker/ServiceTracker.java b/dependencymanager/core/src/main/java/org/apache/felix/dm/tracker/ServiceTracker.java
index c7440fc..b83fc31 100644
--- a/dependencymanager/core/src/main/java/org/apache/felix/dm/tracker/ServiceTracker.java
+++ b/dependencymanager/core/src/main/java/org/apache/felix/dm/tracker/ServiceTracker.java
@@ -599,6 +599,25 @@
.getTracked(new ServiceReference[length]);
}
}
+
+ /**
+ * Returns a boolean indicating whether this <code>ServiceTracker</code> is tracking any services.
+ *
+ * @return true if services are being tracked, false if no services are being tracked.
+ */
+ public boolean hasReference() {
+ if (cachedReference != null) {
+ return true;
+ }
+ final Tracked t = tracked();
+ if (t == null) { /* if ServiceTracker is not open */
+ return false;
+ }
+ synchronized (t) {
+ int length = t.size();
+ return length > 0;
+ }
+ }
/**
* Returns a <code>ServiceReference</code> for one of the services being