You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openwebbeans.apache.org by st...@apache.org on 2016/02/13 12:12:21 UTC

svn commit: r1730181 - in /openwebbeans/trunk: webbeans-impl/src/main/java/org/apache/webbeans/component/ webbeans-impl/src/main/java/org/apache/webbeans/component/creation/ webbeans-impl/src/main/java/org/apache/webbeans/component/third/ webbeans-impl...

Author: struberg
Date: Sat Feb 13 11:12:20 2016
New Revision: 1730181

URL: http://svn.apache.org/viewvc?rev=1730181&view=rev
Log:
OWB-1116 cleanup of Alternatives, Specializes and BeanAttributes handling

Modified:
    openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/AbstractOwbBean.java
    openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/AbstractProducerBean.java
    openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/BeanAttributesImpl.java
    openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/InjectionTargetBean.java
    openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/ProducerFieldBean.java
    openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/ProducerMethodBean.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/component/creation/ManagedBeanBuilder.java
    openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/third/ThirdpartyBeanImpl.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/InjectionResolver.java
    openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/inject/AlternativesManager.java
    openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/util/WebBeansUtil.java
    openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/test/unittests/inject/alternative/AlternativeTest.java
    openwebbeans/trunk/webbeans-tck/testng-dev.xml

Modified: openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/AbstractOwbBean.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/AbstractOwbBean.java?rev=1730181&r1=1730180&r2=1730181&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/AbstractOwbBean.java (original)
+++ openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/AbstractOwbBean.java Sat Feb 13 11:12:20 2016
@@ -68,11 +68,6 @@ public abstract class AbstractOwbBean<T>
     protected boolean enabled = true;
 
     /**
-     * cached value for {@link #isAlternative()}
-     */
-    protected Boolean isAlternative = null;
-
-    /**
      * This string will be used for passivating the Bean.
      * It will be created on the first use.
      * @see #getId()
@@ -312,20 +307,6 @@ public abstract class AbstractOwbBean<T>
         return specializedBean;
     }
     
-     /**
-     * {@inheritDoc}
-     */    
-    @Override
-    public boolean isAlternative()
-    {
-        if (isAlternative == null)
-        {
-            isAlternative = webBeansContext.getAlternativesManager().isAlternative(getBeanClass(), getStereotypes());
-        }
-
-        return isAlternative;
-    }
-    
     /**
      * {@inheritDoc}
      */

Modified: openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/AbstractProducerBean.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/AbstractProducerBean.java?rev=1730181&r1=1730180&r2=1730181&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/AbstractProducerBean.java (original)
+++ openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/AbstractProducerBean.java Sat Feb 13 11:12:20 2016
@@ -21,13 +21,11 @@ package org.apache.webbeans.component;
 import java.io.Serializable;
 import java.lang.reflect.Modifier;
 
-import javax.enterprise.context.spi.CreationalContext;
 import javax.enterprise.inject.spi.PassivationCapable;
 import javax.enterprise.inject.spi.Producer;
 
 import javax.enterprise.inject.spi.BeanAttributes;
 import javax.enterprise.inject.spi.ProducerFactory;
-import org.apache.webbeans.config.WebBeansContext;
 import org.apache.webbeans.util.WebBeansUtil;
 
 
@@ -41,23 +39,23 @@ public class AbstractProducerBean<T> ext
 {
     private Class<T> returnType;
     private Producer<T> producer;
+    private InjectionTargetBean<?> ownerComponent;
 
     /**
      * Create a new instance.
      * 
      * @param returnType bean type info
-     * @param ownerBeanClass class which contains this producer method or field
      */
-    public AbstractProducerBean(Class<?> ownerBeanClass,
-            WebBeansContext webBeansContext,
-            WebBeansType webBeansType,
-            BeanAttributes<T> beanAttributes,
-            Class<T> returnType,
-            ProducerFactory<?> producerFactory)
+    public AbstractProducerBean(InjectionTargetBean<?> ownerComponent,
+                                WebBeansType webBeansType,
+                                BeanAttributes<T> beanAttributes,
+                                Class<T> returnType,
+                                ProducerFactory<?> producerFactory)
     {
-        super(webBeansContext, webBeansType, beanAttributes, ownerBeanClass, !returnType.isPrimitive());
+        super(ownerComponent.webBeansContext, webBeansType, beanAttributes, ownerComponent.getBeanClass(), !returnType.isPrimitive());
         this.returnType = returnType;
         producer = producerFactory.createProducer(this);
+        this.ownerComponent = ownerComponent;
     }
 
     @Override
@@ -72,14 +70,11 @@ public class AbstractProducerBean<T> ext
         return returnType;
     }
 
