package com.openedit.entermedia.scripts; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import java.util.logging.Handler; import java.util.logging.LogRecord; import java.util.logging.Logger; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; public class ScriptLogger extends Handler { private static final Log log = LogFactory.getLog(ScriptLogger.class); protected List fieldLogs; protected String fieldPrefix = ""; protected TextAppender fieldTextAppender; public TextAppender getTextAppender() { return fieldTextAppender; } public void setTextAppender(TextAppender inTextAppender) { fieldTextAppender = inTextAppender; } public ScriptLogger() { // TODO Auto-generated constructor stub } public String getPrefix() { return fieldPrefix; } public void setPrefix(String inPrefix) { fieldPrefix = inPrefix + " "; } public void debug(String inText, Throwable ex) { log.debug(getPrefix() + inText,ex); } public void debug(String inText) { log.debug(getPrefix() + inText); //getLogs().add("debug: " + inText); } public void info(String inText, Throwable ex) { log.info(getPrefix() + inText,ex); } public void info(String inText) { log.info(getPrefix() + inText); //getLogs().add("info: " + inText); } public void error(String inText, Throwable ex) { log.error(getPrefix() + inText,ex); } public void error(String inText) { log.error(getPrefix() + inText); //getLogs().add("error: " + inText); } public void error(Object inObject, Throwable inThrowable) { log.error(inObject, inThrowable); //getLogs().add("error: " + inText); } public void error(Object inObject) { log.error(inObject); } public void add(Object inVal) { info(getPrefix() + String.valueOf( inVal ) ); } public List<LogEntry> getLogs() { if (fieldLogs == null) { fieldLogs = new ArrayList(); } return fieldLogs; } public void publish(LogRecord inRecord) { //getRealHandler().publish(inRecord); LogEntry entry = new LogEntry(inRecord); if( fieldTextAppender != null ) { fieldTextAppender.appendText(toString(entry)); } else { getLogs().add(entry); if( getLogs().size() > 10000) { getLogs().remove(0); } } //System.out.println(inRecord.getMessage()); } public void flush() { } public void close() throws SecurityException { } public void startCapture() { //This breaks Resin logs. //3.x - Logs never come back //4 - Logs comeback //Tomcat - Log dissapear for a moment //If I try to wrap the existing logger terrible things happen //This may be fixed with thread context not set CompositeHandler composite = loadComposite(); composite.addChild(this); } private CompositeHandler loadComposite() { Logger logger = Logger.getLogger(""); CompositeHandler composite = null; Handler[] children = logger.getHandlers(); if( children != null) { for (int i = 0; i < children.length; i++) { if( children[i] instanceof CompositeHandler) { composite = (CompositeHandler)children[i]; } } } if( composite == null) { composite = new CompositeHandler(); logger.addHandler(composite); } return composite; } public void stopCapture() { CompositeHandler composite = loadComposite(); composite.removeChild(this); if( composite.getChildren().size() == 0) { Logger logger = Logger.getLogger(""); logger.removeHandler(composite); } } public List listLogs() { List text = new ArrayList(); List all = new ArrayList(getLogs()); //in case another thread is appending to the list for (Iterator iterator = all.iterator(); iterator.hasNext();) { LogEntry entry = (LogEntry) iterator.next(); if( entry != null ) { text.add(toString(entry) ); } } return text; } protected String toString(LogEntry inEntry) { if( inEntry.getName().equals(getClass().getName() ) ) { return inEntry.getMessage(); } else { return inEntry.toString(); } } }