package com.njlabs.showjava.utils.logging;
import android.app.Application;
import android.content.pm.ApplicationInfo;
import android.util.Log;
import com.njlabs.showjava.utils.Strings;
import java.util.Locale;
/**
* Created by Niranjan on 12-07-2014.
*/
@SuppressWarnings("unused")
public class LnImpl implements LnInterface {
protected int minimumLogLevel = Log.VERBOSE;
protected String packageName = "com.njlabs.showjava";
protected String tag = packageName;
public LnImpl() {
// do nothing, used by Ln before injection is set up
}
public LnImpl(Application context) {
try {
packageName = context.getPackageName();
final int flags = context.getPackageManager().getApplicationInfo(packageName, 0).flags;
minimumLogLevel = (flags & ApplicationInfo.FLAG_DEBUGGABLE) != 0 ? Log.VERBOSE : Log.INFO;
tag = packageName.toUpperCase(Locale.US);
Ln.d("Configuring Logging, minimum log level is %s", Ln.logLevelToString(minimumLogLevel));
} catch (Exception e) {
try {
Log.e(packageName, "Error configuring logger", e);
} catch (RuntimeException f) { // NOPMD - Legal empty catch block
// HACK ignore Stub! errors in mock objects during testing
}
}
}
@Override
public int v(Throwable t) {
return getLoggingLevel() <= Log.VERBOSE ? println(Log.VERBOSE, Log.getStackTraceString(t)) : 0;
}
@Override
public int v(Object s1, Object... args) {
if (getLoggingLevel() > Log.VERBOSE)
return 0;
final String s = Strings.toString(s1);
final String message = args.length > 0 ? String.format(s, args) : s;
return println(Log.VERBOSE, message);
}
@Override
public int v(Throwable throwable, Object s1, Object[] args) {
if (getLoggingLevel() > Log.VERBOSE)
return 0;
final String s = Strings.toString(s1);
final String message = (args.length > 0 ? String.format(s, args) : s) + '\n' + Log.getStackTraceString(throwable);
return println(Log.VERBOSE, message);
}
@Override
public int d(Throwable t) {
return getLoggingLevel() <= Log.DEBUG ? println(Log.DEBUG, Log.getStackTraceString(t)) : 0;
}
@Override
public int d(Object s1, Object... args) {
if (getLoggingLevel() > Log.DEBUG)
return 0;
final String s = Strings.toString(s1);
final String message = args.length > 0 ? String.format(s, args) : s;
return println(Log.DEBUG, message);
}
@Override
public int d(Throwable throwable, Object s1, Object... args) {
if (getLoggingLevel() > Log.DEBUG)
return 0;
final String s = Strings.toString(s1);
final String message = (args.length > 0 ? String.format(s, args) : s) + '\n' + Log.getStackTraceString(throwable);
return println(Log.DEBUG, message);
}
@Override
public int i(Throwable t) {
return getLoggingLevel() <= Log.INFO ? println(Log.INFO, Log.getStackTraceString(t)) : 0;
}
@Override
public int i(Throwable throwable, Object s1, Object... args) {
if (getLoggingLevel() > Log.INFO)
return 0;
final String s = Strings.toString(s1);
final String message = (args.length > 0 ? String.format(s, args) : s) + '\n' + Log.getStackTraceString(throwable);
return println(Log.INFO, message);
}
@Override
public int i(Object s1, Object... args) {
if (getLoggingLevel() > Log.INFO)
return 0;
final String s = Strings.toString(s1);
final String message = args.length > 0 ? String.format(s, args) : s;
return println(Log.INFO, message);
}
@Override
public int w(Throwable t) {
return getLoggingLevel() <= Log.WARN ? println(Log.WARN, Log.getStackTraceString(t)) : 0;
}
@Override
public int w(Throwable throwable, Object s1, Object... args) {
if (getLoggingLevel() > Log.WARN)
return 0;
final String s = Strings.toString(s1);
final String message = (args.length > 0 ? String.format(s, args) : s) + '\n' + Log.getStackTraceString(throwable);
return println(Log.WARN, message);
}
@Override
public int w(Object s1, Object... args) {
if (getLoggingLevel() > Log.WARN)
return 0;
final String s = Strings.toString(s1);
final String message = args.length > 0 ? String.format(s, args) : s;
return println(Log.WARN, message);
}
@Override
public int e(Throwable t) {
return getLoggingLevel() <= Log.ERROR ? println(Log.ERROR, Log.getStackTraceString(t)) : 0;
}
@Override
public int e(Throwable throwable, Object s1, Object... args) {
if (getLoggingLevel() > Log.ERROR)
return 0;
final String s = Strings.toString(s1);
final String message = (args.length > 0 ? String.format(s, args) : s) + '\n' + Log.getStackTraceString(throwable);
return println(Log.ERROR, message);
}
@Override
public int e(Object s1, Object... args) {
if (getLoggingLevel() > Log.ERROR)
return 0;
final String s = Strings.toString(s1);
final String message = args.length > 0 ? String.format(s, args) : s;
return println(Log.ERROR, message);
}
@Override
public boolean isDebugEnabled() {
return getLoggingLevel() <= Log.DEBUG;
}
@Override
public boolean isVerboseEnabled() {
return getLoggingLevel() <= Log.VERBOSE;
}
@Override
public String logLevelToString(int loglevel) {
switch (loglevel) {
case Log.VERBOSE:
return "VERBOSE";
case Log.DEBUG:
return "DEBUG";
case Log.INFO:
return "INFO";
case Log.WARN:
return "WARN";
case Log.ERROR:
return "ERROR";
case Log.ASSERT:
return "ASSERT";
default:
return "UNKNOWN";
}
}
@Override
public int getLoggingLevel() {
return minimumLogLevel;
}
@Override
public void setLoggingLevel(int level) {
minimumLogLevel = level;
}
public int println(int priority, String msg) {
return Log.println(priority, getTag(), processMessage(msg));
}
protected String processMessage(String msg) {
if (getLoggingLevel() <= Log.DEBUG)
msg = String.format("%s %s", Thread.currentThread().getName(), msg);
return msg;
}
protected String getTag() {
final int skipDepth = 6; // skip 6 stackframes to find the location where this was called
if (getLoggingLevel() <= Log.DEBUG) {
final StackTraceElement trace = Thread.currentThread().getStackTrace()[skipDepth];
return tag + "/" + trace.getFileName() + ":" + trace.getLineNumber();
}
return tag;
}
}