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