fixed a bug with instance bound dependencies, updated the test to ensure this keeps working from now on
git-svn-id: https://svn.apache.org/repos/asf/felix/trunk@889261 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/dependencymanager/core/src/main/java/org/apache/felix/dm/impl/ServiceImpl.java b/dependencymanager/core/src/main/java/org/apache/felix/dm/impl/ServiceImpl.java
index ee4644a..199aa68 100644
--- a/dependencymanager/core/src/main/java/org/apache/felix/dm/impl/ServiceImpl.java
+++ b/dependencymanager/core/src/main/java/org/apache/felix/dm/impl/ServiceImpl.java
@@ -514,11 +514,11 @@
// now is the time to configure the service, meaning all required
// dependencies will be set and any callbacks called
configureService(state);
+ // flag that our instance has been created
+ m_isInstantiated = true;
// then we invoke the init callback so the service can further initialize
// itself
invoke(init);
- // flag that our instance has been created
- m_isInstantiated = true;
// see if any of this caused further state changes
calculateStateChanges();
}
@@ -563,12 +563,12 @@
synchronized (this) {
destroy = m_callbackDestroy;
}
+ // flag that our instance was destroyed
+ m_isInstantiated = false;
// invoke the destroy callback
invoke(destroy);
// destroy the service instance
destroyService(state);
- // flag that our instance was destroyed
- m_isInstantiated = false;
}
private void invoke(String name) {
diff --git a/dependencymanager/core/src/main/java/org/apache/felix/dm/impl/State.java b/dependencymanager/core/src/main/java/org/apache/felix/dm/impl/State.java
index 1d41521..1f6a2c1 100644
--- a/dependencymanager/core/src/main/java/org/apache/felix/dm/impl/State.java
+++ b/dependencymanager/core/src/main/java/org/apache/felix/dm/impl/State.java
@@ -116,12 +116,16 @@
if (m_stringValue == null) {
// we only need to determine this once, but we do it lazily
StringBuffer buf = new StringBuffer();
- buf.append("State[" + STATES[m_state] + "|");
+ buf.append("State[" + STATES[m_state]);
List deps = m_deps;
for (int i = 0; i < deps.size(); i++) {
+ if (i == 0) {
+ buf.append("|");
+ }
Dependency dep = (Dependency) deps.get(i);
- buf.append("(" + dep + (dep.isRequired() ? " R" : " O") + (dep.isAvailable() ? " +" : " -") + ")");
+ buf.append("(" + (dep.isRequired() ? "Req " : " ") + (dep.isAvailable() ? "Avl " : " ") + (dep.isInstanceBound() ? "InB " : " ") + (dep.isPropagated() ? "Prp " : " ") + dep + ")");
}
+ buf.append("]");
m_stringValue = buf.toString();
}
return m_stringValue;
diff --git a/dependencymanager/test/src/test/java/org/apache/felix/dm/test/AspectTest.java b/dependencymanager/test/src/test/java/org/apache/felix/dm/test/AspectTest.java
index 817861b..306625c 100644
--- a/dependencymanager/test/src/test/java/org/apache/felix/dm/test/AspectTest.java
+++ b/dependencymanager/test/src/test/java/org/apache/felix/dm/test/AspectTest.java
@@ -58,16 +58,17 @@
Service sa = m.createAspectService(ServiceInterface.class, "(|(!(" + Constants.SERVICE_RANKING + "=*))(" + Constants.SERVICE_RANKING + "<=0))", new ServiceAspect(e), new Properties() {{ put(Constants.SERVICE_RANKING, Integer.valueOf(1)); }} );
m.add(sc);
m.add(sp);
- m.add(sp2);
e.waitForStep(3, 2000);
m.add(sa);
e.waitForStep(4, 2000);
- e.step(5);
- e.waitForStep(8, 2000);
+ m.add(sp2);
+ e.waitForStep(5, 2000);
+ e.step(6);
+ e.waitForStep(9, 2000);
m.remove(sa);
- e.waitForStep(10, 2000);
- e.step(11);
- e.waitForStep(12, 2000);
+ e.waitForStep(11, 2000);
+ e.step(12);
+ e.waitForStep(13, 2000);
m.remove(sp2);
m.remove(sp);
m.remove(sc);
@@ -89,7 +90,7 @@
}
public void invoke() {
- m_ensure.step(8);
+ m_ensure.step(9);
}
}
@@ -115,18 +116,19 @@
}
public void init() {
m_service.add(m_manager.createServiceDependency().setInstanceBound(true).setRequired(true).setService(ServiceInterface2.class));
- }
- public void start() {
m_ensure.step(4);
}
+ public void start() {
+ m_ensure.step(5);
+ }
public void invoke(Runnable run) {
- m_ensure.step(6);
+ m_ensure.step(7);
m_originalService.invoke(run);
m_injectedService.invoke();
}
public void stop() {
- m_ensure.step(10);
+ m_ensure.step(11);
}
}
@@ -147,11 +149,11 @@
m_ensure.step(1);
m_service.invoke(Ensure.createRunnableStep(m_ensure, 2));
m_ensure.step(3);
- m_ensure.waitForStep(5, 2000);
- m_service.invoke(Ensure.createRunnableStep(m_ensure, 7));
- m_ensure.step(9);
- m_ensure.waitForStep(11, 2000);
- m_service.invoke(Ensure.createRunnableStep(m_ensure, 12));
+ m_ensure.waitForStep(6, 2000);
+ m_service.invoke(Ensure.createRunnableStep(m_ensure, 8));
+ m_ensure.step(10);
+ m_ensure.waitForStep(12, 2000);
+ m_service.invoke(Ensure.createRunnableStep(m_ensure, 13));
}
}
}
diff --git a/dependencymanager/test/src/test/java/org/apache/felix/dm/test/Ensure.java b/dependencymanager/test/src/test/java/org/apache/felix/dm/test/Ensure.java
index a6b89cb..deb2398 100644
--- a/dependencymanager/test/src/test/java/org/apache/felix/dm/test/Ensure.java
+++ b/dependencymanager/test/src/test/java/org/apache/felix/dm/test/Ensure.java
@@ -18,6 +18,8 @@
*/
package org.apache.felix.dm.test;
+import java.io.PrintStream;
+
import junit.framework.Assert;
/**
@@ -29,6 +31,7 @@
private static final boolean DEBUG = true;
private static long INSTANCE = 0;
private static final int RESOLUTION = 100;
+ private static PrintStream STREAM = System.out;
int step = 0;
public Ensure() {
@@ -37,6 +40,10 @@
}
}
+ public void setStream(PrintStream output) {
+ STREAM = output;
+ }
+
/**
* Mark this point as step <code>nr</code>.
*
@@ -46,7 +53,7 @@
step++;
Assert.assertEquals(nr, step);
if (DEBUG) {
- System.out.println("[Ensure " + INSTANCE + "] step " + step);
+ STREAM.println("[Ensure " + INSTANCE + "] step " + step);
}
notifyAll();
}
@@ -63,7 +70,7 @@
public synchronized void waitForStep(int nr, int timeout) {
final int initialTimeout = timeout;
if (DEBUG) {
- System.out.println("[Ensure " + INSTANCE + "] waiting for step " + nr);
+ STREAM.println("[Ensure " + INSTANCE + "] waiting for step " + nr);
}
while (step < nr && timeout > 0) {
try {
@@ -76,7 +83,7 @@
throw new IllegalStateException("Timed out waiting for " + initialTimeout + " ms for step " + nr + ", we are still at step " + step);
}
if (DEBUG) {
- System.out.println("[Ensure " + INSTANCE + "] arrived at step " + nr);
+ STREAM.println("[Ensure " + INSTANCE + "] arrived at step " + nr);
}
}