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 15:28:38 UTC
[isis] branch master updated: ISIS-1949: refining ProxyFactory API,
also adding java-doc
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
The following commit(s) were added to refs/heads/master by this push:
new 21c34ae ISIS-1949: refining ProxyFactory API, also adding java-doc
21c34ae is described below
commit 21c34aeda54b951e30b2498991359684a6037952
Author: Andi Huber <ah...@apache.org>
AuthorDate: Sat May 19 17:28:33 2018 +0200
ISIS-1949: refining ProxyFactory API, also adding java-doc
Task-Url: https://issues.apache.org/jira/browse/ISIS-1949
---
.../codegen/ProxyFactoryPluginUsingJavassist.java | 50 +++++++++++++++++-----
.../core/runtime/plugins/codegen/ProxyFactory.java | 31 +++++++++++---
.../core/runtime/services/ServiceInstantiator.java | 2 +-
.../background/BackgroundServiceDefault.java | 12 ++++--
.../isis/core/wrapper/proxy/ProxyCreator.java | 2 +-
5 files changed, 75 insertions(+), 22 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 f9d43e6..2bb6a8f 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
@@ -5,6 +5,9 @@ import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.function.Predicate;
+import javax.annotation.Nullable;
+
+import org.apache.isis.applib.internal._Constants;
import org.apache.isis.applib.internal.base._Casts;
import org.apache.isis.applib.internal.base._NullSafe;
import org.apache.isis.core.commons.exceptions.IsisException;
@@ -33,26 +36,42 @@ public class ProxyFactoryPluginUsingJavassist implements ProxyFactoryPlugin {
}
return new ProxyFactory<T>() {
-
+
@Override
- public T createInstance(InvocationHandler handler, Object[] constructorArgs) {
-
- ensureSameSize(constructorArgTypes, constructorArgs);
+ public T createInstance(InvocationHandler handler, boolean initialize) {
try {
- if(_NullSafe.isEmpty(constructorArgTypes)) {
- return _Casts.uncheckedCast( createNotUsingConstructor(handler) );
+ if(initialize) {
+ ensureSameSize(constructorArgTypes, null);
+ return _Casts.uncheckedCast( createUsingConstructor(handler, null) );
} else {
- return _Casts.uncheckedCast( createUsingConstructor(handler, constructorArgs) );
+ return _Casts.uncheckedCast( createNotUsingConstructor(handler) );
}
} catch (NoSuchMethodException | IllegalArgumentException | InstantiationException |
IllegalAccessException | InvocationTargetException e) {
throw new IsisException(e);
}
+
+ }
+
+ @Override
+ public T createInstance(InvocationHandler handler, Object[] constructorArgs) {
+
+ ensureSameSize(constructorArgTypes, constructorArgs);
+ ensureNonEmtpy(constructorArgs);
+
+ try {
+ return _Casts.uncheckedCast( createUsingConstructor(handler, constructorArgs) );
+ } catch (NoSuchMethodException | IllegalArgumentException | InstantiationException |
+ IllegalAccessException | InvocationTargetException e) {
+ throw new IsisException(e);
+ }
}
+ // -- HELPER (create w/o initialize)
+
private Object createNotUsingConstructor(InvocationHandler handler) {
final Class<?> proxyClass = pfDelegate.createClass();
@@ -65,13 +84,15 @@ public class ProxyFactoryPluginUsingJavassist implements ProxyFactoryPlugin {
return object;
}
- private Object createUsingConstructor(InvocationHandler handler, Object[] constructorArgs)
+ // -- HELPER (create with initialize)
+
+ private Object createUsingConstructor(InvocationHandler handler, @Nullable Object[] constructorArgs)
throws NoSuchMethodException, IllegalArgumentException, InstantiationException,
IllegalAccessException, InvocationTargetException {
return pfDelegate.create(
- constructorArgTypes,
- constructorArgs,
+ constructorArgTypes==null ? _Constants.emptyClasses : constructorArgTypes,
+ constructorArgs==null ? _Constants.emptyObjects : constructorArgs,
(Object self, Method thisMethod, Method proceed, Object[] args)->{
return handler.invoke(self, thisMethod, args);
});
@@ -84,9 +105,16 @@ public class ProxyFactoryPluginUsingJavassist implements ProxyFactoryPlugin {
private static void ensureSameSize(Class<?>[] a, Object[] b) {
if(_NullSafe.size(a) != _NullSafe.size(b)) {
- throw new IllegalArgumentException(String.format("Contructor args expected %d, got %d.",
+ throw new IllegalArgumentException(String.format("Constructor arg count expected %d, got %d.",
_NullSafe.size(a), _NullSafe.size(b) ));
}
}
+
+ private static void ensureNonEmtpy(Object[] a) {
+ if(_NullSafe.isEmpty(a)) {
+ throw new IllegalArgumentException(String.format("Contructor args count expected > 0, got %d.",
+ _NullSafe.size(a) ));
+ }
+ }
}
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 ec0aad1..b7c0ed2 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,17 +22,36 @@ import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.util.function.Predicate;
-import javax.annotation.Nullable;
-
+/**
+ * Generates dynamic classes and corresponding instances by rebasing a given 'base' class.
+ *
+ * @since 2.0.0
+ * @param <T> type of proxy objects this factory creates
+ */
public interface ProxyFactory<T> {
// -- INTERFACE
- public default T createInstance(InvocationHandler handler) {
- return createInstance(handler, null);
- }
+ /**
+ *
+ * @param handler
+ * @param initialize whether to call a constructor on object instantiation
+ * @return
+ * @throws IllegalArgumentException when using initialize=true and the number of
+ * constructorArgTypes specified while building this factory is greater than 0.
+ */
+ public T createInstance(InvocationHandler handler, boolean initialize);
- public T createInstance(InvocationHandler handler, @Nullable Object[] constructorArgs);
+ /**
+ *
+ * @param handler
+ * @param constructorArgs passed to the constructor with matching signature on object instantiation
+ * @param initialize whether to call a constructor on object instantiation
+ * @return
+ * @throws IllegalArgumentException if constructorArgs is null or empty or does not
+ * conform to the number of constructorArgTypes specified while building this factory.
+ */
+ public T createInstance(InvocationHandler handler, Object[] constructorArgs);
// -- BUILDER (uses plugin)
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/services/ServiceInstantiator.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/services/ServiceInstantiator.java
index 55f608f..079aaf0 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/services/ServiceInstantiator.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/services/ServiceInstantiator.java
@@ -218,7 +218,7 @@ public final class ServiceInstantiator {
};
- return proxyFactory.createInstance(handler);
+ return proxyFactory.createInstance(handler, false);
}
private Set<Class<?>> cached = Sets.newHashSet();
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/services/background/BackgroundServiceDefault.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/services/background/BackgroundServiceDefault.java
index d3242fe..af07168 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/services/background/BackgroundServiceDefault.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/services/background/BackgroundServiceDefault.java
@@ -123,15 +123,21 @@ public class BackgroundServiceDefault implements BackgroundService2 {
cls.getInterfaces(),
new Class<?>[] { ProxyEnhanced.class });
- final Class<?>[] constructorArgTypes = mixedInIfAny!=null ? new Class<?>[] {mixedInIfAny.getClass()} : _Constants.emptyClasses;
- final Object[] constructorArgs = mixedInIfAny!=null ? new Object[] {mixedInIfAny} : _Constants.emptyObjects;
+ final boolean initialize = mixedInIfAny!=null;
+
+
+ final Class<?>[] constructorArgTypes = initialize ? new Class<?>[] {mixedInIfAny.getClass()} : _Constants.emptyClasses;
+ final Object[] constructorArgs = initialize ? new Object[] {mixedInIfAny} : _Constants.emptyObjects;
final ProxyFactory<T> proxyFactory = ProxyFactory.builder(cls)
.interfaces(interfaces)
.constructorArgTypes(constructorArgTypes)
.build();
- return proxyFactory.createInstance(methodHandler, constructorArgs);
+ return initialize
+ ? proxyFactory.createInstance(methodHandler, constructorArgs)
+ : proxyFactory.createInstance(methodHandler, false)
+ ;
}
/**
diff --git a/core/wrapper/src/main/java/org/apache/isis/core/wrapper/proxy/ProxyCreator.java b/core/wrapper/src/main/java/org/apache/isis/core/wrapper/proxy/ProxyCreator.java
index 9222180..a66acdf 100644
--- a/core/wrapper/src/main/java/org/apache/isis/core/wrapper/proxy/ProxyCreator.java
+++ b/core/wrapper/src/main/java/org/apache/isis/core/wrapper/proxy/ProxyCreator.java
@@ -59,7 +59,7 @@ public class ProxyCreator {
return createInstanceForInterface(base, handler, WrappingObject.class);
} else {
final ProxyFactory<T> proxyFactory = proxyFactoryFor(base);
- return proxyFactory.createInstance(handler);
+ return proxyFactory.createInstance(handler, false);
}
}
--
To stop receiving notification emails like this one, please contact
ahuber@apache.org.