package com.weem.epicinventor.utility;
import com.weem.epicinventor.*;
import java.io.*;
import java.util.Date;
public class EIError implements Thread.UncaughtExceptionHandler {
public enum ErrorLevel {
Notice, Warning, Error, None
}
private static String errorFilterClass = "";
private static EIError.ErrorLevel errorFilterLevel;
private static String lastNotice = "";
private static String lastWarning = "";
private static String lastError = "";
private static boolean ready = false;
@Override
public void uncaughtException(Thread t, Throwable e) {
if (!ready) {
init();
}
Date date = new Date();
try {
FileWriter fstream = new FileWriter("debug.log", true);
BufferedWriter out = new BufferedWriter(fstream);
System.out.println(date.toString() + " Stack Trace:\n");
out.write(date.toString() + " Stack Trace:");
out.newLine();
for (StackTraceElement ste : e.getStackTrace()) {
System.out.println(ste + "\n");
out.write(ste.toString());
out.newLine();
}
out.close();
} catch (Exception ex) {
}
terminate();
}
public static void init() {
try {
(new File("debug.log")).delete();
} catch (Exception e) {
}
ready = true;
//if(Game.RELEASE) {
// errorFilterLevel = EIError.ErrorLevel.Error;
//} else {
errorFilterLevel = EIError.ErrorLevel.Notice;
//}
}
public static void terminate() {
}
public static void debugMsg(String msg) {
debugMsg(msg, EIError.ErrorLevel.Notice);
}
public static void debugMsg(String msg, EIError.ErrorLevel level) {
if (!ready) {
init();
}
if (errorFilterLevel != EIError.ErrorLevel.None) {
StackTraceElement[] stackTraceElements = Thread.currentThread().getStackTrace();
Date date = new Date();
String str;
if(stackTraceElements[2].getClassName().contains("EIError")) {
str = stackTraceElements[3].getClassName();
str = str.substring(str.lastIndexOf(".")+1);
msg = date.getTime() + " Line:" + stackTraceElements[3].getLineNumber()
+ " Method:" + stackTraceElements[3].getMethodName()
+ " Class:" + str + " Thread:" + Thread.currentThread().getName() + " - " + msg;
} else {
str = stackTraceElements[3].getClassName();
str = str.substring(str.lastIndexOf(".")+1);
msg = date.getTime() + " Line:" + stackTraceElements[2].getLineNumber()
+ " Method:" + stackTraceElements[2].getMethodName()
+ " Class:" + str + " Thread:" + Thread.currentThread().getName() + " - " + msg;
}
if (stackTraceElements[2].getClassName().equals(errorFilterClass) || errorFilterClass.isEmpty()) {
if (shouldPrint(level)) {
System.out.println(msg);
try {
FileWriter fstream = new FileWriter("debug.log", true);
BufferedWriter out = new BufferedWriter(fstream);
out.write(msg);
out.newLine();
if(level == EIError.ErrorLevel.Error) {
for (StackTraceElement ste : stackTraceElements) {
out.write(ste.toString());
out.newLine();
}
}
out.close();
} catch (Exception e) {
}
}
//could use some max length queues here
switch (level) {
case Notice:
lastNotice = msg;
break;
case Warning:
lastWarning = msg;
break;
}
}
}
//always log last error
if (level == EIError.ErrorLevel.Error) {
lastError = msg;
}
}
private static boolean shouldPrint(EIError.ErrorLevel level) {
boolean ret = false;
if (errorFilterLevel == EIError.ErrorLevel.Notice
|| (errorFilterLevel == EIError.ErrorLevel.Warning && level != EIError.ErrorLevel.Notice)
|| (errorFilterLevel == EIError.ErrorLevel.Error && level == EIError.ErrorLevel.Error)) {
ret = true;
}
return ret;
}
private static String getLastNotice() {
return lastNotice;
}
private static String getLastWarning() {
return lastWarning;
}
private static String getLastError() {
return lastError;
}
}