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 2009/01/26 23:44:52 UTC

svn commit: r737912 - in /felix/trunk/framework/src/main/java/org/apache/felix/framework: BundleImpl.java Felix.java

Author: rickhall
Date: Mon Jan 26 22:44:52 2009
New Revision: 737912

URL: http://svn.apache.org/viewvc?rev=737912&view=rev
Log:
More attempts to make resolver state handling more consistent. (FELIX-851)

Modified:
    felix/trunk/framework/src/main/java/org/apache/felix/framework/BundleImpl.java
    felix/trunk/framework/src/main/java/org/apache/felix/framework/Felix.java

Modified: felix/trunk/framework/src/main/java/org/apache/felix/framework/BundleImpl.java
URL: http://svn.apache.org/viewvc/felix/trunk/framework/src/main/java/org/apache/felix/framework/BundleImpl.java?rev=737912&r1=737911&r2=737912&view=diff
==============================================================================
--- felix/trunk/framework/src/main/java/org/apache/felix/framework/BundleImpl.java (original)
+++ felix/trunk/framework/src/main/java/org/apache/felix/framework/BundleImpl.java Mon Jan 26 22:44:52 2009
@@ -33,7 +33,8 @@
 
 class BundleImpl implements Bundle
 {
-    private final Felix m_felix;
+    // No one should use this field directly, use getFramework() instead.
+    private final Felix _m_felix;
 
     private final BundleArchive m_archive;
     private IModule[] m_modules = new IModule[0];
@@ -61,7 +62,7 @@
 
     BundleImpl(Felix felix, BundleArchive archive) throws Exception
     {
-        m_felix = felix;
+        _m_felix = felix;
         m_archive = archive;
         m_state = Bundle.INSTALLED;
         m_stale = false;
@@ -74,7 +75,6 @@
         {
             IModule module = createModule();
             addModule(module);
-            m_felix.getResolverState().addModule(module);
         }
     }
 
@@ -84,19 +84,24 @@
     // not access the field directly.
     Felix getFramework()
     {
-        return m_felix;
+        return _m_felix;
     }
 
-    synchronized void refresh() throws Exception
+    synchronized void dispose()
     {
-        // We are refreshing the bundle. First, we must remove all existing
-        // modules from the resolver state and close them. Closing the modules
-        // is important, since we will likely be deleting their associated files.
+        // Remove the bundle's associated modules from the resolver state
+        // and close them.
         for (int i = 0; i < m_modules.length; i++)
         {
-            m_felix.getResolverState().removeModule(m_modules[i]);
+            getFramework().getResolverState().removeModule(m_modules[i]);
             ((ModuleImpl) m_modules[i]).close();
         }
+    }
+
+    synchronized void refresh() throws Exception
+    {
+        // Dispose of the current modules.
+        dispose();
 
         // Now we will purge all old revisions, only keeping the newest one.
         m_archive.purge();
@@ -106,7 +111,6 @@
         m_modules = new IModule[0];
         final IModule module = createModule();
         addModule(module);
-        m_felix.getResolverState().addModule(module);
         m_state = Bundle.INSTALLED;
         m_stale = false;
         m_cachedHeaders.clear();
@@ -899,7 +903,6 @@
         m_archive.revise(location, is);
         IModule module = createModule();
         addModule(module);
-        m_felix.addModule(module);
     }
 
     synchronized boolean rollbackRevise() throws Exception
@@ -918,7 +921,7 @@
         {
             sp.checkBundle(this);
         }
-        module.setSecurityContext(new BundleProtectionDomain(m_felix, this));
+        module.setSecurityContext(new BundleProtectionDomain(getFramework(), this));
 
         ((ModuleImpl) module).setBundle(this);
 
@@ -926,6 +929,10 @@
         System.arraycopy(m_modules, 0, dest, 0, m_modules.length);
         dest[m_modules.length] = module;
         m_modules = dest;
+
+        // Now that the module is added to the bundle, we can update
+        // the resolver's module state.
+        getFramework().getResolverState().addModule(module);
     }
 
     private IModule createModule() throws Exception

