1   /**
2    * Copyright (c) 2000-2007 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 com.liferay.portal.PortalException;
26  import com.liferay.portal.SystemException;
27  import com.liferay.portal.kernel.util.ContentTypes;
28  import com.liferay.portal.model.Group;
29  import com.liferay.portal.model.Layout;
30  import com.liferay.portal.model.Portlet;
31  import com.liferay.portal.model.PortletPreferencesIds;
32  import com.liferay.portal.model.User;
33  import com.liferay.portal.model.impl.GroupImpl;
34  import com.liferay.portal.service.GroupLocalServiceUtil;
35  import com.liferay.portal.service.LayoutLocalServiceUtil;
36  import com.liferay.portal.service.PortletLocalServiceUtil;
37  import com.liferay.portal.service.PortletPreferencesLocalServiceUtil;
38  import com.liferay.portal.service.UserLocalServiceUtil;
39  import com.liferay.portal.wsrp.util.WSRPUtil;
40  import com.liferay.portlet.ActionRequestFactory;
41  import com.liferay.portlet.ActionRequestImpl;
42  import com.liferay.portlet.ActionResponseImpl;
43  import com.liferay.portlet.CachePortlet;
44  import com.liferay.portlet.PortletConfigFactory;
45  import com.liferay.portlet.PortletInstanceFactory;
46  import com.liferay.portlet.PortletPreferencesFactoryUtil;
47  import com.liferay.portlet.RenderRequestFactory;
48  import com.liferay.portlet.RenderRequestImpl;
49  import com.liferay.portlet.RenderResponseImpl;
50  
51  import java.io.IOException;
52  
53  import java.util.HashMap;
54  import java.util.Locale;
55  import java.util.Map;
56  
57  import javax.portlet.PortletConfig;
58  import javax.portlet.PortletContext;
59  import javax.portlet.PortletMode;
60  import javax.portlet.PortletPreferences;
61  import javax.portlet.WindowState;
62  
63  import javax.servlet.ServletContext;
64  import javax.servlet.http.HttpServletRequest;
65  
66  import oasis.names.tc.wsrp.v1.types.BlockingInteractionResponse;
67  import oasis.names.tc.wsrp.v1.types.GetMarkup;
68  import oasis.names.tc.wsrp.v1.types.InteractionParams;
69  import oasis.names.tc.wsrp.v1.types.MarkupContext;
70  import oasis.names.tc.wsrp.v1.types.MarkupParams;
71  import oasis.names.tc.wsrp.v1.types.MarkupResponse;
72  import oasis.names.tc.wsrp.v1.types.NamedString;
73  import oasis.names.tc.wsrp.v1.types.PerformBlockingInteraction;
74  import oasis.names.tc.wsrp.v1.types.UpdateResponse;
75  
76  import org.apache.wsrp4j.exception.WSRPException;
77  import org.apache.wsrp4j.producer.provider.PortletInvoker;
78  import org.apache.wsrp4j.producer.provider.Provider;
79  import org.apache.wsrp4j.producer.util.Base64;
80  import org.apache.wsrp4j.producer.util.ObjectDeserializer;
81  import org.apache.wsrp4j.producer.util.ObjectSerializer;
82  import org.apache.wsrp4j.util.LocaleHelper;
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             CachePortlet cachePortlet = PortletInstanceFactory.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             PortletPreferencesIds portletPreferencesIds =
135                 PortletPreferencesFactoryUtil.getPortletPreferencesIds(
136                     httpReq, portlet.getPortletId());
137             PortletPreferences portletPreferences =
138                 PortletPreferencesLocalServiceUtil.getPreferences(
139                     portletPreferencesIds);
140 
141             // this gets the default layout of the general guest
142             User user = UserLocalServiceUtil.getDefaultUser(companyId);
143             Layout layout = _getDefaultUserLayout(user.getCompanyId());
144 
145             RenderRequestImpl renderRequest = RenderRequestFactory.create(httpReq,
146                     portlet, cachePortlet, portletCtx, windowState, mode,
147                     portletPreferences, layout.getPlid());
148             WSRPServletResponse res = new WSRPServletResponse();
149 
150             RenderResponseImpl renderResponse = new WSRPRenderResponseImpl(
151                     getMarkup, _provider, (RenderRequestImpl) renderRequest,
152                     res, portlet.getPortletId(), companyId,
153                     layout.getPlid());
154             renderResponse.setContentType("text/html");
155             renderRequest.defineObjects(portletConfig, renderResponse);
156             cachePortlet.render(renderRequest, renderResponse);
157             markupContext.setMarkupString(res.getString());
158             String contentType = renderResponse.getContentType();
159             if (contentType == null) {
160                 contentType = ContentTypes.TEXT_HTML_UTF8;
161             }
162             markupContext.setMimeType(contentType);
163             markupContext.setLocale(renderResponse.getLocale().getLanguage());
164             markupContext.setPreferredTitle(renderResponse.getTitle());
165 
166             RenderRequestFactory.recycle(renderRequest);
167         }
168         catch (Exception e) {
169             e.printStackTrace();
170         }
171 
172         return markupResponse;
173     }
174 
175     public BlockingInteractionResponse invokePerformBlockingInteraction(
176             PerformBlockingInteraction pbo) throws WSRPException {
177         String portletHandle = pbo.getPortletContext().getPortletHandle();
178 
179         BlockingInteractionResponse bir = new BlockingInteractionResponse();
180         UpdateResponse updateRes = new UpdateResponse();
181         bir.setUpdateResponse(updateRes);
182 
183         try {
184             MarkupParams markupParams = pbo.getMarkupParams();
185 
186             // window state
187             String wsrpWindowState = markupParams.getWindowState();
188             WindowState windowState = WSRPUtil
189                     .fromWsrpWindowState(wsrpWindowState);
190 
191             // portlet mode
192             String wsrpMode = markupParams.getMode();
193             PortletMode mode = WSRPUtil.fromWsrpMode(wsrpMode);
194 
195             ServletContext ctx = WSRPUtil.getServletContext();
196             long companyId = WSRPUtil.getCompanyId();
197 
198             Portlet portlet = PortletLocalServiceUtil.getPortletById(companyId,
199                     portletHandle);
200             CachePortlet cachePortlet = PortletInstanceFactory.create(portlet,
201                 ctx);
202             PortletConfig portletConfig = PortletConfigFactory.create(portlet,
203                 ctx);
204             PortletContext portletCtx = portletConfig.getPortletContext();
205 
206             Locale reqLocale = LocaleHelper
207                     .getLocale(markupParams.getLocales()[0]);
208             String reqMimeType = markupParams.getMimeTypes()[0];
209             InteractionParams interactionParams = pbo.getInteractionParams();
210             Map actionParameters = _getActionParameters(interactionParams);
211             HttpServletRequest httpReq = new WSRPServletRequest(WSRPUtil
212                     .getHttpServletRequest(), reqLocale, reqMimeType,
213                     actionParameters);
214             PortletPreferencesIds portletPreferencesIds =
215                 PortletPreferencesFactoryUtil.getPortletPreferencesIds(
216                     httpReq, portlet.getPortletId());
217             PortletPreferences portletPreferences =
218                 PortletPreferencesLocalServiceUtil.getPreferences(
219                     portletPreferencesIds);
220 
221             // this gets the default layout of the general guest
222             User user = UserLocalServiceUtil.getDefaultUser(companyId);
223             Layout layout = _getDefaultUserLayout(user.getCompanyId());
224 
225             ActionRequestImpl actionRequest = ActionRequestFactory.create(httpReq,
226                     portlet, cachePortlet, portletCtx, windowState, mode,
227                     portletPreferences, layout.getPlid());
228             WSRPServletResponse res = new WSRPServletResponse();
229 
230             ActionResponseImpl actionResponse = new WSRPActionResponseImpl(pbo,
231                     _provider, actionRequest, res, portlet.getPortletId(),
232                     user, layout, windowState, mode);
233 
234             cachePortlet.processAction(actionRequest, actionResponse);
235             String newNavState = null;
236 
237             Map renderParams = _getRenderParameters(httpReq, actionResponse);
238             newNavState = Base64.encode(ObjectSerializer.serialize(renderParams));
239 
240             updateRes.setNavigationalState(newNavState);
241 
242             ActionRequestFactory.recycle(actionRequest);
243         }
244         catch (Exception e) {
245             e.printStackTrace();
246         }
247 
248         return bir;
249     }
250 
251     private Map _getActionParameters(InteractionParams interactionParams) {
252         Map actionParams = _getParameters(interactionParams
253                 .getInteractionState());
254 
255         Map formParams = _getFormParameters(interactionParams
256                 .getFormParameters());
257 
258         actionParams.putAll(formParams);
259 
260         return actionParams;
261     }
262 
263     private Layout _getDefaultUserLayout(long companyId)
264         throws PortalException, SystemException {
265 
266         Group group = GroupLocalServiceUtil.getGroup(
267             companyId, GroupImpl.GUEST);
268 
269         long plid = LayoutLocalServiceUtil.getDefaultPlid(
270             group.getGroupId(), false);
271 
272         return LayoutLocalServiceUtil.getLayout(plid);
273     }
274 
275     private static Map _getFormParameters(NamedString[] params) {
276         Map formParameters = new HashMap();
277 
278         if (params != null) {
279             for (int i = 0; i < params.length; i++) {
280                 String parameterName = params[i].getName();
281 
282                 if (formParameters.containsKey(parameterName)) {
283                     // Handle case in which parameter name has multiple values
284                     String[] currentValues = (String[]) formParameters
285                             .get(parameterName);
286                     String[] newValues = new String[currentValues.length + 1];
287                     System.arraycopy(currentValues, 0, newValues, 0,
288                             currentValues.length);
289                     newValues[currentValues.length] = params[i].getValue();
290                     formParameters.put(parameterName, newValues);
291                 }
292                 else {
293                     String[] values = { params[i].getValue() };
294                     formParameters.put(parameterName, values);
295                 }
296             }
297         }
298 
299         return formParameters;
300     }
301 
302     private Map _getParameters(String paramString) {
303         Map navParams = new HashMap();
304 
305         if (paramString != null) {
306             byte[] desMap = Base64.decode(paramString);
307 
308             Map naviState = null;
309 
310             try {
311                 naviState = ObjectDeserializer.deserializeMap(desMap);
312             }
313             catch (IOException iox) {
314             }
315             catch (ClassNotFoundException classNotFoundEx) {
316             }
317 
318             if (naviState != null) {
319                 navParams.putAll(naviState);
320             }
321         }
322 
323         return navParams;
324     }
325 
326     private Map _getRenderParameters(MarkupParams markupParams) {
327         return _getParameters(markupParams.getNavigationalState());
328     }
329 
330     private Map _getRenderParameters(HttpServletRequest req, ActionResponseImpl res) {
331         Map params = new HashMap();
332         params.putAll(res.getRenderParameters());
333 
334         String[] plid = req.getParameterValues("p_l_id");
335         params.put("p_l_id", plid);
336 
337         String[] portletName = req.getParameterValues("p_p_id");
338         params.put("p_p_id", portletName);
339 
340         String[] action = {"0"};
341         params.put("p_p_action", action);
342 
343         String[] windowState = req.getParameterValues("p_p_state");
344         params.put("p_p_state", windowState);
345 
346         String[] portletMode = req.getParameterValues("p_p_mode");
347         params.put("p_p_mode", portletMode);
348 
349         return params;
350     }
351 
352     private Provider _provider;
353 
354 }