001    /**
002     * Copyright 2010-2013 The Kuali Foundation
003     *
004     * Licensed under the Educational Community 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.opensource.org/licenses/ecl2.php
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    package org.kuali.common.jdbc.listeners;
017    
018    import org.kuali.common.jdbc.model.LogSqlMode;
019    import org.kuali.common.jdbc.model.event.SqlEvent;
020    import org.kuali.common.util.Assert;
021    import org.kuali.common.util.FormatUtils;
022    import org.kuali.common.util.Str;
023    import org.kuali.common.util.log.LoggerLevel;
024    import org.kuali.common.util.log.LoggerUtils;
025    import org.slf4j.Logger;
026    import org.slf4j.LoggerFactory;
027    
028    public final class LogSqlListener extends NoOpSqlListener {
029    
030            private static final Logger logger = LoggerFactory.getLogger(LogSqlListener.class);
031            public static final LoggerLevel DEFAULT_LOGGER_LEVEL = LoggerLevel.DEBUG;
032            public static final LogSqlMode DEFAULT_MODE = LogSqlMode.AFTER;
033            public static final boolean DEFAULT_FLATTEN = true;
034    
035            private final LoggerLevel level;
036            private final boolean flatten;
037            private final LogSqlMode mode;
038    
039            public LogSqlListener() {
040                    this(DEFAULT_LOGGER_LEVEL, DEFAULT_MODE, DEFAULT_FLATTEN);
041            }
042    
043            public LogSqlListener(LoggerLevel level, LogSqlMode mode) {
044                    this(level, mode, DEFAULT_FLATTEN);
045            }
046    
047            public LogSqlListener(LoggerLevel level, LogSqlMode mode, boolean flatten) {
048                    Assert.noNulls(level, mode);
049                    this.level = level;
050                    this.mode = mode;
051                    this.flatten = flatten;
052            }
053    
054            @Override
055            public void beforeExecuteSql(SqlEvent event) {
056                    switch (mode) {
057                    case BEFORE:
058                    case BOTH:
059                            String sql = getSql(event.getSql(), flatten);
060                            LoggerUtils.logMsg(sql, logger, level);
061                            return;
062                    case AFTER:
063                            return;
064                    default:
065                            throw new IllegalArgumentException("Mode [" + mode + "] is unknown");
066                    }
067            }
068    
069            @Override
070            public void afterExecuteSql(SqlEvent event) {
071                    switch (mode) {
072                    case BEFORE:
073                            return;
074                    case BOTH:
075                    case AFTER:
076                            String sql = getSql(event.getSql(), flatten);
077                            String elapsed = FormatUtils.getTime(event.getStopTimeMillis() - event.getStartTimeMillis());
078                            Object[] args = { sql, elapsed };
079                            LoggerUtils.logMsg("{} - {}", args, logger, level);
080                            return;
081                    default:
082                            throw new IllegalArgumentException("Mode [" + mode + "] is unknown");
083                    }
084            }
085    
086            protected String getSql(String sql, boolean flatten) {
087                    if (flatten) {
088                            return "[" + Str.flatten(sql) + "]";
089                    } else {
090                            return sql;
091                    }
092            }
093    
094            public static Logger getLogger() {
095                    return logger;
096            }
097    
098            public LoggerLevel getLevel() {
099                    return level;
100            }
101    
102            public boolean isFlatten() {
103                    return flatten;
104            }
105    
106            public LogSqlMode getMode() {
107                    return mode;
108            }
109    
110    }