package eu.hgross.blaubot.util;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.lang.reflect.Method;
import java.util.logging.Level;
import java.util.logging.Logger;
/**
* A log wrapper for blaubot
*
* @author Henning Gross {@literal (mail.to@henning-gross.de)}
*
*/
public class Log {
public enum LogLevel {
NONE,
ERRORS,
WARNINGS,
DEBUG,
INFOS
}
private static final Class<?> androidLog;
private static Logger logger = Logger.getLogger("Blaubot Library");
public static LogLevel LOG_LEVEL;
static {
LOG_LEVEL = LogLevel.ERRORS;
// LOG_LEVEL = LogLevel.WARNINGS;
// LOG_LEVEL = LogLevel.DEBUG;
Package androidUtil = Package.getPackage("android.util");
Class<?> aLog = null;
if(androidUtil != null) {
try {
aLog = Class.forName("android.util.Log");
} catch (ClassNotFoundException e) {
aLog = null;
}
}
if (aLog == null) {
FileInputStream fis = null;
try {
fis = new FileInputStream("mylogging.properties");
java.util.logging.LogManager.getLogManager().readConfiguration(fis);
} catch (SecurityException e1) {
//e1.printStackTrace();
} catch (FileNotFoundException e1) {
//e1.printStackTrace();
} catch (IOException e1) {
//e1.printStackTrace();
} finally {
try {
if (fis != null) {
fis.close();
}
} catch (Exception ignore) {
}
}
}
androidLog = aLog;
}
/**
* @return true if warning messages should be printed
*/
public static boolean logWarningMessages() {
return LOG_LEVEL.ordinal() >= LogLevel.WARNINGS.ordinal();
}
/**
* @return true if error messages should be printed
*/
public static boolean logErrorMessages() {
return LOG_LEVEL.ordinal() >= LogLevel.ERRORS.ordinal();
}
/**
* @return true if info messages should be printed
*/
public static boolean logInfoMessages() {
return LOG_LEVEL.ordinal() >= LogLevel.INFOS.ordinal();
}
/**
* @return true if debug messages should be printed
*/
public static boolean logDebugMessages() {
return LOG_LEVEL.ordinal() >= LogLevel.DEBUG.ordinal();
}
/**
* small number (hopefully unique) representing threadId
* @return long, approximation of threadId
*/
private static int getThreadId() {
long threadId = Thread.currentThread().getId();
return ((int) threadId % 1000);
}
private static String getSThreadId() {
return String.format(" {%03d} ", getThreadId());
}
private final static boolean SHOW_THREADID = true;
private static String formatTag(String tag) {
String parts[] = tag.split("\\.");
return String.format("[%30s] ", parts[parts.length-1]);
}
private static String formatLog(String message, String tag) {
if (SHOW_THREADID) {
return getSThreadId() + formatTag(tag) + message;
} else {
return formatTag(tag) + message;
}
}
private static String formatMessage(String message) {
if (SHOW_THREADID) {
return getSThreadId() + message;
} else {
return message;
}
}
public static void d(String tag, String message) {
try {
if(androidLog != null) {
Method m = androidLog.getMethod("d", String.class, String.class);
m.invoke(androidLog, tag, formatMessage(message));
} else {
logger.log(Level.INFO, formatLog(message, tag));
}
} catch (Exception e) {
e.printStackTrace();
}
}
public static void d(String tag, String message, Throwable t) {
try {
if(androidLog != null) {
Method m = androidLog.getMethod("d", String.class, String.class, Throwable.class);
m.invoke(androidLog, tag, formatMessage(message), t);
} else {
logger.log(Level.INFO, formatLog(message, tag));
}
} catch (Exception e) {
e.printStackTrace();
}
}
public static void w(String tag, String message) {
try {
if(androidLog != null) {
Method m = androidLog.getMethod("w", String.class, String.class);
m.invoke(androidLog, tag, formatMessage(message));
} else {
logger.log(Level.WARNING, formatLog(message, tag));
}
} catch (Exception e) {
e.printStackTrace();
}
}
public static void w(String tag, String message, Throwable t) {
try {
if(androidLog != null) {
Method m = androidLog.getMethod("w", String.class, String.class, Throwable.class);
m.invoke(androidLog, tag, formatMessage(message), t);
} else {
logger.log(Level.WARNING, formatLog(message, tag));
}
} catch (Exception e) {
e.printStackTrace();
}
}
public static void w(String tag, Throwable t) {
try {
if(androidLog != null) {
Method m = androidLog.getMethod("w", String.class, Throwable.class);
m.invoke(androidLog, tag, t);
} else {
logger.log(Level.WARNING, formatLog(" ", tag));
}
} catch (Exception e) {
e.printStackTrace();
}
}
public static void e(String tag, String message) {
try {
if(androidLog != null) {
Method m = androidLog.getMethod("e", String.class, String.class);
m.invoke(androidLog, tag, formatMessage(message));
} else {
logger.log(Level.SEVERE, formatLog(message, tag));
}
} catch (Exception e) {
e.printStackTrace();
}
}
public static void e(String tag, String message, Throwable t) {
try {
if(androidLog != null) {
Method m = androidLog.getMethod("e", String.class, String.class, Throwable.class);
m.invoke(androidLog, tag, formatMessage(message), t);
} else {
logger.log(Level.SEVERE, formatLog(message, tag));
}
} catch (Exception e) {
e.printStackTrace();
}
}
public static void wtf(String tag, String message) {
try {
if(androidLog != null) {
Method m = androidLog.getMethod("wtf", String.class, String.class);
m.invoke(androidLog, tag, formatMessage(message));
} else {
logger.log(Level.SEVERE, formatLog(message, tag));
}
} catch (Exception e) {
e.printStackTrace();
}
}
public static void wtf(String tag, String message, Throwable t) {
try {
if(androidLog != null) {
Method m = androidLog.getMethod("wtf", String.class, String.class, Throwable.class);
m.invoke(androidLog, tag, formatMessage(message), t);
} else {
logger.log(Level.SEVERE, formatLog(message, tag));
}
} catch (Exception e) {
e.printStackTrace();
}
}
public static void wtf(String tag, Throwable t) {
try {
if(androidLog != null) {
Method m = androidLog.getMethod("wtf", String.class, Throwable.class);
m.invoke(androidLog, tag, t);
} else {
logger.log(Level.SEVERE, formatLog(" ", tag));
}
} catch (Exception e) {
e.printStackTrace();
}
}
public static String getStackTraceString(Throwable tr) {
try {
if(androidLog != null) {
Method m = androidLog.getMethod("getStackTraceString", Throwable.class);
return (String) m.invoke(androidLog, tr);
} else {
StringBuilder sb = new StringBuilder();
for (StackTraceElement ste : tr.getStackTrace()) {
sb.append(ste.toString() + "\n");
}
return sb.toString();
}
} catch (Exception e) {
e.printStackTrace();
}
return "";
}
}