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