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&uuml;lc&uuml;
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}