You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@bookkeeper.apache.org by iv...@apache.org on 2018/02/20 17:08:00 UTC
[bookkeeper] branch master updated: Allow default methods in
MavenClassloader callbacks
This is an automated email from the ASF dual-hosted git repository.
ivank pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/bookkeeper.git
The following commit(s) were added to refs/heads/master by this push:
new e5af4a2 Allow default methods in MavenClassloader callbacks
e5af4a2 is described below
commit e5af4a20f240f38c8ce712a5e3bba4976eb89a41
Author: Ivan Kelly <iv...@apache.org>
AuthorDate: Tue Feb 20 18:07:54 2018 +0100
Allow default methods in MavenClassloader callbacks
AsyncCallback.AddCallback has recently acquired a default method,
which breaks the assumption that there is only one method on these
callbacks. However, if does have a default method that calls the one
method. This patch takes advantage of that to allow us to use
AddCallback in tests.
Author: Ivan Kelly <iv...@apache.org>
Reviewers: Enrico Olivelli <eo...@gmail.com>
This closes #1187 from ivankelly/groovy-callback-default
---
tests/integration-tests-base-groovy/pom.xml | 1 -
tests/integration-tests-utils/pom.xml | 6 ++++++
.../apache/bookkeeper/tests/MavenClassLoader.java | 21 ++++++++++++++++++---
tests/pom.xml | 5 +++++
4 files changed, 29 insertions(+), 4 deletions(-)
diff --git a/tests/integration-tests-base-groovy/pom.xml b/tests/integration-tests-base-groovy/pom.xml
index 9bf71b0..738e813 100644
--- a/tests/integration-tests-base-groovy/pom.xml
+++ b/tests/integration-tests-base-groovy/pom.xml
@@ -35,7 +35,6 @@
<name>Apache BookKeeper :: Tests :: Base module for Arquillian based integration tests using groovy</name>
<properties>
- <groovy.version>2.4.13</groovy.version>
<groovy-eclipse-compiler.version>2.9.2-04</groovy-eclipse-compiler.version>
<groovy-eclipse-batch.version>2.4.13-02</groovy-eclipse-batch.version>
</properties>
diff --git a/tests/integration-tests-utils/pom.xml b/tests/integration-tests-utils/pom.xml
index 35fb4c8..811efe2 100644
--- a/tests/integration-tests-utils/pom.xml
+++ b/tests/integration-tests-utils/pom.xml
@@ -92,6 +92,12 @@
<version>${arquillian-cube.version}</version>
</dependency>
+ <dependency>
+ <groupId>org.codehaus.groovy</groupId>
+ <artifactId>groovy-all</artifactId>
+ <version>${groovy.version}</version>
+ </dependency>
+
</dependencies>
<build>
diff --git a/tests/integration-tests-utils/src/main/java/org/apache/bookkeeper/tests/MavenClassLoader.java b/tests/integration-tests-utils/src/main/java/org/apache/bookkeeper/tests/MavenClassLoader.java
index d25dbc2..2c3bb30 100644
--- a/tests/integration-tests-utils/src/main/java/org/apache/bookkeeper/tests/MavenClassLoader.java
+++ b/tests/integration-tests-utils/src/main/java/org/apache/bookkeeper/tests/MavenClassLoader.java
@@ -22,7 +22,11 @@ package org.apache.bookkeeper.tests;
import com.google.common.collect.Lists;
+import groovy.lang.Closure;
+
import java.io.File;
+import java.lang.invoke.MethodHandles;
+import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
@@ -135,14 +139,25 @@ public class MavenClassLoader implements AutoCloseable {
}
}
- public Object createCallback(String interfaceName, Object closure) throws Exception {
+ public Object createCallback(String interfaceName, Closure closure) throws Exception {
+ final Constructor<MethodHandles.Lookup> constructor = MethodHandles.Lookup.class.getDeclaredConstructor(
+ Class.class, int.class);
+ constructor.setAccessible(true);
return Proxy.newProxyInstance(classloader,
new Class<?>[]{ Class.forName(interfaceName, true, classloader) },
new InvocationHandler() {
+
@Override
public Object invoke(Object proxy, Method m, Object[] args) throws Throwable {
- Method call = closure.getClass().getMethod("call", Object[].class);
- return call.invoke(closure, (Object)args);
+ if (args.length == closure.getMaximumNumberOfParameters()) {
+ return closure.call(args);
+ } else {
+ final Class<?> declaringClass = m.getDeclaringClass();
+ return constructor.newInstance(declaringClass, MethodHandles.Lookup.PRIVATE)
+ .unreflectSpecial(m, declaringClass)
+ .bindTo(proxy)
+ .invokeWithArguments(args);
+ }
}
});
}
diff --git a/tests/pom.xml b/tests/pom.xml
index fa8484c..db0d46e 100644
--- a/tests/pom.xml
+++ b/tests/pom.xml
@@ -27,6 +27,11 @@
<groupId>org.apache.bookkeeper.tests</groupId>
<artifactId>tests-parent</artifactId>
<name>Apache BookKeeper :: Tests</name>
+
+ <properties>
+ <groovy.version>2.4.13</groovy.version>
+ </properties>
+
<modules>
<module>shaded</module>
<module>docker-images</module>
--
To stop receiving notification emails like this one, please contact
ivank@apache.org.