You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@servicemix.apache.org by gn...@apache.org on 2008/10/26 10:36:16 UTC

svn commit: r707957 - in /servicemix/smx4/specs/trunk/locator/src/main/java/org/apache/servicemix/specs/locator: Activator.java OsgiLocator.java

Author: gnodet
Date: Sun Oct 26 02:36:16 2008
New Revision: 707957

URL: http://svn.apache.org/viewvc?rev=707957&view=rev
Log:
SMX4-145: OSGi specs bundle listener may register duplicate entries leading to using invalid bundles when creating factories

Modified:
    servicemix/smx4/specs/trunk/locator/src/main/java/org/apache/servicemix/specs/locator/Activator.java
    servicemix/smx4/specs/trunk/locator/src/main/java/org/apache/servicemix/specs/locator/OsgiLocator.java

Modified: servicemix/smx4/specs/trunk/locator/src/main/java/org/apache/servicemix/specs/locator/Activator.java
URL: http://svn.apache.org/viewvc/servicemix/smx4/specs/trunk/locator/src/main/java/org/apache/servicemix/specs/locator/Activator.java?rev=707957&r1=707956&r2=707957&view=diff
==============================================================================
--- servicemix/smx4/specs/trunk/locator/src/main/java/org/apache/servicemix/specs/locator/Activator.java (original)
+++ servicemix/smx4/specs/trunk/locator/src/main/java/org/apache/servicemix/specs/locator/Activator.java Sun Oct 26 02:36:16 2008
@@ -61,9 +61,14 @@
     public synchronized void start(BundleContext bundleContext) throws Exception {
         this.bundleContext = bundleContext;
         debugPrintln("activating");
+        debugPrintln("adding bundle listener");
         bundleContext.addBundleListener(this);
+        debugPrintln("checking existing bundles");
         for (Bundle bundle : bundleContext.getBundles()) {
-            register(bundle);
+            if (bundle.getState() == Bundle.RESOLVED || bundle.getState() == Bundle.STARTING ||
+                    bundle.getState() == Bundle.ACTIVE || bundle.getState() == Bundle.STOPPING) {
+                register(bundle);
+            }
         }
         debugPrintln("activated");
     }
@@ -102,29 +107,12 @@
                     map = new HashMap<String, Callable<Class>>();
                     factories.put(bundle.getBundleId(), map);
                 }
-                map.put(factoryId, new Callable<Class>() {
-                    public Class call() throws Exception {
-                        try {
-                            debugPrintln("creating factory for key: " + factoryId);
-                            BufferedReader br = new BufferedReader(new InputStreamReader(u.openStream(), "UTF-8"));
-                            String factoryClassName = br.readLine();
-                            br.close();
-                            debugPrintln("factory implementation: " + factoryClassName);
-                            return bundle.loadClass(factoryClassName);
-                        } catch (Exception e) {
-                            debugPrintln("exception caught while creating factory: " + e);
-                            throw e;
-                        } catch (Error e) {
-                            debugPrintln("error caught while creating factory: " + e);
-                            throw e;
-                        }
-                    }
-                });
+                map.put(factoryId, new BundleFactoryLoader(factoryId, u, bundle));
             }
         }
         if (map != null) {
             for (Map.Entry<String, Callable<Class>> entry : map.entrySet()) {
-                debugPrintln("registering service for key " + entry.getKey());
+                debugPrintln("registering service for key " + entry.getKey() + "with value " + entry.getValue());
                 OsgiLocator.register(entry.getKey(), entry.getValue());
             }
         }
@@ -134,9 +122,57 @@
         Map<String, Callable<Class>> map = factories.remove(bundleId);
         if (map != null) {
             for (Map.Entry<String, Callable<Class>> entry : map.entrySet()) {
-                debugPrintln("unregistering service for key " + entry.getKey());
+                debugPrintln("unregistering service for key " + entry.getKey() + "with value " + entry.getValue());
                 OsgiLocator.unregister(entry.getKey(), entry.getValue());
             }
         }
     }
