You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by ss...@apache.org on 2014/11/14 18:16:11 UTC

svn commit: r1639705 - in /sling/trunk/testing/mocks/osgi-mock/src: main/java/org/apache/sling/testing/mock/osgi/ test/java/org/apache/sling/testing/mock/osgi/ test/resources/OSGI-INF/

Author: sseifert
Date: Fri Nov 14 17:16:11 2014
New Revision: 1639705

URL: http://svn.apache.org/r1639705
Log:
SLING-4166 OSGi Mock: Support for "modified" SCR lifecycle method

Modified:
    sling/trunk/testing/mocks/osgi-mock/src/main/java/org/apache/sling/testing/mock/osgi/MockOsgi.java
    sling/trunk/testing/mocks/osgi-mock/src/main/java/org/apache/sling/testing/mock/osgi/OsgiMetadataUtil.java
    sling/trunk/testing/mocks/osgi-mock/src/main/java/org/apache/sling/testing/mock/osgi/ReflectionServiceUtil.java
    sling/trunk/testing/mocks/osgi-mock/src/test/java/org/apache/sling/testing/mock/osgi/ReflectionServiceUtilTest.java
    sling/trunk/testing/mocks/osgi-mock/src/test/resources/OSGI-INF/org.apache.sling.testing.mock.osgi.ReflectionServiceUtilTest.xml

Modified: sling/trunk/testing/mocks/osgi-mock/src/main/java/org/apache/sling/testing/mock/osgi/MockOsgi.java
URL: http://svn.apache.org/viewvc/sling/trunk/testing/mocks/osgi-mock/src/main/java/org/apache/sling/testing/mock/osgi/MockOsgi.java?rev=1639705&r1=1639704&r2=1639705&view=diff
==============================================================================
--- sling/trunk/testing/mocks/osgi-mock/src/main/java/org/apache/sling/testing/mock/osgi/MockOsgi.java (original)
+++ sling/trunk/testing/mocks/osgi-mock/src/main/java/org/apache/sling/testing/mock/osgi/MockOsgi.java Fri Nov 14 17:16:11 2014
@@ -19,6 +19,8 @@
 package org.apache.sling.testing.mock.osgi;
 
 import java.util.Dictionary;
+import java.util.Enumeration;
+import java.util.HashMap;
 import java.util.Hashtable;
 import java.util.Map;
 
@@ -226,8 +228,40 @@ public final class MockOsgi {
         return deactivate(target, bundleContext, toDictionary(properties));
     }
 
-    private static Dictionary<String, Object> toDictionary(Map<String, Object> map) {
+    /**
+     * Simulate configuration modification of service instance. Invokes the @Modified annotated method.
+     * @param target Service instance.
+     * @param bundleContext Bundle context
+     * @param properties Properties
+     * @return true if modified method was called. False if it failed.
+     */
+    public static boolean modified(Object target, BundleContext bundleContext, Dictionary<String, Object> properties) {
+        return modified(target, bundleContext, toMap(properties));
+    }
+
+    /**
+     * Simulate configuration modification of service instance. Invokes the @Modified annotated method.
+     * @param target Service instance.
+     * @param bundleContext Bundle context
+     * @param properties Properties
+     * @return true if modified method was called. False if it failed.
+     */
+    public static boolean modified(Object target, BundleContext bundleContext, Map<String, Object> properties) {
+        return ReflectionServiceUtil.modified(target, bundleContext, properties);
+    }
+    
+    static Dictionary<String, Object> toDictionary(Map<String, Object> map) {
         return new Hashtable<String, Object>(map);
     }
 
+    static Map<String, Object> toMap(Dictionary<String, Object> dictionary) {
+        Map<String,Object> map = new HashMap<String, Object>();
+        Enumeration<String> keys = dictionary.keys();
+        while (keys.hasMoreElements()) {
+            String key = keys.nextElement();
+            map.put(key, dictionary.get(key));
+        }
+        return map;
+    }
+
 }

