Author: pderop
Date: Thu Dec 17 17:55:59 2015
New Revision: 1720619

URL: http://svn.apache.org/viewvc?rev=1720619&view=rev
Log:
Added a new way to define component service properties using FluentProperty 
lambda.
When using this new lambda, the jar using the method must be compiled using 
"-parameters" option.

Added:
    
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda.samples/build.gradle
Modified:
    
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda.samples/.settings/org.eclipse.jdt.core.prefs
    
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda.samples/bnd.bnd
    
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda.samples/src/org/apache/felix/dependencymanager/lambda/samples/hello/Activator.java
    
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/bnd.bnd
    
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/ComponentBuilder.java
    
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/Functions.java
    
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/impl/ComponentBuilderImpl.java
    
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/impl/ConfigurationDependencyBuilderImpl.java
    
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/impl/ExtendedComponentBase.java
    
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/impl/FactoryPidAdapterBuilderImpl.java
    
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/impl/Helpers.java
    
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/impl/ServiceCallbacksBuilderImpl.java

Modified: 
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda.samples/.settings/org.eclipse.jdt.core.prefs
URL: 
http://svn.apache.org/viewvc/felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda.samples/.settings/org.eclipse.jdt.core.prefs?rev=1720619&r1=1720618&r2=1720619&view=diff
==============================================================================
--- 
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda.samples/.settings/org.eclipse.jdt.core.prefs
 (original)
+++ 
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda.samples/.settings/org.eclipse.jdt.core.prefs
 Thu Dec 17 17:55:59 2015
@@ -1,5 +1,6 @@
 eclipse.preferences.version=1
 org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.methodParameters=generate
 org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
 org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
 org.eclipse.jdt.core.compiler.compliance=1.8

Modified: 
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda.samples/bnd.bnd
URL: 
http://svn.apache.org/viewvc/felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda.samples/bnd.bnd?rev=1720619&r1=1720618&r2=1720619&view=diff
==============================================================================
--- 
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda.samples/bnd.bnd
 (original)
+++ 
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda.samples/bnd.bnd
 Thu Dec 17 17:55:59 2015
@@ -17,4 +17,4 @@ Bundle-Vendor: The Apache Software Found
 -runproperties:  \
        org.apache.felix.dependencymanager.loglevel=2,\
        org.apache.felix.log.maxSize=100000,\
-       org.apache.felix.log.storeDebug=true
+       org.apache.felix.log.storeDebug=true
\ No newline at end of file

Added: 
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda.samples/build.gradle
URL: 
http://svn.apache.org/viewvc/felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda.samples/build.gradle?rev=1720619&view=auto
==============================================================================
--- 
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda.samples/build.gradle
 (added)
+++ 
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda.samples/build.gradle
 Thu Dec 17 17:55:59 2015
@@ -0,0 +1,3 @@
+ tasks.withType(JavaCompile) {
+  options.compilerArgs << "-parameters"
+}

Modified: 
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda.samples/src/org/apache/felix/dependencymanager/lambda/samples/hello/Activator.java
URL: 
http://svn.apache.org/viewvc/felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda.samples/src/org/apache/felix/dependencymanager/lambda/samples/hello/Activator.java?rev=1720619&r1=1720618&r2=1720619&view=diff
==============================================================================
--- 
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda.samples/src/org/apache/felix/dependencymanager/lambda/samples/hello/Activator.java
 (original)
+++ 
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda.samples/src/org/apache/felix/dependencymanager/lambda/samples/hello/Activator.java
 Thu Dec 17 17:55:59 2015
@@ -35,7 +35,8 @@ public class Activator extends Dependenc
         component(comp -> comp
             .provides(ServiceProvider.class)
             .onStart(ServiceProviderImpl::activate)
-            .properties("foo", "bar", "gabu", "zo") // foo=bar, gabu=zo
+            //.properties("foo", "bar", "gabu", "zo") // foo=bar, gabu=zo
+            .properties(foo -> "bar", gabu -> "zo") // property names are 
deduced from lambda parameter name
             .impl(ServiceProviderImpl.class)
             .withService(LogService.class, srv -> 
srv.onAdd(ServiceProviderImpl::bind)));
 

