You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@isis.apache.org by ah...@apache.org on 2018/05/19 09:37:32 UTC
[isis] 11/13: ISIS-1949: Javassist plugin implemented
This is an automated email from the ASF dual-hosted git repository.
ahuber pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/isis.git
commit 45c98c070ef4d5a428c29961643b83e0beced496
Author: Andi Huber <ah...@apache.org>
AuthorDate: Sat May 19 10:51:57 2018 +0200
ISIS-1949: Javassist plugin implemented
Task-Url: https://issues.apache.org/jira/browse/ISIS-1949
---
.../codegen/ProxyFactoryPluginUsingJavassist.java | 55 ++++++++++++++++++----
.../proxy/ProxyCreatorTestUsingJavassist.java | 3 +-
.../core/runtime/plugins/codegen/ProxyFactory.java | 9 +++-
3 files changed, 55 insertions(+), 12 deletions(-)
diff --git a/core/plugins/codegen-javassist/src/main/java/org/apache/isis/core/runtime/plugins/codegen/ProxyFactoryPluginUsingJavassist.java b/core/plugins/codegen-javassist/src/main/java/org/apache/isis/core/runtime/plugins/codegen/ProxyFactoryPluginUsingJavassist.java
index 711c1e1..1f156c0 100644
--- a/core/plugins/codegen-javassist/src/main/java/org/apache/isis/core/runtime/plugins/codegen/ProxyFactoryPluginUsingJavassist.java
+++ b/core/plugins/codegen-javassist/src/main/java/org/apache/isis/core/runtime/plugins/codegen/ProxyFactoryPluginUsingJavassist.java
@@ -1,21 +1,60 @@
package org.apache.isis.core.runtime.plugins.codegen;
+import java.lang.reflect.InvocationHandler;
+import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.function.Predicate;
-import org.apache.isis.applib.internal.exceptions._Exceptions;
+import org.apache.isis.applib.internal.base._Casts;
+import org.apache.isis.applib.internal.base._NullSafe;
+import org.apache.isis.core.commons.exceptions.IsisException;
public class ProxyFactoryPluginUsingJavassist implements ProxyFactoryPlugin {
@Override
public <T> ProxyFactory<T> factory(
- Class<T> base,
- Class<?>[] interfaces,
- Predicate<Method> methodFilter,
- Class<?>[] constructorArgTypes) {
- // TODO Auto-generated method stub
- _Exceptions.throwNotImplemented();
- return null;
+ final Class<T> base,
+ final Class<?>[] interfaces,
+ final Predicate<Method> methodFilter,
+ final Class<?>[] constructorArgTypes) {
+
+ final javassist.util.proxy.ProxyFactory pfDelegate = new javassist.util.proxy.ProxyFactory();
+
+ pfDelegate.setSuperclass(base);
+ pfDelegate.setInterfaces(interfaces);
+
+ if(methodFilter!=null) {
+ pfDelegate.setFilter(methodFilter::test);
+ }
+
+ final int constructorArgCount = _NullSafe.size(constructorArgTypes);
+
+ return new ProxyFactory<T>() {
+
+ @Override
+ public T createInstance(final InvocationHandler handler, final Object[] constructorArgs) {
+
+ final int constructorArgCountActual = _NullSafe.size(constructorArgTypes);
+
+ if(constructorArgCount != constructorArgCountActual) {
+ throw new IllegalArgumentException(String.format("Contructor args expected %d, got %d.",
+ constructorArgCount, constructorArgCountActual));
+ }
+
+ try {
+ return _Casts.uncheckedCast( pfDelegate.create(
+ constructorArgTypes,
+ constructorArgs,
+ (Object self, Method thisMethod, Method proceed, Object[] args)->{
+ return handler.invoke(self, thisMethod, args);
+ }));
+ } catch (NoSuchMethodException | IllegalArgumentException | InstantiationException |
+ IllegalAccessException | InvocationTargetException e) {
+ throw new IsisException(e);
+ }
+ }
+
+ };
}
}
diff --git a/core/plugins/codegen-javassist/src/test/java/org/apache/isis/core/wrapper/proxy/ProxyCreatorTestUsingJavassist.java b/core/plugins/codegen-javassist/src/test/java/org/apache/isis/core/wrapper/proxy/ProxyCreatorTestUsingJavassist.java
index fabe6d8..d5fdba4 100644
--- a/core/plugins/codegen-javassist/src/test/java/org/apache/isis/core/wrapper/proxy/ProxyCreatorTestUsingJavassist.java
+++ b/core/plugins/codegen-javassist/src/test/java/org/apache/isis/core/wrapper/proxy/ProxyCreatorTestUsingJavassist.java
@@ -37,8 +37,7 @@ public class ProxyCreatorTestUsingJavassist {
proxyCreator = new ProxyCreator();
}
- @SuppressWarnings("unused")
- private static class Employee {
+ public static class Employee {
private String name;
public String getName() {
return name;
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/plugins/codegen/ProxyFactory.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/plugins/codegen/ProxyFactory.java
index df7754b..1748c07 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/plugins/codegen/ProxyFactory.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/plugins/codegen/ProxyFactory.java
@@ -22,12 +22,17 @@ import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.util.function.Predicate;
+import javax.annotation.Nullable;
+
public interface ProxyFactory<T> {
// -- INTERFACE
- public T createInstance(InvocationHandler handler);
- public T createInstance(InvocationHandler handler, Object[] constructorArgs);
+ public default T createInstance(InvocationHandler handler) {
+ return createInstance(handler, null);
+ }
+
+ public T createInstance(InvocationHandler handler, @Nullable Object[] constructorArgs);
// -- BUILDER (uses plugin)
--
To stop receiving notification emails like this one, please contact
ahuber@apache.org.