1054ed393bd95a6f7c34398accc5cefe36fae8989Ceki Gulcu/* 2054ed393bd95a6f7c34398accc5cefe36fae8989Ceki Gulcu * Copyright 2001-2004 The Apache Software Foundation. 37ba0605dc97fb81bde8311510d27b3ccba170008Ceki Gulcu * 4054ed393bd95a6f7c34398accc5cefe36fae8989Ceki Gulcu * Licensed under the Apache License, Version 2.0 (the "License"); 5054ed393bd95a6f7c34398accc5cefe36fae8989Ceki Gulcu * you may not use this file except in compliance with the License. 6054ed393bd95a6f7c34398accc5cefe36fae8989Ceki Gulcu * You may obtain a copy of the License at 77ba0605dc97fb81bde8311510d27b3ccba170008Ceki Gulcu * 8054ed393bd95a6f7c34398accc5cefe36fae8989Ceki Gulcu * http://www.apache.org/licenses/LICENSE-2.0 97ba0605dc97fb81bde8311510d27b3ccba170008Ceki Gulcu * 10054ed393bd95a6f7c34398accc5cefe36fae8989Ceki Gulcu * Unless required by applicable law or agreed to in writing, software 11054ed393bd95a6f7c34398accc5cefe36fae8989Ceki Gulcu * distributed under the License is distributed on an "AS IS" BASIS, 12054ed393bd95a6f7c34398accc5cefe36fae8989Ceki Gulcu * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13054ed393bd95a6f7c34398accc5cefe36fae8989Ceki Gulcu * See the License for the specific language governing permissions and 14054ed393bd95a6f7c34398accc5cefe36fae8989Ceki Gulcu * limitations under the License. 1588c4c456766193e012eb890e2208473d99b91f83Ceki Gulcu */ 16054ed393bd95a6f7c34398accc5cefe36fae8989Ceki Gulcu 1788c4c456766193e012eb890e2208473d99b91f83Ceki Gulcu// Contributors: Kitching Simon <Simon.Kitching@orange.ch> 1888c4c456766193e012eb890e2208473d99b91f83Ceki Gulcu// Nicholas Wolff 1988c4c456766193e012eb890e2208473d99b91f83Ceki Gulcu 2088c4c456766193e012eb890e2208473d99b91f83Ceki Gulcupackage org.apache.log4j; 2131212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu 2288c4c456766193e012eb890e2208473d99b91f83Ceki Gulcuimport java.io.IOException; 2388c4c456766193e012eb890e2208473d99b91f83Ceki Gulcuimport java.io.ObjectInputStream; 2488c4c456766193e012eb890e2208473d99b91f83Ceki Gulcuimport java.io.ObjectOutputStream; 2588c4c456766193e012eb890e2208473d99b91f83Ceki Gulcuimport java.io.ObjectStreamException; 2688c4c456766193e012eb890e2208473d99b91f83Ceki Gulcuimport java.io.Serializable; 2788c4c456766193e012eb890e2208473d99b91f83Ceki Gulcu 2888c4c456766193e012eb890e2208473d99b91f83Ceki Gulcu/** 2988c4c456766193e012eb890e2208473d99b91f83Ceki Gulcu Defines the minimum set of levels recognized by the system, that is 3088c4c456766193e012eb890e2208473d99b91f83Ceki Gulcu <code>OFF</code>, <code>FATAL</code>, <code>ERROR</code>, 3188c4c456766193e012eb890e2208473d99b91f83Ceki Gulcu <code>WARN</code>, <code>INFO</code>, <code>DEBUG</code> and 3288c4c456766193e012eb890e2208473d99b91f83Ceki Gulcu <code>ALL</code>. 3388c4c456766193e012eb890e2208473d99b91f83Ceki Gulcu 3488c4c456766193e012eb890e2208473d99b91f83Ceki Gulcu <p>The <code>Level</code> class may be subclassed to define a larger 3588c4c456766193e012eb890e2208473d99b91f83Ceki Gulcu level set. 3688c4c456766193e012eb890e2208473d99b91f83Ceki Gulcu 3788c4c456766193e012eb890e2208473d99b91f83Ceki Gulcu @author Ceki Gülcü 3888c4c456766193e012eb890e2208473d99b91f83Ceki Gulcu 3988c4c456766193e012eb890e2208473d99b91f83Ceki Gulcu */ 4088c4c456766193e012eb890e2208473d99b91f83Ceki Gulcupublic class Level extends Priority implements Serializable { 4188c4c456766193e012eb890e2208473d99b91f83Ceki Gulcu 4231212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu /** 4331212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu * TRACE level integer value. 4431212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu * @since 1.2.12 4531212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu */ 4631212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu public static final int TRACE_INT = 5000; 4731212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu 4831212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu // match jboss' xlevel 4931212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu public static final int X_TRACE_INT = DEBUG_INT - 100; 5031212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu 5131212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu /** 5231212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu The <code>OFF</code> has the highest possible rank and is 5331212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu intended to turn off logging. */ 5431212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu final static public Level OFF = new Level(OFF_INT, "OFF", 0); 5531212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu 5631212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu /** 5731212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu The <code>FATAL</code> level designates very severe error 5831212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu events that will presumably lead the application to abort. 5931212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu */ 6031212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu final static public Level FATAL = new Level(FATAL_INT, "FATAL", 0); 6131212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu 6231212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu /** 6331212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu The <code>ERROR</code> level designates error events that 6431212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu might still allow the application to continue running. */ 6531212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu final static public Level ERROR = new Level(ERROR_INT, "ERROR", 3); 6631212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu 6731212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu /** 6831212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu The <code>WARN</code> level designates potentially harmful situations. 6988c4c456766193e012eb890e2208473d99b91f83Ceki Gulcu */ 7031212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu final static public Level WARN = new Level(WARN_INT, "WARN", 4); 7131212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu 7231212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu /** 7331212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu The <code>INFO</code> level designates informational messages 7431212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu that highlight the progress of the application at coarse-grained 7531212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu level. */ 7631212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu final static public Level INFO = new Level(INFO_INT, "INFO", 6); 7731212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu 7831212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu /** 7931212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu The <code>DEBUG</code> Level designates fine-grained 8031212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu informational events that are most useful to debug an 8131212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu application. */ 8231212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu final static public Level DEBUG = new Level(DEBUG_INT, "DEBUG", 7); 8331212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu 8431212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu /** 8531212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu * The <code>TRACE</code> Level designates finer-grained 8631212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu * informational events than the <code>DEBUG</code level. 8731212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu * @since 1.2.12 8831212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu */ 8931212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu public static final Level TRACE = new Level(TRACE_INT, "TRACE", 7); 9031212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu 9131212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu /** 9231212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu The <code>ALL</code> has the lowest possible rank and is intended to 9331212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu turn on all logging. */ 9431212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu final static public Level ALL = new Level(ALL_INT, "ALL", 7); 9531212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu 9631212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu /** 9731212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu * Serialization version id. 9831212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu */ 9931212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu static final long serialVersionUID = 3491141966387921974L; 10031212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu 10131212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu /** 10231212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu Instantiate a Level object. 10331212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu */ 10431212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu protected Level(int level, String levelStr, int syslogEquivalent) { 10531212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu super(level, levelStr, syslogEquivalent); 10631212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu } 10731212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu 10831212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu /** 10931212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu Convert the string passed as argument to a level. If the 11031212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu conversion fails, then this method returns {@link #DEBUG}. 11131212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu */ 11231212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu public static Level toLevel(String sArg) { 11331212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu return (Level) toLevel(sArg, Level.DEBUG); 11431212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu } 11531212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu 11631212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu /** 11731212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu Convert an integer passed as argument to a level. If the 11831212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu conversion fails, then this method returns {@link #DEBUG}. 11931212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu 12031212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu */ 12131212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu public static Level toLevel(int val) { 12231212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu return (Level) toLevel(val, Level.DEBUG); 12331212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu } 12431212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu 12531212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu /** 12631212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu Convert an integer passed as argument to a level. If the 12731212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu conversion fails, then this method returns the specified default. 12888c4c456766193e012eb890e2208473d99b91f83Ceki Gulcu */ 12931212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu public static Level toLevel(int val, Level defaultLevel) { 13031212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu switch (val) { 13131212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu case ALL_INT: 13231212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu return ALL; 13331212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu case DEBUG_INT: 13431212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu return Level.DEBUG; 13531212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu case INFO_INT: 13631212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu return Level.INFO; 13731212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu case WARN_INT: 13831212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu return Level.WARN; 13931212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu case ERROR_INT: 14031212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu return Level.ERROR; 14131212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu case FATAL_INT: 14231212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu return Level.FATAL; 14331212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu case OFF_INT: 14431212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu return OFF; 14531212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu case TRACE_INT: 14631212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu return Level.TRACE; 14731212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu default: 14831212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu return defaultLevel; 14931212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu } 15031212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu } 15131212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu 15231212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu /** 15331212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu Convert the string passed as argument to a level. If the 15431212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu conversion fails, then this method returns the value of 15531212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu <code>defaultLevel</code>. 15631212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu */ 15731212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu public static Level toLevel(String sArg, Level defaultLevel) { 15831212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu if (sArg == null) 15931212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu return defaultLevel; 16031212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu 16131212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu String s = sArg.toUpperCase(); 16231212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu 16331212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu if (s.equals("ALL")) 16431212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu return Level.ALL; 16531212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu if (s.equals("DEBUG")) 16631212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu return Level.DEBUG; 16731212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu if (s.equals("INFO")) 16831212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu return Level.INFO; 16931212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu if (s.equals("WARN")) 17031212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu return Level.WARN; 17131212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu if (s.equals("ERROR")) 17231212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu return Level.ERROR; 17331212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu if (s.equals("FATAL")) 17431212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu return Level.FATAL; 17531212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu if (s.equals("OFF")) 17631212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu return Level.OFF; 17731212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu if (s.equals("TRACE")) 17831212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu return Level.TRACE; 17931212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu return defaultLevel; 18088c4c456766193e012eb890e2208473d99b91f83Ceki Gulcu } 18188c4c456766193e012eb890e2208473d99b91f83Ceki Gulcu 18288c4c456766193e012eb890e2208473d99b91f83Ceki Gulcu /** 18388c4c456766193e012eb890e2208473d99b91f83Ceki Gulcu * Custom deserialization of Level. 18488c4c456766193e012eb890e2208473d99b91f83Ceki Gulcu * @param s serialization stream. 18588c4c456766193e012eb890e2208473d99b91f83Ceki Gulcu * @throws IOException if IO exception. 18688c4c456766193e012eb890e2208473d99b91f83Ceki Gulcu * @throws ClassNotFoundException if class not found. 18788c4c456766193e012eb890e2208473d99b91f83Ceki Gulcu */ 18888c4c456766193e012eb890e2208473d99b91f83Ceki Gulcu private void readObject(final ObjectInputStream s) throws IOException, ClassNotFoundException { 18931212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu s.defaultReadObject(); 19031212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu level = s.readInt(); 19131212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu syslogEquivalent = s.readInt(); 19231212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu levelStr = s.readUTF(); 19331212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu if (levelStr == null) { 19431212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu levelStr = ""; 19531212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu } 19688c4c456766193e012eb890e2208473d99b91f83Ceki Gulcu } 19788c4c456766193e012eb890e2208473d99b91f83Ceki Gulcu 19888c4c456766193e012eb890e2208473d99b91f83Ceki Gulcu /** 19988c4c456766193e012eb890e2208473d99b91f83Ceki Gulcu * Serialize level. 20088c4c456766193e012eb890e2208473d99b91f83Ceki Gulcu * @param s serialization stream. 20188c4c456766193e012eb890e2208473d99b91f83Ceki Gulcu * @throws IOException if exception during serialization. 20288c4c456766193e012eb890e2208473d99b91f83Ceki Gulcu */ 20388c4c456766193e012eb890e2208473d99b91f83Ceki Gulcu private void writeObject(final ObjectOutputStream s) throws IOException { 20488c4c456766193e012eb890e2208473d99b91f83Ceki Gulcu s.defaultWriteObject(); 20588c4c456766193e012eb890e2208473d99b91f83Ceki Gulcu s.writeInt(level); 20688c4c456766193e012eb890e2208473d99b91f83Ceki Gulcu s.writeInt(syslogEquivalent); 20788c4c456766193e012eb890e2208473d99b91f83Ceki Gulcu s.writeUTF(levelStr); 20888c4c456766193e012eb890e2208473d99b91f83Ceki Gulcu } 20988c4c456766193e012eb890e2208473d99b91f83Ceki Gulcu 21088c4c456766193e012eb890e2208473d99b91f83Ceki Gulcu /** 21188c4c456766193e012eb890e2208473d99b91f83Ceki Gulcu * Resolved deserialized level to one of the stock instances. 21288c4c456766193e012eb890e2208473d99b91f83Ceki Gulcu * May be overriden in classes derived from Level. 21388c4c456766193e012eb890e2208473d99b91f83Ceki Gulcu * @return resolved object. 21488c4c456766193e012eb890e2208473d99b91f83Ceki Gulcu * @throws ObjectStreamException if exception during resolution. 21588c4c456766193e012eb890e2208473d99b91f83Ceki Gulcu */ 21688c4c456766193e012eb890e2208473d99b91f83Ceki Gulcu private Object readResolve() throws ObjectStreamException { 21788c4c456766193e012eb890e2208473d99b91f83Ceki Gulcu // 21831212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu // if the deserizalized object is exactly an instance of Level 21988c4c456766193e012eb890e2208473d99b91f83Ceki Gulcu // 22088c4c456766193e012eb890e2208473d99b91f83Ceki Gulcu if (getClass() == Level.class) { 22188c4c456766193e012eb890e2208473d99b91f83Ceki Gulcu return toLevel(level); 22288c4c456766193e012eb890e2208473d99b91f83Ceki Gulcu } 22388c4c456766193e012eb890e2208473d99b91f83Ceki Gulcu // 22431212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu // extension of Level can't substitute stock item 22588c4c456766193e012eb890e2208473d99b91f83Ceki Gulcu // 22688c4c456766193e012eb890e2208473d99b91f83Ceki Gulcu return this; 22788c4c456766193e012eb890e2208473d99b91f83Ceki Gulcu } 22814797605e251ff02452545cf22124dae25955acdCeki Gulcu}