[ 
https://issues.apache.org/jira/browse/FELIX-4598?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=14087354#comment-14087354
 ] 

Tuomas Kiviaho commented on FELIX-4598:
---------------------------------------

I dumped my patch here because JIRA prevents attachments from closed issues
{code}
Index: src/org/apache/felix/dm/impl/dependencies/BundleDependencyImpl.java
===================================================================
--- src/org/apache/felix/dm/impl/dependencies/BundleDependencyImpl.java 
(revision 1546540)
+++ src/org/apache/felix/dm/impl/dependencies/BundleDependencyImpl.java 
(working copy)
@@ -31,6 +31,7 @@
 import org.apache.felix.dm.InvocationUtil;
 import org.apache.felix.dm.impl.DefaultNullObject;
 import org.apache.felix.dm.impl.Logger;
+import org.apache.felix.dm.impl.SerialExecutor;
 import org.apache.felix.dm.tracker.BundleTracker;
 import org.apache.felix.dm.tracker.BundleTrackerCustomizer;
 import org.osgi.framework.Bundle;
@@ -54,7 +55,6 @@
     private String m_callbackChanged;
     private String m_callbackRemoved;
     private boolean m_autoConfig;
-       private Bundle m_bundleInstance;
        private Filter m_filter;
        private long m_bundleId = -1;
        private String m_autoConfigInstance;
@@ -63,11 +63,13 @@
     private boolean m_propagate;
     private Object m_propagateCallbackInstance;
     private String m_propagateCallbackMethod;
+    private SerialExecutor m_executor;
 
     public BundleDependencyImpl(BundleContext context, Logger logger) {
         super(logger);
                m_context = context;
                m_autoConfig = true;
+        m_executor = new SerialExecutor(logger);
        }
     
     public BundleDependencyImpl(BundleDependencyImpl prototype) {
@@ -76,7 +78,6 @@
         m_autoConfig = prototype.m_autoConfig;
         m_stateMask = prototype.m_stateMask;
         m_nullObject = prototype.m_nullObject;
-        m_bundleInstance = prototype.m_bundleInstance;
         m_filter = prototype.m_filter;
         m_bundleId = prototype.m_bundleId;
         m_propagate = prototype.m_propagate;
@@ -85,6 +86,7 @@
         m_callbackChanged = prototype.m_callbackChanged;
         m_callbackRemoved = prototype.m_callbackRemoved;
         m_autoConfigInstance = prototype.m_autoConfigInstance;
+        m_executor = prototype.m_executor;
     }
     
     public Dependency createCopy() {
@@ -447,15 +449,40 @@
         return Bundle.class;
     }
 
-    public void invokeAdded(DependencyService service) {
-        // we remember these for future reference, needed for required service 
callbacks
-        m_bundleInstance = lookupBundle();
-        invokeAdded(service, m_bundleInstance);
+    public void invokeAdded(final DependencyService service) {
+        Runnable task = new Runnable() {
+
+            @Override
+            public void run() {
+                Bundle[] bundles = m_tracker.getBundles();
+                if (bundles != null) {
+                    for (int i = 0; i < bundles.length; i++) {
+                        Bundle bundle = bundles[i];
+                        invokeAdded(service, bundle);
+                    }
+                } 
+            }
+            
+        };
+        m_executor.execute(task);
     }
 
-    public void invokeRemoved(DependencyService service) {
-        invokeRemoved(service, m_bundleInstance);
-        m_bundleInstance = null;
+    public void invokeRemoved(final DependencyService service) {
+        Runnable task = new Runnable() {
+
+            @Override
+            public void run() {
+                Bundle[] bundles = m_tracker.getBundles();
+                if (bundles != null) {
+                    for (int i = 0; i < bundles.length; i++) {
+                        Bundle bundle = bundles[i];
+                        invokeRemoved(service, bundle);
+                    }
+                } 
+            }
+            
+        };
+        m_executor.execute(task);
     }
     
     public BundleDependency setPropagate(boolean propagate) {

{code}

> BundleDependency can effectively track only one bundle
> ------------------------------------------------------
>
>                 Key: FELIX-4598
>                 URL: https://issues.apache.org/jira/browse/FELIX-4598
>             Project: Felix
>          Issue Type: Bug
>          Components: Dependency Manager
>    Affects Versions: dependencymanager.runtime-3.2.0
>            Reporter: Tuomas Kiviaho
>
> Bundles are delivered to callbacks after component is instantiated but prior 
> to that they can't be. This is the case with ServiceDependencies as well but 
> unlike them after component instantiation the tracker is not used as source 
> of bundles but instead lookup method is used. {{ServiceDependencyImpl}} uses 
> this approach only to gain properties and auto configuration instance.
> I suggest that {{BundleDependencyImpl#invokeAdded(DependencyService 
> service)}} would be implemented in similar manner that 
> {{ServiceDependencyImpl#invokeAdded(DependencyService service)}} has been 
> (perhaps also utilizing the serial executor) .



--
This message was sent by Atlassian JIRA
(v6.2#6252)

Reply via email to