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.io.OutputStreamWriter;
018    import com.liferay.portal.kernel.servlet.taglib.aui.ScriptData;
019    import com.liferay.portal.kernel.theme.ThemeDisplay;
020    import com.liferay.portal.kernel.util.PortalUtil;
021    import com.liferay.portal.kernel.util.WebKeys;
022    
023    import java.io.IOException;
024    import java.io.OutputStream;
025    
026    import javax.portlet.MimeResponse;
027    import javax.portlet.PortletException;
028    import javax.portlet.RenderRequest;
029    import javax.portlet.RenderResponse;
030    import javax.portlet.ResourceRequest;
031    import javax.portlet.ResourceResponse;
032    import javax.portlet.filter.FilterChain;
033    import javax.portlet.filter.FilterConfig;
034    import javax.portlet.filter.PortletResponseWrapper;
035    import javax.portlet.filter.RenderFilter;
036    import javax.portlet.filter.ResourceFilter;
037    
038    import javax.servlet.http.HttpServletRequest;
039    
040    /**
041     * @author Shuyang Zhou
042     * @author Bruno Basto
043     * @author Eduardo Lundgren
044     */
045    public class ScriptDataPortletFilter implements RenderFilter, ResourceFilter {
046    
047            @Override
048            public void destroy() {
049            }
050    
051            @Override
052            public void doFilter(
053                            RenderRequest renderRequest, RenderResponse renderResponse,
054                            FilterChain filterChain)
055                    throws IOException, PortletException {
056    
057                    filterChain.doFilter(renderRequest, renderResponse);
058    
059                    HttpServletRequest request = PortalUtil.getHttpServletRequest(
060                            renderRequest);
061    
062                    ScriptData scriptData = (ScriptData)request.getAttribute(
063                            WebKeys.AUI_SCRIPT_DATA);
064    
065                    if (scriptData == null) {
066                            return;
067                    }
068    
069                    ThemeDisplay themeDisplay = (ThemeDisplay)renderRequest.getAttribute(
070                            WebKeys.THEME_DISPLAY);
071    
072                    if (themeDisplay.isIsolated() || themeDisplay.isStateExclusive()) {
073                            _flushScriptData(
074                                    request, scriptData, _getMimeResponseImpl(renderResponse));
075                    }
076            }
077    
078            @Override
079            public void doFilter(
080                            ResourceRequest resourceRequest, ResourceResponse resourceResponse,
081                            FilterChain filterChain)
082                    throws IOException, PortletException {
083    
084                    filterChain.doFilter(resourceRequest, resourceResponse);
085    
086                    HttpServletRequest request = PortalUtil.getHttpServletRequest(
087                            resourceRequest);
088    
089                    ScriptData scriptData = (ScriptData)request.getAttribute(
090                            WebKeys.AUI_SCRIPT_DATA);
091    
092                    if (scriptData == null) {
093                            return;
094                    }
095    
096                    _flushScriptData(
097                            request, scriptData, _getMimeResponseImpl(resourceResponse));
098            }
099    
100            @Override
101            public void init(FilterConfig filterConfig) {
102            }
103    
104            private void _flushScriptData(
105                            HttpServletRequest request, ScriptData scriptData,
106                            MimeResponseImpl mimeResponseImpl)
107                    throws IOException {
108    
109                    if (mimeResponseImpl.isCalledGetPortletOutputStream()) {
110                            OutputStream outputStream =
111                                    mimeResponseImpl.getPortletOutputStream();
112    
113                            OutputStreamWriter outputStreamWriter = new OutputStreamWriter(
114                                    outputStream);
115    
116                            scriptData.writeTo(request, outputStreamWriter);
117    
118                            outputStreamWriter.flush();
119                    }
120                    else {
121                            scriptData.writeTo(request, mimeResponseImpl.getWriter());
122                    }
123            }
124    
125            private MimeResponseImpl _getMimeResponseImpl(MimeResponse mimeResponse) {
126                    while (!(mimeResponse instanceof MimeResponseImpl) &&
127                            (mimeResponse instanceof PortletResponseWrapper)) {
128    
129                            PortletResponseWrapper portletResponseWrapper =
130                                    (PortletResponseWrapper)mimeResponse;
131    
132                            mimeResponse = (MimeResponse)portletResponseWrapper.getResponse();
133                    }
134    
135                    return (MimeResponseImpl)mimeResponse;
136            }
137    
138    }