-    /**
-     * {@inheritDoc}
-     */
-    public void dispose(T instance, CreationalContext<T> creationalContext)
+    public InjectionTargetBean<?> getOwnerComponent()
     {
-        // Do nothing
+        return ownerComponent;
     }
-    
+
     /**
      * Check null control.
      * 

Modified: openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/BeanAttributesImpl.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/BeanAttributesImpl.java?rev=1730181&r1=1730180&r2=1730181&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/BeanAttributesImpl.java (original)
+++ openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/BeanAttributesImpl.java Sat Feb 13 11:12:20 2016
@@ -26,7 +26,6 @@ import java.util.Set;
 
 import javax.enterprise.context.Dependent;
 import javax.enterprise.inject.spi.Bean;
-
 import javax.enterprise.inject.spi.BeanAttributes;
 import org.apache.webbeans.util.AnnotationUtil;
 
@@ -41,7 +40,8 @@ public class BeanAttributesImpl<T> imple
     private final boolean alternative;
 
     /**
-     * TODO This constructor can be removed, when we move to CDI 1.1 since {@link Bean} extends BeanAttributes.
+     * do not remove, this ct is used from within TomEE for example.
+     * @deprecated
      */
     public BeanAttributesImpl(Bean<T> bean)
     {

Modified: openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/InjectionTargetBean.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/InjectionTargetBean.java?rev=1730181&r1=1730180&r2=1730181&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/InjectionTargetBean.java (original)
+++ openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/InjectionTargetBean.java Sat Feb 13 11:12:20 2016
@@ -72,7 +72,6 @@ public class InjectionTargetBean<T> exte
         this.annotatedType = annotatedType;
         injectionTarget = factory.createInjectionTarget(this);
         setEnabled(true);
-        this.isAlternative = beanAttributes.isAlternative();
     }
 
     // call it only if you know what you do, basically only useful when creating a bean manually and not using child classes

Modified: openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/ProducerFieldBean.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/ProducerFieldBean.java?rev=1730181&r1=1730180&r2=1730181&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/ProducerFieldBean.java (original)
+++ openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/ProducerFieldBean.java Sat Feb 13 11:12:20 2016
@@ -43,7 +43,7 @@ public class ProducerFieldBean<T> extend
      */
     public ProducerFieldBean(InjectionTargetBean<?> ownerComponent, BeanAttributes<T> beanAttributes, Class<T> returnType, ProducerFactory<T> producerFactory)
     {
-        super(ownerComponent.getBeanClass(), ownerComponent.getWebBeansContext(), WebBeansType.PRODUCERFIELD, beanAttributes, returnType, producerFactory);
+        super(ownerComponent, WebBeansType.PRODUCERFIELD, beanAttributes, returnType, producerFactory);
     }
 
     /**

Modified: openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/ProducerMethodBean.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/ProducerMethodBean.java?rev=1730181&r1=1730180&r2=1730181&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/ProducerMethodBean.java (original)
+++ openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/ProducerMethodBean.java Sat Feb 13 11:12:20 2016
@@ -52,7 +52,7 @@ public class ProducerMethodBean<T> exten
                                   Class<T> returnType,
                                   MethodProducerFactory<P> producerFactory)
     {
-        super(ownerComponent.getBeanClass(), ownerComponent.getWebBeansContext(), WebBeansType.PRODUCERMETHOD, beanAttributes, returnType, producerFactory);
+        super(ownerComponent, WebBeansType.PRODUCERMETHOD, beanAttributes, returnType, producerFactory);
     }
 
     /**

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=1730181&r1=1730180&r2=1730181&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 Sat Feb 13 11:12:20 2016
@@ -30,10 +30,8 @@ import java.util.Set;
 import javax.decorator.Decorator;
 import javax.enterprise.context.Dependent;
 import javax.enterprise.context.NormalScope;
-import javax.enterprise.inject.Alternative;
 import javax.enterprise.inject.Any;
 import javax.enterprise.inject.Specializes;
-import javax.enterprise.inject.Stereotype;
 import javax.enterprise.inject.Typed;
 import javax.enterprise.inject.spi.Annotated;
 import javax.enterprise.inject.spi.AnnotatedField;
@@ -56,7 +54,6 @@ import org.apache.webbeans.config.WebBea
 import org.apache.webbeans.container.ExternalScope;
 import org.apache.webbeans.exception.WebBeansConfigurationException;
 
-import org.apache.webbeans.inject.AlternativesManager;
 import org.apache.webbeans.logger.WebBeansLoggerFacade;
 import org.apache.webbeans.util.AnnotationUtil;
 import org.apache.webbeans.util.Asserts;
@@ -86,7 +83,7 @@ public abstract class BeanAttributesBuil
 
     protected boolean nullable;
 
-    protected Set<Class<? extends Annotation>> stereotypes = new HashSet<Class<? extends Annotation>>();
+    protected Set<Class<? extends Annotation>> stereotypes;
 
     protected boolean alternative;
     
@@ -109,7 +106,7 @@ public abstract class BeanAttributesBuil
     public BeanAttributesImpl<T> build()
     {
         // we need to check the stereotypes first because we might need it to determine the scope
-        defineStereotypes();
+        stereotypes = defineStereotypes(annotated);
 
         defineScope();
         if (scope == null)
@@ -511,9 +508,10 @@ public abstract class BeanAttributesBuil
     /**
      * {@inheritDoc}
      */
