package org.jdbcdslog; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.sql.CallableStatement; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.util.Map; import java.util.TreeMap; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class CallableStatementLoggingProxy extends PreparedStatementLoggingProxy implements InvocationHandler { static Logger logger = LoggerFactory.getLogger(CallableStatementLoggingProxy.class); Map namedParameters = new TreeMap(); public CallableStatementLoggingProxy(CallableStatement ps, String sql) { super(ps, sql); } public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { String methodName = "invoke() "; if(logger.isDebugEnabled()) logger.debug(methodName + "method = " + method); Object r = null; try { boolean toLog = (StatementLogger.logger.isInfoEnabled() || SlowQueryLogger.logger.isInfoEnabled()) && executeMethods.contains(method.getName()); long t1 = 0; if(toLog) t1 = System.currentTimeMillis(); if(logger.isDebugEnabled()) logger.debug(methodName + "before method call."); r = method.invoke(target, args); if(logger.isDebugEnabled()) logger.debug(methodName + "after method call. result = " + r); if(setMethods.contains(method.getName()) && args[0] instanceof Integer) parameters.put(args[0], args[1]); if(setMethods.contains(method.getName()) && args[0] instanceof String) namedParameters.put(args[0], args[1]); if("clearParameters".equals(method.getName())) parameters = new TreeMap(); if(toLog) { long t2 = System.currentTimeMillis(); long time = t2 - t1; StringBuffer s = LogUtils.createLogEntry(method, sql, parametersToString(), namedParameters.toString()); String logEntry = s.append(" ").append(t2 - t1).append(" ms.").toString(); StatementLogger.logger.info(logEntry); if(time >= ConfigurationParameters.slowQueryThreshold) SlowQueryLogger.logger.info(logEntry); } if(r instanceof ResultSet) r = ResultSetLoggingProxy.wrapByResultSetProxy((ResultSet)r); } catch(Throwable t) { LogUtils.handleException(t, StatementLogger.logger, LogUtils.createLogEntry(method, args[0], parametersToString(), namedParameters.toString())); } return r; } }