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