1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 package org.springframework.extensions.surf.mvc;
20
21 import java.io.IOException;
22
23 import javax.servlet.RequestDispatcher;
24 import javax.servlet.ServletException;
25 import javax.servlet.http.HttpServletRequest;
26 import javax.servlet.http.HttpServletResponse;
27
28 import org.apache.commons.logging.Log;
29 import org.apache.commons.logging.LogFactory;
30 import org.springframework.extensions.surf.FrameworkUtil;
31 import org.springframework.extensions.surf.RequestContext;
32 import org.springframework.extensions.surf.WebFrameworkServiceRegistry;
33 import org.springframework.extensions.surf.util.WrappedHttpServletRequest;
34 import org.springframework.extensions.surf.util.WrappedHttpServletResponse;
35 import org.springframework.extensions.webscripts.servlet.mvc.ResourceController;
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73 public class VirtualizedResourceController extends ResourceController
74 {
75 private static Log logger = LogFactory.getLog(VirtualizedResourceController.class);
76
77
78 private WebFrameworkServiceRegistry webFrameworkServiceRegistry;
79
80
81
82
83
84
85 public void setServiceRegistry(WebFrameworkServiceRegistry webFrameworkServiceRegistry)
86 {
87 this.webFrameworkServiceRegistry = webFrameworkServiceRegistry;
88 }
89
90
91
92
93
94
95 public WebFrameworkServiceRegistry getServiceRegistry()
96 {
97 return this.webFrameworkServiceRegistry;
98 }
99
100
101
102
103 public Log getLogger()
104 {
105 return logger;
106 }
107
108 @Override
109
110
111
112 public boolean dispatchResource(String path, HttpServletRequest request, HttpServletResponse response)
113 throws ServletException, IOException
114 {
115
116 boolean previewMode = this.getServiceRegistry().getWebFrameworkConfiguration().isPreviewEnabled();
117
118 boolean resolved = false;
119 if (!resolved && previewMode)
120 {
121
122 String endpointId = (String) request.getParameter("e");
123 String storeId = (String) request.getParameter("s");
124 String webappId = (String) request.getParameter("w");
125
126
127 resolved = retrieveRemoteResource(request, response, path, endpointId, storeId, webappId);
128 }
129
130 if (!resolved)
131 {
132
133
134
135
136 resolved = super.dispatchResource(path, request, response);
137 }
138
139 return resolved;
140 }
141
142
143
144
145
146
147
148
149
150
151
152
153
154 public boolean retrieveRemoteResource(HttpServletRequest request, HttpServletResponse response, String path, String endpointId, String storeId, String webappId)
155 throws ServletException, IOException
156 {
157 boolean resolved = false;
158
159
160 RequestContext context = FrameworkUtil.getCurrentRequestContext();
161
162
163 if (endpointId == null)
164 {
165 endpointId = this.getServiceRegistry().getRemoteConfiguration().getDefaultEndpointId();
166 }
167 if (storeId != null)
168 {
169
170 storeId = context.getModel().getObjectManager().getContext().getStoreId();
171 }
172 if (webappId == null)
173 {
174
175 webappId = context.getModel().getObjectManager().getContext().getWebappId();
176 }
177
178
179
180
181 boolean exists = checkRemoteResourceExists(context, request, response, path, endpointId, storeId, webappId);
182 if (exists)
183 {
184
185 StringBuilder fb = new StringBuilder(128);
186 fb.append(request.getServletPath());
187 fb.append("/endpoint/");
188 fb.append(endpointId);
189 fb.append("/avmstore/get/s/");
190 fb.append(storeId);
191 fb.append("/w/");
192 fb.append(webappId);
193
194 if (!path.startsWith("/"))
195 {
196 fb.append("/");
197 }
198 fb.append(path);
199
200 String newUri = fb.toString();
201
202 if (logger.isDebugEnabled())
203 logger.debug("Formed virtual retrieval path: " + newUri);
204
205
206
207 if (request instanceof WrappedHttpServletRequest)
208 {
209 ((WrappedHttpServletRequest)request).setRequestURI(request.getContextPath() + newUri);
210 }
211
212
213 RequestDispatcher dispatcher = getServletContext().getRequestDispatcher(newUri);
214 dispatcher.include(request, response);
215
216 resolved = true;
217 }
218
219 return resolved;
220 }
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236 public boolean checkRemoteResourceExists(RequestContext context, HttpServletRequest request, HttpServletResponse response, String path, String endpointId, String storeId, String webappId)
237 throws ServletException, IOException
238 {
239 boolean exists = false;
240
241
242 if (endpointId == null)
243 {
244 endpointId = this.getServiceRegistry().getRemoteConfiguration().getDefaultEndpointId();
245 }
246 if (storeId != null)
247 {
248
249 storeId = context.getModel().getObjectManager().getContext().getStoreId();
250 }
251 if (webappId == null)
252 {
253
254 webappId = context.getModel().getObjectManager().getContext().getWebappId();
255 }
256
257
258 StringBuilder fb = new StringBuilder(128);
259 fb.append(request.getServletPath());
260 fb.append("/endpoint/");
261 fb.append(endpointId);
262 fb.append("/avmstore/has/s/");
263 fb.append(storeId);
264 fb.append("/w/");
265 fb.append(webappId);
266
267 if (!path.startsWith("/"))
268 {
269 fb.append("/");
270 }
271 fb.append(path);
272
273 String newUri = fb.toString();
274
275 if (logger.isDebugEnabled())
276 logger.debug("Formed virtual retrieval path: " + newUri);
277
278
279
280 WrappedHttpServletRequest wrappedRequest = new WrappedHttpServletRequest(request);
281 WrappedHttpServletResponse wrappedResponse = new WrappedHttpServletResponse(response);
282
283
284 RequestDispatcher dispatcher = getServletContext().getRequestDispatcher(newUri);
285 dispatcher.include(wrappedRequest, wrappedResponse);
286
287
288 String result = wrappedResponse.getOutput();
289 if ("true".equalsIgnoreCase(result))
290 {
291 exists = true;
292 }
293
294 return exists;
295 }
296 }