1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 package org.apache.myfaces.mc.test.core;
20
21 import java.beans.BeanInfo;
22 import java.io.IOException;
23
24 import javax.faces.FacesException;
25 import javax.faces.FactoryFinder;
26 import javax.faces.application.Application;
27 import javax.faces.application.Resource;
28 import javax.faces.application.ViewHandler;
29 import javax.faces.component.UIViewRoot;
30 import javax.faces.context.ExternalContext;
31 import javax.faces.context.FacesContext;
32 import javax.faces.context.ResponseWriter;
33 import javax.faces.render.RenderKit;
34 import javax.faces.render.RenderKitFactory;
35 import javax.faces.view.StateManagementStrategy;
36 import javax.faces.view.ViewDeclarationLanguage;
37 import javax.faces.view.ViewMetadata;
38 import javax.servlet.http.HttpServletResponse;
39
40 import org.apache.myfaces.shared.application.InvalidViewIdException;
41
42
43
44
45
46
47
48
49
50
51
52
53
54 public class MockDefaultViewDeclarationLanguage extends ViewDeclarationLanguage
55 {
56 public static final String DUMMY_VIEW_CREATE_HOOK = "oam.dummy.create.UIViewRoot";
57 public static final String DUMMY_VIEW_RESTORE_HOOK = "oam.dummy.restore.UIViewRoot";
58
59 @Override
60 public void buildView(FacesContext context, UIViewRoot view)
61 throws IOException
62 {
63 }
64
65 @Override
66 public UIViewRoot createView(FacesContext context, String viewId)
67 {
68 if (context.getAttributes().containsKey(DUMMY_VIEW_CREATE_HOOK))
69 {
70 UIViewRoot root = (UIViewRoot) context.getAttributes().remove(DUMMY_VIEW_CREATE_HOOK);
71 Application application = context.getApplication();
72 ViewHandler handler = application.getViewHandler();
73 root.setLocale(handler.calculateLocale(context));
74 root.setRenderKitId(handler.calculateRenderKitId(context));
75 root.setViewId(viewId);
76 return root;
77 }
78 else
79 {
80 try
81 {
82 viewId = calculateViewId(context, viewId);
83
84 Application application = context.getApplication();
85
86 UIViewRoot newViewRoot = (UIViewRoot) application.createComponent(UIViewRoot.COMPONENT_TYPE);
87 UIViewRoot oldViewRoot = context.getViewRoot();
88 if (oldViewRoot == null)
89 {
90
91
92
93 ViewHandler handler = application.getViewHandler();
94 newViewRoot.setLocale(handler.calculateLocale(context));
95 newViewRoot.setRenderKitId(handler.calculateRenderKitId(context));
96 }
97 else
98 {
99
100
101 newViewRoot.setLocale(oldViewRoot.getLocale());
102 newViewRoot.setRenderKitId(oldViewRoot.getRenderKitId());
103 }
104
105
106 newViewRoot.setViewId(viewId);
107
108 return newViewRoot;
109 }
110 catch (InvalidViewIdException e)
111 {
112
113
114 sendSourceNotFound(context, e.getMessage());
115
116
117 return null;
118 }
119 }
120 }
121
122
123
124
125
126
127
128
129
130 protected String calculateViewId(FacesContext context, String viewId)
131 {
132 if (viewId != null)
133 {
134 throw new InvalidViewIdException();
135 }
136 return null;
137 }
138
139 protected void sendSourceNotFound(FacesContext context, String message)
140 {
141 HttpServletResponse response = (HttpServletResponse) context.getExternalContext().getResponse();
142 try
143 {
144 context.responseComplete();
145 response.sendError(HttpServletResponse.SC_NOT_FOUND, message);
146 }
147 catch (IOException ioe)
148 {
149 throw new FacesException(ioe);
150 }
151 }
152
153
154
155
156
157
158
159
160 public static void hookCreateView(FacesContext context, UIViewRoot root)
161 {
162 context.getAttributes().put(DUMMY_VIEW_CREATE_HOOK, root);
163 }
164
165
166
167
168
169
170
171
172 public static void hookRestoreView(FacesContext context, UIViewRoot root)
173 {
174 context.getAttributes().put(DUMMY_VIEW_RESTORE_HOOK, root);
175 }
176
177 @Override
178 public BeanInfo getComponentMetadata(FacesContext context,
179 Resource componentResource)
180 {
181 return null;
182 }
183
184 @Override
185 public Resource getScriptComponentResource(FacesContext context,
186 Resource componentResource)
187 {
188 return null;
189 }
190
191 @Override
192 public StateManagementStrategy getStateManagementStrategy(
193 FacesContext context, String viewId)
194 {
195 return null;
196 }
197
198 @Override
199 public ViewMetadata getViewMetadata(FacesContext context, String viewId)
200 {
201 return null;
202 }
203
204 @Override
205 public void renderView(FacesContext context, UIViewRoot view)
206 throws IOException
207 {
208 checkNull(context, "context");
209 checkNull(view, "view");
210
211 ExternalContext externalContext = context.getExternalContext();
212 ResponseWriter responseWriter = context.getResponseWriter();
213 if (responseWriter == null)
214 {
215 RenderKitFactory renderFactory = (RenderKitFactory) FactoryFinder.getFactory(FactoryFinder.RENDER_KIT_FACTORY);
216 RenderKit renderKit = renderFactory.getRenderKit(context, view.getRenderKitId());
217
218 responseWriter = renderKit.createResponseWriter(externalContext.getResponseOutputWriter(),
219 null, externalContext.getRequestCharacterEncoding());
220 context.setResponseWriter(responseWriter);
221 }
222
223
224
225 responseWriter.startDocument();
226
227 view.encodeAll(context);
228
229
230 responseWriter.endDocument();
231
232 responseWriter.flush();
233 }
234
235 @Override
236 public UIViewRoot restoreView(FacesContext context, String viewId)
237 {
238 checkNull(context, "context");
239
240
241 if (context.getAttributes().containsKey(DUMMY_VIEW_RESTORE_HOOK))
242 {
243 UIViewRoot root = (UIViewRoot) context.getAttributes().remove(DUMMY_VIEW_RESTORE_HOOK);
244 root.setViewId(viewId);
245 return root;
246 }
247 else
248 {
249 Application application = context.getApplication();
250
251 ViewHandler applicationViewHandler = application.getViewHandler();
252
253 String renderKitId = applicationViewHandler.calculateRenderKitId(context);
254
255 UIViewRoot viewRoot = application.getStateManager().restoreView(context, viewId, renderKitId);
256
257 return viewRoot;
258 }
259 }
260
261 protected void checkNull(final Object o, final String param)
262 {
263 if (o == null)
264 {
265 throw new NullPointerException(param + " can not be null.");
266 }
267 }
268 }