6777487: Encoder allows reading private variables with certain names
Reviewed-by: peterz
--- a/jdk/src/share/classes/java/beans/MetaData.java Wed Apr 29 20:03:09 2009 +0400
+++ b/jdk/src/share/classes/java/beans/MetaData.java Wed Apr 29 20:55:13 2009 +0400
@@ -1,5 +1,5 @@
/*
- * Copyright 2000-2008 Sun Microsystems, Inc. All Rights Reserved.
+ * Copyright 2000-2009 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
@@ -333,31 +333,6 @@
return (oldC.size() == newC.size()) && oldC.containsAll(newC);
}
- static Object getPrivateField(final Object instance, final String name) {
- return AccessController.doPrivileged(
- new PrivilegedAction() {
- public Object run() {
- Class type = instance.getClass();
- while ( true ) {
- try {
- Field field = type.getDeclaredField(name);
- field.setAccessible(true);
- return field.get( instance );
- }
- catch (NoSuchFieldException exception) {
- type = type.getSuperclass();
- if (type == null) {
- throw new IllegalStateException("Could not find field " + name, exception);
- }
- }
- catch (Exception exception) {
- throw new IllegalStateException("Could not get value " + type.getName() + '.' + name, exception);
- }
- }
- }
- } );
- }
-
static final class EmptyList_PersistenceDelegate extends java_util_Collections {
protected Expression instantiate(Object oldInstance, Encoder out) {
return new Expression(oldInstance, Collections.class, "emptyList", null);
@@ -498,7 +473,7 @@
static final class CheckedCollection_PersistenceDelegate extends java_util_Collections {
protected Expression instantiate(Object oldInstance, Encoder out) {
- Object type = getPrivateField(oldInstance, "type");
+ Object type = MetaData.getPrivateFieldValue(oldInstance, "java.util.Collections$CheckedCollection.type");
List list = new ArrayList((Collection) oldInstance);
return new Expression(oldInstance, Collections.class, "checkedCollection", new Object[]{list, type});
}
@@ -506,7 +481,7 @@
static final class CheckedList_PersistenceDelegate extends java_util_Collections {
protected Expression instantiate(Object oldInstance, Encoder out) {
- Object type = getPrivateField(oldInstance, "type");
+ Object type = MetaData.getPrivateFieldValue(oldInstance, "java.util.Collections$CheckedCollection.type");
List list = new LinkedList((Collection) oldInstance);
return new Expression(oldInstance, Collections.class, "checkedList", new Object[]{list, type});
}
@@ -514,7 +489,7 @@
static final class CheckedRandomAccessList_PersistenceDelegate extends java_util_Collections {
protected Expression instantiate(Object oldInstance, Encoder out) {
- Object type = getPrivateField(oldInstance, "type");
+ Object type = MetaData.getPrivateFieldValue(oldInstance, "java.util.Collections$CheckedCollection.type");
List list = new ArrayList((Collection) oldInstance);
return new Expression(oldInstance, Collections.class, "checkedList", new Object[]{list, type});
}
@@ -522,7 +497,7 @@
static final class CheckedSet_PersistenceDelegate extends java_util_Collections {
protected Expression instantiate(Object oldInstance, Encoder out) {
- Object type = getPrivateField(oldInstance, "type");
+ Object type = MetaData.getPrivateFieldValue(oldInstance, "java.util.Collections$CheckedCollection.type");
Set set = new HashSet((Set) oldInstance);
return new Expression(oldInstance, Collections.class, "checkedSet", new Object[]{set, type});
}
@@ -530,7 +505,7 @@
static final class CheckedSortedSet_PersistenceDelegate extends java_util_Collections {
protected Expression instantiate(Object oldInstance, Encoder out) {
- Object type = getPrivateField(oldInstance, "type");
+ Object type = MetaData.getPrivateFieldValue(oldInstance, "java.util.Collections$CheckedCollection.type");
SortedSet set = new TreeSet((SortedSet) oldInstance);
return new Expression(oldInstance, Collections.class, "checkedSortedSet", new Object[]{set, type});
}
@@ -538,8 +513,8 @@
static final class CheckedMap_PersistenceDelegate extends java_util_Collections {
protected Expression instantiate(Object oldInstance, Encoder out) {
- Object keyType = getPrivateField(oldInstance, "keyType");
- Object valueType = getPrivateField(oldInstance, "valueType");
+ Object keyType = MetaData.getPrivateFieldValue(oldInstance, "java.util.Collections$CheckedMap.keyType");
+ Object valueType = MetaData.getPrivateFieldValue(oldInstance, "java.util.Collections$CheckedMap.valueType");
Map map = new HashMap((Map) oldInstance);
return new Expression(oldInstance, Collections.class, "checkedMap", new Object[]{map, keyType, valueType});
}
@@ -547,8 +522,8 @@
static final class CheckedSortedMap_PersistenceDelegate extends java_util_Collections {
protected Expression instantiate(Object oldInstance, Encoder out) {
- Object keyType = getPrivateField(oldInstance, "keyType");
- Object valueType = getPrivateField(oldInstance, "valueType");
+ Object keyType = MetaData.getPrivateFieldValue(oldInstance, "java.util.Collections$CheckedMap.keyType");
+ Object valueType = MetaData.getPrivateFieldValue(oldInstance, "java.util.Collections$CheckedMap.valueType");
SortedMap map = new TreeMap((SortedMap) oldInstance);
return new Expression(oldInstance, Collections.class, "checkedSortedMap", new Object[]{map, keyType, valueType});
}
@@ -570,7 +545,7 @@
}
private static Object getType(Object instance) {
- return java_util_Collections.getPrivateField(instance, "keyType");
+ return MetaData.getPrivateFieldValue(instance, "java.util.EnumMap.keyType");
}
}
@@ -589,7 +564,7 @@
}
private static Object getType(Object instance) {
- return java_util_Collections.getPrivateField(instance, "elementType");
+ return MetaData.getPrivateFieldValue(instance, "java.util.EnumSet.elementType");
}
}
@@ -1280,7 +1255,7 @@
private Integer getAxis(Object object) {
Box box = (Box) object;
- return (Integer) java_util_Collections.getPrivateField(box.getLayout(), "axis");
+ return (Integer) MetaData.getPrivateFieldValue(box.getLayout(), "javax.swing.BoxLayout.axis");
}
}
@@ -1363,6 +1338,7 @@
}
class MetaData {
+ private static final Map<String,Field> fields = Collections.synchronizedMap(new WeakHashMap<String, Field>());
private static Hashtable internalPersistenceDelegates = new Hashtable();
private static PersistenceDelegate nullPersistenceDelegate = new NullPersistenceDelegate();
@@ -1501,4 +1477,35 @@
return null;
}
}
+
+ static Object getPrivateFieldValue(Object instance, String name) {
+ Field field = fields.get(name);
+ if (field == null) {
+ int index = name.lastIndexOf('.');
+ final String className = name.substring(0, index);
+ final String fieldName = name.substring(1 + index);
+ field = AccessController.doPrivileged(new PrivilegedAction<Field>() {
+ public Field run() {
+ try {
+ Field field = Class.forName(className).getDeclaredField(fieldName);
+ field.setAccessible(true);
+ return field;
+ }
+ catch (ClassNotFoundException exception) {
+ throw new IllegalStateException("Could not find class", exception);
+ }
+ catch (NoSuchFieldException exception) {
+ throw new IllegalStateException("Could not find field", exception);
+ }
+ }
+ });
+ fields.put(name, field);
+ }
+ try {
+ return field.get(instance);
+ }
+ catch (IllegalAccessException exception) {
+ throw new IllegalStateException("Could not get value of the field", exception);
+ }
+ }
}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/beans/XMLEncoder/6777487/TestBox.java Wed Apr 29 20:55:13 2009 +0400
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2009 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 6777487
+ * @summary Tests private field access for BoxLayout
+ * @author Sergey Malenkov
+ */
+
+import java.awt.FlowLayout;
+import javax.swing.Box;
+import javax.swing.BoxLayout;
+
+public final class TestBox {
+ private static final Integer OBJECT = Integer.valueOf(-123);
+
+ public static void main(String[] args) {
+ TestEncoder.test(
+ new Box(BoxLayout.LINE_AXIS),
+ new Box(BoxLayout.PAGE_AXIS) {
+ @Override
+ public FlowLayout getLayout() {
+ return new FlowLayout() {
+ private final Object axis = OBJECT;
+ };
+ }
+ },
+ OBJECT
+ );
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/beans/XMLEncoder/6777487/TestCheckedCollection.java Wed Apr 29 20:55:13 2009 +0400
@@ -0,0 +1,48 @@
+/*
+ * Copyright 2009 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 6777487
+ * @summary Tests private field access for CheckedCollection
+ * @author Sergey Malenkov
+ */
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+public final class TestCheckedCollection {
+ private static final Object OBJECT = new Object();
+
+ public static void main(String[] args) {
+ List<String> list = Collections.emptyList();
+ TestEncoder.test(
+ Collections.checkedCollection(list, String.class),
+ new ArrayList() {
+ private final Object type = OBJECT;
+ },
+ OBJECT
+ );
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/beans/XMLEncoder/6777487/TestCheckedList.java Wed Apr 29 20:55:13 2009 +0400
@@ -0,0 +1,48 @@
+/*
+ * Copyright 2009 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 6777487
+ * @summary Tests private field access for CheckedList
+ * @author Sergey Malenkov
+ */
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+public final class TestCheckedList {
+ private static final Object OBJECT = new Object();
+
+ public static void main(String[] args) {
+ List<String> list = Collections.emptyList();
+ TestEncoder.test(
+ Collections.checkedList(list, String.class),
+ new ArrayList() {
+ private final Object type = OBJECT;
+ },
+ OBJECT
+ );
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/beans/XMLEncoder/6777487/TestCheckedMap.java Wed Apr 29 20:55:13 2009 +0400
@@ -0,0 +1,49 @@
+/*
+ * Copyright 2009 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 6777487
+ * @summary Tests private field access for CheckedMap
+ * @author Sergey Malenkov
+ */
+
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Map;
+
+public final class TestCheckedMap {
+ private static final Object OBJECT = new Object();
+
+ public static void main(String[] args) {
+ Map<String, String> map = Collections.emptyMap();
+ TestEncoder.test(
+ Collections.checkedMap(map, String.class, String.class),
+ new HashMap() {
+ private final Object keyType = OBJECT;
+ private final Object valueType = OBJECT;
+ },
+ OBJECT
+ );
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/beans/XMLEncoder/6777487/TestCheckedRandomAccessList.java Wed Apr 29 20:55:13 2009 +0400
@@ -0,0 +1,48 @@
+/*
+ * Copyright 2009 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 6777487
+ * @summary Tests private field access for CheckedRandomAccessList
+ * @author Sergey Malenkov
+ */
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+public final class TestCheckedRandomAccessList {
+ private static final Object OBJECT = new Object();
+
+ public static void main(String[] args) {
+ List<String> list = new ArrayList<String>();
+ TestEncoder.test(
+ Collections.checkedList(list, String.class),
+ new ArrayList() {
+ private final Object type = OBJECT;
+ },
+ OBJECT
+ );
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/beans/XMLEncoder/6777487/TestCheckedSet.java Wed Apr 29 20:55:13 2009 +0400
@@ -0,0 +1,48 @@
+/*
+ * Copyright 2009 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 6777487
+ * @summary Tests private field access for CheckedSet
+ * @author Sergey Malenkov
+ */
+
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.Set;
+
+public final class TestCheckedSet {
+ private static final Object OBJECT = new Object();
+
+ public static void main(String[] args) {
+ Set<String> set = Collections.emptySet();
+ TestEncoder.test(
+ Collections.checkedSet(set, String.class),
+ new HashSet() {
+ private final Object type = OBJECT;
+ },
+ OBJECT
+ );
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/beans/XMLEncoder/6777487/TestCheckedSortedMap.java Wed Apr 29 20:55:13 2009 +0400
@@ -0,0 +1,49 @@
+/*
+ * Copyright 2009 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 6777487
+ * @summary Tests private field access for CheckedSortedMap
+ * @author Sergey Malenkov
+ */
+
+import java.util.Collections;
+import java.util.SortedMap;
+import java.util.TreeMap;
+
+public final class TestCheckedSortedMap {
+ private static final Object OBJECT = new Object();
+
+ public static void main(String[] args) {
+ SortedMap<String, String> map = new TreeMap<String, String>();
+ TestEncoder.test(
+ Collections.checkedSortedMap(map, String.class, String.class),
+ new TreeMap() {
+ private final Object keyType = OBJECT;
+ private final Object valueType = OBJECT;
+ },
+ OBJECT
+ );
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/beans/XMLEncoder/6777487/TestCheckedSortedSet.java Wed Apr 29 20:55:13 2009 +0400
@@ -0,0 +1,48 @@
+/*
+ * Copyright 2009 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 6777487
+ * @summary Tests private field access for CheckedSortedSet
+ * @author Sergey Malenkov
+ */
+
+import java.util.Collections;
+import java.util.SortedSet;
+import java.util.TreeSet;
+
+public final class TestCheckedSortedSet {
+ private static final Object OBJECT = new Object();
+
+ public static void main(String[] args) {
+ SortedSet<String> set = new TreeSet<String>();
+ TestEncoder.test(
+ Collections.checkedSortedSet(set, String.class),
+ new TreeSet() {
+ private final Object type = OBJECT;
+ },
+ OBJECT
+ );
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/beans/XMLEncoder/6777487/TestEncoder.java Wed Apr 29 20:55:13 2009 +0400
@@ -0,0 +1,60 @@
+/*
+ * Copyright 2009 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.
+ */
+
+import java.beans.Expression;
+import java.beans.XMLEncoder;
+
+final class TestEncoder extends XMLEncoder {
+ private Expression expression;
+
+ private TestEncoder() {
+ super(System.out);
+ }
+
+ @Override
+ public void writeExpression(Expression expression) {
+ if (this.expression == null) {
+ this.expression = expression;
+ }
+ super.writeExpression(expression);
+ }
+
+ public static void test(Object provider, Object object, Object value) {
+ System.setSecurityManager(new SecurityManager());
+
+ TestEncoder encoder = new TestEncoder();
+ encoder.setPersistenceDelegate(
+ object.getClass(),
+ encoder.getPersistenceDelegate(provider.getClass()));
+ encoder.writeObject(object);
+ encoder.close();
+
+ if (encoder.expression != null) {
+ for (Object argument : encoder.expression.getArguments()) {
+ if (value.equals(argument)) {
+ throw new Error("Found private value!");
+ }
+ }
+ }
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/beans/XMLEncoder/6777487/TestEnumMap.java Wed Apr 29 20:55:13 2009 +0400
@@ -0,0 +1,47 @@
+/*
+ * Copyright 2009 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 6777487
+ * @summary Tests private field access for EnumMap
+ * @author Sergey Malenkov
+ */
+
+import java.util.EnumMap;
+import java.util.HashMap;
+
+public final class TestEnumMap {
+ private static final Object OBJECT = new Object();
+
+ public static void main(String[] args) {
+ TestEncoder.test(
+ new EnumMap<Point, String>(Point.class),
+ new HashMap() {
+ private final Object keyType = OBJECT;
+ },
+ OBJECT);
+ }
+
+ public enum Point { X, Y, Z }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/beans/XMLEncoder/6777487/TestEnumSet.java Wed Apr 29 20:55:13 2009 +0400
@@ -0,0 +1,47 @@
+/*
+ * Copyright 2009 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 6777487
+ * @summary Tests private field access for EnumSet
+ * @author Sergey Malenkov
+ */
+
+import java.util.EnumSet;
+import java.util.HashSet;
+
+public final class TestEnumSet {
+ private static final Object OBJECT = new Object();
+
+ public static void main(String[] args) {
+ TestEncoder.test(
+ EnumSet.noneOf(Point.class),
+ new HashSet() {
+ private final Object elementType = OBJECT;
+ },
+ OBJECT);
+ }
+
+ public enum Point { X, Y, Z }
+}