Classes in this File | Line Coverage | Branch Coverage | Complexity | ||||
UIOutput |
|
| 0.0;0 | ||||
UIOutput$PropertyKeys |
|
| 0.0;0 |
1 | /* | |
2 | * Licensed to the Apache Software Foundation (ASF) under one | |
3 | * or more contributor license agreements. See the NOTICE file | |
4 | * distributed with this work for additional information | |
5 | * regarding copyright ownership. The ASF licenses this file | |
6 | * to you under the Apache License, Version 2.0 (the | |
7 | * "License"); you may not use this file except in compliance | |
8 | * with the License. You may obtain a copy of the License at | |
9 | * | |
10 | * http://www.apache.org/licenses/LICENSE-2.0 | |
11 | * | |
12 | * Unless required by applicable law or agreed to in writing, | |
13 | * software distributed under the License is distributed on an | |
14 | * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY | |
15 | * KIND, either express or implied. See the License for the | |
16 | * specific language governing permissions and limitations | |
17 | * under the License. | |
18 | */ | |
19 | package javax.faces.component; | |
20 | ||
21 | import java.util.Map; | |
22 | ||
23 | import javax.el.ValueExpression; | |
24 | import javax.faces.application.Application; | |
25 | import javax.faces.application.ResourceDependencies; | |
26 | import javax.faces.application.ResourceDependency; | |
27 | import javax.faces.context.FacesContext; | |
28 | import javax.faces.convert.Converter; | |
29 | ||
30 | import org.apache.myfaces.buildtools.maven2.plugin.builder.annotation.JSFComponent; | |
31 | import org.apache.myfaces.buildtools.maven2.plugin.builder.annotation.JSFProperty; | |
32 | ||
33 | /** | |
34 | * Displays a value to the user. | |
35 | */ | |
36 | @JSFComponent(defaultRendererType = "javax.faces.Text") | |
37 | public class UIOutput extends UIComponentBase implements ValueHolder | |
38 | { | |
39 | public static final String COMPONENT_TYPE = "javax.faces.Output"; | |
40 | public static final String COMPONENT_FAMILY = "javax.faces.Output"; | |
41 | ||
42 | private Converter _converter; | |
43 | ||
44 | /** | |
45 | * Construct an instance of the UIOutput. | |
46 | */ | |
47 | public UIOutput() | |
48 | 0 | { |
49 | 0 | setRendererType("javax.faces.Text"); |
50 | 0 | } |
51 | ||
52 | @Override | |
53 | public String getFamily() | |
54 | { | |
55 | 0 | return COMPONENT_FAMILY; |
56 | } | |
57 | ||
58 | public Object getLocalValue() | |
59 | { | |
60 | 0 | return getStateHelper().get(PropertyKeys.value); |
61 | } | |
62 | ||
63 | /** | |
64 | * Gets The initial value of this component. | |
65 | * | |
66 | * @return the new value value | |
67 | */ | |
68 | @JSFProperty | |
69 | public Object getValue() | |
70 | { | |
71 | 0 | return getStateHelper().eval(PropertyKeys.value); |
72 | } | |
73 | ||
74 | /** | |
75 | * The initial value of this component. | |
76 | */ | |
77 | public void setValue(Object value) | |
78 | { | |
79 | 0 | getStateHelper().put(PropertyKeys.value, value ); |
80 | 0 | } |
81 | ||
82 | /** | |
83 | * An expression that specifies the Converter for this component. | |
84 | * <p> | |
85 | * The value can either be a static value (ID) or an EL expression. When a static id is | |
86 | * specified, an instance of the converter type registered with that id is used. When this | |
87 | * is an EL expression, the result of evaluating the expression must be an object that | |
88 | * implements the Converter interface. | |
89 | * </p> | |
90 | */ | |
91 | @JSFProperty(partialStateHolder=true) | |
92 | public Converter getConverter() | |
93 | { | |
94 | 0 | if (_converter != null) |
95 | { | |
96 | 0 | return _converter; |
97 | } | |
98 | 0 | ValueExpression expression = getValueExpression("converter"); |
99 | 0 | if (expression != null) |
100 | { | |
101 | 0 | return (Converter) expression.getValue(getFacesContext().getELContext()); |
102 | } | |
103 | 0 | return null; |
104 | } | |
105 | ||
106 | public void setConverter(Converter converter) | |
107 | { | |
108 | 0 | this._converter = converter; |
109 | 0 | if (initialStateMarked()) |
110 | { | |
111 | 0 | getStateHelper().put(PropertyKeys.converterSet,Boolean.TRUE); |
112 | } | |
113 | // The argument converter must be inspected for the presence of the ResourceDependency annotation. | |
114 | //_handleAnnotations(FacesContext.getCurrentInstance(), converter); | |
115 | 0 | } |
116 | ||
117 | private boolean _isSetConverter() | |
118 | { | |
119 | 0 | Boolean value = (Boolean) getStateHelper().get(PropertyKeys.converterSet); |
120 | 0 | return value == null ? false : value; |
121 | } | |
122 | ||
123 | public void markInitialState() | |
124 | { | |
125 | 0 | super.markInitialState(); |
126 | 0 | if (_converter != null && |
127 | _converter instanceof PartialStateHolder) | |
128 | { | |
129 | 0 | ((PartialStateHolder)_converter).markInitialState(); |
130 | } | |
131 | 0 | } |
132 | ||
133 | public void clearInitialState() | |
134 | { | |
135 | 0 | if (initialStateMarked()) |
136 | { | |
137 | 0 | super.clearInitialState(); |
138 | 0 | if (_converter != null && |
139 | _converter instanceof PartialStateHolder) | |
140 | { | |
141 | 0 | ((PartialStateHolder)_converter).clearInitialState(); |
142 | } | |
143 | } | |
144 | 0 | } |
145 | ||
146 | 0 | enum PropertyKeys |
147 | { | |
148 | 0 | value |
149 | 0 | , converterSet |
150 | } | |
151 | ||
152 | @Override | |
153 | public Object saveState(FacesContext facesContext) | |
154 | { | |
155 | 0 | if (initialStateMarked()) |
156 | { | |
157 | 0 | Object parentSaved = super.saveState(facesContext); |
158 | 0 | Object converterSaved = null; |
159 | 0 | boolean nullDelta = true; |
160 | 0 | if (!_isSetConverter() && |
161 | _converter != null && | |
162 | _converter instanceof PartialStateHolder) | |
163 | { | |
164 | //Delta | |
165 | 0 | StateHolder holder = (StateHolder) _converter; |
166 | 0 | if (!holder.isTransient()) |
167 | { | |
168 | 0 | Object attachedState = holder.saveState(facesContext); |
169 | 0 | if (attachedState != null) |
170 | { | |
171 | 0 | nullDelta = false; |
172 | } | |
173 | 0 | converterSaved = new _AttachedDeltaWrapper(_converter.getClass(), |
174 | attachedState); | |
175 | 0 | } |
176 | else | |
177 | { | |
178 | 0 | converterSaved = null; |
179 | } | |
180 | 0 | } |
181 | 0 | else if (_isSetConverter() || _converter != null) |
182 | { | |
183 | //Full | |
184 | 0 | converterSaved = saveAttachedState(facesContext,_converter); |
185 | 0 | nullDelta = false; |
186 | } | |
187 | ||
188 | 0 | if (parentSaved == null && nullDelta) |
189 | { | |
190 | //No values | |
191 | 0 | return null; |
192 | } | |
193 | 0 | return new Object[]{parentSaved, converterSaved}; |
194 | } | |
195 | else | |
196 | { | |
197 | 0 | Object[] values = new Object[2]; |
198 | 0 | values[0] = super.saveState(facesContext); |
199 | 0 | values[1] = saveAttachedState(facesContext,_converter); |
200 | 0 | return values; |
201 | } | |
202 | } | |
203 | ||
204 | @Override | |
205 | public void restoreState(FacesContext facesContext, Object state) | |
206 | { | |
207 | 0 | if (state == null) |
208 | { | |
209 | 0 | return; |
210 | } | |
211 | ||
212 | 0 | Object[] values = (Object[])state; |
213 | 0 | super.restoreState(facesContext,values[0]); |
214 | 0 | if (values[1] instanceof _AttachedDeltaWrapper) |
215 | { | |
216 | //Delta | |
217 | 0 | ((StateHolder)_converter).restoreState(facesContext, ((_AttachedDeltaWrapper) values[1]).getWrappedStateObject()); |
218 | } | |
219 | else | |
220 | { | |
221 | //Full | |
222 | 0 | _converter = (javax.faces.convert.Converter) restoreAttachedState(facesContext,values[1]); |
223 | } | |
224 | 0 | } |
225 | ||
226 | /* | |
227 | void _handleAnnotations(FacesContext context, Object inspected) | |
228 | { | |
229 | if (inspected == null) { | |
230 | return; | |
231 | } | |
232 | | |
233 | ResourceDependency annotation = inspected.getClass().getAnnotation(ResourceDependency.class); | |
234 | | |
235 | if (annotation == null) | |
236 | { | |
237 | // If the ResourceDependency annotation is not present, the argument must be inspected for the presence | |
238 | // of the ResourceDependencies annotation. | |
239 | ResourceDependencies dependencies = inspected.getClass().getAnnotation(ResourceDependencies.class); | |
240 | if (dependencies != null) | |
241 | { | |
242 | // If the ResourceDependencies annotation is present, the action described in ResourceDependencies | |
243 | // must be taken. | |
244 | for (ResourceDependency dependency : dependencies.value()) | |
245 | { | |
246 | _handleResourceDependency(context, dependency); | |
247 | } | |
248 | } | |
249 | } | |
250 | else | |
251 | { | |
252 | // If the ResourceDependency annotation is present, the action described in ResourceDependency must be | |
253 | // taken. | |
254 | _handleResourceDependency(context, annotation); | |
255 | } | |
256 | } | |
257 | | |
258 | private void _handleResourceDependency(FacesContext context, ResourceDependency annotation) | |
259 | { | |
260 | // If this annotation is not present on the class in question, no action must be taken. | |
261 | if (annotation != null) | |
262 | { | |
263 | Application application = context.getApplication(); | |
264 | | |
265 | // Create a UIOutput instance by passing javax.faces.Output. to | |
266 | // Application.createComponent(java.lang.String). | |
267 | UIOutput output = (UIOutput) application.createComponent(COMPONENT_TYPE); | |
268 | | |
269 | // Get the annotation instance from the class and obtain the values of the name, library, and | |
270 | // target attributes. | |
271 | String name = annotation.name(); | |
272 | | |
273 | // Obtain the renderer-type for the resource name by passing name to | |
274 | // ResourceHandler.getRendererTypeForResourceName(java.lang.String). | |
275 | String rendererType = application.getResourceHandler().getRendererTypeForResourceName(name); | |
276 | | |
277 | // Call setRendererType on the UIOutput instance, passing the renderer-type. | |
278 | output.setRendererType(rendererType); | |
279 | | |
280 | // Obtain the Map of attributes from the UIOutput component by calling UIComponent.getAttributes(). | |
281 | Map<String, Object> attributes = output.getAttributes(); | |
282 | | |
283 | // Store the name into the attributes Map under the key "name". | |
284 | attributes.put("name", name); | |
285 | | |
286 | // If library is the empty string, let library be null. | |
287 | String library = annotation.library(); | |
288 | if (library != null && library.length() > 0) | |
289 | { | |
290 | // If library is non-null, store it under the key "library". | |
291 | attributes.put("library", library); | |
292 | } | |
293 | | |
294 | // If target is the empty string, let target be null. | |
295 | String target = annotation.target(); | |
296 | if (target != null && target.length() > 0) | |
297 | { | |
298 | // If target is non-null, store it under the key "target". | |
299 | attributes.put("target", target); | |
300 | } | |
301 | else | |
302 | { | |
303 | // Otherwise, if target is null, call UIViewRoot.addComponentResource(javax.faces.context.FacesContext, | |
304 | // javax.faces.component.UIComponent), passing the UIOutput instance as the second argument. | |
305 | context.getViewRoot().addComponentResource(context, output); | |
306 | } | |
307 | } | |
308 | } | |
309 | */ | |
310 | } |