-// Copyright (C) 2003 Adam Megacz <adam@ibex.org> all rights reserved.
-//
-// You may modify, copy, and redistribute this code under the terms of
-// the GNU Library Public License version 2.1, with the exception of
-// the portion of clause 6a after the semicolon (aka the "obnoxious
-// relink clause")
+// Copyright 2000-2005 the Contributors, as shown in the revision logs.
+// Licensed under the Apache Public Source License 2.0 ("the License").
+// You may not use this file except in compliance with the License.
package org.ibex.util;
-import org.ibex.js.*;
-import java.io.*;
+
import java.util.*;
-import java.net.*;
-/** easy to use logger */
+import java.io.BufferedReader;
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.PrintStream;
+import java.io.PrintWriter;
+import java.io.FileOutputStream;
+import java.io.InputStreamReader;
+import java.io.IOException;
+import java.net.Socket;
+import java.net.InetAddress;
+import java.text.SimpleDateFormat;
+
+// FEATURE: logging exceptions should automatically unwrap exceptions
+
+/** Easy to use logger.
+ *
+ * @author adam@ibex.org
+ */
public class Log {
+ private static final SimpleDateFormat formatDate = new SimpleDateFormat("EEE dd MMM yyyy");
+ private static final SimpleDateFormat formatTime = new SimpleDateFormat("[EEE HH:mm:ss] ");
+ private static final Hashtable threadAnnotations = new Hashtable();
public static boolean on = System.getProperty("ibex.log.on", "true").equals("true");
public static boolean color = System.getProperty("ibex.log.color", "true").equals("true");
public static boolean verbose = System.getProperty("ibex.log.verbose", "false").equals("true");
public static boolean logDates = System.getProperty("ibex.log.dates", "false").equals("true");
public static boolean notes = System.getProperty("ibex.log.notes.on", "true").equals("true");
+ public static boolean stackTraces = System.getProperty("ibex.log.stackTraces", "true").equals("true");
public static int maximumNoteLength = Integer.parseInt(System.getProperty("ibex.log.notes.maximumLength", (1024 * 32)+""));
public static boolean rpc = false;
- public static Date lastDate = null;
+ public static int lastDay = -1;
public static PrintStream logstream = System.err;
logstream = new PrintStream(new Socket(InetAddress.getByName(host), port).getOutputStream());
}
- private static Hashtable threadAnnotations = new Hashtable();
public static void setThreadAnnotation(String s) { threadAnnotations.put(Thread.currentThread(), s); }
/**
}
}
public static void clearnotes() { if (!notes) return; notebuf().setLength(0); }
- private static Hashtable notebufs = new Hashtable();
+
+ private static final Basket.Map notebufs = new Basket.Hash();
public static StringBuffer notebuf() {
StringBuffer ret = (StringBuffer)notebufs.get(Thread.currentThread());
if (ret == null) {
classname = classname.replace('$', '.');
if (logDates) {
- Date d = new Date();
- if (lastDate == null || d.getYear() != lastDate.getYear() || d.getMonth() != lastDate.getMonth() || d.getDay() != lastDate.getDay()) {
- String now = new java.text.SimpleDateFormat("EEE dd MMM yyyy").format(d);
+ Calendar cal = Calendar.getInstance();
+ if (lastDay < 0 || lastDay != cal.get(Calendar.DAY_OF_YEAR)) {
+ lastDay = cal.get(Calendar.DAY_OF_YEAR);
+ String now = formatDate.format(cal.getTime());
logstream.println();
- logstream.println(colorize(GRAY, false, "=== " + now + " =========================================================="));
+ logstream.println(colorize(GREEN, false, "=== " + now + " =========================================================="));
}
- java.text.DateFormat df = new java.text.SimpleDateFormat("[EEE HH:mm:ss] ");
- classname = df.format(d) + classname;
- lastDate = d;
+ classname = formatTime.format(cal.getTime()) + classname;
}
String annot = (String)threadAnnotations.get(Thread.currentThread());
}
byte[] b = baos.toByteArray();
BufferedReader br = new BufferedReader(new InputStreamReader(new ByteArrayInputStream(b)));
- String s = null;
try {
- String m = "";
- while((s = br.readLine()) != null) m += s + "\n";
- if (m.length() > 0) log(o, m.substring(0, m.length() - 1), level);
+ if (stackTraces) {
+ String s = null;
+ String m = "";
+ while((s = br.readLine()) != null) m += s + "\n";
+ if (m.length() > 0) log(o, m.substring(0, m.length() - 1), level);
+ } else {
+ String m = br.readLine();
+ int ok = 0;
+ do {
+ String s = br.readLine();
+ if (s == null) break;
+ if (s.indexOf('(') != -1) {
+ String shortened = s.substring(s.indexOf('(')+1);
+ shortened = shortened.substring(0, shortened.indexOf(')'));
+ m += " " + shortened;
+ if (ok > 1) m = m.substring(0, Math.min(m.length(), 78));
+ ok++;
+ }
+ } while (m.length() < 78);
+ log(o, m, level);
+ }
+ lastClassName = "";
} catch (IOException e) {
// FEATURE: use org.ibex.io.Stream's here
- logstream.println(colorize(RED, true, "Logger: exception thrown by ByteArrayInputStream; this should not happen"));
+ logstream.println(colorize(RED, true, "Logger: exception thrown by ByteArrayInputStream;" +
+ " this should not happen"));
}
- lastClassName = "";
return;
}
logstream.println(classname + colorize(levelcolor, bright, str));
}
- public static void recursiveLog(String indent, String name, Object o) throws JSExn {
- if (!name.equals("")) name += " : ";
-
- if (o == null) {
- JS.log(indent + name + "<null>");
-
- } else if (o instanceof JSArray) {
- JS.log(indent + name + "<array>");
- JSArray na = (JSArray)o;
- for(int i=0; i<na.length(); i++)
- recursiveLog(indent + " ", i + "", na.elementAt(i));
-
- } else if (o instanceof JS) {
- JS.log(indent + name + "<object>");
- JS s = (JS)o;
- Enumeration e = s.keys();
- while(e.hasMoreElements()) {
- Object key = e.nextElement();
- if (key != null)
- recursiveLog(indent + " ", key.toString(),
- (key instanceof Integer) ?
- s.get(((Integer)key)) : s.get(key.toString()));
- }
- } else {
- JS.log(indent + name + o);
-
- }
- }
-
}