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