1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 package org.apache.myfaces.taglib.core;
20
21 import javax.el.ELContext;
22 import javax.el.ValueExpression;
23 import javax.faces.component.StateHolder;
24 import javax.faces.component.UIComponent;
25 import javax.faces.context.FacesContext;
26 import javax.faces.convert.Converter;
27 import javax.faces.convert.ConverterException;
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46 public class DelegateConverter implements Converter, StateHolder
47 {
48
49 private ValueExpression _converterId;
50 private ValueExpression _binding;
51 private String _converterIdString = null;
52
53 public DelegateConverter()
54 {
55
56 }
57
58 public DelegateConverter(ValueExpression id, ValueExpression binding, String converterIdString)
59 {
60 super();
61 _converterId = id;
62 _binding = binding;
63 _converterIdString = converterIdString;
64 }
65
66 public boolean isTransient()
67 {
68 return false;
69 }
70
71 public void restoreState(FacesContext facesContext, Object state)
72 {
73 Object[] values = (Object[]) state;
74 _converterId = (ValueExpression) values[0];
75 _binding = (ValueExpression) values[1];
76 _converterIdString = (String) values[2];
77 }
78
79 public Object saveState(FacesContext facesContext)
80 {
81 Object[] values = new Object[3];
82 values[0] = _converterId;
83 values[1] = _binding;
84 values[2] = _converterIdString;
85 return values;
86 }
87
88 public void setTransient(boolean arg0)
89 {
90
91 }
92
93 public Object getAsObject(FacesContext facesContext, UIComponent component,
94 String value)
95 {
96 return _getDelegate().getAsObject(facesContext, component, value);
97 }
98
99 public String getAsString(FacesContext facesContext, UIComponent component,
100 Object value)
101 {
102 return _getDelegate().getAsString(facesContext, component, value);
103 }
104
105 private Converter _getDelegate()
106 {
107 return _createConverter();
108 }
109
110 private Converter _createConverter()
111 {
112 Converter converter = null;
113
114 FacesContext facesContext = FacesContext.getCurrentInstance();
115 ELContext elContext = facesContext.getELContext();
116
117
118
119 if (_binding != null)
120 {
121 try
122 {
123 converter = (Converter) _binding.getValue(elContext);
124
125 if (converter != null)
126 {
127 return converter;
128 }
129 }
130 catch (Exception e)
131 {
132 throw new ConverterException("Exception creating converter using binding", e);
133 }
134 }
135
136 if ((_converterId != null) || (_converterIdString != null))
137 {
138 try
139 {
140 if (null != _converterIdString)
141 {
142 converter = facesContext.getApplication().createConverter(_converterIdString);
143 }
144 else
145 {
146 String converterId = (String) _converterId.getValue(elContext);
147 converter = facesContext.getApplication().createConverter(converterId);
148 }
149
150
151
152 if (converter != null && _binding != null)
153 {
154 _binding.setValue(elContext, converter);
155 }
156 }
157 catch (Exception e)
158 {
159 throw new ConverterException("Exception creating converter with converterId: " + _converterId, e);
160 }
161 }
162
163 if (converter == null)
164 {
165 throw new IllegalStateException("Could not create converter. Please specify a valid converterId" +
166 " or a non-null binding.");
167 }
168
169 return converter;
170 }
171
172 }