+ log(o, message, INFO);
+ }
+
+ // these two logging levels serve ONLY to change the color; semantically they are the same as DEBUG
+ private static final int DIAGNOSTIC = -2;
+ private static final int ECHO = -1;
+
+ // the usual log4j levels, minus FAIL (we just throw an Error in that case)
+ private static final int DEBUG = 0;
+ private static final int INFO = 1;
+ private static final int WARN = 2;
+ private static final int ERROR = 3;
+
+ private static final int BLACK = 30;
+ private static final int BLUE = 34;
+ private static final int GREEN = 32;
+ private static final int CYAN = 36;
+ private static final int RED = 31;
+ private static final int PURPLE = 35;
+ private static final int BROWN = 33;
+ private static final int GRAY = 37;
+
+ private static String color(int color, boolean bright, String s) {
+ return
+ "" + ((char)27) + "[" + (bright?1:0) + ";" + color + "m" +
+ s +
+ ((char)27) + "[0m";
+ }
+
+ private static String lastClassName = null;
+ private static synchronized void log(Object o, Object message, int level) {