package com.cyberfox.util.config; /* * Copyright (c) 2000-2007, CyberFOX Software, Inc. All Rights Reserved. * * Developed by mrs (Morgan Schweers) */ import java.io.*; import java.util.Date; import java.util.List; import java.util.ArrayList; @SuppressWarnings({"UseOfSystemOutOrSystemErr"}) public class ErrorManagement implements LoggerInterface { private static PrintWriter mLogWriter = null; private List<ErrorHandler> sHandlers = new ArrayList<ErrorHandler>(); private File mFP; private int fileNumber = 1; private boolean mPaused = false; public void addHandler(ErrorHandler eh) { sHandlers.add(eh); } public void dumpFile(StringBuffer loadedPage) { if(loadedPage == null) return; dump2File("page" + fileNumber++ + ".html", loadedPage); } public ErrorManagement() { } private void initLog() { if(mPaused) return; if(mLogWriter != null) return; String sep = System.getProperty("file.separator"); String home = JConfig.getHomeDirectory(); String doLogging = JConfig.queryConfiguration("logging", "true"); if(doLogging.equals("true")) { if(mLogWriter == null) { try { File fp; String increment = ""; int stepper = 1; do { fp = new File(home + sep + "errors" + increment + ".log"); increment = "." + stepper++; } while(fp.exists()); mFP = fp; mLogWriter = new PrintWriter(new FileOutputStream(fp)); } catch(IOException ioe) { System.err.println("FAILED TO OPEN AN ERROR LOG."); ioe.printStackTrace(); } } } } public void pause() { mPaused = true; } public void resume() { mPaused = false; } public boolean openLog(File fp) { try { mFP = fp; mLogWriter = new PrintWriter(new FileOutputStream(fp)); return true; } catch (IOException ioe) { System.err.println("FAILED TO OPEN AN ERROR LOG."); ioe.printStackTrace(); } return false; } public String getLog() { if(mFP == null) return null; return mFP.getAbsolutePath(); } public File closeLog() { for (ErrorHandler handler : sHandlers) { handler.close(); } if(mLogWriter != null) { mLogWriter.close(); mLogWriter = null; File oldFP = mFP; mFP = null; return oldFP; } return null; } public void logMessage(String msg) { initLog(); Date log_time = new Date(); System.err.println(log_time + ": " + msg); String logMsg = log_time + ": "; // This should stop the annoying time duplication in log messages. if(msg.startsWith(logMsg)) logMsg = msg; else logMsg += msg; for(ErrorHandler handler : sHandlers) { handler.addLog(logMsg); } String doLogging = JConfig.queryConfiguration("logging", "true"); if(doLogging.equals("true")) { if(mLogWriter != null) { mLogWriter.println(logMsg); mLogWriter.flush(); } } } public void logDebug(String msg) { if(JConfig.debugging && msg != null) logMessage(msg); } public void logVerboseDebug(String msg) { if(JConfig.queryConfiguration("debug.uber", "false").equals("true")) logMessage(msg); } public void handleDebugException(String sError, Throwable e) { if(JConfig.debugging) handleException(sError, e); } public static class LoggerWriter extends PrintWriter { private StringBuffer mSnapshot = null; public LoggerWriter() { super(System.out); } public void println(String x) { if (mSnapshot != null) { mSnapshot.append(x); mSnapshot.append('\n'); } } public void setSnapshot(StringBuffer sb) { mSnapshot = sb; } } private static LoggerWriter sWriter = new LoggerWriter(); public static String getStackTrace(Throwable e) { StringBuffer sb = new StringBuffer(); sWriter.setSnapshot(sb); e.printStackTrace(sWriter); sWriter.setSnapshot(null); return sb.toString(); } public void handleException(String sError, Throwable e) { initLog(); Date log_time = new Date(); if(sError == null || sError.length() == 0) { System.err.println("[" + log_time + "]"); } else { System.err.println(log_time + ": " + sError); } e.printStackTrace(); String doLogging = JConfig.queryConfiguration("logging", "true"); String logMsg; if (sError == null || sError.length() == 0) { logMsg = "[" + log_time + "]"; } else { logMsg = log_time + ": " + sError; } String trace = getStackTrace(e); for (ErrorHandler handler : sHandlers) { handler.exception(logMsg, e.getMessage(), trace); } if(doLogging.equals("true")) { if(mLogWriter != null) { mLogWriter.println(logMsg); if(e.getMessage() != null) mLogWriter.println(e.getMessage()); e.printStackTrace(mLogWriter); mLogWriter.flush(); } } } public void logFile(String msgtop, StringBuffer dumpsb) { initLog(); String doLogging = JConfig.queryConfiguration("logging", "true"); if(doLogging.equals("true")) { if(JConfig.debugging) { if(mLogWriter != null) { mLogWriter.println("+------------------------------"); mLogWriter.println("| " + msgtop); mLogWriter.println("+------------------------------"); if(dumpsb != null) { mLogWriter.println(dumpsb); } else { mLogWriter.println("(null)"); } mLogWriter.println("+------------end---------------"); mLogWriter.flush(); } for(ErrorHandler handler : sHandlers) { handler.addLog("..."); } logMessage("File contents logged with message: " + msgtop); for (ErrorHandler handler : sHandlers) { handler.addLog("..."); } } } } /** * @param fname - The filename to output to. * @param sb - The StringBuffer to dump out. * @brief Debugging function to dump a string buffer out to a file. * <p/> * This is used for 'emergency' debugging efforts. */ public void dump2File(String fname, StringBuffer sb) { if (JConfig.queryConfiguration("debug.filedump", "false").equals("false")) return; FileWriter fw = null; try { fw = new FileWriter(fname); fw.write(sb.toString()); } catch (IOException ioe) { handleException("Threw exception in dump2File!", ioe); } finally { if (fw != null) try { fw.close(); } catch (IOException ignored) { /* I don't care about exceptions on close. */ } } } }