This is an automated email from the ASF dual-hosted git repository.

rombert pushed a commit to annotated tag 
org.apache.sling.testing.osgi-mock-2.0.0
in repository 
https://gitbox.apache.org/repos/asf/sling-org-apache-sling-testing-osgi-mock.git

commit eb580c37ebd52ad0f540f7e9928d8e279eda7cd0
Author: Stefan Seifert <[email protected]>
AuthorDate: Tue Nov 24 11:00:48 2015 +0000

    SLING-5327 refactor and unify lifecycle method handling (and fix missing 
argument variants for modified methods - should support the same as the 
activate method)
    
    git-svn-id: 
https://svn.apache.org/repos/asf/sling/trunk/testing/mocks/osgi-mock@1716103 
13f79535-47bb-0310-9956-ffa450edef68
---
 .../apache/sling/testing/mock/osgi/MockOsgi.java   |   3 +-
 .../sling/testing/mock/osgi/OsgiServiceUtil.java   | 112 +++++++++++++--------
 2 files changed, 70 insertions(+), 45 deletions(-)

diff --git a/src/main/java/org/apache/sling/testing/mock/osgi/MockOsgi.java 
b/src/main/java/org/apache/sling/testing/mock/osgi/MockOsgi.java
index cf2452a..4834647 100644
--- a/src/main/java/org/apache/sling/testing/mock/osgi/MockOsgi.java
+++ b/src/main/java/org/apache/sling/testing/mock/osgi/MockOsgi.java
@@ -215,7 +215,8 @@ public final class MockOsgi {
      */
     public static boolean modified(Object target, BundleContext bundleContext, 
Map<String, Object> properties) {
         Map<String, Object> mergedProperties = 
propertiesMergeWithOsgiMetadata(target, getConfigAdmin(bundleContext), 
properties);
-        return OsgiServiceUtil.modified(target, bundleContext, 
mergedProperties);
+        ComponentContext componentContext = newComponentContext(bundleContext, 
mergedProperties);
+        return OsgiServiceUtil.modified(target, componentContext, 
mergedProperties);
     }
     
     /**
diff --git 
a/src/main/java/org/apache/sling/testing/mock/osgi/OsgiServiceUtil.java 
b/src/main/java/org/apache/sling/testing/mock/osgi/OsgiServiceUtil.java
index 3e22353..e05a15c 100644
--- a/src/main/java/org/apache/sling/testing/mock/osgi/OsgiServiceUtil.java
+++ b/src/main/java/org/apache/sling/testing/mock/osgi/OsgiServiceUtil.java
@@ -80,7 +80,61 @@ final class OsgiServiceUtil {
         }
 
         // try to find matching activate/deactivate method and execute it
+        if (invokeLifecycleMethod(target, targetClass, methodName, !activate, 
+                componentContext, 
MapUtil.toMap(componentContext.getProperties()))) {
+            return true;
+        }
+        
+        if (fallbackDefaultName) {
+            return false;
+        }
         
+        throw new RuntimeException("No matching " + (activate ? "activation" : 
"deactivation") + " method with name '" + methodName + "' "
+                + " found in class " + targetClass.getName());
+    }
+
+    /**
+     * 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, ComponentContext 
componentContext, Map<String,Object> properties) {
+        Class<?> targetClass = target.getClass();
+
+        // get method name for activation/deactivation from osgi metadata
+        OsgiMetadata metadata = OsgiMetadataUtil.getMetadata(targetClass);
+        if (metadata == null) {
+            throw new NoScrMetadataException(targetClass);
+        }
+        String methodName = metadata.getModifiedMethodName();
+        if (StringUtils.isEmpty(methodName)) {
+            return false;
+        }
+        
+        // try to find matching modified method and execute it
+        if (invokeLifecycleMethod(target, targetClass, methodName, false, 
componentContext, properties)) {
+            return true;
+        }
+
+        throw new RuntimeException("No matching modified method with name '" + 
methodName + "' "
+                + " found in class " + targetClass.getName());
+    }
+    
+    /**
+     * Invokes a lifecycle method (activation, deactivation or modified) with 
variable method arguments.
+     * @param target Target object
+     * @param targetClass Target object class
+     * @param methodName Method name
+     * @param allowIntegerArgument Allow int or Integer as arguments (only 
decactivate)
+     * @param componentContext Component context
+     * @param properties Component properties
+     * @return true if a method was found and invoked
+     */
+    private static boolean invokeLifecycleMethod(Object target, Class<?> 
targetClass, 
+            String methodName, boolean allowIntegerArgument,
+            ComponentContext componentContext, Map<String,Object> properties) {
+
         // 1. componentContext
         Method method = getMethod(targetClass, methodName, new Class<?>[] { 
ComponentContext.class });
         if (method != null) {
@@ -102,8 +156,11 @@ final class OsgiServiceUtil {
             return true;
         }
         
-        // 4. int (deactivation only)
-        if (!activate) {
+        // 4. Component property type (annotation lass)
+        // TODO: implement
+        
+        // 5. int (deactivation only)
+        if (allowIntegerArgument) {
             method = getMethod(targetClass, methodName, new Class<?>[] { 
int.class });
             if (method != null) {
                 invokeMethod(target, method, new Object[] { 0 });
@@ -111,8 +168,8 @@ final class OsgiServiceUtil {
             }
         }
         
-        // 5. Integer (deactivation only)
-        if (!activate) {
+        // 6. Integer (deactivation only)
+        if (allowIntegerArgument) {
             method = getMethod(targetClass, methodName, new Class<?>[] { 
Integer.class });
             if (method != null) {
                 invokeMethod(target, method, new Object[] { 0 });
@@ -120,9 +177,10 @@ final class OsgiServiceUtil {
             }
         }
         
-        // 6. mixed arguments of componentContext, bundleContext and map
-        Class<?>[] mixedArgsAllowed = activate ? new Class<?>[] { 
ComponentContext.class, BundleContext.class, Map.class }
-                : new Class<?>[] { ComponentContext.class, 
BundleContext.class, Map.class, int.class, Integer.class };
+        // 7. mixed arguments
+        Class<?>[] mixedArgsAllowed = allowIntegerArgument ?
+                new Class<?>[] { ComponentContext.class, BundleContext.class, 
Map.class, int.class, Integer.class }
+                : new Class<?>[] { ComponentContext.class, 
BundleContext.class, Map.class };
         method = getMethodWithAnyCombinationArgs(targetClass, methodName, 
mixedArgsAllowed);
         if (method != null) {
             Object[] args = new Object[method.getParameterTypes().length];
@@ -144,48 +202,14 @@ final class OsgiServiceUtil {
             return true;
         }
 
-        // 7. noargs
+        // 8. noargs
         method = getMethod(targetClass, methodName, new Class<?>[0]);
         if (method != null) {
             invokeMethod(target, method, new Object[0]);
             return true;
-        }
+        }        
         
-        if (fallbackDefaultName) {
-            return false;
-        }
-        throw new RuntimeException("No matching " + (activate ? "activation" : 
"deactivation") + " method with name '" + methodName + "' "
-                + " found in class " + targetClass.getName());
-    }
-
-    /**
-     * 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
-        OsgiMetadata metadata = OsgiMetadataUtil.getMetadata(targetClass);
-        if (metadata == null) {
-            throw new NoScrMetadataException(targetClass);
-        }
-        String methodName = metadata.getModifiedMethodName();
-        if (StringUtils.isEmpty(methodName)) {
-            return false;
-        }
-        
-        // 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;
-        }
-        
-        throw new RuntimeException("No matching modified method with name '" + 
methodName + "' "
-                + " found in class " + targetClass.getName());
+        return false;
     }
 
     private static Method getMethod(Class clazz, String methodName, Class<?>[] 
types) {

-- 
To stop receiving notification emails like this one, please contact
"[email protected]" <[email protected]>.

Reply via email to