1
2
3
4 package org.rcfaces.core.internal.tools;
5
6 import javax.el.MethodExpression;
7 import javax.faces.FacesException;
8 import javax.faces.application.Application;
9 import javax.faces.component.UIComponent;
10 import javax.faces.context.FacesContext;
11 import javax.faces.event.ValueChangeListener;
12
13 import org.apache.commons.logging.Log;
14 import org.apache.commons.logging.LogFactory;
15 import org.rcfaces.core.component.capability.IAdditionalInformationEventCapability;
16 import org.rcfaces.core.component.capability.ICheckEventCapability;
17 import org.rcfaces.core.component.capability.ICloseEventCapability;
18 import org.rcfaces.core.component.capability.IDoubleClickEventCapability;
19 import org.rcfaces.core.component.capability.IDragEventCapability;
20 import org.rcfaces.core.component.capability.IDropCompleteEventCapability;
21 import org.rcfaces.core.component.capability.IDropEventCapability;
22 import org.rcfaces.core.component.capability.IErrorEventCapability;
23 import org.rcfaces.core.component.capability.IExpandEventCapability;
24 import org.rcfaces.core.component.capability.IFocusBlurEventCapability;
25 import org.rcfaces.core.component.capability.IInitEventCapability;
26 import org.rcfaces.core.component.capability.IKeyDownEventCapability;
27 import org.rcfaces.core.component.capability.IKeyPressEventCapability;
28 import org.rcfaces.core.component.capability.IKeyUpEventCapability;
29 import org.rcfaces.core.component.capability.ILoadEventCapability;
30 import org.rcfaces.core.component.capability.IMenuEventCapability;
31 import org.rcfaces.core.component.capability.IMouseEventCapability;
32 import org.rcfaces.core.component.capability.IPreSelectionEventCapability;
33 import org.rcfaces.core.component.capability.IPropertyChangeEventCapability;
34 import org.rcfaces.core.component.capability.IResetEventCapability;
35 import org.rcfaces.core.component.capability.ISelectionEventCapability;
36 import org.rcfaces.core.component.capability.IServiceEventCapability;
37 import org.rcfaces.core.component.capability.ISortEventCapability;
38 import org.rcfaces.core.component.capability.ISuggestionEventCapability;
39 import org.rcfaces.core.component.capability.IUnlockedClientAttributesCapability;
40 import org.rcfaces.core.component.capability.IUserEventCapability;
41 import org.rcfaces.core.component.capability.IValidationEventCapability;
42 import org.rcfaces.core.component.capability.IValueChangeEventCapability;
43 import org.rcfaces.core.event.IAdditionalInformationListener;
44 import org.rcfaces.core.event.IBlurListener;
45 import org.rcfaces.core.event.ICheckListener;
46 import org.rcfaces.core.event.ICloseListener;
47 import org.rcfaces.core.event.IDoubleClickListener;
48 import org.rcfaces.core.event.IDragListener;
49 import org.rcfaces.core.event.IDropCompleteListener;
50 import org.rcfaces.core.event.IDropListener;
51 import org.rcfaces.core.event.IExpandListener;
52 import org.rcfaces.core.event.IFocusListener;
53 import org.rcfaces.core.event.IInitListener;
54 import org.rcfaces.core.event.IKeyDownListener;
55 import org.rcfaces.core.event.IKeyPressListener;
56 import org.rcfaces.core.event.IKeyUpListener;
57 import org.rcfaces.core.event.ILoadListener;
58 import org.rcfaces.core.event.IMenuListener;
59 import org.rcfaces.core.event.IMouseOutListener;
60 import org.rcfaces.core.event.IMouseOverListener;
61 import org.rcfaces.core.event.IPreSelectionListener;
62 import org.rcfaces.core.event.IPropertyChangeListener;
63 import org.rcfaces.core.event.IResetListener;
64 import org.rcfaces.core.event.ISelectionListener;
65 import org.rcfaces.core.event.IServiceEventListener;
66 import org.rcfaces.core.event.ISortListener;
67 import org.rcfaces.core.event.ISuggestionListener;
68 import org.rcfaces.core.event.IUserEventListener;
69 import org.rcfaces.core.event.IValidationListener;
70 import org.rcfaces.core.internal.capability.IComponentLifeCycle;
71 import org.rcfaces.core.internal.listener.AdditionalInformationActionListener;
72 import org.rcfaces.core.internal.listener.AdditionalInformationScriptListener;
73 import org.rcfaces.core.internal.listener.BlurActionListener;
74 import org.rcfaces.core.internal.listener.BlurScriptListener;
75 import org.rcfaces.core.internal.listener.ChangeActionListener;
76 import org.rcfaces.core.internal.listener.ChangeScriptListener;
77 import org.rcfaces.core.internal.listener.CheckActionListener;
78 import org.rcfaces.core.internal.listener.CheckScriptListener;
79 import org.rcfaces.core.internal.listener.CloseActionListener;
80 import org.rcfaces.core.internal.listener.CloseScriptListener;
81 import org.rcfaces.core.internal.listener.DoubleClickActionListener;
82 import org.rcfaces.core.internal.listener.DoubleClickScriptListener;
83 import org.rcfaces.core.internal.listener.DragScriptListener;
84 import org.rcfaces.core.internal.listener.DropCompleteActionListener;
85 import org.rcfaces.core.internal.listener.DropCompleteScriptListener;
86 import org.rcfaces.core.internal.listener.DropScriptListener;
87 import org.rcfaces.core.internal.listener.ErrorActionListener;
88 import org.rcfaces.core.internal.listener.ErrorScriptListener;
89 import org.rcfaces.core.internal.listener.ExpandActionListener;
90 import org.rcfaces.core.internal.listener.ExpandScriptListener;
91 import org.rcfaces.core.internal.listener.FocusActionListener;
92 import org.rcfaces.core.internal.listener.FocusScriptListener;
93 import org.rcfaces.core.internal.listener.IServerActionListener;
94 import org.rcfaces.core.internal.listener.InitScriptListener;
95 import org.rcfaces.core.internal.listener.KeyDownScriptListener;
96 import org.rcfaces.core.internal.listener.KeyPressActionListener;
97 import org.rcfaces.core.internal.listener.KeyPressScriptListener;
98 import org.rcfaces.core.internal.listener.KeyUpScriptListener;
99 import org.rcfaces.core.internal.listener.LoadActionListener;
100 import org.rcfaces.core.internal.listener.LoadScriptListener;
101 import org.rcfaces.core.internal.listener.MenuScriptListener;
102 import org.rcfaces.core.internal.listener.MouseOutScriptListener;
103 import org.rcfaces.core.internal.listener.MouseOverScriptListener;
104 import org.rcfaces.core.internal.listener.PreSelectionScriptListener;
105 import org.rcfaces.core.internal.listener.PropertyChangeActionListener;
106 import org.rcfaces.core.internal.listener.PropertyChangeScriptListener;
107 import org.rcfaces.core.internal.listener.ResetActionListener;
108 import org.rcfaces.core.internal.listener.ResetScriptListener;
109 import org.rcfaces.core.internal.listener.SelectionActionListener;
110 import org.rcfaces.core.internal.listener.SelectionScriptListener;
111 import org.rcfaces.core.internal.listener.ServiceEventActionListener;
112 import org.rcfaces.core.internal.listener.ServiceEventScriptListener;
113 import org.rcfaces.core.internal.listener.SortActionListener;
114 import org.rcfaces.core.internal.listener.SortScriptListener;
115 import org.rcfaces.core.internal.listener.SuggestionActionListener;
116 import org.rcfaces.core.internal.listener.SuggestionScriptListener;
117 import org.rcfaces.core.internal.listener.UnsupportedListenerTypeException;
118 import org.rcfaces.core.internal.listener.UserEventActionListener;
119 import org.rcfaces.core.internal.listener.UserEventScriptListener;
120 import org.rcfaces.core.internal.listener.ValidationActionListener;
121 import org.rcfaces.core.internal.listener.ValidationScriptListener;
122
123
124
125
126
127
128 public class ListenersTools {
129 private static final String REVISION = "$Revision: 1.14 $";
130
131 private static final Log LOG = LogFactory.getLog(ListenersTools.class);
132
133
134
135
136
137
138 public interface IListenerType {
139
140 IServerActionListener addActionListener(UIComponent component,
141 Application application, String expression,
142 boolean partialRendering);
143
144 void addScriptListener(UIComponent component, String scriptType,
145 String expression);
146
147 Class getListenerClass();
148
149
150 }
151
152
153
154
155
156
157 private static abstract class AbstractListenerType implements IListenerType {
158 private static final String REVISION = "$Revision: 1.14 $";
159 }
160
161 public static final IListenerType BLUR_LISTENER_TYPE = new AbstractListenerType() {
162 private static final String REVISION = "$Revision: 1.14 $";
163
164 public void addScriptListener(UIComponent component, String scriptType,
165 String command) {
166
167 IFocusBlurEventCapability focusBlurEventCapability = (IFocusBlurEventCapability) component;
168
169 focusBlurEventCapability.addBlurListener(new BlurScriptListener(
170 scriptType, command));
171 }
172
173 public IServerActionListener addActionListener(UIComponent component,
174 Application application, String expression,
175 boolean partialRendering) {
176 IFocusBlurEventCapability focusBlurEventCapability = (IFocusBlurEventCapability) component;
177
178 BlurActionListener blurActionListener = new BlurActionListener(
179 expression, partialRendering);
180 focusBlurEventCapability.addBlurListener(blurActionListener);
181
182 return blurActionListener;
183 }
184
185 public Class getListenerClass() {
186 return IBlurListener.class;
187 }
188 };
189
190 public static final IListenerType DRAG_LISTENER_TYPE = new AbstractListenerType() {
191 private static final String REVISION = "$Revision: 1.14 $";
192
193 public void addScriptListener(UIComponent component, String scriptType,
194 String command) {
195 IDragEventCapability dragEventCapability = (IDragEventCapability) component;
196
197 dragEventCapability.addDragListener(new DragScriptListener(
198 scriptType, command));
199 }
200
201 public IServerActionListener addActionListener(UIComponent component,
202 Application application, String expression,
203 boolean partialRendering) {
204 throw new UnsupportedListenerTypeException("drag");
205 }
206
207 public Class getListenerClass() {
208 return IDragListener.class;
209 }
210 };
211
212 public static final IListenerType DROP_LISTENER_TYPE = new AbstractListenerType() {
213 private static final String REVISION = "$Revision: 1.14 $";
214
215 public void addScriptListener(UIComponent component, String scriptType,
216 String command) {
217 IDropEventCapability selectEventCapability = (IDropEventCapability) component;
218
219 selectEventCapability.addDropListener(new DropScriptListener(
220 scriptType, command));
221 }
222
223 public IServerActionListener addActionListener(UIComponent component,
224 Application application, String expression,
225 boolean partialRendering) {
226 throw new UnsupportedListenerTypeException("drop");
227 }
228
229 public Class getListenerClass() {
230 return IDropListener.class;
231 }
232 };
233
234 public static final IListenerType DROP_COMPLETE_LISTENER_TYPE = new AbstractListenerType() {
235 private static final String REVISION = "$Revision: 1.14 $";
236
237 public void addScriptListener(UIComponent component, String scriptType,
238 String command) {
239 IDropCompleteEventCapability selectEventCapability = (IDropCompleteEventCapability) component;
240
241 selectEventCapability
242 .addDropCompleteListener(new DropCompleteScriptListener(
243 scriptType, command));
244 }
245
246 public IServerActionListener addActionListener(UIComponent component,
247 Application application, String expression,
248 boolean partialRendering) {
249 IDropCompleteEventCapability selectEventCapability = (IDropCompleteEventCapability) component;
250
251 DropCompleteActionListener dropActionListener = new DropCompleteActionListener(
252 expression, partialRendering);
253 selectEventCapability.addDropCompleteListener(dropActionListener);
254
255 return dropActionListener;
256 }
257
258 public Class getListenerClass() {
259 return IDropCompleteListener.class;
260 }
261 };
262
263 public static final IListenerType FOCUS_LISTENER_TYPE = new AbstractListenerType() {
264 private static final String REVISION = "$Revision: 1.14 $";
265
266 public void addScriptListener(UIComponent component, String scriptType,
267 String command) {
268 IFocusBlurEventCapability focusBlurEventCapability = (IFocusBlurEventCapability) component;
269
270 focusBlurEventCapability.addFocusListener(new FocusScriptListener(
271 scriptType, command));
272 }
273
274 public IServerActionListener addActionListener(UIComponent component,
275 Application application, String expression,
276 boolean partialRendering) {
277 IFocusBlurEventCapability expandEventCapability = (IFocusBlurEventCapability) component;
278
279 FocusActionListener focusActionListener = new FocusActionListener(
280 expression, partialRendering);
281 expandEventCapability.addFocusListener(focusActionListener);
282
283 return focusActionListener;
284 }
285
286 public Class getListenerClass() {
287 return IFocusListener.class;
288 }
289 };
290
291 public static final IListenerType LOAD_LISTENER_TYPE = new AbstractListenerType() {
292 private static final String REVISION = "$Revision: 1.14 $";
293
294 public void addScriptListener(UIComponent component, String scriptType,
295 String command) {
296 ILoadEventCapability loadEventCapability = (ILoadEventCapability) component;
297
298 loadEventCapability.addLoadListener(new LoadScriptListener(
299 scriptType, command));
300 }
301
302 public IServerActionListener addActionListener(UIComponent component,
303 Application application, String expression,
304 boolean partialRendering) {
305 ILoadEventCapability loadEventCapability = (ILoadEventCapability) component;
306
307 LoadActionListener loadActionListener = new LoadActionListener(
308 expression, partialRendering);
309 loadEventCapability.addLoadListener(loadActionListener);
310
311 return loadActionListener;
312 }
313
314 public Class getListenerClass() {
315 return ILoadListener.class;
316 }
317 };
318
319 public static final IListenerType EXPAND_LISTENER_TYPE = new AbstractListenerType() {
320 private static final String REVISION = "$Revision: 1.14 $";
321
322 public void addScriptListener(UIComponent component, String scriptType,
323 String command) {
324 IExpandEventCapability expandEventCapability = (IExpandEventCapability) component;
325
326 expandEventCapability.addExpandListener(new ExpandScriptListener(
327 scriptType, command));
328 }
329
330 public IServerActionListener addActionListener(UIComponent component,
331 Application application, String expression,
332 boolean partialRendering) {
333 IExpandEventCapability expandEventCapability = (IExpandEventCapability) component;
334
335 ExpandActionListener expandActionListener = new ExpandActionListener(
336 expression, partialRendering);
337 expandEventCapability.addExpandListener(expandActionListener);
338
339 return expandActionListener;
340 }
341
342 public Class getListenerClass() {
343 return IExpandListener.class;
344 }
345 };
346
347 public static final IListenerType ERROR_LISTENER_TYPE = new AbstractListenerType() {
348 private static final String REVISION = "$Revision: 1.14 $";
349
350 public void addScriptListener(UIComponent component, String scriptType,
351 String command) {
352 IErrorEventCapability errorEventCapability = (IErrorEventCapability) component;
353
354 errorEventCapability.addErrorListener(new ErrorScriptListener(
355 scriptType, command));
356 }
357
358 public IServerActionListener addActionListener(UIComponent component,
359 Application application, String expression,
360 boolean partialRendering) {
361 IErrorEventCapability errorEventCapability = (IErrorEventCapability) component;
362
363 ErrorActionListener errorActionListener = new ErrorActionListener(
364 expression, partialRendering);
365 errorEventCapability.addErrorListener(errorActionListener);
366
367 return errorActionListener;
368 }
369
370 public Class getListenerClass() {
371 return IDropListener.class;
372 }
373 };
374
375 public static final IListenerType DOUBLE_CLICK_LISTENER_TYPE = new AbstractListenerType() {
376 private static final String REVISION = "$Revision: 1.14 $";
377
378 public void addScriptListener(UIComponent component, String scriptType,
379 String command) {
380 IDoubleClickEventCapability doubleClickEventCapability = (IDoubleClickEventCapability) component;
381
382 doubleClickEventCapability
383 .addDoubleClickListener(new DoubleClickScriptListener(
384 scriptType, command));
385 }
386
387 public IServerActionListener addActionListener(UIComponent component,
388 Application application, String expression,
389 boolean partialRendering) {
390 IDoubleClickEventCapability doubleClickEventCapability = (IDoubleClickEventCapability) component;
391
392 DoubleClickActionListener doubleClickActionListener = new DoubleClickActionListener(
393 expression, partialRendering);
394 doubleClickEventCapability
395 .addDoubleClickListener(doubleClickActionListener);
396
397 return doubleClickActionListener;
398 }
399
400 public Class getListenerClass() {
401 return IDoubleClickListener.class;
402 }
403 };
404
405 public static final IListenerType SELECTION_LISTENER_TYPE = new AbstractListenerType() {
406 private static final String REVISION = "$Revision: 1.14 $";
407
408 public void addScriptListener(UIComponent component, String scriptType,
409 String command) {
410 ISelectionEventCapability selectEventCapability = (ISelectionEventCapability) component;
411
412 selectEventCapability
413 .addSelectionListener(new SelectionScriptListener(
414 scriptType, command));
415 }
416
417 public IServerActionListener addActionListener(UIComponent component,
418 Application application, String expression,
419 boolean partialRendering) {
420 ISelectionEventCapability selectEventCapability = (ISelectionEventCapability) component;
421
422 SelectionActionListener selectionActionListener = new SelectionActionListener(
423 expression, partialRendering);
424 selectEventCapability.addSelectionListener(selectionActionListener);
425
426 return selectionActionListener;
427 }
428
429 public Class getListenerClass() {
430 return ISelectionListener.class;
431 }
432 };
433
434 public static final IListenerType ADDITIONAL_INFORMATION_LISTENER_TYPE = new AbstractListenerType() {
435 private static final String REVISION = "$Revision: 1.14 $";
436
437 public void addScriptListener(UIComponent component, String scriptType,
438 String command) {
439 IAdditionalInformationEventCapability additionalInformationEventCapability = (IAdditionalInformationEventCapability) component;
440
441 additionalInformationEventCapability
442 .addAdditionalInformationListener(new AdditionalInformationScriptListener(
443 scriptType, command));
444 }
445
446 public IServerActionListener addActionListener(UIComponent component,
447 Application application, String expression,
448 boolean partialRendering) {
449 IAdditionalInformationEventCapability additionalInformationEventCapability = (IAdditionalInformationEventCapability) component;
450
451 AdditionalInformationActionListener additionalInformationActionListener = new AdditionalInformationActionListener(
452 expression, partialRendering);
453 additionalInformationEventCapability
454 .addAdditionalInformationListener(additionalInformationActionListener);
455
456 return additionalInformationActionListener;
457 }
458
459 public Class getListenerClass() {
460 return IAdditionalInformationListener.class;
461 }
462 };
463
464 public static final IListenerType CHECK_LISTENER_TYPE = new AbstractListenerType() {
465 private static final String REVISION = "$Revision: 1.14 $";
466
467 public void addScriptListener(UIComponent component, String scriptType,
468 String command) {
469 ICheckEventCapability checkEventCapability = (ICheckEventCapability) component;
470
471 checkEventCapability.addCheckListener(new CheckScriptListener(
472 scriptType, command));
473 }
474
475 public IServerActionListener addActionListener(UIComponent component,
476 Application application, String expression,
477 boolean partialRendering) {
478 ICheckEventCapability checkEventCapability = (ICheckEventCapability) component;
479
480 CheckActionListener checkActionListener = new CheckActionListener(
481 expression, partialRendering);
482 checkEventCapability.addCheckListener(checkActionListener);
483
484 return checkActionListener;
485 }
486
487 public Class getListenerClass() {
488 return ICheckListener.class;
489 }
490 };
491
492 public static final IListenerType CLOSE_LISTENER_TYPE = new AbstractListenerType() {
493 private static final String REVISION = "$Revision: 1.14 $";
494
495 public void addScriptListener(UIComponent component, String scriptType,
496 String command) {
497 ICloseEventCapability closeEventCapability = (ICloseEventCapability) component;
498
499 closeEventCapability.addCloseListener(new CloseScriptListener(
500 scriptType, command));
501 }
502
503 public IServerActionListener addActionListener(UIComponent component,
504 Application application, String expression,
505 boolean partialRendering) {
506 ICloseEventCapability closeEventCapability = (ICloseEventCapability) component;
507
508 CloseActionListener closeActionListener = new CloseActionListener(
509 expression, partialRendering);
510 closeEventCapability.addCloseListener(closeActionListener);
511
512 return closeActionListener;
513 }
514
515 public Class getListenerClass() {
516 return ICloseListener.class;
517 }
518 };
519
520 public static final IListenerType VALUE_CHANGE_LISTENER_TYPE = new AbstractListenerType() {
521 private static final String REVISION = "$Revision: 1.14 $";
522
523 public void addScriptListener(UIComponent component, String scriptType,
524 String command) {
525 IValueChangeEventCapability changeEventCapability = (IValueChangeEventCapability) component;
526
527 changeEventCapability
528 .addValueChangeListener(new ChangeScriptListener(
529 scriptType, command));
530 }
531
532 public IServerActionListener addActionListener(UIComponent component,
533 Application application, String expression,
534 boolean partialRendering) {
535 IValueChangeEventCapability changeEventCapability = (IValueChangeEventCapability) component;
536
537 ChangeActionListener changeActionListener = new ChangeActionListener(
538 expression, partialRendering);
539 changeEventCapability.addValueChangeListener(changeActionListener);
540
541 return changeActionListener;
542 }
543
544 public Class getListenerClass() {
545 return ValueChangeListener.class;
546 }
547 };
548
549 public static final IListenerType SUGGESTION_LISTENER_TYPE = new AbstractListenerType() {
550 private static final String REVISION = "$Revision: 1.14 $";
551
552 public void addScriptListener(UIComponent component, String scriptType,
553 String command) {
554 ISuggestionEventCapability prepareEventCapability = (ISuggestionEventCapability) component;
555
556 prepareEventCapability
557 .addSuggestionListener(new SuggestionScriptListener(
558 scriptType, command));
559 }
560
561 public IServerActionListener addActionListener(UIComponent component,
562 Application application, String expression,
563 boolean partialRendering) {
564 ISuggestionEventCapability prepareEventCapability = (ISuggestionEventCapability) component;
565
566 SuggestionActionListener suggestionActionListener = new SuggestionActionListener(
567 expression, partialRendering);
568 prepareEventCapability
569 .addSuggestionListener(suggestionActionListener);
570
571 return suggestionActionListener;
572 }
573
574 public Class getListenerClass() {
575 return ISuggestionListener.class;
576 }
577 };
578
579 public static final IListenerType PROPERTY_CHANGE_LISTENER_TYPE = new AbstractListenerType() {
580 private static final String REVISION = "$Revision: 1.14 $";
581
582 public void addScriptListener(UIComponent component, String scriptType,
583 String command) {
584 IPropertyChangeEventCapability changeEventCapability = (IPropertyChangeEventCapability) component;
585
586 changeEventCapability
587 .addPropertyChangeListener(new PropertyChangeScriptListener(
588 scriptType, command));
589 }
590
591 public IServerActionListener addActionListener(UIComponent component,
592 Application application, String expression,
593 boolean partialRendering) {
594 IPropertyChangeEventCapability propertyChangeEventCapability = (IPropertyChangeEventCapability) component;
595
596 PropertyChangeActionListener propertyChangeActionListener = new PropertyChangeActionListener(
597 expression, partialRendering);
598 propertyChangeEventCapability
599 .addPropertyChangeListener(propertyChangeActionListener);
600
601 return propertyChangeActionListener;
602 }
603
604 public Class getListenerClass() {
605 return IPropertyChangeListener.class;
606 }
607 };
608
609 public static final IListenerType KEY_PRESS_LISTENER_TYPE = new AbstractListenerType() {
610 private static final String REVISION = "$Revision: 1.14 $";
611
612 public void addScriptListener(UIComponent component, String scriptType,
613 String command) {
614 IKeyPressEventCapability keyEventCapability = (IKeyPressEventCapability) component;
615
616 keyEventCapability.addKeyPressListener(new KeyPressScriptListener(
617 scriptType, command));
618 }
619
620 public IServerActionListener addActionListener(UIComponent component,
621 Application application, String expression,
622 boolean partialRendering) {
623 IKeyPressEventCapability keyPressEventCapability = (IKeyPressEventCapability) component;
624
625 KeyPressActionListener keyPressActionListener = new KeyPressActionListener(
626 expression, partialRendering);
627 keyPressEventCapability.addKeyPressListener(keyPressActionListener);
628
629 return keyPressActionListener;
630 }
631
632 public Class getListenerClass() {
633 return IKeyPressListener.class;
634 }
635 };
636
637 public static final IListenerType KEY_DOWN_LISTENER_TYPE = new AbstractListenerType() {
638 private static final String REVISION = "$Revision: 1.14 $";
639
640 public void addScriptListener(UIComponent component, String scriptType,
641 String command) {
642 IKeyDownEventCapability keyEventCapability = (IKeyDownEventCapability) component;
643
644 keyEventCapability.addKeyDownListener(new KeyDownScriptListener(
645 scriptType, command));
646 }
647
648 public IServerActionListener addActionListener(UIComponent component,
649 Application application, String expression,
650 boolean partialRendering) {
651 throw new UnsupportedListenerTypeException("keyDown");
652 }
653
654 public Class getListenerClass() {
655 return IKeyDownListener.class;
656 }
657 };
658
659 public static final IListenerType KEY_UP_LISTENER_TYPE = new AbstractListenerType() {
660 private static final String REVISION = "$Revision: 1.14 $";
661
662 public void addScriptListener(UIComponent component, String scriptType,
663 String command) {
664 IKeyUpEventCapability keyEventCapability = (IKeyUpEventCapability) component;
665
666 keyEventCapability.addKeyUpListener(new KeyUpScriptListener(
667 scriptType, command));
668 }
669
670 public IServerActionListener addActionListener(UIComponent component,
671 Application application, String expression,
672 boolean partialRendering) {
673 throw new UnsupportedListenerTypeException("keyUp");
674 }
675
676 public Class getListenerClass() {
677 return IKeyUpListener.class;
678 }
679 };
680
681 public static final IListenerType INIT_LISTENER_TYPE = new AbstractListenerType() {
682 private static final String REVISION = "$Revision: 1.14 $";
683
684 public void addScriptListener(UIComponent component, String scriptType,
685 String command) {
686 IInitEventCapability initEventCapability = (IInitEventCapability) component;
687
688 initEventCapability.addInitListener(new InitScriptListener(
689 scriptType, command));
690 }
691
692 public IServerActionListener addActionListener(UIComponent component,
693 Application application, String expression,
694 boolean partialRendering) {
695 throw new UnsupportedListenerTypeException("init");
696 }
697
698 public Class getListenerClass() {
699 return IInitListener.class;
700 }
701 };
702
703 public static final IListenerType MOUSE_OUT_LISTENER_TYPE = new AbstractListenerType() {
704 private static final String REVISION = "$Revision: 1.14 $";
705
706 public void addScriptListener(UIComponent component, String scriptType,
707 String command) {
708 IMouseEventCapability mouseEventCapability = (IMouseEventCapability) component;
709
710 mouseEventCapability
711 .addMouseOutListener(new MouseOutScriptListener(scriptType,
712 command));
713 }
714
715 public IServerActionListener addActionListener(UIComponent component,
716 Application application, String expression,
717 boolean partialRendering) {
718 throw new UnsupportedListenerTypeException("mouseOut");
719 }
720
721 public Class getListenerClass() {
722 return IMouseOutListener.class;
723 }
724 };
725
726 public static final IListenerType MOUSE_OVER_LISTENER_TYPE = new AbstractListenerType() {
727 private static final String REVISION = "$Revision: 1.14 $";
728
729 public void addScriptListener(UIComponent component, String scriptType,
730 String command) {
731 IMouseEventCapability mouseEventCapability = (IMouseEventCapability) component;
732
733 mouseEventCapability
734 .addMouseOverListener(new MouseOverScriptListener(
735 scriptType, command));
736 }
737
738 public IServerActionListener addActionListener(UIComponent component,
739 Application application, String expression,
740 boolean partialRendering) {
741 throw new UnsupportedListenerTypeException("mouseOver");
742 }
743
744 public Class getListenerClass() {
745 return IMouseOverListener.class;
746 }
747 };
748
749 public static final IListenerType PRE_SELECTION_LISTENER_TYPE = new AbstractListenerType() {
750 private static final String REVISION = "$Revision: 1.14 $";
751
752 public void addScriptListener(UIComponent component, String scriptType,
753 String command) {
754 IPreSelectionEventCapability preSelectionEventCapability = (IPreSelectionEventCapability) component;
755
756 preSelectionEventCapability
757 .addPreSelectionListener(new PreSelectionScriptListener(
758 scriptType, command));
759 }
760
761 public IServerActionListener addActionListener(UIComponent component,
762 Application application, String expression,
763 boolean partialRendering) {
764 throw new UnsupportedListenerTypeException("preSelection");
765 }
766
767 public Class getListenerClass() {
768 return IPreSelectionListener.class;
769 }
770 };
771
772 public static final IListenerType SORT_LISTENER_TYPE = new AbstractListenerType() {
773 private static final String REVISION = "$Revision: 1.14 $";
774
775 public void addScriptListener(UIComponent component, String scriptType,
776 String command) {
777 ISortEventCapability sortEventCapability = (ISortEventCapability) component;
778
779 sortEventCapability.addSortListener(new SortScriptListener(
780 scriptType, command));
781 }
782
783 public IServerActionListener addActionListener(UIComponent component,
784 Application application, String expression,
785 boolean partialRendering) {
786
787 ISortEventCapability sortEventCapability = (ISortEventCapability) component;
788
789 SortActionListener sortActionListener = new SortActionListener(
790 expression, partialRendering);
791 sortEventCapability.addSortListener(sortActionListener);
792
793 return sortActionListener;
794 }
795
796 public Class getListenerClass() {
797 return ISortListener.class;
798 }
799 };
800
801 public static final IListenerType RESET_LISTENER_TYPE = new AbstractListenerType() {
802 private static final String REVISION = "$Revision: 1.14 $";
803
804 public void addScriptListener(UIComponent component, String scriptType,
805 String command) {
806 IResetEventCapability resetEventCapability = (IResetEventCapability) component;
807
808 resetEventCapability.addResetListener(new ResetScriptListener(
809 scriptType, command));
810 }
811
812 public IServerActionListener addActionListener(UIComponent component,
813 Application application, String expression,
814 boolean partialRendering) {
815
816 IResetEventCapability sortEventCapability = (IResetEventCapability) component;
817
818 ResetActionListener resetActionListener = new ResetActionListener(
819 expression, partialRendering);
820 sortEventCapability.addResetListener(resetActionListener);
821
822 return resetActionListener;
823 }
824
825 public Class getListenerClass() {
826 return IResetListener.class;
827 }
828 };
829
830 public static final IListenerType VALIDATION_LISTENER_TYPE = new AbstractListenerType() {
831 private static final String REVISION = "$Revision: 1.14 $";
832
833 public void addScriptListener(UIComponent component, String scriptType,
834 String command) {
835 IValidationEventCapability validationEventCapability = (IValidationEventCapability) component;
836
837 validationEventCapability
838 .addValidationListener(new ValidationScriptListener(
839 scriptType, command));
840 }
841
842 public IServerActionListener addActionListener(UIComponent component,
843 Application application, String expression,
844 boolean partialRendering) {
845 IValidationEventCapability validationEventCapability = (IValidationEventCapability) component;
846
847 ValidationActionListener validationActionListener = new ValidationActionListener(
848 expression, partialRendering);
849 validationEventCapability
850 .addValidationListener(validationActionListener);
851
852 return validationActionListener;
853 }
854
855 public Class getListenerClass() {
856 return IValidationListener.class;
857 }
858 };
859
860 public static final IListenerType MENU_LISTENER_TYPE = new AbstractListenerType() {
861 private static final String REVISION = "$Revision: 1.14 $";
862
863 public void addScriptListener(UIComponent component, String scriptType,
864 String command) {
865 IMenuEventCapability menuEventCapability = (IMenuEventCapability) component;
866
867 menuEventCapability.addMenuListener(new MenuScriptListener(
868 scriptType, command));
869 }
870
871 public IServerActionListener addActionListener(UIComponent component,
872 Application application, String expression,
873 boolean partialRendering) {
874 throw new UnsupportedListenerTypeException("menuListener");
875 }
876
877 public Class getListenerClass() {
878 return IMenuListener.class;
879 }
880 };
881
882 public static final IListenerType USER_EVENT_LISTENER_TYPE = new AbstractListenerType() {
883 private static final String REVISION = "$Revision: 1.14 $";
884
885 public void addScriptListener(UIComponent component, String scriptType,
886 String command) {
887 IUserEventCapability userEventCapability = (IUserEventCapability) component;
888
889 userEventCapability
890 .addUserEventListener(new UserEventScriptListener(
891 scriptType, command));
892 }
893
894 public IServerActionListener addActionListener(UIComponent component,
895 Application application, String expression,
896 boolean partialRendering) {
897
898 IUserEventCapability userEventCapability = (IUserEventCapability) component;
899
900 UserEventActionListener userEventActionListener = new UserEventActionListener(
901 expression, partialRendering);
902 userEventCapability.addUserEventListener(userEventActionListener);
903
904 return userEventActionListener;
905 }
906
907 public Class getListenerClass() {
908 return IUserEventListener.class;
909 }
910 };
911
912 public static final IListenerType SERVICE_EVENT_LISTENER_TYPE = new AbstractListenerType() {
913 private static final String REVISION = "$Revision: 1.14 $";
914
915 public void addScriptListener(UIComponent component, String scriptType,
916 String command) {
917 IServiceEventCapability userEventCapability = (IServiceEventCapability) component;
918
919 userEventCapability
920 .addServiceEventListener(new ServiceEventScriptListener(
921 scriptType, command));
922 }
923
924 public IServerActionListener addActionListener(UIComponent component,
925 Application application, String expression,
926 boolean partialRendering) {
927
928 IServiceEventCapability userEventCapability = (IServiceEventCapability) component;
929
930 ServiceEventActionListener serviceEventActionListener = new ServiceEventActionListener(
931 expression, partialRendering);
932 userEventCapability
933 .addServiceEventListener(serviceEventActionListener);
934
935 return serviceEventActionListener;
936 }
937
938 public Class getListenerClass() {
939 return IServiceEventListener.class;
940 }
941 };
942
943 private static final String PARTIAL_RENDERING_PREFIX = "ppr:";
944
945 public static void parseListener(FacesContext facesContext,
946 UIComponent component, IListenerType listenerType, String expression) {
947 parseListener(facesContext, component, listenerType, expression, false,
948 null);
949 }
950
951 public static void parseListener(FacesContext facesContext,
952 UIComponent component, IListenerType listenerType,
953 String expression, IMethodExpressionCreator methodExpressionCreator) {
954 parseListener(facesContext, component, listenerType, expression, false,
955 methodExpressionCreator);
956 }
957
958 public static void parseListener(FacesContext facesContext,
959 UIComponent component, IListenerType listenerType,
960 String expression, boolean defaultAction,
961 IMethodExpressionCreator methodExpressionCreator) {
962 expression = expression.trim();
963 if (expression.length() < 1) {
964 return;
965 }
966
967
968
969
970
971
972
973
974
975
976
977 String scriptType = getScriptType(facesContext);
978
979 char chs[] = expression.toCharArray();
980 int par = 0;
981 int acco = 0;
982 int brakets = 0;
983 int lastStart = 0;
984 int offset;
985 nextChar: for (offset = 0; offset < chs.length; offset++) {
986 char c = chs[offset];
987
988 if (c == '\"' || c == '\'') {
989 for (offset++; offset < chs.length; offset++) {
990 char c2 = chs[offset];
991
992 if (c == c2) {
993 continue nextChar;
994 }
995
996 if (c2 == '\\' && offset + 1 < chs.length) {
997 offset++;
998 }
999 }
1000
1001
1002 throw new FacesException(
1003 "Syntax error on javascript expression='" + expression
1004 + "': quote or double-quote are not balanced.");
1005 }
1006 if (c == '(') {
1007 par++;
1008 continue;
1009 }
1010 if (c == ')') {
1011 if (par < 1) {
1012 throw new FacesException(
1013 "Syntax error on javascript expression='"
1014 + expression
1015 + "': parentheses are not balanced");
1016 }
1017 par--;
1018 continue;
1019 }
1020 if (c == '{') {
1021 acco++;
1022 continue;
1023 }
1024 if (c == '}') {
1025 if (acco < 1) {
1026 throw new FacesException(
1027 "Syntax error on javascript expression='"
1028 + expression
1029 + "': braces are not balanced.");
1030 }
1031 acco--;
1032 continue;
1033 }
1034 if (c == '[') {
1035 brakets++;
1036 continue;
1037 }
1038 if (c == ']') {
1039 if (brakets < 1) {
1040 throw new FacesException(
1041 "Syntax error on javascript expression='"
1042 + expression
1043 + "': brackets are not balanced.");
1044 }
1045 brakets--;
1046 continue;
1047 }
1048 if (c != ';') {
1049 continue;
1050 }
1051
1052 if (brakets > 0 || acco > 0 || par > 0) {
1053 continue;
1054 }
1055
1056 parseFunction(chs, lastStart, offset - 1, expression, facesContext,
1057 component, listenerType, scriptType,
1058 methodExpressionCreator);
1059 lastStart = offset + 1;
1060 }
1061
1062 if (lastStart < offset) {
1063 parseFunction(chs, lastStart, offset - 1, expression, facesContext,
1064 component, listenerType, scriptType,
1065 methodExpressionCreator);
1066 }
1067 }
1068
1069 private static void parseFunction(char[] chs, int start, int end,
1070 String listeners, FacesContext facesContext, UIComponent component,
1071 IListenerType listenerType, String scriptType,
1072 IMethodExpressionCreator methodExpressionCreator) {
1073 for (; start < end; start++) {
1074 char c = chs[start];
1075 if (Character.isWhitespace(c) == false) {
1076 break;
1077 }
1078 }
1079
1080 for (; end > start; end--) {
1081 char c = chs[end];
1082 if (Character.isWhitespace(c) == false) {
1083 break;
1084 }
1085 }
1086
1087 if (start >= end) {
1088
1089 return;
1090 }
1091
1092 String s = listeners.substring(start, end + 1);
1093
1094 if (start + 4 < end) {
1095 boolean partialRendering = false;
1096 String actionExpression = s;
1097
1098 if (s.startsWith(PARTIAL_RENDERING_PREFIX)) {
1099 partialRendering = true;
1100 actionExpression = s.substring(PARTIAL_RENDERING_PREFIX
1101 .length());
1102 }
1103
1104 if (BindingTools.isBindingExpression(actionExpression)
1105 || isForwardReference(actionExpression)) {
1106
1107 if (LOG.isDebugEnabled()) {
1108 LOG.debug("Add server listener to component '"
1109 + component.getId() + "' : " + s);
1110 }
1111
1112 if (component instanceof IComponentLifeCycle) {
1113 IComponentLifeCycle componentLifeCycle = (IComponentLifeCycle) component;
1114
1115 if (componentLifeCycle.confirmListenerAppend(facesContext,
1116 listenerType.getListenerClass()) == false) {
1117 return;
1118 }
1119 }
1120
1121 IServerActionListener serverActionListener = listenerType
1122 .addActionListener(component, facesContext
1123 .getApplication(), actionExpression,
1124 partialRendering);
1125
1126 if (serverActionListener != null
1127 && methodExpressionCreator != null) {
1128
1129 serverActionListener.createMethodExpression(facesContext,
1130 methodExpressionCreator);
1131 }
1132
1133 return;
1134 }
1135 }
1136
1137 if (LOG.isDebugEnabled()) {
1138 LOG.debug("Add script listener (type=" + scriptType
1139 + ") to component '" + component.getId() + "' : " + s);
1140 }
1141 if (component instanceof IComponentLifeCycle) {
1142 IComponentLifeCycle componentLifeCycle = (IComponentLifeCycle) component;
1143
1144 if (componentLifeCycle.confirmListenerAppend(facesContext,
1145 listenerType.getListenerClass())) {
1146 listenerType.addScriptListener(component, scriptType, s);
1147 }
1148 } else {
1149 listenerType.addScriptListener(component, scriptType, s);
1150 }
1151
1152 }
1153
1154 protected static boolean isForwardReference(String s) {
1155 if (s.startsWith("#[") == false) {
1156 return false;
1157 }
1158
1159 if (s.endsWith("]") == false) {
1160 return false;
1161 }
1162
1163 return true;
1164 }
1165
1166 public static final String getScriptType(FacesContext facesContext) {
1167 return PageConfiguration.getScriptType(facesContext);
1168 }
1169
1170 public interface IMethodExpressionCreator {
1171 MethodExpression create(String expression, Class[] paramTypes);
1172 }
1173 }