Author: peter_firmstone Date: Sun Feb 24 08:33:37 2013 New Revision: 1449445
URL: http://svn.apache.org/r1449445 Log: RIVER-416 Modified: river/jtsk/skunk/qa_refactor/trunk/src/com/sun/jini/logging/Levels.java Modified: river/jtsk/skunk/qa_refactor/trunk/src/com/sun/jini/logging/Levels.java URL: http://svn.apache.org/viewvc/river/jtsk/skunk/qa_refactor/trunk/src/com/sun/jini/logging/Levels.java?rev=1449445&r1=1449444&r2=1449445&view=diff ============================================================================== --- river/jtsk/skunk/qa_refactor/trunk/src/com/sun/jini/logging/Levels.java (original) +++ river/jtsk/skunk/qa_refactor/trunk/src/com/sun/jini/logging/Levels.java Sun Feb 24 08:33:37 2013 @@ -6,9 +6,9 @@ * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at - * + * * http://www.apache.org/licenses/LICENSE-2.0 - * + * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. @@ -18,70 +18,117 @@ package com.sun.jini.logging; +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.ObjectInputStream; +import java.io.ObjectOutputStream; +import java.io.ObjectStreamClass; +import java.io.OutputStream; +import java.io.Serializable; import java.util.logging.Level; /** - * Defines additional {@link Level} values. <p> - * <p/> - * See the {@link LogManager} class for one way to use the <code>FAILED</code> - * and <code>HANDLED</code> logging levels in standard logging configuration - * files. - * - * @author Sun Microsystems, Inc. - * @since 2.0 - */ +* Defines additional {@link Level} values. <p> +* <p/> +* See the {@link LogManager} class for one way to use the <code>FAILED</code> +* and <code>HANDLED</code> logging levels in standard logging configuration +* files. +* +* @since 2.0 +*/ public class Levels { /** - * <code>FAILED</code> is a message level indicating that a facility has - * experienced a failure that it will reflect to its caller. <p> - * <p/> - * <code>FAILED</code> messages are intended to provide users with - * information about failures produced by internal components in order to - * assist with debugging problems in systems with multiple components. This - * level is initialized to <code>600</code>. - */ + * <code>FAILED</code> is a message level indicating that a facility has + * experienced a failure that it will reflect to its caller. <p> + * <p/> + * <code>FAILED</code> messages are intended to provide users with + * information about failures produced by internal components in order to + * assist with debugging problems in systems with multiple components. This + * level is initialized to <code>600</code>. + */ public static final Level FAILED = createLevel("FAILED", 600, null); /** - * <code>HANDLED</code> is a message level indicating that a facility has - * detected a failure that it will take steps to handle without reflecting - * the failure to its caller. <p> - * <p/> - * <code>HANDLED</code> messages are intended to provide users with - * information about failures detected by internal components in order to - * assist with debugging problems in systems with multiple components. This - * level is initialized to <code>550</code>. - */ + * <code>HANDLED</code> is a message level indicating that a facility has + * detected a failure that it will take steps to handle without reflecting + * the failure to its caller. <p> + * <p/> + * <code>HANDLED</code> messages are intended to provide users with + * information about failures detected by internal components in order to + * assist with debugging problems in systems with multiple components. This + * level is initialized to <code>550</code>. + */ public static final Level HANDLED = createLevel("HANDLED", 550, null); /** - * This class cannot be instantiated. - */ + * This class cannot be instantiated. + */ private Levels() { throw new AssertionError("This class cannot be instantiated"); } - /** - * Creates an instance of the Level class. - */ - private static Level createLevel(String name, - int value, - String resourceBundleName) { - return new CustomLevel(name, value, resourceBundleName); + * Defines a class that has the same data format as the Level class, to + * permit creating the serialized form of a Level instance. + */ + private static final class LevelData implements Serializable { + private static final long serialVersionUID = -8176160795706313070L; + private final String name; + private final int value; + private final String resourceBundleName; + private final String localizedLevelName; + + LevelData(String name, int value, String resourceBundleName) { + this.name = name; + this.value = value; + this.resourceBundleName = resourceBundleName; + this.localizedLevelName = resourceBundleName == null ? name : null; + } } - static class CustomLevel extends Level { - private static final long serialVersionUID = 1L; - CustomLevel(String name, int value, String resourceBundleName) { - super(name, value, resourceBundleName); + /** + * Defines an object output stream that allows the data for one class to be + * interpreted as the data for another class. This class is useful in + * creating serialization data for a class when access to an appropriate + * constructor is not available. + */ + private static final class ClassReplacingObjectOutputStream extends ObjectOutputStream { + private final ObjectStreamClass from; + private final ObjectStreamClass to; + ClassReplacingObjectOutputStream(OutputStream out, Class from, Class to) throws IOException { + super(out); + this.from = ObjectStreamClass.lookup(from); + this.to = ObjectStreamClass.lookup(to); + } + + protected void writeClassDescriptor(ObjectStreamClass desc) throws IOException { + if (from.equals(desc)) { + desc = to; + } + super.writeClassDescriptor(desc); } - - private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException{ - in.defaultReadObject(); + } + + /** + * Creates an instance of the Level class. This method works around the + * fact that there is no public constructor for the Level class by + * constructing the serialized form for an instance with the specified + * field values and deserializing it. + */ + private static Level createLevel(String name, int value, String resourceBundleName) { + try { + ByteArrayOutputStream bytes = new ByteArrayOutputStream(); + ObjectOutputStream out = new ClassReplacingObjectOutputStream(bytes, LevelData.class, Level.class); + out.writeObject(new LevelData(name, value, resourceBundleName)); + out.close(); + ObjectInputStream in = new ObjectInputStream(new ByteArrayInputStream(bytes.toByteArray())); + Level result = (Level) in.readObject(); + in.close(); + return result; + } catch (Exception e) { + throw new RuntimeException("Unexpected exception", e); } } -} +} \ No newline at end of file
