Author: pderop
Date: Fri Jun 11 06:02:07 2010
New Revision: 953572
URL: http://svn.apache.org/viewvc?rev=953572&view=rev
Log:
Accumulate all extra dependencies defined from init() method, before
calculating state changes.
Start extra/required dependencies from the activateService method.
Configure service with extra dependencies from the bindService method.
Modified:
felix/trunk/dependencymanager/core/src/main/java/org/apache/felix/dm/impl/ServiceImpl.java
Modified:
felix/trunk/dependencymanager/core/src/main/java/org/apache/felix/dm/impl/ServiceImpl.java
URL:
http://svn.apache.org/viewvc/felix/trunk/dependencymanager/core/src/main/java/org/apache/felix/dm/impl/ServiceImpl.java?rev=953572&r1=953571&r2=953572&view=diff
==============================================================================
---
felix/trunk/dependencymanager/core/src/main/java/org/apache/felix/dm/impl/ServiceImpl.java
(original)
+++
felix/trunk/dependencymanager/core/src/main/java/org/apache/felix/dm/impl/ServiceImpl.java
Fri Jun 11 06:02:07 2010
@@ -228,6 +228,17 @@ public class ServiceImpl implements Serv
oldState = m_state;
m_dependencies.add(dependency);
}
+
+ if (dependency.isInstanceBound()) {
+ // At this point: this dependency is added from init(): but we
don't want to start it now,
+ // because if we start it, and if the required dependency is
available, then the service.start()
+ // method will be called, and this is a problem if a further
+ // required (but unavailable) dependency is then added again from
the init() method ...
+ // Once the init() method will return, the activateService method
will then calculate the state changes,
+ // but at this point, all added extra-dependencies will be known.
+ return this;
+ }
+
if (oldState.isAllRequiredAvailable() ||
(oldState.isWaitingForRequiredInstantiated() && dependency.isRequired()) ||
(oldState.isWaitingForRequired() && dependency.isRequired())) {
((DependencyActivation) dependency).start(this);
}
@@ -529,17 +540,31 @@ public class ServiceImpl implements Serv
// then we invoke the init callback so the service can further
initialize
// itself
invoke(init);
+ // start extra/required dependencies which might have been added from
the init() method.
+ startExtraRequiredDependencies();
// see if any of this caused further state changes
calculateStateChanges();
}
+ private void startExtraRequiredDependencies() {
+ Iterator i = m_dependencies.iterator();
+ while (i.hasNext()) {
+ Dependency dependency = (Dependency) i.next();
+ if (dependency.isInstanceBound() && dependency.isRequired()) {
+ // Optional extra dependencies will be started later, once our
service is started.
+ ((DependencyActivation) dependency).start(this);
+ }
+ }
+ }
+
private void bindService(State state) {
String start;
synchronized (this) {
start = m_callbackStart;
}
- // configure the service again, because init() might have added more
dependencies
- configureService(state);
+
+ // configure service with extra-dependencies which might have been
added from init() method.
+ configureServiceWithExtraDependencies(state);
// inform the state listeners we're starting
stateListenersStarting();
// invoke the start callback, since we're now ready to be used
@@ -552,6 +577,20 @@ public class ServiceImpl implements Serv
stateListenersStarted();
}
+ private void configureServiceWithExtraDependencies(State state)
+ {
+ Iterator i = state.getDependencies().iterator();
+ while (i.hasNext()) {
+ Dependency dependency = (Dependency) i.next();
+ if (dependency.isAutoConfig() && dependency.isInstanceBound()) {
+ configureImplementation(dependency.getAutoConfigType(),
dependency.getAutoConfigInstance(), dependency.getAutoConfigName());
+ }
+ if (dependency.isRequired() && dependency.isInstanceBound()) {
+ dependency.invokeAdded(this);
+ }
+ }
+ }
+
private void unbindService(State state) {
String stop;
synchronized (this) {