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);
         }
     }