1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 package org.apache.myfaces.trinidad.menu;
20
21 import java.lang.reflect.Array;
22 import java.util.Iterator;
23 import java.util.List;
24
25 import org.apache.myfaces.trinidad.logging.TrinidadLogger;
26 import org.apache.myfaces.trinidad.util.ContainerUtils;
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42 public class ImmutableGroupNode extends GroupNode
43 {
44
45 public ImmutableGroupNode(GroupNode node)
46 {
47 _icon = node.getIconProperty();
48 _focusViewId = node.getFocusViewIdProperty();
49 _renderedStr = node.getRenderedProperty();
50 _disabledStr = node.getDisabledProperty();
51 _visibleStr = node.getVisibleProperty();
52 _readOnlyStr = node.getReadOnlyProperty();
53 _handlerId = node.getHandlerIdProperty();
54 _bundleKey = node.getBundleKeyProperty();
55 _bundleName = node.getBundleNameProperty();
56 _accessKey = node.getAccessKeyProperty();
57 _id = node.getIdProperty();
58 _modelId = node.getModelIdProperty();
59 _uniqueId = node.getUniqueIdProperty();
60 _labelAndAccessKey = node.getLabelAndAccessKeyProperty();
61 _defaultFocusPathStr = node.getDefaultFocusPathProperty();
62
63
64 _rootModelKey = node.getRootModelKeyProperty();
65
66 _rootId = node.getRootIdProperty();
67 _label = node.getLabelProperty();
68 _idref = node.getIdRef();
69 _idrefList = node.getIdRefListProperty();
70 }
71
72
73 public String getIdRef()
74 {
75 return _idref;
76 }
77
78 public MenuNode getRefNode()
79 {
80 MenuNode refNode = null;
81
82
83
84 String[] idrefList = _idrefList;
85
86
87 List<MenuNode> children = getChildren();
88
89
90
91
92
93 for (int i=0; i < Array.getLength(idrefList); i++)
94 {
95 Iterator<MenuNode> childIter = children.iterator();
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110 while (childIter.hasNext())
111 {
112 MenuNode childNode = childIter.next();
113 String modelId = childNode.getModelId();
114
115
116
117 String refNodeId = idrefList[i] + modelId;
118
119 refNode = (MenuNode) getRootModel().getNode(refNodeId);
120
121
122 if (refNode != null)
123 break;
124 }
125
126 if (refNode == null)
127 continue;
128
129
130 if ( !refNode.getRendered()
131 || refNode.getDisabled()
132 || refNode.getReadOnly()
133 || !refNode.getVisible()
134 )
135 {
136 refNode = null;
137 continue;
138 }
139
140
141 break;
142 }
143
144
145
146 if (refNode == null)
147 {
148 _LOG.severe("GroupNode " + getLabel() + " refers to no valid node.\n");
149 return null;
150 }
151
152 return refNode;
153 }
154
155 public final String getLabel()
156 {
157 if (_bundleKey != null && _bundleName != null)
158 {
159
160
161
162 MenuUtils.loadBundle(_bundleName, _bundleKey + getHandlerId());
163 }
164
165 if (_label != null && ContainerUtils.isValueReference(_label))
166 {
167
168
169 return _evalElStr(_label);
170 }
171 if (_label == null && _labelAndAccessKey != null)
172 {
173 int ampIdx = 0;
174 String labelAndAccessKeyEval = null;
175 String labelAndAccessKey = _labelAndAccessKey;
176 String label;
177 if (ContainerUtils.isValueReference(labelAndAccessKey))
178 {
179 labelAndAccessKeyEval = _evalElStr(labelAndAccessKey);
180 } else
181 {
182 labelAndAccessKeyEval = labelAndAccessKey;
183 }
184
185 String accessKey;
186 if (labelAndAccessKeyEval == null ||
187 (ampIdx = labelAndAccessKeyEval.indexOf('&')) == -1)
188 {
189
190 label = labelAndAccessKeyEval;
191 } else if (ampIdx == (labelAndAccessKeyEval.length() - 1))
192 {
193
194 label = labelAndAccessKeyEval.substring(0, ampIdx);
195 } else
196 {
197
198 char[] keyArray = labelAndAccessKeyEval.toCharArray();
199 int len = labelAndAccessKeyEval.length();
200 char[] keyArray2 = new char[len];
201 int i, j = 0;
202 boolean accessKeyFound = false;
203
204 for (i = 0, j = 0; i < len; i++, j++)
205 {
206 if (keyArray[i] == '&')
207 {
208 i++;
209
210 if (!accessKeyFound && keyArray[i] != '&')
211 {
212
213 accessKey = labelAndAccessKeyEval.substring(i, i + 1);
214 accessKeyFound = true;
215 }
216 }
217
218 keyArray2[j] = keyArray[i];
219 }
220
221 String label1 = new String(keyArray2, 0, j);
222 label = label1;
223 }
224 return label;
225
226 }
227 return _label;
228 }
229
230 public final String getIcon()
231 {
232 return MenuUtils.evalString(_icon);
233 }
234
235 public final List<MenuNode> getChildren()
236 {
237 return _children;
238 }
239
240 public void setChildren(List<MenuNode> children)
241 {
242 _children = children;
243 }
244
245 public final String getFocusViewId()
246 {
247 return _focusViewId;
248 }
249
250 public final boolean getRendered()
251 {
252 boolean rendered = MenuUtils.evalBoolean(_renderedStr, true);
253 return rendered;
254 }
255
256 public final boolean getDisabled()
257 {
258 boolean disabled = MenuUtils.evalBoolean(_disabledStr, false);
259 return disabled;
260 }
261
262 public final boolean getVisible()
263 {
264 boolean visible = MenuUtils.evalBoolean(_visibleStr, true);
265 return visible;
266 }
267
268 public final boolean getReadOnly()
269 {
270 boolean readOnly = MenuUtils.evalBoolean(_readOnlyStr, false);
271 return readOnly;
272 }
273
274 protected final String getHandlerId()
275 {
276 return _handlerId;
277 }
278
279 public final String getBundleKey()
280 {
281 return _bundleKey;
282 }
283
284 public final String getBundleName()
285 {
286 return _bundleName;
287 }
288
289
290
291
292
293 public final char getAccessKey()
294 {
295 if (_accessKey == null && _labelAndAccessKey != null)
296 {
297 int ampIdx = 0;
298 String labelAndAccessKeyEval = null;
299 String labelAndAccessKey = _labelAndAccessKey;
300 String label;
301 if (ContainerUtils.isValueReference(labelAndAccessKey))
302 {
303 labelAndAccessKeyEval = _evalElStr(labelAndAccessKey);
304 }
305 else
306 {
307 labelAndAccessKeyEval = labelAndAccessKey;
308 }
309
310 String accessKey = null;
311 if (labelAndAccessKeyEval == null ||
312 (ampIdx = labelAndAccessKeyEval.indexOf('&')) == -1)
313 {
314
315 label = labelAndAccessKeyEval;
316 } else if (ampIdx == (labelAndAccessKeyEval.length() - 1))
317 {
318
319 label = labelAndAccessKeyEval.substring(0, ampIdx);
320 } else
321 {
322
323 char[] keyArray = labelAndAccessKeyEval.toCharArray();
324 int len = labelAndAccessKeyEval.length();
325 char[] keyArray2 = new char[len];
326 int i, j = 0;
327 boolean accessKeyFound = false;
328
329 for (i = 0, j = 0; i < len; i++, j++)
330 {
331 if (keyArray[i] == '&')
332 {
333 i++;
334
335 if (!accessKeyFound && keyArray[i] != '&')
336 {
337
338 accessKey = labelAndAccessKeyEval.substring(i, i + 1);
339 accessKeyFound = true;
340 }
341 }
342
343 keyArray2[j] = keyArray[i];
344 }
345
346 String label1 = new String(keyArray2, 0, j);
347 label = label1;
348 }
349 return (accessKey != null)? accessKey.charAt(0):'\0';
350
351 }
352 else
353 {
354 String accessKeyStr = MenuUtils.evalString(_accessKey);
355 if (accessKeyStr == null || accessKeyStr.length() > 1)
356 return '\0';
357 return accessKeyStr.charAt(0);
358 }
359
360 }
361
362 public final String getLabelAndAccessKey()
363 {
364 if (_labelAndAccessKey != null)
365 {
366 int ampIdx = 0;
367 String labelAndAccessKeyEval = null;
368 String labelAndAccessKey = _labelAndAccessKey;
369 String label;
370 if (_bundleKey != null && _bundleName != null)
371 {
372
373
374
375 MenuUtils.loadBundle(_bundleName, _bundleKey + getHandlerId());
376 }
377 if (ContainerUtils.isValueReference(labelAndAccessKey))
378 {
379 labelAndAccessKeyEval = _evalElStr(labelAndAccessKey);
380 } else
381 {
382 labelAndAccessKeyEval = labelAndAccessKey;
383 }
384
385 String accessKey = null;
386 if (labelAndAccessKeyEval == null ||
387 (ampIdx = labelAndAccessKeyEval.indexOf('&')) == -1)
388 {
389
390 label = labelAndAccessKeyEval;
391 } else if (ampIdx == (labelAndAccessKeyEval.length() - 1))
392 {
393
394 label = labelAndAccessKeyEval.substring(0, ampIdx);
395 } else
396 {
397
398 char[] keyArray = labelAndAccessKeyEval.toCharArray();
399 int len = labelAndAccessKeyEval.length();
400 char[] keyArray2 = new char[len];
401 int i, j = 0;
402 boolean accessKeyFound = false;
403
404 for (i = 0, j = 0; i < len; i++, j++)
405 {
406 if (keyArray[i] == '&')
407 {
408 i++;
409
410 if (!accessKeyFound && keyArray[i] != '&')
411 {
412
413 accessKey = labelAndAccessKeyEval.substring(i, i + 1);
414 accessKeyFound = true;
415 }
416 }
417
418 keyArray2[j] = keyArray[i];
419 }
420
421 String label1 = new String(keyArray2, 0, j);
422 label = label1;
423 }
424 if(accessKey == null)
425 return label;
426
427 return _joinLabelAndAccessKey(label, accessKey);
428 }
429 return null;
430 }
431 public final String getId()
432 {
433 return _id;
434 }
435
436 public final String getModelId()
437 {
438 return _modelId;
439 }
440
441 public final String getUniqueId()
442 {
443 return _uniqueId;
444 }
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464 public final boolean getDefaultFocusPath()
465 {
466 boolean defaultFocusPath =
467 MenuUtils.evalBoolean(_defaultFocusPathStr, false);
468 return defaultFocusPath;
469 }
470
471 public final String getRootModelKey()
472 {
473 return _rootModelKey;
474 }
475
476 public final int getRootId()
477 {
478 return _rootId;
479 }
480
481 private String _evalElStr(String str)
482 {
483 if (str == null)
484 return null;
485
486 String keystr =
487 MenuUtils.stringReplaceFirst(str.trim(), _bundleKey, _bundleKey +
488 getHandlerId());
489 String elVal = MenuUtils.getBoundValue(keystr, String.class);
490 return elVal;
491 }
492
493 private String _joinLabelAndAccessKey(String label, String accessKey)
494 {
495 char[] keyArray = label.toCharArray();
496 int len = label.length();
497 int lentimes2 = len * 2;
498 char[] keyArray2 = new char[lentimes2];
499 int i, j = 0;
500 boolean accessKeyFound = false;
501
502
503 for (i = 0, j = 0; i < len; i++, j++)
504 {
505
506 if (keyArray[i] == accessKey.charAt(0) && !accessKeyFound)
507 {
508 keyArray2[j] = '&';
509 j++;
510 accessKeyFound = true;
511 }
512
513 keyArray2[j] = keyArray[i];
514
515
516
517 if (keyArray[i] == '&')
518 {
519 j++;
520 keyArray2[j] = keyArray[i];
521 }
522 }
523
524 String combinedLabel = new String(keyArray2, 0, j);
525 return combinedLabel;
526 }
527
528 private final String _icon;
529 private List<MenuNode> _children = null;
530 private final String _focusViewId;
531 private final String _renderedStr;
532 private final String _disabledStr;
533 private final String _visibleStr;
534 private final String _readOnlyStr;
535 private final String _handlerId;
536 private final String _bundleKey;
537 private final String _bundleName;
538 private final String _accessKey;
539 private final String _id;
540 private final String _modelId;
541 private final String _labelAndAccessKey;
542 private final String _defaultFocusPathStr;
543 private final String _uniqueId;
544
545
546 private final String _rootModelKey;
547
548 private final int _rootId;
549
550
551
552 private final String _label;
553
554
555 private final String _idref ;
556 private final String[] _idrefList ;
557
558 private final static TrinidadLogger _LOG =
559 TrinidadLogger.createTrinidadLogger(ImmutableGroupNode.class);
560 }