river-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From dre...@apache.org
Subject svn commit: r1449248 - /river/jtsk/trunk/src/com/sun/jini/logging/Levels.java
Date Fri, 22 Feb 2013 22:36:16 GMT
Author: dreedy
Date: Fri Feb 22 22:36:15 2013
New Revision: 1449248

URL: http://svn.apache.org/r1449248
Log:
RIVER-416: Backed out use of CustomLevel and added 'localizedLevelName' in the com.sun.jini.logging.Levels
class

Modified:
    river/jtsk/trunk/src/com/sun/jini/logging/Levels.java

Modified: river/jtsk/trunk/src/com/sun/jini/logging/Levels.java
URL: http://svn.apache.org/viewvc/river/jtsk/trunk/src/com/sun/jini/logging/Levels.java?rev=1449248&r1=1449247&r2=1449248&view=diff
==============================================================================
--- river/jtsk/trunk/src/com/sun/jini/logging/Levels.java (original)
+++ river/jtsk/trunk/src/com/sun/jini/logging/Levels.java Fri Feb 22 22:36:15 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.
  *
- * 
  * @since 2.0
  */
 public class Levels {
@@ -43,36 +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);
+        }
+    }
 }



Mime
View raw message