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