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 import java.lang.invoke.MethodHandles;
30
31 public class ValueExpressionTabChangeListener implements TabChangeListener, StateHolder {
32
33 private static final Logger LOG = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
34
35 private String type;
36 private ValueExpression valueExpression;
37
38 public ValueExpressionTabChangeListener() {
39 }
40
41 public ValueExpressionTabChangeListener(final String type, final ValueExpression valueExpression) {
42 this.type = type;
43 this.valueExpression = valueExpression;
44 }
45
46 @Override
47 public void processTabChange(final TabChangeEvent tabChangeEvent) {
48 final TabChangeListener handler = getTabChangeListener();
49 if (handler != null) {
50 handler.processTabChange(tabChangeEvent);
51 } else {
52 LOG.error("Ignoring TabChangeEvent. No TabChangeListener found.");
53 }
54 }
55
56 @Override
57 public Object saveState(final FacesContext context) {
58 final Object[] state = new Object[2];
59 state[0] = UIComponentBase.saveAttachedState(context, valueExpression);
60 state[1] = type;
61 return state;
62 }
63
64 @Override
65 public void restoreState(final FacesContext context, final Object state) {
66 final Object[] values = (Object[]) state;
67 valueExpression = (ValueExpression) UIComponentBase.restoreAttachedState(context, values[0]);
68 type = (String) values[1];
69
70 }
71
72 @Override
73 public boolean isTransient() {
74 return false;
75 }
76
77 @Override
78 public void setTransient(final boolean newTransientValue) {
79
80 }
81
82 private TabChangeListener getTabChangeListener() {
83 TabChangeListener handler = null;
84 if (valueExpression != null) {
85 final Object obj = valueExpression.getValue(FacesContext.getCurrentInstance().getELContext());
86 if (obj != null && obj instanceof TabChangeListener) {
87 handler = (TabChangeListener) obj;
88 }
89 }
90 if (handler == null && type != null) {
91 handler = createTabChangeListener(type);
92 if (handler != null && valueExpression != null) {
93 valueExpression.setValue(FacesContext.getCurrentInstance().getELContext(), handler);
94 }
95 }
96 return handler;
97 }
98
99 private TabChangeListener createTabChangeListener(final String className) {
100 try {
101 final Class clazz = getClass().getClassLoader().loadClass(className);
102 return (TabChangeListener) clazz.newInstance();
103 } catch (final Exception e) {
104 LOG.error("", e);
105 }
106 return null;
107 }
108 }