You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@felix.apache.org by pd...@apache.org on 2014/10/25 15:07:19 UTC

svn commit: r1634221 - in /felix/sandbox/pderop/dependencymanager-prototype: org.apache.felix.dependencymanager.itest/src/org/apache/felix/dm/itest/ org.apache.felix.dependencymanager/src/org/apache/felix/dm/impl/

Author: pderop
Date: Sat Oct 25 13:07:19 2014
New Revision: 1634221

URL: http://svn.apache.org/r1634221
Log:
FELIX-4680 - Add more DM ServiceDependency callback.

Added:
    felix/sandbox/pderop/dependencymanager-prototype/org.apache.felix.dependencymanager.itest/src/org/apache/felix/dm/itest/ServiceDependencyCallbackSignaturesTest.java
Modified:
    felix/sandbox/pderop/dependencymanager-prototype/org.apache.felix.dependencymanager/src/org/apache/felix/dm/impl/ServiceDependencyImpl.java

Added: felix/sandbox/pderop/dependencymanager-prototype/org.apache.felix.dependencymanager.itest/src/org/apache/felix/dm/itest/ServiceDependencyCallbackSignaturesTest.java
URL: http://svn.apache.org/viewvc/felix/sandbox/pderop/dependencymanager-prototype/org.apache.felix.dependencymanager.itest/src/org/apache/felix/dm/itest/ServiceDependencyCallbackSignaturesTest.java?rev=1634221&view=auto
==============================================================================
--- felix/sandbox/pderop/dependencymanager-prototype/org.apache.felix.dependencymanager.itest/src/org/apache/felix/dm/itest/ServiceDependencyCallbackSignaturesTest.java (added)
+++ felix/sandbox/pderop/dependencymanager-prototype/org.apache.felix.dependencymanager.itest/src/org/apache/felix/dm/itest/ServiceDependencyCallbackSignaturesTest.java Sat Oct 25 13:07:19 2014
@@ -0,0 +1,168 @@
+package org.apache.felix.dm.itest;
+
+import java.util.Dictionary;
+import java.util.Hashtable;
+import java.util.Map;
+
+import junit.framework.Assert;
+
+import org.apache.felix.dm.Component;
+import org.apache.felix.dm.DependencyManager;
+import org.osgi.framework.ServiceReference;
+
+@SuppressWarnings("unused")
+public class ServiceDependencyCallbackSignaturesTest extends TestBase {
+    volatile Ensure m_ensure;
+    
+    /**
+     * Tests if all possible dependency callbacks signatures supported by ServiceDependency.
+     */
+    public void testDependencyCallbackSignatures() {
+        DependencyManager m = getDM();
+        m_ensure = new Ensure();    
+        Hashtable<String, String> props = new Hashtable<>();
+        props.put("foo", "bar");
+        Component provider = m.createComponent()
+            .setImplementation(new ProviderImpl()).setInterface(Provider.class.getName(), props);
+        
+        declareConsumer(m, new Object() {
+            void bind(Component c, ServiceReference ref, Provider provider) {
+                Assert.assertNotNull(c);
+                Assert.assertNotNull(ref);
+                Assert.assertNotNull(provider);
+                Assert.assertEquals("bar", ref.getProperty("foo"));
+                Assert.assertEquals(context.getService(ref), provider);
+                m_ensure.step();
+            }
+        });
+        declareConsumer(m, new Object() {
+            void bind(Component c, ServiceReference ref, Object provider) {
+                Assert.assertNotNull(c);
+                Assert.assertNotNull(ref);
+                Assert.assertEquals("bar", ref.getProperty("foo"));
+                Assert.assertNotNull(provider);
+                Assert.assertEquals(context.getService(ref), provider);
+                m_ensure.step();
+            }
+        });
+        declareConsumer(m, new Object() {
+            void bind(Component c, ServiceReference ref) {
+                Assert.assertNotNull(c);
+                Assert.assertNotNull(ref);
+                Assert.assertEquals("bar", ref.getProperty("foo"));
+                Assert.assertNotNull(context.getService(ref));
+                Assert.assertEquals(context.getService(ref).getClass(), ProviderImpl.class);
+                m_ensure.step();
+            }
+        });
+        declareConsumer(m, new Object() {
+            void bind(Component c, Provider provider) {
+                Assert.assertNotNull(c);
+                Assert.assertNotNull(provider);
+                m_ensure.step();
+            }
+        });
+        declareConsumer(m, new Object() {
+            void bind(Component c, Object provider) {
+                Assert.assertNotNull(c);
+                Assert.assertNotNull(provider);
+                Assert.assertEquals(provider.getClass(), ProviderImpl.class);
+                m_ensure.step();
+            }
+        });
+        declareConsumer(m, new Object() {
+            void bind(Component c) {
+                Assert.assertNotNull(c);
+                m_ensure.step();
+            }
+        });
+        declareConsumer(m, new Object() {
+            void bind(Component c, Map<String, String> props, Provider provider) {
+                Assert.assertNotNull(c);
+                Assert.assertNotNull(props);
+                Assert.assertNotNull(provider);
+                Assert.assertEquals("bar", props.get("foo"));
+                Assert.assertEquals(provider.getClass(), ProviderImpl.class);
+                m_ensure.step();
+            }
+        });
+        declareConsumer(m, new Object() {
+            void bind(ServiceReference ref, Provider provider) {
+                Assert.assertNotNull(ref);
+                Assert.assertNotNull(provider);
+                Assert.assertEquals("bar", ref.getProperty("foo"));
+                m_ensure.step();
+            }
+        });
+        declareConsumer(m, new Object() {
+            void bind(ServiceReference ref, Object provider) {
+                Assert.assertNotNull(ref);
+                Assert.assertNotNull(provider);
+                Assert.assertEquals("bar", ref.getProperty("foo"));
+                Assert.assertEquals(provider.getClass(), ProviderImpl.class);
+                m_ensure.step();
+            }
+        });
+        declareConsumer(m, new Object() {
+            void bind(ServiceReference ref) {
+                Assert.assertNotNull(ref);
+                Assert.assertEquals("bar", ref.getProperty("foo"));
+                m_ensure.step();
+            }
+        });
+        declareConsumer(m, new Object() {
+            void bind(Provider provider) {
+                Assert.assertNotNull(provider);
+                m_ensure.step();
+            }
+        });
+        declareConsumer(m, new Object() {
+            void bind(Provider provider, Map<?, ?> props) {
+                Assert.assertNotNull(provider);
+                Assert.assertEquals("bar", props.get("foo"));
+                m_ensure.step();
+            }
+        });
+        declareConsumer(m, new Object() {
+            void bind(Map<?, ?> props, Provider provider) {
+                Assert.assertNotNull(provider);
+                Assert.assertEquals("bar", props.get("foo"));
+                m_ensure.step();
+            }
+        });
+        declareConsumer(m, new Object() {
+            void bind(Provider provider, Dictionary<?, ?> props) {
+                Assert.assertNotNull(provider);
+                Assert.assertEquals("bar", props.get("foo"));
+                m_ensure.step();
+            }
+        });
+        declareConsumer(m, new Object() {
+            void bind(Dictionary<?, ?> props, Provider provider) {
+                Assert.assertNotNull(provider);
+                Assert.assertEquals("bar", props.get("foo"));
+                m_ensure.step();
+            }
+        });
+        declareConsumer(m, new Object() {
+            void bind(Object provider) {
+                Assert.assertNotNull(provider);
+                Assert.assertEquals(provider.getClass(), ProviderImpl.class);
+                m_ensure.step();
+            }
+        });
+
+        m.add(provider);
+        m_ensure.waitForStep(16, 5000);
+    }
+    
+    private void declareConsumer(DependencyManager m, Object consumerImpl) {
+        Component consumer = m.createComponent().setImplementation(consumerImpl)
+            .add(m.createServiceDependency().setService(Provider.class).setCallbacks("bind", "change", "unbind").setRequired(true));
+        m.add(consumer);
+    }
+
+    public static interface Provider {}
+    
+    public static class ProviderImpl implements Provider {}   
+}

