You are viewing a plain text version of this content. The canonical link for it is here.
Posted to xbean-scm@geronimo.apache.org by xu...@apache.org on 2011/08/22 09:04:01 UTC

svn commit: r1160127 - /geronimo/xbean/trunk/xbean-bundleutils/src/main/java/org/apache/xbean/osgi/bundle/util/DelegatingBundle.java

Author: xuhaihong
Date: Mon Aug 22 07:04:01 2011
New Revision: 1160127

URL: http://svn.apache.org/viewvc?rev=1160127&view=rev
Log:
XBEAN-180 Allow update the delegating bundles on the runtime

Modified:
    geronimo/xbean/trunk/xbean-bundleutils/src/main/java/org/apache/xbean/osgi/bundle/util/DelegatingBundle.java

Modified: geronimo/xbean/trunk/xbean-bundleutils/src/main/java/org/apache/xbean/osgi/bundle/util/DelegatingBundle.java
URL: http://svn.apache.org/viewvc/geronimo/xbean/trunk/xbean-bundleutils/src/main/java/org/apache/xbean/osgi/bundle/util/DelegatingBundle.java?rev=1160127&r1=1160126&r2=1160127&view=diff
==============================================================================
--- geronimo/xbean/trunk/xbean-bundleutils/src/main/java/org/apache/xbean/osgi/bundle/util/DelegatingBundle.java (original)
+++ geronimo/xbean/trunk/xbean-bundleutils/src/main/java/org/apache/xbean/osgi/bundle/util/DelegatingBundle.java Mon Aug 22 07:04:01 2011
@@ -32,6 +32,7 @@ import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
+import java.util.concurrent.CopyOnWriteArrayList;
 
 import org.osgi.framework.Bundle;
 import org.osgi.framework.BundleContext;
@@ -42,42 +43,46 @@ import org.osgi.service.packageadmin.Exp
 import org.osgi.service.packageadmin.PackageAdmin;
 
 /**
- * Bundle that delegates ClassLoader operations to a collection of {@link Bundle} objects. 
- * 
+ * Bundle that delegates ClassLoader operations to a collection of {@link Bundle} objects.
+ *
  * @version $Rev$ $Date$
  */
 public class DelegatingBundle implements Bundle {
 
-    private Collection<Bundle> bundles;
+    private CopyOnWriteArrayList<Bundle> bundles;
     private Bundle bundle;
     private BundleContext bundleContext;
 
     public DelegatingBundle(Collection<Bundle> bundles) {
-        this.bundles = bundles;
         if (bundles.isEmpty()) {
             throw new IllegalArgumentException("At least one bundle is required");
         }
+        this.bundles = new CopyOnWriteArrayList<Bundle>(bundles);
         // assume first Bundle is the main bundle
         this.bundle = bundles.iterator().next();
         this.bundleContext = new DelegatingBundleContext(this, bundle.getBundleContext());
     }
-       
+
+    public DelegatingBundle(Bundle bundle) {
+        this(Collections.singletonList(bundle));
+    }
+
     public Bundle getMainBundle() {
         return bundle;
     }
-    
+
     public Class<?> loadClass(String name) throws ClassNotFoundException {
         try {
             return bundle.loadClass(name);
         } catch (ClassNotFoundException ex) {
             int index = name.lastIndexOf('.');
-            if (index > 0) {
+            if (index > 0 && bundles.size() > 1) {
                 // see if there are any bundles exporting the package
                 String packageName = name.substring(0, index);
                 Set<Bundle> packageBundles = getPackageBundles(packageName);
                 if (packageBundles == null) {
                     // package is NOT exported
-                    
+
                     Iterator<Bundle> iterator = bundles.iterator();
                     // skip first bundle
                     iterator.next();
@@ -90,12 +95,12 @@ public class DelegatingBundle implements
                             // ignore
                         }
                     }
-                    
+
                     throw ex;
                 } else {
-                    // package is exported 
-                    
-                    // see if any of our bundles is wired to the exporter 
+                    // package is exported
+
+                    // see if any of our bundles is wired to the exporter
                     Bundle delegate = findFirstBundle(packageBundles);
                     if (delegate == null || delegate == bundle) {
                         // nope. no static wires but might need to check for dynamic wires in the future.
@@ -103,15 +108,15 @@ public class DelegatingBundle implements
                     } else {
                         // yes. attempt to load the class from it
                         return delegate.loadClass(name);
-                    } 
+                    }
                 }
             }  else {
                 // no package name
                 throw ex;
-            }  
+            }
         }
     }
-    
+
     private Set<Bundle> getPackageBundles(String packageName) {
         BundleContext context = bundle.getBundleContext();
         ServiceReference reference = context.getServiceReference(PackageAdmin.class.getName());
@@ -136,25 +141,33 @@ public class DelegatingBundle implements
             context.ungetService(reference);
         }
     }
-    
+
     private Bundle findFirstBundle(Set<Bundle> packageBundles) {
         Collection<Bundle> c1 = bundles;
         Collection<Bundle> c2 = packageBundles;
-        
+
         if (bundles instanceof Set<?> && bundles.size() > packageBundles.size()) {
             c1 = packageBundles;
             c2 = bundles;
         }
-        
+
         for (Bundle bundle : c1) {
             if (c2.contains(bundle)) {
                 return bundle;
             }
         }
-        
+
         return null;
     }
-    
+
+    public void addBundle(Bundle b) {
+        bundles.add(b);
+    }
+
+    public void removeBundle(Bundle b) {
+        bundles.remove(b);
+    }
+
     public URL getResource(String name) {
         URL resource = null;
         for (Bundle bundle : bundles) {
@@ -169,12 +182,12 @@ public class DelegatingBundle implements
     public Enumeration<URL> getResources(String name) throws IOException {
         ArrayList<URL> allResources = new ArrayList<URL>();
         for (Bundle bundle : bundles) {
-            Enumeration<URL> e = (Enumeration<URL>) bundle.getResources(name);
+            Enumeration<URL> e = bundle.getResources(name);
             addToList(allResources, e);
         }
-        return Collections.enumeration(allResources); 
-    }    
-    
+        return Collections.enumeration(allResources);
+    }
+
     private static void addToList(List<URL> list, Enumeration<URL> enumeration) {
         if (enumeration != null) {
             while (enumeration.hasMoreElements()) {
@@ -186,7 +199,7 @@ public class DelegatingBundle implements
     public BundleContext getBundleContext() {
         return bundleContext;
     }
-    
+
     public Enumeration findEntries(String arg0, String arg1, boolean arg2) {
         return bundle.findEntries(arg0, arg1, arg2);
     }
@@ -278,5 +291,5 @@ public class DelegatingBundle implements
     public String toString() {
         return "[DelegatingBundle: " + bundles + "]";
     }
-           
+
 }