You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@felix.apache.org by ri...@apache.org on 2010/07/09 21:22:39 UTC

svn commit: r962650 - in /felix/sandbox/rickhall/vb: composite/src/main/java/org/apache/felix/sandbox/composite/ framework-vb/src/main/java/org/apache/felix/framework/

Author: rickhall
Date: Fri Jul  9 19:22:38 2010
New Revision: 962650

URL: http://svn.apache.org/viewvc?rev=962650&view=rev
Log:
Merge branch 'composite'

Modified:
    felix/sandbox/rickhall/vb/composite/src/main/java/org/apache/felix/sandbox/composite/Activator.java
    felix/sandbox/rickhall/vb/composite/src/main/java/org/apache/felix/sandbox/composite/CompositeVirtualModule.java
    felix/sandbox/rickhall/vb/composite/src/main/java/org/apache/felix/sandbox/composite/Manager.java
    felix/sandbox/rickhall/vb/framework-vb/src/main/java/org/apache/felix/framework/Felix.java
    felix/sandbox/rickhall/vb/framework-vb/src/main/java/org/apache/felix/framework/UnmanagedModuleImpl.java

Modified: felix/sandbox/rickhall/vb/composite/src/main/java/org/apache/felix/sandbox/composite/Activator.java
URL: http://svn.apache.org/viewvc/felix/sandbox/rickhall/vb/composite/src/main/java/org/apache/felix/sandbox/composite/Activator.java?rev=962650&r1=962649&r2=962650&view=diff
==============================================================================
--- felix/sandbox/rickhall/vb/composite/src/main/java/org/apache/felix/sandbox/composite/Activator.java (original)
+++ felix/sandbox/rickhall/vb/composite/src/main/java/org/apache/felix/sandbox/composite/Activator.java Fri Jul  9 19:22:38 2010
@@ -31,6 +31,7 @@ public class Activator implements Bundle
         if (bc instanceof FelixBundleContext)
         {
             m_manager = new Manager((FelixBundleContext) bc);
+            m_manager.start();
 
             Hashtable props = new Hashtable();
             props.put("osgi.command.scope", "composite");
@@ -48,5 +49,6 @@ public class Activator implements Bundle
 
     public void stop(BundleContext bc) throws Exception
     {
+        m_manager.stop();
     }
 }
\ No newline at end of file

Modified: felix/sandbox/rickhall/vb/composite/src/main/java/org/apache/felix/sandbox/composite/CompositeVirtualModule.java
URL: http://svn.apache.org/viewvc/felix/sandbox/rickhall/vb/composite/src/main/java/org/apache/felix/sandbox/composite/CompositeVirtualModule.java?rev=962650&r1=962649&r2=962650&view=diff
==============================================================================
--- felix/sandbox/rickhall/vb/composite/src/main/java/org/apache/felix/sandbox/composite/CompositeVirtualModule.java (original)
+++ felix/sandbox/rickhall/vb/composite/src/main/java/org/apache/felix/sandbox/composite/CompositeVirtualModule.java Fri Jul  9 19:22:38 2010
@@ -23,6 +23,7 @@ import java.io.IOException;
 import java.io.InputStream;
 import java.net.URL;
 import java.security.SecureClassLoader;
+import java.util.Dictionary;
 import java.util.Enumeration;
 import java.util.HashMap;
 import java.util.List;
@@ -53,10 +54,16 @@ public class CompositeVirtualModule impl
     private volatile ClassLoader m_loader = null;
     private volatile PackageProviderVirtualModule m_importToExportVM = null;
 
-    public CompositeVirtualModule(Bundle manager, Map headers)
+    public CompositeVirtualModule(Bundle manager, Dictionary dict)
     {
         m_manager = manager;
-        m_headers = headers;
+        Map map = new HashMap();
+        for (Enumeration<String> keys = dict.keys(); keys.hasMoreElements(); )
+        {
+            String key = keys.nextElement();
+            map.put(key, dict.get(key));
+        }
+        m_headers = map;
     }
 
     public void initialize(VirtualModuleContext vmc) throws BundleException
@@ -90,16 +97,20 @@ public class CompositeVirtualModule impl
             m_loader = new CompositeClassLoader();
             if (m_headers.containsKey("Import-Package"))
             {
-                try
-                {
                 String sn = (String) m_headers.get("Bundle-SymbolicName") + ".PPVM";
                 m_importToExportVM =
                     new PackageProviderVirtualModule(
                         sn, (String) m_headers.get("Import-Package"), m_wires);
-                ((FelixBundleContext) m_fwk.getBundleContext()).installBundle(
-                    sn, m_importToExportVM.getHeaders(), m_importToExportVM);
-                } catch (Exception ex) {
-                    ex.printStackTrace();
+                Bundle vb = getBundle(m_fwk.getBundleContext().getBundles(), sn);
+                if (vb == null)
+                {
+                    ((FelixBundleContext) m_fwk.getBundleContext()).installBundle(
+                        sn, m_importToExportVM.getHeaders(), m_importToExportVM);
+                }
+                else
+                {
+                    ((FelixBundleContext) m_fwk.getBundleContext()).reinstallBundle(
+                        vb, m_importToExportVM);
                 }
             }
         }

