Author: dreedy
Date: Fri Feb 22 22:36:53 2013
New Revision: 1449249
URL: http://svn.apache.org/r1449249
Log:
RIVER-416: Backed out use of CustomLevel and added 'localizedLevelName' in the
com.sun.jini.logging.Levels class
Modified:
river/jtsk/branches/2.2/src/com/sun/jini/logging/Levels.java
Modified: river/jtsk/branches/2.2/src/com/sun/jini/logging/Levels.java
URL:
http://svn.apache.org/viewvc/river/jtsk/branches/2.2/src/com/sun/jini/logging/Levels.java?rev=1449249&r1=1449248&r2=1449249&view=diff
==============================================================================
--- river/jtsk/branches/2.2/src/com/sun/jini/logging/Levels.java (original)
+++ river/jtsk/branches/2.2/src/com/sun/jini/logging/Levels.java Fri Feb 22
22:36:53 2013
@@ -30,12 +30,11 @@ 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
*/
public class Levels {
@@ -43,34 +42,94 @@ 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>.
*/
- public static final Level FAILED = new CustomLevel("FAILED", 600, null);
+ 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>.
*/
- public static final Level HANDLED = new CustomLevel("HANDLED", 550, null);
+ 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");
+ throw new AssertionError("This class cannot be instantiated");
}
- static class CustomLevel extends Level {
- CustomLevel(String name, int value, String resourceBundleName) {
- super(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;
+ }
+ }
+
+ /**
+ * 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);
+ }
+ }
+
+ /**
+ * 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);
+ }
+ }
}