View Javadoc

1   /*
2    * $Id: SelectItemTools.java,v 1.2.6.1 2010/12/10 10:31:13 oeuillot Exp $
3    */
4   package org.rcfaces.core.util;
5   
6   import java.util.ArrayList;
7   import java.util.HashSet;
8   import java.util.Iterator;
9   import java.util.List;
10  import java.util.Set;
11  
12  import javax.faces.component.UIComponent;
13  import javax.faces.component.UISelectItem;
14  import javax.faces.component.UISelectItems;
15  import javax.faces.context.FacesContext;
16  import javax.faces.model.SelectItem;
17  import javax.faces.model.SelectItemGroup;
18  
19  import org.apache.commons.logging.Log;
20  import org.apache.commons.logging.LogFactory;
21  import org.rcfaces.core.component.capability.IImageCapability;
22  import org.rcfaces.core.item.BasicImagesSelectItem;
23  import org.rcfaces.core.item.BasicSelectItem;
24  
25  /**
26   * 
27   * @author Olivier Oeuillot (latest modification by $Author: oeuillot $)
28   * @version $Revision: 1.2.6.1 $ $Date: 2010/12/10 10:31:13 $
29   */
30  public class SelectItemTools {
31  
32      private static final String REVISION = "$Revision: 1.2.6.1 $";
33  
34      private static final Log LOG = LogFactory.getLog(SelectItemTools.class);
35  
36      public static SelectItemNode listSelectItems(UIComponent component) {
37          return listSelectItems(null, component);
38      }
39  
40      public static SelectItemNode listSelectItems(FacesContext facesContext,
41              UIComponent component) {
42          if (facesContext == null) {
43              facesContext = FacesContext.getCurrentInstance();
44          }
45  
46          SelectItemNode root = new SelectItemNode(null, null, null, 0);
47  
48          Set selectItemIds = new HashSet();
49  
50          List children = component.getChildren();
51          for (Iterator it = children.iterator(); it.hasNext();) {
52              UIComponent child = (UIComponent) it.next();
53  
54              listSelectItems(facesContext, child, selectItemIds, root);
55          }
56  
57          return root;
58      }
59  
60      private static void listSelectItems(FacesContext facesContext,
61              UIComponent component, Set selectItemIds, SelectItemNode root) {
62          if (component instanceof UISelectItem) {
63              UISelectItem uiSelectItem = (UISelectItem) component;
64  
65              SelectItemNode singleItemNode = null;
66  
67              Object value = uiSelectItem.getValue();
68              if (value instanceof SelectItem) {
69  
70                  singleItemNode = addSelectItem(facesContext, root, component,
71                          selectItemIds, (SelectItem) value);
72  
73              } else if (value instanceof SelectItem[]) {
74                  SelectItem selectItems[] = (SelectItem[]) value;
75                  for (int i = 0; i < selectItems.length; i++) {
76                      addSelectItem(facesContext, root, component, selectItemIds,
77                              selectItems[i]);
78                  }
79  
80              } else if (value instanceof SelectItemGroup[]) {
81                  SelectItemGroup selectItems[] = (SelectItemGroup[]) value;
82                  for (int i = 0; i < selectItems.length; i++) {
83                      addSelectItem(facesContext, root, component, selectItemIds,
84                              selectItems[i]);
85                  }
86  
87              } else if (value == null) {
88                  SelectItem selectItem;
89                  if (uiSelectItem instanceof IImageCapability) {
90                      selectItem = new BasicImagesSelectItem(uiSelectItem);
91  
92                  } else {
93                      selectItem = new BasicSelectItem(uiSelectItem);
94                  }
95  
96                  singleItemNode = addSelectItem(facesContext, root, component,
97                          selectItemIds, selectItem);
98              }
99  
100             if (singleItemNode != null && component.getChildCount() > 0) {
101                 List children = component.getChildren();
102                 for (Iterator it = children.iterator(); it.hasNext();) {
103                     UIComponent child = (UIComponent) it.next();
104 
105                     listSelectItems(facesContext, child, selectItemIds,
106                             singleItemNode);
107                 }
108             }
109 
110         } else if (component instanceof UISelectItems) {
111             Object value = ((UISelectItems) component).getValue();
112             if (value instanceof SelectItem[]) {
113                 SelectItem selectItems[] = (SelectItem[]) value;
114                 for (int i = 0; i < selectItems.length; i++) {
115                     addSelectItem(facesContext, root, component, selectItemIds,
116                             selectItems[i]);
117                 }
118             }
119         }
120     }
121 
122     private static SelectItemNode addSelectItem(FacesContext facesContext,
123             SelectItemNode root, UIComponent component, Set selectItemIds,
124             SelectItem value) {
125         String id = component.getClientId(facesContext);
126 
127         if (selectItemIds.add(id) == false) {
128             id += "::" + selectItemIds.size();
129             selectItemIds.add(id);
130         }
131 
132         SelectItemNode node = root.addChild(id, value);
133 
134         return node;
135     }
136 
137     /**
138      * 
139      * @author Olivier Oeuillot (latest modification by $Author: oeuillot $)
140      * @version $Revision: 1.2.6.1 $ $Date: 2010/12/10 10:31:13 $
141      */
142     public static class SelectItemNode {
143         private static final SelectItemNode[] EMPTY_ARRAY = new SelectItemNode[0];
144 
145         private final SelectItem selectItem;
146 
147         private List children = null;
148 
149         private final String id;
150 
151         private final int depth;
152 
153         private final SelectItemNode parent;
154 
155         SelectItemNode(SelectItemNode parent, String id, SelectItem selectItem,
156                 int depth) {
157             this.parent = parent;
158             this.selectItem = selectItem;
159             this.id = id;
160             this.depth = depth;
161         }
162 
163         public SelectItemNode addChild(String id, SelectItem selectItem) {
164             SelectItemNode child = new SelectItemNode(this, id, selectItem,
165                     depth + 1);
166 
167             if (children == null) {
168                 children = new ArrayList();
169             }
170             children.add(child);
171 
172             return child;
173         }
174 
175         public SelectItem getSelectItem() {
176             return selectItem;
177         }
178 
179         public SelectItemNode[] getChildren() {
180             if (children == null) {
181                 return EMPTY_ARRAY;
182             }
183             return (SelectItemNode[]) children
184                     .toArray(new SelectItemNode[children.size()]);
185         }
186 
187         public String getId() {
188             return id;
189         }
190 
191         public SelectItemNode getParent() {
192             return parent;
193         }
194 
195         public int getDepth() {
196             return depth;
197         }
198 
199         public SelectItemNode searchById(String id) {
200             if (id.equals(getId())) {
201                 return this;
202             }
203 
204             SelectItemNode chilren[] = getChildren();
205             for (int i = 0; i < chilren.length; i++) {
206                 SelectItemNode si = chilren[i].searchById(id);
207                 if (si != null) {
208                     return si;
209                 }
210             }
211 
212             return null;
213         }
214 
215         public SelectItemNode searchByValue(Object value) {
216             if (selectItem != null && value.equals(selectItem.getValue())) {
217                 return this;
218             }
219 
220             SelectItemNode chilren[] = getChildren();
221             for (int i = 0; i < chilren.length; i++) {
222                 SelectItemNode si = chilren[i].searchByValue(value);
223                 if (si != null) {
224                     return si;
225                 }
226             }
227 
228             return null;
229         }
230 
231         public SelectItemNode getRoot() {
232             SelectItemNode node = this;
233             for (; node.getParent() != null; node = node.getParent()) {
234             }
235 
236             return node;
237         }
238 
239         public int hashCode() {
240             final int prime = 31;
241             int result = 1;
242             result = prime * result + depth;
243             result = prime * result + ((id == null) ? 0 : id.hashCode());
244             return result;
245         }
246 
247         public boolean equals(Object obj) {
248             if (this == obj) {
249                 return true;
250             }
251             if (obj == null) {
252                 return false;
253             }
254             if (!(obj instanceof SelectItemNode)) {
255                 return false;
256             }
257             SelectItemNode other = (SelectItemNode) obj;
258             if (depth != other.depth) {
259                 return false;
260             }
261             if (id == null) {
262                 if (other.id != null) {
263                     return false;
264                 }
265             } else if (!id.equals(other.id)) {
266                 return false;
267             }
268             return true;
269         }
270 
271     }
272 
273     public static SelectItem searchId(SelectItemNode node, String id) {
274         SelectItemNode sn = node.searchById(id);
275         if (sn == null) {
276             return null;
277         }
278 
279         return sn.getSelectItem();
280     }
281 }