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
208454d3c5b9778ae359d11cd98ed81c589e951d0aElliott Hughesimport dalvik.system.VMStack;
21adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.io.IOException;
22adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.io.ObjectInputStream;
23adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.io.Serializable;
24adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.util.ArrayList;
25adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.util.List;
26adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.util.Locale;
27adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.util.MissingResourceException;
28adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.util.ResourceBundle;
296186821cb13f4ac7ff50950c813394367e021eaeJesse Wilsonimport libcore.util.Objects;
30adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
31adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/**
32adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code Level} objects are used to indicate the level of logging. There are a
33adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * set of predefined logging levels, each associated with an integer value.
34adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Enabling a certain logging level also enables all logging levels with larger
35adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * values.
36adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p>
37adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * The predefined levels in ascending order are FINEST, FINER, FINE, CONFIG,
38adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * INFO, WARNING, SEVERE. There are two additional predefined levels, which are
39adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * ALL and OFF. ALL indicates logging all messages, and OFF indicates logging no
40adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * messages.
41adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */
42adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectpublic class Level implements Serializable {
43adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
44adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private static final long serialVersionUID = -8176160795706313070L;
45adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
46adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private static final List<Level> levels = new ArrayList<Level>(9);
47adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
48adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
49adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * The OFF level provides no logging messages.
50adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
51f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes    public static final Level OFF = new Level("OFF", Integer.MAX_VALUE);
52adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
53adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
54adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * The SEVERE level provides severe failure messages.
55adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
56f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes    public static final Level SEVERE = new Level("SEVERE", 1000);
57adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
58adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
59adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * The WARNING level provides warnings.
60adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
61f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes    public static final Level WARNING = new Level("WARNING", 900);
62adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
63adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
64adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * The INFO level provides informative messages.
65adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
66f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes    public static final Level INFO = new Level("INFO", 800);
67adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
68adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
69adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * The CONFIG level provides static configuration messages.
70adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
71f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes    public static final Level CONFIG = new Level("CONFIG", 700);
72adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
73adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
74adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * The FINE level provides tracing messages.
75adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
76f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes    public static final Level FINE = new Level("FINE", 500);
77adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
78adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
79adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * The FINER level provides more detailed tracing messages.
80adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
81f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes    public static final Level FINER = new Level("FINER", 400);
82adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
83adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
84adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * The FINEST level provides highly detailed tracing messages.
85adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
86f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes    public static final Level FINEST = new Level("FINEST", 300);
87adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
88adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
89adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * The ALL level provides all logging messages.
90adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
91f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes    public static final Level ALL = new Level("ALL", Integer.MIN_VALUE);
92adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
93adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
94adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Parses a level name into a {@code Level} object.
959a0fbe99031759393563ee69ac4640f66f182686Jesse Wilson     *
96adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param name
97adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the name of the desired {@code level}, which cannot be
98adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            {@code null}.
99adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the level with the specified name.
100adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws NullPointerException
101adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if {@code name} is {@code null}.
102adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IllegalArgumentException
103adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if {@code name} is not valid.
104adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
105adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static Level parse(String name) throws IllegalArgumentException {
106adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (name == null) {
1078454d3c5b9778ae359d11cd98ed81c589e951d0aElliott Hughes            throw new NullPointerException("name == null");
108adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
109adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
110adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        boolean isNameAnInt;
111adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        int nameAsInt;
112adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
113adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            nameAsInt = Integer.parseInt(name);
114adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            isNameAnInt = true;
115adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } catch (NumberFormatException e) {
116adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            nameAsInt = 0;
117adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            isNameAnInt = false;
118adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
119adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
120adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        synchronized (levels) {
121adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            for (Level level : levels) {
122adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                if (name.equals(level.getName())) {
123adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    return level;
124adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                }
125adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
126adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
127adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            if (isNameAnInt) {
128adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                /*
1299a0fbe99031759393563ee69ac4640f66f182686Jesse Wilson                 * Loop through levels a second time, so that the returned
1309a0fbe99031759393563ee69ac4640f66f182686Jesse Wilson                 * instance will be passed on the order of construction.
131adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                 */
132adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                for (Level level : levels) {
133adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    if (nameAsInt == level.intValue()) {
134adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                        return level;
135adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    }
136adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                }
137adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
138adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
139adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
140adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (!isNameAnInt) {
1418454d3c5b9778ae359d11cd98ed81c589e951d0aElliott Hughes            throw new IllegalArgumentException("Cannot parse name '" + name + "'");
142adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
143adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
144adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return new Level(name, nameAsInt);
145adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
146adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
147adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
148adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * The name of this Level.
1499a0fbe99031759393563ee69ac4640f66f182686Jesse Wilson     *
150adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @serial
151adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
152adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private final String name;
153adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
154adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
155adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * The integer value indicating the level.
1569a0fbe99031759393563ee69ac4640f66f182686Jesse Wilson     *
157adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @serial
158adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
159adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private final int value;
160adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
161adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
162adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * The name of the resource bundle used to localize the level name.
1639a0fbe99031759393563ee69ac4640f66f182686Jesse Wilson     *
164adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @serial
165adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
166adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private final String resourceBundleName;
167adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
168adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
169adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * The resource bundle associated with this level, used to localize the
170adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * level name.
171adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
172adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private transient ResourceBundle rb;
173adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
174adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
175adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Constructs an instance of {@code Level} taking the supplied name and
176adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * level value.
1779a0fbe99031759393563ee69ac4640f66f182686Jesse Wilson     *
178adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param name
179adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the name of the level.
180adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param level
181adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            an integer value indicating the level.
182adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws NullPointerException
183adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if {@code name} is {@code null}.
184adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
185adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    protected Level(String name, int level) {
186adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        this(name, level, null);
187adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
188adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
189adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
190adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Constructs an instance of {@code Level} taking the supplied name, level
191adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * value and resource bundle name.
1929a0fbe99031759393563ee69ac4640f66f182686Jesse Wilson     *
193adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param name
194adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the name of the level.
195adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param level
196adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            an integer value indicating the level.
197adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param resourceBundleName
198adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the name of the resource bundle to use.
199adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws NullPointerException
200adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if {@code name} is {@code null}.
201adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
202adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    protected Level(String name, int level, String resourceBundleName) {
203adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (name == null) {
2048454d3c5b9778ae359d11cd98ed81c589e951d0aElliott Hughes            throw new NullPointerException("name == null");
205adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
206adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        this.name = name;
207adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        this.value = level;
208adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        this.resourceBundleName = resourceBundleName;
209adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (resourceBundleName != null) {
210adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            try {
211adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                rb = ResourceBundle.getBundle(resourceBundleName,
212adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                        Locale.getDefault(), VMStack.getCallingClassLoader());
213adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            } catch (MissingResourceException e) {
214adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                rb = null;
215adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
216adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
217adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        synchronized (levels) {
218adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            levels.add(this);
219adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
220adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
221adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
222adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
223adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Gets the name of this level.
2249a0fbe99031759393563ee69ac4640f66f182686Jesse Wilson     *
225adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return this level's name.
226adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
227adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public String getName() {
228adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return this.name;
229adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
230adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
231adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
232adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Gets the name of the resource bundle associated with this level.
2339a0fbe99031759393563ee69ac4640f66f182686Jesse Wilson     *
234adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the name of this level's resource bundle.
235adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
236adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public String getResourceBundleName() {
237adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return this.resourceBundleName;
238adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
239adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
240adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
241adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Gets the integer value indicating this level.
2429a0fbe99031759393563ee69ac4640f66f182686Jesse Wilson     *
243adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return this level's integer value.
244adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
245adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public final int intValue() {
246adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return this.value;
247adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
248adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
249adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
250adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Serialization helper method to maintain singletons and add any new
251adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * levels.
2529a0fbe99031759393563ee69ac4640f66f182686Jesse Wilson     *
253adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the resolved instance.
254adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
255adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private Object readResolve() {
256adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        synchronized (levels) {
257adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            for (Level level : levels) {
258adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                if (value != level.value) {
259adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    continue;
260adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                }
2619a0fbe99031759393563ee69ac4640f66f182686Jesse Wilson                if (!name.equals(level.name)) {
262adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    continue;
263adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                }
264e32b21f14d52bac429a9c54fe031f9e92c911d64Jesse Wilson                if (Objects.equal(resourceBundleName, level.resourceBundleName)) {
265adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    return level;
266adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                }
267adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
268adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            // This is a new value, so add it.
269adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            levels.add(this);
270adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return this;
271adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
272adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
273adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
274adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
275adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Serialization helper to setup transient resource bundle instance.
2769a0fbe99031759393563ee69ac4640f66f182686Jesse Wilson     *
277adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param in
278adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the input stream to read the instance data from.
279adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IOException
280adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if an IO error occurs.
281adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws ClassNotFoundException
282adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if a class is not found.
283adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
2849a0fbe99031759393563ee69ac4640f66f182686Jesse Wilson    private void readObject(ObjectInputStream in) throws IOException,
2859a0fbe99031759393563ee69ac4640f66f182686Jesse Wilson            ClassNotFoundException {
286adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        in.defaultReadObject();
287adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (resourceBundleName != null) {
288adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            try {
289adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                rb = ResourceBundle.getBundle(resourceBundleName);
290adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            } catch (MissingResourceException e) {
291adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                rb = null;
292adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
293adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
294adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
295adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
296adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
297adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Gets the localized name of this level. The default locale is used. If no
298adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * resource bundle is associated with this level then the original level
299adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * name is returned.
3009a0fbe99031759393563ee69ac4640f66f182686Jesse Wilson     *
301adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the localized name of this level.
302adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
303adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public String getLocalizedName() {
304adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (rb == null) {
305adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return name;
306adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
307adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
308adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
309adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return rb.getString(name);
310adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } catch (MissingResourceException e) {
311adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return name;
312adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
313adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
314adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
315adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
316adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Compares two {@code Level} objects for equality. They are considered to
317adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * be equal if they have the same level value.
3189a0fbe99031759393563ee69ac4640f66f182686Jesse Wilson     *
319adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param o
320adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the other object to compare this level to.
321adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return {@code true} if this object equals to the supplied object,
322adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         {@code false} otherwise.
323adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
324adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
325adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public boolean equals(Object o) {
326adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (this == o) {
327adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return true;
328adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
329adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
330adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (!(o instanceof Level)) {
331adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return false;
332adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
333adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
334adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return ((Level) o).intValue() == this.value;
335adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
336adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
337adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
338adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns the hash code of this {@code Level} object.
3399a0fbe99031759393563ee69ac4640f66f182686Jesse Wilson     *
340adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return this level's hash code.
341adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
342adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
343adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public int hashCode() {
344adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return this.value;
345adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
346adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
347adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
348adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns the string representation of this {@code Level} object. In
349adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * this case, it is the level's name.
3509a0fbe99031759393563ee69ac4640f66f182686Jesse Wilson     *
351adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the string representation of this level.
352adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
353adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
354adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public final String toString() {
355adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return this.name;
356adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
357adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project}
358