You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openwebbeans.apache.org by ar...@apache.org on 2013/01/18 01:14:24 UTC
svn commit: r1434980 - in /openwebbeans/trunk/webbeans-impl/src:
main/java/org/apache/webbeans/context/creational/
main/java/org/apache/webbeans/inject/
main/java/org/apache/webbeans/intercept/
main/java/org/apache/webbeans/portable/ test/java/org/apac...
Author: arne
Date: Fri Jan 18 00:14:23 2013
New Revision: 1434980
URL: http://svn.apache.org/viewvc?rev=1434980&view=rev
Log:
OWB-344: Implemented decorator stack creation
Modified:
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/context/creational/CreationalContextImpl.java
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/inject/AbstractInjectable.java
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/inject/InjectableConstructor.java
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/inject/InjectableField.java
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/inject/InjectableMethod.java
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/intercept/DecoratorHandler.java
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/intercept/DefaultInterceptorHandler.java
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/portable/InjectionTargetImpl.java
openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/newtests/interceptors/business/tests/NewProxyTest.java
openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/newtests/interceptors/resolution/InterceptorProxyChainTest.java
Modified: openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/context/creational/CreationalContextImpl.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/context/creational/CreationalContextImpl.java?rev=1434980&r1=1434979&r2=1434980&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/context/creational/CreationalContextImpl.java (original)
+++ openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/context/creational/CreationalContextImpl.java Fri Jan 18 00:14:23 2013
@@ -50,6 +50,11 @@ public class CreationalContextImpl<T> im
private static final long serialVersionUID = 1L;
/**
+ * The delegate object to be injected into delegate injection points
+ */
+ private transient T delegate;
+
+ /**
* Contextual bean dependent instances
* key: contextual instance --> value: dependents
*
@@ -149,7 +154,21 @@ public class CreationalContextImpl<T> im
return null;
}
-
+ public T getDelegate()
+ {
+ return this.delegate;
+ }
+
+ /**
+ * @return the previously set delegate instance
+ */
+ public T putDelegate(T delegate)
+ {
+ T oldValue = this.delegate;
+ this.delegate = delegate;
+ return oldValue;
+ }
+
/**
* Save this incomplete instance.
*
Modified: openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/inject/AbstractInjectable.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/inject/AbstractInjectable.java?rev=1434980&r1=1434979&r2=1434980&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/inject/AbstractInjectable.java (original)
+++ openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/inject/AbstractInjectable.java Fri Jan 18 00:14:23 2013
@@ -64,7 +64,7 @@ public abstract class AbstractInjectable
private Producer<?> owner;
- private CreationalContextImpl<?> context;
+ protected final CreationalContextImpl<?> creationalContext;
/**
* @deprecated TODO remove this public ThreadLocal!
@@ -74,7 +74,7 @@ public abstract class AbstractInjectable
protected AbstractInjectable(Producer<?> owner, CreationalContextImpl<?> creationalContext)
{
this.owner = owner;
- this.context = creationalContext;
+ this.creationalContext = creationalContext;
}
/**
@@ -85,7 +85,7 @@ public abstract class AbstractInjectable
public T inject(InjectionPoint injectionPoint)
{
T injected;
- BeanManagerImpl beanManager = context.getWebBeansContext().getBeanManagerImpl();
+ BeanManagerImpl beanManager = creationalContext.getWebBeansContext().getBeanManagerImpl();
//Injected contextual beam
InjectionResolver instance = beanManager.getInjectionResolver();
@@ -117,7 +117,7 @@ public abstract class AbstractInjectable
{
if(injectedBean instanceof AbstractProducerBean)
{
- if((context.getBean() instanceof OwbBean) && ((OwbBean<?>) context.getBean()).isPassivationCapable())
+ if((creationalContext.getBean() instanceof OwbBean) && ((OwbBean<?>) creationalContext.getBean()).isPassivationCapable())
{
dependentProducer = true;
}
@@ -126,7 +126,7 @@ public abstract class AbstractInjectable
}
//Gets injectable reference for injected bean
- injected = (T) beanManager.getInjectableReference(injectionPoint, context);
+ injected = (T) beanManager.getInjectableReference(injectionPoint, creationalContext);
/*X TODO see spec issue CDI-140 */
if(dependentProducer)
@@ -143,7 +143,7 @@ public abstract class AbstractInjectable
{
if(instanceUnderInjection.get() != null)
{
- context.addDependent(instanceUnderInjection.get(), injectedBean, injected);
+ creationalContext.addDependent(instanceUnderInjection.get(), injectedBean, injected);
}
}
}
@@ -161,12 +161,12 @@ public abstract class AbstractInjectable
protected Contextual<?> getBean()
{
- return context.getBean();
+ return creationalContext.getBean();
}
protected WebBeansContext getWebBeansContext()
{
- return context.getWebBeansContext();
+ return creationalContext.getWebBeansContext();
}
/**
Modified: openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/inject/InjectableConstructor.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/inject/InjectableConstructor.java?rev=1434980&r1=1434979&r2=1434980&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/inject/InjectableConstructor.java (original)
+++ openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/inject/InjectableConstructor.java Fri Jan 18 00:14:23 2013
@@ -72,6 +72,11 @@ public class InjectableConstructor<T> ex
AnnotatedParameter<?> parameter = (AnnotatedParameter<?>)point.getAnnotated();
if(parameter.getPosition() == i)
{
+ if (point.isDelegate())
+ {
+ list.add(creationalContext.getDelegate());
+ break;
+ }
list.add(inject(point));
break;
}
Modified: openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/inject/InjectableField.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/inject/InjectableField.java?rev=1434980&r1=1434979&r2=1434980&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/inject/InjectableField.java (original)
+++ openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/inject/InjectableField.java Fri Jan 18 00:14:23 2013
@@ -55,7 +55,15 @@ public class InjectableField<T> extends
getWebBeansContext().getSecurityService().doPrivilegedSetAccessible(field, true);
}
- Object object = inject(injectedField);
+ Object object;
+ if (injectedField.isDelegate())
+ {
+ object = creationalContext.getDelegate();
+ }
+ else
+ {
+ object = inject(injectedField);
+ }
field.set(instance, object);
Modified: openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/inject/InjectableMethod.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/inject/InjectableMethod.java?rev=1434980&r1=1434979&r2=1434980&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/inject/InjectableMethod.java (original)
+++ openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/inject/InjectableMethod.java Fri Jan 18 00:14:23 2013
@@ -83,8 +83,14 @@ public class InjectableMethod<T> extends
for(InjectionPoint point : injectedPoints)
{
AnnotatedParameter<?> parameter = (AnnotatedParameter<?>)point.getAnnotated();
- if(parameter.getPosition() == i)
+ if (parameter.getPosition() == i)
{
+ if (point.isDelegate())
+ {
+ list.add(creationalContext.getDelegate());
+ break;
+ }
+
boolean injectionPoint = false;
if(getBean() instanceof ProducerMethodBean)
{
Modified: openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/intercept/DecoratorHandler.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/intercept/DecoratorHandler.java?rev=1434980&r1=1434979&r2=1434980&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/intercept/DecoratorHandler.java (original)
+++ openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/intercept/DecoratorHandler.java Fri Jan 18 00:14:23 2013
@@ -39,9 +39,9 @@ public class DecoratorHandler implements
private int index;
private Object target;
- public DecoratorHandler(BeanInterceptorInfo interceptorInfo, List<Decorator<?>> decorators, Map<Decorator<?>, ?> instances, int index, Object target) {
+ public DecoratorHandler(BeanInterceptorInfo interceptorInfo, Map<Decorator<?>, ?> instances, int index, Object target) {
this.interceptorInfo = interceptorInfo;
- this.decorators = decorators;
+ this.decorators = interceptorInfo.getDecorators();
this.instances = instances;
this.index = index;
this.target = target;
Modified: openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/intercept/DefaultInterceptorHandler.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/intercept/DefaultInterceptorHandler.java?rev=1434980&r1=1434979&r2=1434980&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/intercept/DefaultInterceptorHandler.java (original)
+++ openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/intercept/DefaultInterceptorHandler.java Fri Jan 18 00:14:23 2013
@@ -32,14 +32,17 @@ public class DefaultInterceptorHandler<T
{
private T target;
+ private T delegate;
private Map<Method, List<Interceptor<?>>> interceptors;
private Map<Interceptor<?>, ?> instances;
public DefaultInterceptorHandler(T target,
+ T delegate,
Map<Method, List<Interceptor<?>>> interceptors,
Map<Interceptor<?>, ?> instances)
{
this.target = target;
+ this.delegate = delegate;
this.instances = instances;
this.interceptors = interceptors;
}
@@ -49,6 +52,11 @@ public class DefaultInterceptorHandler<T
return target;
}
+ public T getDelegate()
+ {
+ return delegate;
+ }
+
public Map<Interceptor<?>, ?> getInstances()
{
return instances;
@@ -66,7 +74,7 @@ public class DefaultInterceptorHandler<T
List<Interceptor<?>> methodInterceptors = interceptors.get(method);
InterceptorInvocationContext<T> ctx
- = new InterceptorInvocationContext<T>(target, InterceptionType.AROUND_INVOKE, methodInterceptors, instances, method, parameters);
+ = new InterceptorInvocationContext<T>(delegate, InterceptionType.AROUND_INVOKE, methodInterceptors, instances, method, parameters);
return ctx.proceed();
}
Modified: openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/portable/InjectionTargetImpl.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/portable/InjectionTargetImpl.java?rev=1434980&r1=1434979&r2=1434980&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/portable/InjectionTargetImpl.java (original)
+++ openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/portable/InjectionTargetImpl.java Fri Jan 18 00:14:23 2013
@@ -40,6 +40,7 @@ import javax.enterprise.inject.spi.Annot
import javax.enterprise.inject.spi.AnnotatedMethod;
import javax.enterprise.inject.spi.AnnotatedParameter;
import javax.enterprise.inject.spi.AnnotatedType;
+import javax.enterprise.inject.spi.Decorator;
import javax.enterprise.inject.spi.InjectionPoint;
import javax.enterprise.inject.spi.InjectionTarget;
import javax.enterprise.inject.spi.InterceptionType;
@@ -50,12 +51,15 @@ import javax.interceptor.InvocationConte
import org.apache.webbeans.config.OWBLogConst;
import org.apache.webbeans.config.WebBeansContext;
import org.apache.webbeans.context.creational.CreationalContextImpl;
+import org.apache.webbeans.decorator.DelegateHandler;
import org.apache.webbeans.exception.WebBeansException;
import org.apache.webbeans.inject.InjectableConstructor;
import org.apache.webbeans.inject.InjectableField;
import org.apache.webbeans.inject.InjectableMethod;
+import org.apache.webbeans.intercept.DecoratorHandler;
import org.apache.webbeans.intercept.DefaultInterceptorHandler;
import org.apache.webbeans.intercept.LifecycleInterceptorInvocationContext;
+import org.apache.webbeans.intercept.InterceptorResolutionService.BeanInterceptorInfo;
import org.apache.webbeans.logger.WebBeansLoggerFacade;
import org.apache.webbeans.proxy.InterceptorDecoratorProxyFactory;
import org.apache.webbeans.proxy.InterceptorHandler;
@@ -64,9 +68,6 @@ import org.apache.webbeans.spi.ResourceI
import org.apache.webbeans.util.Asserts;
import org.apache.webbeans.util.ExceptionUtil;
-
-import static org.apache.webbeans.intercept.InterceptorResolutionService.BeanInterceptorInfo;
-
public class InjectionTargetImpl<T> extends AbstractProducer<T> implements InjectionTarget<T>
{
@@ -190,7 +191,22 @@ public class InjectionTargetImpl<T> exte
interceptorInstances.put(interceptorInfo.getSelfInterceptorBean(), instance);
}
- InterceptorHandler interceptorHandler = new DefaultInterceptorHandler<T>(instance, methodInterceptors, interceptorInstances);
+ T delegate = instance;
+ if (interceptorInfo.getDecorators() != null)
+ {
+ List<Decorator<?>> decorators = interceptorInfo.getDecorators();
+ Map<Decorator<?>, Object> instances = new HashMap<Decorator<?>, Object>();
+ for (int i = decorators.size(); i > 0; i--)
+ {
+ Decorator<?> decorator = decorators.get(i - 1);
+ CreationalContextImpl<T> creationalContextImpl = (CreationalContextImpl<T>)creationalContext;
+ creationalContextImpl.putDelegate(delegate);
+ Object decoratorInstance = decorator.create((CreationalContext) creationalContext);
+ instances.put(decorator, decoratorInstance);
+ delegate = pf.createProxyInstance(proxyClass, instance, new DecoratorHandler(interceptorInfo, instances, i - 1, instance));
+ }
+ }
+ InterceptorHandler interceptorHandler = new DefaultInterceptorHandler<T>(instance, delegate, methodInterceptors, interceptorInstances);
T proxyInstance = pf.createProxyInstance(proxyClass, instance, interceptorHandler);
instance = proxyInstance;
Modified: openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/newtests/interceptors/business/tests/NewProxyTest.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/newtests/interceptors/business/tests/NewProxyTest.java?rev=1434980&r1=1434979&r2=1434980&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/newtests/interceptors/business/tests/NewProxyTest.java (original)
+++ openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/newtests/interceptors/business/tests/NewProxyTest.java Fri Jan 18 00:14:23 2013
@@ -75,7 +75,7 @@ public class NewProxyTest extends Abstra
Map instances = new HashMap();
instances.put(interceptorBean, interceptor);
InterceptorHandler interceptorHandler
- = new DefaultInterceptorHandler<RuntimeExceptionBindingTypeBean>(target, interceptors, instances);
+ = new DefaultInterceptorHandler<RuntimeExceptionBindingTypeBean>(target, target, interceptors, instances);
InterceptorDecoratorProxyFactory factory = new InterceptorDecoratorProxyFactory(getWebBeansContext());
Class<RuntimeExceptionBindingTypeBean> proxyClass
Modified: openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/newtests/interceptors/resolution/InterceptorProxyChainTest.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/newtests/interceptors/resolution/InterceptorProxyChainTest.java?rev=1434980&r1=1434979&r2=1434980&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/newtests/interceptors/resolution/InterceptorProxyChainTest.java (original)
+++ openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/newtests/interceptors/resolution/InterceptorProxyChainTest.java Fri Jan 18 00:14:23 2013
@@ -140,7 +140,7 @@ public class InterceptorProxyChainTest e
interceptorInstances.put(interceptorBean, interceptorInstance);
}
InterceptorHandler interceptorHandler
- = new DefaultInterceptorHandler<ClassMultiInterceptedClass>(internalInstance, methodInterceptors, interceptorInstances);
+ = new DefaultInterceptorHandler<ClassMultiInterceptedClass>(internalInstance, internalInstance, methodInterceptors, interceptorInstances);
ClassMultiInterceptedClass proxyInstance = pf.createProxyInstance(proxyClass, internalInstance, interceptorHandler);
Assert.assertNotNull(proxyInstance);