Author: marrs
Date: Wed May 26 11:59:56 2010
New Revision: 948403

URL: http://svn.apache.org/viewvc?rev=948403&view=rev
Log:
FELIX-2344 Extended the test case and fixed the bug.

Modified:
    
felix/trunk/dependencymanager/core/src/main/java/org/apache/felix/dm/impl/dependencies/ServiceDependencyImpl.java
    
felix/trunk/dependencymanager/test/src/test/java/org/apache/felix/dm/test/FELIX2344_ExtraDependencyWithCallbackTest.java

Modified: 
felix/trunk/dependencymanager/core/src/main/java/org/apache/felix/dm/impl/dependencies/ServiceDependencyImpl.java
URL: 
http://svn.apache.org/viewvc/felix/trunk/dependencymanager/core/src/main/java/org/apache/felix/dm/impl/dependencies/ServiceDependencyImpl.java?rev=948403&r1=948402&r2=948403&view=diff
==============================================================================
--- 
felix/trunk/dependencymanager/core/src/main/java/org/apache/felix/dm/impl/dependencies/ServiceDependencyImpl.java
 (original)
+++ 
felix/trunk/dependencymanager/core/src/main/java/org/apache/felix/dm/impl/dependencies/ServiceDependencyImpl.java
 Wed May 26 11:59:56 2010
@@ -389,7 +389,11 @@ public class ServiceDependencyImpl exten
             DependencyService ds = (DependencyService) services[i];
             if (makeAvailable) {
                 ds.dependencyAvailable(this);
-                if (!isRequired()) {
+                
+                // only if this service has already been instantiated should 
be attempt to
+                // invoke the callback method, if not, this callback will be 
deferred until
+                // the instance is created (see ServiceImpl.initService())
+                if (ds.getService() != null) {
                     invokeAdded(ds, ref, service);
                 }
             }

Modified: 
felix/trunk/dependencymanager/test/src/test/java/org/apache/felix/dm/test/FELIX2344_ExtraDependencyWithCallbackTest.java
URL: 
http://svn.apache.org/viewvc/felix/trunk/dependencymanager/test/src/test/java/org/apache/felix/dm/test/FELIX2344_ExtraDependencyWithCallbackTest.java?rev=948403&r1=948402&r2=948403&view=diff
==============================================================================
--- 
felix/trunk/dependencymanager/test/src/test/java/org/apache/felix/dm/test/FELIX2344_ExtraDependencyWithCallbackTest.java
 (original)
+++ 
felix/trunk/dependencymanager/test/src/test/java/org/apache/felix/dm/test/FELIX2344_ExtraDependencyWithCallbackTest.java
 Wed May 26 11:59:56 2010
@@ -51,10 +51,15 @@ public class FELIX2344_ExtraDependencyWi
         Ensure e = new Ensure();
         // create a service consumer and provider
         Service sp = m.createService().setInterface(MyService.class.getName(), 
null).setImplementation(MyServiceImpl.class);
-        Service sc = m.createService().setImplementation(new MyClient(e));
+        Service sc = m.createService().setImplementation(new MyClient(e, 
false, 1));
+        Service sc2 = m.createService().setImplementation(new MyClient(e, 
true, 5));
         m.add(sp);
         m.add(sc);
+        m.remove(sc);
         e.waitForStep(4, 5000);
+        m.add(sc2);
+        m.remove(sc2);
+        e.waitForStep(8, 5000);
      }
     
     public interface MyService {
@@ -69,29 +74,33 @@ public class FELIX2344_ExtraDependencyWi
     public static class MyClient {
         MyService m_myService;
         private Ensure m_ensure;
+        private final boolean m_required;
+        private final int m_startStep;
 
-        public MyClient(Ensure e) {
+        public MyClient(Ensure e, boolean required, int startStep) {
             m_ensure = e;
+            m_required = required;
+            m_startStep = startStep;
         }
 
         public void init(DependencyManager dm, Service s) {
-            m_ensure.step(1);
+            m_ensure.step(m_startStep);
             s.add(dm.createServiceDependency()
                 .setInstanceBound(true)
                 .setService(MyService.class)
-                .setRequired(true)
+                .setRequired(m_required)
                 .setCallbacks("bind", null));
         }
 
         void bind(MyService myService) {
-            m_ensure.step(2);
+            m_ensure.step(m_startStep + 1);
             m_myService = myService;
         }
 
         public void start() {
-            m_ensure.step(3);
+            m_ensure.step(m_startStep + 2);
             Assert.assertNotNull("Dependendency should have been injected", 
m_myService);
-            m_ensure.step(4);
+            m_ensure.step(m_startStep + 3);
         }
     }
 }


Reply via email to