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