001
014
015 package com.liferay.portal.layoutconfiguration.util;
016
017 import com.liferay.portal.kernel.executor.CopyThreadLocalCallable;
018 import com.liferay.portal.kernel.portlet.PortletContainerException;
019 import com.liferay.portal.kernel.portlet.PortletContainerUtil;
020 import com.liferay.portal.kernel.portlet.RestrictPortletServletRequest;
021 import com.liferay.portal.kernel.servlet.BufferCacheServletResponse;
022 import com.liferay.portal.kernel.util.StringBundler;
023 import com.liferay.portal.model.Portlet;
024 import com.liferay.portal.theme.ThemeDisplay;
025 import com.liferay.portal.util.WebKeys;
026
027 import java.io.IOException;
028
029 import java.util.concurrent.Callable;
030
031 import javax.servlet.http.HttpServletRequest;
032 import javax.servlet.http.HttpServletResponse;
033
034
037 public class PortletRenderer {
038
039 public PortletRenderer(
040 Portlet portlet, String columnId, Integer columnCount,
041 Integer columnPos) {
042
043 _portlet = portlet;
044 _columnCount = columnCount;
045 _columnId = columnId;
046 _columnPos = columnPos;
047 }
048
049 public void finishParallelRender() {
050 if (_restrictPortletServletRequest != null) {
051 _restrictPortletServletRequest.mergeSharedAttributes();
052 }
053 }
054
055 public Callable<StringBundler> getCallable(
056 HttpServletRequest request, HttpServletResponse response) {
057
058 return new PortletRendererCallable(request, response);
059 }
060
061 public Portlet getPortlet() {
062 return _portlet;
063 }
064
065 public StringBundler render(
066 HttpServletRequest request, HttpServletResponse response)
067 throws PortletContainerException {
068
069 request = PortletContainerUtil.setupOptionalRenderParameters(
070 request, null, _columnId, _columnPos, _columnCount);
071
072 return _render(request, response);
073 }
074
075 public StringBundler renderAjax(
076 HttpServletRequest request, HttpServletResponse response)
077 throws PortletContainerException {
078
079 request = PortletContainerUtil.setupOptionalRenderParameters(
080 request, _RENDER_PATH, null, null, null);
081
082 _restrictPortletServletRequest = (RestrictPortletServletRequest)request;
083
084 return _render(request, response);
085 }
086
087 public StringBundler renderError(
088 HttpServletRequest request, HttpServletResponse response)
089 throws PortletContainerException {
090
091 request.setAttribute(
092 WebKeys.PARALLEL_RENDERING_TIMEOUT_ERROR, Boolean.TRUE);
093
094 request = PortletContainerUtil.setupOptionalRenderParameters(
095 request, null, null, null, null);
096
097 _restrictPortletServletRequest = (RestrictPortletServletRequest)request;
098
099 try {
100 return _render(request, response);
101 }
102 finally {
103 request.removeAttribute(WebKeys.PARALLEL_RENDERING_TIMEOUT_ERROR);
104 }
105 }
106
107 private StringBundler _render(
108 HttpServletRequest request, HttpServletResponse response)
109 throws PortletContainerException {
110
111 BufferCacheServletResponse bufferCacheServletResponse =
112 new BufferCacheServletResponse(response);
113
114 Object portletParallelRender = request.getAttribute(
115 WebKeys.PORTLET_PARALLEL_RENDER);
116
117 request.setAttribute(WebKeys.PORTLET_PARALLEL_RENDER, Boolean.FALSE);
118
119 try {
120 PortletContainerUtil.render(
121 request, bufferCacheServletResponse, _portlet);
122
123 return bufferCacheServletResponse.getStringBundler();
124 }
125 catch (IOException ioe) {
126 throw new PortletContainerException(ioe);
127 }
128 finally {
129 request.setAttribute(
130 WebKeys.PORTLET_PARALLEL_RENDER, portletParallelRender);
131 }
132
133 }
134
135 private static final String _RENDER_PATH =
136 "/html/portal/load_render_portlet.jsp";
137
138 private Integer _columnCount;
139 private String _columnId;
140 private Integer _columnPos;
141 private Portlet _portlet;
142 private RestrictPortletServletRequest _restrictPortletServletRequest;
143
144 private class PortletRendererCallable
145 extends CopyThreadLocalCallable<StringBundler> {
146
147 public PortletRendererCallable(
148 HttpServletRequest request, HttpServletResponse response) {
149
150 super(
151 ParallelRenderThreadLocalBinderUtil.getThreadLocalBinder(),
152 false, true);
153
154 _request= request;
155 _response = response;
156 }
157
158 @Override
159 public StringBundler doCall() throws Exception {
160 ThemeDisplay themeDisplay = (ThemeDisplay)_request.getAttribute(
161 WebKeys.THEME_DISPLAY);
162
163 HttpServletRequest request =
164 PortletContainerUtil.setupOptionalRenderParameters(
165 _request, null, _columnId, _columnPos, _columnCount);
166
167 _restrictPortletServletRequest =
168 (RestrictPortletServletRequest)request;
169
170 try {
171 themeDisplay = (ThemeDisplay)themeDisplay.clone();
172
173 request.setAttribute(WebKeys.THEME_DISPLAY, themeDisplay);
174
175 return _render(request, _response);
176 }
177 catch (Exception e) {
178
179
180
181
182
183 Thread currentThread = Thread.currentThread();
184
185 if (!currentThread.isInterrupted()) {
186 throw e;
187 }
188
189 return null;
190 }
191 }
192
193 private HttpServletRequest _request;
194 private HttpServletResponse _response;
195 }
196
197 }