You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@openwebbeans.apache.org by Romain Manni-Bucau <rm...@gmail.com> on 2012/09/14 09:26:06 UTC
Fwd: svn commit: r1384630 - in /openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans:
component/ decorator/ portable/creation/ proxy/ proxy/asm/ proxy/javassist/
Just a detail but maybe we should replace suffix $LocalBeanProxy bu
$OWBProxy?
*Romain Manni-Bucau*
*Twitter: @rmannibucau*
*Blog: http://rmannibucau.wordpress.com*
---------- Forwarded message ----------
From: <db...@apache.org>
Date: 2012/9/14
Subject: svn commit: r1384630 - in
/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans:
component/ decorator/ portable/creation/ proxy/ proxy/asm/ proxy/javassist/
To: commits@openwebbeans.apache.org
Author: dblevins
Date: Fri Sep 14 03:05:14 2012
New Revision: 1384630
URL: http://svn.apache.org/viewvc?rev=1384630&view=rev
Log:
OWB-701: Removing Javassist
Refactored all Javassist dependencies into the new proxy.javassist package.
Start of ASM implementation (a work in progress).
Added:
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/proxy/Factory.java
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/proxy/asm/
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/proxy/asm/AsmFactory.java
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/proxy/asm/AsmProxyFactory.java
- copied, changed from r1384168,
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/proxy/AsmProxyFactory.java
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/proxy/javassist/JavassistFactory.java
Removed:
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/proxy/AsmProxyFactory.java
Modified:
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/AbstractInjectionTargetBean.java
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/decorator/AbstractDecoratorMethodHandler.java
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/portable/creation/InjectionTargetProducer.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/MethodHandler.java
Modified:
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/AbstractInjectionTargetBean.java
URL:
http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/AbstractInjectionTargetBean.java?rev=1384630&r1=1384629&r2=1384630&view=diff
==============================================================================
---
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/AbstractInjectionTargetBean.java
(original)
+++
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/AbstractInjectionTargetBean.java
Fri Sep 14 03:05:14 2012
@@ -136,9 +136,10 @@ public abstract class AbstractInjectionT
boolean isDependentProxy = false;
if(getScope() == Dependent.class && !(this instanceof
EnterpriseBeanMarker))
{
- T result = (T)
getWebBeansContext().getJavassistProxyFactory().createDependentScopedBeanProxy(this,
instance, creationalContext);
+ final JavassistProxyFactory proxyFactory =
getWebBeansContext().getJavassistProxyFactory();
+ T result = (T)
proxyFactory.createDependentScopedBeanProxy(this, instance,
creationalContext);
//Means that Dependent Bean has interceptor/decorator
- if(JavassistProxyFactory.isProxyInstance(result))
+ if(proxyFactory.isProxyInstance(result))
{
//This is a dependent scoped bean instance,
//Therefore we inject dependencies of this instance
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=1384630&r1=1384629&r2=1384630&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
Fri Sep 14 03:05:14 2012
@@ -24,6 +24,8 @@ import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.lang.reflect.Method;
+import javax.naming.OperationNotSupportedException;
+
import org.apache.webbeans.proxy.MethodHandler;
public class AbstractDecoratorMethodHandler implements MethodHandler,
Serializable
@@ -36,6 +38,12 @@ public class AbstractDecoratorMethodHand
new Exception().fillInStackTrace().printStackTrace();
}
+ public Object invoke(Object proxy, Method method, Object[] args)
+ throws Throwable
+ {
+ throw new OperationNotSupportedException();
+ }
+
public Object invoke(Object self, Method thisMethod, Method proceed,
Object[] args) throws Throwable
{
//Don't attempt to call it if the method doesn't exist
Modified:
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/portable/creation/InjectionTargetProducer.java
URL:
http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/portable/creation/InjectionTargetProducer.java?rev=1384630&r1=1384629&r2=1384630&view=diff
==============================================================================
---
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/portable/creation/InjectionTargetProducer.java
(original)
+++
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/portable/creation/InjectionTargetProducer.java
Fri Sep 14 03:05:14 2012
@@ -83,7 +83,8 @@ public class InjectionTargetProducer<T>
//injection will be occured on Proxy instances that are
//not correct. Injection must be on actual dependent
//instance,so not necessary to inject on proxy
- if(bean.getScope() == Dependent.class &&
JavassistProxyFactory.isProxyInstance(instance))
+ final JavassistProxyFactory proxyFactory =
this.bean.getWebBeansContext().getJavassistProxyFactory();
+ if(bean.getScope() == Dependent.class &&
proxyFactory.isProxyInstance(instance))
{
return;
}
Added:
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/proxy/Factory.java
URL:
http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/proxy/Factory.java?rev=1384630&view=auto
==============================================================================
---
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/proxy/Factory.java
(added)
+++
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/proxy/Factory.java
Fri Sep 14 03:05:14 2012
@@ -0,0 +1,38 @@
+/*
+ * 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.webbeans.proxy;
+
+/**
+ * @version $Rev$ $Date$
+ */
+public interface Factory
+{
+ Class<?> getProxyClass(Class<?> superClass, Class<?>[] interfaces);
+
+ boolean isProxyInstance(Object o);
+
+ Object createProxy(MethodHandler handler, Class<?>[] interfaces)
+ throws InstantiationException, IllegalAccessException;
+
+ Object createProxy(Class<?> proxyClass)
+ throws InstantiationException, IllegalAccessException;
+
+
+ void setHandler(Object proxy, MethodHandler handler);
+}
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=1384630&r1=1384629&r2=1384630&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
Fri Sep 14 03:05:14 2012
@@ -21,11 +21,7 @@ package org.apache.webbeans.proxy;
import java.io.Serializable;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
-import java.lang.reflect.Method;
-import java.lang.reflect.Proxy;
import java.lang.reflect.Type;
-import java.security.AccessController;
-import java.security.PrivilegedAction;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
@@ -38,10 +34,6 @@ import javax.enterprise.context.spi.Crea
import javax.enterprise.inject.spi.Bean;
import javax.enterprise.inject.spi.Decorator;
-import javassist.util.proxy.MethodFilter;
-import javassist.util.proxy.ProxyFactory;
-import javassist.util.proxy.ProxyFactory.ClassLoaderProvider;
-import javassist.util.proxy.ProxyObject;
import org.apache.webbeans.component.InjectionTargetBean;
import org.apache.webbeans.component.OwbBean;
import org.apache.webbeans.component.ResourceBean;
@@ -55,7 +47,7 @@ import org.apache.webbeans.intercept.Int
import org.apache.webbeans.intercept.InterceptorHandler;
import org.apache.webbeans.intercept.NormalScopedBeanInterceptorHandler;
import org.apache.webbeans.intercept.webbeans.WebBeansInterceptor;
-import org.apache.webbeans.proxy.javassist.OpenWebBeansClassLoaderProvider;
+import org.apache.webbeans.proxy.javassist.JavassistFactory;
import org.apache.webbeans.util.ClassUtil;
import org.apache.webbeans.util.WebBeansUtil;
@@ -73,6 +65,7 @@ public final class JavassistProxyFactory
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();
/**
* This map contains all configured special Scope->InterceptorHandler
mappings.
@@ -81,21 +74,9 @@ public final class JavassistProxyFactory
private Map<String, Class<? extends InterceptorHandler>>
interceptorHandlerClasses =
new ConcurrentHashMap<String, Class<? extends
InterceptorHandler>>();
- public static Class<?> doPrivilegedCreateClass(ProxyFactory factory)
- {
- if (System.getSecurityManager() == null)
- {
- return factory.createClass();
- }
- else
- {
- return (Class<?>) AccessController.doPrivileged(new
PrivilegedActionForProxyFactory(factory));
- }
- }
-
public void setHandler(Object proxy, MethodHandler handler)
{
- ((ProxyObject)proxy).setHandler(handler);
+ factory.setHandler(proxy, handler);
}
@@ -120,13 +101,12 @@ public final class JavassistProxyFactory
*/
public Class<?> getEjbBeanProxyClass(OwbBean<?> bean, Class<?> iface)
{
- Class<?> proxyClass = null;
ConcurrentMap<Class<?>, Class<?>> typeToProxyClassMap =
ejbProxyClasses.get(bean);
if (typeToProxyClassMap != null)
{
- proxyClass = typeToProxyClassMap.get(iface);
+ return typeToProxyClassMap.get(iface);
}
- return proxyClass;
+ return null;
}
public Object createDecoratorDelegate(OwbBean<?> bean, DelegateHandler
newDelegateHandler)
@@ -136,106 +116,38 @@ public final class JavassistProxyFactory
Class<?> proxyClass = this.getInterceptorProxyClasses().get(bean);
if (proxyClass == null)
{
- ProxyFactory delegateFactory = this.createProxyFactory(bean);
- proxyClass = this.getProxyClass(delegateFactory);
+ proxyClass = createProxyClass(bean);
this.getInterceptorProxyClasses().put(bean, proxyClass);
}
- final Object delegate = proxyClass.newInstance();
+ final Object delegate = createProxy(proxyClass);
setHandler(delegate, newDelegateHandler);
return delegate;
}
public Class<?> getResourceBeanProxyClass(ResourceBean<?, ?>
resourceBean)
{
- Class<?> proxyClass = null;
try
{
- proxyClass = resourceBeanProxyClasses.get(resourceBean);
+ Class<?> proxyClass =
resourceBeanProxyClasses.get(resourceBean);
if (proxyClass == null)
{
- ProxyFactory fact = createProxyFactory(resourceBean);
- proxyClass = getProxyClass(fact);
+ proxyClass = createProxyClass(resourceBean);
Class<?> oldClazz =
resourceBeanProxyClasses.putIfAbsent(resourceBean, proxyClass);
if (oldClazz != null)
{
return oldClazz;
}
- }
+ }
+ return proxyClass;
}
catch (Exception e)
{
WebBeansUtil.throwRuntimeExceptions(e);
}
- return proxyClass;
- }
-
- /**
- * Defines the proxy for the given bean and iface using callers
factory. Due
- * to races with the concurrentmap, this might sometimes create
additional
- * javassist-defined classes that are not used by the caller and not
stored
- * in the map. Synchronizing the entire method, and
getEjbBeanProxyClass, on
- * ejbProxyClasses is an alternative.
- *
- * @param bean the contextual representing the EJB
- * @param iface the injected business local interface
- * @param factory
- * @return
- */
- public Class<?> defineEjbBeanProxyClass(OwbBean<?> bean, Class<?>
iface, ProxyFactory factory)
- {
- Class<?> proxyClass = null;
-
- ConcurrentMap<Class<?>, Class<?>> typeToProxyClassMap =
ejbProxyClasses.get(bean);
- if (typeToProxyClassMap == null)
- {
- typeToProxyClassMap = new ConcurrentHashMap<Class<?>,
Class<?>>();
- ConcurrentMap<Class<?>, Class<?>> existingMap =
ejbProxyClasses.putIfAbsent(bean, typeToProxyClassMap);
-
- // use the map that beat us, because our new one definitely
had no classes in it.
- typeToProxyClassMap = (existingMap != null) ? existingMap :
typeToProxyClassMap;
- }
-
- proxyClass = typeToProxyClassMap.get(iface);
-
- if (proxyClass == null)
- {
- proxyClass = doPrivilegedCreateClass(factory);
- typeToProxyClassMap.putIfAbsent(iface, proxyClass);
- // don't care if we were beaten in updating the
iface->proxyclass map
- }
-
- return proxyClass;
- }
-
- public Class<?> createAbstractDecoratorProxyClass(OwbBean<?> bean)
- {
- //Will only get called once while defining the bean, so no need to
cache
- Class<?> clazz = null;
- try
- {
- ProxyFactory fact = createProxyFactory(bean);
-
- clazz = doPrivilegedCreateClass(fact);
- }
- catch(Exception e)
- {
- WebBeansUtil.throwRuntimeExceptions(e);
- }
- return clazz;
-
- }
-
- public Object createProxy(MethodHandler handler, Class<?>[] interfaces)
- throws InstantiationException, IllegalAccessException
- {
- ProxyFactory pf = new ProxyFactory();
- pf.setInterfaces(interfaces);
- pf.setHandler(handler);
-
- return getProxyClass(pf).newInstance();
+ return null;
}
@@ -247,62 +159,18 @@ public final class JavassistProxyFactory
Class<?> proxyClass = normalScopedBeanProxyClasses.get(bean);
if (proxyClass == null)
{
- ProxyFactory fact = createProxyFactory(bean);
-
- proxyClass = getProxyClass(fact);
+ proxyClass = createProxyClass(bean);
normalScopedBeanProxyClasses.putIfAbsent(bean, proxyClass);
}
-
- result = proxyClass.newInstance();
+
+
+ result = createProxy(proxyClass);
if (!(bean instanceof WebBeansDecorator<?>) && !(bean
instanceof WebBeansInterceptor<?>))
{
InterceptorHandler interceptorHandler =
createInterceptorHandler(bean, creationalContext);
- if (!true)
- {
- final Set<Type> types = bean.getTypes();
- final Set<Class<?>> interfaceList = new
HashSet<Class<?>>();
- Class<?> superClass = null;
- for (Type generic : types)
- {
- Class<?> type = ClassUtil.getClazz(generic);
-
- if (type.isInterface())
- {
- interfaceList.add(type);
- }
-
- else if ((superClass == null) ||
(superClass.isAssignableFrom(type) && type != Object.class))
- {
- superClass = type;
- }
-
- }
- if (!interfaceList.contains(Serializable.class))
- {
- interfaceList.add(Serializable.class);
- }
-
- Class<?>[] interfaceArray = new
Class<?>[interfaceList.size()];
- interfaceArray = interfaceList.toArray(interfaceArray);
-
- if (superClass == null ||
superClass.equals(Object.class))
- {
- return
Proxy.newProxyInstance(WebBeansUtil.getCurrentClassLoader(), interfaceArray,
- interceptorHandler);
- }
- else
- {
- return
AsmProxyFactory.newProxyInstance(WebBeansUtil.getCurrentClassLoader(),
-
interceptorHandler, superClass, interfaceArray);
- }
-
- }
- else
- {
- setHandler(result, interceptorHandler);
- }
+ setHandler(result, interceptorHandler);
}
}
catch (Exception e)
@@ -313,9 +181,14 @@ public final class JavassistProxyFactory
return result;
}
+ private Object createProxy(Class<?> proxyClass)
+ throws InstantiationException, IllegalAccessException
+ {
+ return proxyClass.newInstance();
+ }
+
private InterceptorHandler createInterceptorHandler(OwbBean<?> bean,
CreationalContext<?> creationalContext)
{
- InterceptorHandler interceptorHandler = null;
String scopeClassName = bean.getScope().getName();
Class<? extends InterceptorHandler> interceptorHandlerClass = null;
if (!interceptorHandlerClasses.containsKey(scopeClassName))
@@ -352,14 +225,14 @@ public final class JavassistProxyFactory
if
(interceptorHandlerClass.equals(NormalScopedBeanInterceptorHandler.class))
{
// this is faster that way...
- interceptorHandler = new
NormalScopedBeanInterceptorHandler(bean, creationalContext);
+ return new NormalScopedBeanInterceptorHandler(bean,
creationalContext);
}
else
{
try
{
Constructor ct =
interceptorHandlerClass.getConstructor(OwbBean.class,
CreationalContext.class);
- interceptorHandler = (InterceptorHandler)
ct.newInstance(bean, creationalContext);
+ return (InterceptorHandler) ct.newInstance(bean,
creationalContext);
}
catch (NoSuchMethodException e)
{
@@ -390,7 +263,6 @@ public final class JavassistProxyFactory
e);
}
}
- return interceptorHandler;
}
public Object createBuildInBeanProxy(OwbBean<?> bean)
@@ -401,11 +273,10 @@ public final class JavassistProxyFactory
Class<?> proxyClass = buildInBeanProxyClasses.get(bean);
if (proxyClass == null)
{
- ProxyFactory fact = createProxyFactory(bean);
- proxyClass = getProxyClass(fact);
+ proxyClass = createProxyClass(bean);
buildInBeanProxyClasses.putIfAbsent(bean, proxyClass);
}
- result = proxyClass.newInstance();
+ result = createProxy(proxyClass);
}
catch (Exception e)
{
@@ -417,8 +288,7 @@ public final class JavassistProxyFactory
public Object createDependentScopedBeanProxy(OwbBean<?> bean, Object
actualInstance, CreationalContext<?> creastionalContext)
{
- Object result = null;
-
+
List<InterceptorData> interceptors = null;
List<Decorator<?>> decorators = null;
InjectionTargetBean<?> injectionTargetBean = null;
@@ -481,70 +351,83 @@ public final class JavassistProxyFactory
Class<?> proxyClass =
dependentScopedBeanProxyClasses.get(bean);
if (proxyClass == null)
{
- ProxyFactory fact = createProxyFactory(bean);
- proxyClass = getProxyClass(fact);
+ proxyClass = createProxyClass(bean);
dependentScopedBeanProxyClasses.putIfAbsent(bean,
proxyClass);
}
-
- result = proxyClass.newInstance();
+
+ Object result = createProxy(proxyClass);
if (!(bean instanceof WebBeansDecorator<?>) && !(bean
instanceof WebBeansInterceptor<?>))
{
setHandler(result, new
DependentScopedBeanInterceptorHandler(bean, actualInstance,
creastionalContext));
}
+ return result;
}
catch (Exception e)
{
WebBeansUtil.throwRuntimeExceptions(e);
}
- return result;
+ return null;
+ }
+
+ private Class<?> createProxyClass(OwbBean<?> bean)
+ {
+ final ProxyInfo info = getProxyInfo(bean);
+ return factory.getProxyClass(info.getSuperClass(),
info.getInterfaces());
}
+ public Class<?> createAbstractDecoratorProxyClass(OwbBean<?> bean)
+ {
+ return createProxyClass(bean);
+ }
- public Class<?> getProxyClass(ProxyFactory factory)
+ public boolean isProxyInstance(Object o)
{
- ClassLoaderProvider classLoaderProvider =
ProxyFactory.classLoaderProvider;
- Class<?> clazz = null;
- try
+ return factory.isProxyInstance(o);
+ }
+
+ public Object createProxy(MethodHandler handler, Class<?>[] interfaces)
+ throws IllegalAccessException, InstantiationException
+ {
+ return factory.createProxy(handler, interfaces);
+ }
+
+ private static class ProxyInfo
+ {
+ private final Class<?> superClass;
+ private final Class<?>[] interfaces;
+
+ private ProxyInfo(Class<?> superClass, Class<?>[] interfaces)
{
- clazz = doPrivilegedCreateClass(factory);
+ this.superClass = superClass;
+ this.interfaces = interfaces;
}
- catch(RuntimeException e)
- {
- if(classLoaderProvider instanceof
OpenWebBeansClassLoaderProvider)
- {
-
((OpenWebBeansClassLoaderProvider)classLoaderProvider).useCurrentClassLoader();
- }
- //try again with updated class loader
- clazz = doPrivilegedCreateClass(factory);
+ public Class<?> getSuperClass()
+ {
+ return superClass;
}
- finally
+
+ public Class<?>[] getInterfaces()
{
- if(classLoaderProvider instanceof
OpenWebBeansClassLoaderProvider)
- {
-
((OpenWebBeansClassLoaderProvider)classLoaderProvider).reset();
- }
+ return interfaces;
}
-
- return clazz;
}
-
- public ProxyFactory createProxyFactory(Bean<?> bean) throws Exception
+
+ private static ProxyInfo getProxyInfo(Bean<?> bean)
{
- Set<Type> types = bean.getTypes();
- Set<Class<?>> interfaceList = new HashSet<Class<?>>();
+ final Set<Class<?>> interfaceList = new HashSet<Class<?>>();
Class<?> superClass = null;
- for (Type generic : types)
+ for (Type generic : bean.getTypes())
{
Class<?> type = ClassUtil.getClazz(generic);
-
+
if (type.isInterface())
{
interfaceList.add(type);
}
-
+
else if ((superClass == null) ||
(superClass.isAssignableFrom(type) && type != Object.class))
{
superClass = type;
@@ -559,50 +442,6 @@ public final class JavassistProxyFactory
Class<?>[] interfaceArray = new Class<?>[interfaceList.size()];
interfaceArray = interfaceList.toArray(interfaceArray);
- ProxyFactory fact = new ProxyFactory();
- fact.setInterfaces(interfaceArray);
- fact.setSuperclass(superClass);
- fact.setFilter(FinalizeMethodFilter.INSTANCE);
-
- return fact;
-
- }
-
- /**
- * @param o the object to check
- * @return <code>true</code> if the given object is a proxy
- */
- public static boolean isProxyInstance(Object o)
- {
- return o instanceof ProxyObject;
- }
-
- private static class FinalizeMethodFilter implements MethodFilter
- {
- private static final String FINALIZE = "finalize".intern();
-
- public static final FinalizeMethodFilter INSTANCE = new
FinalizeMethodFilter();
-
- public boolean isHandled(final Method method)
- {
- return !(method.getName() == FINALIZE
- && method.getParameterTypes().length == 0
- && method.getReturnType() == Void.TYPE);
- }
- }
-
- protected static class PrivilegedActionForProxyFactory implements
PrivilegedAction<Object>
- {
- private ProxyFactory factory;
-
- protected PrivilegedActionForProxyFactory(ProxyFactory factory)
- {
- this.factory = factory;
- }
-
- public Object run()
- {
- return factory.createClass();
- }
+ return new ProxyInfo(superClass, interfaceArray);
}
}
Modified:
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/proxy/MethodHandler.java
URL:
http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/proxy/MethodHandler.java?rev=1384630&r1=1384629&r2=1384630&view=diff
==============================================================================
---
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/proxy/MethodHandler.java
(original)
+++
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/proxy/MethodHandler.java
Fri Sep 14 03:05:14 2012
@@ -18,9 +18,11 @@
*/
package org.apache.webbeans.proxy;
+import java.lang.reflect.InvocationHandler;
+
/**
* @version $Rev$ $Date$
*/
-public interface MethodHandler extends javassist.util.proxy.MethodHandler
+public interface MethodHandler extends javassist.util.proxy.MethodHandler,
InvocationHandler
{
}
Added:
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/proxy/asm/AsmFactory.java
URL:
http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/proxy/asm/AsmFactory.java?rev=1384630&view=auto
==============================================================================
---
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/proxy/asm/AsmFactory.java
(added)
+++
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/proxy/asm/AsmFactory.java
Fri Sep 14 03:05:14 2012
@@ -0,0 +1,78 @@
+/*
+ * 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.webbeans.proxy.asm;
+
+import java.lang.reflect.Proxy;
+
+import org.apache.webbeans.proxy.Factory;
+import org.apache.webbeans.proxy.MethodHandler;
+import org.apache.webbeans.util.WebBeansUtil;
+
+/**
+ * @version $Rev$ $Date$
+ */
+public class AsmFactory implements Factory
+{
+
+ public Object createProxy(MethodHandler handler, Class<?> superClass,
Class<?>[] interfaceArray)
+ {
+ if (useJdkProxy(superClass))
+ {
+ return
Proxy.newProxyInstance(WebBeansUtil.getCurrentClassLoader(),
interfaceArray, handler);
+ }
+ else
+ {
+ return
AsmProxyFactory.newProxyInstance(WebBeansUtil.getCurrentClassLoader(),
handler, superClass,
+ interfaceArray);
+ }
+
+ }
+
+ public Class<?> getProxyClass(Class<?> superClass, Class<?>[]
interfaces)
+ {
+ return null;
+ }
+
+ public boolean isProxyInstance(Object o)
+ {
+ return false;
+ }
+
+ public Object createProxy(MethodHandler handler, Class<?>[] interfaces)
+ throws InstantiationException, IllegalAccessException
+ {
+ return null;
+ }
+
+ public Object createProxy(Class<?> proxyClass)
+ throws InstantiationException, IllegalAccessException
+ {
+ return null;
+ }
+
+ public void setHandler(Object proxy, MethodHandler handler)
+ {
+ }
+
+ private boolean useJdkProxy(Class<?> superClass)
+ {
+ return superClass == null || superClass.equals(Object.class);
+ }
+
+}
Copied:
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/proxy/asm/AsmProxyFactory.java
(from r1384168,
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/proxy/AsmProxyFactory.java)
URL:
http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/proxy/asm/AsmProxyFactory.java?p2=openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/proxy/asm/AsmProxyFactory.java&p1=openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/proxy/AsmProxyFactory.java&r1=1384168&r2=1384630&rev=1384630&view=diff
==============================================================================
---
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/proxy/AsmProxyFactory.java
(original)
+++
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/proxy/asm/AsmProxyFactory.java
Fri Sep 14 03:05:14 2012
@@ -16,7 +16,7 @@
* specific language governing permissions and limitations
* under the License.
*/
-package org.apache.webbeans.proxy;
+package org.apache.webbeans.proxy.asm;
import java.io.ByteArrayOutputStream;
import java.io.PrintStream;
@@ -39,6 +39,7 @@ import java.util.HashMap;
import java.util.List;
import java.util.Map;
+import org.apache.webbeans.proxy.ProxyGenerationException;
import org.objectweb.asm.ClassWriter;
import org.objectweb.asm.Label;
import org.objectweb.asm.MethodVisitor;
Added:
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/proxy/javassist/JavassistFactory.java
URL:
http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/proxy/javassist/JavassistFactory.java?rev=1384630&view=auto
==============================================================================
---
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/proxy/javassist/JavassistFactory.java
(added)
+++
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/proxy/javassist/JavassistFactory.java
Fri Sep 14 03:05:14 2012
@@ -0,0 +1,145 @@
+/*
+ * 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.webbeans.proxy.javassist;
+
+import java.lang.reflect.Method;
+import java.security.AccessController;
+import java.security.PrivilegedAction;
+
+import javassist.util.proxy.MethodFilter;
+import javassist.util.proxy.ProxyFactory;
+import javassist.util.proxy.ProxyObject;
+import org.apache.webbeans.proxy.Factory;
+import org.apache.webbeans.proxy.MethodHandler;
+
+/**
+* @version $Rev$ $Date$
+*/
+public class JavassistFactory
+ implements Factory
+{
+ public Class<?> getProxyClass(Class<?> superClass, Class<?>[]
interfaces)
+ {
+ ProxyFactory fact = new ProxyFactory();
+ fact.setInterfaces(interfaces);
+ fact.setSuperclass(superClass);
+ fact.setFilter(FinalizeMethodFilter.INSTANCE);
+
+ return getProxyClass(fact);
+ }
+
+ private static Class<?> getProxyClass(ProxyFactory factory)
+ {
+ ProxyFactory.ClassLoaderProvider classLoaderProvider =
ProxyFactory.classLoaderProvider;
+ try
+ {
+ return doPrivilegedCreateClass(factory);
+ }
+ catch(RuntimeException e)
+ {
+ if(classLoaderProvider instanceof
OpenWebBeansClassLoaderProvider)
+ {
+
((OpenWebBeansClassLoaderProvider)classLoaderProvider).useCurrentClassLoader();
+ }
+
+ //try again with updated class loader
+ return doPrivilegedCreateClass(factory);
+ }
+ finally
+ {
+ if(classLoaderProvider instanceof
OpenWebBeansClassLoaderProvider)
+ {
+
((OpenWebBeansClassLoaderProvider)classLoaderProvider).reset();
+ }
+ }
+ }
+
+ public Object createProxy(Class<?> proxyClass)
+ throws InstantiationException, IllegalAccessException
+ {
+ return proxyClass.newInstance();
+ }
+
+
+ private static Class<?> doPrivilegedCreateClass(ProxyFactory factory)
+ {
+ if (System.getSecurityManager() == null)
+ {
+ return factory.createClass();
+ }
+ else
+ {
+ return (Class<?>) AccessController.doPrivileged(new
PrivilegedActionForProxyFactory(factory));
+ }
+ }
+
+ /**
+ * @param o the object to check
+ * @return <code>true</code> if the given object is a proxy
+ */
+ public boolean isProxyInstance(Object o)
+ {
+ return o instanceof ProxyObject;
+ }
+
+ public Object createProxy(MethodHandler handler, Class<?>[] interfaces)
+ throws InstantiationException, IllegalAccessException
+ {
+ ProxyFactory pf = new ProxyFactory();
+ pf.setInterfaces(interfaces);
+ pf.setHandler(handler);
+
+ return getProxyClass(pf).newInstance();
+ }
+
+ public void setHandler(Object proxy, MethodHandler handler)
+ {
+ ((ProxyObject)proxy).setHandler(handler);
+ }
+
+
+ protected static class PrivilegedActionForProxyFactory implements
PrivilegedAction<Object>
+ {
+ private ProxyFactory factory;
+
+ protected PrivilegedActionForProxyFactory(ProxyFactory factory)
+ {
+ this.factory = factory;
+ }
+
+ public Object run()
+ {
+ return factory.createClass();
+ }
+ }
+
+ public static class FinalizeMethodFilter implements MethodFilter
+ {
+ private static final String FINALIZE = "finalize".intern();
+
+ public static final FinalizeMethodFilter INSTANCE = new
FinalizeMethodFilter();
+
+ public boolean isHandled(final Method method)
+ {
+ return !(method.getName() == FINALIZE
+ && method.getParameterTypes().length == 0
+ && method.getReturnType() == Void.TYPE);
+ }
+ }
+}