package org.mongodb.morphia.logging.jdk;
import java.util.logging.Level;
import java.util.logging.Logger;
public class JDKLogger implements org.mongodb.morphia.logging.Logger {
private final transient Logger logger;
public JDKLogger(final Class c) {
logger = Logger.getLogger(c.getName());
}
@Override
public void debug(final String msg) {
log(Level.FINE, msg);
}
@Override
public void debug(final String format, final Object... arg) {
log(Level.FINE, format, arg);
}
@Override
public void debug(final String msg, final Throwable t) {
log(Level.FINE, msg, t);
}
@Override
public void error(final String msg) {
log(Level.SEVERE, msg);
}
@Override
public void error(final String format, final Object... arg) {
log(Level.SEVERE, format, arg);
}
@Override
public void error(final String msg, final Throwable t) {
log(Level.SEVERE, msg, t);
}
@Override
public void info(final String msg) {
log(Level.INFO, msg);
}
@Override
public void info(final String format, final Object... arg) {
log(Level.INFO, format, arg);
}
@Override
public void info(final String msg, final Throwable t) {
log(Level.INFO, msg, t);
}
@Override
public boolean isDebugEnabled() {
return logger.isLoggable(Level.FINE);
}
@Override
public boolean isErrorEnabled() {
return logger.isLoggable(Level.SEVERE);
}
@Override
public boolean isInfoEnabled() {
return logger.isLoggable(Level.INFO);
}
@Override
public boolean isTraceEnabled() {
return logger.isLoggable(Level.FINER);
}
@Override
public boolean isWarningEnabled() {
return logger.isLoggable(Level.WARNING);
}
@Override
public void trace(final String msg) {
log(Level.FINER, msg);
}
@Override
public void trace(final String format, final Object... arg) {
log(Level.FINER, format, arg);
}
@Override
public void trace(final String msg, final Throwable t) {
log(Level.FINER, msg, t);
}
@Override
public void warning(final String msg) {
log(Level.WARNING, msg);
}
@Override
public void warning(final String format, final Object... arg) {
log(Level.WARNING, format, arg);
}
@Override
public void warning(final String msg, final Throwable t) {
log(Level.WARNING, msg, t);
}
protected String[] getCaller() {
final StackTraceElement[] stack = (new Throwable()).getStackTrace();
final String loggerClassname = getClass().getName();
final String callerName;
final String callerMethod;
int i = 0;
while (i < stack.length) {
final StackTraceElement ste = stack[i];
final String fc = ste.getClassName();
if (fc.equals(loggerClassname)) {
break;
}
i++;
}
i++;
while (i < stack.length) {
final StackTraceElement ste = stack[i];
final String fc = ste.getClassName();
if (!fc.equals(loggerClassname)) {
callerMethod = ste.getMethodName();
callerName = fc;
return new String[]{callerName, callerMethod};
}
i++;
}
return new String[]{"", ""};
}
protected void log(final Level l, final String f, final Object... a) {
if (logger.isLoggable(l)) {
final String[] callerInfo = getCaller();
logger.logp(l, callerInfo[0], callerInfo[1], f, a);
}
}
protected void log(final Level l, final String m, final Throwable t) {
if (logger.isLoggable(l)) {
final String[] callerInfo = getCaller();
logger.logp(l, callerInfo[0], callerInfo[1], m, t);
}
}
}