Skip to content

Commit

Permalink
WELD-453 WELD-482 WELD-483 Mostly changes to our proxy class generati…
Browse files Browse the repository at this point in the history
…on process
  • Loading branch information
drallen committed Apr 20, 2010
1 parent ea5cb04 commit 3c4d9ed
Show file tree
Hide file tree
Showing 26 changed files with 1,368 additions and 384 deletions.
18 changes: 5 additions & 13 deletions impl/src/main/java/org/jboss/weld/bean/AbstractClassBean.java
Expand Up @@ -52,10 +52,11 @@
import org.jboss.interceptor.model.InterceptionModelBuilder;
import org.jboss.interceptor.model.InterceptorMetadata;
import org.jboss.interceptor.util.InterceptionUtils;
import org.jboss.interceptor.util.proxy.TargetInstanceProxy;
import org.jboss.weld.bean.interceptor.InterceptionMetadataService;
import org.jboss.weld.bean.interceptor.WeldClassReference;
import org.jboss.weld.bean.proxy.DecorationHelper;
import org.jboss.weld.bean.proxy.ProxyFactory;
import org.jboss.weld.bean.proxy.TargetBeanInstance;
import org.jboss.weld.bootstrap.BeanDeployerEnvironment;
import org.jboss.weld.context.SerializableContextualImpl;
import org.jboss.weld.ejb.EJBApiAbstraction;
Expand All @@ -71,8 +72,6 @@
import org.jboss.weld.metadata.cache.MetaAnnotationStore;
import org.jboss.weld.serialization.spi.helpers.SerializableContextual;
import org.jboss.weld.util.Beans;
import org.jboss.weld.util.Proxies;
import org.jboss.weld.util.Proxies.TypeInfo;
import org.jboss.weld.util.reflection.SecureReflections;
import org.slf4j.cal10n.LocLogger;

Expand Down Expand Up @@ -184,10 +183,6 @@ public void initialize(BeanDeployerEnvironment environment)
public void initializeAfterBeanDiscovery()
{
initDecorators();
if (hasDecorators())
{
initProxyClassForDecoratedBean();
}
super.initializeAfterBeanDiscovery();
}

Expand All @@ -201,15 +196,12 @@ public boolean hasDecorators()
return this.decorators != null && this.decorators.size() > 0;
}

protected void initProxyClassForDecoratedBean()
{
this.proxyClassForDecorators = Proxies.createProxyClass(TypeInfo.of(getTypes()).add(TargetInstanceProxy.class));
}

protected T applyDecorators(T instance, CreationalContext<T> creationalContext, InjectionPoint originalInjectionPoint)
{
T proxy = null;
DecorationHelper<T> decorationHelper = new DecorationHelper(instance, proxyClassForDecorators, beanManager, decorators);
TargetBeanInstance beanInstance = new TargetBeanInstance(this, instance);
ProxyFactory<T> proxyFactory = new ProxyFactory<T>(beanInstance);
DecorationHelper<T> decorationHelper = new DecorationHelper<T>(beanInstance, proxyFactory.getProxyClass(), beanManager, decorators);

DecorationHelper.getHelperStack().push(decorationHelper);
proxy = decorationHelper.getNextDelegate(originalInjectionPoint, creationalContext);
Expand Down
40 changes: 12 additions & 28 deletions impl/src/main/java/org/jboss/weld/bean/DecoratorImpl.java
Expand Up @@ -29,7 +29,6 @@
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashSet;
import java.util.Set;

Expand All @@ -39,6 +38,9 @@
import javax.inject.Inject;

import org.jboss.weld.bean.proxy.AbstractDecoratorMethodHandler;
import org.jboss.weld.bean.proxy.DecoratorProxyFactory;
import org.jboss.weld.bean.proxy.ProxyFactory;
import org.jboss.weld.bean.proxy.TargetBeanInstance;
import org.jboss.weld.bootstrap.BeanDeployerEnvironment;
import org.jboss.weld.exceptions.DefinitionException;
import org.jboss.weld.injection.MethodInjectionPoint;
Expand All @@ -53,7 +55,6 @@
import org.jboss.weld.manager.BeanManagerImpl;
import org.jboss.weld.resources.ClassTransformer;
import org.jboss.weld.util.Decorators;
import org.jboss.weld.util.Proxies;
import org.jboss.weld.util.reflection.Reflections;

public class DecoratorImpl<T> extends ManagedBean<T> implements WeldDecorator<T>
Expand Down Expand Up @@ -141,6 +142,15 @@ protected void initDecoratedTypes()
protected void initDelegateInjectionPoint()
{
this.delegateInjectionPoint = getDelegateInjectionPoints().iterator().next();
if (getWeldAnnotated().isAbstract())
{
Class<T> clazz = new DecoratorProxyFactory<T>(getWeldAnnotated().getJavaClass(), delegateInjectionPoint).getProxyClass();
proxyClassForAbstractDecorators = beanManager.getServices().get(ClassTransformer.class).loadClass(clazz);
constructorForAbstractDecorator = WeldConstructorImpl.of(
proxyClassForAbstractDecorators.getDeclaredWeldConstructor(getConstructor().getSignature()),
proxyClassForAbstractDecorators,
beanManager.getServices().get(ClassTransformer.class));
}
}

@Override
Expand Down Expand Up @@ -249,31 +259,6 @@ public Set<Type> getDecoratedTypes()
return delegateInjectionPoint;
}

