1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 package org.apache.myfaces.orchestra.urlParamNav;
20
21 import javax.faces.FacesException;
22 import javax.faces.application.ViewHandler;
23 import javax.faces.component.UIViewRoot;
24 import javax.faces.context.FacesContext;
25 import javax.faces.el.ValueBinding;
26
27 import org.apache.myfaces.orchestra.lib.OrchestraException;
28
29 import java.io.IOException;
30 import java.lang.reflect.Method;
31 import java.util.Locale;
32
33
34
35
36
37
38
39
40
41
42
43
44
45 public class UrlParameterViewHandler extends ViewHandler
46 {
47 private static final Method CALC_CHAR_ENC_METHOD;
48 private static final Method INIT_VIEW_METHOD;
49
50 private final ViewHandler original;
51
52
53
54
55 static
56 {
57 CALC_CHAR_ENC_METHOD = getMethodOpt(ViewHandler.class,
58 "calculateCharacterEncoding",
59 new Class[] {FacesContext.class});
60
61 INIT_VIEW_METHOD = getMethodOpt(ViewHandler.class,
62 "initView",
63 new Class[] {FacesContext.class});
64 }
65
66
67
68
69
70 private static Method getMethodOpt(Class clazz, String methodName, Class[] args)
71 {
72 try
73 {
74 return clazz.getMethod(methodName, args);
75 }
76 catch(NoSuchMethodException e)
77 {
78 return null;
79 }
80 }
81
82
83
84
85 public UrlParameterViewHandler(final ViewHandler original)
86 {
87 this.original = original;
88 }
89
90
91
92
93
94
95
96
97
98
99 public java.lang.String calculateCharacterEncoding(FacesContext context)
100 {
101 try
102 {
103 Object ret = CALC_CHAR_ENC_METHOD.invoke(original, new Object[] {context});
104 return (String) ret;
105 }
106 catch(Exception e)
107 {
108 throw new OrchestraException("Unable to invoke calculateCharacterEncoding on wrapped ViewHandler");
109 }
110 }
111
112
113
114
115
116
117
118
119
120
121 public void initView(FacesContext context)
122 throws FacesException
123 {
124 try
125 {
126 INIT_VIEW_METHOD.invoke(original, new Object[] {context});
127 }
128 catch(Exception e)
129 {
130 throw new OrchestraException("Unable to invoke initView on wrapped ViewHandler");
131 }
132 }
133
134 public Locale calculateLocale(FacesContext context)
135 {
136 return original.calculateLocale(context);
137 }
138
139 public String calculateRenderKitId(FacesContext context)
140 {
141 return original.calculateRenderKitId(context);
142 }
143
144 public UIViewRoot createView(FacesContext context, String viewId)
145 {
146 return original.createView(context, viewId);
147 }
148
149 public String getActionURL(FacesContext context, String viewId)
150 {
151 if (viewId != null)
152 {
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176 viewId = expandExpressions(context, viewId);
177
178
179
180
181
182 int pos = viewId.indexOf('?');
183 if (pos > -1)
184 {
185 String realViewId = viewId.substring(0, pos);
186 String params = viewId.substring(pos);
187
188 return original.getActionURL(context, realViewId) + params;
189 }
190 }
191 return original.getActionURL(context, viewId);
192 }
193
194 public String getResourceURL(FacesContext context, String path)
195 {
196 return original.getResourceURL(context, path);
197 }
198
199 public void renderView(FacesContext context, UIViewRoot viewToRender)
200 throws IOException, FacesException
201 {
202 original.renderView(context, viewToRender);
203 }
204
205 public UIViewRoot restoreView(FacesContext context, String viewId)
206 {
207 return original.restoreView(context, viewId);
208 }
209
210 public void writeState(FacesContext context)
211 throws IOException
212 {
213 original.writeState(context);
214 }
215
216 private static String expandExpressions(FacesContext context, String url)
217 {
218 int pos = url.indexOf("#{");
219 if (pos > -1 && url.indexOf("}", pos) > -1)
220 {
221
222
223
224 ValueBinding vb = context.getApplication().createValueBinding(url);
225 return (String) vb.getValue(context);
226 }
227
228 return url;
229 }
230 }