Modified: 
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/bnd.bnd
URL: 
http://svn.apache.org/viewvc/felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/bnd.bnd?rev=1720619&r1=1720618&r2=1720619&view=diff
==============================================================================
--- 
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/bnd.bnd
 (original)
+++ 
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/bnd.bnd
 Thu Dec 17 17:55:59 2015
@@ -5,9 +5,7 @@ Bundle-Version: 1.0.0
        org.apache.felix.dependencymanager;version=latest,\
        osgi.core;version=6.0,\
        osgi.cmpn;version=6.0
-Private-Package:  \
-       org.apache.felix.dm.builder.lambda.impl
-Export-Package:  \
-       org.apache.felix.dm.builder.lambda
+Export-Package: org.apache.felix.dm.builder.lambda
 -runfw: org.apache.felix.framework;version='[4.4.1,4.4.1]'
 -runee: JavaSE-1.8
+Private-Package: org.apache.felix.dm.builder.lambda.impl
\ No newline at end of file

Modified: 
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/ComponentBuilder.java
URL: 
http://svn.apache.org/viewvc/felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/ComponentBuilder.java?rev=1720619&r1=1720618&r2=1720619&view=diff
==============================================================================
--- 
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/ComponentBuilder.java
 (original)
+++ 
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/ComponentBuilder.java
 Thu Dec 17 17:55:59 2015
@@ -7,6 +7,7 @@ import java.util.function.Supplier;
 
 import org.apache.felix.dm.Component;
 import org.apache.felix.dm.builder.lambda.Functions.Consumer;
+import org.apache.felix.dm.builder.lambda.Functions.FluentProperties;
 
 /**
  * Builds a DependencyManager Component using java8 constructs. This interface 
provides builder methods used to configure general Component
@@ -123,9 +124,19 @@ public interface ComponentBuilder<B exte
      * Example: properties("param1", "value1", "service.ranking", 3)
      * @return this builder
      */
-    B properties(Object ... properties);  
+    B properties(String name, Object value, Object ... rest);  
     
     /**
+     * Sets the components's service properties using List of lamda 
properties. 
+     * When you use this method, you must compile your source code using the 
"-parameters" option, and the "arg0" parameter
+     * name is now allowed.
+     *  
+     * Example: properties(param1 -> "value1, param2 -> 2);
+     * @return this builder
+     */
+    B properties(FluentProperties ... properties);  
+
+    /**
      * Adds a required/autoconfig service dependency.
      * @param service the dependency that is required and that will be 
injected in any field with the same dependency type.
      * @return this builder

Modified: 
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/Functions.java
URL: 
http://svn.apache.org/viewvc/felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/Functions.java?rev=1720619&r1=1720618&r2=1720619&view=diff
==============================================================================
--- 
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/Functions.java
 (original)
+++ 
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/Functions.java
 Thu Dec 17 17:55:59 2015
@@ -2,6 +2,7 @@ package org.apache.felix.dm.builder.lamb
 
 import java.io.Serializable;
 import java.util.Objects;
+import java.util.function.Function;
 
 /**
  * This class regroups some reuisable functional interfaces. 
@@ -15,6 +16,14 @@ public class Functions {
        }
        
        /**
+        * Lambda allows to define fluent service properties, like param1 -> 
"value1", etc ...
+        */
+       @FunctionalInterface
+       public interface FluentProperties extends Functions.SerializableLambda {
+               public Object apply(String name);
+       }
+
+       /**
         * A function that accepts a single input argument and returns no 
result.
         */
        @FunctionalInterface
@@ -59,5 +68,5 @@ public class Functions {
                };
            }
        }
-                                   
+               
 }

Modified: 
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/impl/ComponentBuilderImpl.java
URL: 
http://svn.apache.org/viewvc/felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/impl/ComponentBuilderImpl.java?rev=1720619&r1=1720618&r2=1720619&view=diff
==============================================================================
--- 
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/impl/ComponentBuilderImpl.java
 (original)
+++ 
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/impl/ComponentBuilderImpl.java
 Thu Dec 17 17:55:59 2015
@@ -3,6 +3,7 @@ package org.apache.felix.dm.builder.lamb
 import java.util.ArrayList;
 import java.util.Dictionary;
 import java.util.HashMap;
+import java.util.Hashtable;
 import java.util.List;
 import java.util.Map;
 import java.util.Objects;
