You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openwebbeans.apache.org by rm...@apache.org on 2018/12/19 08:31:37 UTC
svn commit: r1849277 - in /openwebbeans/trunk/webbeans-impl/src:
main/java/org/apache/webbeans/configurator/BeanConfiguratorImpl.java
test/java/org/apache/webbeans/test/injection/named/NamedTests.java
Author: rmannibucau
Date: Wed Dec 19 08:31:37 2018
New Revision: 1849277
URL: http://svn.apache.org/viewvc?rev=1849277&view=rev
Log:
OWB-1276 ensure BeanConfigurator manages @Default/@Any qualifiers properly for @Named qualified beans
Modified:
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/configurator/BeanConfiguratorImpl.java
openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/test/injection/named/NamedTests.java
Modified: openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/configurator/BeanConfiguratorImpl.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/configurator/BeanConfiguratorImpl.java?rev=1849277&r1=1849276&r2=1849277&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/configurator/BeanConfiguratorImpl.java (original)
+++ openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/configurator/BeanConfiguratorImpl.java Wed Dec 19 08:31:37 2018
@@ -20,6 +20,7 @@ package org.apache.webbeans.configurator
import javax.enterprise.context.Dependent;
import javax.enterprise.context.spi.CreationalContext;
+import javax.enterprise.inject.Any;
import javax.enterprise.inject.Instance;
import javax.enterprise.inject.spi.AnnotatedType;
import javax.enterprise.inject.spi.Bean;
@@ -30,6 +31,8 @@ import javax.enterprise.inject.spi.Passi
import javax.enterprise.inject.spi.Producer;
import javax.enterprise.inject.spi.configurator.BeanConfigurator;
import javax.enterprise.util.TypeLiteral;
+import javax.inject.Named;
+
import java.lang.annotation.Annotation;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
@@ -47,8 +50,11 @@ import org.apache.webbeans.component.Web
import org.apache.webbeans.component.creation.BeanAttributesBuilder;
import org.apache.webbeans.config.WebBeansContext;
import org.apache.webbeans.exception.WebBeansConfigurationException;
+import org.apache.webbeans.util.AnnotationUtil;
import org.apache.webbeans.util.GenericsUtil;
+import static java.util.stream.Collectors.joining;
+
//X TODO finish. Impossible to implement right now as the spec is ambiguous
//X TODO producer part
public class BeanConfiguratorImpl<T> implements BeanConfigurator<T>
@@ -253,10 +259,7 @@ public class BeanConfiguratorImpl<T> imp
@Override
public BeanConfigurator<T> addQualifiers(Annotation... qualifiers)
{
- for (Annotation qualifier : qualifiers)
- {
- this.qualifiers.add(qualifier);
- }
+ this.qualifiers.addAll(Arrays.asList(qualifiers));
return this;
}
@@ -321,23 +324,52 @@ public class BeanConfiguratorImpl<T> imp
public Bean<?> getBean()
{
+ updateQualifiers();
+ setPassivationIdIfNeeded();
+ return new ConstructedBean();
+ }
+
+ private void setPassivationIdIfNeeded()
+ {
+ if (!webBeansContext.getBeanManagerImpl().isPassivatingScope(scope) || passivationId != null)
+ {
+ return;
+ }
+ final StringBuilder sb = new StringBuilder("CONFIGURATOR#");
+ sb.append(beanClass != null ? beanClass : typeClosures.stream().filter(Class.class::isInstance).findFirst()
+ .filter(it -> it != Object.class)
+ .orElse(Object.class)).append('#').append(qualifiers.stream().map(Annotation::toString).collect(
+ joining(",")));
+ for (final Annotation qualifier : qualifiers)
+ {
+ sb.append(qualifier.toString()).append(',');
+ }
+ passivationId = sb.toString();
+ }
+
+ // same as org.apache.webbeans.component.creation.BeanAttributesBuilder#defineQualifiers
+ private void updateQualifiers()
+ {
if (qualifiers.isEmpty())
{
qualifiers.add(DefaultLiteral.INSTANCE);
- qualifiers.add(AnyLiteral.INSTANCE);
}
- if (scope != null && webBeansContext.getBeanManagerImpl().isPassivatingScope(scope) && passivationId == null)
+ else if (qualifiers.size() == 1)
{
- final StringBuilder sb = new StringBuilder("CONFIGURATOR#");
- sb.append(beanClass != null ? beanClass : typeClosures.stream().filter(Class.class::isInstance).findFirst()
- .orElse(Object.class)).append('#');
- for (final Annotation qualifier : qualifiers)
+ final Class<? extends Annotation> annotationType = qualifiers.iterator().next().annotationType();
+ if (annotationType == Named.class || annotationType == Any.class)
{
- sb.append(qualifier.toString()).append(',');
+ qualifiers.add(DefaultLiteral.INSTANCE);
}
- passivationId = sb.toString();
}
- return new ConstructedBean();
+ else if (qualifiers.size() == 2 && qualifiers.stream().allMatch(it -> it.annotationType() == Named.class))
+ {
+ qualifiers.add(DefaultLiteral.INSTANCE);
+ }
+ if (AnnotationUtil.getAnnotation(qualifiers, Any.class) == null)
+ {
+ qualifiers.add(AnyLiteral.INSTANCE);
+ }
}
/**
@@ -354,7 +386,9 @@ public class BeanConfiguratorImpl<T> imp
{
//X TODO calculate return type from the typeClosures properly
this.returnType = beanClass != null ? Class.class.cast(beanClass) : (typeClosures.isEmpty() ? null :
- Class.class.cast(typeClosures.stream().filter(Class.class::isInstance).findFirst().orElse(null)));
+ Class.class.cast(typeClosures.stream().filter(Class.class::isInstance).findFirst()
+ .filter(it -> it != Object.class)
+ .orElse(Object.class)));
dependent = !webBeansContext.getBeanManagerImpl().isNormalScope(scope);
Modified: openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/test/injection/named/NamedTests.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/test/injection/named/NamedTests.java?rev=1849277&r1=1849276&r2=1849277&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/test/injection/named/NamedTests.java (original)
+++ openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/test/injection/named/NamedTests.java Wed Dec 19 08:31:37 2018
@@ -18,11 +18,17 @@
*/
package org.apache.webbeans.test.injection.named;
+import static org.apache.webbeans.util.Asserts.assertNotNull;
+
import java.util.ArrayList;
import java.util.Collection;
import javax.enterprise.context.spi.CreationalContext;
+import javax.enterprise.event.Observes;
+import javax.enterprise.inject.literal.NamedLiteral;
+import javax.enterprise.inject.spi.AfterBeanDiscovery;
import javax.enterprise.inject.spi.Bean;
+import javax.enterprise.inject.spi.Extension;
import org.apache.webbeans.test.AbstractUnitTest;
import org.junit.Assert;
@@ -51,9 +57,26 @@ public class NamedTests extends Abstract
Assert.assertEquals("NamedBean", consumer.getNamed().getName());
Assert.assertEquals("DefaultNamedBean", consumer.getDefaultNamedBeanWithNamedInjectionPoint().getName());
Assert.assertEquals("DefaultNamedBean", consumer.getDefaultNamedBean().getName());
-
+
shutDownContainer();
}
+ @Test
+ public void beanConfiguratorNamedQualifier()
+ {
+ addExtension(new Extension()
+ {
+ void addBean(@Observes final AfterBeanDiscovery afterBeanDiscovery)
+ {
+ afterBeanDiscovery.addBean()
+ .qualifiers(NamedLiteral.of("test"))
+ .beanClass(NamedInterface.class)
+ .types(NamedInterface.class)
+ .createWith(it -> new NamedBean());
+ }
+ });
+ startContainer();
+ assertNotNull(getInstance(NamedInterface.class));
+ }
}