Modified: felix/sandbox/rickhall/vb/composite/src/main/java/org/apache/felix/sandbox/composite/Manager.java
URL: http://svn.apache.org/viewvc/felix/sandbox/rickhall/vb/composite/src/main/java/org/apache/felix/sandbox/composite/Manager.java?rev=962650&r1=962649&r2=962650&view=diff
==============================================================================
--- felix/sandbox/rickhall/vb/composite/src/main/java/org/apache/felix/sandbox/composite/Manager.java (original)
+++ felix/sandbox/rickhall/vb/composite/src/main/java/org/apache/felix/sandbox/composite/Manager.java Fri Jul  9 19:22:38 2010
@@ -25,18 +25,52 @@ import java.util.Properties;
 import org.apache.felix.framework.ext.FelixBundleContext;
 import org.apache.felix.framework.ext.VirtualModuleContext;
 import org.osgi.framework.Bundle;
+import org.osgi.framework.BundleEvent;
 import org.osgi.framework.BundleException;
+import org.osgi.framework.ServiceReference;
 import org.osgi.framework.launch.Framework;
+import org.osgi.service.packageadmin.PackageAdmin;
+import org.osgi.util.tracker.BundleTracker;
+import org.osgi.util.tracker.BundleTrackerCustomizer;
 
 public class Manager
 {
+    private static final String MANAGER_HEADER = "Bundle-Manager";
+    private static final String MANAGER_VALUE = "org.apache.felix.sandbox.composite";
+
     private final FelixBundleContext m_fbc;
+    private final BundleTracker m_tracker;
     private final Map<Bundle, CompositeVirtualModule> m_vmMap =
         new HashMap<Bundle, CompositeVirtualModule>();
 
     public Manager(FelixBundleContext fbc)
     {
         m_fbc = fbc;
+        m_tracker = new BundleTracker(
+            fbc,
+            Bundle.INSTALLED | Bundle.RESOLVED | Bundle.STARTING
+            | Bundle.ACTIVE | Bundle.STOPPING,
+            new Customizer());
+    }
+
+    public void start()
+    {
+        m_tracker.open();
+    }
+
+    public void stop()
+    {
+        m_tracker.close();
+        ServiceReference sr = m_fbc.getServiceReference(PackageAdmin.class.getName());
+        if (sr != null)
+        {
+            PackageAdmin pa = (PackageAdmin) m_fbc.getService(sr);
+            if (pa != null)
+            {
+                Bundle[] bs = m_vmMap.keySet().toArray(new Bundle[m_vmMap.size()]);
+                pa.refreshPackages(bs);
+            }
+        }
     }
 
     public Bundle install(String location, InputStream is) throws BundleException
@@ -51,8 +85,7 @@ public class Manager
                 headers.setProperty(
                     "Bundle-Activator",
                     "org.apache.felix.sandbox.composite.activator.Activator");
-                headers.setProperty(
-                    "Bundle-Manager", "org.apache.felix.sandbox.composite");
+                headers.setProperty(MANAGER_HEADER, MANAGER_VALUE);
             }
             finally
             {
@@ -81,4 +114,68 @@ public class Manager
         }
         return fwk;
     }
+
+    class Customizer implements BundleTrackerCustomizer
+    {
+        public Object addingBundle(Bundle bundle, BundleEvent event)
+        {
+System.out.println("+++ ADDING " + bundle + " " + getStateString(bundle.getState()));
+            if ((bundle.getHeaders().get(MANAGER_HEADER) != null)
+                && bundle.getHeaders().get(MANAGER_HEADER).equals(MANAGER_VALUE))
+            {
+                if (!m_vmMap.containsKey(bundle))
+                {
+                    try
+                    {
+                        CompositeVirtualModule vm = new CompositeVirtualModule(
+                            m_fbc.getBundle(), bundle.getHeaders());
+                        VirtualModuleContext vmc =
+                            m_fbc.reinstallBundle(bundle, vm);
+                        vm.initialize(vmc);
+                        m_vmMap.put(vmc.getBundle(), vm);
+                    }
+                    catch (BundleException ex)
+                    {
+                        System.out.println("Manager error: " + ex);
+                    }
+                }
+            }
+            else
+            {
+                bundle = null;
+            }
+            return bundle;
+        }
+
+        public void modifiedBundle(Bundle bundle, BundleEvent event, Object object)
+        {
+            System.out.println("+++ MODIFIED " + bundle + " " + getStateString(bundle.getState()));
+        }
+
+        public void removedBundle(Bundle bundle, BundleEvent event, Object object)
+        {
+            System.out.println("+++ REMOVED " + bundle + " " + getStateString(bundle.getState()));
+        }
+    }
+
+    private static String getStateString(int i)
+    {
+        switch (i)
+        {
+            case Bundle.INSTALLED:
+                return "Installed";
+            case Bundle.RESOLVED:
+                return "Resolved";
+            case Bundle.STARTING:
+                return "Starting";
+            case Bundle.ACTIVE:
+                return "Active";
+            case Bundle.STOPPING:
+                return "Stopping";
+            case Bundle.UNINSTALLED:
+                return "UNINSTALLED";
+        }
+
+        return "Unknown";
+    }
 }