@Override
protected void initType()
{
super.initType();
if (getWeldAnnotated().isAbstract())
{
Proxies.TypeInfo typeInfo = Proxies.TypeInfo.of(Collections.singleton(getWeldAnnotated().getJavaClass()));
Class<T> clazz = Proxies.createProxyClass(null, typeInfo);
proxyClassForAbstractDecorators = beanManager.getServices().get(ClassTransformer.class).loadClass(clazz);
}
}

@Override
protected void initConstructor()
{
super.initConstructor();
if (getWeldAnnotated().isAbstract())
{
constructorForAbstractDecorator = WeldConstructorImpl.of(
proxyClassForAbstractDecorators.getDeclaredWeldConstructor(getConstructor().getSignature()),
proxyClassForAbstractDecorators,
beanManager.getServices().get(ClassTransformer.class));
}
}

@Override
public void initDecorators()
{
Expand All @@ -291,7 +276,6 @@ protected T createInstance(CreationalContext<T> ctx)
{
ProxyClassConstructorInjectionPointWrapper<T> constructorInjectionPointWrapper = new ProxyClassConstructorInjectionPointWrapper<T>(this, constructorForAbstractDecorator, getConstructor());
T instance = constructorInjectionPointWrapper.newInstance(beanManager, ctx);
Proxies.attachMethodHandler(instance, new AbstractDecoratorMethodHandler(annotatedDelegateItem, getDelegateInjectionPoint(), constructorInjectionPointWrapper.getInjectedDelegate()));
return instance;
}
}
Expand Down
9 changes: 6 additions & 3 deletions impl/src/main/java/org/jboss/weld/bean/ManagedBean.java
Expand Up @@ -52,6 +52,8 @@
import org.jboss.weld.bean.interceptor.ClassInterceptionHandlerFactory;
import org.jboss.weld.bean.interceptor.InterceptionMetadataService;
import org.jboss.weld.bean.interceptor.WeldClassReference;
import org.jboss.weld.bean.proxy.ProxyFactory;
import org.jboss.weld.bean.proxy.TargetBeanInstance;
import org.jboss.weld.bootstrap.BeanDeployerEnvironment;
import org.jboss.weld.exceptions.DefinitionException;
import org.jboss.weld.exceptions.DeploymentException;
Expand All @@ -67,7 +69,6 @@
import org.jboss.weld.serialization.spi.helpers.SerializableContextual;
import org.jboss.weld.util.AnnotatedTypes;
import org.jboss.weld.util.Beans;
import org.jboss.weld.util.CleanableMethodHandler;
import org.jboss.weld.util.reflection.Reflections;
import org.slf4j.cal10n.LocLogger;
import org.slf4j.ext.XLogger;
Expand Down Expand Up @@ -581,8 +582,10 @@ protected T applyInterceptors(T instance, final CreationalContext<T> creationalC
if (interceptionRegistries.size() > 0)
{
InterceptorProxyCreatorImpl interceptorProxyCreator = new InterceptorProxyCreatorImpl(interceptionRegistries, interceptionHandlerFactories);
MethodHandler methodHandler = new CleanableMethodHandler(interceptorProxyCreator.createMethodHandler(instance, getType(), getBeanManager().getServices().get(InterceptionMetadataService.class).getInterceptorMetadataRegistry().getInterceptorClassMetadata(WeldClassReference.of(getWeldAnnotated()), true)));
instance = interceptorProxyCreator.createProxyInstance(InterceptionUtils.createProxyClassWithHandler(getType(), methodHandler), methodHandler);
MethodHandler methodHandler = interceptorProxyCreator.createMethodHandler(instance, getType(), getBeanManager().getServices().get(InterceptionMetadataService.class).getInterceptorMetadataRegistry().getInterceptorClassMetadata(WeldClassReference.of(getWeldAnnotated()), true));
TargetBeanInstance targetInstance = new TargetBeanInstance(this, instance);
targetInstance.setInterceptorsHandler(methodHandler);
instance = new ProxyFactory<T>(targetInstance).create(targetInstance);
}

}
Expand Down
10 changes: 5 additions & 5 deletions impl/src/main/java/org/jboss/weld/bean/SessionBean.java
Expand Up @@ -30,7 +30,6 @@
import static org.jboss.weld.logging.messages.BeanMessage.SCOPE_NOT_ALLOWED_ON_STATELESS_SESSION_BEAN;
import static org.jboss.weld.logging.messages.BeanMessage.SPECIALIZING_ENTERPRISE_BEAN_MUST_EXTEND_AN_ENTERPRISE_BEAN;

