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:28 UTC

[isis] 07/13: ISIS-1948: reverts introduction of _Proxies

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 c85a1c5f329854be3c16ebd3970037d595de13ad
Author: Andi Huber <ah...@apache.org>
AuthorDate: Sat May 19 09:06:48 2018 +0200

    ISIS-1948: reverts introduction of _Proxies
    
    instead introduces plugin API (runtime): ProxyFactoryPlugin
    
    Task-Url: https://issues.apache.org/jira/browse/ISIS-1948
---
 .../isis/applib/internal/context/_Plugin.java      |  26 ++++-
 .../isis/applib/internal/discover/_Discover.java   |   8 +-
 .../internal/proxy/ProxyFactory_Default.java       | 110 ---------------------
 .../isis/applib/internal/proxy/package-info.java   |  28 ------
 .../services/eventbus/EventBusImplementation.java  |   4 +-
 .../core/metamodel/IsisJdoMetamodelPlugin.java     |   4 +-
 .../isis/core/metamodel/IsisJdoRuntimePlugin.java  |   4 +-
 .../core/runtime/plugins/codegen/ProxyFactory.java |  65 ++++++++++++
 .../plugins/codegen/ProxyFactoryPlugin.java}       |  49 ++++-----
 .../core/runtime/services/ServiceInstantiator.java |   8 +-
 .../background/BackgroundServiceDefault.java       |  14 ++-
 .../applib/client/UriBuilderPlugin.java            |   4 +-
 .../server/IsisJaxrsServerPlugin.java              |   4 +-
 .../isis/core/wrapper/proxy/ProxyCreator.java      |   8 +-
 14 files changed, 146 insertions(+), 190 deletions(-)

