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/04/07 19:26:48 UTC
svn commit: r1465432 [1/2] - in /openwebbeans/trunk:
webbeans-ee/src/main/java/org/apache/webbeans/ee/event/
webbeans-ejb/src/main/java/org/apache/webbeans/ejb/common/util/
webbeans-impl/src/main/java/org/apache/webbeans/annotation/
webbeans-impl/src/m...
Author: arne
Date: Sun Apr 7 17:26:47 2013
New Revision: 1465432
URL: http://svn.apache.org/r1465432
Log:
OWB-766 and OWB-815: Implemented EventMetadata and InjectionPoint injection without ThreadLocals
Added:
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/event/EventMetadata.java
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/event/EventMetadataImpl.java
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/event/OwbObserverMethod.java
Modified:
openwebbeans/trunk/webbeans-ee/src/main/java/org/apache/webbeans/ee/event/TransactionalEventNotifier.java
openwebbeans/trunk/webbeans-ejb/src/main/java/org/apache/webbeans/ejb/common/util/EjbValidator.java
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/annotation/AnyLiteral.java
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/annotation/DefaultLiteral.java
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/creation/BeanAttributesBuilder.java
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/config/BeansDeployer.java
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/container/BeanManagerImpl.java
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/container/InjectionResolver.java
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/context/creational/CreationalContextFactory.java
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/context/creational/CreationalContextImpl.java
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/event/EventImpl.java
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/event/EventUtil.java
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/event/NotificationManager.java
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/event/ObserverMethodImpl.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/instance/InstanceImpl.java
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/portable/InjectionPointProducer.java
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/portable/InstanceProducer.java
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/util/AnnotationUtil.java
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/util/ClassUtil.java
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/util/WebBeansUtil.java
openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/newtests/injection/injectionpoint/tests/DependentProducerMethodInjectionPointTest.java
openwebbeans/trunk/webbeans-web/src/main/java/org/apache/webbeans/servlet/WebBeansConfigurationFilter.java
openwebbeans/trunk/webbeans-web/src/main/java/org/apache/webbeans/servlet/WebBeansConfigurationListener.java
openwebbeans/trunk/webbeans-web/src/main/java/org/apache/webbeans/web/lifecycle/WebContainerLifecycle.java
Modified: openwebbeans/trunk/webbeans-ee/src/main/java/org/apache/webbeans/ee/event/TransactionalEventNotifier.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-ee/src/main/java/org/apache/webbeans/ee/event/TransactionalEventNotifier.java?rev=1465432&r1=1465431&r2=1465432&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-ee/src/main/java/org/apache/webbeans/ee/event/TransactionalEventNotifier.java (original)
+++ openwebbeans/trunk/webbeans-ee/src/main/java/org/apache/webbeans/ee/event/TransactionalEventNotifier.java Sun Apr 7 17:26:47 2013
@@ -26,6 +26,8 @@ import javax.transaction.Transaction;
import org.apache.webbeans.config.OWBLogConst;
import org.apache.webbeans.config.WebBeansContext;
+import org.apache.webbeans.event.EventMetadata;
+import org.apache.webbeans.event.OwbObserverMethod;
import org.apache.webbeans.logger.WebBeansLoggerFacade;
import org.apache.webbeans.spi.TransactionService;
@@ -45,7 +47,7 @@ public class TransactionalEventNotifier
/**
* This will get called by the EJB integration code
*/
- public static void registerTransactionSynchronization(TransactionPhase phase, ObserverMethod<? super Object> observer, Object event) throws Exception
+ public static void registerTransactionSynchronization(TransactionPhase phase, ObserverMethod<? super Object> observer, Object event, EventMetadata metadata) throws Exception
{
TransactionService transactionService = WebBeansContext.currentInstance().getService(TransactionService.class);
@@ -59,19 +61,19 @@ public class TransactionalEventNotifier
{
if (phase.equals(TransactionPhase.AFTER_COMPLETION))
{
- transaction.registerSynchronization(new AfterCompletion(observer, event));
+ transaction.registerSynchronization(new AfterCompletion(observer, event, metadata));
}
else if (phase.equals(TransactionPhase.AFTER_SUCCESS))
{
- transaction.registerSynchronization(new AfterCompletionSuccess(observer, event));
+ transaction.registerSynchronization(new AfterCompletionSuccess(observer, event, metadata));
}
else if (phase.equals(TransactionPhase.AFTER_FAILURE))
{
- transaction.registerSynchronization(new AfterCompletionFailure(observer, event));
+ transaction.registerSynchronization(new AfterCompletionFailure(observer, event, metadata));
}
else if (phase.equals(TransactionPhase.BEFORE_COMPLETION))
{
- transaction.registerSynchronization(new BeforeCompletion(observer, event));
+ transaction.registerSynchronization(new BeforeCompletion(observer, event, metadata));
}
else
{
@@ -85,11 +87,13 @@ public class TransactionalEventNotifier
private final ObserverMethod<T> observer;
private final T event;
+ private final EventMetadata metadata;
- public AbstractSynchronization(ObserverMethod<T> observer, T event)
+ public AbstractSynchronization(ObserverMethod<T> observer, T event, EventMetadata metadata)
{
this.observer = observer;
this.event = event;
+ this.metadata = metadata;
}
public void beforeCompletion()
@@ -106,7 +110,14 @@ public class TransactionalEventNotifier
{
try
{
- observer.notify(event);
+ if (observer instanceof OwbObserverMethod)
+ {
+ ((OwbObserverMethod<T>)observer).notify(event, metadata);
+ }
+ else
+ {
+ observer.notify(event);
+ }
}
catch (Exception e)
{
@@ -117,9 +128,9 @@ public class TransactionalEventNotifier
private final static class BeforeCompletion extends AbstractSynchronization
{
- private BeforeCompletion(ObserverMethod observer, Object event)
+ private BeforeCompletion(ObserverMethod observer, Object event, EventMetadata metadata)
{
- super(observer, event);
+ super(observer, event, metadata);
}
@Override
@@ -131,9 +142,9 @@ public class TransactionalEventNotifier
private final static class AfterCompletion extends AbstractSynchronization
{
- private AfterCompletion(ObserverMethod observer, Object event)
+ private AfterCompletion(ObserverMethod observer, Object event, EventMetadata metadata)
{
- super(observer, event);
+ super(observer, event, metadata);
}
@Override
@@ -145,9 +156,9 @@ public class TransactionalEventNotifier
private final static class AfterCompletionSuccess extends AbstractSynchronization
{
- private AfterCompletionSuccess(ObserverMethod observer, Object event)
+ private AfterCompletionSuccess(ObserverMethod observer, Object event, EventMetadata metadata)
{
- super(observer, event);
+ super(observer, event, metadata);
}
@Override
@@ -162,9 +173,9 @@ public class TransactionalEventNotifier
private final static class AfterCompletionFailure extends AbstractSynchronization
{
- private AfterCompletionFailure(ObserverMethod observer, Object event)
+ private AfterCompletionFailure(ObserverMethod observer, Object event, EventMetadata metadata)
{
- super(observer, event);
+ super(observer, event, metadata);
}
@Override
Modified: openwebbeans/trunk/webbeans-ejb/src/main/java/org/apache/webbeans/ejb/common/util/EjbValidator.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-ejb/src/main/java/org/apache/webbeans/ejb/common/util/EjbValidator.java?rev=1465432&r1=1465431&r2=1465432&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-ejb/src/main/java/org/apache/webbeans/ejb/common/util/EjbValidator.java (original)
+++ openwebbeans/trunk/webbeans-ejb/src/main/java/org/apache/webbeans/ejb/common/util/EjbValidator.java Sun Apr 7 17:26:47 2013
@@ -20,7 +20,6 @@ package org.apache.webbeans.ejb.common.u
import java.lang.annotation.Annotation;
import java.lang.reflect.Method;
-import java.lang.reflect.Modifier;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
@@ -28,6 +27,8 @@ import java.util.Set;
import javax.decorator.Decorator;
import javax.enterprise.context.ApplicationScoped;
import javax.enterprise.context.Dependent;
+import javax.enterprise.inject.spi.AnnotatedMethod;
+import javax.enterprise.inject.spi.AnnotatedType;
import javax.enterprise.inject.spi.ObserverMethod;
import javax.enterprise.inject.spi.SessionBeanType;
import javax.interceptor.Interceptor;
@@ -35,6 +36,7 @@ import javax.interceptor.Interceptor;
import org.apache.webbeans.ejb.common.component.BaseEjbBean;
import org.apache.webbeans.event.ObserverMethodImpl;
import org.apache.webbeans.exception.WebBeansConfigurationException;
+import org.apache.webbeans.portable.AnnotatedElementFactory;
import org.apache.webbeans.util.AnnotationUtil;
import org.apache.webbeans.util.Asserts;
import org.apache.webbeans.util.ClassUtil;
@@ -128,12 +130,12 @@ public final class EjbValidator
}
}
- public static void validateObserverMethods(BaseEjbBean<?> bean, Set<ObserverMethod<?>> observers)
+ public static <T> void validateObserverMethods(BaseEjbBean<?> bean, Set<ObserverMethod<T>> observers)
{
- for(ObserverMethod<?> observer : observers)
+ for(ObserverMethod<T> observer : observers)
{
- ObserverMethodImpl<?> obs = (ObserverMethodImpl<?>)observer;
- Method method = obs.getObserverMethod();
+ ObserverMethodImpl<T> obs = (ObserverMethodImpl<T>)observer;
+ AnnotatedMethod<T> method = obs.getObserverMethod();
List<?> locals = bean.getBusinessLocalInterfaces();
if(locals != null)
{
@@ -143,7 +145,7 @@ public final class EjbValidator
{
Class<?> clazz = (Class<?>)it.next();
Method classMethod = bean.getWebBeansContext().getSecurityService().
- doPrivilegedGetDeclaredMethod(clazz, method.getName(), method.getParameterTypes());
+ doPrivilegedGetDeclaredMethod(clazz, method.getJavaMember().getName(), method.getJavaMember().getParameterTypes());
if(classMethod == null)
{
continue;
@@ -151,7 +153,9 @@ public final class EjbValidator
else
{
//Should only be a single method that matches the names & params
- obs.setObserverMethod(classMethod);
+ AnnotatedElementFactory annotatedElementFactory = bean.getWebBeansContext().getAnnotatedElementFactory();
+ AnnotatedType<T> declaringType = (AnnotatedType<T>) annotatedElementFactory.newAnnotatedType(classMethod.getDeclaringClass());
+ obs.setObserverMethod(annotatedElementFactory.newAnnotatedMethod(classMethod, declaringType));
found = true;
break;
}
@@ -159,9 +163,9 @@ public final class EjbValidator
if(!found)
{
- if(!Modifier.isStatic(method.getModifiers()))
+ if(!method.isStatic())
{
- throw new WebBeansConfigurationException("Observer method : " + method.getName() + " in session bean class : " +
+ throw new WebBeansConfigurationException("Observer method : " + method.getJavaMember().getName() + " in session bean class : " +
bean.getBeanClass() + " must be business method");
}
}
Modified: openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/annotation/AnyLiteral.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/annotation/AnyLiteral.java?rev=1465432&r1=1465431&r2=1465432&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/annotation/AnyLiteral.java (original)
+++ openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/annotation/AnyLiteral.java Sun Apr 7 17:26:47 2013
@@ -18,10 +18,15 @@
*/
package org.apache.webbeans.annotation;
+import java.lang.annotation.Annotation;
+
import javax.enterprise.inject.Any;
public class AnyLiteral extends EmptyAnnotationLiteral<Any> implements Any
{
+ public static final AnyLiteral INSTANCE = new AnyLiteral();
+ public static final Annotation[] ARRAY = new Annotation[]{AnyLiteral.INSTANCE};
+
private static final String TOSTRING = "@javax.enterprise.inject.Any()";
private static final long serialVersionUID = -8922048102786275371L;
Modified: openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/annotation/DefaultLiteral.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/annotation/DefaultLiteral.java?rev=1465432&r1=1465431&r2=1465432&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/annotation/DefaultLiteral.java (original)
+++ openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/annotation/DefaultLiteral.java Sun Apr 7 17:26:47 2013
@@ -18,6 +18,8 @@
*/
package org.apache.webbeans.annotation;
+import java.lang.annotation.Annotation;
+
import javax.enterprise.inject.Default;
/**
@@ -28,6 +30,7 @@ import javax.enterprise.inject.Default;
public class DefaultLiteral extends EmptyAnnotationLiteral<Default> implements Default
{
public static final DefaultLiteral INSTANCE = new DefaultLiteral();
+ public static final Annotation[] ARRAY = new Annotation[]{DefaultLiteral.INSTANCE};
private static final String TOSTRING = "@javax.enterprise.inject.Default()";
private static final long serialVersionUID = 6788272256977634238L;
Modified: openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/creation/BeanAttributesBuilder.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/creation/BeanAttributesBuilder.java?rev=1465432&r1=1465431&r2=1465432&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/creation/BeanAttributesBuilder.java (original)
+++ openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/creation/BeanAttributesBuilder.java Sun Apr 7 17:26:47 2013
@@ -220,7 +220,7 @@ public abstract class BeanAttributesBuil
//Add @Any support
if(!hasAnyQualifier())
{
- qualifiers.add(new AnyLiteral());
+ qualifiers.add(AnyLiteral.INSTANCE);
}
}
Modified: openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/config/BeansDeployer.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/config/BeansDeployer.java?rev=1465432&r1=1465431&r2=1465432&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/config/BeansDeployer.java (original)
+++ openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/config/BeansDeployer.java Sun Apr 7 17:26:47 2013
@@ -924,7 +924,7 @@ public class BeansDeployer
for(ObserverMethod<?> observerMethod : observerMethods)
{
ObserverMethodImpl<?> impl = (ObserverMethodImpl<?>)observerMethod;
- AnnotatedMethod<?> method = webBeansContext.getAnnotatedElementFactory().newAnnotatedMethod(impl.getObserverMethod(), annotatedType);
+ AnnotatedMethod<?> method = impl.getObserverMethod();
observerMethodsMap.put(observerMethod, method);
}
Modified: openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/container/BeanManagerImpl.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/container/BeanManagerImpl.java?rev=1465432&r1=1465431&r2=1465432&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/container/BeanManagerImpl.java (original)
+++ openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/container/BeanManagerImpl.java Sun Apr 7 17:26:47 2013
@@ -64,6 +64,7 @@ import javax.naming.NamingException;
import javax.naming.Reference;
import javax.naming.Referenceable;
import javax.naming.StringRefAddr;
+
import org.apache.webbeans.component.AbstractOwbBean;
import org.apache.webbeans.component.BeanAttributesImpl;
import org.apache.webbeans.component.EnterpriseBeanMarker;
@@ -77,13 +78,14 @@ import org.apache.webbeans.component.thi
import org.apache.webbeans.config.WebBeansContext;
import org.apache.webbeans.context.creational.CreationalContextImpl;
import org.apache.webbeans.decorator.DecoratorComparator;
+import org.apache.webbeans.event.EventMetadata;
+import org.apache.webbeans.event.EventMetadataImpl;
import org.apache.webbeans.event.NotificationManager;
import org.apache.webbeans.exception.WebBeansConfigurationException;
import org.apache.webbeans.exception.definition.DuplicateDefinitionException;
import org.apache.webbeans.exception.inject.DefinitionException;
import org.apache.webbeans.plugins.OpenWebBeansJmsPlugin;
import org.apache.webbeans.portable.AnnotatedElementFactory;
-import org.apache.webbeans.portable.InjectionPointProducer;
import org.apache.webbeans.portable.InjectionTargetImpl;
import org.apache.webbeans.portable.events.discovery.ErrorStack;
import org.apache.webbeans.spi.ScannerService;
@@ -406,13 +408,18 @@ public class BeanManagerImpl implements
* {@inheritDoc}
*/
public void fireEvent(Object event, Annotation... bindings)
+ {
+ fireEvent(event, new EventMetadataImpl(event.getClass(), null, bindings));
+ }
+
+ public void fireEvent(Object event, EventMetadata metadata)
{
if (ClassUtil.isDefinitionContainsTypeVariables(event.getClass()))
{
throw new IllegalArgumentException("Event class : " + event.getClass().getName() + " can not be defined as generic type");
}
- notificationManager.fireEvent(event, bindings);
+ notificationManager.fireEvent(event, metadata);
}
public Set<Bean<?>> getComponents()
@@ -627,33 +634,36 @@ public class BeanManagerImpl implements
InjectionResolver.injectionPoints.set(injectionPoint);
}
- boolean ijbSet = false;
- if (InjectionPointProducer.isStackEmpty())
+ if(WebBeansUtil.isDependent(injectedBean))
{
- ijbSet = true;
- InjectionPointProducer.setThreadLocal(injectionPoint);
- }
-
- try
- {
- if(WebBeansUtil.isDependent(injectedBean))
+ if (!(ownerCreationalContext instanceof CreationalContextImpl))
+ {
+ ownerCreationalContext = webBeansContext.getCreationalContextFactory().wrappedCreationalContext(ownerCreationalContext, injectionPoint.getBean());
+ }
+ ((CreationalContextImpl<?>)ownerCreationalContext).putInjectionPoint(injectionPoint);
+ //Using owner creational context
+ //Dependents use parent creational context
+ try
{
- //Using owner creational context
- //Dependents use parent creational context
instance = getReference(injectedBean, injectionPoint.getType(), ownerCreationalContext);
}
- else
+ finally
{
- //New creational context for normal scoped beans
- CreationalContextImpl<Object> injectedCreational = (CreationalContextImpl<Object>)createCreationalContext(injectedBean);
- instance = getReference(injectedBean, injectionPoint.getType(), injectedCreational);
+ ((CreationalContextImpl<?>)ownerCreationalContext).removeInjectionPoint();
}
}
- finally
+ else
{
- if (ijbSet)
+ //New creational context for normal scoped beans
+ CreationalContextImpl<Object> injectedCreational = (CreationalContextImpl<Object>)createCreationalContext(injectedBean);
+ injectedCreational.putInjectionPoint(injectionPoint);
+ try
+ {
+ instance = getReference(injectedBean, injectionPoint.getType(), injectedCreational);
+ }
+ finally
{
- InjectionPointProducer.unsetThreadLocal();
+ injectedCreational.removeInjectionPoint();
}
}
@@ -978,14 +988,19 @@ public class BeanManagerImpl implements
return new InjectionTargetImpl<T>(bean.getAnnotatedType(), bean.getInjectionPoints(), webBeansContext, postConstructMethods, preDestroyMethods);
}
- public <T> Set<ObserverMethod<? super T>> resolveObserverMethods( T event, Annotation... qualifiers )
+ public <T> Set<ObserverMethod<? super T>> resolveObserverMethods(T event, Annotation... qualifiers)
+ {
+ return resolveObserverMethods(event, new EventMetadataImpl(event.getClass(), null, qualifiers));
+ }
+
+ public <T> Set<ObserverMethod<? super T>> resolveObserverMethods(T event, EventMetadata metadata)
{
- if(ClassUtil.isDefinitionContainsTypeVariables(event.getClass()))
+ if(ClassUtil.isDefinitionContainsTypeVariables(ClassUtil.getClass(metadata.getType())))
{
throw new IllegalArgumentException("Event type can not contain type variables. Event class is : " + event.getClass());
}
- return notificationManager.resolveObservers(event, qualifiers);
+ return notificationManager.resolveObservers(event, metadata);
}
public ExpressionFactory wrapExpressionFactory(ExpressionFactory expressionFactory)
Modified: openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/container/InjectionResolver.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/container/InjectionResolver.java?rev=1465432&r1=1465431&r2=1465432&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/container/InjectionResolver.java (original)
+++ openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/container/InjectionResolver.java Sun Apr 7 17:26:47 2013
@@ -75,9 +75,6 @@ public class InjectionResolver
*/
private WebBeansContext webBeansContext;
- private final static Annotation[] DEFAULT_LITERAL_ARRAY = new Annotation[]{DefaultLiteral.INSTANCE};
- private final static Annotation[] ANY_LITERAL_ARRAY = new Annotation[]{new AnyLiteral()};
-
/**
* This Map contains all resolved beans via it's type and qualifiers.
* If a bean have resolved as not existing, the entry will contain <code>null</code> as value.
@@ -223,8 +220,7 @@ public class InjectionResolver
Annotation[] qualifiers = qualSet.toArray(new Annotation[qualSet.size()]);
if (isInstanceOrEventInjection(type))
{
- qualifiers = new Annotation[1];
- qualifiers[0] = new AnyLiteral();
+ qualifiers = AnyLiteral.ARRAY;
}
Class injectionPointClass = null;
@@ -261,7 +257,7 @@ public class InjectionResolver
{
newType = newQualifier.value();
}
- Set<Bean<?>> beans = implResolveByType(newType, injectionPoint.getBean().getBeanClass(), new AnyLiteral());
+ Set<Bean<?>> beans = implResolveByType(newType, injectionPoint.getBean().getBeanClass(), AnyLiteral.INSTANCE);
if (beans.isEmpty())
{
beanSet.add(webBeansContext.getWebBeansUtil().createNewComponent(newType));
@@ -470,13 +466,13 @@ public class InjectionResolver
if (isInstanceOrEventInjection(injectionPointType))
{
- qualifiers = ANY_LITERAL_ARRAY;
+ qualifiers = AnyLiteral.ARRAY;
}
else
{
if (qualifiers.length == 0)
{
- qualifiers = DEFAULT_LITERAL_ARRAY;
+ qualifiers = DefaultLiteral.ARRAY;
currentQualifier = true;
}
}
Modified: openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/context/creational/CreationalContextFactory.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/context/creational/CreationalContextFactory.java?rev=1465432&r1=1465431&r2=1465432&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/context/creational/CreationalContextFactory.java (original)
+++ openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/context/creational/CreationalContextFactory.java Sun Apr 7 17:26:47 2013
@@ -54,7 +54,7 @@ public final class CreationalContextFact
return new CreationalContextImpl<T>(contextual, webBeansContext);
}
- public CreationalContext<T> wrappedCreationalContext(CreationalContext<T> creationalContext, Contextual<T> contextual)
+ public CreationalContextImpl<T> wrappedCreationalContext(CreationalContext<T> creationalContext, Contextual<T> contextual)
{
return new WrappedCreationalContext<T>(contextual, creationalContext, webBeansContext);
}
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=1465432&r1=1465431&r2=1465432&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 Sun Apr 7 17:26:47 2013
@@ -50,7 +50,7 @@ public class CreationalContextImpl<T> im
/**
* The injection point object to be injected into injection points of type InjectionPoint
*/
- private transient Stack<InjectionPoint> injectionPoints;
+ private transient Stack<InjectionPoint> injectionPoints = null;
/**
* Contextual bean dependent instances
Modified: openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/event/EventImpl.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/event/EventImpl.java?rev=1465432&r1=1465431&r2=1465432&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/event/EventImpl.java (original)
+++ openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/event/EventImpl.java Sun Apr 7 17:26:47 2013
@@ -33,7 +33,6 @@ import javax.enterprise.inject.spi.Injec
import javax.enterprise.util.TypeLiteral;
import org.apache.webbeans.config.WebBeansContext;
-import org.apache.webbeans.portable.InjectionPointProducer;
import org.apache.webbeans.util.ClassUtil;
import org.apache.webbeans.util.OwbCustomObjectInputStream;
import org.apache.webbeans.util.WebBeansUtil;
@@ -79,15 +78,7 @@ public class EventImpl<T> implements Eve
*/
public void fire(T event)
{
- InjectionPointProducer.setThreadLocal(injectionPoint);
- try
- {
- webBeansContext.getBeanManagerImpl().fireEvent(event, injectedBindings);
- }
- finally
- {
- InjectionPointProducer.setThreadLocal(injectionPoint);
- }
+ webBeansContext.getBeanManagerImpl().fireEvent(event, new EventMetadataImpl(eventType, injectionPoint, injectedBindings));
}
/**
Added: openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/event/EventMetadata.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/event/EventMetadata.java?rev=1465432&view=auto
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/event/EventMetadata.java (added)
+++ openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/event/EventMetadata.java Sun Apr 7 17:26:47 2013
@@ -0,0 +1,50 @@
+/*
+ * 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.event;
+
+import java.lang.annotation.Annotation;
+import java.lang.reflect.Type;
+import java.util.Set;
+
+import javax.enterprise.inject.spi.InjectionPoint;
+
+/**
+ * This is a preview to CDI 1.1
+ * when we implement CDI 1.1 this interface can be removed
+ */
+public interface EventMetadata
+{
+
+ /**
+ * Get the qualifiers for which event payload was fired.
+ */
+ public Set<Annotation> getQualifiers();
+
+ /**
+ * Get the {@link InjectionPoint} from which the event fired, or
+ * <code>null</code> if it was fired from
+ * {@link javax.enterprise.inject.spi.BeanManager#fireEvent(Object, Annotation...)};
+ */
+ public InjectionPoint getInjectionPoint();
+
+ /**
+ * Returns the resolved event {@link Type}.
+ */
+ public Type getType();
+}
Added: openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/event/EventMetadataImpl.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/event/EventMetadataImpl.java?rev=1465432&view=auto
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/event/EventMetadataImpl.java (added)
+++ openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/event/EventMetadataImpl.java Sun Apr 7 17:26:47 2013
@@ -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.event;
+
+import java.lang.annotation.Annotation;
+import java.lang.reflect.Type;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.Set;
+
+import javax.enterprise.inject.spi.InjectionPoint;
+
+import org.apache.webbeans.annotation.AnyLiteral;
+import org.apache.webbeans.util.AnnotationUtil;
+
+public class EventMetadataImpl implements EventMetadata
+{
+
+ private final Type type;
+ private final InjectionPoint injectionPoint;
+ private final Set<Annotation> qualifiers;
+
+ public EventMetadataImpl(Type type, InjectionPoint injectionPoint, Annotation... qualifiers)
+ {
+ this.type = type;
+ this.injectionPoint = injectionPoint;
+ Set<Annotation> completeQualifiers;
+ if (qualifiers.length == 0)
+ {
+ completeQualifiers = AnnotationUtil.DEFAULT_AND_ANY_ANNOTATION;
+ }
+ else
+ {
+ completeQualifiers = new HashSet<Annotation>(Arrays.asList(qualifiers));
+ if (completeQualifiers.size() != qualifiers.length)
+ {
+ throw new IllegalArgumentException("duplicate qualifier");
+ }
+ if (!completeQualifiers.contains(AnyLiteral.INSTANCE))
+ {
+ completeQualifiers.add(AnyLiteral.INSTANCE);
+ }
+ }
+ this.qualifiers = Collections.unmodifiableSet(completeQualifiers);
+ }
+
+ public Type getType()
+ {
+ return type;
+ }
+
+ public InjectionPoint getInjectionPoint()
+ {
+ return injectionPoint;
+ }
+
+ public Set<Annotation> getQualifiers()
+ {
+ return qualifiers;
+ }
+}
Modified: openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/event/EventUtil.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/event/EventUtil.java?rev=1465432&r1=1465431&r2=1465432&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/event/EventUtil.java (original)
+++ openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/event/EventUtil.java Sun Apr 7 17:26:47 2013
@@ -21,13 +21,14 @@ package org.apache.webbeans.event;
import java.lang.annotation.Annotation;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
-import java.lang.reflect.Method;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
+import java.util.Set;
import javax.enterprise.event.Event;
import javax.enterprise.event.Observes;
import javax.enterprise.event.TransactionPhase;
+import javax.enterprise.inject.spi.AnnotatedMethod;
import javax.enterprise.inject.spi.InjectionPoint;
import org.apache.webbeans.config.WebBeansContext;
@@ -53,7 +54,7 @@ public final class EventUtil
}
}
- public static void checkEventBindings(WebBeansContext webBeansContext, Annotation... annotations)
+ public static void checkEventBindings(WebBeansContext webBeansContext, Set<Annotation> annotations)
{
for(Annotation ann : annotations)
{
@@ -70,9 +71,9 @@ public final class EventUtil
webBeansContext.getAnnotationManager().checkQualifierConditions(annotations);
}
- public static TransactionPhase getObserverMethodTransactionType(Method observerMethod)
+ public static TransactionPhase getObserverMethodTransactionType(AnnotatedMethod<?> observerMethod)
{
- Observes observes = AnnotationUtil.getMethodFirstParameterAnnotation(observerMethod, Observes.class);
+ Observes observes = AnnotationUtil.getAnnotatedMethodFirstParameterAnnotation(observerMethod, Observes.class);
if (observes != null)
{
return observes.during();
Modified: openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/event/NotificationManager.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/event/NotificationManager.java?rev=1465432&r1=1465431&r2=1465432&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/event/NotificationManager.java (original)
+++ openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/event/NotificationManager.java Sun Apr 7 17:26:47 2013
@@ -21,7 +21,6 @@ package org.apache.webbeans.event;
import java.lang.annotation.Annotation;
import java.lang.reflect.InvocationTargetException;
-import java.lang.reflect.Method;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.lang.reflect.TypeVariable;
@@ -40,7 +39,6 @@ import javax.enterprise.inject.spi.Obser
import javax.enterprise.inject.spi.ProcessProducer;
import javax.enterprise.util.TypeLiteral;
-import org.apache.webbeans.annotation.AnyLiteral;
import org.apache.webbeans.component.AbstractOwbBean;
import org.apache.webbeans.config.OWBLogConst;
import org.apache.webbeans.config.WebBeansContext;
@@ -50,7 +48,6 @@ import org.apache.webbeans.portable.even
import org.apache.webbeans.portable.events.generics.GenericProducerObserverEvent;
import org.apache.webbeans.spi.TransactionService;
import org.apache.webbeans.util.AnnotationUtil;
-import org.apache.webbeans.util.ArrayUtil;
import org.apache.webbeans.util.Asserts;
import org.apache.webbeans.util.ClassUtil;
import org.apache.webbeans.util.WebBeansUtil;
@@ -101,14 +98,14 @@ public final class NotificationManager
ObserverMethod<?> observer = i.next();
if (observer instanceof ObserverMethodImpl)
{
- Method observerMethod = ((ObserverMethodImpl<?>)observer).getObserverMethod();
+ AnnotatedMethod<?> observerMethod = ((ObserverMethodImpl<?>)observer).getObserverMethod();
// we only remove methods from a superclass
- if (!observerMethod.getDeclaringClass().equals(subClass))
+ if (!observerMethod.getJavaMember().getDeclaringClass().equals(subClass))
{
try
{
- subClass.getMethod(observerMethod.getName(), observerMethod.getParameterTypes());
+ subClass.getMethod(observerMethod.getJavaMember().getName(), observerMethod.getJavaMember().getParameterTypes());
i.remove();
}
catch(NoSuchMethodException nsme)
@@ -123,39 +120,38 @@ public final class NotificationManager
}
}
- public <T> Set<ObserverMethod<? super T>> resolveObservers(T event, Annotation... eventQualifiers)
+ public <T> Set<ObserverMethod<? super T>> resolveObservers(T event, EventMetadata metadata)
{
- EventUtil.checkEventBindings(webBeansContext, eventQualifiers);
+ EventUtil.checkEventBindings(webBeansContext, metadata.getQualifiers());
- Set<Annotation> qualifiers = ArrayUtil.asSet(eventQualifiers);
+ Type eventType = metadata.getType();
+ Set<ObserverMethod<? super T>> observersMethods = filterByType(event, eventType);
- Class<T> eventType = (Class<T>) event.getClass();
- Set<ObserverMethod<? super T>> observersMethods = filterByType(event,eventType);
-
- observersMethods = filterByQualifiers(observersMethods, qualifiers);
+ observersMethods = filterByQualifiers(observersMethods, metadata.getQualifiers());
return observersMethods;
}
- private <T> Set<ObserverMethod<? super T>> filterByType(T event, Class<T> eventType)
+ private <T> Set<ObserverMethod<? super T>> filterByType(T event, Type eventType)
{
if(WebBeansUtil.isExtensionEventType(eventType))
{
return filterByExtensionEventType(event, eventType);
}
+ Class<?> eventClass = ClassUtil.getClass(eventType);
Set<ObserverMethod<? super T>> matching = new HashSet<ObserverMethod<? super T>>();
Set<Type> types = new HashSet<Type>();
types.add(eventType);
- Type superClazz = eventType.getGenericSuperclass();
+ Type superClazz = eventClass.getGenericSuperclass();
if(superClazz != null)
{
types.add(superClazz);
}
- Type[] genericInts = eventType.getGenericInterfaces();
+ Type[] genericInts = eventClass.getGenericInterfaces();
if(genericInts != null && genericInts.length > 0)
{
@@ -186,8 +182,9 @@ public final class NotificationManager
return matching;
}
- private <T> Set<ObserverMethod<? super T>> filterByExtensionEventType(T event, Class<T> eventType)
+ private <T> Set<ObserverMethod<? super T>> filterByExtensionEventType(T event, Type eventType)
{
+ Class<?> eventClass = ClassUtil.getClazz(eventType);
Set<ObserverMethod<? super T>> matching = new HashSet<ObserverMethod<? super T>>();
Set<Type> keySet = observers.keySet();
for (Type type : keySet)
@@ -197,7 +194,7 @@ public final class NotificationManager
if(observerClass != null)
{
- if(observerClass.isAssignableFrom(eventType))
+ if(observerClass.isAssignableFrom(eventClass))
{
//ProcessBean,ProcessAnnotateType, ProcessInjectionTarget
if(WebBeansUtil.isExtensionBeanEventType(eventType))
@@ -241,7 +238,7 @@ public final class NotificationManager
addToMatching(type, matching);
}
}
- else if(observerClass.isAssignableFrom(eventType))
+ else if(observerClass.isAssignableFrom(eventClass))
{
if(ClassUtil.isParametrizedType(type))
{
@@ -257,7 +254,7 @@ public final class NotificationManager
//BeforeShutDown Events
else
{
- if(observerClass.isAssignableFrom(eventType))
+ if(observerClass.isAssignableFrom(eventClass))
{
addToMatching(type, matching);
}
@@ -399,8 +396,6 @@ public final class NotificationManager
*/
private <T> Set<ObserverMethod<? super T>> filterByQualifiers(Set<ObserverMethod<? super T>> observers, Set<Annotation> eventQualifiers)
{
- eventQualifiers.add(new AnyLiteral());
-
Set<ObserverMethod<? super T>> matching = new HashSet<ObserverMethod<? super T>>();
search: for (ObserverMethod<? super T> ob : observers)
@@ -437,9 +432,9 @@ public final class NotificationManager
return matching;
}
- public void fireEvent(Object event, Annotation... qualifiers)
+ public void fireEvent(Object event, EventMetadata metadata)
{
- Set<ObserverMethod<? super Object>> observerMethods = resolveObservers(event, qualifiers);
+ Set<ObserverMethod<? super Object>> observerMethods = resolveObservers(event, metadata);
for (ObserverMethod<? super Object> observer : observerMethods)
{
@@ -456,12 +451,26 @@ public final class NotificationManager
}
else
{
- observer.notify(event);
+ if (observer instanceof OwbObserverMethod)
+ {
+ ((OwbObserverMethod<? super Object>)observer).notify(event, metadata);
+ }
+ else
+ {
+ observer.notify(event);
+ }
}
}
else
{
- observer.notify(event);
+ if (observer instanceof OwbObserverMethod)
+ {
+ ((OwbObserverMethod<? super Object>)observer).notify(event, metadata);
+ }
+ else
+ {
+ observer.notify(event);
+ }
}
}
catch (WebBeansException e)
@@ -525,8 +534,7 @@ public final class NotificationManager
Type type = AnnotationUtil.getAnnotatedMethodFirstParameterWithAnnotation(annotatedMethod, Observes.class);
//Observer creation from annotated method
- ObserverMethodImpl<T> observer = new ObserverMethodImpl(bean, annotatedMethod.getJavaMember(), ifExist, observerQualifiers, type);
- observer.setAnnotatedMethod((AnnotatedMethod<T>)annotatedMethod);
+ ObserverMethodImpl<T> observer = new ObserverMethodImpl(bean, annotatedMethod, ifExist, observerQualifiers, type);
//Adds this observer
addObserver(observer, type);
Modified: openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/event/ObserverMethodImpl.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/event/ObserverMethodImpl.java?rev=1465432&r1=1465431&r2=1465432&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/event/ObserverMethodImpl.java (original)
+++ openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/event/ObserverMethodImpl.java Sun Apr 7 17:26:47 2013
@@ -19,7 +19,6 @@
package org.apache.webbeans.event;
import java.lang.annotation.Annotation;
-import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
@@ -40,13 +39,10 @@ import javax.enterprise.event.Reception;
import javax.enterprise.event.TransactionPhase;
import javax.enterprise.inject.spi.AnnotatedMethod;
import javax.enterprise.inject.spi.AnnotatedParameter;
-import javax.enterprise.inject.spi.AnnotatedType;
import javax.enterprise.inject.spi.Bean;
import javax.enterprise.inject.spi.InjectionPoint;
-import javax.enterprise.inject.spi.ObserverMethod;
import org.apache.webbeans.annotation.AnnotationManager;
-import org.apache.webbeans.annotation.DefaultLiteral;
import org.apache.webbeans.component.AbstractOwbBean;
import org.apache.webbeans.component.InjectionTargetBean;
import org.apache.webbeans.component.WebBeansType;
@@ -57,12 +53,8 @@ import org.apache.webbeans.context.creat
import org.apache.webbeans.exception.WebBeansException;
import org.apache.webbeans.inject.impl.InjectionPointFactory;
import org.apache.webbeans.logger.WebBeansLoggerFacade;
-import org.apache.webbeans.portable.AnnotatedElementFactory;
-import org.apache.webbeans.portable.InjectionPointProducer;
import org.apache.webbeans.proxy.OwbNormalScopeProxy;
import org.apache.webbeans.util.AnnotationUtil;
-import org.apache.webbeans.util.ClassUtil;
-import org.apache.webbeans.util.WebBeansUtil;
/**
* Defines observers that are declared in observer methods.
@@ -78,7 +70,7 @@ import org.apache.webbeans.util.WebBeans
* }
* </pre>
* Above class X instance observes for the event with type <code>LoggedInEvent</code>
- * and event qualifier is <code>Current</code>. Whenever event is fired, its {@link ObserverMethod#notify()}
+ * and event qualifier is <code>Current</code>. Whenever event is fired, its {@link javax.enterprise.inject.spi.ObserverMethod#notify()}
* method is called.
* </p>
*
@@ -86,7 +78,7 @@ import org.apache.webbeans.util.WebBeans
*
* @param <T> event type
*/
-public class ObserverMethodImpl<T> implements ObserverMethod<T>
+public class ObserverMethodImpl<T> implements OwbObserverMethod<T>
{
/**Logger instance*/
private final static Logger logger = WebBeansLoggerFacade.getLogger(ObserverMethodImpl.class);
@@ -94,9 +86,6 @@ public class ObserverMethodImpl<T> imple
/**Observer owner bean that defines observer method*/
private final AbstractOwbBean<?> bean;
- /**Event observer method*/
- private Method observerMethod;
-
/**Using existing bean instance or not*/
private final boolean ifExist;
@@ -110,7 +99,7 @@ public class ObserverMethodImpl<T> imple
private final TransactionPhase phase;
/**Annotated method*/
- private AnnotatedMethod<T> annotatedMethod = null;
+ private AnnotatedMethod<T> observerMethod;
private static class ObserverParams
{
@@ -122,35 +111,6 @@ public class ObserverMethodImpl<T> imple
private boolean isBean = false;
}
-
- /**
- * Creates a new bean observer instance.
- *
- * @param bean owner
- * @param observerMethod method
- * @param ifExist if exist parameter
- */
- public ObserverMethodImpl(AbstractOwbBean<?> bean, Method observerMethod, boolean ifExist)
- {
- this.bean = bean;
- this.observerMethod = observerMethod;
- this.ifExist = ifExist;
-
- Annotation[] qualifiers =
- getWebBeansContext().getAnnotationManager().getMethodFirstParameterQualifierWithGivenAnnotation(
- observerMethod, Observes.class);
- getWebBeansContext().getAnnotationManager().checkQualifierConditions(qualifiers);
- observedQualifiers = new HashSet<Annotation>(qualifiers.length);
-
- for (Annotation qualifier : qualifiers)
- {
- observedQualifiers.add(qualifier);
- }
-
- observedEventType = AnnotationUtil.getTypeOfParameterWithGivenAnnotation(observerMethod, Observes.class);
-
- phase = EventUtil.getObserverMethodTransactionType(observerMethod);
- }
/**
* used if the qualifiers and event type are already known, e.g. from the XML.
@@ -160,7 +120,7 @@ public class ObserverMethodImpl<T> imple
* @param qualifiers
* @param observedEventType
*/
- public ObserverMethodImpl(AbstractOwbBean<?> bean, Method observerMethod, boolean ifExist,
+ public ObserverMethodImpl(AbstractOwbBean<?> bean, AnnotatedMethod<T> observerMethod, boolean ifExist,
Annotation[] qualifiers, Type observedEventType)
{
this.bean = bean;
@@ -175,21 +135,20 @@ public class ObserverMethodImpl<T> imple
phase = EventUtil.getObserverMethodTransactionType(observerMethod);
}
-
+
/**
- * Sets annotated method.
- * @param annotatedMethod annotated method
+ * {@inheritDoc}
*/
- public void setAnnotatedMethod(AnnotatedMethod<T> annotatedMethod)
+ public void notify(T event)
{
- this.annotatedMethod = annotatedMethod;
+ notify(event, null);
}
/**
* {@inheritDoc}
*/
@SuppressWarnings("unchecked")
- public void notify(T event)
+ public void notify(T event, EventMetadata metadata)
{
AbstractOwbBean<Object> component = (AbstractOwbBean<Object>) bean;
if (!bean.isEnabled())
@@ -199,19 +158,14 @@ public class ObserverMethodImpl<T> imple
Object object = null;
- List<ObserverParams> methodArgsMap;
- if(annotatedMethod == null)
- {
- methodArgsMap = getMethodArguments(event);
- }
- else
- {
- methodArgsMap = getAnnotatedMethodArguments(event);
- }
+ List<ObserverParams> methodArgsMap = getMethodArguments(event, metadata);
BeanManagerImpl manager = bean.getWebBeansContext().getBeanManagerImpl();
- CreationalContext<Object> creationalContext = manager.createCreationalContext(component);
-
+ CreationalContextImpl<Object> creationalContext = manager.createCreationalContext(component);
+ if (metadata != null)
+ {
+ creationalContext.putInjectionPoint(metadata.getInjectionPoint());
+ }
ObserverParams[] obargs = null;
try
@@ -226,14 +180,14 @@ public class ObserverMethodImpl<T> imple
}
//Static or not
- if (Modifier.isStatic(observerMethod.getModifiers()))
+ if (observerMethod.isStatic())
{
- if (!observerMethod.isAccessible())
+ if (!observerMethod.getJavaMember().isAccessible())
{
- observerMethod.setAccessible(true);
+ observerMethod.getJavaMember().setAccessible(true);
}
//Invoke Method
- observerMethod.invoke(null, args);
+ observerMethod.getJavaMember().invoke(null, args);
}
else
{
@@ -281,12 +235,12 @@ public class ObserverMethodImpl<T> imple
if (object != null)
{
- if (!observerMethod.isAccessible())
+ if (!observerMethod.getJavaMember().isAccessible())
{
- bean.getWebBeansContext().getSecurityService().doPrivilegedSetAccessible(observerMethod, true);
+ bean.getWebBeansContext().getSecurityService().doPrivilegedSetAccessible(observerMethod.getJavaMember(), true);
}
- if (Modifier.isPrivate(observerMethod.getModifiers()))
+ if (Modifier.isPrivate(observerMethod.getJavaMember().getModifiers()))
{
// since private methods cannot be intercepted, we have to unwrap anny possible proxy
if (object instanceof OwbNormalScopeProxy)
@@ -296,7 +250,7 @@ public class ObserverMethodImpl<T> imple
}
//Invoke Method
- observerMethod.invoke(object, args);
+ observerMethod.getJavaMember().invoke(object, args);
}
}
}
@@ -306,6 +260,7 @@ public class ObserverMethodImpl<T> imple
}
finally
{
+ creationalContext.removeInjectionPoint();
//Destory bean instance
if (component.getScope().equals(Dependent.class) && object != null)
{
@@ -326,122 +281,19 @@ public class ObserverMethodImpl<T> imple
}
}
-
- /**
- * Returns list of observer method parameters.
- *
- * @param event event instance
- * @return list of observer method parameters
- */
- @SuppressWarnings("unchecked")
- protected List<ObserverParams> getMethodArguments(Object event)
- {
- WebBeansContext webBeansContext = bean.getWebBeansContext();
- AnnotatedElementFactory annotatedElementFactory = webBeansContext.getAnnotatedElementFactory();
- AnnotationManager annotationManager = webBeansContext.getAnnotationManager();
-
- Type[] types = observerMethod.getGenericParameterTypes();
- Annotation[][] annots = observerMethod.getParameterAnnotations();
- List<ObserverParams> list = new ArrayList<ObserverParams>();
-
- BeanManagerImpl manager = webBeansContext.getBeanManagerImpl();
- ObserverParams param;
- if (types.length > 0)
- {
- int i = 0;
- for (Type type : types)
- {
- Annotation[] annot = annots[i];
-
- boolean observesAnnotation = false;
-
- if (annot.length == 0)
- {
- annot = new Annotation[1];
- annot[0] = DefaultLiteral.INSTANCE;
- }
- else
- {
- for (Annotation observersAnnot : annot)
- {
- if (observersAnnot.annotationType().equals(Observes.class))
- {
- param = new ObserverParams();
- param.instance = event;
- list.add(param);
- observesAnnotation = true;
- break;
- }
- }
- }
-
- if (!observesAnnotation)
- {
- boolean injectionPointBeanLocalSetOnStack = false;
-
- //Get parameter annotations
- Annotation[] bindingTypes = annotationManager.getQualifierAnnotations(annot);
-
- //Define annotated parameter
- AnnotatedType<T> annotatedType = (AnnotatedType<T>) annotatedElementFactory.newAnnotatedType(bean.getReturnType());
- AnnotatedMethod<T> newAnnotatedMethod = annotatedElementFactory.newAnnotatedMethod(observerMethod, annotatedType);
-
- //Annotated parameter
- AnnotatedParameter<T> annotatedParameter = newAnnotatedMethod.getParameters().get(i);
-
- //Creating injection point
- InjectionPoint point = InjectionPointFactory.getPartialInjectionPoint(bean, type, annotatedParameter, bindingTypes);
-
- //Injected Bean
- Bean<Object> injectedBean = (Bean<Object>)getWebBeansContext().getBeanManagerImpl().getInjectionResolver().getInjectionPointBean(point);
-
- //Set for @Inject InjectionPoint
- if(WebBeansUtil.isDependent(injectedBean))
- {
- if(!InjectionPoint.class.isAssignableFrom(ClassUtil.getClass(point.getType())))
- {
- injectionPointBeanLocalSetOnStack = InjectionPointProducer.setThreadLocal(point);
- }
- }
-
- CreationalContextImpl<Object> creational = manager.createCreationalContext(injectedBean);
- if (isEventProviderInjection(point))
- {
- creational.putInjectionPoint(point);
- }
- Object instance = manager.getReference(injectedBean, null, creational);
- if (injectionPointBeanLocalSetOnStack)
- {
- InjectionPointProducer.unsetThreadLocal();
- }
-
- param = new ObserverParams();
- param.isBean = true;
- param.creational = creational;
- param.instance = instance;
- param.bean = injectedBean;
- list.add(param);
- }
-
- i++;
- }
- }
-
- return list;
- }
/**
* Gets observer method parameters.
* @param event event payload
* @return observer method parameters
*/
- protected List<ObserverParams> getAnnotatedMethodArguments(Object event)
+ protected List<ObserverParams> getMethodArguments(Object event, EventMetadata metadata)
{
final WebBeansContext webBeansContext = bean.getWebBeansContext();
final AnnotationManager annotationManager = webBeansContext.getAnnotationManager();
final BeanManagerImpl manager = webBeansContext.getBeanManagerImpl();
List<ObserverParams> list = new ArrayList<ObserverParams>();
- List<AnnotatedParameter<T>> parameters = annotatedMethod.getParameters();
+ List<AnnotatedParameter<T>> parameters = observerMethod.getParameters();
ObserverParams param = null;
for(AnnotatedParameter<T> parameter : parameters)
{
@@ -453,8 +305,6 @@ public class ObserverMethodImpl<T> imple
}
else
{
- boolean injectionPointBeanLocalSetOnStack = false;
-
//Get parameter annotations
Annotation[] bindingTypes =
annotationManager.getQualifierAnnotations(AnnotationUtil.
@@ -465,27 +315,19 @@ public class ObserverMethodImpl<T> imple
//Get observer parameter instance
@SuppressWarnings("unchecked")
Bean<Object> injectedBean = (Bean<Object>)getWebBeansContext().getBeanManagerImpl().getInjectionResolver().getInjectionPointBean(point);
-
- //Set for @Inject InjectionPoint
- if(WebBeansUtil.isDependent(injectedBean))
- {
- if(!InjectionPoint.class.isAssignableFrom(ClassUtil.getClass(point.getType())))
- {
- injectionPointBeanLocalSetOnStack = InjectionPointProducer.setThreadLocal(point);
- }
- }
-
CreationalContextImpl<Object> creational = manager.createCreationalContext(injectedBean);
- if (isEventProviderInjection(point))
+ creational.putInjectionPoint(metadata.getInjectionPoint());
+ creational.putInjectionPoint(point);
+ Object instance;
+ try
{
- creational.putInjectionPoint(point);
+ instance = manager.getReference(injectedBean, null, creational);
}
- Object instance = manager.getReference(injectedBean, null, creational);
-
- if (injectionPointBeanLocalSetOnStack)
+ finally
{
- InjectionPointProducer.unsetThreadLocal();
+ creational.removeInjectionPoint();
+ creational.removeInjectionPoint();
}
param = new ObserverParams();
@@ -559,7 +401,7 @@ public class ObserverMethodImpl<T> imple
return phase;
}
- public Method getObserverMethod()
+ public AnnotatedMethod<T> getObserverMethod()
{
return observerMethod;
}
@@ -576,7 +418,7 @@ public class ObserverMethodImpl<T> imple
*
* @param m method to be invoked as the observer
*/
- public void setObserverMethod(Method m)
+ public void setObserverMethod(AnnotatedMethod<T> m)
{
observerMethod = m;
}
Added: openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/event/OwbObserverMethod.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/event/OwbObserverMethod.java?rev=1465432&view=auto
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/event/OwbObserverMethod.java (added)
+++ openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/event/OwbObserverMethod.java Sun Apr 7 17:26:47 2013
@@ -0,0 +1,34 @@
+/*
+ * 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.event;
+
+import javax.enterprise.inject.spi.ObserverMethod;
+
+/**
+ * This interface fixes an issue of the CDI API. See https://issues.jboss.org/browse/CDI-36
+ */
+public interface OwbObserverMethod<T> extends ObserverMethod<T>
+{
+
+ /**
+ * will actually call the underlying observer method with the specified event metadata
+ */
+ public void notify(T event, EventMetadata metadata);
+
+}
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=1465432&r1=1465431&r2=1465432&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 Sun Apr 7 17:26:47 2013
@@ -20,18 +20,14 @@ package org.apache.webbeans.inject;
import java.io.Serializable;
import java.lang.reflect.Member;
-import java.lang.reflect.ParameterizedType;
-import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.List;
import javax.enterprise.context.spi.Contextual;
-import javax.enterprise.event.Event;
import javax.enterprise.inject.IllegalProductException;
import javax.enterprise.inject.spi.Bean;
import javax.enterprise.inject.spi.InjectionPoint;
import javax.enterprise.inject.spi.Producer;
-import javax.inject.Provider;
import org.apache.webbeans.component.AbstractProducerBean;
import org.apache.webbeans.component.OwbBean;
@@ -39,8 +35,6 @@ import org.apache.webbeans.config.WebBea
import org.apache.webbeans.container.BeanManagerImpl;
import org.apache.webbeans.container.InjectionResolver;
import org.apache.webbeans.context.creational.CreationalContextImpl;
-import org.apache.webbeans.portable.InjectionPointProducer;
-import org.apache.webbeans.util.ClassUtil;
import org.apache.webbeans.util.WebBeansUtil;
/**
@@ -81,56 +75,35 @@ public abstract class AbstractInjectable
InjectionResolver instance = beanManager.getInjectionResolver();
Bean<?> injectedBean = instance.getInjectionPointBean(injectionPoint);
- if (isInstanceProviderInjection(injectionPoint) || isEventProviderInjection(injectionPoint))
- {
- creationalContext.putInjectionPoint(injectionPoint);
- }
- boolean injectionPointBeanLocalSetOnStack = false;
- try
+ //Injection for dependent instance InjectionPoint fields
+ boolean dependentProducer = false;
+ if(WebBeansUtil.isDependent(injectedBean))
{
- //Injection for dependent instance InjectionPoint fields
- boolean dependentProducer = false;
- if(WebBeansUtil.isDependent(injectedBean))
+ if(!injectionPoint.isTransient())
{
- if(!InjectionPoint.class.isAssignableFrom(ClassUtil.getClass(injectionPoint.getType())))
- {
- injectionPointBeanLocalSetOnStack = InjectionPointProducer.setThreadLocal(injectionPoint);
- }
-
- if(!injectionPoint.isTransient())
+ if(injectedBean instanceof AbstractProducerBean)
{
- if(injectedBean instanceof AbstractProducerBean)
+ if((creationalContext.getBean() instanceof OwbBean) && ((OwbBean<?>) creationalContext.getBean()).isPassivationCapable())
{
- if((creationalContext.getBean() instanceof OwbBean) && ((OwbBean<?>) creationalContext.getBean()).isPassivationCapable())
- {
- dependentProducer = true;
- }
+ dependentProducer = true;
}
}
- }
+ }
+ }
- //Gets injectable reference for injected bean
- injected = (T) beanManager.getInjectableReference(injectionPoint, creationalContext);
+ //Gets injectable reference for injected bean
+ injected = (T) beanManager.getInjectableReference(injectionPoint, creationalContext);
- /*X TODO see spec issue CDI-140 */
- if(dependentProducer)
- {
- if(injected != null && !Serializable.class.isAssignableFrom(injected.getClass()))
- {
- throw new IllegalProductException("If a producer method or field of scope @Dependent returns an serializable object for injection " +
- "into an injection point "+ injectionPoint +" that requires a passivation capable dependency");
- }
- }
- }
- finally
+ /*X TODO see spec issue CDI-140 */
+ if(dependentProducer)
{
- if (injectionPointBeanLocalSetOnStack)
+ if(injected != null && !Serializable.class.isAssignableFrom(injected.getClass()))
{
- InjectionPointProducer.unsetThreadLocal();
+ throw new IllegalProductException("If a producer method or field of scope @Dependent returns an serializable object for injection " +
+ "into an injection point "+ injectionPoint +" that requires a passivation capable dependency");
}
}
-
return injected;
}
@@ -162,41 +135,4 @@ public abstract class AbstractInjectable
}
return injectionPoints;
}
-
- private boolean isInstanceProviderInjection(InjectionPoint injectionPoint)
- {
- Type type = injectionPoint.getType();
-
- if (type instanceof ParameterizedType)
- {
- ParameterizedType pt = (ParameterizedType) type;
- Class<?> clazz = (Class<?>) pt.getRawType();
-
- if(Provider.class.isAssignableFrom(clazz))
- {
- return true;
- }
- }
-
- return false;
- }
-
-
- private boolean isEventProviderInjection(InjectionPoint injectionPoint)
- {
- Type type = injectionPoint.getType();
-
- if (type instanceof ParameterizedType)
- {
- ParameterizedType pt = (ParameterizedType) type;
- Class<?> clazz = (Class<?>) pt.getRawType();
-
- if(clazz.isAssignableFrom(Event.class))
- {
- return true;
- }
- }
-
- return false;
- }
}
Modified: openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/inject/instance/InstanceImpl.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/inject/instance/InstanceImpl.java?rev=1465432&r1=1465431&r2=1465432&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/inject/instance/InstanceImpl.java (original)
+++ openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/inject/instance/InstanceImpl.java Sun Apr 7 17:26:47 2013
@@ -37,7 +37,7 @@ import javax.enterprise.util.TypeLiteral
import org.apache.webbeans.config.WebBeansContext;
import org.apache.webbeans.container.BeanManagerImpl;
import org.apache.webbeans.container.InjectionResolver;
-import org.apache.webbeans.portable.InjectionPointProducer;
+import org.apache.webbeans.context.creational.CreationalContextImpl;
import org.apache.webbeans.util.ClassUtil;
import org.apache.webbeans.util.InjectionExceptionUtil;
import org.apache.webbeans.util.OwbCustomObjectInputStream;
@@ -65,7 +65,7 @@ public class InstanceImpl<T> implements
private WebBeansContext webBeansContext;
- private CreationalContext<?> parentCreationalContext;
+ private CreationalContextImpl<?> parentCreationalContext;
/**
* Creates new instance.
@@ -77,7 +77,7 @@ public class InstanceImpl<T> implements
* @param annotations qualifier annotations
*/
public InstanceImpl(Type injectionClazz, InjectionPoint injectionPoint, WebBeansContext webBeansContext,
- CreationalContext<?> creationalContext, Annotation... annotations)
+ CreationalContextImpl<?> creationalContext, Annotation... annotations)
{
this.injectionClazz = injectionClazz;
this.injectionPoint = injectionPoint;
@@ -100,39 +100,43 @@ public class InstanceImpl<T> implements
{
T instance;
- InjectionPointProducer.setThreadLocal(injectionPoint);
- try
- {
- Annotation[] anns = new Annotation[qualifierAnnotations.size()];
- anns = qualifierAnnotations.toArray(anns);
-
- Set<Bean<?>> beans = resolveBeans();
+ Annotation[] anns = new Annotation[qualifierAnnotations.size()];
+ anns = qualifierAnnotations.toArray(anns);
- BeanManagerImpl beanManager = webBeansContext.getBeanManagerImpl();
+ Set<Bean<?>> beans = resolveBeans();
- Bean<?> bean = beanManager.resolve(beans);
-
- if (bean == null)
- {
- InjectionExceptionUtil.throwUnsatisfiedResolutionException(ClassUtil.getClazz(injectionClazz), injectionPoint, anns);
- }
+ BeanManagerImpl beanManager = webBeansContext.getBeanManagerImpl();
+
+ Bean<?> bean = beanManager.resolve(beans);
+
+ if (bean == null)
+ {
+ InjectionExceptionUtil.throwUnsatisfiedResolutionException(ClassUtil.getClazz(injectionClazz), injectionPoint, anns);
+ }
- // since Instance<T> is Dependent, we we gonna use the parent CreationalContext by default
- CreationalContext<?> creationalContext = parentCreationalContext;
+ // since Instance<T> is Dependent, we we gonna use the parent CreationalContext by default
+ CreationalContext<?> creationalContext = parentCreationalContext;
- boolean isDependentBean = WebBeansUtil.isDependent(bean);
+ boolean isDependentBean = WebBeansUtil.isDependent(bean);
- if (!isDependentBean)
- {
- // but for all NormalScoped beans we will need to create a fresh CreationalContext
- creationalContext = beanManager.createCreationalContext(bean);
- }
+ if (!isDependentBean)
+ {
+ // but for all NormalScoped beans we will need to create a fresh CreationalContext
+ creationalContext = beanManager.createCreationalContext(bean);
+ }
+ if (!(creationalContext instanceof CreationalContextImpl))
+ {
+ creationalContext = webBeansContext.getCreationalContextFactory().wrappedCreationalContext(creationalContext, bean);
+ }
+ ((CreationalContextImpl<?>)creationalContext).putInjectionPoint(injectionPoint);
+ try
+ {
instance = (T) beanManager.getReference(bean, null, creationalContext);
}
finally
{
- InjectionPointProducer.removeThreadLocal();
+ ((CreationalContextImpl<?>)creationalContext).removeInjectionPoint();
}
return instance;
@@ -259,7 +263,7 @@ public class InstanceImpl<T> implements
{
Set<Bean<?>> beans = resolveBeans();
Set<T> instances = new HashSet<T>();
- InjectionPointProducer.setThreadLocal(injectionPoint);
+ parentCreationalContext.putInjectionPoint(injectionPoint);
try
{
for(Bean<?> bean : beans)
@@ -270,7 +274,7 @@ public class InstanceImpl<T> implements
}
finally
{
- InjectionPointProducer.removeThreadLocal();
+ parentCreationalContext.removeInjectionPoint();
}
return instances.iterator();
Modified: openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/portable/InjectionPointProducer.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/portable/InjectionPointProducer.java?rev=1465432&r1=1465431&r2=1465432&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/portable/InjectionPointProducer.java (original)
+++ openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/portable/InjectionPointProducer.java Sun Apr 7 17:26:47 2013
@@ -18,16 +18,14 @@
*/
package org.apache.webbeans.portable;
-import java.util.Stack;
-
import javax.enterprise.context.spi.CreationalContext;
import javax.enterprise.inject.spi.InjectionPoint;
+import org.apache.webbeans.context.creational.CreationalContextImpl;
+import org.apache.webbeans.util.ClassUtil;
+
public class InjectionPointProducer extends AbstractProducer<InjectionPoint>
{
-
- //X TODO refactor. public static variables are utterly ugly
- private static ThreadLocal<Stack<InjectionPoint>> localThreadlocalStack = new ThreadLocal<Stack<InjectionPoint>>();
/**
* {@inheritDoc}
@@ -35,53 +33,30 @@ public class InjectionPointProducer exte
@Override
public InjectionPoint produce(CreationalContext<InjectionPoint> creationalContext)
{
- return getStackOfInjectionPoints().peek();
- }
-
- @Override
- public void dispose(InjectionPoint ip)
- {
- removeThreadLocal();
- }
-
- private static Stack<InjectionPoint> getStackOfInjectionPoints()
- {
- Stack<InjectionPoint> stackIP = localThreadlocalStack.get();
- if (null == stackIP)
+ if (!(creationalContext instanceof CreationalContextImpl))
{
- stackIP = new Stack<InjectionPoint>();
+ return null;
}
- return stackIP;
- }
-
- public static boolean setThreadLocal(InjectionPoint ip)
- {
- Stack<InjectionPoint> stackIP = getStackOfInjectionPoints();
- stackIP.push(ip);
- localThreadlocalStack.set(stackIP);
- return true;
- }
-
- public static void unsetThreadLocal()
- {
- Stack<InjectionPoint> stackIP = getStackOfInjectionPoints();
- if (!stackIP.isEmpty())
+ // the first injection point on the stack is of type InjectionPoint, so we need the second one
+ CreationalContextImpl<InjectionPoint> creationalContextImpl = (CreationalContextImpl<InjectionPoint>)creationalContext;
+ InjectionPoint first = creationalContextImpl.removeInjectionPoint();
+ if (!InjectionPoint.class.isAssignableFrom(ClassUtil.getClass(first.getType())))
{
- stackIP.pop();
+ throw new IllegalStateException("Inconsistent injection point stack");
+ }
+ try
+ {
+ return creationalContextImpl.getInjectionPoint();
+ }
+ finally
+ {
+ creationalContextImpl.putInjectionPoint(first);
}
}
-
- /**
- * Removes the ThreadLocal from the ThreadMap to prevent memory leaks.
- */
- public static void removeThreadLocal()
- {
- getStackOfInjectionPoints().clear();
- localThreadlocalStack.remove();
- }
-
- public static boolean isStackEmpty()
+
+ @Override
+ public void dispose(InjectionPoint ip)
{
- return getStackOfInjectionPoints().isEmpty();
+ // nothing to do
}
}
Modified: openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/portable/InstanceProducer.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/portable/InstanceProducer.java?rev=1465432&r1=1465431&r2=1465432&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/portable/InstanceProducer.java (original)
+++ openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/portable/InstanceProducer.java Sun Apr 7 17:26:47 2013
@@ -27,6 +27,7 @@ import javax.enterprise.context.spi.Crea
import javax.enterprise.inject.Instance;
import javax.enterprise.inject.spi.InjectionPoint;
+import org.apache.webbeans.component.InstanceBean;
import org.apache.webbeans.config.WebBeansContext;
import org.apache.webbeans.context.creational.CreationalContextImpl;
import org.apache.webbeans.inject.instance.InstanceImpl;
@@ -50,11 +51,17 @@ public class InstanceProducer<T> extends
try
{
InjectionPoint injectionPoint = null;
- //TODO What should we do here if creationalContext is not instanceof CreationalContextImpl?
+ CreationalContextImpl<Instance<T>> creationalContextImpl = null;
if (creationalContext instanceof CreationalContextImpl)
{
- injectionPoint = ((CreationalContextImpl<Instance<T>>)creationalContext).getInjectionPoint();
+ creationalContextImpl = (CreationalContextImpl<Instance<T>>)creationalContext;
}
+ else
+ {
+ InstanceBean<Object> instanceBean = webBeansContext.getWebBeansUtil().getInstanceBean();
+ creationalContextImpl = webBeansContext.getCreationalContextFactory().wrappedCreationalContext(creationalContext, instanceBean);
+ }
+ injectionPoint = creationalContextImpl.getInjectionPoint();
Set<Annotation> qualifiers;
Type type;
@@ -70,7 +77,7 @@ public class InstanceProducer<T> extends
type = this.returnType;
}
- Instance<T> instance = new InstanceImpl<T>(type, injectionPoint, webBeansContext, creationalContext, qualifiers.toArray(new Annotation[qualifiers.size()]));
+ Instance<T> instance = new InstanceImpl<T>(type, injectionPoint, webBeansContext, creationalContextImpl, qualifiers.toArray(new Annotation[qualifiers.size()]));
return instance;
}
Modified: openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/util/AnnotationUtil.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/util/AnnotationUtil.java?rev=1465432&r1=1465431&r2=1465432&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/util/AnnotationUtil.java (original)
+++ openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/util/AnnotationUtil.java Sun Apr 7 17:26:47 2013
@@ -49,7 +49,8 @@ public final class AnnotationUtil
public static final Object[] EMPTY_OBJECT_ARRAY = new Object[0];
- public static final Set<Annotation> DEFAULT_AND_ANY_ANNOTATION = Collections.unmodifiableSet(new HashSet<Annotation>(Arrays.asList(DefaultLiteral.INSTANCE, new AnyLiteral())));
+ public static final Set<Annotation> DEFAULT_AND_ANY_ANNOTATION
+ = Collections.unmodifiableSet(new HashSet<Annotation>(Arrays.<Annotation>asList(DefaultLiteral.INSTANCE, AnyLiteral.INSTANCE)));
// No instantiate
private AnnotationUtil()
@@ -245,37 +246,6 @@ public final class AnnotationUtil
}
return result;
}
-
- /**
- * Gets the method first found parameter annotation with given type.
- *
- * @param method method
- * @param clazz checking annotation
- * @return annotation
- */
- public static <T extends Annotation> T getMethodFirstParameterAnnotation(Method method, Class<T> clazz)
- {
- Asserts.assertNotNull(method, "Method argument can not be null");
- Asserts.nullCheckForClass(clazz);
-
- Annotation[][] parameterAnns = method.getParameterAnnotations();
-
- for (Annotation[] parameters : parameterAnns)
- {
- for (Annotation param : parameters)
- {
- Class<? extends Annotation> btype = param.annotationType();
- if (btype.equals(clazz))
- {
- return clazz.cast(param);
- }
-
- }
-
- }
-
- return null;
- }
public static <X,T extends Annotation> T getAnnotatedMethodFirstParameterAnnotation(AnnotatedMethod<X> annotatedMethod, Class<T> clazz)
{
Modified: openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/util/ClassUtil.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/util/ClassUtil.java?rev=1465432&r1=1465431&r2=1465432&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/util/ClassUtil.java (original)
+++ openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/util/ClassUtil.java Sun Apr 7 17:26:47 2013
@@ -931,8 +931,9 @@ public final class ClassUtil
* @return true if there are type parameters
* @since 1.1.1
*/
- public static boolean isDefinitionContainsTypeVariables(Class<?> clazz)
+ public static boolean isDefinitionContainsTypeVariables(Type type)
{
+ Class<?> clazz = ClassUtil.getClass(type);
Asserts.nullCheckForClass(clazz);
return (clazz.getTypeParameters().length > 0) ? true : false;