-    protected void defineStereotypes()
+    protected Set<Class<? extends Annotation>> defineStereotypes(Annotated annot)
     {
-        Annotation[] anns = AnnotationUtil.asArray(annotated.getAnnotations());
+        Set<Class<? extends Annotation>> stereos  = null;
+        Annotation[] anns = AnnotationUtil.asArray(annot.getAnnotations());
         final AnnotationManager annotationManager = webBeansContext.getAnnotationManager();
         if (annotationManager.hasStereoTypeMetaAnnotation(anns))
         {
@@ -522,45 +520,24 @@ public abstract class BeanAttributesBuil
 
             for (Annotation stereo : steroAnns)
             {
-                stereotypes.add(stereo.annotationType());
+                if (stereos == null)
+                {
+                    stereos = new HashSet<Class<? extends Annotation>>();
+                }
+                stereos.add(stereo.annotationType());
             }
         }
+
+        return stereos != null ? stereos : Collections.EMPTY_SET;
     }
 
     // these alternatives can be not activated
     protected void defineAlternative()
     {
-        final AlternativesManager alternativesManager = webBeansContext.getAlternativesManager();
-        alternative = alternativesManager.isAlternative(getType(), Collections.<Class<? extends Annotation>>emptySet());
-        if (alternative)
-        {
-            alternative = true;
-            return;
-        }
-
-        for (final Annotation a : annotated.getAnnotations())
-        {
-            final Class<? extends Annotation> annotationType = a.annotationType();
-            if (annotationType == Alternative.class)
-            {
-                alternative = true;
-                return;
-            }
-
-            if (annotationType.getAnnotation(Stereotype.class) != null)
-            {
-                for (final Annotation aa : annotationType.getAnnotations())
-                {
-                    if (aa.annotationType() == Alternative.class)
-                    {
-                        alternative = true;
-                        return;
-                    }
-                }
-            }
-        }
+        alternative = WebBeansUtil.isAlternative(annotated, stereotypes);
     }
 
+
     protected abstract Class<?> getType();
     
     public static class BeanAttributesBuilderFactory
