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