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