package org.emergent.android.weave.client; import java.util.logging.Level; import java.util.logging.LogRecord; import java.util.logging.Logger; /** * @author Patrick Woodworth */ class Dbg { @SuppressWarnings("serial") public static class DebugLogRecord extends LogRecord { /** * @serial Class that issued logging call */ private String sourceClassName; /** * @serial Method that issued logging call */ private String sourceMethodName; private transient boolean needToInferCaller = true; DebugLogRecord(Level level, String msg) { super(level, msg); } /** * {@inheritDoc} */ @Override public String getSourceClassName() { if (sourceClassName == null) { inferCaller(); } return sourceClassName; } /** * {@inheritDoc} */ @Override public String getSourceMethodName() { if (needToInferCaller) { inferCaller(); } return sourceMethodName; } private void inferCaller() { // Get the stack trace. StackTraceElement stack[] = (new Throwable()).getStackTrace(); // First, search back to a method in the Logger class. int ix = 0; while (ix < stack.length) { StackTraceElement frame = stack[ix]; String cname = frame.getClassName(); if (cname.equals(Dbg.class.getName())) { break; } ix++; } // Now search for the first frame before the "Logger" class. while (ix < stack.length) { StackTraceElement frame = stack[ix]; String cname = frame.getClassName(); if (!cname.equals(Dbg.class.getName())) { // We've found the relevant frame. setSourceClassName(cname); setSourceMethodName(frame.getMethodName()); return; } ix++; } // We haven't found a suitable frame, so just punt. This is // OK as we are only committed to making a "best effort" here. } /** * {@inheritDoc} */ @Override public void setSourceClassName(String sourceClassName) { this.sourceClassName = sourceClassName; needToInferCaller = false; } /** * {@inheritDoc} */ @Override public void setSourceMethodName(String sourceMethodName) { this.sourceMethodName = sourceMethodName; needToInferCaller = false; } } private static final Level LEVEL_ANDROID_VERBOSE = Level.FINE; // should // never // ship // using // this private static final Level LEVEL_ANDROID_DEBUG = Level.CONFIG; // stripped // at // runtime // (except // on // emulator?) @SuppressWarnings("unused") private static final Level LEVEL_ANDROID_INFO = Level.INFO; private static final Level LEVEL_ANDROID_WARN = Level.WARNING; @SuppressWarnings("unused") private static final Level LEVEL_ANDROID_ERROR = Level.SEVERE; @SuppressWarnings("unused") private static final Level LEVEL_V = LEVEL_ANDROID_VERBOSE; // private static final Level LEVEL_D = LEVEL_ANDROID_INFO; private static final Level LEVEL_D = LEVEL_ANDROID_DEBUG; private static final Level LEVEL_W = LEVEL_ANDROID_WARN; private static final Logger sm_logger = Logger .getLogger(WeaveConstants.LOGGER_NAME_FULL); public static void d(String fmt, Object... args) { logf(LEVEL_D, fmt, args); } public static void d(Throwable e) { log(LEVEL_D, e); } public static void d(Throwable e, String fmt, Object... args) { logf(LEVEL_D, e, fmt, args); } private static void log(Level level, Throwable e) { if (!sm_logger.isLoggable(level)) return; LogRecord lr = new DebugLogRecord(level, "Something was thrown!"); lr.setThrown(e); lr.setLoggerName(sm_logger.getName()); sm_logger.log(lr); } private static void logf(Level level, String msg, Object... params) { if (!sm_logger.isLoggable(level)) return; LogRecord lr = new DebugLogRecord(level, String.format(msg, params)); lr.setLoggerName(sm_logger.getName()); sm_logger.log(lr); } private static void logf(Level level, Throwable e, String msg, Object... params) { if (!sm_logger.isLoggable(level)) return; LogRecord lr = new DebugLogRecord(level, String.format(msg, params)); lr.setThrown(e); lr.setLoggerName(sm_logger.getName()); sm_logger.log(lr); } public static void v(String fmt, Object... args) { // logf(LEVEL_V, fmt, args); } public static void v(Throwable e) { // log(LEVEL_V, e); } public static void v(Throwable e, String fmt, Object... args) { // logf(LEVEL_V, e, fmt, args); } public static void w(String fmt, Object... args) { logf(LEVEL_W, fmt, args); } public static void w(Throwable e) { log(LEVEL_W, e); } public static void w(Throwable e, String fmt, Object... args) { logf(LEVEL_W, e, fmt, args); } private Dbg() { // no instantiation } }