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