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(scriptData, _getMimeResponseImpl(renderResponse));
074                    }
075            }
076    
077            @Override
078            public void doFilter(
079                            ResourceRequest resourceRequest, ResourceResponse resourceResponse,
080                            FilterChain filterChain)
081                    throws IOException, PortletException {
082    
083                    filterChain.doFilter(resourceRequest, resourceResponse);
084    
085                    HttpServletRequest request = PortalUtil.getHttpServletRequest(
086                            resourceRequest);
087    
088                    ScriptData scriptData = (ScriptData)request.getAttribute(
089                            WebKeys.AUI_SCRIPT_DATA);
090    
091                    if (scriptData == null) {
092                            return;
093                    }
094    
095                    _flushScriptData(scriptData, _getMimeResponseImpl(resourceResponse));
096            }
097    
098            @Override
099            public void init(FilterConfig filterConfig) {
100            }
101    
102            private void _flushScriptData(
103                            ScriptData scriptData, MimeResponseImpl mimeResponseImpl)
104                    throws IOException {
105    
106                    if (mimeResponseImpl.isCalledGetPortletOutputStream()) {
107                            OutputStream outputStream =
108                                    mimeResponseImpl.getPortletOutputStream();
109    
110                            OutputStreamWriter outputStreamWriter = new OutputStreamWriter(
111                                    outputStream);
112    
113                            scriptData.writeTo(outputStreamWriter);
114    
115                            outputStreamWriter.flush();
116                    }
117                    else {
118                            scriptData.writeTo(mimeResponseImpl.getWriter());
119                    }
120            }
121    
122            private MimeResponseImpl _getMimeResponseImpl(MimeResponse mimeResponse) {
123                    while (!(mimeResponse instanceof MimeResponseImpl) &&
124                            (mimeResponse instanceof PortletResponseWrapper)) {
125    
126                            PortletResponseWrapper portletResponseWrapper =
127                                    (PortletResponseWrapper)mimeResponse;
128    
129                            mimeResponse = (MimeResponse)portletResponseWrapper.getResponse();
130                    }
131    
132                    return (MimeResponseImpl)mimeResponse;
133            }
134    
135    }