--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/io/Serializable/checkModifiers/CheckModifiers.java Sat Dec 01 00:00:00 2007 +0000
@@ -0,0 +1,245 @@
+/*
+ * Copyright 1999 Sun Microsystems, Inc. All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+/* @test
+ * @bug 4214888
+ * @clean CheckModifiers TestClass1 TestClass2
+ * @build CheckModifiers
+ * @run main CheckModifiers
+ * @summary Make sure that serialpersistentFields data member is used to
+ * represent tyhe serializable fields only if it has the modfiers
+ * static, final, private and the type is ObjectStreamField.
+ * No need to check for static, as ObjectStreamField class is not
+ * serializable.
+ *
+ */
+
+import java.io.*;
+class TestClass1 implements Serializable {
+ // Missing the "final" modifier
+ private static ObjectStreamField[] serialPersistentFields = {
+ new ObjectStreamField("field1", Integer.class),
+ new ObjectStreamField("field2", Double.TYPE),
+ };
+
+ Integer field1;
+ double field2;
+ int field3;
+ String field4;
+
+ public TestClass1(Integer f1, double f2, int f3, String f4) {
+ field1 = f1;
+ field2 = f2;
+ field3 = f3;
+ field4 = f4;
+ }
+
+ private void readObject(ObjectInputStream ois)
+ throws IOException, ClassNotFoundException {
+ ObjectInputStream.GetField pfields = ois.readFields();
+
+ field1 = (Integer) pfields.get("field1", new Integer(100));
+ field2 = pfields.get("field2", 99.99);
+
+ /* These fields must be present in the stream */
+ try {
+ field3 = pfields.get("field3", 99);
+ System.out.println("Passes test 1a");
+ } catch(IllegalArgumentException e) {
+ throw new Error("data field: field3 not in the persistent stream");
+ }
+ try {
+ field4 = (String) pfields.get("field4", "Default string");
+ System.out.println("Passes test 1b");
+ } catch(IllegalArgumentException e) {
+ throw new Error("data field: field4 not in the persistent stream");
+ }
+ }
+};
+
+
+class TestClass2 implements Serializable {
+ // public instead of private
+ public static final ObjectStreamField[] serialPersistentFields = {
+ new ObjectStreamField("field1", Integer.class),
+ new ObjectStreamField("field2", Double.TYPE),
+ };
+
+ Integer field1;
+ double field2;
+ int field3;
+ String field4;
+
+ public TestClass2(Integer f1, double f2, int f3, String f4) {
+ field1 = f1;
+ field2 = f2;
+ field3 = f3;
+ field4 = f4;
+ }
+
+ private void readObject(ObjectInputStream ois)
+ throws IOException, ClassNotFoundException {
+ ObjectInputStream.GetField pfields = ois.readFields();
+
+ field1 = (Integer) pfields.get("field1", new Integer(100));
+ field2 = pfields.get("field2", 99.99);
+
+ /* These fields must be present in the stream */
+ try {
+ field3 = pfields.get("field3", 99);
+ System.out.println("Passes test 2a");
+ } catch(IllegalArgumentException e) {
+ throw new Error("data field: field3 not in the persistent stream");
+ }
+ try {
+ field4 = (String) pfields.get("field4", "Default string");
+ System.out.println("Passes test 2b");
+ } catch(IllegalArgumentException e) {
+ throw new Error("data field: field4 not in the persistent stream");
+ }
+ }
+};
+
+class TestClass3 implements Serializable{
+ // Not of type ObjectStreamField
+ private final String[] serialPersistentFields = {"Foo","Foobar"};;
+ Integer field1;
+ double field2;
+ int field3;
+ String field4;
+
+ public TestClass3(Integer f1, double f2, int f3, String f4) {
+ field1 = f1;
+ field2 = f2;
+ field3 = f3;
+ field4 = f4;
+ }
+
+ private void readObject(ObjectInputStream ois)
+ throws IOException, ClassNotFoundException {
+ ObjectInputStream.GetField pfields = ois.readFields();
+
+ field1 = (Integer) pfields.get("field1", new Integer(100));
+ field2 = pfields.get("field2", 99.99);
+ field3 = pfields.get("field3", 99);
+ field4 = (String) pfields.get("field4", "Default string");
+
+ try {
+ String[] tserialPersistentFields =
+ (String[])pfields.get("serialPersistentFields", null);
+ System.out.println("Passes test 3");
+ } catch(IllegalArgumentException e) {
+ throw new Error("non-static field: " +
+ "serialPersistentFields must be in the persistent stream");
+ }
+ }
+};
+
+class TestClass4 implements Serializable {
+ // Correct format
+ private static final ObjectStreamField[] serialPersistentFields = {
+ new ObjectStreamField("field1", Integer.class),
+ new ObjectStreamField("field2", Double.TYPE),
+ };
+
+ Integer field1;
+ double field2;
+ int field3;
+ String field4;
+
+ public TestClass4(Integer f1, double f2, int f3, String f4) {
+ field1 = f1;
+ field2 = f2;
+ field3 = f3;
+ field4 = f4;
+ }
+
+ private void readObject(ObjectInputStream ois)
+ throws IOException, ClassNotFoundException {
+ ObjectInputStream.GetField pfields = ois.readFields();
+
+ field1 = (Integer) pfields.get("field1", new Integer(100));
+ field2 = pfields.get("field2", 99.99);
+
+ try {
+ field3 = pfields.get("field3", 99);
+ throw new Error("data field: field3 in the persistent stream");
+ } catch(IllegalArgumentException e) {
+ System.out.println("Passes test 4a");
+ }
+ try {
+ field4 = (String) pfields.get("field4", "Default string");
+ throw new Error("data field: field4 in the persistent stream");
+ } catch(IllegalArgumentException e) {
+ System.out.println("Passes test 4b");
+ }
+ }
+};
+
+public class CheckModifiers {
+ public static void main(String[] args)
+ throws ClassNotFoundException, IOException{
+ TestClass1 tc1 = new TestClass1(new Integer(100), 25.56, 2000,
+ new String("Test modifiers of serialPersistentFields"));
+
+ TestClass2 tc2 = new TestClass2(new Integer(100), 25.56, 2000,
+ new String("Test modifiers of serialPersistentFields"));
+
+ TestClass3 tc3 = new TestClass3(new Integer(100), 25.56, 2000,
+ new String("Test Type of serialPersistentFields"));
+
+ TestClass4 tc4 = new TestClass4(new Integer(100), 25.56, 2000,
+ new String("Test modifiers of serialPersistentFields"));
+
+
+ FileOutputStream fos = new FileOutputStream("fields.ser");
+ ObjectOutputStream oos = new ObjectOutputStream(fos);
+
+ System.out.println("Writing obj 1");
+ oos.writeObject(tc1);
+ System.out.println("Writing obj 2");
+ oos.writeObject(tc2);
+ System.out.println("Writing obj 3");
+ oos.writeObject(tc3);
+ System.out.println("Writing obj 4");
+ oos.writeObject(tc4);
+
+ FileInputStream fis = new FileInputStream("fields.ser");
+ ObjectInputStream ois = new ObjectInputStream(fis);
+
+
+ System.out.println("Test modifiers for serialPeristentFields ");
+ System.out.println("---------------------------------------- ");
+ System.out.println("Declaration missing final modifier");
+ ois.readObject();
+ System.out.println();
+ System.out.println("Declaration with public instead of private access");
+ ois.readObject();
+ System.out.println();
+ System.out.println("Declaration with different type");
+ ois.readObject();
+ System.out.println();
+ System.out.println("Declaration as in specification");
+ ois.readObject();
+ }
+};