1600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang/*
2600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Conditions Of Use
3600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang *
4600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * This software was developed by employees of the National Institute of
5600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Standards and Technology (NIST), an agency of the Federal Government.
6600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Pursuant to title 15 Untied States Code Section 105, works of NIST
7600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * employees are not subject to copyright protection in the United States
8600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * and are considered to be in the public domain.  As a result, a formal
9600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * license is not needed to use the software.
10600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang *
11600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * This software is provided by NIST as a service and is expressly
12600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * provided "AS IS."  NIST MAKES NO WARRANTY OF ANY KIND, EXPRESS, IMPLIED
13600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * OR STATUTORY, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTY OF
14600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT
15600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * AND DATA ACCURACY.  NIST does not warrant or make any representations
16600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * regarding the use of the software or the results thereof, including but
17600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * not limited to the correctness, accuracy, reliability or usefulness of
18600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * the software.
19600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang *
20600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Permission to use this software is contingent upon your acceptance
21600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * of the terms of this agreement.
22600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang *
23600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang */
24600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang/***************************************************************************
25600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Product of NIST/ITL Advanced Networking Technologies Division (ANTD).    *
26600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang ***************************************************************************/
27600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wangpackage gov.nist.core;
28600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
29600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wangimport java.io.*;
30600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wangimport java.util.Properties;
31600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
32600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// BEGIN ANDROID-added
33600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// TODO: this class should be replaced by android logging mechanism.
34600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wangpublic class LogWriter implements StackLogger {
359dfe3bfcff830a47aa2451d05f04a937a279532aHung-ying Tyan    private static final String TAG = "SIP_STACK";
369dfe3bfcff830a47aa2451d05f04a937a279532aHung-ying Tyan
379dfe3bfcff830a47aa2451d05f04a937a279532aHung-ying Tyan    private boolean mEnabled = true;
389dfe3bfcff830a47aa2451d05f04a937a279532aHung-ying Tyan
399dfe3bfcff830a47aa2451d05f04a937a279532aHung-ying Tyan    public void logStackTrace() {
409dfe3bfcff830a47aa2451d05f04a937a279532aHung-ying Tyan        // TODO
419dfe3bfcff830a47aa2451d05f04a937a279532aHung-ying Tyan    }
422b48b9a946dff3f11963e3f486f5eb71934c55d4Chung-yih Wang
439dfe3bfcff830a47aa2451d05f04a937a279532aHung-ying Tyan    public void logStackTrace(int traceLevel) {
449dfe3bfcff830a47aa2451d05f04a937a279532aHung-ying Tyan        // TODO
459dfe3bfcff830a47aa2451d05f04a937a279532aHung-ying Tyan    }
462b48b9a946dff3f11963e3f486f5eb71934c55d4Chung-yih Wang
479dfe3bfcff830a47aa2451d05f04a937a279532aHung-ying Tyan    public int getLineCount() {
489dfe3bfcff830a47aa2451d05f04a937a279532aHung-ying Tyan        return 0;
499dfe3bfcff830a47aa2451d05f04a937a279532aHung-ying Tyan    }
502b48b9a946dff3f11963e3f486f5eb71934c55d4Chung-yih Wang
519dfe3bfcff830a47aa2451d05f04a937a279532aHung-ying Tyan    public void logException(Throwable ex) {
522b48b9a946dff3f11963e3f486f5eb71934c55d4Chung-yih Wang        //Log.e(TAG, "", ex);
539dfe3bfcff830a47aa2451d05f04a937a279532aHung-ying Tyan    }
549dfe3bfcff830a47aa2451d05f04a937a279532aHung-ying Tyan    public void logDebug(String message) {
552b48b9a946dff3f11963e3f486f5eb71934c55d4Chung-yih Wang        //Log.d(TAG, message);
569dfe3bfcff830a47aa2451d05f04a937a279532aHung-ying Tyan    }
579dfe3bfcff830a47aa2451d05f04a937a279532aHung-ying Tyan    public void logTrace(String message) {
582b48b9a946dff3f11963e3f486f5eb71934c55d4Chung-yih Wang        //Log.d(TAG, message);
599dfe3bfcff830a47aa2451d05f04a937a279532aHung-ying Tyan    }
609dfe3bfcff830a47aa2451d05f04a937a279532aHung-ying Tyan    public void logFatalError(String message) {
612b48b9a946dff3f11963e3f486f5eb71934c55d4Chung-yih Wang        //Log.e(TAG, message);
629dfe3bfcff830a47aa2451d05f04a937a279532aHung-ying Tyan    }
639dfe3bfcff830a47aa2451d05f04a937a279532aHung-ying Tyan    public void logError(String message) {
642b48b9a946dff3f11963e3f486f5eb71934c55d4Chung-yih Wang        //Log.e(TAG, message);
659dfe3bfcff830a47aa2451d05f04a937a279532aHung-ying Tyan    }
669dfe3bfcff830a47aa2451d05f04a937a279532aHung-ying Tyan    public boolean isLoggingEnabled() {
679dfe3bfcff830a47aa2451d05f04a937a279532aHung-ying Tyan        return mEnabled;
689dfe3bfcff830a47aa2451d05f04a937a279532aHung-ying Tyan    }
699dfe3bfcff830a47aa2451d05f04a937a279532aHung-ying Tyan    public boolean isLoggingEnabled(int logLevel) {
709dfe3bfcff830a47aa2451d05f04a937a279532aHung-ying Tyan        // TODO
719dfe3bfcff830a47aa2451d05f04a937a279532aHung-ying Tyan        return mEnabled;
729dfe3bfcff830a47aa2451d05f04a937a279532aHung-ying Tyan    }
739dfe3bfcff830a47aa2451d05f04a937a279532aHung-ying Tyan    public void logError(String message, Exception ex) {
742b48b9a946dff3f11963e3f486f5eb71934c55d4Chung-yih Wang        //Log.e(TAG, message, ex);
759dfe3bfcff830a47aa2451d05f04a937a279532aHung-ying Tyan    }
769dfe3bfcff830a47aa2451d05f04a937a279532aHung-ying Tyan    public void logWarning(String string) {
772b48b9a946dff3f11963e3f486f5eb71934c55d4Chung-yih Wang        //Log.w(TAG, string);
789dfe3bfcff830a47aa2451d05f04a937a279532aHung-ying Tyan    }
799dfe3bfcff830a47aa2451d05f04a937a279532aHung-ying Tyan    public void logInfo(String string) {
802b48b9a946dff3f11963e3f486f5eb71934c55d4Chung-yih Wang        //Log.i(TAG, string);
819dfe3bfcff830a47aa2451d05f04a937a279532aHung-ying Tyan    }
822b48b9a946dff3f11963e3f486f5eb71934c55d4Chung-yih Wang
839dfe3bfcff830a47aa2451d05f04a937a279532aHung-ying Tyan    public void disableLogging() {
849dfe3bfcff830a47aa2451d05f04a937a279532aHung-ying Tyan        mEnabled = false;
859dfe3bfcff830a47aa2451d05f04a937a279532aHung-ying Tyan    }
869dfe3bfcff830a47aa2451d05f04a937a279532aHung-ying Tyan
879dfe3bfcff830a47aa2451d05f04a937a279532aHung-ying Tyan    public void enableLogging() {
889dfe3bfcff830a47aa2451d05f04a937a279532aHung-ying Tyan        mEnabled = true;
899dfe3bfcff830a47aa2451d05f04a937a279532aHung-ying Tyan    }
902b48b9a946dff3f11963e3f486f5eb71934c55d4Chung-yih Wang
919dfe3bfcff830a47aa2451d05f04a937a279532aHung-ying Tyan    public void setBuildTimeStamp(String buildTimeStamp) {
929dfe3bfcff830a47aa2451d05f04a937a279532aHung-ying Tyan    }
932b48b9a946dff3f11963e3f486f5eb71934c55d4Chung-yih Wang
949dfe3bfcff830a47aa2451d05f04a937a279532aHung-ying Tyan    public void setStackProperties(Properties stackProperties) {
959dfe3bfcff830a47aa2451d05f04a937a279532aHung-ying Tyan    }
962b48b9a946dff3f11963e3f486f5eb71934c55d4Chung-yih Wang
979dfe3bfcff830a47aa2451d05f04a937a279532aHung-ying Tyan    public String getLoggerName() {
989dfe3bfcff830a47aa2451d05f04a937a279532aHung-ying Tyan        return "Android SIP Logger";
999dfe3bfcff830a47aa2451d05f04a937a279532aHung-ying Tyan    }
100600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang}
101600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// END android-added
102600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
103600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// BEGIN android-deleted
104600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
105600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//import org.apache.log4j.Appender;
106600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//import org.apache.log4j.FileAppender;
107600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//import org.apache.log4j.Level;
108600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//import org.apache.log4j.Logger;
109600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//import org.apache.log4j.Priority;
110600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//import org.apache.log4j.SimpleLayout;
111600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//
112600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang///**
113600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// * A wrapper around log4j that is used for logging debug and errors. You can
114600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// * replace this file if you want to change the way in which messages are logged.
115600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// *
116600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// * @version 1.2
117600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// *
118600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// * @author M. Ranganathan <br/>
119600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// * @author M.Andrews
120600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// * @author Jeroen van Bemmel
121600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// * @author Jean Deruelle
122600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// *
123600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// */
124600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//
125600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//public class LogWriter implements StackLogger {
126600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//
127600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//    /**
128600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//     * The logger to which we will write our logging output.
129600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//     */
130600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//    private Logger logger;
131600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//
132600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//    /**
133600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//     * The stack name.
134600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//     */
135600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//    private String stackName;
136600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//
137600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//    /**
138600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//     * Name of the log file in which the trace is written out (default is
139600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//     * /tmp/sipserverlog.txt)
140600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//     */
141600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//    private String logFileName = null;
142600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//
143600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//    /**
144600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//     * Flag to indicate that logging is enabled.
145600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//     */
146600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//    private volatile boolean needsLogging = false;
147600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//
148600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//    private int lineCount;
149600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//
150600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//    /**
151600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//     * trace level
152600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//     */
153600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//
154600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//    protected int traceLevel = TRACE_NONE;
155600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//
156600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//    private String buildTimeStamp;
157600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//
158600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//    private Properties configurationProperties;
159600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//
160600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//    /**
161600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//     * log a stack trace. This helps to look at the stack frame.
162600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//     */
163600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//    public void logStackTrace() {
164600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//        this.logStackTrace(TRACE_DEBUG);
165600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//
166600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//    }
167600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//
168600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//    public void logStackTrace(int traceLevel) {
169600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//        if (needsLogging) {
170600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//            StringWriter sw = new StringWriter();
171600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//            PrintWriter pw = new PrintWriter(sw);
172600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//            StackTraceElement[] ste = new Exception().getStackTrace();
173600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//            // Skip the log writer frame and log all the other stack frames.
174600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//            for (int i = 1; i < ste.length; i++) {
175600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//                String callFrame = "[" + ste[i].getFileName() + ":"
176600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//                        + ste[i].getLineNumber() + "]";
177600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//                pw.print(callFrame);
178600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//            }
179600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//            pw.close();
180600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//            String stackTrace = sw.getBuffer().toString();
181600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//            Level level = this.getLevel(traceLevel);
182600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//            Priority priority = this.getLogPriority();
183600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//            if ( level.isGreaterOrEqual(priority)) {
184600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//                logger.log(level,stackTrace);
185600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//            }
186600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//
187600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//        }
188600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//    }
189600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//
190600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//    /**
191600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//     * Get the line count in the log stream.
192600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//     *
193600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//     * @return
194600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//     */
195600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//    public int getLineCount() {
196600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//        return lineCount;
197600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//    }
198600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//
199600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//    /**
200600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//     * Get the logger.
201600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//     *
202600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//     * @return
203600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//     */
204600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//    public Logger getLogger() {
205600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//        return logger;
206600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//    }
207600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//
208600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//
209600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//    /**
210600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//     * This method allows you to add an external appender.
211600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//     * This is useful for the case when you want to log to
212600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//     * a different log stream than a file.
213600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//     *
214600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//     * @param appender
215600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//     */
216600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//    public void addAppender(Appender appender) {
217600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//
218600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//        this.logger.addAppender(appender);
219600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//
220600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//    }
221600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//
222600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//    /**
223600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//     * Log an exception.
224600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//     *
225600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//     * @param ex
226600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//     */
227600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//    public void logException(Throwable ex) {
228600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//
229600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//        if (needsLogging) {
230600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//
231600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//            this.getLogger().error(ex.getMessage(), ex);
232600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//        }
233600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//    }
234600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//
235600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//
236600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//
237600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//
238600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//    /**
239600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//     * Counts the line number so that the debug log can be correlated to the
240600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//     * message trace.
241600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//     *
242600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//     * @param message --
243600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//     *            message to count the lines for.
244600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//     */
245600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//    private void countLines(String message) {
246600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//        char[] chars = message.toCharArray();
247600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//        for (int i = 0; i < chars.length; i++) {
248600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//            if (chars[i] == '\n')
249600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//                lineCount++;
250600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//        }
251600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//
252600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//    }
253600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//
254600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//    /**
255600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//     * Prepend the line and file where this message originated from
256600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//     *
257600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//     * @param message
258600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//     * @return re-written message.
259600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//     */
260600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//    private String enhanceMessage(String message) {
261600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//
262600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//        StackTraceElement[] stackTrace = new Exception().getStackTrace();
263600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//        StackTraceElement elem = stackTrace[2];
264600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//        String className = elem.getClassName();
265600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//        String methodName = elem.getMethodName();
266600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//        String fileName = elem.getFileName();
267600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//        int lineNumber = elem.getLineNumber();
268600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//        String newMessage = className + "." + methodName + "(" + fileName + ":"
269600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//                + lineNumber + ") [" + message + "]";
270600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//        return newMessage;
271600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//
272600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//    }
273600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//
274600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//    /**
275600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//     * Log a message into the log file.
276600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//     *
277600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//     * @param message
278600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//     *            message to log into the log file.
279600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//     */
280600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//    public void logDebug(String message) {
281600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//        if (needsLogging) {
282600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//            String newMessage = this.enhanceMessage(message);
283600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//            if ( this.lineCount == 0) {
284600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//                getLogger().debug("BUILD TIMESTAMP = " + this.buildTimeStamp);
285600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//                getLogger().debug("Config Propeties = " + this.configurationProperties);
286600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//            }
287600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//            countLines(newMessage);
288600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//            getLogger().debug(newMessage);
289600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//        }
290600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//
291600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//    }
292600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//
293600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//    /**
294600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//     * Log a message into the log file.
295600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//     *
296600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//     * @param message
297600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//     *            message to log into the log file.
298600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//     */
299600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//    public void logTrace(String message) {
300600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//        if (needsLogging) {
301600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//            String newMessage = this.enhanceMessage(message);
302600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//            if ( this.lineCount == 0) {
303600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//                getLogger().debug("BUILD TIMESTAMP = " + this.buildTimeStamp);
304600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//                getLogger().debug("Config Propeties = " + this.configurationProperties);
305600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//            }
306600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//            countLines(newMessage);
307600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//            getLogger().trace(newMessage);
308600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//        }
309600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//
310600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//    }
311600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//
312600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//    /**
313600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//     * Set the trace level for the stack.
314600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//     */
315600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//    private void setTraceLevel(int level) {
316600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//        traceLevel = level;
317600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//    }
318600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//
319600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//    /**
320600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//     * Get the trace level for the stack.
321600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//     */
322600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//    public int getTraceLevel() {
323600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//        return traceLevel;
324600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//    }
325600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//
326600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//    /**
327600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//     * Log an error message.
328600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//     *
329600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//     * @param message --
330600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//     *            error message to log.
331600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//     */
332600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//    public void logFatalError(String message) {
333600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//        Logger logger = this.getLogger();
334600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//        String newMsg = this.enhanceMessage(message);
335600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//        countLines(newMsg);
336600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//        logger.fatal(newMsg);
337600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//
338600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//    }
339600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//
340600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//    /**
341600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//     * Log an error message.
342600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//     *
343600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//     * @param message --
344600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//     *            error message to log.
345600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//     *
346600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//     */
347600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//    public void logError(String message) {
348600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//        Logger logger = this.getLogger();
349600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//        String newMsg = this.enhanceMessage(message);
350600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//        countLines(newMsg);
351600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//        logger.error(newMsg);
352600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//
353600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//    }
354600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//
355600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//    public LogWriter() {
356600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//    }
357600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//
358600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//	public void setStackProperties(Properties configurationProperties) {
359600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//
360600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//        this.configurationProperties = configurationProperties;
361600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//
362600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//        String logLevel = configurationProperties
363600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//                .getProperty("gov.nist.javax.sip.TRACE_LEVEL");
364600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//
365600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//        this.logFileName = configurationProperties
366600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//                .getProperty("gov.nist.javax.sip.DEBUG_LOG");
367600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//
368600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//        this.stackName = configurationProperties
369600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//                .getProperty("javax.sip.STACK_NAME");
370600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//
371600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//        //check whether a Log4j logger name has been
372600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//        //specified. if not, use the stack name as the default
373600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//        //logger name.
374600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//        String category = configurationProperties
375600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//                                .getProperty("gov.nist.javax.sip.LOG4J_LOGGER_NAME", this.stackName);
376600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//
377600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//
378600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//        logger = Logger.getLogger(category);
379600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//        if (logLevel != null) {
380600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//            if (logLevel.equals("LOG4J")) {
381600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//                //if TRACE_LEVEL property is specified as
382600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//                //"LOG4J" then, set the traceLevel based on
383600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//                //the log4j effective log level.
384600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//                Level level = logger.getEffectiveLevel();
385600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//                this.needsLogging = true;
386600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//                if (level == Level.OFF)
387600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//                    this.needsLogging = false;
388600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//                this.traceLevel = TRACE_NONE;
389600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//                if (level.isGreaterOrEqual(Level.DEBUG)) {
390600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//                    this.traceLevel = TRACE_DEBUG;
391600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//                } else if (level.isGreaterOrEqual(Level.INFO)) {
392600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//                    this.traceLevel = TRACE_INFO;
393600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//                } else if (level.isGreaterOrEqual(Level.WARN)) {
394600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//                    this.traceLevel = TRACE_ERROR;
395600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//                }
396600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//            }
397600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//            else {
398600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//                try {
399600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//                    int ll = 0;
400600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//                    if (logLevel.equals("TRACE")) {
401600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//                        ll = TRACE_DEBUG;
402600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//                        Debug.debug = true;
403600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//                        Debug.setStackLogger(this);
404600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//                    } else if (logLevel.equals("DEBUG")) {
405600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//                        ll = TRACE_DEBUG;
406600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//                    } else if ( logLevel.equals("INFO")) {
407600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//                        ll = TRACE_INFO;
408600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//                    } else if (logLevel.equals("ERROR")) {
409600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//                        ll = TRACE_ERROR;
410600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//                    } else if (logLevel.equals("NONE") || logLevel.equals("OFF")) {
411600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//                        ll = TRACE_NONE;
412600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//                    } else {
413600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//                        ll = Integer.parseInt(logLevel);
414600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//                        if ( ll > 32 ) {
415600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//                            Debug.debug = true;
416600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//                            Debug.setStackLogger(this);
417600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//                        }
418600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//                    }
419600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//
420600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//                    this.setTraceLevel(ll);
421600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//                    this.needsLogging = true;
422600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//                    if (traceLevel == TRACE_DEBUG) {
423600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//                        logger.setLevel(Level.DEBUG);
424600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//                    } else if (traceLevel == TRACE_INFO) {
425600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//                        logger.setLevel(Level.INFO);
426600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//                    } else if (traceLevel == TRACE_ERROR) {
427600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//                        logger.setLevel(Level.ERROR);
428600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//                    } else if (traceLevel == TRACE_NONE) {
429600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//                        logger.setLevel(Level.OFF);
430600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//                        this.needsLogging = false;
431600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//                    }
432600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//
433600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//                    /*
434600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//                     * If user specifies a logging file as part of the startup
435600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//                     * properties then we try to create the appender.
436600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//                     */
437600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//                    if (this.needsLogging && this.logFileName != null) {
438600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//
439600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//                        boolean overwrite = Boolean.valueOf(
440600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//                                configurationProperties.getProperty(
441600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//                                "gov.nist.javax.sip.DEBUG_LOG_OVERWRITE"));
442600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//
443600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//                        FileAppender fa = null;
444600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//                        try {
445600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//                            fa = new FileAppender(new SimpleLayout(),
446600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//                                    this.logFileName, !overwrite);
447600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//                        } catch (FileNotFoundException fnf) {
448600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//
449600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//                            // Likely due to some directoy not existing. Create
450600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//                            // them
451600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//                            File logfile = new File(this.logFileName);
452600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//                            logfile.getParentFile().mkdirs();
453600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//                            logfile.delete();
454600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//
455600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//                            try {
456600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//                                fa = new FileAppender(new SimpleLayout(),
457600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//                                        this.logFileName);
458600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//                            } catch (IOException ioe) {
459600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//                                ioe.printStackTrace(); // give up
460600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//                            }
461600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//                        } catch (IOException ex) {
462600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//                            ex.printStackTrace();
463600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//                        }
464600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//
465600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//                        if (fa != null)
466600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//                            logger.addAppender(fa);
467600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//                    }
468600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//
469600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//                } catch (NumberFormatException ex) {
470600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//                    ex.printStackTrace();
471600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//                    System.err.println("LogWriter: Bad integer " + logLevel);
472600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//                    System.err.println("logging dislabled ");
473600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//                    needsLogging = false;
474600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//                }
475600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//            }
476600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//        } else {
477600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//            this.needsLogging = false;
478600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//
479600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//        }
480600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//
481600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//
482600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//    }
483600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//
484600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//    /**
485600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//     * @return flag to indicate if logging is enabled.
486600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//     */
487600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//    public boolean isLoggingEnabled() {
488600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//
489600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//        return this.needsLogging;
490600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//    }
491600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//
492600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//    /**
493600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//     * Return true/false if loging is enabled at a given level.
494600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//     *
495600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//     * @param logLevel
496600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//     */
497600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//    public boolean isLoggingEnabled(int logLevel) {
498600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//        return this.needsLogging && logLevel <= traceLevel;
499600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//    }
500600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//
501600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//
502600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//    /**
503600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//     * Log an error message.
504600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//     *
505600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//     * @param message
506600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//     * @param ex
507600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//     */
508600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//    public void logError(String message, Exception ex) {
509600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//        Logger logger = this.getLogger();
510600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//        logger.error(message, ex);
511600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//
512600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//    }
513600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//
514600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//    /**
515600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//     * Log a warning mesasge.
516600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//     *
517600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//     * @param string
518600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//     */
519600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//    public void logWarning(String string) {
520600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//        getLogger().warn(string);
521600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//
522600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//    }
523600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//
524600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//    /**
525600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//     * Log an info message.
526600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//     *
527600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//     * @param string
528600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//     */
529600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//    public void logInfo(String string) {
530600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//        getLogger().info(string);
531600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//    }
532600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//
533600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//    /**
534600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//     * Disable logging altogether.
535600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//     *
536600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//     */
537600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//    public void disableLogging() {
538600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//        this.needsLogging = false;
539600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//    }
540600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//
541600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//    /**
542600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//     * Enable logging (globally).
543600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//     */
544600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//    public void enableLogging() {
545600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//        this.needsLogging = true;
546600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//
547600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//    }
548600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//
549600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//    public void setBuildTimeStamp(String buildTimeStamp) {
550600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//        this.buildTimeStamp = buildTimeStamp;
551600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//
552600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//    }
553600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//
554600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//    public Priority getLogPriority() {
555600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//         if ( this.traceLevel == TRACE_INFO ) {
556600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//            return Priority.INFO;
557600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//        } else if ( this.traceLevel == TRACE_ERROR ) {
558600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//            return Priority.ERROR;
559600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//        } else if ( this.traceLevel == TRACE_DEBUG) {
560600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//            return Priority.DEBUG;
561600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//        } else if ( this.traceLevel == TRACE_TRACE) {
562600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//            return Priority.DEBUG;
563600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//        } else {
564600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//            return Priority.FATAL;
565600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//        }
566600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//    }
567600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//
568600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//    public Level getLevel(int traceLevel) {
569600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//        if ( traceLevel == TRACE_INFO ) {
570600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//           return Level.INFO;
571600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//       } else if ( traceLevel == TRACE_ERROR ) {
572600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//           return Level.ERROR;
573600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//       } else if ( traceLevel == TRACE_DEBUG) {
574600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//           return Level.DEBUG;
575600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//       } else if (traceLevel == TRACE_TRACE) {
576600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//           return Level.ALL;
577600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//       } else {
578600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//           return Level.OFF;
579600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//       }
580600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//   }
581600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//
582600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//	public String getLoggerName() {
583600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//	    if ( this.logger != null ) {
584600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//	        return logger.getName();
585600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//	    } else {
586600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//	        return null;
587600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//	    }
588600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//	}
589600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//
590600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//
591600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//}
592600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
593600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// END android-deleted
594