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