001: /*
002: * Copyright 2002-2006 the original author or authors.
003: *
004: * Licensed under the Apache License, Version 2.0 (the "License");
005: * you may not use this file except in compliance with the License.
006: * You may obtain a copy of the License at
007: *
008: * http://www.apache.org/licenses/LICENSE-2.0
009: *
010: * Unless required by applicable law or agreed to in writing, software
011: * distributed under the License is distributed on an "AS IS" BASIS,
012: * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013: * See the License for the specific language governing permissions and
014: * limitations under the License.
015: */
016:
017: package org.springframework.aop.interceptor;
018:
019: import com.jamonapi.Monitor;
020: import com.jamonapi.MonitorFactory;
021: import org.aopalliance.intercept.MethodInvocation;
022: import org.apache.commons.logging.Log;
023:
024: /**
025: * Performance monitor interceptor that uses <b>JAMon</b> library
026: * to perform the performance measurement on the intercepted method
027: * and output the stats.
028: *
029: * <p>This code is inspired by Thierry Templier's blog.
030: *
031: * @author Dmitriy Kopylenko
032: * @author Juergen Hoeller
033: * @author Rob Harrop
034: * @since 1.1.3
035: * @see com.jamonapi.MonitorFactory
036: * @see PerformanceMonitorInterceptor
037: */
038: public class JamonPerformanceMonitorInterceptor extends
039: AbstractMonitoringInterceptor {
040:
041: private boolean trackAllInvocations = false;
042:
043: /**
044: * Create a new JamonPerformanceMonitorInterceptor with a static logger.
045: */
046: public JamonPerformanceMonitorInterceptor() {
047: }
048:
049: /**
050: * Create a new JamonPerformanceMonitorInterceptor with a dynamic or static logger,
051: * according to the given flag.
052: * @param useDynamicLogger whether to use a dynamic logger or a static logger
053: * @see #setUseDynamicLogger
054: */
055: public JamonPerformanceMonitorInterceptor(boolean useDynamicLogger) {
056: setUseDynamicLogger(useDynamicLogger);
057: }
058:
059: /**
060: * Create a new JamonPerformanceMonitorInterceptor with a dynamic or static logger,
061: * according to the given flag.
062: * @param useDynamicLogger whether to use a dynamic logger or a static logger
063: * @param trackAllInvocations whether to track all invocations that go through
064: * this interceptor, or just invocations with trace logging enabled
065: * @see #setUseDynamicLogger
066: */
067: public JamonPerformanceMonitorInterceptor(boolean useDynamicLogger,
068: boolean trackAllInvocations) {
069: setUseDynamicLogger(useDynamicLogger);
070: setTrackAllInvocations(trackAllInvocations);
071: }
072:
073: /**
074: * Set whether to track all invocations that go through this interceptor,
075: * or just invocations with trace logging enabled.
076: * <p>Default is "false": Only invocations with trace logging enabled will
077: * be monitored. Specify "true" to let JAMon track all invocations,
078: * gathering statistics even when trace logging is disabled.
079: */
080: public void setTrackAllInvocations(boolean trackAllInvocations) {
081: this .trackAllInvocations = trackAllInvocations;
082: }
083:
084: /**
085: * Always applies the interceptor if the "trackAllInvocations" flag has been set;
086: * else just kicks in if the log is enabled.
087: * @see #setTrackAllInvocations
088: * @see #isLogEnabled
089: */
090: protected boolean isInterceptorEnabled(MethodInvocation invocation,
091: Log logger) {
092: return (this .trackAllInvocations || isLogEnabled(logger));
093: }
094:
095: /**
096: * Wraps the invocation with a JAMon Monitor and writes the current
097: * performance statistics to the log (if enabled).
098: * @see com.jamonapi.MonitorFactory#start
099: * @see com.jamonapi.Monitor#stop
100: */
101: protected Object invokeUnderTrace(MethodInvocation invocation,
102: Log logger) throws Throwable {
103: String name = createInvocationTraceName(invocation);
104: Monitor monitor = MonitorFactory.start(name);
105: try {
106: return invocation.proceed();
107: } finally {
108: monitor.stop();
109: if (!this .trackAllInvocations || isLogEnabled(logger)) {
110: logger
111: .trace("JAMon performance statistics for method ["
112: + name + "]:\n" + monitor);
113: }
114: }
115: }
116:
117: }
|