Uploaded image for project: 'JDK'
  1. JDK
  2. JDK-4372506

LOGGING APIs: LogRecord loses resource bundle after serialization

XMLWordPrintable

    • beta
    • generic
    • generic
    • Verified



      Name: elR10090 Date: 09/20/2000



      Logging APIs specification (draft 0.49) states:

      "The ResourceBundle is not transmitted as part of the serialized form,
      but the resource bundle name is, and the recipient object's readObject
      method will atempt to locate a suitable resource bundle."

      Following test shows that readObject method does not try
      to restore ResourceBundle value if the record has non-null
      ResourceBundle and has null Parameters properties.

      serializ001 log:

      # Wrong bundle null, expected
        logging.LogRecord.Serialization.serializ001$TestBundle@28c4e7
      # TEST FAILED.

      serializ001.java source:

      // File: @(#)serializ001.java 1.1 00/09/20
      // Copyright 09/20/00 Sun Microsystems, Inc. All Rights Reserved

      package logging.LogRecord.Serialization;

      import java.util.logging.*;
      import java.util.*;
      import java.io.*;

      public class serializ001 {

          final static int PASSED = 0;
          final static int FAILED = 2;
          final static int JCK_STATUS_BASE = 95;
          final static String failMessage = "# TEST FAILED.";
          final static String fileName = "records.tmp";
          final static Object testParams[] = { new Integer(1), "Oups!", null };
          final static String testBundleName =
              "logging.LogRecord.Serialization.serializ001$TestBundle";

          final static LogRecord records[] = {
              new LogRecord(Level.OFF, null),
              new LogRecord(Level.FINE, "Fine record {0} {1}"),
              new LogRecord(Level.parse("123456"), "2")
          };

          private static PrintStream sout;
          private static boolean verbose = false;
          private static boolean testFailed = false;
          private static Formatter formatter = null;

          private static void checkStr(String source, String result, String name) {
              if (source == null && result == null) {
                  // Ok
              } else if (source == null && result != null) {
                  sout.println("# Wrong " + name + " \"" + result
                      + "\", expected null");
                  testFailed = true;
              } else if (source != null && result == null) {
                  sout.println("# Wrong " + name
                      + " null, expected \"" + source + "\"");
                  testFailed = true;
              } else if (!source.equals(result)) {
                  sout.println("# Wrong " + name + " \"" + result
                      + "\", expected \"" + source + "\"");
                  testFailed = true;
              }
          }

          private static void checkBundle(ResourceBundle source,
                                          ResourceBundle result) {

              if (source == null && result == null) {
                  // Ok
              } else if (source == null && result != null) {
                  sout.println("# Wrong bundle " + result + ", expected null");
                  testFailed = true;
              } else if (source != null && result == null) {
                  sout.println("# Wrong bundle null, expected " + source);
                  testFailed = true;
              } else if (!source.equals(result)) {
                  sout.println("# Wrong bundle " + result + ", expected " + source);
                  testFailed = true;
              }
          }

          private static void checkThrown(Throwable source, Throwable result) {
              if (source == null && result == null) {
                  // Ok
              } else if (source == null && result != null) {
                  sout.println("# Wrong thrown " + result + ", expected null");
                  testFailed = true;
              } else if (source != null && result == null) {
                  sout.println("# Wrong thrown null, expected " + source);
                  testFailed = true;
              } else if (!source.toString().equals(result.toString())) {
                  sout.println("# Wrong thrown " + result + ", expected " + source);
                  testFailed = true;
              }
          }

          private static void checkParameters(Object[] source, Object[] result) {
              if (source == null && result == null) {
                  // Ok
              } else if (source == null && result != null) {
                  sout.println("# Wrong parameters " + result + ", expected null");
                  testFailed = true;
              } else if (source != null && result == null) {
                  sout.println("# Wrong parameters null, expected " + source);
                  testFailed = true;
              } else if (source.length != result.length) {
                  sout.println("# Wrong parameters length " + result.length
                      + ", expected " + source.length);
                  testFailed = true;
              } else {
                  for (int j = 0; j < source.length; j++) {
                      if (source[j] == null && result[j] == null) {
                          // Ok
                      } else if (source[j] == null && result[j] != null) {
                          sout.println("# Wrong parameter " + result[j]
                              + ", expected null");
                          testFailed = true;
                      } else if (source[j] != null && result[j] == null) {
                          sout.println("# Wrong parameter null, expected "
                              + source[j]);
                          testFailed = true;
                      } else if (!(result[j] instanceof String)) {
                          sout.println("# Wrong parameter " + result[j]
                              + ", was not made a String");
                          testFailed = true;
                      } else if (!source[j].toString().equals(result[j])) {
                          sout.println("# Wrong parameter " + result[j]
                              + ", expected " + source[j]);
                          testFailed = true;
                      }
                  }
              }
          }

          public static int run(String args[], PrintStream out) {
              sout = out;
              if ((args.length > 0) && args[0].equals("-v")) {
                  verbose = true;
                  formatter = new SimpleFormatter();
              }

              // Build up test records
              records[1].setParameters(testParams);
              records[1].setLoggerName("fine");

              records[2].setLoggerName("nsk.logging.complex");
              records[2].setSourceClassName("java.util.logging.Level");
              records[2].setSourceMethodName("parse");
              records[2].setThrown(new NullPointerException());
              records[2].setResourceBundleName(testBundleName);
              records[2].setResourceBundle(ResourceBundle.getBundle(testBundleName));

              // Serialize the original LogRecord objects
              try {
                  FileOutputStream fo = new FileOutputStream(fileName);
                  ObjectOutputStream so = new ObjectOutputStream(fo);
                  so.writeObject(records);
                  so.flush();
                  so.close();
              } catch (Exception ex) {
                  out.println("# Unexpected exception " + ex + " while writing");
                  out.println(failMessage);
                  return FAILED;
              }

              // Deserialize into new LogRecord objects
              LogRecord newRecords[] = null;
              try {
                  FileInputStream fi = new FileInputStream(fileName);
                  ObjectInputStream si = new ObjectInputStream(fi);
                  newRecords = (LogRecord[]) si.readObject();
                  si.close();
                  File f = new File(fileName);
                  f.delete();
              } catch (Exception ex) {
                  out.println("# Unexpected exception " + ex + " while reading");
                  out.println(failMessage);
                  return FAILED;
              }

              // Check the results
              if (records == newRecords) {
                  out.println("# Array objects must not be the same");
                  testFailed = true;
              }
              if (records.length != newRecords.length) {
                  out.println("# Wrong results length" + newRecords.length
                      + ", expected " + records.length);
                  testFailed = true;
              }
              for (int i = 0; i < records.length; i++) {
                  LogRecord sr = records[i];
                  LogRecord rr = newRecords[i];
                  if (sr == rr) {
                      out.println("# Records must not be the same");
                      testFailed = true;
                  }
                  if (sr.getLevel() != rr.getLevel()) {
                      out.println("# Levels must be the same");
                      testFailed = true;
                  }
                  if (sr.getSequenceNumber() != rr.getSequenceNumber()) {
                      out.println("# Wrong sequenceNumber" + rr.getSequenceNumber()
                          + ", expected " + sr.getSequenceNumber());
                      testFailed = true;
                  }
                  if (sr.getThreadID() != rr.getThreadID()) {
                      out.println("# Wrong threadID " + rr.getThreadID()
                          + ", expected " + sr.getThreadID());
                      testFailed = true;
                  }
                  if (sr.getMillis() != rr.getMillis()) {
                      out.println("# Wrong millis " + rr.getMillis()
                          + ", expected " + sr.getMillis());
                      testFailed = true;
                  }
                  checkStr(sr.getMessage(), rr.getMessage(), "message");
                  checkStr(sr.getLoggerName(), rr.getLoggerName(), "loggerName");
                  checkStr(sr.getSourceClassName(), rr.getSourceClassName(),
                      "sourceClassName");
                  checkStr(sr.getSourceMethodName(), rr.getSourceMethodName(),
                      "sourceMethodName");
                  checkStr(sr.getResourceBundleName(), rr.getResourceBundleName(),
                      "ResourceBundleName");
                  checkBundle(sr.getResourceBundle(), rr.getResourceBundle());
                  checkThrown(sr.getThrown(), rr.getThrown());
                  checkStr(sr.getThrownBackTrace(), rr.getThrownBackTrace(),
                      "ThrownBackTrace");
                  checkParameters(sr.getParameters(), rr.getParameters());
                  if (verbose) {
                      out.println(formatter.format(sr));
                      out.println(formatter.format(rr));
                  }
              }

              if (testFailed) {
                  out.println(failMessage);
                  return FAILED;
              } else {
                  return PASSED;
              }
          }

          public static class TestBundle extends ListResourceBundle {
              public Object[][] getContents() {
                  return contents;
              }
              static final Object[][] contents = {
                  { "1", "one" },
                  { "2", "two" },
                  { "3", "three" }
              };
          }

          public static void main(String args[]) {
              // produce JCK-like exit status.
              System.exit(run(args, System.out) + JCK_STATUS_BASE);
          }
      }

      ======================================================================

      Name: elR10090 Date: 02/01/2001


      This bug affects the following testbase_nsk test:
          nsk/logging/LogRecord/Serialization/serializ001


      ======================================================================

            ghamiltosunw Graham Hamilton (Inactive)
            latkinsunw Latkin Latkin (Inactive)
            Votes:
            0 Vote for this issue
            Watchers:
            0 Start watching this issue

              Created:
              Updated:
              Resolved:
              Imported:
              Indexed: