1
2
3
4 package org.rcfaces.core.internal.tools;
5
6 import java.lang.reflect.Array;
7 import java.util.ArrayList;
8 import java.util.Collection;
9 import java.util.Iterator;
10 import java.util.List;
11 import java.util.Map;
12
13 import javax.faces.FacesException;
14 import javax.faces.context.FacesContext;
15 import javax.faces.model.SelectItem;
16
17 import org.apache.commons.logging.Log;
18 import org.apache.commons.logging.LogFactory;
19 import org.rcfaces.core.component.SelectItemsIteratorComponent;
20 import org.rcfaces.core.internal.component.IDataMapAccessor;
21 import org.rcfaces.core.internal.converter.InputTypeConverter;
22 import org.rcfaces.core.item.BasicImagesSelectItem;
23 import org.rcfaces.core.lang.IAdaptable;
24
25
26
27
28
29
30 public class SelectItemsIteratorTools {
31 private static final String REVISION = "$Revision: 1.2 $";
32
33 private static final Log LOG = LogFactory
34 .getLog(SelectItemsIteratorTools.class);
35
36 public static SelectItem[] getValue(
37 SelectItemsIteratorComponent selectItemsIteratorComponent,
38 FacesContext facesContext) {
39
40 if (facesContext == null) {
41 facesContext = FacesContext.getCurrentInstance();
42 }
43
44 Object items = selectItemsIteratorComponent.getItems(facesContext);
45 if (items == null) {
46 if (LOG.isDebugEnabled()) {
47 LOG.debug("getItems() returns null !");
48 }
49 return null;
50 }
51
52 int size = -1;
53 if (items instanceof Collection) {
54 size = ((Collection) items).size();
55
56 } else if (items.getClass().isArray()) {
57 size = Array.getLength(items);
58 }
59
60 Iterator it = convertToIterator(items);
61 if (LOG.isDebugEnabled()) {
62 LOG.debug("Convert to iterator (items=" + items + ", size="+size+") returns " + it);
63 }
64 if (it == null) {
65 return null;
66 }
67
68 String varName = selectItemsIteratorComponent.getVar(facesContext);
69 if (varName == null || varName.length() < 1) {
70
71 throw new FacesException("VarName is null or empty, componentId='"
72 + selectItemsIteratorComponent.getId() + "' varName='"
73 + varName + "'");
74 }
75
76 Map requestMap = facesContext.getExternalContext().getRequestMap();
77
78 List selectItems;
79 if (size > 0) {
80 selectItems = new ArrayList(size);
81 } else {
82 selectItems = new ArrayList();
83 }
84
85 Object oldIndexVar = null;
86
87 String indexVar = selectItemsIteratorComponent
88 .getItemIndexVar(facesContext);
89
90 if (indexVar != null) {
91 oldIndexVar = requestMap.get(indexVar);
92 }
93
94 Object oldValue = requestMap.get(varName);
95 try {
96 int idx = 0;
97 for (; it.hasNext(); idx++) {
98 Object item = it.next();
99
100 if (LOG.isDebugEnabled()) {
101 LOG.debug("Item #" + idx + " = " + item);
102 }
103
104 if (item == null) {
105 continue;
106 }
107
108 requestMap.put(varName, item);
109
110 if (indexVar != null) {
111 requestMap.put(indexVar, String.valueOf(idx));
112 }
113
114 BasicImagesSelectItem selectItem = new BasicImagesSelectItem();
115 selectItems.add(selectItem);
116
117 String label = selectItemsIteratorComponent
118 .getItemLabel(facesContext);
119 if (label != null) {
120 selectItem.setLabel(label);
121 }
122
123 Object value = selectItemsIteratorComponent
124 .getItemValue(facesContext);
125 if (value != null) {
126 selectItem.setValue(value);
127
128 } else {
129 throw new FacesException(
130 "Value must be defined, componentId='"
131 + selectItemsIteratorComponent.getId()
132 + "' index=#" + idx);
133 }
134
135 if (selectItemsIteratorComponent.isItemDisabled(facesContext)) {
136 selectItem.setDisabled(true);
137 }
138
139 String description = selectItemsIteratorComponent
140 .getItemDescription(facesContext);
141 if (description != null) {
142 selectItem.setDescription(description);
143 }
144
145 String acceleratorKey = selectItemsIteratorComponent
146 .getItemAcceleratorKey(facesContext);
147 if (acceleratorKey != null) {
148 selectItem.setAcceleratorKey(acceleratorKey);
149 }
150
151 String accessKey = selectItemsIteratorComponent
152 .getItemAccessKey(facesContext);
153 if (accessKey != null) {
154 selectItem.setAccessKey(accessKey);
155 }
156
157 String styleClass = selectItemsIteratorComponent
158 .getItemStyleClass(facesContext);
159 if (styleClass != null) {
160 selectItem.setStyleClass(styleClass);
161 }
162
163 String type = selectItemsIteratorComponent
164 .getItemInputType(facesContext);
165 if (type != null) {
166 Integer typeInt = (Integer) InputTypeConverter.SINGLETON
167 .getAsObject(facesContext,
168 selectItemsIteratorComponent, type);
169 if (typeInt != null) {
170 selectItem.setInputType(typeInt.intValue());
171 }
172 }
173
174 String imageURL = selectItemsIteratorComponent
175 .getItemImageURL(facesContext);
176 if (imageURL != null) {
177 selectItem.setImageURL(imageURL);
178 }
179
180 String disabledImageURL = selectItemsIteratorComponent
181 .getItemDisabledImageURL(facesContext);
182 if (disabledImageURL != null) {
183 selectItem.setDisabledImageURL(disabledImageURL);
184 }
185
186 String hoverImageURL = selectItemsIteratorComponent
187 .getItemHoverImageURL(facesContext);
188 if (hoverImageURL != null) {
189 selectItem.setHoverImageURL(hoverImageURL);
190 }
191
192 String selectedImageURL = selectItemsIteratorComponent
193 .getItemSelectedImageURL(facesContext);
194 if (selectedImageURL != null) {
195 selectItem.setSelectedImageURL(selectedImageURL);
196 }
197
198 String expandedImageURL = selectItemsIteratorComponent
199 .getItemExpandedImageURL(facesContext);
200 if (expandedImageURL != null) {
201 selectItem.setExpandedImageURL(expandedImageURL);
202 }
203
204 IDataMapAccessor clientMapAccessor = selectItemsIteratorComponent
205 .getClientMapAccessor(facesContext);
206 if (clientMapAccessor != null) {
207 String keys[] = clientMapAccessor
208 .listDataKeys(facesContext);
209 Map clientDataMap = selectItem.getClientDataMap();
210 for (int i = 0; i < keys.length; i++) {
211 Object data = clientMapAccessor.getData(keys[i],
212 facesContext);
213 if (data != null) {
214 clientDataMap.put(keys[i], data);
215 }
216 }
217 }
218
219 IDataMapAccessor serverMapAccessor = selectItemsIteratorComponent
220 .getServerMapAccessor(facesContext);
221 if (serverMapAccessor != null) {
222 String keys[] = serverMapAccessor
223 .listDataKeys(facesContext);
224 Map serverDataMap = selectItem.getServerDataMap();
225 for (int i = 0; i < keys.length; i++) {
226 Object data = serverMapAccessor.getData(keys[i],
227 facesContext);
228 if (data != null) {
229 serverDataMap.put(keys[i], data);
230 }
231 }
232 }
233 }
234
235 } finally {
236 requestMap.put(varName, oldValue);
237 if (indexVar != null) {
238 requestMap.put(indexVar, oldIndexVar);
239 }
240 }
241
242 return (SelectItem[]) selectItems.toArray(new SelectItem[selectItems
243 .size()]);
244 }
245
246 private static Iterator convertToIterator(final Object items) {
247 if (items instanceof Iterator) {
248 return (Iterator) items;
249 }
250 if (items instanceof Collection) {
251 return ((Collection) items).iterator();
252 }
253 if (items.getClass().isArray()) {
254 return new Iterator() {
255 private final int size = Array.getLength(items);
256
257 private int index = 0;
258
259 public boolean hasNext() {
260 return index < size;
261 }
262
263 public Object next() {
264 return Array.get(items, index++);
265 }
266
267 public void remove() {
268 throw new UnsupportedOperationException();
269 }
270 };
271 }
272
273 if (items instanceof IAdaptable) {
274 Object collection = ((IAdaptable) items).getAdapter(
275 Collection.class, null);
276 if (collection != null) {
277 return ((Collection) collection).iterator();
278 }
279 Iterator iterator = (Iterator) ((IAdaptable) items).getAdapter(
280 Iterator.class, null);
281 if (iterator != null) {
282 return iterator;
283 }
284 }
285
286 return null;
287 }
288 }