[ 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)