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.