1069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project/*
2069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * Copyright 2001-2004 The Apache Software Foundation.
3069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project *
4069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
5069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * you may not use this file except in compliance with the License.
6069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * You may obtain a copy of the License at
7069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project *
8069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
9069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project *
10069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
11069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
12069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * See the License for the specific language governing permissions and
14069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * limitations under the License.
15069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project */
16069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
17069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
18069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Projectpackage org.apache.commons.logging.impl;
19069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
20069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Projectimport java.io.InputStream;
21069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Projectimport java.io.Serializable;
22069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Projectimport java.lang.reflect.InvocationTargetException;
23069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Projectimport java.lang.reflect.Method;
24069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Projectimport java.security.AccessController;
25069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Projectimport java.security.PrivilegedAction;
26069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Projectimport java.text.DateFormat;
27069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Projectimport java.text.SimpleDateFormat;
28069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Projectimport java.util.Date;
29069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Projectimport java.util.Properties;
30069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
31069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Projectimport org.apache.commons.logging.Log;
32069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Projectimport org.apache.commons.logging.LogConfigurationException;
33069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
34069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project/**
35069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * <p>Simple implementation of Log that sends all enabled log messages,
36069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * for all defined loggers, to System.err.  The following system properties
37069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * are supported to configure the behavior of this logger:</p>
38069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * <ul>
39069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * <li><code>org.apache.commons.logging.simplelog.defaultlog</code> -
40069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project *     Default logging detail level for all instances of SimpleLog.
41069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project *     Must be one of ("trace", "debug", "info", "warn", "error", or "fatal").
42069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project *     If not specified, defaults to "info". </li>
43069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * <li><code>org.apache.commons.logging.simplelog.log.xxxxx</code> -
44069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project *     Logging detail level for a SimpleLog instance named "xxxxx".
45069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project *     Must be one of ("trace", "debug", "info", "warn", "error", or "fatal").
46069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project *     If not specified, the default logging detail level is used.</li>
47069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * <li><code>org.apache.commons.logging.simplelog.showlogname</code> -
48069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project *     Set to <code>true</code> if you want the Log instance name to be
49069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project *     included in output messages. Defaults to <code>false</code>.</li>
50069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * <li><code>org.apache.commons.logging.simplelog.showShortLogname</code> -
51069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project *     Set to <code>true</code> if you want the last component of the name to be
52069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project *     included in output messages. Defaults to <code>true</code>.</li>
53069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * <li><code>org.apache.commons.logging.simplelog.showdatetime</code> -
54069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project *     Set to <code>true</code> if you want the current date and time
55069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project *     to be included in output messages. Default is <code>false</code>.</li>
56069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * <li><code>org.apache.commons.logging.simplelog.dateTimeFormat</code> -
57069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project *     The date and time format to be used in the output messages.
58069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project *     The pattern describing the date and time format is the same that is
59069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project *     used in <code>java.text.SimpleDateFormat</code>. If the format is not
60069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project *     specified or is invalid, the default format is used.
61069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project *     The default format is <code>yyyy/MM/dd HH:mm:ss:SSS zzz</code>.</li>
62069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * </ul>
63069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project *
64069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * <p>In addition to looking for system properties with the names specified
65069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * above, this implementation also checks for a class loader resource named
66069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * <code>"simplelog.properties"</code>, and includes any matching definitions
67069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * from this resource (if it exists).</p>
68069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project *
69069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * @author <a href="mailto:sanders@apache.org">Scott Sanders</a>
70069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * @author Rod Waldhoff
71069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * @author Robert Burrell Donkin
72069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project *
73069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * @version $Id: SimpleLog.java 399221 2006-05-03 09:20:24Z dennisl $
74069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project */
75069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Projectpublic class SimpleLog implements Log, Serializable {
76069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
77069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
78069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    // ------------------------------------------------------- Class Attributes
79069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
80069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    /** All system properties used by <code>SimpleLog</code> start with this */
81069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    static protected final String systemPrefix =
82069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        "org.apache.commons.logging.simplelog.";
83069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
84069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    /** Properties loaded from simplelog.properties */
85069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    static protected final Properties simpleLogProps = new Properties();
86069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
87069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    /** The default format to use when formating dates */
88069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    static protected final String DEFAULT_DATE_TIME_FORMAT =
89069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        "yyyy/MM/dd HH:mm:ss:SSS zzz";
90069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
91069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    /** Include the instance name in the log message? */
92069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    static protected boolean showLogName = false;
93069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    /** Include the short name ( last component ) of the logger in the log
94069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     *  message. Defaults to true - otherwise we'll be lost in a flood of
95069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     *  messages without knowing who sends them.
96069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     */
97069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    static protected boolean showShortName = true;
98069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    /** Include the current time in the log message */
99069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    static protected boolean showDateTime = false;
100069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    /** The date and time format to use in the log message */
101069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    static protected String dateTimeFormat = DEFAULT_DATE_TIME_FORMAT;
102069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    /** Used to format times */
103069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    static protected DateFormat dateFormatter = null;
104069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
105069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    // ---------------------------------------------------- Log Level Constants
106069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
107069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
108069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    /** "Trace" level logging. */
109069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    public static final int LOG_LEVEL_TRACE  = 1;
110069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    /** "Debug" level logging. */
111069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    public static final int LOG_LEVEL_DEBUG  = 2;
112069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    /** "Info" level logging. */
113069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    public static final int LOG_LEVEL_INFO   = 3;
114069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    /** "Warn" level logging. */
115069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    public static final int LOG_LEVEL_WARN   = 4;
116069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    /** "Error" level logging. */
117069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    public static final int LOG_LEVEL_ERROR  = 5;
118069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    /** "Fatal" level logging. */
119069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    public static final int LOG_LEVEL_FATAL  = 6;
120069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
121069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    /** Enable all logging levels */
122069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    public static final int LOG_LEVEL_ALL    = (LOG_LEVEL_TRACE - 1);
123069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
124069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    /** Enable no logging levels */
125069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    public static final int LOG_LEVEL_OFF    = (LOG_LEVEL_FATAL + 1);
126069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
127069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    // ------------------------------------------------------------ Initializer
128069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
129069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    private static String getStringProperty(String name) {
130069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        String prop = null;
131069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project	try {
132069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project	    prop = System.getProperty(name);
133069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project	} catch (SecurityException e) {
134069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project	    ; // Ignore
135069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project	}
136069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        return (prop == null) ? simpleLogProps.getProperty(name) : prop;
137069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    }
138069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
139069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    private static String getStringProperty(String name, String dephault) {
140069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        String prop = getStringProperty(name);
141069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        return (prop == null) ? dephault : prop;
142069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    }
143069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
144069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    private static boolean getBooleanProperty(String name, boolean dephault) {
145069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        String prop = getStringProperty(name);
146069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        return (prop == null) ? dephault : "true".equalsIgnoreCase(prop);
147069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    }
148069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
149069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    // Initialize class attributes.
150069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    // Load properties file, if found.
151069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    // Override with system properties.
152069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    static {
153069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        // Add props from the resource simplelog.properties
154069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        InputStream in = getResourceAsStream("simplelog.properties");
155069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        if(null != in) {
156069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project            try {
157069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project                simpleLogProps.load(in);
158069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project                in.close();
159069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project            } catch(java.io.IOException e) {
160069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project                // ignored
161069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project            }
162069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        }
163069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
164069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        showLogName = getBooleanProperty( systemPrefix + "showlogname", showLogName);
165069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        showShortName = getBooleanProperty( systemPrefix + "showShortLogname", showShortName);
166069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        showDateTime = getBooleanProperty( systemPrefix + "showdatetime", showDateTime);
167069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
168069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        if(showDateTime) {
169069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project            dateTimeFormat = getStringProperty(systemPrefix + "dateTimeFormat",
170069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project                                               dateTimeFormat);
171069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project            try {
172069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project                dateFormatter = new SimpleDateFormat(dateTimeFormat);
173069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project            } catch(IllegalArgumentException e) {
174069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project                // If the format pattern is invalid - use the default format
175069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project                dateTimeFormat = DEFAULT_DATE_TIME_FORMAT;
176069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project                dateFormatter = new SimpleDateFormat(dateTimeFormat);
177069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project            }
178069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        }
179069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    }
180069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
181069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
182069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    // ------------------------------------------------------------- Attributes
183069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
184069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    /** The name of this simple log instance */
185069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    protected String logName = null;
186069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    /** The current log level */
187069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    protected int currentLogLevel;
188069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    /** The short name of this simple log instance */
189069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    private String shortLogName = null;
190069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
191069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
192069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    // ------------------------------------------------------------ Constructor
193069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
194069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    /**
195069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     * Construct a simple log with given name.
196069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     *
197069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     * @param name log name
198069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     */
199069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    public SimpleLog(String name) {
200069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
201069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        logName = name;
202069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
203069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        // Set initial log level
204069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        // Used to be: set default log level to ERROR
205069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        // IMHO it should be lower, but at least info ( costin ).
206069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        setLevel(SimpleLog.LOG_LEVEL_INFO);
207069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
208069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        // Set log level from properties
209069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        String lvl = getStringProperty(systemPrefix + "log." + logName);
210069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        int i = String.valueOf(name).lastIndexOf(".");
211069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        while(null == lvl && i > -1) {
212069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project            name = name.substring(0,i);
213069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project            lvl = getStringProperty(systemPrefix + "log." + name);
214069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project            i = String.valueOf(name).lastIndexOf(".");
215069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        }
216069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
217069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        if(null == lvl) {
218069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project            lvl =  getStringProperty(systemPrefix + "defaultlog");
219069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        }
220069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
221069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        if("all".equalsIgnoreCase(lvl)) {
222069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project            setLevel(SimpleLog.LOG_LEVEL_ALL);
223069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        } else if("trace".equalsIgnoreCase(lvl)) {
224069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project            setLevel(SimpleLog.LOG_LEVEL_TRACE);
225069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        } else if("debug".equalsIgnoreCase(lvl)) {
226069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project            setLevel(SimpleLog.LOG_LEVEL_DEBUG);
227069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        } else if("info".equalsIgnoreCase(lvl)) {
228069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project            setLevel(SimpleLog.LOG_LEVEL_INFO);
229069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        } else if("warn".equalsIgnoreCase(lvl)) {
230069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project            setLevel(SimpleLog.LOG_LEVEL_WARN);
231069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        } else if("error".equalsIgnoreCase(lvl)) {
232069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project            setLevel(SimpleLog.LOG_LEVEL_ERROR);
233069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        } else if("fatal".equalsIgnoreCase(lvl)) {
234069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project            setLevel(SimpleLog.LOG_LEVEL_FATAL);
235069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        } else if("off".equalsIgnoreCase(lvl)) {
236069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project            setLevel(SimpleLog.LOG_LEVEL_OFF);
237069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        }
238069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
239069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    }
240069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
241069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
242069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    // -------------------------------------------------------- Properties
243069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
244069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    /**
245069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     * <p> Set logging level. </p>
246069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     *
247069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     * @param currentLogLevel new logging level
248069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     */
249069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    public void setLevel(int currentLogLevel) {
250069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
251069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        this.currentLogLevel = currentLogLevel;
252069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
253069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    }
254069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
255069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
256069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    /**
257069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     * <p> Get logging level. </p>
258069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     */
259069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    public int getLevel() {
260069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
261069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        return currentLogLevel;
262069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    }
263069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
264069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
265069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    // -------------------------------------------------------- Logging Methods
266069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
267069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
268069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    /**
269069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     * <p> Do the actual logging.
270069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     * This method assembles the message
271069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     * and then calls <code>write()</code> to cause it to be written.</p>
272069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     *
273069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     * @param type One of the LOG_LEVEL_XXX constants defining the log level
274069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     * @param message The message itself (typically a String)
275069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     * @param t The exception whose stack trace should be logged
276069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     */
277069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    protected void log(int type, Object message, Throwable t) {
278069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        // Use a string buffer for better performance
279069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        StringBuffer buf = new StringBuffer();
280069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
281069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        // Append date-time if so configured
282069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        if(showDateTime) {
283069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project            buf.append(dateFormatter.format(new Date()));
284069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project            buf.append(" ");
285069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        }
286069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
287069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        // Append a readable representation of the log level
288069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        switch(type) {
289069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project            case SimpleLog.LOG_LEVEL_TRACE: buf.append("[TRACE] "); break;
290069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project            case SimpleLog.LOG_LEVEL_DEBUG: buf.append("[DEBUG] "); break;
291069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project            case SimpleLog.LOG_LEVEL_INFO:  buf.append("[INFO] ");  break;
292069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project            case SimpleLog.LOG_LEVEL_WARN:  buf.append("[WARN] ");  break;
293069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project            case SimpleLog.LOG_LEVEL_ERROR: buf.append("[ERROR] "); break;
294069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project            case SimpleLog.LOG_LEVEL_FATAL: buf.append("[FATAL] "); break;
295069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        }
296069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
297069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        // Append the name of the log instance if so configured
298069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project 	if( showShortName) {
299069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project            if( shortLogName==null ) {
300069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project                // Cut all but the last component of the name for both styles
301069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project                shortLogName = logName.substring(logName.lastIndexOf(".") + 1);
302069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project                shortLogName =
303069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project                    shortLogName.substring(shortLogName.lastIndexOf("/") + 1);
304069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project            }
305069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project            buf.append(String.valueOf(shortLogName)).append(" - ");
306069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        } else if(showLogName) {
307069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project            buf.append(String.valueOf(logName)).append(" - ");
308069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        }
309069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
310069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        // Append the message
311069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        buf.append(String.valueOf(message));
312069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
313069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        // Append stack trace if not null
314069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        if(t != null) {
315069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project            buf.append(" <");
316069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project            buf.append(t.toString());
317069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project            buf.append(">");
318069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
319069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project            java.io.StringWriter sw= new java.io.StringWriter(1024);
320069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project            java.io.PrintWriter pw= new java.io.PrintWriter(sw);
321069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project            t.printStackTrace(pw);
322069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project            pw.close();
323069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project            buf.append(sw.toString());
324069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        }
325069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
326069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        // Print to the appropriate destination
327069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        write(buf);
328069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
329069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    }
330069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
331069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
332069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    /**
333069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     * <p>Write the content of the message accumulated in the specified
334069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     * <code>StringBuffer</code> to the appropriate output destination.  The
335069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     * default implementation writes to <code>System.err</code>.</p>
336069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     *
337069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     * @param buffer A <code>StringBuffer</code> containing the accumulated
338069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     *  text to be logged
339069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     */
340069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    protected void write(StringBuffer buffer) {
341069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
342069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        System.err.println(buffer.toString());
343069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
344069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    }
345069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
346069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
347069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    /**
348069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     * Is the given log level currently enabled?
349069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     *
350069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     * @param logLevel is this level enabled?
351069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     */
352069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    protected boolean isLevelEnabled(int logLevel) {
353069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        // log level are numerically ordered so can use simple numeric
354069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        // comparison
355069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        return (logLevel >= currentLogLevel);
356069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    }
357069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
358069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
359069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    // -------------------------------------------------------- Log Implementation
360069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
361069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
362069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    /**
363069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     * Logs a message with
364069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     * <code>org.apache.commons.logging.impl.SimpleLog.LOG_LEVEL_DEBUG</code>.
365069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     *
366069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     * @param message to log
367069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     * @see org.apache.commons.logging.Log#debug(Object)
368069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     */
369069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    public final void debug(Object message) {
370069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
371069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        if (isLevelEnabled(SimpleLog.LOG_LEVEL_DEBUG)) {
372069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project            log(SimpleLog.LOG_LEVEL_DEBUG, message, null);
373069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        }
374069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    }
375069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
376069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
377069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    /**
378069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     * Logs a message with
379069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     * <code>org.apache.commons.logging.impl.SimpleLog.LOG_LEVEL_DEBUG</code>.
380069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     *
381069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     * @param message to log
382069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     * @param t log this cause
383069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     * @see org.apache.commons.logging.Log#debug(Object, Throwable)
384069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     */
385069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    public final void debug(Object message, Throwable t) {
386069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
387069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        if (isLevelEnabled(SimpleLog.LOG_LEVEL_DEBUG)) {
388069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project            log(SimpleLog.LOG_LEVEL_DEBUG, message, t);
389069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        }
390069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    }
391069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
392069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
393069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    /**
394069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     * Logs a message with
395069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     * <code>org.apache.commons.logging.impl.SimpleLog.LOG_LEVEL_TRACE</code>.
396069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     *
397069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     * @param message to log
398069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     * @see org.apache.commons.logging.Log#trace(Object)
399069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     */
400069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    public final void trace(Object message) {
401069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
402069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        if (isLevelEnabled(SimpleLog.LOG_LEVEL_TRACE)) {
403069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project            log(SimpleLog.LOG_LEVEL_TRACE, message, null);
404069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        }
405069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    }
406069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
407069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
408069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    /**
409069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     * Logs a message with
410069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     * <code>org.apache.commons.logging.impl.SimpleLog.LOG_LEVEL_TRACE</code>.
411069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     *
412069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     * @param message to log
413069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     * @param t log this cause
414069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     * @see org.apache.commons.logging.Log#trace(Object, Throwable)
415069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     */
416069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    public final void trace(Object message, Throwable t) {
417069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
418069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        if (isLevelEnabled(SimpleLog.LOG_LEVEL_TRACE)) {
419069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project            log(SimpleLog.LOG_LEVEL_TRACE, message, t);
420069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        }
421069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    }
422069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
423069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
424069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    /**
425069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     * Logs a message with
426069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     * <code>org.apache.commons.logging.impl.SimpleLog.LOG_LEVEL_INFO</code>.
427069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     *
428069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     * @param message to log
429069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     * @see org.apache.commons.logging.Log#info(Object)
430069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     */
431069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    public final void info(Object message) {
432069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
433069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        if (isLevelEnabled(SimpleLog.LOG_LEVEL_INFO)) {
434069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project            log(SimpleLog.LOG_LEVEL_INFO,message,null);
435069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        }
436069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    }
437069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
438069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
439069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    /**
440069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     * Logs a message with
441069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     * <code>org.apache.commons.logging.impl.SimpleLog.LOG_LEVEL_INFO</code>.
442069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     *
443069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     * @param message to log
444069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     * @param t log this cause
445069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     * @see org.apache.commons.logging.Log#info(Object, Throwable)
446069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     */
447069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    public final void info(Object message, Throwable t) {
448069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
449069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        if (isLevelEnabled(SimpleLog.LOG_LEVEL_INFO)) {
450069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project            log(SimpleLog.LOG_LEVEL_INFO, message, t);
451069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        }
452069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    }
453069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
454069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
455069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    /**
456069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     * Logs a message with
457069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     * <code>org.apache.commons.logging.impl.SimpleLog.LOG_LEVEL_WARN</code>.
458069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     *
459069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     * @param message to log
460069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     * @see org.apache.commons.logging.Log#warn(Object)
461069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     */
462069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    public final void warn(Object message) {
463069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
464069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        if (isLevelEnabled(SimpleLog.LOG_LEVEL_WARN)) {
465069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project            log(SimpleLog.LOG_LEVEL_WARN, message, null);
466069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        }
467069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    }
468069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
469069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
470069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    /**
471069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     * Logs a message with
472069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     * <code>org.apache.commons.logging.impl.SimpleLog.LOG_LEVEL_WARN</code>.
473069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     *
474069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     * @param message to log
475069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     * @param t log this cause
476069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     * @see org.apache.commons.logging.Log#warn(Object, Throwable)
477069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     */
478069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    public final void warn(Object message, Throwable t) {
479069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
480069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        if (isLevelEnabled(SimpleLog.LOG_LEVEL_WARN)) {
481069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project            log(SimpleLog.LOG_LEVEL_WARN, message, t);
482069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        }
483069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    }
484069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
485069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
486069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    /**
487069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     * Logs a message with
488069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     * <code>org.apache.commons.logging.impl.SimpleLog.LOG_LEVEL_ERROR</code>.
489069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     *
490069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     * @param message to log
491069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     * @see org.apache.commons.logging.Log#error(Object)
492069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     */
493069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    public final void error(Object message) {
494069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
495069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        if (isLevelEnabled(SimpleLog.LOG_LEVEL_ERROR)) {
496069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project            log(SimpleLog.LOG_LEVEL_ERROR, message, null);
497069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        }
498069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    }
499069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
500069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
501069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    /**
502069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     * Logs a message with
503069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     * <code>org.apache.commons.logging.impl.SimpleLog.LOG_LEVEL_ERROR</code>.
504069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     *
505069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     * @param message to log
506069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     * @param t log this cause
507069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     * @see org.apache.commons.logging.Log#error(Object, Throwable)
508069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     */
509069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    public final void error(Object message, Throwable t) {
510069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
511069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        if (isLevelEnabled(SimpleLog.LOG_LEVEL_ERROR)) {
512069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project            log(SimpleLog.LOG_LEVEL_ERROR, message, t);
513069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        }
514069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    }
515069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
516069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
517069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    /**
518069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     * Log a message with
519069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     * <code>org.apache.commons.logging.impl.SimpleLog.LOG_LEVEL_FATAL</code>.
520069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     *
521069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     * @param message to log
522069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     * @see org.apache.commons.logging.Log#fatal(Object)
523069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     */
524069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    public final void fatal(Object message) {
525069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
526069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        if (isLevelEnabled(SimpleLog.LOG_LEVEL_FATAL)) {
527069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project            log(SimpleLog.LOG_LEVEL_FATAL, message, null);
528069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        }
529069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    }
530069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
531069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
532069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    /**
533069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     * Logs a message with
534069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     * <code>org.apache.commons.logging.impl.SimpleLog.LOG_LEVEL_FATAL</code>.
535069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     *
536069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     * @param message to log
537069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     * @param t log this cause
538069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     * @see org.apache.commons.logging.Log#fatal(Object, Throwable)
539069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     */
540069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    public final void fatal(Object message, Throwable t) {
541069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
542069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        if (isLevelEnabled(SimpleLog.LOG_LEVEL_FATAL)) {
543069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project            log(SimpleLog.LOG_LEVEL_FATAL, message, t);
544069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        }
545069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    }
546069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
547069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
548069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    /**
549069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     * <p> Are debug messages currently enabled? </p>
550069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     *
551069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     * <p> This allows expensive operations such as <code>String</code>
552069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     * concatenation to be avoided when the message will be ignored by the
553069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     * logger. </p>
554069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     */
555069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    public final boolean isDebugEnabled() {
556069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
557069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        return isLevelEnabled(SimpleLog.LOG_LEVEL_DEBUG);
558069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    }
559069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
560069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
561069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    /**
562069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     * <p> Are error messages currently enabled? </p>
563069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     *
564069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     * <p> This allows expensive operations such as <code>String</code>
565069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     * concatenation to be avoided when the message will be ignored by the
566069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     * logger. </p>
567069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     */
568069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    public final boolean isErrorEnabled() {
569069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
570069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        return isLevelEnabled(SimpleLog.LOG_LEVEL_ERROR);
571069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    }
572069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
573069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
574069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    /**
575069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     * <p> Are fatal messages currently enabled? </p>
576069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     *
577069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     * <p> This allows expensive operations such as <code>String</code>
578069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     * concatenation to be avoided when the message will be ignored by the
579069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     * logger. </p>
580069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     */
581069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    public final boolean isFatalEnabled() {
582069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
583069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        return isLevelEnabled(SimpleLog.LOG_LEVEL_FATAL);
584069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    }
585069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
586069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
587069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    /**
588069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     * <p> Are info messages currently enabled? </p>
589069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     *
590069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     * <p> This allows expensive operations such as <code>String</code>
591069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     * concatenation to be avoided when the message will be ignored by the
592069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     * logger. </p>
593069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     */
594069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    public final boolean isInfoEnabled() {
595069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
596069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        return isLevelEnabled(SimpleLog.LOG_LEVEL_INFO);
597069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    }
598069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
599069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
600069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    /**
601069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     * <p> Are trace messages currently enabled? </p>
602069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     *
603069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     * <p> This allows expensive operations such as <code>String</code>
604069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     * concatenation to be avoided when the message will be ignored by the
605069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     * logger. </p>
606069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     */
607069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    public final boolean isTraceEnabled() {
608069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
609069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        return isLevelEnabled(SimpleLog.LOG_LEVEL_TRACE);
610069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    }
611069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
612069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
613069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    /**
614069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     * <p> Are warn messages currently enabled? </p>
615069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     *
616069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     * <p> This allows expensive operations such as <code>String</code>
617069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     * concatenation to be avoided when the message will be ignored by the
618069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     * logger. </p>
619069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     */
620069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    public final boolean isWarnEnabled() {
621069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
622069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        return isLevelEnabled(SimpleLog.LOG_LEVEL_WARN);
623069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    }
624069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
625069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
626069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    /**
627069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     * Return the thread context class loader if available.
628069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     * Otherwise return null.
629069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     *
630069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     * The thread context class loader is available for JDK 1.2
631069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     * or later, if certain security conditions are met.
632069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     *
633069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     * @exception LogConfigurationException if a suitable class loader
634069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     * cannot be identified.
635069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     */
636069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    private static ClassLoader getContextClassLoader()
637069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    {
638069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        ClassLoader classLoader = null;
639069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
640069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        if (classLoader == null) {
641069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project            try {
642069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project                // Are we running on a JDK 1.2 or later system?
643069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project                Method method = Thread.class.getMethod("getContextClassLoader",
644069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project                        (Class[]) null);
645069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
646069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project                // Get the thread context class loader (if there is one)
647069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project                try {
648069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project                    classLoader = (ClassLoader)method.invoke(Thread.currentThread(),
649069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project                            (Object[]) null);
650069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
651069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project                } catch (IllegalAccessException e) {
652069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project                    ;  // ignore
653069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project                } catch (InvocationTargetException e) {
654069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project                    /**
655069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project                     * InvocationTargetException is thrown by 'invoke' when
656069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project                     * the method being invoked (getContextClassLoader) throws
657069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project                     * an exception.
658069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project                     *
659069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project                     * getContextClassLoader() throws SecurityException when
660069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project                     * the context class loader isn't an ancestor of the
661069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project                     * calling class's class loader, or if security
662069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project                     * permissions are restricted.
663069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project                     *
664069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project                     * In the first case (not related), we want to ignore and
665069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project                     * keep going.  We cannot help but also ignore the second
666069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project                     * with the logic below, but other calls elsewhere (to
667069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project                     * obtain a class loader) will trigger this exception where
668069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project                     * we can make a distinction.
669069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project                     */
670069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project                    if (e.getTargetException() instanceof SecurityException) {
671069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project                        ;  // ignore
672069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project                    } else {
673069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project                        // Capture 'e.getTargetException()' exception for details
674069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project                        // alternate: log 'e.getTargetException()', and pass back 'e'.
675069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project                        throw new LogConfigurationException
676069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project                            ("Unexpected InvocationTargetException", e.getTargetException());
677069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project                    }
678069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project                }
679069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project            } catch (NoSuchMethodException e) {
680069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project                // Assume we are running on JDK 1.1
681069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project                ;  // ignore
682069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project            }
683069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        }
684069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
685069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        if (classLoader == null) {
686069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project            classLoader = SimpleLog.class.getClassLoader();
687069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        }
688069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
689069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        // Return the selected class loader
690069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        return classLoader;
691069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    }
692069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
693069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    private static InputStream getResourceAsStream(final String name)
694069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    {
695069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        return (InputStream)AccessController.doPrivileged(
696069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project            new PrivilegedAction() {
697069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project                public Object run() {
698069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project                    ClassLoader threadCL = getContextClassLoader();
699069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
700069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project                    if (threadCL != null) {
701069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project                        return threadCL.getResourceAsStream(name);
702069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project                    } else {
703069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project                        return ClassLoader.getSystemResourceAsStream(name);
704069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project                    }
705069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project                }
706069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project            });
707069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    }
708069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project}
709069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
710