/
GenericProducerBean.java
61 lines (49 loc) · 1.93 KB
/
GenericProducerBean.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
package org.jboss.weld.extensions.bean.generic;
import java.lang.annotation.Annotation;
import java.lang.reflect.Type;
import java.util.HashSet;
import java.util.Set;
import javax.enterprise.context.spi.CreationalContext;
import javax.enterprise.inject.UnsatisfiedResolutionException;
import javax.enterprise.inject.spi.Bean;
import javax.enterprise.inject.spi.BeanManager;
// TODO make this passivation capable?
public class GenericProducerBean<T> extends AbstactGenericBean<T>
{
private final Set<Type> types;
private final Type genericBeanType;
private final Annotation genericBeanQualifier;
private final Annotation genericConfiguration;
public GenericProducerBean(Set<Annotation> qualifiers, Annotation genericBeanQualifier, Annotation genericConfiguration, Type genericBeanType, BeanManager beanManager, Bean<T> originalBean)
{
super(originalBean, qualifiers, beanManager);
this.genericBeanType = genericBeanType;
this.types = new HashSet<Type>();
types.add(genericBeanType);
types.add(Object.class);
this.genericBeanQualifier = genericBeanQualifier;
this.genericConfiguration = genericConfiguration;
}
@Override
public Set<Type> getTypes()
{
return types;
}
@Override
public void destroy(T instance, CreationalContext<T> creationalContext)
{
}
@Override
public T create(CreationalContext<T> creationalContext)
{
Bean<?> underlyingBean = getBeanManager().resolve(getBeanManager().getBeans(genericBeanType, genericBeanQualifier));
if (underlyingBean == null)
{
throw new UnsatisfiedResolutionException("Could not resolve generic bean " + genericBeanType + " with generic configuration " + genericConfiguration);
}
Object object = getBeanManager().getReference(underlyingBean, underlyingBean.getBeanClass(), creationalContext);
@SuppressWarnings("unchecked")
T value = (T) object;
return value;
}
}