--- a/jdk/src/share/classes/java/lang/Class.java Tue Mar 03 19:50:59 2009 -0800
+++ b/jdk/src/share/classes/java/lang/Class.java Thu Mar 05 11:44:40 2009 -0800
@@ -3059,14 +3059,12 @@
}
- private static Annotation[] EMPTY_ANNOTATIONS_ARRAY = new Annotation[0];
-
/**
* @since 1.5
*/
public Annotation[] getAnnotations() {
initAnnotationsIfNecessary();
- return annotations.values().toArray(EMPTY_ANNOTATIONS_ARRAY);
+ return AnnotationParser.toArray(annotations);
}
/**
@@ -3074,7 +3072,7 @@
*/
public Annotation[] getDeclaredAnnotations() {
initAnnotationsIfNecessary();
- return declaredAnnotations.values().toArray(EMPTY_ANNOTATIONS_ARRAY);
+ return AnnotationParser.toArray(declaredAnnotations);
}
// Annotations cache
--- a/jdk/src/share/classes/java/lang/reflect/Constructor.java Tue Mar 03 19:50:59 2009 -0800
+++ b/jdk/src/share/classes/java/lang/reflect/Constructor.java Thu Mar 05 11:44:40 2009 -0800
@@ -626,13 +626,11 @@
return (T) declaredAnnotations().get(annotationClass);
}
- private static final Annotation[] EMPTY_ANNOTATION_ARRAY=new Annotation[0];
-
/**
* @since 1.5
*/
public Annotation[] getDeclaredAnnotations() {
- return declaredAnnotations().values().toArray(EMPTY_ANNOTATION_ARRAY);
+ return AnnotationParser.toArray(declaredAnnotations());
}
private transient Map<Class, Annotation> declaredAnnotations;
--- a/jdk/src/share/classes/java/lang/reflect/Field.java Tue Mar 03 19:50:59 2009 -0800
+++ b/jdk/src/share/classes/java/lang/reflect/Field.java Thu Mar 05 11:44:40 2009 -0800
@@ -1018,13 +1018,11 @@
return (T) declaredAnnotations().get(annotationClass);
}
- private static final Annotation[] EMPTY_ANNOTATION_ARRAY=new Annotation[0];
-
/**
* @since 1.5
*/
public Annotation[] getDeclaredAnnotations() {
- return declaredAnnotations().values().toArray(EMPTY_ANNOTATION_ARRAY);
+ return AnnotationParser.toArray(declaredAnnotations());
}
private transient Map<Class, Annotation> declaredAnnotations;
--- a/jdk/src/share/classes/java/lang/reflect/Method.java Tue Mar 03 19:50:59 2009 -0800
+++ b/jdk/src/share/classes/java/lang/reflect/Method.java Thu Mar 05 11:44:40 2009 -0800
@@ -705,13 +705,11 @@
return (T) declaredAnnotations().get(annotationClass);
}
- private static final Annotation[] EMPTY_ANNOTATION_ARRAY=new Annotation[0];
-
/**
* @since 1.5
*/
public Annotation[] getDeclaredAnnotations() {
- return declaredAnnotations().values().toArray(EMPTY_ANNOTATION_ARRAY);
+ return AnnotationParser.toArray(declaredAnnotations());
}
private transient Map<Class, Annotation> declaredAnnotations;
--- a/jdk/src/share/classes/java/net/SocketPermission.java Tue Mar 03 19:50:59 2009 -0800
+++ b/jdk/src/share/classes/java/net/SocketPermission.java Thu Mar 05 11:44:40 2009 -0800
@@ -113,7 +113,6 @@
* <p>Similarly, if the following permission:
*
* <pre>
- * p1 = new SocketPermission("puffin.eng.sun.com:7777", "connect,accept");
* p2 = new SocketPermission("localhost:1024-", "accept,connect,listen");
* </pre>
*
--- a/jdk/src/share/classes/java/util/ArrayList.java Tue Mar 03 19:50:59 2009 -0800
+++ b/jdk/src/share/classes/java/util/ArrayList.java Thu Mar 05 11:44:40 2009 -0800
@@ -179,7 +179,6 @@
modCount++;
int oldCapacity = elementData.length;
if (minCapacity > oldCapacity) {
- Object oldData[] = elementData;
int newCapacity = (oldCapacity * 3)/2 + 1;
if (newCapacity < minCapacity)
newCapacity = minCapacity;
--- a/jdk/src/share/classes/sun/misc/ClassLoaderUtil.java Tue Mar 03 19:50:59 2009 -0800
+++ b/jdk/src/share/classes/sun/misc/ClassLoaderUtil.java Thu Mar 05 11:44:40 2009 -0800
@@ -77,8 +77,6 @@
jarsClosed.clear();
}
- System.out.println ("classLoader = " + classLoader);
- System.out.println ("SharedSecrets.getJavaNetAccess()="+SharedSecrets.getJavaNetAccess());
URLClassPath ucp = SharedSecrets.getJavaNetAccess()
.getURLClassPath(classLoader);
ArrayList loaders = ucp.loaders;
--- a/jdk/src/share/classes/sun/reflect/annotation/AnnotationParser.java Tue Mar 03 19:50:59 2009 -0800
+++ b/jdk/src/share/classes/sun/reflect/annotation/AnnotationParser.java Thu Mar 05 11:44:40 2009 -0800
@@ -788,4 +788,16 @@
for (int i = 0; i < length; i++)
skipMemberValue(buf);
}
+
+ /*
+ * This method converts the annotation map returned by the parseAnnotations()
+ * method to an array. It is called by Field.getDeclaredAnnotations(),
+ * Method.getDeclaredAnnotations(), and Constructor.getDeclaredAnnotations().
+ * This avoids the reflection classes to load the Annotation class until
+ * it is needed.
+ */
+ private static final Annotation[] EMPTY_ANNOTATION_ARRAY = new Annotation[0];
+ public static Annotation[] toArray(Map<Class, Annotation> annotations) {
+ return annotations.values().toArray(EMPTY_ANNOTATION_ARRAY);
+ }
}
--- a/jdk/src/share/classes/sun/security/provider/SeedGenerator.java Tue Mar 03 19:50:59 2009 -0800
+++ b/jdk/src/share/classes/sun/security/provider/SeedGenerator.java Thu Mar 05 11:44:40 2009 -0800
@@ -1,5 +1,5 @@
/*
- * Copyright 1996-2006 Sun Microsystems, Inc. All Rights Reserved.
+ * Copyright 1996-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
@@ -68,6 +68,9 @@
import java.util.Properties;
import java.util.Enumeration;
import java.net.*;
+import java.nio.file.DirectoryStream;
+import java.nio.file.Path;
+import java.util.Random;
import sun.security.util.Debug;
abstract class SeedGenerator {
@@ -180,10 +183,27 @@
// The temporary dir
File f = new File(p.getProperty("java.io.tmpdir"));
- String[] sa = f.list();
- for(int i = 0; i < sa.length; i++)
- md.update(sa[i].getBytes());
-
+ int count = 0;
+ DirectoryStream<Path> ds
+ = f.toPath().newDirectoryStream();
+ try {
+ // We use a Random object to choose what file names
+ // should be used. Otherwise on a machine with too
+ // many files, the same first 1024 files always get
+ // used. Any, We make sure the first 512 files are
+ // always used.
+ Random r = new Random();
+ for (Path path: ds) {
+ if (count < 512 || r.nextBoolean()) {
+ md.update(path.getName().toString().getBytes());
+ }
+ if (count++ > 1024) {
+ break;
+ }
+ }
+ } finally {
+ ds.close();
+ }
} catch (Exception ex) {
md.update((byte)ex.hashCode());
}
--- a/jdk/src/share/classes/sun/security/tools/KeyTool.java Tue Mar 03 19:50:59 2009 -0800
+++ b/jdk/src/share/classes/sun/security/tools/KeyTool.java Thu Mar 05 11:44:40 2009 -0800
@@ -1910,7 +1910,9 @@
ObjectIdentifier oid = attr.getAttributeId();
if (oid.equals(PKCS9Attribute.EXTENSION_REQUEST_OID)) {
CertificateExtensions exts = (CertificateExtensions)attr.getAttributeValue();
- printExtensions(rb.getString("Extension Request:"), exts, out);
+ if (exts != null) {
+ printExtensions(rb.getString("Extension Request:"), exts, out);
+ }
} else {
out.println(attr.getAttributeId());
out.println(attr.getAttributeValue());
@@ -2495,7 +2497,9 @@
X509CertImpl.INFO);
CertificateExtensions exts = (CertificateExtensions)
certInfo.get(X509CertInfo.EXTENSIONS);
- printExtensions(rb.getString("Extensions: "), exts, out);
+ if (exts != null) {
+ printExtensions(rb.getString("Extensions: "), exts, out);
+ }
}
}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/sun/security/tools/keytool/NoExtNPE.sh Thu Mar 05 11:44:40 2009 -0800
@@ -0,0 +1,65 @@
+#
+# 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 6813402
+# @summary keytool cannot -printcert entries without extensions
+#
+# @run shell NoExtNPE.sh
+
+# set a few environment variables so that the shell-script can run stand-alone
+# in the source directory
+if [ "${TESTSRC}" = "" ] ; then
+ TESTSRC="."
+fi
+
+if [ "${TESTJAVA}" = "" ] ; then
+ echo "TESTJAVA not set. Test cannot execute."
+ echo "FAILED!!!"
+ exit 1
+fi
+
+# set platform-dependent variables
+OS=`uname -s`
+case "$OS" in
+ SunOS )
+ FILESEP="/"
+ ;;
+ Linux )
+ FILESEP="/"
+ ;;
+ Windows* )
+ FILESEP="\\"
+ ;;
+ * )
+ echo "Unrecognized system!"
+ exit 1;
+ ;;
+esac
+
+${TESTJAVA}${FILESEP}bin${FILESEP}keytool \
+ -list -v \
+ -keystore ${TESTSRC}${FILESEP}CloneKeyAskPassword.jks \
+ -storepass test123
+
+exit $?