@@ -809,7 +786,6 @@ public abstract class BeanAttributesBuil
 
     private abstract static class AnnotatedMemberBeanAttributesBuilder<M, A extends AnnotatedMember<M>> extends BeanAttributesBuilder<M, A>
     {
-
         protected AnnotatedMemberBeanAttributesBuilder(WebBeansContext webBeansContext, A annotated)
         {
             super(webBeansContext, annotated);

Modified: openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/creation/ManagedBeanBuilder.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/creation/ManagedBeanBuilder.java?rev=1730181&r1=1730180&r2=1730181&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/creation/ManagedBeanBuilder.java (original)
+++ openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/creation/ManagedBeanBuilder.java Sat Feb 13 11:12:20 2016
@@ -62,7 +62,7 @@ public class ManagedBeanBuilder<T, M ext
     public M getBean()
     {
         M bean = (M) new ManagedBean<T>(webBeansContext, WebBeansType.MANAGED, annotatedType, beanAttributes, annotatedType.getJavaClass());
-        bean.setEnabled(webBeansContext.getWebBeansUtil().isBeanEnabled(annotatedType, bean.getStereotypes()));
+        bean.setEnabled(webBeansContext.getWebBeansUtil().isBeanEnabled(beanAttributes, annotatedType, bean.getStereotypes()));
         webBeansContext.getWebBeansUtil().checkManagedBeanCondition(annotatedType);
         WebBeansUtil.checkGenericType(annotatedType.getJavaClass(), beanAttributes.getScope());
         webBeansContext.getWebBeansUtil().validateBeanInjection(bean);

Modified: openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/third/ThirdpartyBeanImpl.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/third/ThirdpartyBeanImpl.java?rev=1730181&r1=1730180&r2=1730181&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/third/ThirdpartyBeanImpl.java (original)
+++ openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/third/ThirdpartyBeanImpl.java Sat Feb 13 11:12:20 2016
@@ -31,7 +31,6 @@ import org.apache.webbeans.component.Bea
 import org.apache.webbeans.component.WebBeansType;
 import org.apache.webbeans.config.WebBeansContext;
 import org.apache.webbeans.context.creational.CreationalContextImpl;
-import org.apache.webbeans.inject.AlternativesManager;
 
 public class ThirdpartyBeanImpl<T> extends AbstractOwbBean<T> implements Bean<T>
 {
@@ -41,7 +40,7 @@ public class ThirdpartyBeanImpl<T> exten
     {
         super(webBeansContext,
               WebBeansType.THIRDPARTY,
-              new BeanAttributesImpl<T>(bean),
+              new BeanAttributesImpl<T>(bean, false),
               bean.getBeanClass(),
               bean.isNullable());
         
@@ -140,18 +139,7 @@ public class ThirdpartyBeanImpl<T> exten
     @Override
     public boolean isAlternative()
     {
-        boolean alternative = super.isAlternative();
-        if(alternative)
-        {
-            AlternativesManager manager = getWebBeansContext().getAlternativesManager();
-            //Class alternative
-            if (manager.isAlternative(getBeanClass(), bean.getStereotypes()))
-            {
-                return true;
-            }
-        }
-        
-        return false;
+        return bean.isAlternative();
     }
 
     /**

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=1730181&r1=1730180&r2=1730181&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 Sat Feb 13 11:12:20 2016
@@ -19,6 +19,7 @@
 package org.apache.webbeans.config;
 
 import org.apache.webbeans.annotation.AnnotationManager;
+import org.apache.webbeans.annotation.AnyLiteral;
 import org.apache.webbeans.component.AbstractProducerBean;
 import org.apache.webbeans.component.BeanAttributesImpl;
 import org.apache.webbeans.component.BuiltInOwbBean;
@@ -298,8 +299,9 @@ public class BeansDeployer
                 
                 // We are finally done with our bean discovery
                 fireAfterBeanDiscoveryEvent();
-                
-                // Validate injection Points
+
+                validateAlternatives(beanAttributesPerBda);
+
                 validateInjectionPoints();
                 validateDisposeParameters();
 
@@ -722,7 +724,68 @@ public class BeansDeployer
         packageVetoCache.clear(); // no more needed, free the memory
         event.setStarted();
     }
-    
+
+    /**
+     * Check if all XML configured alternatives end up as alternative beans
+     * @param beanAttributesPerBda
+     */
+    private void validateAlternatives(Map<BeanArchiveInformation, Map<AnnotatedType<?>, ExtendedBeanAttributes<?>>> beanAttributesPerBda)
+    {
+        Set<Class<?>> xmlConfiguredAlternatives = webBeansContext.getAlternativesManager().getXmlConfiguredAlternatives();
+        InjectionResolver injectionResolver = webBeansContext.getBeanManagerImpl().getInjectionResolver();
+
+        for (Class<?> alternativeClass : xmlConfiguredAlternatives)
+        {
+            if (AnnotationUtil.hasClassAnnotation(alternativeClass, Alternative.class) ||
+                AnnotationUtil.hasMetaAnnotation(alternativeClass.getAnnotations(), Alternative.class))
+            {
+                continue;
+            }
+
+            boolean foundAlternativeClass = false;
+
+            Set<Bean<?>> beans = injectionResolver.implResolveByType(false, alternativeClass, AnyLiteral.INSTANCE);
+            if (beans == null || beans.isEmpty())
+            {
+                out:
+                for (Map<AnnotatedType<?>, ExtendedBeanAttributes<?>> annotatedTypeExtendedBeanAttributesMap : beanAttributesPerBda.values())
+                {
+                    for (Map.Entry<AnnotatedType<?>, ExtendedBeanAttributes<?>> exType : annotatedTypeExtendedBeanAttributesMap.entrySet())
+                    {
+                        if (alternativeClass.equals(exType.getKey().getJavaClass()))
+                        {
+                            if (exType.getValue().beanAttributes.isAlternative() ||
+                                exType.getKey().getAnnotation(Alternative.class) != null)
+                            {
+                                foundAlternativeClass = true;
+                                break out; // all fine, continue with the next
+                            }
+                        }
+                    }
+                }
+            }
+            else
+            {
+                for (Bean<?> bean : beans)
+                {
+                    if (bean.isAlternative())
+                    {
+                        foundAlternativeClass = true;
+                        break;
+                    }
+                }
+            }
+            if (!foundAlternativeClass)
+            {
+                throw new WebBeansDeploymentException("Given alternative class : " + alternativeClass.getName() +
+                    " is not annotated wih @Alternative or not an enabled bean");
+            }
+
+        }
+
+    }
+
+
     /**
      * Validate all injection points.
      */
@@ -1298,27 +1361,7 @@ public class BeansDeployer
                 }
                 else
                 {
-                    if (AnnotationUtil.hasClassAnnotation(clazz, Alternative.class) ||
-                            AnnotationUtil.hasMetaAnnotation(clazz.getAnnotations(), Alternative.class))
-                    {
-                        manager.addXmlClazzAlternative(clazz);
-                    }
-                    else
-                    {
-                        AnnotatedType annotatedType = annotatedElementFactory.getAnnotatedType(clazz);
-                        if (annotatedType != null)
-                        {
-                            if (annotatedType.getAnnotation(Alternative.class) != null)
-                            {
-                                manager.addXmlClazzAlternative(clazz);
-                                break;
-                            }
-                            else
-                            {
-                                throw new WebBeansDeploymentException("Given alternative class : " + clazz.getName() + " is not decorated wih @Alternative");
-                            }
-                        }
-                    }
+                    manager.addXmlClazzAlternative(clazz);
                 }
             }
         }

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=1730181&r1=1730180&r2=1730181&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 Sat Feb 13 11:12:20 2016
@@ -631,7 +631,9 @@ public class InjectionResolver
 
         for (Bean<? extends X> bean : beans)
         {
-            if (bean.isAlternative())
+            if (bean.isAlternative() ||
+                (bean instanceof AbstractProducerBean &&
+                    ((AbstractProducerBean) bean).getOwnerComponent().isAlternative()))
             {
                 alternativeSet.add(bean);
             }
@@ -653,6 +655,8 @@ public class InjectionResolver
             return alternativeSet;
         }
 
+        //
+
         return enableSet;
     }
 

Modified: openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/inject/AlternativesManager.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/inject/AlternativesManager.java?rev=1730181&r1=1730180&r2=1730181&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/inject/AlternativesManager.java (original)
+++ openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/inject/AlternativesManager.java Sat Feb 13 11:12:20 2016
@@ -163,7 +163,15 @@ public class AlternativesManager
 
         return false;
     }
