View Javadoc

1   /*
2    * $Id: SelectItemsIteratorTools.java,v 1.2 2008/06/06 12:53:56 oeuillot Exp $
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   * @author Olivier Oeuillot (latest modification by $Author: oeuillot $)
28   * @version $Revision: 1.2 $ $Date: 2008/06/06 12:53:56 $
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              // ERROR
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 }