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));
}