Modified: felix/sandbox/pderop/dependencymanager-prototype/org.apache.felix.dependencymanager/src/org/apache/felix/dm/impl/ServiceDependencyImpl.java
URL: http://svn.apache.org/viewvc/felix/sandbox/pderop/dependencymanager-prototype/org.apache.felix.dependencymanager/src/org/apache/felix/dm/impl/ServiceDependencyImpl.java?rev=1634221&r1=1634220&r2=1634221&view=diff
==============================================================================
--- felix/sandbox/pderop/dependencymanager-prototype/org.apache.felix.dependencymanager/src/org/apache/felix/dm/impl/ServiceDependencyImpl.java (original)
+++ felix/sandbox/pderop/dependencymanager-prototype/org.apache.felix.dependencymanager/src/org/apache/felix/dm/impl/ServiceDependencyImpl.java Sat Oct 25 13:07:19 2014
@@ -257,38 +257,46 @@ public class ServiceDependencyImpl exten
 	@Override
 	public void invoke(String method, Event e, Object[] instances) {
 		ServiceEventImpl se = (ServiceEventImpl) e;
+		ServicePropertiesMap propertiesMap = new ServicePropertiesMap(se.getReference());
+		Dictionary<?,?> properties = se.getProperties();
 		m_component.invokeCallbackMethod(instances, method,
 		    new Class[][]{
-            {Component.class, ServiceReference.class, m_trackedServiceName},
-            {Component.class, ServiceReference.class, Object.class}, 
-            {Component.class, ServiceReference.class},
-            {Component.class, m_trackedServiceName}, 
-            {Component.class, Object.class}, 
-            {Component.class},
-            {Component.class, Map.class, m_trackedServiceName},
-            {ServiceReference.class, m_trackedServiceName},
-            {ServiceReference.class, Object.class}, 
-            {ServiceReference.class},
-            {m_trackedServiceName}, 
-            {Object.class}, 
-            {},
-            {Map.class, m_trackedServiceName}}, 
+                {Component.class, ServiceReference.class, m_trackedServiceName},
+                {Component.class, ServiceReference.class, Object.class}, 
+                {Component.class, ServiceReference.class},
+                {Component.class, m_trackedServiceName}, 
+                {Component.class, Object.class}, 
+                {Component.class},
+                {Component.class, Map.class, m_trackedServiceName},
+                {ServiceReference.class, m_trackedServiceName},
+                {ServiceReference.class, Object.class}, 
+                {ServiceReference.class},
+                {m_trackedServiceName}, 
+                {m_trackedServiceName, Map.class}, 
+                {Map.class, m_trackedServiceName}, 
+                {m_trackedServiceName, Dictionary.class}, 
+                {Dictionary.class, m_trackedServiceName}, 
+                {Object.class}, 
+                {}},
             
             new Object[][]{
-		    {m_component, se.getReference(), se.getEvent()},
-            {m_component, se.getReference(), se.getEvent()}, 
-            {m_component, se.getReference()}, 
-            {m_component, se.getEvent()},
-            {m_component, se.getEvent()},
-            {m_component},
-            {m_component, new ServicePropertiesMap(se.getReference()), se.getEvent()},
-            {se.getReference(), se.getEvent()},
-            {se.getReference(), se.getEvent()}, 
-            {se.getReference()}, 
-            {se.getEvent()}, 
-            {se.getEvent()}, 
-            {},
-            {new ServicePropertiesMap(se.getReference()), se.getEvent()}}
+		        {m_component, se.getReference(), se.getEvent()},
+		        {m_component, se.getReference(), se.getEvent()}, 
+		        {m_component, se.getReference()}, 
+		        {m_component, se.getEvent()},
+		        {m_component, se.getEvent()},
+		        {m_component},
+		        {m_component, propertiesMap, se.getEvent()},
+		        {se.getReference(), se.getEvent()},
+		        {se.getReference(), se.getEvent()}, 
+		        {se.getReference()}, 
+		        {se.getEvent()}, 
+		        {se.getEvent(), propertiesMap},
+		        {propertiesMap, se.getEvent()},
+                {se.getEvent(), properties},
+                {properties, se.getEvent()},
+                {se.getEvent()}, 
+		        {}}
 		);
 	}