Modified: sling/trunk/testing/mocks/osgi-mock/src/main/java/org/apache/sling/testing/mock/osgi/OsgiMetadataUtil.java
URL: http://svn.apache.org/viewvc/sling/trunk/testing/mocks/osgi-mock/src/main/java/org/apache/sling/testing/mock/osgi/OsgiMetadataUtil.java?rev=1639705&r1=1639704&r2=1639705&view=diff
==============================================================================
--- sling/trunk/testing/mocks/osgi-mock/src/main/java/org/apache/sling/testing/mock/osgi/OsgiMetadataUtil.java (original)
+++ sling/trunk/testing/mocks/osgi-mock/src/main/java/org/apache/sling/testing/mock/osgi/OsgiMetadataUtil.java Fri Nov 14 17:16:11 2014
@@ -178,22 +178,23 @@ final class OsgiMetadataUtil {
     }
 
     public static String getActivateMethodName(Class clazz, Document metadata) {
-        if (metadata != null) {
-            String query = "/components/component[@name='" + clazz.getName() + "']";
-            Node node = queryNode(metadata, query);
-            if (node != null) {
-                return getAttributeValue(node, "activate");
-            }
-        }
-        return null;
+        return getLifecycleMethodName(clazz, metadata, "activate");
     }
 
     public static String getDeactivateMethodName(Class clazz, Document metadata) {
+        return getLifecycleMethodName(clazz, metadata, "deactivate");
+    }
+
+    public static String getModifiedMethodName(Class clazz, Document metadata) {
+        return getLifecycleMethodName(clazz, metadata, "modified");
+    }
+
+    private static String getLifecycleMethodName(Class clazz, Document metadata, String methodName) {
         if (metadata != null) {
             String query = "/components/component[@name='" + clazz.getName() + "']";
             Node node = queryNode(metadata, query);
             if (node != null) {
-                return getAttributeValue(node, "deactivate");
+                return getAttributeValue(node, methodName);
             }
         }
         return null;

Modified: sling/trunk/testing/mocks/osgi-mock/src/main/java/org/apache/sling/testing/mock/osgi/ReflectionServiceUtil.java
URL: http://svn.apache.org/viewvc/sling/trunk/testing/mocks/osgi-mock/src/main/java/org/apache/sling/testing/mock/osgi/ReflectionServiceUtil.java?rev=1639705&r1=1639704&r2=1639705&view=diff
==============================================================================
--- sling/trunk/testing/mocks/osgi-mock/src/main/java/org/apache/sling/testing/mock/osgi/ReflectionServiceUtil.java (original)
+++ sling/trunk/testing/mocks/osgi-mock/src/main/java/org/apache/sling/testing/mock/osgi/ReflectionServiceUtil.java Fri Nov 14 17:16:11 2014
@@ -53,8 +53,7 @@ final class ReflectionServiceUtil {
      * Simulate activation or deactivation of OSGi service instance.
      * @param target Service instance.
      * @param componentContext Component context
-     * @return true if activation method was called. False if such a method did
-     *         not exist.
+     * @return true if activation/deactivation method was called. False if it failed.
      */
     public static boolean activateDeactivate(Object target, ComponentContext componentContext, boolean activate) {
         Class<?> targetClass = target.getClass();
@@ -71,7 +70,7 @@ final class ReflectionServiceUtil {
             return false;
         }
 
-        // try to find matchin activate/deactivate method and execute it
+        // try to find matching activate/deactivate method and execute it
         
         // 1. componentContext
         Method method = getMethod(targetClass, methodName, new Class<?>[] { ComponentContext.class });
@@ -143,7 +142,31 @@ final class ReflectionServiceUtil {
             return true;
         }
         
-        log.warn("Method {}(ComponentContext) not found in class {}", methodName, targetClass.getName());
+        log.warn("Method {} not found in class {}", methodName, targetClass.getName());
+        return false;
+    }
+
+    /**
+     * Simulate modification of configuration of OSGi service instance.
+     * @param target Service instance.
+     * @param properties Updated configuration
+     * @return true if modified method was called. False if it failed.
+     */
+    public static boolean modified(Object target, BundleContext bundleContext, Map<String,Object> properties) {
+        Class<?> targetClass = target.getClass();
+
+        // get method name for activation/deactivation from osgi metadata
+        Document metadata = OsgiMetadataUtil.getMetadata(targetClass);
+        String methodName = OsgiMetadataUtil.getModifiedMethodName(targetClass, metadata);
+        
+        // try to find matching modified method and execute it
+        Method method = getMethod(targetClass, methodName, new Class<?>[] { Map.class });
+        if (method != null) {
+            invokeMethod(target, method, new Object[] { properties });
+            return true;
+        }
+        
+        log.warn("Method {} not found in class {}", methodName, targetClass.getName());
         return false;
     }
 

Modified: sling/trunk/testing/mocks/osgi-mock/src/test/java/org/apache/sling/testing/mock/osgi/ReflectionServiceUtilTest.java
URL: http://svn.apache.org/viewvc/sling/trunk/testing/mocks/osgi-mock/src/test/java/org/apache/sling/testing/mock/osgi/ReflectionServiceUtilTest.java?rev=1639705&r1=1639704&r2=1639705&view=diff
==============================================================================
--- sling/trunk/testing/mocks/osgi-mock/src/test/java/org/apache/sling/testing/mock/osgi/ReflectionServiceUtilTest.java (original)
+++ sling/trunk/testing/mocks/osgi-mock/src/test/java/org/apache/sling/testing/mock/osgi/ReflectionServiceUtilTest.java Fri Nov 14 17:16:11 2014
@@ -45,6 +45,9 @@ import org.osgi.framework.BundleContext;
 import org.osgi.framework.Constants;
 import org.osgi.framework.ServiceReference;
 import org.osgi.service.component.ComponentContext;
+import org.osgi.service.component.annotations.Modified;
+
+import com.google.common.collect.ImmutableMap;
 
 public class ReflectionServiceUtilTest {
 
@@ -85,12 +88,32 @@ public class ReflectionServiceUtilTest {
         List<Map<String, Object>> reference3Configs = service3.getReference3Configs();
         assertEquals(1, reference3Configs.size());
         assertEquals(200, reference3Configs.get(0).get(Constants.SERVICE_RANKING));
-
+        
         assertTrue(MockOsgi.deactivate(service3));
         assertNull(service3.getComponentContext());
     }
 
     @Test
+    public void testService3_Config() {
+        BundleContext bundleContext = MockOsgi.newBundleContext();
+        
+        Map<String,Object> initialProperites = ImmutableMap.<String, Object>of("prop1", "value1");
+
+        Service3 service3 = new Service3();
+        MockOsgi.activate(service3, bundleContext, initialProperites);
+        assertEquals(initialProperites, service3.getConfig());
+        
+        Map<String,Object> newProperties = ImmutableMap.<String, Object>of("prop2", "value2");
+        MockOsgi.modified(service3, bundleContext, newProperties);
+        assertEquals(newProperties, service3.getConfig());
+
+        newProperties = ImmutableMap.<String, Object>of("prop3", "value3");
+        Dictionary<String,Object> newPropertiesDictonary = new Hashtable<String,Object>(newProperties);
+        MockOsgi.modified(service3, bundleContext, newPropertiesDictonary);
+        assertEquals(newProperties, service3.getConfig());
+    }
+    
+    @Test
     public void testService4() {
         Service4 service4 = new Service4();
 
@@ -144,16 +167,24 @@ public class ReflectionServiceUtilTest {
         private List<Map<String, Object>> reference3Configs = new ArrayList<Map<String, Object>>();
 
         private ComponentContext componentContext;
+        private Map<String, Object> config;
 
+        @SuppressWarnings("unchecked")
         @Activate
         private void activate(ComponentContext ctx) {
             this.componentContext = ctx;
+            this.config = MockOsgi.toMap(ctx.getProperties());
         }
 
         @Deactivate
         private void deactivate(ComponentContext ctx) {
             this.componentContext = null;
         }
+        
+        @Modified
+        private void modified(Map<String,Object> newConfig) {
+            this.config = newConfig;
+        }
 
         public ServiceInterface1 getReference1() {
             return this.reference1;
@@ -178,6 +209,10 @@ public class ReflectionServiceUtilTest {
         public ComponentContext getComponentContext() {
             return this.componentContext;
         }
+        
+        public Map<String, Object> getConfig() {
+            return config;
+        }
 
         protected void bindReference1(ServiceInterface1 service) {
             reference1 = service;

Modified: sling/trunk/testing/mocks/osgi-mock/src/test/resources/OSGI-INF/org.apache.sling.testing.mock.osgi.ReflectionServiceUtilTest.xml
URL: http://svn.apache.org/viewvc/sling/trunk/testing/mocks/osgi-mock/src/test/resources/OSGI-INF/org.apache.sling.testing.mock.osgi.ReflectionServiceUtilTest.xml?rev=1639705&r1=1639704&r2=1639705&view=diff
==============================================================================
--- sling/trunk/testing/mocks/osgi-mock/src/test/resources/OSGI-INF/org.apache.sling.testing.mock.osgi.ReflectionServiceUtilTest.xml (original)
+++ sling/trunk/testing/mocks/osgi-mock/src/test/resources/OSGI-INF/org.apache.sling.testing.mock.osgi.ReflectionServiceUtilTest.xml Fri Nov 14 17:16:11 2014
@@ -17,7 +17,7 @@
     <property name="service.ranking" type="Integer" value="200"/>
     <property name="service.pid" value="org.apache.sling.testing.mock.osgi.ReflectionServiceUtilTest$Service2"/>
   </scr:component>
-  <scr:component name="org.apache.sling.testing.mock.osgi.ReflectionServiceUtilTest$Service3" activate="activate" deactivate="deactivate">
+  <scr:component name="org.apache.sling.testing.mock.osgi.ReflectionServiceUtilTest$Service3" activate="activate" deactivate="deactivate" modified="modified">
     <implementation class="org.apache.sling.testing.mock.osgi.ReflectionServiceUtilTest$Service3"/>
     <property name="service.pid" value="org.apache.sling.testing.mock.osgi.ReflectionServiceUtilTest$Service3"/>
     <reference name="reference2" interface="org.apache.sling.testing.mock.osgi.ReflectionServiceUtilTest$ServiceInterface2" cardinality="1..n" policy="static" bind="bindReference2" unbind="unbindReference2"/>