Commit 38700bb3aa484bfa2313c7e883238ee1b1ea19d6

Authored by Cleverson Sacramento
1 parent d7147791
Exists in master

Correção do erro de InjectionPoint nulo ao utilizar o

Beans.getReference(...)
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
... ...