1
19
20 package com.liferay.portal.wsrp;
21
22 import java.io.IOException;
23 import java.util.HashMap;
24 import java.util.Locale;
25 import java.util.Map;
26
27 import javax.portlet.PortletConfig;
28 import javax.portlet.PortletContext;
29 import javax.portlet.PortletMode;
30 import javax.portlet.PortletPreferences;
31 import javax.portlet.WindowState;
32 import javax.servlet.ServletContext;
33 import javax.servlet.http.HttpServletRequest;
34
35 import oasis.names.tc.wsrp.v1.types.BlockingInteractionResponse;
36 import oasis.names.tc.wsrp.v1.types.GetMarkup;
37 import oasis.names.tc.wsrp.v1.types.InteractionParams;
38 import oasis.names.tc.wsrp.v1.types.MarkupContext;
39 import oasis.names.tc.wsrp.v1.types.MarkupParams;
40 import oasis.names.tc.wsrp.v1.types.MarkupResponse;
41 import oasis.names.tc.wsrp.v1.types.NamedString;
42 import oasis.names.tc.wsrp.v1.types.PerformBlockingInteraction;
43 import oasis.names.tc.wsrp.v1.types.UpdateResponse;
44
45 import org.apache.wsrp4j.exception.WSRPException;
46 import org.apache.wsrp4j.producer.provider.PortletInvoker;
47 import org.apache.wsrp4j.producer.provider.Provider;
48 import org.apache.wsrp4j.producer.util.Base64;
49 import org.apache.wsrp4j.producer.util.ObjectDeserializer;
50 import org.apache.wsrp4j.producer.util.ObjectSerializer;
51 import org.apache.wsrp4j.util.LocaleHelper;
52
53 import com.liferay.portal.PortalException;
54 import com.liferay.portal.SystemException;
55 import com.liferay.portal.kernel.util.ContentTypes;
56 import com.liferay.portal.kernel.util.WebKeys;
57 import com.liferay.portal.model.Group;
58 import com.liferay.portal.model.GroupConstants;
59 import com.liferay.portal.model.Layout;
60 import com.liferay.portal.model.Portlet;
61 import com.liferay.portal.model.PortletPreferencesIds;
62 import com.liferay.portal.model.User;
63 import com.liferay.portal.service.GroupLocalServiceUtil;
64 import com.liferay.portal.service.LayoutLocalServiceUtil;
65 import com.liferay.portal.service.PortletLocalServiceUtil;
66 import com.liferay.portal.service.PortletPreferencesLocalServiceUtil;
67 import com.liferay.portal.service.UserLocalServiceUtil;
68 import com.liferay.portal.theme.ThemeDisplay;
69 import com.liferay.portal.wsrp.util.WSRPUtil;
70 import com.liferay.portlet.ActionRequestFactory;
71 import com.liferay.portlet.ActionRequestImpl;
72 import com.liferay.portlet.ActionResponseImpl;
73 import com.liferay.portlet.InvokerPortlet;
74 import com.liferay.portlet.PortletConfigFactory;
75 import com.liferay.portlet.PortletInstanceFactory;
76 import com.liferay.portlet.PortletPreferencesFactoryUtil;
77 import com.liferay.portlet.RenderRequestFactory;
78 import com.liferay.portlet.RenderRequestImpl;
79 import com.liferay.portlet.RenderResponseImpl;
80
81
87 public class PortletInvokerImpl implements PortletInvoker {
88
89 public PortletInvokerImpl(Provider provider) {
90 _provider = provider;
91 }
92
93 public MarkupResponse invokeGetMarkup(GetMarkup getMarkup)
94 throws WSRPException {
95 String portletHandle = getMarkup.getPortletContext().getPortletHandle();
96
97 MarkupResponse markupResponse = new MarkupResponse();
98 MarkupContext markupContext = new MarkupContext();
99 markupResponse.setMarkupContext(markupContext);
100
101 try {
102 MarkupParams markupParams = getMarkup.getMarkupParams();
103
104 String wsrpWindowState = markupParams.getWindowState();
106 WindowState windowState = WSRPUtil
107 .fromWsrpWindowState(wsrpWindowState);
108
109 String wsrpMode = markupParams.getMode();
111 PortletMode mode = WSRPUtil.fromWsrpMode(wsrpMode);
112
113 ServletContext ctx = WSRPUtil.getServletContext();
114 long companyId = WSRPUtil.getCompanyId();
115
116 Portlet portlet = PortletLocalServiceUtil.getPortletById(companyId,
117 portletHandle);
118 InvokerPortlet invokerPortlet = PortletInstanceFactory.create(portlet,
119 ctx);
120 PortletConfig portletConfig = PortletConfigFactory.create(portlet,
121 ctx);
122 PortletContext portletCtx = portletConfig.getPortletContext();
123
124 Locale reqLocale = LocaleHelper
125 .getLocale(markupParams.getLocales()[0]);
126 String reqMimeType = markupParams.getMimeTypes()[0];
127 Map renderParameters = _getRenderParameters(markupParams);
128 HttpServletRequest httpReq = new WSRPServletRequest(WSRPUtil
129 .getHttpServletRequest(), reqLocale, reqMimeType,
130 renderParameters);
131
132 ThemeDisplay themeDisplay =
133 (ThemeDisplay)httpReq.getAttribute(WebKeys.THEME_DISPLAY);
134
135 themeDisplay.setLifecycle("0");
136 themeDisplay.setLifecycleAction(false);
137 themeDisplay.setLifecycleRender(true);
138 themeDisplay.setLifecycleResource(false);
139
140 PortletPreferencesIds portletPreferencesIds =
141 PortletPreferencesFactoryUtil.getPortletPreferencesIds(
142 httpReq, portlet.getPortletId());
143 PortletPreferences portletPreferences =
144 PortletPreferencesLocalServiceUtil.getPreferences(
145 portletPreferencesIds);
146
147 User user = UserLocalServiceUtil.getDefaultUser(companyId);
149 Layout layout = _getDefaultUserLayout(user.getCompanyId());
150
151 RenderRequestImpl renderRequest = RenderRequestFactory.create(
152 httpReq, portlet, invokerPortlet, portletCtx, windowState,
153 mode, portletPreferences, layout.getPlid());
154 WSRPServletResponse res = new WSRPServletResponse();
155
156 RenderResponseImpl renderResponse = new WSRPRenderResponseImpl(
157 getMarkup, _provider, (RenderRequestImpl) renderRequest,
158 res, portlet.getPortletId(), companyId,
159 layout.getPlid());
160 renderResponse.setContentType("text/html");
161 renderRequest.defineObjects(portletConfig, renderResponse);
162 invokerPortlet.render(renderRequest, renderResponse);
163 markupContext.setMarkupString(res.getString());
164 String contentType = renderResponse.getContentType();
165 if (contentType == null) {
166 contentType = ContentTypes.TEXT_HTML_UTF8;
167 }
168 markupContext.setMimeType(contentType);
169 markupContext.setLocale(renderResponse.getLocale().getLanguage());
170 markupContext.setPreferredTitle(renderResponse.getTitle());
171
172 RenderRequestFactory.recycle(renderRequest);
173 }
174 catch (Exception e) {
175 e.printStackTrace();
176 }
177
178 return markupResponse;
179 }
180
181 public BlockingInteractionResponse invokePerformBlockingInteraction(
182 PerformBlockingInteraction pbo) throws WSRPException {
183 String portletHandle = pbo.getPortletContext().getPortletHandle();
184
185 BlockingInteractionResponse bir = new BlockingInteractionResponse();
186 UpdateResponse updateRes = new UpdateResponse();
187 bir.setUpdateResponse(updateRes);
188
189 try {
190 MarkupParams markupParams = pbo.getMarkupParams();
191
192 String wsrpWindowState = markupParams.getWindowState();
194 WindowState windowState = WSRPUtil
195 .fromWsrpWindowState(wsrpWindowState);
196
197 String wsrpMode = markupParams.getMode();
199 PortletMode mode = WSRPUtil.fromWsrpMode(wsrpMode);
200
201 ServletContext ctx = WSRPUtil.getServletContext();
202 long companyId = WSRPUtil.getCompanyId();
203
204 Portlet portlet = PortletLocalServiceUtil.getPortletById(companyId,
205 portletHandle);
206 InvokerPortlet invokerPortlet = PortletInstanceFactory.create(portlet,
207 ctx);
208 PortletConfig portletConfig = PortletConfigFactory.create(portlet,
209 ctx);
210 PortletContext portletCtx = portletConfig.getPortletContext();
211
212 Locale reqLocale = LocaleHelper
213 .getLocale(markupParams.getLocales()[0]);
214 String reqMimeType = markupParams.getMimeTypes()[0];
215 InteractionParams interactionParams = pbo.getInteractionParams();
216 Map actionParameters = _getActionParameters(interactionParams);
217 HttpServletRequest httpReq = new WSRPServletRequest(WSRPUtil
218 .getHttpServletRequest(), reqLocale, reqMimeType,
219 actionParameters);
220
221 ThemeDisplay themeDisplay =
222 (ThemeDisplay)httpReq.getAttribute(WebKeys.THEME_DISPLAY);
223
224 themeDisplay.setLifecycle("0");
225 themeDisplay.setLifecycleAction(false);
226 themeDisplay.setLifecycleRender(true);
227 themeDisplay.setLifecycleResource(false);
228
229 PortletPreferencesIds portletPreferencesIds =
230 PortletPreferencesFactoryUtil.getPortletPreferencesIds(
231 httpReq, portlet.getPortletId());
232 PortletPreferences portletPreferences =
233 PortletPreferencesLocalServiceUtil.getPreferences(
234 portletPreferencesIds);
235
236 User user = UserLocalServiceUtil.getDefaultUser(companyId);
238 Layout layout = _getDefaultUserLayout(user.getCompanyId());
239
240 ActionRequestImpl actionRequest = ActionRequestFactory.create(httpReq,
241 portlet, invokerPortlet, portletCtx, windowState, mode,
242 portletPreferences, layout.getPlid());
243 WSRPServletResponse res = new WSRPServletResponse();
244
245 ActionResponseImpl actionResponse = new WSRPActionResponseImpl(pbo,
246 _provider, actionRequest, res, portlet.getPortletId(),
247 user, layout, windowState, mode);
248
249 invokerPortlet.processAction(actionRequest, actionResponse);
250 String newNavState = null;
251
252 Map renderParams = _getRenderParameters(httpReq, actionResponse);
253 newNavState = Base64.encode(ObjectSerializer.serialize(renderParams));
254
255 updateRes.setNavigationalState(newNavState);
256
257 ActionRequestFactory.recycle(actionRequest);
258 }
259 catch (Exception e) {
260 e.printStackTrace();
261 }
262
263 return bir;
264 }
265
266 private Map _getActionParameters(InteractionParams interactionParams) {
267 Map actionParams = _getParameters(interactionParams
268 .getInteractionState());
269
270 Map formParams = _getFormParameters(interactionParams
271 .getFormParameters());
272
273 actionParams.putAll(formParams);
274
275 return actionParams;
276 }
277
278 private Layout _getDefaultUserLayout(long companyId)
279 throws PortalException, SystemException {
280
281 Group group = GroupLocalServiceUtil.getGroup(
282 companyId, GroupConstants.GUEST);
283
284 long plid = LayoutLocalServiceUtil.getDefaultPlid(
285 group.getGroupId(), false);
286
287 return LayoutLocalServiceUtil.getLayout(plid);
288 }
289
290 private static Map _getFormParameters(NamedString[] params) {
291 Map formParameters = new HashMap();
292
293 if (params != null) {
294 for (int i = 0; i < params.length; i++) {
295 String parameterName = params[i].getName();
296
297 if (formParameters.containsKey(parameterName)) {
298 String[] currentValues = (String[]) formParameters
300 .get(parameterName);
301 String[] newValues = new String[currentValues.length + 1];
302 System.arraycopy(currentValues, 0, newValues, 0,
303 currentValues.length);
304 newValues[currentValues.length] = params[i].getValue();
305 formParameters.put(parameterName, newValues);
306 }
307 else {
308 String[] values = { params[i].getValue() };
309 formParameters.put(parameterName, values);
310 }
311 }
312 }
313
314 return formParameters;
315 }
316
317 private Map _getParameters(String paramString) {
318 Map navParams = new HashMap();
319
320 if (paramString != null) {
321 byte[] desMap = Base64.decode(paramString);
322
323 Map naviState = null;
324
325 try {
326 naviState = ObjectDeserializer.deserializeMap(desMap);
327 }
328 catch (IOException iox) {
329 }
330 catch (ClassNotFoundException classNotFoundEx) {
331 }
332
333 if (naviState != null) {
334 navParams.putAll(naviState);
335 }
336 }
337
338 return navParams;
339 }
340
341 private Map _getRenderParameters(MarkupParams markupParams) {
342 return _getParameters(markupParams.getNavigationalState());
343 }
344
345 private Map _getRenderParameters(HttpServletRequest req, ActionResponseImpl res) {
346 Map params = new HashMap();
347 params.putAll(res.getRenderParameterMap());
348
349 String[] plid = req.getParameterValues("p_l_id");
350 params.put("p_l_id", plid);
351
352 String[] portletName = req.getParameterValues("p_p_id");
353 params.put("p_p_id", portletName);
354
355 String[] lifecycle = {"0"};
356 params.put("p_p_lifecycle", lifecycle);
357
358 String[] windowState = req.getParameterValues("p_p_state");
359 params.put("p_p_state", windowState);
360
361 String[] portletMode = req.getParameterValues("p_p_mode");
362 params.put("p_p_mode", portletMode);
363
364 return params;
365 }
366
367 private Provider _provider;
368
369 }