001
014
015 package com.liferay.portlet;
016
017 import aQute.bnd.annotation.ProviderType;
018
019 import com.liferay.portal.kernel.monitoring.RequestStatus;
020 import com.liferay.portal.kernel.monitoring.statistics.DataSampleThreadLocal;
021 import com.liferay.portal.kernel.portlet.LiferayPortletConfig;
022 import com.liferay.portal.monitoring.statistics.portlet.PortletRequestDataSample;
023 import com.liferay.portal.monitoring.statistics.portlet.PortletRequestType;
024 import com.liferay.portal.util.PropsValues;
025
026 import java.io.IOException;
027
028 import java.util.List;
029
030 import javax.portlet.ActionRequest;
031 import javax.portlet.ActionResponse;
032 import javax.portlet.EventRequest;
033 import javax.portlet.EventResponse;
034 import javax.portlet.Portlet;
035 import javax.portlet.PortletConfig;
036 import javax.portlet.PortletContext;
037 import javax.portlet.PortletException;
038 import javax.portlet.RenderRequest;
039 import javax.portlet.RenderResponse;
040 import javax.portlet.ResourceRequest;
041 import javax.portlet.ResourceResponse;
042 import javax.portlet.filter.ActionFilter;
043 import javax.portlet.filter.EventFilter;
044 import javax.portlet.filter.RenderFilter;
045 import javax.portlet.filter.ResourceFilter;
046
047
052 @ProviderType
053 public class MonitoringPortlet
054 implements InvokerFilterContainer, InvokerPortlet {
055
056 public static boolean isMonitoringPortletActionRequest() {
057 return _monitoringPortletActionRequest;
058 }
059
060 public static boolean isMonitoringPortletEventRequest() {
061 return _monitoringPortletEventRequest;
062 }
063
064 public static boolean isMonitoringPortletRenderRequest() {
065 return _monitoringPortletRenderRequest;
066 }
067
068 public static boolean isMonitoringPortletResourceRequest() {
069 return _monitoringPortletResourceRequest;
070 }
071
072 public static void setMonitoringPortletActionRequest(
073 boolean monitoringPortletActionRequest) {
074
075 _monitoringPortletActionRequest = monitoringPortletActionRequest;
076 }
077
078 public static void setMonitoringPortletEventRequest(
079 boolean monitoringPortletEventRequest) {
080
081 _monitoringPortletEventRequest = monitoringPortletEventRequest;
082 }
083
084 public static void setMonitoringPortletRenderRequest(
085 boolean monitoringPortletRenderRequest) {
086
087 _monitoringPortletRenderRequest = monitoringPortletRenderRequest;
088 }
089
090 public static void setMonitoringPortletResourceRequest(
091 boolean monitoringPortletResourceRequest) {
092
093 _monitoringPortletResourceRequest = monitoringPortletResourceRequest;
094 }
095
096 public MonitoringPortlet(InvokerPortlet invokerPortlet) {
097 _invokerPortlet = invokerPortlet;
098 }
099
100 @Override
101 public void destroy() {
102 _invokerPortlet.destroy();
103 }
104
105 @Override
106 public List<ActionFilter> getActionFilters() {
107 InvokerFilterContainer invokerFilterContainer =
108 (InvokerFilterContainer)_invokerPortlet;
109
110 return invokerFilterContainer.getActionFilters();
111 }
112
113 @Override
114 public List<EventFilter> getEventFilters() {
115 InvokerFilterContainer invokerFilterContainer =
116 (InvokerFilterContainer)_invokerPortlet;
117
118 return invokerFilterContainer.getEventFilters();
119 }
120
121 @Override
122 public Integer getExpCache() {
123 return _invokerPortlet.getExpCache();
124 }
125
126 @Override
127 public Portlet getPortlet() {
128 return _invokerPortlet.getPortlet();
129 }
130
131 @Override
132 public ClassLoader getPortletClassLoader() {
133 return _invokerPortlet.getPortletClassLoader();
134 }
135
136 @Override
137 public PortletConfig getPortletConfig() {
138 return _invokerPortlet.getPortletConfig();
139 }
140
141 @Override
142 public PortletContext getPortletContext() {
143 return _invokerPortlet.getPortletContext();
144 }
145
146 @Override
147 public Portlet getPortletInstance() {
148 return _invokerPortlet.getPortletInstance();
149 }
150
151 @Override
152 public List<RenderFilter> getRenderFilters() {
153 InvokerFilterContainer invokerFilterContainer =
154 (InvokerFilterContainer)_invokerPortlet;
155
156 return invokerFilterContainer.getRenderFilters();
157 }
158
159 @Override
160 public List<ResourceFilter> getResourceFilters() {
161 InvokerFilterContainer invokerFilterContainer =
162 (InvokerFilterContainer)_invokerPortlet;
163
164 return invokerFilterContainer.getResourceFilters();
165 }
166
167 @Override
168 public void init(PortletConfig portletConfig) throws PortletException {
169 LiferayPortletConfig liferayPortletConfig =
170 (LiferayPortletConfig)portletConfig;
171
172 _invokerPortlet.init(liferayPortletConfig);
173
174 com.liferay.portal.model.Portlet portletModel =
175 liferayPortletConfig.getPortlet();
176
177 _actionTimeout = portletModel.getActionTimeout();
178 _renderTimeout = portletModel.getRenderTimeout();
179 }
180
181 @Override
182 public boolean isCheckAuthToken() {
183 return _invokerPortlet.isCheckAuthToken();
184 }
185
186 @Override
187 public boolean isFacesPortlet() {
188 return _invokerPortlet.isFacesPortlet();
189 }
190
191 @Override
192 public boolean isStrutsBridgePortlet() {
193 return _invokerPortlet.isStrutsBridgePortlet();
194 }
195
196 @Override
197 public boolean isStrutsPortlet() {
198 return _invokerPortlet.isStrutsPortlet();
199 }
200
201 @Override
202 public void processAction(
203 ActionRequest actionRequest, ActionResponse actionResponse)
204 throws IOException, PortletException {
205
206 PortletRequestDataSample portletRequestDataSample = null;
207
208 try {
209 if (_monitoringPortletActionRequest) {
210 portletRequestDataSample = new PortletRequestDataSample(
211 PortletRequestType.ACTION, actionRequest, actionResponse);
212
213 portletRequestDataSample.setTimeout(_actionTimeout);
214
215 portletRequestDataSample.prepare();
216
217 DataSampleThreadLocal.initialize();
218 }
219
220 _invokerPortlet.processAction(actionRequest, actionResponse);
221
222 if (_monitoringPortletActionRequest) {
223 portletRequestDataSample.capture(RequestStatus.SUCCESS);
224 }
225 }
226 catch (Exception e) {
227 _processException(
228 _monitoringPortletActionRequest, portletRequestDataSample, e);
229 }
230 finally {
231 if (portletRequestDataSample != null) {
232 DataSampleThreadLocal.addDataSample(portletRequestDataSample);
233 }
234 }
235 }
236
237 @Override
238 public void processEvent(
239 EventRequest eventRequest, EventResponse eventResponse)
240 throws IOException, PortletException {
241
242 PortletRequestDataSample portletRequestDataSample = null;
243
244 try {
245 if (_monitoringPortletEventRequest) {
246 portletRequestDataSample = new PortletRequestDataSample(
247 PortletRequestType.EVENT, eventRequest, eventResponse);
248
249 portletRequestDataSample.prepare();
250
251 DataSampleThreadLocal.initialize();
252 }
253
254 _invokerPortlet.processEvent(eventRequest, eventResponse);
255
256 if (_monitoringPortletEventRequest) {
257 portletRequestDataSample.capture(RequestStatus.SUCCESS);
258 }
259 }
260 catch (Exception e) {
261 _processException(
262 _monitoringPortletEventRequest, portletRequestDataSample, e);
263 }
264 finally {
265 if (portletRequestDataSample != null) {
266 DataSampleThreadLocal.addDataSample(portletRequestDataSample);
267 }
268 }
269 }
270
271 @Override
272 public void render(
273 RenderRequest renderRequest, RenderResponse renderResponse)
274 throws IOException, PortletException {
275
276 PortletRequestDataSample portletRequestDataSample = null;
277
278 try {
279 if (_monitoringPortletRenderRequest) {
280 portletRequestDataSample = new PortletRequestDataSample(
281 PortletRequestType.RENDER, renderRequest, renderResponse);
282
283 portletRequestDataSample.setTimeout(_renderTimeout);
284
285 portletRequestDataSample.prepare();
286
287 DataSampleThreadLocal.initialize();
288 }
289
290 _invokerPortlet.render(renderRequest, renderResponse);
291
292 if (_monitoringPortletRenderRequest) {
293 portletRequestDataSample.capture(RequestStatus.SUCCESS);
294 }
295 }
296 catch (Exception e) {
297 _processException(
298 _monitoringPortletRenderRequest, portletRequestDataSample, e);
299 }
300 finally {
301 if (portletRequestDataSample != null) {
302 DataSampleThreadLocal.addDataSample(portletRequestDataSample);
303 }
304 }
305 }
306
307 @Override
308 public void serveResource(
309 ResourceRequest resourceRequest, ResourceResponse resourceResponse)
310 throws IOException, PortletException {
311
312 PortletRequestDataSample portletRequestDataSample = null;
313
314 try {
315 if (_monitoringPortletResourceRequest) {
316 portletRequestDataSample = new PortletRequestDataSample(
317 PortletRequestType.RESOURCE, resourceRequest,
318 resourceResponse);
319
320 portletRequestDataSample.prepare();
321
322 DataSampleThreadLocal.initialize();
323 }
324
325 _invokerPortlet.serveResource(resourceRequest, resourceResponse);
326
327 if (_monitoringPortletResourceRequest) {
328 portletRequestDataSample.capture(RequestStatus.SUCCESS);
329 }
330 }
331 catch (Exception e) {
332 _processException(
333 _monitoringPortletResourceRequest, portletRequestDataSample, e);
334 }
335 finally {
336 if (portletRequestDataSample != null) {
337 DataSampleThreadLocal.addDataSample(portletRequestDataSample);
338 }
339 }
340 }
341
342 public void setInvokerPortlet(InvokerPortlet invokerPortlet) {
343 _invokerPortlet = invokerPortlet;
344 }
345
346 @Override
347 public void setPortletFilters() throws PortletException {
348 _invokerPortlet.setPortletFilters();
349 }
350
351 private void _processException(
352 boolean monitoringPortletRequest,
353 PortletRequestDataSample portletRequestDataSample, Exception e)
354 throws IOException, PortletException {
355
356 if (monitoringPortletRequest) {
357 portletRequestDataSample.capture(RequestStatus.ERROR);
358 }
359
360 if (e instanceof IOException) {
361 throw (IOException)e;
362 }
363 else if (e instanceof PortletException) {
364 throw (PortletException)e;
365 }
366 else {
367 throw new PortletException("Unable to process portlet", e);
368 }
369 }
370
371 private static boolean _monitoringPortletActionRequest =
372 PropsValues.MONITORING_PORTLET_ACTION_REQUEST;
373 private static boolean _monitoringPortletEventRequest =
374 PropsValues.MONITORING_PORTLET_EVENT_REQUEST;
375 private static boolean _monitoringPortletRenderRequest =
376 PropsValues.MONITORING_PORTLET_RENDER_REQUEST;
377 private static boolean _monitoringPortletResourceRequest =
378 PropsValues.MONITORING_PORTLET_RESOURCE_REQUEST;
379
380 private long _actionTimeout;
381 private InvokerPortlet _invokerPortlet;
382 private long _renderTimeout;
383
384 }