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