View Javadoc

1   /*
2    * $Id: ListenersTools.java,v 1.14 2010/11/02 10:04:37 jbmeslin Exp $
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  * @author Olivier Oeuillot (latest modification by $Author: jbmeslin $)
126  * @version $Revision: 1.14 $ $Date: 2010/11/02 10:04:37 $
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 	 * @author Olivier Oeuillot (latest modification by $Author: jbmeslin $)
136 	 * @version $Revision: 1.14 $ $Date: 2010/11/02 10:04:37 $
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 		// void clearListeners(UIComponent component);
150 	}
151 
152 	/**
153 	 * 
154 	 * @author Olivier Oeuillot (latest modification by $Author: jbmeslin $)
155 	 * @version $Revision: 1.14 $ $Date: 2010/11/02 10:04:37 $
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 		 * if (defaultAction && (component instanceof UICommand)) { UICommand
969 		 * command = (UICommand) component;
970 		 * 
971 		 * MethodBinding vb; if (isValueReference(expression)) { vb =
972 		 * application.createMethodBinding(expression, null); } else { vb = new
973 		 * ForwardMethodBinding(expression); }
974 		 * 
975 		 * command.setActionListener(vb); return; }
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 				// Mauvaise syntaxe
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 			// Que du blanc !
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 				// Value reference ? ajouter !
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 }