1
22
23 package com.liferay.portal.action;
24
25 import com.liferay.portal.kernel.language.LanguageUtil;
26 import com.liferay.portal.kernel.log.Log;
27 import com.liferay.portal.kernel.log.LogFactoryUtil;
28 import com.liferay.portal.kernel.portlet.PortletModeFactory;
29 import com.liferay.portal.kernel.portlet.WindowStateFactory;
30 import com.liferay.portal.kernel.servlet.BrowserSnifferUtil;
31 import com.liferay.portal.kernel.servlet.HttpHeaders;
32 import com.liferay.portal.kernel.servlet.StringServletResponse;
33 import com.liferay.portal.kernel.upload.UploadServletRequest;
34 import com.liferay.portal.kernel.util.ContentTypes;
35 import com.liferay.portal.kernel.util.HttpUtil;
36 import com.liferay.portal.kernel.util.JavaConstants;
37 import com.liferay.portal.kernel.util.MapUtil;
38 import com.liferay.portal.kernel.util.ParamUtil;
39 import com.liferay.portal.kernel.util.StringPool;
40 import com.liferay.portal.kernel.util.Validator;
41 import com.liferay.portal.kernel.xml.QName;
42 import com.liferay.portal.model.Layout;
43 import com.liferay.portal.model.LayoutConstants;
44 import com.liferay.portal.model.LayoutTypePortlet;
45 import com.liferay.portal.model.Portlet;
46 import com.liferay.portal.model.PortletPreferencesIds;
47 import com.liferay.portal.model.User;
48 import com.liferay.portal.service.LayoutLocalServiceUtil;
49 import com.liferay.portal.service.PortletLocalServiceUtil;
50 import com.liferay.portal.service.PortletPreferencesLocalServiceUtil;
51 import com.liferay.portal.service.permission.PortletPermissionUtil;
52 import com.liferay.portal.struts.ActionConstants;
53 import com.liferay.portal.struts.StrutsUtil;
54 import com.liferay.portal.theme.PortletDisplay;
55 import com.liferay.portal.theme.ThemeDisplay;
56 import com.liferay.portal.upload.UploadServletRequestImpl;
57 import com.liferay.portal.util.PortalUtil;
58 import com.liferay.portal.util.PropsValues;
59 import com.liferay.portal.util.WebKeys;
60 import com.liferay.portlet.ActionRequestFactory;
61 import com.liferay.portlet.ActionRequestImpl;
62 import com.liferay.portlet.ActionResponseFactory;
63 import com.liferay.portlet.ActionResponseImpl;
64 import com.liferay.portlet.EventRequestFactory;
65 import com.liferay.portlet.EventRequestImpl;
66 import com.liferay.portlet.EventResponseFactory;
67 import com.liferay.portlet.EventResponseImpl;
68 import com.liferay.portlet.InvokerPortlet;
69 import com.liferay.portlet.InvokerPortletImpl;
70 import com.liferay.portlet.PortletConfigFactory;
71 import com.liferay.portlet.PortletConfigImpl;
72 import com.liferay.portlet.PortletInstanceFactoryUtil;
73 import com.liferay.portlet.PortletPreferencesFactoryUtil;
74 import com.liferay.portlet.PortletRequestImpl;
75 import com.liferay.portlet.PortletURLImpl;
76 import com.liferay.portlet.RenderParametersPool;
77 import com.liferay.portlet.RenderRequestImpl;
78 import com.liferay.portlet.RenderResponseImpl;
79 import com.liferay.portlet.ResourceRequestFactory;
80 import com.liferay.portlet.ResourceRequestImpl;
81 import com.liferay.portlet.ResourceResponseFactory;
82 import com.liferay.portlet.ResourceResponseImpl;
83 import com.liferay.portlet.StateAwareResponseImpl;
84 import com.liferay.portlet.login.util.LoginUtil;
85 import com.liferay.util.servlet.ServletResponseUtil;
86
87 import java.io.ByteArrayInputStream;
88 import java.io.InputStream;
89
90 import java.util.ArrayList;
91 import java.util.HashMap;
92 import java.util.List;
93 import java.util.Map;
94
95 import javax.portlet.Event;
96 import javax.portlet.PortletConfig;
97 import javax.portlet.PortletContext;
98 import javax.portlet.PortletException;
99 import javax.portlet.PortletMode;
100 import javax.portlet.PortletPreferences;
101 import javax.portlet.PortletRequest;
102 import javax.portlet.PortletURL;
103 import javax.portlet.UnavailableException;
104 import javax.portlet.WindowState;
105
106 import javax.servlet.RequestDispatcher;
107 import javax.servlet.ServletContext;
108 import javax.servlet.http.HttpServletRequest;
109 import javax.servlet.http.HttpServletResponse;
110 import javax.servlet.http.HttpSession;
111
112 import org.apache.struts.action.Action;
113 import org.apache.struts.action.ActionForm;
114 import org.apache.struts.action.ActionForward;
115 import org.apache.struts.action.ActionMapping;
116
117
122 public class LayoutAction extends Action {
123
124 public ActionForward execute(
125 ActionMapping mapping, ActionForm form, HttpServletRequest request,
126 HttpServletResponse response)
127 throws Exception {
128
129 ThemeDisplay themeDisplay = (ThemeDisplay)request.getAttribute(
130 WebKeys.THEME_DISPLAY);
131
132 Layout layout = themeDisplay.getLayout();
133
134 Boolean layoutDefault = (Boolean)request.getAttribute(
135 WebKeys.LAYOUT_DEFAULT);
136
137 if ((layoutDefault != null) && (layoutDefault.booleanValue())) {
138 Layout requestedLayout = (Layout)request.getAttribute(
139 WebKeys.REQUESTED_LAYOUT);
140
141 if (requestedLayout != null) {
142 String redirectParam = "redirect";
143
144 String authLoginURL = PortalUtil.getCommunityLoginURL(
145 themeDisplay);
146
147 if (Validator.isNull(authLoginURL)) {
148 authLoginURL = PropsValues.AUTH_LOGIN_URL;
149 }
150
151 if (Validator.isNotNull(PropsValues.AUTH_LOGIN_PORTLET_NAME) &&
152 Validator.isNotNull(authLoginURL)) {
153
154 redirectParam =
155 PortalUtil.getPortletNamespace(
156 PropsValues.AUTH_LOGIN_PORTLET_NAME) +
157 redirectParam;
158 }
159
160 String url = PortalUtil.getLayoutURL(
161 requestedLayout, themeDisplay);
162
163 PortletURL loginURL = LoginUtil.getLoginURL(
164 request, themeDisplay.getPlid());
165
166 loginURL.setParameter(redirectParam, url);
167
168 String redirect = loginURL.toString();
169
170 if (_log.isDebugEnabled()) {
171 _log.debug("Redirect requested layout to " + redirect);
172 }
173
174 response.sendRedirect(redirect);
175 }
176 else {
177 String redirect = PortalUtil.getLayoutURL(layout, themeDisplay);
178
179 if (_log.isDebugEnabled()) {
180 _log.debug("Redirect default layout to " + redirect);
181 }
182
183 response.sendRedirect(redirect);
184 }
185
186 return null;
187 }
188
189 long plid = ParamUtil.getLong(request, "p_l_id");
190
191 if (_log.isDebugEnabled()) {
192 _log.debug("p_l_id is " + plid);
193 }
194
195 if (plid > 0) {
196 return processLayout(mapping, request, response, plid);
197 }
198 else {
199 try {
200 forwardLayout(request);
201
202 return mapping.findForward(ActionConstants.COMMON_FORWARD_JSP);
203 }
204 catch (Exception e) {
205 PortalUtil.sendError(e, request, response);
206
207 return null;
208 }
209 }
210 }
211
212 protected void forwardLayout(HttpServletRequest request) throws Exception {
213 Layout layout = (Layout)request.getAttribute(WebKeys.LAYOUT);
214
215 long plid = LayoutConstants.DEFAULT_PLID;
216
217 String layoutFriendlyURL = null;
218
219 ThemeDisplay themeDisplay = (ThemeDisplay)request.getAttribute(
220 WebKeys.THEME_DISPLAY);
221
222 if (layout != null) {
223 plid = layout.getPlid();
224
225 layoutFriendlyURL = PortalUtil.getLayoutFriendlyURL(
226 layout, themeDisplay);
227 }
228
229 String forwardURL = layoutFriendlyURL;
230
231 if (Validator.isNull(forwardURL)) {
232 forwardURL =
233 themeDisplay.getPathMain() + "/portal/layout?p_l_id=" + plid;
234
235 if (Validator.isNotNull(themeDisplay.getDoAsUserId())) {
236 forwardURL = HttpUtil.addParameter(
237 forwardURL, "doAsUserId", themeDisplay.getDoAsUserId());
238 }
239
240 if (Validator.isNotNull(themeDisplay.getDoAsUserLanguageId())) {
241 forwardURL = HttpUtil.addParameter(
242 forwardURL, "doAsUserLanguageId",
243 themeDisplay.getDoAsUserLanguageId());
244 }
245 }
246
247 if (_log.isDebugEnabled()) {
248 _log.debug("Forward layout to " + forwardURL);
249 }
250
251 request.setAttribute(WebKeys.FORWARD_URL, forwardURL);
252 }
253
254 protected List<Portlet> getLayoutSetPortlets(
255 long groupId, boolean privateLayout)
256 throws Exception {
257
258 List<Portlet> portlets = new ArrayList<Portlet>();
259
260 List<Layout> layouts = LayoutLocalServiceUtil.getLayouts(
261 groupId, privateLayout, LayoutConstants.TYPE_PORTLET);
262
263 for (Layout layout : layouts) {
264 if (!layout.getType().equals(LayoutConstants.TYPE_PORTLET)) {
265 continue;
266 }
267
268 LayoutTypePortlet layoutTypePortlet =
269 (LayoutTypePortlet)layout.getLayoutType();
270
271 portlets.addAll(layoutTypePortlet.getPortlets());
272 }
273
274 return portlets;
275 }
276
277 protected void includeLayoutContent(
278 HttpServletRequest request, HttpServletResponse response,
279 ThemeDisplay themeDisplay, Layout layout)
280 throws Exception {
281
282 ServletContext servletContext = (ServletContext)request.getAttribute(
283 WebKeys.CTX);
284
285 String path = StrutsUtil.TEXT_HTML_DIR;
286
287 if (BrowserSnifferUtil.isWap(request)) {
288 path = StrutsUtil.TEXT_WAP_DIR;
289 }
290
291
293 if (themeDisplay.isStateExclusive() ||
294 Validator.isNotNull(ParamUtil.getString(request, "p_p_id"))) {
295
296 if (layout.getType().equals(LayoutConstants.TYPE_PANEL)) {
297 path += "/portal/layout/view/panel.jsp";
298 }
299 else if (layout.getType().equals(
300 LayoutConstants.TYPE_CONTROL_PANEL)) {
301
302 path += "/portal/layout/view/control_panel.jsp";
303 }
304 else {
305 path += "/portal/layout/view/portlet.jsp";
306 }
307 }
308 else {
309 path += PortalUtil.getLayoutViewPage(layout);
310 }
311
312 RequestDispatcher requestDispatcher =
313 servletContext.getRequestDispatcher(path);
314
315 StringServletResponse stringResponse = new StringServletResponse(
316 response);
317
318 requestDispatcher.include(request, stringResponse);
319
320 request.setAttribute(
321 WebKeys.LAYOUT_CONTENT, stringResponse.getString());
322 }
323
324 protected void processEvent(
325 PortletRequestImpl portletRequestImpl,
326 StateAwareResponseImpl stateAwareResponseImpl, Portlet portlet,
327 List<Portlet> portlets, Event event)
328 throws Exception {
329
330 HttpServletRequest request = portletRequestImpl.getHttpServletRequest();
331 HttpServletResponse response =
332 stateAwareResponseImpl.getHttpServletResponse();
333 HttpSession session = request.getSession();
334
335 String portletId = portlet.getPortletId();
336
337 ServletContext servletContext =
338 (ServletContext)request.getAttribute(WebKeys.CTX);
339
340 InvokerPortlet invokerPortlet = PortletInstanceFactoryUtil.create(
341 portlet, servletContext);
342
343 PortletConfig portletConfig = PortletConfigFactory.create(
344 portlet, servletContext);
345 PortletContext portletContext = portletConfig.getPortletContext();
346
347 WindowState windowState = portletRequestImpl.getWindowState();
348 PortletMode portletMode = portletRequestImpl.getPortletMode();
349
350 User user = stateAwareResponseImpl.getUser();
351 Layout layout = stateAwareResponseImpl.getLayout();
352
353 PortletPreferences portletPreferences =
354 portletRequestImpl.getPreferencesImpl();
355
356 EventRequestImpl eventRequestImpl = EventRequestFactory.create(
357 request, portlet, invokerPortlet, portletContext, windowState,
358 portletMode, portletPreferences, layout.getPlid());
359
360 eventRequestImpl.setEvent(event);
361
362 EventResponseImpl eventResponseImpl = EventResponseFactory.create(
363 eventRequestImpl, response, portletId, user, layout, windowState,
364 portletMode);
365
366 eventRequestImpl.defineObjects(portletConfig, eventResponseImpl);
367
368 try {
369 try {
370 InvokerPortletImpl.clearResponse(
371 session, layout.getPrimaryKey(), portletId,
372 LanguageUtil.getLanguageId(eventRequestImpl));
373
374 invokerPortlet.processEvent(
375 eventRequestImpl, eventResponseImpl);
376
377 if (eventResponseImpl.isCalledSetRenderParameter()) {
378 Map<String, String[]> renderParameterMap =
379 new HashMap<String, String[]>();
380
381 MapUtil.copy(
382 eventResponseImpl.getRenderParameterMap(),
383 renderParameterMap);
384
385 RenderParametersPool.put(
386 request, layout.getPlid(), portletId,
387 renderParameterMap);
388 }
389 }
390 catch (UnavailableException ue) {
391 throw ue;
392 }
393 catch (PortletException pe) {
394 eventResponseImpl.setWindowState(windowState);
395 eventResponseImpl.setPortletMode(portletMode);
396 }
397
398 processEvents(eventRequestImpl, eventResponseImpl, portlets);
399 }
400 finally {
401 eventRequestImpl.cleanUp();
402 }
403 }
404
405 protected void processEvents(
406 PortletRequestImpl portletRequestImpl,
407 StateAwareResponseImpl stateAwareResponseImpl,
408 List<Portlet> portlets)
409 throws Exception {
410
411 List<Event> events = stateAwareResponseImpl.getEvents();
412
413 if (events.size() == 0) {
414 return;
415 }
416
417 for (Event event : events) {
418 javax.xml.namespace.QName qName = event.getQName();
419
420 for (Portlet portlet : portlets) {
421 QName processingQName = portlet.getProcessingEvent(
422 qName.getNamespaceURI(), qName.getLocalPart());
423
424 if (processingQName != null) {
425 processEvent(
426 portletRequestImpl, stateAwareResponseImpl, portlet,
427 portlets, event);
428 }
429 }
430 }
431 }
432
433 protected ActionForward processLayout(
434 ActionMapping mapping, HttpServletRequest request,
435 HttpServletResponse response, long plid)
436 throws Exception {
437
438 HttpSession session = request.getSession();
439
440 ThemeDisplay themeDisplay = (ThemeDisplay)request.getAttribute(
441 WebKeys.THEME_DISPLAY);
442
443 try {
444 Layout layout = themeDisplay.getLayout();
445
446 boolean resetLayout = ParamUtil.getBoolean(
447 request, "p_l_reset", PropsValues.LAYOUT_DEFAULT_P_L_RESET);
448
449 String portletId = ParamUtil.getString(request, "p_p_id");
450
451 Layout previousLayout = (Layout)session.getAttribute(
452 WebKeys.PREVIOUS_LAYOUT);
453
454 if ((previousLayout == null) ||
455 (layout.getPlid() != previousLayout.getPlid())) {
456
457 session.setAttribute(WebKeys.PREVIOUS_LAYOUT, layout);
458 }
459
460 if (!PropsValues.TCK_URL && resetLayout &&
461 (Validator.isNull(portletId) ||
462 ((previousLayout != null) &&
463 (layout.getPlid() != previousLayout.getPlid())))) {
464
465
468 RenderParametersPool.clear(request, plid);
469 }
470
471 if (themeDisplay.isLifecycleAction()) {
472 Portlet portlet = processPortletRequest(
473 request, response, PortletRequest.ACTION_PHASE);
474
475 if (portlet != null) {
476 ActionResponseImpl actionResponseImpl =
477 (ActionResponseImpl)request.getAttribute(
478 JavaConstants.JAVAX_PORTLET_RESPONSE);
479
480 String redirectLocation =
481 actionResponseImpl.getRedirectLocation();
482
483 if (Validator.isNotNull(redirectLocation)) {
484 response.sendRedirect(redirectLocation);
485
486 return null;
487 }
488
489 if (portlet.isActionURLRedirect()) {
490 redirectActionURL(
491 request, response, actionResponseImpl, portlet);
492
493 return null;
494 }
495 }
496 }
497 else if (themeDisplay.isLifecycleRender()) {
498 processPortletRequest(
499 request, response, PortletRequest.RENDER_PHASE);
500 }
501
502 if (themeDisplay.isLifecycleResource()) {
503 processPortletRequest(
504 request, response, PortletRequest.RESOURCE_PHASE);
505
506 return null;
507 }
508 else {
509 if (response.isCommitted()) {
510 return null;
511 }
512
513 if (layout != null) {
514
515
519 includeLayoutContent(
520 request, response, themeDisplay, layout);
521
522 if (themeDisplay.isStateExclusive()) {
523 renderExclusive(request, response, themeDisplay);
524
525 return null;
526 }
527 }
528
529 return mapping.findForward("portal.layout");
530 }
531 }
532 catch (Exception e) {
533 PortalUtil.sendError(e, request, response);
534
535 return null;
536 }
537 finally {
538 PortletRequest portletRequest =
539 (PortletRequest)request.getAttribute(
540 JavaConstants.JAVAX_PORTLET_REQUEST);
541
542 if (portletRequest != null) {
543 PortletRequestImpl portletRequestImpl =
544 (PortletRequestImpl)portletRequest;
545
546 portletRequestImpl.cleanUp();
547 }
548 }
549 }
550
551 protected Portlet processPortletRequest(
552 HttpServletRequest request, HttpServletResponse response,
553 String lifecycle)
554 throws Exception {
555
556 HttpSession session = request.getSession();
557
558 long companyId = PortalUtil.getCompanyId(request);
559 User user = PortalUtil.getUser(request);
560 Layout layout = (Layout)request.getAttribute(WebKeys.LAYOUT);
561
562 String portletId = ParamUtil.getString(request, "p_p_id");
563
564 if (Validator.isNull(portletId)) {
565 return null;
566 }
567
568 Portlet portlet = PortletLocalServiceUtil.getPortletById(
569 companyId, portletId);
570
571 if (portlet == null) {
572 return null;
573 }
574
575 ThemeDisplay themeDisplay = (ThemeDisplay)request.getAttribute(
576 WebKeys.THEME_DISPLAY);
577
578 themeDisplay.setScopeGroupId(
579 PortalUtil.getScopeGroupId(request, portletId));
580
581 ServletContext servletContext = (ServletContext)request.getAttribute(
582 WebKeys.CTX);
583
584 InvokerPortlet invokerPortlet = PortletInstanceFactoryUtil.create(
585 portlet, servletContext);
586
587 if (user != null) {
588 InvokerPortletImpl.clearResponse(
589 session, layout.getPrimaryKey(), portletId,
590 LanguageUtil.getLanguageId(request));
591 }
592
593 PortletConfig portletConfig = PortletConfigFactory.create(
594 portlet, servletContext);
595 PortletContext portletContext = portletConfig.getPortletContext();
596
597 WindowState windowState = WindowStateFactory.getWindowState(
598 ParamUtil.getString(request, "p_p_state"));
599
600 PortletMode portletMode = PortletModeFactory.getPortletMode(
601 ParamUtil.getString(request, "p_p_mode"));
602
603 PortletPreferencesIds portletPreferencesIds =
604 PortletPreferencesFactoryUtil.getPortletPreferencesIds(
605 request, portletId);
606
607 PortletPreferences portletPreferences =
608 PortletPreferencesLocalServiceUtil.getPreferences(
609 portletPreferencesIds);
610
611 if (lifecycle.equals(PortletRequest.ACTION_PHASE)) {
612 String contentType = request.getHeader(HttpHeaders.CONTENT_TYPE);
613
614 if (_log.isDebugEnabled()) {
615 _log.debug("Content type " + contentType);
616 }
617
618 UploadServletRequest uploadRequest = null;
619
620 try {
621 if ((contentType != null) &&
622 (contentType.startsWith(
623 ContentTypes.MULTIPART_FORM_DATA))) {
624
625 PortletConfigImpl invokerPortletConfigImpl =
626 (PortletConfigImpl)invokerPortlet.getPortletConfig();
627
628 if (invokerPortlet.isStrutsPortlet() ||
629 ((invokerPortletConfigImpl != null) &&
630 (!invokerPortletConfigImpl.isWARFile()))) {
631
632 uploadRequest = new UploadServletRequestImpl(request);
633
634 request = uploadRequest;
635 }
636 }
637
638 ActionRequestImpl actionRequestImpl =
639 ActionRequestFactory.create(
640 request, portlet, invokerPortlet, portletContext,
641 windowState, portletMode, portletPreferences,
642 layout.getPlid());
643
644 ActionResponseImpl actionResponseImpl =
645 ActionResponseFactory.create(
646 actionRequestImpl, response, portletId, user, layout,
647 windowState, portletMode);
648
649 actionRequestImpl.defineObjects(
650 portletConfig, actionResponseImpl);
651
652 invokerPortlet.processAction(
653 actionRequestImpl, actionResponseImpl);
654
655 actionResponseImpl.transferHeaders(response);
656
657 RenderParametersPool.put(
658 request, layout.getPlid(), portletId,
659 actionResponseImpl.getRenderParameterMap());
660
661 if (actionResponseImpl.getEvents().size() > 0) {
662 List<Portlet> portlets = null;
663
664 if (PropsValues.PORTLET_EVENT_DISTRIBUTION_LAYOUT_SET) {
665 portlets = getLayoutSetPortlets(
666 layout.getGroupId(), layout.isPrivateLayout());
667 }
668 else {
669 if (layout.getType().equals(
670 LayoutConstants.TYPE_PORTLET)) {
671
672 LayoutTypePortlet layoutTypePortlet =
673 (LayoutTypePortlet)layout.getLayoutType();
674
675 portlets =
676 layoutTypePortlet.getPortlets();
677 }
678 }
679
680 processEvents(
681 actionRequestImpl, actionResponseImpl, portlets);
682
683 actionRequestImpl.defineObjects(
684 portletConfig, actionResponseImpl);
685 }
686 }
687 finally {
688 if (uploadRequest != null) {
689 uploadRequest.cleanUp();
690 }
691 }
692 }
693 else if (lifecycle.equals(PortletRequest.RENDER_PHASE) ||
694 lifecycle.equals(PortletRequest.RESOURCE_PHASE)) {
695
696 PortalUtil.updateWindowState(
697 portletId, user, layout, windowState, request);
698
699 PortalUtil.updatePortletMode(
700 portletId, user, layout, portletMode, request);
701 }
702
703 if (lifecycle.equals(PortletRequest.RESOURCE_PHASE)) {
704 PortletDisplay portletDisplay = themeDisplay.getPortletDisplay();
705
706 String portletPrimaryKey = PortletPermissionUtil.getPrimaryKey(
707 layout.getPlid(), portletId);
708
709 portletDisplay.setId(portletId);
710 portletDisplay.setRootPortletId(portlet.getRootPortletId());
711 portletDisplay.setInstanceId(portlet.getInstanceId());
712 portletDisplay.setResourcePK(portletPrimaryKey);
713 portletDisplay.setPortletName(portletConfig.getPortletName());
714 portletDisplay.setNamespace(
715 PortalUtil.getPortletNamespace(portletId));
716
717 ResourceRequestImpl resourceRequestImpl =
718 ResourceRequestFactory.create(
719 request, portlet, invokerPortlet, portletContext,
720 windowState, portletMode, portletPreferences,
721 layout.getPlid());
722
723 ResourceResponseImpl resourceResponseImpl =
724 ResourceResponseFactory.create(
725 resourceRequestImpl, response, portletId, companyId);
726
727 resourceRequestImpl.defineObjects(
728 portletConfig, resourceResponseImpl);
729
730 invokerPortlet.serveResource(
731 resourceRequestImpl, resourceResponseImpl);
732 }
733
734 return portlet;
735 }
736
737 protected void redirectActionURL(
738 HttpServletRequest request, HttpServletResponse response,
739 ActionResponseImpl actionResponseImpl, Portlet portlet)
740 throws Exception {
741
742 ActionRequestImpl actionRequestImpl =
743 (ActionRequestImpl)request.getAttribute(
744 JavaConstants.JAVAX_PORTLET_REQUEST);
745
746 Layout layout = (Layout)request.getAttribute(WebKeys.LAYOUT);
747
748 PortletURL portletURL = new PortletURLImpl(
749 actionRequestImpl, actionRequestImpl.getPortletName(),
750 layout.getLayoutId(), PortletRequest.RENDER_PHASE);
751
752 Map<String, String[]> renderParameters =
753 actionResponseImpl.getRenderParameterMap();
754
755 for (Map.Entry<String, String[]> entry : renderParameters.entrySet()) {
756 String key = entry.getKey();
757 String[] value = entry.getValue();
758
759 portletURL.setParameter(key, value);
760 }
761
762 response.sendRedirect(portletURL.toString());
763 }
764
765 protected void renderExclusive(
766 HttpServletRequest request, HttpServletResponse response,
767 ThemeDisplay themeDisplay)
768 throws Exception {
769
770 RenderRequestImpl renderRequestImpl =
771 (RenderRequestImpl)request.getAttribute(
772 JavaConstants.JAVAX_PORTLET_REQUEST);
773
774 RenderResponseImpl renderResponseImpl =
775 (RenderResponseImpl)request.getAttribute(
776 JavaConstants.JAVAX_PORTLET_RESPONSE);
777
778 StringServletResponse stringResponse =
779 (StringServletResponse)renderRequestImpl.getAttribute(
780 WebKeys.STRING_SERVLET_RESPONSE);
781
782 renderResponseImpl.transferHeaders(response);
783
784 if (stringResponse.isCalledGetOutputStream()) {
785 InputStream is = new ByteArrayInputStream(
786 stringResponse.getByteArrayOutputStream().toByteArray());
787
788 ServletResponseUtil.sendFile(
789 response, renderResponseImpl.getResourceName(), is,
790 renderResponseImpl.getContentType());
791 }
792 else {
793 byte[] content = stringResponse.getString().getBytes(
794 StringPool.UTF8);
795
796 ServletResponseUtil.sendFile(
797 response, renderResponseImpl.getResourceName(), content,
798 renderResponseImpl.getContentType());
799 }
800
801 renderRequestImpl.cleanUp();
802 }
803
804 private static Log _log = LogFactoryUtil.getLog(LayoutAction.class);
805
806 }