001    /**
002     * Copyright (c) 2000-2012 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.PortletContainerUtil;
027    import com.liferay.portal.kernel.portlet.PortletModeFactory;
028    import com.liferay.portal.kernel.portlet.WindowStateFactory;
029    import com.liferay.portal.kernel.servlet.BufferCacheServletResponse;
030    import com.liferay.portal.kernel.servlet.DirectRequestDispatcherFactoryUtil;
031    import com.liferay.portal.kernel.servlet.HttpHeaders;
032    import com.liferay.portal.kernel.servlet.TempAttributesServletRequest;
033    import com.liferay.portal.kernel.struts.LastPath;
034    import com.liferay.portal.kernel.upload.UploadServletRequest;
035    import com.liferay.portal.kernel.util.ArrayUtil;
036    import com.liferay.portal.kernel.util.ContentTypes;
037    import com.liferay.portal.kernel.util.JavaConstants;
038    import com.liferay.portal.kernel.util.ParamUtil;
039    import com.liferay.portal.kernel.util.StringBundler;
040    import com.liferay.portal.kernel.util.Validator;
041    import com.liferay.portal.kernel.util.WebKeys;
042    import com.liferay.portal.kernel.webdav.WebDAVStorage;
043    import com.liferay.portal.kernel.xml.QName;
044    import com.liferay.portal.model.Layout;
045    import com.liferay.portal.model.LayoutTypePortlet;
046    import com.liferay.portal.model.Portlet;
047    import com.liferay.portal.model.PortletPreferencesIds;
048    import com.liferay.portal.model.PublicRenderParameter;
049    import com.liferay.portal.model.User;
050    import com.liferay.portal.security.auth.AuthTokenUtil;
051    import com.liferay.portal.security.permission.ActionKeys;
052    import com.liferay.portal.security.permission.PermissionChecker;
053    import com.liferay.portal.security.permission.PermissionThreadLocal;
054    import com.liferay.portal.service.PortletPreferencesLocalServiceUtil;
055    import com.liferay.portal.service.ServiceContext;
056    import com.liferay.portal.service.ServiceContextFactory;
057    import com.liferay.portal.service.ServiceContextThreadLocal;
058    import com.liferay.portal.service.permission.LayoutPermissionUtil;
059    import com.liferay.portal.service.permission.PortletPermissionUtil;
060    import com.liferay.portal.theme.PortletDisplay;
061    import com.liferay.portal.theme.PortletDisplayFactory;
062    import com.liferay.portal.theme.ThemeDisplay;
063    import com.liferay.portal.upload.UploadServletRequestImpl;
064    import com.liferay.portal.util.PortalUtil;
065    import com.liferay.portal.util.PropsValues;
066    import com.liferay.taglib.aui.AUIUtil;
067    import com.liferay.util.SerializableUtil;
068    
069    import java.io.Serializable;
070    import java.io.Writer;
071    
072    import java.util.HashMap;
073    import java.util.List;
074    import java.util.Map;
075    
076    import javax.portlet.Event;
077    import javax.portlet.PortletConfig;
078    import javax.portlet.PortletContext;
079    import javax.portlet.PortletMode;
080    import javax.portlet.PortletPreferences;
081    import javax.portlet.PortletRequest;
082    import javax.portlet.PortletResponse;
083    import javax.portlet.PortletURL;
084    import javax.portlet.RenderRequest;
085    import javax.portlet.RenderResponse;
086    import javax.portlet.WindowState;
087    
088    import javax.servlet.RequestDispatcher;
089    import javax.servlet.ServletContext;
090    import javax.servlet.http.HttpServletRequest;
091    import javax.servlet.http.HttpServletResponse;
092    import javax.servlet.http.HttpSession;
093    
094    /**
095     * @author Shuyang Zhou
096     */
097    public class PortletContainerImpl implements PortletContainer {
098    
099            public void preparePortlet(HttpServletRequest request, Portlet portlet)
100                    throws PortletContainerException {
101    
102                    try {
103                            _doPreparePortlet(request, portlet);
104                    }
105                    catch (Exception e) {
106                            throw new PortletContainerException(e);
107                    }
108            }
109    
110            public ActionResult processAction(
111                            HttpServletRequest request, HttpServletResponse response,
112                            Portlet portlet)
113                    throws PortletContainerException {
114    
115                    try {
116                            return _doProcessAction(request, response, portlet);
117                    }
118                    catch (Exception e) {
119                            throw new PortletContainerException(e);
120                    }
121            }
122    
123            public List<Event> processEvent(
124                            HttpServletRequest request, HttpServletResponse response,
125                            Portlet portlet, Layout layout, Event event)
126                    throws PortletContainerException {
127    
128                    try {
129                            return _doProcessEvent(request, response, portlet, layout, event);
130                    }
131                    catch (Exception e) {
132                            throw new PortletContainerException(e);
133                    }
134            }
135    
136            public void render(
137                            HttpServletRequest request, HttpServletResponse response,
138                            Portlet portlet)
139                    throws PortletContainerException {
140    
141                    ThemeDisplay themeDisplay = (ThemeDisplay)request.getAttribute(
142                            WebKeys.THEME_DISPLAY);
143    
144                    try {
145                            _doRender(request, response, portlet);
146    
147                            if (themeDisplay.isIsolated() || themeDisplay.isStateExclusive()) {
148                                    AUIUtil.outputScriptData(request, response.getWriter());
149                            }
150                    }
151                    catch (Exception e) {
152                            throw new PortletContainerException(e);
153                    }
154            }
155    
156            public void serveResource(
157                            HttpServletRequest request, HttpServletResponse response,
158                            Portlet portlet)
159                    throws PortletContainerException {
160    
161                    try {
162                            _doServeResource(request, response, portlet);
163    
164                            String contentType = response.getContentType();
165    
166                            if (contentType.equals(ContentTypes.TEXT_HTML) ||
167                                    contentType.equals(ContentTypes.TEXT_HTML_UTF8)) {
168    
169                                    AUIUtil.outputScriptData(request, response.getWriter());
170                            }
171                    }
172                    catch (Exception e) {
173                            throw new PortletContainerException(e);
174                    }
175            }
176    
177            protected HttpServletRequest getOwnerLayoutRequestWrapper(
178                            HttpServletRequest request, Portlet portlet)
179                    throws Exception {
180    
181                    if (!PropsValues.PORTLET_EVENT_DISTRIBUTION_LAYOUT_SET) {
182                            return request;
183                    }
184    
185                    ThemeDisplay themeDisplay = (ThemeDisplay)request.getAttribute(
186                            WebKeys.THEME_DISPLAY);
187    
188                    Layout currentLayout = themeDisplay.getLayout();
189    
190                    Layout requestLayout = (Layout)request.getAttribute(WebKeys.LAYOUT);
191    
192                    List<LayoutTypePortlet> layoutTypePortlets =
193                            PortletContainerUtil.getLayoutTypePortlets(requestLayout);
194    
195                    Layout ownerLayout = null;
196                    LayoutTypePortlet ownerLayoutTypePortlet = null;
197    
198                    for (LayoutTypePortlet layoutTypePortlet : layoutTypePortlets) {
199                            if (layoutTypePortlet.hasPortletId(portlet.getPortletId())) {
200                                    ownerLayoutTypePortlet = layoutTypePortlet;
201    
202                                    ownerLayout = layoutTypePortlet.getLayout();
203    
204                                    break;
205                            }
206                    }
207    
208                    if ((ownerLayout != null) && !currentLayout.equals(ownerLayout)) {
209                            ThemeDisplay themeDisplayClone = (ThemeDisplay)themeDisplay.clone();
210    
211                            themeDisplayClone.setLayout(ownerLayout);
212                            themeDisplayClone.setLayoutTypePortlet(ownerLayoutTypePortlet);
213    
214                            TempAttributesServletRequest tempAttributesServletRequest =
215                                    new TempAttributesServletRequest(request);
216    
217                            tempAttributesServletRequest.setTempAttribute(
218                                    WebKeys.THEME_DISPLAY, themeDisplayClone);
219                            tempAttributesServletRequest.setTempAttribute(
220                                    WebKeys.LAYOUT, ownerLayout);
221    
222                            return tempAttributesServletRequest;
223                    }
224    
225                    return request;
226            }
227    
228            protected long getScopeGroupId(
229                            HttpServletRequest request, Layout layout, String portletId)
230                    throws PortalException, SystemException {
231    
232                    long scopeGroupId = 0;
233    
234                    Layout requestLayout = (Layout)request.getAttribute(WebKeys.LAYOUT);
235    
236                    try {
237                            request.setAttribute(WebKeys.LAYOUT, layout);
238    
239                            scopeGroupId = PortalUtil.getScopeGroupId(request, portletId);
240                    }
241                    finally {
242                            request.setAttribute(WebKeys.LAYOUT, requestLayout);
243                    }
244    
245                    if (scopeGroupId <= 0) {
246                            scopeGroupId = PortalUtil.getScopeGroupId(layout, portletId);
247                    }
248    
249                    return scopeGroupId;
250            }
251    
252            protected void processPublicRenderParameters(
253                    HttpServletRequest request, Layout layout, Portlet portlet) {
254    
255                    ThemeDisplay themeDisplay = (ThemeDisplay)request.getAttribute(
256                            WebKeys.THEME_DISPLAY);
257    
258                    Map<String, String[]> publicRenderParameters =
259                            PublicRenderParametersPool.get(request, layout.getPlid());
260    
261                    Map<String, String[]> parameters = request.getParameterMap();
262    
263                    for (Map.Entry<String, String[]> entry : parameters.entrySet()) {
264                            String name = entry.getKey();
265    
266                            QName qName = PortletQNameUtil.getQName(name);
267    
268                            if (qName == null) {
269                                    continue;
270                            }
271    
272                            PublicRenderParameter publicRenderParameter =
273                                    portlet.getPublicRenderParameter(
274                                            qName.getNamespaceURI(), qName.getLocalPart());
275    
276                            if (publicRenderParameter == null) {
277                                    continue;
278                            }
279    
280                            String publicRenderParameterName =
281                                    PortletQNameUtil.getPublicRenderParameterName(qName);
282    
283                            if (name.startsWith(
284                                            PortletQName.PUBLIC_RENDER_PARAMETER_NAMESPACE)) {
285    
286                                    String[] values = entry.getValue();
287    
288                                    if (themeDisplay.isLifecycleAction()) {
289                                            String[] oldValues = publicRenderParameters.get(
290                                                    publicRenderParameterName);
291    
292                                            if ((oldValues != null) && (oldValues.length != 0)) {
293                                                    values = ArrayUtil.append(values, oldValues);
294                                            }
295                                    }
296    
297                                    publicRenderParameters.put(publicRenderParameterName, values);
298                            }
299                            else {
300                                    publicRenderParameters.remove(publicRenderParameterName);
301                            }
302                    }
303            }
304    
305            protected Event serializeEvent(
306                    Event event, ClassLoader portletClassLoader) {
307    
308                    Serializable value = event.getValue();
309    
310                    if (value == null) {
311                            return event;
312                    }
313    
314                    Class<?> valueClass = value.getClass();
315    
316                    String valueClassName = valueClass.getName();
317    
318                    try {
319                            Class<?> loadedValueClass = portletClassLoader.loadClass(
320                                    valueClassName);
321    
322                            if (loadedValueClass.equals(valueClass)) {
323                                    return event;
324                            }
325                    }
326                    catch (ClassNotFoundException cnfe) {
327                            throw new RuntimeException(cnfe);
328                    }
329    
330                    byte[] serializedValue = SerializableUtil.serialize(value);
331    
332                    value = (Serializable)SerializableUtil.deserialize(
333                            serializedValue, portletClassLoader);
334    
335                    return new EventImpl(event.getName(), event.getQName(), value);
336            }
337    
338            private void _doPreparePortlet(HttpServletRequest request, Portlet portlet)
339                    throws Exception {
340    
341                    User user = PortalUtil.getUser(request);
342                    Layout layout = (Layout)request.getAttribute(WebKeys.LAYOUT);
343    
344                    ThemeDisplay themeDisplay = (ThemeDisplay)request.getAttribute(
345                            WebKeys.THEME_DISPLAY);
346    
347                    long scopeGroupId = PortalUtil.getScopeGroupId(
348                            request, portlet.getPortletId());
349                    long siteGroupId = PortalUtil.getSiteGroupId(scopeGroupId);
350    
351                    themeDisplay.setScopeGroupId(scopeGroupId);
352                    themeDisplay.setSiteGroupId(siteGroupId);
353    
354                    if (user != null) {
355                            HttpSession session = request.getSession();
356    
357                            InvokerPortletImpl.clearResponse(
358                                    session, layout.getPrimaryKey(), portlet.getPortletId(),
359                                    LanguageUtil.getLanguageId(request));
360                    }
361    
362                    processPublicRenderParameters(request, layout, portlet);
363    
364                    if (themeDisplay.isLifecycleRender() ||
365                            themeDisplay.isLifecycleResource()) {
366    
367                            WindowState windowState = WindowStateFactory.getWindowState(
368                                    ParamUtil.getString(request, "p_p_state"));
369    
370                            if (layout.isTypeControlPanel() &&
371                                    ((windowState == null) ||
372                                            windowState.equals(WindowState.NORMAL) ||
373                                            Validator.isNull(windowState.toString()))) {
374    
375                                    windowState = WindowState.MAXIMIZED;
376                            }
377    
378                            PortletMode portletMode = PortletModeFactory.getPortletMode(
379                                    ParamUtil.getString(request, "p_p_mode"));
380    
381                            PortalUtil.updateWindowState(
382                                    portlet.getPortletId(), user, layout, windowState, request);
383    
384                            PortalUtil.updatePortletMode(
385                                    portlet.getPortletId(), user, layout, portletMode, request);
386                    }
387            }
388    
389            private ActionResult _doProcessAction(
390                            HttpServletRequest request, HttpServletResponse response,
391                            Portlet portlet)
392                    throws Exception {
393    
394                    HttpServletRequest ownerLayoutRequest = getOwnerLayoutRequestWrapper(
395                            request, portlet);
396    
397                    Layout ownerLayout = (Layout)ownerLayoutRequest.getAttribute(
398                            WebKeys.LAYOUT);
399    
400                    boolean allowAddPortletDefaultResource =
401                            PortalUtil.isAllowAddPortletDefaultResource(
402                                    ownerLayoutRequest, portlet);
403    
404                    if (!allowAddPortletDefaultResource) {
405                            String url = null;
406    
407                            LastPath lastPath = (LastPath)request.getAttribute(
408                                    WebKeys.LAST_PATH);
409    
410                            if (lastPath != null) {
411                                    StringBundler sb = new StringBundler(3);
412    
413                                    sb.append(PortalUtil.getPortalURL(request));
414                                    sb.append(lastPath.getContextPath());
415                                    sb.append(lastPath.getPath());
416    
417                                    url = sb.toString();
418                            }
419                            else {
420                                    url = String.valueOf(request.getRequestURI());
421                            }
422    
423                            _log.error(
424                                    "Reject processAction for " + url + " on " +
425                                            portlet.getPortletId());
426    
427                            return ActionResult.EMPTY_ACTION_RESULT;
428                    }
429    
430                    Layout layout = (Layout)request.getAttribute(WebKeys.LAYOUT);
431    
432                    WindowState windowState = WindowStateFactory.getWindowState(
433                            ParamUtil.getString(request, "p_p_state"));
434    
435                    if (layout.isTypeControlPanel() &&
436                            ((windowState == null) || windowState.equals(WindowState.NORMAL) ||
437                             Validator.isNull(windowState.toString()))) {
438    
439                            windowState = WindowState.MAXIMIZED;
440                    }
441    
442                    PortletMode portletMode = PortletModeFactory.getPortletMode(
443                            ParamUtil.getString(request, "p_p_mode"));
444    
445                    PortletPreferencesIds portletPreferencesIds =
446                            PortletPreferencesFactoryUtil.getPortletPreferencesIds(
447                                    request, portlet.getPortletId());
448    
449                    PortletPreferences portletPreferences =
450                            PortletPreferencesLocalServiceUtil.getPreferences(
451                                    portletPreferencesIds);
452    
453                    ServletContext servletContext = (ServletContext)request.getAttribute(
454                            WebKeys.CTX);
455    
456                    InvokerPortlet invokerPortlet = PortletInstanceFactoryUtil.create(
457                            portlet, servletContext);
458    
459                    PortletConfig portletConfig = PortletConfigFactoryUtil.create(
460                            portlet, servletContext);
461                    PortletContext portletContext = portletConfig.getPortletContext();
462    
463                    String contentType = request.getHeader(HttpHeaders.CONTENT_TYPE);
464    
465                    if (_log.isDebugEnabled()) {
466                            _log.debug("Content type " + contentType);
467                    }
468    
469                    UploadServletRequest uploadServletRequest = null;
470    
471                    try {
472                            if ((contentType != null) &&
473                                    contentType.startsWith(ContentTypes.MULTIPART_FORM_DATA)) {
474    
475                                    PortletConfigImpl invokerPortletConfigImpl =
476                                            (PortletConfigImpl)invokerPortlet.getPortletConfig();
477    
478                                    if (invokerPortlet.isStrutsPortlet() ||
479                                            invokerPortletConfigImpl.isCopyRequestParameters() ||
480                                            !invokerPortletConfigImpl.isWARFile()) {
481    
482                                            uploadServletRequest = new UploadServletRequestImpl(
483                                                    request);
484    
485                                            request = uploadServletRequest;
486                                    }
487                            }
488    
489                            if (PropsValues.AUTH_TOKEN_CHECK_ENABLED &&
490                                    invokerPortlet.isCheckAuthToken()) {
491    
492                                    AuthTokenUtil.check(request);
493                            }
494    
495                            ActionRequestImpl actionRequestImpl = ActionRequestFactory.create(
496                                    request, portlet, invokerPortlet, portletContext, windowState,
497                                    portletMode, portletPreferences, layout.getPlid());
498    
499                            User user = PortalUtil.getUser(request);
500    
501                            ActionResponseImpl actionResponseImpl =
502                                    ActionResponseFactory.create(
503                                            actionRequestImpl, response, portlet.getPortletId(), user,
504                                            layout, windowState, portletMode);
505    
506                            actionRequestImpl.defineObjects(portletConfig, actionResponseImpl);
507    
508                            ServiceContext serviceContext = ServiceContextFactory.getInstance(
509                                    actionRequestImpl);
510    
511                            ServiceContextThreadLocal.pushServiceContext(serviceContext);
512    
513                            PermissionChecker permissionChecker =
514                                    PermissionThreadLocal.getPermissionChecker();
515    
516                            ThemeDisplay themeDisplay = (ThemeDisplay)request.getAttribute(
517                                    WebKeys.THEME_DISPLAY);
518    
519                            long scopeGroupId = themeDisplay.getScopeGroupId();
520    
521                            boolean access = PortletPermissionUtil.hasAccessPermission(
522                                    permissionChecker, scopeGroupId, ownerLayout, portlet,
523                                    portletMode);
524    
525                            if (access) {
526                                    invokerPortlet.processAction(
527                                            actionRequestImpl, actionResponseImpl);
528    
529                                    actionResponseImpl.transferHeaders(response);
530                            }
531    
532                            RenderParametersPool.put(
533                                    request, layout.getPlid(), portlet.getPortletId(),
534                                    actionResponseImpl.getRenderParameterMap());
535    
536                            List<Event> events = actionResponseImpl.getEvents();
537    
538                            String redirectLocation = actionResponseImpl.getRedirectLocation();
539    
540                            if (Validator.isNull(redirectLocation) &&
541                                    portlet.isActionURLRedirect()) {
542    
543                                    PortletURL portletURL = new PortletURLImpl(
544                                            actionRequestImpl, actionRequestImpl.getPortletName(),
545                                            layout.getPlid(), PortletRequest.RENDER_PHASE);
546    
547                                    Map<String, String[]> renderParameters =
548                                            actionResponseImpl.getRenderParameterMap();
549    
550                                    for (Map.Entry<String, String[]> entry :
551                                                    renderParameters.entrySet()) {
552    
553                                            String key = entry.getKey();
554                                            String[] value = entry.getValue();
555    
556                                            portletURL.setParameter(key, value);
557                                    }
558    
559                                    redirectLocation = portletURL.toString();
560                            }
561    
562                            return new ActionResult(events, redirectLocation);
563                    }
564                    finally {
565                            if (uploadServletRequest != null) {
566                                    uploadServletRequest.cleanUp();
567                            }
568    
569                            ServiceContextThreadLocal.popServiceContext();
570                    }
571            }
572    
573            private List<Event> _doProcessEvent(
574                            HttpServletRequest request, HttpServletResponse response,
575                            Portlet portlet, Layout layout, Event event)
576                    throws Exception {
577    
578                    ServletContext servletContext = (ServletContext)request.getAttribute(
579                            WebKeys.CTX);
580    
581                    InvokerPortlet invokerPortlet = PortletInstanceFactoryUtil.create(
582                            portlet, servletContext);
583    
584                    PortletConfig portletConfig = PortletConfigFactoryUtil.create(
585                            portlet, servletContext);
586                    PortletContext portletContext = portletConfig.getPortletContext();
587    
588                    LayoutTypePortlet layoutTypePortlet =
589                            (LayoutTypePortlet)layout.getLayoutType();
590    
591                    WindowState windowState = null;
592    
593                    if (layoutTypePortlet.hasStateMaxPortletId(portlet.getPortletId())) {
594                            windowState = WindowState.MAXIMIZED;
595                    }
596                    else if (layoutTypePortlet.hasStateMinPortletId(
597                                            portlet.getPortletId())) {
598    
599                            windowState = WindowState.MINIMIZED;
600                    }
601                    else {
602                            windowState = WindowState.NORMAL;
603                    }
604    
605                    PortletMode portletMode = null;
606    
607                    if (layoutTypePortlet.hasModeAboutPortletId(portlet.getPortletId())) {
608                            portletMode = LiferayPortletMode.ABOUT;
609                    }
610                    else if (layoutTypePortlet.hasModeConfigPortletId(
611                                            portlet.getPortletId())) {
612    
613                            portletMode = LiferayPortletMode.CONFIG;
614                    }
615                    else if (layoutTypePortlet.hasModeEditPortletId(
616                                            portlet.getPortletId())) {
617    
618                            portletMode = PortletMode.EDIT;
619                    }
620                    else if (layoutTypePortlet.hasModeEditDefaultsPortletId(
621                                            portlet.getPortletId())) {
622    
623                            portletMode = LiferayPortletMode.EDIT_DEFAULTS;
624                    }
625                    else if (layoutTypePortlet.hasModeEditGuestPortletId(
626                                            portlet.getPortletId())) {
627    
628                            portletMode = LiferayPortletMode.EDIT_GUEST;
629                    }
630                    else if (layoutTypePortlet.hasModeHelpPortletId(
631                                            portlet.getPortletId())) {
632    
633                            portletMode = PortletMode.HELP;
634                    }
635                    else if (layoutTypePortlet.hasModePreviewPortletId(
636                                            portlet.getPortletId())) {
637    
638                            portletMode = LiferayPortletMode.PREVIEW;
639                    }
640                    else if (layoutTypePortlet.hasModePrintPortletId(
641                                            portlet.getPortletId())) {
642    
643                            portletMode = LiferayPortletMode.PRINT;
644                    }
645                    else {
646                            portletMode = PortletMode.VIEW;
647                    }
648    
649                    long scopeGroupId = getScopeGroupId(
650                            request, layout, portlet.getPortletId());
651    
652                    PortletPreferences portletPreferences =
653                            PortletPreferencesFactoryUtil.getPortletSetup(
654                                    scopeGroupId, layout, portlet.getPortletId(), null);
655    
656                    EventRequestImpl eventRequestImpl = EventRequestFactory.create(
657                            request, portlet, invokerPortlet, portletContext, windowState,
658                            portletMode, portletPreferences, layout.getPlid());
659    
660                    eventRequestImpl.setEvent(
661                            serializeEvent(event, invokerPortlet.getPortletClassLoader()));
662    
663                    User user = PortalUtil.getUser(request);
664                    Layout requestLayout = (Layout)request.getAttribute(WebKeys.LAYOUT);
665    
666                    EventResponseImpl eventResponseImpl = EventResponseFactory.create(
667                            eventRequestImpl, response, portlet.getPortletId(), user,
668                            requestLayout);
669    
670                    eventRequestImpl.defineObjects(portletConfig, eventResponseImpl);
671    
672                    try {
673                            invokerPortlet.processEvent(eventRequestImpl, eventResponseImpl);
674    
675                            if (eventResponseImpl.isCalledSetRenderParameter()) {
676                                    Map<String, String[]> renderParameterMap =
677                                            new HashMap<String, String[]>();
678    
679                                    renderParameterMap.putAll(
680                                            eventResponseImpl.getRenderParameterMap());
681    
682                                    RenderParametersPool.put(
683                                            request, requestLayout.getPlid(), portlet.getPortletId(),
684                                            renderParameterMap);
685                            }
686    
687                            return eventResponseImpl.getEvents();
688                    }
689                    finally {
690                            eventRequestImpl.cleanUp();
691                    }
692            }
693    
694            private void _doRender(
695                            HttpServletRequest request, HttpServletResponse response,
696                            Portlet portlet)
697                    throws Exception {
698    
699                    if ((portlet != null) && portlet.isInstanceable() &&
700                            !portlet.isAddDefaultResource()) {
701    
702                            String instanceId = portlet.getInstanceId();
703    
704                            if (!Validator.isPassword(instanceId)) {
705                                    if (_log.isDebugEnabled()) {
706                                            _log.debug(
707                                                    "Portlet " + portlet.getPortletId() +
708                                                            " is instanceable but does not have a valid " +
709                                                                    "instance id");
710                                    }
711    
712                                    portlet = null;
713                            }
714                    }
715    
716                    if (portlet == null) {
717                            return;
718                    }
719    
720                    // Capture the current portlet's settings to reset them once the child
721                    // portlet is rendered
722    
723                    ThemeDisplay themeDisplay = (ThemeDisplay)request.getAttribute(
724                            WebKeys.THEME_DISPLAY);
725    
726                    PortletDisplay portletDisplay = themeDisplay.getPortletDisplay();
727    
728                    PortletDisplay portletDisplayClone = PortletDisplayFactory.create();
729    
730                    portletDisplay.copyTo(portletDisplayClone);
731    
732                    PortletConfig portletConfig = (PortletConfig)request.getAttribute(
733                            JavaConstants.JAVAX_PORTLET_CONFIG);
734    
735                    PortletRequest portletRequest = (PortletRequest)request.getAttribute(
736                            JavaConstants.JAVAX_PORTLET_REQUEST);
737    
738                    if (!(portletRequest instanceof RenderRequest)) {
739                            portletRequest = null;
740                    }
741    
742                    PortletResponse portletResponse = (PortletResponse)request.getAttribute(
743                            JavaConstants.JAVAX_PORTLET_RESPONSE);
744    
745                    if (!(portletResponse instanceof RenderResponse)) {
746                            portletResponse = null;
747                    }
748    
749                    String lifecycle = (String)request.getAttribute(
750                            PortletRequest.LIFECYCLE_PHASE);
751    
752                    request.setAttribute(WebKeys.RENDER_PORTLET, portlet);
753    
754                    String path = (String)request.getAttribute(WebKeys.RENDER_PATH);
755    
756                    if (path == null) {
757                            path = "/html/portal/render_portlet.jsp";
758                    }
759    
760                    RequestDispatcher requestDispatcher =
761                            DirectRequestDispatcherFactoryUtil.getRequestDispatcher(
762                                    request, path);
763    
764                    BufferCacheServletResponse bufferCacheServletResponse = null;
765    
766                    boolean writeOutput = false;
767    
768                    if (response instanceof BufferCacheServletResponse) {
769                            bufferCacheServletResponse = (BufferCacheServletResponse)response;
770                    }
771                    else {
772                            writeOutput = true;
773                            bufferCacheServletResponse = new BufferCacheServletResponse(
774                                    response);
775                    }
776    
777                    try {
778                            requestDispatcher.include(request, bufferCacheServletResponse);
779    
780                            Boolean portletConfiguratorVisibility =
781                                    (Boolean)request.getAttribute(
782                                            WebKeys.PORTLET_CONFIGURATOR_VISIBILITY);
783    
784                            if (portletConfiguratorVisibility != null) {
785                                    request.removeAttribute(
786                                            WebKeys.PORTLET_CONFIGURATOR_VISIBILITY);
787    
788                                    Layout layout = themeDisplay.getLayout();
789    
790                                    if (!layout.isTypeControlPanel() &&
791                                            !LayoutPermissionUtil.contains(
792                                                    themeDisplay.getPermissionChecker(), layout,
793                                                    ActionKeys.UPDATE) &&
794                                            !PortletPermissionUtil.contains(
795                                                    themeDisplay.getPermissionChecker(), layout,
796                                                    portlet.getPortletId(), ActionKeys.CONFIGURATION)) {
797    
798                                            bufferCacheServletResponse.setCharBuffer(null);
799    
800                                            return;
801                                    }
802                            }
803    
804                            if (writeOutput) {
805                                    Writer writer = response.getWriter();
806    
807                                    writer.write(bufferCacheServletResponse.getString());
808                            }
809                    }
810                    finally {
811                            portletDisplay.copyFrom(portletDisplayClone);
812    
813                            portletDisplayClone.recycle();
814    
815                            if (portletConfig != null) {
816                                    request.setAttribute(
817                                            JavaConstants.JAVAX_PORTLET_CONFIG, portletConfig);
818                            }
819    
820                            if (portletRequest != null) {
821                                    request.setAttribute(
822                                            JavaConstants.JAVAX_PORTLET_REQUEST, portletRequest);
823                            }
824    
825                            if (portletResponse != null) {
826                                    request.setAttribute(
827                                            JavaConstants.JAVAX_PORTLET_RESPONSE, portletResponse);
828                            }
829    
830                            if (lifecycle != null) {
831                                    request.setAttribute(PortletRequest.LIFECYCLE_PHASE, lifecycle);
832                            }
833    
834                            request.removeAttribute(WebKeys.RENDER_PORTLET);
835                    }
836            }
837    
838            private void _doServeResource(
839                            HttpServletRequest request, HttpServletResponse response,
840                            Portlet portlet)
841                    throws Exception {
842    
843                    HttpServletRequest ownerLayoutRequest = getOwnerLayoutRequestWrapper(
844                            request, portlet);
845    
846                    Layout ownerLayout = (Layout)ownerLayoutRequest.getAttribute(
847                            WebKeys.LAYOUT);
848    
849                    boolean allowAddPortletDefaultResource =
850                            PortalUtil.isAllowAddPortletDefaultResource(
851                                    ownerLayoutRequest, portlet);
852    
853                    if (!allowAddPortletDefaultResource) {
854                            String url = null;
855    
856                            LastPath lastPath = (LastPath)request.getAttribute(
857                                    WebKeys.LAST_PATH);
858    
859                            if (lastPath != null) {
860                                    StringBundler sb = new StringBundler(3);
861    
862                                    sb.append(PortalUtil.getPortalURL(request));
863                                    sb.append(lastPath.getContextPath());
864                                    sb.append(lastPath.getPath());
865    
866                                    url = sb.toString();
867                            }
868                            else {
869                                    url = String.valueOf(request.getRequestURI());
870                            }
871    
872                            response.setHeader(
873                                    HttpHeaders.CACHE_CONTROL,
874                                    HttpHeaders.CACHE_CONTROL_NO_CACHE_VALUE);
875                            response.setStatus(HttpServletResponse.SC_BAD_REQUEST);
876    
877                            _log.error(
878                                    "Reject serveResource for " + url + " on " +
879                                            portlet.getPortletId());
880    
881                            return;
882                    }
883    
884                    WindowState windowState = (WindowState)request.getAttribute(
885                            WebKeys.WINDOW_STATE);
886    
887                    PortletMode portletMode = PortletModeFactory.getPortletMode(
888                            ParamUtil.getString(request, "p_p_mode"));
889    
890                    PortletPreferencesIds portletPreferencesIds =
891                            PortletPreferencesFactoryUtil.getPortletPreferencesIds(
892                                    request, portlet.getPortletId());
893    
894                    PortletPreferences portletPreferences =
895                            PortletPreferencesLocalServiceUtil.getPreferences(
896                                    portletPreferencesIds);
897    
898                    ServletContext servletContext = (ServletContext)request.getAttribute(
899                            WebKeys.CTX);
900    
901                    InvokerPortlet invokerPortlet = PortletInstanceFactoryUtil.create(
902                            portlet, servletContext);
903    
904                    PortletConfig portletConfig = PortletConfigFactoryUtil.create(
905                            portlet, servletContext);
906                    PortletContext portletContext = portletConfig.getPortletContext();
907    
908                    ThemeDisplay themeDisplay = (ThemeDisplay)request.getAttribute(
909                            WebKeys.THEME_DISPLAY);
910    
911                    PortletDisplay portletDisplay = themeDisplay.getPortletDisplay();
912    
913                    Layout layout = (Layout)request.getAttribute(WebKeys.LAYOUT);
914    
915                    String portletPrimaryKey = PortletPermissionUtil.getPrimaryKey(
916                            layout.getPlid(), portlet.getPortletId());
917    
918                    portletDisplay.setId(portlet.getPortletId());
919                    portletDisplay.setRootPortletId(portlet.getRootPortletId());
920                    portletDisplay.setInstanceId(portlet.getInstanceId());
921                    portletDisplay.setResourcePK(portletPrimaryKey);
922                    portletDisplay.setPortletName(portletConfig.getPortletName());
923                    portletDisplay.setNamespace(
924                            PortalUtil.getPortletNamespace(portlet.getPortletId()));
925    
926                    WebDAVStorage webDAVStorage = portlet.getWebDAVStorageInstance();
927    
928                    if (webDAVStorage != null) {
929                            portletDisplay.setWebDAVEnabled(true);
930                    }
931                    else {
932                            portletDisplay.setWebDAVEnabled(false);
933                    }
934    
935                    ResourceRequestImpl resourceRequestImpl = ResourceRequestFactory.create(
936                            request, portlet, invokerPortlet, portletContext, windowState,
937                            portletMode, portletPreferences, layout.getPlid());
938    
939                    long companyId = PortalUtil.getCompanyId(request);
940    
941                    ResourceResponseImpl resourceResponseImpl =
942                            ResourceResponseFactory.create(
943                                    resourceRequestImpl, response, portlet.getPortletId(),
944                                    companyId);
945    
946                    resourceRequestImpl.defineObjects(portletConfig, resourceResponseImpl);
947    
948                    try {
949                            ServiceContext serviceContext = ServiceContextFactory.getInstance(
950                                    resourceRequestImpl);
951    
952                            ServiceContextThreadLocal.pushServiceContext(serviceContext);
953    
954                            PermissionChecker permissionChecker =
955                                    PermissionThreadLocal.getPermissionChecker();
956    
957                            long scopeGroupId = themeDisplay.getScopeGroupId();
958    
959                            boolean access = PortletPermissionUtil.hasAccessPermission(
960                                    permissionChecker, scopeGroupId, ownerLayout, portlet,
961                                    portletMode);
962    
963                            if (access) {
964                                    invokerPortlet.serveResource(
965                                            resourceRequestImpl, resourceResponseImpl);
966    
967                                    resourceResponseImpl.transferHeaders(response);
968                            }
969                    }
970                    finally {
971                            ServiceContextThreadLocal.popServiceContext();
972                    }
973            }
974    
975            private static Log _log = LogFactoryUtil.getLog(PortletContainerImpl.class);
976    
977    }