1
22
23 package com.liferay.portlet;
24
25 import com.liferay.portal.kernel.messaging.sender.SingleDestinationMessageSender;
26 import com.liferay.portal.monitoring.RequestStatus;
27 import com.liferay.portal.monitoring.statistics.DataSampleThreadLocal;
28 import com.liferay.portal.monitoring.statistics.portlet.PortletRequestDataSample;
29 import com.liferay.portal.monitoring.statistics.portlet.PortletRequestType;
30 import com.liferay.portal.util.PropsValues;
31
32 import java.io.IOException;
33
34 import javax.portlet.ActionRequest;
35 import javax.portlet.ActionResponse;
36 import javax.portlet.EventRequest;
37 import javax.portlet.EventResponse;
38 import javax.portlet.Portlet;
39 import javax.portlet.PortletConfig;
40 import javax.portlet.PortletContext;
41 import javax.portlet.PortletException;
42 import javax.portlet.RenderRequest;
43 import javax.portlet.RenderResponse;
44 import javax.portlet.ResourceRequest;
45 import javax.portlet.ResourceResponse;
46
47
53 public class MonitoringPortlet implements InvokerPortlet {
54
55 public static boolean isMonitoringPortletActionRequest() {
56 return _monitoringPortletActionRequest;
57 }
58
59 public static boolean isMonitoringPortletEventRequest() {
60 return _monitoringPortletEventRequest;
61 }
62
63 public static boolean isMonitoringPortletRenderRequest() {
64 return _monitoringPortletRenderRequest;
65 }
66
67 public static boolean isMonitoringPortletResourceRequest() {
68 return _monitoringPortletResourceRequest;
69 }
70
71 public static void setMonitoringPortletActionRequest(
72 boolean monitoringPortletActionRequest) {
73
74 _monitoringPortletActionRequest = monitoringPortletActionRequest;
75 }
76
77 public static void setMonitoringPortletEventRequest(
78 boolean monitoringPortletEventRequest) {
79
80 _monitoringPortletEventRequest = monitoringPortletEventRequest;
81 }
82
83 public static void setMonitoringPortletRenderRequest(
84 boolean monitoringPortletRenderRequest) {
85
86 _monitoringPortletRenderRequest = monitoringPortletRenderRequest;
87 }
88
89 public static void setMonitoringPortletResourceRequest(
90 boolean monitoringPortletResourceRequest) {
91
92 _monitoringPortletResourceRequest = monitoringPortletResourceRequest;
93 }
94
95 public MonitoringPortlet(
96 InvokerPortlet invokerPortlet,
97 SingleDestinationMessageSender singleDestinationMessageSender) {
98
99 _invokerPortlet = invokerPortlet;
100 _singleDestinationMessageSender = singleDestinationMessageSender;
101 }
102
103 public InvokerPortlet create(
104 com.liferay.portal.model.Portlet portletModel, Portlet portlet,
105 PortletConfig portletConfig, PortletContext portletContext,
106 boolean facesPortlet, boolean strutsPortlet,
107 boolean strutsBridgePortlet)
108 throws PortletException {
109
110 InvokerPortlet invokerPortlet = _invokerPortlet.create(
111 portletModel, portlet, portletContext);
112
113 MonitoringPortlet monitoringPortlet = new MonitoringPortlet(
114 invokerPortlet, _singleDestinationMessageSender);
115
116 monitoringPortlet.prepare(
117 portletModel, portlet, portletConfig, portletContext, facesPortlet,
118 strutsPortlet, strutsBridgePortlet);
119
120 return monitoringPortlet;
121 }
122
123 public InvokerPortlet create(
124 com.liferay.portal.model.Portlet portletModel, Portlet portlet,
125 PortletContext portletContext)
126 throws PortletException {
127
128 InvokerPortlet invokerPortlet = _invokerPortlet.create(
129 portletModel, portlet, portletContext);
130
131 MonitoringPortlet monitoringPortlet = new MonitoringPortlet(
132 invokerPortlet, _singleDestinationMessageSender);
133
134 monitoringPortlet.prepare(portletModel, portlet, portletContext);
135
136 return monitoringPortlet;
137 }
138
139 public void destroy() {
140 _invokerPortlet.destroy();
141 }
142
143 public Integer getExpCache() {
144 return _invokerPortlet.getExpCache();
145 }
146
147 public Portlet getPortlet() {
148 return _invokerPortlet.getPortlet();
149 }
150
151 public ClassLoader getPortletClassLoader() {
152 return _invokerPortlet.getPortletClassLoader();
153 }
154
155 public PortletConfig getPortletConfig() {
156 return _invokerPortlet.getPortletConfig();
157 }
158
159 public PortletContext getPortletContext() {
160 return _invokerPortlet.getPortletContext();
161 }
162
163 public Portlet getPortletInstance() {
164 return _invokerPortlet.getPortletInstance();
165 }
166
167 public void init(PortletConfig portletConfig) throws PortletException {
168 _invokerPortlet.init(portletConfig);
169 }
170
171 public boolean isDestroyable() {
172 return _invokerPortlet.isDestroyable();
173 }
174
175 public boolean isFacesPortlet() {
176 return _invokerPortlet.isFacesPortlet();
177 }
178
179 public boolean isStrutsBridgePortlet() {
180 return _invokerPortlet.isStrutsBridgePortlet();
181 }
182
183 public boolean isStrutsPortlet() {
184 return _invokerPortlet.isStrutsPortlet();
185 }
186
187 public void prepare(
188 com.liferay.portal.model.Portlet portletModel, Portlet portlet,
189 PortletConfig portletConfig, PortletContext portletContext,
190 boolean facesPortlet, boolean strutsPortlet,
191 boolean strutsBridgePortlet)
192 throws PortletException {
193
194 _invokerPortlet.prepare(
195 portletModel, portlet, portletConfig, portletContext, facesPortlet,
196 strutsPortlet, strutsBridgePortlet);
197 }
198
199 public void prepare(
200 com.liferay.portal.model.Portlet portletModel, Portlet portlet,
201 PortletContext portletContext)
202 throws PortletException {
203
204 _invokerPortlet.prepare(portletModel, portlet, portletContext);
205 }
206
207 public void processAction(
208 ActionRequest actionRequest, ActionResponse actionResponse)
209 throws IOException, PortletException {
210
211 PortletRequestDataSample portletRequestDataSample = null;
212
213 try {
214 if (_monitoringPortletActionRequest) {
215 portletRequestDataSample = new PortletRequestDataSample(
216 PortletRequestType.ACTION, actionRequest, actionResponse);
217
218 portletRequestDataSample.prepare();
219 }
220
221 _invokerPortlet.processAction(actionRequest, actionResponse);
222
223 if (_monitoringPortletActionRequest) {
224 portletRequestDataSample.capture(RequestStatus.SUCCESS);
225 }
226 }
227 catch (Exception e) {
228 _processException(
229 _monitoringPortletActionRequest, portletRequestDataSample, e);
230 }
231 finally {
232 if (portletRequestDataSample != null) {
233 _singleDestinationMessageSender.send(portletRequestDataSample);
234
235 DataSampleThreadLocal.addDataSample(portletRequestDataSample);
236 }
237 }
238 }
239
240 public void processEvent(
241 EventRequest eventRequest, EventResponse eventResponse)
242 throws IOException, PortletException {
243
244 PortletRequestDataSample portletRequestDataSample = null;
245
246 try {
247 if (_monitoringPortletEventRequest) {
248 portletRequestDataSample = new PortletRequestDataSample(
249 PortletRequestType.EVENT, eventRequest, eventResponse);
250
251 portletRequestDataSample.prepare();
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 _singleDestinationMessageSender.send(portletRequestDataSample);
267
268 DataSampleThreadLocal.addDataSample(portletRequestDataSample);
269 }
270 }
271 }
272
273 public void render(
274 RenderRequest renderRequest, RenderResponse renderResponse)
275 throws IOException, PortletException {
276
277 PortletRequestDataSample portletRequestDataSample = null;
278
279 try {
280 if (_monitoringPortletRenderRequest) {
281 portletRequestDataSample = new PortletRequestDataSample(
282 PortletRequestType.RENDER, renderRequest, renderResponse);
283
284 portletRequestDataSample.prepare();
285 }
286
287 _invokerPortlet.render(renderRequest, renderResponse);
288
289 if (_monitoringPortletRenderRequest) {
290 portletRequestDataSample.capture(RequestStatus.SUCCESS);
291 }
292 }
293 catch (Exception e) {
294 _processException(
295 _monitoringPortletRenderRequest, portletRequestDataSample, e);
296 }
297 finally {
298 if (portletRequestDataSample != null) {
299 _singleDestinationMessageSender.send(portletRequestDataSample);
300
301 DataSampleThreadLocal.addDataSample(portletRequestDataSample);
302 }
303 }
304 }
305
306 public void serveResource(
307 ResourceRequest resourceRequest, ResourceResponse resourceResponse)
308 throws IOException, PortletException {
309
310 PortletRequestDataSample portletRequestDataSample = null;
311
312 try {
313 if (_monitoringPortletResourceRequest) {
314 portletRequestDataSample = new PortletRequestDataSample(
315 PortletRequestType.RESOURCE, resourceRequest,
316 resourceResponse);
317
318 portletRequestDataSample.prepare();
319 }
320
321 _invokerPortlet.serveResource(resourceRequest, resourceResponse);
322
323 if (_monitoringPortletResourceRequest) {
324 portletRequestDataSample.capture(RequestStatus.SUCCESS);
325 }
326 }
327 catch (Exception e) {
328 _processException(
329 _monitoringPortletResourceRequest, portletRequestDataSample, e);
330 }
331 finally {
332 if (portletRequestDataSample != null) {
333 _singleDestinationMessageSender.send(portletRequestDataSample);
334
335 DataSampleThreadLocal.addDataSample(portletRequestDataSample);
336 }
337 }
338 }
339
340 public void setPortletFilters() throws PortletException {
341 _invokerPortlet.setPortletFilters();
342 }
343
344 private void _processException(
345 boolean monitoringPortletRequest,
346 PortletRequestDataSample portletRequestDataSample, Exception e)
347 throws IOException, PortletException {
348
349 if (monitoringPortletRequest) {
350 portletRequestDataSample.capture(RequestStatus.ERROR);
351 }
352
353 if (e instanceof IOException) {
354 throw (IOException)e;
355 }
356 else if (e instanceof PortletException) {
357 throw (PortletException)e;
358 }
359 else {
360 throw new PortletException("Unable to process portlet", e);
361 }
362 }
363
364 private static boolean _monitoringPortletActionRequest =
365 PropsValues.MONITORING_PORTLET_ACTION_REQUEST;
366 private static boolean _monitoringPortletEventRequest =
367 PropsValues.MONITORING_PORTLET_EVENT_REQUEST;
368 private static boolean _monitoringPortletRenderRequest =
369 PropsValues.MONITORING_PORTLET_RENDER_REQUEST;
370 private static boolean _monitoringPortletResourceRequest =
371 PropsValues.MONITORING_PORTLET_RESOURCE_REQUEST;
372
373 private InvokerPortlet _invokerPortlet;
374 private SingleDestinationMessageSender _singleDestinationMessageSender;
375
376 }