1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 package org.apache.myfaces.orchestra.dynaForm.jsf.guiBuilder.impl.jsf;
20
21 import javax.faces.component.StateHolder;
22 import javax.faces.component.UIComponentBase;
23 import javax.faces.context.FacesContext;
24 import javax.faces.el.EvaluationException;
25 import javax.faces.el.MethodBinding;
26 import javax.faces.el.PropertyNotFoundException;
27 import javax.faces.el.ValueBinding;
28 import javax.faces.model.SelectItem;
29 import java.util.Collection;
30
31
32
33
34 public class ValueBindingDataSourceAdapter extends ValueBinding implements StateHolder
35 {
36 private MethodBinding mbValues;
37 private MethodBinding mbLabels;
38
39 private boolean _transient = false;
40
41 public ValueBindingDataSourceAdapter()
42 {
43 }
44
45 public ValueBindingDataSourceAdapter(MethodBinding mbValues, MethodBinding mbLabels)
46 {
47 this.mbValues = mbValues;
48 this.mbLabels = mbLabels;
49 }
50
51
52 @Override
53 public Class<?> getType(FacesContext facesContext) throws EvaluationException, PropertyNotFoundException
54 {
55 return SelectItem[].class;
56 }
57
58 @Override
59 public Object getValue(FacesContext facesContext) throws EvaluationException, PropertyNotFoundException
60 {
61 Object valueList = mbValues.invoke(facesContext, new Object[]{null});
62 if (valueList == null)
63 {
64 return null;
65 }
66
67 if (valueList instanceof Collection)
68 {
69 Collection<?> valueCollection = (Collection<?>) valueList;
70
71 SelectItem[] selectItems = new SelectItem[valueCollection.size()];
72
73 int i = -1;
74 for (Object value : valueCollection)
75 {
76 i++;
77
78 String label = (String) mbLabels.invoke(facesContext, new Object[]
79 {
80 value
81 });
82
83 SelectItem si = new SelectItem(value, label);
84 selectItems[i] = si;
85 }
86
87 return selectItems;
88 }
89
90 throw new IllegalArgumentException("don't know how to access " + valueList.getClass().getName());
91 }
92
93 @Override
94 public boolean isReadOnly(FacesContext facesContext) throws EvaluationException, PropertyNotFoundException
95 {
96 return true;
97 }
98
99 @Override
100 public void setValue(FacesContext facesContext, Object object) throws EvaluationException, PropertyNotFoundException
101 {
102 throw new UnsupportedOperationException();
103 }
104
105 public Object saveState(FacesContext facesContext)
106 {
107 return new Object[]
108 {
109 UIComponentBase.saveAttachedState(facesContext, mbValues),
110 UIComponentBase.saveAttachedState(facesContext, mbLabels),
111 };
112 }
113
114 public void restoreState(FacesContext facesContext, Object object)
115 {
116 Object[] states = (Object[]) object;
117 mbValues = (MethodBinding) UIComponentBase.restoreAttachedState(facesContext, states[0]);
118 mbLabels = (MethodBinding) UIComponentBase.restoreAttachedState(facesContext, states[1]);
119 }
120
121 public boolean isTransient()
122 {
123 return _transient;
124 }
125
126 public void setTransient(boolean flag)
127 {
128 _transient = flag;
129 }
130 }