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