+
+    private class BundleFactoryLoader implements Callable<Class> {
+        private final String factoryId;
+        private final URL u;
+        private final Bundle bundle;
+
+        public BundleFactoryLoader(String factoryId, URL u, Bundle bundle) {
+            this.factoryId = factoryId;
+            this.u = u;
+            this.bundle = bundle;
+        }
+
+        public Class call() throws Exception {
+            try {
+                debugPrintln("creating factory for key: " + factoryId);
+                BufferedReader br = new BufferedReader(new InputStreamReader(u.openStream(), "UTF-8"));
+                String factoryClassName = br.readLine();
+                br.close();
+                debugPrintln("factory implementation: " + factoryClassName);
+                return bundle.loadClass(factoryClassName);
+            } catch (Exception e) {
+                debugPrintln("exception caught while creating factory: " + e);
+                throw e;
+            } catch (Error e) {
+                debugPrintln("error caught while creating factory: " + e);
+                throw e;
+            }
+        }
+
+        @Override
+        public String toString() {
+           return u.toString();
+        }
+
+        @Override
+        public int hashCode() {
+           return u.hashCode();
+        }
+
+        @Override
+        public boolean equals(Object obj) {
+            if (obj instanceof BundleFactoryLoader) {
+                return u.equals(((BundleFactoryLoader) obj).u);
+            } else {
+                return false;
+            }
+        }
+    }
 }

Modified: servicemix/smx4/specs/trunk/locator/src/main/java/org/apache/servicemix/specs/locator/OsgiLocator.java
URL: http://svn.apache.org/viewvc/servicemix/smx4/specs/trunk/locator/src/main/java/org/apache/servicemix/specs/locator/OsgiLocator.java?rev=707957&r1=707956&r2=707957&view=diff
==============================================================================
--- servicemix/smx4/specs/trunk/locator/src/main/java/org/apache/servicemix/specs/locator/OsgiLocator.java (original)
+++ servicemix/smx4/specs/trunk/locator/src/main/java/org/apache/servicemix/specs/locator/OsgiLocator.java Sun Oct 26 02:36:16 2008
@@ -21,17 +21,19 @@
 import java.util.Map;
 import java.util.HashMap;
 import java.util.ArrayList;
+import java.util.Set;
+import java.util.HashSet;
 
 public class OsgiLocator {
 
-    private static Map<String, List<Callable<Class>>> factories;
+    private static Map<String, Set<Callable<Class>>> factories;
 
     private OsgiLocator() {
     }
 
     public static synchronized void unregister(String id, Callable<Class> factory) {
         if (factories != null) {
-            List<Callable<Class>> l = factories.get(id);
+            Set<Callable<Class>> l = factories.get(id);
             if (l != null) {
                 l.remove(factory);
             }
@@ -40,11 +42,11 @@
 
     public static synchronized void register(String id, Callable<Class> factory) {
         if (factories == null) {
-            factories = new HashMap<String, List<Callable<Class>>>();
+            factories = new HashMap<String, Set<Callable<Class>>>();
         }
-        List<Callable<Class>> l = factories.get(id);
+        Set<Callable<Class>> l = factories.get(id);
         if (l ==  null) {
-            l = new ArrayList<Callable<Class>>();
+            l = new HashSet<Callable<Class>>();
             factories.put(id, l);
         }
         l.add(factory);
@@ -52,9 +54,9 @@
 
     public static synchronized Class locate(String factoryId) {
         if (factories != null) {
-            List<Callable<Class>> l = factories.get(factoryId);
+            Set<Callable<Class>> l = factories.get(factoryId);
             if (l != null && !l.isEmpty()) {
-                Callable<Class> c = l.get(0);
+                Callable<Class> c = l.iterator().next();
                 try {
                     return c.call();
                 } catch (Exception e) {
@@ -67,7 +69,7 @@
 	public static synchronized List<Class> locateAll(String factoryId) {
 		List<Class> classes = new ArrayList<Class>();
         if (factories != null) {
-            List<Callable<Class>> l = factories.get(factoryId);
+            Set<Callable<Class>> l = factories.get(factoryId);
             if (l != null) {
                 for (Callable<Class> c : l) {
                 	try {