001    /**
002     * Copyright (c) 2000-present Liferay, Inc. All rights reserved.
003     *
004     * This library is free software; you can redistribute it and/or modify it under
005     * the terms of the GNU Lesser General Public License as published by the Free
006     * Software Foundation; either version 2.1 of the License, or (at your option)
007     * any later version.
008     *
009     * This library is distributed in the hope that it will be useful, but WITHOUT
010     * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
011     * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
012     * details.
013     */
014    
015    package com.liferay.portlet;
016    
017    import com.liferay.portal.kernel.exception.PortalException;
018    import com.liferay.portal.kernel.language.LanguageUtil;
019    import com.liferay.portal.kernel.log.Log;
020    import com.liferay.portal.kernel.log.LogFactoryUtil;
021    import com.liferay.portal.kernel.model.Layout;
022    import com.liferay.portal.kernel.model.LayoutTypePortlet;
023    import com.liferay.portal.kernel.model.Portlet;
024    import com.liferay.portal.kernel.model.PortletApp;
025    import com.liferay.portal.kernel.model.PortletPreferencesIds;
026    import com.liferay.portal.kernel.model.PublicRenderParameter;
027    import com.liferay.portal.kernel.model.User;
028    import com.liferay.portal.kernel.portlet.ActionResult;
029    import com.liferay.portal.kernel.portlet.InvokerPortlet;
030    import com.liferay.portal.kernel.portlet.LiferayPortletMode;
031    import com.liferay.portal.kernel.portlet.PortletConfigFactoryUtil;
032    import com.liferay.portal.kernel.portlet.PortletContainer;
033    import com.liferay.portal.kernel.portlet.PortletContainerException;
034    import com.liferay.portal.kernel.portlet.PortletInstanceFactoryUtil;
035    import com.liferay.portal.kernel.portlet.PortletModeFactory;
036    import com.liferay.portal.kernel.portlet.PortletPreferencesFactoryUtil;
037    import com.liferay.portal.kernel.portlet.PortletQName;
038    import com.liferay.portal.kernel.portlet.PortletQNameUtil;
039    import com.liferay.portal.kernel.portlet.WindowStateFactory;
040    import com.liferay.portal.kernel.portlet.configuration.icon.PortletConfigurationIconMenu;
041    import com.liferay.portal.kernel.portlet.toolbar.PortletToolbar;
042    import com.liferay.portal.kernel.security.permission.ActionKeys;
043    import com.liferay.portal.kernel.service.PortletPreferencesLocalServiceUtil;
044    import com.liferay.portal.kernel.service.ServiceContext;
045    import com.liferay.portal.kernel.service.ServiceContextFactory;
046    import com.liferay.portal.kernel.service.ServiceContextThreadLocal;
047    import com.liferay.portal.kernel.service.permission.LayoutPermissionUtil;
048    import com.liferay.portal.kernel.service.permission.PortletPermissionUtil;
049    import com.liferay.portal.kernel.servlet.BufferCacheServletResponse;
050    import com.liferay.portal.kernel.servlet.DirectRequestDispatcherFactoryUtil;
051    import com.liferay.portal.kernel.servlet.HttpHeaders;
052    import com.liferay.portal.kernel.theme.PortletDisplay;
053    import com.liferay.portal.kernel.theme.ThemeDisplay;
054    import com.liferay.portal.kernel.util.ArrayUtil;
055    import com.liferay.portal.kernel.util.JavaConstants;
056    import com.liferay.portal.kernel.util.ParamUtil;
057    import com.liferay.portal.kernel.util.PortalUtil;
058    import com.liferay.portal.kernel.util.Validator;
059    import com.liferay.portal.kernel.util.WebKeys;
060    import com.liferay.portal.kernel.util.comparator.PortletConfigurationIconComparator;
061    import com.liferay.portal.kernel.webdav.WebDAVStorage;
062    import com.liferay.portal.kernel.xml.QName;
063    import com.liferay.portal.theme.PortletDisplayFactory;
064    import com.liferay.util.SerializableUtil;
065    
066    import java.io.Serializable;
067    import java.io.Writer;
068    
069    import java.util.HashMap;
070    import java.util.List;
071    import java.util.Map;
072    
073    import javax.portlet.Event;
074    import javax.portlet.PortletConfig;
075    import javax.portlet.PortletContext;
076    import javax.portlet.PortletMode;
077    import javax.portlet.PortletPreferences;
078    import javax.portlet.PortletRequest;
079    import javax.portlet.PortletResponse;
080    import javax.portlet.PortletURL;
081    import javax.portlet.RenderRequest;
082    import javax.portlet.RenderResponse;
083    import javax.portlet.WindowState;
084    
085    import javax.servlet.RequestDispatcher;
086    import javax.servlet.ServletContext;
087    import javax.servlet.http.HttpServletRequest;
088    import javax.servlet.http.HttpServletResponse;
089    import javax.servlet.http.HttpSession;
090    
091    /**
092     * @author Shuyang Zhou
093     * @author Raymond Aug??
094     */
095    public class PortletContainerImpl implements PortletContainer {
096    
097            @Override
098            public void preparePortlet(HttpServletRequest request, Portlet portlet)
099                    throws PortletContainerException {
100    
101                    try {
102                            _doPreparePortlet(request, portlet);
103                    }
104                    catch (Exception e) {
105                            throw new PortletContainerException(e);
106                    }
107            }
108    
109            @Override
110            public ActionResult processAction(
111                            HttpServletRequest request, HttpServletResponse response,
112                            Portlet portlet)
113                    throws PortletContainerException {
114    
115                    try {
116                            return _doProcessAction(request, response, portlet);
117                    }
118                    catch (Exception e) {
119                            throw new PortletContainerException(e);
120                    }
121            }
122    
123            @Override
124            public List<Event> processEvent(
125                            HttpServletRequest request, HttpServletResponse response,
126                            Portlet portlet, Layout layout, Event event)
127                    throws PortletContainerException {
128    
129                    try {
130                            return _doProcessEvent(request, response, portlet, layout, event);
131                    }
132                    catch (Exception e) {
133                            throw new PortletContainerException(e);
134                    }
135            }
136    
137            @Override
138            public void render(
139                            HttpServletRequest request, HttpServletResponse response,
140                            Portlet portlet)
141                    throws PortletContainerException {
142    
143                    try {
144                            _doRender(request, response, portlet);
145                    }
146                    catch (Exception e) {
147                            throw new PortletContainerException(e);
148                    }
149            }
150    
151            @Override
152            public void serveResource(
153                            HttpServletRequest request, HttpServletResponse response,
154                            Portlet portlet)
155                    throws PortletContainerException {
156    
157                    try {
158                            _doServeResource(request, response, portlet);
159                    }
160                    catch (Exception e) {
161                            throw new PortletContainerException(e);
162                    }
163            }
164    
165            public void setPortletConfigurationIconMenu(
166                    PortletConfigurationIconMenu portletConfigurationIconMenu) {
167    
168                    _portletConfigurationIconMenu = portletConfigurationIconMenu;
169            }
170    
171            public void setPortletToolbar(PortletToolbar portletToolbar) {
172                    _portletToolbar = portletToolbar;
173            }
174    
175            protected long getScopeGroupId(
176                            HttpServletRequest request, Layout layout, String portletId)
177                    throws PortalException {
178    
179                    long scopeGroupId = 0;
180    
181                    Layout requestLayout = (Layout)request.getAttribute(WebKeys.LAYOUT);
182    
183                    try {
184                            request.setAttribute(WebKeys.LAYOUT, layout);
185    
186                            scopeGroupId = PortalUtil.getScopeGroupId(request, portletId);
187                    }
188                    finally {
189                            request.setAttribute(WebKeys.LAYOUT, requestLayout);
190                    }
191    
192                    if (scopeGroupId <= 0) {
193                            scopeGroupId = PortalUtil.getScopeGroupId(layout, portletId);
194                    }
195    
196                    return scopeGroupId;
197            }
198    
199            protected void processPublicRenderParameters(
200                    HttpServletRequest request, Layout layout, Portlet portlet) {
201    
202                    ThemeDisplay themeDisplay = (ThemeDisplay)request.getAttribute(
203                            WebKeys.THEME_DISPLAY);
204    
205                    PortletApp portletApp = portlet.getPortletApp();
206    
207                    Map<String, String[]> publicRenderParameters =
208                            PublicRenderParametersPool.get(
209                                    request, layout.getPlid(), portletApp.isWARFile());
210    
211                    Map<String, String[]> parameters = request.getParameterMap();
212    
213                    for (Map.Entry<String, String[]> entry : parameters.entrySet()) {
214                            String name = entry.getKey();
215    
216                            QName qName = PortletQNameUtil.getQName(name);
217    
218                            if (qName == null) {
219                                    continue;
220                            }
221    
222                            PublicRenderParameter publicRenderParameter =
223                                    portlet.getPublicRenderParameter(
224                                            qName.getNamespaceURI(), qName.getLocalPart());
225    
226                            if (publicRenderParameter == null) {
227                                    continue;
228                            }
229    
230                            String publicRenderParameterName =
231                                    PortletQNameUtil.getPublicRenderParameterName(qName);
232    
233                            if (name.startsWith(
234                                            PortletQName.PUBLIC_RENDER_PARAMETER_NAMESPACE)) {
235    
236                                    String[] values = entry.getValue();
237    
238                                    if (themeDisplay.isLifecycleAction()) {
239                                            String[] oldValues = publicRenderParameters.get(
240                                                    publicRenderParameterName);
241    
242                                            if ((oldValues != null) && (oldValues.length != 0)) {
243                                                    values = ArrayUtil.append(values, oldValues);
244                                            }
245                                    }
246    
247                                    publicRenderParameters.put(publicRenderParameterName, values);
248                            }
249                            else {
250                                    publicRenderParameters.remove(publicRenderParameterName);
251                            }
252                    }
253            }
254    
255            protected Event serializeEvent(
256                    Event event, ClassLoader portletClassLoader) {
257    
258                    Serializable value = event.getValue();
259    
260                    if (value == null) {
261                            return event;
262                    }
263    
264                    Class<?> valueClass = value.getClass();
265    
266                    String valueClassName = valueClass.getName();
267    
268                    try {
269                            Class<?> loadedValueClass = portletClassLoader.loadClass(
270                                    valueClassName);
271    
272                            if (loadedValueClass.equals(valueClass)) {
273                                    return event;
274                            }
275                    }
276                    catch (ClassNotFoundException cnfe) {
277                            throw new RuntimeException(cnfe);
278                    }
279    
280                    byte[] serializedValue = SerializableUtil.serialize(value);
281    
282                    value = (Serializable)SerializableUtil.deserialize(
283                            serializedValue, portletClassLoader);
284    
285                    return new EventImpl(event.getName(), event.getQName(), value);
286            }
287    
288            private void _doPreparePortlet(HttpServletRequest request, Portlet portlet)
289                    throws Exception {
290    
291                    User user = PortalUtil.getUser(request);
292                    Layout layout = (Layout)request.getAttribute(WebKeys.LAYOUT);
293    
294                    ThemeDisplay themeDisplay = (ThemeDisplay)request.getAttribute(
295                            WebKeys.THEME_DISPLAY);
296    
297                    long scopeGroupId = PortalUtil.getScopeGroupId(
298                            request, portlet.getPortletId());
299    
300                    themeDisplay.setScopeGroupId(scopeGroupId);
301    
302                    long siteGroupId = 0;
303    
304                    if (layout.isTypeControlPanel()) {
305                            siteGroupId = PortalUtil.getSiteGroupId(scopeGroupId);
306                    }
307                    else {
308                            siteGroupId = PortalUtil.getSiteGroupId(layout.getGroupId());
309                    }
310    
311                    themeDisplay.setSiteGroupId(siteGroupId);
312    
313                    if (user != null) {
314                            HttpSession session = request.getSession();
315    
316                            InvokerPortletImpl.clearResponse(
317                                    session, layout.getPrimaryKey(), portlet.getPortletId(),
318                                    LanguageUtil.getLanguageId(request));
319                    }
320    
321                    processPublicRenderParameters(request, layout, portlet);
322    
323                    if (themeDisplay.isLifecycleRender() ||
324                            themeDisplay.isLifecycleResource()) {
325    
326                            WindowState windowState = WindowStateFactory.getWindowState(
327                                    ParamUtil.getString(request, "p_p_state"));
328    
329                            if (layout.isTypeControlPanel() &&
330                                    ((windowState == null) ||
331                                     windowState.equals(WindowState.NORMAL) ||
332                                     Validator.isNull(windowState.toString()))) {
333    
334                                    windowState = WindowState.MAXIMIZED;
335                            }
336    
337                            PortletMode portletMode = PortletModeFactory.getPortletMode(
338                                    ParamUtil.getString(request, "p_p_mode"));
339    
340                            PortalUtil.updateWindowState(
341                                    portlet.getPortletId(), user, layout, windowState, request);
342    
343                            PortalUtil.updatePortletMode(
344                                    portlet.getPortletId(), user, layout, portletMode, request);
345                    }
346            }
347    
348            private ActionResult _doProcessAction(
349                            HttpServletRequest request, HttpServletResponse response,
350                            Portlet portlet)
351                    throws Exception {
352    
353                    Layout layout = (Layout)request.getAttribute(WebKeys.LAYOUT);
354    
355                    WindowState windowState = WindowStateFactory.getWindowState(
356                            ParamUtil.getString(request, "p_p_state"));
357    
358                    if (layout.isTypeControlPanel() &&
359                            ((windowState == null) || windowState.equals(WindowState.NORMAL) ||
360                             Validator.isNull(windowState.toString()))) {
361    
362                            windowState = WindowState.MAXIMIZED;
363                    }
364    
365                    PortletMode portletMode = PortletModeFactory.getPortletMode(
366                            ParamUtil.getString(request, "p_p_mode"));
367    
368                    PortletPreferencesIds portletPreferencesIds =
369                            PortletPreferencesFactoryUtil.getPortletPreferencesIds(
370                                    request, portlet.getPortletId());
371    
372                    PortletPreferences portletPreferences =
373                            PortletPreferencesLocalServiceUtil.getStrictPreferences(
374                                    portletPreferencesIds);
375    
376                    ServletContext servletContext = (ServletContext)request.getAttribute(
377                            WebKeys.CTX);
378    
379                    InvokerPortlet invokerPortlet = PortletInstanceFactoryUtil.create(
380                            portlet, servletContext);
381    
382                    PortletConfig portletConfig = PortletConfigFactoryUtil.create(
383                            portlet, servletContext);
384    
385                    PortletContext portletContext = portletConfig.getPortletContext();
386    
387                    String contentType = request.getHeader(HttpHeaders.CONTENT_TYPE);
388    
389                    if (_log.isDebugEnabled()) {
390                            _log.debug("Content type " + contentType);
391                    }
392    
393                    try {
394                            ActionRequestImpl actionRequestImpl = ActionRequestFactory.create(
395                                    request, portlet, invokerPortlet, portletContext, windowState,
396                                    portletMode, portletPreferences, layout.getPlid());
397    
398                            User user = PortalUtil.getUser(request);
399    
400                            ActionResponseImpl actionResponseImpl =
401                                    ActionResponseFactory.create(
402                                            actionRequestImpl, response, portlet.getPortletId(), user,
403                                            layout, windowState, portletMode);
404    
405                            actionRequestImpl.defineObjects(portletConfig, actionResponseImpl);
406    
407                            ServiceContext serviceContext = ServiceContextFactory.getInstance(
408                                    actionRequestImpl);
409    
410                            ServiceContextThreadLocal.pushServiceContext(serviceContext);
411    
412                            invokerPortlet.processAction(actionRequestImpl, actionResponseImpl);
413    
414                            actionResponseImpl.transferHeaders(response);
415    
416                            RenderParametersPool.put(
417                                    request, layout.getPlid(), portlet.getPortletId(),
418                                    actionResponseImpl.getRenderParameterMap());
419    
420                            List<Event> events = actionResponseImpl.getEvents();
421    
422                            String redirectLocation = actionResponseImpl.getRedirectLocation();
423    
424                            if (Validator.isNull(redirectLocation) &&
425                                    portlet.isActionURLRedirect()) {
426    
427                                    PortletURL portletURL = new PortletURLImpl(
428                                            actionRequestImpl, actionRequestImpl.getPortletName(),
429                                            layout.getPlid(), PortletRequest.RENDER_PHASE);
430    
431                                    Map<String, String[]> renderParameters =
432                                            actionResponseImpl.getRenderParameterMap();
433    
434                                    for (Map.Entry<String, String[]> entry :
435                                                    renderParameters.entrySet()) {
436    
437                                            String key = entry.getKey();
438                                            String[] value = entry.getValue();
439    
440                                            portletURL.setParameter(key, value);
441                                    }
442    
443                                    redirectLocation = portletURL.toString();
444                            }
445    
446                            return new ActionResult(events, redirectLocation);
447                    }
448                    finally {
449                            ServiceContextThreadLocal.popServiceContext();
450                    }
451            }
452    
453            private List<Event> _doProcessEvent(
454                            HttpServletRequest request, HttpServletResponse response,
455                            Portlet portlet, Layout layout, Event event)
456                    throws Exception {
457    
458                    ServletContext servletContext = (ServletContext)request.getAttribute(
459                            WebKeys.CTX);
460    
461                    InvokerPortlet invokerPortlet = PortletInstanceFactoryUtil.create(
462                            portlet, servletContext);
463    
464                    PortletConfig portletConfig = PortletConfigFactoryUtil.create(
465                            portlet, servletContext);
466    
467                    PortletContext portletContext = portletConfig.getPortletContext();
468    
469                    LayoutTypePortlet layoutTypePortlet =
470                            (LayoutTypePortlet)layout.getLayoutType();
471    
472                    WindowState windowState = null;
473    
474                    if (layoutTypePortlet.hasStateMaxPortletId(portlet.getPortletId())) {
475                            windowState = WindowState.MAXIMIZED;
476                    }
477                    else if (layoutTypePortlet.hasStateMinPortletId(
478                                            portlet.getPortletId())) {
479    
480                            windowState = WindowState.MINIMIZED;
481                    }
482                    else {
483                            windowState = WindowState.NORMAL;
484                    }
485    
486                    PortletMode portletMode = null;
487    
488                    if (layoutTypePortlet.hasModeAboutPortletId(portlet.getPortletId())) {
489                            portletMode = LiferayPortletMode.ABOUT;
490                    }
491                    else if (layoutTypePortlet.hasModeConfigPortletId(
492                                            portlet.getPortletId())) {
493    
494                            portletMode = LiferayPortletMode.CONFIG;
495                    }
496                    else if (layoutTypePortlet.hasModeEditPortletId(
497                                            portlet.getPortletId())) {
498    
499                            portletMode = PortletMode.EDIT;
500                    }
501                    else if (layoutTypePortlet.hasModeEditDefaultsPortletId(
502                                            portlet.getPortletId())) {
503    
504                            portletMode = LiferayPortletMode.EDIT_DEFAULTS;
505                    }
506                    else if (layoutTypePortlet.hasModeEditGuestPortletId(
507                                            portlet.getPortletId())) {
508    
509                            portletMode = LiferayPortletMode.EDIT_GUEST;
510                    }
511                    else if (layoutTypePortlet.hasModeHelpPortletId(
512                                            portlet.getPortletId())) {
513    
514                            portletMode = PortletMode.HELP;
515                    }
516                    else if (layoutTypePortlet.hasModePreviewPortletId(
517                                            portlet.getPortletId())) {
518    
519                            portletMode = LiferayPortletMode.PREVIEW;
520                    }
521                    else if (layoutTypePortlet.hasModePrintPortletId(
522                                            portlet.getPortletId())) {
523    
524                            portletMode = LiferayPortletMode.PRINT;
525                    }
526                    else {
527                            portletMode = PortletMode.VIEW;
528                    }
529    
530                    long scopeGroupId = getScopeGroupId(
531                            request, layout, portlet.getPortletId());
532    
533                    PortletPreferences portletPreferences =
534                            PortletPreferencesFactoryUtil.getPortletSetup(
535                                    scopeGroupId, layout, portlet.getPortletId(), null);
536    
537                    EventRequestImpl eventRequestImpl = EventRequestFactory.create(
538                            request, portlet, invokerPortlet, portletContext, windowState,
539                            portletMode, portletPreferences, layout.getPlid());
540    
541                    eventRequestImpl.setEvent(
542                            serializeEvent(event, invokerPortlet.getPortletClassLoader()));
543    
544                    User user = PortalUtil.getUser(request);
545                    Layout requestLayout = (Layout)request.getAttribute(WebKeys.LAYOUT);
546    
547                    EventResponseImpl eventResponseImpl = EventResponseFactory.create(
548                            eventRequestImpl, response, portlet.getPortletId(), user,
549                            requestLayout);
550    
551                    eventRequestImpl.defineObjects(portletConfig, eventResponseImpl);
552    
553                    try {
554                            invokerPortlet.processEvent(eventRequestImpl, eventResponseImpl);
555    
556                            if (eventResponseImpl.isCalledSetRenderParameter()) {
557                                    Map<String, String[]> renderParameterMap =
558                                            eventResponseImpl.getRenderParameterMap();
559    
560                                    if (!renderParameterMap.isEmpty()) {
561                                            RenderParametersPool.put(
562                                                    request, requestLayout.getPlid(),
563                                                    portlet.getPortletId(),
564                                                    new HashMap<>(renderParameterMap));
565                                    }
566                            }
567    
568                            return eventResponseImpl.getEvents();
569                    }
570                    finally {
571                            eventRequestImpl.cleanUp();
572                    }
573            }
574    
575            private void _doRender(
576                            HttpServletRequest request, HttpServletResponse response,
577                            Portlet portlet)
578                    throws Exception {
579    
580                    if ((portlet != null) && portlet.isInstanceable() &&
581                            !portlet.isAddDefaultResource()) {
582    
583                            String instanceId = portlet.getInstanceId();
584    
585                            if (!Validator.isPassword(instanceId)) {
586                                    if (_log.isDebugEnabled()) {
587                                            _log.debug(
588                                                    "Portlet " + portlet.getPortletId() +
589                                                            " is instanceable but does not have a valid " +
590                                                                    "instance id");
591                                    }
592    
593                                    portlet = null;
594                            }
595                    }
596    
597                    if (portlet == null) {
598                            return;
599                    }
600    
601                    // Capture the current portlet's settings to reset them once the child
602                    // portlet is rendered
603    
604                    ThemeDisplay themeDisplay = (ThemeDisplay)request.getAttribute(
605                            WebKeys.THEME_DISPLAY);
606    
607                    PortletPreferencesFactoryUtil.checkControlPanelPortletPreferences(
608                            themeDisplay, portlet);
609    
610                    PortletDisplay portletDisplay = themeDisplay.getPortletDisplay();
611    
612                    _portletConfigurationIconMenu.setComparator(
613                            PortletConfigurationIconComparator.INSTANCE);
614    
615                    portletDisplay.setPortletConfigurationIconMenu(
616                            _portletConfigurationIconMenu);
617    
618                    portletDisplay.setPortletToolbar(_portletToolbar);
619    
620                    PortletDisplay portletDisplayClone = PortletDisplayFactory.create();
621    
622                    portletDisplay.copyTo(portletDisplayClone);
623    
624                    PortletConfig portletConfig = (PortletConfig)request.getAttribute(
625                            JavaConstants.JAVAX_PORTLET_CONFIG);
626    
627                    PortletRequest portletRequest = (PortletRequest)request.getAttribute(
628                            JavaConstants.JAVAX_PORTLET_REQUEST);
629    
630                    if (!(portletRequest instanceof RenderRequest)) {
631                            portletRequest = null;
632                    }
633    
634                    PortletResponse portletResponse = (PortletResponse)request.getAttribute(
635                            JavaConstants.JAVAX_PORTLET_RESPONSE);
636    
637                    if (!(portletResponse instanceof RenderResponse)) {
638                            portletResponse = null;
639                    }
640    
641                    String lifecycle = (String)request.getAttribute(
642                            PortletRequest.LIFECYCLE_PHASE);
643    
644                    request.setAttribute(WebKeys.RENDER_PORTLET, portlet);
645    
646                    String path = (String)request.getAttribute(WebKeys.RENDER_PATH);
647    
648                    if (path == null) {
649                            path = "/html/portal/render_portlet.jsp";
650                    }
651    
652                    RequestDispatcher requestDispatcher =
653                            DirectRequestDispatcherFactoryUtil.getRequestDispatcher(
654                                    request, path);
655    
656                    BufferCacheServletResponse bufferCacheServletResponse = null;
657    
658                    boolean writeOutput = false;
659    
660                    if (response instanceof BufferCacheServletResponse) {
661                            bufferCacheServletResponse = (BufferCacheServletResponse)response;
662                    }
663                    else {
664                            writeOutput = true;
665                            bufferCacheServletResponse = new BufferCacheServletResponse(
666                                    response);
667                    }
668    
669                    try {
670                            requestDispatcher.include(request, bufferCacheServletResponse);
671    
672                            Boolean portletConfiguratorVisibility =
673                                    (Boolean)request.getAttribute(
674                                            WebKeys.PORTLET_CONFIGURATOR_VISIBILITY);
675    
676                            if (portletConfiguratorVisibility != null) {
677                                    request.removeAttribute(
678                                            WebKeys.PORTLET_CONFIGURATOR_VISIBILITY);
679    
680                                    Layout layout = themeDisplay.getLayout();
681    
682                                    if (!layout.isTypeControlPanel() &&
683                                            !LayoutPermissionUtil.contains(
684                                                    themeDisplay.getPermissionChecker(), layout,
685                                                    ActionKeys.UPDATE) &&
686                                            !PortletPermissionUtil.contains(
687                                                    themeDisplay.getPermissionChecker(), layout,
688                                                    portlet.getPortletId(), ActionKeys.CONFIGURATION)) {
689    
690                                            bufferCacheServletResponse.setCharBuffer(null);
691    
692                                            return;
693                                    }
694                            }
695    
696                            if (writeOutput) {
697                                    Writer writer = response.getWriter();
698    
699                                    writer.write(bufferCacheServletResponse.getString());
700                            }
701                    }
702                    finally {
703                            portletDisplay.copyFrom(portletDisplayClone);
704    
705                            portletDisplayClone.recycle();
706    
707                            if (portletConfig != null) {
708                                    request.setAttribute(
709                                            JavaConstants.JAVAX_PORTLET_CONFIG, portletConfig);
710                            }
711    
712                            if (portletRequest != null) {
713                                    request.setAttribute(
714                                            JavaConstants.JAVAX_PORTLET_REQUEST, portletRequest);
715                            }
716    
717                            if (portletResponse != null) {
718                                    request.setAttribute(
719                                            JavaConstants.JAVAX_PORTLET_RESPONSE, portletResponse);
720                            }
721    
722                            if (lifecycle != null) {
723                                    request.setAttribute(PortletRequest.LIFECYCLE_PHASE, lifecycle);
724                            }
725    
726                            request.removeAttribute(WebKeys.RENDER_PORTLET);
727                    }
728            }
729    
730            private void _doServeResource(
731                            HttpServletRequest request, HttpServletResponse response,
732                            Portlet portlet)
733                    throws Exception {
734    
735                    WindowState windowState = (WindowState)request.getAttribute(
736                            WebKeys.WINDOW_STATE);
737    
738                    PortletMode portletMode = PortletModeFactory.getPortletMode(
739                            ParamUtil.getString(request, "p_p_mode"));
740    
741                    PortletPreferencesIds portletPreferencesIds =
742                            PortletPreferencesFactoryUtil.getPortletPreferencesIds(
743                                    request, portlet.getPortletId());
744    
745                    PortletPreferences portletPreferences =
746                            PortletPreferencesLocalServiceUtil.getStrictPreferences(
747                                    portletPreferencesIds);
748    
749                    ServletContext servletContext = (ServletContext)request.getAttribute(
750                            WebKeys.CTX);
751    
752                    InvokerPortlet invokerPortlet = PortletInstanceFactoryUtil.create(
753                            portlet, servletContext);
754    
755                    PortletConfig portletConfig = PortletConfigFactoryUtil.create(
756                            portlet, servletContext);
757    
758                    PortletContext portletContext = portletConfig.getPortletContext();
759    
760                    ThemeDisplay themeDisplay = (ThemeDisplay)request.getAttribute(
761                            WebKeys.THEME_DISPLAY);
762    
763                    PortletDisplay portletDisplay = themeDisplay.getPortletDisplay();
764    
765                    Layout layout = (Layout)request.getAttribute(WebKeys.LAYOUT);
766    
767                    String portletPrimaryKey = PortletPermissionUtil.getPrimaryKey(
768                            layout.getPlid(), portlet.getPortletId());
769    
770                    portletDisplay.setId(portlet.getPortletId());
771                    portletDisplay.setInstanceId(portlet.getInstanceId());
772                    portletDisplay.setNamespace(
773                            PortalUtil.getPortletNamespace(portlet.getPortletId()));
774                    portletDisplay.setPortletName(portletConfig.getPortletName());
775                    portletDisplay.setResourcePK(portletPrimaryKey);
776                    portletDisplay.setRootPortletId(portlet.getRootPortletId());
777    
778                    WebDAVStorage webDAVStorage = portlet.getWebDAVStorageInstance();
779    
780                    if (webDAVStorage != null) {
781                            portletDisplay.setWebDAVEnabled(true);
782                    }
783                    else {
784                            portletDisplay.setWebDAVEnabled(false);
785                    }
786    
787                    ResourceRequestImpl resourceRequestImpl = ResourceRequestFactory.create(
788                            request, portlet, invokerPortlet, portletContext, windowState,
789                            portletMode, portletPreferences, layout.getPlid());
790    
791                    long companyId = PortalUtil.getCompanyId(request);
792    
793                    ResourceResponseImpl resourceResponseImpl =
794                            ResourceResponseFactory.create(
795                                    resourceRequestImpl, response, portlet.getPortletId(),
796                                    companyId);
797    
798                    resourceRequestImpl.defineObjects(portletConfig, resourceResponseImpl);
799    
800                    try {
801                            ServiceContext serviceContext = ServiceContextFactory.getInstance(
802                                    resourceRequestImpl);
803    
804                            ServiceContextThreadLocal.pushServiceContext(serviceContext);
805    
806                            invokerPortlet.serveResource(
807                                    resourceRequestImpl, resourceResponseImpl);
808    
809                            resourceResponseImpl.transferHeaders(response);
810                    }
811                    finally {
812                            ServiceContextThreadLocal.popServiceContext();
813                    }
814            }
815    
816            private static final Log _log = LogFactoryUtil.getLog(
817                    PortletContainerImpl.class);
818    
819            private PortletConfigurationIconMenu _portletConfigurationIconMenu;
820            private PortletToolbar _portletToolbar;
821    
822    }