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