1
2
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
28
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
140
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 }