Modified: felix/trunk/framework/src/main/java/org/apache/felix/framework/Felix.java
URL: http://svn.apache.org/viewvc/felix/trunk/framework/src/main/java/org/apache/felix/framework/Felix.java?rev=737912&r1=737911&r2=737912&view=diff
==============================================================================
--- felix/trunk/framework/src/main/java/org/apache/felix/framework/Felix.java (original)
+++ felix/trunk/framework/src/main/java/org/apache/felix/framework/Felix.java Mon Jan 26 22:44:52 2009
@@ -297,7 +297,6 @@
         // definition for creating the system bundle module.
         m_extensionManager = new ExtensionManager(m_logger, m_configMap);
         addModule(m_extensionManager.getModule());
-        m_resolverState.addModule(getCurrentModule());
     }
 
     Logger getLogger()
@@ -3121,15 +3120,8 @@
         // because this method is only called during shutdown or a
         // refresh operation and these are already guarded by locks.
 
-        // Remove the bundle's associated modules from
-        // the module manager.
-        IModule[] modules = bundle.getModules();
-        for (int i = 0; i < modules.length; i++)
-        {
-            m_resolverState.removeModule(modules[i]);
-        }
-
-        // Remove the bundle from the cache.
+        // Remove the bundle from memory and the cache.
+        bundle.dispose();
         m_cache.remove(m_cache.getArchive(bundle.getBundleId()));
     }
 
@@ -3594,34 +3586,12 @@
             // Shutdown event dispatching queue.
             EventDispatcher.shutdown();
 
-            // Remove all bundles from the module factory so that any
-            // open resources will be closed.
-            Bundle[] bundles = getBundles();
-            for (int i = 0; i < bundles.length; i++)
-            {
-                BundleImpl bundle = (BundleImpl) bundles[i];
-                IModule[] modules = bundle.getModules();
-                for (int j = 0; j < modules.length; j++)
-                {
-                    try
-                    {
-                        m_resolverState.removeModule(modules[j]);
-                    }
-                    catch (Exception ex)
-                    {
-                        m_logger.log(Logger.LOG_ERROR,
-                           "Unable to clean up " + bundle._getLocation(), ex);
-                    }
-                }
-            }
-
             // Since there may be updated and uninstalled bundles that
             // have not been refreshed, we will take care of refreshing
             // them during shutdown.
 
-            // First loop through all bundled and purge old revisions
-            // from updated bundles.
-            bundles = getBundles();
+            // Refresh all updated bundles.
+            Bundle[] bundles = getBundles();
             for (int i = 0; i < bundles.length; i++)
             {
                 BundleImpl bundle = (BundleImpl) bundles[i];
@@ -3640,7 +3610,7 @@
                 }
             }
 
-            // Next garbage collection any uninstalled bundles.
+            // Garbage collect uninstalled bundles.
             for (int i = 0;
                 (m_uninstalledBundles != null) && (i < m_uninstalledBundles.length);
                 i++)
@@ -3658,7 +3628,14 @@
                 }
             }
 
-            // Next, stop all system bundle activators.
+            // Dispose of the bundles to close their associated contents.
+            bundles = getBundles();
+            for (int i = 0; i < bundles.length; i++)
+            {
+                ((BundleImpl) bundles[i]).dispose();
+            }
+
+            // Stop all system bundle activators.
             for (int i = 0; i < m_activatorList.size(); i++)
             {
                 try
@@ -3733,16 +3710,14 @@
                 // current state.
                 if (m_bundle.getState() == Bundle.UNINSTALLED)
                 {
-                    // This physically removes the bundle from memory
-                    // as well as the bundle cache.
                     garbageCollectBundle(m_bundle);
                     m_bundle = null;
                 }
                 else
                 {
-                    // This physically removes all old bundle modules from
-                    // from memory and all old revisions from disk. It only
-                    // maintains the newest version in the bundle cache.
+                    // This removes all old bundle modules from memory and
+                    // all old revisions from disk. It only maintains the
+                    // newest version in the bundle cache.
                     refreshBundle(m_bundle);
                 }
             }