Author: rmannibucau Date: Fri Oct 3 16:33:49 2014 New Revision: 1629252 URL: http://svn.apache.org/r1629252 Log: OWB-1004 allow multiple times the same qualifier (almost repeatable of J8, miss the array part to be the exact same one)
Added: openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/test/tests/MultipleTimeTheSameBindingTest.java Modified: openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/annotation/AnnotationManager.java openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/container/BeanManagerImpl.java openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/intercept/InterceptorResolutionService.java openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/test/AbstractUnitTest.java openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/test/injection/noncontextual/InjectNonContextualTest.java Modified: openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/annotation/AnnotationManager.java URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/annotation/AnnotationManager.java?rev=1629252&r1=1629251&r2=1629252&view=diff ============================================================================== --- openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/annotation/AnnotationManager.java (original) +++ openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/annotation/AnnotationManager.java Fri Oct 3 16:33:49 2014 @@ -698,20 +698,10 @@ public final class AnnotationManager public void checkDecoratorResolverParams(Set<Type> apiTypes, Annotation... qualifiers) { - if (apiTypes == null || apiTypes.size() == 0) - { - throw new IllegalArgumentException("Manager.resolveDecorators() method parameter api types argument " + - "can not be empty"); - } - + checkQualifiersParams(apiTypes, qualifiers); Annotation old = null; - for (Annotation qualifier : qualifiers) + for (final Annotation qualifier : qualifiers) { - if (!isQualifierAnnotation(qualifier.annotationType())) - { - throw new IllegalArgumentException("Manager.resolveDecorators() method parameter qualifiers array " + - "can not contain other annotation that is not @Qualifier"); - } if (old == null) { old = qualifier; @@ -731,6 +721,24 @@ public final class AnnotationManager } + public void checkQualifiersParams(Set<Type> apiTypes, Annotation... qualifiers) + { + if (apiTypes == null || apiTypes.size() == 0) + { + throw new IllegalArgumentException("method parameter api types argument can not be empty"); + } + + for (final Annotation qualifier : qualifiers) + { + if (!isQualifierAnnotation(qualifier.annotationType())) + { + throw new IllegalArgumentException("Manager.resolveDecorators() method parameter qualifiers array " + + "can not contain other annotation that is not @Qualifier"); + } + } + + } + /** * Check conditions for the new binding. 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=1629252&r1=1629251&r2=1629252&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 Fri Oct 3 16:33:49 2014 @@ -463,14 +463,18 @@ public class BeanManagerImpl implements * {@inheritDoc} */ @Override - public List<Decorator<?>> resolveDecorators(Set<Type> types, Annotation... bindingTypes) + public List<Decorator<?>> resolveDecorators(final Set<Type> types, final Annotation... bindingTypes) { webBeansContext.getAnnotationManager().checkDecoratorResolverParams(types, bindingTypes); - Set<Decorator<?>> intsSet = webBeansContext.getDecoratorsManager().findDeployedWebBeansDecorator(types, bindingTypes); + return unsafeResolveDecorators(types, bindingTypes); + } - List<Decorator<?>> decoratorList = new ArrayList<Decorator<?>>(intsSet); + public List<Decorator<?>> unsafeResolveDecorators(final Set<Type> types, final Annotation[] bindingTypes) + { + webBeansContext.getAnnotationManager().checkQualifiersParams(types, bindingTypes); // checkDecoratorResolverParams is too restrictive for repeatable bindings + final Set<Decorator<?>> intsSet = webBeansContext.getDecoratorsManager().findDeployedWebBeansDecorator(types, bindingTypes); + final List<Decorator<?>> decoratorList = new ArrayList<Decorator<?>>(intsSet); Collections.sort(decoratorList, new DecoratorComparator(webBeansContext)); - return decoratorList; } Modified: openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/intercept/InterceptorResolutionService.java URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/intercept/InterceptorResolutionService.java?rev=1629252&r1=1629251&r2=1629252&view=diff ============================================================================== --- openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/intercept/InterceptorResolutionService.java (original) +++ openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/intercept/InterceptorResolutionService.java Fri Oct 3 16:33:49 2014 @@ -39,7 +39,6 @@ import javax.enterprise.inject.spi.Annot import javax.enterprise.inject.spi.AnnotatedMethod; import javax.enterprise.inject.spi.AnnotatedParameter; import javax.enterprise.inject.spi.AnnotatedType; -import javax.enterprise.inject.spi.BeanManager; import javax.enterprise.inject.spi.Decorator; import javax.enterprise.inject.spi.DeploymentException; import javax.enterprise.inject.spi.InterceptionType; @@ -95,7 +94,7 @@ public class InterceptorResolutionServic List<AnnotatedMethod> interceptableAnnotatedMethods = getInterceptableBusinessMethods(annotatedType); AnnotationManager annotationManager = webBeansContext.getAnnotationManager(); - BeanManager beanManager = webBeansContext.getBeanManagerImpl(); + BeanManagerImpl beanManager = webBeansContext.getBeanManagerImpl(); // pick up EJB-style interceptors from a class level @@ -104,7 +103,7 @@ public class InterceptorResolutionServic collectEjbInterceptors(classLevelEjbInterceptors, annotatedType, false, beanTypes); // pick up the decorators - List<Decorator<?>> decorators = beanManager.resolveDecorators(beanTypes, AnnotationUtil.asArray(qualifiers)); + List<Decorator<?>> decorators = beanManager.unsafeResolveDecorators(beanTypes, AnnotationUtil.asArray(qualifiers)); if (decorators.size() == 0) { decorators = Collections.emptyList(); // less to store Modified: openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/test/AbstractUnitTest.java URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/test/AbstractUnitTest.java?rev=1629252&r1=1629251&r2=1629252&view=diff ============================================================================== --- openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/test/AbstractUnitTest.java (original) +++ openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/test/AbstractUnitTest.java Fri Oct 3 16:33:49 2014 @@ -147,14 +147,19 @@ public abstract class AbstractUnitTest if (inject) { - try - { - OWBInjector.inject(getBeanManager(), this, null); - } - catch (Exception e) - { - throw new WebBeansConfigurationException(e); - } + inject(this); + } + } + + public void inject(final Object bean) + { + try + { + OWBInjector.inject(getBeanManager(), bean, null); + } + catch (final Exception e) + { + throw new WebBeansConfigurationException(e); } } Modified: openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/test/injection/noncontextual/InjectNonContextualTest.java URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/test/injection/noncontextual/InjectNonContextualTest.java?rev=1629252&r1=1629251&r2=1629252&view=diff ============================================================================== --- openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/test/injection/noncontextual/InjectNonContextualTest.java (original) +++ openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/test/injection/noncontextual/InjectNonContextualTest.java Fri Oct 3 16:33:49 2014 @@ -33,7 +33,7 @@ import java.util.Collection; public class InjectNonContextualTest extends AbstractUnitTest { @SuppressWarnings("unchecked") - public <T> void inject(T instance) + public <T> void doInject(T instance) { BeanManager mgr = WebBeansContext.getInstance().getBeanManagerImpl(); AnnotatedType<T> annotatedType = mgr.createAnnotatedType((Class<T>) instance.getClass()); @@ -54,7 +54,7 @@ public class InjectNonContextualTest ext try { final NonContextualBean bean = new NonContextualBean(); - inject(bean); + doInject(bean); Assert.assertNotNull(bean.getContextual()); } finally Added: openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/test/tests/MultipleTimeTheSameBindingTest.java URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/test/tests/MultipleTimeTheSameBindingTest.java?rev=1629252&view=auto ============================================================================== --- openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/test/tests/MultipleTimeTheSameBindingTest.java (added) +++ openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/test/tests/MultipleTimeTheSameBindingTest.java Fri Oct 3 16:33:49 2014 @@ -0,0 +1,109 @@ +/* + * 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.test.tests; + +import org.apache.webbeans.annotation.DefaultLiteral; +import org.apache.webbeans.component.BeanAttributesImpl; +import org.apache.webbeans.test.AbstractUnitTest; +import org.apache.webbeans.test.interceptors.extension.BeforeBeanDiscoveryImplTest; +import org.junit.Test; + +import javax.enterprise.event.Observes; +import javax.enterprise.inject.spi.Extension; +import javax.enterprise.inject.spi.ProcessBeanAttributes; +import javax.enterprise.util.AnnotationLiteral; +import javax.inject.Inject; +import javax.inject.Qualifier; +import java.lang.annotation.Annotation; +import java.lang.annotation.Documented; +import java.lang.annotation.Retention; +import java.lang.annotation.Target; +import java.util.HashSet; +import java.util.Set; + +import static java.lang.annotation.ElementType.FIELD; +import static java.lang.annotation.ElementType.TYPE; +import static java.lang.annotation.RetentionPolicy.RUNTIME; +import static org.junit.Assert.assertNotNull; + +public class MultipleTimeTheSameBindingTest extends AbstractUnitTest +{ + @Inject + @TheQualifier(1) + private TheClass theClass1; + + @Inject + @TheQualifier(2) + private TheClass theClass2; + + @Test + public void run() + { + addExtension(new TheExtension()); + startContainer(TheClass.class); + inject(this); + assertNotNull(theClass1); + assertNotNull(theClass2); + } + + public static class TheExtension implements Extension + { + void producerTemplates(@Observes final ProcessBeanAttributes<TheClass> pba) + { + final Set<Annotation> annotations = new HashSet<Annotation>(pba.getBeanAttributes().getQualifiers()); + annotations.add(new TheQualifierLitereal(1)); + annotations.add(new TheQualifierLitereal(2)); + + pba.setBeanAttributes(new BeanAttributesImpl<TheClass>(pba.getBeanAttributes(), false) { + public Set<Annotation> getQualifiers() { + return annotations; + } + }); + } + } + + public static class TheClass + { + } + + public static class TheQualifierLitereal extends AnnotationLiteral<TheQualifier> implements TheQualifier + { + private final int val; + + public TheQualifierLitereal(final int val) + { + this.val = val; + } + + @Override + public int value() + { + return val; + } + } + + @Target({ TYPE, FIELD }) + @Retention(RUNTIME) + @Documented + @Qualifier + public static @interface TheQualifier + { + int value(); + } +}