1
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
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 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 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 String wsrpWindowState = markupParams.getWindowState();
188 WindowState windowState = WSRPUtil
189 .fromWsrpWindowState(wsrpWindowState);
190
191 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 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 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 }