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