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 private static final String _RENDER_PATH =
135 "/html/portal/load_render_portlet.jsp";
136
137 private Integer _columnCount;
138 private String _columnId;
139 private Integer _columnPos;
140 private Portlet _portlet;
141 private RestrictPortletServletRequest _restrictPortletServletRequest;
142
143 private class PortletRendererCallable
144 extends CopyThreadLocalCallable<StringBundler> {
145
146 public PortletRendererCallable(
147 HttpServletRequest request, HttpServletResponse response) {
148
149 super(
150 ParallelRenderThreadLocalBinderUtil.getThreadLocalBinder(),
151 false, true);
152
153 _request = request;
154 _response = response;
155 }
156
157 @Override
158 public StringBundler doCall() throws Exception {
159 ThemeDisplay themeDisplay = (ThemeDisplay)_request.getAttribute(
160 WebKeys.THEME_DISPLAY);
161
162 HttpServletRequest request =
163 PortletContainerUtil.setupOptionalRenderParameters(
164 _request, null, _columnId, _columnPos, _columnCount);
165
166 _restrictPortletServletRequest =
167 (RestrictPortletServletRequest)request;
168
169 try {
170 themeDisplay = (ThemeDisplay)themeDisplay.clone();
171
172 request.setAttribute(WebKeys.THEME_DISPLAY, themeDisplay);
173
174 return _render(request, _response);
175 }
176 catch (Exception e) {
177
178
179
180
181
182 Thread currentThread = Thread.currentThread();
183
184 if (!currentThread.isInterrupted()) {
185 throw e;
186 }
187
188 return null;
189 }
190 }
191
192 private HttpServletRequest _request;
193 private HttpServletResponse _response;
194 }
195
196 }