1   /**
2    * Copyright (c) 2000-2009 Liferay, Inc. All rights reserved.
3    *
4    * The contents of this file are subject to the terms of the Liferay Enterprise
5    * Subscription License ("License"). You may not use this file except in
6    * compliance with the License. You can obtain a copy of the License by
7    * contacting Liferay, Inc. See the License for the specific language governing
8    * permissions and limitations under the License, including but not limited to
9    * distribution rights of the Software.
10   *
11   * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
12   * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
13   * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
14   * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
15   * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
16   * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
17   * SOFTWARE.
18   */
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  /**
82   * <a href="PortletInvokerImpl.java.html"><b><i>View Source</i></b></a>
83   *
84   * @author Michael Young
85   *
86   */
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             // window state
105             String wsrpWindowState = markupParams.getWindowState();
106             WindowState windowState = WSRPUtil
107                     .fromWsrpWindowState(wsrpWindowState);
108 
109             // portlet mode
110             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             // this gets the default layout of the general guest
148             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             // window state
193             String wsrpWindowState = markupParams.getWindowState();
194             WindowState windowState = WSRPUtil
195                     .fromWsrpWindowState(wsrpWindowState);
196 
197             // portlet mode
198             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             // this gets the default layout of the general guest
237             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                     // Handle case in which parameter name has multiple values
299                     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 }