/* * Copyright 2011 James Moger. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.iciql.util; import java.text.DecimalFormat; import java.util.Set; import java.util.concurrent.atomic.AtomicLong; /** * Utility class to optionally log generated statements to StatementListeners.
* Statement logging is disabled by default. *

* This class also tracks the counts for generated statements by major type. * */ public class StatementLogger { /** * Enumeration of the different statement types that are logged. */ public enum StatementType { STAT, TOTAL, CREATE, INSERT, UPDATE, MERGE, DELETE, SELECT; } /** * Interface that defines a statement listener. */ public interface StatementListener { void logStatement(StatementType type, String statement); } private static final Set LISTENERS = Utils.newHashSet(); private static final StatementListener CONSOLE = new StatementListener() { @Override public void logStatement(StatementType type, String message) { System.out.println(message); } }; private static final AtomicLong SELECT_COUNT = new AtomicLong(); private static final AtomicLong CREATE_COUNT = new AtomicLong(); private static final AtomicLong INSERT_COUNT = new AtomicLong(); private static final AtomicLong UPDATE_COUNT = new AtomicLong(); private static final AtomicLong MERGE_COUNT = new AtomicLong(); private static final AtomicLong DELETE_COUNT = new AtomicLong(); /** * Activates the Console Logger. */ public static void activateConsoleLogger() { LISTENERS.add(CONSOLE); } /** * Deactivates the Console Logger. */ public static void deactivateConsoleLogger() { LISTENERS.remove(CONSOLE); } /** * Registers a listener with the relay. * * @param listener */ public static void registerListener(StatementListener listener) { LISTENERS.add(listener); } /** * Unregisters a listener with the relay. * * @param listener */ public static void unregisterListener(StatementListener listener) { LISTENERS.remove(listener); } public static void create(String statement) { CREATE_COUNT.incrementAndGet(); logStatement(StatementType.CREATE, statement); } public static void insert(String statement) { INSERT_COUNT.incrementAndGet(); logStatement(StatementType.INSERT, statement); } public static void update(String statement) { UPDATE_COUNT.incrementAndGet(); logStatement(StatementType.UPDATE, statement); } public static void merge(String statement) { MERGE_COUNT.incrementAndGet(); logStatement(StatementType.MERGE, statement); } public static void delete(String statement) { DELETE_COUNT.incrementAndGet(); logStatement(StatementType.DELETE, statement); } public static void select(String statement) { SELECT_COUNT.incrementAndGet(); logStatement(StatementType.SELECT, statement); } private static void logStatement(StatementType type, String statement) { for (StatementListener listener : LISTENERS) { try { listener.logStatement(type, statement); } catch (Throwable t) { } } } public static long getCreateCount() { return CREATE_COUNT.longValue(); } public static long getInsertCount() { return INSERT_COUNT.longValue(); } public static long getUpdateCount() { return UPDATE_COUNT.longValue(); } public static long getMergeCount() { return MERGE_COUNT.longValue(); } public static long getDeleteCount() { return DELETE_COUNT.longValue(); } public static long getSelectCount() { return SELECT_COUNT.longValue(); } public static long getTotalCount() { return getCreateCount() + getInsertCount() + getUpdateCount() + getDeleteCount() + getMergeCount() + getSelectCount(); } public static void logStats() { logStatement(StatementType.STAT, "iciql Runtime Statistics"); logStatement(StatementType.STAT, "========================"); logStat(StatementType.CREATE, getCreateCount()); logStat(StatementType.INSERT, getInsertCount()); logStat(StatementType.UPDATE, getUpdateCount()); logStat(StatementType.MERGE, getMergeCount()); logStat(StatementType.DELETE, getDeleteCount()); logStat(StatementType.SELECT, getSelectCount()); logStatement(StatementType.STAT, "========================"); logStat(StatementType.TOTAL, getTotalCount()); } private static void logStat(StatementType type, long value) { if (value > 0) { DecimalFormat df = new DecimalFormat("###,###,###,###"); logStatement(StatementType.STAT, StringUtils.pad(type.name(), 6, " ", true) + " = " + df.format(value)); } } }