\ No newline at end of file

Modified: felix/sandbox/rickhall/vb/framework-vb/src/main/java/org/apache/felix/framework/Felix.java
URL: http://svn.apache.org/viewvc/felix/sandbox/rickhall/vb/framework-vb/src/main/java/org/apache/felix/framework/Felix.java?rev=962650&r1=962649&r2=962650&view=diff
==============================================================================
--- felix/sandbox/rickhall/vb/framework-vb/src/main/java/org/apache/felix/framework/Felix.java (original)
+++ felix/sandbox/rickhall/vb/framework-vb/src/main/java/org/apache/felix/framework/Felix.java Fri Jul  9 19:22:38 2010
@@ -2819,8 +2819,6 @@ ex.printStackTrace();
 
         try
         {
-            Throwable rethrow = null;
-
             if (vb.getCurrentModule() instanceof UnmanagedModuleImpl)
             {
                 ((UnmanagedModuleImpl) vb.getCurrentModule()).setVirtualModule(vm);
@@ -3910,6 +3908,8 @@ ex.printStackTrace();
         {
             // Reset the bundle object and fire UNRESOLVED event.
             ((BundleImpl) bundle).refresh();
+            setBundleStateAndNotify(bundle, Bundle.INSTALLED);
+            fireBundleEvent(BundleEvent.UNRESOLVED, bundle);
         }
         catch (Exception ex)
         {

Modified: felix/sandbox/rickhall/vb/framework-vb/src/main/java/org/apache/felix/framework/UnmanagedModuleImpl.java
URL: http://svn.apache.org/viewvc/felix/sandbox/rickhall/vb/framework-vb/src/main/java/org/apache/felix/framework/UnmanagedModuleImpl.java?rev=962650&r1=962649&r2=962650&view=diff
==============================================================================
--- felix/sandbox/rickhall/vb/framework-vb/src/main/java/org/apache/felix/framework/UnmanagedModuleImpl.java (original)
+++ felix/sandbox/rickhall/vb/framework-vb/src/main/java/org/apache/felix/framework/UnmanagedModuleImpl.java Fri Jul  9 19:22:38 2010
@@ -21,27 +21,14 @@ package org.apache.felix.framework;
 import java.io.IOException;
 import java.io.InputStream;
 import java.net.URL;
-import java.security.ProtectionDomain;
-import java.util.ArrayList;
-import java.util.Collections;
 import java.util.Enumeration;
 import java.util.List;
 import java.util.Map;
-import org.apache.felix.framework.Felix.FelixResolver;
-import org.apache.felix.framework.capabilityset.Capability;
-import org.apache.felix.framework.capabilityset.Requirement;
 import org.apache.felix.framework.ext.Wire;
 import org.apache.felix.framework.ext.VirtualModule;
 import org.apache.felix.framework.resolver.Content;
-import org.apache.felix.framework.resolver.Module;
-import org.apache.felix.framework.resolver.ResolverWire;
-import org.apache.felix.framework.util.SecureAction;
-import org.apache.felix.framework.util.manifestparser.CapabilityImpl;
-import org.apache.felix.framework.util.manifestparser.R4Library;
 import org.osgi.framework.Bundle;
-import org.osgi.framework.BundleActivator;
 import org.osgi.framework.BundleException;
-import org.osgi.framework.Version;
 
 public class UnmanagedModuleImpl extends AbstractModuleImpl
 {
@@ -63,8 +50,16 @@ public class UnmanagedModuleImpl extends
     }
 
     public synchronized void setVirtualModule(VirtualModule vm)
+        throws BundleException
     {
-        m_vm = vm;
+        if (m_vm == null)
+        {
+            m_vm = vm;
+        }
+        else
+        {
+            throw new BundleException("Virtual module is already set.");
+        }
     }
 
     public Content getContent()