1f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes/*
2adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Licensed to the Apache Software Foundation (ASF) under one or more
3adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * contributor license agreements.  See the NOTICE file distributed with
4adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * this work for additional information regarding copyright ownership.
5adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * The ASF licenses this file to You under the Apache License, Version 2.0
6adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * (the "License"); you may not use this file except in compliance with
7adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the License.  You may obtain a copy of the License at
8f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes *
9adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *     http://www.apache.org/licenses/LICENSE-2.0
10f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes *
11adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Unless required by applicable law or agreed to in writing, software
12adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
13adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * See the License for the specific language governing permissions and
15adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * limitations under the License.
16adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */
17adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
18adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectpackage java.util.logging;
19adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
20c99250a4d619670f2a9410df121eff04fdc9e87cJesse Wilsonimport dalvik.system.DalvikLogHandler;
21c99250a4d619670f2a9410df121eff04fdc9e87cJesse Wilsonimport dalvik.system.DalvikLogging;
22adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.util.ArrayList;
23c99250a4d619670f2a9410df121eff04fdc9e87cJesse Wilsonimport java.util.Iterator;
24adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.util.List;
25adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.util.Locale;
26adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.util.MissingResourceException;
27adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.util.ResourceBundle;
28b501914f9448cc0c5852922d217ae11a29c63467Jesse Wilsonimport java.util.concurrent.CopyOnWriteArrayList;
29adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
30adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/**
313cea39f0684e5b775f1a20dc6589bdd22cf23920Elliott Hughes * Loggers are used to log records to a variety of destinations such as log files or
323cea39f0684e5b775f1a20dc6589bdd22cf23920Elliott Hughes * the console. They use instances of {@link Handler} to actually do the destination-specific
33adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * operations.
343cea39f0684e5b775f1a20dc6589bdd22cf23920Elliott Hughes *
353cea39f0684e5b775f1a20dc6589bdd22cf23920Elliott Hughes * <p>Client applications can get named loggers by calling the {@code getLogger}
36adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * methods. They can also get anonymous loggers by calling the
37adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code getAnonymousLogger} methods. Named loggers are organized in a
38adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * namespace hierarchy managed by a log manager. The naming convention is
393cea39f0684e5b775f1a20dc6589bdd22cf23920Elliott Hughes * usually the Java package naming convention. Anonymous loggers do not belong to any namespace.
403cea39f0684e5b775f1a20dc6589bdd22cf23920Elliott Hughes *
413cea39f0684e5b775f1a20dc6589bdd22cf23920Elliott Hughes * <p>Developers should use named loggers to enable logging to be controlled on a
423cea39f0684e5b775f1a20dc6589bdd22cf23920Elliott Hughes * per-{@code Logger} granularity. The recommended idiom is to create and assign the logger to
433cea39f0684e5b775f1a20dc6589bdd22cf23920Elliott Hughes * a {@code static final} field. This ensures that there's always a strong reference to the logger,
443cea39f0684e5b775f1a20dc6589bdd22cf23920Elliott Hughes * preventing it from being garbage collected. In particular, {@link LogManager#addLogger(Logger)}
453cea39f0684e5b775f1a20dc6589bdd22cf23920Elliott Hughes * will <i>not</i> keep your logger live.
463cea39f0684e5b775f1a20dc6589bdd22cf23920Elliott Hughes *
473cea39f0684e5b775f1a20dc6589bdd22cf23920Elliott Hughes * <p>Loggers "inherit" log level setting from their parent if their own level is
48adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * set to {@code null}. This is also true for the resource bundle. The logger's
49adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * resource bundle is used to localize the log messages if no resource bundle
50adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * name is given when a log method is called. If {@code getUseParentHandlers()}
51adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * returns {@code true}, loggers also inherit their parent's handlers. In this
52adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * context, "inherit" only means that "behavior" is inherited. The internal
53adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * field values will not change, for example, {@code getLevel()} still returns
54adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code null}.
55adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p>
56adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * When loading a given resource bundle, the logger first tries to use the
573cea39f0684e5b775f1a20dc6589bdd22cf23920Elliott Hughes * context {@code ClassLoader}. If that fails, it tries the system {@code ClassLoader}. And if
58adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * that still fails, it searches up the class stack and uses each class's
593cea39f0684e5b775f1a20dc6589bdd22cf23920Elliott Hughes * {@code ClassLoader} to try to locate the resource bundle.
60adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p>
61adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Some log methods accept log requests that do not specify the source class and
62adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * source method. In these cases, the logging framework will automatically infer
63adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the calling class and method, but this is not guaranteed to be accurate.
64adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p>
65adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Once a {@code LogRecord} object has been passed into the logging framework,
66adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * it is owned by the logging framework and the client applications should not
67adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * use it any longer.
68adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p>
69adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * All methods of this class are thread-safe.
709a0fbe99031759393563ee69ac4640f66f182686Jesse Wilson *
71adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @see LogManager
72adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */
73adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectpublic class Logger {
74adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
75c99250a4d619670f2a9410df121eff04fdc9e87cJesse Wilson    /** A handler for use when no handler optimization is possible. */
76c99250a4d619670f2a9410df121eff04fdc9e87cJesse Wilson    private static final DalvikLogHandler GENERAL_LOG_HANDLER = new DalvikLogHandler() {
77c99250a4d619670f2a9410df121eff04fdc9e87cJesse Wilson        public void publish(Logger source, String tag, Level level, String message) {
78c99250a4d619670f2a9410df121eff04fdc9e87cJesse Wilson            LogRecord record = new LogRecord(level, message);
79c99250a4d619670f2a9410df121eff04fdc9e87cJesse Wilson            record.setLoggerName(source.name);
80c99250a4d619670f2a9410df121eff04fdc9e87cJesse Wilson            source.setResourceBundle(record);
81c99250a4d619670f2a9410df121eff04fdc9e87cJesse Wilson            source.log(record);
82c99250a4d619670f2a9410df121eff04fdc9e87cJesse Wilson        }
83c99250a4d619670f2a9410df121eff04fdc9e87cJesse Wilson    };
84c99250a4d619670f2a9410df121eff04fdc9e87cJesse Wilson
853cea39f0684e5b775f1a20dc6589bdd22cf23920Elliott Hughes    /**
863cea39f0684e5b775f1a20dc6589bdd22cf23920Elliott Hughes     * The name of the global logger. Before using this, see the discussion of how to use
873cea39f0684e5b775f1a20dc6589bdd22cf23920Elliott Hughes     * {@code Logger} in the class documentation.
883cea39f0684e5b775f1a20dc6589bdd22cf23920Elliott Hughes     * @since 1.6
893cea39f0684e5b775f1a20dc6589bdd22cf23920Elliott Hughes     */
903cea39f0684e5b775f1a20dc6589bdd22cf23920Elliott Hughes    public static final String GLOBAL_LOGGER_NAME = "global";
913cea39f0684e5b775f1a20dc6589bdd22cf23920Elliott Hughes
923cea39f0684e5b775f1a20dc6589bdd22cf23920Elliott Hughes    /**
933cea39f0684e5b775f1a20dc6589bdd22cf23920Elliott Hughes     * The global logger is provided as convenience for casual use.
9499b4489d0555c6e0e5df941cbfad4cf250c8f0b8Elliott Hughes     * @deprecated This is deadlock-prone. Use {@code Logger.getLogger(Logger.GLOBAL_LOGGER_NAME)}
9599b4489d0555c6e0e5df941cbfad4cf250c8f0b8Elliott Hughes     * as a direct replacement, but read the discussion of how to use {@link Logger} in the class
963cea39f0684e5b775f1a20dc6589bdd22cf23920Elliott Hughes     * documentation.
973cea39f0684e5b775f1a20dc6589bdd22cf23920Elliott Hughes     */
983cea39f0684e5b775f1a20dc6589bdd22cf23920Elliott Hughes    @Deprecated
990d4ce4227fa818288b8db762b640dfa21e3162f5Elliott Hughes    public static final Logger global = new Logger(GLOBAL_LOGGER_NAME, null);
100adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
101b501914f9448cc0c5852922d217ae11a29c63467Jesse Wilson    /**
102b501914f9448cc0c5852922d217ae11a29c63467Jesse Wilson     * When converting the concurrent collection of handlers to an array, we
103b501914f9448cc0c5852922d217ae11a29c63467Jesse Wilson     * always pass a zero-length array to avoid size miscalculations. Passing
104b501914f9448cc0c5852922d217ae11a29c63467Jesse Wilson     * properly-sized arrays is non-atomic, and risks a null element in the
105b501914f9448cc0c5852922d217ae11a29c63467Jesse Wilson     * result.
106b501914f9448cc0c5852922d217ae11a29c63467Jesse Wilson     */
107b501914f9448cc0c5852922d217ae11a29c63467Jesse Wilson    private static final Handler[] EMPTY_HANDLERS_ARRAY = new Handler[0];
108b501914f9448cc0c5852922d217ae11a29c63467Jesse Wilson
109d9b5d1b899226673e746ad4d9f517244d968e5baJesse Wilson    /** The name of this logger. */
110adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private volatile String name;
111adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
112d9b5d1b899226673e746ad4d9f517244d968e5baJesse Wilson    /** The parent logger of this logger. */
113d9b5d1b899226673e746ad4d9f517244d968e5baJesse Wilson    Logger parent;
114adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
115d9b5d1b899226673e746ad4d9f517244d968e5baJesse Wilson    /** The logging level of this logger, or null if none is set. */
116d9b5d1b899226673e746ad4d9f517244d968e5baJesse Wilson    volatile Level levelObjVal;
117adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
118d9b5d1b899226673e746ad4d9f517244d968e5baJesse Wilson    /**
119d9b5d1b899226673e746ad4d9f517244d968e5baJesse Wilson     * The effective logging level of this logger. In order of preference this
120d9b5d1b899226673e746ad4d9f517244d968e5baJesse Wilson     * is the first applicable of:
121d9b5d1b899226673e746ad4d9f517244d968e5baJesse Wilson     * <ol>
122d9b5d1b899226673e746ad4d9f517244d968e5baJesse Wilson     * <li>the int value of this logger's {@link #levelObjVal}
123d9b5d1b899226673e746ad4d9f517244d968e5baJesse Wilson     * <li>the logging level of the parent
124d9b5d1b899226673e746ad4d9f517244d968e5baJesse Wilson     * <li>the default level ({@link Level#INFO})
125d9b5d1b899226673e746ad4d9f517244d968e5baJesse Wilson     * </ol>
126d9b5d1b899226673e746ad4d9f517244d968e5baJesse Wilson     */
127d9b5d1b899226673e746ad4d9f517244d968e5baJesse Wilson    volatile int levelIntVal = Level.INFO.intValue();
128adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
129d9b5d1b899226673e746ad4d9f517244d968e5baJesse Wilson    /** The filter. */
130adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private Filter filter;
131adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
132d9b5d1b899226673e746ad4d9f517244d968e5baJesse Wilson    /**
133d9b5d1b899226673e746ad4d9f517244d968e5baJesse Wilson     * The resource bundle used to localize logging messages. If null, no
134d9b5d1b899226673e746ad4d9f517244d968e5baJesse Wilson     * localization will be performed.
135d9b5d1b899226673e746ad4d9f517244d968e5baJesse Wilson     */
136b501914f9448cc0c5852922d217ae11a29c63467Jesse Wilson    private volatile String resourceBundleName;
137adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
138d9b5d1b899226673e746ad4d9f517244d968e5baJesse Wilson    /** The loaded resource bundle according to the specified name. */
139b501914f9448cc0c5852922d217ae11a29c63467Jesse Wilson    private volatile ResourceBundle resourceBundle;
140adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
141d9b5d1b899226673e746ad4d9f517244d968e5baJesse Wilson    /**
142b501914f9448cc0c5852922d217ae11a29c63467Jesse Wilson     * The handlers attached to this logger. Eagerly initialized and
143b501914f9448cc0c5852922d217ae11a29c63467Jesse Wilson     * concurrently modified.
144d9b5d1b899226673e746ad4d9f517244d968e5baJesse Wilson     */
145b501914f9448cc0c5852922d217ae11a29c63467Jesse Wilson    private final List<Handler> handlers = new CopyOnWriteArrayList<Handler>();
146adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
147d9b5d1b899226673e746ad4d9f517244d968e5baJesse Wilson    /** True to notify the parent's handlers of each log message. */
148d9b5d1b899226673e746ad4d9f517244d968e5baJesse Wilson    private boolean notifyParentHandlers = true;
149adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
150d9b5d1b899226673e746ad4d9f517244d968e5baJesse Wilson    /**
151d9b5d1b899226673e746ad4d9f517244d968e5baJesse Wilson     * Indicates whether this logger is named. Only {@link #getAnonymousLogger
152d9b5d1b899226673e746ad4d9f517244d968e5baJesse Wilson     * anonymous loggers} are unnamed.
153d9b5d1b899226673e746ad4d9f517244d968e5baJesse Wilson     */
154d9b5d1b899226673e746ad4d9f517244d968e5baJesse Wilson    private boolean isNamed = true;
155adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
156d9b5d1b899226673e746ad4d9f517244d968e5baJesse Wilson    /**
157d9b5d1b899226673e746ad4d9f517244d968e5baJesse Wilson     * Child loggers. Should be accessed only while synchronized on {@code
158d9b5d1b899226673e746ad4d9f517244d968e5baJesse Wilson     * LogManager.getLogManager()}.
159d9b5d1b899226673e746ad4d9f517244d968e5baJesse Wilson     */
160d9b5d1b899226673e746ad4d9f517244d968e5baJesse Wilson    final List<Logger> children = new ArrayList<Logger>();
1619a0fbe99031759393563ee69ac4640f66f182686Jesse Wilson
162c99250a4d619670f2a9410df121eff04fdc9e87cJesse Wilson    /** the tag used for optimized logging. Derived from the logger name. */
163c99250a4d619670f2a9410df121eff04fdc9e87cJesse Wilson    private final String androidTag;
164c99250a4d619670f2a9410df121eff04fdc9e87cJesse Wilson
165c99250a4d619670f2a9410df121eff04fdc9e87cJesse Wilson    /** Handler delegate for either optimized or standard logging. */
166c99250a4d619670f2a9410df121eff04fdc9e87cJesse Wilson    private volatile DalvikLogHandler dalvikLogHandler = GENERAL_LOG_HANDLER;
167c99250a4d619670f2a9410df121eff04fdc9e87cJesse Wilson
168c99250a4d619670f2a9410df121eff04fdc9e87cJesse Wilson    /**
169c99250a4d619670f2a9410df121eff04fdc9e87cJesse Wilson     * We've optimized for the common case: logging to a single handler that
170c99250a4d619670f2a9410df121eff04fdc9e87cJesse Wilson     * implements {@link DalvikLogHandler}. This is how Android framework
171c99250a4d619670f2a9410df121eff04fdc9e87cJesse Wilson     * applications are configured by default.
172c99250a4d619670f2a9410df121eff04fdc9e87cJesse Wilson     *
173c99250a4d619670f2a9410df121eff04fdc9e87cJesse Wilson     * <p>This optimization has been measured to show a 2.75x improvement in
174c99250a4d619670f2a9410df121eff04fdc9e87cJesse Wilson     * throughput in the common case: 154ns vs. 56ns per message on a Cortex-A8.
175c99250a4d619670f2a9410df121eff04fdc9e87cJesse Wilson     * Direct use of {@code android.util.Log} takes 29ns per message.
176c99250a4d619670f2a9410df121eff04fdc9e87cJesse Wilson     *
177c99250a4d619670f2a9410df121eff04fdc9e87cJesse Wilson     * <p>Each time the handler configuration changes, either directly or
178c99250a4d619670f2a9410df121eff04fdc9e87cJesse Wilson     * indirectly, it's necessary to either turn on or off this optimization.
179c99250a4d619670f2a9410df121eff04fdc9e87cJesse Wilson     * When the optimization is off, {@link #dalvikLogHandler} is assigned to
180c99250a4d619670f2a9410df121eff04fdc9e87cJesse Wilson     * {@link #GENERAL_LOG_HANDLER} which can satisfy arbitrary configuration.
181c99250a4d619670f2a9410df121eff04fdc9e87cJesse Wilson     * When the optimization is possible, {@link #dalvikLogHandler} is assigned
182c99250a4d619670f2a9410df121eff04fdc9e87cJesse Wilson     * to the user's efficient implementation. In pratice this is usually the
183c99250a4d619670f2a9410df121eff04fdc9e87cJesse Wilson     * {@code com.android.internal.logging.AndroidHandler}.
184c99250a4d619670f2a9410df121eff04fdc9e87cJesse Wilson     */
185c99250a4d619670f2a9410df121eff04fdc9e87cJesse Wilson    void updateDalvikLogHandler() {
186c99250a4d619670f2a9410df121eff04fdc9e87cJesse Wilson        DalvikLogHandler newLogHandler = GENERAL_LOG_HANDLER;
187c99250a4d619670f2a9410df121eff04fdc9e87cJesse Wilson
188c99250a4d619670f2a9410df121eff04fdc9e87cJesse Wilson        Logger parent = this.parent;
189c99250a4d619670f2a9410df121eff04fdc9e87cJesse Wilson
190c99250a4d619670f2a9410df121eff04fdc9e87cJesse Wilson        if (getClass() != Logger.class) {
191c99250a4d619670f2a9410df121eff04fdc9e87cJesse Wilson            /*
192c99250a4d619670f2a9410df121eff04fdc9e87cJesse Wilson             * Do nothing. Subclasses aren't eligible for the optimization
193c99250a4d619670f2a9410df121eff04fdc9e87cJesse Wilson             * because they may override methods like getHandlers() or
194c99250a4d619670f2a9410df121eff04fdc9e87cJesse Wilson             * log(LogRecord).
195c99250a4d619670f2a9410df121eff04fdc9e87cJesse Wilson             */
196c99250a4d619670f2a9410df121eff04fdc9e87cJesse Wilson
197c99250a4d619670f2a9410df121eff04fdc9e87cJesse Wilson        } else if (parent == null) {
198c99250a4d619670f2a9410df121eff04fdc9e87cJesse Wilson            // we use an iterator rather than size()+get() for safe concurrency
199c99250a4d619670f2a9410df121eff04fdc9e87cJesse Wilson            Iterator<Handler> h = handlers.iterator();
200c99250a4d619670f2a9410df121eff04fdc9e87cJesse Wilson            if (h.hasNext()) {
201c99250a4d619670f2a9410df121eff04fdc9e87cJesse Wilson                Handler firstHandler = h.next();
202c99250a4d619670f2a9410df121eff04fdc9e87cJesse Wilson                if (!h.hasNext() && firstHandler instanceof DalvikLogHandler) {
203c99250a4d619670f2a9410df121eff04fdc9e87cJesse Wilson                    /*
204c99250a4d619670f2a9410df121eff04fdc9e87cJesse Wilson                     * At this point, we're eligible for the optimization. We've
205c99250a4d619670f2a9410df121eff04fdc9e87cJesse Wilson                     * satisfied these constraints:
206c99250a4d619670f2a9410df121eff04fdc9e87cJesse Wilson                     *   1. This is not a subclass of logger
207c99250a4d619670f2a9410df121eff04fdc9e87cJesse Wilson                     *   2. This is a root logger (no parent)
208c99250a4d619670f2a9410df121eff04fdc9e87cJesse Wilson                     *   3. There is exactly one handler installed
209c99250a4d619670f2a9410df121eff04fdc9e87cJesse Wilson                     *   4. That handler is a DalvikLogHandler
210c99250a4d619670f2a9410df121eff04fdc9e87cJesse Wilson                     */
211c99250a4d619670f2a9410df121eff04fdc9e87cJesse Wilson                    newLogHandler = (DalvikLogHandler) firstHandler;
212c99250a4d619670f2a9410df121eff04fdc9e87cJesse Wilson                }
213c99250a4d619670f2a9410df121eff04fdc9e87cJesse Wilson            }
214c99250a4d619670f2a9410df121eff04fdc9e87cJesse Wilson        } else if (handlers.isEmpty() && notifyParentHandlers) {
215c99250a4d619670f2a9410df121eff04fdc9e87cJesse Wilson            /*
216c99250a4d619670f2a9410df121eff04fdc9e87cJesse Wilson             * At this point, we're eligible for the optimization if our parent
217c99250a4d619670f2a9410df121eff04fdc9e87cJesse Wilson             * logger is eligible. We've satisfied these constraints:
218c99250a4d619670f2a9410df121eff04fdc9e87cJesse Wilson             *   1. This is not a subclass of logger
219c99250a4d619670f2a9410df121eff04fdc9e87cJesse Wilson             *   2. our parent exists
220c99250a4d619670f2a9410df121eff04fdc9e87cJesse Wilson             *   3. we have no handlers of our own
221c99250a4d619670f2a9410df121eff04fdc9e87cJesse Wilson             *   4. we notify our parent's handlers
222c99250a4d619670f2a9410df121eff04fdc9e87cJesse Wilson             */
223c99250a4d619670f2a9410df121eff04fdc9e87cJesse Wilson            newLogHandler = parent.dalvikLogHandler;
224c99250a4d619670f2a9410df121eff04fdc9e87cJesse Wilson        }
225c99250a4d619670f2a9410df121eff04fdc9e87cJesse Wilson
226c99250a4d619670f2a9410df121eff04fdc9e87cJesse Wilson        if (newLogHandler == this.dalvikLogHandler) {
227c99250a4d619670f2a9410df121eff04fdc9e87cJesse Wilson            return;
228c99250a4d619670f2a9410df121eff04fdc9e87cJesse Wilson        }
229c99250a4d619670f2a9410df121eff04fdc9e87cJesse Wilson
230c99250a4d619670f2a9410df121eff04fdc9e87cJesse Wilson        this.dalvikLogHandler = newLogHandler;
231c99250a4d619670f2a9410df121eff04fdc9e87cJesse Wilson
232c99250a4d619670f2a9410df121eff04fdc9e87cJesse Wilson        for (Logger logger : children) {
233c99250a4d619670f2a9410df121eff04fdc9e87cJesse Wilson            logger.updateDalvikLogHandler();
234c99250a4d619670f2a9410df121eff04fdc9e87cJesse Wilson        }
235c99250a4d619670f2a9410df121eff04fdc9e87cJesse Wilson    }
236c99250a4d619670f2a9410df121eff04fdc9e87cJesse Wilson
237adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
238adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Constructs a {@code Logger} object with the supplied name and resource
239adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * bundle name; {@code notifiyParentHandlers} is set to {@code true}.
240adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * <p>
2419a0fbe99031759393563ee69ac4640f66f182686Jesse Wilson     * Notice : Loggers use a naming hierarchy. Thus "z.x.y" is a child of "z.x".
2429a0fbe99031759393563ee69ac4640f66f182686Jesse Wilson     *
243adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param name
244adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the name of this logger, may be {@code null} for anonymous
245adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            loggers.
246adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param resourceBundleName
247adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the name of the resource bundle used to localize logging
248adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            messages, may be {@code null}.
249adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws MissingResourceException
250adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if the specified resource bundle can not be loaded.
251adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
252adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    protected Logger(String name, String resourceBundleName) {
253adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        this.name = name;
254b501914f9448cc0c5852922d217ae11a29c63467Jesse Wilson        initResourceBundle(resourceBundleName);
255c99250a4d619670f2a9410df121eff04fdc9e87cJesse Wilson        this.androidTag = DalvikLogging.loggerNameToTag(name);
256c99250a4d619670f2a9410df121eff04fdc9e87cJesse Wilson        updateDalvikLogHandler();
257adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
258adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
259adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
260adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Load the specified resource bundle, use privileged code.
2619a0fbe99031759393563ee69ac4640f66f182686Jesse Wilson     *
262adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param resourceBundleName
263adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the name of the resource bundle to load, cannot be {@code null}.
264adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the loaded resource bundle.
265adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws MissingResourceException
266adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if the specified resource bundle can not be loaded.
267adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
268adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    static ResourceBundle loadResourceBundle(String resourceBundleName) {
269adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        // try context class loader to load the resource
270ad41624e761bcf1af9c8008eb45187fc13983717Elliott Hughes        ClassLoader cl = Thread.currentThread().getContextClassLoader();
271d9b5d1b899226673e746ad4d9f517244d968e5baJesse Wilson        if (cl != null) {
272adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            try {
273560d3756e9a8e95ed3aba6043118e89f87966522Jesse Wilson                return ResourceBundle.getBundle(resourceBundleName, Locale.getDefault(), cl);
274560d3756e9a8e95ed3aba6043118e89f87966522Jesse Wilson            } catch (MissingResourceException ignored) {
275560d3756e9a8e95ed3aba6043118e89f87966522Jesse Wilson                // Failed to load using context class loader, ignore
276adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
277adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
278adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        // try system class loader to load the resource
279ad41624e761bcf1af9c8008eb45187fc13983717Elliott Hughes        cl = ClassLoader.getSystemClassLoader();
280d9b5d1b899226673e746ad4d9f517244d968e5baJesse Wilson        if (cl != null) {
281adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            try {
282ad41624e761bcf1af9c8008eb45187fc13983717Elliott Hughes                return ResourceBundle.getBundle(resourceBundleName, Locale.getDefault(), cl);
283560d3756e9a8e95ed3aba6043118e89f87966522Jesse Wilson            } catch (MissingResourceException ignored) {
284560d3756e9a8e95ed3aba6043118e89f87966522Jesse Wilson                // Failed to load using system class loader, ignore
285adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
286adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
2878454d3c5b9778ae359d11cd98ed81c589e951d0aElliott Hughes        throw new MissingResourceException("Failed to load the specified resource bundle \"" +
2888454d3c5b9778ae359d11cd98ed81c589e951d0aElliott Hughes                resourceBundleName + "\"", resourceBundleName, null);
289adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
290adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
291adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
292adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Gets an anonymous logger to use internally in a thread. Anonymous loggers
293adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * are not registered in the log manager's namespace. No security checks
294adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * will be performed when updating an anonymous logger's control settings.
295adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * <p>
296adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * The anonymous loggers' parent is set to be the root logger. This way it
297adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * inherits the default logging level and handlers from the root logger.
2989a0fbe99031759393563ee69ac4640f66f182686Jesse Wilson     *
299adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return a new instance of anonymous logger.
300adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
301adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static Logger getAnonymousLogger() {
302adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return getAnonymousLogger(null);
303adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
304adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
305adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
306adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Gets an anonymous logger to use internally in a thread. Anonymous loggers
307adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * are not registered in the log manager's namespace. No security checks
308adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * will be performed when updating an anonymous logger's control settings.
309adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * <p>
310adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * The anonymous loggers' parent is set to be the root logger. This way it
311adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * inherits default logging level and handlers from the root logger.
3129a0fbe99031759393563ee69ac4640f66f182686Jesse Wilson     *
313adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param resourceBundleName
314adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the name of the resource bundle used to localize log messages.
315adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return a new instance of anonymous logger.
316adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws MissingResourceException
317adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if the specified resource bundle can not be loaded.
318adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
319adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static Logger getAnonymousLogger(String resourceBundleName) {
320d9b5d1b899226673e746ad4d9f517244d968e5baJesse Wilson        Logger result = new Logger(null, resourceBundleName);
321d9b5d1b899226673e746ad4d9f517244d968e5baJesse Wilson        result.isNamed = false;
322d9b5d1b899226673e746ad4d9f517244d968e5baJesse Wilson        LogManager logManager = LogManager.getLogManager();
323d9b5d1b899226673e746ad4d9f517244d968e5baJesse Wilson        logManager.setParent(result, logManager.getLogger(""));
324d9b5d1b899226673e746ad4d9f517244d968e5baJesse Wilson        return result;
325adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
326adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
327d9b5d1b899226673e746ad4d9f517244d968e5baJesse Wilson    /**
328d9b5d1b899226673e746ad4d9f517244d968e5baJesse Wilson     * Initializes this logger's resource bundle.
329d9b5d1b899226673e746ad4d9f517244d968e5baJesse Wilson     *
330d9b5d1b899226673e746ad4d9f517244d968e5baJesse Wilson     * @throws IllegalArgumentException if this logger's resource bundle already
331d9b5d1b899226673e746ad4d9f517244d968e5baJesse Wilson     *      exists and is different from the resource bundle specified.
332adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
333d9b5d1b899226673e746ad4d9f517244d968e5baJesse Wilson    private synchronized void initResourceBundle(String resourceBundleName) {
334b501914f9448cc0c5852922d217ae11a29c63467Jesse Wilson        String current = this.resourceBundleName;
335d9b5d1b899226673e746ad4d9f517244d968e5baJesse Wilson
336d9b5d1b899226673e746ad4d9f517244d968e5baJesse Wilson        if (current != null) {
337d9b5d1b899226673e746ad4d9f517244d968e5baJesse Wilson            if (current.equals(resourceBundleName)) {
338d9b5d1b899226673e746ad4d9f517244d968e5baJesse Wilson                return;
339d9b5d1b899226673e746ad4d9f517244d968e5baJesse Wilson            } else {
3408454d3c5b9778ae359d11cd98ed81c589e951d0aElliott Hughes                throw new IllegalArgumentException("Resource bundle name '" + resourceBundleName + "' is inconsistent with the existing '" + current + "'");
341adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
342adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
343adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
344d9b5d1b899226673e746ad4d9f517244d968e5baJesse Wilson        if (resourceBundleName != null) {
345b501914f9448cc0c5852922d217ae11a29c63467Jesse Wilson            this.resourceBundle = loadResourceBundle(resourceBundleName);
346b501914f9448cc0c5852922d217ae11a29c63467Jesse Wilson            this.resourceBundleName = resourceBundleName;
347adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
348adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
349adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
350adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
351adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Gets a named logger. The returned logger may already exist or may be
352adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * newly created. In the latter case, its level will be set to the
353adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * configured level according to the {@code LogManager}'s properties.
3549a0fbe99031759393563ee69ac4640f66f182686Jesse Wilson     *
355adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param name
356adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the name of the logger to get, cannot be {@code null}.
357adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return a named logger.
3589a0fbe99031759393563ee69ac4640f66f182686Jesse Wilson     * @throws MissingResourceException
3599a0fbe99031759393563ee69ac4640f66f182686Jesse Wilson     *             If the specified resource bundle can not be loaded.
360adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
361adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static Logger getLogger(String name) {
362d9b5d1b899226673e746ad4d9f517244d968e5baJesse Wilson        return LogManager.getLogManager().getOrCreate(name, null);
363adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
364adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
365adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
366adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Gets a named logger associated with the supplied resource bundle. The
367adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * resource bundle will be used to localize logging messages.
3689a0fbe99031759393563ee69ac4640f66f182686Jesse Wilson     *
369adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param name
370adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the name of the logger to get, cannot be {@code null}.
371adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param resourceBundleName
372adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the name of the resource bundle, may be {@code null}.
373adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IllegalArgumentException
374adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if the logger identified by {@code name} is associated with a
375adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             resource bundle and its name is not equal to
376adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             {@code resourceBundleName}.
377adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws MissingResourceException
378adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if the name of the resource bundle cannot be found.
379adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return a named logger.
380adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
381adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static Logger getLogger(String name, String resourceBundleName) {
382d9b5d1b899226673e746ad4d9f517244d968e5baJesse Wilson        Logger result = LogManager.getLogManager()
383d9b5d1b899226673e746ad4d9f517244d968e5baJesse Wilson                .getOrCreate(name, resourceBundleName);
384d9b5d1b899226673e746ad4d9f517244d968e5baJesse Wilson        result.initResourceBundle(resourceBundleName);
385d9b5d1b899226673e746ad4d9f517244d968e5baJesse Wilson        return result;
386adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
387adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
388adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
389da919b1f08fa713ee78aabb3e2e324630ae1b59dElliott Hughes     * Returns the global {@code Logger}.
390da919b1f08fa713ee78aabb3e2e324630ae1b59dElliott Hughes     * @since 1.7
391da919b1f08fa713ee78aabb3e2e324630ae1b59dElliott Hughes     */
392da919b1f08fa713ee78aabb3e2e324630ae1b59dElliott Hughes    public static Logger getGlobal() {
393da919b1f08fa713ee78aabb3e2e324630ae1b59dElliott Hughes        return global;
394da919b1f08fa713ee78aabb3e2e324630ae1b59dElliott Hughes    }
395da919b1f08fa713ee78aabb3e2e324630ae1b59dElliott Hughes
396da919b1f08fa713ee78aabb3e2e324630ae1b59dElliott Hughes    /**
397adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Adds a handler to this logger. The {@code name} will be fed with log
398adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * records received by this logger.
3999a0fbe99031759393563ee69ac4640f66f182686Jesse Wilson     *
400adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param handler
401adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the handler object to add, cannot be {@code null}.
402adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
403adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void addHandler(Handler handler) {
404d9b5d1b899226673e746ad4d9f517244d968e5baJesse Wilson        if (handler == null) {
4058454d3c5b9778ae359d11cd98ed81c589e951d0aElliott Hughes            throw new NullPointerException("handler == null");
406adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
407adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        // Anonymous loggers can always add handlers
408adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (this.isNamed) {
409adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            LogManager.getLogManager().checkAccess();
410adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
411b501914f9448cc0c5852922d217ae11a29c63467Jesse Wilson        this.handlers.add(handler);
412fb0ec0e650bf8be35acb0d47da0311a7c446aa33Elliott Hughes        updateDalvikLogHandler();
413adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
4149a0fbe99031759393563ee69ac4640f66f182686Jesse Wilson
415d9b5d1b899226673e746ad4d9f517244d968e5baJesse Wilson    /**
416b501914f9448cc0c5852922d217ae11a29c63467Jesse Wilson     * Set the logger's manager and initializes its configuration from the
417b501914f9448cc0c5852922d217ae11a29c63467Jesse Wilson     * manager's properties.
418adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
419b501914f9448cc0c5852922d217ae11a29c63467Jesse Wilson    void setManager(LogManager manager) {
420b501914f9448cc0c5852922d217ae11a29c63467Jesse Wilson        String levelProperty = manager.getProperty(name + ".level");
421b501914f9448cc0c5852922d217ae11a29c63467Jesse Wilson        if (levelProperty != null) {
422b501914f9448cc0c5852922d217ae11a29c63467Jesse Wilson            try {
423b501914f9448cc0c5852922d217ae11a29c63467Jesse Wilson                manager.setLevelRecursively(Logger.this, Level.parse(levelProperty));
424b501914f9448cc0c5852922d217ae11a29c63467Jesse Wilson            } catch (IllegalArgumentException invalidLevel) {
425b501914f9448cc0c5852922d217ae11a29c63467Jesse Wilson                invalidLevel.printStackTrace();
426d9b5d1b899226673e746ad4d9f517244d968e5baJesse Wilson            }
427b501914f9448cc0c5852922d217ae11a29c63467Jesse Wilson        }
428d9b5d1b899226673e746ad4d9f517244d968e5baJesse Wilson
42980a7fbab52b96c9fd47c72f8987d1babe2cd001dElliott Hughes        String handlersPropertyName = name.isEmpty() ? "handlers" : name + ".handlers";
430b501914f9448cc0c5852922d217ae11a29c63467Jesse Wilson        String handlersProperty = manager.getProperty(handlersPropertyName);
431b501914f9448cc0c5852922d217ae11a29c63467Jesse Wilson        if (handlersProperty != null) {
432b501914f9448cc0c5852922d217ae11a29c63467Jesse Wilson            for (String handlerName : handlersProperty.split(",|\\s")) {
43380a7fbab52b96c9fd47c72f8987d1babe2cd001dElliott Hughes                if (handlerName.isEmpty()) {
434d9b5d1b899226673e746ad4d9f517244d968e5baJesse Wilson                    continue;
435d9b5d1b899226673e746ad4d9f517244d968e5baJesse Wilson                }
436d9b5d1b899226673e746ad4d9f517244d968e5baJesse Wilson
437b501914f9448cc0c5852922d217ae11a29c63467Jesse Wilson                final Handler handler;
438b501914f9448cc0c5852922d217ae11a29c63467Jesse Wilson                try {
439b501914f9448cc0c5852922d217ae11a29c63467Jesse Wilson                    handler = (Handler) LogManager.getInstanceByClass(handlerName);
440b501914f9448cc0c5852922d217ae11a29c63467Jesse Wilson                } catch (Exception invalidHandlerName) {
441b501914f9448cc0c5852922d217ae11a29c63467Jesse Wilson                    invalidHandlerName.printStackTrace();
442b501914f9448cc0c5852922d217ae11a29c63467Jesse Wilson                    continue;
443b501914f9448cc0c5852922d217ae11a29c63467Jesse Wilson                }
444b501914f9448cc0c5852922d217ae11a29c63467Jesse Wilson
445d9b5d1b899226673e746ad4d9f517244d968e5baJesse Wilson                try {
446d9b5d1b899226673e746ad4d9f517244d968e5baJesse Wilson                    String level = manager.getProperty(handlerName + ".level");
447d9b5d1b899226673e746ad4d9f517244d968e5baJesse Wilson                    if (level != null) {
4489a0fbe99031759393563ee69ac4640f66f182686Jesse Wilson                        handler.setLevel(Level.parse(level));
449adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    }
450b501914f9448cc0c5852922d217ae11a29c63467Jesse Wilson                } catch (Exception invalidLevel) {
451b501914f9448cc0c5852922d217ae11a29c63467Jesse Wilson                    invalidLevel.printStackTrace();
452adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                }
453b501914f9448cc0c5852922d217ae11a29c63467Jesse Wilson
454b501914f9448cc0c5852922d217ae11a29c63467Jesse Wilson                handlers.add(handler);
455adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
456adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
457c99250a4d619670f2a9410df121eff04fdc9e87cJesse Wilson
458fb0ec0e650bf8be35acb0d47da0311a7c446aa33Elliott Hughes        updateDalvikLogHandler();
459adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
460adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
461adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
462adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Gets all the handlers associated with this logger.
4639a0fbe99031759393563ee69ac4640f66f182686Jesse Wilson     *
464adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return an array of all the handlers associated with this logger.
465adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
466adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public Handler[] getHandlers() {
467b501914f9448cc0c5852922d217ae11a29c63467Jesse Wilson        return handlers.toArray(EMPTY_HANDLERS_ARRAY);
468adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
469adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
470adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
471adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Removes a handler from this logger. If the specified handler does not
472adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * exist then this method has no effect.
4739a0fbe99031759393563ee69ac4640f66f182686Jesse Wilson     *
474adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param handler
475adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the handler to be removed.
476adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
477adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void removeHandler(Handler handler) {
478adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        // Anonymous loggers can always remove handlers
479adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (this.isNamed) {
480adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            LogManager.getLogManager().checkAccess();
481adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
482d9b5d1b899226673e746ad4d9f517244d968e5baJesse Wilson        if (handler == null) {
483adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return;
484adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
485b501914f9448cc0c5852922d217ae11a29c63467Jesse Wilson        this.handlers.remove(handler);
486fb0ec0e650bf8be35acb0d47da0311a7c446aa33Elliott Hughes        updateDalvikLogHandler();
487adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
488adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
489adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
490adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Gets the filter used by this logger.
4919a0fbe99031759393563ee69ac4640f66f182686Jesse Wilson     *
492adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the filter used by this logger, may be {@code null}.
493adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
494adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public Filter getFilter() {
495adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return this.filter;
496adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
497adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
498adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
499adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Sets the filter used by this logger.
5009a0fbe99031759393563ee69ac4640f66f182686Jesse Wilson     *
501adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param newFilter
502adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the filter to set, may be {@code null}.
503adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
504adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void setFilter(Filter newFilter) {
505adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        // Anonymous loggers can always set the filter
506adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (this.isNamed) {
507adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            LogManager.getLogManager().checkAccess();
508adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
509adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        filter = newFilter;
510adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
511adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
512adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
513adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Gets the logging level of this logger. A {@code null} level indicates
514adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * that this logger inherits its parent's level.
5159a0fbe99031759393563ee69ac4640f66f182686Jesse Wilson     *
516adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the logging level of this logger.
517adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
518adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public Level getLevel() {
519adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return levelObjVal;
520adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
521adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
522adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
523adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Sets the logging level for this logger. A {@code null} level indicates
524adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * that this logger will inherit its parent's level.
5259a0fbe99031759393563ee69ac4640f66f182686Jesse Wilson     *
526adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param newLevel
527adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the logging level to set.
528adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
529adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void setLevel(Level newLevel) {
530adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        // Anonymous loggers can always set the level
531d9b5d1b899226673e746ad4d9f517244d968e5baJesse Wilson        LogManager logManager = LogManager.getLogManager();
532adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (this.isNamed) {
533d9b5d1b899226673e746ad4d9f517244d968e5baJesse Wilson            logManager.checkAccess();
534adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
535d9b5d1b899226673e746ad4d9f517244d968e5baJesse Wilson        logManager.setLevelRecursively(this, newLevel);
536adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
537adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
538adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
539adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Gets the flag which indicates whether to use the handlers of this
540adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * logger's parent to publish incoming log records, potentially recursively
541adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * up the namespace.
5429a0fbe99031759393563ee69ac4640f66f182686Jesse Wilson     *
543adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return {@code true} if set to use parent's handlers, {@code false}
544adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         otherwise.
545adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
546adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public boolean getUseParentHandlers() {
547adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return this.notifyParentHandlers;
548adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
549adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
550adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
551adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Sets the flag which indicates whether to use the handlers of this
552adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * logger's parent, potentially recursively up the namespace.
5539a0fbe99031759393563ee69ac4640f66f182686Jesse Wilson     *
554adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param notifyParentHandlers
555adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the new flag indicating whether to use the parent's handlers.
556adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
557adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void setUseParentHandlers(boolean notifyParentHandlers) {
558adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        // Anonymous loggers can always set the useParentHandlers flag
559adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (this.isNamed) {
560adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            LogManager.getLogManager().checkAccess();
561adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
562adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        this.notifyParentHandlers = notifyParentHandlers;
563fb0ec0e650bf8be35acb0d47da0311a7c446aa33Elliott Hughes        updateDalvikLogHandler();
564adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
565adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
566adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
567adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Gets the nearest parent of this logger in the namespace, a {@code null}
568adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * value will be returned if called on the root logger.
5699a0fbe99031759393563ee69ac4640f66f182686Jesse Wilson     *
570adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the parent of this logger in the namespace.
571adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
572adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public Logger getParent() {
573adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return parent;
574adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
575adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
576adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
577adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Sets the parent of this logger in the namespace. This method should be
578adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * used by the {@code LogManager} object only.
5799a0fbe99031759393563ee69ac4640f66f182686Jesse Wilson     *
580adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param parent
581adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the parent logger to set.
582adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
583adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void setParent(Logger parent) {
584d9b5d1b899226673e746ad4d9f517244d968e5baJesse Wilson        if (parent == null) {
5858454d3c5b9778ae359d11cd98ed81c589e951d0aElliott Hughes            throw new NullPointerException("parent == null");
586adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
587adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
588d9b5d1b899226673e746ad4d9f517244d968e5baJesse Wilson        // even anonymous loggers are checked
589d9b5d1b899226673e746ad4d9f517244d968e5baJesse Wilson        LogManager logManager = LogManager.getLogManager();
590d9b5d1b899226673e746ad4d9f517244d968e5baJesse Wilson        logManager.checkAccess();
591d9b5d1b899226673e746ad4d9f517244d968e5baJesse Wilson        logManager.setParent(this, parent);
592adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
593adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
594adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
595adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Gets the name of this logger, {@code null} for anonymous loggers.
5969a0fbe99031759393563ee69ac4640f66f182686Jesse Wilson     *
597adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the name of this logger.
598adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
599adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public String getName() {
600adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return this.name;
601adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
602adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
603adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
604adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Gets the loaded resource bundle used by this logger to localize logging
605adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * messages. If the value is {@code null}, the parent's resource bundle will be
606adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * inherited.
6079a0fbe99031759393563ee69ac4640f66f182686Jesse Wilson     *
608adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the loaded resource bundle used by this logger.
609adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
610adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public ResourceBundle getResourceBundle() {
611b501914f9448cc0c5852922d217ae11a29c63467Jesse Wilson        return this.resourceBundle;
612adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
613adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
614adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
615adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Gets the name of the loaded resource bundle used by this logger to
616adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * localize logging messages. If the value is {@code null}, the parent's resource
617adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * bundle name will be inherited.
6189a0fbe99031759393563ee69ac4640f66f182686Jesse Wilson     *
619adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the name of the loaded resource bundle used by this logger.
620adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
621adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public String getResourceBundleName() {
622b501914f9448cc0c5852922d217ae11a29c63467Jesse Wilson        return this.resourceBundleName;
623adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
624adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
625adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
626adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * This method is for compatibility. Tests written to the reference
627adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * implementation API imply that the isLoggable() method is not called
628adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * directly. This behavior is important because subclass may override
629adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * isLoggable() method, so that affect the result of log methods.
630adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
631adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private boolean internalIsLoggable(Level l) {
632adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        int effectiveLevel = levelIntVal;
633adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (effectiveLevel == Level.OFF.intValue()) {
634adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            // always return false if the effective level is off
635adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return false;
636adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
637adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return l.intValue() >= effectiveLevel;
638adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
639adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
640adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
641adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Determines whether this logger will actually log messages of the
642adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * specified level. The effective level used to do the determination may be
643adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * inherited from its parent. The default level is {@code Level.INFO}.
6449a0fbe99031759393563ee69ac4640f66f182686Jesse Wilson     *
645adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param l
646adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the level to check.
647adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return {@code true} if this logger will actually log this level,
648adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         otherwise {@code false}.
649adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
650adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public boolean isLoggable(Level l) {
651adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return internalIsLoggable(l);
652adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
653adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
654b501914f9448cc0c5852922d217ae11a29c63467Jesse Wilson    /**
655adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Sets the resource bundle and its name for a supplied LogRecord object.
656adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * This method first tries to use this logger's resource bundle if any,
657adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * otherwise try to inherit from this logger's parent, recursively up the
658b501914f9448cc0c5852922d217ae11a29c63467Jesse Wilson     * namespace.
659adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
660adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private void setResourceBundle(LogRecord record) {
661b501914f9448cc0c5852922d217ae11a29c63467Jesse Wilson        for (Logger p = this; p != null; p = p.parent) {
662b501914f9448cc0c5852922d217ae11a29c63467Jesse Wilson            String resourceBundleName = p.resourceBundleName;
663b501914f9448cc0c5852922d217ae11a29c63467Jesse Wilson            if (resourceBundleName != null) {
664b501914f9448cc0c5852922d217ae11a29c63467Jesse Wilson                record.setResourceBundle(p.resourceBundle);
665b501914f9448cc0c5852922d217ae11a29c63467Jesse Wilson                record.setResourceBundleName(resourceBundleName);
666b501914f9448cc0c5852922d217ae11a29c63467Jesse Wilson                return;
667adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
668adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
669adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
670adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
671adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
672adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Logs a message indicating that a method has been entered. A log record
673adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * with log level {@code Level.FINER}, log message "ENTRY", the specified
674adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * source class name and source method name is submitted for logging.
6759a0fbe99031759393563ee69ac4640f66f182686Jesse Wilson     *
676adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param sourceClass
677adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the calling class name.
678adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param sourceMethod
679adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the method name.
680adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
681adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void entering(String sourceClass, String sourceMethod) {
682d9b5d1b899226673e746ad4d9f517244d968e5baJesse Wilson        if (!internalIsLoggable(Level.FINER)) {
683d9b5d1b899226673e746ad4d9f517244d968e5baJesse Wilson            return;
684adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
685d9b5d1b899226673e746ad4d9f517244d968e5baJesse Wilson
686f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes        LogRecord record = new LogRecord(Level.FINER, "ENTRY");
687d9b5d1b899226673e746ad4d9f517244d968e5baJesse Wilson        record.setLoggerName(this.name);
688d9b5d1b899226673e746ad4d9f517244d968e5baJesse Wilson        record.setSourceClassName(sourceClass);
689d9b5d1b899226673e746ad4d9f517244d968e5baJesse Wilson        record.setSourceMethodName(sourceMethod);
690d9b5d1b899226673e746ad4d9f517244d968e5baJesse Wilson        setResourceBundle(record);
691d9b5d1b899226673e746ad4d9f517244d968e5baJesse Wilson        log(record);
692adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
693adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
694adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
695adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Logs a message indicating that a method has been entered. A log record
696adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * with log level {@code Level.FINER}, log message "ENTRY", the specified
697adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * source class name, source method name and one parameter is submitted for
698adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * logging.
6999a0fbe99031759393563ee69ac4640f66f182686Jesse Wilson     *
700adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param sourceClass
701adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the source class name.
702adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param sourceMethod
703adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the source method name.
704adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param param
705adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the parameter for the method call.
706adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
707adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void entering(String sourceClass, String sourceMethod, Object param) {
708d9b5d1b899226673e746ad4d9f517244d968e5baJesse Wilson        if (!internalIsLoggable(Level.FINER)) {
709d9b5d1b899226673e746ad4d9f517244d968e5baJesse Wilson            return;
710adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
711d9b5d1b899226673e746ad4d9f517244d968e5baJesse Wilson
712f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes        LogRecord record = new LogRecord(Level.FINER, "ENTRY" + " {0}");
713d9b5d1b899226673e746ad4d9f517244d968e5baJesse Wilson        record.setLoggerName(this.name);
714d9b5d1b899226673e746ad4d9f517244d968e5baJesse Wilson        record.setSourceClassName(sourceClass);
715d9b5d1b899226673e746ad4d9f517244d968e5baJesse Wilson        record.setSourceMethodName(sourceMethod);
716d9b5d1b899226673e746ad4d9f517244d968e5baJesse Wilson        record.setParameters(new Object[] { param });
717d9b5d1b899226673e746ad4d9f517244d968e5baJesse Wilson        setResourceBundle(record);
718d9b5d1b899226673e746ad4d9f517244d968e5baJesse Wilson        log(record);
719adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
720adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
721adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
722adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Logs a message indicating that a method has been entered. A log record
723adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * with log level {@code Level.FINER}, log message "ENTRY", the specified
724adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * source class name, source method name and array of parameters is
725adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * submitted for logging.
7269a0fbe99031759393563ee69ac4640f66f182686Jesse Wilson     *
727adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param sourceClass
728adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the source class name.
729adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param sourceMethod
730adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the source method name.
731adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param params
732adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            an array of parameters for the method call.
733adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
734adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void entering(String sourceClass, String sourceMethod,
735adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            Object[] params) {
736d9b5d1b899226673e746ad4d9f517244d968e5baJesse Wilson        if (!internalIsLoggable(Level.FINER)) {
737d9b5d1b899226673e746ad4d9f517244d968e5baJesse Wilson            return;
738d9b5d1b899226673e746ad4d9f517244d968e5baJesse Wilson        }
739d9b5d1b899226673e746ad4d9f517244d968e5baJesse Wilson
740d9b5d1b899226673e746ad4d9f517244d968e5baJesse Wilson        String msg = "ENTRY";
741d9b5d1b899226673e746ad4d9f517244d968e5baJesse Wilson        if (params != null) {
742d9b5d1b899226673e746ad4d9f517244d968e5baJesse Wilson            StringBuilder msgBuffer = new StringBuilder("ENTRY");
743d9b5d1b899226673e746ad4d9f517244d968e5baJesse Wilson            for (int i = 0; i < params.length; i++) {
744d9b5d1b899226673e746ad4d9f517244d968e5baJesse Wilson                msgBuffer.append(" {").append(i).append("}");
745adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
746d9b5d1b899226673e746ad4d9f517244d968e5baJesse Wilson            msg = msgBuffer.toString();
747adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
748d9b5d1b899226673e746ad4d9f517244d968e5baJesse Wilson        LogRecord record = new LogRecord(Level.FINER, msg);
749d9b5d1b899226673e746ad4d9f517244d968e5baJesse Wilson        record.setLoggerName(this.name);
750d9b5d1b899226673e746ad4d9f517244d968e5baJesse Wilson        record.setSourceClassName(sourceClass);
751d9b5d1b899226673e746ad4d9f517244d968e5baJesse Wilson        record.setSourceMethodName(sourceMethod);
752d9b5d1b899226673e746ad4d9f517244d968e5baJesse Wilson        record.setParameters(params);
753d9b5d1b899226673e746ad4d9f517244d968e5baJesse Wilson        setResourceBundle(record);
754d9b5d1b899226673e746ad4d9f517244d968e5baJesse Wilson        log(record);
755adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
756adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
757adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
758adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Logs a message indicating that a method is exited. A log record with log
759adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * level {@code Level.FINER}, log message "RETURN", the specified source
760adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * class name and source method name is submitted for logging.
7619a0fbe99031759393563ee69ac4640f66f182686Jesse Wilson     *
762adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param sourceClass
763adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the calling class name.
764adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param sourceMethod
765adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the method name.
766adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
767adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void exiting(String sourceClass, String sourceMethod) {
768d9b5d1b899226673e746ad4d9f517244d968e5baJesse Wilson        if (!internalIsLoggable(Level.FINER)) {
769d9b5d1b899226673e746ad4d9f517244d968e5baJesse Wilson            return;
770adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
771d9b5d1b899226673e746ad4d9f517244d968e5baJesse Wilson
772f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes        LogRecord record = new LogRecord(Level.FINER, "RETURN");
773d9b5d1b899226673e746ad4d9f517244d968e5baJesse Wilson        record.setLoggerName(this.name);
774d9b5d1b899226673e746ad4d9f517244d968e5baJesse Wilson        record.setSourceClassName(sourceClass);
775d9b5d1b899226673e746ad4d9f517244d968e5baJesse Wilson        record.setSourceMethodName(sourceMethod);
776d9b5d1b899226673e746ad4d9f517244d968e5baJesse Wilson        setResourceBundle(record);
777d9b5d1b899226673e746ad4d9f517244d968e5baJesse Wilson        log(record);
778adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
779adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
780adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
781adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Logs a message indicating that a method is exited. A log record with log
782adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * level {@code Level.FINER}, log message "RETURN", the specified source
783adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * class name, source method name and return value is submitted for logging.
7849a0fbe99031759393563ee69ac4640f66f182686Jesse Wilson     *
785adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param sourceClass
786adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the source class name.
787adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param sourceMethod
788adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the source method name.
789adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param result
790adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the return value of the method call.
791adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
792adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void exiting(String sourceClass, String sourceMethod, Object result) {
793d9b5d1b899226673e746ad4d9f517244d968e5baJesse Wilson        if (!internalIsLoggable(Level.FINER)) {
794d9b5d1b899226673e746ad4d9f517244d968e5baJesse Wilson            return;
795adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
796d9b5d1b899226673e746ad4d9f517244d968e5baJesse Wilson
797f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes        LogRecord record = new LogRecord(Level.FINER, "RETURN" + " {0}");
798d9b5d1b899226673e746ad4d9f517244d968e5baJesse Wilson        record.setLoggerName(this.name);
799d9b5d1b899226673e746ad4d9f517244d968e5baJesse Wilson        record.setSourceClassName(sourceClass);
800d9b5d1b899226673e746ad4d9f517244d968e5baJesse Wilson        record.setSourceMethodName(sourceMethod);
801d9b5d1b899226673e746ad4d9f517244d968e5baJesse Wilson        record.setParameters(new Object[] { result });
802d9b5d1b899226673e746ad4d9f517244d968e5baJesse Wilson        setResourceBundle(record);
803d9b5d1b899226673e746ad4d9f517244d968e5baJesse Wilson        log(record);
804adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
805adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
806adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
807adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Logs a message indicating that an exception is thrown. A log record with
808adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * log level {@code Level.FINER}, log message "THROW", the specified source
809adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * class name, source method name and the {@code Throwable} object is
810adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * submitted for logging.
8119a0fbe99031759393563ee69ac4640f66f182686Jesse Wilson     *
812adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param sourceClass
813adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the source class name.
814adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param sourceMethod
815adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the source method name.
816adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param thrown
817adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the {@code Throwable} object.
818adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
819adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void throwing(String sourceClass, String sourceMethod,
820adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            Throwable thrown) {
821d9b5d1b899226673e746ad4d9f517244d968e5baJesse Wilson        if (!internalIsLoggable(Level.FINER)) {
822d9b5d1b899226673e746ad4d9f517244d968e5baJesse Wilson            return;
823adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
824d9b5d1b899226673e746ad4d9f517244d968e5baJesse Wilson
825f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes        LogRecord record = new LogRecord(Level.FINER, "THROW");
826d9b5d1b899226673e746ad4d9f517244d968e5baJesse Wilson        record.setLoggerName(this.name);
827d9b5d1b899226673e746ad4d9f517244d968e5baJesse Wilson        record.setSourceClassName(sourceClass);
828d9b5d1b899226673e746ad4d9f517244d968e5baJesse Wilson        record.setSourceMethodName(sourceMethod);
829d9b5d1b899226673e746ad4d9f517244d968e5baJesse Wilson        record.setThrown(thrown);
830d9b5d1b899226673e746ad4d9f517244d968e5baJesse Wilson        setResourceBundle(record);
831d9b5d1b899226673e746ad4d9f517244d968e5baJesse Wilson        log(record);
832adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
833adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
834adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
835adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Logs a message of level {@code Level.SEVERE}; the message is transmitted
836adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * to all subscribed handlers.
8379a0fbe99031759393563ee69ac4640f66f182686Jesse Wilson     *
838adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param msg
839adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the message to log.
840adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
841adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void severe(String msg) {
842b501914f9448cc0c5852922d217ae11a29c63467Jesse Wilson        log(Level.SEVERE, msg);
843adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
844adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
845adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
846adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Logs a message of level {@code Level.WARNING}; the message is
847adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * transmitted to all subscribed handlers.
8489a0fbe99031759393563ee69ac4640f66f182686Jesse Wilson     *
849adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param msg
850adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the message to log.
851adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
852adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void warning(String msg) {
853b501914f9448cc0c5852922d217ae11a29c63467Jesse Wilson        log(Level.WARNING, msg);
854adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
855adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
856adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
857adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Logs a message of level {@code Level.INFO}; the message is transmitted
858adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * to all subscribed handlers.
8599a0fbe99031759393563ee69ac4640f66f182686Jesse Wilson     *
860adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param msg
861adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the message to log.
862adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
863adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void info(String msg) {
864b501914f9448cc0c5852922d217ae11a29c63467Jesse Wilson        log(Level.INFO, msg);
865adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
866adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
867adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
868adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Logs a message of level {@code Level.CONFIG}; the message is transmitted
869adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * to all subscribed handlers.
8709a0fbe99031759393563ee69ac4640f66f182686Jesse Wilson     *
871adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param msg
872adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the message to log.
873adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
874adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void config(String msg) {
875b501914f9448cc0c5852922d217ae11a29c63467Jesse Wilson        log(Level.CONFIG, msg);
876adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
877adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
878adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
879adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Logs a message of level {@code Level.FINE}; the message is transmitted
880adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * to all subscribed handlers.
8819a0fbe99031759393563ee69ac4640f66f182686Jesse Wilson     *
882adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param msg
883adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the message to log.
884adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
885adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void fine(String msg) {
886b501914f9448cc0c5852922d217ae11a29c63467Jesse Wilson        log(Level.FINE, msg);
887adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
888adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
889adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
890adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Logs a message of level {@code Level.FINER}; the message is transmitted
891adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * to all subscribed handlers.
8929a0fbe99031759393563ee69ac4640f66f182686Jesse Wilson     *
893adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param msg
894adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the message to log.
895adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
896adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void finer(String msg) {
897b501914f9448cc0c5852922d217ae11a29c63467Jesse Wilson        log(Level.FINER, msg);
898adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
899adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
900adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
901adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Logs a message of level {@code Level.FINEST}; the message is transmitted
902adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * to all subscribed handlers.
9039a0fbe99031759393563ee69ac4640f66f182686Jesse Wilson     *
904adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param msg
905adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the message to log.
906adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
907adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void finest(String msg) {
908b501914f9448cc0c5852922d217ae11a29c63467Jesse Wilson        log(Level.FINEST, msg);
909adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
910adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
911adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
912adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Logs a message of the specified level. The message is transmitted to all
913adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * subscribed handlers.
9149a0fbe99031759393563ee69ac4640f66f182686Jesse Wilson     *
915adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param logLevel
916adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the level of the specified message.
917adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param msg
918adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the message to log.
919adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
920adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void log(Level logLevel, String msg) {
921d9b5d1b899226673e746ad4d9f517244d968e5baJesse Wilson        if (!internalIsLoggable(logLevel)) {
922d9b5d1b899226673e746ad4d9f517244d968e5baJesse Wilson            return;
923adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
924c99250a4d619670f2a9410df121eff04fdc9e87cJesse Wilson        dalvikLogHandler.publish(this, androidTag, logLevel, msg);
925adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
926adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
927adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
928adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Logs a message of the specified level with the supplied parameter. The
929adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * message is then transmitted to all subscribed handlers.
9309a0fbe99031759393563ee69ac4640f66f182686Jesse Wilson     *
931adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param logLevel
932adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the level of the given message.
933adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param msg
934adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the message to log.
935adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param param
936adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the parameter associated with the event that is logged.
937adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
938adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void log(Level logLevel, String msg, Object param) {
939d9b5d1b899226673e746ad4d9f517244d968e5baJesse Wilson        if (!internalIsLoggable(logLevel)) {
940d9b5d1b899226673e746ad4d9f517244d968e5baJesse Wilson            return;
941adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
942d9b5d1b899226673e746ad4d9f517244d968e5baJesse Wilson
943d9b5d1b899226673e746ad4d9f517244d968e5baJesse Wilson        LogRecord record = new LogRecord(logLevel, msg);
944d9b5d1b899226673e746ad4d9f517244d968e5baJesse Wilson        record.setLoggerName(this.name);
945d9b5d1b899226673e746ad4d9f517244d968e5baJesse Wilson        record.setParameters(new Object[] { param });
946d9b5d1b899226673e746ad4d9f517244d968e5baJesse Wilson        setResourceBundle(record);
947d9b5d1b899226673e746ad4d9f517244d968e5baJesse Wilson        log(record);
948adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
949adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
950adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
951adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Logs a message of the specified level with the supplied parameter array.
952adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * The message is then transmitted to all subscribed handlers.
9539a0fbe99031759393563ee69ac4640f66f182686Jesse Wilson     *
954adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param logLevel
955adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the level of the given message
956adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param msg
957adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the message to log.
958adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param params
959adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the parameter array associated with the event that is logged.
960adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
961adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void log(Level logLevel, String msg, Object[] params) {
962d9b5d1b899226673e746ad4d9f517244d968e5baJesse Wilson        if (!internalIsLoggable(logLevel)) {
963d9b5d1b899226673e746ad4d9f517244d968e5baJesse Wilson            return;
964adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
965d9b5d1b899226673e746ad4d9f517244d968e5baJesse Wilson
966d9b5d1b899226673e746ad4d9f517244d968e5baJesse Wilson        LogRecord record = new LogRecord(logLevel, msg);
967d9b5d1b899226673e746ad4d9f517244d968e5baJesse Wilson        record.setLoggerName(this.name);
968d9b5d1b899226673e746ad4d9f517244d968e5baJesse Wilson        record.setParameters(params);
969d9b5d1b899226673e746ad4d9f517244d968e5baJesse Wilson        setResourceBundle(record);
970d9b5d1b899226673e746ad4d9f517244d968e5baJesse Wilson        log(record);
971adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
972adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
973adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
974adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Logs a message of the specified level with the supplied {@code Throwable}
975adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * object. The message is then transmitted to all subscribed handlers.
9769a0fbe99031759393563ee69ac4640f66f182686Jesse Wilson     *
977adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param logLevel
978adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the level of the given message.
979adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param msg
980adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the message to log.
981adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param thrown
982adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the {@code Throwable} object associated with the event that is
983adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            logged.
984adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
985adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void log(Level logLevel, String msg, Throwable thrown) {
986d9b5d1b899226673e746ad4d9f517244d968e5baJesse Wilson        if (!internalIsLoggable(logLevel)) {
987d9b5d1b899226673e746ad4d9f517244d968e5baJesse Wilson            return;
988adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
989d9b5d1b899226673e746ad4d9f517244d968e5baJesse Wilson
990d9b5d1b899226673e746ad4d9f517244d968e5baJesse Wilson        LogRecord record = new LogRecord(logLevel, msg);
991d9b5d1b899226673e746ad4d9f517244d968e5baJesse Wilson        record.setLoggerName(this.name);
992d9b5d1b899226673e746ad4d9f517244d968e5baJesse Wilson        record.setThrown(thrown);
993d9b5d1b899226673e746ad4d9f517244d968e5baJesse Wilson        setResourceBundle(record);
994d9b5d1b899226673e746ad4d9f517244d968e5baJesse Wilson        log(record);
995adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
996adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
997adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
998adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Logs a given log record. Only records with a logging level that is equal
999adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * or greater than this logger's level will be submitted to this logger's
1000adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * handlers for logging. If {@code getUseParentHandlers()} returns {@code
1001adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * true}, the log record will also be submitted to the handlers of this
1002adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * logger's parent, potentially recursively up the namespace.
1003adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * <p>
1004adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Since all other log methods call this method to actually perform the
1005adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * logging action, subclasses of this class can override this method to
1006adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * catch all logging activities.
1007adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * </p>
10089a0fbe99031759393563ee69ac4640f66f182686Jesse Wilson     *
1009adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param record
1010adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the log record to be logged.
1011adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
1012adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void log(LogRecord record) {
1013d9b5d1b899226673e746ad4d9f517244d968e5baJesse Wilson        if (!internalIsLoggable(record.getLevel())) {
1014d9b5d1b899226673e746ad4d9f517244d968e5baJesse Wilson            return;
1015d9b5d1b899226673e746ad4d9f517244d968e5baJesse Wilson        }
1016d9b5d1b899226673e746ad4d9f517244d968e5baJesse Wilson
1017d9b5d1b899226673e746ad4d9f517244d968e5baJesse Wilson        // apply the filter if any
1018d9b5d1b899226673e746ad4d9f517244d968e5baJesse Wilson        Filter f = filter;
1019d9b5d1b899226673e746ad4d9f517244d968e5baJesse Wilson        if (f != null && !f.isLoggable(record)) {
1020d9b5d1b899226673e746ad4d9f517244d968e5baJesse Wilson            return;
1021d9b5d1b899226673e746ad4d9f517244d968e5baJesse Wilson        }
1022b501914f9448cc0c5852922d217ae11a29c63467Jesse Wilson
1023d9b5d1b899226673e746ad4d9f517244d968e5baJesse Wilson        /*
1024d9b5d1b899226673e746ad4d9f517244d968e5baJesse Wilson         * call the handlers of this logger, throw any exception that occurs
1025d9b5d1b899226673e746ad4d9f517244d968e5baJesse Wilson         */
1026d9b5d1b899226673e746ad4d9f517244d968e5baJesse Wilson        Handler[] allHandlers = getHandlers();
1027d9b5d1b899226673e746ad4d9f517244d968e5baJesse Wilson        for (Handler element : allHandlers) {
1028d9b5d1b899226673e746ad4d9f517244d968e5baJesse Wilson            element.publish(record);
1029d9b5d1b899226673e746ad4d9f517244d968e5baJesse Wilson        }
1030d9b5d1b899226673e746ad4d9f517244d968e5baJesse Wilson        // call the parent's handlers if set useParentHandlers
1031d9b5d1b899226673e746ad4d9f517244d968e5baJesse Wilson        Logger temp = this;
1032d9b5d1b899226673e746ad4d9f517244d968e5baJesse Wilson        Logger theParent = temp.parent;
1033d9b5d1b899226673e746ad4d9f517244d968e5baJesse Wilson        while (theParent != null && temp.getUseParentHandlers()) {
1034d9b5d1b899226673e746ad4d9f517244d968e5baJesse Wilson            Handler[] ha = theParent.getHandlers();
1035d9b5d1b899226673e746ad4d9f517244d968e5baJesse Wilson            for (Handler element : ha) {
1036adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                element.publish(record);
1037adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
1038d9b5d1b899226673e746ad4d9f517244d968e5baJesse Wilson            temp = theParent;
1039d9b5d1b899226673e746ad4d9f517244d968e5baJesse Wilson            theParent = temp.parent;
1040adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
1041adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
1042adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
1043adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
1044adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Logs a message of the given level with the specified source class name
1045adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * and source method name.
10469a0fbe99031759393563ee69ac4640f66f182686Jesse Wilson     *
1047adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param logLevel
1048adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the level of the given message.
1049adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param sourceClass
1050adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the source class name.
1051adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param sourceMethod
1052adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the source method name.
1053adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param msg
1054adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the message to be logged.
1055adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
1056adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void logp(Level logLevel, String sourceClass, String sourceMethod,
1057adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            String msg) {
1058d9b5d1b899226673e746ad4d9f517244d968e5baJesse Wilson        if (!internalIsLoggable(logLevel)) {
1059d9b5d1b899226673e746ad4d9f517244d968e5baJesse Wilson            return;
1060adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
1061d9b5d1b899226673e746ad4d9f517244d968e5baJesse Wilson
1062d9b5d1b899226673e746ad4d9f517244d968e5baJesse Wilson        LogRecord record = new LogRecord(logLevel, msg);
1063d9b5d1b899226673e746ad4d9f517244d968e5baJesse Wilson        record.setLoggerName(this.name);
1064d9b5d1b899226673e746ad4d9f517244d968e5baJesse Wilson        record.setSourceClassName(sourceClass);
1065d9b5d1b899226673e746ad4d9f517244d968e5baJesse Wilson        record.setSourceMethodName(sourceMethod);
1066d9b5d1b899226673e746ad4d9f517244d968e5baJesse Wilson        setResourceBundle(record);
1067d9b5d1b899226673e746ad4d9f517244d968e5baJesse Wilson        log(record);
1068adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
1069adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
1070adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
1071adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Logs a message of the given level with the specified source class name,
1072adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * source method name and parameter.
10739a0fbe99031759393563ee69ac4640f66f182686Jesse Wilson     *
1074adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param logLevel
1075adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the level of the given message
1076adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param sourceClass
1077adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the source class name
1078adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param sourceMethod
1079adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the source method name
1080adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param msg
1081adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the message to be logged
1082adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param param
1083adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the parameter associated with the event that is logged.
1084adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
1085adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void logp(Level logLevel, String sourceClass, String sourceMethod,
1086adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            String msg, Object param) {
1087d9b5d1b899226673e746ad4d9f517244d968e5baJesse Wilson        if (!internalIsLoggable(logLevel)) {
1088d9b5d1b899226673e746ad4d9f517244d968e5baJesse Wilson            return;
1089adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
1090d9b5d1b899226673e746ad4d9f517244d968e5baJesse Wilson
1091d9b5d1b899226673e746ad4d9f517244d968e5baJesse Wilson        LogRecord record = new LogRecord(logLevel, msg);
1092d9b5d1b899226673e746ad4d9f517244d968e5baJesse Wilson        record.setLoggerName(this.name);
1093d9b5d1b899226673e746ad4d9f517244d968e5baJesse Wilson        record.setSourceClassName(sourceClass);
1094d9b5d1b899226673e746ad4d9f517244d968e5baJesse Wilson        record.setSourceMethodName(sourceMethod);
1095d9b5d1b899226673e746ad4d9f517244d968e5baJesse Wilson        record.setParameters(new Object[] { param });
1096d9b5d1b899226673e746ad4d9f517244d968e5baJesse Wilson        setResourceBundle(record);
1097d9b5d1b899226673e746ad4d9f517244d968e5baJesse Wilson        log(record);
1098adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
1099adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
1100adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
1101adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Logs a message of the given level with the specified source class name,
1102adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * source method name and parameter array.
11039a0fbe99031759393563ee69ac4640f66f182686Jesse Wilson     *
1104adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param logLevel
1105adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the level of the given message.
1106adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param sourceClass
1107adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the source class name.
1108adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param sourceMethod
1109adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the source method name.
1110adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param msg
1111adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the message to be logged.
1112adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param params
1113adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the parameter array associated with the event that is logged.
1114adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
1115adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void logp(Level logLevel, String sourceClass, String sourceMethod,
1116adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            String msg, Object[] params) {
1117d9b5d1b899226673e746ad4d9f517244d968e5baJesse Wilson        if (!internalIsLoggable(logLevel)) {
1118d9b5d1b899226673e746ad4d9f517244d968e5baJesse Wilson            return;
1119adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
1120d9b5d1b899226673e746ad4d9f517244d968e5baJesse Wilson
1121d9b5d1b899226673e746ad4d9f517244d968e5baJesse Wilson        LogRecord record = new LogRecord(logLevel, msg);
1122d9b5d1b899226673e746ad4d9f517244d968e5baJesse Wilson        record.setLoggerName(this.name);
1123d9b5d1b899226673e746ad4d9f517244d968e5baJesse Wilson        record.setSourceClassName(sourceClass);
1124d9b5d1b899226673e746ad4d9f517244d968e5baJesse Wilson        record.setSourceMethodName(sourceMethod);
1125d9b5d1b899226673e746ad4d9f517244d968e5baJesse Wilson        record.setParameters(params);
1126d9b5d1b899226673e746ad4d9f517244d968e5baJesse Wilson        setResourceBundle(record);
1127d9b5d1b899226673e746ad4d9f517244d968e5baJesse Wilson        log(record);
1128adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
1129adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
1130adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
1131adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Logs a message of the given level with the specified source class name,
1132adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * source method name and {@code Throwable} object.
11339a0fbe99031759393563ee69ac4640f66f182686Jesse Wilson     *
1134adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param logLevel
1135adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the level of the given message.
1136adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param sourceClass
1137adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the source class name.
1138adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param sourceMethod
1139adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the source method name.
1140adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param msg
1141adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the message to be logged.
1142adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param thrown
1143adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the {@code Throwable} object.
1144adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
1145adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void logp(Level logLevel, String sourceClass, String sourceMethod,
1146adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            String msg, Throwable thrown) {
1147d9b5d1b899226673e746ad4d9f517244d968e5baJesse Wilson        if (!internalIsLoggable(logLevel)) {
1148d9b5d1b899226673e746ad4d9f517244d968e5baJesse Wilson            return;
1149adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
1150d9b5d1b899226673e746ad4d9f517244d968e5baJesse Wilson
1151d9b5d1b899226673e746ad4d9f517244d968e5baJesse Wilson        LogRecord record = new LogRecord(logLevel, msg);
1152d9b5d1b899226673e746ad4d9f517244d968e5baJesse Wilson        record.setLoggerName(this.name);
1153d9b5d1b899226673e746ad4d9f517244d968e5baJesse Wilson        record.setSourceClassName(sourceClass);
1154d9b5d1b899226673e746ad4d9f517244d968e5baJesse Wilson        record.setSourceMethodName(sourceMethod);
1155d9b5d1b899226673e746ad4d9f517244d968e5baJesse Wilson        record.setThrown(thrown);
1156d9b5d1b899226673e746ad4d9f517244d968e5baJesse Wilson        setResourceBundle(record);
1157d9b5d1b899226673e746ad4d9f517244d968e5baJesse Wilson        log(record);
1158adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
1159adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
1160adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
1161adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Logs a message of the given level with the specified source class name
1162adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * and source method name, using the given resource bundle to localize the
1163adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * message. If {@code bundleName} is null, the empty string or not valid then
1164adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * the message is not localized.
11659a0fbe99031759393563ee69ac4640f66f182686Jesse Wilson     *
1166adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param logLevel
1167adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the level of the given message.
1168adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param sourceClass
1169adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the source class name.
1170adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param sourceMethod
1171adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the source method name.
1172adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param bundleName
1173adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the name of the resource bundle used to localize the message.
1174adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param msg
1175adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the message to be logged.
1176adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
1177adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void logrb(Level logLevel, String sourceClass, String sourceMethod,
1178adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            String bundleName, String msg) {
1179d9b5d1b899226673e746ad4d9f517244d968e5baJesse Wilson        if (!internalIsLoggable(logLevel)) {
1180d9b5d1b899226673e746ad4d9f517244d968e5baJesse Wilson            return;
1181d9b5d1b899226673e746ad4d9f517244d968e5baJesse Wilson        }
1182d9b5d1b899226673e746ad4d9f517244d968e5baJesse Wilson
1183d9b5d1b899226673e746ad4d9f517244d968e5baJesse Wilson        LogRecord record = new LogRecord(logLevel, msg);
1184d9b5d1b899226673e746ad4d9f517244d968e5baJesse Wilson        if (bundleName != null) {
1185d9b5d1b899226673e746ad4d9f517244d968e5baJesse Wilson            try {
1186d9b5d1b899226673e746ad4d9f517244d968e5baJesse Wilson                record.setResourceBundle(loadResourceBundle(bundleName));
1187d9b5d1b899226673e746ad4d9f517244d968e5baJesse Wilson            } catch (MissingResourceException e) {
1188d9b5d1b899226673e746ad4d9f517244d968e5baJesse Wilson                // ignore
1189adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
1190d9b5d1b899226673e746ad4d9f517244d968e5baJesse Wilson            record.setResourceBundleName(bundleName);
1191adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
1192d9b5d1b899226673e746ad4d9f517244d968e5baJesse Wilson        record.setLoggerName(this.name);
1193d9b5d1b899226673e746ad4d9f517244d968e5baJesse Wilson        record.setSourceClassName(sourceClass);
1194d9b5d1b899226673e746ad4d9f517244d968e5baJesse Wilson        record.setSourceMethodName(sourceMethod);
1195d9b5d1b899226673e746ad4d9f517244d968e5baJesse Wilson        log(record);
1196adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
1197adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
1198adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
1199adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Logs a message of the given level with the specified source class name,
1200adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * source method name and parameter, using the given resource bundle to
1201adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * localize the message. If {@code bundleName} is null, the empty string
1202adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * or not valid then the message is not localized.
12039a0fbe99031759393563ee69ac4640f66f182686Jesse Wilson     *
1204adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param logLevel
1205adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the level of the given message.
1206adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param sourceClass
1207adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the source class name.
1208adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param sourceMethod
1209adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the source method name.
1210adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param bundleName
1211adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the name of the resource bundle used to localize the message.
1212adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param msg
1213adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the message to be logged.
1214adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param param
1215adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the parameter associated with the event that is logged.
1216adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
1217adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void logrb(Level logLevel, String sourceClass, String sourceMethod,
1218adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            String bundleName, String msg, Object param) {
1219d9b5d1b899226673e746ad4d9f517244d968e5baJesse Wilson        if (!internalIsLoggable(logLevel)) {
1220d9b5d1b899226673e746ad4d9f517244d968e5baJesse Wilson            return;
1221d9b5d1b899226673e746ad4d9f517244d968e5baJesse Wilson        }
1222d9b5d1b899226673e746ad4d9f517244d968e5baJesse Wilson
1223d9b5d1b899226673e746ad4d9f517244d968e5baJesse Wilson        LogRecord record = new LogRecord(logLevel, msg);
1224d9b5d1b899226673e746ad4d9f517244d968e5baJesse Wilson        if (bundleName != null) {
1225d9b5d1b899226673e746ad4d9f517244d968e5baJesse Wilson            try {
1226d9b5d1b899226673e746ad4d9f517244d968e5baJesse Wilson                record.setResourceBundle(loadResourceBundle(bundleName));
1227d9b5d1b899226673e746ad4d9f517244d968e5baJesse Wilson            } catch (MissingResourceException e) {
1228d9b5d1b899226673e746ad4d9f517244d968e5baJesse Wilson                // ignore
1229adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
1230d9b5d1b899226673e746ad4d9f517244d968e5baJesse Wilson            record.setResourceBundleName(bundleName);
1231adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
1232d9b5d1b899226673e746ad4d9f517244d968e5baJesse Wilson        record.setLoggerName(this.name);
1233d9b5d1b899226673e746ad4d9f517244d968e5baJesse Wilson        record.setSourceClassName(sourceClass);
1234d9b5d1b899226673e746ad4d9f517244d968e5baJesse Wilson        record.setSourceMethodName(sourceMethod);
1235d9b5d1b899226673e746ad4d9f517244d968e5baJesse Wilson        record.setParameters(new Object[] { param });
1236d9b5d1b899226673e746ad4d9f517244d968e5baJesse Wilson        log(record);
1237adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
1238adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
1239adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
1240adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Logs a message of the given level with the specified source class name,
1241adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * source method name and parameter array, using the given resource bundle
1242adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * to localize the message. If {@code bundleName} is null, the empty string
1243adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * or not valid then the message is not localized.
12449a0fbe99031759393563ee69ac4640f66f182686Jesse Wilson     *
1245adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param logLevel
1246adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the level of the given message.
1247adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param sourceClass
1248adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the source class name.
1249adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param sourceMethod
1250adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the source method name.
1251adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param bundleName
1252adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the name of the resource bundle used to localize the message.
1253adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param msg
1254adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the message to be logged.
1255adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param params
1256adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the parameter array associated with the event that is logged.
1257adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
1258adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void logrb(Level logLevel, String sourceClass, String sourceMethod,
1259adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            String bundleName, String msg, Object[] params) {
1260d9b5d1b899226673e746ad4d9f517244d968e5baJesse Wilson        if (!internalIsLoggable(logLevel)) {
1261d9b5d1b899226673e746ad4d9f517244d968e5baJesse Wilson            return;
1262d9b5d1b899226673e746ad4d9f517244d968e5baJesse Wilson        }
1263d9b5d1b899226673e746ad4d9f517244d968e5baJesse Wilson
1264d9b5d1b899226673e746ad4d9f517244d968e5baJesse Wilson        LogRecord record = new LogRecord(logLevel, msg);
1265d9b5d1b899226673e746ad4d9f517244d968e5baJesse Wilson        if (bundleName != null) {
1266d9b5d1b899226673e746ad4d9f517244d968e5baJesse Wilson            try {
1267d9b5d1b899226673e746ad4d9f517244d968e5baJesse Wilson                record.setResourceBundle(loadResourceBundle(bundleName));
1268d9b5d1b899226673e746ad4d9f517244d968e5baJesse Wilson            } catch (MissingResourceException e) {
1269d9b5d1b899226673e746ad4d9f517244d968e5baJesse Wilson                // ignore
1270adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
1271d9b5d1b899226673e746ad4d9f517244d968e5baJesse Wilson            record.setResourceBundleName(bundleName);
1272adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
1273d9b5d1b899226673e746ad4d9f517244d968e5baJesse Wilson        record.setLoggerName(this.name);
1274d9b5d1b899226673e746ad4d9f517244d968e5baJesse Wilson        record.setSourceClassName(sourceClass);
1275d9b5d1b899226673e746ad4d9f517244d968e5baJesse Wilson        record.setSourceMethodName(sourceMethod);
1276d9b5d1b899226673e746ad4d9f517244d968e5baJesse Wilson        record.setParameters(params);
1277d9b5d1b899226673e746ad4d9f517244d968e5baJesse Wilson        log(record);
1278adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
1279adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
1280adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
1281adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Logs a message of the given level with the specified source class name,
1282adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * source method name and {@code Throwable} object, using the given resource
1283adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * bundle to localize the message. If {@code bundleName} is null, the empty
1284adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * string or not valid then the message is not localized.
12859a0fbe99031759393563ee69ac4640f66f182686Jesse Wilson     *
1286adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param logLevel
1287adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the level of the given message
1288adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param sourceClass
1289adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the source class name
1290adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param sourceMethod
1291adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the source method name
1292adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param bundleName
1293adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the name of the resource bundle used to localize the message.
1294adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param msg
1295adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the message to be logged.
1296adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param thrown
1297adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the {@code Throwable} object.
1298adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
1299adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void logrb(Level logLevel, String sourceClass, String sourceMethod,
1300adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            String bundleName, String msg, Throwable thrown) {
1301d9b5d1b899226673e746ad4d9f517244d968e5baJesse Wilson        if (!internalIsLoggable(logLevel)) {
1302d9b5d1b899226673e746ad4d9f517244d968e5baJesse Wilson            return;
1303d9b5d1b899226673e746ad4d9f517244d968e5baJesse Wilson        }
1304d9b5d1b899226673e746ad4d9f517244d968e5baJesse Wilson
1305d9b5d1b899226673e746ad4d9f517244d968e5baJesse Wilson        LogRecord record = new LogRecord(logLevel, msg);
1306d9b5d1b899226673e746ad4d9f517244d968e5baJesse Wilson        if (bundleName != null) {
1307d9b5d1b899226673e746ad4d9f517244d968e5baJesse Wilson            try {
1308d9b5d1b899226673e746ad4d9f517244d968e5baJesse Wilson                record.setResourceBundle(loadResourceBundle(bundleName));
1309d9b5d1b899226673e746ad4d9f517244d968e5baJesse Wilson            } catch (MissingResourceException e) {
1310d9b5d1b899226673e746ad4d9f517244d968e5baJesse Wilson                // ignore
1311adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
1312d9b5d1b899226673e746ad4d9f517244d968e5baJesse Wilson            record.setResourceBundleName(bundleName);
1313adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
1314d9b5d1b899226673e746ad4d9f517244d968e5baJesse Wilson        record.setLoggerName(this.name);
1315d9b5d1b899226673e746ad4d9f517244d968e5baJesse Wilson        record.setSourceClassName(sourceClass);
1316d9b5d1b899226673e746ad4d9f517244d968e5baJesse Wilson        record.setSourceMethodName(sourceMethod);
1317d9b5d1b899226673e746ad4d9f517244d968e5baJesse Wilson        record.setThrown(thrown);
1318d9b5d1b899226673e746ad4d9f517244d968e5baJesse Wilson        log(record);
1319adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
1320adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
1321b501914f9448cc0c5852922d217ae11a29c63467Jesse Wilson    void reset() {
1322adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        levelObjVal = null;
1323adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        levelIntVal = Level.INFO.intValue();
1324b501914f9448cc0c5852922d217ae11a29c63467Jesse Wilson
1325b501914f9448cc0c5852922d217ae11a29c63467Jesse Wilson        for (Handler handler : handlers) {
1326b501914f9448cc0c5852922d217ae11a29c63467Jesse Wilson            try {
1327b501914f9448cc0c5852922d217ae11a29c63467Jesse Wilson                if (handlers.remove(handler)) {
1328b501914f9448cc0c5852922d217ae11a29c63467Jesse Wilson                    handler.close();
1329adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                }
1330b501914f9448cc0c5852922d217ae11a29c63467Jesse Wilson            } catch (Exception ignored) {
1331adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
1332adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
1333c99250a4d619670f2a9410df121eff04fdc9e87cJesse Wilson
1334fb0ec0e650bf8be35acb0d47da0311a7c446aa33Elliott Hughes        updateDalvikLogHandler();
1335adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
1336adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project}
1337