Deferred activation should happen immediately if the bundle has already
defined classes. (FELIX-749)


git-svn-id: https://svn.apache.org/repos/asf/felix/trunk@783121 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/framework/src/main/java/org/apache/felix/framework/Felix.java b/framework/src/main/java/org/apache/felix/framework/Felix.java
index 83d4b79..c2c0a52 100644
--- a/framework/src/main/java/org/apache/felix/framework/Felix.java
+++ b/framework/src/main/java/org/apache/felix/framework/Felix.java
@@ -1481,10 +1481,14 @@
             // Set the bundle's context.
             bundle.setBundleContext(new BundleContextImpl(m_logger, this, bundle));
 
-            if (bundle.getRuntimeActivationPolicy() != IModule.LAZY_ACTIVATION)
+            // If the bundle's activation policy is eager or activation has already
+            // been triggered, then activate the bundle immediately.
+            if ((bundle.getRuntimeActivationPolicy() != IModule.LAZY_ACTIVATION)
+                || ((ModuleImpl) bundle.getCurrentModule()).isActivationTrigger())
             {
                 activateBundle(bundle);
             }
+            // Otherwise, defer bundle activation.
             else
             {
                 setBundleStateAndNotify(bundle, Bundle.STARTING);
diff --git a/framework/src/main/java/org/apache/felix/framework/ModuleImpl.java b/framework/src/main/java/org/apache/felix/framework/ModuleImpl.java
index 22bf794..508693f 100644
--- a/framework/src/main/java/org/apache/felix/framework/ModuleImpl.java
+++ b/framework/src/main/java/org/apache/felix/framework/ModuleImpl.java
@@ -1172,7 +1172,7 @@
         return m_id;
     }
 
-    private synchronized boolean isActivationTrigger()
+    synchronized boolean isActivationTrigger()
     {
         return m_isActivationTriggered;
     }
@@ -1633,7 +1633,7 @@
                     }
 
                     // Perform deferred activation without holding the class loader lock,
-                    // if necessary.
+                    // if the class we are returning is the instigating class.
                     List list = (List) m_local.get();
                     if ((list != null)
                         && (list.size() > 0)