1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 package org.apache.myfaces.view.facelets.tag.composite;
20
21 import java.beans.BeanDescriptor;
22 import java.beans.IntrospectionException;
23 import java.beans.PropertyDescriptor;
24 import java.io.IOException;
25 import java.util.HashMap;
26 import java.util.Map;
27 import java.util.logging.Level;
28 import java.util.logging.Logger;
29
30 import javax.faces.application.ProjectStage;
31 import javax.faces.component.UIComponent;
32 import javax.faces.context.FacesContext;
33 import javax.faces.view.facelets.FaceletContext;
34 import javax.faces.view.facelets.TagAttribute;
35 import javax.faces.view.facelets.TagConfig;
36 import javax.faces.view.facelets.TagException;
37 import javax.faces.view.facelets.TagHandler;
38
39 import org.apache.myfaces.buildtools.maven2.plugin.builder.annotation.JSFFaceletAttribute;
40 import org.apache.myfaces.buildtools.maven2.plugin.builder.annotation.JSFFaceletTag;
41
42
43
44
45
46
47
48
49
50
51
52
53 @JSFFaceletTag(name="composite:facet")
54 public class FacetHandler extends TagHandler implements InterfaceDescriptorCreator
55 {
56
57 private static final Logger log = Logger.getLogger(FacetHandler.class.getName());
58
59
60
61
62
63 private static final String[] STANDARD_ATTRIBUTES_SORTED = new String[]
64 {
65 "displayName",
66 "expert",
67 "hidden",
68 "name",
69 "preferred",
70 "required",
71 "shortDescription"
72 };
73
74
75
76
77 @JSFFaceletAttribute(name="name",
78 className="javax.el.ValueExpression",
79 deferredValueType="java.lang.String")
80 private final TagAttribute _name;
81
82
83
84
85 @JSFFaceletAttribute(name="displayName",
86 className="javax.el.ValueExpression",
87 deferredValueType="java.lang.String")
88 private final TagAttribute _displayName;
89
90
91
92
93
94
95
96
97 @JSFFaceletAttribute(name="required",
98 className="javax.el.ValueExpression",
99 deferredValueType="boolean")
100 private final TagAttribute _required;
101
102
103
104
105 @JSFFaceletAttribute(name="preferred",
106 className="javax.el.ValueExpression",
107 deferredValueType="boolean")
108 private final TagAttribute _preferred;
109
110
111
112
113 @JSFFaceletAttribute(name="expert",
114 className="javax.el.ValueExpression",
115 deferredValueType="boolean")
116 private final TagAttribute _expert;
117
118
119
120
121 @JSFFaceletAttribute(name="shortDescription",
122 className="javax.el.ValueExpression",
123 deferredValueType="java.lang.String")
124 private final TagAttribute _shortDescription;
125
126
127
128
129
130
131 @JSFFaceletAttribute(name="hidden",
132 className="javax.el.ValueExpression",
133 deferredValueType="boolean")
134 protected final TagAttribute _hidden;
135
136
137
138
139
140 private boolean _cacheable;
141
142
143
144
145
146
147
148
149 private PropertyDescriptor _propertyDescriptor;
150
151 public FacetHandler(TagConfig config)
152 {
153 super(config);
154 _name = getRequiredAttribute("name");
155 _displayName = getAttribute("displayName");
156 _required = getAttribute("required");
157 _preferred = getAttribute("preferred");
158 _expert = getAttribute("expert");
159 _shortDescription = getAttribute("shortDescription");
160 _hidden = getAttribute("hidden");
161
162
163
164
165
166
167 final boolean development = FacesContext.getCurrentInstance()
168 .isProjectStage(ProjectStage.Development);
169
170 if (_name.isLiteral()
171 && (!development || _areDevelopmentAttributesLiteral()))
172 {
173
174
175
176
177
178
179 _cacheable = true;
180 if (_required == null &&
181 !CompositeTagAttributeUtils.containsUnspecifiedAttributes(tag,
182 STANDARD_ATTRIBUTES_SORTED))
183 {
184 _propertyDescriptor = _createFacetPropertyDescriptor(development);
185 }
186 }
187 else
188 {
189 _cacheable = false;
190 }
191 }
192
193
194
195
196
197
198 private boolean _areDevelopmentAttributesLiteral()
199 {
200 return CompositeTagAttributeUtils.areAttributesLiteral(
201 _displayName, _shortDescription, _expert, _hidden, _preferred);
202 }
203
204 @SuppressWarnings("unchecked")
205 public void apply(FaceletContext ctx, UIComponent parent)
206 throws IOException
207 {
208 CompositeComponentBeanInfo beanInfo =
209 (CompositeComponentBeanInfo) parent.getAttributes()
210 .get(UIComponent.BEANINFO_KEY);
211
212 if (beanInfo == null)
213 {
214 if (log.isLoggable(Level.SEVERE))
215 {
216 log.severe("Cannot find composite bean descriptor UIComponent.BEANINFO_KEY ");
217 }
218 return;
219 }
220
221 BeanDescriptor beanDescriptor = beanInfo.getBeanDescriptor();
222
223 Map<String, PropertyDescriptor> facetPropertyDescriptorMap = (Map<String, PropertyDescriptor>)
224 beanDescriptor.getValue(UIComponent.FACETS_KEY);
225
226 if (facetPropertyDescriptorMap == null)
227 {
228 facetPropertyDescriptorMap = new HashMap<String, PropertyDescriptor>();
229 beanDescriptor.setValue(UIComponent.FACETS_KEY, facetPropertyDescriptorMap);
230 }
231
232 String facetName = _name.getValue(ctx);
233
234 if (isCacheable())
235 {
236 if (_propertyDescriptor == null)
237 {
238 _propertyDescriptor = _createFacetPropertyDescriptor(facetName, ctx);
239 }
240 facetPropertyDescriptorMap.put(facetName, _propertyDescriptor);
241 }
242 else
243 {
244 PropertyDescriptor facetDescriptor = _createFacetPropertyDescriptor(facetName, ctx);
245 facetPropertyDescriptorMap.put(facetName, facetDescriptor);
246 }
247
248 nextHandler.apply(ctx, parent);
249 }
250
251
252
253
254
255
256
257 private PropertyDescriptor _createFacetPropertyDescriptor(boolean development)
258 {
259 try
260 {
261 CompositeComponentPropertyDescriptor facetPropertyDescriptor =
262 new CompositeComponentPropertyDescriptor(_name.getValue());
263
264
265
266 if (development)
267 {
268 CompositeTagAttributeUtils.addDevelopmentAttributesLiteral(facetPropertyDescriptor,
269 _displayName, _shortDescription, _expert, _hidden, _preferred);
270 }
271
272
273
274
275 return facetPropertyDescriptor;
276 }
277 catch (IntrospectionException e)
278 {
279 if (log.isLoggable(Level.SEVERE))
280 {
281 log.log(Level.SEVERE, "Cannot create PropertyDescriptor for facet ",e);
282 }
283 throw new TagException(tag,e);
284 }
285 }
286
287 private PropertyDescriptor _createFacetPropertyDescriptor(String facetName, FaceletContext ctx)
288 throws TagException, IOException
289 {
290 try
291 {
292 CompositeComponentPropertyDescriptor facetPropertyDescriptor =
293 new CompositeComponentPropertyDescriptor(facetName);
294
295 if (_required != null)
296 {
297 facetPropertyDescriptor.setValue("required", _required.getValueExpression(ctx, Boolean.class));
298 }
299
300
301
302 if (ctx.getFacesContext().isProjectStage(ProjectStage.Development))
303 {
304 CompositeTagAttributeUtils.addDevelopmentAttributes(facetPropertyDescriptor, ctx,
305 _displayName, _shortDescription, _expert, _hidden, _preferred);
306 }
307
308
309
310 CompositeTagAttributeUtils.addUnspecifiedAttributes(facetPropertyDescriptor, tag,
311 STANDARD_ATTRIBUTES_SORTED, ctx);
312
313 return facetPropertyDescriptor;
314 }
315 catch (IntrospectionException e)
316 {
317 if (log.isLoggable(Level.SEVERE))
318 {
319 log.log(Level.SEVERE, "Cannot create PropertyDescriptor for attribute ",e);
320 }
321 throw new TagException(tag,e);
322 }
323 }
324
325 public boolean isCacheable()
326 {
327 return _cacheable;
328 }
329
330 public void setCacheable(boolean cacheable)
331 {
332 _cacheable = cacheable;
333 }
334
335
336
337
338
339
340 }