-    
+
+    /**
+     * @return all the alternative classes declared in beans.xml files
+     */
+    public Set<Class<?>> getXmlConfiguredAlternatives()
+    {
+        return configuredAlternatives;
+    }
+
     public void clear()
     {
         configuredAlternatives.clear();

Modified: openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/util/WebBeansUtil.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/util/WebBeansUtil.java?rev=1730181&r1=1730180&r2=1730181&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/util/WebBeansUtil.java (original)
+++ openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/util/WebBeansUtil.java Sat Feb 13 11:12:20 2016
@@ -1176,6 +1176,13 @@ public final class WebBeansUtil
         bean.setEnabled(isBeanEnabled(bean.getAnnotatedType(), bean.getStereotypes()));
     }
 
+    public boolean isBeanEnabled(BeanAttributes<?> beanAttributes, AnnotatedType<?> at, Set<Class<? extends Annotation>> stereotypes)
+    {
+        boolean isAlternative = beanAttributes.isAlternative();
+
+        return !isAlternative || isBeanEnabled(at, stereotypes);
+    }
+
     public boolean isBeanEnabled(AnnotatedType<?> at, Set<Class<? extends Annotation>> stereotypes)
     {
         boolean isAlternative = isAlternative(at, stereotypes);
@@ -1183,14 +1190,14 @@ public final class WebBeansUtil
         return !isAlternative || webBeansContext.getAlternativesManager().isAlternative(at.getJavaClass(), stereotypes);
     }
 
