1   /**
2    * Copyright (c) 2000-2009 Liferay, Inc. All rights reserved.
3    *
4    *
5    *
6    *
7    * The contents of this file are subject to the terms of the Liferay Enterprise
8    * Subscription License ("License"). You may not use this file except in
9    * compliance with the License. You can obtain a copy of the License by
10   * contacting Liferay, Inc. See the License for the specific language governing
11   * permissions and limitations under the License, including but not limited to
12   * distribution rights 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.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 /**
118  * <a href="LayoutAction.java.html"><b><i>View Source</i></b></a>
119  *
120  * @author Brian Wing Shun Chan
121  */
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         // Manually check the p_p_id. See LEP-1724.
292 
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                 // Always clear render parameters on a layout url, but do not
466                 // clear on portlet urls invoked on the same layout
467 
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                     // Include layout content before the page loads because
516                     // portlets on the page can set the page title and page
517                     // subtitle
518 
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 }