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.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    
278                    themeDisplay.setScopeGroupId(scopeGroupId);
279    
280                    long siteGroupId = 0;
281    
282                    if (layout.isTypeControlPanel()) {
283                            siteGroupId = PortalUtil.getSiteGroupId(scopeGroupId);
284                    }
285                    else {
286                            siteGroupId = PortalUtil.getSiteGroupId(layout.getGroupId());
287                    }
288    
289                    themeDisplay.setSiteGroupId(siteGroupId);
290    
291                    if (user != null) {
292                            HttpSession session = request.getSession();
293    
294                            InvokerPortletImpl.clearResponse(
295                                    session, layout.getPrimaryKey(), portlet.getPortletId(),
296                                    LanguageUtil.getLanguageId(request));
297                    }
298    
299                    processPublicRenderParameters(request, layout, portlet);
300    
301                    if (themeDisplay.isLifecycleRender() ||
302                            themeDisplay.isLifecycleResource()) {
303    
304                            WindowState windowState = WindowStateFactory.getWindowState(
305                                    ParamUtil.getString(request, "p_p_state"));
306    
307                            if (layout.isTypeControlPanel() &&
308                                    ((windowState == null) ||
309                                     windowState.equals(WindowState.NORMAL) ||
310                                     Validator.isNull(windowState.toString()))) {
311    
312                                    windowState = WindowState.MAXIMIZED;
313                            }
314    
315                            PortletMode portletMode = PortletModeFactory.getPortletMode(
316                                    ParamUtil.getString(request, "p_p_mode"));
317    
318                            PortalUtil.updateWindowState(
319                                    portlet.getPortletId(), user, layout, windowState, request);
320    
321                            PortalUtil.updatePortletMode(
322                                    portlet.getPortletId(), user, layout, portletMode, request);
323                    }
324            }
325    
326            private ActionResult _doProcessAction(
327                            HttpServletRequest request, HttpServletResponse response,
328                            Portlet portlet)
329                    throws Exception {
330    
331                    Layout layout = (Layout)request.getAttribute(WebKeys.LAYOUT);
332    
333                    WindowState windowState = WindowStateFactory.getWindowState(
334                            ParamUtil.getString(request, "p_p_state"));
335    
336                    if (layout.isTypeControlPanel() &&
337                            ((windowState == null) || windowState.equals(WindowState.NORMAL) ||
338                             Validator.isNull(windowState.toString()))) {
339    
340                            windowState = WindowState.MAXIMIZED;
341                    }
342    
343                    PortletMode portletMode = PortletModeFactory.getPortletMode(
344                            ParamUtil.getString(request, "p_p_mode"));
345    
346                    PortletPreferencesIds portletPreferencesIds =
347                            PortletPreferencesFactoryUtil.getPortletPreferencesIds(
348                                    request, portlet.getPortletId());
349    
350                    PortletPreferences portletPreferences =
351                            PortletPreferencesLocalServiceUtil.getStrictPreferences(
352                                    portletPreferencesIds);
353    
354                    ServletContext servletContext = (ServletContext)request.getAttribute(
355                            WebKeys.CTX);
356    
357                    InvokerPortlet invokerPortlet = PortletInstanceFactoryUtil.create(
358                            portlet, servletContext);
359    
360                    PortletConfig portletConfig = PortletConfigFactoryUtil.create(
361                            portlet, servletContext);
362                    PortletContext portletContext = portletConfig.getPortletContext();
363    
364                    String contentType = request.getHeader(HttpHeaders.CONTENT_TYPE);
365    
366                    if (_log.isDebugEnabled()) {
367                            _log.debug("Content type " + contentType);
368                    }
369    
370                    try {
371                            ActionRequestImpl actionRequestImpl = ActionRequestFactory.create(
372                                    request, portlet, invokerPortlet, portletContext, windowState,
373                                    portletMode, portletPreferences, layout.getPlid());
374    
375                            User user = PortalUtil.getUser(request);
376    
377                            ActionResponseImpl actionResponseImpl =
378                                    ActionResponseFactory.create(
379                                            actionRequestImpl, response, portlet.getPortletId(), user,
380                                            layout, windowState, portletMode);
381    
382                            actionRequestImpl.defineObjects(portletConfig, actionResponseImpl);
383    
384                            ServiceContext serviceContext = ServiceContextFactory.getInstance(
385                                    actionRequestImpl);
386    
387                            ServiceContextThreadLocal.pushServiceContext(serviceContext);
388    
389                            invokerPortlet.processAction(actionRequestImpl, actionResponseImpl);
390    
391                            actionResponseImpl.transferHeaders(response);
392    
393                            RenderParametersPool.put(
394                                    request, layout.getPlid(), portlet.getPortletId(),
395                                    actionResponseImpl.getRenderParameterMap());
396    
397                            List<Event> events = actionResponseImpl.getEvents();
398    
399                            String redirectLocation = actionResponseImpl.getRedirectLocation();
400    
401                            if (Validator.isNull(redirectLocation) &&
402                                    portlet.isActionURLRedirect()) {
403    
404                                    PortletURL portletURL = new PortletURLImpl(
405                                            actionRequestImpl, actionRequestImpl.getPortletName(),
406                                            layout.getPlid(), PortletRequest.RENDER_PHASE);
407    
408                                    Map<String, String[]> renderParameters =
409                                            actionResponseImpl.getRenderParameterMap();
410    
411                                    for (Map.Entry<String, String[]> entry :
412                                                    renderParameters.entrySet()) {
413    
414                                            String key = entry.getKey();
415                                            String[] value = entry.getValue();
416    
417                                            portletURL.setParameter(key, value);
418                                    }
419    
420                                    redirectLocation = portletURL.toString();
421                            }
422    
423                            return new ActionResult(events, redirectLocation);
424                    }
425                    finally {
426                            ServiceContextThreadLocal.popServiceContext();
427                    }
428            }
429    
430            private List<Event> _doProcessEvent(
431                            HttpServletRequest request, HttpServletResponse response,
432                            Portlet portlet, Layout layout, Event event)
433                    throws Exception {
434    
435                    ServletContext servletContext = (ServletContext)request.getAttribute(
436                            WebKeys.CTX);
437    
438                    InvokerPortlet invokerPortlet = PortletInstanceFactoryUtil.create(
439                            portlet, servletContext);
440    
441                    PortletConfig portletConfig = PortletConfigFactoryUtil.create(
442                            portlet, servletContext);
443                    PortletContext portletContext = portletConfig.getPortletContext();
444    
445                    LayoutTypePortlet layoutTypePortlet =
446                            (LayoutTypePortlet)layout.getLayoutType();
447    
448                    WindowState windowState = null;
449    
450                    if (layoutTypePortlet.hasStateMaxPortletId(portlet.getPortletId())) {
451                            windowState = WindowState.MAXIMIZED;
452                    }
453                    else if (layoutTypePortlet.hasStateMinPortletId(
454                                            portlet.getPortletId())) {
455    
456                            windowState = WindowState.MINIMIZED;
457                    }
458                    else {
459                            windowState = WindowState.NORMAL;
460                    }
461    
462                    PortletMode portletMode = null;
463    
464                    if (layoutTypePortlet.hasModeAboutPortletId(portlet.getPortletId())) {
465                            portletMode = LiferayPortletMode.ABOUT;
466                    }
467                    else if (layoutTypePortlet.hasModeConfigPortletId(
468                                            portlet.getPortletId())) {
469    
470                            portletMode = LiferayPortletMode.CONFIG;
471                    }
472                    else if (layoutTypePortlet.hasModeEditPortletId(
473                                            portlet.getPortletId())) {
474    
475                            portletMode = PortletMode.EDIT;
476                    }
477                    else if (layoutTypePortlet.hasModeEditDefaultsPortletId(
478                                            portlet.getPortletId())) {
479    
480                            portletMode = LiferayPortletMode.EDIT_DEFAULTS;
481                    }
482                    else if (layoutTypePortlet.hasModeEditGuestPortletId(
483                                            portlet.getPortletId())) {
484    
485                            portletMode = LiferayPortletMode.EDIT_GUEST;
486                    }
487                    else if (layoutTypePortlet.hasModeHelpPortletId(
488                                            portlet.getPortletId())) {
489    
490                            portletMode = PortletMode.HELP;
491                    }
492                    else if (layoutTypePortlet.hasModePreviewPortletId(
493                                            portlet.getPortletId())) {
494    
495                            portletMode = LiferayPortletMode.PREVIEW;
496                    }
497                    else if (layoutTypePortlet.hasModePrintPortletId(
498                                            portlet.getPortletId())) {
499    
500                            portletMode = LiferayPortletMode.PRINT;
501                    }
502                    else {
503                            portletMode = PortletMode.VIEW;
504                    }
505    
506                    long scopeGroupId = getScopeGroupId(
507                            request, layout, portlet.getPortletId());
508    
509                    PortletPreferences portletPreferences =
510                            PortletPreferencesFactoryUtil.getPortletSetup(
511                                    scopeGroupId, layout, portlet.getPortletId(), null);
512    
513                    EventRequestImpl eventRequestImpl = EventRequestFactory.create(
514                            request, portlet, invokerPortlet, portletContext, windowState,
515                            portletMode, portletPreferences, layout.getPlid());
516    
517                    eventRequestImpl.setEvent(
518                            serializeEvent(event, invokerPortlet.getPortletClassLoader()));
519    
520                    User user = PortalUtil.getUser(request);
521                    Layout requestLayout = (Layout)request.getAttribute(WebKeys.LAYOUT);
522    
523                    EventResponseImpl eventResponseImpl = EventResponseFactory.create(
524                            eventRequestImpl, response, portlet.getPortletId(), user,
525                            requestLayout);
526    
527                    eventRequestImpl.defineObjects(portletConfig, eventResponseImpl);
528    
529                    try {
530                            invokerPortlet.processEvent(eventRequestImpl, eventResponseImpl);
531    
532                            if (eventResponseImpl.isCalledSetRenderParameter()) {
533                                    Map<String, String[]> renderParameterMap =
534                                            new HashMap<String, String[]>();
535    
536                                    renderParameterMap.putAll(
537                                            eventResponseImpl.getRenderParameterMap());
538    
539                                    RenderParametersPool.put(
540                                            request, requestLayout.getPlid(), portlet.getPortletId(),
541                                            renderParameterMap);
542                            }
543    
544                            return eventResponseImpl.getEvents();
545                    }
546                    finally {
547                            eventRequestImpl.cleanUp();
548                    }
549            }
550    
551            private void _doRender(
552                            HttpServletRequest request, HttpServletResponse response,
553                            Portlet portlet)
554                    throws Exception {
555    
556                    if ((portlet != null) && portlet.isInstanceable() &&
557                            !portlet.isAddDefaultResource()) {
558    
559                            String instanceId = portlet.getInstanceId();
560    
561                            if (!Validator.isPassword(instanceId)) {
562                                    if (_log.isDebugEnabled()) {
563                                            _log.debug(
564                                                    "Portlet " + portlet.getPortletId() +
565                                                            " is instanceable but does not have a valid " +
566                                                                    "instance id");
567                                    }
568    
569                                    portlet = null;
570                            }
571                    }
572    
573                    if (portlet == null) {
574                            return;
575                    }
576    
577                    // Capture the current portlet's settings to reset them once the child
578                    // portlet is rendered
579    
580                    ThemeDisplay themeDisplay = (ThemeDisplay)request.getAttribute(
581                            WebKeys.THEME_DISPLAY);
582    
583                    PortletPreferencesFactoryUtil.checkControlPanelPortletPreferences(
584                            themeDisplay, portlet);
585    
586                    PortletDisplay portletDisplay = themeDisplay.getPortletDisplay();
587    
588                    PortletDisplay portletDisplayClone = PortletDisplayFactory.create();
589    
590                    portletDisplay.copyTo(portletDisplayClone);
591    
592                    PortletConfig portletConfig = (PortletConfig)request.getAttribute(
593                            JavaConstants.JAVAX_PORTLET_CONFIG);
594    
595                    PortletRequest portletRequest = (PortletRequest)request.getAttribute(
596                            JavaConstants.JAVAX_PORTLET_REQUEST);
597    
598                    if (!(portletRequest instanceof RenderRequest)) {
599                            portletRequest = null;
600                    }
601    
602                    PortletResponse portletResponse = (PortletResponse)request.getAttribute(
603                            JavaConstants.JAVAX_PORTLET_RESPONSE);
604    
605                    if (!(portletResponse instanceof RenderResponse)) {
606                            portletResponse = null;
607                    }
608    
609                    String lifecycle = (String)request.getAttribute(
610                            PortletRequest.LIFECYCLE_PHASE);
611    
612                    request.setAttribute(WebKeys.RENDER_PORTLET, portlet);
613    
614                    String path = (String)request.getAttribute(WebKeys.RENDER_PATH);
615    
616                    if (path == null) {
617                            path = "/html/portal/render_portlet.jsp";
618                    }
619    
620                    RequestDispatcher requestDispatcher =
621                            DirectRequestDispatcherFactoryUtil.getRequestDispatcher(
622                                    request, path);
623    
624                    BufferCacheServletResponse bufferCacheServletResponse = null;
625    
626                    boolean writeOutput = false;
627    
628                    if (response instanceof BufferCacheServletResponse) {
629                            bufferCacheServletResponse = (BufferCacheServletResponse)response;
630                    }
631                    else {
632                            writeOutput = true;
633                            bufferCacheServletResponse = new BufferCacheServletResponse(
634                                    response);
635                    }
636    
637                    try {
638                            requestDispatcher.include(request, bufferCacheServletResponse);
639    
640                            Boolean portletConfiguratorVisibility =
641                                    (Boolean)request.getAttribute(
642                                            WebKeys.PORTLET_CONFIGURATOR_VISIBILITY);
643    
644                            if (portletConfiguratorVisibility != null) {
645                                    request.removeAttribute(
646                                            WebKeys.PORTLET_CONFIGURATOR_VISIBILITY);
647    
648                                    Layout layout = themeDisplay.getLayout();
649    
650                                    if (!layout.isTypeControlPanel() &&
651                                            !LayoutPermissionUtil.contains(
652                                                    themeDisplay.getPermissionChecker(), layout,
653                                                    ActionKeys.UPDATE) &&
654                                            !PortletPermissionUtil.contains(
655                                                    themeDisplay.getPermissionChecker(), layout,
656                                                    portlet.getPortletId(), ActionKeys.CONFIGURATION)) {
657    
658                                            bufferCacheServletResponse.setCharBuffer(null);
659    
660                                            return;
661                                    }
662                            }
663    
664                            if (writeOutput) {
665                                    Writer writer = response.getWriter();
666    
667                                    writer.write(bufferCacheServletResponse.getString());
668                            }
669                    }
670                    finally {
671                            portletDisplay.copyFrom(portletDisplayClone);
672    
673                            portletDisplayClone.recycle();
674    
675                            if (portletConfig != null) {
676                                    request.setAttribute(
677                                            JavaConstants.JAVAX_PORTLET_CONFIG, portletConfig);
678                            }
679    
680                            if (portletRequest != null) {
681                                    request.setAttribute(
682                                            JavaConstants.JAVAX_PORTLET_REQUEST, portletRequest);
683                            }
684    
685                            if (portletResponse != null) {
686                                    request.setAttribute(
687                                            JavaConstants.JAVAX_PORTLET_RESPONSE, portletResponse);
688                            }
689    
690                            if (lifecycle != null) {
691                                    request.setAttribute(PortletRequest.LIFECYCLE_PHASE, lifecycle);
692                            }
693    
694                            request.removeAttribute(WebKeys.RENDER_PORTLET);
695                    }
696            }
697    
698            private void _doServeResource(
699                            HttpServletRequest request, HttpServletResponse response,
700                            Portlet portlet)
701                    throws Exception {
702    
703                    WindowState windowState = (WindowState)request.getAttribute(
704                            WebKeys.WINDOW_STATE);
705    
706                    PortletMode portletMode = PortletModeFactory.getPortletMode(
707                            ParamUtil.getString(request, "p_p_mode"));
708    
709                    PortletPreferencesIds portletPreferencesIds =
710                            PortletPreferencesFactoryUtil.getPortletPreferencesIds(
711                                    request, portlet.getPortletId());
712    
713                    PortletPreferences portletPreferences =
714                            PortletPreferencesLocalServiceUtil.getStrictPreferences(
715                                    portletPreferencesIds);
716    
717                    ServletContext servletContext = (ServletContext)request.getAttribute(
718                            WebKeys.CTX);
719    
720                    InvokerPortlet invokerPortlet = PortletInstanceFactoryUtil.create(
721                            portlet, servletContext);
722    
723                    PortletConfig portletConfig = PortletConfigFactoryUtil.create(
724                            portlet, servletContext);
725                    PortletContext portletContext = portletConfig.getPortletContext();
726    
727                    ThemeDisplay themeDisplay = (ThemeDisplay)request.getAttribute(
728                            WebKeys.THEME_DISPLAY);
729    
730                    PortletDisplay portletDisplay = themeDisplay.getPortletDisplay();
731    
732                    Layout layout = (Layout)request.getAttribute(WebKeys.LAYOUT);
733    
734                    String portletPrimaryKey = PortletPermissionUtil.getPrimaryKey(
735                            layout.getPlid(), portlet.getPortletId());
736    
737                    portletDisplay.setControlPanelCategory(
738                            portlet.getControlPanelEntryCategory());
739                    portletDisplay.setId(portlet.getPortletId());
740                    portletDisplay.setInstanceId(portlet.getInstanceId());
741                    portletDisplay.setNamespace(
742                            PortalUtil.getPortletNamespace(portlet.getPortletId()));
743                    portletDisplay.setPortletName(portletConfig.getPortletName());
744                    portletDisplay.setResourcePK(portletPrimaryKey);
745                    portletDisplay.setRootPortletId(portlet.getRootPortletId());
746    
747                    WebDAVStorage webDAVStorage = portlet.getWebDAVStorageInstance();
748    
749                    if (webDAVStorage != null) {
750                            portletDisplay.setWebDAVEnabled(true);
751                    }
752                    else {
753                            portletDisplay.setWebDAVEnabled(false);
754                    }
755    
756                    ResourceRequestImpl resourceRequestImpl = ResourceRequestFactory.create(
757                            request, portlet, invokerPortlet, portletContext, windowState,
758                            portletMode, portletPreferences, layout.getPlid());
759    
760                    long companyId = PortalUtil.getCompanyId(request);
761    
762                    ResourceResponseImpl resourceResponseImpl =
763                            ResourceResponseFactory.create(
764                                    resourceRequestImpl, response, portlet.getPortletId(),
765                                    companyId);
766    
767                    resourceRequestImpl.defineObjects(portletConfig, resourceResponseImpl);
768    
769                    try {
770                            ServiceContext serviceContext = ServiceContextFactory.getInstance(
771                                    resourceRequestImpl);
772    
773                            ServiceContextThreadLocal.pushServiceContext(serviceContext);
774    
775                            invokerPortlet.serveResource(
776                                    resourceRequestImpl, resourceResponseImpl);
777    
778                            resourceResponseImpl.transferHeaders(response);
779                    }
780                    finally {
781                            ServiceContextThreadLocal.popServiceContext();
782                    }
783            }
784    
785            private static Log _log = LogFactoryUtil.getLog(PortletContainerImpl.class);
786    
787    }