-    public static boolean isAlternative(AnnotatedType<?> beanType, Set<Class<? extends Annotation>> stereotypes)
+    public static boolean isAlternative(Annotated annotated, Set<Class<? extends Annotation>> stereotypes)
     {
-        Asserts.assertNotNull(beanType, "bean type");
+        Asserts.assertNotNull(annotated, "annotated");
         Asserts.assertNotNull(stereotypes, "stereotypes");
 
         boolean alternative = false;
 
-        if(beanType.getAnnotation(Alternative.class) != null)
+        if(annotated.getAnnotation(Alternative.class) != null)
         {
             alternative = true;
         }

Modified: openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/test/unittests/inject/alternative/AlternativeTest.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/test/unittests/inject/alternative/AlternativeTest.java?rev=1730181&r1=1730180&r2=1730181&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/test/unittests/inject/alternative/AlternativeTest.java (original)
+++ openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/test/unittests/inject/alternative/AlternativeTest.java Sat Feb 13 11:12:20 2016
@@ -69,5 +69,22 @@ public class AlternativeTest extends Abs
         WebBeansContext.getInstance().getPluginLoader().shutDown();
         
     }
-    
+
+    @Test
+    public void testNotEnabledAlternative()
+    {
+        startContainer(AlternativeComponent.class, NotAlternativeComponent.class, AlternativeInjector.class);
+
+        AlternativeInjector instance = getInstance(AlternativeInjector.class);
+
+        Assert.assertNotNull(instance);
+
+        IAlternative alternative = instance.getAlternative();
+
+        Assert.assertTrue(alternative instanceof NotAlternativeComponent);
+
+        WebBeansContext.getInstance().getPluginLoader().shutDown();
+
+    }
+
 }

Modified: openwebbeans/trunk/webbeans-tck/testng-dev.xml
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-tck/testng-dev.xml?rev=1730181&r1=1730180&r2=1730181&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-tck/testng-dev.xml (original)
+++ openwebbeans/trunk/webbeans-tck/testng-dev.xml Sat Feb 13 11:12:20 2016
@@ -18,7 +18,7 @@
 <suite name="JSR-346-TCK" verbose="2" configfailurepolicy="continue">
   <test name="JSR-346 TCK">
     <classes>
-          <class name="org.jboss.cdi.tck.tests.extensions.beanManager.bootstrap.unavailable.methods.UnavailableMethodsDuringApplicationInitializationTest" />
+          <class name="org.jboss.cdi.tck.tests.alternative.broken.not.alternative.ClassIsNotAlternativeTest" />
       <!--
       <class name="org.jboss.cdi.tck.tests.event.parameterized.ParameterizedEventTest" />
       <class name="org.jboss.cdi.tck.tests.event.fires.FireEventTest" />