1
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
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
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
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 }