[FELIX-2798] ArtifactListener services are not ordered according to the OSGi ranking
git-svn-id: https://svn.apache.org/repos/asf/felix/trunk@1064774 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/fileinstall/src/main/java/org/apache/felix/fileinstall/internal/ConfigInstaller.java b/fileinstall/src/main/java/org/apache/felix/fileinstall/internal/ConfigInstaller.java
index bb60375..28788e0 100644
--- a/fileinstall/src/main/java/org/apache/felix/fileinstall/internal/ConfigInstaller.java
+++ b/fileinstall/src/main/java/org/apache/felix/fileinstall/internal/ConfigInstaller.java
@@ -33,6 +33,7 @@
import org.apache.felix.cm.file.ConfigurationHandler;
import org.apache.felix.fileinstall.ArtifactInstaller;
+import org.apache.felix.fileinstall.ArtifactListener;
import org.apache.felix.fileinstall.internal.Util.Logger;
import org.apache.felix.utils.collections.DictionaryAsMap;
import org.apache.felix.utils.properties.InterpolationHelper;
@@ -65,7 +66,13 @@
if (registration == null)
{
Properties props = new Properties();
- registration = this.context.registerService(ConfigurationListener.class.getName(), this, props);
+ registration = this.context.registerService(
+ new String[] {
+ ConfigurationListener.class.getName(),
+ ArtifactListener.class.getName(),
+ ArtifactInstaller.class.getName()
+ },
+ this, props);
}
}
diff --git a/fileinstall/src/main/java/org/apache/felix/fileinstall/internal/FileInstall.java b/fileinstall/src/main/java/org/apache/felix/fileinstall/internal/FileInstall.java
index b024a11..8fb7121 100644
--- a/fileinstall/src/main/java/org/apache/felix/fileinstall/internal/FileInstall.java
+++ b/fileinstall/src/main/java/org/apache/felix/fileinstall/internal/FileInstall.java
@@ -41,7 +41,8 @@
static ServiceTracker padmin;
static ServiceTracker startLevel;
static Runnable cmSupport;
- static List /* <ArtifactListener> */ listeners = new ArrayList /* <ArtifactListener> */();
+ static final Map /* <ServiceReference, ArtifactListener> */ listeners = new TreeMap /* <ServiceReference, ArtifactListener> */();
+ static final BundleTransformer bundleTransformer = new BundleTransformer();
BundleContext context;
Map watchers = new HashMap();
ServiceTracker listenersTracker;
@@ -51,7 +52,6 @@
public void start(BundleContext context) throws Exception
{
this.context = context;
- addListener(new BundleTransformer());
Hashtable props = new Hashtable();
props.put("url.handler.protocol", JarDirUrlHandler.PROTOCOL);
@@ -69,12 +69,18 @@
public Object addingService(ServiceReference serviceReference)
{
ArtifactListener listener = (ArtifactListener) super.addingService(serviceReference);
- addListener(listener);
+ addListener(serviceReference, listener);
return listener;
}
+ public void modifiedService(ServiceReference reference, Object service)
+ {
+ super.modifiedService(reference, service);
+ removeListener(reference);
+ addListener(reference, (ArtifactListener) service);
+ }
public void removedService(ServiceReference serviceReference, Object o)
{
- removeListener((ArtifactListener) o);
+ removeListener(serviceReference);
}
};
listenersTracker.open();
@@ -221,20 +227,20 @@
watcher.start();
}
- private void addListener(ArtifactListener listener)
+ private void addListener(ServiceReference reference, ArtifactListener listener)
{
synchronized (listeners)
{
- listeners.add(listener);
+ listeners.put(reference, listener);
}
notifyWatchers();
}
- private void removeListener(ArtifactListener listener)
+ private void removeListener(ServiceReference reference)
{
synchronized (listeners)
{
- listeners.remove(listener);
+ listeners.remove(reference);
}
notifyWatchers();
}
@@ -260,7 +266,9 @@
{
synchronized (listeners)
{
- return new ArrayList(listeners);
+ List l = new ArrayList(listeners.values());
+ l.add(bundleTransformer);
+ return l;
}
}
@@ -349,7 +357,6 @@
ConfigurationAdmin cm = (ConfigurationAdmin) super.addingService(serviceReference);
configInstaller = new ConfigInstaller(context, cm);
configInstaller.init();
- fileInstall.addListener(configInstaller);
return cm;
}
@@ -358,7 +365,6 @@
if (configInstaller != null)
{
configInstaller.destroy();
- fileInstall.removeListener(configInstaller);
configInstaller = null;
}
super.removedService(serviceReference, o);