1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 package org.apache.myfaces.cdi.util;
20
21 import java.util.Set;
22 import javax.enterprise.context.Dependent;
23 import javax.enterprise.context.spi.CreationalContext;
24 import javax.enterprise.inject.spi.Bean;
25 import javax.enterprise.inject.spi.BeanManager;
26 import javax.faces.context.ExternalContext;
27 import javax.faces.context.FacesContext;
28 import javax.faces.convert.Converter;
29 import javax.faces.validator.Validator;
30 import org.apache.myfaces.cdi.dependent.AbstractBeanStorage;
31 import org.apache.myfaces.cdi.dependent.DependentBeanEntry;
32 import org.apache.myfaces.cdi.dependent.RequestDependentBeanStorage;
33 import org.apache.myfaces.shared.config.MyfacesConfig;
34 import org.apache.myfaces.util.ExternalSpecifications;
35
36
37
38
39 public class CDIExternalArtifactResolver extends ExternalArtifactResolver
40 {
41 public static final String JAVAX_FACES_CONVERT_PACKAGE_NAME = "javax.faces.convert";
42 public static final String JAVAX_FACES_VALIDATOR_PACKAGE_NAME = "javax.faces.validator";
43
44 private Boolean managedConvertersEnabled;
45 private Boolean managedValidatorsEnabled;
46
47 public CDIExternalArtifactResolver()
48 {
49 initConverterInjectionEnabled();
50 initValidatorInjectionEnabled();
51 }
52 private boolean isManagedConvertersEnabled()
53 {
54 if (managedConvertersEnabled != null)
55 {
56 return managedConvertersEnabled;
57 }
58
59
60 return managedConvertersEnabled;
61 }
62
63 private void initConverterInjectionEnabled()
64 {
65 if (managedConvertersEnabled != null)
66 {
67 return;
68 }
69
70 managedConvertersEnabled = MyfacesConfig.getCurrentInstance(
71 FacesContext.getCurrentInstance().getExternalContext()).isCdiManagedConvertersEnabled();
72 }
73
74 public Converter resolveManagedConverter(Class<? extends Converter> converterClass)
75 {
76 if (!isManagedConvertersEnabled())
77 {
78 return null;
79 }
80
81 ExternalContext externalContext = FacesContext.getCurrentInstance().getExternalContext();
82 if (!ExternalSpecifications.isCDIAvailable(externalContext) ||
83 JAVAX_FACES_CONVERT_PACKAGE_NAME.equals(converterClass.getPackage().getName()))
84 {
85 return null;
86 }
87
88 BeanManager beanManager = CDIUtils.getBeanManager(externalContext);
89
90 return getContextualReference(beanManager, converterClass);
91 }
92
93 private boolean isManagedValidatorsEnabled()
94 {
95 if (managedValidatorsEnabled != null)
96 {
97 return managedValidatorsEnabled;
98 }
99
100
101 return managedValidatorsEnabled;
102 }
103
104 private void initValidatorInjectionEnabled()
105 {
106 if (managedValidatorsEnabled != null)
107 {
108 return;
109 }
110
111 managedValidatorsEnabled = MyfacesConfig.getCurrentInstance(
112 FacesContext.getCurrentInstance().getExternalContext()).isCdiManagedValidatorsEnabled();
113 }
114
115 public Validator resolveManagedValidator(Class<? extends Validator> validatorClass)
116 {
117 if (!isManagedValidatorsEnabled())
118 {
119 return null;
120 }
121
122 ExternalContext externalContext = FacesContext.getCurrentInstance().getExternalContext();
123 if (!ExternalSpecifications.isCDIAvailable(externalContext) ||
124 JAVAX_FACES_VALIDATOR_PACKAGE_NAME.equals(validatorClass.getPackage().getName()))
125 {
126 return null;
127 }
128
129 BeanManager beanManager = CDIUtils.getBeanManager(externalContext);
130
131 return getContextualReference(beanManager, validatorClass);
132 }
133
134 private static <T> T getContextualReference(BeanManager beanManager, Class<T> type)
135 {
136 Set<Bean<?>> beans = beanManager.getBeans(type);
137
138 if (beans == null || beans.isEmpty())
139 {
140 return null;
141 }
142
143 Bean<?> bean = beanManager.resolve(beans);
144
145 CreationalContext<?> creationalContext = beanManager.createCreationalContext(bean);
146
147 @SuppressWarnings({ "unchecked", "UnnecessaryLocalVariable" })
148 T result = (T) beanManager.getReference(bean, type, creationalContext);
149
150 if (bean.getScope().equals(Dependent.class))
151 {
152
153 AbstractBeanStorage beanStorage = getContextualReference(beanManager, RequestDependentBeanStorage.class);
154
155
156 beanStorage.add(new DependentBeanEntry(result, bean, creationalContext));
157 }
158
159 return result;
160 }
161 }