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