diff --git a/core/applib/src/main/java/org/apache/isis/applib/internal/context/_Plugin.java b/core/applib/src/main/java/org/apache/isis/applib/internal/context/_Plugin.java
index 65c149a..e0ba274 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/internal/context/_Plugin.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/internal/context/_Plugin.java
@@ -29,6 +29,8 @@ import java.util.stream.Collectors;
 import org.apache.isis.applib.NonRecoverableException;
 import org.apache.isis.applib.internal.base._NullSafe;
 import org.apache.isis.applib.internal.collections._Sets;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 /**
  * <h1>- internal use only -</h1>
@@ -99,17 +101,33 @@ public final class _Plugin {
 		
 	}
 	
+	// -- CONVENIENT PICK ANY
+	
+	public static <T> T pickAnyAndWarn(Class<T> pluginInterfaceClass, Set<T> ambiguousPlugins) {
+		final Logger log = LoggerFactory.getLogger(pluginInterfaceClass);
+		final T any = ambiguousPlugins.iterator().next();
+		
+		log.warn(String.format("You have more than one plugin implementing '%s' on your class-path [%s], "
+				+ "just picking one: '%s'", 
+				pluginInterfaceClass.getName(),
+				ambiguousPlugins.stream().map(p->p.getClass().getName()).collect(Collectors.joining(", ")),
+				any.getClass().getName()
+				));
+		
+		return any;
+	}
+	
 	// -- CONVENIENT EXCEPTION FACTORIES
 
 	public static <T> NonRecoverableException ambiguityNonRecoverable(
 			Class<T> pluginInterfaceClass, 
-			Set<? extends T> ambigousPlugins) {
+			Set<? extends T> ambiguousPlugins) {
 		
 		return new NonRecoverableException(
-				String.format("Ambigous plugins implementing %s found on class path.\n{%s}", 
+				String.format("Ambiguous plugins implementing %s found on class path.\n{%s}", 
 						pluginInterfaceClass.getName(),
 						
-						_NullSafe.stream(ambigousPlugins)
+						_NullSafe.stream(ambiguousPlugins)
 						.map(Object::getClass)
 						.map(Class::getName)
 						.collect(Collectors.joining(", "))
@@ -123,5 +141,7 @@ public final class _Plugin {
 				String.format("No plugin implementing %s found on class path.", 
 						pluginInterfaceClass.getName() ));
 	}
+
+	
 	
 }
diff --git a/core/applib/src/main/java/org/apache/isis/applib/internal/discover/_Discover.java b/core/applib/src/main/java/org/apache/isis/applib/internal/discover/_Discover.java
index 48109b3..d9b0c32 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/internal/discover/_Discover.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/internal/discover/_Discover.java
@@ -62,11 +62,9 @@ public final class _Discover {
 	// -- HELPER
 	
 	private static ClassDiscoveryPlugin getPlugin() {
-		return _Plugin.getOrElse(ClassDiscoveryPlugin.class, 
-				ambiguosPlugins->{
-					final Logger LOG = LoggerFactory.getLogger(ClassDiscoveryPlugin.class);
-					LOG.warn("You have more than one ClassDiscoveryPlugin on your class path, just picking one!");
-					return ambiguosPlugins.iterator().next();
+		return _Plugin.getOrElse(ClassDiscoveryPlugin.class,
+				ambiguousPlugins->{
+					return _Plugin.pickAnyAndWarn(ClassDiscoveryPlugin.class, ambiguousPlugins);
 				}, 
 				()->{
 					final Logger LOG = LoggerFactory.getLogger(ClassDiscoveryPlugin.class);
diff --git a/core/applib/src/main/java/org/apache/isis/applib/internal/proxy/ProxyFactory_Default.java b/core/applib/src/main/java/org/apache/isis/applib/internal/proxy/ProxyFactory_Default.java
deleted file mode 100644
index 37709c7..0000000
--- a/core/applib/src/main/java/org/apache/isis/applib/internal/proxy/ProxyFactory_Default.java
+++ /dev/null
@@ -1,110 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *        http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- */
-
-package org.apache.isis.applib.internal.proxy;
-
-import java.lang.reflect.Constructor;
-import java.lang.reflect.InvocationHandler;
-
-import org.apache.isis.applib.internal.exceptions._Exceptions;
-import org.apache.isis.applib.internal.proxy._Proxies.ProxyFactory;
-
-/**
- * 
- * package private mixin for utility class {@link _Proxies}
- * 
- * ProxyFactory default implementation.
- *
- */
-class ProxyFactory_Default<T> implements ProxyFactory<T> {
-
-	private final Class<?> extending;
-	private final Class<?>[] implementing;
-	
-	ProxyFactory_Default(Class<?> extending, Class<?>[] implementing) {
-		this.extending = extending;
-		this.implementing = implementing;
-		
-	    // TODO ignore      return !m.getName().equals("finalize") || m.isBridge();
-		
-        // this is the default, I believe
-        // calling it here only because I know that it will throw an exception if the code were
-        // in the future changed such that caching is invalid
-        // (ie fail fast if future change could introduce a bug)
-        //TODO proxyFactory.setUseCache(true);
-		
-	}
-
-	@Override
-	public T createInstance(InvocationHandler handler) {
-		
-//      final Class<T> enhancedClass = proxyFactory.createClass();
-//      final Proxy proxy = (Proxy) Util.createInstance(enhancedClass);
-//
-//      proxy.setHandler(new MethodHandler() {
-//          @Override
-//          public Object invoke(Object self, Method thisMethod, Method proceed, Object[] args) throws Throwable {
-//              return handler.invoke(self, thisMethod, args);
-//          }
-//      });
-//
-//      return (T) proxy;
-		
-		//TODO 
-//	} catch (final InstantiationException |
-//            IllegalAccessException |
-//            InvocationTargetException e) {
-// throw new IsisException(e);
-//}
-		
-		// TODO Auto-generated method stub
-		_Exceptions.throwNotImplemented();
-		return null;
-	}
-
-	
-//	 final Class<T> proxySubclass = proxyFactory.createClass();
-//     
-//     final T newInstance;
-//     if(mixedInIfAny == null) {
-//         newInstance = proxySubclass.newInstance();
-//     } else {
-//         Constructor<?> constructor = findConstructor(proxySubclass, mixedInIfAny);
-//         newInstance = (T) constructor.newInstance(mixedInIfAny);
-//     }
-//     final ProxyObject proxyObject = (ProxyObject) newInstance;
-//     proxyObject.setHandler(methodHandler);
-//
-//     return newInstance;
-	
-    private <T> Constructor<?> findConstructor(final Class<T> proxySubclass, final Object mixedInIfAny) {
-        final Constructor<?>[] constructors = proxySubclass.getConstructors();
-        for (Constructor<?> constructor : constructors) {
-            final Class<?>[] parameterTypes = constructor.getParameterTypes();
-            if(parameterTypes.length == 1 && parameterTypes[0].isAssignableFrom(mixedInIfAny.getClass())) {
-                return constructor;
-            }
-        }
-        throw new IllegalArgumentException( String.format(
-                "Could not locate 1-arg constructor for mixin type of '%s' accepting an instance of '%s'",
-                        proxySubclass, mixedInIfAny.getClass().getName()));
-    }
-	
-	
-}
diff --git a/core/applib/src/main/java/org/apache/isis/applib/internal/proxy/package-info.java b/core/applib/src/main/java/org/apache/isis/applib/internal/proxy/package-info.java
deleted file mode 100644
index cf818dc..0000000
--- a/core/applib/src/main/java/org/apache/isis/applib/internal/proxy/package-info.java
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *        http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- */
-/**
- * <h1>Internal API</h1>
- * Internal classes, contributing to the internal proprietary API. 
- * These may be changed or removed without notice!
- * <p>
- * <b>WARNING</b>: 
- * Do NOT use any of the classes provided by this package!
- * </p>
- */
-package org.apache.isis.applib.internal.proxy;
\ No newline at end of file
diff --git a/core/applib/src/main/java/org/apache/isis/applib/services/eventbus/EventBusImplementation.java b/core/applib/src/main/java/org/apache/isis/applib/services/eventbus/EventBusImplementation.java
index ab6dcce..f2834cf 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/services/eventbus/EventBusImplementation.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/services/eventbus/EventBusImplementation.java
@@ -76,8 +76,8 @@ public interface EventBusImplementation {
 
 	public static EventBusImplementation get() {
 		return _Plugin.getOrElse(EventBusImplementation.class, 
-				ambigousPlugins->{
-					throw _Plugin.ambiguityNonRecoverable(EventBusImplementation.class, ambigousPlugins); 
+				ambiguousPlugins->{
+					throw _Plugin.ambiguityNonRecoverable(EventBusImplementation.class, ambiguousPlugins); 
 				}, 
 				()->{
 					throw _Plugin.absenceNonRecoverable(EventBusImplementation.class);
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/IsisJdoMetamodelPlugin.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/IsisJdoMetamodelPlugin.java
index fa79f1d..cad9a87 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/IsisJdoMetamodelPlugin.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/IsisJdoMetamodelPlugin.java
@@ -27,8 +27,8 @@ public interface IsisJdoMetamodelPlugin {
 
 	public static IsisJdoMetamodelPlugin get() {
 		return _Plugin.getOrElse(IsisJdoMetamodelPlugin.class, 
-				ambigousPlugins->{
-					throw _Plugin.ambiguityNonRecoverable(IsisJdoMetamodelPlugin.class, ambigousPlugins); 
+				ambiguousPlugins->{
+					throw _Plugin.ambiguityNonRecoverable(IsisJdoMetamodelPlugin.class, ambiguousPlugins); 
 				}, 
 				()->{
 					throw _Plugin.absenceNonRecoverable(IsisJdoMetamodelPlugin.class);
diff --git a/core/runtime/src/main/java/org/apache/isis/core/metamodel/IsisJdoRuntimePlugin.java b/core/runtime/src/main/java/org/apache/isis/core/metamodel/IsisJdoRuntimePlugin.java
index a40cad1..d59776f 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/metamodel/IsisJdoRuntimePlugin.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/metamodel/IsisJdoRuntimePlugin.java
@@ -14,8 +14,8 @@ public interface IsisJdoRuntimePlugin {
 
 	public static IsisJdoRuntimePlugin get() {
 		return _Plugin.getOrElse(IsisJdoRuntimePlugin.class, 
-				ambigousPlugins->{
-					throw _Plugin.ambiguityNonRecoverable(IsisJdoRuntimePlugin.class, ambigousPlugins); 
+				ambiguousPlugins->{
+					throw _Plugin.ambiguityNonRecoverable(IsisJdoRuntimePlugin.class, ambiguousPlugins); 
 				}, 
 				()->{
 					throw _Plugin.absenceNonRecoverable(IsisJdoRuntimePlugin.class);
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
new file mode 100644
index 0000000..df7754b
--- /dev/null
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/plugins/codegen/ProxyFactory.java
@@ -0,0 +1,65 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+package org.apache.isis.core.runtime.plugins.codegen;
+
+import java.lang.reflect.InvocationHandler;
+import java.lang.reflect.Method;
+import java.util.function.Predicate;
+
+public interface ProxyFactory<T> {
+
+	// -- INTERFACE
+	
+	public T createInstance(InvocationHandler handler);
+	public T createInstance(InvocationHandler handler, Object[] constructorArgs);
+	
+	// -- BUILDER (uses plugin)
+	
+	public static class ProxyFactoryBuilder<T> {
+		private static final Predicate<Method> DEFAULT_METHOD_FILTER = 
+				m->!m.getName().equals("finalize") || m.isBridge();
+		private final Class<T> base;
+		private Class<?>[] interfaces;
+		private Predicate<Method> methodFilter = DEFAULT_METHOD_FILTER;
+		private Class<?>[] constructorArgTypes;
+		private ProxyFactoryBuilder(Class<T> base) {
+			this.base = base;
+		}
+		public ProxyFactoryBuilder<T> interfaces(Class<?>[] interfaces) {
+			this.interfaces = interfaces;
+			return this;
+		}		
+		public ProxyFactoryBuilder<T> methodFilter(Predicate<Method> methodFilter) {
+			this.methodFilter = methodFilter;
+			return this;
+		}
+		public ProxyFactoryBuilder<T> constructorArgTypes(Class<?>[] constructorArgTypes) {
+			this.constructorArgTypes = constructorArgTypes;
+			return this;
+		}
+		public ProxyFactory<T> build() {
+			return ProxyFactoryPlugin.get().factory(base, interfaces, methodFilter, constructorArgTypes);
+		}
+	}
+	
+	public static <T> ProxyFactoryBuilder<T> builder(Class<T> base) {
+		return new ProxyFactoryBuilder<T>(base);
+	} 
+	
+}
diff --git a/core/applib/src/main/java/org/apache/isis/applib/internal/proxy/_Proxies.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/plugins/codegen/ProxyFactoryPlugin.java
similarity index 52%
rename from core/applib/src/main/java/org/apache/isis/applib/internal/proxy/_Proxies.java
rename to core/runtime/src/main/java/org/apache/isis/core/runtime/plugins/codegen/ProxyFactoryPlugin.java
index d2dd1df..dfadc62 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/internal/proxy/_Proxies.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/plugins/codegen/ProxyFactoryPlugin.java
@@ -16,32 +16,35 @@
  *  specific language governing permissions and limitations
  *  under the License.
  */
+package org.apache.isis.core.runtime.plugins.codegen;
 
-package org.apache.isis.applib.internal.proxy;
+import java.lang.reflect.Method;
+import java.util.function.Predicate;
 
-import java.lang.reflect.InvocationHandler;
+import javax.annotation.Nullable;
 
-/**
- * <h1>- internal use only -</h1>
- * <p>
- * Provides framework internal proxy support.
- * </p>
- * <p>
- * <b>WARNING</b>: Do <b>NOT</b> use any of the classes provided by this package! <br/> 
- * These may be changed or removed without notice!
- * </p>
- * 
- * @since 2.0.0
- */
-public class _Proxies {
-	
-	public static interface ProxyFactory<T> {
-		
-		public T createInstance(InvocationHandler handler);
-	}
+import org.apache.isis.applib.internal.context._Plugin;
 
-	public static <T> ProxyFactory<T> factory(Class<T> extending, Class<?> ... implementing) {
-		return new ProxyFactory_Default<T>(extending, implementing);
-	}
+public interface ProxyFactoryPlugin {
+
+	// -- INTERFACE
 	
+	public <T> ProxyFactory<T> factory(
+			Class<T> base, 
+			@Nullable Class<?>[] interfaces, 
+			@Nullable Predicate<Method> methodFilter,
+			@Nullable Class<?>[] constructorArgTypes);
+	
+	
+	// -- LOOKUP
+	
+	public static ProxyFactoryPlugin get() {
+		return _Plugin.getOrElse(ProxyFactoryPlugin.class, 
+				ambiguousPlugins->{
+					return _Plugin.pickAnyAndWarn(ProxyFactoryPlugin.class, ambiguousPlugins);
+				}, 
+				()->{
+					throw _Plugin.absenceNonRecoverable(ProxyFactoryPlugin.class);
+				}); 
+	}
 }
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 1ae7bb5..55f608f 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
@@ -16,7 +16,6 @@
  *  specific language governing permissions and limitations
  *  under the License.
  */
-
 package org.apache.isis.core.runtime.services;
 
 import java.lang.reflect.InvocationHandler;
@@ -30,8 +29,6 @@ import javax.annotation.PreDestroy;
 import javax.enterprise.context.RequestScoped;
 
 import org.apache.isis.applib.internal.context._Context;
-import org.apache.isis.applib.internal.proxy._Proxies;
-import org.apache.isis.applib.internal.proxy._Proxies.ProxyFactory;
 import org.apache.isis.core.commons.config.IsisConfiguration;
 import org.apache.isis.core.commons.factory.InstanceCreationClassException;
 import org.apache.isis.core.commons.factory.InstanceCreationException;
@@ -39,6 +36,7 @@ import org.apache.isis.core.commons.lang.ArrayExtensions;
 import org.apache.isis.core.commons.lang.MethodExtensions;
 import org.apache.isis.core.metamodel.services.ServicesInjector;
 import org.apache.isis.core.metamodel.specloader.classsubstitutor.ProxyEnhanced;
+import org.apache.isis.core.runtime.plugins.codegen.ProxyFactory;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -145,7 +143,9 @@ public final class ServiceInstantiator {
 				cls.getInterfaces(), 
 				new Class<?>[] { RequestScopedService.class, ProxyEnhanced.class });
     	
-        final ProxyFactory<T> proxyFactory = _Proxies.factory(cls, interfaces); 
+        final ProxyFactory<T> proxyFactory = ProxyFactory.builder(cls)
+        		.interfaces(interfaces)
+        		.build(); 
 
         final InvocationHandler handler = new InvocationHandler() {
 
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 fe45ef8..d3242fe 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
@@ -28,9 +28,8 @@ import javax.annotation.PreDestroy;
 import org.apache.isis.applib.annotation.DomainService;
 import org.apache.isis.applib.annotation.NatureOfService;
 import org.apache.isis.applib.annotation.Programmatic;
+import org.apache.isis.applib.internal._Constants;
 import org.apache.isis.applib.internal.base._Casts;
-import org.apache.isis.applib.internal.proxy._Proxies;
-import org.apache.isis.applib.internal.proxy._Proxies.ProxyFactory;
 import org.apache.isis.applib.services.background.BackgroundCommandService;
 import org.apache.isis.applib.services.background.BackgroundCommandService2;
 import org.apache.isis.applib.services.background.BackgroundService2;
@@ -50,6 +49,7 @@ import org.apache.isis.core.metamodel.specloader.SpecificationLoader;
 import org.apache.isis.core.metamodel.specloader.classsubstitutor.ProxyEnhanced;
 import org.apache.isis.core.metamodel.specloader.specimpl.ObjectActionMixedIn;
 import org.apache.isis.core.metamodel.specloader.specimpl.dflt.ObjectSpecificationDefault;
+import org.apache.isis.core.runtime.plugins.codegen.ProxyFactory;
 import org.apache.isis.core.runtime.system.session.IsisSessionFactory;
 import org.apache.isis.schema.cmd.v1.CommandDto;
 
@@ -123,9 +123,15 @@ public class BackgroundServiceDefault implements BackgroundService2 {
     			cls.getInterfaces(), 
     			new Class<?>[] { ProxyEnhanced.class }); 
     	
-        final ProxyFactory<T> proxyFactory = _Proxies.factory(cls, interfaces);
+        final Class<?>[] constructorArgTypes = mixedInIfAny!=null ? new Class<?>[] {mixedInIfAny.getClass()} : _Constants.emptyClasses;
+        final Object[] constructorArgs = mixedInIfAny!=null ? new Object[] {mixedInIfAny} : _Constants.emptyObjects;
         
-        return proxyFactory.createInstance(methodHandler);
+        final ProxyFactory<T> proxyFactory = ProxyFactory.builder(cls)
+        		.interfaces(interfaces)
+        		.constructorArgTypes(constructorArgTypes)
+        		.build();
+        
+        return proxyFactory.createInstance(methodHandler, constructorArgs);
     }
 
     /**
diff --git a/core/viewer-restfulobjects-applib/src/main/java/org/apache/isis/viewer/restfulobjects/applib/client/UriBuilderPlugin.java b/core/viewer-restfulobjects-applib/src/main/java/org/apache/isis/viewer/restfulobjects/applib/client/UriBuilderPlugin.java
index baf85ac..76e86d9 100644
--- a/core/viewer-restfulobjects-applib/src/main/java/org/apache/isis/viewer/restfulobjects/applib/client/UriBuilderPlugin.java
+++ b/core/viewer-restfulobjects-applib/src/main/java/org/apache/isis/viewer/restfulobjects/applib/client/UriBuilderPlugin.java
@@ -14,8 +14,8 @@ public interface UriBuilderPlugin {
 	
 	public static UriBuilderPlugin get() {
 		return _Plugin.getOrElse(UriBuilderPlugin.class, 
-				ambigousPlugins->{
-					throw _Plugin.ambiguityNonRecoverable(UriBuilderPlugin.class, ambigousPlugins); 
+				ambiguousPlugins->{
+					throw _Plugin.ambiguityNonRecoverable(UriBuilderPlugin.class, ambiguousPlugins); 
 				}, 
 				()->{
 					throw _Plugin.absenceNonRecoverable(UriBuilderPlugin.class);
diff --git a/core/viewer-restfulobjects-server/src/main/java/org/apache/isis/viewer/restfulobjects/server/IsisJaxrsServerPlugin.java b/core/viewer-restfulobjects-server/src/main/java/org/apache/isis/viewer/restfulobjects/server/IsisJaxrsServerPlugin.java
index 5eafa72..a6d3a75 100644
--- a/core/viewer-restfulobjects-server/src/main/java/org/apache/isis/viewer/restfulobjects/server/IsisJaxrsServerPlugin.java
+++ b/core/viewer-restfulobjects-server/src/main/java/org/apache/isis/viewer/restfulobjects/server/IsisJaxrsServerPlugin.java
@@ -15,8 +15,8 @@ public interface IsisJaxrsServerPlugin {
 
 	public static IsisJaxrsServerPlugin get() {
 		return _Plugin.getOrElse(IsisJaxrsServerPlugin.class, 
-				ambigousPlugins->{
-					throw _Plugin.ambiguityNonRecoverable(IsisJaxrsServerPlugin.class, ambigousPlugins); 
+				ambiguousPlugins->{
+					throw _Plugin.ambiguityNonRecoverable(IsisJaxrsServerPlugin.class, ambiguousPlugins); 
 				}, 
 				()->{
 					throw _Plugin.absenceNonRecoverable(IsisJaxrsServerPlugin.class);
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 94cd799..69c11f9 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
@@ -22,11 +22,10 @@ package org.apache.isis.core.wrapper.proxy;
 import java.util.Map;
 
 import org.apache.isis.applib.internal.base._Casts;
-import org.apache.isis.applib.internal.proxy._Proxies;
-import org.apache.isis.applib.internal.proxy._Proxies.ProxyFactory;
 import org.apache.isis.applib.services.wrapper.WrappingObject;
 import org.apache.isis.core.commons.lang.ArrayExtensions;
 import org.apache.isis.core.metamodel.specloader.classsubstitutor.ProxyEnhanced;
+import org.apache.isis.core.runtime.plugins.codegen.ProxyFactory;
 import org.apache.isis.core.wrapper.handlers.DelegatingInvocationHandler;
 import org.apache.isis.core.wrapper.internal.util.Util;
 
@@ -55,6 +54,7 @@ public class ProxyCreator {
         final Class<T> clazz = (Class<T>) toProxy.getClass();
 
         if (clazz.isInterface()) {
+        	//TODO [ahuber] move this logic to ProxyFactory
             return Util.createInstance(clazz, handler, WrappingObject.class);
         } else {
             final ProxyFactory<T> proxyFactory = proxyFactoryFor(clazz);
@@ -77,7 +77,9 @@ public class ProxyCreator {
                 toProxyClass.getInterfaces(),
                 new Class<?>[] { ProxyEnhanced.class, WrappingObject.class }); 
     	
-        final ProxyFactory<T> proxyFactory = _Proxies.factory(toProxyClass, interfaces);
+        final ProxyFactory<T> proxyFactory = ProxyFactory.builder(toProxyClass)
+        		.interfaces(interfaces)
+        		.build();
 
         return proxyFactory;
     }

-- 
To stop receiving notification emails like this one, please contact
ahuber@apache.org.