Author: dblevins
Date: Sat Sep 15 08:33:39 2012
New Revision: 1385029
URL: http://svn.apache.org/viewvc?rev=1385029&view=rev
Log:
OWB-701: Remove Javassist
Fully functional ASM implementation
Ability to set alternate "JavassistProxyFactory" implementations
Modified:
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/config/WebBeansContext.java
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/decorator/AbstractDecoratorMethodHandler.java
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/proxy/JavassistProxyFactory.java
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/proxy/asm/AsmProxyFactory.java
Modified:
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/config/WebBeansContext.java
URL:
http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/config/WebBeansContext.java?rev=1385029&r1=1385028&r2=1385029&view=diff
==============================================================================
---
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/config/WebBeansContext.java
(original)
+++
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/config/WebBeansContext.java
Sat Sep 15 08:33:39 2012
@@ -77,7 +77,7 @@ public class WebBeansContext
private final ExtensionLoader extensionLoader = new ExtensionLoader(this);
private final InterceptorsManager interceptorsManager = new
InterceptorsManager(this);
private final WebBeansInterceptorConfig webBeansInterceptorConfig = new
WebBeansInterceptorConfig(this);
- private final JavassistProxyFactory javassistProxyFactory = new
JavassistProxyFactory();
+ private final JavassistProxyFactory javassistProxyFactory;
private final OpenWebBeansConfiguration openWebBeansConfiguration;
private final PluginLoader pluginLoader = new PluginLoader();
private final SerializableBeanVault serializableBeanVault = new
SerializableBeanVault();
@@ -135,6 +135,10 @@ public class WebBeansContext
}
loaderService = getService(LoaderService.class);
securityService = getService(SecurityService.class);
+
+ javassistProxyFactory =
serviceMap.containsKey(JavassistProxyFactory.class)
+ ? (JavassistProxyFactory)
serviceMap.get(JavassistProxyFactory.class)
+ : new JavassistProxyFactory();
OpenWebBeansClassLoaderProvider.initProxyFactoryClassLoaderProvider();
// Allow the WebBeansContext itself to be looked up
Modified:
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/decorator/AbstractDecoratorMethodHandler.java
URL:
http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/decorator/AbstractDecoratorMethodHandler.java?rev=1385029&r1=1385028&r2=1385029&view=diff
==============================================================================
---
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/decorator/AbstractDecoratorMethodHandler.java
(original)
+++
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/decorator/AbstractDecoratorMethodHandler.java
Sat Sep 15 08:33:39 2012
@@ -39,7 +39,8 @@ public class AbstractDecoratorMethodHand
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable
{
- throw new NoSuchMethodException();
+ final Method proceed = proxy.getClass().getMethod("_$$" +
method.getName(), method.getParameterTypes());
+ return proceed.invoke(proxy, args);
}
public Object invoke(Object self, Method thisMethod, Method proceed,
Object[] args) throws Throwable
Modified:
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/proxy/JavassistProxyFactory.java
URL:
http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/proxy/JavassistProxyFactory.java?rev=1385029&r1=1385028&r2=1385029&view=diff
==============================================================================
---
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/proxy/JavassistProxyFactory.java
(original)
+++
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/proxy/JavassistProxyFactory.java
Sat Sep 15 08:33:39 2012
@@ -53,20 +53,24 @@ import org.apache.webbeans.util.WebBeans
public final class JavassistProxyFactory
{
- public JavassistProxyFactory()
- {
-
- }
-
- private ConcurrentMap<OwbBean<?>, Class<?>> buildInBeanProxyClasses = new
ConcurrentHashMap<OwbBean<?>, Class<?>>();
+ private ConcurrentMap<OwbBean<?>, Class<?>> buildInBeanProxyClasses = new
ConcurrentHashMap<OwbBean<?>, Class<?>>();
private ConcurrentMap<OwbBean<?>, Class<?>> normalScopedBeanProxyClasses =
new ConcurrentHashMap<OwbBean<?>, Class<?>>();
private ConcurrentMap<OwbBean<?>, Class<?>>
dependentScopedBeanProxyClasses = new ConcurrentHashMap<OwbBean<?>,
Class<?>>();
private ConcurrentMap<OwbBean<?>, Class<?>> interceptorProxyClasses = new
ConcurrentHashMap<OwbBean<?>, Class<?>>();
private ConcurrentMap<ResourceBean<?, ?>, Class<?>>
resourceBeanProxyClasses = new ConcurrentHashMap<ResourceBean<?,?>, Class<?>>();
// second level map is indexed on local interface
private ConcurrentMap<OwbBean<?>, ConcurrentMap<Class<?>, Class<?>>>
ejbProxyClasses = new ConcurrentHashMap<OwbBean<?>, ConcurrentMap<Class<?>,
Class<?>>>();
- private Factory factory = new JavassistFactory();
-// private Factory factory = new AsmFactory();
+ private Factory factory;
+
+ public JavassistProxyFactory()
+ {
+ this(new JavassistFactory());
+ }
+
+ public JavassistProxyFactory(Factory factory)
+ {
+ this.factory = factory;
+ }
/**
* This map contains all configured special Scope->InterceptorHandler
mappings.
Modified:
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/proxy/asm/AsmProxyFactory.java
URL:
http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/proxy/asm/AsmProxyFactory.java?rev=1385029&r1=1385028&r2=1385029&view=diff
==============================================================================
---
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/proxy/asm/AsmProxyFactory.java
(original)
+++
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/proxy/asm/AsmProxyFactory.java
Sat Sep 15 08:33:39 2012
@@ -257,28 +257,8 @@ public class AsmProxyFactory
cw.visitField(ACC_FINAL + ACC_PRIVATE, NON_BUSINESS_HANDLER_NAME,
"Ljava/lang/reflect/InvocationHandler;", null,
null).visitEnd();
- for (Constructor<?> constructor :
classToProxy.getDeclaredConstructors())
- {
-
- final String descriptor =
Type.getConstructorDescriptor(constructor);
- final MethodVisitor mv = cw.visitMethod(ACC_PUBLIC, "<init>",
descriptor, null, null);
- mv.visitCode();
- mv.visitVarInsn(ALOAD, 0);
-
- int offset = 1;
- for (Class<?> aClass : constructor.getParameterTypes())
- {
- final Type type = Type.getType(aClass);
- mv.visitVarInsn(type.getOpcode(ILOAD), offset);
- offset += type.getSize();
- }
-
- mv.visitMethodInsn(INVOKESPECIAL, classFileName, "<init>",
descriptor);
- mv.visitInsn(RETURN);
- mv.visitMaxs(-1, -1);
- mv.visitEnd();
+ propagateConstructors(classToProxy, cw, classFileName);
- }
final Map<String, List<Method>> methodMap = new HashMap<String,
List<Method>>();
getNonPrivateMethods(classToProxy, methodMap);
@@ -296,6 +276,8 @@ public class AsmProxyFactory
{
final String name = method.getName();
+ addDirectAccessMethod(classToProxy, cw, method, name);
+
if (Modifier.isPublic(method.getModifiers()) ||
(method.getParameterTypes().length == 0 &&
("finalize".equals(name) || "clone".equals(name))))
{
@@ -314,6 +296,73 @@ public class AsmProxyFactory
return cw.toByteArray();
}
+ private static void propagateConstructors(Class<?> classToProxy,
ClassWriter cw, String classFileName)
+ {
+ for (Constructor<?> constructor :
classToProxy.getDeclaredConstructors())
+ {
+
+ final String descriptor =
Type.getConstructorDescriptor(constructor);
+ final MethodVisitor mv = cw.visitMethod(ACC_PUBLIC, "<init>",
descriptor, null, null);
+ mv.visitCode();
+ mv.visitVarInsn(ALOAD, 0);
+
+ int offset = 1;
+ for (Class<?> aClass : constructor.getParameterTypes())
+ {
+ final Type type = Type.getType(aClass);
+ mv.visitVarInsn(type.getOpcode(ILOAD), offset);
+ offset += type.getSize();
+ }
+
+ mv.visitMethodInsn(INVOKESPECIAL, classFileName, "<init>",
descriptor);
+ mv.visitInsn(RETURN);
+ mv.visitMaxs(-1, -1);
+ mv.visitEnd();
+
+ }
+ }
+
+ private static void addDirectAccessMethod(Class<?> classToProxy,
ClassWriter cw, Method method, String name)
+ {
+ try
+ {
+ final Method impl = classToProxy.getMethod(name,
method.getParameterTypes());
+ if (!Modifier.isAbstract(impl.getModifiers()))
+ {
+ final String[] exceptions = new
String[impl.getExceptionTypes().length];
+ for (int i = 0; i < exceptions.length; i++)
+ {
+ exceptions[i] =
Type.getType(impl.getExceptionTypes()[i]).getInternalName();
+ }
+
+ final String methodDescriptor = Type.getMethodDescriptor(impl);
+ final MethodVisitor mv = cw.visitMethod(ACC_PUBLIC, "_$$" +
name, methodDescriptor,
+ null,
exceptions);
+ mv.visitCode();
+ mv.visitVarInsn(ALOAD, 0);
+
+ int offset = 1;
+ for (Class<?> aClass : impl.getParameterTypes())
+ {
+ final Type type = Type.getType(aClass);
+ mv.visitVarInsn(type.getOpcode(ILOAD), offset);
+ offset += type.getSize();
+ }
+
+ final Type declaringClass =
Type.getType(impl.getDeclaringClass());
+ mv.visitMethodInsn(INVOKESPECIAL,
declaringClass.getInternalName(), name, methodDescriptor);
+
+ final Type returnType = Type.getType(method.getReturnType());
+ mv.visitInsn(returnType.getOpcode(IRETURN));
+ mv.visitMaxs(-1, -1);
+ mv.visitEnd();
+ }
+ }
+ catch (NoSuchMethodException e)
+ {
+ }
+ }
+
private static void getNonPrivateMethods(Class<?> clazz, Map<String,
List<Method>> methodMap)
{
while (clazz != null)