JAL-3026 srcjar files for VARNA and log4j
[jalview.git] / srcjar / org / apache / log4j / nt / NTEventLogAppender.java
diff --git a/srcjar/org/apache/log4j/nt/NTEventLogAppender.java b/srcjar/org/apache/log4j/nt/NTEventLogAppender.java
new file mode 100644 (file)
index 0000000..9f80add
--- /dev/null
@@ -0,0 +1,182 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.log4j.nt;
+
+import org.apache.log4j.AppenderSkeleton;
+import org.apache.log4j.Layout;
+import org.apache.log4j.TTCCLayout;
+import org.apache.log4j.helpers.LogLog;
+import org.apache.log4j.spi.LoggingEvent;
+
+
+/**
+   Append to the NT event log system.
+
+   <p><b>WARNING</b> This appender can only be installed and used on a
+   Windows system.
+
+   <p>Do not forget to place NTEventLogAppender.dll,
+   NTEventLogAppender.amd64.dll, NTEventLogAppender.ia64.dll
+   or NTEventLogAppender.x86.dll as appropriate in a
+   directory that is on the PATH of the Windows system. Otherwise, you
+   will get a java.lang.UnsatisfiedLinkError.
+
+   @author <a href="mailto:cstaylor@pacbell.net">Chris Taylor</a>
+   @author <a href="mailto:jim_cakalic@na.biomerieux.com">Jim Cakalic</a> */
+public class NTEventLogAppender extends AppenderSkeleton {
+  private int _handle = 0;
+
+  private String source = null;
+  private String server = null;
+
+
+  public NTEventLogAppender() {
+    this(null, null, null);
+  }
+
+  public NTEventLogAppender(String source) {
+    this(null, source, null);
+  }
+
+  public NTEventLogAppender(String server, String source) {
+    this(server, source, null);
+  }
+
+  public NTEventLogAppender(Layout layout) {
+    this(null, null, layout);
+  }
+
+  public NTEventLogAppender(String source, Layout layout) {
+    this(null, source, layout);
+  }
+
+  public NTEventLogAppender(String server, String source, Layout layout) {
+    if (source == null) {
+      source = "Log4j";
+    }
+    if (layout == null) {
+      this.layout = new TTCCLayout();
+    } else {
+      this.layout = layout;
+    }
+
+    try {
+      _handle = registerEventSource(server, source);
+    } catch (Exception e) {
+      e.printStackTrace();
+      _handle = 0;
+    }
+  }
+
+  public
+  void close() {
+    // unregister ...
+  }
+
+  public
+  void activateOptions() {
+    if (source != null) {
+      try {
+   _handle = registerEventSource(server, source);
+      } catch (Exception e) {
+   LogLog.error("Could not register event source.", e);
+   _handle = 0;
+      }
+    }
+  }
+
+
+  public void append(LoggingEvent event) {
+
+    StringBuffer sbuf = new StringBuffer();
+
+    sbuf.append(layout.format(event));
+    if(layout.ignoresThrowable()) {
+      String[] s = event.getThrowableStrRep();
+      if (s != null) {
+   int len = s.length;
+   for(int i = 0; i < len; i++) {
+     sbuf.append(s[i]);
+   }
+      }
+    }
+    // Normalize the log message level into the supported categories
+    int nt_category = event.getLevel().toInt();
+
+    // Anything above FATAL or below DEBUG is labeled as INFO.
+    //if (nt_category > FATAL || nt_category < DEBUG) {
+    //  nt_category = INFO;
+    //}
+    reportEvent(_handle, sbuf.toString(), nt_category);
+  }
+
+
+  public
+  void finalize() {
+    deregisterEventSource(_handle);
+    _handle = 0;
+  }
+
+  /**
+     The <b>Source</b> option which names the source of the event. The
+     current value of this constant is <b>Source</b>.
+   */
+  public
+  void setSource(String source) {
+    this.source = source.trim();
+  }
+
+  public
+  String getSource() {
+    return source;
+  }
+
+/**
+     The <code>NTEventLogAppender</code> requires a layout. Hence,
+     this method always returns <code>true</code>. */
+  public
+  boolean requiresLayout() {
+    return true;
+  }
+
+  native private int registerEventSource(String server, String source);
+  native private void reportEvent(int handle, String message, int level);
+  native private void deregisterEventSource(int handle);
+
+  static {
+    String[] archs;
+    try {
+        archs = new String[] { System.getProperty("os.arch")};
+    } catch(SecurityException e) {
+        archs = new String[] { "amd64", "ia64", "x86"};
+    }
+    boolean loaded = false;
+    for(int i = 0; i < archs.length; i++) {
+        try {
+            System.loadLibrary("NTEventLogAppender." + archs[i]);
+            loaded = true;
+            break;
+        } catch(java.lang.UnsatisfiedLinkError e) {
+            loaded = false;
+        }
+    }
+    if (!loaded) {
+        System.loadLibrary("NTEventLogAppender");
+    }
+}
+}