Commit 38700bb3aa484bfa2313c7e883238ee1b1ea19d6
1 parent
d7147791
Exists in
master
Correção do erro de InjectionPoint nulo ao utilizar o
Beans.getReference(...)
Showing
5 changed files
with
165 additions
and
19 deletions
Show diff stats
impl/core/src/main/java/br/gov/frameworkdemoiselle/annotation/Name.java
| ... | ... | @@ -47,7 +47,9 @@ import java.lang.annotation.Retention; |
| 47 | 47 | import java.lang.annotation.Target; |
| 48 | 48 | |
| 49 | 49 | import javax.enterprise.util.Nonbinding; |
| 50 | +import javax.inject.Qualifier; | |
| 50 | 51 | |
| 52 | +@Qualifier | |
| 51 | 53 | @Inherited |
| 52 | 54 | @Retention(RUNTIME) |
| 53 | 55 | @Target({ TYPE, FIELD, METHOD, PARAMETER }) | ... | ... |
impl/core/src/main/java/br/gov/frameworkdemoiselle/internal/bootstrap/CustomInjectionPoint.java
0 → 100644
| ... | ... | @@ -0,0 +1,136 @@ |
| 1 | +/* | |
| 2 | + * Demoiselle Framework | |
| 3 | + * Copyright (C) 2010 SERPRO | |
| 4 | + * ---------------------------------------------------------------------------- | |
| 5 | + * This file is part of Demoiselle Framework. | |
| 6 | + * | |
| 7 | + * Demoiselle Framework is free software; you can redistribute it and/or | |
| 8 | + * modify it under the terms of the GNU Lesser General Public License version 3 | |
| 9 | + * as published by the Free Software Foundation. | |
| 10 | + * | |
| 11 | + * This program is distributed in the hope that it will be useful, | |
| 12 | + * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
| 13 | + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
| 14 | + * GNU General Public License for more details. | |
| 15 | + * | |
| 16 | + * You should have received a copy of the GNU Lesser General Public License version 3 | |
| 17 | + * along with this program; if not, see <http://www.gnu.org/licenses/> | |
| 18 | + * or write to the Free Software Foundation, Inc., 51 Franklin Street, | |
| 19 | + * Fifth Floor, Boston, MA 02110-1301, USA. | |
| 20 | + * ---------------------------------------------------------------------------- | |
| 21 | + * Este arquivo é parte do Framework Demoiselle. | |
| 22 | + * | |
| 23 | + * O Framework Demoiselle é um software livre; você pode redistribuí-lo e/ou | |
| 24 | + * modificá-lo dentro dos termos da GNU LGPL versão 3 como publicada pela Fundação | |
| 25 | + * do Software Livre (FSF). | |
| 26 | + * | |
| 27 | + * Este programa é distribuído na esperança que possa ser útil, mas SEM NENHUMA | |
| 28 | + * GARANTIA; sem uma garantia implícita de ADEQUAÇÃO a qualquer MERCADO ou | |
| 29 | + * APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU/LGPL em português | |
| 30 | + * para maiores detalhes. | |
| 31 | + * | |
| 32 | + * Você deve ter recebido uma cópia da GNU LGPL versão 3, sob o título | |
| 33 | + * "LICENCA.txt", junto com esse programa. Se não, acesse <http://www.gnu.org/licenses/> | |
| 34 | + * ou escreva para a Fundação do Software Livre (FSF) Inc., | |
| 35 | + * 51 Franklin St, Fifth Floor, Boston, MA 02111-1301, USA. | |
| 36 | + */ | |
| 37 | +package br.gov.frameworkdemoiselle.internal.bootstrap; | |
| 38 | + | |
| 39 | +import java.lang.annotation.Annotation; | |
| 40 | +import java.lang.reflect.Member; | |
| 41 | +import java.lang.reflect.Type; | |
| 42 | +import java.util.Arrays; | |
| 43 | +import java.util.HashSet; | |
| 44 | +import java.util.Set; | |
| 45 | + | |
| 46 | +import javax.enterprise.inject.spi.Annotated; | |
| 47 | +import javax.enterprise.inject.spi.Bean; | |
| 48 | +import javax.enterprise.inject.spi.InjectionPoint; | |
| 49 | + | |
| 50 | +public class CustomInjectionPoint implements InjectionPoint { | |
| 51 | + | |
| 52 | + private final Bean<?> bean; | |
| 53 | + | |
| 54 | + private final Type beanType; | |
| 55 | + | |
| 56 | + private final Set<Annotation> qualifiers; | |
| 57 | + | |
| 58 | + public CustomInjectionPoint(Bean<?> bean, Type beanType, Annotation... qualifiers) { | |
| 59 | + this.bean = bean; | |
| 60 | + this.beanType = beanType; | |
| 61 | + this.qualifiers = new HashSet<Annotation>(Arrays.asList(qualifiers)); | |
| 62 | + } | |
| 63 | + | |
| 64 | + @Override | |
| 65 | + public Type getType() { | |
| 66 | + return this.beanType; | |
| 67 | + } | |
| 68 | + | |
| 69 | + @Override | |
| 70 | + public Set<Annotation> getQualifiers() { | |
| 71 | + return this.qualifiers; | |
| 72 | + } | |
| 73 | + | |
| 74 | + @Override | |
| 75 | + public Bean<?> getBean() { | |
| 76 | + return this.bean; | |
| 77 | + } | |
| 78 | + | |
| 79 | + @Override | |
| 80 | + public Member getMember() { | |
| 81 | + return null; | |
| 82 | + } | |
| 83 | + | |
| 84 | + @Override | |
| 85 | + public boolean isDelegate() { | |
| 86 | + return false; | |
| 87 | + } | |
| 88 | + | |
| 89 | + @Override | |
| 90 | + public boolean isTransient() { | |
| 91 | + return false; | |
| 92 | + } | |
| 93 | + | |
| 94 | + @Override | |
| 95 | + public Annotated getAnnotated() { | |
| 96 | + return new Annotated() { | |
| 97 | + | |
| 98 | + @Override | |
| 99 | + public Type getBaseType() { | |
| 100 | + // TODO Auto-generated method stub | |
| 101 | + return null; | |
| 102 | + } | |
| 103 | + | |
| 104 | + @Override | |
| 105 | + public Set<Type> getTypeClosure() { | |
| 106 | + // TODO Auto-generated method stub | |
| 107 | + return null; | |
| 108 | + } | |
| 109 | + | |
| 110 | + @Override | |
| 111 | + @SuppressWarnings("unchecked") | |
| 112 | + public <T extends Annotation> T getAnnotation(Class<T> annotationType) { | |
| 113 | + T result = null; | |
| 114 | + | |
| 115 | + for (Annotation annotation : getAnnotations()) { | |
| 116 | + if (annotation.annotationType() == annotationType) { | |
| 117 | + result = (T) annotation; | |
| 118 | + break; | |
| 119 | + } | |
| 120 | + } | |
| 121 | + | |
| 122 | + return result; | |
| 123 | + } | |
| 124 | + | |
| 125 | + @Override | |
| 126 | + public Set<Annotation> getAnnotations() { | |
| 127 | + return qualifiers; | |
| 128 | + } | |
| 129 | + | |
| 130 | + @Override | |
| 131 | + public boolean isAnnotationPresent(Class<? extends Annotation> annotationType) { | |
| 132 | + return qualifiers.contains(annotationType); | |
| 133 | + } | |
| 134 | + }; | |
| 135 | + } | |
| 136 | +} | ... | ... |
impl/core/src/main/java/br/gov/frameworkdemoiselle/internal/producer/ResourceBundleProducer.java
| ... | ... | @@ -73,26 +73,27 @@ public class ResourceBundleProducer implements Serializable { |
| 73 | 73 | * baseName |
| 74 | 74 | */ |
| 75 | 75 | public static ResourceBundle create(String baseName, Locale locale) { |
| 76 | - ResourceBundle bundle = null; | |
| 77 | - bundle = new ResourceBundle(baseName, locale); | |
| 78 | - return bundle; | |
| 76 | + return new ResourceBundle(baseName, locale); | |
| 79 | 77 | } |
| 80 | 78 | |
| 81 | 79 | /** |
| 82 | 80 | * This method is the factory default for ResourceBundle. It creates the ResourceBundle based on a file called |
| 83 | 81 | * messages.properties. |
| 84 | 82 | */ |
| 85 | - @Produces | |
| 86 | 83 | @Default |
| 87 | - public ResourceBundle create(InjectionPoint ip) { | |
| 88 | - String baseName; | |
| 89 | - | |
| 90 | - if (ip != null && ip.getAnnotated().isAnnotationPresent(Name.class)) { | |
| 91 | - baseName = ip.getAnnotated().getAnnotation(Name.class).value(); | |
| 92 | - } else { | |
| 93 | - baseName = "messages"; | |
| 94 | - } | |
| 84 | + @Produces | |
| 85 | + public ResourceBundle createDefault(InjectionPoint ip) { | |
| 86 | + return create("messages", Beans.getReference(Locale.class)); | |
| 87 | + } | |
| 95 | 88 | |
| 89 | + /** | |
| 90 | + * This method is the factory default for ResourceBundle. It creates the ResourceBundle based on a file called | |
| 91 | + * messages.properties. | |
| 92 | + */ | |
| 93 | + @Name("") | |
| 94 | + @Produces | |
| 95 | + public ResourceBundle createNamed(InjectionPoint ip) { | |
| 96 | + String baseName = ip.getAnnotated().getAnnotation(Name.class).value(); | |
| 96 | 97 | return create(baseName, Beans.getReference(Locale.class)); |
| 97 | 98 | } |
| 98 | 99 | } | ... | ... |
impl/core/src/main/java/br/gov/frameworkdemoiselle/util/Beans.java
| ... | ... | @@ -49,14 +49,18 @@ |
| 49 | 49 | package br.gov.frameworkdemoiselle.util; |
| 50 | 50 | |
| 51 | 51 | import java.lang.annotation.Annotation; |
| 52 | +import java.lang.reflect.Type; | |
| 52 | 53 | import java.util.Locale; |
| 53 | 54 | import java.util.NoSuchElementException; |
| 54 | 55 | import java.util.Set; |
| 55 | 56 | |
| 57 | +import javax.enterprise.context.spi.CreationalContext; | |
| 56 | 58 | import javax.enterprise.inject.spi.Bean; |
| 57 | 59 | import javax.enterprise.inject.spi.BeanManager; |
| 60 | +import javax.enterprise.inject.spi.InjectionPoint; | |
| 58 | 61 | |
| 59 | 62 | import br.gov.frameworkdemoiselle.DemoiselleException; |
| 63 | +import br.gov.frameworkdemoiselle.internal.bootstrap.CustomInjectionPoint; | |
| 60 | 64 | import br.gov.frameworkdemoiselle.internal.producer.ResourceBundleProducer; |
| 61 | 65 | |
| 62 | 66 | public final class Beans { |
| ... | ... | @@ -78,7 +82,7 @@ public final class Beans { |
| 78 | 82 | T instance; |
| 79 | 83 | |
| 80 | 84 | try { |
| 81 | - instance = (T) getReference(manager.getBeans(beanClass, qualifiers), beanClass); | |
| 85 | + instance = (T) getReference(manager.getBeans(beanClass, qualifiers), beanClass, qualifiers); | |
| 82 | 86 | |
| 83 | 87 | } catch (NoSuchElementException cause) { |
| 84 | 88 | StringBuffer buffer = new StringBuffer(); |
| ... | ... | @@ -126,10 +130,13 @@ public final class Beans { |
| 126 | 130 | } |
| 127 | 131 | |
| 128 | 132 | @SuppressWarnings("unchecked") |
| 129 | - private static <T> T getReference(Set<Bean<?>> beans, Class<T> beanClass) { | |
| 133 | + private static <T> T getReference(Set<Bean<?>> beans, Class<T> beanClass, Annotation... qualifiers) { | |
| 130 | 134 | Bean<?> bean = beans.iterator().next(); |
| 131 | - return (T) manager.getReference(bean, beanClass == null ? bean.getBeanClass() : beanClass, | |
| 132 | - manager.createCreationalContext(bean)); | |
| 135 | + CreationalContext<?> context = manager.createCreationalContext(bean); | |
| 136 | + Type beanType = beanClass == null ? bean.getBeanClass() : beanClass; | |
| 137 | + InjectionPoint injectionPoint = new CustomInjectionPoint(bean, beanType, qualifiers); | |
| 138 | + | |
| 139 | + return (T) manager.getInjectableReference(injectionPoint, context); | |
| 133 | 140 | } |
| 134 | 141 | |
| 135 | 142 | private static <T> T getReference(Set<Bean<?>> beans) { |
| ... | ... | @@ -139,4 +146,4 @@ public final class Beans { |
| 139 | 146 | private static ResourceBundle getBundle() { |
| 140 | 147 | return ResourceBundleProducer.create("demoiselle-core-bundle", Locale.getDefault()); |
| 141 | 148 | } |
| 142 | -} | |
| 143 | 149 | \ No newline at end of file |
| 150 | +} | ... | ... |
impl/core/src/test/java/br/gov/frameworkdemoiselle/internal/producer/ResourceBundleProducerTest.java
| ... | ... | @@ -94,7 +94,7 @@ public class ResourceBundleProducerTest { |
| 94 | 94 | @Test |
| 95 | 95 | public void testCreateNullInjectionPoint() { |
| 96 | 96 | ResourceBundleProducer factory = new ResourceBundleProducer(); |
| 97 | - ResourceBundle resourceBundle = factory.create((InjectionPoint) null); | |
| 97 | + ResourceBundle resourceBundle = factory.createDefault((InjectionPoint) null); | |
| 98 | 98 | Assert.assertNotNull(resourceBundle); |
| 99 | 99 | } |
| 100 | 100 | |
| ... | ... | @@ -114,7 +114,7 @@ public class ResourceBundleProducerTest { |
| 114 | 114 | replay(ip); |
| 115 | 115 | |
| 116 | 116 | ResourceBundleProducer factory = new ResourceBundleProducer(); |
| 117 | - Assert.assertNotNull(factory.create(ip)); | |
| 117 | + Assert.assertNotNull(factory.createDefault(ip)); | |
| 118 | 118 | } |
| 119 | 119 | |
| 120 | 120 | // @Test | ... | ... |