1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 package org.apache.myfaces.tobago.event;
21
22 import org.slf4j.Logger;
23 import org.slf4j.LoggerFactory;
24
25 import javax.el.ValueExpression;
26 import javax.faces.component.StateHolder;
27 import javax.faces.component.UIComponentBase;
28 import javax.faces.context.FacesContext;
29
30 public class ValueExpressionTabChangeListener implements TabChangeListener, StateHolder {
31
32 private static final Logger LOG = LoggerFactory.getLogger(ValueExpressionTabChangeListener.class);
33
34 private String type;
35 private ValueExpression valueExpression;
36
37 public ValueExpressionTabChangeListener() {
38 }
39
40 public ValueExpressionTabChangeListener(String type, ValueExpression valueExpression) {
41 this.type = type;
42 this.valueExpression = valueExpression;
43 }
44
45 public void processTabChange(TabChangeEvent tabChangeEvent) {
46 TabChangeListener handler = getTabChangeListener();
47 if (handler != null) {
48 handler.processTabChange(tabChangeEvent);
49 } else {
50 LOG.error("Ignoring TabChangeEvent. No TabChangeListener found.");
51 }
52 }
53
54 public Object saveState(FacesContext context) {
55 Object[] state = new Object[2];
56 state[0] = UIComponentBase.saveAttachedState(context, valueExpression);
57 state[1] = type;
58 return state;
59 }
60
61 public void restoreState(FacesContext context, Object state) {
62 Object[] values = (Object[]) state;
63 valueExpression = (ValueExpression) UIComponentBase.restoreAttachedState(context, values[0]);
64 type = (String) values[1];
65
66 }
67
68 public boolean isTransient() {
69 return false;
70 }
71
72 public void setTransient(boolean newTransientValue) {
73
74 }
75
76 private TabChangeListener getTabChangeListener() {
77 TabChangeListener handler = null;
78 if (valueExpression != null) {
79 Object obj = valueExpression.getValue(FacesContext.getCurrentInstance().getELContext());
80 if (obj != null && obj instanceof TabChangeListener) {
81 handler = (TabChangeListener) obj;
82 }
83 }
84 if (handler == null && type != null) {
85 handler = createTabChangeListener(type);
86 if (handler != null && valueExpression != null) {
87 valueExpression.setValue(FacesContext.getCurrentInstance().getELContext(), handler);
88 }
89 }
90 return handler;
91 }
92
93 private TabChangeListener createTabChangeListener(String className) {
94 try {
95 Class clazz = getClass().getClassLoader().loadClass(className);
96 return ((TabChangeListener) clazz.newInstance());
97 } catch (Exception e) {
98 LOG.error("", e);
99 }
100 return null;
101 }
102 }