package org.ripple.power.ui.view.log; import java.io.PrintWriter; import java.io.StringWriter; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.TimeZone; import javax.swing.SwingUtilities; import org.ripple.power.config.LSystem; import org.ripple.power.ui.UIMessage; import org.ripple.power.ui.UIRes; import org.ripple.power.utils.DateUtils; public class ErrorLog extends ErrorHtml { private boolean isEnabled; private final SimpleDateFormat dateFormat = new SimpleDateFormat("MM/dd/yy"); private final SimpleDateFormat timeFormat = new SimpleDateFormat( "HH:mm:ss.SSS"); private static ErrorLog instance = null; public static ErrorLog get(){ if(instance==null){ instance = new ErrorLog(); } return instance; } public ErrorLog() { super("ErrorLog"); isEnabled = true; StringBuilder sb = new StringBuilder(); sb.append(ROW_START); sb.append("<TH WIDTH=\"80\">").append("Date").append(HEADER_END); sb.append("<TH WIDTH=\"120\">").append("Time").append(HEADER_END); sb.append("<TH WIDTH=\"130\">").append("Reporter").append(HEADER_END); sb.append(HEADER_START).append("Message").append(HEADER_END); sb.append(ROW_END); write(sb); StringBuilder startupMessage = new StringBuilder(); startupMessage.append("New Report Started. ") .append(LSystem.applicationName).append(" version ") .append(LSystem.applicationVersion); report(LSystem.applicationName, startupMessage); TimeZone tz = TimeZone.getDefault(); report(LSystem.applicationName, "All times will be reported in the local time zone: " + tz.getID() + ", " + tz.getDisplayName()); } public void disable() { isEnabled = false; } public void enable() { isEnabled = true; } private void report(String reporter, StringBuilder message) { Calendar date = getDate(); StringBuilder s = new StringBuilder(); s.append(ROW_START); s.append(FIELD_START).append(dateFormat.format(date.getTime())).append(FIELD_END); s.append(FIELD_START).append(timeFormat.format(date.getTime())).append(FIELD_END); s.append(FIELD_START).append(reporter).append(FIELD_END); s.append(FIELD_START).append(message).append(FIELD_END); s.append(ROW_END); write(s); } public void report(String reporter, String message) { if (isEnabled) { report(reporter, new StringBuilder(message)); } } public void report(Throwable t) { StringWriter sw = new StringWriter(); PrintWriter pw = new PrintWriter(sw); t.printStackTrace(pw); pw.close(); report(LSystem.applicationName, new StringBuilder(sw.toString())); } private Calendar getDate() { return DateUtils.getUTCCalendar(); } private Throwable deferredException; private String deferredText; public void logException(String text, Throwable exc) { if (SwingUtilities.isEventDispatchThread()) { StringBuilder strings = new StringBuilder(512); strings.append("<html><b>"); strings.append(text); strings.append("</b><br><br>"); strings.append(exc.toString()); strings.append("<br>"); StackTraceElement[] trace = exc.getStackTrace(); int count = 0; for (StackTraceElement elem : trace) { strings.append(elem.toString()); strings.append("<br>"); if (++count == 25) break; } strings.append("</html>"); UIRes.showErrorMessage(LSystem.applicationMain, UIMessage.error, strings.toString()); } else if (deferredException == null) { deferredText = text; deferredException = exc; try { LSystem.invokeAndWait(new Runnable() { @Override public void run() { logException(deferredText, deferredException); deferredException = null; deferredText = null; } }); } catch (Exception ex) { System.err.println(ex.getMessage()); } } exc.printStackTrace(); report(exc); } }