Extended the test to include a second consumer that uses a dynamic proxy in its implementation.

git-svn-id: https://svn.apache.org/repos/asf/felix/trunk@954773 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/dependencymanager/test/src/test/java/org/apache/felix/dm/test/ResourceDependencyTest.java b/dependencymanager/test/src/test/java/org/apache/felix/dm/test/ResourceDependencyTest.java
index 51441b3..2af35b9 100644
--- a/dependencymanager/test/src/test/java/org/apache/felix/dm/test/ResourceDependencyTest.java
+++ b/dependencymanager/test/src/test/java/org/apache/felix/dm/test/ResourceDependencyTest.java
@@ -24,6 +24,9 @@
 
 import java.io.IOException;
 import java.io.InputStream;
+import java.lang.reflect.InvocationHandler;
+import java.lang.reflect.Method;
+import java.lang.reflect.Proxy;
 import java.util.Dictionary;
 import java.util.HashMap;
 import java.util.Map;
@@ -65,13 +68,43 @@
         Ensure e = new Ensure();
         // create a service provider and consumer
         ResourceConsumer c = new ResourceConsumer();
-        Service consumer = m.createService().setImplementation(c).add(m.createResourceDependency().setFilter("(&(path=/test)(name=*.txt)(repository=TestRepository))").setCallbacks("add", "remove"));
-        Service resourceProvider = m.createService().setImplementation(new ResourceProvider(e)).add(m.createServiceDependency().setService(ResourceHandler.class).setCallbacks("add", "remove"));
+        Service consumer = m.createService()
+            .setImplementation(c)
+            .add(m.createResourceDependency()
+                .setFilter("(&(path=/test)(name=*.txt)(repository=TestRepository))")
+                .setCallbacks("add", "remove"));
+        Service dynamicProxyConsumer = m.createService()
+            .setFactory(new ResourceConsumerFactory(e), "create")
+            .add(m.createResourceDependency()
+                    .setFilter("(name=*.doc)")
+                    .setCallbacks("add", null)); 
+        Service resourceProvider = m.createService()
+            .setImplementation(new ResourceProvider(e))
+            .add(m.createServiceDependency()
+                .setService(ResourceHandler.class)
+                .setCallbacks("add", "remove"));
+        
+        // first add the consumer
         m.add(consumer);
+        // then the resource provider, which will provide 3 resources,
+        // 2 of which match the consumers filter conditions
         m.add(resourceProvider);
+        // make sure our consumer invoked openStream() on both resources,
+        // increasing the step counter to 2
         e.step(3);
+        
+        // now add another consumer, that matches only one resource, and uses
+        // a dynamic proxy as its implementation
+        m.add(dynamicProxyConsumer);
+        // ensure the resource was injected properly
+        e.waitForStep(4, 5000);
+        
+        // cleanup
+        m.remove(dynamicProxyConsumer);
         m.remove(resourceProvider);
         m.remove(consumer);
+        
+        // validate that all consumed resources are "unconsumed" again
         c.ensure();
     }
     
@@ -214,4 +247,36 @@
             return null;
         }
     }
+    
+    static class ResourceConsumerFactory {
+        private final Ensure m_ensure;
+        public ResourceConsumerFactory(Ensure ensure) {
+            m_ensure = ensure;
+        }
+        public Object create() {
+            System.out.println("create");
+            ResourceConsumer resourceConsumer = new ResourceConsumer();
+            // create a dynamic proxy for the ResourceProvider
+            return Proxy.newProxyInstance(resourceConsumer.getClass().getClassLoader(), resourceConsumer.getClass().getInterfaces(), new DynamicProxyHandler(resourceConsumer, m_ensure));
+        }
+    }
+
+    static class DynamicProxyHandler implements InvocationHandler {
+        Ensure m_ensure;
+        ResourceConsumer resourceConsumer = null;
+        
+        public DynamicProxyHandler(ResourceConsumer resourceConsumer, Ensure ensure) {
+            this.resourceConsumer = resourceConsumer;
+            m_ensure = ensure;
+        }
+
+        public void add(Resource resource) {
+            m_ensure.step(4);
+            System.out.println("Add resource: " + resource);
+        }
+
+        public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
+            return method.invoke(resourceConsumer, args);
+        }
+    } 
 }