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/06/11 17:16:45 UTC

svn commit: r783813 - in /felix/trunk/framework/src/main/java/org/apache/felix/framework: Felix.java util/EventDispatcher.java

Author: rickhall
Date: Thu Jun 11 15:16:35 2009
New Revision: 783813

URL: http://svn.apache.org/viewvc?rev=783813&view=rev
Log:
More corner cases for activation policy. (FELIX-749)

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

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=783813&r1=783812&r2=783813&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 Thu Jun 11 15:16:35 2009
@@ -1411,7 +1411,8 @@
         // Acquire bundle lock.
         try
         {
-            acquireBundleLock(bundle, Bundle.INSTALLED | Bundle.RESOLVED | Bundle.ACTIVE);
+            acquireBundleLock(bundle,
+                Bundle.INSTALLED | Bundle.RESOLVED | Bundle.STARTING | Bundle.ACTIVE);
         }
         catch (IllegalStateException ex)
         {
@@ -1428,6 +1429,8 @@
         }
 
         // Record whether the bundle is using its declared activation policy.
+        boolean wasDeferred = bundle.isDeclaredActivationPolicyUsed()
+            && (bundle.getCurrentModule().getDeclaredActivationPolicy() == IModule.LAZY_ACTIVATION);
         bundle.setDeclaredActivationPolicyUsed(
             (options & Bundle.START_ACTIVATION_POLICY) != 0);
 
@@ -1483,29 +1486,34 @@
                 case Bundle.UNINSTALLED:
                     throw new IllegalStateException("Cannot start an uninstalled bundle.");
                 case Bundle.STARTING:
+                    if (!wasDeferred)
+                    {
+                        throw new BundleException(
+                            "Bundle " + bundle
+                            + " cannot be started, since it is starting.");
+                    }
+                    break;
                 case Bundle.STOPPING:
                     throw new BundleException(
                         "Bundle " + bundle
-                        + " cannot be started, since it is either starting or stopping.");
+                        + " cannot be started, since it is stopping.");
                 case Bundle.ACTIVE:
                     return;
                 case Bundle.INSTALLED:
                     resolveBundle(bundle);
                     // No break.
                 case Bundle.RESOLVED:
+                    // Set the bundle's context.
+                    bundle.setBundleContext(new BundleContextImpl(m_logger, this, bundle));
+                    // At this point, no matter if the bundle's activation policy is
+                    // eager or deferred, we need to set the bundle's state to STARTING.
+                    // We don't fire a BundleEvent here for this state change, since
+                    // STARTING events are only fired if we are invoking the activator,
+                    // which we may not do if activation is deferred.
+                    setBundleStateAndNotify(bundle, Bundle.STARTING);
                     break;
             }
 
-            // Set the bundle's context.
-            bundle.setBundleContext(new BundleContextImpl(m_logger, this, bundle));
-
-            // At this point, no matter if the bundle's activation policy is
-            // eager or deferred, we need to set the bundle's state to STARTING.
-            // We don't fire a BundleEvent here for this state change, since
-            // STARTING events are only fired if we are invoking the activator,
-            // which we may not do if activation is deferred.
-            setBundleStateAndNotify(bundle, Bundle.STARTING);
-
             // If the bundle's activation policy is eager or activation has already
             // been triggered, then activate the bundle immediately.
             if (!bundle.isDeclaredActivationPolicyUsed()
@@ -1550,20 +1558,21 @@
         // Acquire bundle lock.
         try
         {
-            acquireBundleLock(bundle, Bundle.STARTING);
+            acquireBundleLock(bundle, Bundle.STARTING | Bundle.ACTIVE);
         }
         catch (IllegalStateException ex)
         {
             throw new IllegalStateException(
                 "Activation only occurs for bundles in STARTING state.");
         }
+
         try
         {
-            // Check to see if the bundle's start level is greater than the
-            // the framework's active start level.
-            if (bundle.getStartLevel(getInitialBundleStartLevel()) > getActiveStartLevel())
+            // If the bundle is already active or its start level is not met,
+            // simply return.
+            if ((bundle.getState() == Bundle.ACTIVE) ||
+                (bundle.getStartLevel(getInitialBundleStartLevel()) > getActiveStartLevel()))
             {
-                // Ignore persistent starts.
                 return;
             }
 

Modified: felix/trunk/framework/src/main/java/org/apache/felix/framework/util/EventDispatcher.java
URL: http://svn.apache.org/viewvc/felix/trunk/framework/src/main/java/org/apache/felix/framework/util/EventDispatcher.java?rev=783813&r1=783812&r2=783813&view=diff
==============================================================================
--- felix/trunk/framework/src/main/java/org/apache/felix/framework/util/EventDispatcher.java (original)
+++ felix/trunk/framework/src/main/java/org/apache/felix/framework/util/EventDispatcher.java Thu Jun 11 15:16:35 2009
@@ -595,7 +595,6 @@
             syncListeners = m_syncBundleListeners;
         }
 
-System.out.println("+++ FIRING BUNDLE EVENT " + event.getType() + " FROM " + event.getBundle().getSymbolicName());
         // Fire synchronous bundle listeners immediately on the calling thread.
         fireEventImmediately(m_logger, Request.BUNDLE_EVENT, syncListeners, event);