1   /**
2    * Copyright (c) 2000-2008 Liferay, Inc. All rights reserved.
3    *
4    * Permission is hereby granted, free of charge, to any person obtaining a copy
5    * of this software and associated documentation files (the "Software"), to deal
6    * in the Software without restriction, including without limitation the rights
7    * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
8    * copies of the Software, and to permit persons to whom the Software is
9    * furnished to do so, subject to the following conditions:
10   *
11   * The above copyright notice and this permission notice shall be included in
12   * all copies or substantial portions of the Software.
13   *
14   * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15   * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16   * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
17   * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
18   * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
19   * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
20   * SOFTWARE.
21   */
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  /**
85   * <a href="PortletInvokerImpl.java.html"><b><i>View Source</i></b></a>
86   *
87   * @author Michael Young
88   *
89   */
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             // window state
108             String wsrpWindowState = markupParams.getWindowState();
109             WindowState windowState = WSRPUtil
110                     .fromWsrpWindowState(wsrpWindowState);
111 
112             // portlet mode
113             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             // this gets the default layout of the general guest
151             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             // window state
194             String wsrpWindowState = markupParams.getWindowState();
195             WindowState windowState = WSRPUtil
196                     .fromWsrpWindowState(wsrpWindowState);
197 
198             // portlet mode
199             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             // this gets the default layout of the general guest
238             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                     // Handle case in which parameter name has multiple values
298                     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 }