@@ -19,9 +20,10 @@ import org.apache.felix.dm.builder.lambd
 import org.apache.felix.dm.builder.lambda.ConfigurationDependencyBuilder;
 import org.apache.felix.dm.builder.lambda.DependencyBuilder;
 import org.apache.felix.dm.builder.lambda.Functions;
-import org.apache.felix.dm.builder.lambda.ServiceDependencyBuilder;
 import org.apache.felix.dm.builder.lambda.Functions.Consumer;
+import org.apache.felix.dm.builder.lambda.Functions.FluentProperties;
 import org.apache.felix.dm.builder.lambda.FutureDependencyBuilder;
+import org.apache.felix.dm.builder.lambda.ServiceDependencyBuilder;
 
 public class ComponentBuilderImpl implements 
ComponentBuilder<ComponentBuilderImpl> {
     private final List<DependencyBuilder<?>> m_dependencyBuilders = new 
ArrayList<>();
@@ -76,19 +78,37 @@ public class ComponentBuilderImpl implem
     }
 
     @Override
-    public ComponentBuilderImpl properties(Object ...properties) {
+    public ComponentBuilderImpl properties(String name, Object value, Object 
... rest) {
+       Objects.nonNull(name);
+       Objects.nonNull(value);
         Properties props = new Properties();
-        if ((properties.length & 1) != 0) {
+        props.put(name,  value);
+        if ((rest.length & 1) != 0) {
                throw new IllegalArgumentException("Invalid number of specified 
properties (number of arguments must be even).");
         }
-        for (int i = 0; i < properties.length - 1; i += 2) {
-            String key = properties[i].toString().trim();
-            Object value = properties[i+1];
-            props.put(key, value);
+        for (int i = 0; i < rest.length - 1; i += 2) {
+            String k = rest[i].toString().trim();
+            Object v = rest[i+1];
+            props.put(k, v);
         }
         m_properties = props;
         return this;
     }
+    
+    @Override
+    public ComponentBuilderImpl properties(FluentProperties ... properties) {
+       Dictionary<Object, Object> props = new Hashtable<>();
+       Stream.of(properties).forEach(property -> {
+               String name = Helpers.getLambdaParameterName(property, 0);
+               if (name.equals("arg0")) {
+                       throw new IllegalArgumentException("arg0 property name 
not supported"); 
+               }
+               Object value = property.apply(name);
+               props.put(name, value);
+       });
+        m_properties = props;
+        return this;
+    }
 
     @Override
     public ComponentBuilderImpl debug(String label) {
@@ -315,7 +335,7 @@ public class ComponentBuilderImpl implem
     @SuppressWarnings("unchecked")
     private <T> ComponentBuilderImpl setLifecycleCallback(String method, 
Functions.Consumer<T> callback) {
        m_lfclCallbacks.put(method, component -> {
-                       String type = 
Helpers.extractLambdaGenericType(callback);
+                       String type = Helpers.getLambdaGenericType(callback);
                        // If the lambda generic type is Component, simply pass 
our component to the lambda's accept method.
                        // If the type is Object, it means that we are in front 
of a corner case where a Consumer is defined with a wildcard type.
                        // In this case, assume that the consumer accepts a 
Component. Notice that this may happen may using RxJava.
@@ -337,7 +357,7 @@ public class ComponentBuilderImpl implem
     @SuppressWarnings("unchecked")
        private <T> ComponentBuilderImpl setLifecycleCallback(String method, 
Functions.Consumer2<T, Component> callback) {
        m_lfclCallbacks.put(method, component -> {              
-                       String type = 
Helpers.extractLambdaGenericType(callback);
+                       String type = Helpers.getLambdaGenericType(callback);
                        for (Object instance : component.getInstances()) {
                                if 
(Helpers.getClassName(instance).equals(type)) {
                                        callback.accept((T) instance, 
component);

Modified: 
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/impl/ConfigurationDependencyBuilderImpl.java
URL: 
http://svn.apache.org/viewvc/felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/impl/ConfigurationDependencyBuilderImpl.java?rev=1720619&r1=1720618&r2=1720619&view=diff
==============================================================================
--- 
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/impl/ConfigurationDependencyBuilderImpl.java
 (original)
+++ 
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/impl/ConfigurationDependencyBuilderImpl.java
 Thu Dec 17 17:55:59 2015
@@ -56,7 +56,7 @@ public class ConfigurationDependencyBuil
 
     @Override
     public <T> ConfigurationDependencyBuilder onUpdate(Consumer2<T, 
Dictionary<String, Object>>  updatedRef) {
-        String instanceType = Helpers.extractLambdaGenericType(updatedRef);
+        String instanceType = Helpers.getLambdaGenericType(updatedRef);
         m_componentInstanceCbks.put(instanceType, updatedRef);        
         return this;
     }

Modified: 
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/impl/ExtendedComponentBase.java
URL: 
http://svn.apache.org/viewvc/felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/impl/ExtendedComponentBase.java?rev=1720619&r1=1720618&r2=1720619&view=diff
==============================================================================
--- 
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/impl/ExtendedComponentBase.java
 (original)
+++ 
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/impl/ExtendedComponentBase.java
 Thu Dec 17 17:55:59 2015
@@ -9,9 +9,10 @@ import org.apache.felix.dm.Component;
 import org.apache.felix.dm.builder.lambda.ComponentBuilder;
 import org.apache.felix.dm.builder.lambda.ConfigurationDependencyBuilder;
 import org.apache.felix.dm.builder.lambda.Functions;
-import org.apache.felix.dm.builder.lambda.ServiceDependencyBuilder;
 import org.apache.felix.dm.builder.lambda.Functions.Consumer;
+import org.apache.felix.dm.builder.lambda.Functions.FluentProperties;
 import org.apache.felix.dm.builder.lambda.FutureDependencyBuilder;
+import org.apache.felix.dm.builder.lambda.ServiceDependencyBuilder;
 
 /**
  * Methods common to extended components like adapters or aspects.
@@ -68,7 +69,12 @@ public abstract class ExtendedComponentB
         return (B) this;
     }
 
-    public B properties(Object ... properties) {
+    public B properties(String name, Object value, Object ... rest) {
+        m_compBuilder = m_compBuilder.andThen(compBuilder -> 
compBuilder.properties(name, value, rest));
+        return (B) this;
+    }
+    
+    public B properties(FluentProperties ...properties) {
         m_compBuilder = m_compBuilder.andThen(compBuilder -> 
compBuilder.properties(properties));
         return (B) this;
     }

Modified: 
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/impl/FactoryPidAdapterBuilderImpl.java
URL: 
http://svn.apache.org/viewvc/felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/impl/FactoryPidAdapterBuilderImpl.java?rev=1720619&r1=1720618&r2=1720619&view=diff
==============================================================================
--- 
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/impl/FactoryPidAdapterBuilderImpl.java
 (original)
+++ 
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/impl/FactoryPidAdapterBuilderImpl.java
 Thu Dec 17 17:55:59 2015
@@ -61,7 +61,7 @@ public class FactoryPidAdapterBuilderImp
 
     @Override
     public <T> FactoryPidAdapterBuilder onUpdate(Consumer2<T, 
Dictionary<String, Object>> callback) {
-        String instanceType = Helpers.extractLambdaGenericType(callback);
+        String instanceType = Helpers.getLambdaGenericType(callback);
         setUpdateRef(instanceType, (T instance, Dictionary<String, Object> 
conf) -> callback.accept(instance, conf));
         return this;
     }

Modified: 
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/impl/Helpers.java
URL: 
http://svn.apache.org/viewvc/felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/impl/Helpers.java?rev=1720619&r1=1720618&r2=1720619&view=diff
==============================================================================
--- 
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/impl/Helpers.java
 (original)
+++ 
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/impl/Helpers.java
 Thu Dec 17 17:55:59 2015
@@ -2,12 +2,16 @@ package org.apache.felix.dm.builder.lamb
 
 import java.lang.invoke.SerializedLambda;
 import java.lang.reflect.Method;
+import java.lang.reflect.Parameter;
 import java.lang.reflect.Proxy;
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Objects;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
+import java.util.stream.Stream;
 
+import org.apache.felix.dm.builder.lambda.Functions;
 import org.apache.felix.dm.builder.lambda.Functions.SerializableLambda;
 
 
@@ -35,18 +39,14 @@ public class Helpers {
         * @return
         * @throws Exception
         */
-       public static String extractLambdaGenericType(SerializableLambda 
lambda) {
-               return extractLambdaGenericTypes(lambda)[0];
+       public static String getLambdaGenericType(SerializableLambda lambda) {
+               return getLambdaGenericTypes(lambda)[0];
        }
        
        /**
         * Extracts the actual types of all lambda generic parameters.
-        * 
-        * @param lambda
-        * @return
-        * @throws Exception
         */
-       public static String[] extractLambdaGenericTypes(SerializableLambda 
lambda) {
+       public static String[] getLambdaGenericTypes(SerializableLambda lambda) 
{
                // The only portable way to get the actual lambda generic 
parameters can be done using SerializedLambda.
                SerializedLambda sl = getSerializedLambda(lambda);
                String lambdaMethodType = sl.getInstantiatedMethodType();
@@ -59,11 +59,7 @@ public class Helpers {
        }
 
     /**
-     * Extract the actual java method from a given lambda.
-     * 
-     * @param lambda
-     * @param loader
-     * @return
+     * Extracts the actual java method from a given lambda.
      */
        public static Method getLambdaMethod(SerializedLambda lambda, 
ClassLoader loader) {
            String implClassName = lambda.getImplClass().replace('/', '.');
@@ -74,32 +70,39 @@ public class Helpers {
                    throw new RuntimeException("Lambda Method not found (can 
not instantiate class " + implClassName);
                }
 
-           String lambdaName = lambda.getImplMethodName();
-
-           for (Method m : implClass.getDeclaredMethods()) {
-               if (m.getName().equals(lambdaName)) {
-                   return m;
-               }
-           }
-           throw new RuntimeException("Lambda Method not found");
+           return Stream.of(implClass.getDeclaredMethods())
+               .filter(method -> Objects.equals(method.getName(), 
lambda.getImplMethodName()))
+            .findFirst()
+            .orElseThrow(() -> new RuntimeException("Lambda Method not 
found"));
        }
-
+       
        /**
-        * Serialize a lambda.
-        * 
-        * @param function
-        * @return
+        * Extracts the first parameter of a lambda.
         */
-    private static SerializedLambda getSerializedLambda(SerializableLambda 
function) {
-           if (function == null || !(function instanceof 
java.io.Serializable)) {
+       public static String getLambdaParameterName(SerializableLambda lambda, 
int index) {
+               SerializedLambda serialized = getSerializedLambda(lambda);
+               Method m = getLambdaMethod(serialized, 
lambda.getClass().getClassLoader());
+               Parameter p = m.getParameters()[index];
+               
+        if (Objects.equals("arg0", p.getName())) {
+            throw new IllegalStateException("Can'f find lambda method name 
(Please check you are using javac -parameters option).");
+        }
+        return p.getName();
+       }
+       
+       /**
+        * Returns the SerializedObject of a given lambda.
+        */
+    private static SerializedLambda getSerializedLambda(SerializableLambda 
lambda) {
+           if (lambda == null) {
                throw new IllegalArgumentException();
            }
 
-           for (Class<?> clazz = function.getClass(); clazz != null; clazz = 
clazz.getSuperclass()) {
+           for (Class<?> clazz = lambda.getClass(); clazz != null; clazz = 
clazz.getSuperclass()) {
                try {
                    Method replaceMethod = 
clazz.getDeclaredMethod("writeReplace");
                    replaceMethod.setAccessible(true);
-                   Object serializedForm = replaceMethod.invoke(function);
+                   Object serializedForm = replaceMethod.invoke(lambda);
 
                    if (serializedForm instanceof SerializedLambda) {
                        return (SerializedLambda) serializedForm;
@@ -115,5 +118,5 @@ public class Helpers {
 
            throw new RuntimeException("writeReplace method not found");
        }
-               
+
 }

Modified: 
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/impl/ServiceCallbacksBuilderImpl.java
URL: 
http://svn.apache.org/viewvc/felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/impl/ServiceCallbacksBuilderImpl.java?rev=1720619&r1=1720618&r2=1720619&view=diff
==============================================================================
--- 
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/impl/ServiceCallbacksBuilderImpl.java
 (original)
+++ 
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/impl/ServiceCallbacksBuilderImpl.java
 Thu Dec 17 17:55:59 2015
@@ -75,7 +75,7 @@ public abstract class ServiceCallbacksBu
        private boolean m_hasComponentInstanceCallbacks;
        
     public <I> B onAdd(InstanceService<I, T> callback) {
-       String type = Helpers.extractLambdaGenericType(callback);
+       String type = Helpers.getLambdaGenericType(callback);
         return setComponentInstanceCallbackRef("add", type, 
             (instance, component, ref, service) -> callback.call((I) instance, 
service));             
     }
@@ -85,7 +85,7 @@ public abstract class ServiceCallbacksBu
     }      
 
     public <I> B onAdd(InstanceServiceMap<I, T> callback) {
-       String type = Helpers.extractLambdaGenericType(callback);
+       String type = Helpers.getLambdaGenericType(callback);
        return setComponentInstanceCallbackRef("add", type, 
                 (instance, component, ref, service) -> callback.call((I) 
instance, service, new SRefAsMap(ref)));             
     }
@@ -96,7 +96,7 @@ public abstract class ServiceCallbacksBu
     }
     
     public <I> B onAdd(InstanceServiceDict<I, T> callback) {
-       String type = Helpers.extractLambdaGenericType(callback);
+       String type = Helpers.getLambdaGenericType(callback);
        return setComponentInstanceCallbackRef("add", type,   
                        (inst, component, ref, service) -> callback.call((I) 
inst, service, new SRefAsDictionary(ref)));             
     }     
@@ -107,7 +107,7 @@ public abstract class ServiceCallbacksBu
     }      
 
     public <I> B onAdd(InstanceRef<I, T> callback) {
-       String type = Helpers.extractLambdaGenericType(callback);
+       String type = Helpers.getLambdaGenericType(callback);
        return setComponentInstanceCallbackRef("add", type, 
                        (instance, component, ref, service) -> 
callback.call((I) instance, ref));             
     }      
@@ -118,7 +118,7 @@ public abstract class ServiceCallbacksBu
     }      
 
     public <I> B onAdd(InstanceServiceRef<I, T> callback) {
-       String type = Helpers.extractLambdaGenericType(callback);
+       String type = Helpers.getLambdaGenericType(callback);
        return setComponentInstanceCallbackRef("add", type,
                        (instance, component, ref, service) -> 
callback.call((I) instance, service, ref));             
     }      
@@ -129,7 +129,7 @@ public abstract class ServiceCallbacksBu
     }      
 
     public <I> B onChange(InstanceService<I, T> callback) {
-       String type = Helpers.extractLambdaGenericType(callback);
+       String type = Helpers.getLambdaGenericType(callback);
        return setComponentInstanceCallbackRef("change", type,
                        (instance, component, ref, service) -> 
callback.call((I) instance, service));
     }
@@ -140,7 +140,7 @@ public abstract class ServiceCallbacksBu
     }
 
     public <I> B onChange(InstanceServiceMap<I, T> callback) {
-       String type = Helpers.extractLambdaGenericType(callback);
+       String type = Helpers.getLambdaGenericType(callback);
        return setComponentInstanceCallbackRef("change", type,
                        (instance, component, ref, service) -> 
callback.call((I) instance, service, new SRefAsMap(ref)));
     }
@@ -151,7 +151,7 @@ public abstract class ServiceCallbacksBu
     }
 
     public <I> B onChange(InstanceServiceDict<I, T> callback) {
-       String type = Helpers.extractLambdaGenericType(callback);
+       String type = Helpers.getLambdaGenericType(callback);
        return setComponentInstanceCallbackRef("change", type,
                        (instance, component, ref, service)  -> 
callback.call((I) instance, service, new SRefAsDictionary(ref)));
     }
@@ -162,7 +162,7 @@ public abstract class ServiceCallbacksBu
     }
     
     public <I> B onChange(InstanceRef<I, T> callback) {
-       String type = Helpers.extractLambdaGenericType(callback);
+       String type = Helpers.getLambdaGenericType(callback);
        return setComponentInstanceCallbackRef("change", type,
                        (instance, component, ref, service) -> 
callback.call((I) instance, ref));
     }
@@ -173,7 +173,7 @@ public abstract class ServiceCallbacksBu
     }
 
     public <I> B onChange(InstanceServiceRef<I, T> callback) {
-       String type = Helpers.extractLambdaGenericType(callback);
+       String type = Helpers.getLambdaGenericType(callback);
        return setComponentInstanceCallbackRef("change", type,
             (instance, component, ref, service) -> callback.call((I) instance, 
service, ref));             
     }      
@@ -184,7 +184,7 @@ public abstract class ServiceCallbacksBu
     }      
 
     public <I> B onRemove(InstanceService<I, T> callback) {
-       String type = Helpers.extractLambdaGenericType(callback);
+       String type = Helpers.getLambdaGenericType(callback);
        return setComponentInstanceCallbackRef("remove", type,
             (instance, component, ref, service) -> callback.call((I) instance, 
service));
     }
@@ -195,7 +195,7 @@ public abstract class ServiceCallbacksBu
     }
 
     public <I> B onRemove(InstanceServiceMap<I, T> callback) {
-       String type = Helpers.extractLambdaGenericType(callback);
+       String type = Helpers.getLambdaGenericType(callback);
        return setComponentInstanceCallbackRef("remove", type,
             (instance, component, ref, service) -> callback.call((I) instance, 
service, new SRefAsMap(ref)));
     }
@@ -206,7 +206,7 @@ public abstract class ServiceCallbacksBu
     }
 
     public <I> B onRemove(InstanceServiceDict<I, T> callback) {
-       String type = Helpers.extractLambdaGenericType(callback);
+       String type = Helpers.getLambdaGenericType(callback);
        return setComponentInstanceCallbackRef("remove", type,
             (instance, component, ref, service) -> callback.call((I) instance, 
service, new SRefAsDictionary(ref)));
     }
@@ -217,7 +217,7 @@ public abstract class ServiceCallbacksBu
     }
 
     public <I> B onRemove(InstanceRef<I, T> callback) {
-       String type = Helpers.extractLambdaGenericType(callback);
+       String type = Helpers.getLambdaGenericType(callback);
        return setComponentInstanceCallbackRef("remove", type,
             (instance, component, ref, service) -> callback.call((I) instance, 
ref));
     }
@@ -228,7 +228,7 @@ public abstract class ServiceCallbacksBu
     }
 
     public <I> B onRemove(InstanceServiceRef<I, T> callback) {
-       String type = Helpers.extractLambdaGenericType(callback);
+       String type = Helpers.getLambdaGenericType(callback);
        return setComponentInstanceCallbackRef("remove", type,
             (instance, component, ref, service) -> callback.call((I) instance, 
service, ref));             
     }      
@@ -239,7 +239,7 @@ public abstract class ServiceCallbacksBu
     }      
     
     public <I> B onSwap(InstanceRefServiceRefService<I, T> callback) {
-       String type = Helpers.extractLambdaGenericType(callback);
+       String type = Helpers.getLambdaGenericType(callback);
        return setComponentInstanceSwapCallbackRef(type,
             (inst, component, oref, oserv, nref, nserv) -> callback.call((I) 
inst, oref, oserv, nref, nserv));                                 
     }
@@ -250,7 +250,7 @@ public abstract class ServiceCallbacksBu
     }
 
     public <I> B onSwap(InstanceMapServiceMapService<I, T> callback) {
-        String instanceType = Helpers.extractLambdaGenericType(callback);
+        String instanceType = Helpers.getLambdaGenericType(callback);
         return setComponentInstanceSwapCallbackRef(instanceType, (inst, 
component, oref, oserv, nref, nserv) ->                                     
                        callback.call((I) inst, new SRefAsMap(oref), oserv, new 
SRefAsMap(nref), nserv));                       
     }
@@ -262,7 +262,7 @@ public abstract class ServiceCallbacksBu
        }
 
    public <I> B onSwap(InstanceDictServiceDictService<I, T> callback) {
-       String instanceType = Helpers.extractLambdaGenericType(callback);
+       String instanceType = Helpers.getLambdaGenericType(callback);
        return setComponentInstanceSwapCallbackRef(instanceType, (inst, 
component, oref, oserv, nref, nserv) ->
                        callback.call((I) inst, new SRefAsDictionary(oref), 
oserv, new SRefAsDictionary(nref), nserv));
    }


Reply via email to