import java.io.Serializable;
import java.lang.annotation.Annotation;
import java.lang.reflect.Method;
import java.lang.reflect.Type;
Expand All @@ -55,7 +54,10 @@
import org.jboss.weld.bean.interceptor.InterceptorBindingsAdapter;
import org.jboss.weld.bean.proxy.EnterpriseBeanInstance;
import org.jboss.weld.bean.proxy.EnterpriseBeanProxyMethodHandler;
import org.jboss.weld.bean.proxy.EnterpriseProxyFactory;
import org.jboss.weld.bean.proxy.EnterpriseTargetBeanInstance;
import org.jboss.weld.bean.proxy.Marker;
import org.jboss.weld.bean.proxy.ProxyFactory;
import org.jboss.weld.bootstrap.BeanDeployerEnvironment;
import org.jboss.weld.ejb.InternalEjbDescriptor;
import org.jboss.weld.ejb.api.SessionObjectReference;
Expand All @@ -74,8 +76,6 @@
import org.jboss.weld.serialization.spi.helpers.SerializableContextual;
import org.jboss.weld.util.AnnotatedTypes;
import org.jboss.weld.util.Beans;
import org.jboss.weld.util.Proxies;
import org.jboss.weld.util.Proxies.TypeInfo;
import org.jboss.weld.util.reflection.HierarchyDiscovery;
import org.jboss.weld.util.reflection.SecureReflections;

Expand Down Expand Up @@ -245,7 +245,7 @@ protected void initTypes()

protected void initProxyClass()
{
this.proxyClass = Proxies.createProxyClass(TypeInfo.of(getTypes()).add(EnterpriseBeanInstance.class).add(Serializable.class));
this.proxyClass = new EnterpriseProxyFactory<T>(getWeldAnnotated().getJavaClass()).getProxyClass();
}

/**
Expand Down Expand Up @@ -322,7 +322,7 @@ public T create(final CreationalContext<T> creationalContext)
{
T instance = SecureReflections.newInstance(proxyClass);
creationalContext.push(instance);
Proxies.attachMethodHandler(instance, new EnterpriseBeanProxyMethodHandler<T>(SessionBean.this, creationalContext));
ProxyFactory.setBeanInstance(instance, new EnterpriseTargetBeanInstance(getWeldAnnotated().getJavaClass(), new EnterpriseBeanProxyMethodHandler<T>(SessionBean.this, creationalContext)));
if (hasDecorators())
{
instance = applyDecorators(instance, creationalContext, null);
Expand Down
Expand Up @@ -16,10 +16,6 @@
*/
package org.jboss.weld.bean.builtin.ee;

import static org.jboss.weld.logging.messages.BeanMessage.PROXY_INSTANTIATION_BEAN_ACCESS_FAILED;
import static org.jboss.weld.logging.messages.BeanMessage.PROXY_INSTANTIATION_FAILED;

import java.io.Serializable;
import java.lang.reflect.Type;
import java.util.HashSet;
import java.util.Set;
Expand All @@ -29,16 +25,15 @@

import org.jboss.weld.bean.builtin.AbstractBuiltInBean;
import org.jboss.weld.bean.builtin.CallableMethodHandler;
import org.jboss.weld.exceptions.DefinitionException;
import org.jboss.weld.bean.proxy.EnterpriseTargetBeanInstance;
import org.jboss.weld.bean.proxy.ProxyFactory;
import org.jboss.weld.manager.BeanManagerImpl;
import org.jboss.weld.util.Proxies;
import org.jboss.weld.util.Proxies.TypeInfo;

public abstract class AbstractEEBean<T> extends AbstractBuiltInBean<T>
{
private final T proxy;
private final Class<T> type;

private final T proxy;
private final Class<T> type;
private final Set<Type> types;

protected AbstractEEBean(Class<T> type, Callable<T> callable, BeanManagerImpl beanManager)
Expand All @@ -48,36 +43,25 @@ protected AbstractEEBean(Class<T> type, Callable<T> callable, BeanManagerImpl be
this.types = new HashSet<Type>();
this.types.add(Object.class);
this.types.add(type);
try
{
this.proxy = Proxies.<T>createProxy(new CallableMethodHandler(callable), TypeInfo.of(getTypes()).add(Serializable.class));
}
catch (InstantiationException e)
{
throw new DefinitionException(PROXY_INSTANTIATION_FAILED, e, this);
}
catch (IllegalAccessException e)
{
throw new DefinitionException(PROXY_INSTANTIATION_BEAN_ACCESS_FAILED, e, this);
}
this.proxy = new ProxyFactory<T>(type).create(new EnterpriseTargetBeanInstance(type, new CallableMethodHandler(callable)));
}

public T create(CreationalContext<T> creationalContext)
{
return proxy;
}
public void destroy(T instance, CreationalContext<T> creationalContext)

public void destroy(T instance, CreationalContext<T> creationalContext)
{
// no-op
}

@Override
public Class<T> getType()
{
return type;
}

public Set<Type> getTypes()
{
return types;
Expand Down

0 comments on commit 3c4d9ed

Please sign in to comment.