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]>.
