001
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.util.WebKeys;
020 import com.liferay.portal.theme.ThemeDisplay;
021 import com.liferay.portal.util.PortalUtil;
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
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 }