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.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
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 }