001 package hep.aida.ref.sql.JAS3Plugin;
002
003 // Log4J
004 import org.apache.log4j.Layout;
005 import org.apache.log4j.WriterAppender;
006 import org.apache.log4j.PropertyConfigurator;
007 import org.apache.log4j.spi.LoggingEvent;
008 import org.apache.log4j.spi.ThrowableInformation;
009
010 // FreeHEP
011 import org.freehep.jas.plugin.console.Console;
012 import org.freehep.jas.plugin.console.ConsoleService;
013 import org.freehep.application.Application;
014 import org.freehep.application.studio.Studio;
015
016 // Java
017 import java.io.PrintStream;
018 import java.net.URL;
019
020 /** <code>JAS3Log4JAppender</code> redirects Log4J messages to JAS3
021 * {@link Console}.
022 * <p><font color="#880088">
023 * $Id: JAS3Log4JAppender.java,v 1.4 2007/05/23 16:38:44 hrivnac Exp $
024 * <pre>
025 * $Log: JAS3Log4JAppender.java,v $
026 * Revision 1.4 2007/05/23 16:38:44 hrivnac
027 * logical connections for Plotter; better UML
028 *
029 * Revision 1.3 2004/10/29 22:27:25 hrivnac
030 * imports corrected
031 *
032 * Revision 1.2 2004/10/27 21:21:20 hrivnac
033 * better documentation
034 *
035 * Revision 1.1 2004/10/27 16:28:34 hrivnac
036 * Log4J logging is connected to JAS3 Console
037 *
038 * </pre>
039 * </font></p>
040 * @opt attributes
041 * @opt operations
042 * @opt types
043 * @opt visibility
044 * @version $Id: JAS3Log4JAppender.java,v 1.4 2007/05/23 16:38:44 hrivnac Exp $
045 * @author <a href="mailto:Julius.Hrivnac@cern.ch">J.Hrivnac</a> */
046 public class JAS3Log4JAppender extends WriterAppender {
047
048 /** Configure and connect to JAS3.
049 * @param o The Object used to locate log4j configuration file.
050 * @param app The JAS3 {@link Studio} to display all messages. */
051 static void init(Object o,
052 Studio app) {
053 _app = app;
054 setConsole();
055 URL url = o.getClass().getClassLoader().getResource("hep/aida/ref/sql/JAS3Plugin/log4j.properties");
056 if (url != null) {
057 PropertyConfigurator.configure(url);
058 }
059 }
060
061 /** Append message to output {@link Console}.
062 * Show eventual {@link Throwable} in {@link Application} popup window.
063 * @param event The {@link LoggingEvent} to be displayed. */
064 public void append(LoggingEvent event) {
065 // Show message
066 setConsole();
067 _out.println(layout.format(event));
068 // Popup Throwable
069 ThrowableInformation ti = event.getThrowableInformation();
070 if (ti != null) {
071 Application.getApplication().error("SQLTuple Error: " + layout.format(event), ti.getThrowable());
072 }
073 }
074
075 /** Requires a layout.
076 * @return true */
077 public boolean requiresLayout() {
078 return true;
079 }
080
081 /** Override the parent {@link WriterAppender#closeWriter}
082 * implementation to dispose {@link Console}.. */
083 protected final void closeWriter() {
084 super.closeWriter();
085 if (_console != null) {
086 _console.dispose();
087 }
088 }
089
090 /** Set {@link Layout}.
091 * @param layout The {@link Layout} to be set. */
092 public void setLayout(Layout layout) {
093 super.setLayout(layout);
094 }
095
096 /** Create {@link Console} if it doesn't exist. */
097 private static void setConsole() {
098 if (_console == null) {
099 ConsoleService cs = (ConsoleService)_app.getLookup().lookup(ConsoleService.class);
100 _console = cs.getConsole("SQLTuple");
101 if (_console == null) {
102 _console = cs.createConsole("SQLTuple", null);
103 }
104 _out = new PrintStream(_console.getOutputStream(null, true));
105 }
106 }
107
108 private static Studio _app;
109
110 private static Console _console;
111
112 private static PrintStream _out;
113
114 }