--- a/jdk/make/CompileDemos.gmk Thu May 21 10:07:38 2015 -0700
+++ b/jdk/make/CompileDemos.gmk Thu May 21 16:20:20 2015 -0700
@@ -30,6 +30,7 @@
include JavaCompilation.gmk
include NativeCompilation.gmk
include SetupJavaCompilers.gmk
+include TextFileProcessing.gmk
# Prepare the find cache.
$(eval $(call FillCacheFind, $(JDK_TOPDIR)/src))
@@ -49,6 +50,15 @@
##################################################################################################
+# This rule will be depended on due to the MANIFEST line
+$(eval $(call SetupTextFileProcessing, BUILD_JAVA_MANIFEST, \
+ SOURCE_FILES := $(JDK_TOPDIR)/make/data/mainmanifest/manifest.mf, \
+ OUTPUT_FILE := $(SUPPORT_OUTPUTDIR)/demo/java-main-manifest.mf, \
+ REPLACEMENTS := \
+ @@RELEASE@@ => $(RELEASE) ; \
+ @@COMPANY_NAME@@ => $(COMPANY_NAME) , \
+))
+
define SetupAppletDemo
$$(eval $$(call SetupJavaCompilation,BUILD_DEMO_APPLET_$1, \
SETUP := GENERATE_USINGJDKBYTECODE, \
@@ -122,7 +132,7 @@
COPY := $(PATTERNS_TO_COPY) $(10), \
JAR := $(SUPPORT_OUTPUTDIR)/demo/image/$2/$1/$$($1_JARFILE), \
JARMAIN := $4, \
- MANIFEST := $(JDK_TOPDIR)/make/data/mainmanifest/manifest.mf, \
+ MANIFEST := $(SUPPORT_OUTPUTDIR)/demo/java-main-manifest.mf, \
EXTRA_MANIFEST_ATTR := $(11), \
SRCZIP := $(SUPPORT_OUTPUTDIR)/demo/image/$2/$1/src.zip, \
EXCLUDE_FILES := $9, \
@@ -290,7 +300,7 @@
COPY := $(PATTERNS_TO_COPY), \
JAR := $(SUPPORT_OUTPUTDIR)/demo/image/jvmti/$1/$1.jar, \
EXTRA_MANIFEST_ATTR := Main-Class: \n, \
- MANIFEST := $(JDK_TOPDIR)/make/data/mainmanifest/manifest.mf))
+ MANIFEST := $(SUPPORT_OUTPUTDIR)/demo/java-main-manifest.mf))
BUILD_DEMOS += $(SUPPORT_OUTPUTDIR)/demo/image/jvmti/$1/$1.jar
endif
@@ -382,7 +392,7 @@
BIN := $(SUPPORT_OUTPUTDIR)/demo/classes/jni/Poller, \
HEADERS := $(SUPPORT_OUTPUTDIR)/demo/classes/jni/Poller, \
JAR := $(SUPPORT_OUTPUTDIR)/demo/image/jni/Poller/Poller.jar, \
- MANIFEST := $(JDK_TOPDIR)/make/data/mainmanifest/manifest.mf, \
+ MANIFEST := $(SUPPORT_OUTPUTDIR)/demo/java-main-manifest.mf, \
SRCZIP := $(SUPPORT_OUTPUTDIR)/demo/image/jni/Poller/src.zip, \
COPY := README.txt Poller.c, \
JARMAIN := Client))
--- a/jdk/make/launcher/Launcher-jdk.dev.gmk Thu May 21 10:07:38 2015 -0700
+++ b/jdk/make/launcher/Launcher-jdk.dev.gmk Thu May 21 16:20:20 2015 -0700
@@ -33,9 +33,6 @@
$(eval $(call SetupLauncher,jimage,\
-DJAVA_ARGS='{ "-J-ms8m"$(COMMA) "jdk.tools.jimage.Main"$(COMMA) }'))
-$(eval $(call SetupLauncher,jhat, \
- -DJAVA_ARGS='{ "-J-ms8m"$(COMMA) "com.sun.tools.hat.Main"$(COMMA) }'))
-
$(eval $(call SetupLauncher,native2ascii, \
-DJAVA_ARGS='{ "-J-ms8m"$(COMMA) "sun.tools.native2ascii.Main"$(COMMA) }'))
--- a/jdk/make/lib/Lib-jdk.attach.gmk Thu May 21 10:07:38 2015 -0700
+++ b/jdk/make/lib/Lib-jdk.attach.gmk Thu May 21 16:20:20 2015 -0700
@@ -27,6 +27,12 @@
################################################################################
+ifeq ($(OPENJDK_TARGET_OS), windows)
+ # In (at least) VS2013 and later, -DPSAPI_VERSION=1 is needed to generate
+ # a binary that is compatible with windows versions older than 7/2008R2.
+ # See MSDN documentation for GetProcessMemoryInfo for more information.
+ LIBATTACH_CFLAGS := -DPSAPI_VERSION=1
+endif
$(eval $(call SetupNativeCompilation,BUILD_LIBATTACH, \
LIBRARY := attach, \
@@ -35,7 +41,7 @@
OPTIMIZATION := LOW, \
CFLAGS := $(CFLAGS_JDKLIB) $(CFLAGS_WARNINGS_ARE_ERRORS) \
-I$(SUPPORT_OUTPUTDIR)/headers/jdk.attach \
- $(LIBJAVA_HEADER_FLAGS), \
+ $(LIBJAVA_HEADER_FLAGS) $(LIBATTACH_CFLAGS), \
CFLAGS_windows := /Gy, \
MAPFILE := $(JDK_TOPDIR)/make/mapfiles/libattach/mapfile-$(OPENJDK_TARGET_OS), \
VERSIONINFO_RESOURCE := $(GLOBAL_VERSION_INFO_RESOURCE), \
--- a/jdk/make/lib/Lib-jdk.management.gmk Thu May 21 10:07:38 2015 -0700
+++ b/jdk/make/lib/Lib-jdk.management.gmk Thu May 21 16:20:20 2015 -0700
@@ -39,10 +39,12 @@
$(LIBJAVA_HEADER_FLAGS) \
#
-# In (at least) VS2013 and later, -DPSAPI_VERSION=1 is needed to generate
-# a binary that is compatible with windows versions older than 7/2008R2.
-# See MSDN documentation for GetProcessMemoryInfo for more information.
-BUILD_LIBMANAGEMENT_EXT_CFLAGS += -DPSAPI_VERSION=1
+ifeq ($(OPENJDK_TARGET_OS), windows)
+ # In (at least) VS2013 and later, -DPSAPI_VERSION=1 is needed to generate
+ # a binary that is compatible with windows versions older than 7/2008R2.
+ # See MSDN documentation for GetProcessMemoryInfo for more information.
+ LIBMANAGEMENT_EXT_CFLAGS += -DPSAPI_VERSION=1
+endif
LIBMANAGEMENT_EXT_OPTIMIZATION := HIGH
ifneq ($(findstring $(OPENJDK_TARGET_OS), solaris linux), )
--- a/jdk/make/src/classes/build/tools/module/boot.modules Thu May 21 10:07:38 2015 -0700
+++ b/jdk/make/src/classes/build/tools/module/boot.modules Thu May 21 16:20:20 2015 -0700
@@ -24,6 +24,7 @@
jdk.jfr
jdk.management
jdk.management.cmm
+jdk.management.resource
jdk.naming.rmi
jdk.sctp
jdk.security.auth
--- a/jdk/src/demo/share/applets.html Thu May 21 10:07:38 2015 -0700
+++ b/jdk/src/demo/share/applets.html Thu May 21 16:20:20 2015 -0700
@@ -56,8 +56,7 @@
</TR>
<TR>
-<TD ALIGN=RIGHT COLSPAN="2"><!-- page headline --><!-------------------------------><!--EDIT THE PAGE HEADLINE HERE--><!------------BEGIN-HEADLINE-----><FONT SIZE=+2>JAVA</FONT><SUP><FONT SIZE=-2>TM</FONT></SUP><FONT SIZE=+2>
-PLUG-IN</FONT>
+<TD ALIGN=RIGHT COLSPAN="2"><!-- page headline --><!-------------------------------><!--EDIT THE PAGE HEADLINE HERE--><!------------BEGIN-HEADLINE-----><FONT SIZE=+2>JAVA™ PLUG-IN</FONT>
<BR><B>Demonstration Applets</B>
<BR><!-------------END-HEADLINE------><!-- END OF PAGE HEADLINE --><!-------------------------------></TD>
</TR>
--- a/jdk/src/demo/share/jvmti/index.html Thu May 21 10:07:38 2015 -0700
+++ b/jdk/src/demo/share/jvmti/index.html Thu May 21 16:20:20 2015 -0700
@@ -5,7 +5,7 @@
<p>
The
-Java<sup><font size=-2>TM</font></sup> Virtual Machine Tools Interface (JVM TI)
+Java™ Virtual Machine Tools Interface (JVM TI)
is a native tool interface provided in JDK 5.0 and newer.
Native libraries that use JVM TI and are loaded into the
Java Virtual Machine
--- a/jdk/src/java.base/share/classes/java/lang/Boolean.java Thu May 21 10:07:38 2015 -0700
+++ b/jdk/src/java.base/share/classes/java/lang/Boolean.java Thu May 21 16:20:20 2015 -0700
@@ -230,13 +230,12 @@
}
/**
- * Returns {@code true} if and only if the system property
- * named by the argument exists and is equal to the string
- * {@code "true"}. (Beginning with version 1.0.2 of the
- * Java<small><sup>TM</sup></small> platform, the test of
- * this string is case insensitive.) A system property is accessible
- * through {@code getProperty}, a method defined by the
- * {@code System} class.
+ * Returns {@code true} if and only if the system property named
+ * by the argument exists and is equal to the string {@code
+ * "true"}. (Beginning with version 1.0.2 of the Java™
+ * platform, the test of this string is case insensitive.) A
+ * system property is accessible through {@code getProperty}, a
+ * method defined by the {@code System} class.
* <p>
* If there is no property with the specified name, or if the specified
* name is empty or null, then {@code false} is returned.
--- a/jdk/src/java.base/share/classes/java/lang/Character.java Thu May 21 10:07:38 2015 -0700
+++ b/jdk/src/java.base/share/classes/java/lang/Character.java Thu May 21 16:20:20 2015 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2002, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2002, 2015, Oracle and/or its affiliates. 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
@@ -645,8 +645,14 @@
* @since 1.2
*/
public static final class UnicodeBlock extends Subset {
-
- private static Map<String, UnicodeBlock> map = new HashMap<>(256);
+ /**
+ * 510 - the expected number of enteties
+ * 0.75 - the default load factor of HashMap
+ */
+ private static final int INITIAL_CAPACITY =
+ (int)(510 / 0.75f + 1.0f);
+ private static Map<String, UnicodeBlock> map =
+ new HashMap<>(INITIAL_CAPACITY);
/**
* Creates a UnicodeBlock with the given identifier name.
--- a/jdk/src/java.base/share/classes/java/lang/Long.java Thu May 21 10:07:38 2015 -0700
+++ b/jdk/src/java.base/share/classes/java/lang/Long.java Thu May 21 16:20:20 2015 -0700
@@ -1708,7 +1708,7 @@
* @since 1.5
*/
public static int bitCount(long i) {
- // HD, Figure 5-14
+ // HD, Figure 5-2
i = i - ((i >>> 1) & 0x5555555555555555L);
i = (i & 0x3333333333333333L) + ((i >>> 2) & 0x3333333333333333L);
i = (i + (i >>> 4)) & 0x0f0f0f0f0f0f0f0fL;
--- a/jdk/src/java.base/share/classes/java/lang/String.java Thu May 21 10:07:38 2015 -0700
+++ b/jdk/src/java.base/share/classes/java/lang/String.java Thu May 21 16:20:20 2015 -0700
@@ -179,7 +179,7 @@
* not affect the newly created string.
*
* @param value
- * Array that is the source of characters
+ * Array that is the source of characters
*
* @param offset
* The initial offset
@@ -208,7 +208,7 @@
if (offset > value.length - count) {
throw new StringIndexOutOfBoundsException(offset + count);
}
- this.value = Arrays.copyOfRange(value, offset, offset+count);
+ this.value = Arrays.copyOfRange(value, offset, offset + count);
}
/**
@@ -262,11 +262,11 @@
// Pass 1: Compute precise size of char[]
int n = count;
for (int i = offset; i < end; i++) {
- int c = codePoints[i];
- if (Character.isBmpCodePoint(c))
- continue;
- else if (Character.isValidCodePoint(c))
- n++;
+ int c = codePoints[i];
+ if (Character.isBmpCodePoint(c))
+ continue;
+ else if (Character.isValidCodePoint(c))
+ n++;
else throw new IllegalArgumentException(Integer.toString(c));
}
@@ -327,7 +327,7 @@
@Deprecated
public String(byte ascii[], int hibyte, int offset, int count) {
checkBounds(ascii, offset, count);
- char value[] = new char[count];
+ char[] value = new char[count];
if (hibyte == 0) {
for (int i = count; i-- > 0;) {
@@ -465,7 +465,7 @@
if (charset == null)
throw new NullPointerException("charset");
checkBounds(bytes, offset, length);
- this.value = StringCoding.decode(charset, bytes, offset, length);
+ this.value = StringCoding.decode(charset, bytes, offset, length);
}
/**
@@ -567,7 +567,7 @@
*
* @since 1.1
*/
- public String(byte bytes[]) {
+ public String(byte[] bytes) {
this(bytes, 0, bytes.length);
}
@@ -983,11 +983,10 @@
return true;
}
if (anObject instanceof String) {
- String anotherString = (String)anObject;
- int n = value.length;
- if (n == anotherString.value.length) {
- char v1[] = value;
- char v2[] = anotherString.value;
+ char[] v1 = value;
+ char[] v2 = ((String)anObject).value;
+ int n = v1.length;
+ if (n == v2.length) {
int i = 0;
while (n-- != 0) {
if (v1[i] != v2[i])
@@ -1020,8 +1019,8 @@
}
private boolean nonSyncContentEquals(AbstractStringBuilder sb) {
- char v1[] = value;
- char v2[] = sb.getValue();
+ char[] v1 = value;
+ char[] v2 = sb.getValue();
int n = v1.length;
if (n != sb.length()) {
return false;
@@ -1066,7 +1065,7 @@
return equals(cs);
}
// Argument is a generic CharSequence
- char v1[] = value;
+ char[] v1 = value;
int n = v1.length;
if (n != cs.length()) {
return false;
@@ -1156,20 +1155,18 @@
* lexicographically greater than the string argument.
*/
public int compareTo(String anotherString) {
- int len1 = value.length;
- int len2 = anotherString.value.length;
+ char[] v1 = value;
+ char[] v2 = anotherString.value;
+ int len1 = v1.length;
+ int len2 = v2.length;
int lim = Math.min(len1, len2);
- char v1[] = value;
- char v2[] = anotherString.value;
- int k = 0;
- while (k < lim) {
+ for (int k = 0; k < lim; k++) {
char c1 = v1[k];
char c2 = v2[k];
if (c1 != c2) {
return c1 - c2;
}
- k++;
}
return len1 - len2;
}
@@ -1278,14 +1275,14 @@
*/
public boolean regionMatches(int toffset, String other, int ooffset,
int len) {
- char ta[] = value;
+ char[] ta = value;
int to = toffset;
- char pa[] = other.value;
+ char[] pa = other.value;
int po = ooffset;
// Note: toffset, ooffset, or len might be near -1>>>1.
if ((ooffset < 0) || (toffset < 0)
- || (toffset > (long)value.length - len)
- || (ooffset > (long)other.value.length - len)) {
+ || (toffset > (long)ta.length - len)
+ || (ooffset > (long)pa.length - len)) {
return false;
}
while (len-- > 0) {
@@ -1348,14 +1345,14 @@
*/
public boolean regionMatches(boolean ignoreCase, int toffset,
String other, int ooffset, int len) {
- char ta[] = value;
+ char[] ta = value;
int to = toffset;
- char pa[] = other.value;
+ char[] pa = other.value;
int po = ooffset;
// Note: toffset, ooffset, or len might be near -1>>>1.
if ((ooffset < 0) || (toffset < 0)
- || (toffset > (long)value.length - len)
- || (ooffset > (long)other.value.length - len)) {
+ || (toffset > (long)ta.length - len)
+ || (ooffset > (long)pa.length - len)) {
return false;
}
while (len-- > 0) {
@@ -1405,13 +1402,13 @@
* </pre>
*/
public boolean startsWith(String prefix, int toffset) {
- char ta[] = value;
+ char[] ta = value;
int to = toffset;
- char pa[] = prefix.value;
+ char[] pa = prefix.value;
int po = 0;
- int pc = prefix.value.length;
+ int pc = pa.length;
// Note: toffset might be near -1>>>1.
- if ((toffset < 0) || (toffset > value.length - pc)) {
+ if ((toffset < 0) || (toffset > ta.length - pc)) {
return false;
}
while (--pc >= 0) {
@@ -1473,7 +1470,9 @@
for (char v : value) {
h = 31 * h + v;
}
- hash = h;
+ if (h != 0) {
+ hash = h;
+ }
}
return h;
}
@@ -1928,14 +1927,17 @@
* length of this {@code String} object.
*/
public String substring(int beginIndex) {
- if (beginIndex < 0) {
- throw new StringIndexOutOfBoundsException(beginIndex);
+ if (beginIndex <= 0) {
+ if (beginIndex < 0) {
+ throw new StringIndexOutOfBoundsException(beginIndex);
+ }
+ return this;
}
int subLen = value.length - beginIndex;
if (subLen < 0) {
throw new StringIndexOutOfBoundsException(subLen);
}
- return (beginIndex == 0) ? this : new String(value, beginIndex, subLen);
+ return new String(value, beginIndex, subLen);
}
/**
@@ -1961,8 +1963,13 @@
* {@code endIndex}.
*/
public String substring(int beginIndex, int endIndex) {
- if (beginIndex < 0) {
- throw new StringIndexOutOfBoundsException(beginIndex);
+ if (beginIndex <= 0) {
+ if (beginIndex < 0) {
+ throw new StringIndexOutOfBoundsException(beginIndex);
+ }
+ if (endIndex == value.length) {
+ return this;
+ }
}
if (endIndex > value.length) {
throw new StringIndexOutOfBoundsException(endIndex);
@@ -1971,8 +1978,7 @@
if (subLen < 0) {
throw new StringIndexOutOfBoundsException(subLen);
}
- return ((beginIndex == 0) && (endIndex == value.length)) ? this
- : new String(value, beginIndex, subLen);
+ return new String(value, beginIndex, subLen);
}
/**
@@ -2034,7 +2040,7 @@
return this;
}
int len = value.length;
- char buf[] = Arrays.copyOf(value, len + otherLen);
+ char[] buf = Arrays.copyOf(value, len + otherLen);
str.getChars(buf, len);
return new String(buf, true);
}
@@ -2070,9 +2076,9 @@
*/
public String replace(char oldChar, char newChar) {
if (oldChar != newChar) {
- int len = value.length;
+ char[] val = value; /* avoid getfield opcode */
+ int len = val.length;
int i = -1;
- char[] val = value; /* avoid getfield opcode */
while (++i < len) {
if (val[i] == oldChar) {
@@ -2080,7 +2086,7 @@
}
}
if (i < len) {
- char buf[] = new char[len];
+ char[] buf = new char[len];
for (int j = 0; j < i; j++) {
buf[j] = val[j];
}
@@ -2876,17 +2882,17 @@
* trailing white space.
*/
public String trim() {
- int len = value.length;
- int st = 0;
char[] val = value; /* avoid getfield opcode */
+ int end = val.length;
+ int beg = 0;
- while ((st < len) && (val[st] <= ' ')) {
- st++;
+ while ((beg < end) && (val[beg] <= ' ')) {
+ beg++;
}
- while ((st < len) && (val[len - 1] <= ' ')) {
- len--;
+ while ((beg < end) && (val[end - 1] <= ' ')) {
+ end--;
}
- return ((st > 0) || (len < value.length)) ? substring(st, len) : this;
+ return substring(beg, end);
}
/**
@@ -3081,7 +3087,7 @@
*/
public char[] toCharArray() {
// Cannot use Arrays.copyOf because of class initialization order issues
- char result[] = new char[value.length];
+ char[] result = new char[value.length];
System.arraycopy(value, 0, result, 0, value.length);
return result;
}
@@ -3266,8 +3272,7 @@
* as its single character the argument {@code c}.
*/
public static String valueOf(char c) {
- char data[] = {c};
- return new String(data, true);
+ return new String(new char[]{c}, true);
}
/**
--- a/jdk/src/java.base/share/classes/java/security/ProtectionDomain.java Thu May 21 10:07:38 2015 -0700
+++ b/jdk/src/java.base/share/classes/java/security/ProtectionDomain.java Thu May 21 16:20:20 2015 -0700
@@ -25,23 +25,24 @@
package java.security;
+import java.lang.ref.Reference;
+import java.lang.ref.ReferenceQueue;
import java.lang.ref.WeakReference;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.List;
import java.util.Map;
import java.util.WeakHashMap;
+import java.util.concurrent.ConcurrentHashMap;
+import sun.misc.JavaSecurityAccess;
import sun.misc.JavaSecurityProtectionDomainAccess;
import static sun.misc.JavaSecurityProtectionDomainAccess.ProtectionDomainCache;
+import sun.misc.SharedSecrets;
import sun.security.util.Debug;
import sun.security.util.SecurityConstants;
-import sun.misc.JavaSecurityAccess;
-import sun.misc.SharedSecrets;
/**
- *
- *<p>
- * This ProtectionDomain class encapsulates the characteristics of a domain,
+ * The ProtectionDomain class encapsulates the characteristics of a domain,
* which encloses a set of classes whose instances are granted a set
* of permissions when being executed on behalf of a given set of Principals.
* <p>
@@ -58,6 +59,7 @@
*/
public class ProtectionDomain {
+
private static class JavaSecurityAccessImpl implements JavaSecurityAccess {
private JavaSecurityAccessImpl() {
@@ -86,18 +88,33 @@
AccessController.getContext(), context);
}
- private static AccessControlContext getCombinedACC(AccessControlContext context, AccessControlContext stack) {
- AccessControlContext acc = new AccessControlContext(context, stack.getCombiner(), true);
+ private static AccessControlContext getCombinedACC(
+ AccessControlContext context, AccessControlContext stack) {
+ AccessControlContext acc =
+ new AccessControlContext(context, stack.getCombiner(), true);
return new AccessControlContext(stack.getContext(), acc).optimize();
}
}
static {
- // Set up JavaSecurityAccess in SharedSecrets
+ // setup SharedSecrets to allow access to doIntersectionPrivilege
+ // methods and ProtectionDomain cache
SharedSecrets.setJavaSecurityAccess(new JavaSecurityAccessImpl());
+ SharedSecrets.setJavaSecurityProtectionDomainAccess(
+ new JavaSecurityProtectionDomainAccess() {
+ @Override
+ public ProtectionDomainCache getProtectionDomainCache() {
+ return new PDCache();
+ }
+ });
}
+ /**
+ * Used for storing ProtectionDomains as keys in a Map.
+ */
+ static final class Key {}
+
/* CodeSource */
private CodeSource codesource ;
@@ -451,40 +468,104 @@
}
/**
- * Used for storing ProtectionDomains as keys in a Map.
+ * A cache of ProtectionDomains and their Permissions.
+ *
+ * This class stores ProtectionDomains as weak keys in a ConcurrentHashMap
+ * with additional support for checking and removing weak keys that are no
+ * longer in use.
*/
- final static class Key {}
-
- // A cache of ProtectionDomains and their Permissions
private static class PDCache implements ProtectionDomainCache {
- // We must wrap the PermissionCollection in a WeakReference as there
- // are some PermissionCollections which contain strong references
- // back to a ProtectionDomain and otherwise would never be removed
- // from the WeakHashMap
- private final Map<Key, WeakReference<PermissionCollection>>
- map = new WeakHashMap<>();
+ private final ConcurrentHashMap<WeakProtectionDomainKey,
+ PermissionCollection>
+ pdMap = new ConcurrentHashMap<>();
+ private final ReferenceQueue<Key> queue = new ReferenceQueue<>();
@Override
- public synchronized void put(ProtectionDomain pd,
- PermissionCollection pc) {
- map.put(pd == null ? null : pd.key, new WeakReference<>(pc));
+ public void put(ProtectionDomain pd, PermissionCollection pc) {
+ processQueue(queue, pdMap);
+ WeakProtectionDomainKey weakPd =
+ new WeakProtectionDomainKey(pd, queue);
+ pdMap.putIfAbsent(weakPd, pc);
}
@Override
- public synchronized PermissionCollection get(ProtectionDomain pd) {
- WeakReference<PermissionCollection> ref =
- map.get(pd == null ? null : pd.key);
- return ref == null ? null : ref.get();
+ public PermissionCollection get(ProtectionDomain pd) {
+ processQueue(queue, pdMap);
+ WeakProtectionDomainKey weakPd =
+ new WeakProtectionDomainKey(pd, queue);
+ return pdMap.get(weakPd);
+ }
+
+ /**
+ * Removes weak keys from the map that have been enqueued
+ * on the reference queue and are no longer in use.
+ */
+ private static void processQueue(ReferenceQueue<Key> queue,
+ ConcurrentHashMap<? extends
+ WeakReference<Key>, ?> pdMap) {
+ Reference<? extends Key> ref;
+ while ((ref = queue.poll()) != null) {
+ pdMap.remove(ref);
+ }
}
}
- static {
- SharedSecrets.setJavaSecurityProtectionDomainAccess(
- new JavaSecurityProtectionDomainAccess() {
- @Override
- public ProtectionDomainCache getProtectionDomainCache() {
- return new PDCache();
- }
- });
+ /**
+ * A weak key for a ProtectionDomain.
+ */
+ private static class WeakProtectionDomainKey extends WeakReference<Key> {
+ /**
+ * Saved value of the referent's identity hash code, to maintain
+ * a consistent hash code after the referent has been cleared
+ */
+ private final int hash;
+
+ /**
+ * A key representing a null ProtectionDomain.
+ */
+ private static final Key NULL_KEY = new Key();
+
+ /**
+ * Create a new WeakProtectionDomain with the specified domain and
+ * registered with a queue.
+ */
+ WeakProtectionDomainKey(ProtectionDomain pd, ReferenceQueue<Key> rq) {
+ this((pd == null ? NULL_KEY : pd.key), rq);
+ }
+
+ private WeakProtectionDomainKey(Key key, ReferenceQueue<Key> rq) {
+ super(key, rq);
+ hash = key.hashCode();
+ }
+
+ /**
+ * Returns the identity hash code of the original referent.
+ */
+ @Override
+ public int hashCode() {
+ return hash;
+ }
+
+ /**
+ * Returns true if the given object is an identical
+ * WeakProtectionDomainKey instance, or, if this object's referent
+ * has not been cleared and the given object is another
+ * WeakProtectionDomainKey instance with an identical non-null
+ * referent as this one.
+ */
+ @Override
+ public boolean equals(Object obj) {
+ if (obj == this) {
+ return true;
+ }
+
+ if (obj instanceof WeakProtectionDomainKey) {
+ Object referent = get();
+ return (referent != null) &&
+ (referent == ((WeakProtectionDomainKey)obj).get());
+ } else {
+ return false;
+ }
+ }
}
}
--- a/jdk/src/java.base/share/classes/java/text/ChoiceFormat.java Thu May 21 10:07:38 2015 -0700
+++ b/jdk/src/java.base/share/classes/java/text/ChoiceFormat.java Thu May 21 16:20:20 2015 -0700
@@ -490,7 +490,7 @@
}
/**
- * Equality comparision between two
+ * Equality comparison between two
*/
public boolean equals(Object obj) {
if (obj == null) return false;
--- a/jdk/src/java.base/share/classes/java/util/ArrayPrefixHelpers.java Thu May 21 10:07:38 2015 -0700
+++ b/jdk/src/java.base/share/classes/java/util/ArrayPrefixHelpers.java Thu May 21 16:20:20 2015 -0700
@@ -85,7 +85,7 @@
*
* As usual for this sort of utility, there are 4 versions, that
* are simple copy/paste/adapt variants of each other. (The
- * double and int versions differ from long version soley by
+ * double and int versions differ from long version solely by
* replacing "long" (with case-matching)).
*/
--- a/jdk/src/java.base/share/classes/java/util/Calendar.java Thu May 21 10:07:38 2015 -0700
+++ b/jdk/src/java.base/share/classes/java/util/Calendar.java Thu May 21 16:20:20 2015 -0700
@@ -1172,7 +1172,7 @@
* {@code fieldValuePairs} that are pairs of a field and its value.
* For example,
* <pre>
- * setFeilds(Calendar.YEAR, 2013,
+ * setFields(Calendar.YEAR, 2013,
* Calendar.MONTH, Calendar.DECEMBER,
* Calendar.DAY_OF_MONTH, 23);</pre>
* is equivalent to the sequence of the following
@@ -1298,7 +1298,7 @@
/**
* Sets the time zone parameter to the given {@code zone}. If no time
- * zone parameter is given to this {@code Caledar.Builder}, the
+ * zone parameter is given to this {@code Calendar.Builder}, the
* {@linkplain TimeZone#getDefault() default
* <code>TimeZone</code>} will be used in the {@link #build() build}
* method.
@@ -3316,7 +3316,7 @@
* @param field the calendar field
* @return the calendar field name
* @exception IndexOutOfBoundsException if <code>field</code> is negative,
- * equal to or greater then <code>FIELD_COUNT</code>.
+ * equal to or greater than {@code FIELD_COUNT}.
*/
static String getFieldName(int field) {
return FIELD_NAME[field];
--- a/jdk/src/java.base/share/classes/java/util/Collection.java Thu May 21 10:07:38 2015 -0700
+++ b/jdk/src/java.base/share/classes/java/util/Collection.java Thu May 21 16:20:20 2015 -0700
@@ -537,7 +537,7 @@
* @implSpec
* The default implementation creates a
* <em><a href="Spliterator.html#binding">late-binding</a></em> spliterator
- * from the collections's {@code Iterator}. The spliterator inherits the
+ * from the collection's {@code Iterator}. The spliterator inherits the
* <em>fail-fast</em> properties of the collection's iterator.
* <p>
* The created {@code Spliterator} reports {@link Spliterator#SIZED}.
--- a/jdk/src/java.base/share/classes/java/util/Locale.java Thu May 21 10:07:38 2015 -0700
+++ b/jdk/src/java.base/share/classes/java/util/Locale.java Thu May 21 16:20:20 2015 -0700
@@ -719,7 +719,7 @@
* created and cached.
*
* @param language lowercase 2 to 8 language code.
- * @param country uppercase two-letter ISO-3166 code and numric-3 UN M.49 area code.
+ * @param country uppercase two-letter ISO-3166 code and numeric-3 UN M.49 area code.
* @param variant vendor and browser specific code. See class description.
* @return the <code>Locale</code> instance requested
* @exception NullPointerException if any argument is null.
@@ -1236,7 +1236,7 @@
/**
* Package private method returning the Locale's LocaleExtensions,
* used by ResourceBundle.
- * @return locale exnteions of this Locale,
+ * @return locale extensions of this Locale,
* or {@code null} if no extensions are defined
*/
LocaleExtensions getLocaleExtensions() {
@@ -2609,7 +2609,7 @@
* href="./Locale.html#def_locale_extension">well-formed</a> or an exception
* is thrown.
*
- * <p>Attribute comparision for removal is case-insensitive.
+ * <p>Attribute comparison for removal is case-insensitive.
*
* @param attribute the attribute
* @return This builder.
--- a/jdk/src/java.base/share/classes/java/util/TimeZone.java Thu May 21 10:07:38 2015 -0700
+++ b/jdk/src/java.base/share/classes/java/util/TimeZone.java Thu May 21 16:20:20 2015 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1996, 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1996, 2015, Oracle and/or its affiliates. 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
@@ -293,6 +293,7 @@
throw new NullPointerException();
}
this.ID = ID;
+ this.zoneId = null; // invalidate cache
}
/**
@@ -544,7 +545,23 @@
* @since 1.8
*/
public ZoneId toZoneId() {
+ ZoneId zId = zoneId;
+ if (zId == null) {
+ zoneId = zId = toZoneId0();
+ }
+ return zId;
+ }
+
+ private ZoneId toZoneId0() {
String id = getID();
+ TimeZone defaultZone = defaultTimeZone;
+ // are we not defaultTimeZone but our id is equal to default's?
+ if (defaultZone != this &&
+ defaultZone != null && id.equals(defaultZone.getID())) {
+ // delegate to default TZ which is effectively immutable
+ return defaultZone.toZoneId();
+ }
+ // derive it ourselves
if (ZoneInfoFile.useOldMapping() && id.length() == 3) {
if ("EST".equals(id))
return ZoneId.of("America/New_York");
@@ -710,7 +727,12 @@
sm.checkPermission(new PropertyPermission
("user.timezone", "write"));
}
- defaultTimeZone = zone;
+ // by saving a defensive clone and returning a clone in getDefault() too,
+ // the defaultTimeZone instance is isolated from user code which makes it
+ // effectively immutable. This is important to avoid races when the
+ // following is evaluated in ZoneId.systemDefault():
+ // TimeZone.getDefault().toZoneId().
+ defaultTimeZone = (zone == null) ? null : (TimeZone) zone.clone();
}
/**
@@ -735,9 +757,7 @@
public Object clone()
{
try {
- TimeZone other = (TimeZone) super.clone();
- other.ID = ID;
- return other;
+ return super.clone();
} catch (CloneNotSupportedException e) {
throw new InternalError(e);
}
@@ -759,6 +779,12 @@
* @serial
*/
private String ID;
+
+ /**
+ * Cached {@link ZoneId} for this TimeZone
+ */
+ private transient ZoneId zoneId;
+
private static volatile TimeZone defaultTimeZone;
static final String GMT_ID = "GMT";
--- a/jdk/src/java.base/share/classes/java/util/TreeMap.java Thu May 21 10:07:38 2015 -0700
+++ b/jdk/src/java.base/share/classes/java/util/TreeMap.java Thu May 21 16:20:20 2015 -0700
@@ -859,7 +859,7 @@
* Returns a {@link Set} view of the mappings contained in this map.
*
* <p>The set's iterator returns the entries in ascending key order. The
- * sets's spliterator is
+ * set's spliterator is
* <em><a href="Spliterator.html#binding">late-binding</a></em>,
* <em>fail-fast</em>, and additionally reports {@link Spliterator#SORTED} and
* {@link Spliterator#ORDERED} with an encounter order that is ascending key
@@ -2643,7 +2643,7 @@
* child, also serving as origin for the split-off spliterator.
* Left-hands are symmetric. Descending versions place the origin
* at the end and invert ascending split rules. This base class
- * is non-commital about directionality, or whether the top-level
+ * is non-committal about directionality, or whether the top-level
* spliterator covers the whole tree. This means that the actual
* split mechanics are located in subclasses. Some of the subclass
* trySplit methods are identical (except for return types), but
--- a/jdk/src/java.base/share/classes/java/util/concurrent/ConcurrentHashMap.java Thu May 21 10:07:38 2015 -0700
+++ b/jdk/src/java.base/share/classes/java/util/concurrent/ConcurrentHashMap.java Thu May 21 16:20:20 2015 -0700
@@ -481,7 +481,7 @@
*
* Maintaining API and serialization compatibility with previous
* versions of this class introduces several oddities. Mainly: We
- * leave untouched but unused constructor arguments refering to
+ * leave untouched but unused constructor arguments referring to
* concurrencyLevel. We accept a loadFactor constructor argument,
* but apply it only to initial table capacity (which is the only
* time that we can guarantee to honor it.) We also declare an
--- a/jdk/src/java.base/share/classes/java/util/concurrent/ConcurrentSkipListMap.java Thu May 21 10:07:38 2015 -0700
+++ b/jdk/src/java.base/share/classes/java/util/concurrent/ConcurrentSkipListMap.java Thu May 21 16:20:20 2015 -0700
@@ -2710,7 +2710,7 @@
}
/**
- * Returns lowest absolute key (ignoring directonality).
+ * Returns lowest absolute key (ignoring directionality).
*/
K lowestKey() {
Comparator<? super K> cmp = m.comparator;
@@ -2722,7 +2722,7 @@
}
/**
- * Returns highest absolute key (ignoring directonality).
+ * Returns highest absolute key (ignoring directionality).
*/
K highestKey() {
Comparator<? super K> cmp = m.comparator;
--- a/jdk/src/java.base/share/classes/java/util/concurrent/ForkJoinPool.java Thu May 21 10:07:38 2015 -0700
+++ b/jdk/src/java.base/share/classes/java/util/concurrent/ForkJoinPool.java Thu May 21 16:20:20 2015 -0700
@@ -1328,13 +1328,16 @@
/**
* Number of times to spin-wait before blocking. The spins (in
* awaitRunStateLock and awaitWork) currently use randomized
- * spins. If/when MWAIT-like intrinsics becomes available, they
- * may allow quieter spinning. The value of SPINS must be a power
- * of two, at least 4. The current value causes spinning for a
- * small fraction of typical context-switch times, well worthwhile
- * given the typical likelihoods that blocking is not necessary.
+ * spins. Currently set to zero to reduce CPU usage.
+ *
+ * If greater than zero the value of SPINS must be a power
+ * of two, at least 4. A value of 2048 causes spinning for a
+ * small fraction of typical context-switch times.
+ *
+ * If/when MWAIT-like intrinsics becomes available, they
+ * may allow quieter spinning.
*/
- private static final int SPINS = 1 << 11;
+ private static final int SPINS = 0;
/**
* Increment for seed generators. See class ThreadLocal for
--- a/jdk/src/java.base/share/classes/javax/crypto/interfaces/package.html Thu May 21 10:07:38 2015 -0700
+++ b/jdk/src/java.base/share/classes/javax/crypto/interfaces/package.html Thu May 21 16:20:20 2015 -0700
@@ -47,8 +47,7 @@
<ul>
<li><a href=
"{@docRoot}/../technotes/guides/security/crypto/HowToImplAProvider.html">
- <b>How to Implement a Provider for the
- Java<FONT SIZE=-2><SUP>TM</SUP></FONT> Cryptography Architecture
+ <b>How to Implement a Provider for the Java™ Cryptography Architecture
</b></a></li>
</ul>
@@ -66,8 +65,7 @@
<li>
<a href=
"{@docRoot}/../technotes/guides/security/crypto/CryptoSpec.html">
- <b>Java<FONT SIZE=-2><SUP>TM</SUP></FONT>
- Cryptography Architecture API Specification and Reference
+ <b>Java™ Cryptography Architecture API Specification and Reference
</b></a></li>
</ul>
--- a/jdk/src/java.base/share/classes/javax/crypto/spec/package.html Thu May 21 10:07:38 2015 -0700
+++ b/jdk/src/java.base/share/classes/javax/crypto/spec/package.html Thu May 21 16:20:20 2015 -0700
@@ -62,14 +62,13 @@
<li>
<a href=
"{@docRoot}/../technotes/guides/security/crypto/CryptoSpec.html">
- <b>Java<FONT SIZE=-2><SUP>TM</SUP></FONT>
- Cryptography Architecture API Specification and Reference
+ <b>Java™ Cryptography Architecture API Specification and Reference
</b></a></li>
<li>
<a href=
"{@docRoot}/../technotes/guides/security/crypto/HowToImplAProvider.html">
<b>How to Implement a Provider for the
- Java<FONT SIZE=-2><SUP>TM</SUP></FONT> Cryptography Architecture
+ Java™ Cryptography Architecture
</b></a></li>
</ul>
--- a/jdk/src/java.base/share/classes/javax/net/ssl/package.html Thu May 21 10:07:38 2015 -0700
+++ b/jdk/src/java.base/share/classes/javax/net/ssl/package.html Thu May 21 16:20:20 2015 -0700
@@ -38,8 +38,7 @@
<ul>
<li><a href="{@docRoot}/../technotes/guides/security/StandardNames.html">
- <b>Java<FONT SIZE=-2><SUP>TM</SUP></FONT>
- Cryptography Architecture Standard Algorithm Name
+ <b>Java™ Cryptography Architecture Standard Algorithm Name
Documentation</b></a></li>
</ul>
--- a/jdk/src/java.base/share/classes/jdk/internal/util/xml/impl/Parser.java Thu May 21 10:07:38 2015 -0700
+++ b/jdk/src/java.base/share/classes/jdk/internal/util/xml/impl/Parser.java Thu May 21 16:20:20 2015 -0700
@@ -145,12 +145,12 @@
/**
* ASCII character type array.
*
- * This array maps an ASCII (7 bit) character to the character type.<br />
- * Possible character type values are:<br /> - ' ' for any kind of white
- * space character;<br /> - 'a' for any lower case alphabetical character
- * value;<br /> - 'A' for any upper case alphabetical character value;<br />
- * - 'd' for any decimal digit character value;<br /> - 'z' for any
- * character less then ' ' except '\t', '\n', '\r';<br /> An ASCII (7 bit)
+ * This array maps an ASCII (7 bit) character to the character type.<br>
+ * Possible character type values are:<br> - ' ' for any kind of white
+ * space character;<br> - 'a' for any lower case alphabetical character
+ * value;<br> - 'A' for any upper case alphabetical character value;<br>
+ * - 'd' for any decimal digit character value;<br> - 'z' for any
+ * character less than ' ' except '\t', '\n', '\r';<br> An ASCII (7 bit)
* character which does not fall in any category listed above is mapped to
* it self.
*/
@@ -158,11 +158,11 @@
/**
* NMTOKEN character type array.
*
- * This array maps an ASCII (7 bit) character to the character type.<br />
- * Possible character type values are:<br /> - 0 for underscore ('_') or any
- * lower and upper case alphabetical character value;<br /> - 1 for colon
- * (':') character;<br /> - 2 for dash ('-') and dot ('.') or any decimal
- * digit character value;<br /> - 3 for any kind of white space character<br
+ * This array maps an ASCII (7 bit) character to the character type.<br>
+ * Possible character type values are:<br> - 0 for underscore ('_') or any
+ * lower and upper case alphabetical character value;<br> - 1 for colon
+ * (':') character;<br> - 2 for dash ('-') and dot ('.') or any decimal
+ * digit character value;<br> - 3 for any kind of white space character<br
* /> An ASCII (7 bit) character which does not fall in any category listed
* above is mapped to 0xff.
*/
@@ -1841,10 +1841,12 @@
/**
* Reads an attribute value.
*
- * The grammar which this method can read is:<br />
- * <code>eqstr := S "=" qstr</code><br />
- * <code>qstr := S ("'" string "'") |
- * ('"' string '"')</code><br /> This method resolves entities
+ * The grammar this method can read is:
+ * <pre>{@code
+ * eqstr := S "=" qstr
+ * qstr := S ("'" string "'") | ('"' string '"')
+ * }</pre>
+ * This method resolves entities
* inside a string unless the parser parses DTD.
*
* @param flag The '=' character forces the method to accept the '='
@@ -2633,7 +2635,7 @@
* Reports characters and empties the parser's buffer. This method is called
* only if parser is going to return control to the main loop. This means
* that this method may use parser buffer to report white space without
- * copeing characters to temporary buffer.
+ * copying characters to temporary buffer.
*/
protected abstract void bflash()
throws Exception;
@@ -2642,7 +2644,7 @@
* Reports white space characters and empties the parser's buffer. This
* method is called only if parser is going to return control to the main
* loop. This means that this method may use parser buffer to report white
- * space without copeing characters to temporary buffer.
+ * space without copying characters to temporary buffer.
*/
protected abstract void bflash_ws()
throws Exception;
@@ -3290,16 +3292,20 @@
}
/**
- * Maps a character to it's type.
+ * Maps a character to its type.
*
- * Possible character type values are:<br /> - ' ' for any kind of white
- * space character;<br /> - 'a' for any lower case alphabetical character
- * value;<br /> - 'A' for any upper case alphabetical character value;<br />
- * - 'd' for any decimal digit character value;<br /> - 'z' for any
- * character less then ' ' except '\t', '\n', '\r';<br /> - 'X' for any not
- * ASCII character;<br /> - 'Z' for EOS character.<br /> An ASCII (7 bit)
- * character which does not fall in any category listed above is mapped to
- * it self.
+ * Possible character type values are:
+ * <ul>
+ * <li>' ' - for any kind of whitespace character;</li>
+ * <li>'a' - for any lower case alphabetical character value;</li>
+ * <li>'A' - for any upper case alphabetical character value;</li>
+ * <li>'d' - for any decimal digit character value;</li>
+ * <li>'z' - for any character less than ' ' except '\t', '\n', '\r';</li>
+ * <li>'X' - for any not ASCII character;</li>
+ * <li>'Z' - for EOS character.</li>
+ * </ul>
+ * An ASCII (7 bit) character which does not fall in any category
+ * listed above is mapped to itself.
*
* @param ch The character to map.
* @return The type of character.
--- a/jdk/src/java.base/share/classes/jdk/internal/util/xml/impl/ParserSAX.java Thu May 21 10:07:38 2015 -0700
+++ b/jdk/src/java.base/share/classes/jdk/internal/util/xml/impl/ParserSAX.java Thu May 21 16:20:20 2015 -0700
@@ -649,7 +649,7 @@
* Reports characters and empties the parser's buffer. This method is called
* only if parser is going to return control to the main loop. This means
* that this method may use parser buffer to report white space without
- * copeing characters to temporary buffer.
+ * copying characters to temporary buffer.
*/
protected void bflash() throws SAXException {
if (mBuffIdx >= 0) {
@@ -663,7 +663,7 @@
* Reports white space characters and empties the parser's buffer. This
* method is called only if parser is going to return control to the main
* loop. This means that this method may use parser buffer to report white
- * space without copeing characters to temporary buffer.
+ * space without copying characters to temporary buffer.
*/
protected void bflash_ws() throws SAXException {
if (mBuffIdx >= 0) {
--- a/jdk/src/java.base/share/classes/sun/misc/Cache.java Thu May 21 10:07:38 2015 -0700
+++ b/jdk/src/java.base/share/classes/sun/misc/Cache.java Thu May 21 16:20:20 2015 -0700
@@ -196,8 +196,8 @@
/**
* Gets the object associated with the specified key in the Cache.
* @param key the key in the hash table
- * @returns the element for the key or null if the key
- * is not defined in the hash table.
+ * @return the element for the key or null if the key
+ * is not defined in the hash table.
* @see Cache#put
*/
public synchronized Object get(Object key) {
--- a/jdk/src/java.base/share/classes/sun/misc/CharacterDecoder.java Thu May 21 10:07:38 2015 -0700
+++ b/jdk/src/java.base/share/classes/sun/misc/CharacterDecoder.java Thu May 21 16:20:20 2015 -0700
@@ -120,7 +120,7 @@
/**
* This method does an actual decode. It takes the decoded bytes and
* writes them to the OutputStream. The integer <i>l</i> tells the
- * method how many bytes are required. This is always <= bytesPerAtom().
+ * method how many bytes are required. This is always {@literal <=} bytesPerAtom().
*/
protected void decodeAtom(PushbackInputStream aStream, OutputStream bStream, int l) throws IOException {
throw new CEStreamExhausted();
--- a/jdk/src/java.base/share/classes/sun/misc/CharacterEncoder.java Thu May 21 10:07:38 2015 -0700
+++ b/jdk/src/java.base/share/classes/sun/misc/CharacterEncoder.java Thu May 21 16:20:20 2015 -0700
@@ -68,7 +68,7 @@
* referenced in the See Also list below.
*
* @author Chuck McManis
- * @see CharacterDecoder;
+ * @see CharacterDecoder
* @see UCEncoder
* @see UUEncoder
* @see BASE64Encoder
@@ -107,7 +107,7 @@
/**
* Encode the suffix that ends every output line. By default
- * this method just prints a <newline> into the output stream.
+ * this method just prints a newline into the output stream.
*/
protected void encodeLineSuffix(OutputStream aStream) throws IOException {
pStream.println();
--- a/jdk/src/java.base/share/classes/sun/misc/ConditionLock.java Thu May 21 10:07:38 2015 -0700
+++ b/jdk/src/java.base/share/classes/sun/misc/ConditionLock.java Thu May 21 16:20:20 2015 -0700
@@ -34,7 +34,7 @@
* with the lock() and unlock() methods. However if there is a thread
* waiting for the state variable to become a particular value and you
* simply call Unlock(), that thread will not be able to acquire the
- * lock until the state variable equals its desired value. <p>
+ * lock until the state variable equals its desired value.
*
* @author Peter King
*/
--- a/jdk/src/java.base/share/classes/sun/misc/ExtensionDependency.java Thu May 21 10:07:38 2015 -0700
+++ b/jdk/src/java.base/share/classes/sun/misc/ExtensionDependency.java Thu May 21 16:20:20 2015 -0700
@@ -45,26 +45,26 @@
import sun.net.www.ParseUtil;
/**
- * <p>
* This class checks dependent extensions a particular jar file may have
* declared through its manifest attributes.
- * </p>
+ * <p>
* Jar file declared dependent extensions through the extension-list
* attribute. The extension-list contains a list of keys used to
* fetch the other attributes describing the required extension.
* If key is the extension key declared in the extension-list
* attribute, the following describing attribute can be found in
- * the manifest :
- * key-Extension-Name: (Specification package name)
- * key-Specification-Version: (Specification-Version)
- * key-Implementation-Version: (Implementation-Version)
- * key-Implementation-Vendor-Id: (Imlementation-Vendor-Id)
- * key-Implementation-Version: (Implementation version)
- * key-Implementation-URL: (URL to download the requested extension)
+ * the manifest:
+ * <ul>
+ * <li>key-Extension-Name: (Specification package name)</li>
+ * <li>key-Specification-Version: (Specification-Version)</li>
+ * <li>key-Implementation-Version: (Implementation-Version)</li>
+ * <li>key-Implementation-Vendor-Id: (Imlementation-Vendor-Id)</li>
+ * <li>key-Implementation-Version: (Implementation version)</li>
+ * <li>key-Implementation-URL: (URL to download the requested extension)</li>
+ * </ul>
* <p>
* This class also maintain versioning consistency of installed
* extensions dependencies declared in jar file manifest.
- * </p>
*
* @deprecated this class will be removed in a future release.
* @author Jerome Dochez
@@ -76,10 +76,9 @@
private static Vector<ExtensionInstallationProvider> providers;
/**
- * <p>
* Register an ExtensionInstallationProvider. The provider is responsible
* for handling the installation (upgrade) of any missing extensions.
- * </p>
+ *
* @param eip ExtensionInstallationProvider implementation
*/
public synchronized static void addExtensionInstallationProvider
@@ -92,9 +91,7 @@
}
/**
- * <p>
* Unregister a previously installed installation provider
- * </p>
*/
public synchronized static void removeExtensionInstallationProvider
(ExtensionInstallationProvider eip)
@@ -103,10 +100,9 @@
}
/**
- * <p>
* Checks the dependencies of the jar file on installed extension.
- * </p>
- * @param jarFile containing the attriutes declaring the dependencies
+ *
+ * @param jar containing the attributes declaring the dependencies
*/
public static boolean checkExtensionsDependencies(JarFile jar)
{
@@ -182,9 +178,8 @@
/*
- * <p>
* Check that a particular dependency on an extension is satisfied.
- * </p>
+ *
* @param extensionName is the key used for the attributes in the manifest
* @param attr is the attributes of the manifest file
*
@@ -204,10 +199,9 @@
}
/*
- * <p>
* Check if a particular extension is part of the currently installed
* extensions.
- * </p>
+ *
* @param extensionName is the key for the attributes in the manifest
* @param attr is the attributes of the manifest
*
@@ -262,11 +256,9 @@
}
/*
- * <p>
* Check if the requested extension described by the attributes
* in the manifest under the key extensionName is compatible with
* the jar file.
- * </p>
*
* @param extensionName key in the attribute list
* @param attr manifest file attributes
@@ -337,10 +329,8 @@
}
/*
- * <p>
* An required extension is missing, if an ExtensionInstallationProvider is
* registered, delegate the installation of that particular extension to it.
- * </p>
*
* @param reqInfo Missing extension information
* @param instInfo Older installed version information
@@ -380,11 +370,9 @@
}
/**
- * <p>
* Checks if the extension, that is specified in the extension-list in
* the applet jar manifest, is already installed (i.e. exists in the
* extension directory).
- * </p>
*
* @param extensionName extension name in the extension-list
*
@@ -428,9 +416,7 @@
}
/**
- * <p>
* @return the java.ext.dirs property as a list of directory
- * </p>
*/
private static File[] getExtDirs() {
String s = java.security.AccessController.doPrivileged(
@@ -456,9 +442,8 @@
}
/*
- * <p>
* Scan the directories and return all files installed in those
- * </p>
+ *
* @param dirs list of directories to scan
*
* @return the list of files installed in all the directories
@@ -483,9 +468,7 @@
}
/*
- * <p>
* @return the list of installed extensions jar files
- * </p>
*/
private File[] getInstalledExtensions() throws IOException {
return AccessController.doPrivileged(
@@ -503,9 +486,7 @@
}
/*
- * <p>
* Add the newly installed jar file to the extension class loader.
- * </p>
*
* @param cl the current installed extension class loader
*
--- a/jdk/src/java.base/share/classes/sun/misc/ExtensionInfo.java Thu May 21 10:07:38 2015 -0700
+++ b/jdk/src/java.base/share/classes/sun/misc/ExtensionInfo.java Thu May 21 16:20:20 2015 -0700
@@ -45,9 +45,7 @@
public class ExtensionInfo {
/**
- * <p>
* public static values returned by the isCompatible method
- * </p>
*/
public static final int COMPATIBLE = 0;
public static final int REQUIRE_SPECIFICATION_UPGRADE = 1;
@@ -56,10 +54,8 @@
public static final int INCOMPATIBLE = 4;
/**
- * <p>
* attributes fully describer an extension. The underlying described
* extension may be installed and requested.
- * <p>
*/
public String title;
public String name;
@@ -76,15 +72,12 @@
/**
- * <p>
* Create a new uninitialized extension information object
- * </p>
*/
public ExtensionInfo() {
}
/**
- * <p>
* Create and initialize an extension information object.
* The initialization uses the attributes passed as being
* the content of a manifest file to load the extension
@@ -93,7 +86,7 @@
* extension they may depend on, the extension key parameter
* is prepanded to the attribute name to make the key used
* to retrieve the attribute from the manifest file
- * <p>
+ *
* @param extensionKey unique extension key in the manifest
* @param attr Attributes of a manifest file
*/
@@ -149,13 +142,11 @@
}
/**
- * <p>
* @return true if the extension described by this extension information
* is compatible with the extension described by the extension
* information passed as a parameter
- * </p>
*
- * @param the requested extension information to compare to
+ * @param ei the requested extension information to compare to
*/
public int isCompatibleWith(ExtensionInfo ei) {
@@ -204,10 +195,8 @@
}
/**
- * <p>
* helper method to print sensible information on the undelying described
* extension
- * </p>
*/
public String toString() {
return "Extension : title(" + title + "), name(" + name + "), spec vendor(" +
@@ -217,15 +206,15 @@
}
/*
- * <p>
* helper method to compare two versions.
* version are in the x.y.z.t pattern.
- * </p>
+ *
* @param source version to compare to
* @param target version used to compare against
- * @return < 0 if source < version
- * > 0 if source > version
- * = 0 if source = version
+ * @return <pre>{@code
+ * < 0 if source < version
+ * > 0 if source > version
+ * = 0 if source = version}</pre>
*/
private int compareExtensionVersion(String source, String target)
throws NumberFormatException
@@ -238,15 +227,15 @@
/*
- * <p>
* helper method to compare two versions.
* version are in the x.y.z.t pattern.
- * </p>
+ *
* @param source version to compare to
* @param target version used to compare against
- * @return < 0 if source < version
- * > 0 if source > version
- * = 0 if source = version
+ * @return <pre>{@code
+ * < 0 if source < version
+ * > 0 if source > version
+ * = 0 if source = version}</pre>
*/
private int strictCompareExtensionVersion(String source, String target)
throws NumberFormatException
--- a/jdk/src/java.base/share/classes/sun/misc/FDBigInteger.java Thu May 21 10:07:38 2015 -0700
+++ b/jdk/src/java.base/share/classes/sun/misc/FDBigInteger.java Thu May 21 16:20:20 2015 -0700
@@ -384,8 +384,8 @@
* Retrieves the normalization bias of the <code>FDBigIntger</code>. The
* normalization bias is a left shift such that after it the highest word
* of the value will have the 4 highest bits equal to zero:
- * <code>(highestWord & 0xf0000000) == 0</code>, but the next bit should be 1
- * <code>(highestWord & 0x08000000) != 0</code>.
+ * {@code (highestWord & 0xf0000000) == 0}, but the next bit should be 1
+ * {@code (highestWord & 0x08000000) != 0}.
*
* @return The normalization bias.
*/
@@ -546,9 +546,9 @@
* We assume that S has been normalized, as above, and that
* "this" has been left-shifted accordingly.
* Also assumed, of course, is that the result, q, can be expressed
- * as an integer, 0 <= q < 10.
+ * as an integer, {@code 0 <= q < 10}.
*
- * @param The divisor of this <code>FDBigInteger</code>.
+ * @param S The divisor of this <code>FDBigInteger</code>.
* @return <code>q = (int)(this / S)</code>.
*/
/*@
@@ -685,7 +685,7 @@
*
* @param p5 The exponent of the power-of-five factor.
* @param p2 The exponent of the power-of-two factor.
- * @return
+ * @return The multiplication result.
*/
/*@
@ requires this.value() == 0 || p5 == 0 && p2 == 0;
@@ -931,11 +931,11 @@
/**
* Compares the parameter with this <code>FDBigInteger</code>. Returns an
* integer accordingly as:
- * <pre>
- * >0: this > other
- * 0: this == other
- * <0: this < other
- * </pre>
+ * <pre>{@code
+ * > 0: this > other
+ * 0: this == other
+ * < 0: this < other
+ * }</pre>
*
* @param other The <code>FDBigInteger</code> to compare.
* @return A negative value, zero, or a positive value according to the
@@ -974,11 +974,11 @@
* Compares this <code>FDBigInteger</code> with
* <code>5<sup>p5</sup> * 2<sup>p2</sup></code>.
* Returns an integer accordingly as:
- * <pre>
- * >0: this > other
- * 0: this == other
- * <0: this < other
- * </pre>
+ * <pre>{@code
+ * > 0: this > other
+ * 0: this == other
+ * < 0: this < other
+ * }</pre>
* @param p5 The exponent of the power-of-five factor.
* @param p2 The exponent of the power-of-two factor.
* @return A negative value, zero, or a positive value according to the
@@ -1011,11 +1011,11 @@
/**
* Compares this <code>FDBigInteger</code> with <code>x + y</code>. Returns a
* value according to the comparison as:
- * <pre>
+ * <pre>{@code
* -1: this < x + y
* 0: this == x + y
* 1: this > x + y
- * </pre>
+ * }</pre>
* @param x The first addend of the sum to compare.
* @param y The second addend of the sum to compare.
* @return -1, 0, or 1 according to the result of the comparison.
--- a/jdk/src/java.base/share/classes/sun/misc/FloatingDecimal.java Thu May 21 10:07:38 2015 -0700
+++ b/jdk/src/java.base/share/classes/sun/misc/FloatingDecimal.java Thu May 21 16:20:20 2015 -0700
@@ -154,7 +154,7 @@
/**
* Indicates the sign of the value.
- * @return <code>value < 0.0</code>.
+ * @return {@code value < 0.0}.
*/
public boolean isNegative();
--- a/jdk/src/java.base/share/classes/sun/misc/IOUtils.java Thu May 21 10:07:38 2015 -0700
+++ b/jdk/src/java.base/share/classes/sun/misc/IOUtils.java Thu May 21 16:20:20 2015 -0700
@@ -39,7 +39,7 @@
/**
* Read up to <code>length</code> of bytes from <code>in</code>
* until EOF is detected.
- * @param in input stream, must not be null
+ * @param is input stream, must not be null
* @param length number of bytes to read, -1 or Integer.MAX_VALUE means
* read as much as possible
* @param readAll if true, an EOFException will be thrown if not enough
--- a/jdk/src/java.base/share/classes/sun/misc/JarFilter.java Thu May 21 10:07:38 2015 -0700
+++ b/jdk/src/java.base/share/classes/sun/misc/JarFilter.java Thu May 21 16:20:20 2015 -0700
@@ -29,10 +29,8 @@
import java.io.FilenameFilter;
/**
- * <p>
* This class checks that only jar and zip files are included in the file list.
* This class is used in extension installation support (ExtensionDependency).
- * <p>
*
* @deprecated this class will be removed in a future release.
* @author Michael Colburn
--- a/jdk/src/java.base/share/classes/sun/misc/JavaLangAccess.java Thu May 21 10:07:38 2015 -0700
+++ b/jdk/src/java.base/share/classes/sun/misc/JavaLangAccess.java Thu May 21 16:20:20 2015 -0700
@@ -91,14 +91,14 @@
* may be added to the delete on exit list by the application shutdown
* hooks.
*
- * @params slot the slot in the shutdown hook array, whose element
- * will be invoked in order during shutdown
- * @params registerShutdownInProgress true to allow the hook
- * to be registered even if the shutdown is in progress.
- * @params hook the hook to be registered
+ * @param slot the slot in the shutdown hook array, whose element
+ * will be invoked in order during shutdown
+ * @param registerShutdownInProgress true to allow the hook
+ * to be registered even if the shutdown is in progress.
+ * @param hook the hook to be registered
*
- * @throw IllegalStateException if shutdown is in progress and
- * the slot is not valid to register.
+ * @throws IllegalStateException if shutdown is in progress and
+ * the slot is not valid to register.
*/
void registerShutdownHook(int slot, boolean registerShutdownInProgress, Runnable hook);
--- a/jdk/src/java.base/share/classes/sun/misc/Perf.java Thu May 21 10:07:38 2015 -0700
+++ b/jdk/src/java.base/share/classes/sun/misc/Perf.java Thu May 21 16:20:20 2015 -0700
@@ -67,13 +67,13 @@
* <code>AccessController.doPrivileged(PrivilegedAction)</code>.
* <p> Here is a suggested idiom for use of this class:
*
- * <blockquote><pre>
+ * <blockquote><pre>{@code
* class MyTrustedClass {
* private static final Perf perf =
* AccessController.doPrivileged(new Perf.GetPerfAction<Perf>());
* ...
* }
- * </pre></blockquote>
+ * }</pre></blockquote>
* <p>
* In the presence of a security manager, the <code>MyTrustedClass</code>
* class in the above example will need to be granted the
@@ -171,8 +171,7 @@
* The attach mode specifies the access permissions requested for the
* instrumentation buffer of the target virtual machine. The permitted
* access permissions are:
- * <p>
- * <bl>
+ * <ul>
* <li>"r" - Read only access. This Java virtual machine has only
* read access to the instrumentation buffer for the target Java
* virtual machine.
@@ -180,7 +179,7 @@
* write access to the instrumentation buffer for the target Java virtual
* machine. This mode is currently not supported and is reserved for
* future enhancements.
- * </bl>
+ * </ul>
*
* @param lvmid an integer that uniquely identifies the
* target local Java virtual machine.
--- a/jdk/src/java.base/share/classes/sun/misc/PerfCounter.java Thu May 21 10:07:38 2015 -0700
+++ b/jdk/src/java.base/share/classes/sun/misc/PerfCounter.java Thu May 21 16:20:20 2015 -0700
@@ -37,7 +37,7 @@
* The perf counters will be created in the jvmstat perf buffer
* that the HotSpot VM creates. The default size is 32K and thus
* the number of counters is bounded. You can alter the size
- * with -XX:PerfDataMemorySize=<bytes> option. If there is
+ * with {@code -XX:PerfDataMemorySize=<bytes>} option. If there is
* insufficient memory in the jvmstat perf buffer, the C heap memory
* will be used and thus the application will continue to run if
* the counters added exceeds the buffer size but the counters
--- a/jdk/src/java.base/share/classes/sun/misc/PerformanceLogger.java Thu May 21 10:07:38 2015 -0700
+++ b/jdk/src/java.base/share/classes/sun/misc/PerformanceLogger.java Thu May 21 16:20:20 2015 -0700
@@ -51,10 +51,12 @@
* <P>
* To automatically track startup performance in an app or applet,
* use the command-line parameter sun.perflog as follows:<BR>
+ * <pre>{@code
* -Dsun.perflog[=file:<filename>]
+ * }</pre>
* <BR>
* where simply using the parameter with no value will enable output
- * to the console and a value of "file:<filename>" will cause
+ * to the console and a value of "{@code file:<filename>}" will cause
* that given filename to be created and used for all output.
* <P>
* By default, times are measured using System.currentTimeMillis(). To use
--- a/jdk/src/java.base/share/classes/sun/misc/Resource.java Thu May 21 10:07:38 2015 -0700
+++ b/jdk/src/java.base/share/classes/sun/misc/Resource.java Thu May 21 16:20:20 2015 -0700
@@ -154,7 +154,8 @@
/**
* Returns the Resource data as a ByteBuffer, but only if the input stream
- * was implemented on top of a ByteBuffer. Return <tt>null</tt> otherwise.
+ * was implemented on top of a ByteBuffer. Return {@code null} otherwise.
+ * @return Resource data or null.
*/
public ByteBuffer getByteBuffer() throws IOException {
InputStream in = cachedInputStream();
--- a/jdk/src/java.base/share/classes/sun/misc/Signal.java Thu May 21 10:07:38 2015 -0700
+++ b/jdk/src/java.base/share/classes/sun/misc/Signal.java Thu May 21 16:20:20 2015 -0700
@@ -50,7 +50,7 @@
* Signal objects are created based on their names. For example:
* <blockquote><pre>
* new Signal("INT");
- * </blockquote></pre>
+ * </pre></blockquote>
* constructs a signal object corresponding to <code>SIGINT</code>, which is
* typically produced when the user presses <code>Ctrl-C</code> at the command line.
* The <code>Signal</code> constructor throws <code>IllegalArgumentException</code>
@@ -64,7 +64,7 @@
* }
* };
* Signal.handle(new Signal("INT"), handler);
- * </blockquote></pre>
+ * </pre></blockquote>
*
* @author Sheng Liang
* @author Bill Shannon
@@ -149,7 +149,7 @@
*
* @param sig a signal
* @param handler the handler to be registered with the given signal.
- * @result the old handler
+ * @return the old handler
* @exception IllegalArgumentException the signal is in use by the VM
* @see sun.misc.Signal#raise(Signal sig)
* @see sun.misc.SignalHandler
--- a/jdk/src/java.base/share/classes/sun/misc/Unsafe.java Thu May 21 10:07:38 2015 -0700
+++ b/jdk/src/java.base/share/classes/sun/misc/Unsafe.java Thu May 21 16:20:20 2015 -0700
@@ -641,9 +641,9 @@
* <li>String: any object (not just a java.lang.String)
* <li>InterfaceMethodRef: (NYI) a method handle to invoke on that call site's arguments
* </ul>
- * @params hostClass context for linkage, access control, protection domain, and class loader
- * @params data bytes of a class file
- * @params cpPatches where non-null entries exist, they replace corresponding CP entries in data
+ * @param hostClass context for linkage, access control, protection domain, and class loader
+ * @param data bytes of a class file
+ * @param cpPatches where non-null entries exist, they replace corresponding CP entries in data
*/
public native Class<?> defineAnonymousClass(Class<?> hostClass, byte[] data, Object[] cpPatches);
@@ -808,9 +808,9 @@
* The system imposes a maximum of 3 samples, representing
* averages over the last 1, 5, and 15 minutes, respectively.
*
- * @params loadavg an array of double of size nelems
- * @params nelems the number of samples to be retrieved and
- * must be 1 to 3.
+ * @param loadavg an array of double of size nelems
+ * @param nelems the number of samples to be retrieved and
+ * must be 1 to 3.
*
* @return the number of samples actually retrieved; or -1
* if the load average is unobtainable.
@@ -1108,7 +1108,6 @@
* <p>
* 8-byte atomicity is only guaranteed on platforms on which
* support atomic accesses to longs.
- * <p>
*
* @param o Java heap object in which the value resides, if any, else
* null
--- a/jdk/src/java.base/share/classes/sun/misc/VM.java Thu May 21 10:07:38 2015 -0700
+++ b/jdk/src/java.base/share/classes/sun/misc/VM.java Thu May 21 16:20:20 2015 -0700
@@ -315,7 +315,7 @@
}
/*
- * Add <tt>n</tt> to the objects pending for finalization count.
+ * Add {@code n} to the objects pending for finalization count.
*
* @param n an integer value to be added to the objects pending
* for finalization count
--- a/jdk/src/java.base/share/classes/sun/misc/resources/Messages.java Thu May 21 10:07:38 2015 -0700
+++ b/jdk/src/java.base/share/classes/sun/misc/resources/Messages.java Thu May 21 16:20:20 2015 -0700
@@ -26,7 +26,7 @@
package sun.misc.resources;
/**
- * <p> This class represents the <code>ResourceBundle</code>
+ * This class represents the {@code ResourceBundle}
* for sun.misc.
*
* @author Michael Colburn
@@ -35,9 +35,9 @@
public class Messages extends java.util.ListResourceBundle {
/**
- * Returns the contents of this <code>ResourceBundle</code>.
- * <p>
- * @return the contents of this <code>ResourceBundle</code>.
+ * Returns the contents of this {@code ResourceBundle}.
+ *
+ * @return the contents of this {@code ResourceBundle}.
*/
public Object[][] getContents() {
return contents;
--- a/jdk/src/java.base/share/classes/sun/misc/resources/Messages_de.java Thu May 21 10:07:38 2015 -0700
+++ b/jdk/src/java.base/share/classes/sun/misc/resources/Messages_de.java Thu May 21 16:20:20 2015 -0700
@@ -26,7 +26,7 @@
package sun.misc.resources;
/**
- * <p> This class represents the <code>ResourceBundle</code>
+ * This class represents the {@code ResourceBundle}
* for sun.misc.
*
* @author Michael Colburn
@@ -35,9 +35,9 @@
public class Messages_de extends java.util.ListResourceBundle {
/**
- * Returns the contents of this <code>ResourceBundle</code>.
- * <p>
- * @return the contents of this <code>ResourceBundle</code>.
+ * Returns the contents of this {@code ResourceBundle}.
+ *
+ * @return the contents of this {@code ResourceBundle}.
*/
public Object[][] getContents() {
return contents;
--- a/jdk/src/java.base/share/classes/sun/misc/resources/Messages_es.java Thu May 21 10:07:38 2015 -0700
+++ b/jdk/src/java.base/share/classes/sun/misc/resources/Messages_es.java Thu May 21 16:20:20 2015 -0700
@@ -26,7 +26,7 @@
package sun.misc.resources;
/**
- * <p> This class represents the <code>ResourceBundle</code>
+ * This class represents the {@code ResourceBundle}
* for sun.misc.
*
* @author Michael Colburn
@@ -35,9 +35,9 @@
public class Messages_es extends java.util.ListResourceBundle {
/**
- * Returns the contents of this <code>ResourceBundle</code>.
- * <p>
- * @return the contents of this <code>ResourceBundle</code>.
+ * Returns the contents of this {@code ResourceBundle}.
+ *
+ * @return the contents of this {@code ResourceBundle}.
*/
public Object[][] getContents() {
return contents;
--- a/jdk/src/java.base/share/classes/sun/misc/resources/Messages_fr.java Thu May 21 10:07:38 2015 -0700
+++ b/jdk/src/java.base/share/classes/sun/misc/resources/Messages_fr.java Thu May 21 16:20:20 2015 -0700
@@ -26,7 +26,7 @@
package sun.misc.resources;
/**
- * <p> This class represents the <code>ResourceBundle</code>
+ * This class represents the {@code ResourceBundle}
* for sun.misc.
*
* @author Michael Colburn
@@ -35,9 +35,9 @@
public class Messages_fr extends java.util.ListResourceBundle {
/**
- * Returns the contents of this <code>ResourceBundle</code>.
- * <p>
- * @return the contents of this <code>ResourceBundle</code>.
+ * Returns the contents of this {@code ResourceBundle}.
+ *
+ * @return the contents of this {@code ResourceBundle}.
*/
public Object[][] getContents() {
return contents;
--- a/jdk/src/java.base/share/classes/sun/misc/resources/Messages_it.java Thu May 21 10:07:38 2015 -0700
+++ b/jdk/src/java.base/share/classes/sun/misc/resources/Messages_it.java Thu May 21 16:20:20 2015 -0700
@@ -26,7 +26,7 @@
package sun.misc.resources;
/**
- * <p> This class represents the <code>ResourceBundle</code>
+ * This class represents the {@code ResourceBundle}
* for sun.misc.
*
* @author Michael Colburn
@@ -35,9 +35,9 @@
public class Messages_it extends java.util.ListResourceBundle {
/**
- * Returns the contents of this <code>ResourceBundle</code>.
- * <p>
- * @return the contents of this <code>ResourceBundle</code>.
+ * Returns the contents of this {@code ResourceBundle}.
+ *
+ * @return the contents of this {@code ResourceBundle}.
*/
public Object[][] getContents() {
return contents;
--- a/jdk/src/java.base/share/classes/sun/misc/resources/Messages_ja.java Thu May 21 10:07:38 2015 -0700
+++ b/jdk/src/java.base/share/classes/sun/misc/resources/Messages_ja.java Thu May 21 16:20:20 2015 -0700
@@ -26,7 +26,7 @@
package sun.misc.resources;
/**
- * <p> This class represents the <code>ResourceBundle</code>
+ * This class represents the {@code ResourceBundle}
* for sun.misc.
*
* @author Michael Colburn
@@ -35,9 +35,9 @@
public class Messages_ja extends java.util.ListResourceBundle {
/**
- * Returns the contents of this <code>ResourceBundle</code>.
- * <p>
- * @return the contents of this <code>ResourceBundle</code>.
+ * Returns the contents of this {@code ResourceBundle}.
+ *
+ * @return the contents of this {@code ResourceBundle}.
*/
public Object[][] getContents() {
return contents;
--- a/jdk/src/java.base/share/classes/sun/misc/resources/Messages_ko.java Thu May 21 10:07:38 2015 -0700
+++ b/jdk/src/java.base/share/classes/sun/misc/resources/Messages_ko.java Thu May 21 16:20:20 2015 -0700
@@ -26,7 +26,7 @@
package sun.misc.resources;
/**
- * <p> This class represents the <code>ResourceBundle</code>
+ * This class represents the {@code ResourceBundle}
* for sun.misc.
*
* @author Michael Colburn
@@ -35,9 +35,9 @@
public class Messages_ko extends java.util.ListResourceBundle {
/**
- * Returns the contents of this <code>ResourceBundle</code>.
- * <p>
- * @return the contents of this <code>ResourceBundle</code>.
+ * Returns the contents of this {@code ResourceBundle}.
+ *
+ * @return the contents of this {@code ResourceBundle}.
*/
public Object[][] getContents() {
return contents;
--- a/jdk/src/java.base/share/classes/sun/misc/resources/Messages_pt_BR.java Thu May 21 10:07:38 2015 -0700
+++ b/jdk/src/java.base/share/classes/sun/misc/resources/Messages_pt_BR.java Thu May 21 16:20:20 2015 -0700
@@ -26,7 +26,7 @@
package sun.misc.resources;
/**
- * <p> This class represents the <code>ResourceBundle</code>
+ * This class represents the {@code ResourceBundle}
* for sun.misc.
*
* @author Michael Colburn
@@ -35,9 +35,9 @@
public class Messages_pt_BR extends java.util.ListResourceBundle {
/**
- * Returns the contents of this <code>ResourceBundle</code>.
- * <p>
- * @return the contents of this <code>ResourceBundle</code>.
+ * Returns the contents of this {@code ResourceBundle}.
+ *
+ * @return the contents of this {@code ResourceBundle}.
*/
public Object[][] getContents() {
return contents;
--- a/jdk/src/java.base/share/classes/sun/misc/resources/Messages_sv.java Thu May 21 10:07:38 2015 -0700
+++ b/jdk/src/java.base/share/classes/sun/misc/resources/Messages_sv.java Thu May 21 16:20:20 2015 -0700
@@ -26,7 +26,7 @@
package sun.misc.resources;
/**
- * <p> This class represents the <code>ResourceBundle</code>
+ * This class represents the {@code ResourceBundle}
* for sun.misc.
*
* @author Michael Colburn
@@ -35,9 +35,9 @@
public class Messages_sv extends java.util.ListResourceBundle {
/**
- * Returns the contents of this <code>ResourceBundle</code>.
- * <p>
- * @return the contents of this <code>ResourceBundle</code>.
+ * Returns the contents of this {@code ResourceBundle}.
+ *
+ * @return the contents of this {@code ResourceBundle}.
*/
public Object[][] getContents() {
return contents;
--- a/jdk/src/java.base/share/classes/sun/misc/resources/Messages_zh_CN.java Thu May 21 10:07:38 2015 -0700
+++ b/jdk/src/java.base/share/classes/sun/misc/resources/Messages_zh_CN.java Thu May 21 16:20:20 2015 -0700
@@ -26,7 +26,7 @@
package sun.misc.resources;
/**
- * <p> This class represents the <code>ResourceBundle</code>
+ * This class represents the {@code ResourceBundle}
* for sun.misc.
*
* @author Michael Colburn
@@ -35,9 +35,9 @@
public class Messages_zh_CN extends java.util.ListResourceBundle {
/**
- * Returns the contents of this <code>ResourceBundle</code>.
- * <p>
- * @return the contents of this <code>ResourceBundle</code>.
+ * Returns the contents of this {@code ResourceBundle}.
+ *
+ * @return the contents of this {@code ResourceBundle}.
*/
public Object[][] getContents() {
return contents;
--- a/jdk/src/java.base/share/classes/sun/misc/resources/Messages_zh_TW.java Thu May 21 10:07:38 2015 -0700
+++ b/jdk/src/java.base/share/classes/sun/misc/resources/Messages_zh_TW.java Thu May 21 16:20:20 2015 -0700
@@ -26,7 +26,7 @@
package sun.misc.resources;
/**
- * <p> This class represents the <code>ResourceBundle</code>
+ * This class represents the {@code ResourceBundle}
* for sun.misc.
*
* @author Michael Colburn
@@ -35,9 +35,9 @@
public class Messages_zh_TW extends java.util.ListResourceBundle {
/**
- * Returns the contents of this <code>ResourceBundle</code>.
- * <p>
- * @return the contents of this <code>ResourceBundle</code>.
+ * Returns the contents of this {@code ResourceBundle}.
+ *
+ * @return the contents of this {@code ResourceBundle}.
*/
public Object[][] getContents() {
return contents;
--- a/jdk/src/java.base/share/classes/sun/net/www/protocol/http/HttpURLConnection.java Thu May 21 10:07:38 2015 -0700
+++ b/jdk/src/java.base/share/classes/sun/net/www/protocol/http/HttpURLConnection.java Thu May 21 16:20:20 2015 -0700
@@ -983,7 +983,7 @@
SocketPermission p = URLtoSocketPermission(this.url);
if (p != null) {
try {
- AccessController.doPrivileged(
+ AccessController.doPrivilegedWithCombiner(
new PrivilegedExceptionAction<>() {
public Void run() throws IOException {
plainConnect0();
@@ -1244,7 +1244,7 @@
if (p != null) {
try {
- return AccessController.doPrivileged(
+ return AccessController.doPrivilegedWithCombiner(
new PrivilegedExceptionAction<>() {
public OutputStream run() throws IOException {
return getOutputStream0();
@@ -1422,7 +1422,7 @@
if (p != null) {
try {
- return AccessController.doPrivileged(
+ return AccessController.doPrivilegedWithCombiner(
new PrivilegedExceptionAction<>() {
public InputStream run() throws IOException {
return getInputStream0();
@@ -2565,7 +2565,7 @@
if (p != null) {
try {
- return AccessController.doPrivileged(
+ return AccessController.doPrivilegedWithCombiner(
new PrivilegedExceptionAction<>() {
public Boolean run() throws IOException {
return followRedirect0(loc, stat, locUrl0);
--- a/jdk/src/java.base/share/classes/sun/nio/cs/HKSCS.java Thu May 21 10:07:38 2015 -0700
+++ b/jdk/src/java.base/share/classes/sun/nio/cs/HKSCS.java Thu May 21 16:20:20 2015 -0700
@@ -378,7 +378,6 @@
dst[dp++] = repl[1];
continue;
}
- sp++;
}
if (bb > MAX_SINGLEBYTE) { // DoubleByte
dst[dp++] = (byte)(bb >> 8);
--- a/jdk/src/java.base/share/classes/sun/nio/cs/Surrogate.java Thu May 21 10:07:38 2015 -0700
+++ b/jdk/src/java.base/share/classes/sun/nio/cs/Surrogate.java Thu May 21 16:20:20 2015 -0700
@@ -175,10 +175,10 @@
* @param in The source buffer, from which one more character
* will be consumed if c is a high surrogate
*
- * @returns Either a parsed UCS-4 character, in which case the isPair()
- * and increment() methods will return meaningful values, or
- * -1, in which case error() will return a descriptive result
- * object
+ * @return Either a parsed UCS-4 character, in which case the isPair()
+ * and increment() methods will return meaningful values, or
+ * -1, in which case error() will return a descriptive result
+ * object
*/
public int parse(char c, CharBuffer in) {
if (Character.isHighSurrogate(c)) {
@@ -216,10 +216,10 @@
* @param ip The input index
* @param il The input limit
*
- * @returns Either a parsed UCS-4 character, in which case the isPair()
- * and increment() methods will return meaningful values, or
- * -1, in which case error() will return a descriptive result
- * object
+ * @return Either a parsed UCS-4 character, in which case the isPair()
+ * and increment() methods will return meaningful values, or
+ * -1, in which case error() will return a descriptive result
+ * object
*/
public int parse(char c, char[] ia, int ip, int il) {
assert (ia[ip] == c);
@@ -280,9 +280,9 @@
* @param dst The destination buffer, to which one or two UTF-16
* characters will be written
*
- * @returns Either a positive count of the number of UTF-16 characters
- * written to the destination buffer, or -1, in which case
- * error() will return a descriptive result object
+ * @return Either a positive count of the number of UTF-16 characters
+ * written to the destination buffer, or -1, in which case
+ * error() will return a descriptive result object
*/
public int generate(int uc, int len, CharBuffer dst) {
if (Character.isBmpCodePoint(uc)) {
@@ -325,9 +325,9 @@
* @param dp The destination position
* @param dl The destination limit
*
- * @returns Either a positive count of the number of UTF-16 characters
- * written to the destination buffer, or -1, in which case
- * error() will return a descriptive result object
+ * @return Either a positive count of the number of UTF-16 characters
+ * written to the destination buffer, or -1, in which case
+ * error() will return a descriptive result object
*/
public int generate(int uc, int len, char[] da, int dp, int dl) {
if (Character.isBmpCodePoint(uc)) {
--- a/jdk/src/java.base/share/classes/sun/security/x509/AVA.java Thu May 21 10:07:38 2015 -0700
+++ b/jdk/src/java.base/share/classes/sun/security/x509/AVA.java Thu May 21 16:20:20 2015 -0700
@@ -454,7 +454,7 @@
if (embeddedHex.size() > 0) {
// add space(s) before embedded hex bytes
for (int i = 0; i < spaceCount; i++) {
- temp.append(" ");
+ temp.append(' ');
}
spaceCount = 0;
@@ -472,7 +472,7 @@
} else {
// add space(s)
for (int i = 0; i < spaceCount; i++) {
- temp.append(" ");
+ temp.append(' ');
}
spaceCount = 0;
temp.append((char)c);
@@ -853,7 +853,7 @@
}
sbuffer.append(c);
}
- typeAndValue.append(sbuffer.toString());
+ typeAndValue.append(sbuffer);
}
return typeAndValue.toString();
}
@@ -1039,7 +1039,7 @@
StringBuilder retval = new StringBuilder(40);
retval.append(keyword);
- retval.append("=");
+ retval.append('=');
try {
String valStr = value.getAsString();
@@ -1147,9 +1147,11 @@
// Emit the string ... quote it if needed
// if string is already quoted, don't re-quote
if (!alreadyQuoted && quoteNeeded) {
- retval.append("\"" + sbuffer.toString() + "\"");
+ retval.append('\"')
+ .append(sbuffer)
+ .append('\"');
} else {
- retval.append(sbuffer.toString());
+ retval.append(sbuffer);
}
}
} catch (IOException e) {
--- a/jdk/src/java.base/share/classes/sun/security/x509/AuthorityKeyIdentifierExtension.java Thu May 21 10:07:38 2015 -0700
+++ b/jdk/src/java.base/share/classes/sun/security/x509/AuthorityKeyIdentifierExtension.java Thu May 21 16:20:20 2015 -0700
@@ -196,17 +196,20 @@
* Return the object as a string.
*/
public String toString() {
- String s = super.toString() + "AuthorityKeyIdentifier [\n";
+ StringBuilder sb = new StringBuilder();
+ sb.append(super.toString())
+ .append("AuthorityKeyIdentifier [\n");
if (id != null) {
- s += id.toString(); // id already has a newline
+ sb.append(id); // id already has a newline
}
if (names != null) {
- s += names.toString() + "\n";
+ sb.append(names).append('\n');
}
if (serialNum != null) {
- s += serialNum.toString() + "\n";
+ sb.append(serialNum).append('\n');
}
- return (s + "]\n");
+ sb.append("]\n");
+ return sb.toString();
}
/**
--- a/jdk/src/java.base/share/classes/sun/security/x509/BasicConstraintsExtension.java Thu May 21 10:07:38 2015 -0700
+++ b/jdk/src/java.base/share/classes/sun/security/x509/BasicConstraintsExtension.java Thu May 21 16:20:20 2015 -0700
@@ -171,15 +171,11 @@
* Return user readable form of extension.
*/
public String toString() {
- String s = super.toString() + "BasicConstraints:[\n";
-
- s += ((ca) ? (" CA:true") : (" CA:false")) + "\n";
- if (pathLen >= 0) {
- s += " PathLen:" + pathLen + "\n";
- } else {
- s += " PathLen: undefined\n";
- }
- return (s + "]\n");
+ return super.toString() +
+ "BasicConstraints:[\n CA:" + ca +
+ "\n PathLen:" +
+ ((pathLen >= 0) ? String.valueOf(pathLen) : " undefined") +
+ "\n]\n";
}
/**
--- a/jdk/src/java.base/share/classes/sun/security/x509/CRLDistributionPointsExtension.java Thu May 21 10:07:38 2015 -0700
+++ b/jdk/src/java.base/share/classes/sun/security/x509/CRLDistributionPointsExtension.java Thu May 21 16:20:20 2015 -0700
@@ -231,8 +231,8 @@
distributionPoints = (List<DistributionPoint>)obj;
} else {
throw new IOException("Attribute name [" + name +
- "] not recognized by " +
- "CertAttrSet:" + extensionName + ".");
+ "] not recognized by " +
+ "CertAttrSet:" + extensionName + '.');
}
encodeThis();
}
@@ -245,8 +245,8 @@
return distributionPoints;
} else {
throw new IOException("Attribute name [" + name +
- "] not recognized by " +
- "CertAttrSet:" + extensionName + ".");
+ "] not recognized by " +
+ "CertAttrSet:" + extensionName + '.');
}
}
--- a/jdk/src/java.base/share/classes/sun/security/x509/CRLNumberExtension.java Thu May 21 10:07:38 2015 -0700
+++ b/jdk/src/java.base/share/classes/sun/security/x509/CRLNumberExtension.java Thu May 21 16:20:20 2015 -0700
@@ -146,8 +146,8 @@
}
crlNumber = (BigInteger)obj;
} else {
- throw new IOException("Attribute name not recognized by"
- + " CertAttrSet:" + extensionName + ".");
+ throw new IOException("Attribute name not recognized by" +
+ " CertAttrSet:" + extensionName + '.');
}
encodeThis();
}
@@ -172,8 +172,8 @@
if (name.equalsIgnoreCase(NUMBER)) {
crlNumber = null;
} else {
- throw new IOException("Attribute name not recognized by"
- + " CertAttrSet:" + extensionName + ".");
+ throw new IOException("Attribute name not recognized by" +
+ " CertAttrSet:" + extensionName + '.');
}
encodeThis();
}
@@ -182,10 +182,15 @@
* Returns a printable representation of the CRLNumberExtension.
*/
public String toString() {
- String s = super.toString() + extensionLabel + ": " +
- ((crlNumber == null) ? "" : Debug.toHexString(crlNumber))
- + "\n";
- return (s);
+ StringBuilder sb = new StringBuilder();
+ sb.append(super.toString())
+ .append(extensionLabel)
+ .append(": ");
+ if (crlNumber != null) {
+ sb.append(Debug.toHexString(crlNumber));
+ }
+ sb.append('\n');
+ return sb.toString();
}
/**
@@ -195,7 +200,7 @@
* @exception IOException on encoding errors.
*/
public void encode(OutputStream out) throws IOException {
- DerOutputStream tmp = new DerOutputStream();
+ DerOutputStream tmp = new DerOutputStream();
encode(out, PKIXExtensions.CRLNumber_Id, true);
}
--- a/jdk/src/java.base/share/classes/sun/security/x509/CertException.java Thu May 21 10:07:38 2015 -0700
+++ b/jdk/src/java.base/share/classes/sun/security/x509/CertException.java Thu May 21 16:20:20 2015 -0700
@@ -158,7 +158,7 @@
*/
public String toString()
{
- return "[Certificate Exception: " + getMessage() + "]";
+ return "[Certificate Exception: " + getMessage() + ']';
}
/**
@@ -168,6 +168,6 @@
{
return getVerfDescription()
+ ( (moreData != null)
- ? ( "\n (" + moreData + ")" ) : "" );
+ ? ( "\n (" + moreData + ')' ) : "" );
}
}
--- a/jdk/src/java.base/share/classes/sun/security/x509/CertificatePoliciesExtension.java Thu May 21 10:07:38 2015 -0700
+++ b/jdk/src/java.base/share/classes/sun/security/x509/CertificatePoliciesExtension.java Thu May 21 16:20:20 2015 -0700
@@ -160,10 +160,12 @@
if (certPolicies == null) {
return "";
}
- StringBuilder sb = new StringBuilder(super.toString());
- sb.append("CertificatePolicies [\n");
+
+ StringBuilder sb = new StringBuilder();
+ sb.append(super.toString())
+ .append("CertificatePolicies [\n");
for (PolicyInformation info : certPolicies) {
- sb.append(info.toString());
+ sb.append(info);
}
sb.append("]\n");
return sb.toString();
--- a/jdk/src/java.base/share/classes/sun/security/x509/CertificateValidity.java Thu May 21 10:07:38 2015 -0700
+++ b/jdk/src/java.base/share/classes/sun/security/x509/CertificateValidity.java Thu May 21 16:20:20 2015 -0700
@@ -134,8 +134,8 @@
public String toString() {
if (notBefore == null || notAfter == null)
return "";
- return ("Validity: [From: " + notBefore.toString() +
- ",\n To: " + notAfter.toString() + "]");
+ return "Validity: [From: " + notBefore +
+ ",\n To: " + notAfter + ']';
}
/**
--- a/jdk/src/java.base/share/classes/sun/security/x509/DistributionPoint.java Thu May 21 10:07:38 2015 -0700
+++ b/jdk/src/java.base/share/classes/sun/security/x509/DistributionPoint.java Thu May 21 16:20:20 2015 -0700
@@ -380,23 +380,29 @@
*/
public String toString() {
StringBuilder sb = new StringBuilder();
+ sb.append("DistributionPoint:\n ");
if (fullName != null) {
- sb.append("DistributionPoint:\n " + fullName + "\n");
+ sb.append(fullName);
}
if (relativeName != null) {
- sb.append("DistributionPoint:\n " + relativeName + "\n");
+ sb.append(relativeName);
}
+ sb.append('\n');
if (reasonFlags != null) {
sb.append(" ReasonFlags:\n");
for (int i = 0; i < reasonFlags.length; i++) {
if (reasonFlags[i]) {
- sb.append(" " + reasonToString(i) + "\n");
+ sb.append(" ")
+ .append(reasonToString(i))
+ .append('\n');
}
}
}
if (crlIssuer != null) {
- sb.append(" CRLIssuer:" + crlIssuer + "\n");
+ sb.append(" CRLIssuer:")
+ .append(crlIssuer)
+ .append('\n');
}
return sb.toString();
}
--- a/jdk/src/java.base/share/classes/sun/security/x509/DistributionPointName.java Thu May 21 10:07:38 2015 -0700
+++ b/jdk/src/java.base/share/classes/sun/security/x509/DistributionPointName.java Thu May 21 16:20:20 2015 -0700
@@ -230,13 +230,13 @@
*/
public String toString() {
StringBuilder sb = new StringBuilder();
+ sb.append("DistributionPointName:\n ");
if (fullName != null) {
- sb.append("DistributionPointName:\n " + fullName + "\n");
-
+ sb.append(fullName);
} else {
- sb.append("DistributionPointName:\n " + relativeName + "\n");
+ sb.append(relativeName);
}
-
+ sb.append('\n');
return sb.toString();
}
}
--- a/jdk/src/java.base/share/classes/sun/security/x509/EDIPartyName.java Thu May 21 10:07:38 2015 -0700
+++ b/jdk/src/java.base/share/classes/sun/security/x509/EDIPartyName.java Thu May 21 16:20:20 2015 -0700
@@ -209,10 +209,15 @@
* Return the printable string.
*/
public String toString() {
- return ("EDIPartyName: " +
- ((assigner == null) ? "" :
- (" nameAssigner = " + assigner + ","))
- + " partyName = " + party);
+ StringBuilder sb = new StringBuilder("EDIPartyName: ");
+ if (assigner != null) {
+ sb.append(" nameAssigner = ")
+ .append(assigner)
+ .append(',');
+ }
+ sb.append(" partyName = ")
+ .append(party);
+ return sb.toString();
}
/**
--- a/jdk/src/java.base/share/classes/sun/security/x509/Extension.java Thu May 21 10:07:38 2015 -0700
+++ b/jdk/src/java.base/share/classes/sun/security/x509/Extension.java Thu May 21 16:20:20 2015 -0700
@@ -219,13 +219,8 @@
* Returns the Extension in user readable form.
*/
public String toString() {
- String s = "ObjectId: " + extensionId.toString();
- if (critical) {
- s += " Criticality=true\n";
- } else {
- s += " Criticality=false\n";
- }
- return (s);
+ return "ObjectId: " + extensionId +
+ " Criticality=" + critical + '\n';
}
// Value to mix up the hash
--- a/jdk/src/java.base/share/classes/sun/security/x509/GeneralSubtree.java Thu May 21 10:07:38 2015 -0700
+++ b/jdk/src/java.base/share/classes/sun/security/x509/GeneralSubtree.java Thu May 21 16:20:20 2015 -0700
@@ -127,15 +127,22 @@
* Return a printable string of the GeneralSubtree.
*/
public String toString() {
- String s = "\n GeneralSubtree: [\n" +
- " GeneralName: " + ((name == null) ? "" : name.toString()) +
- "\n Minimum: " + minimum;
- if (maximum == -1) {
- s += "\t Maximum: undefined";
- } else
- s += "\t Maximum: " + maximum;
- s += " ]\n";
- return (s);
+ StringBuilder sb = new StringBuilder();
+ sb.append("\n GeneralSubtree: [")
+ .append("\n GeneralName: ");
+ if (name != null) {
+ sb.append(name);
+ }
+ sb.append("\n Minimum: ")
+ .append(minimum)
+ .append("\n Maximum: ");
+ if (maximum == -1) {
+ sb.append("undefined");
+ } else {
+ sb.append(maximum);
+ }
+ sb.append(" ]\n");
+ return sb.toString();
}
/**
--- a/jdk/src/java.base/share/classes/sun/security/x509/GeneralSubtrees.java Thu May 21 10:07:38 2015 -0700
+++ b/jdk/src/java.base/share/classes/sun/security/x509/GeneralSubtrees.java Thu May 21 16:20:20 2015 -0700
@@ -124,8 +124,7 @@
* Return a printable string of the GeneralSubtree.
*/
public String toString() {
- String s = " GeneralSubtrees:\n" + trees.toString() + "\n";
- return s;
+ return " GeneralSubtrees:\n" + trees + '\n';
}
/**
--- a/jdk/src/java.base/share/classes/sun/security/x509/IPAddressName.java Thu May 21 10:07:38 2015 -0700
+++ b/jdk/src/java.base/share/classes/sun/security/x509/IPAddressName.java Thu May 21 16:20:20 2015 -0700
@@ -263,7 +263,7 @@
if (address.length == 8) {
byte[] mask = new byte[4];
System.arraycopy(address, 4, mask, 0, 4);
- name = name + "/" +
+ name = name + '/' +
InetAddress.getByAddress(mask).getHostAddress();
}
} else {
@@ -285,7 +285,7 @@
if (!ba.get(i))
break;
}
- name = name + "/" + i;
+ name = name + '/' + i;
// Verify remaining bits 0
for (; i < 16*8; i++) {
if (ba.get(i)) {
--- a/jdk/src/java.base/share/classes/sun/security/x509/IssuerAlternativeNameExtension.java Thu May 21 10:07:38 2015 -0700
+++ b/jdk/src/java.base/share/classes/sun/security/x509/IssuerAlternativeNameExtension.java Thu May 21 16:20:20 2015 -0700
@@ -140,17 +140,20 @@
* Returns a printable representation of the IssuerAlternativeName.
*/
public String toString() {
-
- String result = super.toString() + "IssuerAlternativeName [\n";
- if(names == null) {
- result += " null\n";
+ StringBuilder sb = new StringBuilder();
+ sb.append(super.toString())
+ .append("IssuerAlternativeName [\n");
+ if (names == null) {
+ sb.append(" null\n");
} else {
- for(GeneralName name: names.names()) {
- result += " "+name+"\n";
+ for (GeneralName name : names.names()) {
+ sb.append(" ")
+ .append(name)
+ .append('\n');
}
}
- result += "]\n";
- return result;
+ sb.append("]\n");
+ return sb.toString();
}
/**
--- a/jdk/src/java.base/share/classes/sun/security/x509/IssuingDistributionPointExtension.java Thu May 21 10:07:38 2015 -0700
+++ b/jdk/src/java.base/share/classes/sun/security/x509/IssuingDistributionPointExtension.java Thu May 21 16:20:20 2015 -0700
@@ -441,9 +441,9 @@
* Returns the extension as user readable string.
*/
public String toString() {
-
- StringBuilder sb = new StringBuilder(super.toString());
- sb.append("IssuingDistributionPoint [\n ");
+ StringBuilder sb = new StringBuilder();
+ sb.append(super.toString())
+ .append("IssuingDistributionPoint [\n ");
if (distributionPoint != null) {
sb.append(distributionPoint);
@@ -453,23 +453,18 @@
sb.append(revocationReasons);
}
- sb.append((hasOnlyUserCerts)
- ? (" Only contains user certs: true")
- : (" Only contains user certs: false")).append("\n");
-
- sb.append((hasOnlyCACerts)
- ? (" Only contains CA certs: true")
- : (" Only contains CA certs: false")).append("\n");
-
- sb.append((hasOnlyAttributeCerts)
- ? (" Only contains attribute certs: true")
- : (" Only contains attribute certs: false")).append("\n");
-
- sb.append((isIndirectCRL)
- ? (" Indirect CRL: true")
- : (" Indirect CRL: false")).append("\n");
-
- sb.append("]\n");
+ sb.append(" Only contains user certs: ")
+ .append(hasOnlyUserCerts)
+ .append('\n')
+ .append(" Only contains CA certs: ")
+ .append(hasOnlyCACerts)
+ .append('\n')
+ .append(" Only contains attribute certs: ")
+ .append(hasOnlyAttributeCerts)
+ .append('\n')
+ .append(" Indirect CRL: ")
+ .append(isIndirectCRL)
+ .append("\n]\n");
return sb.toString();
}
--- a/jdk/src/java.base/share/classes/sun/security/x509/NameConstraintsExtension.java Thu May 21 10:07:38 2015 -0700
+++ b/jdk/src/java.base/share/classes/sun/security/x509/NameConstraintsExtension.java Thu May 21 16:20:20 2015 -0700
@@ -214,12 +214,19 @@
* Return the printable string.
*/
public String toString() {
- return (super.toString() + "NameConstraints: [" +
- ((permitted == null) ? "" :
- ("\n Permitted:" + permitted.toString())) +
- ((excluded == null) ? "" :
- ("\n Excluded:" + excluded.toString()))
- + " ]\n");
+ StringBuilder sb = new StringBuilder();
+ sb.append(super.toString())
+ .append("NameConstraints: [");
+ if (permitted != null) {
+ sb.append("\n Permitted:")
+ .append(permitted);
+ }
+ if (excluded != null) {
+ sb.append("\n Excluded:")
+ .append(excluded);
+ }
+ sb.append(" ]\n");
+ return sb.toString();
}
/**
--- a/jdk/src/java.base/share/classes/sun/security/x509/PolicyConstraintsExtension.java Thu May 21 10:07:38 2015 -0700
+++ b/jdk/src/java.base/share/classes/sun/security/x509/PolicyConstraintsExtension.java Thu May 21 16:20:20 2015 -0700
@@ -175,19 +175,24 @@
* Return the extension as user readable string.
*/
public String toString() {
- String s;
- s = super.toString() + "PolicyConstraints: [" + " Require: ";
- if (require == -1)
- s += "unspecified;";
- else
- s += require + ";";
- s += "\tInhibit: ";
- if (inhibit == -1)
- s += "unspecified";
- else
- s += inhibit;
- s += " ]\n";
- return s;
+ StringBuilder sb = new StringBuilder();
+ sb.append(super.toString())
+ .append("PolicyConstraints: [")
+ .append(" Require: ");
+ if (require == -1) {
+ sb.append("unspecified;");
+ } else {
+ sb.append(require)
+ .append(';');
+ }
+ sb.append("\tInhibit: ");
+ if (inhibit == -1) {
+ sb.append("unspecified");
+ } else {
+ sb.append(inhibit);
+ }
+ sb.append(" ]\n");
+ return sb.toString();
}
/**
--- a/jdk/src/java.base/share/classes/sun/security/x509/PolicyInformation.java Thu May 21 10:07:38 2015 -0700
+++ b/jdk/src/java.base/share/classes/sun/security/x509/PolicyInformation.java Thu May 21 16:20:20 2015 -0700
@@ -258,9 +258,7 @@
* Return a printable representation of the PolicyInformation.
*/
public String toString() {
- StringBuilder s = new StringBuilder(" [" + policyIdentifier.toString());
- s.append(policyQualifiers + " ]\n");
- return s.toString();
+ return " [" + policyIdentifier + policyQualifiers + " ]\n";
}
/**
--- a/jdk/src/java.base/share/classes/sun/security/x509/PrivateKeyUsageExtension.java Thu May 21 10:07:38 2015 -0700
+++ b/jdk/src/java.base/share/classes/sun/security/x509/PrivateKeyUsageExtension.java Thu May 21 16:20:20 2015 -0700
@@ -175,11 +175,22 @@
* Return the printable string.
*/
public String toString() {
- return(super.toString() +
- "PrivateKeyUsage: [\n" +
- ((notBefore == null) ? "" : "From: " + notBefore.toString() + ", ")
- + ((notAfter == null) ? "" : "To: " + notAfter.toString())
- + "]\n");
+ StringBuilder sb = new StringBuilder();
+ sb.append(super.toString())
+ .append("PrivateKeyUsage: [\n");
+ if (notBefore != null) {
+ sb.append("From: ")
+ .append(notBefore);
+ if (notAfter != null) {
+ sb.append(", ");
+ }
+ }
+ if (notAfter != null) {
+ sb.append("To: ")
+ .append(notAfter);
+ }
+ sb.append("]\n");
+ return sb.toString();
}
/**
--- a/jdk/src/java.base/share/classes/sun/security/x509/RDN.java Thu May 21 10:07:38 2015 -0700
+++ b/jdk/src/java.base/share/classes/sun/security/x509/RDN.java Thu May 21 16:20:20 2015 -0700
@@ -348,14 +348,11 @@
return assertion[0].toString();
}
- StringBuilder sb = new StringBuilder();
+ StringJoiner sj = new StringJoiner(" + ");
for (int i = 0; i < assertion.length; i++) {
- if (i != 0) {
- sb.append(" + ");
- }
- sb.append(assertion[i].toString());
+ sj.add(assertion[i].toString());
}
- return sb.toString();
+ return sj.toString();
}
/*
@@ -376,14 +373,11 @@
return assertion[0].toRFC1779String(oidMap);
}
- StringBuilder sb = new StringBuilder();
+ StringJoiner sj = new StringJoiner(" + ");
for (int i = 0; i < assertion.length; i++) {
- if (i != 0) {
- sb.append(" + ");
- }
- sb.append(assertion[i].toRFC1779String(oidMap));
+ sj.add(assertion[i].toRFC1779String(oidMap));
}
- return sb.toString();
+ return sj.toString();
}
/*
--- a/jdk/src/java.base/share/classes/sun/security/x509/SerialNumber.java Thu May 21 10:07:38 2015 -0700
+++ b/jdk/src/java.base/share/classes/sun/security/x509/SerialNumber.java Thu May 21 16:20:20 2015 -0700
@@ -101,7 +101,7 @@
* Return the SerialNumber as user readable string.
*/
public String toString() {
- return ("SerialNumber: [" + Debug.toHexString(serialNum) + "]");
+ return "SerialNumber: [" + Debug.toHexString(serialNum) + ']';
}
/**
--- a/jdk/src/java.base/share/classes/sun/security/x509/SubjectInfoAccessExtension.java Thu May 21 10:07:38 2015 -0700
+++ b/jdk/src/java.base/share/classes/sun/security/x509/SubjectInfoAccessExtension.java Thu May 21 16:20:20 2015 -0700
@@ -238,8 +238,8 @@
* Return the extension as user readable string.
*/
public String toString() {
- return super.toString() + "SubjectInfoAccess [\n "
- + accessDescriptions + "\n]\n";
+ return super.toString() +
+ "SubjectInfoAccess [\n " + accessDescriptions + "\n]\n";
}
}
--- a/jdk/src/java.base/share/classes/sun/security/x509/SubjectKeyIdentifierExtension.java Thu May 21 10:07:38 2015 -0700
+++ b/jdk/src/java.base/share/classes/sun/security/x509/SubjectKeyIdentifierExtension.java Thu May 21 16:20:20 2015 -0700
@@ -115,8 +115,8 @@
* Returns a printable representation.
*/
public String toString() {
- return super.toString() + "SubjectKeyIdentifier [\n"
- + String.valueOf(id) + "]\n";
+ return super.toString() +
+ "SubjectKeyIdentifier [\n" + id + "]\n";
}
/**
--- a/jdk/src/java.base/share/classes/sun/security/x509/X500Name.java Thu May 21 10:07:38 2015 -0700
+++ b/jdk/src/java.base/share/classes/sun/security/x509/X500Name.java Thu May 21 16:20:20 2015 -0700
@@ -31,6 +31,7 @@
import java.security.AccessController;
import java.security.Principal;
import java.util.*;
+import java.util.StringJoiner;
import sun.security.util.*;
import javax.security.auth.x500.X500Principal;
@@ -689,14 +690,11 @@
* The encodings of adjoining RelativeDistinguishedNames are separated
* by a comma character (',' ASCII 44).
*/
- StringBuilder fullname = new StringBuilder(48);
+ StringJoiner sj = new StringJoiner(",");
for (int i = names.length - 1; i >= 0; i--) {
- if (i < names.length - 1) {
- fullname.append(',');
- }
- fullname.append(names[i].toRFC2253String(oidMap));
+ sj.add(names[i].toRFC2253String(oidMap));
}
- return fullname.toString();
+ return sj.toString();
}
public String getRFC2253CanonicalName() {
@@ -722,14 +720,11 @@
* The encodings of adjoining RelativeDistinguishedNames are separated
* by a comma character (',' ASCII 44).
*/
- StringBuilder fullname = new StringBuilder(48);
+ StringJoiner sj = new StringJoiner(",");
for (int i = names.length - 1; i >= 0; i--) {
- if (i < names.length - 1) {
- fullname.append(',');
- }
- fullname.append(names[i].toRFC2253String(true));
+ sj.add(names[i].toRFC2253String(true));
}
- canonicalDn = fullname.toString();
+ canonicalDn = sj.toString();
return canonicalDn;
}
@@ -1064,16 +1059,16 @@
return;
}
- StringBuilder sb = new StringBuilder(48);
- if (names != null) {
- for (int i = names.length - 1; i >= 0; i--) {
- if (i != names.length - 1) {
- sb.append(", ");
- }
- sb.append(names[i].toString());
- }
+ if (names == null) {
+ dn = "";
+ return;
}
- dn = sb.toString();
+
+ StringJoiner sj = new StringJoiner(", ");
+ for (int i = names.length - 1; i >= 0; i--) {
+ sj.add(names[i].toString());
+ }
+ dn = sj.toString();
}
/*
@@ -1090,16 +1085,15 @@
return names[0].toRFC1779String(oidMap);
}
- StringBuilder sb = new StringBuilder(48);
- if (names != null) {
- for (int i = names.length - 1; i >= 0; i--) {
- if (i != names.length - 1) {
- sb.append(", ");
- }
- sb.append(names[i].toRFC1779String(oidMap));
- }
+ if (names == null) {
+ return "";
}
- return sb.toString();
+
+ StringJoiner sj = new StringJoiner(", ");
+ for (int i = names.length - 1; i >= 0; i--) {
+ sj.add(names[i].toRFC1779String(oidMap));
+ }
+ return sj.toString();
}
/****************************************************************/
--- a/jdk/src/java.base/share/classes/sun/security/x509/X509CRLEntryImpl.java Thu May 21 10:07:38 2015 -0700
+++ b/jdk/src/java.base/share/classes/sun/security/x509/X509CRLEntryImpl.java Thu May 21 16:20:20 2015 -0700
@@ -291,40 +291,47 @@
public String toString() {
StringBuilder sb = new StringBuilder();
- sb.append(serialNumber.toString());
- sb.append(" On: " + revocationDate.toString());
+ sb.append(serialNumber)
+ .append(" On: ")
+ .append(revocationDate);
if (certIssuer != null) {
- sb.append("\n Certificate issuer: " + certIssuer);
+ sb.append("\n Certificate issuer: ")
+ .append(certIssuer);
}
if (extensions != null) {
Collection<Extension> allEntryExts = extensions.getAllExtensions();
Extension[] exts = allEntryExts.toArray(new Extension[0]);
- sb.append("\n CRL Entry Extensions: " + exts.length);
+ sb.append("\n CRL Entry Extensions: ")
+ .append(exts.length);
for (int i = 0; i < exts.length; i++) {
- sb.append("\n [" + (i+1) + "]: ");
+ sb.append("\n [")
+ .append(i+1)
+ .append("]: ");
Extension ext = exts[i];
try {
if (OIDMap.getClass(ext.getExtensionId()) == null) {
- sb.append(ext.toString());
+ sb.append(ext);
byte[] extValue = ext.getExtensionValue();
if (extValue != null) {
DerOutputStream out = new DerOutputStream();
out.putOctetString(extValue);
extValue = out.toByteArray();
HexDumpEncoder enc = new HexDumpEncoder();
- sb.append("Extension unknown: "
- + "DER encoded OCTET string =\n"
- + enc.encodeBuffer(extValue) + "\n");
+ sb.append("Extension unknown: ")
+ .append("DER encoded OCTET string =\n")
+ .append(enc.encodeBuffer(extValue))
+ .append('\n');
}
- } else
- sb.append(ext.toString()); //sub-class exists
+ } else {
+ sb.append(ext); //sub-class exists
+ }
} catch (Exception e) {
sb.append(", Error parsing this extension");
}
}
}
- sb.append("\n");
+ sb.append('\n');
return sb.toString();
}
--- a/jdk/src/java.base/share/classes/sun/security/x509/X509CRLImpl.java Thu May 21 10:07:38 2015 -0700
+++ b/jdk/src/java.base/share/classes/sun/security/x509/X509CRLImpl.java Thu May 21 16:20:20 2015 -0700
@@ -537,47 +537,65 @@
*/
public String toString() {
StringBuilder sb = new StringBuilder();
- sb.append("X.509 CRL v" + (version+1) + "\n");
+ sb.append("X.509 CRL v")
+ .append(version+1)
+ .append('\n');
if (sigAlgId != null)
- sb.append("Signature Algorithm: " + sigAlgId.toString() +
- ", OID=" + (sigAlgId.getOID()).toString() + "\n");
+ sb.append("Signature Algorithm: ")
+ .append(sigAlgId)
+ .append(", OID=")
+ .append(sigAlgId.getOID())
+ .append('\n');
if (issuer != null)
- sb.append("Issuer: " + issuer.toString() + "\n");
+ sb.append("Issuer: ")
+ .append(issuer)
+ .append('\n');
if (thisUpdate != null)
- sb.append("\nThis Update: " + thisUpdate.toString() + "\n");
+ sb.append("\nThis Update: ")
+ .append(thisUpdate)
+ .append('\n');
if (nextUpdate != null)
- sb.append("Next Update: " + nextUpdate.toString() + "\n");
+ sb.append("Next Update: ")
+ .append(nextUpdate)
+ .append('\n');
if (revokedList.isEmpty())
sb.append("\nNO certificates have been revoked\n");
else {
- sb.append("\nRevoked Certificates: " + revokedList.size());
+ sb.append("\nRevoked Certificates: ")
+ .append(revokedList.size());
int i = 1;
for (X509CRLEntry entry: revokedList) {
- sb.append("\n[" + i++ + "] " + entry.toString());
+ sb.append("\n[")
+ .append(i++)
+ .append("] ")
+ .append(entry);
}
}
if (extensions != null) {
Collection<Extension> allExts = extensions.getAllExtensions();
Object[] objs = allExts.toArray();
- sb.append("\nCRL Extensions: " + objs.length);
+ sb.append("\nCRL Extensions: ")
+ .append(objs.length);
for (int i = 0; i < objs.length; i++) {
- sb.append("\n[" + (i+1) + "]: ");
+ sb.append("\n[").append(i+1).append("]: ");
Extension ext = (Extension)objs[i];
try {
- if (OIDMap.getClass(ext.getExtensionId()) == null) {
- sb.append(ext.toString());
- byte[] extValue = ext.getExtensionValue();
- if (extValue != null) {
- DerOutputStream out = new DerOutputStream();
- out.putOctetString(extValue);
- extValue = out.toByteArray();
- HexDumpEncoder enc = new HexDumpEncoder();
- sb.append("Extension unknown: "
- + "DER encoded OCTET string =\n"
- + enc.encodeBuffer(extValue) + "\n");
- }
- } else
- sb.append(ext.toString()); // sub-class exists
+ if (OIDMap.getClass(ext.getExtensionId()) == null) {
+ sb.append(ext);
+ byte[] extValue = ext.getExtensionValue();
+ if (extValue != null) {
+ DerOutputStream out = new DerOutputStream();
+ out.putOctetString(extValue);
+ extValue = out.toByteArray();
+ HexDumpEncoder enc = new HexDumpEncoder();
+ sb.append("Extension unknown: ")
+ .append("DER encoded OCTET string =\n")
+ .append(enc.encodeBuffer(extValue))
+ .append('\n');
+ }
+ } else {
+ sb.append(ext); // sub-class exists
+ }
} catch (Exception e) {
sb.append(", Error parsing this extension");
}
@@ -585,10 +603,12 @@
}
if (signature != null) {
HexDumpEncoder encoder = new HexDumpEncoder();
- sb.append("\nSignature:\n" + encoder.encodeBuffer(signature)
- + "\n");
- } else
+ sb.append("\nSignature:\n")
+ .append(encoder.encodeBuffer(signature))
+ .append('\n');
+ } else {
sb.append("NOT signed yet\n");
+ }
return sb.toString();
}
--- a/jdk/src/java.base/share/classes/sun/security/x509/X509CertImpl.java Thu May 21 10:07:38 2015 -0700
+++ b/jdk/src/java.base/share/classes/sun/security/x509/X509CertImpl.java Thu May 21 16:20:20 2015 -0700
@@ -81,7 +81,7 @@
private static final long serialVersionUID = -3457612960190864406L;
- private static final String DOT = ".";
+ private static final char DOT = '.';
/**
* Public attribute names.
*/
@@ -799,17 +799,10 @@
if (info == null || algId == null || signature == null)
return "";
- StringBuilder sb = new StringBuilder();
-
- sb.append("[\n");
- sb.append(info.toString() + "\n");
- sb.append(" Algorithm: [" + algId.toString() + "]\n");
-
HexDumpEncoder encoder = new HexDumpEncoder();
- sb.append(" Signature:\n" + encoder.encodeBuffer(signature));
- sb.append("\n]");
-
- return sb.toString();
+ return "[\n" + info + '\n' +
+ " Algorithm: [" + algId + "]\n" +
+ " Signature:\n" + encoder.encodeBuffer(signature) + "\n]";
}
// the strongly typed gets, as per java.security.cert.X509Certificate
@@ -1941,31 +1934,30 @@
* only contains 0-9 and A-F. No small case, no colon.
*/
private String getCertificateFingerPrint(String mdAlg) {
- String fingerPrint = "";
try {
byte[] encCertInfo = getEncoded();
MessageDigest md = MessageDigest.getInstance(mdAlg);
byte[] digest = md.digest(encCertInfo);
- StringBuffer buf = new StringBuffer();
+ StringBuilder sb = new StringBuilder(digest.length * 2);
for (int i = 0; i < digest.length; i++) {
- byte2hex(digest[i], buf);
+ byte2hex(digest[i], sb);
}
- fingerPrint = buf.toString();
+ return sb.toString();
} catch (NoSuchAlgorithmException | CertificateEncodingException e) {
// ignored
}
- return fingerPrint;
+ return "";
}
/**
- * Converts a byte to hex digit and writes to the supplied buffer
+ * Converts a byte to hex digit and writes to the supplied builder
*/
- private static void byte2hex(byte b, StringBuffer buf) {
+ private static void byte2hex(byte b, StringBuilder buf) {
char[] hexChars = { '0', '1', '2', '3', '4', '5', '6', '7', '8',
'9', 'A', 'B', 'C', 'D', 'E', 'F' };
int high = ((b & 0xf0) >> 4);
int low = (b & 0x0f);
- buf.append(hexChars[high]);
- buf.append(hexChars[low]);
+ buf.append(hexChars[high])
+ .append(hexChars[low]);
}
}
--- a/jdk/src/java.base/share/classes/sun/security/x509/X509CertInfo.java Thu May 21 10:07:38 2015 -0700
+++ b/jdk/src/java.base/share/classes/sun/security/x509/X509CertInfo.java Thu May 21 16:20:20 2015 -0700
@@ -299,55 +299,60 @@
}
StringBuilder sb = new StringBuilder();
- sb.append("[\n");
- sb.append(" " + version.toString() + "\n");
- sb.append(" Subject: " + subject.toString() + "\n");
- sb.append(" Signature Algorithm: " + algId.toString() + "\n");
- sb.append(" Key: " + pubKey.toString() + "\n");
- sb.append(" " + interval.toString() + "\n");
- sb.append(" Issuer: " + issuer.toString() + "\n");
- sb.append(" " + serialNum.toString() + "\n");
+ sb.append("[\n")
+ .append(" ").append(version).append('\n')
+ .append(" Subject: ").append(subject).append('\n')
+ .append(" Signature Algorithm: ").append(algId).append('\n')
+ .append(" Key: ").append(pubKey).append('\n')
+ .append(" ").append(interval).append('\n')
+ .append(" Issuer: ").append(issuer).append('\n')
+ .append(" ").append(serialNum).append('\n');
// optional v2, v3 extras
if (issuerUniqueId != null) {
- sb.append(" Issuer Id:\n" + issuerUniqueId.toString() + "\n");
+ sb.append(" Issuer Id:\n").append(issuerUniqueId).append('\n');
}
if (subjectUniqueId != null) {
- sb.append(" Subject Id:\n" + subjectUniqueId.toString() + "\n");
+ sb.append(" Subject Id:\n").append(subjectUniqueId).append('\n');
}
if (extensions != null) {
Collection<Extension> allExts = extensions.getAllExtensions();
Extension[] exts = allExts.toArray(new Extension[0]);
- sb.append("\nCertificate Extensions: " + exts.length);
+ sb.append("\nCertificate Extensions: ").append(exts.length);
for (int i = 0; i < exts.length; i++) {
- sb.append("\n[" + (i+1) + "]: ");
+ sb.append("\n[").append(i+1).append("]: ");
Extension ext = exts[i];
try {
if (OIDMap.getClass(ext.getExtensionId()) == null) {
- sb.append(ext.toString());
+ sb.append(ext);
byte[] extValue = ext.getExtensionValue();
if (extValue != null) {
DerOutputStream out = new DerOutputStream();
out.putOctetString(extValue);
extValue = out.toByteArray();
HexDumpEncoder enc = new HexDumpEncoder();
- sb.append("Extension unknown: "
- + "DER encoded OCTET string =\n"
- + enc.encodeBuffer(extValue) + "\n");
+ sb.append("Extension unknown: ")
+ .append("DER encoded OCTET string =\n")
+ .append(enc.encodeBuffer(extValue))
+ .append('\n');
}
- } else
- sb.append(ext.toString()); //sub-class exists
+ } else {
+ sb.append(ext); //sub-class exists
+ }
} catch (Exception e) {
sb.append(", Error parsing this extension");
}
}
Map<String,Extension> invalid = extensions.getUnparseableExtensions();
if (invalid.isEmpty() == false) {
- sb.append("\nUnparseable certificate extensions: " + invalid.size());
+ sb.append("\nUnparseable certificate extensions: ")
+ .append(invalid.size());
int i = 1;
for (Extension ext : invalid.values()) {
- sb.append("\n[" + (i++) + "]: ");
- sb.append(ext);
+ sb.append("\n[")
+ .append(i++)
+ .append("]: ")
+ .append(ext);
}
}
}
--- a/jdk/src/java.base/share/classes/sun/text/CompactByteArray.java Thu May 21 10:07:38 2015 -0700
+++ b/jdk/src/java.base/share/classes/sun/text/CompactByteArray.java Thu May 21 16:20:20 2015 -0700
@@ -49,7 +49,7 @@
* Han ideographs have the same value. However, lookup is much faster than a
* hash table.
* A compact array of any primitive data type serves two purposes:
- * <UL type = round>
+ * <UL type = circle>
* <LI>Fast access of the indexed values.
* <LI>Smaller memory footprint.
* </UL>
--- a/jdk/src/java.base/share/classes/sun/text/ComposedCharIter.java Thu May 21 10:07:38 2015 -0700
+++ b/jdk/src/java.base/share/classes/sun/text/ComposedCharIter.java Thu May 21 16:20:20 2015 -0700
@@ -50,7 +50,7 @@
}
/**
- * Construct a new <tt>ComposedCharIter</tt>. The iterator will return
+ * Construct a new {@code ComposedCharIter}. The iterator will return
* all Unicode characters with canonical decompositions, excluding Korean
* Hangul characters.
*/
@@ -58,10 +58,10 @@
/**
* Returns the next precomposed Unicode character.
- * Repeated calls to <tt>next</tt> return all of the precomposed characters defined
+ * Repeated calls to {@code next} return all of the precomposed characters defined
* by Unicode, in ascending order. After all precomposed characters have
- * been returned, {@link #hasNext} will return <tt>false</tt> and further calls
- * to <tt>next</tt> will return {@link #DONE}.
+ * been returned, {@link #hasNext} will return {@code false} and further calls
+ * to {@code next} will return {@link #DONE}.
*/
public int next() {
if (curChar == decompNum - 1) {
--- a/jdk/src/java.base/share/classes/sun/text/Normalizer.java Thu May 21 10:07:38 2015 -0700
+++ b/jdk/src/java.base/share/classes/sun/text/Normalizer.java Thu May 21 16:20:20 2015 -0700
@@ -32,7 +32,7 @@
* This Normalizer is for Unicode 3.2 support for IDNA only.
* Developers should not use this class.
*
- * @ since 1.6
+ * @since 1.6
*/
public final class Normalizer {
--- a/jdk/src/java.base/share/classes/sun/text/bidi/BidiBase.java Thu May 21 10:07:38 2015 -0700
+++ b/jdk/src/java.base/share/classes/sun/text/bidi/BidiBase.java Thu May 21 16:20:20 2015 -0700
@@ -81,14 +81,13 @@
*
* <h3>General remarks about the API:</h3>
*
- * The "limit" of a sequence of characters is the position just after
+ * The "limit" of a sequence of characters is the position just after
* their last character, i.e., one more than that position.
* <p>
*
- * Some of the API methods provide access to "runs". Such a
- * "run" is defined as a sequence of characters that are at the same
+ * Some of the API methods provide access to "runs". Such a
+ * "run" is defined as a sequence of characters that are at the same
* embedding level after performing the Bidi algorithm.
- * <p>
*
* <h3>Basic concept: paragraph</h3>
* A piece of text can be divided into several paragraphs by characters
@@ -141,7 +140,8 @@
* these special values are designed that way. Also, the implementation
* assumes that MAX_EXPLICIT_LEVEL is odd.
*
- * <ul><b>See Also:</b>
+ * <p><b>See Also:</b>
+ * <ul>
* <li>{@link #LEVEL_DEFAULT_LTR}
* <li>{@link #LEVEL_DEFAULT_RTL}
* <li>{@link #LEVEL_OVERRIDE}
@@ -153,7 +153,8 @@
* Reordering mode values indicate which variant of the Bidi algorithm to
* use.
*
- * <ul><b>See Also:</b>
+ * <p><b>See Also:</b>
+ * <ul>
* <li>{@link #setReorderingMode}
* <li>{@link #REORDER_DEFAULT}
* <li>{@link #REORDER_NUMBERS_SPECIAL}
@@ -166,7 +167,8 @@
*
* <h3>Basic concept: Reordering Options</h3>
* Reordering options can be applied during Bidi text transformations.
- * <ul><b>See Also:</b>
+ * <p><b>See Also:</b>
+ * <ul>
* <li>{@link #setReorderingOptions}
* <li>{@link #OPTION_DEFAULT}
* <li>{@link #OPTION_INSERT_MARKS}
@@ -202,7 +204,7 @@
* and therefore its implementation omitted from this sample code.</li>
* </ul>
*
- * <pre>
+ * <pre>{@code
*
* package com.ibm.icu.dev.test.bidi;
*
@@ -451,7 +453,7 @@
* }
* }
*
- * </pre>
+ * }</pre>
*/
public class BidiBase {
@@ -2419,9 +2421,9 @@
* (same index) character if the level has the
* <code>LEVEL_OVERRIDE</code> bit set.<br><br>
* Except for that bit, it must be
- * <code>paraLevel<=embeddingLevels[]<=MAX_EXPLICIT_LEVEL</code>,
+ * {@code paraLevel<=embeddingLevels[]<=MAX_EXPLICIT_LEVEL},
* with one exception: a level of zero may be specified for a
- * paragraph separator even if <code>paraLevel>0</code> when multiple
+ * paragraph separator even if {@code paraLevel > 0} when multiple
* paragraphs are submitted in the same call to <code>setPara()</code>.<br><br>
* <strong>Caution: </strong>A reference to this array, not a copy
* of the levels, will be stored in the <code>Bidi</code> object;
@@ -2680,7 +2682,7 @@
* For example, in pure LTR text with numbers the numbers would get
* a resolved level of 2 higher than the surrounding text according to
* the algorithm. This implementation may set all resolved levels to
- * the same value in such a case.<p>
+ * the same value in such a case.
*
* @param paragraph a paragraph of text with optional character and
* paragraph attribute information
@@ -2817,7 +2819,7 @@
}
/**
- * Get the index of a paragraph, given a position within the text.<p>
+ * Get the index of a paragraph, given a position within the text.
*
* @param charIndex is the index of a character within the text, in the
* range <code>[0..getProcessedLength()-1]</code>.
--- a/jdk/src/java.base/share/classes/sun/text/bidi/BidiRun.java Thu May 21 10:07:38 2015 -0700
+++ b/jdk/src/java.base/share/classes/sun/text/bidi/BidiRun.java Thu May 21 16:20:20 2015 -0700
@@ -42,7 +42,7 @@
/**
* A BidiRun represents a sequence of characters at the same embedding level.
* The Bidi algorithm decomposes a piece of text into sequences of characters
- * at the same embedding level, each such sequence is called a <quote>run</quote>.
+ * at the same embedding level, each such sequence is called a "run".
*
* <p>A BidiRun represents such a run by storing its essential properties,
* but does not duplicate the characters which form the run.
--- a/jdk/src/java.base/share/classes/sun/text/normalizer/ICUBinary.java Thu May 21 10:07:38 2015 -0700
+++ b/jdk/src/java.base/share/classes/sun/text/normalizer/ICUBinary.java Thu May 21 16:20:20 2015 -0700
@@ -65,7 +65,7 @@
/**
* <p>ICU data header reader method.
* Takes a ICU generated big-endian input stream, parse the ICU standard
- * file header and authenticates them.</p>
+ * file header and authenticates them.
* <p>Header format:
* <ul>
* <li> Header size (char)
@@ -84,7 +84,7 @@
* [0] major [1] minor [2] milli [3] micro
* <li> Unicode version (4 bytes) this ICU is based on.
* </ul>
- * </p>
+ *
* <p>
* Example of use:<br>
* <pre>
@@ -98,7 +98,7 @@
* System.out.println("This is not a ICU data file");
* }
* </pre>
- * </p>
+ *
* @param inputStream input stream that contains the ICU data header
* @param dataFormatIDExpected Data format expected. An array of 4 bytes
* information about the data format.
--- a/jdk/src/java.base/share/classes/sun/text/normalizer/IntTrie.java Thu May 21 10:07:38 2015 -0700
+++ b/jdk/src/java.base/share/classes/sun/text/normalizer/IntTrie.java Thu May 21 16:20:20 2015 -0700
@@ -58,7 +58,7 @@
* trie.</p>
* @param inputStream file input stream to a ICU data file, containing
* the trie
- * @param dataManipulate object which provides methods to parse the char
+ * @param datamanipulate object which provides methods to parse the char
* data
* @throws IOException thrown when data reading fails
* @draft 2.1
--- a/jdk/src/java.base/share/classes/sun/text/normalizer/NormalizerBase.java Thu May 21 10:07:38 2015 -0700
+++ b/jdk/src/java.base/share/classes/sun/text/normalizer/NormalizerBase.java Thu May 21 16:20:20 2015 -0700
@@ -55,16 +55,16 @@
* In Unicode, this can be encoded as a single character (the
* "composed" form):
*
- * <p>
+ * <pre>
* 00C1 LATIN CAPITAL LETTER A WITH ACUTE
- * </p>
+ * </pre>
*
* or as two separate characters (the "decomposed" form):
*
- * <p>
+ * <pre>
* 0041 LATIN CAPITAL LETTER A
* 0301 COMBINING ACUTE ACCENT
- * </p>
+ * </pre>
*
* To a user of your program, however, both of these sequences should be
* treated as the same "user-level" character "A with acute accent". When you
@@ -76,17 +76,17 @@
*
* Similarly, the string "ffi" can be encoded as three separate letters:
*
- * <p>
+ * <pre>
* 0066 LATIN SMALL LETTER F
* 0066 LATIN SMALL LETTER F
* 0069 LATIN SMALL LETTER I
- * </p>
+ * </pre>
*
* or as the single character
*
- * <p>
+ * <pre>
* FB03 LATIN SMALL LIGATURE FFI
- * </p>
+ * </pre>
*
* The ffi ligature is not a distinct semantic character, and strictly speaking
* it shouldn't be in Unicode at all, but it was included for compatibility
@@ -555,12 +555,12 @@
//-------------------------------------------------------------------------
/**
- * Creates a new <tt>Normalizer</tt> object for iterating over the
+ * Creates a new {@code Normalizer} object for iterating over the
* normalized form of a given string.
* <p>
- * The <tt>options</tt> parameter specifies which optional
- * <tt>Normalizer</tt> features are to be enabled for this object.
- * <p>
+ * The {@code options} parameter specifies which optional
+ * {@code Normalizer} features are to be enabled for this object.
+ *
* @param str The string to be normalized. The normalization
* will start at the beginning of the string.
*
@@ -579,9 +579,9 @@
}
/**
- * Creates a new <tt>Normalizer</tt> object for iterating over the
+ * Creates a new {@code Normalizer} object for iterating over the
* normalized form of the given text.
- * <p>
+ *
* @param iter The input text to be normalized. The normalization
* will start at the beginning of the string.
*
@@ -592,9 +592,9 @@
}
/**
- * Creates a new <tt>Normalizer</tt> object for iterating over the
+ * Creates a new {@code Normalizer} object for iterating over the
* normalized form of the given text.
- * <p>
+ *
* @param iter The input text to be normalized. The normalization
* will start at the beginning of the string.
*
@@ -615,13 +615,13 @@
}
/**
- * Clones this <tt>Normalizer</tt> object. All properties of this
+ * Clones this {@code Normalizer} object. All properties of this
* object are duplicated in the new object, including the cloning of any
* {@link CharacterIterator} that was passed in to the constructor
* or to {@link #setText(CharacterIterator) setText}.
* However, the text storage underlying
- * the <tt>CharacterIterator</tt> is not duplicated unless the
- * iterator's <tt>clone</tt> method does so.
+ * the {@code CharacterIterator} is not duplicated unless the
+ * iterator's {@code clone} method does so.
* @stable ICU 2.8
*/
public Object clone() {
@@ -791,7 +791,7 @@
//-------------------------------------------------------------------------
/**
- * Return the current character in the normalized text->
+ * Return the current character in the normalized text.
* @return The codepoint as an int
* @stable ICU 2.8
*/
@@ -872,10 +872,10 @@
* while {@link #next} and {@link #previous} iterate through characters
* in the normalized <em>output</em>. This means that there is not
* necessarily a one-to-one correspondence between characters returned
- * by <tt>next</tt> and <tt>previous</tt> and the indices passed to and
- * returned from <tt>setIndex</tt> and {@link #getIndex}.
- * <p>
- * @param index the desired index in the input text->
+ * by {@code next} and {@code previous} and the indices passed to and
+ * returned from {@code setIndex} and {@link #getIndex}.
+ *
+ * @param index the desired index in the input text.
*
* @return the first normalized character that is the result of iterating
* forward starting at the given index.
@@ -894,8 +894,8 @@
/**
* Retrieve the index of the start of the input text. This is the begin
- * index of the <tt>CharacterIterator</tt> or the start (i.e. 0) of the
- * <tt>String</tt> over which this <tt>Normalizer</tt> is iterating
+ * index of the {@code CharacterIterator} or the start (i.e. 0) of the
+ * {@code String} over which this {@code Normalizer} is iterating
* @deprecated ICU 2.2. Use startIndex() instead.
* @return The codepoint as an int
* @see #startIndex
@@ -907,8 +907,8 @@
/**
* Retrieve the index of the end of the input text. This is the end index
- * of the <tt>CharacterIterator</tt> or the length of the <tt>String</tt>
- * over which this <tt>Normalizer</tt> is iterating
+ * of the {@code CharacterIterator} or the length of the {@code String}
+ * over which this {@code Normalizer} is iterating
* @deprecated ICU 2.2. Use endIndex() instead.
* @return The codepoint as an int
* @see #endIndex
@@ -927,9 +927,9 @@
* <b>Note:</b> This method sets the position in the <em>input</em>, while
* {@link #next} and {@link #previous} iterate through characters in the
* <em>output</em>. This means that there is not necessarily a one-to-one
- * correspondence between characters returned by <tt>next</tt> and
- * <tt>previous</tt> and the indices passed to and returned from
- * <tt>setIndex</tt> and {@link #getIndex}.
+ * correspondence between characters returned by {@code next} and
+ * {@code previous} and the indices passed to and returned from
+ * {@code setIndex} and {@link #getIndex}.
* @return The current iteration position
* @stable ICU 2.8
*/
@@ -942,9 +942,9 @@
}
/**
- * Retrieve the index of the end of the input text-> This is the end index
- * of the <tt>CharacterIterator</tt> or the length of the <tt>String</tt>
- * over which this <tt>Normalizer</tt> is iterating
+ * Retrieve the index of the end of the input text. This is the end index
+ * of the {@code CharacterIterator} or the length of the {@code String}
+ * over which this {@code Normalizer} is iterating
* @return The current iteration position
* @stable ICU 2.8
*/
@@ -963,9 +963,9 @@
* return previously buffers characters in the old normalization mode
* until the iteration is able to re-sync at the next base character.
* It is safest to call {@link #setText setText()}, {@link #first},
- * {@link #last}, etc. after calling <tt>setMode</tt>.
- * <p>
- * @param newMode the new mode for this <tt>Normalizer</tt>.
+ * {@link #last}, etc. after calling {@code setMode}.
+ *
+ * @param newMode the new mode for this {@code Normalizer}.
* The supported modes are:
* <ul>
* <li>{@link #COMPOSE} - Unicode canonical decompositiion
@@ -985,7 +985,7 @@
mode = newMode;
}
/**
- * Return the basic operation performed by this <tt>Normalizer</tt>
+ * Return the basic operation performed by this {@code Normalizer}
*
* @see #setMode
* @stable ICU 2.8
@@ -995,8 +995,8 @@
}
/**
- * Set the input text over which this <tt>Normalizer</tt> will iterate.
- * The iteration position is set to the beginning of the input text->
+ * Set the input text over which this {@code Normalizer} will iterate.
+ * The iteration position is set to the beginning of the input text.
* @param newText The new string to be normalized.
* @stable ICU 2.8
*/
@@ -1011,8 +1011,8 @@
}
/**
- * Set the input text over which this <tt>Normalizer</tt> will iterate.
- * The iteration position is set to the beginning of the input text->
+ * Set the input text over which this {@code Normalizer} will iterate.
+ * The iteration position is set to the beginning of the input text.
* @param newText The new string to be normalized.
* @stable ICU 2.8
*/
@@ -1571,7 +1571,7 @@
//
/**
- * Creates a new <tt>Normalizer</tt> object for iterating over the
+ * Creates a new {@code Normalizer} object for iterating over the
* normalized form of a given string.
*
* @param str The string to be normalized. The normalization
@@ -1646,7 +1646,6 @@
* perform further tests to arrive at a true/false result.
* @param str the input string to be checked to see if it is normalized
* @param form the normalization form
- * @param options the optional features to be enabled.
*/
public static boolean isNormalized(String str, Normalizer.Form form) {
return isNormalized(str, form, UNICODE_LATEST);
--- a/jdk/src/java.base/share/classes/sun/text/normalizer/RangeValueIterator.java Thu May 21 10:07:38 2015 -0700
+++ b/jdk/src/java.base/share/classes/sun/text/normalizer/RangeValueIterator.java Thu May 21 16:20:20 2015 -0700
@@ -38,12 +38,13 @@
package sun.text.normalizer;
/**
- * <p>Interface for enabling iteration over sets of <int index, int value>,
+ * <p>Interface for enabling iteration over sets of
+ * {@code <int index, int value>},
* where index is the sorted integer index in ascending order and value, its
- * associated integer value.</p>
+ * associated integer value.
* <p>The result for each iteration is the consecutive range of
- * <int index, int value> with the same value. Result is represented by
- * <start, limit, value> where</p>
+ * {@code <int index, int value>} with the same value. Result is represented by
+ * {@code <start, limit, value>} where
* <ul>
* <li> start is the starting integer of the result range
* <li> limit is 1 after the maximum integer that follows start, such that
@@ -56,10 +57,10 @@
* Hence value(start) = value(start + 1) = .... = value(start + n) = .... =
* value(limit - 1). However value(start -1) != value(start) and
* value(limit) != value(start).
- * </p>
+ *
* <p>Most implementations will be created by factory methods, such as the
* character type iterator in UCharacter.getTypeIterator. See example below.
- * </p>
+ *
* Example of use:<br>
* <pre>
* RangeValueIterator iterator = UCharacter.getTypeIterator();
--- a/jdk/src/java.base/share/classes/sun/text/normalizer/Replaceable.java Thu May 21 10:07:38 2015 -0700
+++ b/jdk/src/java.base/share/classes/sun/text/normalizer/Replaceable.java Thu May 21 16:20:20 2015 -0700
@@ -71,10 +71,9 @@
* <li>If there is no previous character (i.e. start == 0), use the
* following character</li>
* <li>If there is no following character (i.e. the replaceable was
- * empty), use default metadata<br>
+ * empty), use default metadata</li>
* <li>If the code point U+FFFF is seen, it should be interpreted as
- * a special marker having no metadata<li>
- * </li>
+ * a special marker having no metadata</li>
* </ul>
* If this is not the behavior, the subclass should document any differences.
*
@@ -111,10 +110,10 @@
* starting at index <code>dstStart</code> and ending at index
* <code>dstStart + (srcLimit-srcStart) - 1</code>.
*
- * @param srcStart the beginning index to copy, inclusive; <code>0
- * <= start <= limit</code>.
+ * @param srcStart the beginning index to copy, inclusive;
+ * {@code 0 <= start <= limit}.
* @param srcLimit the ending index to copy, exclusive;
- * <code>start <= limit <= length()</code>.
+ * {@code start <= limit <= length()}.
* @param dst the destination array.
* @param dstStart the start offset in the destination array.
* @stable ICU 2.0
--- a/jdk/src/java.base/share/classes/sun/text/normalizer/ReplaceableString.java Thu May 21 10:07:38 2015 -0700
+++ b/jdk/src/java.base/share/classes/sun/text/normalizer/ReplaceableString.java Thu May 21 16:20:20 2015 -0700
@@ -109,10 +109,10 @@
* starting at index <code>dstStart</code> and ending at index
* <code>dstStart + (srcLimit-srcStart) - 1</code>.
*
- * @param srcStart the beginning index to copy, inclusive; <code>0
- * <= start <= limit</code>.
+ * @param srcStart the beginning index to copy, inclusive;
+ * {@code 0 <= start <= limit}.
* @param srcLimit the ending index to copy, exclusive;
- * <code>start <= limit <= length()</code>.
+ * {@code start <= limit <= length()}.
* @param dst the destination array.
* @param dstStart the start offset in the destination array.
* @stable ICU 2.0
--- a/jdk/src/java.base/share/classes/sun/text/normalizer/ReplaceableUCharacterIterator.java Thu May 21 10:07:38 2015 -0700
+++ b/jdk/src/java.base/share/classes/sun/text/normalizer/ReplaceableUCharacterIterator.java Thu May 21 16:20:20 2015 -0700
@@ -150,14 +150,12 @@
}
/**
- * <p>Sets the currentIndex to the specified currentIndex in the text and returns that
+ * Sets the currentIndex to the specified currentIndex in the text and returns that
* single UTF16 character at currentIndex.
- * This assumes the text is stored as 16-bit code units.</p>
+ * This assumes the text is stored as 16-bit code units.
* @param currentIndex the currentIndex within the text.
* @exception IllegalArgumentException is thrown if an invalid currentIndex is
* supplied. i.e. currentIndex is out of bounds.
- * @return the character at the specified currentIndex or DONE if the specified
- * currentIndex is equal to the end of the text.
*/
public void setIndex(int currentIndex) {
if (currentIndex < 0 || currentIndex > replaceable.length()) {
--- a/jdk/src/java.base/share/classes/sun/text/normalizer/RuleCharacterIterator.java Thu May 21 10:07:38 2015 -0700
+++ b/jdk/src/java.base/share/classes/sun/text/normalizer/RuleCharacterIterator.java Thu May 21 16:20:20 2015 -0700
@@ -101,22 +101,25 @@
public static final int DONE = -1;
/**
- * Bitmask option to enable parsing of variable names. If (options &
- * PARSE_VARIABLES) != 0, then an embedded variable will be expanded to
+ * Bitmask option to enable parsing of variable names.
+ * If {@code (options & PARSE_VARIABLES) != 0},
+ * then an embedded variable will be expanded to
* its value. Variables are parsed using the SymbolTable API.
*/
public static final int PARSE_VARIABLES = 1;
/**
- * Bitmask option to enable parsing of escape sequences. If (options &
- * PARSE_ESCAPES) != 0, then an embedded escape sequence will be expanded
+ * Bitmask option to enable parsing of escape sequences.
+ * If {@code (options & PARSE_ESCAPES) != 0},
+ * then an embedded escape sequence will be expanded
* to its value. Escapes are parsed using Utility.unescapeAt().
*/
public static final int PARSE_ESCAPES = 2;
/**
- * Bitmask option to enable skipping of whitespace. If (options &
- * SKIP_WHITESPACE) != 0, then whitespace characters will be silently
+ * Bitmask option to enable skipping of whitespace.
+ * If {@code (options & SKIP_WHITESPACE) != 0},
+ * then whitespace characters will be silently
* skipped, as if they were not present in the input. Whitespace
* characters are defined by UCharacterProperty.isRuleWhiteSpace().
*/
--- a/jdk/src/java.base/share/classes/sun/text/normalizer/SymbolTable.java Thu May 21 10:07:38 2015 -0700
+++ b/jdk/src/java.base/share/classes/sun/text/normalizer/SymbolTable.java Thu May 21 16:20:20 2015 -0700
@@ -78,7 +78,7 @@
/**
* Lookup the characters associated with this string and return it.
- * Return <tt>null</tt> if no such name exists. The resultant
+ * Return {@code null} if no such name exists. The resultant
* array may have length zero.
* @param s the symbolic name to lookup
* @return a char array containing the name's value, or null if
@@ -91,7 +91,7 @@
/**
* Lookup the UnicodeMatcher associated with the given character, and
- * return it. Return <tt>null</tt> if not found.
+ * return it. Return {@code null} if not found.
* @param ch a 32-bit code point from 0 to 0x10FFFF inclusive.
* @return the UnicodeMatcher object represented by the given
* character, or null if there is no mapping for ch.
--- a/jdk/src/java.base/share/classes/sun/text/normalizer/Trie.java Thu May 21 10:07:38 2015 -0700
+++ b/jdk/src/java.base/share/classes/sun/text/normalizer/Trie.java Thu May 21 16:20:20 2015 -0700
@@ -160,8 +160,10 @@
/**
* Lead surrogate code points' index displacement in the index array.
+ * <pre>{@code
* 0x10000-0xd800=0x2800
* 0x2800 >> INDEX_STAGE_1_SHIFT_
+ * }</pre>
*/
protected static final int LEAD_INDEX_OFFSET_ = 0x2800 >> 5;
/**
@@ -191,7 +193,7 @@
/**
* Number of index (stage 1) entries per lead surrogate.
* Same as number of index entries for 1024 trail surrogates,
- * ==0x400>>INDEX_STAGE_1_SHIFT_
+ * {@code ==0x400>>INDEX_STAGE_1_SHIFT_}
*/
protected static final int SURROGATE_BLOCK_COUNT=(1<<SURROGATE_BLOCK_BITS);
/** Length of the BMP portion of the index (stage 1) array. */
@@ -297,7 +299,7 @@
/**
* Internal trie getter from a code point.
* Could be faster(?) but longer with
- * if((c32)<=0xd7ff) { (result)=_TRIE_GET_RAW(trie, data, 0, c32); }
+ * {@code if((c32)<=0xd7ff) { (result)=_TRIE_GET_RAW(trie, data, 0, c32); }}
* Gets the offset to data which the codepoint points to
* @param ch codepoint
* @return offset to data
--- a/jdk/src/java.base/share/classes/sun/text/normalizer/TrieIterator.java Thu May 21 10:07:38 2015 -0700
+++ b/jdk/src/java.base/share/classes/sun/text/normalizer/TrieIterator.java Thu May 21 16:20:20 2015 -0700
@@ -37,17 +37,17 @@
package sun.text.normalizer;
/**
- * <p>Class enabling iteration of the values in a Trie.</p>
+ * Class enabling iteration of the values in a Trie.
* <p>Result of each iteration contains the interval of codepoints that have
- * the same value type and the value type itself.</p>
+ * the same value type and the value type itself.
* <p>The comparison of each codepoint value is done via extract(), which the
- * default implementation is to return the value as it is.</p>
+ * default implementation is to return the value as it is.
* <p>Method extract() can be overwritten to perform manipulations on
- * codepoint values in order to perform specialized comparison.</p>
+ * codepoint values in order to perform specialized comparison.
* <p>TrieIterator is designed to be a generic iterator for the CharTrie
* and the IntTrie, hence to accommodate both types of data, the return
- * result will be in terms of int (32 bit) values.</p>
- * <p>See com.ibm.icu.text.UCharacterTypeIterator for examples of use.</p>
+ * result will be in terms of int (32 bit) values.
+ * <p>See com.ibm.icu.text.UCharacterTypeIterator for examples of use.
* <p>Notes for porting utrie_enum from icu4c to icu4j:<br>
* Internally, icu4c's utrie_enum performs all iterations in its body. In Java
* sense, the caller will have to pass a object with a callback function
@@ -63,18 +63,17 @@
* the method extract(int) (equivalent to UTrieEnumValue). Independent of icu4j,
* the caller will have to code his own iteration and flesh out the task
* (equivalent to UTrieEnumRange) to be performed in the iteration loop.
- * </p>
- * <p>There are basically 3 usage scenarios for porting:</p>
+ *
+ * <p>There are basically 3 usage scenarios for porting:
* <p>1) UTrieEnumValue is the only implemented callback then just implement a
* subclass of TrieIterator and override the extract(int) method. The
* extract(int) method is analogus to UTrieEnumValue callback.
- * </p>
+ *
* <p>2) UTrieEnumValue and UTrieEnumRange both are implemented then implement
- * a subclass of TrieIterator, override the extract method and iterate, e.g
- * </p>
- * <p>utrie_enum(&normTrie, _enumPropertyStartsValue, _enumPropertyStartsRange,
- * set);<br>
- * In Java :<br>
+ * a subclass of TrieIterator, override the extract method and iterate, e.g.<br>
+ * {@code utrie_enum(&normTrie, _enumPropertyStartsValue, _enumPropertyStartsRange,
+ * set);}<br>
+ * In Java:<br>
* <pre>
* class TrieIteratorImpl extends TrieIterator{
* public TrieIteratorImpl(Trie data){
@@ -90,17 +89,17 @@
* // port the implementation of _enumPropertyStartsRange
* }
* </pre>
- * </p>
+ *
* <p>3) UTrieEnumRange is the only implemented callback then just implement
* the while loop, when utrie_enum is called
- * <pre>
+ * <pre>{@code
* // utrie_enum(&fcdTrie, NULL, _enumPropertyStartsRange, set);
* TrieIterator fcdIter = new TrieIterator(fcdTrieImpl.fcdTrie);
* while(fcdIter.next(result)){
* set.add(result.start);
* }
- * </pre>
- * </p>
+ * }</pre>
+ *
* @author synwee
* @see com.ibm.icu.impl.Trie
* @see com.ibm.icu.lang.UCharacterTypeIterator
--- a/jdk/src/java.base/share/classes/sun/text/normalizer/UCharacter.java Thu May 21 10:07:38 2015 -0700
+++ b/jdk/src/java.base/share/classes/sun/text/normalizer/UCharacter.java Thu May 21 16:20:20 2015 -0700
@@ -128,7 +128,7 @@
* Annex C: Compatibility Properties of UTS #18 Unicode Regular Expressions
* (http://www.unicode.org/reports/tr18/#Compatibility_Properties).
* </p>
- * <p>
+ * <pre>{@code
* API access for C/POSIX character classes is as follows:
* - alpha: isUAlphabetic(c) or hasBinaryProperty(c, UProperty.ALPHABETIC)
* - lower: isULowercase(c) or hasBinaryProperty(c, UProperty.LOWERCASE)
@@ -142,7 +142,7 @@
* - cntrl: getType(c)==CONTROL
* - graph: hasBinaryProperty(c, UProperty.POSIX_GRAPH)
* - print: hasBinaryProperty(c, UProperty.POSIX_PRINT)
- * </p>
+ * }</pre>
* <p>
* The C/POSIX character classes are also available in UnicodeSet patterns,
* using patterns like [:graph:] or \p{graph}.
--- a/jdk/src/java.base/share/classes/sun/text/normalizer/UCharacterIterator.java Thu May 21 10:07:38 2015 -0700
+++ b/jdk/src/java.base/share/classes/sun/text/normalizer/UCharacterIterator.java Thu May 21 16:20:20 2015 -0700
@@ -200,8 +200,7 @@
* iterator obtained by calling <code>getLength()</code>.
* <b>Usage:</b>
*
- * <code>
- * <pre>
+ * <pre>{@code
* UChacterIterator iter = new UCharacterIterator.getInstance(text);
* char[] buf = new char[iter.getLength()];
* iter.getText(buf);
@@ -217,15 +216,14 @@
* buf = new char[iter.getLength()];
* }
* }
- * </pre>
- * </code>
+ * }</pre>
*
* @param fillIn an array of chars to fill with the underlying UTF-16 code
* units.
* @param offset the position within the array to start putting the data.
* @return the number of code units added to fillIn, as a convenience
* @exception IndexOutOfBounds exception if there is not enough
- * room after offset in the array, or if offset < 0.
+ * room after offset in the array, or if offset {@literal <} 0.
* @stable ICU 2.4
*/
public abstract int getText(char[] fillIn, int offset);
--- a/jdk/src/java.base/share/classes/sun/text/normalizer/UTF16.java Thu May 21 10:07:38 2015 -0700
+++ b/jdk/src/java.base/share/classes/sun/text/normalizer/UTF16.java Thu May 21 16:20:20 2015 -0700
@@ -38,26 +38,26 @@
/**
* <p>Standalone utility class providing UTF16 character conversions and
- * indexing conversions.</p>
+ * indexing conversions.
* <p>Code that uses strings alone rarely need modification.
* By design, UTF-16 does not allow overlap, so searching for strings is a safe
* operation. Similarly, concatenation is always safe. Substringing is safe if
* the start and end are both on UTF-32 boundaries. In normal code, the values
* for start and end are on those boundaries, since they arose from operations
* like searching. If not, the nearest UTF-32 boundaries can be determined
- * using <code>bounds()</code>.</p>
+ * using <code>bounds()</code>.
* <strong>Examples:</strong>
* <p>The following examples illustrate use of some of these methods.
- * <pre>
+ * <pre>{@code
* // iteration forwards: Original
- * for (int i = 0; i < s.length(); ++i) {
+ * for (int i = 0; i < s.length(); ++i) {
* char ch = s.charAt(i);
* doSomethingWith(ch);
* }
*
* // iteration forwards: Changes for UTF-32
* int ch;
- * for (int i = 0; i < s.length(); i+=UTF16.getCharCount(ch)) {
+ * for (int i = 0; i < s.length(); i+=UTF16.getCharCount(ch)) {
* ch = UTF16.charAt(s,i);
* doSomethingWith(ch);
* }
@@ -74,7 +74,7 @@
* ch = UTF16.charAt(s,i);
* doSomethingWith(ch);
* }
- * </pre>
+ * }</pre>
* <strong>Notes:</strong>
* <ul>
* <li>
@@ -515,12 +515,12 @@
/**
* <p>Converts argument code point and returns a String object representing
- * the code point's value in UTF16 format.</p>
+ * the code point's value in UTF16 format.
* <p>This method does not check for the validity of the codepoint, the
* results are not guaranteed if a invalid codepoint is passed as
- * argument.</p>
+ * argument.
* <p>The result is a string whose length is 1 for non-supplementary code
- * points, 2 otherwise.</p>
+ * points, 2 otherwise.
* @param ch code point
* @return string representation of the code point
*/
--- a/jdk/src/java.base/share/classes/sun/text/normalizer/UnicodeMatcher.java Thu May 21 10:07:38 2015 -0700
+++ b/jdk/src/java.base/share/classes/sun/text/normalizer/UnicodeMatcher.java Thu May 21 16:20:20 2015 -0700
@@ -45,7 +45,8 @@
public interface UnicodeMatcher {
/**
- * The character at index i, where i < contextStart || i >= contextLimit,
+ * The character at index {@code i}, where
+ * {@code i < contextStart || i >= contextLimit},
* is ETHER. This allows explicit matching by rules and UnicodeSets
* of text outside the context. In traditional terms, this allows anchoring
* at the start and/or end.
--- a/jdk/src/java.base/share/classes/sun/text/normalizer/UnicodeSet.java Thu May 21 10:07:38 2015 -0700
+++ b/jdk/src/java.base/share/classes/sun/text/normalizer/UnicodeSet.java Thu May 21 16:20:20 2015 -0700
@@ -107,8 +107,8 @@
* </tr>
* <tr>
* <td nowrap valign="top" align="left"><code>[a{ab}{ac}]</code></td>
- * <td valign="top">The character 'a' and the multicharacter strings "ab" and
- * "ac"</td>
+ * <td valign="top">The character 'a' and the multicharacter strings "ab" and
+ * "ac"</td>
* </tr>
* <tr>
* <td nowrap valign="top" align="left"><code>[\p{Lu}]</code></td>
@@ -148,10 +148,10 @@
* literal. Thus "[a\\-b]", "[-ab]", and "[ab-]" all indicate the same
* set of three characters, 'a', 'b', and '-'.
*
- * <p>Sets may be intersected using the '&' operator or the asymmetric
+ * <p>Sets may be intersected using the {@literal '&'} operator or the asymmetric
* set difference may be taken using the '-' operator, for example,
- * "[[:L:]&[\\u0000-\\u0FFF]]" indicates the set of all Unicode letters
- * with values less than 4096. Operators ('&' and '|') have equal
+ * "{@code [[:L:]&[\\u0000-\\u0FFF]]}" indicates the set of all Unicode letters
+ * with values less than 4096. Operators ({@literal '&'} and '|') have equal
* precedence and bind left-to-right. Thus
* "[[:L:]-[a-z]-[\\u0100-\\u01FF]]" is equivalent to
* "[[[:L:]-[a-z]]-[\\u0100-\\u01FF]]". This only really matters for
@@ -166,7 +166,7 @@
* that is, U+0000 through 'a'-1 and 'z'+1 through U+10FFFF
* <tr valign=top><td nowrap><code>[[<em>pat1</em>][<em>pat2</em>]]</code>
* <td>The union of sets specified by <em>pat1</em> and <em>pat2</em>
- * <tr valign=top><td nowrap><code>[[<em>pat1</em>]&[<em>pat2</em>]]</code>
+ * <tr valign=top><td nowrap><code>[[<em>pat1</em>]&[<em>pat2</em>]]</code>
* <td>The intersection of sets specified by <em>pat1</em> and <em>pat2</em>
* <tr valign=top><td nowrap><code>[[<em>pat1</em>]-[<em>pat2</em>]]</code>
* <td>The asymmetric difference of sets specified by <em>pat1</em> and
@@ -227,7 +227,7 @@
* </tr>
* <tr>
* <td nowrap valign="top" align="right"><code>property := </code></td>
- * <td valign="top"><em>a Unicode property set pattern</td>
+ * <td valign="top"><em>a Unicode property set pattern</em></td>
* </tr>
* </table>
* <br>
@@ -337,8 +337,8 @@
}
/**
- * Constructs a set containing the given range. If <code>end >
- * start</code> then an empty set is created.
+ * Constructs a set containing the given range.
+ * If {@code end > start} then an empty set is created.
*
* @param start first character, inclusive, of range
* @param end last character, inclusive, of range
@@ -651,7 +651,7 @@
* Adds the specified multicharacter to this set if it is not already
* present. If this set already contains the multicharacter,
* the call leaves this set unchanged.
- * Thus "ch" => {"ch"}
+ * Thus {@code "ch" => {"ch"}}
* <br><b>Warning: you cannot add an empty string ("") to a UnicodeSet.</b>
* @param s the source string
* @return this object, for chaining
@@ -691,7 +691,7 @@
/**
* Complements the specified range in this set. Any character in
* the range will be removed if it is in this set, or will be
- * added if it is not in this set. If <code>end > start</code>
+ * added if it is not in this set. If {@code end > start}
* then an empty range is complemented, leaving the set unchanged.
*
* @param start first character, inclusive, of range to be removed
@@ -1698,8 +1698,8 @@
* Modifies this set to contain those code points which have the
* given value for the given property. Prior contents of this
* set are lost.
- * @param propertyAlias
- * @param valueAlias
+ * @param propertyAlias the property alias
+ * @param valueAlias the value alias
* @param symbols if not null, then symbols are first called to see if a property
* is available. If true, then everything else is skipped.
* @return this set
--- a/jdk/src/java.base/share/classes/sun/text/normalizer/UnicodeSetIterator.java Thu May 21 10:07:38 2015 -0700
+++ b/jdk/src/java.base/share/classes/sun/text/normalizer/UnicodeSetIterator.java Thu May 21 16:20:20 2015 -0700
@@ -73,35 +73,35 @@
public class UnicodeSetIterator {
/**
- * Value of <tt>codepoint</tt> if the iterator points to a string.
- * If <tt>codepoint == IS_STRING</tt>, then examine
- * <tt>string</tt> for the current iteration result.
+ * Value of {@code codepoint} if the iterator points to a string.
+ * If {@code codepoint == IS_STRING}, then examine
+ * {@code string} for the current iteration result.
* @stable ICU 2.0
*/
public static int IS_STRING = -1;
/**
- * Current code point, or the special value <tt>IS_STRING</tt>, if
+ * Current code point, or the special value {@code IS_STRING}, if
* the iterator points to a string.
* @stable ICU 2.0
*/
public int codepoint;
/**
- * When iterating over ranges using <tt>nextRange()</tt>,
- * <tt>codepointEnd</tt> contains the inclusive end of the
- * iteration range, if <tt>codepoint != IS_STRING</tt>. If
- * iterating over code points using <tt>next()</tt>, or if
- * <tt>codepoint == IS_STRING</tt>, then the value of
- * <tt>codepointEnd</tt> is undefined.
+ * When iterating over ranges using {@code nextRange()},
+ * {@code codepointEnd} contains the inclusive end of the
+ * iteration range, if {@code codepoint != IS_STRING}. If
+ * iterating over code points using {@code next()}, or if
+ * {@code codepoint == IS_STRING}, then the value of
+ * {@code codepointEnd} is undefined.
* @stable ICU 2.0
*/
public int codepointEnd;
/**
- * If <tt>codepoint == IS_STRING</tt>, then <tt>string</tt> points
- * to the current string. If <tt>codepoint != IS_STRING</tt>, the
- * value of <tt>string</tt> is undefined.
+ * If {@code codepoint == IS_STRING}, then {@code string} points
+ * to the current string. If {@code codepoint != IS_STRING}, the
+ * value of {@code string} is undefined.
* @stable ICU 2.0
*/
public String string;
@@ -118,17 +118,17 @@
/**
* Returns the next element in the set, either a code point range
* or a string. If there are no more elements in the set, return
- * false. If <tt>codepoint == IS_STRING</tt>, the value is a
- * string in the <tt>string</tt> field. Otherwise the value is a
- * range of one or more code points from <tt>codepoint</tt> to
- * <tt>codepointeEnd</tt> inclusive.
+ * false. If {@code codepoint == IS_STRING}, the value is a
+ * string in the {@code string} field. Otherwise the value is a
+ * range of one or more code points from {@code codepoint} to
+ * {@code codepointeEnd} inclusive.
*
* <p>The order of iteration is all code points ranges in sorted
* order, followed by all strings sorted order. Ranges are
- * disjoint and non-contiguous. <tt>string</tt> is undefined
- * unless <tt>codepoint == IS_STRING</tt>. Do not mix calls to
- * <tt>next()</tt> and <tt>nextRange()</tt> without calling
- * <tt>reset()</tt> between them. The results of doing so are
+ * disjoint and non-contiguous. {@code string} is undefined
+ * unless {@code codepoint == IS_STRING}. Do not mix calls to
+ * {@code next()} and {@code nextRange()} without calling
+ * {@code reset()} between them. The results of doing so are
* undefined.
*
* @return true if there was another element in the set and this
@@ -162,8 +162,8 @@
/**
* Sets this iterator to visit the elements of the given set and
* resets it to the start of that set. The iterator is valid only
- * so long as <tt>set</tt> is valid.
- * @param set the set to iterate over.
+ * so long as {@code set} is valid.
+ * @param uset the set to iterate over.
* @stable ICU 2.0
*/
public void reset(UnicodeSet uset) {
--- a/jdk/src/java.base/share/classes/sun/text/normalizer/Utility.java Thu May 21 10:07:38 2015 -0700
+++ b/jdk/src/java.base/share/classes/sun/text/normalizer/Utility.java Thu May 21 16:20:20 2015 -0700
@@ -227,7 +227,7 @@
/**
* Convert a integer to size width hex uppercase digits.
- * E.g., hex('a', 4, str) => "0041".
+ * E.g., {@code hex('a', 4, str) => "0041"}.
* Append the output to the given StringBuffer.
* If width is too small to fit, nothing will be appended to output.
*/
@@ -237,7 +237,7 @@
/**
* Convert a integer to size width (minimum) hex uppercase digits.
- * E.g., hex('a', 4, str) => "0041". If the integer requires more
+ * E.g., {@code hex('a', 4, str) => "0041"}. If the integer requires more
* than width digits, more will be used.
*/
public static String hex(int ch, int width) {
@@ -334,8 +334,8 @@
}
/**
- * Escape unprintable characters using <backslash>uxxxx notation
- * for U+0000 to U+FFFF and <backslash>Uxxxxxxxx for U+10000 and
+ * Escape unprintable characters using {@code <backslash>uxxxx} notation
+ * for U+0000 to U+FFFF and {@code <backslash>Uxxxxxxxx} for U+10000 and
* above. If the character is printable ASCII, then do nothing
* and return FALSE. Otherwise, append the escaped notation and
* return TRUE.
--- a/jdk/src/java.base/share/classes/sun/text/normalizer/VersionInfo.java Thu May 21 10:07:38 2015 -0700
+++ b/jdk/src/java.base/share/classes/sun/text/normalizer/VersionInfo.java Thu May 21 16:20:20 2015 -0700
@@ -53,7 +53,7 @@
* @param version version String in the format of "major.minor.milli.micro"
* or "major.minor.milli" or "major.minor" or "major",
* where major, minor, milli, micro are non-negative numbers
- * <= 255. If the trailing version numbers are
+ * {@literal <=} 255. If the trailing version numbers are
* not specified they are taken as 0s. E.g. Version "3.1" is
* equivalent to "3.1.0.0".
* @return an instance of VersionInfo with the argument version.
@@ -98,12 +98,12 @@
/**
* Returns an instance of VersionInfo with the argument version.
- * @param major major version, non-negative number <= 255.
- * @param minor minor version, non-negative number <= 255.
- * @param milli milli version, non-negative number <= 255.
- * @param micro micro version, non-negative number <= 255.
+ * @param major major version, non-negative number {@literal <=} 255.
+ * @param minor minor version, non-negative number {@literal <=} 255.
+ * @param milli milli version, non-negative number {@literal <=} 255.
+ * @param micro micro version, non-negative number {@literal <=} 255.
* @exception throws an IllegalArgumentException when either arguments are
- * negative or > 255
+ * negative or {@literal >} 255
* @stable ICU 2.6
*/
public static VersionInfo getInstance(int major, int minor, int milli,
--- a/jdk/src/java.base/unix/classes/sun/nio/fs/UnixChannelFactory.java Thu May 21 10:07:38 2015 -0700
+++ b/jdk/src/java.base/unix/classes/sun/nio/fs/UnixChannelFactory.java Thu May 21 16:20:20 2015 -0700
@@ -270,22 +270,6 @@
throw x;
}
- // fail if the file is a directory
- if (flags.read) {
- UnixException exc = null;
- try {
- if (UnixFileAttributes.get(fd).isDirectory()) {
- exc = new UnixException(EISDIR);
- }
- } catch (UnixException x) {
- exc = x;
- }
- if (exc != null) {
- close(fd);
- throw exc;
- }
- }
-
// unlink file immediately if delete on close. The spec is clear that
// an implementation cannot guarantee to unlink the correct file when
// replaced by an attacker after it is opened.
--- a/jdk/src/java.base/unix/native/libnio/ch/FileDispatcherImpl.c Thu May 21 10:07:38 2015 -0700
+++ b/jdk/src/java.base/unix/native/libnio/ch/FileDispatcherImpl.c Thu May 21 16:20:20 2015 -0700
@@ -148,6 +148,13 @@
jint fd = fdval(env, fdo);
int result = 0;
+#ifdef MACOSX
+ result = fcntl(fd, F_FULLFSYNC);
+ if (result == -1 && errno == ENOTSUP) {
+ /* Try fsync() in case F_FULLSYUNC is not implemented on the file system. */
+ result = fsync(fd);
+ }
+#else /* end MACOSX, begin not-MACOSX */
if (md == JNI_FALSE) {
result = fdatasync(fd);
} else {
@@ -163,9 +170,10 @@
if (getfl >= 0 && (getfl & O_ACCMODE) == O_RDONLY) {
return 0;
}
-#endif
+#endif /* _AIX */
result = fsync(fd);
}
+#endif /* not-MACOSX */
return handle(env, result, "Force failed");
}
--- a/jdk/src/java.base/windows/native/libjli/java_md.c Thu May 21 10:07:38 2015 -0700
+++ b/jdk/src/java.base/windows/native/libjli/java_md.c Thu May 21 16:20:20 2015 -0700
@@ -990,6 +990,26 @@
return JNI_FALSE;
}
+int
+filterArgs(StdArg *stdargs, const int nargc, StdArg **pargv) {
+ StdArg* argv = NULL;
+ int nargs = 0;
+ int i;
+
+ /* Copy the non-vm args */
+ for (i = 0; i < nargc ; i++) {
+ const char *arg = stdargs[i].arg;
+ if (arg[0] == '-' && arg[1] == 'J')
+ continue;
+ argv = (StdArg*) JLI_MemRealloc(argv, (nargs+1) * sizeof(StdArg));
+ argv[nargs].arg = JLI_StringDup(arg);
+ argv[nargs].has_wildcard = stdargs[i].has_wildcard;
+ nargs++;
+ }
+ *pargv = argv;
+ return nargs;
+}
+
/*
* At this point we have the arguments to the application, and we need to
* check with original stdargs in order to compare which of these truly
@@ -1005,8 +1025,9 @@
char *ostart, *astart, **nargv;
jboolean needs_expansion = JNI_FALSE;
jmethodID mid;
- int stdargc;
+ int filteredargc, stdargc;
StdArg *stdargs;
+ StdArg *filteredargs;
jclass cls = GetLauncherHelperClass(env);
NULL_CHECK0(cls);
@@ -1017,6 +1038,8 @@
stdargs = JLI_GetStdArgs();
stdargc = JLI_GetStdArgc();
+ filteredargc = filterArgs(stdargs, stdargc, &filteredargs);
+
// sanity check, this should never happen
if (argc > stdargc) {
JLI_TraceLauncher("Warning: app args is larger than the original, %d %d\n", argc, stdargc);
@@ -1025,8 +1048,8 @@
}
// sanity check, match the args we have, to the holy grail
- idx = stdargc - argc;
- ostart = stdargs[idx].arg;
+ idx = filteredargc - argc;
+ ostart = filteredargs[idx].arg;
astart = strv[0];
// sanity check, ensure that the first argument of the arrays are the same
if (JLI_StrCmp(ostart, astart) != 0) {
@@ -1039,8 +1062,8 @@
// make a copy of the args which will be expanded in java if required.
nargv = (char **)JLI_MemAlloc(argc * sizeof(char*));
for (i = 0, j = idx; i < argc; i++, j++) {
- jboolean arg_expand = (JLI_StrCmp(stdargs[j].arg, strv[i]) == 0)
- ? stdargs[j].has_wildcard
+ jboolean arg_expand = (JLI_StrCmp(filteredargs[j].arg, strv[i]) == 0)
+ ? filteredargs[j].has_wildcard
: JNI_FALSE;
if (needs_expansion == JNI_FALSE)
needs_expansion = arg_expand;
@@ -1077,5 +1100,6 @@
JLI_MemFree(nargv[i]);
}
JLI_MemFree(nargv);
+ JLI_MemFree(filteredargs);
return outArray;
}
--- a/jdk/src/java.logging/share/classes/java/util/logging/LogManager.java Thu May 21 10:07:38 2015 -0700
+++ b/jdk/src/java.logging/share/classes/java/util/logging/LogManager.java Thu May 21 16:20:20 2015 -0700
@@ -33,6 +33,7 @@
import java.lang.ref.WeakReference;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.CopyOnWriteArrayList;
+import java.util.concurrent.locks.ReentrantLock;
import sun.misc.JavaAWTAccess;
import sun.misc.ManagedLocalsThread;
import sun.misc.SharedSecrets;
@@ -180,10 +181,16 @@
// initialization has been done)
private volatile boolean readPrimordialConfiguration;
// Have we initialized global (root) handlers yet?
- // This gets set to false in readConfiguration
- private boolean initializedGlobalHandlers = true;
- // True if JVM death is imminent and the exit hook has been called.
- private boolean deathImminent;
+ // This gets set to STATE_UNINITIALIZED in readConfiguration
+ private static final int
+ STATE_INITIALIZED = 0, // initial state
+ STATE_INITIALIZING = 1,
+ STATE_READING_CONFIG = 2,
+ STATE_UNINITIALIZED = 3,
+ STATE_SHUTDOWN = 4; // terminal state
+ private volatile int globalHandlersState; // = STATE_INITIALIZED;
+ // A concurrency lock for reset(), readConfiguration() and Cleaner.
+ private final ReentrantLock configurationLock = new ReentrantLock();
// This list contains the loggers for which some handlers have been
// explicitly configured in the configuration file.
@@ -264,13 +271,12 @@
// before synchronized block. Otherwise deadlocks are possible.
LogManager mgr = manager;
- // If the global handlers haven't been initialized yet, we
- // don't want to initialize them just so we can close them!
- synchronized (LogManager.this) {
- // Note that death is imminent.
- deathImminent = true;
- initializedGlobalHandlers = true;
- }
+ // set globalHandlersState to STATE_SHUTDOWN atomically so that
+ // no attempts are made to (re)initialize the handlers or (re)read
+ // the configuration again. This is terminal state.
+ configurationLock.lock();
+ globalHandlersState = STATE_SHUTDOWN;
+ configurationLock.unlock();
// Do a reset to close all active handlers.
reset();
@@ -1314,8 +1320,14 @@
public void reset() throws SecurityException {
checkPermission();
+
List<CloseOnReset> persistent;
- synchronized (this) {
+
+ // We don't want reset() and readConfiguration()
+ // to run in parallel
+ configurationLock.lock();
+ try {
+ // install new empty properties
props = new Properties();
// make sure we keep the loggers persistent until reset is done.
// Those are the loggers for which we previously created a
@@ -1323,26 +1335,41 @@
// from being gc'ed until those handlers are closed.
persistent = new ArrayList<>(closeOnResetLoggers);
closeOnResetLoggers.clear();
- // Since we are doing a reset we no longer want to initialize
- // the global handlers, if they haven't been initialized yet.
- initializedGlobalHandlers = true;
+
+ // if reset has been called from shutdown-hook (Cleaner),
+ // or if reset has been called from readConfiguration() which
+ // already holds the lock and will change the state itself,
+ // then do not change state here...
+ if (globalHandlersState != STATE_SHUTDOWN &&
+ globalHandlersState != STATE_READING_CONFIG) {
+ // ...else user called reset()...
+ // Since we are doing a reset we no longer want to initialize
+ // the global handlers, if they haven't been initialized yet.
+ globalHandlersState = STATE_INITIALIZED;
+ }
+
+ for (LoggerContext cx : contexts()) {
+ resetLoggerContext(cx);
+ }
+
+ persistent.clear();
+ } finally {
+ configurationLock.unlock();
}
- for (LoggerContext cx : contexts()) {
- Enumeration<String> enum_ = cx.getLoggerNames();
- while (enum_.hasMoreElements()) {
- String name = enum_.nextElement();
- Logger logger = cx.findLogger(name);
- if (logger != null) {
- resetLogger(logger);
- }
+ }
+
+ private void resetLoggerContext(LoggerContext cx) {
+ Enumeration<String> enum_ = cx.getLoggerNames();
+ while (enum_.hasMoreElements()) {
+ String name = enum_.nextElement();
+ Logger logger = cx.findLogger(name);
+ if (logger != null) {
+ resetLogger(logger);
}
}
- persistent.clear();
}
- // Private method to reset an individual target logger.
- private void resetLogger(Logger logger) {
- // Close all the Logger's handlers.
+ private void closeHandlers(Logger logger) {
Handler[] targets = logger.getHandlers();
for (Handler h : targets) {
logger.removeHandler(h);
@@ -1352,6 +1379,14 @@
// Problems closing a handler? Keep going...
}
}
+ }
+
+ // Private method to reset an individual target logger.
+ private void resetLogger(Logger logger) {
+ // Close all the Logger handlers.
+ closeHandlers(logger);
+
+ // Reset Logger level
String name = logger.getName();
if (name != null && name.equals("")) {
// This is the root logger.
@@ -1408,48 +1443,74 @@
*/
public void readConfiguration(InputStream ins) throws IOException, SecurityException {
checkPermission();
- reset();
- // Load the properties
+ // We don't want reset() and readConfiguration() to run
+ // in parallel.
+ configurationLock.lock();
try {
- props.load(ins);
- } catch (IllegalArgumentException x) {
- // props.load may throw an IllegalArgumentException if the stream
- // contains malformed Unicode escape sequences.
- // We wrap that in an IOException as readConfiguration is
- // specified to throw IOException if there are problems reading
- // from the stream.
- // Note: new IOException(x.getMessage(), x) allow us to get a more
- // concise error message than new IOException(x);
- throw new IOException(x.getMessage(), x);
+ if (globalHandlersState == STATE_SHUTDOWN) {
+ // already in terminal state: don't even bother
+ // to read the configuration
+ return;
+ }
+
+ // change state to STATE_READING_CONFIG to signal reset() to not change it
+ globalHandlersState = STATE_READING_CONFIG;
+ try {
+ // reset configuration which leaves globalHandlersState at STATE_READING_CONFIG
+ // so that while reading configuration, any ongoing logging requests block and
+ // wait for the outcome (see the end of this try statement)
+ reset();
+
+ try {
+ // Load the properties
+ props.load(ins);
+ } catch (IllegalArgumentException x) {
+ // props.load may throw an IllegalArgumentException if the stream
+ // contains malformed Unicode escape sequences.
+ // We wrap that in an IOException as readConfiguration is
+ // specified to throw IOException if there are problems reading
+ // from the stream.
+ // Note: new IOException(x.getMessage(), x) allow us to get a more
+ // concise error message than new IOException(x);
+ throw new IOException(x.getMessage(), x);
+ }
+
+ // Instantiate new configuration objects.
+ String names[] = parseClassNames("config");
+
+ for (String word : names) {
+ try {
+ Class<?> clz = ClassLoader.getSystemClassLoader().loadClass(word);
+ clz.newInstance();
+ } catch (Exception ex) {
+ System.err.println("Can't load config class \"" + word + "\"");
+ System.err.println("" + ex);
+ // ex.printStackTrace();
+ }
+ }
+
+ // Set levels on any pre-existing loggers, based on the new properties.
+ setLevelsOnExistingLoggers();
+
+ // Note that we need to reinitialize global handles when
+ // they are first referenced.
+ globalHandlersState = STATE_UNINITIALIZED;
+ } catch (Throwable t) {
+ // If there were any trouble, then set state to STATE_INITIALIZED
+ // so that no global handlers reinitialization is performed on not fully
+ // initialized configuration.
+ globalHandlersState = STATE_INITIALIZED;
+ // re-throw
+ throw t;
+ }
+ } finally {
+ configurationLock.unlock();
}
- // Instantiate new configuration objects.
- String names[] = parseClassNames("config");
-
- for (String word : names) {
- try {
- Class<?> clz = ClassLoader.getSystemClassLoader().loadClass(word);
- clz.newInstance();
- } catch (Exception ex) {
- System.err.println("Can't load config class \"" + word + "\"");
- System.err.println("" + ex);
- // ex.printStackTrace();
- }
- }
-
- // Set levels on any pre-existing loggers, based on the new properties.
- setLevelsOnExistingLoggers();
-
- try {
- invokeConfigurationListeners();
- } finally {
- // Note that we need to reinitialize global handles when
- // they are first referenced.
- synchronized (this) {
- initializedGlobalHandlers = false;
- }
- }
+ // should be called out of lock to avoid dead-lock situations
+ // when user code is involved
+ invokeConfigurationListeners();
}
/**
@@ -1576,20 +1637,41 @@
// Private method to load the global handlers.
// We do the real work lazily, when the global handlers
// are first used.
- private synchronized void initializeGlobalHandlers() {
- if (initializedGlobalHandlers) {
+ private void initializeGlobalHandlers() {
+ int state = globalHandlersState;
+ if (state == STATE_INITIALIZED ||
+ state == STATE_SHUTDOWN) {
+ // Nothing to do: return.
return;
}
- initializedGlobalHandlers = true;
-
- if (deathImminent) {
- // Aaargh...
- // The VM is shutting down and our exit hook has been called.
- // Avoid allocating global handlers.
- return;
+ // If we have not initialized global handlers yet (or need to
+ // reinitialize them), lets do it now (this case is indicated by
+ // globalHandlersState == STATE_UNINITIALIZED).
+ // If we are in the process of initializing global handlers we
+ // also need to lock & wait (this case is indicated by
+ // globalHandlersState == STATE_INITIALIZING).
+ // If we are in the process of reading configuration we also need to
+ // wait to see what the outcome will be (this case
+ // is indicated by globalHandlersState == STATE_READING_CONFIG)
+ // So in either case we need to wait for the lock.
+ configurationLock.lock();
+ try {
+ if (globalHandlersState != STATE_UNINITIALIZED) {
+ return; // recursive call or nothing to do
+ }
+ // set globalHandlersState to STATE_INITIALIZING first to avoid
+ // getting an infinite recursion when loadLoggerHandlers(...)
+ // is going to call addHandler(...)
+ globalHandlersState = STATE_INITIALIZING;
+ try {
+ loadLoggerHandlers(rootLogger, null, "handlers");
+ } finally {
+ globalHandlersState = STATE_INITIALIZED;
+ }
+ } finally {
+ configurationLock.unlock();
}
- loadLoggerHandlers(rootLogger, null, "handlers");
}
static final Permission controlPermission = new LoggingPermission("control", null);
@@ -1684,7 +1766,7 @@
// Private method to be called when the configuration has
// changed to apply any level settings to any pre-existing loggers.
- synchronized private void setLevelsOnExistingLoggers() {
+ private void setLevelsOnExistingLoggers() {
Enumeration<?> enum_ = props.propertyNames();
while (enum_.hasMoreElements()) {
String key = (String)enum_.nextElement();
--- a/jdk/src/java.logging/share/classes/java/util/logging/package.html Thu May 21 10:07:38 2015 -0700
+++ b/jdk/src/java.logging/share/classes/java/util/logging/package.html Thu May 21 16:20:20 2015 -0700
@@ -30,8 +30,7 @@
<body bgcolor="white">
<P>
Provides the classes and interfaces of
-the Java<SUP><FONT SIZE="-2">TM</FONT></SUP> 2
- platform's core logging facilities.
+the Java™ 2 platform's core logging facilities.
The central goal of the logging APIs is to support maintaining and servicing
software at customer sites.
--- a/jdk/src/java.management/share/classes/com/sun/jmx/mbeanserver/DefaultMXBeanMappingFactory.java Thu May 21 10:07:38 2015 -0700
+++ b/jdk/src/java.management/share/classes/com/sun/jmx/mbeanserver/DefaultMXBeanMappingFactory.java Thu May 21 16:20:20 2015 -0700
@@ -79,44 +79,46 @@
/**
* <p>A converter between Java types and the limited set of classes
- * defined by Open MBeans.</p>
+ * defined by Open MBeans.
*
- * <p>A Java type is an instance of java.lang.reflect.Type. For our
+ * <p>A Java type is an instance of java.lang.reflect.Type. For our
* purposes, it is either a Class, such as String.class or int.class;
- * or a ParameterizedType, such as List<String> or Map<Integer,
- * String[]>. On J2SE 1.4 and earlier, it can only be a Class.</p>
+ * or a ParameterizedType, such as {@code List<String>} or
+ * {@code Map<Integer, String[]>}.
+ * On J2SE 1.4 and earlier, it can only be a Class.
*
- * <p>Each Type is associated with an DefaultMXBeanMappingFactory. The
- * DefaultMXBeanMappingFactory defines an OpenType corresponding to the Type, plus a
- * Java class corresponding to the OpenType. For example:</p>
+ * <p>Each Type is associated with an DefaultMXBeanMappingFactory. The
+ * DefaultMXBeanMappingFactory defines an
+ * OpenType corresponding to the Type, plus a
+ * Java class corresponding to the OpenType. For example:
*
- * <pre>
+ * <pre>{@code
* Type Open class OpenType
* ---- ---------- --------
- * Integer Integer SimpleType.INTEGER
- * int int SimpleType.INTEGER
- * Integer[] Integer[] ArrayType(1, SimpleType.INTEGER)
- * int[] Integer[] ArrayType(SimpleType.INTEGER, true)
- * String[][] String[][] ArrayType(2, SimpleType.STRING)
- * List<String> String[] ArrayType(1, SimpleType.STRING)
+ * Integer Integer SimpleType.INTEGER
+ * int int SimpleType.INTEGER
+ * Integer[] Integer[] ArrayType(1, SimpleType.INTEGER)
+ * int[] Integer[] ArrayType(SimpleType.INTEGER, true)
+ * String[][] String[][] ArrayType(2, SimpleType.STRING)
+ * List<String> String[] ArrayType(1, SimpleType.STRING)
* ThreadState (an Enum) String SimpleType.STRING
- * Map<Integer, String[]> TabularData TabularType(
+ * Map<Integer, String[]> TabularData TabularType(
* CompositeType(
* {"key", SimpleType.INTEGER},
* {"value",
* ArrayType(1,
* SimpleType.STRING)}),
* indexNames={"key"})
- * </pre>
+ * }</pre>
*
* <p>Apart from simple types, arrays, and collections, Java types are
* converted through introspection into CompositeType. The Java type
* must have at least one getter (method such as "int getSize()" or
* "boolean isBig()"), and we must be able to deduce how to
* reconstruct an instance of the Java class from the values of the
- * getters using one of various heuristics.</p>
+ * getters using one of various heuristics.
*
- * @since 1.6
+ * @since 1.6
*/
public class DefaultMXBeanMappingFactory extends MXBeanMappingFactory {
static abstract class NonNullMXBeanMapping extends MXBeanMapping {
@@ -148,8 +150,8 @@
throws OpenDataException;
/**
- * <p>True if and only if this MXBeanMapping's toOpenValue and
- * fromOpenValue methods are the identity function.</p>
+ * True if and only if this MXBeanMapping's toOpenValue and
+ * fromOpenValue methods are the identity function.
*/
boolean isIdentity() {
return false;
--- a/jdk/src/java.management/share/classes/com/sun/jmx/remote/internal/ServerCommunicatorAdmin.java Thu May 21 10:07:38 2015 -0700
+++ b/jdk/src/java.management/share/classes/com/sun/jmx/remote/internal/ServerCommunicatorAdmin.java Thu May 21 16:20:20 2015 -0700
@@ -57,8 +57,8 @@
* <code>rspOutgoing</code> to inform that a response is sent out
* for the received request.
* @return the value of the termination flag:
- * <ul><code>true</code> if the connection is already being terminated,
- * <br><code>false</code> otherwise.</ul>
+ * true if the connection is already being terminated,
+ * false otherwise.
*/
public boolean reqIncoming() {
if (logger.traceOn()) {
@@ -80,8 +80,8 @@
/**
* Tells that a response is sent out for a received request.
* @return the value of the termination flag:
- * <ul><code>true</code> if the connection is already being terminated,
- * <br><code>false</code> otherwise.</ul>
+ * true if the connection is already being terminated,
+ * false otherwise.
*/
public boolean rspOutgoing() {
if (logger.traceOn()) {
--- a/jdk/src/java.management/share/classes/com/sun/jmx/remote/util/EnvHelp.java Thu May 21 10:07:38 2015 -0700
+++ b/jdk/src/java.management/share/classes/com/sun/jmx/remote/util/EnvHelp.java Thu May 21 16:20:20 2015 -0700
@@ -55,17 +55,17 @@
public class EnvHelp {
/**
- * <p>Name of the attribute that specifies a default class loader
+ * Name of the attribute that specifies a default class loader
* object.
- * The value associated with this attribute is a ClassLoader object</p>
+ * The value associated with this attribute is a ClassLoader object.
*/
private static final String DEFAULT_CLASS_LOADER =
JMXConnectorFactory.DEFAULT_CLASS_LOADER;
/**
- * <p>Name of the attribute that specifies a default class loader
- * ObjectName.
- * The value associated with this attribute is an ObjectName object</p>
+ * Name of the attribute that specifies a default class loader
+ * ObjectName.
+ * The value associated with this attribute is an ObjectName object.
*/
private static final String DEFAULT_CLASS_LOADER_NAME =
JMXConnectorServerFactory.DEFAULT_CLASS_LOADER_NAME;
@@ -74,7 +74,6 @@
* Get the Connector Server default class loader.
* <p>
* Returns:
- * <p>
* <ul>
* <li>
* The ClassLoader object found in <var>env</var> for
@@ -114,6 +113,7 @@
* <code>jmx.remote.default.class.loader.name</code> is specified
* but <var>mbs</var> is null.
* </li>
+ * </ul>
* @exception InstanceNotFoundException if
* <code>jmx.remote.default.class.loader.name</code> is specified
* and the ClassLoader MBean is not found in <var>mbs</var>.
@@ -172,7 +172,6 @@
* Get the Connector Client default class loader.
* <p>
* Returns:
- * <p>
* <ul>
* <li>
* The ClassLoader object found in <var>env</var> for
@@ -232,7 +231,7 @@
/**
* Returns the cause field of a {@code Throwable} object.
* The cause field can be got only if <var>t</var> has an
- * {@link Throwable#getCause()} method (JDK Version >= 1.4)
+ * {@link Throwable#getCause()} method (JDK Version {@literal >=} 1.4)
* @param t {@code Throwable} on which the cause must be set.
* @return the cause if getCause() succeeded and the got value is not
* null, otherwise return the <var>t</var>.
@@ -254,7 +253,7 @@
/**
- * <p>Name of the attribute that specifies the size of a notification
+ * Name of the attribute that specifies the size of a notification
* buffer for a connector server. The default value is 1000.
*/
public static final String BUFFER_SIZE_PROPERTY =
@@ -316,10 +315,10 @@
}
/**
- * <p>Name of the attribute that specifies the maximum number of
- * notifications that a client will fetch from its server.. The
+ * Name of the attribute that specifies the maximum number of
+ * notifications that a client will fetch from its server. The
* value associated with this attribute should be an
- * <code>Integer</code> object. The default value is 1000.</p>
+ * {@code Integer} object. The default value is 1000.
*/
public static final String MAX_FETCH_NOTIFS =
"jmx.remote.x.notification.fetch.max";
@@ -334,10 +333,10 @@
}
/**
- * <p>Name of the attribute that specifies the timeout for a
+ * Name of the attribute that specifies the timeout for a
* client to fetch notifications from its server. The value
* associated with this attribute should be a <code>Long</code>
- * object. The default value is 60000 milliseconds.</p>
+ * object. The default value is 60000 milliseconds.
*/
public static final String FETCH_TIMEOUT =
"jmx.remote.x.notification.fetch.timeout";
@@ -351,11 +350,12 @@
}
/**
- * <p>Name of the attribute that specifies an object that will check
+ * Name of the attribute that specifies an object that will check
* accesses to add/removeNotificationListener and also attempts to
* receive notifications. The value associated with this attribute
* should be a <code>NotificationAccessController</code> object.
- * The default value is null.</p>
+ * The default value is null.
+ * <p>
* This field is not public because of its com.sun dependency.
*/
public static final String NOTIF_ACCESS_CONTROLLER =
@@ -630,9 +630,9 @@
}
/**
- * <p>Name of the attribute that specifies the timeout to keep a
+ * Name of the attribute that specifies the timeout to keep a
* server side connection after answering last client request.
- * The default value is 120000 milliseconds.</p>
+ * The default value is 120000 milliseconds.
*/
public static final String SERVER_CONNECTION_TIMEOUT =
"jmx.remote.x.server.connection.timeout";
@@ -646,9 +646,9 @@
}
/**
- * <p>Name of the attribute that specifies the period in
- * millisecond for a client to check its connection. The default
- * value is 60000 milliseconds.</p>
+ * Name of the attribute that specifies the period in
+ * millisecond for a client to check its connection. The default
+ * value is 60000 milliseconds.
*/
public static final String CLIENT_CONNECTION_CHECK_PERIOD =
"jmx.remote.x.client.connection.check.period";
@@ -741,13 +741,13 @@
}
/**
- * <p>Name of the attribute that specifies whether a connector server
+ * Name of the attribute that specifies whether a connector server
* should not prevent the VM from exiting
*/
public static final String JMX_SERVER_DAEMON = "jmx.remote.x.daemon";
/**
- * Returns true if {@value SERVER_DAEMON} is specified in the {@code env}
+ * Returns true if {@value JMX_SERVER_DAEMON} is specified in the {@code env}
* as a key and its value is a String and it is equal to true ignoring case.
*
* @param env
--- a/jdk/src/java.management/share/classes/javax/management/package.html Thu May 21 10:07:38 2015 -0700
+++ b/jdk/src/java.management/share/classes/javax/management/package.html Thu May 21 16:20:20 2015 -0700
@@ -30,7 +30,7 @@
<p>Provides the core classes for the Java Management Extensions.</p>
<p>The Java Management Extensions
- (JMX<sup><font size="-1">TM</font></sup>) API is a standard
+ (JMX™) API is a standard
API for management and monitoring. Typical uses include:</p>
<ul>
@@ -87,8 +87,7 @@
notion of <em>Standard MBeans</em>. A Standard MBean is one
whose attributes and operations are deduced from a Java
interface using certain naming patterns, similar to those used
- by JavaBeans<sup><font size="-1">TM</font></sup>. For
- example, consider an interface like this:</p>
+ by JavaBeans™. For example, consider an interface like this:</p>
<pre>
public interface ConfigurationMBean {
--- a/jdk/src/java.management/share/classes/javax/management/remote/package.html Thu May 21 10:07:38 2015 -0700
+++ b/jdk/src/java.management/share/classes/javax/management/remote/package.html Thu May 21 16:20:20 2015 -0700
@@ -1,6 +1,6 @@
<html>
<head>
- <title>JMX<sup><font size="-2">TM</font></sup> Remote API.</title>
+ <title>JMX™ Remote API.</title>
<!--
Copyright (c) 2002, 2014, Oracle and/or its affiliates. All rights reserved.
DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
--- a/jdk/src/java.management/share/classes/javax/management/remote/rmi/package.html Thu May 21 10:07:38 2015 -0700
+++ b/jdk/src/java.management/share/classes/javax/management/remote/rmi/package.html Thu May 21 16:20:20 2015 -0700
@@ -387,12 +387,11 @@
@see <a href="{@docRoot}/../technotes/guides/rmi/index.html">
- Java<sup><font size="-1">TM</font></sup> Remote Method
+ Java™ Remote Method
Invocation (RMI)</a>
@see <a href="{@docRoot}/../technotes/guides/jndi/index.html">
- Java Naming and Directory Interface<sup><font
- size="-1">TM</font></sup> (JNDI)</a>
+ Java Naming and Directory Interface™ (JNDI)</a>
@see <a href="http://www.ietf.org/rfc/rfc2045.txt">RFC 2045,
section 6.8, "Base64 Content-Transfer-Encoding"</a>
--- a/jdk/src/java.management/share/classes/sun/management/HotspotRuntimeMBean.java Thu May 21 10:07:38 2015 -0700
+++ b/jdk/src/java.management/share/classes/sun/management/HotspotRuntimeMBean.java Thu May 21 16:20:20 2015 -0700
@@ -64,7 +64,7 @@
* Returns a list of internal counters maintained in the Java
* virtual machine for the runtime system.
*
- * @return a <tt>List</tt> of internal counters maintained in the VM
+ * @return a {@code List} of internal counters maintained in the VM
* for the runtime system.
*/
public java.util.List<Counter> getInternalRuntimeCounters();
--- a/jdk/src/java.management/share/classes/sun/management/HotspotThreadMBean.java Thu May 21 10:07:38 2015 -0700
+++ b/jdk/src/java.management/share/classes/sun/management/HotspotThreadMBean.java Thu May 21 16:20:20 2015 -0700
@@ -40,12 +40,11 @@
public int getInternalThreadCount();
/**
- * Returns a <tt>Map</tt> of the name of all VM internal threads
+ * Returns a {@code Map} of the name of all VM internal threads
* to the thread CPU time in nanoseconds. The returned value is
* of nanoseconds precision but not necessarily nanoseconds accuracy.
- * <p>
*
- * @return a <tt>Map</tt> object of the name of all VM internal threads
+ * @return a {@code Map} object of the name of all VM internal threads
* to the thread CPU time in nanoseconds.
*
* @throws java.lang.UnsupportedOperationException if the Java virtual
--- a/jdk/src/java.management/share/classes/sun/management/MappedMXBeanType.java Thu May 21 10:07:38 2015 -0700
+++ b/jdk/src/java.management/share/classes/sun/management/MappedMXBeanType.java Thu May 21 16:20:20 2015 -0700
@@ -45,13 +45,15 @@
* A mapped mxbean type maps a Java type to an open type.
* Only the following Java types are mappable
* (currently required by the platform MXBeans):
- * 1. Primitive types
- * 2. Wrapper classes such java.lang.Integer, etc
- * 3. Classes with only getter methods and with a static "from" method
- * that takes a CompositeData argument.
- * 4. E[] where E is a type of 1-4 (can be multi-dimensional array)
- * 5. List<E> where E is a type of 1-3
- * 6. Map<K, V> where K and V are a type of 1-4
+ * <ol>
+ * <li>Primitive types</li>
+ * <li>Wrapper classes such java.lang.Integer, etc</li>
+ * <li>Classes with only getter methods and with a static "from" method
+ * that takes a CompositeData argument.</li>
+ * <li>{@code E[]} where {@code E} is a type of 1-4 (can be multi-dimensional array)</li>
+ * <li>{@code List<E>} where E is a type of 1-3</li>
+ * <li>{@code Map<K, V>} where {@code K} and {@code V} are a type of 1-4</li>
+ * </ol>
*
* OpenDataException will be thrown if a Java type is not supported.
*/
--- a/jdk/src/java.management/share/classes/sun/management/Sensor.java Thu May 21 10:07:38 2015 -0700
+++ b/jdk/src/java.management/share/classes/sun/management/Sensor.java Thu May 21 16:20:20 2015 -0700
@@ -34,12 +34,12 @@
* An abstract sensor.
*
* <p>
- * A <tt>AbstractSensor</tt> object consists of two attributes:
+ * A {@code AbstractSensor} object consists of two attributes:
* <ul>
- * <li><tt>on</tt> is a boolean flag indicating if a sensor is
+ * <li>{@code on} is a boolean flag indicating if a sensor is
* triggered. This flag will be set or cleared by the
* component that owns the sensor.</li>
- * <li><tt>count</tt> is the total number of times that a sensor
+ * <li>{@code count} is the total number of times that a sensor
* has been triggered.</li>
* </ul>
*
@@ -54,7 +54,7 @@
private boolean on;
/**
- * Constructs a <tt>Sensor</tt> object.
+ * Constructs a {@code Sensor} object.
*
* @param name The name of this sensor.
*/
@@ -88,8 +88,8 @@
/**
* Tests if this sensor is currently on.
*
- * @return <tt>true</tt> if the sensor is currently on;
- * <tt>false</tt> otherwise.
+ * @return {@code true} if the sensor is currently on;
+ * {@code false} otherwise.
*
*/
public boolean isOn() {
@@ -112,7 +112,7 @@
/**
* Triggers this sensor. This method sets this sensor on
- * and increments the count with the input <tt>increment</tt>.
+ * and increments the count with the input {@code increment}.
*/
public void trigger(int increment) {
synchronized (lock) {
@@ -126,7 +126,7 @@
/**
* Triggers this sensor piggybacking a memory usage object.
* This method sets this sensor on
- * and increments the count with the input <tt>increment</tt>.
+ * and increments the count with the input {@code increment}.
*/
public void trigger(int increment, MemoryUsage usage) {
synchronized (lock) {
@@ -150,7 +150,7 @@
/**
* Clears this sensor
- * and increments the count with the input <tt>increment</tt>.
+ * and increments the count with the input {@code increment}.
*/
public void clear(int increment) {
synchronized (lock) {
--- a/jdk/src/java.management/share/classes/sun/management/counter/Counter.java Thu May 21 10:07:38 2015 -0700
+++ b/jdk/src/java.management/share/classes/sun/management/counter/Counter.java Thu May 21 16:20:20 2015 -0700
@@ -63,7 +63,7 @@
public Object getValue();
/**
- * Returns <tt>true</tt> if this counter is an internal counter.
+ * Returns {@code true} if this counter is an internal counter.
*/
public boolean isInternal();
--- a/jdk/src/java.management/share/classes/sun/management/counter/perf/InstrumentationException.java Thu May 21 10:07:38 2015 -0700
+++ b/jdk/src/java.management/share/classes/sun/management/counter/perf/InstrumentationException.java Thu May 21 16:20:20 2015 -0700
@@ -27,14 +27,14 @@
public class InstrumentationException extends RuntimeException {
/**
- * Constructs a <tt>InstrumentationException</tt> with no
+ * Constructs a {@code InstrumentationException} with no
* detail message.
*/
public InstrumentationException() {
}
/**
- * Constructs a <tt>InstrumentationException</tt> with a specified
+ * Constructs a {@code InstrumentationException} with a specified
* detail message.
*
* @param message the detail message
--- a/jdk/src/java.management/share/classes/sun/management/jdp/JdpController.java Thu May 21 10:07:38 2015 -0700
+++ b/jdk/src/java.management/share/classes/sun/management/jdp/JdpController.java Thu May 21 16:20:20 2015 -0700
@@ -37,19 +37,18 @@
import sun.misc.ManagedLocalsThread;
/**
- * JdpController is responsible to create and manage a broadcast loop
+ * JdpController is responsible to create and manage a broadcast loop.
*
* <p> Other part of code has no access to broadcast loop and have to use
* provided static methods
* {@link #startDiscoveryService(InetAddress,int,String,String) startDiscoveryService}
- * and {@link #stopDiscoveryService() stopDiscoveryService}</p>
+ * and {@link #stopDiscoveryService() stopDiscoveryService}
* <p>{@link #startDiscoveryService(InetAddress,int,String,String) startDiscoveryService} could be called multiple
- * times as it stops the running service if it is necessary. Call to {@link #stopDiscoveryService() stopDiscoveryService}
- * ignored if service isn't run</p>
+ * times as it stops the running service if it is necessary.
+ * Call to {@link #stopDiscoveryService() stopDiscoveryService}
+ * ignored if service isn't run.
*
*
- * </p>
- *
* <p> System properties below could be used to control broadcast loop behavior.
* Property below have to be set explicitly in command line. It's not possible to
* set it in management.config file. Careless changes of these properties could
@@ -59,9 +58,9 @@
* <li>com.sun.management.jdp.pause - set broadcast interval in seconds</li>
* <li>com.sun.management.jdp.source_addr - an address of interface to use for broadcast</li>
* </ul>
- </p>
+ *
* <p>null parameters values are filtered out on {@link JdpPacketWriter} level and
- * corresponding keys are not placed to packet.</p>
+ * corresponding keys are not placed to packet.
*/
public final class JdpController {
--- a/jdk/src/java.naming/share/classes/com/sun/jndi/ldap/BasicControl.java Thu May 21 10:07:38 2015 -0700
+++ b/jdk/src/java.naming/share/classes/com/sun/jndi/ldap/BasicControl.java Thu May 21 16:20:20 2015 -0700
@@ -28,7 +28,7 @@
import javax.naming.ldap.*;
/**
- * This class provides a basic implementation of the <tt>Control</tt>
+ * This class provides a basic implementation of the {@code Control}
* interface. It represents an LDAPv3 Control as defined in RFC-2251.
*
* @author Vincent Ryan
--- a/jdk/src/java.naming/share/classes/com/sun/jndi/ldap/BerDecoder.java Thu May 21 10:07:38 2015 -0700
+++ b/jdk/src/java.naming/share/classes/com/sun/jndi/ldap/BerDecoder.java Thu May 21 16:20:20 2015 -0700
@@ -295,7 +295,7 @@
* the relative parsed position is not returned.
* @return A non-null array containing the octet string.
* @throws DecodeException If the next byte in the BER buffer is not
- * <tt>tag</tt>, or if length specified in the BER buffer exceeds the
+ * {@code tag}, or if length specified in the BER buffer exceeds the
* number of bytes left in the buffer.
*/
public byte[] parseOctetString(int tag, int rlen[]) throws DecodeException {
--- a/jdk/src/java.naming/share/classes/com/sun/jndi/ldap/EventQueue.java Thu May 21 10:07:38 2015 -0700
+++ b/jdk/src/java.naming/share/classes/com/sun/jndi/ldap/EventQueue.java Thu May 21 16:20:20 2015 -0700
@@ -73,16 +73,16 @@
// package private;
/**
* Enqueue an event.
- * @param event Either a <tt>NamingExceptionEvent</tt> or a subclass
- * of <tt>NamingEvent</tt> or
- * <tt>UnsolicitedNotificationEvent</tt>.
- * If it is a subclass of <tt>NamingEvent</tt>, all listeners must implement
- * the corresponding subinterface of <tt>NamingListener</tt>.
- * For example, for a <tt>ObjectAddedEvent</tt>, all listeners <em>must</em>
- * implement the <tt>ObjectAddedListener</tt> interface.
+ * @param event Either a {@code NamingExceptionEvent} or a subclass
+ * of {@code NamingEvent} or
+ * {@code UnsolicitedNotificationEvent}.
+ * If it is a subclass of {@code NamingEvent}, all listeners must implement
+ * the corresponding subinterface of {@code NamingListener}.
+ * For example, for a {@code ObjectAddedEvent}, all listeners <em>must</em>
+ * implement the {@code ObjectAddedListener} interface.
* <em>The current implementation does not check this before dispatching
* the event.</em>
- * If the event is a <tt>NamingExceptionEvent</tt>, then all listeners
+ * If the event is a {@code NamingExceptionEvent}, then all listeners
* are notified.
* @param vector List of NamingListeners that will be notified of event.
*/
--- a/jdk/src/java.naming/share/classes/com/sun/jndi/ldap/EventSupport.java Thu May 21 10:07:38 2015 -0700
+++ b/jdk/src/java.naming/share/classes/com/sun/jndi/ldap/EventSupport.java Thu May 21 16:20:20 2015 -0700
@@ -55,14 +55,14 @@
*<li>The filter (default is "(objectclass=*)").
*<li>The search controls (default is null SearchControls).
*<li>The events that the listener is interested in. This is determined by
- * finding out which <tt>NamingListener</tt> interface the listener supports.
+ * finding out which {@code NamingListener} interface the listener supports.
*</ul>
*<p>
- *A notifier (<tt>NamingEventNotifier</tt>) is a worker thread that is responsible
+ *A notifier ({@code NamingEventNotifier}) is a worker thread that is responsible
*for gathering information for generating events requested by its listeners.
*Each notifier maintains its own list of listeners; these listeners have
*all made the same registration request (at different times) and implements
- *the same <tt>NamingListener</tt> interfaces.
+ *the same {@code NamingListener} interfaces.
*<p>
*For unsolicited listeners, this class maintains a vector, unsolicited.
*When an unsolicited listener is registered, this class adds itself
@@ -93,7 +93,7 @@
*The notifiers are responsible for gather information for generating events
*requested by their respective listeners. When a notifier gets sufficient
*information to generate an event, it creates invokes the
- *appropriate <tt>fireXXXEvent</tt> on this class with the information and list of
+ *appropriate {@code fireXXXEvent} on this class with the information and list of
*listeners. This causes an event and the list of listeners to be added
*to the <em>event queue</em>.
*This class maintains an event queue and a dispatching thread that dequeues
@@ -138,7 +138,7 @@
}
/**
- * Adds <tt>l</tt> to list of listeners interested in <tt>nm</tt>.
+ * Adds {@code l} to list of listeners interested in {@code nm}.
*/
/*
* Make the add/removeNamingListeners synchronized to:
@@ -173,7 +173,7 @@
}
/**
- * Adds <tt>l</tt> to list of listeners interested in <tt>nm</tt>
+ * Adds {@code l} to list of listeners interested in {@code nm}
* and filter.
*/
synchronized void addNamingListener(String nm, String filter,
@@ -201,7 +201,7 @@
}
/**
- * Removes <tt>l</tt> from all notifiers in this context.
+ * Removes {@code l} from all notifiers in this context.
*/
synchronized void removeNamingListener(NamingListener l) {
if (debug) System.err.println("EventSupport removing listener");
--- a/jdk/src/java.naming/share/classes/com/sun/jndi/ldap/LdapName.java Thu May 21 10:07:38 2015 -0700
+++ b/jdk/src/java.naming/share/classes/com/sun/jndi/ldap/LdapName.java Thu May 21 16:20:20 2015 -0700
@@ -336,7 +336,7 @@
* characters:
*<ul>
*<li>leading and trailing whitespace
- *<li><pre>, = + < > # ; " \</pre>
+ *<li><pre>{@literal , = + < > # ; " \}</pre>
*</ul>
* If the value is a byte array, it is converted to hex
* notation (such as "#CEB1DF80").
--- a/jdk/src/java.naming/share/classes/com/sun/jndi/ldap/LdapReferralException.java Thu May 21 10:07:38 2015 -0700
+++ b/jdk/src/java.naming/share/classes/com/sun/jndi/ldap/LdapReferralException.java Thu May 21 16:20:20 2015 -0700
@@ -35,7 +35,7 @@
* This exception is raised when a referral to an alternative context
* is encountered.
* <p>
- * An <tt>LdapReferralException</tt> object contains one or more referrals.
+ * An {@code LdapReferralException} object contains one or more referrals.
* Each referral is an alternative location for the same target entry.
* For example, a referral may be an LDAP URL.
* The referrals are attempted in sequence until one is successful or
@@ -46,20 +46,20 @@
* of an authentication error, a referral may be retried with different
* environment properties.
* <p>
- * An <tt>LdapReferralException</tt> object may also contain a reference
- * to a chain of unprocessed <tt>LdapReferralException</tt> objects.
+ * An {@code LdapReferralException} object may also contain a reference
+ * to a chain of unprocessed {@code LdapReferralException} objects.
* Once the current set of referrals have been exhausted and unprocessed
- * <tt>LdapReferralException</tt> objects remain, then the
- * <tt>LdapReferralException</tt> object referenced by the current
+ * {@code LdapReferralException} objects remain, then the
+ * {@code LdapReferralException} object referenced by the current
* object is thrown and the cycle continues.
* <p>
- * If new <tt>LdapReferralException</tt> objects are generated while
+ * If new {@code LdapReferralException} objects are generated while
* following an existing referral then these new objects are appended
- * to the end of the chain of unprocessed <tt>LdapReferralException</tt>
+ * to the end of the chain of unprocessed {@code LdapReferralException}
* objects.
* <p>
* If an exception was recorded while processing a chain of
- * <tt>LdapReferralException</tt> objects then it is throw once
+ * {@code LdapReferralException} objects then it is throw once
* processing has completed.
*
* @author Vincent Ryan
--- a/jdk/src/java.naming/share/classes/com/sun/jndi/ldap/UnsolicitedResponseImpl.java Thu May 21 10:07:38 2015 -0700
+++ b/jdk/src/java.naming/share/classes/com/sun/jndi/ldap/UnsolicitedResponseImpl.java Thu May 21 16:20:20 2015 -0700
@@ -65,7 +65,7 @@
* Retrieves the object identifier of the response.
*
* @return A possibly null object identifier string representing the LDAP
- * <tt>ExtendedResponse.responseName</tt> component.
+ * {@code ExtendedResponse.responseName} component.
*/
public String getID() {
return oid;
@@ -79,7 +79,7 @@
* the response value. It does not include the response OID.
*
* @return A possibly null byte array representing the ASN.1 BER encoded
- * contents of the LDAP <tt>ExtendedResponse.response</tt>
+ * contents of the LDAP {@code ExtendedResponse.response}
* component.
*/
public byte[] getEncodedValue() {
--- a/jdk/src/java.naming/share/classes/com/sun/jndi/ldap/ext/StartTlsResponseImpl.java Thu May 21 10:07:38 2015 -0700
+++ b/jdk/src/java.naming/share/classes/com/sun/jndi/ldap/ext/StartTlsResponseImpl.java Thu May 21 16:20:20 2015 -0700
@@ -52,10 +52,10 @@
* The object identifier for StartTLS is 1.3.6.1.4.1.1466.20037
* and no extended response value is defined.
*
- *<p>
+ * <p>
* The Start TLS extended request and response are used to establish
* a TLS connection over the existing LDAP connection associated with
- * the JNDI context on which <tt>extendedOperation()</tt> is invoked.
+ * the JNDI context on which {@code extendedOperation()} is invoked.
*
* @see StartTlsRequest
* @author Vincent Ryan
@@ -124,7 +124,7 @@
/**
* Overrides the default list of cipher suites enabled for use on the
* TLS connection. The cipher suites must have already been listed by
- * <tt>SSLSocketFactory.getSupportedCipherSuites()</tt> as being supported.
+ * {@code SSLSocketFactory.getSupportedCipherSuites()} as being supported.
* Even if a suite has been enabled, it still might not be used because
* the peer does not support it, or because the requisite certificates
* (and private keys) are not available.
@@ -140,12 +140,12 @@
}
/**
- * Overrides the default hostname verifier used by <tt>negotiate()</tt>
+ * Overrides the default hostname verifier used by {@code negotiate()}
* after the TLS handshake has completed. If
- * <tt>setHostnameVerifier()</tt> has not been called before
- * <tt>negotiate()</tt> is invoked, <tt>negotiate()</tt>
+ * {@code setHostnameVerifier()} has not been called before
+ * {@code negotiate()} is invoked, {@code negotiate()}
* will perform a simple case ignore match. If called after
- * <tt>negotiate()</tt>, this method does not do anything.
+ * {@code negotiate()}, this method does not do anything.
*
* @param verifier The non-null hostname verifier callback.
* @see #negotiate
@@ -157,10 +157,10 @@
/**
* Negotiates a TLS session using the default SSL socket factory.
* <p>
- * This method is equivalent to <tt>negotiate(null)</tt>.
+ * This method is equivalent to {@code negotiate(null)}.
*
* @return The negotiated SSL session
- * @throw IOException If an IO error was encountered while establishing
+ * @throws IOException If an IO error was encountered while establishing
* the TLS session.
* @see #setEnabledCipherSuites
* @see #setHostnameVerifier
@@ -177,7 +177,7 @@
* attaches it to the existing connection. Performs the TLS handshake
* and returns the negotiated session information.
* <p>
- * If cipher suites have been set via <tt>setEnabledCipherSuites</tt>
+ * If cipher suites have been set via {@code setEnabledCipherSuites}
* then they are enabled before the TLS handshake begins.
* <p>
* Hostname verification is performed after the TLS handshake completes.
@@ -186,7 +186,7 @@
* hostname is extracted from the subjectAltName in the server's
* certificate (if present). Otherwise the value of the common name
* attribute of the subject name is used. If a callback has
- * been set via <tt>setHostnameVerifier</tt> then that verifier is used if
+ * been set via {@code setHostnameVerifier} then that verifier is used if
* the default check fails.
* <p>
* If an error occurs then the SSL socket is closed and an IOException
@@ -195,7 +195,7 @@
* @param factory The possibly null SSL socket factory to use.
* If null, the default SSL socket factory is used.
* @return The negotiated SSL session
- * @throw IOException If an IO error was encountered while establishing
+ * @throws IOException If an IO error was encountered while establishing
* the TLS session.
* @see #setEnabledCipherSuites
* @see #setHostnameVerifier
@@ -252,7 +252,7 @@
* Closes the TLS connection gracefully and reverts back to the underlying
* connection.
*
- * @throw IOException If an IO error was encountered while closing the
+ * @throws IOException If an IO error was encountered while closing the
* TLS connection
*/
public void close() throws IOException {
--- a/jdk/src/java.naming/share/classes/com/sun/jndi/ldap/sasl/LdapSasl.java Thu May 21 10:07:38 2015 -0700
+++ b/jdk/src/java.naming/share/classes/com/sun/jndi/ldap/sasl/LdapSasl.java Thu May 21 16:20:20 2015 -0700
@@ -72,12 +72,12 @@
* property has not been set, Context.SECURITY_PRINCIPAL is used.
* If SASL_CALLBACK has been set, use that instead of the default
* CallbackHandler.
- *<p>
+ * <p>
* If bind is successful and the selected SASL mechanism has a security
* layer, set inStream and outStream to be filter streams that use
* the security layer. These will be used for subsequent communication
* with the server.
- *<p>
+ *
* @param conn The non-null connection to use for sending an LDAP BIND
* @param server Non-null string name of host to connect to
* @param dn Non-null DN to bind as; also used as authentication ID
--- a/jdk/src/java.naming/share/classes/com/sun/jndi/toolkit/ctx/Continuation.java Thu May 21 10:07:38 2015 -0700
+++ b/jdk/src/java.naming/share/classes/com/sun/jndi/toolkit/ctx/Continuation.java Thu May 21 16:20:20 2015 -0700
@@ -329,7 +329,7 @@
*<p>
* After this method is called, isContinuing() returns true.
*
- * @param resObj The possibly null resolved object.
+ * @param obj The possibly null resolved object.
* @param relResName The non-null resolved name relative to currCtx.
* @param currCtx The non-null context from which relResName is to be resolved.
*/
@@ -349,7 +349,7 @@
*<p>
* After this method is called, isContinuing() returns true.
*
- * @param resObj The possibly null resolved object.
+ * @param obj The possibly null resolved object.
* @param relResName The non-null resolved name relative to currCtx.
* @param currCtx The non-null context from which relResName is to be resolved.
* @param remain The non-null remaining name.
@@ -366,7 +366,7 @@
/**
* String overload.
*
- * @param resObj The possibly null resolved object.
+ * @param obj The possibly null resolved object.
* @param relResName The non-null resolved name relative to currCtx.
* @param currCtx The non-null context from which relResName is to be resolved.
* @param remain The non-null remaining name.
--- a/jdk/src/java.naming/share/classes/com/sun/jndi/toolkit/ctx/PartialCompositeContext.java Thu May 21 10:07:38 2015 -0700
+++ b/jdk/src/java.naming/share/classes/com/sun/jndi/toolkit/ctx/PartialCompositeContext.java Thu May 21 16:20:20 2015 -0700
@@ -452,14 +452,14 @@
* nonempty component, and if 'prefix' ends with an empty component or
* 'name' starts with one, then one empty component is dropped.
* For example:
- * <pre>
+ * <pre>{@code
* elideEmpty=false elideEmpty=true
* {"a"} + {"b"} => {"a", "b"} {"a", "b"}
* {"a"} + {""} => {"a", ""} {"a", ""}
* {"a"} + {"", "b"} => {"a", "", "b"} {"a", "b"}
* {"a", ""} + {"b", ""} => {"a", "", "b", ""} {"a", "b", ""}
* {"a", ""} + {"", "b"} => {"a", "", "", "b"} {"a", "", "b"}
- * </pre>
+ * }</pre>
*/
public Name composeName(Name name, Name prefix) throws NamingException {
Name res = (Name)prefix.clone();
--- a/jdk/src/java.naming/share/classes/com/sun/jndi/toolkit/dir/HierMemDirCtx.java Thu May 21 10:07:38 2015 -0700
+++ b/jdk/src/java.naming/share/classes/com/sun/jndi/toolkit/dir/HierMemDirCtx.java Thu May 21 16:20:20 2015 -0700
@@ -32,8 +32,8 @@
/**
* A sample service provider that implements a hierarchical directory in memory.
* Every operation begins by doing a lookup on the name passed to it and then
- * calls a corresponding "do<OperationName>" on the result of the lookup. The
- * "do<OperationName>" does the work without any further resolution (it assumes
+ * calls a corresponding "{@code do<OperationName>}" on the result of the lookup. The
+ * "{@code do<OperationName>}" does the work without any further resolution (it assumes
* that it is the target context).
*/
--- a/jdk/src/java.naming/share/classes/com/sun/jndi/toolkit/dir/SearchFilter.java Thu May 21 10:07:38 2015 -0700
+++ b/jdk/src/java.naming/share/classes/com/sun/jndi/toolkit/dir/SearchFilter.java Thu May 21 16:20:20 2015 -0700
@@ -548,8 +548,8 @@
/**
- * Finds the first occurrence of <tt>ch</tt> in <tt>val</tt> starting
- * from position <tt>start</tt>. It doesn't count if <tt>ch</tt>
+ * Finds the first occurrence of {@code ch} in {@code val} starting
+ * from position {@code start}. It doesn't count if {@code ch}
* has been escaped by a backslash (\)
*/
public static int findUnescaped(char ch, String val, int start) {
@@ -568,8 +568,8 @@
}
/**
- * Formats the expression <tt>expr</tt> using arguments from the array
- * <tt>args</tt>.
+ * Formats the expression {@code expr} using arguments from the array
+ * {@code args}.
*
* <code>{i}</code> specifies the <code>i</code>'th element from
* the array <code>args</code> is to be substituted for the
--- a/jdk/src/java.naming/share/classes/com/sun/jndi/toolkit/url/GenericURLContext.java Thu May 21 10:07:38 2015 -0700
+++ b/jdk/src/java.naming/share/classes/com/sun/jndi/toolkit/url/GenericURLContext.java Thu May 21 16:20:20 2015 -0700
@@ -107,12 +107,14 @@
* the subclass must override getURLSuffix() to get the correct behavior.
* Remember, the behavior must match getRootURLContext().
*
+ * <pre>{@code
* URL Suffix
* foo://host:port <empty string>
* foo://host:port/rest/of/name rest/of/name
* foo:///rest/of/name rest/of/name
* foo:/rest/of/name rest/of/name
* foo:rest/of/name rest/of/name
+ * }</pre>
*/
protected Name getURLSuffix(String prefix, String url) throws NamingException {
String suffix = url.substring(prefix.length());
--- a/jdk/src/java.naming/share/classes/com/sun/jndi/toolkit/url/Uri.java Thu May 21 10:07:38 2015 -0700
+++ b/jdk/src/java.naming/share/classes/com/sun/jndi/toolkit/url/Uri.java Thu May 21 16:20:20 2015 -0700
@@ -47,7 +47,7 @@
* still run on pre-1.4 platforms not containing that class.
*
* <p> The format of an absolute URI (see the RFCs mentioned above) is:
- * <p><blockquote><pre>
+ * <blockquote><pre>{@code
* absoluteURI = scheme ":" ( hier_part | opaque_part )
*
* scheme = alpha *( alpha | digit | "+" | "-" | "." )
@@ -94,12 +94,12 @@
* mark = "-" | "_" | "." | "!" | "~" | "*" | "'" | "(" | ")"
* escaped = "%" hex hex
* unwise = "{" | "}" | "|" | "\" | "^" | "`"
- * </pre></blockquote>
+ * }</pre></blockquote>
*
- * <p> Currently URIs containing <tt>userinfo</tt> or <tt>reg_name</tt>
+ * <p> Currently URIs containing {@code userinfo} or {@code reg_name}
* are not supported.
- * The <tt>opaque_part</tt> of a non-hierarchical URI is treated as if
- * if were a <tt>path</tt> without a leading slash.
+ * The {@code opaque_part} of a non-hierarchical URI is treated as if
+ * if were a {@code path} without a leading slash.
*/
--- a/jdk/src/java.naming/share/classes/javax/naming/directory/package.html Thu May 21 10:07:38 2015 -0700
+++ b/jdk/src/java.naming/share/classes/javax/naming/directory/package.html Thu May 21 16:20:20 2015 -0700
@@ -33,7 +33,7 @@
<p>
This package defines the directory operations of the Java Naming and
-Directory Interface<font size=-2><sup>TM</sup></font> (JNDI).
+Directory Interface™ (JNDI).
JNDI provides naming and directory functionality to applications
written in the Java programming language. It is designed to be
independent of any specific naming or directory service
--- a/jdk/src/java.naming/share/classes/javax/naming/event/package.html Thu May 21 10:07:38 2015 -0700
+++ b/jdk/src/java.naming/share/classes/javax/naming/event/package.html Thu May 21 16:20:20 2015 -0700
@@ -33,7 +33,7 @@
<p>
This package defines the event notification operations of the Java Naming
-and Directory Interface<font size=-2><sup>TM</sup></font> (JNDI).
+and Directory Interface™ (JNDI).
JNDI provides naming and directory functionality to applications
written in the Java programming language. It is designed to be
independent of any specific naming or directory service
--- a/jdk/src/java.naming/share/classes/javax/naming/ldap/package.html Thu May 21 10:07:38 2015 -0700
+++ b/jdk/src/java.naming/share/classes/javax/naming/ldap/package.html Thu May 21 16:20:20 2015 -0700
@@ -33,7 +33,7 @@
<p>
This package extends the directory operations of the Java Naming and
-Directory Interface<font size=-2><sup>TM</sup></font> (JNDI).
+Directory Interface™ (JNDI).
JNDI provides naming and directory functionality to applications
written in the Java programming language. It is designed to be
independent of any specific naming or directory service
--- a/jdk/src/java.naming/share/classes/javax/naming/package.html Thu May 21 10:07:38 2015 -0700
+++ b/jdk/src/java.naming/share/classes/javax/naming/package.html Thu May 21 16:20:20 2015 -0700
@@ -32,7 +32,7 @@
<p>
This package defines the naming operations of the Java Naming and
-Directory Interface<font size=-2><sup>TM</sup></font> (JNDI).
+Directory Interface™ (JNDI).
JNDI provides naming and directory functionality to applications
written in the Java programming language. It is designed to be
independent of any specific naming or directory service
--- a/jdk/src/java.naming/share/classes/javax/naming/spi/package.html Thu May 21 10:07:38 2015 -0700
+++ b/jdk/src/java.naming/share/classes/javax/naming/spi/package.html Thu May 21 16:20:20 2015 -0700
@@ -34,7 +34,7 @@
<p>
This package defines the service provider interface (SPI) of the Java Naming
-and Directory Interface<font size=-2><sup>TM</sup></font> (JNDI).
+and Directory Interface™ (JNDI).
JNDI provides naming and directory functionality to applications
written in the Java programming language. It is designed to be
independent of any specific naming or directory service
--- a/jdk/src/java.prefs/windows/classes/java/util/prefs/WindowsPreferences.java Thu May 21 10:07:38 2015 -0700
+++ b/jdk/src/java.prefs/windows/classes/java/util/prefs/WindowsPreferences.java Thu May 21 16:20:20 2015 -0700
@@ -62,8 +62,8 @@
/**
* Windows registry path to <tt>Preferences</tt>'s root nodes.
*/
- private static final byte[] WINDOWS_ROOT_PATH
- = stringToByteArray("Software\\JavaSoft\\Prefs");
+ private static final byte[] WINDOWS_ROOT_PATH =
+ stringToByteArray("Software\\JavaSoft\\Prefs");
/**
* Windows handles to <tt>HKEY_CURRENT_USER</tt> and
@@ -147,12 +147,12 @@
* Java wrapper for Windows registry API RegOpenKey()
*/
private static native int[] WindowsRegOpenKey(int hKey, byte[] subKey,
- int securityMask);
+ int securityMask);
/**
* Retries RegOpenKey() MAX_ATTEMPTS times before giving up.
*/
private static int[] WindowsRegOpenKey1(int hKey, byte[] subKey,
- int securityMask) {
+ int securityMask) {
int[] result = WindowsRegOpenKey(hKey, subKey, securityMask);
if (result[ERROR_CODE] == ERROR_SUCCESS) {
return result;
@@ -167,16 +167,16 @@
} else if (result[ERROR_CODE] != ERROR_ACCESS_DENIED) {
long sleepTime = INIT_SLEEP_TIME;
for (int i = 0; i < MAX_ATTEMPTS; i++) {
- try {
- Thread.sleep(sleepTime);
- } catch(InterruptedException e) {
- return result;
- }
- sleepTime *= 2;
- result = WindowsRegOpenKey(hKey, subKey, securityMask);
- if (result[ERROR_CODE] == ERROR_SUCCESS) {
- return result;
- }
+ try {
+ Thread.sleep(sleepTime);
+ } catch(InterruptedException e) {
+ return result;
+ }
+ sleepTime *= 2;
+ result = WindowsRegOpenKey(hKey, subKey, securityMask);
+ if (result[ERROR_CODE] == ERROR_SUCCESS) {
+ return result;
+ }
}
}
return result;
@@ -198,10 +198,10 @@
private static int[] WindowsRegCreateKeyEx1(int hKey, byte[] subKey) {
int[] result = WindowsRegCreateKeyEx(hKey, subKey);
if (result[ERROR_CODE] == ERROR_SUCCESS) {
- return result;
- } else {
- long sleepTime = INIT_SLEEP_TIME;
- for (int i = 0; i < MAX_ATTEMPTS; i++) {
+ return result;
+ } else {
+ long sleepTime = INIT_SLEEP_TIME;
+ for (int i = 0; i < MAX_ATTEMPTS; i++) {
try {
Thread.sleep(sleepTime);
} catch(InterruptedException e) {
@@ -210,7 +210,7 @@
sleepTime *= 2;
result = WindowsRegCreateKeyEx(hKey, subKey);
if (result[ERROR_CODE] == ERROR_SUCCESS) {
- return result;
+ return result;
}
}
}
@@ -232,10 +232,10 @@
private static int WindowsRegFlushKey1(int hKey) {
int result = WindowsRegFlushKey(hKey);
if (result == ERROR_SUCCESS) {
- return result;
- } else {
- long sleepTime = INIT_SLEEP_TIME;
- for (int i = 0; i < MAX_ATTEMPTS; i++) {
+ return result;
+ } else {
+ long sleepTime = INIT_SLEEP_TIME;
+ for (int i = 0; i < MAX_ATTEMPTS; i++) {
try {
Thread.sleep(sleepTime);
} catch(InterruptedException e) {
@@ -244,7 +244,7 @@
sleepTime *= 2;
result = WindowsRegFlushKey(hKey);
if (result == ERROR_SUCCESS) {
- return result;
+ return result;
}
}
}
@@ -255,23 +255,23 @@
* Java wrapper for Windows registry API RegQueryValueEx()
*/
private static native byte[] WindowsRegQueryValueEx(int hKey,
- byte[] valueName);
+ byte[] valueName);
/**
* Java wrapper for Windows registry API RegSetValueEx()
*/
private static native int WindowsRegSetValueEx(int hKey, byte[] valueName,
- byte[] value);
+ byte[] value);
/**
* Retries RegSetValueEx() MAX_ATTEMPTS times before giving up.
*/
private static int WindowsRegSetValueEx1(int hKey, byte[] valueName,
- byte[] value) {
+ byte[] value) {
int result = WindowsRegSetValueEx(hKey, valueName, value);
if (result == ERROR_SUCCESS) {
- return result;
- } else {
- long sleepTime = INIT_SLEEP_TIME;
- for (int i = 0; i < MAX_ATTEMPTS; i++) {
+ return result;
+ } else {
+ long sleepTime = INIT_SLEEP_TIME;
+ for (int i = 0; i < MAX_ATTEMPTS; i++) {
try {
Thread.sleep(sleepTime);
} catch(InterruptedException e) {
@@ -280,7 +280,7 @@
sleepTime *= 2;
result = WindowsRegSetValueEx(hKey, valueName, value);
if (result == ERROR_SUCCESS) {
- return result;
+ return result;
}
}
}
@@ -303,10 +303,10 @@
private static int[] WindowsRegQueryInfoKey1(int hKey) {
int[] result = WindowsRegQueryInfoKey(hKey);
if (result[ERROR_CODE] == ERROR_SUCCESS) {
- return result;
- } else {
- long sleepTime = INIT_SLEEP_TIME;
- for (int i = 0; i < MAX_ATTEMPTS; i++) {
+ return result;
+ } else {
+ long sleepTime = INIT_SLEEP_TIME;
+ for (int i = 0; i < MAX_ATTEMPTS; i++) {
try {
Thread.sleep(sleepTime);
} catch(InterruptedException e) {
@@ -315,7 +315,7 @@
sleepTime *= 2;
result = WindowsRegQueryInfoKey(hKey);
if (result[ERROR_CODE] == ERROR_SUCCESS) {
- return result;
+ return result;
}
}
}
@@ -326,19 +326,19 @@
* Java wrapper for Windows registry API RegEnumKeyEx()
*/
private static native byte[] WindowsRegEnumKeyEx(int hKey, int subKeyIndex,
- int maxKeyLength);
+ int maxKeyLength);
/**
* Retries RegEnumKeyEx() MAX_ATTEMPTS times before giving up.
*/
private static byte[] WindowsRegEnumKeyEx1(int hKey, int subKeyIndex,
- int maxKeyLength) {
+ int maxKeyLength) {
byte[] result = WindowsRegEnumKeyEx(hKey, subKeyIndex, maxKeyLength);
if (result != null) {
- return result;
- } else {
- long sleepTime = INIT_SLEEP_TIME;
- for (int i = 0; i < MAX_ATTEMPTS; i++) {
+ return result;
+ } else {
+ long sleepTime = INIT_SLEEP_TIME;
+ for (int i = 0; i < MAX_ATTEMPTS; i++) {
try {
Thread.sleep(sleepTime);
} catch(InterruptedException e) {
@@ -347,7 +347,7 @@
sleepTime *= 2;
result = WindowsRegEnumKeyEx(hKey, subKeyIndex, maxKeyLength);
if (result != null) {
- return result;
+ return result;
}
}
}
@@ -358,19 +358,19 @@
* Java wrapper for Windows registry API RegEnumValue()
*/
private static native byte[] WindowsRegEnumValue(int hKey, int valueIndex,
- int maxValueNameLength);
+ int maxValueNameLength);
/**
* Retries RegEnumValueEx() MAX_ATTEMPTS times before giving up.
*/
private static byte[] WindowsRegEnumValue1(int hKey, int valueIndex,
- int maxValueNameLength) {
+ int maxValueNameLength) {
byte[] result = WindowsRegEnumValue(hKey, valueIndex,
- maxValueNameLength);
+ maxValueNameLength);
if (result != null) {
- return result;
- } else {
- long sleepTime = INIT_SLEEP_TIME;
- for (int i = 0; i < MAX_ATTEMPTS; i++) {
+ return result;
+ } else {
+ long sleepTime = INIT_SLEEP_TIME;
+ for (int i = 0; i < MAX_ATTEMPTS; i++) {
try {
Thread.sleep(sleepTime);
} catch(InterruptedException e) {
@@ -378,9 +378,9 @@
}
sleepTime *= 2;
result = WindowsRegEnumValue(hKey, valueIndex,
- maxValueNameLength);
+ maxValueNameLength);
if (result != null) {
- return result;
+ return result;
}
}
}
@@ -404,11 +404,11 @@
int[] result =
WindowsRegCreateKeyEx1(parentNativeHandle, toWindowsName(name));
if (result[ERROR_CODE] != ERROR_SUCCESS) {
- logger().warning("Could not create windows registry "
- + "node " + byteArrayToString(windowsAbsolutePath()) +
- " at root 0x" + Integer.toHexString(rootNativeHandle()) +
- ". Windows RegCreateKeyEx(...) returned error code " +
- result[ERROR_CODE] + ".");
+ logger().warning("Could not create windows registry node " +
+ byteArrayToString(windowsAbsolutePath()) +
+ " at root 0x" + Integer.toHexString(rootNativeHandle()) +
+ ". Windows RegCreateKeyEx(...) returned error code " +
+ result[ERROR_CODE] + ".");
isBackingStoreAvailable = false;
return;
}
@@ -426,15 +426,15 @@
* @param rootDirectory Path to root directory, as a byte-encoded string.
*/
private WindowsPreferences(int rootNativeHandle, byte[] rootDirectory) {
- super(null,"");
+ super(null, "");
int[] result =
WindowsRegCreateKeyEx1(rootNativeHandle, rootDirectory);
if (result[ERROR_CODE] != ERROR_SUCCESS) {
logger().warning("Could not open/create prefs root node " +
- byteArrayToString(windowsAbsolutePath()) + " at root 0x" +
- Integer.toHexString(rootNativeHandle()) +
- ". Windows RegCreateKeyEx(...) returned error code " +
- result[ERROR_CODE] + ".");
+ byteArrayToString(windowsAbsolutePath()) +
+ " at root 0x" + Integer.toHexString(rootNativeHandle()) +
+ ". Windows RegCreateKeyEx(...) returned error code " +
+ result[ERROR_CODE] + ".");
isBackingStoreAvailable = false;
return;
}
@@ -451,7 +451,7 @@
private byte[] windowsAbsolutePath() {
ByteArrayOutputStream bstream = new ByteArrayOutputStream();
bstream.write(WINDOWS_ROOT_PATH, 0, WINDOWS_ROOT_PATH.length-1);
- StringTokenizer tokenizer = new StringTokenizer(absolutePath(),"/");
+ StringTokenizer tokenizer = new StringTokenizer(absolutePath(), "/");
while (tokenizer.hasMoreTokens()) {
bstream.write((byte)'\\');
String nextName = tokenizer.nextToken();
@@ -505,27 +505,30 @@
/* Check if key's path is short enough be opened at once
otherwise use a path-splitting procedure */
if (windowsAbsolutePath.length <= MAX_WINDOWS_PATH_LENGTH + 1) {
- int[] result = WindowsRegOpenKey1(rootNativeHandle(),
- windowsAbsolutePath, mask1);
- if (result[ERROR_CODE] == ERROR_ACCESS_DENIED && mask2 != mask1)
- result = WindowsRegOpenKey1(rootNativeHandle(),
- windowsAbsolutePath, mask2);
+ int[] result = WindowsRegOpenKey1(rootNativeHandle(),
+ windowsAbsolutePath, mask1);
+ if (result[ERROR_CODE] == ERROR_ACCESS_DENIED && mask2 != mask1)
+ result = WindowsRegOpenKey1(rootNativeHandle(),
+ windowsAbsolutePath, mask2);
- if (result[ERROR_CODE] != ERROR_SUCCESS) {
- logger().warning("Could not open windows "
- + "registry node " + byteArrayToString(windowsAbsolutePath()) +
- " at root 0x" + Integer.toHexString(rootNativeHandle()) +
- ". Windows RegOpenKey(...) returned error code " +
- result[ERROR_CODE] + ".");
+ if (result[ERROR_CODE] != ERROR_SUCCESS) {
+ logger().warning("Could not open windows registry node " +
+ byteArrayToString(windowsAbsolutePath()) +
+ " at root 0x" +
+ Integer.toHexString(rootNativeHandle()) +
+ ". Windows RegOpenKey(...) returned error code " +
+ result[ERROR_CODE] + ".");
result[NATIVE_HANDLE] = NULL_NATIVE_HANDLE;
if (result[ERROR_CODE] == ERROR_ACCESS_DENIED) {
- throw new SecurityException("Could not open windows "
- + "registry node " + byteArrayToString(windowsAbsolutePath()) +
- " at root 0x" + Integer.toHexString(rootNativeHandle()) +
- ": Access denied");
+ throw new SecurityException(
+ "Could not open windows registry node " +
+ byteArrayToString(windowsAbsolutePath()) +
+ " at root 0x" +
+ Integer.toHexString(rootNativeHandle()) +
+ ": Access denied");
}
- }
- return result[NATIVE_HANDLE];
+ }
+ return result[NATIVE_HANDLE];
} else {
return openKey(rootNativeHandle(), windowsAbsolutePath, mask1, mask2);
}
@@ -548,21 +551,21 @@
int mask1, int mask2) {
/* If the path is short enough open at once. Otherwise split the path */
if (windowsRelativePath.length <= MAX_WINDOWS_PATH_LENGTH + 1 ) {
- int[] result = WindowsRegOpenKey1(nativeHandle,
- windowsRelativePath, mask1);
- if (result[ERROR_CODE] == ERROR_ACCESS_DENIED && mask2 != mask1)
- result = WindowsRegOpenKey1(nativeHandle,
- windowsRelativePath, mask2);
+ int[] result = WindowsRegOpenKey1(nativeHandle,
+ windowsRelativePath, mask1);
+ if (result[ERROR_CODE] == ERROR_ACCESS_DENIED && mask2 != mask1)
+ result = WindowsRegOpenKey1(nativeHandle,
+ windowsRelativePath, mask2);
- if (result[ERROR_CODE] != ERROR_SUCCESS) {
- logger().warning("Could not open windows "
- + "registry node " + byteArrayToString(windowsAbsolutePath()) +
- " at root 0x" + Integer.toHexString(nativeHandle) +
- ". Windows RegOpenKey(...) returned error code " +
- result[ERROR_CODE] + ".");
+ if (result[ERROR_CODE] != ERROR_SUCCESS) {
+ logger().warning("Could not open windows registry node " +
+ byteArrayToString(windowsAbsolutePath()) +
+ " at root 0x" + Integer.toHexString(nativeHandle) +
+ ". Windows RegOpenKey(...) returned error code " +
+ result[ERROR_CODE] + ".");
result[NATIVE_HANDLE] = NULL_NATIVE_HANDLE;
- }
- return result[NATIVE_HANDLE];
+ }
+ return result[NATIVE_HANDLE];
} else {
int separatorPosition = -1;
// Be greedy - open the longest possible path
@@ -604,10 +607,12 @@
private void closeKey(int nativeHandle) {
int result = WindowsRegCloseKey(nativeHandle);
if (result != ERROR_SUCCESS) {
- logger().warning("Could not close windows "
- + "registry node " + byteArrayToString(windowsAbsolutePath()) +
- " at root 0x" + Integer.toHexString(rootNativeHandle()) +
- ". Windows RegCloseKey(...) returned error code " + result + ".");
+ logger().warning("Could not close windows registry node " +
+ byteArrayToString(windowsAbsolutePath()) +
+ " at root 0x" +
+ Integer.toHexString(rootNativeHandle()) +
+ ". Windows RegCloseKey(...) returned error code " +
+ result + ".");
}
}
@@ -627,10 +632,13 @@
toWindowsName(javaName), toWindowsValueString(value));
if (result != ERROR_SUCCESS) {
logger().warning("Could not assign value to key " +
- byteArrayToString(toWindowsName(javaName))+ " at Windows registry node "
- + byteArrayToString(windowsAbsolutePath()) + " at root 0x"
- + Integer.toHexString(rootNativeHandle()) +
- ". Windows RegSetValueEx(...) returned error code " + result + ".");
+ byteArrayToString(toWindowsName(javaName)) +
+ " at Windows registry node " +
+ byteArrayToString(windowsAbsolutePath()) +
+ " at root 0x" +
+ Integer.toHexString(rootNativeHandle()) +
+ ". Windows RegSetValueEx(...) returned error code " +
+ result + ".");
isBackingStoreAvailable = false;
}
closeKey(nativeHandle);
@@ -672,12 +680,12 @@
int result =
WindowsRegDeleteValue(nativeHandle, toWindowsName(key));
if (result != ERROR_SUCCESS && result != ERROR_FILE_NOT_FOUND) {
- logger().warning("Could not delete windows registry "
- + "value " + byteArrayToString(windowsAbsolutePath())+ "\\" +
- toWindowsName(key) + " at root 0x" +
- Integer.toHexString(rootNativeHandle()) +
- ". Windows RegDeleteValue(...) returned error code " +
- result + ".");
+ logger().warning("Could not delete windows registry value " +
+ byteArrayToString(windowsAbsolutePath()) + "\\" +
+ toWindowsName(key) + " at root 0x" +
+ Integer.toHexString(rootNativeHandle()) +
+ ". Windows RegDeleteValue(...) returned error code " +
+ result + ".");
isBackingStoreAvailable = false;
}
closeKey(nativeHandle);
@@ -693,17 +701,20 @@
// Find out the number of values
int nativeHandle = openKey(KEY_QUERY_VALUE);
if (nativeHandle == NULL_NATIVE_HANDLE) {
- throw new BackingStoreException("Could not open windows"
- + "registry node " + byteArrayToString(windowsAbsolutePath()) +
- " at root 0x" + Integer.toHexString(rootNativeHandle()) + ".");
+ throw new BackingStoreException(
+ "Could not open windows registry node " +
+ byteArrayToString(windowsAbsolutePath()) +
+ " at root 0x" +
+ Integer.toHexString(rootNativeHandle()) + ".");
}
int[] result = WindowsRegQueryInfoKey1(nativeHandle);
if (result[ERROR_CODE] != ERROR_SUCCESS) {
- String info = "Could not query windows"
- + "registry node " + byteArrayToString(windowsAbsolutePath()) +
- " at root 0x" + Integer.toHexString(rootNativeHandle()) +
- ". Windows RegQueryInfoKeyEx(...) returned error code " +
- result[ERROR_CODE] + ".";
+ String info = "Could not query windows registry node " +
+ byteArrayToString(windowsAbsolutePath()) +
+ " at root 0x" +
+ Integer.toHexString(rootNativeHandle()) +
+ ". Windows RegQueryInfoKeyEx(...) returned error code " +
+ result[ERROR_CODE] + ".";
logger().warning(info);
throw new BackingStoreException(info);
}
@@ -712,17 +723,17 @@
if (valuesNumber == 0) {
closeKey(nativeHandle);
return new String[0];
- }
- // Get the values
- String[] valueNames = new String[valuesNumber];
- for (int i = 0; i < valuesNumber; i++) {
+ }
+ // Get the values
+ String[] valueNames = new String[valuesNumber];
+ for (int i = 0; i < valuesNumber; i++) {
byte[] windowsName = WindowsRegEnumValue1(nativeHandle, i,
- maxValueNameLength+1);
+ maxValueNameLength+1);
if (windowsName == null) {
String info =
- "Could not enumerate value #" + i + " of windows node " +
- byteArrayToString(windowsAbsolutePath()) + " at root 0x" +
- Integer.toHexString(rootNativeHandle()) + ".";
+ "Could not enumerate value #" + i + " of windows node " +
+ byteArrayToString(windowsAbsolutePath()) + " at root 0x" +
+ Integer.toHexString(rootNativeHandle()) + ".";
logger().warning(info);
throw new BackingStoreException(info);
}
@@ -740,20 +751,22 @@
*/
protected String[] childrenNamesSpi() throws BackingStoreException {
// Open key
- int nativeHandle = openKey(KEY_ENUMERATE_SUB_KEYS| KEY_QUERY_VALUE);
+ int nativeHandle = openKey(KEY_ENUMERATE_SUB_KEYS | KEY_QUERY_VALUE);
if (nativeHandle == NULL_NATIVE_HANDLE) {
- throw new BackingStoreException("Could not open windows"
- + "registry node " + byteArrayToString(windowsAbsolutePath()) +
- " at root 0x" + Integer.toHexString(rootNativeHandle()) + ".");
+ throw new BackingStoreException(
+ "Could not open windows registry node " +
+ byteArrayToString(windowsAbsolutePath()) +
+ " at root 0x" +
+ Integer.toHexString(rootNativeHandle()) + ".");
}
// Get number of children
int[] result = WindowsRegQueryInfoKey1(nativeHandle);
if (result[ERROR_CODE] != ERROR_SUCCESS) {
- String info = "Could not query windows"
- + "registry node " + byteArrayToString(windowsAbsolutePath()) +
- " at root 0x" + Integer.toHexString(rootNativeHandle()) +
- ". Windows RegQueryInfoKeyEx(...) returned error code " +
- result[ERROR_CODE] + ".";
+ String info = "Could not query windows registry node " +
+ byteArrayToString(windowsAbsolutePath()) +
+ " at root 0x" + Integer.toHexString(rootNativeHandle()) +
+ ". Windows RegQueryInfoKeyEx(...) returned error code " +
+ result[ERROR_CODE] + ".";
logger().warning(info);
throw new BackingStoreException(info);
}
@@ -768,12 +781,12 @@
// Get children
for (int i = 0; i < subKeysNumber; i++) {
byte[] windowsName = WindowsRegEnumKeyEx1(nativeHandle, i,
- maxKeyLength+1);
+ maxKeyLength+1);
if (windowsName == null) {
String info =
- "Could not enumerate key #" + i + " of windows node " +
- byteArrayToString(windowsAbsolutePath()) + " at root 0x" +
- Integer.toHexString(rootNativeHandle()) + ". ";
+ "Could not enumerate key #" + i + " of windows node " +
+ byteArrayToString(windowsAbsolutePath()) + " at root 0x" +
+ Integer.toHexString(rootNativeHandle()) + ". ";
logger().warning(info);
throw new BackingStoreException(info);
}
@@ -798,20 +811,24 @@
}
if (!isBackingStoreAvailable) {
throw new BackingStoreException(
- "flush(): Backing store not available.");
+ "flush(): Backing store not available.");
}
int nativeHandle = openKey(KEY_READ);
if (nativeHandle == NULL_NATIVE_HANDLE) {
- throw new BackingStoreException("Could not open windows"
- + "registry node " + byteArrayToString(windowsAbsolutePath()) +
- " at root 0x" + Integer.toHexString(rootNativeHandle()) + ".");
+ throw new BackingStoreException(
+ "Could not open windows registry node " +
+ byteArrayToString(windowsAbsolutePath()) +
+ " at root 0x" +
+ Integer.toHexString(rootNativeHandle()) + ".");
}
int result = WindowsRegFlushKey1(nativeHandle);
if (result != ERROR_SUCCESS) {
- String info = "Could not flush windows "
- + "registry node " + byteArrayToString(windowsAbsolutePath())
- + " at root 0x" + Integer.toHexString(rootNativeHandle()) +
- ". Windows RegFlushKey(...) returned error code " + result + ".";
+ String info = "Could not flush windows registry node " +
+ byteArrayToString(windowsAbsolutePath()) +
+ " at root 0x" +
+ Integer.toHexString(rootNativeHandle()) +
+ ". Windows RegFlushKey(...) returned error code " +
+ result + ".";
logger().warning(info);
throw new BackingStoreException(info);
}
@@ -838,7 +855,7 @@
* Logs a warning message, if Windows Registry is unavailable.
*/
protected AbstractPreferences childSpi(String name) {
- return new WindowsPreferences(this, name);
+ return new WindowsPreferences(this, name);
}
/**
@@ -849,20 +866,22 @@
*/
public void removeNodeSpi() throws BackingStoreException {
int parentNativeHandle =
- ((WindowsPreferences)parent()).openKey(DELETE);
+ ((WindowsPreferences)parent()).openKey(DELETE);
if (parentNativeHandle == NULL_NATIVE_HANDLE) {
- throw new BackingStoreException("Could not open parent windows"
- + "registry node of " + byteArrayToString(windowsAbsolutePath()) +
- " at root 0x" + Integer.toHexString(rootNativeHandle()) + ".");
+ throw new BackingStoreException(
+ "Could not open parent windows registry node of " +
+ byteArrayToString(windowsAbsolutePath()) +
+ " at root 0x" +
+ Integer.toHexString(rootNativeHandle()) + ".");
}
int result =
WindowsRegDeleteKey(parentNativeHandle, toWindowsName(name()));
if (result != ERROR_SUCCESS) {
- String info = "Could not delete windows "
- + "registry node " + byteArrayToString(windowsAbsolutePath()) +
- " at root 0x" + Integer.toHexString(rootNativeHandle()) +
- ". Windows RegDeleteKeyEx(...) returned error code " +
- result + ".";
+ String info = "Could not delete windows registry node " +
+ byteArrayToString(windowsAbsolutePath()) +
+ " at root 0x" + Integer.toHexString(rootNativeHandle()) +
+ ". Windows RegDeleteKeyEx(...) returned error code " +
+ result + ".";
logger().warning(info);
throw new BackingStoreException(info);
}
@@ -879,23 +898,25 @@
private static String toJavaName(byte[] windowsNameArray) {
String windowsName = byteArrayToString(windowsNameArray);
// check if Alt64
- if ((windowsName.length()>1) &&
- (windowsName.substring(0,2).equals("/!"))) {
+ if ((windowsName.length() > 1) &&
+ (windowsName.substring(0, 2).equals("/!"))) {
return toJavaAlt64Name(windowsName);
}
- StringBuffer javaName = new StringBuffer();
+ StringBuilder javaName = new StringBuilder();
char ch;
// Decode from simple encoding
- for (int i = 0; i < windowsName.length(); i++){
+ for (int i = 0; i < windowsName.length(); i++) {
if ((ch = windowsName.charAt(i)) == '/') {
char next = ' ';
if ((windowsName.length() > i + 1) &&
- ((next = windowsName.charAt(i+1)) >= 'A') && (next <= 'Z')) {
- ch = next;
- i++;
- } else if ((windowsName.length() > i + 1) && (next == '/')) {
- ch = '\\';
- i++;
+ ((next = windowsName.charAt(i+1)) >= 'A') &&
+ (next <= 'Z')) {
+ ch = next;
+ i++;
+ } else if ((windowsName.length() > i + 1) &&
+ (next == '/')) {
+ ch = '\\';
+ i++;
}
} else if (ch == '\\') {
ch = '/';
@@ -914,8 +935,8 @@
private static String toJavaAlt64Name(String windowsName) {
byte[] byteBuffer =
- Base64.altBase64ToByteArray(windowsName.substring(2));
- StringBuffer result = new StringBuffer();
+ Base64.altBase64ToByteArray(windowsName.substring(2));
+ StringBuilder result = new StringBuilder();
for (int i = 0; i < byteBuffer.length; i++) {
int firstbyte = (byteBuffer[i++] & 0xff);
int secondbyte = (byteBuffer[i] & 0xff);
@@ -945,10 +966,10 @@
* Base64 class.
*/
private static byte[] toWindowsName(String javaName) {
- StringBuffer windowsName = new StringBuffer();
+ StringBuilder windowsName = new StringBuilder();
for (int i = 0; i < javaName.length(); i++) {
- char ch =javaName.charAt(i);
- if ((ch < 0x0020)||(ch > 0x007f)) {
+ char ch = javaName.charAt(i);
+ if ((ch < 0x0020) || (ch > 0x007f)) {
// If a non-trivial character encountered, use altBase64
return toWindowsAlt64Name(javaName);
}
@@ -957,7 +978,7 @@
} else if (ch == '/') {
windowsName.append('\\');
} else if ((ch >= 'A') && (ch <='Z')) {
- windowsName.append("/" + ch);
+ windowsName.append('/').append(ch);
} else {
windowsName.append(ch);
}
@@ -976,13 +997,13 @@
// Convert to byte pairs
int counter = 0;
for (int i = 0; i < javaName.length();i++) {
- int ch = javaName.charAt(i);
- javaNameArray[counter++] = (byte)(ch >>> 8);
- javaNameArray[counter++] = (byte)ch;
+ int ch = javaName.charAt(i);
+ javaNameArray[counter++] = (byte)(ch >>> 8);
+ javaNameArray[counter++] = (byte)ch;
}
- return stringToByteArray(
- "/!" + Base64.byteArrayToAltBase64(javaNameArray));
+ return stringToByteArray("/!" +
+ Base64.byteArrayToAltBase64(javaNameArray));
}
/**
@@ -994,30 +1015,31 @@
private static String toJavaValueString(byte[] windowsNameArray) {
// Use modified native2ascii algorithm
String windowsName = byteArrayToString(windowsNameArray);
- StringBuffer javaName = new StringBuffer();
+ StringBuilder javaName = new StringBuilder();
char ch;
for (int i = 0; i < windowsName.length(); i++){
if ((ch = windowsName.charAt(i)) == '/') {
char next = ' ';
if (windowsName.length() > i + 1 &&
- (next = windowsName.charAt(i + 1)) == 'u') {
- if (windowsName.length() < i + 6){
+ (next = windowsName.charAt(i + 1)) == 'u') {
+ if (windowsName.length() < i + 6) {
break;
} else {
- ch = (char)Integer.parseInt
- (windowsName.substring(i + 2, i + 6), 16);
+ ch = (char)Integer.parseInt(
+ windowsName.substring(i + 2, i + 6), 16);
i += 5;
}
} else
if ((windowsName.length() > i + 1) &&
- ((windowsName.charAt(i+1)) >= 'A') && (next <= 'Z')) {
- ch = next;
- i++;
- } else if ((windowsName.length() > i + 1) &&
- (next == '/')) {
- ch = '\\';
- i++;
+ ((windowsName.charAt(i+1)) >= 'A') &&
+ (next <= 'Z')) {
+ ch = next;
+ i++;
+ } else if ((windowsName.length() > i + 1) &&
+ (next == '/')) {
+ ch = '\\';
+ i++;
}
} else if (ch == '\\') {
ch = '/';
@@ -1037,14 +1059,14 @@
* to convert java string to a byte array of ASCII characters.
*/
private static byte[] toWindowsValueString(String javaName) {
- StringBuffer windowsName = new StringBuffer();
+ StringBuilder windowsName = new StringBuilder();
for (int i = 0; i < javaName.length(); i++) {
- char ch =javaName.charAt(i);
- if ((ch < 0x0020)||(ch > 0x007f)){
+ char ch = javaName.charAt(i);
+ if ((ch < 0x0020) || (ch > 0x007f)){
// write \udddd
windowsName.append("/u");
String hex = Integer.toHexString(javaName.charAt(i));
- StringBuffer hex4 = new StringBuffer(hex);
+ StringBuilder hex4 = new StringBuilder(hex);
hex4.reverse();
int len = 4 - hex4.length();
for (int j = 0; j < len; j++){
@@ -1058,7 +1080,7 @@
} else if (ch == '/') {
windowsName.append('\\');
} else if ((ch >= 'A') && (ch <='Z')) {
- windowsName.append("/" + ch);
+ windowsName.append('/').append(ch);
} else {
windowsName.append(ch);
}
@@ -1070,8 +1092,9 @@
* Returns native handle for the top Windows node for this node.
*/
private int rootNativeHandle() {
- return (isUserNode()? USER_ROOT_NATIVE_HANDLE :
- SYSTEM_ROOT_NATIVE_HANDLE);
+ return (isUserNode()
+ ? USER_ROOT_NATIVE_HANDLE
+ : SYSTEM_ROOT_NATIVE_HANDLE);
}
/**
@@ -1090,7 +1113,7 @@
* Converts a null-terminated byte array to java string
*/
private static String byteArrayToString(byte[] array) {
- StringBuffer result = new StringBuffer();
+ StringBuilder result = new StringBuilder();
for (int i = 0; i < array.length - 1; i++) {
result.append((char)array[i]);
}
--- a/jdk/src/java.rmi/share/classes/com/sun/rmi/rmid/ExecOptionPermission.java Thu May 21 10:07:38 2015 -0700
+++ b/jdk/src/java.rmi/share/classes/com/sun/rmi/rmid/ExecOptionPermission.java Thu May 21 16:20:20 2015 -0700
@@ -32,7 +32,6 @@
/**
* The ExecOptionPermission class represents permission for rmid to use
* a specific command-line option when launching an activation group.
- * <P>
*
* @author Ann Wollrath
*
@@ -68,9 +67,9 @@
* Checks if the specified permission is "implied" by
* this object.
* <P>
- * More specifically, this method returns true if:<p>
+ * More specifically, this method returns true if:
* <ul>
- * <li> <i>p</i>'s class is the same as this object's class, and<p>
+ * <li> <i>p</i>'s class is the same as this object's class, and
* <li> <i>p</i>'s name equals or (in the case of wildcards)
* is implied by this object's
* name. For example, "a.b.*" implies "a.b.c", and
@@ -111,7 +110,7 @@
* Checks two ExecOptionPermission objects for equality.
* Checks that <i>obj</i>'s class is the same as this object's class
* and has the same name as this object.
- * <P>
+ *
* @param obj the object we are testing for equality with this object.
* @return true if <i>obj</i> is an ExecOptionPermission, and has the same
* name as this ExecOptionPermission object, false otherwise.
@@ -154,7 +153,7 @@
* Returns a new PermissionCollection object for storing
* ExecOptionPermission objects.
* <p>
- * A ExecOptionPermissionCollection stores a collection of
+ * An ExecOptionPermissionCollection stores a collection of
* ExecOptionPermission permissions.
*
* <p>ExecOptionPermission objects must be stored in a manner that allows
--- a/jdk/src/java.rmi/share/classes/com/sun/rmi/rmid/ExecPermission.java Thu May 21 10:07:38 2015 -0700
+++ b/jdk/src/java.rmi/share/classes/com/sun/rmi/rmid/ExecPermission.java Thu May 21 16:20:20 2015 -0700
@@ -40,14 +40,13 @@
* all the files and directories contained in that directory. A pathname
* that ends with "/-" indicates (recursively) all files
* and subdirectories contained in that directory. A pathname consisting of
- * the special token "<<ALL FILES>>" matches <bold>any</bold> file.
+ * the special token "{@code <<ALL FILES>>}" matches <b>any</b> file.
* <P>
* Note: A pathname consisting of a single "*" indicates all the files
* in the current directory, while a pathname consisting of a single "-"
* indicates all the files in the current directory and
* (recursively) all files and subdirectories contained in the current
* directory.
- * <P>
*
*
* @author Ann Wollrath
@@ -72,7 +71,7 @@
* a directory and all the files contained in that directory. A pathname
* that ends with "/-" indicates a directory and (recursively) all files
* and subdirectories contained in that directory. The special pathname
- * "<<ALL FILES>>" matches all files.
+ * "{@code <<ALL FILES>>}" matches all files.
*
* <p>A pathname consisting of a single "*" indicates all the files
* in the current directory, while a pathname consisting of a single "-"
@@ -96,7 +95,7 @@
* a directory and all the files contained in that directory. A pathname
* that ends with "/-" indicates a directory and (recursively) all files
* and subdirectories contained in that directory. The special pathname
- * "<<ALL FILES>>" matches all files.
+ * "{@code <<ALL FILES>>}" matches all files.
*
* <p>A pathname consisting of a single "*" indicates all the files
* in the current directory, while a pathname consisting of a single "-"
@@ -114,9 +113,9 @@
/**
* Checks if this ExecPermission object "implies" the specified permission.
* <P>
- * More specifically, this method returns true if:<p>
+ * More specifically, this method returns true if:
* <ul>
- * <li> <i>p</i> is an instanceof ExecPermission,<p> and
+ * <li> <i>p</i> is an instanceof ExecPermission, and
* <li> <i>p</i>'s pathname is implied by this object's
* pathname. For example, "/tmp/*" implies "/tmp/foo", since
* "/tmp/*" encompasses the "/tmp" directory and all files in that
@@ -140,7 +139,7 @@
* Checks two ExecPermission objects for equality.
* Checks that <i>obj</i>'s class is the same as this object's class
* and has the same name as this object.
- * <P>
+ *
* @param obj the object we are testing for equality with this object.
* @return true if <i>obj</i> is an ExecPermission, and has the same
* pathname as this ExecPermission object, false otherwise.
--- a/jdk/src/java.rmi/share/classes/sun/rmi/log/LogInputStream.java Thu May 21 10:07:38 2015 -0700
+++ b/jdk/src/java.rmi/share/classes/sun/rmi/log/LogInputStream.java Thu May 21 16:20:20 2015 -0700
@@ -35,7 +35,7 @@
/**
* Creates a log input file with the specified system dependent
* file descriptor.
- * @param fd the system dependent file descriptor
+ * @param in the system dependent file descriptor
* @param length the total number of bytes allowed to be read
* @exception IOException If an I/O error has occurred.
*/
--- a/jdk/src/java.rmi/share/classes/sun/rmi/log/LogOutputStream.java Thu May 21 10:07:38 2015 -0700
+++ b/jdk/src/java.rmi/share/classes/sun/rmi/log/LogOutputStream.java Thu May 21 16:20:20 2015 -0700
@@ -35,7 +35,7 @@
/**
* Creates an output file with the specified system dependent
* file descriptor.
- * @param fd the system dependent file descriptor
+ * @param raf the system dependent file descriptor.
* @exception IOException If an I/O error has occurred.
*/
public LogOutputStream(RandomAccessFile raf) throws IOException {
--- a/jdk/src/java.rmi/share/classes/sun/rmi/log/ReliableLog.java Thu May 21 10:07:38 2015 -0700
+++ b/jdk/src/java.rmi/share/classes/sun/rmi/log/ReliableLog.java Thu May 21 16:20:20 2015 -0700
@@ -124,7 +124,7 @@
* stable storage directory.
*
* @param dirPath path to the stable storage directory
- * @param logCl the closure object containing callbacks for logging and
+ * @param handler the closure object containing callbacks for logging and
* recovery
* @param pad ignored
* @exception IOException If a directory creation error has
@@ -170,8 +170,8 @@
* stable storage directory.
*
* @param dirPath path to the stable storage directory
- * @param logCl the closure object containing callbacks for logging and
- * recovery
+ * @param handler the closure object containing callbacks for logging and
+ * recovery
* @exception IOException If a directory creation error has
* occurred or if initialSnapshot callback raises an exception
*/
--- a/jdk/src/java.rmi/share/classes/sun/rmi/registry/RegistryImpl.java Thu May 21 10:07:38 2015 -0700
+++ b/jdk/src/java.rmi/share/classes/sun/rmi/registry/RegistryImpl.java Thu May 21 16:20:20 2015 -0700
@@ -155,7 +155,7 @@
/**
* Returns the remote object for specified name in the registry.
* @exception RemoteException If remote operation failed.
- * @exception NotBound If name is not currently bound.
+ * @exception NotBoundException If name is not currently bound.
*/
public Remote lookup(String name)
throws RemoteException, NotBoundException
@@ -188,7 +188,7 @@
/**
* Unbind the name.
* @exception RemoteException If remote operation failed.
- * @exception NotBound If name is not currently bound.
+ * @exception NotBoundException If name is not currently bound.
*/
public void unbind(String name)
throws RemoteException, NotBoundException, AccessException
--- a/jdk/src/java.rmi/share/classes/sun/rmi/runtime/Log.java Thu May 21 10:07:38 2015 -0700
+++ b/jdk/src/java.rmi/share/classes/sun/rmi/runtime/Log.java Thu May 21 16:20:20 2015 -0700
@@ -96,7 +96,7 @@
* care to interpret a range of values between BRIEF, VERBOSE and
* SILENT.
*
- * An override < 0 is interpreted to mean that the logging
+ * An override {@literal <} 0 is interpreted to mean that the logging
* configuration should not be overridden. The level passed to the
* factories createLog method will be null in this case.
*
--- a/jdk/src/java.rmi/share/classes/sun/rmi/server/ActivationGroupImpl.java Thu May 21 10:07:38 2015 -0700
+++ b/jdk/src/java.rmi/share/classes/sun/rmi/server/ActivationGroupImpl.java Thu May 21 16:20:20 2015 -0700
@@ -345,7 +345,7 @@
* request.
*
* @param id the object's activation identifier
- * @returns true if the operation succeeds (the operation will
+ * @return true if the operation succeeds (the operation will
* succeed if the object in currently known to be active and is
* either already unexported or is currently exported and has no
* pending/executing calls); false is returned if the object has
@@ -430,7 +430,7 @@
* hasn't already done so.
*
* @param id the object's identifier
- * @param obj the remote object implementation
+ * @param impl the remote object implementation
* @exception UnknownObjectException if object is not registered
* @exception RemoteException if call informing monitor fails
*/
--- a/jdk/src/java.rmi/share/classes/sun/rmi/server/ActivationGroupInit.java Thu May 21 10:07:38 2015 -0700
+++ b/jdk/src/java.rmi/share/classes/sun/rmi/server/ActivationGroupInit.java Thu May 21 16:20:20 2015 -0700
@@ -36,7 +36,7 @@
* The activator spawns (as a child process) an activation group as needed
* and directs activation requests to the appropriate activation
* group. After spawning the VM, the activator passes some
- * information to the bootstrap code via its stdin: <p>
+ * information to the bootstrap code via its stdin:
* <ul>
* <li> the activation group's id,
* <li> the activation group's descriptor (an instance of the class
--- a/jdk/src/java.rmi/share/classes/sun/rmi/transport/Channel.java Thu May 21 10:07:38 2015 -0700
+++ b/jdk/src/java.rmi/share/classes/sun/rmi/transport/Channel.java Thu May 21 16:20:20 2015 -0700
@@ -42,7 +42,7 @@
/**
* Free the connection generated by this channel.
- * @param c The connection
+ * @param conn The connection.
* @param reuse If true, the connection is in a state in which it
* can be reused for another method call.
*/
--- a/jdk/src/java.rmi/share/classes/sun/rmi/transport/LiveRef.java Thu May 21 10:07:38 2015 -0700
+++ b/jdk/src/java.rmi/share/classes/sun/rmi/transport/LiveRef.java Thu May 21 16:20:20 2015 -0700
@@ -56,7 +56,7 @@
/**
* Construct a "well-known" live reference to a remote object
- * @param isLocalServer If true, indicates this ref specifies a local
+ * @param isLocal If true, indicates this ref specifies a local
* server in this address space; if false, the ref is for a remote
* object (hence a surrogate or proxy) in another address space.
*/
--- a/jdk/src/java.rmi/share/classes/sun/rmi/transport/proxy/CGIHandler.java Thu May 21 10:07:38 2015 -0700
+++ b/jdk/src/java.rmi/share/classes/sun/rmi/transport/proxy/CGIHandler.java Thu May 21 16:20:20 2015 -0700
@@ -81,7 +81,7 @@
/**
* The CGIHandler class contains methods for executing as a CGI program.
* The main function interprets the query string as a command of the form
- * "<command>=<parameters>".
+ * "{@code <command>=<parameters>}".
*
* This class depends on the CGI 1.0 environment variables being set as
* properties of the same name in this Java VM.
--- a/jdk/src/java.scripting/share/classes/javax/script/Compilable.java Thu May 21 10:07:38 2015 -0700
+++ b/jdk/src/java.scripting/share/classes/javax/script/Compilable.java Thu May 21 16:20:20 2015 -0700
@@ -42,7 +42,7 @@
*
* @param script The source of the script, represented as a <code>String</code>.
*
- * @return An subclass of <code>CompiledScript</code> to be executed later using one
+ * @return An instance of a subclass of <code>CompiledScript</code> to be executed later using one
* of the <code>eval</code> methods of <code>CompiledScript</code>.
*
* @throws ScriptException if compilation fails.
@@ -61,7 +61,7 @@
*
* @param script The reader from which the script source is obtained.
*
- * @return An implementation of <code>CompiledScript</code> to be executed
+ * @return An instance of a subclass of <code>CompiledScript</code> to be executed
* later using one of its <code>eval</code> methods of <code>CompiledScript</code>.
*
* @throws ScriptException if compilation fails.
--- a/jdk/src/java.scripting/share/classes/javax/script/SimpleScriptContext.java Thu May 21 10:07:38 2015 -0700
+++ b/jdk/src/java.scripting/share/classes/javax/script/SimpleScriptContext.java Thu May 21 16:20:20 2015 -0700
@@ -140,6 +140,7 @@
* @throws IllegalArgumentException if the name is empty.
*/
public Object getAttribute(String name) {
+ checkName(name);
if (engineScope.containsKey(name)) {
return getAttribute(name, ENGINE_SCOPE);
} else if (globalScope != null && globalScope.containsKey(name)) {
@@ -162,7 +163,7 @@
* @throws NullPointerException if the name is null.
*/
public Object getAttribute(String name, int scope) {
-
+ checkName(name);
switch (scope) {
case ENGINE_SCOPE:
@@ -191,7 +192,7 @@
* @throws NullPointerException if the name is null.
*/
public Object removeAttribute(String name, int scope) {
-
+ checkName(name);
switch (scope) {
case ENGINE_SCOPE:
@@ -223,7 +224,7 @@
* @throws NullPointerException if the name is null.
*/
public void setAttribute(String name, Object value, int scope) {
-
+ checkName(name);
switch (scope) {
case ENGINE_SCOPE:
@@ -281,6 +282,7 @@
* @throws IllegalArgumentException if name is empty.
*/
public int getAttributesScope(String name) {
+ checkName(name);
if (engineScope.containsKey(name)) {
return ENGINE_SCOPE;
} else if (globalScope != null && globalScope.containsKey(name)) {
@@ -314,6 +316,13 @@
return scopes;
}
+ private void checkName(String name) {
+ Objects.requireNonNull(name);
+ if (name.isEmpty()) {
+ throw new IllegalArgumentException("name cannot be empty");
+ }
+ }
+
private static List<Integer> scopes;
static {
scopes = new ArrayList<Integer>(2);
--- a/jdk/src/java.scripting/share/classes/javax/script/package.html Thu May 21 10:07:38 2015 -0700
+++ b/jdk/src/java.scripting/share/classes/javax/script/package.html Thu May 21 16:20:20 2015 -0700
@@ -29,7 +29,7 @@
</head>
<body bgcolor="white">
<p>The scripting API consists of interfaces and classes that define
-Java <font size=1><sup>TM</sup></font> Scripting Engines and provides
+Java™ Scripting Engines and provides
a framework for their use in Java applications. This API is intended
for use by application programmers who wish to execute programs
written in scripting languages in their Java applications. The
--- a/jdk/src/java.security.jgss/share/classes/sun/security/krb5/Config.java Thu May 21 10:07:38 2015 -0700
+++ b/jdk/src/java.security.jgss/share/classes/sun/security/krb5/Config.java Thu May 21 16:20:20 2015 -0700
@@ -1085,27 +1085,30 @@
* Check if need to use DNS to locate Kerberos services for name. If not
* defined, check dns_fallback, whose default value is true.
*/
- private boolean useDNS(String name) {
+ private boolean useDNS(String name, boolean defaultValue) {
Boolean value = getBooleanObject("libdefaults", name);
if (value != null) {
return value.booleanValue();
- } else {
- return getBooleanObject("libdefaults", "dns_fallback") != Boolean.FALSE;
}
+ value = getBooleanObject("libdefaults", "dns_fallback");
+ if (value != null) {
+ return value.booleanValue();
+ }
+ return defaultValue;
}
/**
* Check if need to use DNS to locate the KDC
*/
private boolean useDNS_KDC() {
- return useDNS("dns_lookup_kdc");
+ return useDNS("dns_lookup_kdc", true);
}
/*
* Check if need to use DNS to locate the Realm
*/
private boolean useDNS_Realm() {
- return useDNS("dns_lookup_realm");
+ return useDNS("dns_lookup_realm", false);
}
/**
--- a/jdk/src/java.sql.rowset/share/classes/com/sun/rowset/FilteredRowSetImpl.java Thu May 21 10:07:38 2015 -0700
+++ b/jdk/src/java.sql.rowset/share/classes/com/sun/rowset/FilteredRowSetImpl.java Thu May 21 16:20:20 2015 -0700
@@ -466,7 +466,7 @@
* passed to the evaluate function.
* 2. updateXXXstream() - here it would suffice to pass the stream handle
* to the evaluate function and the implementation
- * of the evaluate function can do the comparision
+ * of the evaluate function can do the comparison
* based on the stream and also type of data.
*/
--- a/jdk/src/java.sql.rowset/share/classes/com/sun/rowset/JoinRowSetImpl.java Thu May 21 10:07:38 2015 -0700
+++ b/jdk/src/java.sql.rowset/share/classes/com/sun/rowset/JoinRowSetImpl.java Thu May 21 16:20:20 2015 -0700
@@ -4063,14 +4063,16 @@
}
/**
- * Provide interface coverage for getURL(int) in ResultSet->RowSet
+ * Provide interface coverage for getURL(int) in
+ * ResultSet{@literal ->}RowSet
*/
public java.net.URL getURL(int columnIndex) throws SQLException {
return crsInternal.getURL(columnIndex);
}
/**
- * Provide interface coverage for getURL(String) in ResultSet->RowSet
+ * Provide interface coverage for getURL(String) in
+ * ResultSet{@literal ->}RowSet
*/
public java.net.URL getURL(String columnName) throws SQLException {
return crsInternal.getURL(columnName);
--- a/jdk/src/java.sql.rowset/share/classes/com/sun/rowset/providers/RIOptimisticProvider.java Thu May 21 10:07:38 2015 -0700
+++ b/jdk/src/java.sql.rowset/share/classes/com/sun/rowset/providers/RIOptimisticProvider.java Thu May 21 16:20:20 2015 -0700
@@ -36,7 +36,7 @@
* The reference implementation of a JDBC Rowset synchronization provider
* providing optimistic synchronization with a relational datastore
* using any JDBC technology-enabled driver.
- * <p>
+ *
* <h3>1.0 Backgroud</h3>
* This synchronization provider is registered with the
* <code>SyncFactory</code> by default as the
--- a/jdk/src/java.sql.rowset/share/classes/javax/sql/rowset/serial/SerialBlob.java Thu May 21 10:07:38 2015 -0700
+++ b/jdk/src/java.sql.rowset/share/classes/javax/sql/rowset/serial/SerialBlob.java Thu May 21 16:20:20 2015 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2003, 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2015, Oracle and/or its affiliates. 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
@@ -67,7 +67,7 @@
* value of this <code>SerialBlob</code> object.
* @serial
*/
- private byte buf[];
+ private byte[] buf;
/**
* The internal representation of the <code>Blob</code> object on which this
@@ -103,12 +103,13 @@
* @throws SerialException if an error occurs during serialization
* @throws SQLException if a SQL errors occurs
*/
- public SerialBlob(byte[] b) throws SerialException, SQLException {
+ public SerialBlob(byte[] b)
+ throws SerialException, SQLException {
len = b.length;
buf = new byte[(int)len];
for(int i = 0; i < len; i++) {
- buf[i] = b[i];
+ buf[i] = b[i];
}
origLen = len;
}
@@ -133,19 +134,17 @@
* to this constructor is a <code>null</code>.
* @see java.sql.Blob
*/
- public SerialBlob (Blob blob) throws SerialException, SQLException {
+ public SerialBlob (Blob blob)
+ throws SerialException, SQLException {
if (blob == null) {
- throw new SQLException("Cannot instantiate a SerialBlob " +
- "object with a null Blob object");
+ throw new SQLException(
+ "Cannot instantiate a SerialBlob object with a null Blob object");
}
len = blob.length();
buf = blob.getBytes(1, (int)len );
this.blob = blob;
-
- //if ( len < 10240000)
- // len = 10240000;
origLen = len;
}
@@ -246,7 +245,8 @@
* value from the database
*/
public long position(byte[] pattern, long start)
- throws SerialException, SQLException {
+ throws SerialException, SQLException {
+
isValid();
if (start < 1 || start > len) {
return -1;
@@ -291,7 +291,7 @@
* value from the database
*/
public long position(Blob pattern, long start)
- throws SerialException, SQLException {
+ throws SerialException, SQLException {
isValid();
return position(pattern.getBytes(1, (int)(pattern.length())), start);
}
@@ -317,8 +317,8 @@
* @see #getBytes
*/
public int setBytes(long pos, byte[] bytes)
- throws SerialException, SQLException {
- return (setBytes(pos, bytes, 0, bytes.length));
+ throws SerialException, SQLException {
+ return setBytes(pos, bytes, 0, bytes.length);
}
/**
@@ -353,7 +353,7 @@
* @see #getBytes
*/
public int setBytes(long pos, byte[] bytes, int offset, int length)
- throws SerialException, SQLException {
+ throws SerialException, SQLException {
isValid();
if (offset < 0 || offset > bytes.length) {
@@ -370,7 +370,7 @@
if ((length + offset) > bytes.length) {
throw new SerialException("Invalid OffSet. Cannot have combined offset " +
- "and length that is greater that the Blob buffer");
+ "and length that is greater that the Blob buffer");
}
int i = 0;
@@ -403,7 +403,8 @@
* @see #getBinaryStream
*/
public java.io.OutputStream setBinaryStream(long pos)
- throws SerialException, SQLException {
+ throws SerialException, SQLException {
+
isValid();
if (this.blob != null) {
return this.blob.setBinaryStream(pos);
@@ -426,17 +427,16 @@
* if {@code free} had previously been called on this object
*/
public void truncate(long length) throws SerialException {
-
isValid();
if (length > len) {
- throw new SerialException
- ("Length more than what can be truncated");
+ throw new SerialException(
+ "Length more than what can be truncated");
} else if((int)length == 0) {
- buf = new byte[0];
- len = length;
+ buf = new byte[0];
+ len = length;
} else {
- len = length;
- buf = this.getBytes(1, (int)len);
+ len = length;
+ buf = this.getBytes(1, (int)len);
}
}
@@ -467,8 +467,8 @@
throw new SerialException("Invalid position in BLOB object set");
}
if (length < 1 || length > len - pos + 1) {
- throw new SerialException("length is < 1 or pos + length >"
- + "total number of bytes");
+ throw new SerialException(
+ "length is < 1 or pos + length > total number of bytes");
}
return new ByteArrayInputStream(buf, (int) pos - 1, (int) length);
}
@@ -537,14 +537,13 @@
public Object clone() {
try {
SerialBlob sb = (SerialBlob) super.clone();
- sb.buf = (buf != null) ? Arrays.copyOf(buf, (int)len) : null;
+ sb.buf = (buf != null) ? Arrays.copyOf(buf, (int)len) : null;
sb.blob = null;
return sb;
} catch (CloneNotSupportedException ex) {
// this shouldn't happen, since we are Cloneable
throw new InternalError();
}
-
}
/**
@@ -555,15 +554,15 @@
throws IOException, ClassNotFoundException {
ObjectInputStream.GetField fields = s.readFields();
- byte[] tmp = (byte[])fields.get("buf", null);
- if (tmp == null)
- throw new InvalidObjectException("buf is null and should not be!");
- buf = tmp.clone();
- len = fields.get("len", 0L);
- if (buf.length != len)
- throw new InvalidObjectException("buf is not the expected size");
- origLen = fields.get("origLen", 0L);
- blob = (Blob) fields.get("blob", null);
+ byte[] tmp = (byte[])fields.get("buf", null);
+ if (tmp == null)
+ throw new InvalidObjectException("buf is null and should not be!");
+ buf = tmp.clone();
+ len = fields.get("len", 0L);
+ if (buf.length != len)
+ throw new InvalidObjectException("buf is not the expected size");
+ origLen = fields.get("origLen", 0L);
+ blob = (Blob) fields.get("blob", null);
}
/**
@@ -591,8 +590,8 @@
*/
private void isValid() throws SerialException {
if (buf == null) {
- throw new SerialException("Error: You cannot call a method on a "
- + "SerialBlob instance once free() has been called.");
+ throw new SerialException("Error: You cannot call a method on a " +
+ "SerialBlob instance once free() has been called.");
}
}
--- a/jdk/src/java.sql/share/classes/java/sql/package.html Thu May 21 10:07:38 2015 -0700
+++ b/jdk/src/java.sql/share/classes/java/sql/package.html Thu May 21 16:20:20 2015 -0700
@@ -34,10 +34,10 @@
Provides the API for accessing and processing data stored in a
data source (usually a relational database) using the
-Java<sup><font size=-2>TM</font></sup> programming language.
+Java™ programming language.
This API includes a framework whereby different
drivers can be installed dynamically to access different data sources.
-Although the JDBC<sup><font size=-2>TM</font></sup> API is mainly geared
+Although the JDBC™ API is mainly geared
to passing SQL statements to a database, it provides for reading and
writing data from any data source with a tabular format.
The reader/writer facility, available through the
@@ -45,17 +45,16 @@
use and update data from a spread sheet, flat file, or any other tabular
data source.
-<h2>What the JDBC<sup><font size=-2>TM</font></sup> 4.2 API Includes</h2>
-The JDBC<sup><font size=-2>TM</font></sup> 4.2 API includes both
+<h2>What the JDBC™ 4.2 API Includes</h2>
+The JDBC™ 4.2 API includes both
the <code>java.sql</code> package, referred to as the JDBC core API,
and the <code>javax.sql</code> package, referred to as the JDBC Optional
Package API. This complete JDBC API
-is included in the Java<sup><font size=-2>TM</font></sup>
-Standard Edition (Java SE<sup><font size=-2>TM</font></sup>), version 7.
+is included in the Java™ Standard Edition (Java SE™), version 7.
The <code>javax.sql</code> package extends the functionality of the JDBC API
from a client-side API to a server-side API, and it is an essential part
-of the Java<sup><font size=-2>TM</font></sup> Enterprise Edition
-(Java EE<sup><font size=-2>TM</font></sup>) technology.
+of the Java™ Enterprise Edition
+(Java EE™) technology.
<h2>Versions</h2>
The JDBC 4.2 API incorporates all of the previous JDBC API versions:
@@ -74,7 +73,7 @@
Classes, interfaces, methods, fields, constructors, and exceptions
have the following "since" tags that indicate when they were introduced
into the Java platform. When these "since" tags are used in
-Javadoc<sup><font size=-2>TM</font></sup> comments for the JDBC API,
+Javadoc™ comments for the JDBC API,
they indicate the following:
<UL>
<LI>Since 1.8 -- new in the JDBC 4.2 API and part of the Java SE platform,
@@ -88,7 +87,7 @@
<LI>Since 1.2 -- new in the JDBC 2.0 API and part of the J2SE platform,
version 1.2</li>
<LI>Since 1.1 or no "since" tag -- in the original JDBC 1.0 API and part of
- the JDK<sup><font size=-2>TM</font></sup>, version 1.1</li>
+ the JDK™, version 1.1</li>
</UL>
<P>
<b>NOTE:</b> Many of the new features are optional; consequently, there is
@@ -97,7 +96,7 @@
you try to use it.
<P>
<b>NOTE:</b> The class <code>SQLPermission</code> was added in the
-Java<sup><font size=-2>TM</font></sup> 2 SDK, Standard Edition,
+Java™ 2 SDK, Standard Edition,
version 1.3 release. This class is used to prevent unauthorized
access to the logging stream associated with the <code>DriverManager</code>,
which may contain information such as table names, column data, and so on.
@@ -277,7 +276,7 @@
Package API</h3>
<UL>
<LI>The <code>DataSource</code> interface as a means of making a connection. The
- Java Naming and Directory Interface<sup><font size=-2>TM</font></sup>
+ Java Naming and Directory Interface™
(JNDI) is used for registering a <code>DataSource</code> object with a
naming service and also for retrieving it.
<LI>Pooled connections -- allowing connections to be used and reused
--- a/jdk/src/java.sql/share/classes/javax/sql/package.html Thu May 21 10:07:38 2015 -0700
+++ b/jdk/src/java.sql/share/classes/javax/sql/package.html Thu May 21 16:20:20 2015 -0700
@@ -33,7 +33,7 @@
<body bgcolor="white">
Provides the API for server side data source access and processing from
-the Java<sup><font size=-2>TM</font></sup> programming language.
+the Java™ programming language.
This package supplements the <code>java.sql</code>
package and, as of the version 1.4 release, is included in the
Java Platform, Standard Edition (Java SE™).
@@ -84,7 +84,7 @@
creates is a connection to that physical data source.
<P>
A logical name for the data source is registered with a naming service that
-uses the Java Naming and Directory Interface<sup><font size=-2>TM</font></sup>
+uses the Java Naming and Directory Interface™
(JNDI) API, usually by a system administrator or someone performing the
duties of a system administrator. An application can retrieve the
<code>DataSource</code> object it wants by doing a lookup on the logical
@@ -189,7 +189,7 @@
<LI>Event Notification
<UL>
<LI><code>RowSetListener</code><br>
-A <code>RowSet</code> object is a JavaBeans<sup><font size=-2>TM</font></sup>
+A <code>RowSet</code> object is a JavaBeans™
component because it has properties and participates in the JavaBeans
event notification mechanism. The <code>RowSetListener</code> interface
is implemented by a component that wants to be notified about events that
--- a/jdk/src/java.xml.crypto/share/classes/com/sun/org/apache/xml/internal/security/utils/IgnoreAllErrorHandler.java Thu May 21 10:07:38 2015 -0700
+++ b/jdk/src/java.xml.crypto/share/classes/com/sun/org/apache/xml/internal/security/utils/IgnoreAllErrorHandler.java Thu May 21 16:20:20 2015 -0700
@@ -35,19 +35,30 @@
public class IgnoreAllErrorHandler implements ErrorHandler {
/** {@link org.apache.commons.logging} logging facility */
- private static java.util.logging.Logger log =
+ private static final java.util.logging.Logger log =
java.util.logging.Logger.getLogger(IgnoreAllErrorHandler.class.getName());
/** Field throwExceptions */
- private static final boolean warnOnExceptions =
- System.getProperty("com.sun.org.apache.xml.internal.security.test.warn.on.exceptions", "false").equals("true");
+ private static final boolean warnOnExceptions = getProperty(
+ "com.sun.org.apache.xml.internal.security.test.warn.on.exceptions");
/** Field throwExceptions */
- private static final boolean throwExceptions =
- System.getProperty("com.sun.org.apache.xml.internal.security.test.throw.exceptions", "false").equals("true");
+ private static final boolean throwExceptions = getProperty(
+ "com.sun.org.apache.xml.internal.security.test.throw.exceptions");
+
+ private static boolean getProperty(String name) {
+ return java.security.AccessController.doPrivileged(
+ new java.security.PrivilegedAction<Boolean>() {
+ @Override
+ public Boolean run() {
+ return Boolean.getBoolean(name);
+ }
+ });
+ }
/** @inheritDoc */
+ @Override
public void warning(SAXParseException ex) throws SAXException {
if (IgnoreAllErrorHandler.warnOnExceptions) {
log.log(java.util.logging.Level.WARNING, "", ex);
@@ -59,6 +70,7 @@
/** @inheritDoc */
+ @Override
public void error(SAXParseException ex) throws SAXException {
if (IgnoreAllErrorHandler.warnOnExceptions) {
log.log(java.util.logging.Level.SEVERE, "", ex);
@@ -70,6 +82,7 @@
/** @inheritDoc */
+ @Override
public void fatalError(SAXParseException ex) throws SAXException {
if (IgnoreAllErrorHandler.warnOnExceptions) {
log.log(java.util.logging.Level.WARNING, "", ex);
--- a/jdk/src/java.xml.crypto/share/classes/org/jcp/xml/dsig/internal/dom/DOMKeyValue.java Thu May 21 10:07:38 2015 -0700
+++ b/jdk/src/java.xml.crypto/share/classes/org/jcp/xml/dsig/internal/dom/DOMKeyValue.java Thu May 21 16:20:20 2015 -0700
@@ -326,32 +326,54 @@
private KeyFactory eckf;
private ECParameterSpec ecParams;
- // The supported curve, secp256r1
- private static final Curve SECP256R1;
- static {
- final String name, oid, sfield, a, b, x, y, n;
- name = "secp256r1 [NIST P-256, X9.62 prime256v1]";
- oid = "1.2.840.10045.3.1.7";
- sfield =
- "FFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF";
- a =
- "FFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFC";
- b =
- "5AC635D8AA3A93E7B3EBBD55769886BC651D06B0CC53B0F63BCE3C3E27D2604B";
- x =
- "6B17D1F2E12C4247F8BCE6E563A440F277037D812DEB33A0F4A13945D898C296";
- y =
- "4FE342E2FE1A7F9B8EE7EB4A7C0F9E162BCE33576B315ECECBB6406837BF51F5";
- n =
- "FFFFFFFF00000000FFFFFFFFFFFFFFFFBCE6FAADA7179E84F3B9CAC2FC632551";
- final int h = 1;
+ /* Supported curve, secp256r1 */
+ private static final Curve SECP256R1 = initializeCurve(
+ "secp256r1 [NIST P-256, X9.62 prime256v1]",
+ "1.2.840.10045.3.1.7",
+ "FFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF",
+ "FFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFC",
+ "5AC635D8AA3A93E7B3EBBD55769886BC651D06B0CC53B0F63BCE3C3E27D2604B",
+ "6B17D1F2E12C4247F8BCE6E563A440F277037D812DEB33A0F4A13945D898C296",
+ "4FE342E2FE1A7F9B8EE7EB4A7C0F9E162BCE33576B315ECECBB6406837BF51F5",
+ "FFFFFFFF00000000FFFFFFFFFFFFFFFFBCE6FAADA7179E84F3B9CAC2FC632551",
+ 1
+ );
+ /* Supported curve secp384r1 */
+ private static final Curve SECP384R1 = initializeCurve(
+ "secp384r1 [NIST P-384]",
+ "1.3.132.0.34",
+ "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFF0000000000000000FFFFFFFF",
+ "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFF0000000000000000FFFFFFFC",
+ "B3312FA7E23EE7E4988E056BE3F82D19181D9C6EFE8141120314088F5013875AC656398D8A2ED19D2A85C8EDD3EC2AEF",
+ "AA87CA22BE8B05378EB1C71EF320AD746E1D3B628BA79B9859F741E082542A385502F25DBF55296C3A545E3872760AB7",
+ "3617DE4A96262C6F5D9E98BF9292DC29F8F41DBD289A147CE9DA3113B5F0B8C00A60B1CE1D7E819D7A431D7C90EA0E5F",
+ "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC7634D81F4372DDF581A0DB248B0A77AECEC196ACCC52973",
+ 1
+ );
+
+ /* Supported curve secp521r1 */
+ private static final Curve SECP521R1 = initializeCurve(
+ "secp521r1 [NIST P-521]",
+ "1.3.132.0.35",
+ "01FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF",
+ "01FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC",
+ "0051953EB9618E1C9A1F929A21A0B68540EEA2DA725B99B315F3B8B489918EF109E156193951EC7E937B1652C0BD3BB1BF073573DF883D2C34F1EF451FD46B503F00",
+ "00C6858E06B70404E9CD9E3ECB662395B4429C648139053FB521F828AF606B4D3DBAA14B5E77EFE75928FE1DC127A2FFA8DE3348B3C1856A429BF97E7E31C2E5BD66",
+ "011839296A789A3BC0045C8A5FB42C7D1BD998F54449579B446817AFBD17273E662C97EE72995EF42640C550B9013FAD0761353C7086A272C24088BE94769FD16650",
+ "01FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA51868783BF2F966B7FCC0148F709A5D03BB5C9B8899C47AEBB6FB71E91386409",
+ 1
+ );
+
+ private static Curve initializeCurve(String name, String oid,
+ String sfield, String a, String b,
+ String x, String y, String n, int h) {
BigInteger p = bigInt(sfield);
ECField field = new ECFieldFp(p);
EllipticCurve curve = new EllipticCurve(field, bigInt(a),
bigInt(b));
ECPoint g = new ECPoint(bigInt(x), bigInt(y));
- SECP256R1 = new Curve(name, oid, curve, g, bigInt(n), h);
+ return new Curve(name, oid, curve, g, bigInt(n), h);
}
EC(PublicKey key) throws KeyException {
@@ -413,24 +435,45 @@
}
private static String getCurveOid(ECParameterSpec params) {
- // Check that the params represent the secp256r1 curve
- // If so, return the object identifier of the curve
+ // Check that the params represent one of the supported
+ // curves. If there is a match, return the object identifier
+ // of the curve.
+ Curve match;
+ if (matchCurve(params, SECP256R1)) {
+ match = SECP256R1;
+ } else if (matchCurve(params, SECP384R1)) {
+ match = SECP384R1;
+ } else if (matchCurve(params, SECP521R1)) {
+ match = SECP521R1;
+ } else {
+ return null;
+ }
+ return match.getObjectId();
+ }
+
+ private static boolean matchCurve(ECParameterSpec params, Curve curve) {
int fieldSize = params.getCurve().getField().getFieldSize();
- if (SECP256R1.getCurve().getField().getFieldSize() == fieldSize
- && SECP256R1.getCurve().equals(params.getCurve())
- && SECP256R1.getGenerator().equals(params.getGenerator())
- && SECP256R1.getOrder().equals(params.getOrder())
- && SECP256R1.getCofactor() == params.getCofactor()) {
- return SECP256R1.getObjectId();
+ if (curve.getCurve().getField().getFieldSize() == fieldSize
+ && curve.getCurve().equals(params.getCurve())
+ && curve.getGenerator().equals(params.getGenerator())
+ && curve.getOrder().equals(params.getOrder())
+ && curve.getCofactor() == params.getCofactor()) {
+ return true;
+ } else {
+ return false;
}
- return null;
}
private static ECParameterSpec getECParameterSpec(String oid) {
if (oid.equals(SECP256R1.getObjectId())) {
return SECP256R1;
+ } else if (oid.equals(SECP384R1.getObjectId())) {
+ return SECP384R1;
+ } else if (oid.equals(SECP521R1.getObjectId())) {
+ return SECP521R1;
+ } else {
+ return null;
}
- return null;
}
void marshalPublicKey(Node parent, Document doc, String dsPrefix,
--- a/jdk/src/jdk.attach/share/classes/com/sun/tools/attach/package-info.java Thu May 21 10:07:38 2015 -0700
+++ b/jdk/src/jdk.attach/share/classes/com/sun/tools/attach/package-info.java Thu May 21 16:20:20 2015 -0700
@@ -24,8 +24,7 @@
*/
/**
- * Provides the API to attach to a Java<sup><font size=-2>TM</font></sup>
- * virtual machine.
+ * Provides the API to attach to a Java™ virtual machine.
* <p>
* A tool, written in the Java Language, uses this API to attach to a target
* virtual machine (VM) and load its tool agent into the target VM. For
--- a/jdk/src/jdk.attach/share/classes/com/sun/tools/attach/spi/AttachProvider.java Thu May 21 10:07:38 2015 -0700
+++ b/jdk/src/jdk.attach/share/classes/com/sun/tools/attach/spi/AttachProvider.java Thu May 21 16:20:20 2015 -0700
@@ -241,7 +241,7 @@
* (using the zero-arg constructor) at the first invocation of this method.
* The list returned by the first invocation of this method is the list
* of providers. Subsequent invocations of this method return a list of the same
- * providers. The list is unmodifable.
+ * providers. The list is unmodifiable.
*
* @return A list of the installed attach providers.
*/
@@ -264,8 +264,8 @@
ThreadDeath td = (ThreadDeath)t;
throw td;
}
- // Ignore errors and exceptions
- System.err.println(t);
+ // Log errors and exceptions since we cannot return them
+ t.printStackTrace();
}
}
}
--- a/jdk/src/jdk.dev/share/classes/com/sun/tools/hat/Main.java Thu May 21 10:07:38 2015 -0700
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,212 +0,0 @@
-/*
- * Copyright (c) 2005, 2008, Oracle and/or its affiliates. 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. Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-/*
- * The Original Code is HAT. The Initial Developer of the
- * Original Code is Bill Foote, with contributions from others
- * at JavaSoft/Sun.
- */
-
-package com.sun.tools.hat;
-
-import java.io.IOException;
-import java.io.File;
-
-import com.sun.tools.hat.internal.model.Snapshot;
-import com.sun.tools.hat.internal.model.ReachableExcludesImpl;
-import com.sun.tools.hat.internal.server.QueryListener;
-
-/**
- *
- * @author Bill Foote
- */
-
-
-public class Main {
-
- private static String VERSION_STRING = "jhat version 2.0";
-
- private static void usage(String message) {
- if ( message != null ) {
- System.err.println("ERROR: " + message);
- }
- System.err.println("Usage: jhat [-stack <bool>] [-refs <bool>] [-port <port>] [-baseline <file>] [-debug <int>] [-version] [-h|-help] <file>");
- System.err.println();
- System.err.println("\t-J<flag> Pass <flag> directly to the runtime system. For");
- System.err.println("\t\t\t example, -J-mx512m to use a maximum heap size of 512MB");
- System.err.println("\t-stack false: Turn off tracking object allocation call stack.");
- System.err.println("\t-refs false: Turn off tracking of references to objects");
- System.err.println("\t-port <port>: Set the port for the HTTP server. Defaults to 7000");
- System.err.println("\t-exclude <file>: Specify a file that lists data members that should");
- System.err.println("\t\t\t be excluded from the reachableFrom query.");
- System.err.println("\t-baseline <file>: Specify a baseline object dump. Objects in");
- System.err.println("\t\t\t both heap dumps with the same ID and same class will");
- System.err.println("\t\t\t be marked as not being \"new\".");
- System.err.println("\t-debug <int>: Set debug level.");
- System.err.println("\t\t\t 0: No debug output");
- System.err.println("\t\t\t 1: Debug hprof file parsing");
- System.err.println("\t\t\t 2: Debug hprof file parsing, no server");
- System.err.println("\t-version Report version number");
- System.err.println("\t-h|-help Print this help and exit");
- System.err.println("\t<file> The file to read");
- System.err.println();
- System.err.println("For a dump file that contains multiple heap dumps,");
- System.err.println("you may specify which dump in the file");
- System.err.println("by appending \"#<number>\" to the file name, i.e. \"foo.hprof#3\".");
- System.err.println();
- System.err.println("All boolean options default to \"true\"");
- System.exit(1);
- }
-
- //
- // Convert s to a boolean. If it's invalid, abort the program.
- //
- private static boolean booleanValue(String s) {
- if ("true".equalsIgnoreCase(s)) {
- return true;
- } else if ("false".equalsIgnoreCase(s)) {
- return false;
- } else {
- usage("Boolean value must be true or false");
- return false; // Never happens
- }
- }
-
- public static void main(String[] args) {
- if (args.length < 1) {
- usage("No arguments supplied");
- }
-
- boolean parseonly = false;
- int portNumber = 7000;
- boolean callStack = true;
- boolean calculateRefs = true;
- String baselineDump = null;
- String excludeFileName = null;
- int debugLevel = 0;
- for (int i = 0; ; i += 2) {
- if (i > (args.length - 1)) {
- usage("Option parsing error");
- }
- if ("-version".equals(args[i])) {
- System.out.print(VERSION_STRING);
- System.out.println(" (java version " + System.getProperty("java.version") + ")");
- System.exit(0);
- }
-
- if ("-h".equals(args[i]) || "-help".equals(args[i])) {
- usage(null);
- }
-
- if (i == (args.length - 1)) {
- break;
- }
- String key = args[i];
- String value = args[i+1];
- if ("-stack".equals(key)) {
- callStack = booleanValue(value);
- } else if ("-refs".equals(key)) {
- calculateRefs = booleanValue(value);
- } else if ("-port".equals(key)) {
- portNumber = Integer.parseInt(value, 10);
- } else if ("-exclude".equals(key)) {
- excludeFileName = value;
- } else if ("-baseline".equals(key)) {
- baselineDump = value;
- } else if ("-debug".equals(key)) {
- debugLevel = Integer.parseInt(value, 10);
- } else if ("-parseonly".equals(key)) {
- // Undocumented option. To be used for testing purpose only
- parseonly = booleanValue(value);
- }
- }
- String fileName = args[args.length - 1];
- Snapshot model = null;
- File excludeFile = null;
- if (excludeFileName != null) {
- excludeFile = new File(excludeFileName);
- if (!excludeFile.exists()) {
- System.out.println("Exclude file " + excludeFile
- + " does not exist. Aborting.");
- System.exit(1);
- }
- }
-
- System.out.println("Reading from " + fileName + "...");
- try {
- model = com.sun.tools.hat.internal.parser.Reader.readFile(fileName, callStack, debugLevel);
- } catch (IOException ex) {
- ex.printStackTrace();
- System.exit(1);
- } catch (RuntimeException ex) {
- ex.printStackTrace();
- System.exit(1);
- }
- System.out.println("Snapshot read, resolving...");
- model.resolve(calculateRefs);
- System.out.println("Snapshot resolved.");
-
- if (excludeFile != null) {
- model.setReachableExcludes(new ReachableExcludesImpl(excludeFile));
- }
-
- if (baselineDump != null) {
- System.out.println("Reading baseline snapshot...");
- Snapshot baseline = null;
- try {
- baseline = com.sun.tools.hat.internal.parser.Reader.readFile(baselineDump, false,
- debugLevel);
- } catch (IOException ex) {
- ex.printStackTrace();
- System.exit(1);
- } catch (RuntimeException ex) {
- ex.printStackTrace();
- System.exit(1);
- }
- baseline.resolve(false);
- System.out.println("Discovering new objects...");
- model.markNewRelativeTo(baseline);
- baseline = null; // Guard against conservative GC
- }
- if ( debugLevel == 2 ) {
- System.out.println("No server, -debug 2 was used.");
- System.exit(0);
- }
-
- if (parseonly) {
- // do not start web server.
- System.out.println("-parseonly is true, exiting..");
- System.exit(0);
- }
-
- QueryListener listener = new QueryListener(portNumber);
- listener.setModel(model);
- Thread t = new Thread(listener, "Query Listener");
- t.setPriority(Thread.NORM_PRIORITY+1);
- t.start();
- System.out.println("Started HTTP server on port " + portNumber);
- System.out.println("Server is ready.");
- }
-}
--- a/jdk/src/jdk.dev/share/classes/com/sun/tools/hat/internal/model/AbstractJavaHeapObjectVisitor.java Thu May 21 10:07:38 2015 -0700
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,60 +0,0 @@
-/*
- * Copyright (c) 1997, 2008, Oracle and/or its affiliates. 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. Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-
-/*
- * The Original Code is HAT. The Initial Developer of the
- * Original Code is Bill Foote, with contributions from others
- * at JavaSoft/Sun.
- */
-
-package com.sun.tools.hat.internal.model;
-
-/**
- * A visitor for a JavaThing. @see JavaObject#visitReferencedObjects()
- *
- */
-
-
-abstract public class AbstractJavaHeapObjectVisitor
- implements JavaHeapObjectVisitor {
- abstract public void visit(JavaHeapObject other);
-
- /**
- * Should the given field be excluded from the set of things visited?
- * @return true if it should.
- */
- public boolean exclude(JavaClass clazz, JavaField f) {
- return false;
- }
-
- /**
- * @return true iff exclude might ever return true
- */
- public boolean mightExclude() {
- return false;
- }
-
-}
--- a/jdk/src/jdk.dev/share/classes/com/sun/tools/hat/internal/model/ArrayTypeCodes.java Thu May 21 10:07:38 2015 -0700
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,50 +0,0 @@
-/*
- * Copyright (c) 1997, 2008, Oracle and/or its affiliates. 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. Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-
-/*
- * The Original Code is HAT. The Initial Developer of the
- * Original Code is Bill Foote, with contributions from others
- * at JavaSoft/Sun.
- */
-
-package com.sun.tools.hat.internal.model;
-
-/**
- * Primitive array type codes as defined by VM specification.
- *
- */
-public interface ArrayTypeCodes {
- // Typecodes for array elements.
- // Refer to newarray instruction in VM Spec.
- public static final int T_BOOLEAN = 4;
- public static final int T_CHAR = 5;
- public static final int T_FLOAT = 6;
- public static final int T_DOUBLE = 7;
- public static final int T_BYTE = 8;
- public static final int T_SHORT = 9;
- public static final int T_INT = 10;
- public static final int T_LONG = 11;
-}
--- a/jdk/src/jdk.dev/share/classes/com/sun/tools/hat/internal/model/HackJavaValue.java Thu May 21 10:07:38 2015 -0700
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,65 +0,0 @@
-/*
- * Copyright (c) 1997, 2008, Oracle and/or its affiliates. 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. Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-
-/*
- * The Original Code is HAT. The Initial Developer of the
- * Original Code is Bill Foote, with contributions from others
- * at JavaSoft/Sun.
- */
-
-package com.sun.tools.hat.internal.model;
-
-/**
- * This is used to represent values that the program doesn't really understand.
- * This includes the null vlaue, and unresolved references (which shouldn't
- * happen in well-formed hprof files).
- *
- *
- * @author Bill Foote
- */
-
-
-
-
-public class HackJavaValue extends JavaValue {
-
- private String value;
- private int size;
-
- public HackJavaValue(String value, int size) {
- this.value = value;
- this.size = size;
- }
-
- public String toString() {
- return value;
- }
-
- public int getSize() {
- return size;
- }
-
-}
--- a/jdk/src/jdk.dev/share/classes/com/sun/tools/hat/internal/model/JavaBoolean.java Thu May 21 10:07:38 2015 -0700
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,54 +0,0 @@
-/*
- * Copyright (c) 1997, 2008, Oracle and/or its affiliates. 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. Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-
-/*
- * The Original Code is HAT. The Initial Developer of the
- * Original Code is Bill Foote, with contributions from others
- * at JavaSoft/Sun.
- */
-
-package com.sun.tools.hat.internal.model;
-
-/**
- * Represents a boolean (i.e. a boolean field in an instance).
- *
- * @author Bill Foote
- */
-
-
-public class JavaBoolean extends JavaValue {
-
- boolean value;
-
- public JavaBoolean(boolean value) {
- this.value = value;
- }
-
- public String toString() {
- return "" + value;
- }
-
-}
--- a/jdk/src/jdk.dev/share/classes/com/sun/tools/hat/internal/model/JavaByte.java Thu May 21 10:07:38 2015 -0700
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,54 +0,0 @@
-/*
- * Copyright (c) 1997, 2008, Oracle and/or its affiliates. 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. Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-
-/*
- * The Original Code is HAT. The Initial Developer of the
- * Original Code is Bill Foote, with contributions from others
- * at JavaSoft/Sun.
- */
-
-package com.sun.tools.hat.internal.model;
-
-/**
- * Represents an byte (i.e. a byte field in an instance).
- *
- * @author Bill Foote
- */
-
-
-public class JavaByte extends JavaValue {
-
- byte value;
-
- public JavaByte(byte value) {
- this.value = value;
- }
-
- public String toString() {
- return "0x" + Integer.toString(((int) value) & 0xff, 16);
- }
-
-}
--- a/jdk/src/jdk.dev/share/classes/com/sun/tools/hat/internal/model/JavaChar.java Thu May 21 10:07:38 2015 -0700
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,54 +0,0 @@
-/*
- * Copyright (c) 1997, 2008, Oracle and/or its affiliates. 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. Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-
-/*
- * The Original Code is HAT. The Initial Developer of the
- * Original Code is Bill Foote, with contributions from others
- * at JavaSoft/Sun.
- */
-
-package com.sun.tools.hat.internal.model;
-
-/**
- * Represents a char (i.e. a char field in an instance).
- *
- * @author Bill Foote
- */
-
-
-public class JavaChar extends JavaValue {
-
- char value;
-
- public JavaChar(char value) {
- this.value = value;
- }
-
- public String toString() {
- return "" + value;
- }
-
-}
--- a/jdk/src/jdk.dev/share/classes/com/sun/tools/hat/internal/model/JavaClass.java Thu May 21 10:07:38 2015 -0700
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,503 +0,0 @@
-/*
- * Copyright (c) 1997, 2014, Oracle and/or its affiliates. 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. Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-
-/*
- * The Original Code is HAT. The Initial Developer of the
- * Original Code is Bill Foote, with contributions from others
- * at JavaSoft/Sun.
- */
-
-package com.sun.tools.hat.internal.model;
-
-import java.util.Vector;
-import java.util.Enumeration;
-import com.sun.tools.hat.internal.util.CompositeEnumeration;
-import com.sun.tools.hat.internal.parser.ReadBuffer;
-
-/**
- *
- * @author Bill Foote
- */
-
-
-public class JavaClass extends JavaHeapObject {
- // my id
- private long id;
- // my name
- private String name;
-
- // These are JavaObjectRef before resolve
- private JavaThing superclass;
- private JavaThing loader;
- private JavaThing signers;
- private JavaThing protectionDomain;
-
- // non-static fields
- private JavaField[] fields;
- // static fields
- private JavaStatic[] statics;
-
- private static final JavaClass[] EMPTY_CLASS_ARRAY = new JavaClass[0];
- // my subclasses
- private JavaClass[] subclasses = EMPTY_CLASS_ARRAY;
-
- // my instances
- private Vector<JavaHeapObject> instances = new Vector<JavaHeapObject>();
-
- // Who I belong to. Set on resolve.
- private Snapshot mySnapshot;
-
- // Size of an instance, including VM overhead
- private int instanceSize;
- // Total number of fields including inherited ones
- private int totalNumFields;
-
-
- public JavaClass(long id, String name, long superclassId, long loaderId,
- long signersId, long protDomainId,
- JavaField[] fields, JavaStatic[] statics,
- int instanceSize) {
- this.id = id;
- this.name = name;
- this.superclass = new JavaObjectRef(superclassId);
- this.loader = new JavaObjectRef(loaderId);
- this.signers = new JavaObjectRef(signersId);
- this.protectionDomain = new JavaObjectRef(protDomainId);
- this.fields = fields;
- this.statics = statics;
- this.instanceSize = instanceSize;
- }
-
- public JavaClass(String name, long superclassId, long loaderId,
- long signersId, long protDomainId,
- JavaField[] fields, JavaStatic[] statics,
- int instanceSize) {
- this(-1L, name, superclassId, loaderId, signersId,
- protDomainId, fields, statics, instanceSize);
- }
-
- public final JavaClass getClazz() {
- return mySnapshot.getJavaLangClass();
- }
-
- public final int getIdentifierSize() {
- return mySnapshot.getIdentifierSize();
- }
-
- public final int getMinimumObjectSize() {
- return mySnapshot.getMinimumObjectSize();
- }
-
- public void resolve(Snapshot snapshot) {
- if (mySnapshot != null) {
- return;
- }
- mySnapshot = snapshot;
- resolveSuperclass(snapshot);
- if (superclass != null) {
- ((JavaClass) superclass).addSubclass(this);
- }
-
- loader = loader.dereference(snapshot, null);
- signers = signers.dereference(snapshot, null);
- protectionDomain = protectionDomain.dereference(snapshot, null);
-
- for (int i = 0; i < statics.length; i++) {
- statics[i].resolve(this, snapshot);
- }
- snapshot.getJavaLangClass().addInstance(this);
- super.resolve(snapshot);
- return;
- }
-
- /**
- * Resolve our superclass. This might be called well before
- * all instances are available (like when reading deferred
- * instances in a 1.2 dump file :-) Calling this is sufficient
- * to be able to explore this class' fields.
- */
- public void resolveSuperclass(Snapshot snapshot) {
- if (superclass == null) {
- // We must be java.lang.Object, so we have no superclass.
- } else {
- totalNumFields = fields.length;
- superclass = superclass.dereference(snapshot, null);
- if (superclass == snapshot.getNullThing()) {
- superclass = null;
- } else {
- try {
- JavaClass sc = (JavaClass) superclass;
- sc.resolveSuperclass(snapshot);
- totalNumFields += sc.totalNumFields;
- } catch (ClassCastException ex) {
- System.out.println("Warning! Superclass of " + name + " is " + superclass);
- superclass = null;
- }
- }
- }
- }
-
- public boolean isString() {
- return mySnapshot.getJavaLangString() == this;
- }
-
- public boolean isClassLoader() {
- return mySnapshot.getJavaLangClassLoader().isAssignableFrom(this);
- }
-
- /**
- * Get a numbered field from this class
- */
- public JavaField getField(int i) {
- if (i < 0 || i >= fields.length) {
- throw new Error("No field " + i + " for " + name);
- }
- return fields[i];
- }
-
- /**
- * Get the total number of fields that are part of an instance of
- * this class. That is, include superclasses.
- */
- public int getNumFieldsForInstance() {
- return totalNumFields;
- }
-
- /**
- * Get a numbered field from all the fields that are part of instance
- * of this class. That is, include superclasses.
- */
- public JavaField getFieldForInstance(int i) {
- if (superclass != null) {
- JavaClass sc = (JavaClass) superclass;
- if (i < sc.totalNumFields) {
- return sc.getFieldForInstance(i);
- }
- i -= sc.totalNumFields;
- }
- return getField(i);
- }
-
- /**
- * Get the class responsible for field i, where i is a field number that
- * could be passed into getFieldForInstance.
- *
- * @see JavaClass.getFieldForInstance()
- */
- public JavaClass getClassForField(int i) {
- if (superclass != null) {
- JavaClass sc = (JavaClass) superclass;
- if (i < sc.totalNumFields) {
- return sc.getClassForField(i);
- }
- }
- return this;
- }
-
- public long getId() {
- return id;
- }
-
- public String getName() {
- return name;
- }
-
- public boolean isArray() {
- return name.indexOf('[') != -1;
- }
-
- public Enumeration<JavaHeapObject> getInstances(boolean includeSubclasses) {
- if (includeSubclasses) {
- Enumeration<JavaHeapObject> res = instances.elements();
- for (int i = 0; i < subclasses.length; i++) {
- res = new CompositeEnumeration(res,
- subclasses[i].getInstances(true));
- }
- return res;
- } else {
- return instances.elements();
- }
- }
-
- /**
- * @return a count of the instances of this class
- */
- public int getInstancesCount(boolean includeSubclasses) {
- int result = instances.size();
- if (includeSubclasses) {
- for (int i = 0; i < subclasses.length; i++) {
- result += subclasses[i].getInstancesCount(includeSubclasses);
- }
- }
- return result;
- }
-
- public JavaClass[] getSubclasses() {
- return subclasses;
- }
-
- /**
- * This can only safely be called after resolve()
- */
- public JavaClass getSuperclass() {
- return (JavaClass) superclass;
- }
-
- /**
- * This can only safely be called after resolve()
- */
- public JavaThing getLoader() {
- return loader;
- }
-
- /**
- * This can only safely be called after resolve()
- */
- public boolean isBootstrap() {
- return loader == mySnapshot.getNullThing();
- }
-
- /**
- * This can only safely be called after resolve()
- */
- public JavaThing getSigners() {
- return signers;
- }
-
- /**
- * This can only safely be called after resolve()
- */
- public JavaThing getProtectionDomain() {
- return protectionDomain;
- }
-
- public JavaField[] getFields() {
- return fields;
- }
-
- /**
- * Includes superclass fields
- */
- public JavaField[] getFieldsForInstance() {
- Vector<JavaField> v = new Vector<JavaField>();
- addFields(v);
- JavaField[] result = new JavaField[v.size()];
- for (int i = 0; i < v.size(); i++) {
- result[i] = v.elementAt(i);
- }
- return result;
- }
-
-
- public JavaStatic[] getStatics() {
- return statics;
- }
-
- // returns value of static field of given name
- public JavaThing getStaticField(String name) {
- for (int i = 0; i < statics.length; i++) {
- JavaStatic s = statics[i];
- if (s.getField().getName().equals(name)) {
- return s.getValue();
- }
- }
- return null;
- }
-
- public String toString() {
- return "class " + name;
- }
-
- public int compareTo(JavaThing other) {
- if (other instanceof JavaClass) {
- return name.compareTo(((JavaClass) other).name);
- }
- return super.compareTo(other);
- }
-
-
- /**
- * @return true iff a variable of type this is assignable from an instance
- * of other
- */
- public boolean isAssignableFrom(JavaClass other) {
- if (this == other) {
- return true;
- } else if (other == null) {
- return false;
- } else {
- return isAssignableFrom((JavaClass) other.superclass);
- // Trivial tail recursion: I have faith in javac.
- }
- }
-
- /**
- * Describe the reference that this thing has to target. This will only
- * be called if target is in the array returned by getChildrenForRootset.
- */
- public String describeReferenceTo(JavaThing target, Snapshot ss) {
- for (int i = 0; i < statics.length; i++) {
- JavaField f = statics[i].getField();
- if (f.hasId()) {
- JavaThing other = statics[i].getValue();
- if (other == target) {
- return "static field " + f.getName();
- }
- }
- }
- return super.describeReferenceTo(target, ss);
- }
-
- /**
- * @return the size of an instance of this class. Gives 0 for an array
- * type.
- */
- public int getInstanceSize() {
- return instanceSize + mySnapshot.getMinimumObjectSize();
- }
-
-
- /**
- * @return The size of all instances of this class. Correctly handles
- * arrays.
- */
- public long getTotalInstanceSize() {
- int count = instances.size();
- if (count == 0 || !isArray()) {
- return count * instanceSize;
- }
-
- // array class and non-zero count, we have to
- // get the size of each instance and sum it
- long result = 0;
- for (int i = 0; i < count; i++) {
- JavaThing t = (JavaThing) instances.elementAt(i);
- result += t.getSize();
- }
- return result;
- }
-
- /**
- * @return the size of this object
- */
- public int getSize() {
- JavaClass cl = mySnapshot.getJavaLangClass();
- if (cl == null) {
- return 0;
- } else {
- return cl.getInstanceSize();
- }
- }
-
- public void visitReferencedObjects(JavaHeapObjectVisitor v) {
- super.visitReferencedObjects(v);
- JavaHeapObject sc = getSuperclass();
- if (sc != null) v.visit(getSuperclass());
-
- JavaThing other;
- other = getLoader();
- if (other instanceof JavaHeapObject) {
- v.visit((JavaHeapObject)other);
- }
- other = getSigners();
- if (other instanceof JavaHeapObject) {
- v.visit((JavaHeapObject)other);
- }
- other = getProtectionDomain();
- if (other instanceof JavaHeapObject) {
- v.visit((JavaHeapObject)other);
- }
-
- for (int i = 0; i < statics.length; i++) {
- JavaField f = statics[i].getField();
- if (!v.exclude(this, f) && f.hasId()) {
- other = statics[i].getValue();
- if (other instanceof JavaHeapObject) {
- v.visit((JavaHeapObject) other);
- }
- }
- }
- }
-
- // package-privates below this point
- final ReadBuffer getReadBuffer() {
- return mySnapshot.getReadBuffer();
- }
-
- final void setNew(JavaHeapObject obj, boolean flag) {
- mySnapshot.setNew(obj, flag);
- }
-
- final boolean isNew(JavaHeapObject obj) {
- return mySnapshot.isNew(obj);
- }
-
- final StackTrace getSiteTrace(JavaHeapObject obj) {
- return mySnapshot.getSiteTrace(obj);
- }
-
- final void addReferenceFromRoot(Root root, JavaHeapObject obj) {
- mySnapshot.addReferenceFromRoot(root, obj);
- }
-
- final Root getRoot(JavaHeapObject obj) {
- return mySnapshot.getRoot(obj);
- }
-
- final Snapshot getSnapshot() {
- return mySnapshot;
- }
-
- void addInstance(JavaHeapObject inst) {
- instances.addElement(inst);
- }
-
- // Internals only below this point
- private void addFields(Vector<JavaField> v) {
- if (superclass != null) {
- ((JavaClass) superclass).addFields(v);
- }
- for (int i = 0; i < fields.length; i++) {
- v.addElement(fields[i]);
- }
- }
-
- private void addSubclassInstances(Vector<JavaHeapObject> v) {
- for (int i = 0; i < subclasses.length; i++) {
- subclasses[i].addSubclassInstances(v);
- }
- for (int i = 0; i < instances.size(); i++) {
- v.addElement(instances.elementAt(i));
- }
- }
-
- private void addSubclass(JavaClass sub) {
- JavaClass newValue[] = new JavaClass[subclasses.length + 1];
- System.arraycopy(subclasses, 0, newValue, 0, subclasses.length);
- newValue[subclasses.length] = sub;
- subclasses = newValue;
- }
-}
--- a/jdk/src/jdk.dev/share/classes/com/sun/tools/hat/internal/model/JavaDouble.java Thu May 21 10:07:38 2015 -0700
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,53 +0,0 @@
-/*
- * Copyright (c) 1997, 2008, Oracle and/or its affiliates. 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. Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-
-/*
- * The Original Code is HAT. The Initial Developer of the
- * Original Code is Bill Foote, with contributions from others
- * at JavaSoft/Sun.
- */
-
-package com.sun.tools.hat.internal.model;
-
-/**
- * Represents a double (i.e. a double field in an instance).
- *
- * @author Bill Foote
- */
-
-
-public class JavaDouble extends JavaValue {
-
- double value;
-
- public JavaDouble(double value) {
- this.value = value;
- }
-
- public String toString() {
- return Double.toString(value);
- }
-}
--- a/jdk/src/jdk.dev/share/classes/com/sun/tools/hat/internal/model/JavaField.java Thu May 21 10:07:38 2015 -0700
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,69 +0,0 @@
-/*
- * Copyright (c) 1997, 2008, Oracle and/or its affiliates. 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. Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-
-/*
- * The Original Code is HAT. The Initial Developer of the
- * Original Code is Bill Foote, with contributions from others
- * at JavaSoft/Sun.
- */
-
-package com.sun.tools.hat.internal.model;
-
-
-/**
- *
- * @author Bill Foote
- */
-
-public class JavaField {
-
- private String name;
- private String signature;
-
- public JavaField(String name, String signature) {
- this.name = name;
- this.signature = signature;
- }
-
-
- /**
- * @return true if the type of this field is something that has an ID.
- * int fields, for exampe, don't.
- */
- public boolean hasId() {
- char ch = signature.charAt(0);
- return (ch == '[' || ch == 'L');
- }
-
- public String getName() {
- return name;
- }
-
- public String getSignature() {
- return signature;
- }
-
-}
--- a/jdk/src/jdk.dev/share/classes/com/sun/tools/hat/internal/model/JavaFloat.java Thu May 21 10:07:38 2015 -0700
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,53 +0,0 @@
-/*
- * Copyright (c) 1997, 2008, Oracle and/or its affiliates. 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. Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-
-/*
- * The Original Code is HAT. The Initial Developer of the
- * Original Code is Bill Foote, with contributions from others
- * at JavaSoft/Sun.
- */
-
-package com.sun.tools.hat.internal.model;
-
-/**
- * Represents a float (i.e. a float field in an instance).
- *
- * @author Bill Foote
- */
-
-
-public class JavaFloat extends JavaValue {
-
- float value;
-
- public JavaFloat(float value) {
- this.value = value;
- }
-
- public String toString() {
- return Float.toString(value);
- }
-}
--- a/jdk/src/jdk.dev/share/classes/com/sun/tools/hat/internal/model/JavaHeapObject.java Thu May 21 10:07:38 2015 -0700
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,207 +0,0 @@
-/*
- * Copyright (c) 1997, 2014, Oracle and/or its affiliates. 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. Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-
-/*
- * The Original Code is HAT. The Initial Developer of the
- * Original Code is Bill Foote, with contributions from others
- * at JavaSoft/Sun.
- */
-
-package com.sun.tools.hat.internal.model;
-
-import java.util.Enumeration;
-import java.util.HashMap;
-import java.util.Map;
-import com.sun.tools.hat.internal.util.Misc;
-
-
-/**
- *
- * @author Bill Foote
- */
-
-/**
- * Represents an object that's allocated out of the Java heap. It occupies
- * memory in the VM, and is the sort of thing that in a JDK 1.1 VM had
- * a handle. It can be a
- * JavaClass, a JavaObjectArray, a JavaValueArray or a JavaObject.
- */
-
-public abstract class JavaHeapObject extends JavaThing {
-
- //
- // Who we refer to. This is heavily optimized for space, because it's
- // well worth trading a bit of speed for less swapping.
- // referers and referersLen go through two phases: Building and
- // resolved. When building, referers might have duplicates, but can
- // be appended to. When resolved, referers has no duplicates or
- // empty slots.
- //
- private JavaThing[] referers = null;
- private int referersLen = 0; // -1 when resolved
-
- public abstract JavaClass getClazz();
- public abstract int getSize();
- public abstract long getId();
-
- /**
- * Do any initialization this thing needs after its data is read in.
- * Subclasses that override this should call super.resolve().
- */
- public void resolve(Snapshot snapshot) {
- StackTrace trace = snapshot.getSiteTrace(this);
- if (trace != null) {
- trace.resolve(snapshot);
- }
- }
-
- //
- // Eliminate duplicates from referers, and size the array exactly.
- // This sets us up to answer queries. See the comments around the
- // referers data member for details.
- //
- void setupReferers() {
- if (referersLen > 1) {
- // Copy referers to map, screening out duplicates
- Map<JavaThing, JavaThing> map = new HashMap<JavaThing, JavaThing>();
- for (int i = 0; i < referersLen; i++) {
- if (map.get(referers[i]) == null) {
- map.put(referers[i], referers[i]);
- }
- }
-
- // Now copy into the array
- referers = new JavaThing[map.size()];
- map.keySet().toArray(referers);
- }
- referersLen = -1;
- }
-
-
- /**
- * @return the id of this thing as hex string
- */
- public String getIdString() {
- return Misc.toHex(getId());
- }
-
- public String toString() {
- return getClazz().getName() + "@" + getIdString();
- }
-
- /**
- * @return the StackTrace of the point of allocation of this object,
- * or null if unknown
- */
- public StackTrace getAllocatedFrom() {
- return getClazz().getSiteTrace(this);
- }
-
- public boolean isNew() {
- return getClazz().isNew(this);
- }
-
- void setNew(boolean flag) {
- getClazz().setNew(this, flag);
- }
-
- /**
- * Tell the visitor about all of the objects we refer to
- */
- public void visitReferencedObjects(JavaHeapObjectVisitor v) {
- v.visit(getClazz());
- }
-
- void addReferenceFrom(JavaHeapObject other) {
- if (referersLen == 0) {
- referers = new JavaThing[1]; // It was null
- } else if (referersLen == referers.length) {
- JavaThing[] copy = new JavaThing[(3 * (referersLen + 1)) / 2];
- System.arraycopy(referers, 0, copy, 0, referersLen);
- referers = copy;
- }
- referers[referersLen++] = other;
- // We just append to referers here. Measurements have shown that
- // around 10% to 30% are duplicates, so it's better to just append
- // blindly and screen out all the duplicates at once.
- }
-
- void addReferenceFromRoot(Root r) {
- getClazz().addReferenceFromRoot(r, this);
- }
-
- /**
- * If the rootset includes this object, return a Root describing one
- * of the reasons why.
- */
- public Root getRoot() {
- return getClazz().getRoot(this);
- }
-
- /**
- * Tell who refers to us.
- *
- * @return an Enumeration of JavaHeapObject instances
- */
- public Enumeration<JavaThing> getReferers() {
- if (referersLen != -1) {
- throw new RuntimeException("not resolved: " + getIdString());
- }
- return new Enumeration<JavaThing>() {
-
- private int num = 0;
-
- public boolean hasMoreElements() {
- return referers != null && num < referers.length;
- }
-
- public JavaThing nextElement() {
- return referers[num++];
- }
- };
- }
-
- /**
- * Given other, which the caller promises is in referers, determines if
- * the reference is only a weak reference.
- */
- public boolean refersOnlyWeaklyTo(Snapshot ss, JavaThing other) {
- return false;
- }
-
- /**
- * Describe the reference that this thing has to target. This will only
- * be called if target is in the array returned by getChildrenForRootset.
- */
- public String describeReferenceTo(JavaThing target, Snapshot ss) {
- return "??";
- }
-
- public boolean isHeapAllocated() {
- return true;
- }
-
-}
--- a/jdk/src/jdk.dev/share/classes/com/sun/tools/hat/internal/model/JavaHeapObjectVisitor.java Thu May 21 10:07:38 2015 -0700
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,55 +0,0 @@
-/*
- * Copyright (c) 1997, 2008, Oracle and/or its affiliates. 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. Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-
-/*
- * The Original Code is HAT. The Initial Developer of the
- * Original Code is Bill Foote, with contributions from others
- * at JavaSoft/Sun.
- */
-
-package com.sun.tools.hat.internal.model;
-
-/**
- * A visitor for a JavaThing. @see JavaObject#visitReferencedObjects()
- *
- * @author Bill Foote
- */
-
-
-public interface JavaHeapObjectVisitor {
- public void visit(JavaHeapObject other);
-
- /**
- * Should the given field be excluded from the set of things visited?
- * @return true if it should.
- */
- public boolean exclude(JavaClass clazz, JavaField f);
-
- /**
- * @return true iff exclude might ever return true
- */
- public boolean mightExclude();
-}
--- a/jdk/src/jdk.dev/share/classes/com/sun/tools/hat/internal/model/JavaInt.java Thu May 21 10:07:38 2015 -0700
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,54 +0,0 @@
-/*
- * Copyright (c) 1997, 2008, Oracle and/or its affiliates. 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. Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-
-/*
- * The Original Code is HAT. The Initial Developer of the
- * Original Code is Bill Foote, with contributions from others
- * at JavaSoft/Sun.
- */
-
-package com.sun.tools.hat.internal.model;
-
-/**
- * Represents an integer (i.e. an int field in an instance).
- *
- * @author Bill Foote
- */
-
-
-public class JavaInt extends JavaValue {
-
- int value;
-
- public JavaInt(int value) {
- this.value = value;
- }
-
- public String toString() {
- return "" + value;
- }
-
-}
--- a/jdk/src/jdk.dev/share/classes/com/sun/tools/hat/internal/model/JavaLazyReadObject.java Thu May 21 10:07:38 2015 -0700
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,176 +0,0 @@
-/*
- * Copyright (c) 1997, 2008, Oracle and/or its affiliates. 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. Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-
-/*
- * The Original Code is HAT. The Initial Developer of the
- * Original Code is Bill Foote, with contributions from others
- * at JavaSoft/Sun.
- */
-
-package com.sun.tools.hat.internal.model;
-
-import java.io.IOException;
-import com.sun.tools.hat.internal.parser.ReadBuffer;
-
-/*
- * Base class for lazily read Java heap objects.
- */
-public abstract class JavaLazyReadObject extends JavaHeapObject {
-
- // file offset from which this object data starts
- private final long offset;
-
- protected JavaLazyReadObject(long offset) {
- this.offset = offset;
- }
-
- public final int getSize() {
- return getValueLength() + getClazz().getMinimumObjectSize();
- }
-
- protected final long getOffset() {
- return offset;
- }
-
- // return the length of the data for this object
- protected final int getValueLength() {
- try {
- return readValueLength();
- } catch (IOException exp) {
- System.err.println("lazy read failed at offset " + offset);
- exp.printStackTrace();
- return 0;
- }
- }
-
- // get this object's content as byte array
- protected final byte[] getValue() {
- try {
- return readValue();
- } catch (IOException exp) {
- System.err.println("lazy read failed at offset " + offset);
- exp.printStackTrace();
- return Snapshot.EMPTY_BYTE_ARRAY;
- }
- }
-
- // get ID of this object
- public final long getId() {
- try {
- ReadBuffer buf = getClazz().getReadBuffer();
- int idSize = getClazz().getIdentifierSize();
- if (idSize == 4) {
- return ((long)buf.getInt(offset)) & Snapshot.SMALL_ID_MASK;
- } else {
- return buf.getLong(offset);
- }
- } catch (IOException exp) {
- System.err.println("lazy read failed at offset " + offset);
- exp.printStackTrace();
- return -1;
- }
- }
-
- protected abstract int readValueLength() throws IOException;
- protected abstract byte[] readValue() throws IOException;
-
- // make Integer or Long for given object ID
- protected static Number makeId(long id) {
- if ((id & ~Snapshot.SMALL_ID_MASK) == 0) {
- return (int)id;
- } else {
- return id;
- }
- }
-
- // get ID as long value from Number
- protected static long getIdValue(Number num) {
- long id = num.longValue();
- if (num instanceof Integer) {
- id &= Snapshot.SMALL_ID_MASK;
- }
- return id;
- }
-
- // read object ID from given index from given byte array
- protected final long objectIdAt(int index, byte[] data) {
- int idSize = getClazz().getIdentifierSize();
- if (idSize == 4) {
- return ((long)intAt(index, data)) & Snapshot.SMALL_ID_MASK;
- } else {
- return longAt(index, data);
- }
- }
-
- // utility methods to read primitive types from byte array
- protected static byte byteAt(int index, byte[] value) {
- return value[index];
- }
-
- protected static boolean booleanAt(int index, byte[] value) {
- return (value[index] & 0xff) == 0? false: true;
- }
-
- protected static char charAt(int index, byte[] value) {
- int b1 = ((int) value[index++] & 0xff);
- int b2 = ((int) value[index++] & 0xff);
- return (char) ((b1 << 8) + b2);
- }
-
- protected static short shortAt(int index, byte[] value) {
- int b1 = ((int) value[index++] & 0xff);
- int b2 = ((int) value[index++] & 0xff);
- return (short) ((b1 << 8) + b2);
- }
-
- protected static int intAt(int index, byte[] value) {
- int b1 = ((int) value[index++] & 0xff);
- int b2 = ((int) value[index++] & 0xff);
- int b3 = ((int) value[index++] & 0xff);
- int b4 = ((int) value[index++] & 0xff);
- return ((b1 << 24) + (b2 << 16) + (b3 << 8) + b4);
- }
-
- protected static long longAt(int index, byte[] value) {
- long val = 0;
- for (int j = 0; j < 8; j++) {
- val = val << 8;
- int b = ((int)value[index++]) & 0xff;
- val |= b;
- }
- return val;
- }
-
- protected static float floatAt(int index, byte[] value) {
- int val = intAt(index, value);
- return Float.intBitsToFloat(val);
- }
-
- protected static double doubleAt(int index, byte[] value) {
- long val = longAt(index, value);
- return Double.longBitsToDouble(val);
- }
-}
--- a/jdk/src/jdk.dev/share/classes/com/sun/tools/hat/internal/model/JavaLong.java Thu May 21 10:07:38 2015 -0700
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,53 +0,0 @@
-/*
- * Copyright (c) 1997, 2008, Oracle and/or its affiliates. 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. Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-
-/*
- * The Original Code is HAT. The Initial Developer of the
- * Original Code is Bill Foote, with contributions from others
- * at JavaSoft/Sun.
- */
-
-package com.sun.tools.hat.internal.model;
-
-/**
- * Represents a long (i.e. a long field in an instance).
- *
- * @author Bill Foote
- */
-
-
-public class JavaLong extends JavaValue {
-
- long value;
-
- public JavaLong(long value) {
- this.value = value;
- }
-
- public String toString() {
- return Long.toString(value);
- }
-}
--- a/jdk/src/jdk.dev/share/classes/com/sun/tools/hat/internal/model/JavaObject.java Thu May 21 10:07:38 2015 -0700
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,334 +0,0 @@
-/*
- * Copyright (c) 1997, 2008, Oracle and/or its affiliates. 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. Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-
-/*
- * The Original Code is HAT. The Initial Developer of the
- * Original Code is Bill Foote, with contributions from others
- * at JavaSoft/Sun.
- */
-
-package com.sun.tools.hat.internal.model;
-
-import java.io.IOException;
-import com.sun.tools.hat.internal.parser.ReadBuffer;
-
-/**
- * Represents Java instance
- *
- * @author Bill Foote
- */
-public class JavaObject extends JavaLazyReadObject {
-
- private Object clazz; // Number before resolve
- // JavaClass after resolve
- /**
- * Construct a new JavaObject.
- *
- * @param classID id of the class object
- * @param offset The offset of field data
- */
- public JavaObject(long classID, long offset) {
- super(offset);
- this.clazz = makeId(classID);
- }
-
- public void resolve(Snapshot snapshot) {
- if (clazz instanceof JavaClass) {
- return;
- }
- if (clazz instanceof Number) {
- long classID = getIdValue((Number)clazz);
- clazz = snapshot.findThing(classID);
- if (! (clazz instanceof JavaClass)) {
- warn("Class " + Long.toHexString(classID) + " not found, " +
- "adding fake class!");
- int length;
- ReadBuffer buf = snapshot.getReadBuffer();
- int idSize = snapshot.getIdentifierSize();
- long lenOffset = getOffset() + 2*idSize + 4;
- try {
- length = buf.getInt(lenOffset);
- } catch (IOException exp) {
- throw new RuntimeException(exp);
- }
- clazz = snapshot.addFakeInstanceClass(classID, length);
- }
- } else {
- throw new InternalError("should not reach here");
- }
-
- JavaClass cl = (JavaClass) clazz;
- cl.resolve(snapshot);
-
- // while resolving, parse fields in verbose mode.
- // but, getFields calls parseFields in non-verbose mode
- // to avoid printing warnings repeatedly.
- parseFields(getValue(), true);
-
- cl.addInstance(this);
- super.resolve(snapshot);
- }
-
- /**
- * Are we the same type as other? We are iff our clazz is the
- * same type as other's.
- */
- public boolean isSameTypeAs(JavaThing other) {
- if (!(other instanceof JavaObject)) {
- return false;
- }
- JavaObject oo = (JavaObject) other;
- return getClazz().equals(oo.getClazz());
- }
-
- /**
- * Return our JavaClass object. This may only be called after resolve.
- */
- public JavaClass getClazz() {
- return (JavaClass) clazz;
- }
-
- public JavaThing[] getFields() {
- // pass false to verbose mode so that dereference
- // warnings are not printed.
- return parseFields(getValue(), false);
- }
-
- // returns the value of field of given name
- public JavaThing getField(String name) {
- JavaThing[] flds = getFields();
- JavaField[] instFields = getClazz().getFieldsForInstance();
- for (int i = 0; i < instFields.length; i++) {
- if (instFields[i].getName().equals(name)) {
- return flds[i];
- }
- }
- return null;
- }
-
- public int compareTo(JavaThing other) {
- if (other instanceof JavaObject) {
- JavaObject oo = (JavaObject) other;
- return getClazz().getName().compareTo(oo.getClazz().getName());
- }
- return super.compareTo(other);
- }
-
- public void visitReferencedObjects(JavaHeapObjectVisitor v) {
- super.visitReferencedObjects(v);
- JavaThing[] flds = getFields();
- for (int i = 0; i < flds.length; i++) {
- if (flds[i] != null) {
- if (v.mightExclude()
- && v.exclude(getClazz().getClassForField(i),
- getClazz().getFieldForInstance(i)))
- {
- // skip it
- } else if (flds[i] instanceof JavaHeapObject) {
- v.visit((JavaHeapObject) flds[i]);
- }
- }
- }
- }
-
- public boolean refersOnlyWeaklyTo(Snapshot ss, JavaThing other) {
- if (ss.getWeakReferenceClass() != null) {
- final int referentFieldIndex = ss.getReferentFieldIndex();
- if (ss.getWeakReferenceClass().isAssignableFrom(getClazz())) {
- //
- // REMIND: This introduces a dependency on the JDK
- // implementation that is undesirable.
- JavaThing[] flds = getFields();
- for (int i = 0; i < flds.length; i++) {
- if (i != referentFieldIndex && flds[i] == other) {
- return false;
- }
- }
- return true;
- }
- }
- return false;
- }
-
- /**
- * Describe the reference that this thing has to target. This will only
- * be called if target is in the array returned by getChildrenForRootset.
- */
- public String describeReferenceTo(JavaThing target, Snapshot ss) {
- JavaThing[] flds = getFields();
- for (int i = 0; i < flds.length; i++) {
- if (flds[i] == target) {
- JavaField f = getClazz().getFieldForInstance(i);
- return "field " + f.getName();
- }
- }
- return super.describeReferenceTo(target, ss);
- }
-
- public String toString() {
- if (getClazz().isString()) {
- JavaThing value = getField("value");
- if (value instanceof JavaValueArray) {
- return ((JavaValueArray)value).valueString();
- } else {
- return "null";
- }
- } else {
- return super.toString();
- }
- }
-
- // Internals only below this point
-
- /*
- * Java instance record (HPROF_GC_INSTANCE_DUMP) looks as below:
- *
- * object ID
- * stack trace serial number (int)
- * class ID
- * data length (int)
- * byte[length]
- */
- protected final int readValueLength() throws IOException {
- JavaClass cl = getClazz();
- int idSize = cl.getIdentifierSize();
- long lengthOffset = getOffset() + 2*idSize + 4;
- return cl.getReadBuffer().getInt(lengthOffset);
- }
-
- protected final byte[] readValue() throws IOException {
- JavaClass cl = getClazz();
- int idSize = cl.getIdentifierSize();
- ReadBuffer buf = cl.getReadBuffer();
- long offset = getOffset() + 2*idSize + 4;
- int length = buf.getInt(offset);
- if (length == 0) {
- return Snapshot.EMPTY_BYTE_ARRAY;
- } else {
- byte[] res = new byte[length];
- buf.get(offset + 4, res);
- return res;
- }
- }
-
- private JavaThing[] parseFields(byte[] data, boolean verbose) {
- JavaClass cl = getClazz();
- int target = cl.getNumFieldsForInstance();
- JavaField[] fields = cl.getFields();
- JavaThing[] fieldValues = new JavaThing[target];
- Snapshot snapshot = cl.getSnapshot();
- int idSize = snapshot.getIdentifierSize();
- int fieldNo = 0;
- // In the dump file, the fields are stored in this order:
- // fields of most derived class (immediate class) are stored
- // first and then the super class and so on. In this object,
- // fields are stored in the reverse ("natural") order. i.e.,
- // fields of most super class are stored first.
-
- // target variable is used to compensate for the fact that
- // the dump file starts field values from the leaf working
- // upwards in the inheritance hierarchy, whereas JavaObject
- // starts with the top of the inheritance hierarchy and works down.
- target -= fields.length;
- JavaClass currClass = cl;
- int index = 0;
- for (int i = 0; i < fieldValues.length; i++, fieldNo++) {
- while (fieldNo >= fields.length) {
- currClass = currClass.getSuperclass();
- fields = currClass.getFields();
- fieldNo = 0;
- target -= fields.length;
- }
- JavaField f = fields[fieldNo];
- char sig = f.getSignature().charAt(0);
- switch (sig) {
- case 'L':
- case '[': {
- long id = objectIdAt(index, data);
- index += idSize;
- JavaObjectRef ref = new JavaObjectRef(id);
- fieldValues[target+fieldNo] = ref.dereference(snapshot, f, verbose);
- break;
- }
- case 'Z': {
- byte value = byteAt(index, data);
- index++;
- fieldValues[target+fieldNo] = new JavaBoolean(value != 0);
- break;
- }
- case 'B': {
- byte value = byteAt(index, data);
- index++;
- fieldValues[target+fieldNo] = new JavaByte(value);
- break;
- }
- case 'S': {
- short value = shortAt(index, data);
- index += 2;
- fieldValues[target+fieldNo] = new JavaShort(value);
- break;
- }
- case 'C': {
- char value = charAt(index, data);
- index += 2;
- fieldValues[target+fieldNo] = new JavaChar(value);
- break;
- }
- case 'I': {
- int value = intAt(index, data);
- index += 4;
- fieldValues[target+fieldNo] = new JavaInt(value);
- break;
- }
- case 'J': {
- long value = longAt(index, data);
- index += 8;
- fieldValues[target+fieldNo] = new JavaLong(value);
- break;
- }
- case 'F': {
- float value = floatAt(index, data);
- index += 4;
- fieldValues[target+fieldNo] = new JavaFloat(value);
- break;
- }
- case 'D': {
- double value = doubleAt(index, data);
- index += 8;
- fieldValues[target+fieldNo] = new JavaDouble(value);
- break;
- }
- default:
- throw new RuntimeException("invalid signature: " + sig);
- }
- }
- return fieldValues;
- }
-
- private void warn(String msg) {
- System.out.println("WARNING: " + msg);
- }
-}
--- a/jdk/src/jdk.dev/share/classes/com/sun/tools/hat/internal/model/JavaObjectArray.java Thu May 21 10:07:38 2015 -0700
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,172 +0,0 @@
-/*
- * Copyright (c) 1997, 2008, Oracle and/or its affiliates. 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. Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-
-/*
- * The Original Code is HAT. The Initial Developer of the
- * Original Code is Bill Foote, with contributions from others
- * at JavaSoft/Sun.
- */
-
-package com.sun.tools.hat.internal.model;
-
-import java.io.IOException;
-import com.sun.tools.hat.internal.parser.ReadBuffer;
-
-/**
- * @author Bill Foote
- */
-public class JavaObjectArray extends JavaLazyReadObject {
-
- private Object clazz; // Long before resolve, the class after resolve
-
- public JavaObjectArray(long classID, long offset) {
- super(offset);
- this.clazz = makeId(classID);
- }
-
- public JavaClass getClazz() {
- return (JavaClass) clazz;
- }
-
- public void resolve(Snapshot snapshot) {
- if (clazz instanceof JavaClass) {
- return;
- }
- long classID = getIdValue((Number)clazz);
- if (snapshot.isNewStyleArrayClass()) {
- // Modern heap dumps do this
- JavaThing t = snapshot.findThing(classID);
- if (t instanceof JavaClass) {
- clazz = (JavaClass) t;
- }
- }
- if (!(clazz instanceof JavaClass)) {
- JavaThing t = snapshot.findThing(classID);
- if (t != null && t instanceof JavaClass) {
- JavaClass el = (JavaClass) t;
- String nm = el.getName();
- if (!nm.startsWith("[")) {
- nm = "L" + el.getName() + ";";
- }
- clazz = snapshot.getArrayClass(nm);
- }
- }
-
- if (!(clazz instanceof JavaClass)) {
- clazz = snapshot.getOtherArrayType();
- }
- ((JavaClass)clazz).addInstance(this);
- super.resolve(snapshot);
- }
-
- public JavaThing[] getValues() {
- return getElements();
- }
-
- public JavaThing[] getElements() {
- Snapshot snapshot = getClazz().getSnapshot();
- byte[] data = getValue();
- final int idSize = snapshot.getIdentifierSize();
- final int numElements = data.length / idSize;
- JavaThing[] elements = new JavaThing[numElements];
- int index = 0;
- for (int i = 0; i < elements.length; i++) {
- long id = objectIdAt(index, data);
- index += idSize;
- elements[i] = snapshot.findThing(id);
- }
- return elements;
- }
-
- public int compareTo(JavaThing other) {
- if (other instanceof JavaObjectArray) {
- return 0;
- }
- return super.compareTo(other);
- }
-
- public int getLength() {
- return getValueLength() / getClazz().getIdentifierSize();
- }
-
- public void visitReferencedObjects(JavaHeapObjectVisitor v) {
- super.visitReferencedObjects(v);
- JavaThing[] elements = getElements();
- for (int i = 0; i < elements.length; i++) {
- if (elements[i] != null && elements[i] instanceof JavaHeapObject) {
- v.visit((JavaHeapObject) elements[i]);
- }
- }
- }
-
- /**
- * Describe the reference that this thing has to target. This will only
- * be called if target is in the array returned by getChildrenForRootset.
- */
- public String describeReferenceTo(JavaThing target, Snapshot ss) {
- JavaThing[] elements = getElements();
- for (int i = 0; i < elements.length; i++) {
- if (elements[i] == target) {
- return "Element " + i + " of " + this;
- }
- }
- return super.describeReferenceTo(target, ss);
- }
-
- /*
- * Java object array record (HPROF_GC_OBJ_ARRAY_DUMP)
- * looks as below:
- *
- * object ID
- * stack trace serial number (int)
- * array length (int)
- * array class ID
- * array element IDs
- */
- protected final int readValueLength() throws IOException {
- JavaClass cl = getClazz();
- ReadBuffer buf = cl.getReadBuffer();
- int idSize = cl.getIdentifierSize();
- long offset = getOffset() + idSize + 4;
- int len = buf.getInt(offset);
- return len * cl.getIdentifierSize();
- }
-
- protected final byte[] readValue() throws IOException {
- JavaClass cl = getClazz();
- ReadBuffer buf = cl.getReadBuffer();
- int idSize = cl.getIdentifierSize();
- long offset = getOffset() + idSize + 4;
- int len = buf.getInt(offset);
- if (len == 0) {
- return Snapshot.EMPTY_BYTE_ARRAY;
- } else {
- byte[] res = new byte[len * idSize];
- buf.get(offset + 4 + idSize, res);
- return res;
- }
- }
-}
--- a/jdk/src/jdk.dev/share/classes/com/sun/tools/hat/internal/model/JavaObjectRef.java Thu May 21 10:07:38 2015 -0700
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,97 +0,0 @@
-/*
- * Copyright (c) 1997, 2008, Oracle and/or its affiliates. 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. Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-
-/*
- * The Original Code is HAT. The Initial Developer of the
- * Original Code is Bill Foote, with contributions from others
- * at JavaSoft/Sun.
- */
-
-package com.sun.tools.hat.internal.model;
-
-import com.sun.tools.hat.internal.util.Misc;
-
-/**
- * A forward reference to an object. This is an intermediate representation
- * for a JavaThing, when we have the thing's ID, but we might not have read
- * the thing yet.
- *
- * @author Bill Foote
- */
-public class JavaObjectRef extends JavaThing {
- private long id;
-
- public JavaObjectRef(long id) {
- this.id = id;
- }
-
- public long getId() {
- return id;
- }
-
- public boolean isHeapAllocated() {
- return true;
- }
-
- public JavaThing dereference(Snapshot snapshot, JavaField field) {
- return dereference(snapshot, field, true);
- }
-
- public JavaThing dereference(Snapshot snapshot, JavaField field, boolean verbose) {
- if (field != null && !field.hasId()) {
- // If this happens, we must be a field that represents an int.
- // (This only happens with .bod-style files)
- return new JavaLong(id);
- }
- if (id == 0) {
- return snapshot.getNullThing();
- }
- JavaThing result = snapshot.findThing(id);
- if (result == null) {
- if (!snapshot.getUnresolvedObjectsOK() && verbose) {
- String msg = "WARNING: Failed to resolve object id "
- + Misc.toHex(id);
- if (field != null) {
- msg += " for field " + field.getName()
- + " (signature " + field.getSignature() + ")";
- }
- System.out.println(msg);
- // Thread.dumpStack();
- }
- result = new HackJavaValue("Unresolved object "
- + Misc.toHex(id), 0);
- }
- return result;
- }
-
- public int getSize() {
- return 0;
- }
-
- public String toString() {
- return "Unresolved object " + Misc.toHex(id);
- }
-}
--- a/jdk/src/jdk.dev/share/classes/com/sun/tools/hat/internal/model/JavaShort.java Thu May 21 10:07:38 2015 -0700
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,54 +0,0 @@
-/*
- * Copyright (c) 1997, 2008, Oracle and/or its affiliates. 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. Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-
-/*
- * The Original Code is HAT. The Initial Developer of the
- * Original Code is Bill Foote, with contributions from others
- * at JavaSoft/Sun.
- */
-
-package com.sun.tools.hat.internal.model;
-
-/**
- * Represents a short (i.e. a short field in an instance).
- *
- * @author Bill Foote
- */
-
-
-public class JavaShort extends JavaValue {
-
- short value;
-
- public JavaShort(short value) {
- this.value = value;
- }
-
- public String toString() {
- return "" + value;
- }
-
-}
--- a/jdk/src/jdk.dev/share/classes/com/sun/tools/hat/internal/model/JavaStatic.java Thu May 21 10:07:38 2015 -0700
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,79 +0,0 @@
-/*
- * Copyright (c) 1997, 2008, Oracle and/or its affiliates. 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. Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-
-/*
- * The Original Code is HAT. The Initial Developer of the
- * Original Code is Bill Foote, with contributions from others
- * at JavaSoft/Sun.
- */
-
-package com.sun.tools.hat.internal.model;
-
-/**
- *
- * @author Bill Foote
- */
-
-/**
- * Represents the value of a static field of a JavaClass
- */
-
-public class JavaStatic {
-
- private JavaField field;
- private JavaThing value;
-
- public JavaStatic(JavaField field, JavaThing value) {
- this.field = field;
- this.value = value;
- }
-
- public void resolve(JavaClass clazz, Snapshot snapshot) {
- long id = -1;
- if (value instanceof JavaObjectRef) {
- id = ((JavaObjectRef)value).getId();
- }
- value = value.dereference(snapshot, field);
- if (value.isHeapAllocated() &&
- clazz.getLoader() == snapshot.getNullThing()) {
- // static fields are only roots if they are in classes
- // loaded by the root classloader.
- JavaHeapObject ho = (JavaHeapObject) value;
- String s = "Static reference from " + clazz.getName()
- + "." + field.getName();
- snapshot.addRoot(new Root(id, clazz.getId(),
- Root.JAVA_STATIC, s));
- }
- }
-
- public JavaField getField() {
- return field;
- }
-
- public JavaThing getValue() {
- return value;
- }
-}
--- a/jdk/src/jdk.dev/share/classes/com/sun/tools/hat/internal/model/JavaThing.java Thu May 21 10:07:38 2015 -0700
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,99 +0,0 @@
-/*
- * Copyright (c) 1997, 2008, Oracle and/or its affiliates. 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. Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-
-/*
- * The Original Code is HAT. The Initial Developer of the
- * Original Code is Bill Foote, with contributions from others
- * at JavaSoft/Sun.
- */
-
-package com.sun.tools.hat.internal.model;
-
-import java.util.Enumeration;
-import java.util.Hashtable;
-
-
-/**
- *
- * @author Bill Foote
- */
-
-
-/**
- * Represents a java "Thing". A thing is anything that can be the value of
- * a field. This includes JavaHeapObject, JavaObjectRef, and JavaValue.
- */
-
-public abstract class JavaThing {
-
- protected JavaThing() {
- }
-
- /**
- * If this is a forward reference, figure out what it really
- * refers to.
- *
- * @param snapshot The snapshot this is for
- * @param field The field this thing represents. If null, it is
- * assumed this thing is an object (and never a value).
- */
- public JavaThing dereference(Snapshot shapshot, JavaField field) {
- return this;
- }
-
-
- /**
- * Are we the same type as other?
- *
- * @see JavaObject.isSameTypeAs()
- */
- public boolean isSameTypeAs(JavaThing other) {
- return getClass() == other.getClass();
- }
- /**
- * @return true iff this represents a heap-allocated object
- */
- abstract public boolean isHeapAllocated();
-
- /**
- * @return the size of this object, in bytes, including VM overhead
- */
- abstract public int getSize();
-
- /**
- * @return a human-readable string representation of this thing
- */
- abstract public String toString();
-
- /**
- * Compare our string representation to other's
- * @see java.lang.String.compareTo()
- */
- public int compareTo(JavaThing other) {
- return toString().compareTo(other.toString());
- }
-
-}
--- a/jdk/src/jdk.dev/share/classes/com/sun/tools/hat/internal/model/JavaValue.java Thu May 21 10:07:38 2015 -0700
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,61 +0,0 @@
-/*
- * Copyright (c) 1997, 2008, Oracle and/or its affiliates. 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. Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-
-/*
- * The Original Code is HAT. The Initial Developer of the
- * Original Code is Bill Foote, with contributions from others
- * at JavaSoft/Sun.
- */
-
-package com.sun.tools.hat.internal.model;
-
-/**
- * Abstract base class for all value types (ints, longs, floats, etc.)
- *
- * @author Bill Foote
- */
-
-
-
-
-public abstract class JavaValue extends JavaThing {
-
- protected JavaValue() {
- }
-
- public boolean isHeapAllocated() {
- return false;
- }
-
- abstract public String toString();
-
- public int getSize() {
- // The size of a value is already accounted for in the class
- // that has the data member.
- return 0;
- }
-
-}
--- a/jdk/src/jdk.dev/share/classes/com/sun/tools/hat/internal/model/JavaValueArray.java Thu May 21 10:07:38 2015 -0700
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,433 +0,0 @@
-/*
- * Copyright (c) 1997, 2008, Oracle and/or its affiliates. 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. Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-
-/*
- * The Original Code is HAT. The Initial Developer of the
- * Original Code is Bill Foote, with contributions from others
- * at JavaSoft/Sun.
- */
-
-package com.sun.tools.hat.internal.model;
-
-import com.sun.tools.hat.internal.parser.ReadBuffer;
-import java.io.IOException;
-
-/**
- * An array of values, that is, an array of ints, boolean, floats or the like.
- *
- * @author Bill Foote
- */
-public class JavaValueArray extends JavaLazyReadObject
- /*imports*/ implements ArrayTypeCodes {
-
- private static String arrayTypeName(byte sig) {
- switch (sig) {
- case 'B':
- return "byte[]";
- case 'Z':
- return "boolean[]";
- case 'C':
- return "char[]";
- case 'S':
- return "short[]";
- case 'I':
- return "int[]";
- case 'F':
- return "float[]";
- case 'J':
- return "long[]";
- case 'D':
- return "double[]";
- default:
- throw new RuntimeException("invalid array element sig: " + sig);
- }
- }
-
- private static int elementSize(byte type) {
- switch (type) {
- case T_BYTE:
- case T_BOOLEAN:
- return 1;
- case T_CHAR:
- case T_SHORT:
- return 2;
- case T_INT:
- case T_FLOAT:
- return 4;
- case T_LONG:
- case T_DOUBLE:
- return 8;
- default:
- throw new RuntimeException("invalid array element type: " + type);
- }
- }
-
- /*
- * Java primitive array record (HPROF_GC_PRIM_ARRAY_DUMP) looks
- * as below:
- *
- * object ID
- * stack trace serial number (int)
- * length of the instance data (int)
- * element type (byte)
- * array data
- */
- protected final int readValueLength() throws IOException {
- JavaClass cl = getClazz();
- ReadBuffer buf = cl.getReadBuffer();
- int idSize = cl.getIdentifierSize();
- long offset = getOffset() + idSize + 4;
- // length of the array
- int len = buf.getInt(offset);
- // typecode of array element type
- byte type = buf.getByte(offset + 4);
- return len * elementSize(type);
- }
-
- protected final byte[] readValue() throws IOException {
- JavaClass cl = getClazz();
- ReadBuffer buf = cl.getReadBuffer();
- int idSize = cl.getIdentifierSize();
- long offset = getOffset() + idSize + 4;
- // length of the array
- int length = buf.getInt(offset);
- // typecode of array element type
- byte type = buf.getByte(offset + 4);
- if (length == 0) {
- return Snapshot.EMPTY_BYTE_ARRAY;
- } else {
- length *= elementSize(type);
- byte[] res = new byte[length];
- buf.get(offset + 5, res);
- return res;
- }
- }
-
- // JavaClass set only after resolve.
- private JavaClass clazz;
-
- // This field contains elementSignature byte and
- // divider to be used to calculate length. Note that
- // length of content byte[] is not same as array length.
- // Actual array length is (byte[].length / divider)
- private int data;
-
- // First 8 bits of data is used for element signature
- private static final int SIGNATURE_MASK = 0x0FF;
-
- // Next 8 bits of data is used for length divider
- private static final int LENGTH_DIVIDER_MASK = 0x0FF00;
-
- // Number of bits to shift to get length divider
- private static final int LENGTH_DIVIDER_SHIFT = 8;
-
- public JavaValueArray(byte elementSignature, long offset) {
- super(offset);
- this.data = (elementSignature & SIGNATURE_MASK);
- }
-
- public JavaClass getClazz() {
- return clazz;
- }
-
- public void visitReferencedObjects(JavaHeapObjectVisitor v) {
- super.visitReferencedObjects(v);
- }
-
- public void resolve(Snapshot snapshot) {
- if (clazz instanceof JavaClass) {
- return;
- }
- byte elementSig = getElementType();
- clazz = snapshot.findClass(arrayTypeName(elementSig));
- if (clazz == null) {
- clazz = snapshot.getArrayClass("" + ((char) elementSig));
- }
- getClazz().addInstance(this);
- super.resolve(snapshot);
- }
-
- public int getLength() {
- int divider = (data & LENGTH_DIVIDER_MASK) >>> LENGTH_DIVIDER_SHIFT;
- if (divider == 0) {
- byte elementSignature = getElementType();
- switch (elementSignature) {
- case 'B':
- case 'Z':
- divider = 1;
- break;
- case 'C':
- case 'S':
- divider = 2;
- break;
- case 'I':
- case 'F':
- divider = 4;
- break;
- case 'J':
- case 'D':
- divider = 8;
- break;
- default:
- throw new RuntimeException("unknown primitive type: " +
- elementSignature);
- }
- data |= (divider << LENGTH_DIVIDER_SHIFT);
- }
- return (getValueLength() / divider);
- }
-
- public Object getElements() {
- final int len = getLength();
- final byte et = getElementType();
- byte[] data = getValue();
- int index = 0;
- switch (et) {
- case 'Z': {
- boolean[] res = new boolean[len];
- for (int i = 0; i < len; i++) {
- res[i] = booleanAt(index, data);
- index++;
- }
- return res;
- }
- case 'B': {
- byte[] res = new byte[len];
- for (int i = 0; i < len; i++) {
- res[i] = byteAt(index, data);
- index++;
- }
- return res;
- }
- case 'C': {
- char[] res = new char[len];
- for (int i = 0; i < len; i++) {
- res[i] = charAt(index, data);
- index += 2;
- }
- return res;
- }
- case 'S': {
- short[] res = new short[len];
- for (int i = 0; i < len; i++) {
- res[i] = shortAt(index, data);
- index += 2;
- }
- return res;
- }
- case 'I': {
- int[] res = new int[len];
- for (int i = 0; i < len; i++) {
- res[i] = intAt(index, data);
- index += 4;
- }
- return res;
- }
- case 'J': {
- long[] res = new long[len];
- for (int i = 0; i < len; i++) {
- res[i] = longAt(index, data);
- index += 8;
- }
- return res;
- }
- case 'F': {
- float[] res = new float[len];
- for (int i = 0; i < len; i++) {
- res[i] = floatAt(index, data);
- index += 4;
- }
- return res;
- }
- case 'D': {
- double[] res = new double[len];
- for (int i = 0; i < len; i++) {
- res[i] = doubleAt(index, data);
- index += 8;
- }
- return res;
- }
- default: {
- throw new RuntimeException("unknown primitive type?");
- }
- }
- }
-
- public byte getElementType() {
- return (byte) (data & SIGNATURE_MASK);
- }
-
- private void checkIndex(int index) {
- if (index < 0 || index >= getLength()) {
- throw new ArrayIndexOutOfBoundsException(index);
- }
- }
-
- private void requireType(char type) {
- if (getElementType() != type) {
- throw new RuntimeException("not of type : " + type);
- }
- }
-
- public boolean getBooleanAt(int index) {
- checkIndex(index);
- requireType('Z');
- return booleanAt(index, getValue());
- }
-
- public byte getByteAt(int index) {
- checkIndex(index);
- requireType('B');
- return byteAt(index, getValue());
- }
-
- public char getCharAt(int index) {
- checkIndex(index);
- requireType('C');
- return charAt(index << 1, getValue());
- }
-
- public short getShortAt(int index) {
- checkIndex(index);
- requireType('S');
- return shortAt(index << 1, getValue());
- }
-
- public int getIntAt(int index) {
- checkIndex(index);
- requireType('I');
- return intAt(index << 2, getValue());
- }
-
- public long getLongAt(int index) {
- checkIndex(index);
- requireType('J');
- return longAt(index << 3, getValue());
- }
-
- public float getFloatAt(int index) {
- checkIndex(index);
- requireType('F');
- return floatAt(index << 2, getValue());
- }
-
- public double getDoubleAt(int index) {
- checkIndex(index);
- requireType('D');
- return doubleAt(index << 3, getValue());
- }
-
- public String valueString() {
- return valueString(true);
- }
-
- public String valueString(boolean bigLimit) {
- // Char arrays deserve special treatment
- StringBuilder result;
- byte[] value = getValue();
- int max = value.length;
- byte elementSignature = getElementType();
- if (elementSignature == 'C') {
- result = new StringBuilder();
- for (int i = 0; i < value.length; ) {
- char val = charAt(i, value);
- result.append(val);
- i += 2;
- }
- } else {
- int limit = 8;
- if (bigLimit) {
- limit = 1000;
- }
- result = new StringBuilder("{");
- int num = 0;
- for (int i = 0; i < value.length; ) {
- if (num > 0) {
- result.append(", ");
- }
- if (num >= limit) {
- result.append("... ");
- break;
- }
- num++;
- switch (elementSignature) {
- case 'Z': {
- boolean val = booleanAt(i, value);
- if (val) {
- result.append("true");
- } else {
- result.append("false");
- }
- i++;
- break;
- }
- case 'B': {
- int val = 0xFF & byteAt(i, value);
- result.append("0x").append(Integer.toString(val, 16));
- i++;
- break;
- }
- case 'S': {
- short val = shortAt(i, value);
- i += 2;
- result.append(val);
- break;
- }
- case 'I': {
- int val = intAt(i, value);
- i += 4;
- result.append(val);
- break;
- }
- case 'J': { // long
- long val = longAt(i, value);
- result.append(val);
- i += 8;
- break;
- }
- case 'F': {
- float val = floatAt(i, value);
- result.append(val);
- i += 4;
- break;
- }
- case 'D': { // double
- double val = doubleAt(i, value);
- result.append(val);
- i += 8;
- break;
- }
- default: {
- throw new RuntimeException("unknown primitive type?");
- }
- }
- }
- result.append('}');
- }
- return result.toString();
- }
-
-}
--- a/jdk/src/jdk.dev/share/classes/com/sun/tools/hat/internal/model/ReachableExcludes.java Thu May 21 10:07:38 2015 -0700
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,50 +0,0 @@
-/*
- * Copyright (c) 1997, 2008, Oracle and/or its affiliates. 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. Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-
-/*
- * The Original Code is HAT. The Initial Developer of the
- * Original Code is Bill Foote, with contributions from others
- * at JavaSoft/Sun.
- */
-
-package com.sun.tools.hat.internal.model;
-
-
-/**
- * This represents a set of data members that should be excluded from the
- * reachable objects query. This is useful to exclude observers from the
- * transitive closure of objects reachable from a given object, allowing
- * some kind of real determination of the "size" of that object.
- *
- */
-
-public interface ReachableExcludes {
- /**
- * @return true iff the given field is on the hitlist of excluded
- * fields.
- */
- public boolean isExcluded(String fieldName);
-}
--- a/jdk/src/jdk.dev/share/classes/com/sun/tools/hat/internal/model/ReachableExcludesImpl.java Thu May 21 10:07:38 2015 -0700
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,105 +0,0 @@
-/*
- * Copyright (c) 1997, 2014, Oracle and/or its affiliates. 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. Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-
-/*
- * The Original Code is HAT. The Initial Developer of the
- * Original Code is Bill Foote, with contributions from others
- * at JavaSoft/Sun.
- */
-
-package com.sun.tools.hat.internal.model;
-
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.InputStreamReader;
-import java.io.Reader;
-import java.io.BufferedReader;
-import java.io.IOException;
-
-import java.util.Hashtable;
-
-/**
- * This represents a set of data members that should be excluded from the
- * reachable objects query.
- * This is useful to exclude observers from the
- * transitive closure of objects reachable from a given object, allowing
- * some kind of real determination of the "size" of that object.
- *
- * @author Bill Foote
- */
-public class ReachableExcludesImpl implements ReachableExcludes {
-
- private File excludesFile;
- private long lastModified;
- private Hashtable<String, String> methods; // Used as a bag
-
- /**
- * Create a new ReachableExcludesImpl over the given file. The file will be
- * re-read whenever the timestamp changes.
- */
- public ReachableExcludesImpl(File excludesFile) {
- this.excludesFile = excludesFile;
- readFile();
- }
-
- private void readFileIfNeeded() {
- if (excludesFile.lastModified() != lastModified) {
- synchronized(this) {
- if (excludesFile.lastModified() != lastModified) {
- readFile();
- }
- }
- }
- }
-
- private void readFile() {
- long lm = excludesFile.lastModified();
- Hashtable<String, String> m = new Hashtable<String, String>();
-
- try {
- BufferedReader r = new BufferedReader(new InputStreamReader(
- new FileInputStream(excludesFile)));
-
- String method;
- while ((method = r.readLine()) != null) {
- m.put(method, method);
- }
- lastModified = lm;
- methods = m; // We want this to be atomic
- } catch (IOException ex) {
- System.out.println("Error reading " + excludesFile + ": " + ex);
- }
- }
-
- /**
- * @return true iff the given field is on the histlist of excluded
- * fields.
- */
- public boolean isExcluded(String fieldName) {
- readFileIfNeeded();
- return methods.get(fieldName) != null;
- }
-}
--- a/jdk/src/jdk.dev/share/classes/com/sun/tools/hat/internal/model/ReachableObjects.java Thu May 21 10:07:38 2015 -0700
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,148 +0,0 @@
-/*
- * Copyright (c) 1997, 2014, Oracle and/or its affiliates. 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. Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-
-/*
- * The Original Code is HAT. The Initial Developer of the
- * Original Code is Bill Foote, with contributions from others
- * at JavaSoft/Sun.
- */
-
-package com.sun.tools.hat.internal.model;
-
-import java.util.Vector;
-import java.util.Hashtable;
-import java.util.Enumeration;
-
-import com.sun.tools.hat.internal.util.ArraySorter;
-import com.sun.tools.hat.internal.util.Comparer;
-
-/**
- * @author A. Sundararajan
- */
-
-public class ReachableObjects {
- public ReachableObjects(JavaHeapObject root,
- final ReachableExcludes excludes) {
- this.root = root;
-
- final Hashtable<JavaHeapObject, JavaHeapObject> bag = new Hashtable<JavaHeapObject, JavaHeapObject>();
- final Hashtable<String, String> fieldsExcluded = new Hashtable<String, String>(); //Bag<String>
- final Hashtable<String, String> fieldsUsed = new Hashtable<String, String>(); // Bag<String>
- JavaHeapObjectVisitor visitor = new AbstractJavaHeapObjectVisitor() {
- public void visit(JavaHeapObject t) {
- // Size is zero for things like integer fields
- if (t != null && t.getSize() > 0 && bag.get(t) == null) {
- bag.put(t, t);
- t.visitReferencedObjects(this);
- }
- }
-
- public boolean mightExclude() {
- return excludes != null;
- }
-
- public boolean exclude(JavaClass clazz, JavaField f) {
- if (excludes == null) {
- return false;
- }
- String nm = clazz.getName() + "." + f.getName();
- if (excludes.isExcluded(nm)) {
- fieldsExcluded.put(nm, nm);
- return true;
- } else {
- fieldsUsed.put(nm, nm);
- return false;
- }
- }
- };
- // Put the closure of root and all objects reachable from root into
- // bag (depth first), but don't include root:
- visitor.visit(root);
- bag.remove(root);
-
- // Now grab the elements into a vector, and sort it in decreasing size
- JavaThing[] things = new JavaThing[bag.size()];
- int i = 0;
- for (Enumeration<JavaHeapObject> e = bag.elements(); e.hasMoreElements(); ) {
- things[i++] = (JavaThing) e.nextElement();
- }
- ArraySorter.sort(things, new Comparer() {
- public int compare(Object lhs, Object rhs) {
- JavaThing left = (JavaThing) lhs;
- JavaThing right = (JavaThing) rhs;
- int diff = right.getSize() - left.getSize();
- if (diff != 0) {
- return diff;
- }
- return left.compareTo(right);
- }
- });
- this.reachables = things;
-
- this.totalSize = root.getSize();
- for (i = 0; i < things.length; i++) {
- this.totalSize += things[i].getSize();
- }
-
- excludedFields = getElements(fieldsExcluded);
- usedFields = getElements(fieldsUsed);
- }
-
- public JavaHeapObject getRoot() {
- return root;
- }
-
- public JavaThing[] getReachables() {
- return reachables;
- }
-
- public long getTotalSize() {
- return totalSize;
- }
-
- public String[] getExcludedFields() {
- return excludedFields;
- }
-
- public String[] getUsedFields() {
- return usedFields;
- }
-
- private String[] getElements(Hashtable<?, ?> ht) {
- Object[] keys = ht.keySet().toArray();
- int len = keys.length;
- String[] res = new String[len];
- System.arraycopy(keys, 0, res, 0, len);
- ArraySorter.sortArrayOfStrings(res);
- return res;
- }
-
- private JavaHeapObject root;
- private JavaThing[] reachables;
- private String[] excludedFields;
- private String[] usedFields;
- private long totalSize;
-}
--- a/jdk/src/jdk.dev/share/classes/com/sun/tools/hat/internal/model/ReferenceChain.java Thu May 21 10:07:38 2015 -0700
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,69 +0,0 @@
-/*
- * Copyright (c) 1997, 2008, Oracle and/or its affiliates. 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. Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-
-/*
- * The Original Code is HAT. The Initial Developer of the
- * Original Code is Bill Foote, with contributions from others
- * at JavaSoft/Sun.
- */
-
-package com.sun.tools.hat.internal.model;
-
-/**
- * Represents a chain of references to some target object
- *
- * @author Bill Foote
- */
-
-public class ReferenceChain {
-
- JavaHeapObject obj; // Object referred to
- ReferenceChain next; // Next in chain
-
- public ReferenceChain(JavaHeapObject obj, ReferenceChain next) {
- this.obj = obj;
- this.next = next;
- }
-
- public JavaHeapObject getObj() {
- return obj;
- }
-
- public ReferenceChain getNext() {
- return next;
- }
-
- public int getDepth() {
- int count = 1;
- ReferenceChain tmp = next;
- while (tmp != null) {
- count++;
- tmp = tmp.next;
- }
- return count;
- }
-
-}
--- a/jdk/src/jdk.dev/share/classes/com/sun/tools/hat/internal/model/Root.java Thu May 21 10:07:38 2015 -0700
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,174 +0,0 @@
-/*
- * Copyright (c) 1997, 2008, Oracle and/or its affiliates. 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. Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-
-/*
- * The Original Code is HAT. The Initial Developer of the
- * Original Code is Bill Foote, with contributions from others
- * at JavaSoft/Sun.
- */
-
-package com.sun.tools.hat.internal.model;
-
-import com.sun.tools.hat.internal.util.Misc;
-
-/**
- *
- * @author Bill Foote
- */
-
-
-/**
- * Represents a member of the rootset, that is, one of the objects that
- * the GC starts from when marking reachable objects.
- */
-
-public class Root {
-
- private long id; // ID of the JavaThing we refer to
- private long refererId; // Thread or Class responsible for this, or 0
- private int index = -1; // Index in Snapshot.roots
- private int type;
- private String description;
- private JavaHeapObject referer = null;
- private StackTrace stackTrace = null;
-
- // Values for type. Higher values are more interesting -- see getType().
- // See also getTypeName()
- public final static int INVALID_TYPE = 0;
- public final static int UNKNOWN = 1;
- public final static int SYSTEM_CLASS = 2;
-
- public final static int NATIVE_LOCAL = 3;
- public final static int NATIVE_STATIC = 4;
- public final static int THREAD_BLOCK = 5;
- public final static int BUSY_MONITOR = 6;
- public final static int JAVA_LOCAL = 7;
- public final static int NATIVE_STACK = 8;
- public final static int JAVA_STATIC = 9;
-
-
- public Root(long id, long refererId, int type, String description) {
- this(id, refererId, type, description, null);
- }
-
-
- public Root(long id, long refererId, int type, String description,
- StackTrace stackTrace) {
- this.id = id;
- this.refererId = refererId;
- this.type = type;
- this.description = description;
- this.stackTrace = stackTrace;
- }
-
- public long getId() {
- return id;
- }
-
- public String getIdString() {
- return Misc.toHex(id);
- }
-
- public String getDescription() {
- if ("".equals(description)) {
- return getTypeName() + " Reference";
- } else {
- return description;
- }
- }
-
- /**
- * Return type. We guarantee that more interesting roots will have
- * a type that is numerically higher.
- */
- public int getType() {
- return type;
- }
-
- public String getTypeName() {
- switch(type) {
- case INVALID_TYPE: return "Invalid (?!?)";
- case UNKNOWN: return "Unknown";
- case SYSTEM_CLASS: return "System Class";
- case NATIVE_LOCAL: return "JNI Local";
- case NATIVE_STATIC: return "JNI Global";
- case THREAD_BLOCK: return "Thread Block";
- case BUSY_MONITOR: return "Busy Monitor";
- case JAVA_LOCAL: return "Java Local";
- case NATIVE_STACK: return "Native Stack (possibly Java local)";
- case JAVA_STATIC: return "Java Static";
- default: return "??";
- }
- }
-
- /**
- * Given two Root instances, return the one that is most interesting.
- */
- public Root mostInteresting(Root other) {
- if (other.type > this.type) {
- return other;
- } else {
- return this;
- }
- }
-
- /**
- * Get the object that's responsible for this root, if there is one.
- * This will be null, a Thread object, or a Class object.
- */
- public JavaHeapObject getReferer() {
- return referer;
- }
-
- /**
- * @return the stack trace responsible for this root, or null if there
- * is none.
- */
- public StackTrace getStackTrace() {
- return stackTrace;
- }
-
- /**
- * @return The index of this root in Snapshot.roots
- */
- public int getIndex() {
- return index;
- }
-
- void resolve(Snapshot ss) {
- if (refererId != 0) {
- referer = ss.findThing(refererId);
- }
- if (stackTrace != null) {
- stackTrace.resolve(ss);
- }
- }
-
- void setIndex(int i) {
- index = i;
- }
-
-}
--- a/jdk/src/jdk.dev/share/classes/com/sun/tools/hat/internal/model/Snapshot.java Thu May 21 10:07:38 2015 -0700
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,630 +0,0 @@
-/*
- * Copyright (c) 1997, 2014, Oracle and/or its affiliates. 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. Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-
-/*
- * The Original Code is HAT. The Initial Developer of the
- * Original Code is Bill Foote, with contributions from others
- * at JavaSoft/Sun.
- */
-
-package com.sun.tools.hat.internal.model;
-
-import java.lang.ref.SoftReference;
-import java.util.*;
-import com.sun.tools.hat.internal.parser.ReadBuffer;
-import com.sun.tools.hat.internal.util.Misc;
-
-/**
- *
- * @author Bill Foote
- */
-
-/**
- * Represents a snapshot of the Java objects in the VM at one instant.
- * This is the top-level "model" object read out of a single .hprof or .bod
- * file.
- */
-
-public class Snapshot {
-
- public static long SMALL_ID_MASK = 0x0FFFFFFFFL;
- public static final byte[] EMPTY_BYTE_ARRAY = new byte[0];
-
- private static final JavaField[] EMPTY_FIELD_ARRAY = new JavaField[0];
- private static final JavaStatic[] EMPTY_STATIC_ARRAY = new JavaStatic[0];
-
- // all heap objects
- private Hashtable<Number, JavaHeapObject> heapObjects =
- new Hashtable<Number, JavaHeapObject>();
-
- private Hashtable<Number, JavaClass> fakeClasses =
- new Hashtable<Number, JavaClass>();
-
- // all Roots in this Snapshot
- private Vector<Root> roots = new Vector<Root>();
-
- // name-to-class map
- private Map<String, JavaClass> classes =
- new TreeMap<String, JavaClass>();
-
- // new objects relative to a baseline - lazily initialized
- private volatile Map<JavaHeapObject, Boolean> newObjects;
-
- // allocation site traces for all objects - lazily initialized
- private volatile Map<JavaHeapObject, StackTrace> siteTraces;
-
- // object-to-Root map for all objects
- private Map<JavaHeapObject, Root> rootsMap =
- new HashMap<JavaHeapObject, Root>();
-
- // soft cache of finalizeable objects - lazily initialized
- private SoftReference<Vector<?>> finalizablesCache;
-
- // represents null reference
- private JavaThing nullThing;
-
- // java.lang.ref.Reference class
- private JavaClass weakReferenceClass;
- // index of 'referent' field in java.lang.ref.Reference class
- private int referentFieldIndex;
-
- // java.lang.Class class
- private JavaClass javaLangClass;
- // java.lang.String class
- private JavaClass javaLangString;
- // java.lang.ClassLoader class
- private JavaClass javaLangClassLoader;
-
- // unknown "other" array class
- private volatile JavaClass otherArrayType;
- // Stuff to exclude from reachable query
- private ReachableExcludes reachableExcludes;
- // the underlying heap dump buffer
- private ReadBuffer readBuf;
-
- // True iff some heap objects have isNew set
- private boolean hasNewSet;
- private boolean unresolvedObjectsOK;
-
- // whether object array instances have new style class or
- // old style (element) class.
- private boolean newStyleArrayClass;
-
- // object id size in the heap dump
- private int identifierSize = 4;
-
- // minimum object size - accounts for object header in
- // most Java virtual machines - we assume 2 identifierSize
- // (which is true for Sun's hotspot JVM).
- private int minimumObjectSize;
-
- public Snapshot(ReadBuffer buf) {
- nullThing = new HackJavaValue("<null>", 0);
- readBuf = buf;
- }
-
- public void setSiteTrace(JavaHeapObject obj, StackTrace trace) {
- if (trace != null && trace.getFrames().length != 0) {
- initSiteTraces();
- siteTraces.put(obj, trace);
- }
- }
-
- public StackTrace getSiteTrace(JavaHeapObject obj) {
- if (siteTraces != null) {
- return siteTraces.get(obj);
- } else {
- return null;
- }
- }
-
- public void setNewStyleArrayClass(boolean value) {
- newStyleArrayClass = value;
- }
-
- public boolean isNewStyleArrayClass() {
- return newStyleArrayClass;
- }
-
- public void setIdentifierSize(int size) {
- identifierSize = size;
- minimumObjectSize = 2 * size;
- }
-
- public int getIdentifierSize() {
- return identifierSize;
- }
-
- public int getMinimumObjectSize() {
- return minimumObjectSize;
- }
-
- public void addHeapObject(long id, JavaHeapObject ho) {
- heapObjects.put(makeId(id), ho);
- }
-
- public void addRoot(Root r) {
- r.setIndex(roots.size());
- roots.addElement(r);
- }
-
- public void addClass(long id, JavaClass c) {
- addHeapObject(id, c);
- putInClassesMap(c);
- }
-
- JavaClass addFakeInstanceClass(long classID, int instSize) {
- // Create a fake class name based on ID.
- String name = "unknown-class<@" + Misc.toHex(classID) + ">";
-
- // Create fake fields convering the given instance size.
- // Create as many as int type fields and for the left over
- // size create byte type fields.
- int numInts = instSize / 4;
- int numBytes = instSize % 4;
- JavaField[] fields = new JavaField[numInts + numBytes];
- int i;
- for (i = 0; i < numInts; i++) {
- fields[i] = new JavaField("unknown-field-" + i, "I");
- }
- for (i = 0; i < numBytes; i++) {
- fields[i + numInts] = new JavaField("unknown-field-" +
- i + numInts, "B");
- }
-
- // Create fake instance class
- JavaClass c = new JavaClass(name, 0, 0, 0, 0, fields,
- EMPTY_STATIC_ARRAY, instSize);
- // Add the class
- addFakeClass(makeId(classID), c);
- return c;
- }
-
-
- /**
- * @return true iff it's possible that some JavaThing instances might
- * isNew set
- *
- * @see JavaThing.isNew()
- */
- public boolean getHasNewSet() {
- return hasNewSet;
- }
-
- //
- // Used in the body of resolve()
- //
- private static class MyVisitor extends AbstractJavaHeapObjectVisitor {
- JavaHeapObject t;
- public void visit(JavaHeapObject other) {
- other.addReferenceFrom(t);
- }
- }
-
- // To show heap parsing progress, we print a '.' after this limit
- private static final int DOT_LIMIT = 5000;
-
- /**
- * Called after reading complete, to initialize the structure
- */
- public void resolve(boolean calculateRefs) {
- System.out.println("Resolving " + heapObjects.size() + " objects...");
-
- // First, resolve the classes. All classes must be resolved before
- // we try any objects, because the objects use classes in their
- // resolution.
- javaLangClass = findClass("java.lang.Class");
- if (javaLangClass == null) {
- System.out.println("WARNING: hprof file does not include java.lang.Class!");
- javaLangClass = new JavaClass("java.lang.Class", 0, 0, 0, 0,
- EMPTY_FIELD_ARRAY, EMPTY_STATIC_ARRAY, 0);
- addFakeClass(javaLangClass);
- }
- javaLangString = findClass("java.lang.String");
- if (javaLangString == null) {
- System.out.println("WARNING: hprof file does not include java.lang.String!");
- javaLangString = new JavaClass("java.lang.String", 0, 0, 0, 0,
- EMPTY_FIELD_ARRAY, EMPTY_STATIC_ARRAY, 0);
- addFakeClass(javaLangString);
- }
- javaLangClassLoader = findClass("java.lang.ClassLoader");
- if (javaLangClassLoader == null) {
- System.out.println("WARNING: hprof file does not include java.lang.ClassLoader!");
- javaLangClassLoader = new JavaClass("java.lang.ClassLoader", 0, 0, 0, 0,
- EMPTY_FIELD_ARRAY, EMPTY_STATIC_ARRAY, 0);
- addFakeClass(javaLangClassLoader);
- }
-
- for (JavaHeapObject t : heapObjects.values()) {
- if (t instanceof JavaClass) {
- t.resolve(this);
- }
- }
-
- // Now, resolve everything else.
- for (JavaHeapObject t : heapObjects.values()) {
- if (!(t instanceof JavaClass)) {
- t.resolve(this);
- }
- }
-
- heapObjects.putAll(fakeClasses);
- fakeClasses.clear();
-
- weakReferenceClass = findClass("java.lang.ref.Reference");
- if (weakReferenceClass == null) { // JDK 1.1.x
- weakReferenceClass = findClass("sun.misc.Ref");
- referentFieldIndex = 0;
- } else {
- JavaField[] fields = weakReferenceClass.getFieldsForInstance();
- for (int i = 0; i < fields.length; i++) {
- if ("referent".equals(fields[i].getName())) {
- referentFieldIndex = i;
- break;
- }
- }
- }
-
- if (calculateRefs) {
- calculateReferencesToObjects();
- System.out.print("Eliminating duplicate references");
- System.out.flush();
- // This println refers to the *next* step
- }
- int count = 0;
- for (JavaHeapObject t : heapObjects.values()) {
- t.setupReferers();
- ++count;
- if (calculateRefs && count % DOT_LIMIT == 0) {
- System.out.print(".");
- System.out.flush();
- }
- }
- if (calculateRefs) {
- System.out.println("");
- }
-
- // to ensure that Iterator.remove() on getClasses()
- // result will throw exception..
- classes = Collections.unmodifiableMap(classes);
- }
-
- private void calculateReferencesToObjects() {
- System.out.print("Chasing references, expect "
- + (heapObjects.size() / DOT_LIMIT) + " dots");
- System.out.flush();
- int count = 0;
- MyVisitor visitor = new MyVisitor();
- for (JavaHeapObject t : heapObjects.values()) {
- visitor.t = t;
- // call addReferenceFrom(t) on all objects t references:
- t.visitReferencedObjects(visitor);
- ++count;
- if (count % DOT_LIMIT == 0) {
- System.out.print(".");
- System.out.flush();
- }
- }
- System.out.println();
- for (Root r : roots) {
- r.resolve(this);
- JavaHeapObject t = findThing(r.getId());
- if (t != null) {
- t.addReferenceFromRoot(r);
- }
- }
- }
-
- public void markNewRelativeTo(Snapshot baseline) {
- hasNewSet = true;
- for (JavaHeapObject t : heapObjects.values()) {
- boolean isNew;
- long thingID = t.getId();
- if (thingID == 0L || thingID == -1L) {
- isNew = false;
- } else {
- JavaThing other = baseline.findThing(t.getId());
- if (other == null) {
- isNew = true;
- } else {
- isNew = !t.isSameTypeAs(other);
- }
- }
- t.setNew(isNew);
- }
- }
-
- public Enumeration<JavaHeapObject> getThings() {
- return heapObjects.elements();
- }
-
-
- public JavaHeapObject findThing(long id) {
- Number idObj = makeId(id);
- JavaHeapObject jho = heapObjects.get(idObj);
- return jho != null? jho : fakeClasses.get(idObj);
- }
-
- public JavaHeapObject findThing(String id) {
- return findThing(Misc.parseHex(id));
- }
-
- public JavaClass findClass(String name) {
- if (name.startsWith("0x")) {
- return (JavaClass) findThing(name);
- } else {
- return classes.get(name);
- }
- }
-
- /**
- * Return an Iterator of all of the classes in this snapshot.
- **/
- public Iterator<JavaClass> getClasses() {
- // note that because classes is a TreeMap
- // classes are already sorted by name
- return classes.values().iterator();
- }
-
- public JavaClass[] getClassesArray() {
- JavaClass[] res = new JavaClass[classes.size()];
- classes.values().toArray(res);
- return res;
- }
-
- public synchronized Enumeration<?> getFinalizerObjects() {
- Vector<?> obj;
- if (finalizablesCache != null &&
- (obj = finalizablesCache.get()) != null) {
- return obj.elements();
- }
-
- JavaClass clazz = findClass("java.lang.ref.Finalizer");
- JavaObject queue = (JavaObject) clazz.getStaticField("queue");
- JavaThing tmp = queue.getField("head");
- Vector<JavaHeapObject> finalizables = new Vector<JavaHeapObject>();
- if (tmp != getNullThing()) {
- JavaObject head = (JavaObject) tmp;
- while (true) {
- JavaHeapObject referent = (JavaHeapObject) head.getField("referent");
- JavaThing next = head.getField("next");
- if (next == getNullThing() || next.equals(head)) {
- break;
- }
- head = (JavaObject) next;
- finalizables.add(referent);
- }
- }
- finalizablesCache = new SoftReference<Vector<?>>(finalizables);
- return finalizables.elements();
- }
-
- public Enumeration<Root> getRoots() {
- return roots.elements();
- }
-
- public Root[] getRootsArray() {
- Root[] res = new Root[roots.size()];
- roots.toArray(res);
- return res;
- }
-
- public Root getRootAt(int i) {
- return roots.elementAt(i);
- }
-
- public ReferenceChain[]
- rootsetReferencesTo(JavaHeapObject target, boolean includeWeak) {
- Vector<ReferenceChain> fifo = new Vector<ReferenceChain>(); // This is slow... A real fifo would help
- // Must be a fifo to go breadth-first
- Hashtable<JavaHeapObject, JavaHeapObject> visited = new Hashtable<JavaHeapObject, JavaHeapObject>();
- // Objects are added here right after being added to fifo.
- Vector<ReferenceChain> result = new Vector<ReferenceChain>();
- visited.put(target, target);
- fifo.addElement(new ReferenceChain(target, null));
-
- while (fifo.size() > 0) {
- ReferenceChain chain = fifo.elementAt(0);
- fifo.removeElementAt(0);
- JavaHeapObject curr = chain.getObj();
- if (curr.getRoot() != null) {
- result.addElement(chain);
- // Even though curr is in the rootset, we want to explore its
- // referers, because they might be more interesting.
- }
- Enumeration<JavaThing> referers = curr.getReferers();
- while (referers.hasMoreElements()) {
- JavaHeapObject t = (JavaHeapObject) referers.nextElement();
- if (t != null && !visited.containsKey(t)) {
- if (includeWeak || !t.refersOnlyWeaklyTo(this, curr)) {
- visited.put(t, t);
- fifo.addElement(new ReferenceChain(t, chain));
- }
- }
- }
- }
-
- ReferenceChain[] realResult = new ReferenceChain[result.size()];
- for (int i = 0; i < result.size(); i++) {
- realResult[i] = result.elementAt(i);
- }
- return realResult;
- }
-
- public boolean getUnresolvedObjectsOK() {
- return unresolvedObjectsOK;
- }
-
- public void setUnresolvedObjectsOK(boolean v) {
- unresolvedObjectsOK = v;
- }
-
- public JavaClass getWeakReferenceClass() {
- return weakReferenceClass;
- }
-
- public int getReferentFieldIndex() {
- return referentFieldIndex;
- }
-
- public JavaThing getNullThing() {
- return nullThing;
- }
-
- public void setReachableExcludes(ReachableExcludes e) {
- reachableExcludes = e;
- }
-
- public ReachableExcludes getReachableExcludes() {
- return reachableExcludes;
- }
-
- // package privates
- void addReferenceFromRoot(Root r, JavaHeapObject obj) {
- Root root = rootsMap.get(obj);
- if (root == null) {
- rootsMap.put(obj, r);
- } else {
- rootsMap.put(obj, root.mostInteresting(r));
- }
- }
-
- Root getRoot(JavaHeapObject obj) {
- return rootsMap.get(obj);
- }
-
- JavaClass getJavaLangClass() {
- return javaLangClass;
- }
-
- JavaClass getJavaLangString() {
- return javaLangString;
- }
-
- JavaClass getJavaLangClassLoader() {
- return javaLangClassLoader;
- }
-
- JavaClass getOtherArrayType() {
- if (otherArrayType == null) {
- synchronized(this) {
- if (otherArrayType == null) {
- addFakeClass(new JavaClass("[<other>", 0, 0, 0, 0,
- EMPTY_FIELD_ARRAY, EMPTY_STATIC_ARRAY,
- 0));
- otherArrayType = findClass("[<other>");
- }
- }
- }
- return otherArrayType;
- }
-
- JavaClass getArrayClass(String elementSignature) {
- JavaClass clazz;
- synchronized(classes) {
- clazz = findClass("[" + elementSignature);
- if (clazz == null) {
- clazz = new JavaClass("[" + elementSignature, 0, 0, 0, 0,
- EMPTY_FIELD_ARRAY, EMPTY_STATIC_ARRAY, 0);
- addFakeClass(clazz);
- // This is needed because the JDK only creates Class structures
- // for array element types, not the arrays themselves. For
- // analysis, though, we need to pretend that there's a
- // JavaClass for the array type, too.
- }
- }
- return clazz;
- }
-
- ReadBuffer getReadBuffer() {
- return readBuf;
- }
-
- void setNew(JavaHeapObject obj, boolean isNew) {
- initNewObjects();
- if (isNew) {
- newObjects.put(obj, Boolean.TRUE);
- }
- }
-
- boolean isNew(JavaHeapObject obj) {
- if (newObjects != null) {
- return newObjects.get(obj) != null;
- } else {
- return false;
- }
- }
-
- // Internals only below this point
- private Number makeId(long id) {
- if (identifierSize == 4) {
- return (int)id;
- } else {
- return id;
- }
- }
-
- private void putInClassesMap(JavaClass c) {
- String name = c.getName();
- if (classes.containsKey(name)) {
- // more than one class can have the same name
- // if so, create a unique name by appending
- // - and id string to it.
- name += "-" + c.getIdString();
- }
- classes.put(c.getName(), c);
- }
-
- private void addFakeClass(JavaClass c) {
- putInClassesMap(c);
- c.resolve(this);
- }
-
- private void addFakeClass(Number id, JavaClass c) {
- fakeClasses.put(id, c);
- addFakeClass(c);
- }
-
- private synchronized void initNewObjects() {
- if (newObjects == null) {
- synchronized (this) {
- if (newObjects == null) {
- newObjects = new HashMap<JavaHeapObject, Boolean>();
- }
- }
- }
- }
-
- private synchronized void initSiteTraces() {
- if (siteTraces == null) {
- synchronized (this) {
- if (siteTraces == null) {
- siteTraces = new HashMap<JavaHeapObject, StackTrace>();
- }
- }
- }
- }
-}
--- a/jdk/src/jdk.dev/share/classes/com/sun/tools/hat/internal/model/StackFrame.java Thu May 21 10:07:38 2015 -0700
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,101 +0,0 @@
-/*
- * Copyright (c) 1997, 2008, Oracle and/or its affiliates. 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. Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-
-/*
- * The Original Code is HAT. The Initial Developer of the
- * Original Code is Bill Foote, with contributions from others
- * at JavaSoft/Sun.
- */
-
-package com.sun.tools.hat.internal.model;
-
-/**
- *
- * @author Bill Foote
- */
-
-
-/**
- * Represents a stack frame.
- */
-
-public class StackFrame {
-
- //
- // Values for the lineNumber data member. These are the same
- // as the values used in the JDK 1.2 heap dump file.
- //
- public final static int LINE_NUMBER_UNKNOWN = -1;
- public final static int LINE_NUMBER_COMPILED = -2;
- public final static int LINE_NUMBER_NATIVE = -3;
-
- private String methodName;
- private String methodSignature;
- private String className;
- private String sourceFileName;
- private int lineNumber;
-
- public StackFrame(String methodName, String methodSignature,
- String className, String sourceFileName, int lineNumber) {
- this.methodName = methodName;
- this.methodSignature = methodSignature;
- this.className = className;
- this.sourceFileName = sourceFileName;
- this.lineNumber = lineNumber;
- }
-
- public void resolve(Snapshot snapshot) {
- }
-
- public String getMethodName() {
- return methodName;
- }
-
- public String getMethodSignature() {
- return methodSignature;
- }
-
- public String getClassName() {
- return className;
- }
-
- public String getSourceFileName() {
- return sourceFileName;
- }
-
- public String getLineNumber() {
- switch(lineNumber) {
- case LINE_NUMBER_UNKNOWN:
- return "(unknown)";
- case LINE_NUMBER_COMPILED:
- return "(compiled method)";
- case LINE_NUMBER_NATIVE:
- return "(native method)";
- default:
- return Integer.toString(lineNumber, 10);
- }
- }
-}
--- a/jdk/src/jdk.dev/share/classes/com/sun/tools/hat/internal/model/StackTrace.java Thu May 21 10:07:38 2015 -0700
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,77 +0,0 @@
-/*
- * Copyright (c) 1997, 2008, Oracle and/or its affiliates. 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. Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-
-/*
- * The Original Code is HAT. The Initial Developer of the
- * Original Code is Bill Foote, with contributions from others
- * at JavaSoft/Sun.
- */
-
-package com.sun.tools.hat.internal.model;
-
-/**
- *
- * @author Bill Foote
- */
-
-
-/**
- * Represents a stack trace, that is, an ordered collection of stack frames.
- */
-
-public class StackTrace {
-
- private StackFrame[] frames;
-
- public StackTrace(StackFrame[] frames) {
- this.frames = frames;
- }
-
- /**
- * @param depth. The minimum reasonable depth is 1.
- *
- * @return a (possibly new) StackTrace that is limited to depth.
- */
- public StackTrace traceForDepth(int depth) {
- if (depth >= frames.length) {
- return this;
- } else {
- StackFrame[] f = new StackFrame[depth];
- System.arraycopy(frames, 0, f, 0, depth);
- return new StackTrace(f);
- }
- }
-
- public void resolve(Snapshot snapshot) {
- for (int i = 0; i < frames.length; i++) {
- frames[i].resolve(snapshot);
- }
- }
-
- public StackFrame[] getFrames() {
- return frames;
- }
-}
--- a/jdk/src/jdk.dev/share/classes/com/sun/tools/hat/internal/oql/OQLEngine.java Thu May 21 10:07:38 2015 -0700
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,311 +0,0 @@
-/*
- * Copyright (c) 1997, 2014, Oracle and/or its affiliates. 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. Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-
-/*
- * The Original Code is HAT. The Initial Developer of the
- * Original Code is Bill Foote, with contributions from others
- * at JavaSoft/Sun.
- */
-
-package com.sun.tools.hat.internal.oql;
-
-import com.sun.tools.hat.internal.model.*;
-import java.io.*;
-import java.lang.reflect.*;
-import java.util.*;
-
-/**
- * This is Object Query Language Interpreter
- *
- */
-public class OQLEngine {
- static {
- try {
- // Do we have javax.script support?
- // create ScriptEngineManager
- Class<?> managerClass = Class.forName("javax.script.ScriptEngineManager");
- Object manager = managerClass.newInstance();
-
- // create JavaScript engine
- Method getEngineMethod = managerClass.getMethod("getEngineByName",
- new Class<?>[] { String.class });
- Object jse = getEngineMethod.invoke(manager, new Object[] {"js"});
- oqlSupported = (jse != null);
- } catch (Exception exp) {
- oqlSupported = false;
- }
- }
-
- // check OQL is supported or not before creating OQLEngine
- public static boolean isOQLSupported() {
- return oqlSupported;
- }
-
- public OQLEngine(Snapshot snapshot) {
- if (!isOQLSupported()) {
- throw new UnsupportedOperationException("OQL not supported");
- }
- init(snapshot);
- }
-
- /**
- Query is of the form
-
- select <java script code to select>
- [ from [instanceof] <class name> [<identifier>]
- [ where <java script boolean expression> ]
- ]
- */
- public synchronized void executeQuery(String query, ObjectVisitor visitor)
- throws OQLException {
- debugPrint("query : " + query);
- StringTokenizer st = new StringTokenizer(query);
- if (st.hasMoreTokens()) {
- String first = st.nextToken();
- if (! first.equals("select") ) {
- // Query does not start with 'select' keyword.
- // Just treat it as plain JavaScript and eval it.
- try {
- Object res = evalScript(query);
- visitor.visit(res);
- } catch (Exception e) {
- throw new OQLException(e);
- }
- return;
- }
- } else {
- throw new OQLException("query syntax error: no 'select' clause");
- }
-
- String selectExpr = "";
- boolean seenFrom = false;
- while (st.hasMoreTokens()) {
- String tok = st.nextToken();
- if (tok.equals("from")) {
- seenFrom = true;
- break;
- }
- selectExpr += " " + tok;
- }
-
- if (selectExpr.equals("")) {
- throw new OQLException("query syntax error: 'select' expression can not be empty");
- }
-
- String className = null;
- boolean isInstanceOf = false;
- String whereExpr = null;
- String identifier = null;
-
- if (seenFrom) {
- if (st.hasMoreTokens()) {
- String tmp = st.nextToken();
- if (tmp.equals("instanceof")) {
- isInstanceOf = true;
- if (! st.hasMoreTokens()) {
- throw new OQLException("no class name after 'instanceof'");
- }
- className = st.nextToken();
- } else {
- className = tmp;
- }
- } else {
- throw new OQLException("query syntax error: class name must follow 'from'");
- }
-
- if (st.hasMoreTokens()) {
- identifier = st.nextToken();
- if (identifier.equals("where")) {
- throw new OQLException("query syntax error: identifier should follow class name");
- }
- if (st.hasMoreTokens()) {
- String tmp = st.nextToken();
- if (! tmp.equals("where")) {
- throw new OQLException("query syntax error: 'where' clause expected after 'from' clause");
- }
-
- whereExpr = "";
- while (st.hasMoreTokens()) {
- whereExpr += " " + st.nextToken();
- }
- if (whereExpr.equals("")) {
- throw new OQLException("query syntax error: 'where' clause cannot have empty expression");
- }
- }
- } else {
- throw new OQLException("query syntax error: identifier should follow class name");
- }
- }
-
- executeQuery(new OQLQuery(selectExpr, isInstanceOf, className,
- identifier, whereExpr), visitor);
- }
-
- private void executeQuery(OQLQuery q, ObjectVisitor visitor)
- throws OQLException {
- JavaClass clazz = null;
- if (q.className != null) {
- clazz = snapshot.findClass(q.className);
- if (clazz == null) {
- throw new OQLException(q.className + " is not found!");
- }
- }
-
- StringBuffer buf = new StringBuffer();
- buf.append("function __select__(");
- if (q.identifier != null) {
- buf.append(q.identifier);
- }
- buf.append(") { return ");
- buf.append(q.selectExpr.replace('\n', ' '));
- buf.append("; }");
-
- String selectCode = buf.toString();
- debugPrint(selectCode);
- String whereCode = null;
- if (q.whereExpr != null) {
- buf = new StringBuffer();
- buf.append("function __where__(");
- buf.append(q.identifier);
- buf.append(") { return ");
- buf.append(q.whereExpr.replace('\n', ' '));
- buf.append("; }");
- whereCode = buf.toString();
- }
- debugPrint(whereCode);
-
- // compile select expression and where condition
- try {
- evalMethod.invoke(engine, new Object[] { selectCode });
- if (whereCode != null) {
- evalMethod.invoke(engine, new Object[] { whereCode });
- }
-
- if (q.className != null) {
- Enumeration<JavaHeapObject> objects = clazz.getInstances(q.isInstanceOf);
- while (objects.hasMoreElements()) {
- JavaHeapObject obj = objects.nextElement();
- Object[] args = new Object[] { wrapJavaObject(obj) };
- boolean b = (whereCode == null);
- if (!b) {
- Object res = call("__where__", args);
- if (res instanceof Boolean) {
- b = ((Boolean)res).booleanValue();
- } else if (res instanceof Number) {
- b = ((Number)res).intValue() != 0;
- } else {
- b = (res != null);
- }
- }
-
- if (b) {
- Object select = call("__select__", args);
- if (visitor.visit(select)) return;
- }
- }
- } else {
- // simple "select <expr>" query
- Object select = call("__select__", new Object[] {});
- visitor.visit(select);
- }
- } catch (Exception e) {
- throw new OQLException(e);
- }
- }
-
- public Object evalScript(String script) throws Exception {
- return evalMethod.invoke(engine, new Object[] { script });
- }
-
- public Object wrapJavaObject(JavaHeapObject obj) throws Exception {
- return call("wrapJavaObject", new Object[] { obj });
- }
-
- public Object toHtml(Object obj) throws Exception {
- return call("toHtml", new Object[] { obj });
- }
-
- public Object call(String func, Object[] args) throws Exception {
- return invokeMethod.invoke(engine, new Object[] { func, args });
- }
-
- private static void debugPrint(String msg) {
- if (debug) System.out.println(msg);
- }
-
- private void init(Snapshot snapshot) throws RuntimeException {
- this.snapshot = snapshot;
- try {
- // create ScriptEngineManager
- Class<?> managerClass = Class.forName("javax.script.ScriptEngineManager");
- Object manager = managerClass.newInstance();
-
- // create JavaScript engine
- Method getEngineMethod = managerClass.getMethod("getEngineByName",
- new Class<?>[] { String.class });
- engine = getEngineMethod.invoke(manager, new Object[] {"js"});
-
- // initialize engine with init file (hat.js)
- InputStream strm = getInitStream();
- Class<?> engineClass = Class.forName("javax.script.ScriptEngine");
- evalMethod = engineClass.getMethod("eval",
- new Class<?>[] { Reader.class });
- evalMethod.invoke(engine, new Object[] {new InputStreamReader(strm)});
-
- // initialize ScriptEngine.eval(String) and
- // Invocable.invokeFunction(String, Object[]) methods.
- Class<?> invocableClass = Class.forName("javax.script.Invocable");
-
- evalMethod = engineClass.getMethod("eval",
- new Class<?>[] { String.class });
- invokeMethod = invocableClass.getMethod("invokeFunction",
- new Class<?>[] { String.class, Object[].class });
-
- // initialize ScriptEngine.put(String, Object) method
- Method putMethod = engineClass.getMethod("put",
- new Class<?>[] { String.class, Object.class });
-
- // call ScriptEngine.put to initialize built-in heap object
- putMethod.invoke(engine, new Object[] {
- "heap", call("wrapHeapSnapshot", new Object[] { snapshot })
- });
- } catch (Exception e) {
- if (debug) e.printStackTrace();
- throw new RuntimeException(e);
- }
- }
-
- private InputStream getInitStream() {
- return getClass().getResourceAsStream("/com/sun/tools/hat/resources/hat.js");
- }
-
- private Object engine;
- private Method evalMethod;
- private Method invokeMethod;
- private Snapshot snapshot;
- private static boolean debug = false;
- private static boolean oqlSupported;
-}
--- a/jdk/src/jdk.dev/share/classes/com/sun/tools/hat/internal/oql/OQLException.java Thu May 21 10:07:38 2015 -0700
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,52 +0,0 @@
-/*
- * Copyright (c) 1997, 2014, Oracle and/or its affiliates. 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. Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-
-/*
- * The Original Code is HAT. The Initial Developer of the
- * Original Code is Bill Foote, with contributions from others
- * at JavaSoft/Sun.
- */
-
-package com.sun.tools.hat.internal.oql;
-
-/**
- * OQLException is thrown if OQL execution results in error
- *
- */
-@SuppressWarnings("serial") // JDK implementation class
-public class OQLException extends Exception {
- public OQLException(String msg) {
- super(msg);
- }
-
- public OQLException(String msg, Throwable cause) {
- super(msg, cause);
- }
-
- public OQLException(Throwable cause) {
- super(cause);
- }
-}
--- a/jdk/src/jdk.dev/share/classes/com/sun/tools/hat/internal/oql/OQLQuery.java Thu May 21 10:07:38 2015 -0700
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,54 +0,0 @@
-/*
- * Copyright (c) 1997, 2008, Oracle and/or its affiliates. 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. Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-
-/*
- * The Original Code is HAT. The Initial Developer of the
- * Original Code is Bill Foote, with contributions from others
- * at JavaSoft/Sun.
- */
-
-package com.sun.tools.hat.internal.oql;
-
-/**
- * This represents a parsed OQL query
- *
- */
-class OQLQuery {
- OQLQuery(String selectExpr, boolean isInstanceOf,
- String className, String identifier, String whereExpr) {
- this.selectExpr = selectExpr;
- this.isInstanceOf = isInstanceOf;
- this.className = className;
- this.identifier = identifier;
- this.whereExpr = whereExpr;
- }
-
- String selectExpr;
- boolean isInstanceOf;
- String className;
- String identifier;
- String whereExpr;
-}
--- a/jdk/src/jdk.dev/share/classes/com/sun/tools/hat/internal/oql/ObjectVisitor.java Thu May 21 10:07:38 2015 -0700
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,43 +0,0 @@
-/*
- * Copyright (c) 1997, 2008, Oracle and/or its affiliates. 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. Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-
-/*
- * The Original Code is HAT. The Initial Developer of the
- * Original Code is Bill Foote, with contributions from others
- * at JavaSoft/Sun.
- */
-
-package com.sun.tools.hat.internal.oql;
-
-/**
- * This visitor is supplied to OQLEngine.executeQuery
- * to receive result set objects one by one.
- *
- */
-public interface ObjectVisitor {
- // return true to terminate the result set callback earlier
- public boolean visit(Object o);
-}
--- a/jdk/src/jdk.dev/share/classes/com/sun/tools/hat/internal/parser/FileReadBuffer.java Thu May 21 10:07:38 2015 -0700
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,84 +0,0 @@
-/*
- * Copyright (c) 1997, 2008, Oracle and/or its affiliates. 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. Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-
-/*
- * The Original Code is HAT. The Initial Developer of the
- * Original Code is Bill Foote, with contributions from others
- * at JavaSoft/Sun.
- */
-
-package com.sun.tools.hat.internal.parser;
-
-import java.io.IOException;
-import java.io.RandomAccessFile;
-
-/**
- * Implementation of ReadBuffer using a RandomAccessFile
- *
- * @author A. Sundararajan
- */
-class FileReadBuffer implements ReadBuffer {
- // underlying file to read
- private RandomAccessFile file;
-
- FileReadBuffer(RandomAccessFile file) {
- this.file = file;
- }
-
- private void seek(long pos) throws IOException {
- file.getChannel().position(pos);
- }
-
- public synchronized void get(long pos, byte[] buf) throws IOException {
- seek(pos);
- file.read(buf);
- }
-
- public synchronized char getChar(long pos) throws IOException {
- seek(pos);
- return file.readChar();
- }
-
- public synchronized byte getByte(long pos) throws IOException {
- seek(pos);
- return (byte) file.read();
- }
-
- public synchronized short getShort(long pos) throws IOException {
- seek(pos);
- return file.readShort();
- }
-
- public synchronized int getInt(long pos) throws IOException {
- seek(pos);
- return file.readInt();
- }
-
- public synchronized long getLong(long pos) throws IOException {
- seek(pos);
- return file.readLong();
- }
-}
--- a/jdk/src/jdk.dev/share/classes/com/sun/tools/hat/internal/parser/HprofReader.java Thu May 21 10:07:38 2015 -0700
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,892 +0,0 @@
-/*
- * Copyright (c) 1997, 2008, Oracle and/or its affiliates. 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. Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-
-/*
- * The Original Code is HAT. The Initial Developer of the
- * Original Code is Bill Foote, with contributions from others
- * at JavaSoft/Sun.
- */
-
-package com.sun.tools.hat.internal.parser;
-
-import java.io.*;
-import java.util.Date;
-import java.util.Hashtable;
-import com.sun.tools.hat.internal.model.ArrayTypeCodes;
-import com.sun.tools.hat.internal.model.*;
-
-/**
- * Object that's used to read a hprof file.
- *
- * @author Bill Foote
- */
-
-public class HprofReader extends Reader /* imports */ implements ArrayTypeCodes {
-
- final static int MAGIC_NUMBER = 0x4a415641;
- // That's "JAVA", the first part of "JAVA PROFILE ..."
- private final static String[] VERSIONS = {
- " PROFILE 1.0\0",
- " PROFILE 1.0.1\0",
- " PROFILE 1.0.2\0",
- };
-
- private final static int VERSION_JDK12BETA3 = 0;
- private final static int VERSION_JDK12BETA4 = 1;
- private final static int VERSION_JDK6 = 2;
- // These version numbers are indices into VERSIONS. The instance data
- // member version is set to one of these, and it drives decisions when
- // reading the file.
- //
- // Version 1.0.1 added HPROF_GC_PRIM_ARRAY_DUMP, which requires no
- // version-sensitive parsing.
- //
- // Version 1.0.1 changed the type of a constant pool entry from a signature
- // to a typecode.
- //
- // Version 1.0.2 added HPROF_HEAP_DUMP_SEGMENT and HPROF_HEAP_DUMP_END
- // to allow a large heap to be dumped as a sequence of heap dump segments.
- //
- // The HPROF agent in J2SE 1.2 through to 5.0 generate a version 1.0.1
- // file. In Java SE 6.0 the version is either 1.0.1 or 1.0.2 depending on
- // the size of the heap (normally it will be 1.0.1 but for multi-GB
- // heaps the heap dump will not fit in a HPROF_HEAP_DUMP record so the
- // dump is generated as version 1.0.2).
-
- //
- // Record types:
- //
- static final int HPROF_UTF8 = 0x01;
- static final int HPROF_LOAD_CLASS = 0x02;
- static final int HPROF_UNLOAD_CLASS = 0x03;
- static final int HPROF_FRAME = 0x04;
- static final int HPROF_TRACE = 0x05;
- static final int HPROF_ALLOC_SITES = 0x06;
- static final int HPROF_HEAP_SUMMARY = 0x07;
-
- static final int HPROF_START_THREAD = 0x0a;
- static final int HPROF_END_THREAD = 0x0b;
-
- static final int HPROF_HEAP_DUMP = 0x0c;
-
- static final int HPROF_CPU_SAMPLES = 0x0d;
- static final int HPROF_CONTROL_SETTINGS = 0x0e;
- static final int HPROF_LOCKSTATS_WAIT_TIME = 0x10;
- static final int HPROF_LOCKSTATS_HOLD_TIME = 0x11;
-
- static final int HPROF_GC_ROOT_UNKNOWN = 0xff;
- static final int HPROF_GC_ROOT_JNI_GLOBAL = 0x01;
- static final int HPROF_GC_ROOT_JNI_LOCAL = 0x02;
- static final int HPROF_GC_ROOT_JAVA_FRAME = 0x03;
- static final int HPROF_GC_ROOT_NATIVE_STACK = 0x04;
- static final int HPROF_GC_ROOT_STICKY_CLASS = 0x05;
- static final int HPROF_GC_ROOT_THREAD_BLOCK = 0x06;
- static final int HPROF_GC_ROOT_MONITOR_USED = 0x07;
- static final int HPROF_GC_ROOT_THREAD_OBJ = 0x08;
-
- static final int HPROF_GC_CLASS_DUMP = 0x20;
- static final int HPROF_GC_INSTANCE_DUMP = 0x21;
- static final int HPROF_GC_OBJ_ARRAY_DUMP = 0x22;
- static final int HPROF_GC_PRIM_ARRAY_DUMP = 0x23;
-
- static final int HPROF_HEAP_DUMP_SEGMENT = 0x1c;
- static final int HPROF_HEAP_DUMP_END = 0x2c;
-
- private final static int T_CLASS = 2;
-
- private int version; // The version of .hprof being read
-
- private int debugLevel;
- private long currPos; // Current position in the file
-
- private int dumpsToSkip;
- private boolean callStack; // If true, read the call stack of objects
-
- private int identifierSize; // Size, in bytes, of identifiers.
- private Hashtable<Long, String> names;
-
- // Hashtable<Integer, ThreadObject>, used to map the thread sequence number
- // (aka "serial number") to the thread object ID for
- // HPROF_GC_ROOT_THREAD_OBJ. ThreadObject is a trivial inner class,
- // at the end of this file.
- private Hashtable<Integer, ThreadObject> threadObjects;
-
- // Hashtable<Long, String>, maps class object ID to class name
- // (with / converted to .)
- private Hashtable<Long, String> classNameFromObjectID;
-
- // Hashtable<Integer, Integer>, maps class serial # to class object ID
- private Hashtable<Integer, String> classNameFromSerialNo;
-
- // Hashtable<Long, StackFrame> maps stack frame ID to StackFrame.
- // Null if we're not tracking them.
- private Hashtable<Long, StackFrame> stackFrames;
-
- // Hashtable<Integer, StackTrace> maps stack frame ID to StackTrace
- // Null if we're not tracking them.
- private Hashtable<Integer, StackTrace> stackTraces;
-
- private Snapshot snapshot;
-
- public HprofReader(String fileName, PositionDataInputStream in,
- int dumpNumber, boolean callStack, int debugLevel)
- throws IOException {
- super(in);
- RandomAccessFile file = new RandomAccessFile(fileName, "r");
- this.snapshot = new Snapshot(MappedReadBuffer.create(file));
- this.dumpsToSkip = dumpNumber - 1;
- this.callStack = callStack;
- this.debugLevel = debugLevel;
- names = new Hashtable<Long, String>();
- threadObjects = new Hashtable<Integer, ThreadObject>(43);
- classNameFromObjectID = new Hashtable<Long, String>();
- if (callStack) {
- stackFrames = new Hashtable<Long, StackFrame>(43);
- stackTraces = new Hashtable<Integer, StackTrace>(43);
- classNameFromSerialNo = new Hashtable<Integer, String>();
- }
- }
-
- public Snapshot read() throws IOException {
- currPos = 4; // 4 because of the magic number
- version = readVersionHeader();
- identifierSize = in.readInt();
- snapshot.setIdentifierSize(identifierSize);
- if (version >= VERSION_JDK12BETA4) {
- snapshot.setNewStyleArrayClass(true);
- } else {
- snapshot.setNewStyleArrayClass(false);
- }
-
- currPos += 4;
- if (identifierSize != 4 && identifierSize != 8) {
- throw new IOException("I'm sorry, but I can't deal with an identifier size of " + identifierSize + ". I can only deal with 4 or 8.");
- }
- System.out.println("Dump file created " + (new Date(in.readLong())));
- currPos += 8;
-
- for (;;) {
- int type;
- try {
- type = in.readUnsignedByte();
- } catch (EOFException ignored) {
- break;
- }
- in.readInt(); // Timestamp of this record
- // Length of record: readInt() will return negative value for record
- // length >2GB. so store 32bit value in long to keep it unsigned.
- long length = in.readInt() & 0xffffffffL;
- if (debugLevel > 0) {
- System.out.println("Read record type " + type
- + ", length " + length
- + " at position " + toHex(currPos));
- }
- if (length < 0) {
- throw new IOException("Bad record length of " + length
- + " at byte " + toHex(currPos+5)
- + " of file.");
- }
- currPos += 9 + length;
- switch (type) {
- case HPROF_UTF8: {
- long id = readID();
- byte[] chars = new byte[(int)length - identifierSize];
- in.readFully(chars);
- names.put(id, new String(chars));
- break;
- }
- case HPROF_LOAD_CLASS: {
- int serialNo = in.readInt(); // Not used
- long classID = readID();
- int stackTraceSerialNo = in.readInt();
- long classNameID = readID();
- Long classIdI = classID;
- String nm = getNameFromID(classNameID).replace('/', '.');
- classNameFromObjectID.put(classIdI, nm);
- if (classNameFromSerialNo != null) {
- classNameFromSerialNo.put(serialNo, nm);
- }
- break;
- }
-
- case HPROF_HEAP_DUMP: {
- if (dumpsToSkip <= 0) {
- try {
- readHeapDump(length, currPos);
- } catch (EOFException exp) {
- handleEOF(exp, snapshot);
- }
- if (debugLevel > 0) {
- System.out.println(" Finished processing instances in heap dump.");
- }
- return snapshot;
- } else {
- dumpsToSkip--;
- skipBytes(length);
- }
- break;
- }
-
- case HPROF_HEAP_DUMP_END: {
- if (version >= VERSION_JDK6) {
- if (dumpsToSkip <= 0) {
- skipBytes(length); // should be no-op
- return snapshot;
- } else {
- // skip this dump (of the end record for a sequence of dump segments)
- dumpsToSkip--;
- }
- } else {
- // HPROF_HEAP_DUMP_END only recognized in >= 1.0.2
- warn("Ignoring unrecognized record type " + type);
- }
- skipBytes(length); // should be no-op
- break;
- }
-
- case HPROF_HEAP_DUMP_SEGMENT: {
- if (version >= VERSION_JDK6) {
- if (dumpsToSkip <= 0) {
- try {
- // read the dump segment
- readHeapDump(length, currPos);
- } catch (EOFException exp) {
- handleEOF(exp, snapshot);
- }
- } else {
- // all segments comprising the heap dump will be skipped
- skipBytes(length);
- }
- } else {
- // HPROF_HEAP_DUMP_SEGMENT only recognized in >= 1.0.2
- warn("Ignoring unrecognized record type " + type);
- skipBytes(length);
- }
- break;
- }
-
- case HPROF_FRAME: {
- if (stackFrames == null) {
- skipBytes(length);
- } else {
- long id = readID();
- String methodName = getNameFromID(readID());
- String methodSig = getNameFromID(readID());
- String sourceFile = getNameFromID(readID());
- int classSer = in.readInt();
- String className = classNameFromSerialNo.get(classSer);
- int lineNumber = in.readInt();
- if (lineNumber < StackFrame.LINE_NUMBER_NATIVE) {
- warn("Weird stack frame line number: " + lineNumber);
- lineNumber = StackFrame.LINE_NUMBER_UNKNOWN;
- }
- stackFrames.put(id,
- new StackFrame(methodName, methodSig,
- className, sourceFile,
- lineNumber));
- }
- break;
- }
- case HPROF_TRACE: {
- if (stackTraces == null) {
- skipBytes(length);
- } else {
- int serialNo = in.readInt();
- int threadSeq = in.readInt(); // Not used
- StackFrame[] frames = new StackFrame[in.readInt()];
- for (int i = 0; i < frames.length; i++) {
- long fid = readID();
- frames[i] = stackFrames.get(fid);
- if (frames[i] == null) {
- throw new IOException("Stack frame " + toHex(fid) + " not found");
- }
- }
- stackTraces.put(serialNo,
- new StackTrace(frames));
- }
- break;
- }
- case HPROF_UNLOAD_CLASS:
- case HPROF_ALLOC_SITES:
- case HPROF_START_THREAD:
- case HPROF_END_THREAD:
- case HPROF_HEAP_SUMMARY:
- case HPROF_CPU_SAMPLES:
- case HPROF_CONTROL_SETTINGS:
- case HPROF_LOCKSTATS_WAIT_TIME:
- case HPROF_LOCKSTATS_HOLD_TIME:
- {
- // Ignore these record types
- skipBytes(length);
- break;
- }
- default: {
- skipBytes(length);
- warn("Ignoring unrecognized record type " + type);
- }
- }
- }
-
- return snapshot;
- }
-
- private void skipBytes(long length) throws IOException {
- in.skipBytes((int)length);
- }
-
- private int readVersionHeader() throws IOException {
- int candidatesLeft = VERSIONS.length;
- boolean[] matched = new boolean[VERSIONS.length];
- for (int i = 0; i < candidatesLeft; i++) {
- matched[i] = true;
- }
-
- int pos = 0;
- while (candidatesLeft > 0) {
- char c = (char) in.readByte();
- currPos++;
- for (int i = 0; i < VERSIONS.length; i++) {
- if (matched[i]) {
- if (c != VERSIONS[i].charAt(pos)) { // Not matched
- matched[i] = false;
- --candidatesLeft;
- } else if (pos == VERSIONS[i].length() - 1) { // Full match
- return i;
- }
- }
- }
- ++pos;
- }
- throw new IOException("Version string not recognized at byte " + (pos+3));
- }
-
- private void readHeapDump(long bytesLeft, long posAtEnd) throws IOException {
- while (bytesLeft > 0) {
- int type = in.readUnsignedByte();
- if (debugLevel > 0) {
- System.out.println(" Read heap sub-record type " + type
- + " at position "
- + toHex(posAtEnd - bytesLeft));
- }
- bytesLeft--;
- switch(type) {
- case HPROF_GC_ROOT_UNKNOWN: {
- long id = readID();
- bytesLeft -= identifierSize;
- snapshot.addRoot(new Root(id, 0, Root.UNKNOWN, ""));
- break;
- }
- case HPROF_GC_ROOT_THREAD_OBJ: {
- long id = readID();
- int threadSeq = in.readInt();
- int stackSeq = in.readInt();
- bytesLeft -= identifierSize + 8;
- threadObjects.put(threadSeq,
- new ThreadObject(id, stackSeq));
- break;
- }
- case HPROF_GC_ROOT_JNI_GLOBAL: {
- long id = readID();
- long globalRefId = readID(); // Ignored, for now
- bytesLeft -= 2*identifierSize;
- snapshot.addRoot(new Root(id, 0, Root.NATIVE_STATIC, ""));
- break;
- }
- case HPROF_GC_ROOT_JNI_LOCAL: {
- long id = readID();
- int threadSeq = in.readInt();
- int depth = in.readInt();
- bytesLeft -= identifierSize + 8;
- ThreadObject to = getThreadObjectFromSequence(threadSeq);
- StackTrace st = getStackTraceFromSerial(to.stackSeq);
- if (st != null) {
- st = st.traceForDepth(depth+1);
- }
- snapshot.addRoot(new Root(id, to.threadId,
- Root.NATIVE_LOCAL, "", st));
- break;
- }
- case HPROF_GC_ROOT_JAVA_FRAME: {
- long id = readID();
- int threadSeq = in.readInt();
- int depth = in.readInt();
- bytesLeft -= identifierSize + 8;
- ThreadObject to = getThreadObjectFromSequence(threadSeq);
- StackTrace st = getStackTraceFromSerial(to.stackSeq);
- if (st != null) {
- st = st.traceForDepth(depth+1);
- }
- snapshot.addRoot(new Root(id, to.threadId,
- Root.JAVA_LOCAL, "", st));
- break;
- }
- case HPROF_GC_ROOT_NATIVE_STACK: {
- long id = readID();
- int threadSeq = in.readInt();
- bytesLeft -= identifierSize + 4;
- ThreadObject to = getThreadObjectFromSequence(threadSeq);
- StackTrace st = getStackTraceFromSerial(to.stackSeq);
- snapshot.addRoot(new Root(id, to.threadId,
- Root.NATIVE_STACK, "", st));
- break;
- }
- case HPROF_GC_ROOT_STICKY_CLASS: {
- long id = readID();
- bytesLeft -= identifierSize;
- snapshot.addRoot(new Root(id, 0, Root.SYSTEM_CLASS, ""));
- break;
- }
- case HPROF_GC_ROOT_THREAD_BLOCK: {
- long id = readID();
- int threadSeq = in.readInt();
- bytesLeft -= identifierSize + 4;
- ThreadObject to = getThreadObjectFromSequence(threadSeq);
- StackTrace st = getStackTraceFromSerial(to.stackSeq);
- snapshot.addRoot(new Root(id, to.threadId,
- Root.THREAD_BLOCK, "", st));
- break;
- }
- case HPROF_GC_ROOT_MONITOR_USED: {
- long id = readID();
- bytesLeft -= identifierSize;
- snapshot.addRoot(new Root(id, 0, Root.BUSY_MONITOR, ""));
- break;
- }
- case HPROF_GC_CLASS_DUMP: {
- int bytesRead = readClass();
- bytesLeft -= bytesRead;
- break;
- }
- case HPROF_GC_INSTANCE_DUMP: {
- int bytesRead = readInstance();
- bytesLeft -= bytesRead;
- break;
- }
- case HPROF_GC_OBJ_ARRAY_DUMP: {
- int bytesRead = readArray(false);
- bytesLeft -= bytesRead;
- break;
- }
- case HPROF_GC_PRIM_ARRAY_DUMP: {
- int bytesRead = readArray(true);
- bytesLeft -= bytesRead;
- break;
- }
- default: {
- throw new IOException("Unrecognized heap dump sub-record type: " + type);
- }
- }
- }
- if (bytesLeft != 0) {
- warn("Error reading heap dump or heap dump segment: Byte count is " + bytesLeft + " instead of 0");
- skipBytes(bytesLeft);
- }
- if (debugLevel > 0) {
- System.out.println(" Finished heap sub-records.");
- }
- }
-
- private long readID() throws IOException {
- return (identifierSize == 4)?
- (Snapshot.SMALL_ID_MASK & (long)in.readInt()) : in.readLong();
- }
-
- //
- // Read a java value. If result is non-null, it's expected to be an
- // array of one element. We use it to fake multiple return values.
- // @returns the number of bytes read
- //
- private int readValue(JavaThing[] resultArr) throws IOException {
- byte type = in.readByte();
- return 1 + readValueForType(type, resultArr);
- }
-
- private int readValueForType(byte type, JavaThing[] resultArr)
- throws IOException {
- if (version >= VERSION_JDK12BETA4) {
- type = signatureFromTypeId(type);
- }
- return readValueForTypeSignature(type, resultArr);
- }
-
- private int readValueForTypeSignature(byte type, JavaThing[] resultArr)
- throws IOException {
- switch (type) {
- case '[':
- case 'L': {
- long id = readID();
- if (resultArr != null) {
- resultArr[0] = new JavaObjectRef(id);
- }
- return identifierSize;
- }
- case 'Z': {
- int b = in.readByte();
- if (b != 0 && b != 1) {
- warn("Illegal boolean value read");
- }
- if (resultArr != null) {
- resultArr[0] = new JavaBoolean(b != 0);
- }
- return 1;
- }
- case 'B': {
- byte b = in.readByte();
- if (resultArr != null) {
- resultArr[0] = new JavaByte(b);
- }
- return 1;
- }
- case 'S': {
- short s = in.readShort();
- if (resultArr != null) {
- resultArr[0] = new JavaShort(s);
- }
- return 2;
- }
- case 'C': {
- char ch = in.readChar();
- if (resultArr != null) {
- resultArr[0] = new JavaChar(ch);
- }
- return 2;
- }
- case 'I': {
- int val = in.readInt();
- if (resultArr != null) {
- resultArr[0] = new JavaInt(val);
- }
- return 4;
- }
- case 'J': {
- long val = in.readLong();
- if (resultArr != null) {
- resultArr[0] = new JavaLong(val);
- }
- return 8;
- }
- case 'F': {
- float val = in.readFloat();
- if (resultArr != null) {
- resultArr[0] = new JavaFloat(val);
- }
- return 4;
- }
- case 'D': {
- double val = in.readDouble();
- if (resultArr != null) {
- resultArr[0] = new JavaDouble(val);
- }
- return 8;
- }
- default: {
- throw new IOException("Bad value signature: " + type);
- }
- }
- }
-
- private ThreadObject getThreadObjectFromSequence(int threadSeq)
- throws IOException {
- ThreadObject to = threadObjects.get(threadSeq);
- if (to == null) {
- throw new IOException("Thread " + threadSeq +
- " not found for JNI local ref");
- }
- return to;
- }
-
- private String getNameFromID(long id) throws IOException {
- return getNameFromID(Long.valueOf(id));
- }
-
- private String getNameFromID(Long id) throws IOException {
- if (id.longValue() == 0L) {
- return "";
- }
- String result = names.get(id);
- if (result == null) {
- warn("Name not found at " + toHex(id.longValue()));
- return "unresolved name " + toHex(id.longValue());
- }
- return result;
- }
-
- private StackTrace getStackTraceFromSerial(int ser) throws IOException {
- if (stackTraces == null) {
- return null;
- }
- StackTrace result = stackTraces.get(ser);
- if (result == null) {
- warn("Stack trace not found for serial # " + ser);
- }
- return result;
- }
-
- //
- // Handle a HPROF_GC_CLASS_DUMP
- // Return number of bytes read
- //
- private int readClass() throws IOException {
- long id = readID();
- StackTrace stackTrace = getStackTraceFromSerial(in.readInt());
- long superId = readID();
- long classLoaderId = readID();
- long signersId = readID();
- long protDomainId = readID();
- long reserved1 = readID();
- long reserved2 = readID();
- int instanceSize = in.readInt();
- int bytesRead = 7 * identifierSize + 8;
-
- int numConstPoolEntries = in.readUnsignedShort();
- bytesRead += 2;
- for (int i = 0; i < numConstPoolEntries; i++) {
- int index = in.readUnsignedShort(); // unused
- bytesRead += 2;
- bytesRead += readValue(null); // We ignore the values
- }
-
- int numStatics = in.readUnsignedShort();
- bytesRead += 2;
- JavaThing[] valueBin = new JavaThing[1];
- JavaStatic[] statics = new JavaStatic[numStatics];
- for (int i = 0; i < numStatics; i++) {
- long nameId = readID();
- bytesRead += identifierSize;
- byte type = in.readByte();
- bytesRead++;
- bytesRead += readValueForType(type, valueBin);
- String fieldName = getNameFromID(nameId);
- if (version >= VERSION_JDK12BETA4) {
- type = signatureFromTypeId(type);
- }
- String signature = "" + ((char) type);
- JavaField f = new JavaField(fieldName, signature);
- statics[i] = new JavaStatic(f, valueBin[0]);
- }
-
- int numFields = in.readUnsignedShort();
- bytesRead += 2;
- JavaField[] fields = new JavaField[numFields];
- for (int i = 0; i < numFields; i++) {
- long nameId = readID();
- bytesRead += identifierSize;
- byte type = in.readByte();
- bytesRead++;
- String fieldName = getNameFromID(nameId);
- if (version >= VERSION_JDK12BETA4) {
- type = signatureFromTypeId(type);
- }
- String signature = "" + ((char) type);
- fields[i] = new JavaField(fieldName, signature);
- }
- String name = classNameFromObjectID.get(id);
- if (name == null) {
- warn("Class name not found for " + toHex(id));
- name = "unknown-name@" + toHex(id);
- }
- JavaClass c = new JavaClass(id, name, superId, classLoaderId, signersId,
- protDomainId, fields, statics,
- instanceSize);
- snapshot.addClass(id, c);
- snapshot.setSiteTrace(c, stackTrace);
-
- return bytesRead;
- }
-
- private String toHex(long addr) {
- return com.sun.tools.hat.internal.util.Misc.toHex(addr);
- }
-
- //
- // Handle a HPROF_GC_INSTANCE_DUMP
- // Return number of bytes read
- //
- private int readInstance() throws IOException {
- long start = in.position();
- long id = readID();
- StackTrace stackTrace = getStackTraceFromSerial(in.readInt());
- long classID = readID();
- int bytesFollowing = in.readInt();
- int bytesRead = (2 * identifierSize) + 8 + bytesFollowing;
- JavaObject jobj = new JavaObject(classID, start);
- skipBytes(bytesFollowing);
- snapshot.addHeapObject(id, jobj);
- snapshot.setSiteTrace(jobj, stackTrace);
- return bytesRead;
- }
-
- //
- // Handle a HPROF_GC_OBJ_ARRAY_DUMP or HPROF_GC_PRIM_ARRAY_DUMP
- // Return number of bytes read
- //
- private int readArray(boolean isPrimitive) throws IOException {
- long start = in.position();
- long id = readID();
- StackTrace stackTrace = getStackTraceFromSerial(in.readInt());
- int num = in.readInt();
- int bytesRead = identifierSize + 8;
- long elementClassID;
- if (isPrimitive) {
- elementClassID = in.readByte();
- bytesRead++;
- } else {
- elementClassID = readID();
- bytesRead += identifierSize;
- }
-
- // Check for primitive arrays:
- byte primitiveSignature = 0x00;
- int elSize = 0;
- if (isPrimitive || version < VERSION_JDK12BETA4) {
- switch ((int)elementClassID) {
- case T_BOOLEAN: {
- primitiveSignature = (byte) 'Z';
- elSize = 1;
- break;
- }
- case T_CHAR: {
- primitiveSignature = (byte) 'C';
- elSize = 2;
- break;
- }
- case T_FLOAT: {
- primitiveSignature = (byte) 'F';
- elSize = 4;
- break;
- }
- case T_DOUBLE: {
- primitiveSignature = (byte) 'D';
- elSize = 8;
- break;
- }
- case T_BYTE: {
- primitiveSignature = (byte) 'B';
- elSize = 1;
- break;
- }
- case T_SHORT: {
- primitiveSignature = (byte) 'S';
- elSize = 2;
- break;
- }
- case T_INT: {
- primitiveSignature = (byte) 'I';
- elSize = 4;
- break;
- }
- case T_LONG: {
- primitiveSignature = (byte) 'J';
- elSize = 8;
- break;
- }
- }
- if (version >= VERSION_JDK12BETA4 && primitiveSignature == 0x00) {
- throw new IOException("Unrecognized typecode: "
- + elementClassID);
- }
- }
- if (primitiveSignature != 0x00) {
- int size = elSize * num;
- bytesRead += size;
- JavaValueArray va = new JavaValueArray(primitiveSignature, start);
- skipBytes(size);
- snapshot.addHeapObject(id, va);
- snapshot.setSiteTrace(va, stackTrace);
- } else {
- int sz = num * identifierSize;
- bytesRead += sz;
- JavaObjectArray arr = new JavaObjectArray(elementClassID, start);
- skipBytes(sz);
- snapshot.addHeapObject(id, arr);
- snapshot.setSiteTrace(arr, stackTrace);
- }
- return bytesRead;
- }
-
- private byte signatureFromTypeId(byte typeId) throws IOException {
- switch (typeId) {
- case T_CLASS: {
- return (byte) 'L';
- }
- case T_BOOLEAN: {
- return (byte) 'Z';
- }
- case T_CHAR: {
- return (byte) 'C';
- }
- case T_FLOAT: {
- return (byte) 'F';
- }
- case T_DOUBLE: {
- return (byte) 'D';
- }
- case T_BYTE: {
- return (byte) 'B';
- }
- case T_SHORT: {
- return (byte) 'S';
- }
- case T_INT: {
- return (byte) 'I';
- }
- case T_LONG: {
- return (byte) 'J';
- }
- default: {
- throw new IOException("Invalid type id of " + typeId);
- }
- }
- }
-
- private void handleEOF(EOFException exp, Snapshot snapshot) {
- if (debugLevel > 0) {
- exp.printStackTrace();
- }
- warn("Unexpected EOF. Will miss information...");
- // we have EOF, we have to tolerate missing references
- snapshot.setUnresolvedObjectsOK(true);
- }
-
- private void warn(String msg) {
- System.out.println("WARNING: " + msg);
- }
-
- //
- // A trivial data-holder class for HPROF_GC_ROOT_THREAD_OBJ.
- //
- private class ThreadObject {
-
- long threadId;
- int stackSeq;
-
- ThreadObject(long threadId, int stackSeq) {
- this.threadId = threadId;
- this.stackSeq = stackSeq;
- }
- }
-
-}
--- a/jdk/src/jdk.dev/share/classes/com/sun/tools/hat/internal/parser/MappedReadBuffer.java Thu May 21 10:07:38 2015 -0700
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,114 +0,0 @@
-/*
- * Copyright (c) 1997, 2008, Oracle and/or its affiliates. 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. Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-
-/*
- * The Original Code is HAT. The Initial Developer of the
- * Original Code is Bill Foote, with contributions from others
- * at JavaSoft/Sun.
- */
-
-package com.sun.tools.hat.internal.parser;
-
-import java.io.IOException;
-import java.io.RandomAccessFile;
-import java.nio.MappedByteBuffer;
-import java.nio.channels.FileChannel;
-
-/**
- * Implementation of ReadBuffer using mapped file buffer
- *
- * @author A. Sundararajan
- */
-class MappedReadBuffer implements ReadBuffer {
- private MappedByteBuffer buf;
-
- MappedReadBuffer(MappedByteBuffer buf) {
- this.buf = buf;
- }
-
- // factory method to create correct ReadBuffer for a given file
- static ReadBuffer create(RandomAccessFile file) throws IOException {
- FileChannel ch = file.getChannel();
- long size = ch.size();
- // if file size is more than 2 GB and when file mapping is
- // configured (default), use mapped file reader
- if (canUseFileMap() && (size <= Integer.MAX_VALUE)) {
- MappedByteBuffer buf;
- try {
- buf = ch.map(FileChannel.MapMode.READ_ONLY, 0, size);
- ch.close();
- return new MappedReadBuffer(buf);
- } catch (IOException exp) {
- exp.printStackTrace();
- System.err.println("File mapping failed, will use direct read");
- // fall through
- }
- } // else fall through
- return new FileReadBuffer(file);
- }
-
- private static boolean canUseFileMap() {
- // set jhat.disableFileMap to any value other than "false"
- // to disable file mapping
- String prop = System.getProperty("jhat.disableFileMap");
- return prop == null || prop.equals("false");
- }
-
- private void seek(long pos) throws IOException {
- assert pos <= Integer.MAX_VALUE : "position overflow";
- buf.position((int)pos);
- }
-
- public synchronized void get(long pos, byte[] res) throws IOException {
- seek(pos);
- buf.get(res);
- }
-
- public synchronized char getChar(long pos) throws IOException {
- seek(pos);
- return buf.getChar();
- }
-
- public synchronized byte getByte(long pos) throws IOException {
- seek(pos);
- return buf.get();
- }
-
- public synchronized short getShort(long pos) throws IOException {
- seek(pos);
- return buf.getShort();
- }
-
- public synchronized int getInt(long pos) throws IOException {
- seek(pos);
- return buf.getInt();
- }
-
- public synchronized long getLong(long pos) throws IOException {
- seek(pos);
- return buf.getLong();
- }
-}
--- a/jdk/src/jdk.dev/share/classes/com/sun/tools/hat/internal/parser/PositionDataInputStream.java Thu May 21 10:07:38 2015 -0700
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,64 +0,0 @@
-/*
- * Copyright (c) 1997, 2008, Oracle and/or its affiliates. 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. Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-
-/*
- * The Original Code is HAT. The Initial Developer of the
- * Original Code is Bill Foote, with contributions from others
- * at JavaSoft/Sun.
- */
-
-package com.sun.tools.hat.internal.parser;
-
-import java.io.DataInputStream;
-import java.io.InputStream;
-
-/**
- * A DataInputStream that keeps track of total bytes read
- * (in effect 'position' in stream) so far.
- *
- */
-public class PositionDataInputStream extends DataInputStream {
- public PositionDataInputStream(InputStream in) {
- super(in instanceof PositionInputStream?
- in : new PositionInputStream(in));
- }
-
- public boolean markSupported() {
- return false;
- }
-
- public void mark(int readLimit) {
- throw new UnsupportedOperationException("mark");
- }
-
- public void reset() {
- throw new UnsupportedOperationException("reset");
- }
-
- public long position() {
- return ((PositionInputStream)in).position();
- }
-}
--- a/jdk/src/jdk.dev/share/classes/com/sun/tools/hat/internal/parser/PositionInputStream.java Thu May 21 10:07:38 2015 -0700
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,84 +0,0 @@
-/*
- * Copyright (c) 1997, 2008, Oracle and/or its affiliates. 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. Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-
-/*
- * The Original Code is HAT. The Initial Developer of the
- * Original Code is Bill Foote, with contributions from others
- * at JavaSoft/Sun.
- */
-
-package com.sun.tools.hat.internal.parser;
-
-import java.io.FilterInputStream;
-import java.io.IOException;
-import java.io.InputStream;
-
-/**
- * InputStream that keeps track of total bytes read (in effect
- * 'position' in stream) from the input stream.
- *
- */
-public class PositionInputStream extends FilterInputStream {
- private long position = 0L;
-
- public PositionInputStream(InputStream in) {
- super(in);
- }
-
- public int read() throws IOException {
- int res = super.read();
- if (res != -1) position++;
- return res;
- }
-
- public int read(byte[] b, int off, int len) throws IOException {
- int res = super.read(b, off, len);
- if (res != -1) position += res;
- return res;
- }
-
- public long skip(long n) throws IOException {
- long res = super.skip(n);
- position += res;
- return res;
- }
-
- public boolean markSupported() {
- return false;
- }
-
- public void mark(int readLimit) {
- throw new UnsupportedOperationException("mark");
- }
-
- public void reset() {
- throw new UnsupportedOperationException("reset");
- }
-
- public long position() {
- return position;
- }
-}
--- a/jdk/src/jdk.dev/share/classes/com/sun/tools/hat/internal/parser/ReadBuffer.java Thu May 21 10:07:38 2015 -0700
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,51 +0,0 @@
-/*
- * Copyright (c) 1997, 2008, Oracle and/or its affiliates. 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. Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-
-/*
- * The Original Code is HAT. The Initial Developer of the
- * Original Code is Bill Foote, with contributions from others
- * at JavaSoft/Sun.
- */
-
-package com.sun.tools.hat.internal.parser;
-
-import java.io.IOException;
-
-/**
- * Positionable read only buffer
- *
- * @author A. Sundararajan
- */
-public interface ReadBuffer {
- // read methods - only byte array and int primitive types.
- // read position has to be specified always.
- public void get(long pos, byte[] buf) throws IOException;
- public char getChar(long pos) throws IOException;
- public byte getByte(long pos) throws IOException;
- public short getShort(long pos) throws IOException;
- public int getInt(long pos) throws IOException;
- public long getLong(long pos) throws IOException;
-}
--- a/jdk/src/jdk.dev/share/classes/com/sun/tools/hat/internal/parser/Reader.java Thu May 21 10:07:38 2015 -0700
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,100 +0,0 @@
-/*
- * Copyright (c) 1997, 2008, Oracle and/or its affiliates. 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. Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-
-/*
- * The Original Code is HAT. The Initial Developer of the
- * Original Code is Bill Foote, with contributions from others
- * at JavaSoft/Sun.
- */
-
-package com.sun.tools.hat.internal.parser;
-
-import java.io.*;
-import com.sun.tools.hat.internal.model.*;
-
-/**
- * Abstract base class for reading object dump files. A reader need not be
- * thread-safe.
- *
- * @author Bill Foote
- */
-
-
-public abstract class Reader {
- protected PositionDataInputStream in;
-
- protected Reader(PositionDataInputStream in) {
- this.in = in;
- }
-
- /**
- * Read a snapshot from a data input stream. It is assumed that the magic
- * number has already been read.
- */
- abstract public Snapshot read() throws IOException;
-
- /**
- * Read a snapshot from a file.
- *
- * @param heapFile The name of a file containing a heap dump
- * @param callStack If true, read the call stack of allocaation sites
- */
- public static Snapshot readFile(String heapFile, boolean callStack,
- int debugLevel)
- throws IOException {
- int dumpNumber = 1;
- int pos = heapFile.lastIndexOf('#');
- if (pos > -1) {
- String num = heapFile.substring(pos+1, heapFile.length());
- try {
- dumpNumber = Integer.parseInt(num, 10);
- } catch (java.lang.NumberFormatException ex) {
- String msg = "In file name \"" + heapFile
- + "\", a dump number was "
- + "expected after the :, but \""
- + num + "\" was found instead.";
- System.err.println(msg);
- throw new IOException(msg);
- }
- heapFile = heapFile.substring(0, pos);
- }
- PositionDataInputStream in = new PositionDataInputStream(
- new BufferedInputStream(new FileInputStream(heapFile)));
- try {
- int i = in.readInt();
- if (i == HprofReader.MAGIC_NUMBER) {
- Reader r
- = new HprofReader(heapFile, in, dumpNumber,
- callStack, debugLevel);
- return r.read();
- } else {
- throw new IOException("Unrecognized magic number: " + i);
- }
- } finally {
- in.close();
- }
- }
-}
--- a/jdk/src/jdk.dev/share/classes/com/sun/tools/hat/internal/server/AllClassesQuery.java Thu May 21 10:07:38 2015 -0700
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,150 +0,0 @@
-/*
- * Copyright (c) 1997, 2014, Oracle and/or its affiliates. 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. Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-
-/*
- * The Original Code is HAT. The Initial Developer of the
- * Original Code is Bill Foote, with contributions from others
- * at JavaSoft/Sun.
- */
-
-package com.sun.tools.hat.internal.server;
-
-import com.sun.tools.hat.internal.model.*;
-import java.util.Iterator;
-
-/**
- *
- * @author Bill Foote
- */
-
-
-class AllClassesQuery extends QueryHandler {
-
- boolean excludePlatform;
- boolean oqlSupported;
-
- public AllClassesQuery(boolean excludePlatform, boolean oqlSupported) {
- this.excludePlatform = excludePlatform;
- this.oqlSupported = oqlSupported;
- }
-
- public void run() {
- if (excludePlatform) {
- startHtml("All Classes (excluding platform)");
- } else {
- startHtml("All Classes (including platform)");
- }
-
- Iterator<JavaClass> classes = snapshot.getClasses();
- String lastPackage = null;
- while (classes.hasNext()) {
- JavaClass clazz = classes.next();
- if (excludePlatform && PlatformClasses.isPlatformClass(clazz)) {
- // skip this..
- continue;
- }
- String name = clazz.getName();
- int pos = name.lastIndexOf('.');
- String pkg;
- if (name.startsWith("[")) { // Only in ancient heap dumps
- pkg = "<Arrays>";
- } else if (pos == -1) {
- pkg = "<Default Package>";
- } else {
- pkg = name.substring(0, pos);
- }
- if (!pkg.equals(lastPackage)) {
- out.print("<h2>Package ");
- print(pkg);
- out.println("</h2>");
- }
- lastPackage = pkg;
- printClass(clazz);
- if (clazz.getId() != -1) {
- print(" [" + clazz.getIdString() + "]");
- }
- out.println("<br>");
- }
-
- out.println("<h2>Other Queries</h2>");
- out.println("<ul>");
-
- out.println("<li>");
- printAnchorStart();
- if (excludePlatform) {
- out.print("allClassesWithPlatform/\">");
- print("All classes including platform");
- } else {
- out.print("\">");
- print("All classes excluding platform");
- }
- out.println("</a>");
-
- out.println("<li>");
- printAnchorStart();
- out.print("showRoots/\">");
- print("Show all members of the rootset");
- out.println("</a>");
-
- out.println("<li>");
- printAnchorStart();
- out.print("showInstanceCounts/includePlatform/\">");
- print("Show instance counts for all classes (including platform)");
- out.println("</a>");
-
- out.println("<li>");
- printAnchorStart();
- out.print("showInstanceCounts/\">");
- print("Show instance counts for all classes (excluding platform)");
- out.println("</a>");
-
- out.println("<li>");
- printAnchorStart();
- out.print("histo/\">");
- print("Show heap histogram");
- out.println("</a>");
-
- out.println("<li>");
- printAnchorStart();
- out.print("finalizerSummary/\">");
- print("Show finalizer summary");
- out.println("</a>");
-
- if (oqlSupported) {
- out.println("<li>");
- printAnchorStart();
- out.print("oql/\">");
- print("Execute Object Query Language (OQL) query");
- out.println("</a>");
- }
-
- out.println("</ul>");
-
- endHtml();
- }
-
-
-}
--- a/jdk/src/jdk.dev/share/classes/com/sun/tools/hat/internal/server/AllRootsQuery.java Thu May 21 10:07:38 2015 -0700
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,108 +0,0 @@
-/*
- * Copyright (c) 1997, 2008, Oracle and/or its affiliates. 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. Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-
-/*
- * The Original Code is HAT. The Initial Developer of the
- * Original Code is Bill Foote, with contributions from others
- * at JavaSoft/Sun.
- */
-
-package com.sun.tools.hat.internal.server;
-
-import java.util.Vector;
-
-import com.sun.tools.hat.internal.model.*;
-import com.sun.tools.hat.internal.util.ArraySorter;
-import com.sun.tools.hat.internal.util.Comparer;
-
-/**
- *
- * @author Bill Foote
- */
-
-
-class AllRootsQuery extends QueryHandler {
-
- public AllRootsQuery() {
- }
-
- public void run() {
- startHtml("All Members of the Rootset");
-
- Root[] roots = snapshot.getRootsArray();
- ArraySorter.sort(roots, new Comparer() {
- public int compare(Object lhs, Object rhs) {
- Root left = (Root) lhs;
- Root right = (Root) rhs;
- int d = left.getType() - right.getType();
- if (d != 0) {
- return -d; // More interesting values are *higher*
- }
- return left.getDescription().compareTo(right.getDescription());
- }
- });
-
- int lastType = Root.INVALID_TYPE;
-
- for (int i= 0; i < roots.length; i++) {
- Root root = roots[i];
-
- if (root.getType() != lastType) {
- lastType = root.getType();
- out.print("<h2>");
- print(root.getTypeName() + " References");
- out.println("</h2>");
- }
-
- printRoot(root);
- if (root.getReferer() != null) {
- out.print("<small> (from ");
- printThingAnchorTag(root.getReferer().getId());
- print(root.getReferer().toString());
- out.print(")</a></small>");
- }
- out.print(" :<br>");
-
- JavaThing t = snapshot.findThing(root.getId());
- if (t != null) { // It should always be
- print("--> ");
- printThing(t);
- out.println("<br>");
- }
- }
-
- out.println("<h2>Other Queries</h2>");
- out.println("<ul>");
- out.println("<li>");
- printAnchorStart();
- out.print("\">");
- print("Show All Classes");
- out.println("</a>");
- out.println("</ul>");
-
- endHtml();
- }
-}
--- a/jdk/src/jdk.dev/share/classes/com/sun/tools/hat/internal/server/ClassQuery.java Thu May 21 10:07:38 2015 -0700
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,190 +0,0 @@
-/*
- * Copyright (c) 1997, 2014, Oracle and/or its affiliates. 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. Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-
-/*
- * The Original Code is HAT. The Initial Developer of the
- * Original Code is Bill Foote, with contributions from others
- * at JavaSoft/Sun.
- */
-
-package com.sun.tools.hat.internal.server;
-
-import com.sun.tools.hat.internal.model.*;
-import com.sun.tools.hat.internal.util.ArraySorter;
-import com.sun.tools.hat.internal.util.Comparer;
-
-import java.util.Enumeration;
-
-/**
- *
- * @author Bill Foote
- */
-
-
-class ClassQuery extends QueryHandler {
-
-
- public ClassQuery() {
- }
-
- public void run() {
- startHtml("Class " + query);
- JavaClass clazz = snapshot.findClass(query);
- if (clazz == null) {
- error("class not found: " + query);
- } else {
- printFullClass(clazz);
- }
- endHtml();
- }
-
- protected void printFullClass(JavaClass clazz) {
- out.print("<h1>");
- print(clazz.toString());
- out.println("</h1>");
-
- out.println("<h2>Superclass:</h2>");
- printClass(clazz.getSuperclass());
-
- out.println("<h2>Loader Details</h2>");
- out.println("<h3>ClassLoader:</h3>");
- printThing(clazz.getLoader());
-
- out.println("<h3>Signers:</h3>");
- printThing(clazz.getSigners());
-
- out.println("<h3>Protection Domain:</h3>");
- printThing(clazz.getProtectionDomain());
-
- out.println("<h2>Subclasses:</h2>");
- JavaClass[] sc = clazz.getSubclasses();
- for (int i = 0; i < sc.length; i++) {
- out.print(" ");
- printClass(sc[i]);
- out.println("<br>");
- }
-
- out.println("<h2>Instance Data Members:</h2>");
- JavaField[] ff = clazz.getFields().clone();
- ArraySorter.sort(ff, new Comparer() {
- public int compare(Object lhs, Object rhs) {
- JavaField left = (JavaField) lhs;
- JavaField right = (JavaField) rhs;
- return left.getName().compareTo(right.getName());
- }
- });
- for (int i = 0; i < ff.length; i++) {
- out.print(" ");
- printField(ff[i]);
- out.println("<br>");
- }
-
- out.println("<h2>Static Data Members:</h2>");
- JavaStatic[] ss = clazz.getStatics();
- for (int i = 0; i < ss.length; i++) {
- printStatic(ss[i]);
- out.println("<br>");
- }
-
- out.println("<h2>Instances</h2>");
-
- printAnchorStart();
- print("instances/" + encodeForURL(clazz));
- out.print("\">");
- out.println("Exclude subclasses</a><br>");
-
- printAnchorStart();
- print("allInstances/" + encodeForURL(clazz));
- out.print("\">");
- out.println("Include subclasses</a><br>");
-
-
- if (snapshot.getHasNewSet()) {
- out.println("<h2>New Instances</h2>");
-
- printAnchorStart();
- print("newInstances/" + encodeForURL(clazz));
- out.print("\">");
- out.println("Exclude subclasses</a><br>");
-
- printAnchorStart();
- print("allNewInstances/" + encodeForURL(clazz));
- out.print("\">");
- out.println("Include subclasses</a><br>");
- }
-
- out.println("<h2>References summary by Type</h2>");
- printAnchorStart();
- print("refsByType/" + encodeForURL(clazz));
- out.print("\">");
- out.println("References summary by type</a>");
-
- printReferencesTo(clazz);
- }
-
- protected void printReferencesTo(JavaHeapObject obj) {
- if (obj.getId() == -1) {
- return;
- }
- out.println("<h2>References to this object:</h2>");
- out.flush();
- Enumeration<JavaThing> referers = obj.getReferers();
- while (referers.hasMoreElements()) {
- JavaHeapObject ref = (JavaHeapObject) referers.nextElement();
- printThing(ref);
- print (" : " + ref.describeReferenceTo(obj, snapshot));
- // If there are more than one references, this only gets the
- // first one.
- out.println("<br>");
- }
-
- out.println("<h2>Other Queries</h2>");
- out.println("Reference Chains from Rootset");
- long id = obj.getId();
-
- out.print("<ul><li>");
- printAnchorStart();
- out.print("roots/");
- printHex(id);
- out.print("\">");
- out.println("Exclude weak refs</a>");
-
- out.print("<li>");
- printAnchorStart();
- out.print("allRoots/");
- printHex(id);
- out.print("\">");
- out.println("Include weak refs</a></ul>");
-
- printAnchorStart();
- out.print("reachableFrom/");
- printHex(id);
- out.print("\">");
- out.println("Objects reachable from here</a><br>");
- }
-
-
-}
--- a/jdk/src/jdk.dev/share/classes/com/sun/tools/hat/internal/server/FinalizerObjectsQuery.java Thu May 21 10:07:38 2015 -0700
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,54 +0,0 @@
-/*
- * Copyright (c) 1997, 2014, Oracle and/or its affiliates. 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. Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-
-/*
- * The Original Code is HAT. The Initial Developer of the
- * Original Code is Bill Foote, with contributions from others
- * at JavaSoft/Sun.
- */
-
-package com.sun.tools.hat.internal.server;
-
-import com.sun.tools.hat.internal.model.*;
-import java.util.*;
-
-public class FinalizerObjectsQuery extends QueryHandler {
- public void run() {
- Enumeration<?> objs = snapshot.getFinalizerObjects();
- startHtml("Objects pending finalization");
-
- out.println("<a href='/finalizerSummary/'>Finalizer summary</a>");
-
- out.println("<h1>Objects pending finalization</h1>");
-
- while (objs.hasMoreElements()) {
- printThing((JavaHeapObject)objs.nextElement());
- out.println("<br>");
- }
-
- endHtml();
- }
-}
--- a/jdk/src/jdk.dev/share/classes/com/sun/tools/hat/internal/server/FinalizerSummaryQuery.java Thu May 21 10:07:38 2015 -0700
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,128 +0,0 @@
-/*
- * Copyright (c) 1997, 2014, Oracle and/or its affiliates. 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. Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-
-/*
- * The Original Code is HAT. The Initial Developer of the
- * Original Code is Bill Foote, with contributions from others
- * at JavaSoft/Sun.
- */
-
-package com.sun.tools.hat.internal.server;
-
-import com.sun.tools.hat.internal.model.*;
-import java.util.*;
-
-public class FinalizerSummaryQuery extends QueryHandler {
- public void run() {
- Enumeration<?> objs = snapshot.getFinalizerObjects();
- startHtml("Finalizer Summary");
-
- out.println("<p align='center'>");
- out.println("<b><a href='/'>All Classes (excluding platform)</a></b>");
- out.println("</p>");
-
- printFinalizerSummary(objs);
- endHtml();
- }
-
- private static class HistogramElement {
- public HistogramElement(JavaClass clazz) {
- this.clazz = clazz;
- }
-
- public void updateCount() {
- this.count++;
- }
-
- public int compare(HistogramElement other) {
- long diff = other.count - count;
- return (diff == 0L)? 0 : ((diff > 0L)? +1 : -1);
- }
-
- public JavaClass getClazz() {
- return clazz;
- }
-
- public long getCount() {
- return count;
- }
-
- private JavaClass clazz;
- private long count;
- }
-
- private void printFinalizerSummary(Enumeration<?> objs) {
- int count = 0;
- Map<JavaClass, HistogramElement> map = new HashMap<JavaClass, HistogramElement>();
-
- while (objs.hasMoreElements()) {
- JavaHeapObject obj = (JavaHeapObject) objs.nextElement();
- count++;
- JavaClass clazz = obj.getClazz();
- if (! map.containsKey(clazz)) {
- map.put(clazz, new HistogramElement(clazz));
- }
- HistogramElement element = map.get(clazz);
- element.updateCount();
- }
-
- out.println("<p align='center'>");
- out.println("<b>");
- out.println("Total ");
- if (count != 0) {
- out.print("<a href='/finalizerObjects/'>instances</a>");
- } else {
- out.print("instances");
- }
- out.println(" pending finalization: ");
- out.print(count);
- out.println("</b></p><hr>");
-
- if (count == 0) {
- return;
- }
-
- // calculate and print histogram
- HistogramElement[] elements = new HistogramElement[map.size()];
- map.values().toArray(elements);
- Arrays.sort(elements, new Comparator<HistogramElement>() {
- public int compare(HistogramElement o1, HistogramElement o2) {
- return o1.compare(o2);
- }
- });
-
- out.println("<table border=1 align=center>");
- out.println("<tr><th>Count</th><th>Class</th></tr>");
- for (int j = 0; j < elements.length; j++) {
- out.println("<tr><td>");
- out.println(elements[j].getCount());
- out.println("</td><td>");
- printClass(elements[j].getClazz());
- out.println("</td><tr>");
- }
- out.println("</table>");
- }
-}
--- a/jdk/src/jdk.dev/share/classes/com/sun/tools/hat/internal/server/HistogramQuery.java Thu May 21 10:07:38 2015 -0700
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,99 +0,0 @@
-/*
- * Copyright (c) 1997, 2008, Oracle and/or its affiliates. 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. Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-
-/*
- * The Original Code is HAT. The Initial Developer of the
- * Original Code is Bill Foote, with contributions from others
- * at JavaSoft/Sun.
- */
-
-package com.sun.tools.hat.internal.server;
-
-import com.sun.tools.hat.internal.model.JavaClass;
-import java.util.Arrays;
-import java.util.Comparator;
-
-/**
- * Prints histogram sortable by class name, count and size.
- *
- */
-public class HistogramQuery extends QueryHandler {
- public void run() {
- JavaClass[] classes = snapshot.getClassesArray();
- Comparator<JavaClass> comparator;
- if (query.equals("count")) {
- comparator = new Comparator<JavaClass>() {
- public int compare(JavaClass first, JavaClass second) {
- long diff = (second.getInstancesCount(false) -
- first.getInstancesCount(false));
- return (diff == 0)? 0: ((diff < 0)? -1 : + 1);
- }
- };
- } else if (query.equals("class")) {
- comparator = new Comparator<JavaClass>() {
- public int compare(JavaClass first, JavaClass second) {
- return first.getName().compareTo(second.getName());
- }
- };
- } else {
- // default sort is by total size
- comparator = new Comparator<JavaClass>() {
- public int compare(JavaClass first, JavaClass second) {
- long diff = (second.getTotalInstanceSize() -
- first.getTotalInstanceSize());
- return (diff == 0)? 0: ((diff < 0)? -1 : + 1);
- }
- };
- }
- Arrays.sort(classes, comparator);
-
- startHtml("Heap Histogram");
-
- out.println("<p align='center'>");
- out.println("<b><a href='/'>All Classes (excluding platform)</a></b>");
- out.println("</p>");
-
- out.println("<table align=center border=1>");
- out.println("<tr><th><a href='/histo/class'>Class</a></th>");
- out.println("<th><a href='/histo/count'>Instance Count</a></th>");
- out.println("<th><a href='/histo/size'>Total Size</a></th></tr>");
- for (int i = 0; i < classes.length; i++) {
- JavaClass clazz = classes[i];
- out.println("<tr><td>");
- printClass(clazz);
- out.println("</td>");
- out.println("<td>");
- out.println(clazz.getInstancesCount(false));
- out.println("</td>");
- out.println("<td>");
- out.println(clazz.getTotalInstanceSize());
- out.println("</td></tr>");
- }
- out.println("</table>");
-
- endHtml();
- }
-}
--- a/jdk/src/jdk.dev/share/classes/com/sun/tools/hat/internal/server/HttpReader.java Thu May 21 10:07:38 2015 -0700
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,220 +0,0 @@
-/*
- * Copyright (c) 1997, 2013, Oracle and/or its affiliates. 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. Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-
-/*
- * The Original Code is HAT. The Initial Developer of the
- * Original Code is Bill Foote, with contributions from others
- * at JavaSoft/Sun.
- */
-
-package com.sun.tools.hat.internal.server;
-
-/**
- * Reads a single HTTP query from a socket, and starts up a QueryHandler
- * to server it.
- *
- * @author Bill Foote
- */
-
-
-import java.net.Socket;
-
-import java.io.InputStream;
-import java.io.BufferedInputStream;
-import java.io.IOException;
-import java.io.BufferedWriter;
-import java.io.PrintWriter;
-import java.io.OutputStreamWriter;
-
-import com.sun.tools.hat.internal.model.Snapshot;
-import com.sun.tools.hat.internal.oql.OQLEngine;
-import com.sun.tools.hat.internal.util.Misc;
-
-public class HttpReader implements Runnable {
-
-
- private Socket socket;
- private PrintWriter out;
- private Snapshot snapshot;
- private OQLEngine engine;
-
- public HttpReader (Socket s, Snapshot snapshot, OQLEngine engine) {
- this.socket = s;
- this.snapshot = snapshot;
- this.engine = engine;
- }
-
- public void run() {
- InputStream in = null;
- try {
- in = new BufferedInputStream(socket.getInputStream());
- out = new PrintWriter(new BufferedWriter(
- new OutputStreamWriter(
- socket.getOutputStream())));
- out.println("HTTP/1.0 200 OK");
- out.println("Cache-Control: no-cache");
- out.println("Pragma: no-cache");
- out.println();
- if (in.read() != 'G' || in.read() != 'E'
- || in.read() != 'T' || in.read() != ' ') {
- outputError("Protocol error");
- }
- int data;
- StringBuilder queryBuf = new StringBuilder();
- while ((data = in.read()) != -1 && data != ' ') {
- char ch = (char) data;
- queryBuf.append(ch);
- }
- String query = queryBuf.toString();
- query = java.net.URLDecoder.decode(query, "UTF-8");
- QueryHandler handler = null;
- if (snapshot == null) {
- outputError("The heap snapshot is still being read.");
- return;
- } else if (query.equals("/")) {
- handler = new AllClassesQuery(true, engine != null);
- handler.setUrlStart("");
- handler.setQuery("");
- } else if (query.startsWith("/oql/")) {
- if (engine != null) {
- handler = new OQLQuery(engine);
- handler.setUrlStart("");
- handler.setQuery(query.substring(5));
- }
- } else if (query.startsWith("/oqlhelp/")) {
- if (engine != null) {
- handler = new OQLHelp();
- handler.setUrlStart("");
- handler.setQuery("");
- }
- } else if (query.equals("/allClassesWithPlatform/")) {
- handler = new AllClassesQuery(false, engine != null);
- handler.setUrlStart("../");
- handler.setQuery("");
- } else if (query.equals("/showRoots/")) {
- handler = new AllRootsQuery();
- handler.setUrlStart("../");
- handler.setQuery("");
- } else if (query.equals("/showInstanceCounts/includePlatform/")) {
- handler = new InstancesCountQuery(false);
- handler.setUrlStart("../../");
- handler.setQuery("");
- } else if (query.equals("/showInstanceCounts/")) {
- handler = new InstancesCountQuery(true);
- handler.setUrlStart("../");
- handler.setQuery("");
- } else if (query.startsWith("/instances/")) {
- handler = new InstancesQuery(false);
- handler.setUrlStart("../");
- handler.setQuery(query.substring(11));
- } else if (query.startsWith("/newInstances/")) {
- handler = new InstancesQuery(false, true);
- handler.setUrlStart("../");
- handler.setQuery(query.substring(14));
- } else if (query.startsWith("/allInstances/")) {
- handler = new InstancesQuery(true);
- handler.setUrlStart("../");
- handler.setQuery(query.substring(14));
- } else if (query.startsWith("/allNewInstances/")) {
- handler = new InstancesQuery(true, true);
- handler.setUrlStart("../");
- handler.setQuery(query.substring(17));
- } else if (query.startsWith("/object/")) {
- handler = new ObjectQuery();
- handler.setUrlStart("../");
- handler.setQuery(query.substring(8));
- } else if (query.startsWith("/class/")) {
- handler = new ClassQuery();
- handler.setUrlStart("../");
- handler.setQuery(query.substring(7));
- } else if (query.startsWith("/roots/")) {
- handler = new RootsQuery(false);
- handler.setUrlStart("../");
- handler.setQuery(query.substring(7));
- } else if (query.startsWith("/allRoots/")) {
- handler = new RootsQuery(true);
- handler.setUrlStart("../");
- handler.setQuery(query.substring(10));
- } else if (query.startsWith("/reachableFrom/")) {
- handler = new ReachableQuery();
- handler.setUrlStart("../");
- handler.setQuery(query.substring(15));
- } else if (query.startsWith("/rootStack/")) {
- handler = new RootStackQuery();
- handler.setUrlStart("../");
- handler.setQuery(query.substring(11));
- } else if (query.startsWith("/histo/")) {
- handler = new HistogramQuery();
- handler.setUrlStart("../");
- handler.setQuery(query.substring(7));
- } else if (query.startsWith("/refsByType/")) {
- handler = new RefsByTypeQuery();
- handler.setUrlStart("../");
- handler.setQuery(query.substring(12));
- } else if (query.startsWith("/finalizerSummary/")) {
- handler = new FinalizerSummaryQuery();
- handler.setUrlStart("../");
- handler.setQuery("");
- } else if (query.startsWith("/finalizerObjects/")) {
- handler = new FinalizerObjectsQuery();
- handler.setUrlStart("../");
- handler.setQuery("");
- }
-
- if (handler != null) {
- handler.setOutput(out);
- handler.setSnapshot(snapshot);
- handler.run();
- } else {
- outputError("Query '" + query + "' not implemented");
- }
- } catch (IOException ex) {
- ex.printStackTrace();
- } finally {
- if (out != null) {
- out.close();
- }
- try {
- if (in != null) {
- in.close();
- }
- } catch (IOException ignored) {
- }
- try {
- socket.close();
- } catch (IOException ignored) {
- }
- }
- }
-
- private void outputError(String msg) {
- out.println();
- out.println("<html><body bgcolor=\"#ffffff\">");
- out.println(Misc.encodeHtml(msg));
- out.println("</body></html>");
- }
-
-}
--- a/jdk/src/jdk.dev/share/classes/com/sun/tools/hat/internal/server/InstancesCountQuery.java Thu May 21 10:07:38 2015 -0700
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,169 +0,0 @@
-/*
- * Copyright (c) 1997, 2014, Oracle and/or its affiliates. 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. Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-
-/*
- * The Original Code is HAT. The Initial Developer of the
- * Original Code is Bill Foote, with contributions from others
- * at JavaSoft/Sun.
- */
-
-package com.sun.tools.hat.internal.server;
-
-import com.sun.tools.hat.internal.model.*;
-import com.sun.tools.hat.internal.util.ArraySorter;
-import com.sun.tools.hat.internal.util.Comparer;
-import java.util.Enumeration;
-
-/**
- *
- * @author Bill Foote
- */
-
-
-class InstancesCountQuery extends QueryHandler {
-
-
- private boolean excludePlatform;
-
- public InstancesCountQuery(boolean excludePlatform) {
- this.excludePlatform = excludePlatform;
- }
-
- public void run() {
- if (excludePlatform) {
- startHtml("Instance Counts for All Classes (excluding platform)");
- } else {
- startHtml("Instance Counts for All Classes (including platform)");
- }
-
- JavaClass[] classes = snapshot.getClassesArray();
- if (excludePlatform) {
- int num = 0;
- for (int i = 0; i < classes.length; i++) {
- if (! PlatformClasses.isPlatformClass(classes[i])) {
- classes[num++] = classes[i];
- }
- }
- JavaClass[] tmp = new JavaClass[num];
- System.arraycopy(classes, 0, tmp, 0, tmp.length);
- classes = tmp;
- }
- ArraySorter.sort(classes, new Comparer() {
- public int compare(Object lhso, Object rhso) {
- JavaClass lhs = (JavaClass) lhso;
- JavaClass rhs = (JavaClass) rhso;
- int diff = lhs.getInstancesCount(false)
- - rhs.getInstancesCount(false);
- if (diff != 0) {
- return -diff; // Sort from biggest to smallest
- }
- String left = lhs.getName();
- String right = rhs.getName();
- if (left.startsWith("[") != right.startsWith("[")) {
- // Arrays at the end
- if (left.startsWith("[")) {
- return 1;
- } else {
- return -1;
- }
- }
- return left.compareTo(right);
- }
- });
-
- String lastPackage = null;
- long totalSize = 0;
- long instances = 0;
- for (int i = 0; i < classes.length; i++) {
- JavaClass clazz = classes[i];
- int count = clazz.getInstancesCount(false);
- print("" + count);
- printAnchorStart();
- print("instances/" + encodeForURL(classes[i]));
- out.print("\"> ");
- if (count == 1) {
- print("instance");
- } else {
- print("instances");
- }
- out.print("</a> ");
- if (snapshot.getHasNewSet()) {
- Enumeration<JavaHeapObject> objects = clazz.getInstances(false);
- int newInst = 0;
- while (objects.hasMoreElements()) {
- JavaHeapObject obj = objects.nextElement();
- if (obj.isNew()) {
- newInst++;
- }
- }
- print("(");
- printAnchorStart();
- print("newInstances/" + encodeForURL(classes[i]));
- out.print("\">");
- print("" + newInst + " new");
- out.print("</a>) ");
- }
- print("of ");
- printClass(classes[i]);
- out.println("<br>");
- instances += count;
- totalSize += classes[i].getTotalInstanceSize();
- }
- out.println("<h2>Total of " + instances + " instances occupying " + totalSize + " bytes.</h2>");
-
- out.println("<h2>Other Queries</h2>");
- out.println("<ul>");
-
- out.print("<li>");
- printAnchorStart();
- if (!excludePlatform) {
- out.print("showInstanceCounts/\">");
- print("Show instance counts for all classes (excluding platform)");
- } else {
- out.print("showInstanceCounts/includePlatform/\">");
- print("Show instance counts for all classes (including platform)");
- }
- out.println("</a>");
-
- out.print("<li>");
- printAnchorStart();
- out.print("allClassesWithPlatform/\">");
- print("Show All Classes (including platform)");
- out.println("</a>");
-
- out.print("<li>");
- printAnchorStart();
- out.print("\">");
- print("Show All Classes (excluding platform)");
- out.println("</a>");
-
- out.println("</ul>");
-
- endHtml();
- }
-
-
-}
--- a/jdk/src/jdk.dev/share/classes/com/sun/tools/hat/internal/server/InstancesQuery.java Thu May 21 10:07:38 2015 -0700
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,92 +0,0 @@
-/*
- * Copyright (c) 1997, 2014, Oracle and/or its affiliates. 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. Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-
-/*
- * The Original Code is HAT. The Initial Developer of the
- * Original Code is Bill Foote, with contributions from others
- * at JavaSoft/Sun.
- */
-
-package com.sun.tools.hat.internal.server;
-
-import com.sun.tools.hat.internal.model.*;
-import java.util.Enumeration;
-
-/**
- *
- * @author Bill Foote
- */
-
-
-class InstancesQuery extends QueryHandler {
-
- private boolean includeSubclasses;
- private boolean newObjects;
-
- public InstancesQuery(boolean includeSubclasses) {
- this.includeSubclasses = includeSubclasses;
- }
-
- public InstancesQuery(boolean includeSubclasses, boolean newObjects) {
- this.includeSubclasses = includeSubclasses;
- this.newObjects = newObjects;
- }
-
- public void run() {
- JavaClass clazz = snapshot.findClass(query);
- String instancesOf;
- if (newObjects)
- instancesOf = "New instances of ";
- else
- instancesOf = "Instances of ";
- if (includeSubclasses) {
- startHtml(instancesOf + query + " (including subclasses)");
- } else {
- startHtml(instancesOf + query);
- }
- if (clazz == null) {
- error("Class not found");
- } else {
- out.print("<strong>");
- printClass(clazz);
- out.print("</strong><br><br>");
- Enumeration<JavaHeapObject> objects = clazz.getInstances(includeSubclasses);
- long totalSize = 0;
- long instances = 0;
- while (objects.hasMoreElements()) {
- JavaHeapObject obj = objects.nextElement();
- if (newObjects && !obj.isNew())
- continue;
- printThing(obj);
- out.println("<br>");
- totalSize += obj.getSize();
- instances++;
- }
- out.println("<h2>Total of " + instances + " instances occupying " + totalSize + " bytes.</h2>");
- }
- endHtml();
- }
-}
--- a/jdk/src/jdk.dev/share/classes/com/sun/tools/hat/internal/server/OQLHelp.java Thu May 21 10:07:38 2015 -0700
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,60 +0,0 @@
-/*
- * Copyright (c) 1997, 2013, Oracle and/or its affiliates. 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. Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-
-/*
- * The Original Code is HAT. The Initial Developer of the
- * Original Code is Bill Foote, with contributions from others
- * at JavaSoft/Sun.
- */
-
-package com.sun.tools.hat.internal.server;
-
-import java.io.*;
-
-/**
- * This handles Object Query Language (OQL) help.
- *
- * @author A. Sundararajan
- */
-
-class OQLHelp extends QueryHandler {
-
- public OQLHelp() {
- }
-
- public void run() {
- InputStream is = getClass().getResourceAsStream("/com/sun/tools/hat/resources/oqlhelp.html");
- int ch = -1;
- try {
- is = new BufferedInputStream(is);
- while ( (ch = is.read()) != -1) {
- out.print((char)ch);
- }
- } catch (Exception exp) {
- printException(exp);
- }
- }
-}
--- a/jdk/src/jdk.dev/share/classes/com/sun/tools/hat/internal/server/OQLQuery.java Thu May 21 10:07:38 2015 -0700
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,104 +0,0 @@
-/*
- * Copyright (c) 1997, 2013, Oracle and/or its affiliates. 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. Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-
-/*
- * The Original Code is HAT. The Initial Developer of the
- * Original Code is Bill Foote, with contributions from others
- * at JavaSoft/Sun.
- */
-
-package com.sun.tools.hat.internal.server;
-
-import com.sun.tools.hat.internal.oql.*;
-
-/**
- * This handles Object Query Language (OQL) queries.
- *
- * @author A. Sundararajan
- */
-
-class OQLQuery extends QueryHandler {
-
- public OQLQuery(OQLEngine engine) {
- this.engine = engine;
- }
-
- public void run() {
- startHtml("Object Query Language (OQL) query");
- String oql = null;
- if (query != null && !query.equals("")) {
- int index = query.indexOf("?query=");
- if (index != -1 && query.length() > 7) {
- oql = query.substring(index + 7);
- }
- }
- out.println("<p align='center'><table>");
- out.println("<tr><td><b>");
- out.println("<a href='/'>All Classes (excluding platform)</a>");
- out.println("</b></td>");
- out.println("<td><b><a href='/oqlhelp/'>OQL Help</a></b></td></tr>");
- out.println("</table></p>");
- out.println("<form action='/oql/' method='get'>");
- out.println("<p align='center'>");
- out.println("<textarea name='query' cols=80 rows=10>");
- if (oql != null) {
- println(oql);
- }
- out.println("</textarea>");
- out.println("</p>");
- out.println("<p align='center'>");
- out.println("<input type='submit' value='Execute'></input>");
- out.println("</p>");
- out.println("</form>");
- if (oql != null) {
- executeQuery(oql);
- }
- endHtml();
- }
-
- private void executeQuery(String q) {
- try {
- out.println("<table border='1'>");
- engine.executeQuery(q, new ObjectVisitor() {
- public boolean visit(Object o) {
- out.println("<tr><td>");
- try {
- out.println(engine.toHtml(o));
- } catch (Exception e) {
- printException(e);
- }
- out.println("</td></tr>");
- return false;
- }
- });
- out.println("</table>");
- } catch (OQLException exp) {
- printException(exp);
- }
- }
-
- private OQLEngine engine;
-}
--- a/jdk/src/jdk.dev/share/classes/com/sun/tools/hat/internal/server/ObjectQuery.java Thu May 21 10:07:38 2015 -0700
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,146 +0,0 @@
-/*
- * Copyright (c) 1997, 2008, Oracle and/or its affiliates. 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. Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-
-/*
- * The Original Code is HAT. The Initial Developer of the
- * Original Code is Bill Foote, with contributions from others
- * at JavaSoft/Sun.
- */
-
-package com.sun.tools.hat.internal.server;
-
-import java.util.Enumeration;
-
-import com.sun.tools.hat.internal.model.*;
-import com.sun.tools.hat.internal.util.ArraySorter;
-import com.sun.tools.hat.internal.util.Comparer;
-
-/**
- *
- * @author Bill Foote
- */
-
-
-class ObjectQuery extends ClassQuery {
- // We inherit printFullClass from ClassQuery
-
- public ObjectQuery() {
- }
-
- public void run() {
- startHtml("Object at " + query);
- long id = parseHex(query);
- JavaHeapObject thing = snapshot.findThing(id);
- //
- // In the following, I suppose we really should use a visitor
- // pattern. I'm not that strongly motivated to do this, however:
- // This is the only typecase there is, and the default for an
- // unrecognized type is to do something reasonable.
- //
- if (thing == null) {
- error("object not found");
- } else if (thing instanceof JavaClass) {
- printFullClass((JavaClass) thing);
- } else if (thing instanceof JavaValueArray) {
- print(((JavaValueArray) thing).valueString(true));
- printAllocationSite(thing);
- printReferencesTo(thing);
- } else if (thing instanceof JavaObjectArray) {
- printFullObjectArray((JavaObjectArray) thing);
- printAllocationSite(thing);
- printReferencesTo(thing);
- } else if (thing instanceof JavaObject) {
- printFullObject((JavaObject) thing);
- printAllocationSite(thing);
- printReferencesTo(thing);
- } else {
- // We should never get here
- print(thing.toString());
- printReferencesTo(thing);
- }
- endHtml();
- }
-
-
- private void printFullObject(JavaObject obj) {
- out.print("<h1>instance of ");
- print(obj.toString());
- out.print(" <small>(" + obj.getSize() + " bytes)</small>");
- out.println("</h1>\n");
-
- out.println("<h2>Class:</h2>");
- printClass(obj.getClazz());
-
- out.println("<h2>Instance data members:</h2>");
- final JavaThing[] things = obj.getFields();
- final JavaField[] fields = obj.getClazz().getFieldsForInstance();
- Integer[] hack = new Integer[things.length];
- for (int i = 0; i < things.length; i++) {
- hack[i] = i;
- }
- ArraySorter.sort(hack, new Comparer() {
- public int compare(Object lhs, Object rhs) {
- JavaField left = fields[((Integer) lhs).intValue()];
- JavaField right = fields[((Integer) rhs).intValue()];
- return left.getName().compareTo(right.getName());
- }
- });
- for (int i = 0; i < things.length; i++) {
- int index = hack[i].intValue();
- printField(fields[index]);
- out.print(" : ");
- printThing(things[index]);
- out.println("<br>");
- }
- }
-
- private void printFullObjectArray(JavaObjectArray arr) {
- JavaThing[] elements = arr.getElements();
- out.println("<h1>Array of " + elements.length + " objects</h1>");
-
- out.println("<h2>Class:</h2>");
- printClass(arr.getClazz());
-
- out.println("<h2>Values</h2>");
- for (int i = 0; i < elements.length; i++) {
- out.print("" + i + " : ");
- printThing(elements[i]);
- out.println("<br>");
- }
- }
-
- //
- // Print the StackTrace where this was allocated
- //
- private void printAllocationSite(JavaHeapObject obj) {
- StackTrace trace = obj.getAllocatedFrom();
- if (trace == null || trace.getFrames().length == 0) {
- return;
- }
- out.println("<h2>Object allocated from:</h2>");
- printStackTrace(trace);
- }
-}
--- a/jdk/src/jdk.dev/share/classes/com/sun/tools/hat/internal/server/PlatformClasses.java Thu May 21 10:07:38 2015 -0700
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,119 +0,0 @@
-/*
- * Copyright (c) 1997, 2008, Oracle and/or its affiliates. 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. Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-
-/*
- * The Original Code is HAT. The Initial Developer of the
- * Original Code is Bill Foote, with contributions from others
- * at JavaSoft/Sun.
- */
-
-package com.sun.tools.hat.internal.server;
-
-import com.sun.tools.hat.internal.model.JavaClass;
-import com.sun.tools.hat.internal.model.Snapshot;
-
-import java.util.LinkedList;
-import java.io.InputStream;
-import java.io.Reader;
-import java.io.InputStreamReader;
-import java.io.BufferedReader;
-import java.io.IOException;
-
-/**
- * This class is a helper that determines if a class is a "platform"
- * class or not. It's a platform class if its name starts with one of
- * the prefixes to be found in /com/sun/tools/hat/resources/platform_names.txt.
- *
- * @author Bill Foote
- */
-
-public class PlatformClasses {
-
- static String[] names = null;
-
-
- public static synchronized String[] getNames() {
- if (names == null) {
- LinkedList<String> list = new LinkedList<String>();
- InputStream str
- = PlatformClasses.class
- .getResourceAsStream("/com/sun/tools/hat/resources/platform_names.txt");
- if (str != null) {
- try {
- BufferedReader rdr
- = new BufferedReader(new InputStreamReader(str));
- for (;;) {
- String s = rdr.readLine();
- if (s == null) {
- break;
- } else if (s.length() > 0) {
- list.add(s);
- }
- }
- rdr.close();
- str.close();
- } catch (IOException ex) {
- ex.printStackTrace();
- // Shouldn't happen, and if it does, continuing
- // is the right thing to do anyway.
- }
- }
- names = list.toArray(new String[list.size()]);
- }
- return names;
- }
-
-
- public static boolean isPlatformClass(JavaClass clazz) {
- // all classes loaded by bootstrap loader are considered
- // platform classes. In addition, the older name based filtering
- // is also done for compatibility.
- if (clazz.isBootstrap()) {
- return true;
- }
-
- String name = clazz.getName();
- // skip even the array classes of the skipped classes.
- if (name.startsWith("[")) {
- int index = name.lastIndexOf('[');
- if (index != -1) {
- if (name.charAt(index + 1) != 'L') {
- // some primitive array.
- return true;
- }
- // skip upto 'L' after the last '['.
- name = name.substring(index + 2);
- }
- }
- String[] nms = getNames();
- for (int i = 0; i < nms.length; i++) {
- if (name.startsWith(nms[i])) {
- return true;
- }
- }
- return false;
- }
-}
--- a/jdk/src/jdk.dev/share/classes/com/sun/tools/hat/internal/server/QueryHandler.java Thu May 21 10:07:38 2015 -0700
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,239 +0,0 @@
-/*
- * Copyright (c) 1997, 2013, Oracle and/or its affiliates. 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. Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-
-/*
- * The Original Code is HAT. The Initial Developer of the
- * Original Code is Bill Foote, with contributions from others
- * at JavaSoft/Sun.
- */
-
-package com.sun.tools.hat.internal.server;
-
-import java.io.PrintWriter;
-
-import com.sun.tools.hat.internal.model.*;
-import com.sun.tools.hat.internal.util.Misc;
-import java.io.StringWriter;
-
-import java.net.URLEncoder;
-import java.io.UnsupportedEncodingException;
-
-/**
- *
- * @author Bill Foote
- */
-
-
-abstract class QueryHandler {
-
- protected String urlStart;
- protected String query;
- protected PrintWriter out;
- protected Snapshot snapshot;
-
- abstract void run();
-
-
- void setUrlStart(String s) {
- urlStart = s;
- }
-
- void setQuery(String s) {
- query = s;
- }
-
- void setOutput(PrintWriter o) {
- this.out = o;
- }
-
- void setSnapshot(Snapshot ss) {
- this.snapshot = ss;
- }
-
- protected String encodeForURL(String s) {
- try {
- s = URLEncoder.encode(s, "UTF-8");
- } catch (UnsupportedEncodingException ex) {
- // Should never happen
- ex.printStackTrace();
- }
- return s;
- }
-
- protected void startHtml(String title) {
- out.print("<html><title>");
- print(title);
- out.println("</title>");
- out.println("<body bgcolor=\"#ffffff\"><center><h1>");
- print(title);
- out.println("</h1></center>");
- }
-
- protected void endHtml() {
- out.println("</body></html>");
- }
-
- protected void error(String msg) {
- println(msg);
- }
-
- protected void printAnchorStart() {
- out.print("<a href=\"");
- out.print(urlStart);
- }
-
- protected void printThingAnchorTag(long id) {
- printAnchorStart();
- out.print("object/");
- printHex(id);
- out.print("\">");
- }
-
- protected void printObject(JavaObject obj) {
- printThing(obj);
- }
-
- protected void printThing(JavaThing thing) {
- if (thing == null) {
- out.print("null");
- return;
- }
- if (thing instanceof JavaHeapObject) {
- JavaHeapObject ho = (JavaHeapObject) thing;
- long id = ho.getId();
- if (id != -1L) {
- if (ho.isNew())
- out.println("<strong>");
- printThingAnchorTag(id);
- }
- print(thing.toString());
- if (id != -1) {
- if (ho.isNew())
- out.println("[new]</strong>");
- out.print(" (" + ho.getSize() + " bytes)");
- out.println("</a>");
- }
- } else {
- print(thing.toString());
- }
- }
-
- protected void printRoot(Root root) {
- StackTrace st = root.getStackTrace();
- boolean traceAvailable = (st != null) && (st.getFrames().length != 0);
- if (traceAvailable) {
- printAnchorStart();
- out.print("rootStack/");
- printHex(root.getIndex());
- out.print("\">");
- }
- print(root.getDescription());
- if (traceAvailable) {
- out.print("</a>");
- }
- }
-
- protected void printClass(JavaClass clazz) {
- if (clazz == null) {
- out.println("null");
- return;
- }
- printAnchorStart();
- out.print("class/");
- print(encodeForURL(clazz));
- out.print("\">");
- print(clazz.toString());
- out.println("</a>");
- }
-
- protected String encodeForURL(JavaClass clazz) {
- if (clazz.getId() == -1) {
- return encodeForURL(clazz.getName());
- } else {
- return clazz.getIdString();
- }
- }
-
- protected void printField(JavaField field) {
- print(field.getName() + " (" + field.getSignature() + ")");
- }
-
- protected void printStatic(JavaStatic member) {
- JavaField f = member.getField();
- printField(f);
- out.print(" : ");
- if (f.hasId()) {
- JavaThing t = member.getValue();
- printThing(t);
- } else {
- print(member.getValue().toString());
- }
- }
-
- protected void printStackTrace(StackTrace trace) {
- StackFrame[] frames = trace.getFrames();
- for (int i = 0; i < frames.length; i++) {
- StackFrame f = frames[i];
- String clazz = f.getClassName();
- out.print("<font color=purple>");
- print(clazz);
- out.print("</font>");
- print("." + f.getMethodName() + "(" + f.getMethodSignature() + ")");
- out.print(" <bold>:</bold> ");
- print(f.getSourceFileName() + " line " + f.getLineNumber());
- out.println("<br>");
- }
- }
-
- protected void printException(Throwable t) {
- println(t.getMessage());
- out.println("<pre>");
- StringWriter sw = new StringWriter();
- t.printStackTrace(new PrintWriter(sw));
- print(sw.toString());
- out.println("</pre>");
- }
-
- protected void printHex(long addr) {
- if (snapshot.getIdentifierSize() == 4) {
- out.print(Misc.toHex((int)addr));
- } else {
- out.print(Misc.toHex(addr));
- }
- }
-
- protected long parseHex(String value) {
- return Misc.parseHex(value);
- }
-
- protected void print(String str) {
- out.print(Misc.encodeHtml(str));
- }
-
- protected void println(String str) {
- out.println(Misc.encodeHtml(str));
- }
-}
--- a/jdk/src/jdk.dev/share/classes/com/sun/tools/hat/internal/server/QueryListener.java Thu May 21 10:07:38 2015 -0700
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,111 +0,0 @@
-/*
- * Copyright (c) 1997, 2008, Oracle and/or its affiliates. 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. Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-
-/*
- * The Original Code is HAT. The Initial Developer of the
- * Original Code is Bill Foote, with contributions from others
- * at JavaSoft/Sun.
- */
-
-package com.sun.tools.hat.internal.server;
-
-/**
- *
- * @author Bill Foote
- */
-
-
-import java.net.Socket;
-import java.net.ServerSocket;
-import java.net.InetAddress;
-
-import java.io.InputStream;
-import java.io.BufferedInputStream;
-import java.io.IOException;
-import java.io.Writer;
-import java.io.BufferedWriter;
-import java.io.PrintWriter;
-import java.io.OutputStream;
-import java.io.OutputStreamWriter;
-import java.io.BufferedOutputStream;
-
-import com.sun.tools.hat.internal.model.Snapshot;
-import com.sun.tools.hat.internal.oql.OQLEngine;
-
-public class QueryListener implements Runnable {
-
-
- private Snapshot snapshot;
- private OQLEngine engine;
- private int port;
-
- public QueryListener(int port) {
- this.port = port;
- this.snapshot = null; // Client will setModel when it's ready
- this.engine = null; // created when snapshot is set
- }
-
- public void setModel(Snapshot ss) {
- this.snapshot = ss;
- if (OQLEngine.isOQLSupported()) {
- this.engine = new OQLEngine(ss);
- }
- }
-
- public void run() {
- try {
- waitForRequests();
- } catch (IOException ex) {
- ex.printStackTrace();
- System.exit(1);
- }
- }
-
- private void waitForRequests() throws IOException {
- ServerSocket ss = new ServerSocket(port);
- Thread last = null;
- for (;;) {
- Socket s = ss.accept();
- Thread t = new Thread(new HttpReader(s, snapshot, engine));
- if (snapshot == null) {
- t.setPriority(Thread.NORM_PRIORITY+1);
- } else {
- t.setPriority(Thread.NORM_PRIORITY-1);
- if (last != null) {
- try {
- last.setPriority(Thread.NORM_PRIORITY-2);
- } catch (Throwable ignored) {
- }
- // If the thread is no longer alive, we'll get a
- // NullPointerException
- }
- }
- t.start();
- last = t;
- }
- }
-
-}
--- a/jdk/src/jdk.dev/share/classes/com/sun/tools/hat/internal/server/ReachableQuery.java Thu May 21 10:07:38 2015 -0700
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,90 +0,0 @@
-/*
- * Copyright (c) 1997, 2008, Oracle and/or its affiliates. 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. Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-
-/*
- * The Original Code is HAT. The Initial Developer of the
- * Original Code is Bill Foote, with contributions from others
- * at JavaSoft/Sun.
- */
-
-package com.sun.tools.hat.internal.server;
-
-import com.sun.tools.hat.internal.model.*;
-
-/**
- *
- * @author Bill Foote
- */
-
-
-class ReachableQuery extends QueryHandler {
- // We inherit printFullClass from ClassQuery
-
-
- public ReachableQuery() {
- }
-
- public void run() {
- startHtml("Objects Reachable From " + query);
- long id = parseHex(query);
- JavaHeapObject root = snapshot.findThing(id);
- ReachableObjects ro = new ReachableObjects(root,
- snapshot.getReachableExcludes());
- // Now, print out the sorted list, but start with root
- long totalSize = ro.getTotalSize();
- JavaThing[] things = ro.getReachables();
- long instances = things.length;
-
- out.print("<strong>");
- printThing(root);
- out.println("</strong><br>");
- out.println("<br>");
- for (int i = 0; i < things.length; i++) {
- printThing(things[i]);
- out.println("<br>");
- }
-
- printFields(ro.getUsedFields(), "Data Members Followed");
- printFields(ro.getExcludedFields(), "Excluded Data Members");
- out.println("<h2>Total of " + instances + " instances occupying " + totalSize + " bytes.</h2>");
-
- endHtml();
- }
-
- private void printFields(String[] fields, String title) {
- if (fields.length == 0) {
- return;
- }
- out.print("<h3>");
- print(title);
- out.println("</h3>");
-
- for (int i = 0; i < fields.length; i++) {
- print(fields[i]);
- out.println("<br>");
- }
- }
-}
--- a/jdk/src/jdk.dev/share/classes/com/sun/tools/hat/internal/server/RefsByTypeQuery.java Thu May 21 10:07:38 2015 -0700
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,138 +0,0 @@
-/*
- * Copyright (c) 1997, 2014, Oracle and/or its affiliates. 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. Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-
-/*
- * The Original Code is HAT. The Initial Developer of the
- * Original Code is Bill Foote, with contributions from others
- * at JavaSoft/Sun.
- */
-
-package com.sun.tools.hat.internal.server;
-
-import com.sun.tools.hat.internal.model.*;
-import java.util.*;
-
-/**
- * References by type summary
- *
- */
-public class RefsByTypeQuery extends QueryHandler {
- public void run() {
- JavaClass clazz = snapshot.findClass(query);
- if (clazz == null) {
- error("class not found: " + query);
- } else {
- Map<JavaClass, Long> referrersStat = new HashMap<JavaClass, Long>();
- final Map<JavaClass, Long> refereesStat = new HashMap<JavaClass, Long>();
- Enumeration<JavaHeapObject> instances = clazz.getInstances(false);
- while (instances.hasMoreElements()) {
- JavaHeapObject instance = instances.nextElement();
- if (instance.getId() == -1) {
- continue;
- }
- Enumeration<JavaThing> e = instance.getReferers();
- while (e.hasMoreElements()) {
- JavaHeapObject ref = (JavaHeapObject)e.nextElement();
- JavaClass cl = ref.getClazz();
- if (cl == null) {
- System.out.println("null class for " + ref);
- continue;
- }
- Long count = referrersStat.get(cl);
- if (count == null) {
- count = 1L;
- } else {
- count = count + 1L;
- }
- referrersStat.put(cl, count);
- }
- instance.visitReferencedObjects(
- new AbstractJavaHeapObjectVisitor() {
- public void visit(JavaHeapObject obj) {
- JavaClass cl = obj.getClazz();
- Long count = refereesStat.get(cl);
- if (count == null) {
- count = 1L;
- } else {
- count = count + 1L;
- }
- refereesStat.put(cl, count);
- }
- }
- );
- } // for each instance
-
- startHtml("References by Type");
- out.println("<p align='center'>");
- printClass(clazz);
- if (clazz.getId() != -1) {
- println("[" + clazz.getIdString() + "]");
- }
- out.println("</p>");
-
- if (referrersStat.size() != 0) {
- out.println("<h3 align='center'>Referrers by Type</h3>");
- print(referrersStat);
- }
-
- if (refereesStat.size() != 0) {
- out.println("<h3 align='center'>Referees by Type</h3>");
- print(refereesStat);
- }
-
- endHtml();
- } // clazz != null
- } // run
-
- private void print(final Map<JavaClass, Long> map) {
- out.println("<table border='1' align='center'>");
- Set<JavaClass> keys = map.keySet();
- JavaClass[] classes = new JavaClass[keys.size()];
- keys.toArray(classes);
- Arrays.sort(classes, new Comparator<JavaClass>() {
- public int compare(JavaClass first, JavaClass second) {
- Long count1 = map.get(first);
- Long count2 = map.get(second);
- return count2.compareTo(count1);
- }
- });
-
- out.println("<tr><th>Class</th><th>Count</th></tr>");
- for (int i = 0; i < classes.length; i++) {
- JavaClass clazz = classes[i];
- out.println("<tr><td>");
- out.print("<a href='/refsByType/");
- print(clazz.getIdString());
- out.print("'>");
- print(clazz.getName());
- out.println("</a>");
- out.println("</td><td>");
- out.println(map.get(clazz));
- out.println("</td></tr>");
- }
- out.println("</table>");
- }
-}
--- a/jdk/src/jdk.dev/share/classes/com/sun/tools/hat/internal/server/RootStackQuery.java Thu May 21 10:07:38 2015 -0700
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,69 +0,0 @@
-/*
- * Copyright (c) 1997, 2008, Oracle and/or its affiliates. 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. Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-
-/*
- * The Original Code is HAT. The Initial Developer of the
- * Original Code is Bill Foote, with contributions from others
- * at JavaSoft/Sun.
- */
-
-package com.sun.tools.hat.internal.server;
-
-
-import com.sun.tools.hat.internal.model.*;
-
-/**
- * Query to show the StackTrace for a given root
- *
- * @author Bill Foote
- */
-
-
-class RootStackQuery extends QueryHandler {
-
- public RootStackQuery() {
- }
-
- public void run() {
- int index = (int) parseHex(query);
- Root root = snapshot.getRootAt(index);
- if (root == null) {
- error("Root at " + index + " not found");
- return;
- }
- StackTrace st = root.getStackTrace();
- if (st == null || st.getFrames().length == 0) {
- error("No stack trace for " + root.getDescription());
- return;
- }
- startHtml("Stack Trace for " + root.getDescription());
- out.println("<p>");
- printStackTrace(st);
- out.println("</p>");
- endHtml();
- }
-
-}
--- a/jdk/src/jdk.dev/share/classes/com/sun/tools/hat/internal/server/RootsQuery.java Thu May 21 10:07:38 2015 -0700
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,147 +0,0 @@
-/*
- * Copyright (c) 1997, 2008, Oracle and/or its affiliates. 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. Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-
-/*
- * The Original Code is HAT. The Initial Developer of the
- * Original Code is Bill Foote, with contributions from others
- * at JavaSoft/Sun.
- */
-
-package com.sun.tools.hat.internal.server;
-
-import java.util.Vector;
-
-import com.sun.tools.hat.internal.model.*;
-import com.sun.tools.hat.internal.util.ArraySorter;
-import com.sun.tools.hat.internal.util.Comparer;
-
-/**
- *
- * @author Bill Foote
- */
-
-
-class RootsQuery extends QueryHandler {
-
- private boolean includeWeak;
-
- public RootsQuery(boolean includeWeak) {
- this.includeWeak = includeWeak;
- }
-
- public void run() {
- long id = parseHex(query);
- JavaHeapObject target = snapshot.findThing(id);
- if (target == null) {
- startHtml("Object not found for rootset");
- error("object not found");
- endHtml();
- return;
- }
- if (includeWeak) {
- startHtml("Rootset references to " + target
- + " (includes weak refs)");
- } else {
- startHtml("Rootset references to " + target
- + " (excludes weak refs)");
- }
- out.flush();
-
- ReferenceChain[] refs
- = snapshot.rootsetReferencesTo(target, includeWeak);
- ArraySorter.sort(refs, new Comparer() {
- public int compare(Object lhs, Object rhs) {
- ReferenceChain left = (ReferenceChain) lhs;
- ReferenceChain right = (ReferenceChain) rhs;
- Root leftR = left.getObj().getRoot();
- Root rightR = right.getObj().getRoot();
- int d = leftR.getType() - rightR.getType();
- if (d != 0) {
- return -d; // More interesting values are *higher*
- }
- return left.getDepth() - right.getDepth();
- }
- });
-
- out.print("<h1>References to ");
- printThing(target);
- out.println("</h1>");
- int lastType = Root.INVALID_TYPE;
- for (int i= 0; i < refs.length; i++) {
- ReferenceChain ref = refs[i];
- Root root = ref.getObj().getRoot();
- if (root.getType() != lastType) {
- lastType = root.getType();
- out.print("<h2>");
- print(root.getTypeName() + " References");
- out.println("</h2>");
- }
- out.print("<h3>");
- printRoot(root);
- if (root.getReferer() != null) {
- out.print("<small> (from ");
- printThingAnchorTag(root.getReferer().getId());
- print(root.getReferer().toString());
- out.print(")</a></small>");
-
- }
- out.print(" :</h3>");
- while (ref != null) {
- ReferenceChain next = ref.getNext();
- JavaHeapObject obj = ref.getObj();
- print("--> ");
- printThing(obj);
- if (next != null) {
- print(" (" +
- obj.describeReferenceTo(next.getObj(), snapshot)
- + ":)");
- }
- out.println("<br>");
- ref = next;
- }
- }
-
- out.println("<h2>Other queries</h2>");
-
- if (includeWeak) {
- printAnchorStart();
- out.print("roots/");
- printHex(id);
- out.print("\">");
- out.println("Exclude weak refs</a><br>");
- endHtml();
- }
-
- if (!includeWeak) {
- printAnchorStart();
- out.print("allRoots/");
- printHex(id);
- out.print("\">");
- out.println("Include weak refs</a><br>");
- }
- }
-
-}
--- a/jdk/src/jdk.dev/share/classes/com/sun/tools/hat/internal/util/ArraySorter.java Thu May 21 10:07:38 2015 -0700
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,147 +0,0 @@
-/*
- * Copyright (c) 1997, 2008, Oracle and/or its affiliates. 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. Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-
-/*
- * The Original Code is HAT. The Initial Developer of the
- * Original Code is Bill Foote, with contributions from others
- * at JavaSoft/Sun.
- */
-
-package com.sun.tools.hat.internal.util;
-import java.util.*;
-
-/**
- * A singleton utility class that sorts an array of objects.
- * <p>
- * Use:
- * <pre>
- *
- * Stuff[] arr = ...;
- * ArraySorter.sort(arr, new Comparer() {
- * public int compare(Object lhs, Object rhs) {
- * return ((String) lhs).compareTo((String) rhs);
- * }
- * });
- * </pre>
- *
- * @author Bill Foote
- */
-
-public class ArraySorter {
-
- /**
- * Sort the given array, using c for comparison
- **/
- static public void sort(Object[] arr, Comparer c) {
- quickSort(arr, c, 0, arr.length-1);
- }
-
-
- /**
- * Sort an array of strings, using String.compareTo()
- **/
- static public void sortArrayOfStrings(Object[] arr) {
- sort(arr, new Comparer() {
- public int compare(Object lhs, Object rhs) {
- return ((String) lhs).compareTo((String) rhs);
- }
- });
- }
-
-
- static private void swap(Object[] arr, int a, int b) {
- Object tmp = arr[a];
- arr[a] = arr[b];
- arr[b] = tmp;
- }
-
- //
- // Sorts arr between from and to, inclusive. This is a quick, off-the-top-
- // of-my-head quicksort: I haven't put any thought into optimizing it.
- // I _did_ put thought into making sure it's safe (it will always
- // terminate). Worst-case it's O(n^2), but it will usually run in
- // in O(n log n). It's well-behaved if the list is already sorted,
- // or nearly so.
- //
- static private void quickSort(Object[] arr, Comparer c, int from, int to) {
- if (to <= from)
- return;
- int mid = (from + to) / 2;
- if (mid != from)
- swap(arr, mid, from);
- Object pivot = arr[from]; // Simple-minded, but reasonable
- int highestBelowPivot = from - 1;
- int low = from+1;
- int high = to;
- // We now move low and high toward each other, maintaining the
- // invariants:
- // arr[i] <= pivot for all i < low
- // arr[i] > pivot for all i > high
- // As long as these invariants hold, and every iteration makes
- // progress, we are safe.
- while (low <= high) {
- int cmp = c.compare(arr[low], pivot);
- if (cmp <= 0) { // arr[low] <= pivot
- if (cmp < 0) {
- highestBelowPivot = low;
- }
- low++;
- } else {
- int c2;
- for (;;) {
- // arr[high] > pivot:
- c2 = c.compare(arr[high], pivot);
- if (c2 > 0) {
- high--;
- if (low > high) {
- break;
- }
- } else {
- break;
- }
- }
- // At this point, low is never == high, BTW
- if (low <= high) {
- swap(arr, low, high);
- if (c2 < 0) {
- highestBelowPivot = low;
- }
- low++;
- high--;
- }
- }
- }
- // At this point, low == high+1
- // Now we just need to sort from from..highestBelowPivot
- // and from high+1..to
- if (highestBelowPivot > from) {
- // pivot == pivot, so ensure algorithm terminates
- swap(arr, from, highestBelowPivot);
- quickSort(arr, c, from, highestBelowPivot-1);
- }
- quickSort(arr, c, high+1, to);
- }
-}
--- a/jdk/src/jdk.dev/share/classes/com/sun/tools/hat/internal/util/Comparer.java Thu May 21 10:07:38 2015 -0700
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,49 +0,0 @@
-/*
- * Copyright (c) 1997, 2008, Oracle and/or its affiliates. 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. Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-
-/*
- * The Original Code is HAT. The Initial Developer of the
- * Original Code is Bill Foote, with contributions from others
- * at JavaSoft/Sun.
- */
-
-package com.sun.tools.hat.internal.util;
-
-/**
- * Base class for comparison of two objects.
- * @see VectorSorter
- *
- * @author Bill Foote
- */
-
-abstract public class Comparer {
-
- /**
- * @return a number <, == or > 0 depending on lhs compared to rhs
- * @see java.lang.String.compareTo
- **/
- abstract public int compare(Object lhs, Object rhs);
-}
--- a/jdk/src/jdk.dev/share/classes/com/sun/tools/hat/internal/util/CompositeEnumeration.java Thu May 21 10:07:38 2015 -0700
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,63 +0,0 @@
-/*
- * Copyright (c) 1997, 2014, Oracle and/or its affiliates. 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. Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-
-/*
- * The Original Code is HAT. The Initial Developer of the
- * Original Code is Bill Foote, with contributions from others
- * at JavaSoft/Sun.
- */
-
-package com.sun.tools.hat.internal.util;
-
-import java.util.Enumeration;
-import java.util.NoSuchElementException;
-import com.sun.tools.hat.internal.model.JavaHeapObject;
-
-public class CompositeEnumeration implements Enumeration<JavaHeapObject> {
- Enumeration<JavaHeapObject> e1;
- Enumeration<JavaHeapObject> e2;
-
- public CompositeEnumeration(Enumeration<JavaHeapObject> e1, Enumeration<JavaHeapObject> e2) {
- this.e1 = e1;
- this.e2 = e2;
- }
-
- public boolean hasMoreElements() {
- return e1.hasMoreElements() || e2.hasMoreElements();
- }
-
- public JavaHeapObject nextElement() {
- if (e1.hasMoreElements()) {
- return e1.nextElement();
- }
-
- if (e2.hasMoreElements()) {
- return e2.nextElement();
- }
-
- throw new NoSuchElementException();
- }
-}
--- a/jdk/src/jdk.dev/share/classes/com/sun/tools/hat/internal/util/Misc.java Thu May 21 10:07:38 2015 -0700
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,112 +0,0 @@
-/*
- * Copyright (c) 1997, 2008, Oracle and/or its affiliates. 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. Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-
-/*
- * The Original Code is HAT. The Initial Developer of the
- * Original Code is Bill Foote, with contributions from others
- * at JavaSoft/Sun.
- */
-
-package com.sun.tools.hat.internal.util;
-import java.util.*;
-
-/**
- * Miscellaneous functions I couldn't think of a good place to put.
- *
- * @author Bill Foote
- */
-
-
-public class Misc {
-
- private static char[] digits = { '0', '1', '2', '3', '4', '5', '6', '7',
- '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' };
-
- public final static String toHex(int addr) {
- char[] buf = new char[8];
- int i = 0;
- for (int s = 28; s >= 0; s -= 4) {
- buf[i++] = digits[(addr >> s) & 0xf];
- }
- return "0x" + new String(buf);
- }
-
- public final static String toHex(long addr) {
- return "0x" + Long.toHexString(addr);
- }
-
- public final static long parseHex(String value) {
- long result = 0;
- if (value.length() < 2 || value.charAt(0) != '0' ||
- value.charAt(1) != 'x') {
- return -1L;
- }
- for(int i = 2; i < value.length(); i++) {
- result *= 16;
- char ch = value.charAt(i);
- if (ch >= '0' && ch <= '9') {
- result += (ch - '0');
- } else if (ch >= 'a' && ch <= 'f') {
- result += (ch - 'a') + 10;
- } else if (ch >= 'A' && ch <= 'F') {
- result += (ch - 'A') + 10;
- } else {
- throw new NumberFormatException("" + ch
- + " is not a valid hex digit");
- }
- }
- return result;
- }
-
- public static String encodeHtml(String str) {
- final int len = str.length();
- StringBuilder sb = new StringBuilder();
- for (int i = 0; i < len; i++) {
- char ch = str.charAt(i);
- if (ch == '<') {
- sb.append("<");
- } else if (ch == '>') {
- sb.append(">");
- } else if (ch == '"') {
- sb.append(""");
- } else if (ch == '\'') {
- sb.append("'");
- } else if (ch == '&') {
- sb.append("&");
- } else if (ch < ' ') {
- sb.append("&#").append((int)ch).append(';');
- } else {
- int c = (ch & 0xFFFF);
- if (c > 127) {
- sb.append("&#").append(c).append(';');
- } else {
- sb.append(ch);
- }
- }
- }
- return sb.toString();
- }
-}
--- a/jdk/src/jdk.dev/share/classes/com/sun/tools/hat/internal/util/VectorSorter.java Thu May 21 10:07:38 2015 -0700
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,148 +0,0 @@
-/*
- * Copyright (c) 1997, 2008, Oracle and/or its affiliates. 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. Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-
-/*
- * The Original Code is HAT. The Initial Developer of the
- * Original Code is Bill Foote, with contributions from others
- * at JavaSoft/Sun.
- */
-
-package com.sun.tools.hat.internal.util;
-import java.util.*;
-
-/**
- * A singleton utility class that sorts a vector.
- * <p>
- * Use:
- * <pre>
- *
- * Vector v = <a vector of, say, String objects>;
- * VectorSorter.sort(v, new Comparer() {
- * public int compare(Object lhs, Object rhs) {
- * return ((String) lhs).compareTo((String) rhs);
- * }
- * });
- * </pre>
- *
- * @author Bill Foote
- */
-
-
-public class VectorSorter {
-
- /**
- * Sort the given vector, using c for comparison
- **/
- static public void sort(Vector<Object> v, Comparer c) {
- quickSort(v, c, 0, v.size()-1);
- }
-
-
- /**
- * Sort a vector of strings, using String.compareTo()
- **/
- static public void sortVectorOfStrings(Vector<Object> v) {
- sort(v, new Comparer() {
- public int compare(Object lhs, Object rhs) {
- return ((String) lhs).compareTo((String) rhs);
- }
- });
- }
-
-
- static private void swap(Vector<Object> v, int a, int b) {
- Object tmp = v.elementAt(a);
- v.setElementAt(v.elementAt(b), a);
- v.setElementAt(tmp, b);
- }
-
- //
- // Sorts v between from and to, inclusive. This is a quick, off-the-top-
- // of-my-head quicksort: I haven't put any thought into optimizing it.
- // I _did_ put thought into making sure it's safe (it will always
- // terminate). Worst-case it's O(n^2), but it will usually run in
- // in O(n log n). It's well-behaved if the list is already sorted,
- // or nearly so.
- //
- static private void quickSort(Vector<Object> v, Comparer c, int from, int to) {
- if (to <= from)
- return;
- int mid = (from + to) / 2;
- if (mid != from)
- swap(v, mid, from);
- Object pivot = v.elementAt(from);
- // Simple-minded, but reasonable
- int highestBelowPivot = from - 1;
- int low = from+1;
- int high = to;
- // We now move low and high toward eachother, maintaining the
- // invariants:
- // v[i] <= pivot for all i < low
- // v[i] > pivot for all i > high
- // As long as these invariants hold, and every iteration makes
- // progress, we are safe.
- while (low <= high) {
- int cmp = c.compare(v.elementAt(low), pivot);
- if (cmp <= 0) { // v[low] <= pivot
- if (cmp < 0) {
- highestBelowPivot = low;
- }
- low++;
- } else {
- int c2;
- for (;;) {
- c2 = c.compare(v.elementAt(high), pivot);
- // v[high] > pivot:
- if (c2 > 0) {
- high--;
- if (low > high) {
- break;
- }
- } else {
- break;
- }
- }
- // At this point, low is never == high
- if (low <= high) {
- swap(v, low, high);
- if (c2 < 0) {
- highestBelowPivot = low;
- }
- low++;
- high--;
- }
- }
- }
- // Now we just need to sort from from..highestBelowPivot
- // and from high+1..to
- if (highestBelowPivot > from) {
- // pivot == pivot, so ensure algorithm terminates
- swap(v, from, highestBelowPivot);
- quickSort(v, c, from, highestBelowPivot-1);
- }
- quickSort(v, c, high+1, to);
- }
-}
--- a/jdk/src/jdk.dev/share/classes/com/sun/tools/hat/resources/hat.js Thu May 21 10:07:38 2015 -0700
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,1473 +0,0 @@
-/*
- * Copyright (c) 2005, 2013, Oracle and/or its affiliates. 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. Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-/*
- * The Original Code is HAT. The Initial Developer of the
- * Original Code is Bill Foote, with contributions from others
- * at JavaSoft/Sun.
- */
-
-var hatPkg = Packages.com.sun.tools.hat.internal;
-
-/**
- * This is JavaScript interface for heap analysis using HAT
- * (Heap Analysis Tool). HAT classes are referred from
- * this file. In particular, refer to classes in hat.model
- * package.
- *
- * HAT model objects are wrapped as convenient script objects so that
- * fields may be accessed in natural syntax. For eg. Java fields can be
- * accessed with obj.field_name syntax and array elements can be accessed
- * with array[index] syntax.
- */
-
-// returns an enumeration that wraps elements of
-// the input enumeration elements.
-function wrapperEnumeration(e) {
- return new java.util.Enumeration() {
- hasMoreElements: function() {
- return e.hasMoreElements();
- },
- nextElement: function() {
- return wrapJavaValue(e.nextElement());
- }
- };
-}
-
-// returns an enumeration that filters out elements
-// of input enumeration using the filter function.
-function filterEnumeration(e, func, wrap) {
- var next = undefined;
- var index = 0;
-
- function findNext() {
- var tmp;
- while (e.hasMoreElements()) {
- tmp = e.nextElement();
- index++;
- if (wrap) {
- tmp = wrapJavaValue(tmp);
- }
- if (func(tmp, index, e)) {
- next = tmp;
- return;
- }
- }
- }
-
- return new java.util.Enumeration() {
- hasMoreElements: function() {
- findNext();
- return next != undefined;
- },
-
- nextElement: function() {
- if (next == undefined) {
- // user may not have called hasMoreElements?
- findNext();
- }
- if (next == undefined) {
- throw "NoSuchElementException";
- }
- var res = next;
- next = undefined;
- return res;
- }
- };
-}
-
-// enumeration that has no elements ..
-var emptyEnumeration = new java.util.Enumeration() {
- hasMoreElements: function() {
- return false;
- },
- nextElement: function() {
- throw "NoSuchElementException";
- }
- };
-
-function wrapRoot(root) {
- if (root) {
- return {
- id: root.idString,
- description: root.description,
- referrer: wrapJavaValue(root.referer),
- type: root.typeName
- };
- } else {
- return null;
- }
-}
-
-function JavaClassProto() {
- function jclass(obj) {
- return obj['wrapped-object'];
- }
-
- // return whether given class is subclass of this class or not
- this.isSubclassOf = function(other) {
- var tmp = jclass(this);
- var otherid = objectid(other);
- while (tmp != null) {
- if (otherid.equals(tmp.idString)) {
- return true;
- }
- tmp = tmp.superclass;
- }
- return false;
- }
-
- // return whether given class is superclass of this class or not
- this.isSuperclassOf = function(other) {
- return other.isSubclassOf(this);
- }
-
- // includes direct and indirect superclasses
- this.superclasses = function() {
- var res = new Array();
- var tmp = this.superclass;
- while (tmp != null) {
- res[res.length] = tmp;
- tmp = tmp.superclass;
- }
- return res;
- }
-
- /**
- * Returns an array containing subclasses of this class.
- *
- * @param indirect should include indirect subclasses or not.
- * default is true.
- */
- this.subclasses = function(indirect) {
- if (indirect == undefined) indirect = true;
- var classes = jclass(this).subclasses;
- var res = new Array();
- for (var i in classes) {
- var subclass = wrapJavaValue(classes[i]);
- res[res.length] = subclass;
- if (indirect) {
- res = res.concat(subclass.subclasses());
- }
- }
- return res;
- }
- this.toString = function() { return jclass(this).toString(); }
-}
-
-var theJavaClassProto = new JavaClassProto();
-
-// Script wrapper for HAT model objects, values.
-// wraps a Java value as appropriate for script object
-function wrapJavaValue(thing) {
- if (thing == null || thing == undefined ||
- thing instanceof hatPkg.model.HackJavaValue) {
- return null;
- }
-
- if (thing instanceof hatPkg.model.JavaValue) {
- // map primitive values to closest JavaScript primitives
- if (thing instanceof hatPkg.model.JavaBoolean) {
- return thing.toString() == "true";
- } else if (thing instanceof hatPkg.model.JavaChar) {
- return thing.toString() + '';
- } else {
- return java.lang.Double.parseDouble(thing.toString());
- }
- } else {
- // wrap Java object as script object
- return wrapJavaObject(thing);
- }
-}
-
-// wrap Java object with appropriate script object
-function wrapJavaObject(thing) {
-
- // HAT Java model object wrapper. Handles all cases
- // (instance, object/primitive array and Class objects)
- function javaObject(jobject) {
- // FIXME: Do I need this? or can I assume that these would
- // have been resolved already?
- if (jobject instanceof hatPkg.model.JavaObjectRef) {
- jobject = jobject.dereference();
- if (jobject instanceof hatPkg.model.HackJavaValue) {
- print(jobject);
- return null;
- }
- }
-
- if (jobject instanceof hatPkg.model.JavaObject) {
- return new JavaObjectWrapper(jobject);
- } else if (jobject instanceof hatPkg.model.JavaClass) {
- return new JavaClassWrapper(jobject);
- } else if (jobject instanceof hatPkg.model.JavaObjectArray) {
- return new JavaObjectArrayWrapper(jobject);
- } else if (jobject instanceof hatPkg.model.JavaValueArray) {
- return new JavaValueArrayWrapper(jobject);
- } else {
- print("unknown heap object type: " + jobject.getClass());
- return jobject;
- }
- }
-
- // returns wrapper for Java instances
- function JavaObjectWrapper(instance) {
- var things = instance.fields;
- var fields = instance.clazz.fieldsForInstance;
-
- // instance fields can be accessed in natural syntax
- return new JSAdapter() {
- __getIds__ : function() {
- var res = new Array(fields.length);
- for (var i in fields) {
- res[i] = fields[i].name;
- }
- return res;
- },
- __has__ : function(name) {
- for (var i in fields) {
- if (name == fields[i].name) return true;
- }
- return name == 'class' || name == 'toString' ||
- name == 'wrapped-object';
- },
- __get__ : function(name) {
-
- for (var i in fields) {
- if(fields[i].name == name) {
- return wrapJavaValue(things[i]);
- }
- }
-
- if (name == 'class') {
- return wrapJavaValue(instance.clazz);
- } else if (name == 'wrapped-object') {
- return instance;
- }
-
- return undefined;
- },
- __call__: function(name) {
- if (name == 'toString') {
- return instance.toString();
- } else {
- return undefined;
- }
- }
- }
- }
-
-
- // return wrapper for Java Class objects
- function JavaClassWrapper(jclass) {
- var fields = jclass.statics;
-
- // to access static fields of given Class cl, use
- // cl.statics.<static-field-name> syntax
- this.statics = new JSAdapter() {
- __getIds__ : function() {
- var res = new Array(fields.length);
- for (var i in fields) {
- res[i] = fields[i].field.name;
- }
- return res;
- },
- __has__ : function(name) {
- for (var i in fields) {
- if (name == fields[i].field.name) {
- return true;
- }
- }
- return false;
- },
- __get__ : function(name) {
- for (var i in fields) {
- if (name == fields[i].field.name) {
- return wrapJavaValue(fields[i].value);
- }
- }
- return undefined;
- }
- }
-
- if (jclass.superclass != null) {
- this.superclass = wrapJavaValue(jclass.superclass);
- } else {
- this.superclass = null;
- }
-
- this.loader = wrapJavaValue(jclass.getLoader());
- this.signers = wrapJavaValue(jclass.getSigners());
- this.protectionDomain = wrapJavaValue(jclass.getProtectionDomain());
- this.instanceSize = jclass.instanceSize;
- this.name = jclass.name;
- this.fields = jclass.fields;
- this['wrapped-object'] = jclass;
- }
-
- for (var i in theJavaClassProto) {
- if (typeof theJavaClassProto[i] == 'function') {
- JavaClassWrapper.prototype[i] = theJavaClassProto[i];
- }
- }
-
- // returns wrapper for Java object arrays
- function JavaObjectArrayWrapper(array) {
- var elements = array.elements;
- // array elements can be accessed in natural syntax
- // also, 'length' property is supported.
- return new JSAdapter() {
- __getIds__ : function() {
- var res = new Array(elements.length);
- for (var i = 0; i < elements.length; i++) {
- res[i] = String(i);
- }
- return res;
- },
- __has__: function(name) {
- return (name >= 0 && name < elements.length) ||
- name == 'length' || name == 'class' ||
- name == 'toString' || name == 'wrapped-object';
- },
- __get__ : function(name) {
- if (name >= 0 && name < elements.length) {
- return wrapJavaValue(elements[name]);
- } else if (name == 'length') {
- return elements.length;
- } else if (name == 'class') {
- return wrapJavaValue(array.clazz);
- } else if (name == 'wrapped-object') {
- return array;
- } else {
- return undefined;
- }
- },
- __call__: function(name) {
- if (name == 'toString') {
- return array.toString();
- } else {
- return undefined;
- }
- }
- }
- }
-
- // returns wrapper for Java primitive arrays
- function JavaValueArrayWrapper(array) {
- var type = String(java.lang.Character.toString(array.elementType));
- var elements = array.elements;
- // array elements can be accessed in natural syntax
- // also, 'length' property is supported.
- return new JSAdapter() {
- __getIds__ : function() {
- var r = new Array(array.length);
- for (var i = 0; i < array.length; i++) {
- r[i] = String(i);
- }
- return r;
- },
- __has__: function(name) {
- return (name >= 0 && name < array.length) ||
- name == 'length' || name == 'class' ||
- name == 'toString' || name == 'wrapped-object';
- },
- __get__: function(name) {
- if (name >= 0 && name < array.length) {
- return elements[name];
- }
-
- if (name == 'length') {
- return array.length;
- } else if (name == 'wrapped-object') {
- return array;
- } else if (name == 'class') {
- return wrapJavaValue(array.clazz);
- } else {
- return undefined;
- }
- },
- __call__: function(name) {
- if (name == 'toString') {
- return array.valueString(true);
- } else {
- return undefined;
- }
- }
- }
- }
- return javaObject(thing);
-}
-
-// unwrap a script object to corresponding HAT object
-function unwrapJavaObject(jobject) {
- if (!(jobject instanceof hatPkg.model.JavaHeapObject)) {
- try {
- jobject = jobject["wrapped-object"];
- } catch (e) {
- print("unwrapJavaObject: " + jobject + ", " + e);
- jobject = undefined;
- }
- }
- return jobject;
-}
-
-/**
- * readHeapDump parses a heap dump file and returns script wrapper object.
- *
- * @param file Heap dump file name
- * @param stack flag to tell if allocation site traces are available
- * @param refs flag to tell if backward references are needed or not
- * @param debug debug level for HAT
- * @return heap as a JavaScript object
- */
-function readHeapDump(file, stack, refs, debug) {
-
- // default value of debug is 0
- if (!debug) debug = 0;
-
- // by default, we assume no stack traces
- if (!stack) stack = false;
-
- // by default, backward references are resolved
- if (!refs) refs = true;
-
- // read the heap dump
- var heap = hatPkg.parser.HprofReader.readFile(file, stack, debug);
-
- // resolve it
- heap.resolve(refs);
-
- // wrap Snapshot as convenient script object
- return wrapHeapSnapshot(heap);
-}
-
-/**
- * The result object supports the following methods:
- *
- * forEachClass -- calls a callback for each Java Class
- * forEachObject -- calls a callback for each Java object
- * findClass -- finds Java Class of given name
- * findObject -- finds object from given object id
- * objects -- returns all objects of given class as an enumeration
- * classes -- returns all classes in the heap as an enumeration
- * reachables -- returns all objects reachable from a given object
- * livepaths -- returns an array of live paths because of which an
- * object alive.
- * describeRef -- returns description for a reference from a 'from'
- * object to a 'to' object.
- */
-function wrapHeapSnapshot(heap) {
- function getClazz(clazz) {
- if (clazz == undefined) clazz = "java.lang.Object";
- var type = typeof(clazz);
- if (type == "string") {
- clazz = heap.findClass(clazz);
- } else if (type == "object") {
- clazz = unwrapJavaObject(clazz);
- } else {
- throw "class expected";;
- }
- return clazz;
- }
-
- // return heap as a script object with useful methods.
- return {
- snapshot: heap,
-
- /**
- * Class iteration: Calls callback function for each
- * Java Class in the heap. Default callback function
- * is 'print'. If callback returns true, the iteration
- * is stopped.
- *
- * @param callback function to be called.
- */
- forEachClass: function(callback) {
- if (callback == undefined) callback = print;
- var classes = this.snapshot.classes;
- while (classes.hasMoreElements()) {
- if (callback(wrapJavaValue(classes.nextElement())))
- return;
- }
- },
-
- /**
- * Returns an Enumeration of all roots.
- */
- roots: function() {
- var e = this.snapshot.roots;
- return new java.util.Enumeration() {
- hasMoreElements: function() {
- return e.hasMoreElements();
- },
- nextElement: function() {
- return wrapRoot(e.nextElement());
- }
- };
- },
-
- /**
- * Returns an Enumeration for all Java classes.
- */
- classes: function() {
- return wrapIterator(this.snapshot.classes, true);
- },
-
- /**
- * Object iteration: Calls callback function for each
- * Java Object in the heap. Default callback function
- * is 'print'.If callback returns true, the iteration
- * is stopped.
- *
- * @param callback function to be called.
- * @param clazz Class whose objects are retrieved.
- * Optional, default is 'java.lang.Object'
- * @param includeSubtypes flag to tell if objects of subtypes
- * are included or not. optional, default is true.
- */
- forEachObject: function(callback, clazz, includeSubtypes) {
- if (includeSubtypes == undefined) includeSubtypes = true;
- if (callback == undefined) callback = print;
- clazz = getClazz(clazz);
-
- if (clazz) {
- var instances = clazz.getInstances(includeSubtypes);
- while (instances.hasNextElements()) {
- if (callback(wrapJavaValue(instances.nextElement())))
- return;
- }
- }
- },
-
- /**
- * Returns an enumeration of Java objects in the heap.
- *
- * @param clazz Class whose objects are retrieved.
- * Optional, default is 'java.lang.Object'
- * @param includeSubtypes flag to tell if objects of subtypes
- * are included or not. optional, default is true.
- * @param where (optional) filter expression or function to
- * filter the objects. The expression has to return true
- * to include object passed to it in the result array.
- * Built-in variable 'it' refers to the current object in
- * filter expression.
- */
- objects: function(clazz, includeSubtypes, where) {
- if (includeSubtypes == undefined) includeSubtypes = true;
- if (where) {
- if (typeof(where) == 'string') {
- where = new Function("it", "return " + where);
- }
- }
- clazz = getClazz(clazz);
- if (clazz) {
- var instances = clazz.getInstances(includeSubtypes);
- if (where) {
- return filterEnumeration(instances, where, true);
- } else {
- return wrapperEnumeration(instances);
- }
- } else {
- return emptyEnumeration;
- }
- },
-
- /**
- * Find Java Class of given name.
- *
- * @param name class name
- */
- findClass: function(name) {
- var clazz = this.snapshot.findClass(name + '');
- return wrapJavaValue(clazz);
- },
-
- /**
- * Find Java Object from given object id
- *
- * @param id object id as string
- */
- findObject: function(id) {
- return wrapJavaValue(this.snapshot.findThing(id));
- },
-
- /**
- * Returns an enumeration of objects in the finalizer
- * queue waiting to be finalized.
- */
- finalizables: function() {
- var tmp = this.snapshot.getFinalizerObjects();
- return wrapperEnumeration(tmp);
- },
-
- /**
- * Returns an array that contains objects referred from the
- * given Java object directly or indirectly (i.e., all
- * transitively referred objects are returned).
- *
- * @param jobject Java object whose reachables are returned.
- */
- reachables: function (jobject) {
- return reachables(jobject, this.snapshot.reachableExcludes);
- },
-
- /**
- * Returns array of paths of references by which the given
- * Java object is live. Each path itself is an array of
- * objects in the chain of references. Each path supports
- * toHtml method that returns html description of the path.
- *
- * @param jobject Java object whose live paths are returned
- * @param weak flag to indicate whether to include paths with
- * weak references or not. default is false.
- */
- livepaths: function (jobject, weak) {
- if (weak == undefined) {
- weak = false;
- }
-
- function wrapRefChain(refChain) {
- var path = new Array();
-
- // compute path array from refChain
- var tmp = refChain;
- while (tmp != null) {
- var obj = tmp.obj;
- path[path.length] = wrapJavaValue(obj);
- tmp = tmp.next;
- }
-
- function computeDescription(html) {
- var root = refChain.obj.root;
- var desc = root.description;
- if (root.referer) {
- var ref = root.referer;
- desc += " (from " +
- (html? toHtml(ref) : ref.toString()) + ')';
- }
- desc += '->';
- var tmp = refChain;
- while (tmp != null) {
- var next = tmp.next;
- var obj = tmp.obj;
- desc += html? toHtml(obj) : obj.toString();
- if (next != null) {
- desc += " (" +
- obj.describeReferenceTo(next.obj, heap) +
- ") ->";
- }
- tmp = next;
- }
- return desc;
- }
-
- return new JSAdapter() {
- __getIds__ : function() {
- var res = new Array(path.length);
- for (var i = 0; i < path.length; i++) {
- res[i] = String(i);
- }
- return res;
- },
- __has__ : function (name) {
- return (name >= 0 && name < path.length) ||
- name == 'length' || name == 'toHtml' ||
- name == 'toString';
- },
- __get__ : function(name) {
- if (name >= 0 && name < path.length) {
- return path[name];
- } else if (name == 'length') {
- return path.length;
- } else {
- return undefined;
- }
- },
- __call__: function(name) {
- if (name == 'toHtml') {
- return computeDescription(true);
- } else if (name == 'toString') {
- return computeDescription(false);
- } else {
- return undefined;
- }
- }
- };
- }
-
- jobject = unwrapJavaObject(jobject);
- var refChains = this.snapshot.rootsetReferencesTo(jobject, weak);
- var paths = new Array(refChains.length);
- for (var i in refChains) {
- paths[i] = wrapRefChain(refChains[i]);
- }
- return paths;
- },
-
- /**
- * Return description string for reference from 'from' object
- * to 'to' Java object.
- *
- * @param from source Java object
- * @param to destination Java object
- */
- describeRef: function (from, to) {
- from = unwrapJavaObject(from);
- to = unwrapJavaObject(to);
- return from.describeReferenceTo(to, this.snapshot);
- },
- };
-}
-
-// per-object functions
-
-/**
- * Returns allocation site trace (if available) of a Java object
- *
- * @param jobject object whose allocation site trace is returned
- */
-function allocTrace(jobject) {
- try {
- jobject = unwrapJavaObject(jobject);
- var trace = jobject.allocatedFrom;
- return (trace != null) ? trace.frames : null;
- } catch (e) {
- print("allocTrace: " + jobject + ", " + e);
- return null;
- }
-}
-
-/**
- * Returns Class object for given Java object
- *
- * @param jobject object whose Class object is returned
- */
-function classof(jobject) {
- jobject = unwrapJavaObject(jobject);
- return wrapJavaValue(jobject.clazz);
-}
-
-/**
- * Find referers (a.k.a in-coming references). Calls callback
- * for each referrer of the given Java object. If the callback
- * returns true, the iteration is stopped.
- *
- * @param callback function to call for each referer
- * @param jobject object whose referers are retrieved
- */
-function forEachReferrer(callback, jobject) {
- jobject = unwrapJavaObject(jobject);
- var refs = jobject.referers;
- while (refs.hasMoreElements()) {
- if (callback(wrapJavaValue(refs.nextElement()))) {
- return;
- }
- }
-}
-
-/**
- * Compares two Java objects for object identity.
- *
- * @param o1, o2 objects to compare for identity
- */
-function identical(o1, o2) {
- return objectid(o1) == objectid(o2);
-}
-
-/**
- * Returns Java object id as string
- *
- * @param jobject object whose id is returned
- */
-function objectid(jobject) {
- try {
- jobject = unwrapJavaObject(jobject);
- return String(jobject.idString);
- } catch (e) {
- print("objectid: " + jobject + ", " + e);
- return null;
- }
-}
-
-/**
- * Prints allocation site trace of given object
- *
- * @param jobject object whose allocation site trace is returned
- */
-function printAllocTrace(jobject) {
- var frames = this.allocTrace(jobject);
- if (frames == null || frames.length == 0) {
- print("allocation site trace unavailable for " +
- objectid(jobject));
- return;
- }
- print(objectid(jobject) + " was allocated at ..");
- for (var i in frames) {
- var frame = frames[i];
- var src = frame.sourceFileName;
- if (src == null) src = '<unknown source>';
- print('\t' + frame.className + "." +
- frame.methodName + '(' + frame.methodSignature + ') [' +
- src + ':' + frame.lineNumber + ']');
- }
-}
-
-/**
- * Returns an enumeration of referrers of the given Java object.
- *
- * @param jobject Java object whose referrers are returned.
- */
-function referrers(jobject) {
- try {
- jobject = unwrapJavaObject(jobject);
- return wrapperEnumeration(jobject.referers);
- } catch (e) {
- print("referrers: " + jobject + ", " + e);
- return emptyEnumeration;
- }
-}
-
-/**
- * Returns an array that contains objects referred from the
- * given Java object.
- *
- * @param jobject Java object whose referees are returned.
- */
-function referees(jobject) {
- var res = new Array();
- jobject = unwrapJavaObject(jobject);
- if (jobject != undefined) {
- try {
- jobject.visitReferencedObjects(
- new hatPkg.model.JavaHeapObjectVisitor() {
- visit: function(other) {
- res[res.length] = wrapJavaValue(other);
- },
- exclude: function(clazz, field) {
- return false;
- },
- mightExclude: function() {
- return false;
- }
- });
- } catch (e) {
- print("referees: " + jobject + ", " + e);
- }
- }
- return res;
-}
-
-/**
- * Returns an array that contains objects referred from the
- * given Java object directly or indirectly (i.e., all
- * transitively referred objects are returned).
- *
- * @param jobject Java object whose reachables are returned.
- * @param excludes optional comma separated list of fields to be
- * removed in reachables computation. Fields are
- * written as class_name.field_name form.
- */
-function reachables(jobject, excludes) {
- if (excludes == undefined) {
- excludes = null;
- } else if (typeof(excludes) == 'string') {
- var st = new java.util.StringTokenizer(excludes, ",");
- var excludedFields = new Array();
- while (st.hasMoreTokens()) {
- excludedFields[excludedFields.length] = st.nextToken().trim();
- }
- if (excludedFields.length > 0) {
- excludes = new hatPkg.model.ReachableExcludes() {
- isExcluded: function (field) {
- for (var index in excludedFields) {
- if (field.equals(excludedFields[index])) {
- return true;
- }
- }
- return false;
- }
- };
- } else {
- // nothing to filter...
- excludes = null;
- }
- } else if (! (excludes instanceof hatPkg.model.ReachableExcludes)) {
- excludes = null;
- }
-
- jobject = unwrapJavaObject(jobject);
- var ro = new hatPkg.model.ReachableObjects(jobject, excludes);
- var tmp = ro.reachables;
- var res = new Array(tmp.length);
- for (var i in tmp) {
- res[i] = wrapJavaValue(tmp[i]);
- }
- return res;
-}
-
-
-/**
- * Returns whether 'from' object refers to 'to' object or not.
- *
- * @param from Java object that is source of the reference.
- * @param to Java object that is destination of the reference.
- */
-function refers(from, to) {
- try {
- var tmp = unwrapJavaObject(from);
- if (tmp instanceof hatPkg.model.JavaClass) {
- from = from.statics;
- } else if (tmp instanceof hatPkg.model.JavaValueArray) {
- return false;
- }
- for (var i in from) {
- if (identical(from[i], to)) {
- return true;
- }
- }
- } catch (e) {
- print("refers: " + from + ", " + e);
- }
- return false;
-}
-
-/**
- * If rootset includes given jobject, return Root
- * object explanining the reason why it is a root.
- *
- * @param jobject object whose Root is returned
- */
-function root(jobject) {
- try {
- jobject = unwrapJavaObject(jobject);
- return wrapRoot(jobject.root);
- } catch (e) {
- return null;
- }
-}
-
-/**
- * Returns size of the given Java object
- *
- * @param jobject object whose size is returned
- */
-function sizeof(jobject) {
- try {
- jobject = unwrapJavaObject(jobject);
- return jobject.size;
- } catch (e) {
- print("sizeof: " + jobject + ", " + e);
- return null;
- }
-}
-
-/**
- * Returns String by replacing Unicode chars and
- * HTML special chars (such as '<') with entities.
- *
- * @param str string to be encoded
- */
-function encodeHtml(str) {
- return hatPkg.util.Misc.encodeHtml(str);
-}
-
-/**
- * Returns HTML string for the given object.
- *
- * @param obj object for which HTML string is returned.
- */
-function toHtml(obj) {
- if (obj == null) {
- return "null";
- }
-
- if (obj == undefined) {
- return "undefined";
- }
-
- var tmp = unwrapJavaObject(obj);
- if (tmp != undefined) {
- var id = tmp.idString;
- if (tmp instanceof Packages.com.sun.tools.hat.internal.model.JavaClass) {
- var name = tmp.name;
- return "<a href='/class/" + id + "'>class " + name + "</a>";
- } else {
- var name = tmp.clazz.name;
- return "<a href='/object/" + id + "'>" +
- name + "@" + id + "</a>";
- }
- } else if (obj instanceof Object) {
- if (Array.isArray(obj)) {
- // script array
- var res = "[ ";
- for (var i in obj) {
- res += toHtml(obj[i]);
- if (i != obj.length - 1) {
- res += ", ";
- }
- }
- res += " ]";
- return res;
- } else {
- // if the object has a toHtml function property
- // just use that...
- if (typeof(obj.toHtml) == 'function') {
- return obj.toHtml();
- } else {
- // script object
- var res = "{ ";
- for (var i in obj) {
- res += i + ":" + toHtml(obj[i]) + ", ";
- }
- res += "}";
- return res;
- }
- }
- } else {
- // a Java object
- obj = wrapIterator(obj);
- // special case for enumeration
- if (obj instanceof java.util.Enumeration) {
- var res = "[ ";
- while (obj.hasMoreElements()) {
- res += toHtml(obj.nextElement()) + ", ";
- }
- res += "]";
- return res;
- } else {
- return obj;
- }
- }
-}
-
-/*
- * Generic array/iterator/enumeration [or even object!] manipulation
- * functions. These functions accept an array/iteration/enumeration
- * and expression String or function. These functions iterate each
- * element of array and apply the expression/function on each element.
- */
-
-// private function to wrap an Iterator as an Enumeration
-function wrapIterator(itr, wrap) {
- if (itr instanceof java.util.Iterator) {
- return new java.util.Enumeration() {
- hasMoreElements: function() {
- return itr.hasNext();
- },
- nextElement: function() {
- return wrap? wrapJavaValue(itr.next()) : itr.next();
- }
- };
- } else {
- return itr;
- }
-}
-
-/**
- * Converts an enumeration/iterator/object into an array
- *
- * @param obj enumeration/iterator/object
- * @return array that contains values of enumeration/iterator/object
- */
-function toArray(obj) {
- obj = wrapIterator(obj);
- if (obj instanceof java.util.Enumeration) {
- var res = new Array();
- while (obj.hasMoreElements()) {
- res[res.length] = obj.nextElement();
- }
- return res;
- } else if (obj instanceof Array) {
- return obj;
- } else {
- var res = new Array();
- for (var index in obj) {
- res[res.length] = obj[index];
- }
- return res;
- }
-}
-
-/**
- * Returns whether the given array/iterator/enumeration contains
- * an element that satisfies the given boolean expression specified
- * in code.
- *
- * @param array input array/iterator/enumeration that is iterated
- * @param code expression string or function
- * @return boolean result
- *
- * The code evaluated can refer to the following built-in variables.
- *
- * 'it' -> currently visited element
- * 'index' -> index of the current element
- * 'array' -> array that is being iterated
- */
-function contains(array, code) {
- array = wrapIterator(array);
- var func = code;
- if (typeof(func) != 'function') {
- func = new Function("it", "index", "array", "return " + code);
- }
-
- if (array instanceof java.util.Enumeration) {
- var index = 0;
- while (array.hasMoreElements()) {
- var it = array.nextElement();
- if (func(it, index, array)) {
- return true;
- }
- index++;
- }
- } else {
- for (var index in array) {
- var it = array[index];
- if (func(it, String(index), array)) {
- return true;
- }
- }
- }
- return false;
-}
-
-/**
- * concatenates two arrays/iterators/enumerators.
- *
- * @param array1 array/iterator/enumeration
- * @param array2 array/iterator/enumeration
- *
- * @return concatenated array or composite enumeration
- */
-function concat(array1, array2) {
- array1 = wrapIterator(array1);
- array2 = wrapIterator(array2);
- if (array1 instanceof Array && array2 instanceof Array) {
- return array1.concat(array2);
- } else if (array1 instanceof java.util.Enumeration &&
- array2 instanceof java.util.Enumeration) {
- return new Packages.com.sun.tools.hat.internal.util.CompositeEnumeration(array1, array2);
- } else {
- return undefined;
- }
-}
-
-/**
- * Returns the number of array/iterator/enumeration elements
- * that satisfy the given boolean expression specified in code.
- * The code evaluated can refer to the following built-in variables.
- *
- * @param array input array/iterator/enumeration that is iterated
- * @param code expression string or function
- * @return number of elements
- *
- * 'it' -> currently visited element
- * 'index' -> index of the current element
- * 'array' -> array that is being iterated
- */
-function count(array, code) {
- if (code == undefined) {
- return length(array);
- }
- array = wrapIterator(array);
- var func = code;
- if (typeof(func) != 'function') {
- func = new Function("it", "index", "array", "return " + code);
- }
-
- var result = 0;
- if (array instanceof java.util.Enumeration) {
- var index = 0;
- while (array.hasMoreElements()) {
- var it = array.nextElement();
- if (func(it, index, array)) {
- result++;
- }
- index++;
- }
- } else {
- for (var index in array) {
- var it = array[index];
- if (func(it, index, array)) {
- result++;
- }
- }
- }
- return result;
-}
-
-/**
- * filter function returns an array/enumeration that contains
- * elements of the input array/iterator/enumeration that satisfy
- * the given boolean expression. The boolean expression code can
- * refer to the following built-in variables.
- *
- * @param array input array/iterator/enumeration that is iterated
- * @param code expression string or function
- * @return array/enumeration that contains the filtered elements
- *
- * 'it' -> currently visited element
- * 'index' -> index of the current element
- * 'array' -> array that is being iterated
- * 'result' -> result array
- */
-function filter(array, code) {
- array = wrapIterator(array);
- var func = code;
- if (typeof(code) != 'function') {
- func = new Function("it", "index", "array", "result", "return " + code);
- }
- if (array instanceof java.util.Enumeration) {
- return filterEnumeration(array, func, false);
- } else {
- var result = new Array();
- for (var index in array) {
- var it = array[index];
- if (func(it, String(index), array, result)) {
- result[result.length] = it;
- }
- }
- return result;
- }
-}
-
-/**
- * Returns the number of elements of array/iterator/enumeration.
- *
- * @param array input array/iterator/enumeration that is iterated
- */
-function length(array) {
- array = wrapIterator(array);
- if (array instanceof Array) {
- return array.length;
- } else if (array instanceof java.util.Enumeration) {
- var cnt = 0;
- while (array.hasMoreElements()) {
- array.nextElement();
- cnt++;
- }
- return cnt;
- } else {
- var cnt = 0;
- for (var index in array) {
- cnt++;
- }
- return cnt;
- }
-}
-
-/**
- * Transforms the given object or array by evaluating given code
- * on each element of the object or array. The code evaluated
- * can refer to the following built-in variables.
- *
- * @param array input array/iterator/enumeration that is iterated
- * @param code expression string or function
- * @return array/enumeration that contains mapped values
- *
- * 'it' -> currently visited element
- * 'index' -> index of the current element
- * 'array' -> array that is being iterated
- * 'result' -> result array
- *
- * map function returns an array/enumeration of values created
- * by repeatedly calling code on each element of the input
- * array/iterator/enumeration.
- */
-function map(array, code) {
- array = wrapIterator(array);
- var func = code;
- if(typeof(code) != 'function') {
- func = new Function("it", "index", "array", "result", "return " + code);
- }
-
- if (array instanceof java.util.Enumeration) {
- var index = 0;
- var result = new java.util.Enumeration() {
- hasMoreElements: function() {
- return array.hasMoreElements();
- },
- nextElement: function() {
- return func(array.nextElement(), index++, array, result);
- }
- };
- return result;
- } else {
- var result = new Array();
- for (var index in array) {
- var it = array[index];
- result[result.length] = func(it, String(index), array, result);
- }
- return result;
- }
-}
-
-// private function used by min, max functions
-function minmax(array, code) {
- if (typeof(code) == 'string') {
- code = new Function("lhs", "rhs", "return " + code);
- }
- array = wrapIterator(array);
- if (array instanceof java.util.Enumeration) {
- if (! array.hasMoreElements()) {
- return undefined;
- }
- var res = array.nextElement();
- while (array.hasMoreElements()) {
- var next = array.nextElement();
- if (code(next, res)) {
- res = next;
- }
- }
- return res;
- } else {
- if (array.length == 0) {
- return undefined;
- }
- var res = array[0];
- for (var index = 1; index < array.length; index++) {
- if (code(array[index], res)) {
- res = array[index];
- }
- }
- return res;
- }
-}
-
-/**
- * Returns the maximum element of the array/iterator/enumeration
- *
- * @param array input array/iterator/enumeration that is iterated
- * @param code (optional) comparision expression or function
- * by default numerical maximum is computed.
- */
-function max(array, code) {
- if (code == undefined) {
- code = function (lhs, rhs) { return lhs > rhs; }
- }
- return minmax(array, code);
-}
-
-/**
- * Returns the minimum element of the array/iterator/enumeration
- *
- * @param array input array/iterator/enumeration that is iterated
- * @param code (optional) comparision expression or function
- * by default numerical minimum is computed.
- */
-function min(array, code) {
- if (code == undefined) {
- code = function (lhs, rhs) { return lhs < rhs; }
- }
- return minmax(array, code);
-}
-
-/**
- * sort function sorts the input array. optionally accepts
- * code to compare the elements. If code is not supplied,
- * numerical sort is done.
- *
- * @param array input array/iterator/enumeration that is sorted
- * @param code expression string or function
- * @return sorted array
- *
- * The comparison expression can refer to the following
- * built-in variables:
- *
- * 'lhs' -> 'left side' element
- * 'rhs' -> 'right side' element
- */
-function sort(array, code) {
- // we need an array to sort, so convert non-arrays
- array = toArray(array);
-
- // by default use numerical comparison
- var func = code;
- if (code == undefined) {
- func = function(lhs, rhs) { return lhs - rhs; };
- } else if (typeof(code) == 'string') {
- func = new Function("lhs", "rhs", "return " + code);
- }
- return array.sort(func);
-}
-
-/**
- * Returns the sum of the elements of the array
- *
- * @param array input array that is summed.
- * @param code optional expression used to map
- * input elements before sum.
- */
-function sum(array, code) {
- array = wrapIterator(array);
- if (code != undefined) {
- array = map(array, code);
- }
- var result = 0;
- if (array instanceof java.util.Enumeration) {
- while (array.hasMoreElements()) {
- result += Number(array.nextElement());
- }
- } else {
- for (var index in array) {
- result += Number(array[index]);
- }
- }
- return result;
-}
-
-/**
- * Returns array of unique elements from the given input
- * array/iterator/enumeration.
- *
- * @param array from which unique elements are returned.
- * @param code optional expression (or function) giving unique
- * attribute/property for each element.
- * by default, objectid is used for uniqueness.
- */
-function unique(array, code) {
- array = wrapIterator(array);
- if (code == undefined) {
- code = new Function("it", "return objectid(it);");
- } else if (typeof(code) == 'string') {
- code = new Function("it", "return " + code);
- }
- var tmp = new Object();
- if (array instanceof java.util.Enumeration) {
- while (array.hasMoreElements()) {
- var it = array.nextElement();
- tmp[code(it)] = it;
- }
- } else {
- for (var index in array) {
- var it = array[index];
- tmp[code(it)] = it;
- }
- }
- var res = new Array();
- for (var index in tmp) {
- res[res.length] = tmp[index];
- }
- return res;
-}
--- a/jdk/src/jdk.dev/share/classes/com/sun/tools/hat/resources/oqlhelp.html Thu May 21 10:07:38 2015 -0700
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,808 +0,0 @@
-<!--
-Copyright (c) 2005, 2013, Oracle and/or its affiliates. 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. Oracle designates this
-particular file as subject to the "Classpath" exception as provided
-by Oracle in the LICENSE file that accompanied this code.
-
-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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
-or visit www.oracle.com if you need additional information or have any
-questions.
--->
-
-<html>
-<head>
-<style>
-.key { color: red; font-weight: bold }
-</style>
-<title>
-Object Query Language (OQL)
-</title>
-</head>
-<body>
-<h1>Object Query Language (OQL)</h1>
-
-<p>
-OQL is SQL-like query language to query Java heap. OQL allows to filter/select information
-wanted from Java heap. While pre-defined queries such as "show all instances of class X"
-are already supported by HAT, OQL adds more flexibility. OQL is based on JavaScript expression
-language.
-</p>
-
-<p>
-OQL query is of the form
-
-<pre>
-<code>
- <span class="key">select</span> <JavaScript expression to select>
- [ <span class="key">from</span> [<span class="key">instanceof</span>] <class name> <identifier>
- [ <span class="key">where</span> <JavaScript boolean expression to filter> ] ]
-</code>
-</pre>
-where class name is fully qualified Java class name (example: java.net.URL) or array class name.
-[C is char array name, [Ljava.io.File; is name of java.io.File[] and so on.
-Note that fully qualified class name does not always uniquely identify a
-Java class at runtime. There may be more than one Java class with the same
-name but loaded by different loaders. So, class name is permitted to be
-id string of the class object.
-
-If <span class="key">instanceof</span> keyword is used, subtype objects are selected. If this
-keyword is not specified, only the instances of exact class specified are selected. Both
-<span class="key">from</span> and <span class="key">where</span> clauses are optional.
-</p>
-
-
-<p>
-In <span class="key">select</span> and (optional) <span class="key">where</span> clauses, the expression
-used in JavaScript expression. Java heap objects are wrapped as convenient script objects so that
-fields may be accessed in natural syntax. For example, Java fields can be accessed with obj.field_name
-syntax and array elements can be accessed with array[index] syntax. Each Java object selected is
-bound to a JavaScript variable of the identifier name specified in <span class="key">from</span> clause.
-</p>
-
-<h2>OQL Examples</h2>
-
-<ul>
-<li>select all Strings of length 100 or more
-<pre>
-<code>
- select s from java.lang.String s where s.value.length >= 100
-</code>
-</pre>
-<li>select all int arrays of length 256 or more
-<pre>
-<code>
- select a from [I a where a.length >= 256
-</code>
-</pre>
-<li>show content of Strings that match a regular expression
-<pre>
-<code>
- select s.value.toString() from java.lang.String s
- where /java/.test(s.value.toString())
-</code>
-</pre>
-<li>show path value of all File objects
-<pre>
-<code</b>
- select file.path.value.toString() from java.io.File file
-</code>
-</pre>
-<li>show names of all ClassLoader classes
-<pre>
-<code>
- select <a href="#classof">classof</a>(cl).name
- from instanceof java.lang.ClassLoader cl
-</code>
-</pre>
-<li>show instances of the Class identified by given id string
-<pre>
-<code>
- select o from instanceof 0xd404b198 o
-</code>
-</pre>
-Note that 0xd404b198 is id of a Class (in a session). This is found by
-looking at the id shown in that class's page.
-</ul>
-
-<h2>OQL built-in objects, functions</h2>
-
-<h3>heap object</h3>
-
-The <b>heap</b> built-in object supports the following methods:
-
-<ul>
-<li><b>heap.forEachClass</b> -- calls a callback function for each Java Class
-<pre>
-<code>
- heap.forEachClass(callback);
-</code>
-</pre>
-<li><b>heap.forEachObject</b> -- calls a callback function for each Java object
-<pre>
-<code>
- heap.forEachObject(callback, clazz, includeSubtypes);
-</code>
-</pre>
-<code>clazz</code> is the class whose instances are selected. If not specified, defaults to java.lang.Object. <code>includeSubtypes</code> is a boolean flag
-that specifies whether to include subtype instances or not. Default value of
-this flag is true.
-<a name="findClass"></a>
-<li><b>heap.findClass</b> -- finds Java Class of given name
-<pre>
-<code>
- heap.findClass(className);
-</code>
-</pre>
-where <code>className</code> is name of the class to find. The resulting Class
-object has following properties:
-<ul>
-<li>name - name of the class.
-<li>superclass - Class object for super class (or null if java.lang.Object).
-<li>statics - name, value pairs for static fields of the Class.
-<li>fields - array of field objects. field object has name, signature
-properties.
-<li>loader - ClassLoader object that loaded this class.
-<li>signers - signers that signed this class.
-<li>protectionDomain - protection domain to which this class belongs.
-</ul>
-Class objects have the following methods:
-<ul>
-<li>isSubclassOf - tests whether given class is direct or indirect
-subclass of this class or not.
-<li>isSuperclassOf - tests whether given Class is direct or indirect
-superclass of this class or not.
-<li>subclasses - returns array of direct and indirect subclasses.
-<li>superclasses - returns array of direct and indirect superclasses.
-</ul>
-<a name="findObject"></a>
-<li><b>heap.findObject</b> -- finds object from given object id
-<pre>
-<code>
- heap.findObject(stringIdOfObject);
-</code>
-</pre>
-<a name="classes"></a>
-<li><b>heap.classes</b> -- returns an enumeration of all Java classes
-<a name="objects"></a>
-<li><b>heap.objects</b> -- returns an enumeration of Java objects
-<pre>
-<code>
- heap.objects(clazz, [includeSubtypes], [filter])
-</code>
-</pre>
-<code>clazz</code> is the class whose instances are selected. If not specified, defaults to java.lang.Object. <code>includeSubtypes</code> is a boolean flag
-that specifies whether to include subtype instances or not. Default value of
-this flag is true. This method accepts an optional filter expression to filter
-the result set of objects.
-<a name="finalizables"></a>
-<li><b>heap.finalizables</b> -- returns an enumeration of Java objects that are
-pending to be finalized.
-<li><b>heap.livepaths</b> -- return an array of paths by which a given object
-is alive. This method accepts optional second parameter that is a boolean
-flag. This flag tells whether to include paths with weak reference(s) or not.
-By default, paths with weak reference(s) are not included.
-<pre>
-<code>
- select heap.livepaths(s) from java.lang.String s
-</code>
-</pre>
-Each element of this array itself is another array. The later array is
-contains an objects that are in the 'reference chain' of the path.
-<li><b>heap.roots</b> -- returns an Enumeration of Roots of the heap.
-<a name="rootobj"></a>
-Each Root object has the following properties:
-<ul>
-<li>id - String id of the object that is referred by this root
-<li>type - descriptive type of Root (JNI Global, JNI Local, Java Static etc)
-<li>description - String description of the Root
-<li>referrer - Thread Object or Class object that is responsible for this root or null
-</ul>
-</ul>
-
-Examples:
-<ul>
-<li>access static field 'props' of class java.lang.System
-<pre>
-<code>
- select heap.findClass("java.lang.System").statics.props
-</code>
-</pre>
-<li>get number of fields of java.lang.String class
-<pre>
-<code>
- select heap.findClass("java.lang.String").fields.length
-</code>
-</pre>
-<li> find the object whose object id is given
-<pre>
-<code>
- select heap.findObject("0xf3800b58")
-</code>
-</pre>
-<li>select all classes that have name pattern java.net.*
-<pre>
-<code>
- select <a href="#filter">filter</a>(heap.classes(), "/java.net./.test(it.name)")
-</code>
-</pre>
-</ul>
-
-<h3>functions on individual objects</h3>
-
-<ul>
-<li><a href="#allocTrace">allocTrace(jobject)</a>
-<li><a href="#classof">classof(jobject)</a>
-<li><a href="#forEachReferrer">forEachReferrer(callback, jobject)</a>
-<li><a href="#identical">identical(o1, o2)</a>
-<li><a href="#objectid">objectid(jobject)</a>
-<li><a href="#reachables">reachables(jobject, excludedFields)</a>
-<li><a href="#referrers">referrers(jobject)</a>
-<li><a href="#referees">referees(jobject)</a>
-<li><a href="#refers">refers(jobject)</a>
-<li><a href="#root">root(jobject)</a>
-<li><a href="#sizeof">sizeof(jobject)</a>
-<li><a href="#toHtml">toHtml(obj)</a>
-</ul>
-
-<a name="allocTrace"></a>
-<h4>allocTrace function</h4>
-
-This returns allocation site trace of a given Java object if available.
-allocTrace returns array of frame objects. Each frame object has the following
-properties:
-<ul>
-<li>className - name of the Java class whose method is running in the frame.
-<li>methodName - name of the Java method running in the frame.
-<li>methodSignature - signature of the Java method running in the frame.
-<li>sourceFileName - name of source file of the Java class running in the frame.
-<li>lineNumber - source line number within the method.
-</ul>
-
-<a name="classof"></a>
-<h4>classof function</h4>
-
-Returns Class object of a given Java Object. The result object supports the
-following properties:
-<ul>
-<li>name - name of the class.
-<li>superclass - Class object for super class (or null if java.lang.Object).
-<li>statics - name, value pairs for static fields of the Class.
-<li>fields - array of field objects. Field objects have name, signature
-properties.
-<li>loader - ClassLoader object that loaded this class.
-<li>signers - signers that signed this class.
-<li>protectionDomain - protection domain to which this class belongs.
-</ul>
-Class objects have the following methods:
-<ul>
-<li>isSubclassOf - tests whether given class is direct or indirect
-subclass of this class or not.
-<li>isSuperclassOf - tests whether given Class is direct or indirect
-superclass of this class or not.
-<li>subclasses - returns array of direct and indirect subclasses.
-<li>superclasses - returns array of direct and indirect superclasses.
-</ul>
-
-Examples:
-<ul>
-<li>show class name of each Reference type object
-<pre>
-<code>
- select classof(o).name from instanceof java.lang.ref.Reference o
-</code>
-<li>show all subclasses of java.io.InputStream
-<pre>
-<code>
- select heap.findClass("java.io.InputStream").subclasses()
-</code>
-<li>show all superclasses of java.io.BufferedInputStream
-<pre>
-<code>
- select heap.findClass("java.io.BufferedInputStream").superclasses()
-</code>
-</pre>
-</ul>
-
-<a name="forEachReferrer"></a>
-<h4>forEachReferrer function</h4>
-
-calls a callback function for each referrer of a given Java object.
-
-<a name="identical"></a>
-<h4>identical function</h4>
-<p>
-Returns whether two given Java objects are identical or not.
-</p>
-Example:
-<pre>
-<code>
- select identical(heap.findClass("Foo").statics.bar, heap.findClass("AnotherClass").statics.bar)
-</code>
-</pre>
-
-<a name="objectid"></a>
-<h4>objectid function</h4>
-
-<p>
-Returns String id of a given Java object. This id can be passed to
-<a href="#findObject">heap.findObject</a> and may also be used to compare
-objects for identity.
-</p>
-Example:
-<pre>
-<code>
- select objectid(o) from java.lang.Object o
-</code>
-</pre>
-
-<a name="reachables"></a>
-<h4>reachables function</h4>
-<p>
-Returns an array of Java objects that are transitively referred from the
-given Java object. Optionally accepts a second parameter that is comma
-separated field names to be excluded from reachability computation.
-Fields are written in class_name.field_name pattern.
-</p>
-Examples:
-<ul>
-<li>print all reachable objects from each Properties instance.
-<pre>
-<code>
- select reachables(p) from java.util.Properties p
-</code>
-</pre>
-<li>print all reachables from each java.net.URL but omit the objects reachable
-via the fields specified.
-<pre>
-<code>
- select reachables(u, 'java.net.URL.handler') from java.net.URL u
-</code>
-</pre>
-</ul>
-
-<a name="referrers"></a>
-<h4>referrers function</h4>
-<p>
-Returns an enumeration of Java objects that hold reference to a given Java
-object.
-</p>
-Examples:
-<ul>
-<li> print number of referrers for each java.lang.Object instance
-<pre>
-<code>
- select count(referrers(o)) from java.lang.Object o
-</code>
-</pre>
-<li>print referrers for each java.io.File object
-<pre>
-<code>
- select referrers(f) from java.io.File f
-</code>
-</pre>
-<li>print URL objects only if referred by 2 or more
-<pre>
-<code>
- select u from java.net.URL u where count(referrers(u)) > 2
-</code>
-</pre>
-</ul>
-
-<a name="referees"></a>
-<h4>referees function</h4>
-<p>
-Returns an array of Java objects to which the given Java
-object directly refers to.
-</p>
-Example: to print all static reference fields of java.io.File class
-<pre>
-<code>
- select referees(<a href="#findClass">heap.findClass</a>("java.io.File"))
-</code>
-</pre>
-
-<a name="refers"></a>
-<h4>refers function</h4>
-<p>
-Returns whether first Java object refers to second Java object or not.
-</p>
-
-<a name="root"></a>
-<h4>root function</h4>
-<p>
-If given object is a member of root set of objects, this function returns
-a descriptive <a href="#rootobj">Root object</a> describing why it is so.
-If given object is not a root, then this function returns null.
-</p>
-
-<a name="sizeof"></a>
-<h4>sizeof function</h4>
-
-Returns size of the given Java object in bytes
-Example:
-<pre>
-<code>
- select sizeof(o) from [I o
-</code>
-</pre>
-
-<a name="toHtml"></a>
-<h4>toHtml function</h4>
-
-Returns HTML string for the given Java object. Note that this is called
-automatically for objects selected by select expression. But, it may be useful
-to print more complex output.
-
-Example: print hyperlink in bold font weight
-<pre>
-<code>
- select "<b>" + toHtml(o) + "</b>" from java.lang.Object o
-</code>
-</pre>
-
-<h3>Selecting multiple values</h3>
-<p>
-Multiple values can be selected using JavaScript object literals or arrays.
-</p>
-
-Example: show name and thread for each thread object
-<pre>
-<code>
- select { name: t.name? t.name.toString() : "null", thread: t }
- from instanceof java.lang.Thread t
-</code>
-</pre>
-
-<h3>array/iterator/enumeration manipulation functions</h3>
-
-<p>
-These functions accept an array/iterator/enumeration and an
-expression string [or a callback function] as input. These functions iterate
-the array/iterator/enumeration and apply the expression (or function) on
-each element. Note that JavaScript objects are associative arrays. So,
-these functions may also be used with arbitrary JavaScript objects.
-</p>
-
-<ul>
-<li><a href="#concat">concat(array1/enumeration1, array2/enumeration2)</a>
-<li><a href="#contains">contains(array/enumeration, expression)</a>
-<li><a href="#count">count(array/enumeration, expression)</a>
-<li><a href="#filter">filter(array/enumeration, expression)</a>
-<li><a href="#length">length(array/enumeration)</a>
-<li><a href="#map">map(array/enumeration, expression)</a>
-<li><a href="#max">max(array/enumeration, [expression])</a>
-<li><a href="#min">min(array/enumeration, [expression])</a>
-<li><a href="#sort">sort(array/enumeration, [expression])</a>
-<li><a href="#sum">sum(array/enumeration, [expression])</a>
-<li><a href="#toArray">toArray(array/enumeration)</a>
-<li><a href="#unique">unique(array/enumeration, [expression])</a>
-</ul>
-
-<a name="concat"></a>
-<h4>concat function</h4>
-<p>
-Concatenates two arrays or enumerations (i.e., returns composite
-enumeration).
-</p>
-
-<a name="contains"></a>
-<h4>contains function</h4>
-<p>
-Returns whether the given array/enumeration contains an element
-the given boolean expression specified in code. The code evaluated
-can refer to the following built-in variables.
-</p>
-<ul>
-<li>it -> currently visited element
-<li>index -> index of the current element
-<li>array -> array/enumeration that is being iterated
-</ul>
-Example: select all Properties objects that are referred by
-some static field some class.
-<pre>
-<code>
- select p from java.util.Properties p
- where contains(<a href="#referrers">referrers</a>(p), "<a href="#classof">classof</a>(it).name == 'java.lang.Class'")
-</code>
-</pre>
-
-<a name="count"></a>
-<h4>count function</h4>
-<p>
-count function returns the count of elements of the input array/enumeration
-that satisfy the given boolean expression. The boolean expression code can
-refer to the following built-in variables.
-</p>
-<ul>
-<li>it -> currently visited element
-<li>index -> index of the current element
-<li>array -> array/enumeration that is being iterated
-</ul>
-Example: print number of classes that have specific name pattern
-<pre>
-<code>
- select count(<a href="#classes">heap.classes()</a>, "/java.io./.test(it.name)")
-</code>
-</pre>
-
-<a name="filter"></a>
-<h4>filter function</h4>
-<p>
-filter function returns an array/enumeration that contains elements
-of the input array/enumeration that satisfy the given boolean
-expression. The boolean expression code can refer to the following built-in
-variables.
-</p>
-<ul>
-<li>it -> currently visited element
-<li>index -> index of the current element
-<li>array -> array/enumeration that is being iterated
-<li>result -> result array/enumeration
-</ul>
-Examples:
-<ul>
-<li>show all classes that have java.io.* name pattern
-<pre>
-<code>
- select filter(<a href="#classes">heap.classes</a>(), "/java.io./.test(it.name)")
-</code>
-</pre>
-<li> show all referrers of URL object where the referrer is not from
-java.net package
-<pre>
-<code>
- select filter(<a href="#referrers">referrers</a>(u), "! /java.net./.test(<a href="#classof">classof</a>(it).name)")
- from java.net.URL u
-</code>
-</pre>
-</ul>
-
-<a name="length"></a>
-<h4>length function</h4>
-<p>
-length function returns number of elements of an array/enumeration.
-</p>
-
-<a name="map"></a>
-<h4>map function</h4>
-<p>
-Transforms the given array/enumeration by evaluating given code
-on each element. The code evaluated can refer to the following built-in
-variables.
-</p>
-<ul>
-<li>it -> currently visited element
-<li>index -> index of the current element
-<li>array -> array/enumeration that is being iterated
-<li>result -> result array/enumeration
-</ul>
-<p>
-map function returns an array/enumeration of values created by repeatedly
-calling code on each element of input array/enumeration.
-</p>
-Example: show all static fields of java.io.File with name and value
-<pre>
-<code>
- select map(<a href="#findClass">heap.findClass</a>("java.io.File").statics, "index + '=' + <a href="#toHtml">toHtml</a>(it)")
-</code>
-</pre>
-
-<a name="max"></a>
-<h4>max function</h4>
-<p>
-returns the maximum element of the given array/enumeration.
-Optionally accepts code expression to compare elements of the array.
-By default numerical comparison is used. The comparison expression can
-use the following built-in variables:
-</p>
-<ul>
-<li>lhs -> left side element for comparison
-<li>rhs -> right side element for comparison
-</ul>
-Examples:
-<ul>
-<li>find the maximum length of any String instance
-<pre>
-<code>
- select max(map(heap.objects('java.lang.String', false), 'it.value.length'))
-</code>
-</pre>
-<li>find string instance that has the maximum length
-<pre>
-<code>
- select max(heap.objects('java.lang.String'), 'lhs.value.length > rhs.value.length')
-</code>
-</pre>
-</ul>
-
-<a name="min"></a>
-<h4>min function</h4>
-<p>
-returns the minimum element of the given array/enumeration. Optionally
-accepts code expression to compare elements of the array. By default numerical
-comparison is used. The comparison expression can use the following built-in
-variables:
-</p>
-<ul>
-<li>lhs -> left side element for comparison
-<li>rhs -> right side element for comparison
-</ul>
-Examples:
-<ul>
-<li>find the minimum size of any Vector instance
-<pre>
-<code>
- select min(map(heap.objects('java.util.Vector', false), 'it.elementData.length'))
-</code>
-</pre>
-<li>find Vector instance that has the maximum length
-<pre>
-<code>
- select min(heap.objects('java.util.Vector'), 'lhs.elementData.length < rhs.elementData.length')
-</code>
-</ul>
-
-<a name="sort"></a>
-<h4>sort function</h4>
-<p>
-sorts given array/enumeration. Optionally accepts code expression to
-compare elements of the array. By default numerical comparison is used.
-The comparison expression can use the following built-in variables:
-</p>
-<ul>
-<li>lhs -> left side element for comparison
-<li>rhs -> right side element for comparison
-</ul>
-Examples:
-<ul>
-<li> print all char[] objects in the order of size.
-<pre>
-<code>
- select sort(<a href="#objects">heap.objects</a>('[C'), '<a href="#sizeof">sizeof</a>(lhs) - sizeof(rhs)')
-</code>
-</pre>
-<li> print all char[] objects in the order of size but print
-size as well.
-<pre>
-<code>
- select <a href="#map">map</a>(sort(<a href="#objects">heap.objects</a>('[C'), '<a href="#sizeof">sizeof</a>(lhs) - sizeof(rhs)'), '{ size: sizeof(it), obj: it }')
-</code>
-</pre>
-</ul>
-
-<a name="sum"></a>
-<h4>sum function</h4>
-<p>
-This function returns the sum of all the elements of the given input array or
-enumeration. Optionally, accepts an expression as second param. This is used
-to map the input elements before summing those.
-</p>
-Example: return sum of sizes of the reachable objects from each Properties object
-<pre>
-<code>
- select sum(<a href="#map">map</a>(<a href="#reachables">reachables</a>(p), '<a href="#sizeof">sizeof</a>(it)'))
- from java.util.Properties p
-
- // or omit the map as in ...
- select sum(<a href="#reachables">reachables</a>(p), '<a href="#sizeof">sizeof</a>(it)')
- from java.util.Properties p
-</code>
-</code>
-</pre>
-
-<a name="toArray"></a>
-<h4>toArray function</h4>
-<p>
-This function returns an array that contains elements of the input
-array/enumeration.
-</p>
-
-<a name="unique"></a>
-<h4>unique function</h4>
-<p>
-This function returns an array/enumeration containing unique elements of the
-given input array/enumeration
-</p>
-Example: select unique char[] instances referenced from Strings. Note that
-more than one String instance can share the same char[] for the content.
-<pre>
-<code>
- // number of unique char[] instances referenced from any String
- select count(unique(map(heap.objects('java.lang.String'), 'it.value')))
-
- // total number of Strings
- select count(heap.objects('java.lang.String'))
-</code>
-</pre>
-
-<h3>More complex examples</h3>
-
-<h4>Print histogram of each class loader and number of classes loaded by it</h4>
-
-<pre>
-<code>
- select <a href="#map">map</a>(<a href="#sort">sort</a>(map(heap.objects('java.lang.ClassLoader'),
- '{ loader: it, count: it.classes.elementCount }'), 'lhs.count < rhs.count'),
- 'toHtml(it) + "<br>"')
-</code>
-</pre>
-<p>
-The above query uses the fact that, <b>java.lang.ClassLoader</b> has a private
-field called <b>classes</b> of type <b>java.util.Vector</b> and Vector has a
-private field named <b>elementCount</b> that is number of elements in the
-vector. We select multiple values (loader, count) using JavaScript object
-literal and map function. We sort the result by count (i.e., number of classes
-loaded) using sort function with comparison expression.
-</p>
-
-<h4>Show parent-child chain for each class loader instance</h4>
-
-<pre>
-<code>
- select <a href="#map">map</a>(heap.objects('java.lang.ClassLoader'),
- function (it) {
- var res = '';
- while (it != null) {
- res += toHtml(it) + "->";
- it = it.parent;
- }
- res += "null";
- return res + "<br>";
- })
-</code>
-</pre>
-<p>
-Note that we use <b>parent</b> field of <b>java.lang.ClassLoader</b> class
-and walk until parent is null using the callback function to map call.
-</p>
-
-<h4>Printing value of all System properties</h4>
-
-<pre>
-<code>
- select <a href="#map">map</a>(<a href="#filter">filter(<a href="#findClass">heap.findClass</a>('java.lang.System').statics.props.table, 'it != null'),
- function (it) {
- var res = "";
- while (it != null) {
- res += it.key.value.toString() + '=' +
- it.value.value.toString() + '<br>';
- it = it.next;
- }
- return res;
- });
-</code>
-</pre>
-<p>
-The above query uses the following facts:
-<ul>
-<li>java.lang.System has static field by name 'props' of type java.util.Properties.
-<li>java.util.Properties has field by 'table' of type java.util.Hashtable$Entry
-(this field is inherited from java.util.Hashtable). This is the hashtable
-buckets array.
-<li>java.util.Hashtable$Entry has 'key', 'value' and 'next' fields. Each
-entry points the next entry (or null) in the same hashtable bucket.
-<li>java.lang.String class has 'value' field of type char[].
-</ul>
-<p>
-<b>Note that this query (and many other queries) may not be stable - because
-private fields of Java platform classes may be modified/removed without any
-notification! (implementation detail)</b>. But, using such queries on user
-classes may be safe - given that user has the control over the classes.
-</p>
-
-</body>
-</html>
--- a/jdk/src/jdk.dev/share/classes/com/sun/tools/hat/resources/platform_names.txt Thu May 21 10:07:38 2015 -0700
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,29 +0,0 @@
-boolean[
-char[
-float[
-double[
-byte[
-short[
-int[
-long[
-sun.
-java.
-javax.accessibility
-javax.crypto.
-javax.imageio.
-javax.naming.
-javax.net.
-javax.print.
-javax.rmi.
-javax.security.
-javax.sound.
-javax.sql.
-javax.swing.
-javax.transaction.
-javax.xml.parsers.
-javax.xml.transform.
-org.ietf.jgss.
-org.omg.
-org.w3c.dom.
-org.xml.sax.
-
--- a/jdk/src/jdk.hprof.agent/unix/native/libhprof/hprof_md.c Thu May 21 10:07:38 2015 -0700
+++ b/jdk/src/jdk.hprof.agent/unix/native/libhprof/hprof_md.c Thu May 21 16:20:20 2015 -0700
@@ -290,19 +290,7 @@
Dl_info dlinfo;
libdir[0] = 0;
-#if defined(LINUX) || defined(_ALLBSD_SOURCE) || defined(AIX)
- addr = (void*)&Agent_OnLoad;
-#else
- /* Just using &Agent_OnLoad will get the first external symbol with
- * this name in the first .so, which may not be libhprof.so.
- * On Solaris we can actually ask for the address of our Agent_OnLoad.
- */
- addr = dlsym(RTLD_SELF, "Agent_OnLoad");
- /* Just in case the above didn't work (missing linker patch?). */
- if ( addr == NULL ) {
- addr = (void*)&Agent_OnLoad;
- }
-#endif
+ addr = (void*)&md_get_prelude_path;
/* Use dladdr() to get the full path to libhprof.so, which we use to find
* the prelude file.
--- a/jdk/src/jdk.jdi/share/classes/com/sun/jdi/Accessible.java Thu May 21 10:07:38 2015 -0700
+++ b/jdk/src/jdk.jdi/share/classes/com/sun/jdi/Accessible.java Thu May 21 16:20:20 2015 -0700
@@ -40,8 +40,8 @@
public interface Accessible {
/**
- * Returns the Java<sup><font size=-2>TM</font></sup>
- * programming language modifiers, encoded in an integer.
+ * Returns the Java™ programming language modifiers, encoded
+ * in an integer.
* <p>
* The modifier encodings are defined in
* <cite>The Java™ Virtual Machine Specification</cite>
--- a/jdk/src/jdk.jdi/share/classes/com/sun/jdi/ClassNotLoadedException.java Thu May 21 10:07:38 2015 -0700
+++ b/jdk/src/jdk.jdi/share/classes/com/sun/jdi/ClassNotLoadedException.java Thu May 21 16:20:20 2015 -0700
@@ -45,7 +45,7 @@
* <li>There can be no guarantee that running the appropriate class
* loader won't cause a deadlock in loading the
* class. Class loaders can consist of arbitrary
- * Java<sup><font size=-2>TM</font></sup> programming language code and the
+ * Java™ programming language code and the
* class loading methods are usually synchronized. Most of the work
* done by a debugger happens when threads are suspended. If another
* application thread is suspended within the same class loader,
--- a/jdk/src/jdk.jdi/share/classes/com/sun/jdi/Locatable.java Thu May 21 10:07:38 2015 -0700
+++ b/jdk/src/jdk.jdi/share/classes/com/sun/jdi/Locatable.java Thu May 21 16:20:20 2015 -0700
@@ -36,10 +36,10 @@
@jdk.Exported
public interface Locatable {
/**
- * Returns the {@link Location} of this mirror, if there
- * is executable code associated with it. Note that both
- * Java<SUP><FONT SIZE="-2">TM</FONT></SUP> programming
- * language methods and native methods have executable code.
+ * Returns the {@link Location} of this mirror, if there is
+ * executable code associated with it. Note that both Java™
+ * programming language methods and native methods have executable
+ * code.
* Returns null for abstract methods, since abstract methods
* have no executable code.
*
--- a/jdk/src/jdk.jdi/share/classes/com/sun/jdi/request/AccessWatchpointRequest.java Thu May 21 10:07:38 2015 -0700
+++ b/jdk/src/jdk.jdi/share/classes/com/sun/jdi/request/AccessWatchpointRequest.java Thu May 21 16:20:20 2015 -0700
@@ -31,8 +31,7 @@
* Request for notification when the contents of a field are accessed
* in the target VM.
* This event will be triggered when the specified field is accessed
- * by Java<SUP><FONT SIZE="-2">TM</FONT></SUP> programming
- * language code or by a
+ * by Java™ programming language code or by a
* Java Native Interface (JNI) get function (<code>Get<Type>Field,
* GetStatic<Type>Field</code>).
* Access by JDI does not trigger this event.
--- a/jdk/src/jdk.jdi/share/classes/com/sun/jdi/request/ModificationWatchpointRequest.java Thu May 21 10:07:38 2015 -0700
+++ b/jdk/src/jdk.jdi/share/classes/com/sun/jdi/request/ModificationWatchpointRequest.java Thu May 21 16:20:20 2015 -0700
@@ -30,7 +30,7 @@
/**
* Request for notification when a field is set.
* This event will be triggered when a value is assigned to the specified
- * field with a Java<SUP><FONT SIZE="-2">TM</FONT></SUP> programming
+ * field with a Java™ programming
* language statement (assignment, increment, etc) or by a
* Java Native Interface (JNI) set function (<code>Set<Type>Field,
* SetStatic<Type>Field</code>).
--- a/jdk/src/jdk.jdi/share/classes/jdi-overview.html Thu May 21 10:07:38 2015 -0700
+++ b/jdk/src/jdk.jdi/share/classes/jdi-overview.html Thu May 21 16:20:20 2015 -0700
@@ -1,11 +1,10 @@
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
<html>
<head>
- <title>Java(tm) Debug Interface</title>
+ <title>Java™ Debug Interface</title>
</head>
<body>
- The Java<sup><font size="-2">TM</font></sup>
- Debug Interface (JDI) is a high level Java
+ The Java™ Debug Interface (JDI) is a high level Java
API providing information useful for debuggers and similar
systems needing access to the running state of a (usually remote)
virtual machine.
--- a/jdk/src/jdk.rmic/share/classes/sun/rmi/rmic/RMIGenerator.java Thu May 21 10:07:38 2015 -0700
+++ b/jdk/src/jdk.rmic/share/classes/sun/rmi/rmic/RMIGenerator.java Thu May 21 16:20:20 2015 -0700
@@ -79,7 +79,7 @@
* Examine and consume command line arguments.
* @param argv The command line arguments. Ignore null
* and unknown arguments. Set each consumed argument to null.
- * @param error Report any errors using the main.error() methods.
+ * @param main Report any errors using the main.error() methods.
* @return true if no errors, false otherwise.
*/
public boolean parseArgs(String argv[], Main main) {
--- a/jdk/src/jdk.rmic/share/classes/sun/rmi/rmic/RemoteClass.java Thu May 21 10:07:38 2015 -0700
+++ b/jdk/src/jdk.rmic/share/classes/sun/rmi/rmic/RemoteClass.java Thu May 21 16:20:20 2015 -0700
@@ -111,7 +111,7 @@
* the remote methods implemented by this class, i.e. all of the
* methods in the class's remote interfaces.
*
- * The methods in the array are ordered according to the comparision
+ * The methods in the array are ordered according to the comparison
* of the strings consisting of their method name followed by their
* type signature, so each method's index in the array corresponds
* to its "operation number" in the JDK 1.1 version of the
--- a/jdk/src/sample/share/jmx/jmx-scandir/index.html Thu May 21 10:07:38 2015 -0700
+++ b/jdk/src/sample/share/jmx/jmx-scandir/index.html Thu May 21 16:20:20 2015 -0700
@@ -33,11 +33,11 @@
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-->
- <title>JMX(TM) "scandir" Example</title>
+ <title>JMX™ "scandir" Example</title>
</head>
<body>
- <h1><center>Java<font size="-1"><sup>TM</sup></font> Management Extensions (JMX<font size="-1"><sup>TM</sup></font>) <i>scandir</i> Example</center></h1>
+ <h1><center>Java™ Management Extensions (JMX™) <i>scandir</i> Example</center></h1>
<h2><a name="h2-Introduction">Introduction</a></h2>
<ul>
@@ -1197,7 +1197,7 @@
<p>Another common best practice when you want
to improve interoperability is to use directly
the Notification base classes provided in the
- JMX<sup>TM</sup> API. Do not create your own
+ JMX™ API. Do not create your own
subclasses of these standard classes.
</p>
<p>Indeed, if you code your own subclass, a generic
@@ -1974,7 +1974,7 @@
More information on SSL authentication can be obtained from the <a
href="http://java.sun.com/javase/6/docs/technotes/guides/security/jsse/JSSERefGuide.html#HowSSLWorks"
title="How SSL Works"
- >Java<sup>TM</sup> Secure Socket Extension (JSSE) Reference Guide</a>.
+ >Java™ Secure Socket Extension (JSSE) Reference Guide</a>.
</p>
<p>To start jconsole with our provided keystore and
truststore, go to the scandir example root directory and
@@ -2202,13 +2202,13 @@
<li><a
href="http://java.sun.com/javase/6/docs/technotes/guides/security/jsse/JSSERefGuide.html#HowSSLWorks"
title="The JSSE Reference Guide"
- >Java<sup>TM</sup> Secure Socket Extension (JSSE) Reference Guide</a>:
- comprehensive documentation about the Java<sup>TM</sup> Secure Socket
+ >Java™ Secure Socket Extension (JSSE) Reference Guide</a>:
+ comprehensive documentation about the Java™ Secure Socket
Extension (JSSE)
</li>
<li><a href="http://java.sun.com/javase/6/docs/"
>Java SE 6 Documentation Index</a>: This document covers the
- Java<sup>TM</sup> Platform, Standard Edition 6 JDK.</li>
+ Java™ Platform, Standard Edition 6 JDK.</li>
</ol>
<p>
<hr>
--- a/jdk/test/ProblemList.txt Thu May 21 10:07:38 2015 -0700
+++ b/jdk/test/ProblemList.txt Thu May 21 16:20:20 2015 -0700
@@ -379,4 +379,10 @@
# 8064572 8060736 8062938
sun/jvmstat/monitor/MonitoredVm/CR6672135.java generic-all
+# 8079273
+demo/jvmti/hprof/CpuOldTest.java generic-all
+demo/jvmti/hprof/CpuTimesTest.java generic-all
+demo/jvmti/hprof/OptionsTest.java generic-all
+demo/jvmti/hprof/StackMapTableTest.java generic-all
+
############################################################################
--- a/jdk/test/TEST.groups Thu May 21 10:07:38 2015 -0700
+++ b/jdk/test/TEST.groups Thu May 21 16:20:20 2015 -0700
@@ -534,7 +534,6 @@
sun/nio/cs/OLD/TestIBMDB.java \
sun/nio/cs/SJISCanEncode.java \
sun/nio/cs/Test6254467.java \
- sun/nio/cs/TestCompoundTest.java \
sun/nio/cs/TestCp834_SBCS.java \
sun/nio/cs/TestEUC_TW.java \
sun/nio/cs/TestISO2022CNDecoder.java \
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/com/sun/crypto/provider/Cipher/KeyWrap/TestCipherKeyWrapperTest.java Thu May 21 16:20:20 2015 -0700
@@ -0,0 +1,316 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+import static java.lang.System.out;
+
+import java.lang.Integer;
+import java.lang.String;
+import java.lang.System;
+import java.security.AlgorithmParameters;
+import java.security.InvalidAlgorithmParameterException;
+import java.security.InvalidKeyException;
+import java.security.Key;
+import java.security.KeyPair;
+import java.security.NoSuchAlgorithmException;
+import java.security.KeyPairGenerator;
+import java.security.Provider;
+import java.security.Security;
+import java.security.spec.AlgorithmParameterSpec;
+import java.security.spec.InvalidKeySpecException;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Random;
+
+import javax.crypto.IllegalBlockSizeException;
+import javax.crypto.NoSuchPaddingException;
+import javax.crypto.SecretKey;
+import javax.crypto.Cipher;
+import javax.crypto.KeyGenerator;
+import javax.crypto.SecretKeyFactory;
+import javax.crypto.spec.PBEKeySpec;
+import javax.crypto.spec.PBEParameterSpec;
+
+/*
+ * @test
+ * @bug 8048599
+ * @summary Tests for key wrap and unwrap operations
+ */
+
+public class TestCipherKeyWrapperTest {
+ private static final String SUN_JCE = "SunJCE";
+ // Blowfish Variable key length: 32 bits to 448 bits
+ private static final int BLOWFISH_MIN_KEYSIZE = 32;
+ private static final int BLOWFISH_MAX_KEYSIZE = 448;
+ private static final int LINIMITED_KEYSIZE = 128;
+ private static final String NOPADDING = "NoPaDDing";
+ private static final String[] PBE_ALGORITHM_AR = { "pbeWithMD5ANDdes",
+ "PBEWithMD5AndDES/CBC/PKCS5Padding", "PBEWithMD5AndTripleDES",
+ "PBEWithMD5AndTripleDES/CBC/PKCS5Padding", "PBEwithSHA1AndDESede",
+ "PBEwithSHA1AndDESede/CBC/PKCS5Padding", "PBEwithSHA1AndRC2_40",
+ "PBEwithSHA1Andrc2_40/CBC/PKCS5Padding", "PBEWithSHA1AndRC2_128",
+ "PBEWithSHA1andRC2_128/CBC/PKCS5Padding", "PBEWithSHA1AndRC4_40",
+ "PBEWithsha1AndRC4_40/ECB/NoPadding", "PBEWithSHA1AndRC4_128",
+ "pbeWithSHA1AndRC4_128/ECB/NoPadding", "PBEWithHmacSHA1AndAES_128",
+ "PBEWithHmacSHA224AndAES_128", "PBEWithHmacSHA256AndAES_128",
+ "PBEWithHmacSHA384AndAES_128", "PBEWithHmacSHA512AndAES_128",
+ "PBEWithHmacSHA1AndAES_256", "PBEWithHmacSHA224AndAES_256",
+ "PBEWithHmacSHA256AndAES_256", "PBEWithHmacSHA384AndAES_256",
+ "PBEWithHmacSHA512AndAES_256" };
+ private static final String[] MODEL_AR = { "ECb", "pCbC", "cbC", "cFB",
+ "cFB24", "cFB40", "OfB48", "OFB64" };
+ private static final String[] PADDING_AR = { NOPADDING, "PKCS5Padding" };
+
+ private enum AlgorithmWrapper {
+ AESWrap("AES", "AESWrap", -1),
+ AESWrap_128("AES", "AESWrap_128", 128),
+ AESWrap_192("AES", "AESWrap_192", 192),
+ AESWrap_256("AES", "AESWrap_256", 256),
+ DESedeWrap("desede", "DESedeWrap", -1),
+ NegtiveWrap("AES", "DESedeWrap", -1);
+
+ private final String algorithm;
+ private final String wrapper;
+ private final int keySize;
+
+ private AlgorithmWrapper(String algorithm, String wrapper, int kSize) {
+ this.algorithm = algorithm;
+ this.wrapper = wrapper;
+ this.keySize = kSize;
+ }
+
+ public String getAlgorithm() {
+ return algorithm;
+ }
+
+ public String getWrapper() {
+ return wrapper;
+ }
+
+ public int getKeySize() {
+ return keySize;
+ }
+
+ };
+
+ public static void main(String[] args) throws Exception {
+
+ TestCipherKeyWrapperTest test = new TestCipherKeyWrapperTest();
+ // AESWrap and DESedeWrap test
+ for (AlgorithmWrapper algoWrapper : AlgorithmWrapper.values()) {
+ String algo = algoWrapper.getAlgorithm();
+ String wrapper = algoWrapper.getWrapper();
+ try {
+ int keySize = algoWrapper.getKeySize();
+ // only run the tests on longer key lengths if unlimited
+ // version of JCE jurisdiction policy files are installed
+ if (!(Cipher.getMaxAllowedKeyLength(algo) == Integer.MAX_VALUE)
+ && keySize > LINIMITED_KEYSIZE) {
+ out.println(algo + " will not run if unlimited version of"
+ + " JCE jurisdiction policy files are installed");
+ continue;
+ }
+ test.wrapperAesDESedeKeyTest(algo, wrapper, keySize);
+ if (algoWrapper == AlgorithmWrapper.NegtiveWrap) {
+ throw new RuntimeException("Expected not throw when algo"
+ + " and wrapAlgo are not match:" + algo);
+ }
+ } catch (InvalidKeyException e) {
+ if (algoWrapper == AlgorithmWrapper.NegtiveWrap) {
+ out.println("Expepted exception when algo"
+ + " and wrapAlgo are not match:" + algo);
+ } else {
+ throw e;
+ }
+ }
+ }
+ test.wrapperBlowfishKeyTest();
+ // PBE and public wrapper test.
+ String[] publicPrivateAlgos = new String[] { "DiffieHellman", "DSA",
+ "RSA" };
+ Provider provider = Security.getProvider(SUN_JCE);
+ if (provider == null) {
+ throw new RuntimeException("SUN_JCE provider not exist");
+ }
+
+ test.wrapperPBEKeyTest(provider);
+ // Public and private key wrap test
+ test.wrapperPublicPriviteKeyTest(provider, publicPrivateAlgos);
+ }
+
+ private void wrapperAesDESedeKeyTest(String algo, String wrapAlgo,
+ int keySize) throws InvalidKeyException, NoSuchAlgorithmException,
+ NoSuchPaddingException, IllegalBlockSizeException,
+ InvalidAlgorithmParameterException {
+ // Initialization
+ KeyGenerator kg = KeyGenerator.getInstance(algo);
+ if (keySize != -1) {
+ kg.init(keySize);
+ }
+ SecretKey key = kg.generateKey();
+ wrapTest(algo, wrapAlgo, key, key, Cipher.SECRET_KEY, false);
+ }
+
+ private void wrapperBlowfishKeyTest() throws InvalidKeyException,
+ NoSuchAlgorithmException, NoSuchPaddingException,
+ IllegalBlockSizeException, InvalidAlgorithmParameterException {
+ // how many kinds of padding mode
+ int padKinds;
+ // Keysize should be multiple of 8 bytes.
+ int KeyCutter = 8;
+ int kSize = BLOWFISH_MIN_KEYSIZE;
+ String algorithm = "Blowfish";
+ int maxAllowKeyLength = Cipher.getMaxAllowedKeyLength(algorithm);
+ boolean unLimitPolicy = maxAllowKeyLength == Integer.MAX_VALUE;
+ SecretKey key = null;
+ while (kSize <= BLOWFISH_MAX_KEYSIZE) {
+ for (String mode : MODEL_AR) {
+ // PKCS5padding is meaningful only for ECB, CBC, PCBC
+ if (mode.equalsIgnoreCase(MODEL_AR[0])
+ || mode.equalsIgnoreCase(MODEL_AR[1])
+ || mode.equalsIgnoreCase(MODEL_AR[2])) {
+ padKinds = PADDING_AR.length;
+ } else {
+ padKinds = 1;
+ }
+ // Initialization
+ KeyGenerator kg = KeyGenerator.getInstance(algorithm);
+ for (int k = 0; k < padKinds; k++) {
+ String transformation = algorithm + "/" + mode + "/"
+ + PADDING_AR[k];
+ if (NOPADDING.equals(PADDING_AR[k]) && kSize % 64 != 0) {
+ out.println(transformation
+ + " will not run if input length not multiple"
+ + " of 8 bytes when padding is " + NOPADDING);
+ continue;
+ }
+ kg.init(kSize);
+ key = kg.generateKey();
+ // only run the tests on longer key lengths if unlimited
+ // version of JCE jurisdiction policy files are installed
+ if (!unLimitPolicy && kSize > LINIMITED_KEYSIZE) {
+ out.println("keyStrength > 128 within " + algorithm
+ + " will not run under global policy");
+ } else {
+ wrapTest(transformation, transformation, key, key,
+ Cipher.SECRET_KEY, false);
+ }
+ }
+ }
+ if (kSize <= LINIMITED_KEYSIZE) {
+ KeyCutter = 8;
+ } else {
+ KeyCutter = 48;
+ }
+ kSize += KeyCutter;
+ }
+ }
+
+ private void wrapperPBEKeyTest(Provider p) throws InvalidKeySpecException,
+ InvalidKeyException, NoSuchPaddingException,
+ IllegalBlockSizeException, InvalidAlgorithmParameterException,
+ NoSuchAlgorithmException {
+ for (String alg : PBE_ALGORITHM_AR) {
+ String baseAlgo = alg.split("/")[0].toUpperCase();
+ // only run the tests on longer key lengths if unlimited version
+ // of JCE jurisdiction policy files are installed
+
+ if (Cipher.getMaxAllowedKeyLength(alg) < Integer.MAX_VALUE
+ && (baseAlgo.endsWith("TRIPLEDES") || alg
+ .endsWith("AES_256"))) {
+ out.println("keyStrength > 128 within " + alg
+ + " will not run under global policy");
+ continue;
+ }
+ SecretKeyFactory skf = SecretKeyFactory.getInstance(baseAlgo, p);
+ SecretKey key = skf.generateSecret(new PBEKeySpec("Secret Lover"
+ .toCharArray()));
+ wrapTest(alg, alg, key, key, Cipher.SECRET_KEY, true);
+ }
+ }
+
+ private void wrapperPublicPriviteKeyTest(Provider p, String[] algorithms)
+ throws NoSuchAlgorithmException, InvalidKeyException,
+ NoSuchPaddingException, IllegalBlockSizeException,
+ InvalidAlgorithmParameterException {
+ for (String algo : algorithms) {
+ // Key pair generated
+ System.out.println("Generate key pair (algorithm: " + algo
+ + ", provider: " + p.getName() + ")");
+ KeyPairGenerator kpg = KeyPairGenerator.getInstance(algo);
+ kpg.initialize(512);
+ KeyPair kp = kpg.genKeyPair();
+ // key generated
+ String algoWrap = "DES";
+ KeyGenerator kg = KeyGenerator.getInstance(algoWrap, p);
+ Key key = kg.generateKey();
+ wrapTest(algo, algoWrap, key, kp.getPrivate(), Cipher.PRIVATE_KEY,
+ false);
+ wrapTest(algo, algoWrap, key, kp.getPublic(), Cipher.PUBLIC_KEY,
+ false);
+ }
+ }
+
+ private void wrapTest(String transformation, String wrapAlgo, Key initKey,
+ Key wrapKey, int keyType, boolean isPBE)
+ throws NoSuchAlgorithmException, NoSuchPaddingException,
+ InvalidKeyException, IllegalBlockSizeException,
+ InvalidAlgorithmParameterException {
+ String algo = transformation.split("/")[0];
+ boolean isAESBlowfish = algo.indexOf("AES") != -1
+ || algo.indexOf("Blowfish") != -1;
+ AlgorithmParameters aps = null;
+ AlgorithmParameterSpec pbeParams = null;
+ if (isPBE) {
+ byte[] salt = new byte[8];
+ int iterCnt = 1000;
+ new Random().nextBytes(salt);
+ pbeParams = new PBEParameterSpec(salt, iterCnt);
+ }
+ // Wrap & UnWrap operation
+ Cipher wrapCI = Cipher.getInstance(wrapAlgo);
+ if (isPBE && !isAESBlowfish) {
+ wrapCI.init(Cipher.WRAP_MODE, initKey, pbeParams);
+ } else if (isAESBlowfish) {
+ wrapCI.init(Cipher.WRAP_MODE, initKey);
+ aps = wrapCI.getParameters();
+ } else {
+ wrapCI.init(Cipher.WRAP_MODE, initKey);
+ }
+ out.println("keysize : " + wrapKey.getEncoded().length);
+ byte[] keyWrapper = wrapCI.wrap(wrapKey);
+ if (isPBE && !isAESBlowfish) {
+ wrapCI.init(Cipher.UNWRAP_MODE, initKey, pbeParams);
+ } else if (isAESBlowfish) {
+ wrapCI.init(Cipher.UNWRAP_MODE, initKey, aps);
+ } else {
+ wrapCI.init(Cipher.UNWRAP_MODE, initKey);
+ }
+ Key unwrappedKey = wrapCI.unwrap(keyWrapper, algo, keyType);
+ // Comparison
+ if (!Arrays.equals(wrapKey.getEncoded(), unwrappedKey.getEncoded())) {
+ throw new RuntimeException("Comparation failed testing "
+ + transformation + ":" + wrapAlgo + ":" + keyType);
+ }
+ }
+}
--- a/jdk/test/com/sun/jdi/BadHandshakeTest.java Thu May 21 10:07:38 2015 -0700
+++ b/jdk/test/com/sun/jdi/BadHandshakeTest.java Thu May 21 16:20:20 2015 -0700
@@ -84,14 +84,19 @@
class_name,
pb,
(line) -> {
- // The first thing that will get read is
- // Listening for transport dt_socket at address: xxxxx
- // which shows the debuggee is ready to accept connections.
- success.set(line.contains("Listening for transport dt_socket at address:"));
- // If the first line contains 'Address already in use'
- // that means the debuggee has failed to start due to busy port
- bindFailed.set(line.contains("Address already in use"));
- return true;
+ // 'Listening for transport dt_socket at address: xxxxx'
+ // indicates the debuggee is ready to accept connections
+ if (line.contains("Listening for transport dt_socket at address:")) {
+ success.set(true);
+ return true;
+ }
+ // 'Address already in use' indicates
+ // the debuggee has failed to start due to busy port.
+ if (line.contains("Address already in use")) {
+ bindFailed.set(true);
+ return true;
+ }
+ return false;
},
Integer.MAX_VALUE,
TimeUnit.MILLISECONDS
--- a/jdk/test/com/sun/jdi/NoLaunchOptionTest.java Thu May 21 10:07:38 2015 -0700
+++ b/jdk/test/com/sun/jdi/NoLaunchOptionTest.java Thu May 21 16:20:20 2015 -0700
@@ -21,134 +21,35 @@
* questions.
*/
-/*
- * @test NoLaunchOptionTest.java
- * @bug 4554734 4724714
- * @summary Test for -Xrunjdwp:[onthrow,onuncaught] suboptions require launch suboption
- * @author Tim Bell
- *
- * @modules jdk.jdi
- * @run compile -g NoLaunchOptionTest.java
- * @build VMConnection
- * @run driver NoLaunchOptionTest
- */
-
-import java.net.ServerSocket;
-
-public class NoLaunchOptionTest extends Object {
- private Process subprocess;
- private int subprocessStatus;
- private static final String CR = System.getProperty("line.separator");
- private static final int BUFFERSIZE = 4096;
- public static final int RETSTAT = 0;
- public static final int STDOUT = 1;
- public static final int STDERR = 2;
-
- /**
- * Run an arbitrary command and return the results to caller.
- *
- * @param an array of String containing the command
- * to run and any flags or parameters to the command.
- *
- * @return completion status, stderr and stdout as array of String
- * Look for:
- * return status in result[NoLaunchOptionTest.RETSTAT]
- * standard out in result[NoLaunchOptionTest.STDOUT]
- * standard err in result[NoLaunchOptionTest.STDERR]
- *
- */
- public String[] run (String[] cmdStrings) {
- StringBuffer stdoutBuffer = new StringBuffer();
- StringBuffer stderrBuffer = new StringBuffer();
+import static jdk.testlibrary.Asserts.assertFalse;
+import jdk.testlibrary.OutputAnalyzer;
+import jdk.testlibrary.ProcessTools;
- System.out.print(CR + "runCommand method about to execute: ");
- for (int iNdx = 0; iNdx < cmdStrings.length; iNdx++) {
- System.out.print(" ");
- System.out.print(cmdStrings[iNdx]);
- }
- System.out.println(CR);
- try {
- Process process = Runtime.getRuntime().exec(cmdStrings);
- /*
- * Gather up the output of the subprocess using non-blocking
- * reads so we can get both the subprocess stdout and the
- * subprocess stderr without overfilling any buffers.
- */
- java.io.BufferedInputStream is =
- new java.io.BufferedInputStream(process.getInputStream());
- int isLen = 0;
- byte[] isBuf = new byte[BUFFERSIZE];
-
- java.io.BufferedInputStream es =
- new java.io.BufferedInputStream(process.getErrorStream());
- int esLen = 0;
- byte[] esBuf = new byte[BUFFERSIZE];
-
- do {
- isLen = is.read(isBuf);
- if (isLen > 0) {
- stdoutBuffer.append(
- new String(isBuf, 0, isLen));
- }
- esLen = es.read(esBuf);
- if (esLen > 0) {
- stderrBuffer.append(
- new String(esBuf, 0, esLen));
- }
- } while ((isLen > -1) || (esLen > -1));
- try {
- process.waitFor();
- subprocessStatus = process.exitValue();
- process = null;
- } catch(java.lang.InterruptedException e) {
- System.err.println("InterruptedException: " + e);
- }
-
- } catch(java.io.IOException ex) {
- System.err.println("IO error: " + ex);
- }
- String[] result =
- new String[] {
- Integer.toString(subprocessStatus),
- stdoutBuffer.toString(),
- stderrBuffer.toString()
- };
-
- System.out.println(CR + "--- Return code was: " +
- CR + result[RETSTAT]);
- System.out.println(CR + "--- Return stdout was: " +
- CR + result[STDOUT]);
- System.out.println(CR + "--- Return stderr was: " +
- CR + result[STDERR]);
-
- return result;
- }
+/*
+ * @test NoLaunchOptionTest.java
+ * @bug 4554734 4724714
+ * @summary Test for -Xrunjdwp:[onthrow,onuncaught] suboptions require launch suboption
+ * @author Tim Bell
+ * @library /lib/testlibrary
+ * @modules jdk.jdi
+ * @run compile -g NoLaunchOptionTest.java
+ * @build jdk.testlibrary.* VMConnection
+ * @run driver NoLaunchOptionTest
+ */
+public class NoLaunchOptionTest extends Object {
public static void main(String[] args) throws Exception {
- // find a free port
- ServerSocket ss = new ServerSocket(0);
- int port = ss.getLocalPort();
- ss.close();
- String address = String.valueOf(port);
+ String[] cmd = VMConnection.insertDebuggeeVMOptions(new String[] {
+ "-agentlib:jdwp=transport=dt_socket,address=5555," +
+ "onthrow=java.lang.ClassNotFoundException,suspend=n",
+ "NotAClass" });
- String javaExe = System.getProperty("java.home") +
- java.io.File.separator + "bin" +
- java.io.File.separator + "java";
- String targetClass = "NotAClass";
- String cmds [] = {javaExe,
- "-agentlib:jdwp=transport=dt_socket,address=" +
- address + "," +
- "onthrow=java.lang.ClassNotFoundException,suspend=n",
- targetClass};
- NoLaunchOptionTest myTest = new NoLaunchOptionTest();
- String results [] = myTest.run(VMConnection.insertDebuggeeVMOptions(cmds));
- if ((results[RETSTAT].equals("1")) &&
- (results[STDERR].contains("ERROR:"))) {
- System.out.println("Test passed: status = 1 with warning messages " +
- "is expected and normal for this test");
- } else {
- throw new Exception("Test failed: unspecified test failure");
- }
+ ProcessBuilder pb = ProcessTools.createJavaProcessBuilder(cmd);
+ OutputAnalyzer output = ProcessTools.executeProcess(pb);
+ System.out.println(output.getOutput());
+
+ assertFalse(output.getExitValue() == 0, "Exit code should not be 0");
+ output.shouldContain("ERROR: JDWP Specify launch=<command line> when using onthrow or onuncaught suboption");
}
}
--- a/jdk/test/com/sun/management/HotSpotDiagnosticMXBean/DumpHeap.java Thu May 21 10:07:38 2015 -0700
+++ b/jdk/test/com/sun/management/HotSpotDiagnosticMXBean/DumpHeap.java Thu May 21 16:20:20 2015 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2006, 2008, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2006, 2015, Oracle and/or its affiliates. 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
@@ -21,22 +21,55 @@
* questions.
*/
-/*
- *
- * @bug 6455258
- * @summary Sanity test for com.sun.management.HotSpotDiagnosticMXBean.dumpHeap
- * method
- */
+import static jdk.testlibrary.Asserts.assertTrue;
+import static jdk.testlibrary.Asserts.fail;
+import java.io.File;
import java.lang.management.*;
import java.util.List;
-import javax.management.MBeanServer;
+
+import jdk.test.lib.hprof.HprofParser;
+import jdk.testlibrary.ProcessTools;
+
import com.sun.management.HotSpotDiagnosticMXBean;
+/*
+ * @test
+ * @bug 6455258
+ * @summary Sanity test for com.sun.management.HotSpotDiagnosticMXBean.dumpHeap method
+ * @library /lib/testlibrary
+ * @library /../../test/lib/share/classes
+ * @build jdk.testlibrary.*
+ * @build jdk.test.lib.hprof.*
+ * @build jdk.test.lib.hprof.module.*
+ * @build jdk.test.lib.hprof.parser.*
+ * @build jdk.test.lib.hprof.utils.*
+ * @run main DumpHeap
+ */
public class DumpHeap {
- public static void main(String[] argv) throws Exception {
- List<HotSpotDiagnosticMXBean> list = ManagementFactory.getPlatformMXBeans(HotSpotDiagnosticMXBean.class);
- System.out.println("Dumping to file: " + argv[0] + " ....");
- list.get(0).dumpHeap(argv[0], true);
+
+ public static void main(String[] args) throws Exception {
+ List<HotSpotDiagnosticMXBean> list = ManagementFactory.getPlatformMXBeans(HotSpotDiagnosticMXBean.class);
+ File dump = new File(ProcessTools.getProcessId() + ".hprof");
+ if (dump.exists()) {
+ dump.delete();
+ }
+ System.out.println("Dumping to file: " + dump.getAbsolutePath());
+ list.get(0).dumpHeap(dump.getAbsolutePath(), true);
+
+ verifyDumpFile(dump);
+
+ dump.delete();
}
+
+ private static void verifyDumpFile(File dump) {
+ assertTrue(dump.exists() && dump.isFile(), "Could not create dump file");
+ try {
+ HprofParser.parse(dump);
+ } catch (Exception e) {
+ e.printStackTrace();
+ fail("Could not parse dump file");
+ }
+ }
+
}
--- a/jdk/test/com/sun/management/HotSpotDiagnosticMXBean/DumpHeap.sh Thu May 21 10:07:38 2015 -0700
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,60 +0,0 @@
-#!/bin/sh
-
-#
-# Copyright (c) 2006, 2015, Oracle and/or its affiliates. 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
-# or visit www.oracle.com if you need additional information or have any
-# questions.
-#
-
-
-# @test
-# @bug 6455258
-# @summary Sanity test for com.sun.management.HotSpotDiagnosticMXBean.dumpHeap
-# method
-#
-# @modules jdk.management
-# @build DumpHeap
-# @run shell DumpHeap.sh
-
-if [ "${TESTJAVA}" = "" ] ; then
- echo "--Error: TESTJAVA must be defined as the pathname of a jdk to test."
- exit 1
-fi
-
-if [ "${COMPILEJAVA}" = "" ] ; then
- COMPILEJAVA="${TESTJAVA}"
-fi
-
-failed=0
-
-# we use the pid of this shell process to name the heap dump output file.
-DUMPFILE="java_pid$$.hprof"
-
-${TESTJAVA}/bin/java ${TESTVMOPTS} -classpath $TESTCLASSES \
- DumpHeap ${DUMPFILE} || exit 2
-
-# check that heap dump is parsable
-${COMPILEJAVA}/bin/jhat ${TESTTOOLVMOPTS} -parseonly true ${DUMPFILE}
-if [ $? != 0 ]; then failed=1; fi
-
-# dump file is large so remove it
-rm ${DUMPFILE}
-
-exit $failed
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/lang/Character/UnicodeBlock/NonOptimalMapSize.java Thu May 21 16:20:20 2015 -0700
@@ -0,0 +1,72 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+
+/**
+ * @test
+ * @bug 8080535
+ * @summary Expected size of Character.UnicodeBlock.map is not optimal
+ */
+
+import java.lang.reflect.Field;
+import java.util.HashMap;
+import java.util.Map;
+
+public class NonOptimalMapSize {
+ public static void main(String[] args) throws Throwable {
+ Class<?> ubCls = Character.UnicodeBlock.class;
+ Field mapField = ubCls.getDeclaredField("map");
+ mapField.setAccessible(true);
+ Map<?,?> map = (Map<?,?>)mapField.get(null);
+ if (!map.getClass().equals(HashMap.class)) {
+ throw new RuntimeException(
+ "Character.UnicodeBlock.map is expected to be HashMap");
+ }
+ int mapSize = map.size();
+
+ Field sizeField = ubCls.getDeclaredField("INITIAL_CAPACITY");
+ sizeField.setAccessible(true);
+ int INITIAL_CAPACITY = sizeField.getInt(null);
+
+ // Construct a HashMap with specified initial capacity
+ HashMap<Object,Object> map1 = new HashMap<>(INITIAL_CAPACITY);
+ Class<?> hmCls = HashMap.class;
+ Field tableField = hmCls.getDeclaredField("table");
+ tableField.setAccessible(true);
+ // ... and fill it up
+ map1.put(new Object(), new Object());
+ final Object initialTable = tableField.get(map1);
+ while (map1.size() < map.size() &&
+ initialTable == tableField.get(map1)) {
+ map1.put(new Object(), new Object());
+ }
+
+ // Now check that internal storage didn't change
+ if (initialTable != tableField.get(map1)) {
+ throw new RuntimeException(
+ "Initial capacity " + INITIAL_CAPACITY +
+ " was only enough to hold " + (map1.size()-1) +
+ " entries, but needed " + map.size());
+ }
+ }
+}
--- a/jdk/test/java/lang/Runtime/exec/LotsOfOutput.java Thu May 21 10:07:38 2015 -0700
+++ b/jdk/test/java/lang/Runtime/exec/LotsOfOutput.java Thu May 21 16:20:20 2015 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2002, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2002, 2015, Oracle and/or its affiliates. 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
@@ -23,12 +23,22 @@
/**
* @test
- * @bug 4369826
+ * @bug 4369826 8078582
* @summary Process with lots of output should not crash VM
+ * @key intermittent
* @author kladko
*/
public class LotsOfOutput {
+ static final Runtime runtime = Runtime.getRuntime();
+
+ // Allow memory to grow by up to 1Mb total
+ static final int THRESHOLD = 1048576;
+
+ // Compute used memory
+ static long usedMemory() {
+ return runtime.totalMemory() - runtime.freeMemory();
+ }
public static void main(String[] args) throws Exception {
if (! UnixCommands.isUnix) {
@@ -37,18 +47,21 @@
}
UnixCommands.ensureCommandsAvailable("cat");
- Process p = Runtime.getRuntime().exec(UnixCommands.cat() + " /dev/zero");
- long initMemory = Runtime.getRuntime().totalMemory();
- for (int i=1; i< 10; i++) {
+ Process p = runtime.exec(UnixCommands.cat() + " /dev/zero");
+ long initMemory = usedMemory();
+ boolean growing = false;
+ for (int i = 1; i < 10; i++) {
Thread.sleep(100);
- long totalMemory = Runtime.getRuntime().totalMemory();
- if (totalMemory != initMemory) {
- System.out.printf("consuming memory: i: %d, initial: %d, total: %d, delta: %d%n",
- i, initMemory, totalMemory, totalMemory - initMemory);
+ long used = usedMemory();
+ if (used != initMemory) {
+ System.out.printf("consuming memory: i: %d, initial: %d, used: %d, delta: %d%n",
+ i, initMemory, used, used - initMemory);
}
- if (totalMemory > initMemory + 1000000)
- throw new Exception("Process consumes memory.");
+ if (used > initMemory + THRESHOLD)
+ growing = true;
}
+ if (growing)
+ throw new Exception("Process consumes memory.");
}
}
--- a/jdk/test/java/lang/invoke/MethodHandles/CatchExceptionTest.java Thu May 21 10:07:38 2015 -0700
+++ b/jdk/test/java/lang/invoke/MethodHandles/CatchExceptionTest.java Thu May 21 16:20:20 2015 -0700
@@ -72,12 +72,6 @@
final int catchDrops) {
this.testCase = testCase;
this.dropped = catchDrops;
- if (Helper.IS_VERBOSE) {
- System.out.printf("CatchException::CatchException(%s, isVararg=%b " +
- "argsCount=%d catchDrops=%d)%n",
- testCase, isVararg, argsCount, catchDrops
- );
- }
MethodHandle thrower = testCase.thrower;
int throwerLen = thrower.type().parameterCount();
List<Class<?>> classes;
@@ -97,9 +91,11 @@
}
public static void main(String[] args) throws Throwable {
+ System.out.println("classes = " + ARGS_CLASSES);
+
TestFactory factory = new TestFactory();
long timeout = Helper.IS_THOROUGH ? 0L : Utils.adjustTimeout(Utils.DEFAULT_TEST_TIMEOUT);
- // substract vm init time and reserve time for vm exit
+ // subtract vm init time and reserve time for vm exit
timeout *= 0.9;
TimeLimitedRunner runner = new TimeLimitedRunner(timeout, 2.0d,
() -> {
@@ -131,6 +127,12 @@
}
private void runTest() {
+ if (Helper.IS_VERBOSE) {
+ System.out.printf("CatchException(%s, isVararg=%b argsCount=%d " +
+ "dropped=%d)%n",
+ testCase, thrower.isVarargsCollector(), argsCount, dropped);
+ }
+
Helper.clear();
Object[] args = Helper.randomArgs(
@@ -212,10 +214,7 @@
args = 1;
}
- if (Helper.IS_VERBOSE) {
- System.out.printf("maxArgs = %d%nmaxDrops = %d%n",
- maxArgs, maxDrops);
- }
+ System.out.printf("maxArgs = %d%nmaxDrops = %d%n", maxArgs, maxDrops);
constructorSize = TestCase.CONSTRUCTORS.size();
}
@@ -243,7 +242,7 @@
/**
* @return next test from test matrix:
- * {varArgs, noVarArgs} x TestCase.rtypes x TestCase.THROWABLES x {1, .., maxArgs } x {1, .., maxDrops}
+ * {varArgs, noVarArgs} x TestCase.rtypes x TestCase.THROWABLES x {1, .., maxArgs } x {0, .., maxDrops}
*/
public CatchExceptionTest nextTest() {
if (constructor < constructorSize) {
@@ -256,7 +255,7 @@
return null;
}
if (dropArgs <= currentMaxDrops) {
- if (dropArgs == 1) {
+ if (dropArgs == 0) {
if (Helper.IS_THOROUGH || Helper.RNG.nextBoolean()) {
++dropArgs;
return createTest();
@@ -271,8 +270,8 @@
}
}
- if (args <= maxArgs) {
- dropArgs = 1;
+ if (args < maxArgs) {
+ dropArgs = 0;
currentMaxDrops = Math.min(args, maxDrops);
++args;
return createTest();
--- a/jdk/test/java/nio/file/Files/SBC.java Thu May 21 10:07:38 2015 -0700
+++ b/jdk/test/java/nio/file/Files/SBC.java Thu May 21 16:20:20 2015 -0700
@@ -22,7 +22,7 @@
*/
/* @test
- * @bug 4313887 8066915
+ * @bug 4313887
* @summary Unit test for java.nio.file.Files.newByteChannel
* @library ..
*/
@@ -59,7 +59,6 @@
dosSharingOptionTests(dir);
// misc. tests
- directoryOpenTests(dir);
badCombinations(dir);
unsupportedOptions(dir);
nullTests(dir);
@@ -279,21 +278,6 @@
}
}
- // test opening a directory for read or write
- static void directoryOpenTests(Path dir) throws Exception {
- try (SeekableByteChannel sbc = Files.newByteChannel(dir, READ)) {
- throw new RuntimeException("Opened directory for read");
- } catch (IOException expected) { }
-
- try (SeekableByteChannel sbc = Files.newByteChannel(dir, WRITE)) {
- throw new RuntimeException("Opened directory for write");
- } catch (IOException expected) { }
-
- try (SeekableByteChannel sbc = Files.newByteChannel(dir, APPEND)) {
- throw new RuntimeException("Opened directory for append ");
- } catch (IOException expected) { }
- }
-
// Windows specific options for the use by applications that really want
// to use legacy DOS sharing options
static void dosSharingOptionTests(Path dir) throws Exception {
--- a/jdk/test/java/security/KeyStore/ProbeKeystores.java Thu May 21 10:07:38 2015 -0700
+++ b/jdk/test/java/security/KeyStore/ProbeKeystores.java Thu May 21 16:20:20 2015 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2014, 2015, Oracle and/or its affiliates. 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
@@ -41,15 +41,6 @@
private static final String CERT_FILE = "trusted.pem";
public static final void main(String[] args) throws Exception {
- try {
- test();
- } finally {
- cleanup();
- }
- }
-
- private static final void test() throws Exception {
- cleanup();
// Testing empty keystores
@@ -129,22 +120,11 @@
System.out.println("OK.");
}
- private static void cleanup() {
- new File("empty.jks").delete();
- new File("empty.jceks").delete();
- new File("empty.p12").delete();
- new File("onecert.jks").delete();
- new File("onecert.jceks").delete();
- new File("onecert.p12").delete();
- new File("onekey.jceks").delete();
- new File("onekey.p12").delete();
- }
-
// Instantiate an empty keystore using the supplied keystore type
private static void init(String file, String type) throws Exception {
KeyStore ks = KeyStore.getInstance(type);
ks.load(null, null);
- try (OutputStream stream = new FileOutputStream(DIR + "/" + file)) {
+ try (OutputStream stream = new FileOutputStream(file)) {
ks.store(stream, PASSWORD);
}
System.out.println("Created a " + type + " keystore named '" + file + "'");
@@ -156,7 +136,7 @@
KeyStore ks = KeyStore.getInstance(type);
ks.load(null, null);
ks.setEntry("mycert", new KeyStore.TrustedCertificateEntry(cert), null);
- try (OutputStream stream = new FileOutputStream(DIR + "/" + file)) {
+ try (OutputStream stream = new FileOutputStream(file)) {
ks.store(stream, PASSWORD);
}
System.out.println("Created a " + type + " keystore named '" + file + "'");
@@ -169,7 +149,7 @@
ks.load(null, null);
ks.setEntry("mykey", new KeyStore.SecretKeyEntry(key),
new PasswordProtection(PASSWORD));
- try (OutputStream stream = new FileOutputStream(DIR + "/" + file)) {
+ try (OutputStream stream = new FileOutputStream(file)) {
ks.store(stream, PASSWORD);
}
System.out.println("Created a " + type + " keystore named '" + file + "'");
@@ -178,7 +158,7 @@
// Instantiate a keystore by probing the supplied file for the keystore type
private static void probe(String file, String type) throws Exception {
// First try with the correct password
- KeyStore ks = KeyStore.getInstance(new File(DIR, file), PASSWORD);
+ KeyStore ks = KeyStore.getInstance(new File(file), PASSWORD);
if (!type.equalsIgnoreCase(ks.getType())) {
throw new Exception("ERROR: expected a " + type + " keystore, " +
"got a " + ks.getType() + " keystore instead");
@@ -188,7 +168,7 @@
// Next try with an incorrect password
try {
- ks = KeyStore.getInstance(new File(DIR, file), BAD_PASSWORD);
+ ks = KeyStore.getInstance(new File(file), BAD_PASSWORD);
throw new Exception("ERROR: expected an exception but got success");
} catch (IOException e) {
System.out.println("Failed to load a " + type + " keystore named '" + file + "' (as expected)");
@@ -201,10 +181,10 @@
Builder builder;
if (usePassword) {
- builder = Builder.newInstance(new File(DIR, file),
+ builder = Builder.newInstance(new File(file),
new PasswordProtection(PASSWORD));
} else {
- builder = Builder.newInstance(new File(DIR, file),
+ builder = Builder.newInstance(new File(file),
new CallbackHandlerProtection(new DummyHandler()));
}
KeyStore ks = builder.getKeyStore();
@@ -219,7 +199,7 @@
// Load the keystore entries
private static void load(String file, String type) throws Exception {
KeyStore ks = KeyStore.getInstance(type);
- try (InputStream stream = new FileInputStream(DIR + "/" + file)) {
+ try (InputStream stream = new FileInputStream(file)) {
ks.load(stream, PASSWORD);
}
if (!type.equalsIgnoreCase(ks.getType())) {
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/util/logging/LogManager/Configuration/TestConfigurationLock.java Thu May 21 16:20:20 2015 -0700
@@ -0,0 +1,457 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+import java.io.File;
+import java.io.IOException;
+import java.lang.management.LockInfo;
+import java.lang.management.ManagementFactory;
+import java.lang.management.MonitorInfo;
+import java.lang.management.ThreadInfo;
+import java.security.Permission;
+import java.security.Policy;
+import java.security.ProtectionDomain;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.concurrent.atomic.AtomicLong;
+import java.util.logging.Level;
+import java.util.logging.LogManager;
+import java.util.logging.Logger;
+
+
+/**
+ * @test
+ * @bug 8077846
+ * @key randomness
+ * @summary Test that using a reentrant configuration lock does not introduce
+ * new synchronization issues in Logger and LogManager. This test
+ * focuses more particularly on potential deadlock in
+ * drainLoggerRefQueueBounded / readConfiguration / reset
+ * todo: add at randomness
+ * @run main/othervm TestConfigurationLock
+ * @author danielfuchs
+ */
+// This test is a best effort to try & detect issues. The test itself will run
+// for 8secs. This might be unsufficient to detect issues.
+// To get a greater confidence it is recommended to run this test in a loop:
+// e.g. use something like:
+// $ while jtreg -jdk:$JDK -verbose:all \
+// test/java/util/logging/TestConfigurationLock.java ; \
+// do echo Running test again ; done
+// and let it run for a few hours...
+//
+public class TestConfigurationLock {
+
+ static volatile Exception thrown = null;
+ static volatile boolean goOn = true;
+ static volatile boolean deadlock = false;
+
+ static final double CONFSYNCTHRESHOLD = 0.3;
+ static final double LOGSYNCTHRESHOLD = 0.3;
+ static final int RESETERS = 0;
+ static final int READERS = 3;
+ static final int LOGGERS = 4;
+ static final long TIME = 8 * 1000; // 8 sec.
+ static final long STEP = 1 * 1000; // message every 1 sec.
+ static final int LCOUNT = 50; // 50 loggers created in a row...
+ static final AtomicLong nextLogger = new AtomicLong(0);
+ static final AtomicLong resetCount = new AtomicLong(0);
+ static final AtomicLong readCount = new AtomicLong(0);
+ static final AtomicLong checkCount = new AtomicLong(0);
+
+ static final String BLAH = "blah";
+
+ static Object fakeConfExternalLock() {
+ return LogManager.getLogManager();
+ }
+
+ static Object fakeLogExternalLock() {
+ return LogManager.getLogManager();
+ }
+
+
+ /**
+ * This test will run both with and without a security manager.
+ *
+ * The test starts a number of threads that will call
+ * LogManager.reset() concurrently (ResetConf), and a number of threads
+ * that will call readConfiguration() (ReadConf), and then starts a
+ * number of threads that will create new loggers concurrently
+ * (AddLogger), and finally two additional threads:
+ * - one (Stopper) that will stop the test after 4secs (TIME ms),
+ * - and one DeadlockDetector that will attempt to detect deadlocks.
+ * If after 4secs no deadlock was detected and no exception was thrown
+ * then the test is considered a success and passes.
+ *
+ * This procedure is done twice: once without a security manager and once
+ * again with a security manager - which means the test takes ~8secs to
+ * run.
+ *
+ * Note that 8sec may not be enough to detect issues if there are some.
+ * This is a best effort test.
+ *
+ * @param args the command line arguments
+ * @throws java.lang.Exception if the test fails
+ */
+ public static void main(String[] args) throws Exception {
+
+ File conf = new File(System.getProperty("test.src", "./src"),
+ TestConfigurationLock.class.getSimpleName() + ".properties");
+ if (!conf.canRead()) {
+ throw new IOException("Can't read config file: " + conf.getAbsolutePath());
+ }
+ System.setProperty("java.util.logging.config.file", conf.getAbsolutePath());
+ // test without security
+ System.out.println("No security");
+ test();
+
+ // test with security
+ System.out.println("\nWith security");
+ Policy.setPolicy(new Policy() {
+ @Override
+ public boolean implies(ProtectionDomain domain, Permission permission) {
+ if (super.implies(domain, permission)) return true;
+ // System.out.println("Granting " + permission);
+ return true; // all permissions
+ }
+ });
+ System.setSecurityManager(new SecurityManager());
+ test();
+ }
+
+
+ /**
+ * Starts all threads, wait 4secs, then stops all threads.
+ * @throws Exception if a deadlock was detected or an error occurred.
+ */
+ public static void test() throws Exception {
+ goOn = true;
+ thrown = null;
+ long sNextLogger = nextLogger.get();
+ long sUpdateCount = resetCount.get();
+ long sReadCount = readCount.get();
+ long sCheckCount = checkCount.get();
+ List<Thread> threads = new ArrayList<>();
+ for (int i = 0; i<RESETERS; i++) {
+ threads.add(new ResetConf());
+ }
+ for (int i = 0; i<READERS; i++) {
+ threads.add(new ReadConf());
+ }
+ for (int i = 0; i<LOGGERS; i++) {
+ threads.add(new AddLogger());
+ }
+ threads.add(0, new Stopper(TIME));
+ threads.stream().forEach(Thread::start);
+
+ Thread deadLockDetector = new DeadlockDetector();
+ deadLockDetector.start();
+ deadLockDetector.join();
+
+ if (!deadlock) {
+ threads.stream().forEach(TestConfigurationLock::join);
+ } else {
+ System.err.println("Deadlock found: exiting forcibly.");
+ Runtime.getRuntime().halt(-1);
+ }
+
+ if (thrown != null) {
+ throw thrown;
+ }
+ System.out.println("Passed: " + (nextLogger.get() - sNextLogger)
+ + " loggers created by " + LOGGERS + " Thread(s),");
+ System.out.println("\t LogManager.reset() called "
+ + (resetCount.get() - sUpdateCount) + " times by " + RESETERS
+ + " Thread(s).");
+ System.out.println("\t LogManager.readConfiguration() called "
+ + (readCount.get() - sReadCount) + " times by " + READERS
+ + " Thread(s).");
+ System.out.println("\t ThreadMXBean.findDeadlockedThreads called "
+ + (checkCount.get() -sCheckCount) + " times by 1 Thread.");
+
+ }
+
+ static void join(Thread t) {
+ try {
+ t.join();
+ } catch (Exception x) {
+ fail(x);
+ }
+ }
+
+ final static class ResetConf extends Thread {
+
+ public ResetConf() {
+ setDaemon(true);
+ }
+
+ @Override
+ public void run() {
+ while (goOn) {
+ try {
+ if (Math.random() > CONFSYNCTHRESHOLD) {
+ // calling reset while holding a lock can increase
+ // deadlock probability...
+ synchronized(fakeConfExternalLock()) {
+ LogManager.getLogManager().reset();
+ }
+ } else {
+ LogManager.getLogManager().reset();
+ }
+ Logger blah = Logger.getLogger(BLAH);
+ blah.setLevel(Level.FINEST);
+ blah.fine(BLAH);
+ resetCount.incrementAndGet();
+ pause(1);
+ } catch (Exception x) {
+ fail(x);
+ }
+ }
+ }
+ }
+
+ final static class ReadConf extends Thread {
+
+ public ReadConf() {
+ setDaemon(true);
+ }
+
+ @Override
+ public void run() {
+ while (goOn) {
+ try {
+ if (Math.random() > CONFSYNCTHRESHOLD) {
+ // calling readConfiguration while holding a lock can
+ // increase deadlock probability...
+ synchronized(fakeConfExternalLock()) {
+ LogManager.getLogManager().readConfiguration();
+ }
+ } else {
+ LogManager.getLogManager().readConfiguration();
+ }
+ Logger blah = Logger.getLogger(BLAH);
+ blah.setLevel(Level.FINEST);
+ blah.fine(BLAH);
+ readCount.incrementAndGet();
+ pause(1);
+ } catch (Exception x) {
+ fail(x);
+ }
+ }
+ }
+ }
+
+ final static class AddLogger extends Thread {
+
+ public AddLogger() {
+ setDaemon(true);
+ }
+
+ @Override
+ public void run() {
+ try {
+ while (goOn) {
+ Logger l;
+ Logger foo = Logger.getLogger("foo");
+ Logger bar = Logger.getLogger("foo.bar");
+ for (int i=0; i < LCOUNT ; i++) {
+ LogManager manager = LogManager.getLogManager();
+ if (Math.random() > LOGSYNCTHRESHOLD) {
+ synchronized(fakeLogExternalLock()) {
+ l = Logger.getLogger("foo.bar.l"+nextLogger.incrementAndGet());
+ }
+ } else {
+ l = Logger.getLogger("foo.bar.l"+nextLogger.incrementAndGet());
+ }
+ l.setLevel(Level.FINEST);
+ l.fine("I'm fine");
+ if (!goOn) break;
+ pause(1);
+ }
+ }
+ } catch (InterruptedException | RuntimeException x ) {
+ fail(x);
+ }
+ }
+ }
+
+ final static class DeadlockDetector extends Thread {
+
+ @Override
+ public void run() {
+ boolean deadlock = false;
+ while(goOn) {
+ try {
+ long[] ids = ManagementFactory.getThreadMXBean().findDeadlockedThreads();
+ checkCount.incrementAndGet();
+ ids = ids == null ? new long[0] : ids;
+ if (ids.length == 1) {
+ throw new RuntimeException("Found 1 deadlocked thread: "+ids[0]);
+ } else if (ids.length > 0) {
+ deadlock = true;
+ ThreadInfo[] infos = ManagementFactory.getThreadMXBean()
+ .getThreadInfo(ids, true, true);
+ System.err.println("Found "+ids.length+" deadlocked threads: ");
+ for (ThreadInfo inf : infos) {
+ System.err.println(asString(inf));
+ }
+ throw new RuntimeException("Found "+ids.length+" deadlocked threads");
+ }
+ pause(100);
+ } catch(InterruptedException | RuntimeException x) {
+ if (deadlock) deadlock(x);
+ else fail(x);
+ }
+ }
+ }
+
+ }
+
+ static final class Stopper extends Thread {
+ long start;
+ long time;
+
+ Stopper(long time) {
+ start = System.currentTimeMillis();
+ this.time = time;
+ setDaemon(true);
+ }
+
+ @Override
+ public void run() {
+ try {
+ long rest, previous;
+ int msgCount = 0;
+ previous = time;
+ Logger logger = Logger.getLogger("remaining");
+ while (goOn && (rest = start - System.currentTimeMillis() + time) > 0) {
+ if (previous == time || previous - rest >= STEP) {
+ logger.log(Level.INFO, "{0}ms remaining...", String.valueOf(rest));
+ msgCount++;
+ previous = rest == time ? rest -1 : rest;
+ System.gc();
+ }
+ if (goOn == false) break;
+ pause(Math.min(rest, 100));
+ }
+ System.err.println(this + ": " + msgCount + " messages.");
+ System.err.flush();
+ System.out.println(System.currentTimeMillis() - start
+ + " ms elapsed ("+time+ " requested)");
+ goOn = false;
+ } catch(InterruptedException | RuntimeException x) {
+ fail(x);
+ }
+ }
+
+ }
+
+ // ThreadInfo.toString() only prints 8 frames...
+ static String asString(ThreadInfo inf) {
+ StringBuilder sb = new StringBuilder();
+ sb.append("\"").append(inf.getThreadName()).append("\"")
+ .append(inf.isDaemon() ? " daemon" : "")
+ .append(" prio=").append(inf.getPriority())
+ .append(" Id=").append(inf.getThreadId())
+ .append(" ").append(inf.getThreadState());
+ if (inf.getLockName() != null) {
+ sb.append(" on ").append(inf.getLockName());
+ }
+ if (inf.getLockOwnerName() != null) {
+ sb.append(" owned by \"").append(inf.getLockOwnerName())
+ .append("\" Id=").append(inf.getLockOwnerId());
+ }
+ if (inf.isSuspended()) {
+ sb.append(" (suspended)");
+ }
+ if (inf.isInNative()) {
+ sb.append(" (in native)");
+ }
+ sb.append('\n');
+ int i = 0;
+ StackTraceElement[] stackTrace = inf.getStackTrace();
+ for (; i < stackTrace.length; i++) {
+ StackTraceElement ste = stackTrace[i];
+ sb.append("\tat ").append(ste.toString());
+ sb.append('\n');
+ if (i == 0 && inf.getLockInfo() != null) {
+ Thread.State ts = inf.getThreadState();
+ switch (ts) {
+ case BLOCKED:
+ sb.append("\t- blocked on ").append(inf.getLockInfo());
+ sb.append('\n');
+ break;
+ case WAITING:
+ sb.append("\t- waiting on ").append(inf.getLockInfo());
+ sb.append('\n');
+ break;
+ case TIMED_WAITING:
+ sb.append("\t- waiting on ").append(inf.getLockInfo());
+ sb.append('\n');
+ break;
+ default:
+ }
+ }
+
+ for (MonitorInfo mi : inf.getLockedMonitors()) {
+ if (mi.getLockedStackDepth() == i) {
+ sb.append("\t- locked ").append(mi);
+ sb.append('\n');
+ }
+ }
+ }
+ if (i < stackTrace.length) {
+ sb.append("\t...");
+ sb.append('\n');
+ }
+
+ LockInfo[] locks = inf.getLockedSynchronizers();
+ if (locks.length > 0) {
+ sb.append("\n\tNumber of locked synchronizers = ").append(locks.length);
+ sb.append('\n');
+ for (LockInfo li : locks) {
+ sb.append("\t- ").append(li);
+ sb.append('\n');
+ }
+ }
+ sb.append('\n');
+ return sb.toString();
+ }
+
+ static void pause(long millis) throws InterruptedException {
+ Thread.sleep(millis);
+ }
+
+ static void fail(Exception x) {
+ x.printStackTrace(System.err);
+ if (thrown == null) {
+ thrown = x;
+ }
+ goOn = false;
+ }
+
+ static void deadlock(Exception x) {
+ deadlock = true;
+ System.out.flush();
+ fail(x);
+ System.err.flush();
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/util/logging/LogManager/Configuration/TestConfigurationLock.properties Thu May 21 16:20:20 2015 -0700
@@ -0,0 +1,22 @@
+########################################################################
+# Logging configuration property file for TestConfigurationLock.java #
+########################################################################
+
+handlers= java.util.logging.ConsoleHandler
+
+.level= INFO
+
+java.util.logging.FileHandler.pattern = %h/java%u.log
+java.util.logging.FileHandler.limit = 50000
+java.util.logging.FileHandler.count = 1
+java.util.logging.FileHandler.formatter = java.util.logging.XMLFormatter
+
+java.util.logging.ConsoleHandler.level = INFO
+java.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter
+
+blah.level = FINE
+foo.bar.l10.level = INFO
+foo.bar.l100.level = INFO
+foo.bar.l1000.level = INFO
+
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/crypto/SecretKeyFactory/PBKDF2TranslateTest.java Thu May 21 16:20:20 2015 -0700
@@ -0,0 +1,270 @@
+/*
+ * Copyright (c) 2003, 2015, Oracle and/or its affiliates. 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+import java.security.InvalidKeyException;
+import java.security.NoSuchAlgorithmException;
+import java.security.spec.InvalidKeySpecException;
+import java.util.Arrays;
+import java.util.Random;
+import javax.crypto.SecretKey;
+import javax.crypto.SecretKeyFactory;
+import javax.crypto.interfaces.PBEKey;
+import javax.crypto.spec.PBEKeySpec;
+import javax.security.auth.DestroyFailedException;
+
+import static java.lang.System.out;
+
+/*
+ * @test
+ * @bug 8048820
+ * @summary The test verifies if the SecretKeyFactory.translateKey() method
+ * works as expected for the PBKDF2 algorithms.
+ */
+
+public class PBKDF2TranslateTest {
+
+ private static final String PASS_PHRASE = "some hidden string";
+ private static final int ITERATION_COUNT = 1000;
+ private static final int KEY_SIZE = 128;
+ private static final String[] TEST_ALGOS = { "PBKDF2WithHmacSHA1",
+ "PBKDF2WithHmacSHA224", "PBKDF2WithHmacSHA256",
+ "PBKDF2WithHmacSHA384", "PBKDF2WithHmacSHA512" };
+ private final String algoForTest;
+
+ public static void main(String[] args) throws Exception {
+ for (String algo : TEST_ALGOS) {
+ PBKDF2TranslateTest theTest = new PBKDF2TranslateTest(algo);
+ byte[] salt = new byte[8];
+ new Random().nextBytes(salt);
+ theTest.testMyOwnSecretKey(salt);
+ theTest.generateAndTranslateKey(salt);
+ theTest.translateSpoiledKey(salt);
+ }
+ }
+
+ public PBKDF2TranslateTest(String algo) {
+ algoForTest = algo;
+ }
+
+ /**
+ * The test case scenario implemented in the method: - derive PBKDF2 key
+ * using the given algorithm; - translate the key - check if the translated
+ * and original keys have the same key value.
+ *
+ */
+ public void generateAndTranslateKey(byte[] salt)
+ throws NoSuchAlgorithmException, InvalidKeySpecException,
+ InvalidKeyException {
+ // derive PBKDF2 key
+ SecretKey key1 = getSecretKeyForPBKDF2(algoForTest, salt);
+
+ // translate key
+ SecretKeyFactory skf = SecretKeyFactory.getInstance(algoForTest);
+ SecretKey key2 = skf.translateKey(key1);
+
+ // Check if it still the same after translation
+ if (!Arrays.equals(key1.getEncoded(), key2.getEncoded())) {
+ System.out.println("Key1=" + new String(key1.getEncoded())
+ + " key2=" + new String(key2.getEncoded()) + " salt="
+ + new String(salt));
+ throw new RuntimeException(
+ "generateAndTranslateKey test case failed: the key1 and"
+ + " key2 values in its primary encoding format are"
+ + " not the same for " + algoForTest
+ + " algorithm.");
+ }
+ }
+
+ /**
+ * The test case scenario implemented in the method: - derive Key1 for the
+ * given PBKDF2 algorithm - create my own secret Key2 as an instance of a
+ * class implements PBEKey - translate Key2 - check if the key value of the
+ * translated key and Key1 are the same.
+ */
+ private void testMyOwnSecretKey(byte[] salt)
+ throws NoSuchAlgorithmException, InvalidKeySpecException,
+ InvalidKeyException {
+ SecretKey key1 = getSecretKeyForPBKDF2(algoForTest, salt);
+ SecretKey key2 = getMyOwnSecretKey(salt);
+
+ // Is it actually the same?
+ if (!Arrays.equals(key1.getEncoded(), key2.getEncoded())) {
+ throw new RuntimeException(
+ "We shouldn't be here. The key1 and key2 values in its"
+ + " primary encoding format have to be the same!");
+ }
+
+ // translate key
+ SecretKeyFactory skf = SecretKeyFactory.getInstance(algoForTest);
+ SecretKey key3 = skf.translateKey(key2);
+
+ // Check if it still the same after translation
+ if (!Arrays.equals(key1.getEncoded(), key3.getEncoded())) {
+ System.out.println("Key1=" + new String(key1.getEncoded())
+ + " key3=" + new String(key3.getEncoded()) + " salt="
+ + new String(salt));
+ throw new RuntimeException(
+ "testMyOwnSecretKey test case failed: the key1 and key3"
+ + " values in its primary encoding format are not"
+ + " the same for " + algoForTest + " algorithm.");
+ }
+
+ }
+
+ /**
+ * The test case scenario implemented in the method: - create my own secret
+ * Key2 as an instance of a class implements PBEKey - spoil the key (set
+ * iteration count to 0, for example) - try to translate key -
+ * InvalidKeyException is expected.
+ */
+ public void translateSpoiledKey(byte[] salt)
+ throws NoSuchAlgorithmException, InvalidKeySpecException {
+ // derive the key
+ SecretKey key1 = getMyOwnSecretKey(salt);
+
+ // spoil the key
+ ((MyPBKDF2SecretKey) key1).spoil();
+
+ // translate key
+ SecretKeyFactory skf = SecretKeyFactory.getInstance(algoForTest);
+ try {
+ skf.translateKey(key1);
+ throw new RuntimeException(
+ "translateSpoiledKey test case failed, should throw"
+ + " InvalidKeyException when spoil the key");
+ } catch (InvalidKeyException ike) {
+ out.println("Expected exception when spoil the key");
+ }
+
+ }
+
+ /**
+ * Generate a PBKDF2 secret key using given algorithm.
+ */
+ private SecretKey getSecretKeyForPBKDF2(String algoDeriveKey, byte[] salt)
+ throws NoSuchAlgorithmException, InvalidKeySpecException {
+
+ SecretKeyFactory skf = SecretKeyFactory.getInstance(algoDeriveKey);
+ PBEKeySpec spec = new PBEKeySpec(PASS_PHRASE.toCharArray(), salt,
+ ITERATION_COUNT, KEY_SIZE);
+
+ return skf.generateSecret(spec);
+ }
+
+ /**
+ * Generate a secrete key as an instance of a class implements PBEKey.
+ */
+ private SecretKey getMyOwnSecretKey(byte[] salt)
+ throws InvalidKeySpecException, NoSuchAlgorithmException {
+ return new MyPBKDF2SecretKey(PASS_PHRASE, algoForTest, salt,
+ ITERATION_COUNT, KEY_SIZE);
+ }
+
+ /**
+ * An utility class to check the SecretKeyFactory.translateKey() method.
+ */
+ class MyPBKDF2SecretKey implements PBEKey {
+ private final byte[] key;
+ private final byte[] salt;
+ private final String algorithm;
+ private final int keyLength;
+ private final String pass;
+ private int itereationCount;
+
+ /**
+ * The key is generating by SecretKeyFactory and its value just copying
+ * in the key field of MySecretKey class. So, this is real key derived
+ * using the given algo.
+ */
+ public MyPBKDF2SecretKey(String passPhrase, String algo, byte[] salt1,
+ int iterationCount, int keySize)
+ throws InvalidKeySpecException, NoSuchAlgorithmException {
+ algorithm = algo;
+ salt = salt1;
+ itereationCount = iterationCount;
+ pass = passPhrase;
+
+ PBEKeySpec spec = new PBEKeySpec(passPhrase.toCharArray(), salt,
+ iterationCount, keySize);
+
+ SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(algo);
+
+ SecretKey realKey = keyFactory.generateSecret(spec);
+
+ keyLength = realKey.getEncoded().length;
+
+ key = new byte[keyLength];
+ System.arraycopy(realKey.getEncoded(), 0, key, 0, keyLength);
+ }
+
+ @Override
+ public String getAlgorithm() {
+ return algorithm;
+ }
+
+ @Override
+ public String getFormat() {
+ return "RAW";
+ }
+
+ @Override
+ public byte[] getEncoded() {
+ byte[] copy = new byte[keyLength];
+ System.arraycopy(key, 0, copy, 0, keyLength);
+ return copy;
+ }
+
+ @Override
+ public int getIterationCount() {
+ return itereationCount;
+ }
+
+ @Override
+ public byte[] getSalt() {
+ return salt;
+ }
+
+ @Override
+ public char[] getPassword() {
+ return pass.toCharArray();
+ }
+
+ /**
+ * Spoil the generated key (before translation) to cause an
+ * InvalidKeyException
+ */
+ public void spoil() {
+ itereationCount = -1;
+ }
+
+ @Override
+ public void destroy() throws DestroyFailedException {
+ }
+
+ @Override
+ public boolean isDestroyed() {
+ return false;
+ }
+
+ }
+}
\ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/crypto/SecretKeyFactory/SecKFTranslateTest.java Thu May 21 16:20:20 2015 -0700
@@ -0,0 +1,206 @@
+/*
+ * Copyright (c) 2003, 2015, Oracle and/or its affiliates. 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+import java.security.InvalidAlgorithmParameterException;
+import java.security.InvalidKeyException;
+import java.security.NoSuchAlgorithmException;
+import java.security.NoSuchProviderException;
+import java.security.SecureRandom;
+import java.security.spec.AlgorithmParameterSpec;
+import java.security.spec.InvalidKeySpecException;
+import java.util.Arrays;
+import java.util.Random;
+
+import javax.crypto.BadPaddingException;
+import javax.crypto.Cipher;
+import javax.crypto.IllegalBlockSizeException;
+import javax.crypto.NoSuchPaddingException;
+import javax.crypto.SecretKey;
+import javax.crypto.SecretKeyFactory;
+import javax.crypto.ShortBufferException;
+import javax.crypto.spec.PBEKeySpec;
+import javax.crypto.spec.PBEParameterSpec;
+import javax.security.auth.DestroyFailedException;
+
+/*
+ * @test
+ * @bug 8048820
+ * @summary The test verifies SecretKey values should remain the same after
+ * translation with SecretKeyFactory.translateKey().
+ */
+
+public class SecKFTranslateTest {
+ private static final String SUN_JCE = "SunJCE";
+
+ public static void main(String[] args) throws Exception {
+
+ SecKFTranslateTest test = new SecKFTranslateTest();
+ test.run();
+ }
+
+ private void run() throws Exception {
+
+ for (Algorithm algorithm : Algorithm.values()) {
+ runTest(algorithm);
+ }
+ }
+
+ private void runTest(Algorithm algo) throws NoSuchAlgorithmException,
+ NoSuchProviderException, InvalidKeyException,
+ InvalidKeySpecException, NoSuchPaddingException,
+ InvalidAlgorithmParameterException, ShortBufferException,
+ IllegalBlockSizeException, BadPaddingException {
+ AlgorithmParameterSpec[] aps = new AlgorithmParameterSpec[1];
+ byte[] plainText = new byte[800];
+
+ SecretKey key1 = algo.intSecurityKey(aps);
+ Random random = new Random();
+ // Initialization
+ SecretKeyFactory skf = SecretKeyFactory.getInstance(algo.toString(),
+ SUN_JCE);
+
+ random.nextBytes(plainText);
+ Cipher ci = Cipher.getInstance(algo.toString(), SUN_JCE);
+ // Encryption
+ ci.init(Cipher.ENCRYPT_MODE, key1, aps[0]);
+ byte[] cipherText = new byte[ci.getOutputSize(plainText.length)];
+ int offset = ci.update(plainText, 0, plainText.length, cipherText, 0);
+ ci.doFinal(cipherText, offset);
+ // translate key
+ SecretKey key2 = skf.translateKey(key1);
+
+ // Decryption
+ ci.init(Cipher.DECRYPT_MODE, key2, aps[0]);
+ byte[] recoveredText = new byte[ci.getOutputSize(plainText.length)];
+ ci.doFinal(cipherText, 0, cipherText.length, recoveredText);
+
+ // Comparison
+ if (!Arrays.equals(plainText, recoveredText)) {
+ System.out.println("Key1:" + new String(key1.getEncoded())
+ + " Key2:" + new String(key2.getEncoded()));
+ throw new RuntimeException("Testing translate key failed with "
+ + algo);
+ }
+
+ }
+}
+
+class MyOwnSecKey implements SecretKey {
+
+ private static final String DEFAULT_ALGO = "PBEWithMD5AndDES";
+ private final byte[] key;
+ private final String algorithm;
+ private final int keySize;
+
+ public MyOwnSecKey(byte[] key1, int offset, String algo)
+ throws InvalidKeyException {
+ algorithm = algo;
+ if (algo.equalsIgnoreCase("DES")) {
+ keySize = 8;
+ } else if (algo.equalsIgnoreCase("DESede")) {
+ keySize = 24;
+ } else {
+ throw new InvalidKeyException(
+ "Inappropriate key format and algorithm");
+ }
+
+ if (key1 == null || key1.length - offset < keySize) {
+ throw new InvalidKeyException("Wrong key size");
+ }
+ key = new byte[keySize];
+ System.arraycopy(key, offset, key, 0, keySize);
+ }
+
+ public MyOwnSecKey(PBEKeySpec ks) throws InvalidKeySpecException {
+ algorithm = DEFAULT_ALGO;
+ key = new String(ks.getPassword()).getBytes();
+ keySize = key.length;
+ }
+
+ @Override
+ public String getAlgorithm() {
+ return algorithm;
+ }
+
+ @Override
+ public String getFormat() {
+ return "RAW";
+ }
+
+ @Override
+ public byte[] getEncoded() {
+ byte[] copy = new byte[keySize];
+ System.arraycopy(key, 0, copy, 0, keySize);
+ return copy;
+ }
+
+ @Override
+ public void destroy() throws DestroyFailedException {
+ }
+
+ @Override
+ public boolean isDestroyed() {
+ return false;
+ }
+}
+
+enum Algorithm {
+ DES {
+ @Override
+ SecretKey intSecurityKey(AlgorithmParameterSpec[] spec)
+ throws InvalidKeyException {
+ int keyLength = 8;
+ byte[] keyVal = new byte[keyLength];
+ new SecureRandom().nextBytes(keyVal);
+ SecretKey key1 = new MyOwnSecKey(keyVal, 0, this.toString());
+ return key1;
+ }
+ },
+ DESEDE {
+ @Override
+ SecretKey intSecurityKey(AlgorithmParameterSpec[] spec)
+ throws InvalidKeyException {
+ int keyLength = 24;
+ byte[] keyVal = new byte[keyLength];
+ new SecureRandom().nextBytes(keyVal);
+ SecretKey key1 = new MyOwnSecKey(keyVal, 0, this.toString());
+ return key1;
+ }
+ },
+ PBEWithMD5ANDdes {
+ @Override
+ SecretKey intSecurityKey(AlgorithmParameterSpec[] spec)
+ throws InvalidKeySpecException {
+ byte[] salt = new byte[8];
+ int iterCnt = 6;
+ new Random().nextBytes(salt);
+ spec[0] = new PBEParameterSpec(salt, iterCnt);
+ PBEKeySpec pbeKS = new PBEKeySpec(
+ new String("So far so good").toCharArray());
+ SecretKey key1 = new MyOwnSecKey(pbeKS);
+ return key1;
+ }
+ };
+ abstract SecretKey intSecurityKey(AlgorithmParameterSpec[] spec)
+ throws InvalidKeyException, InvalidKeySpecException;
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/script/SimpleScriptContextNameChecksTest.java Thu May 21 16:20:20 2015 -0700
@@ -0,0 +1,105 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 8072853
+ * @summary SimpleScriptContext used by NashornScriptEngine doesn't completely complies to the spec regarding exception throwing
+ * @run testng SimpleScriptContextNameChecksTest
+ */
+
+import java.util.List;
+import java.util.function.Consumer;
+import javax.script.*;
+import org.testng.annotations.Test;
+
+public class SimpleScriptContextNameChecksTest {
+ private List<ScriptEngineFactory> getFactories() {
+ return new ScriptEngineManager().getEngineFactories();
+ }
+
+ private void testAndExpect(Consumer<ScriptContext> c, Class<? extends RuntimeException> clazz) {
+ for (ScriptEngineFactory fac : getFactories()) {
+ ScriptContext sc = fac.getScriptEngine().getContext();
+ String name = fac.getEngineName();
+ try {
+ c.accept(sc);
+ throw new RuntimeException("no exception for " + name);
+ } catch (NullPointerException | IllegalArgumentException e) {
+ if (e.getClass() == clazz) {
+ System.out.println("got " + e + " as expected for " + name);
+ } else {
+ throw e;
+ }
+ }
+ }
+ }
+
+ private void testAndExpectIAE(Consumer<ScriptContext> c) {
+ testAndExpect(c, IllegalArgumentException.class);
+ }
+
+ private void testAndExpectNPE(Consumer<ScriptContext> c) {
+ testAndExpect(c, NullPointerException.class);
+ }
+
+ @Test
+ public void getAttributeEmptyName() {
+ testAndExpectIAE(sc -> sc.getAttribute("", ScriptContext.GLOBAL_SCOPE));
+ }
+
+ @Test
+ public void getAttributeNullName() {
+ testAndExpectNPE(sc -> sc.getAttribute(null, ScriptContext.GLOBAL_SCOPE));
+ }
+
+ @Test
+ public void removeAttributeEmptyName() {
+ testAndExpectIAE(sc -> sc.removeAttribute("", ScriptContext.GLOBAL_SCOPE));
+ }
+
+ @Test
+ public void removeAttributeNullName() {
+ testAndExpectNPE(sc -> sc.removeAttribute(null, ScriptContext.GLOBAL_SCOPE));
+ }
+
+ @Test
+ public void setAttributeEmptyName() {
+ testAndExpectIAE(sc -> sc.setAttribute("", "value", ScriptContext.GLOBAL_SCOPE));
+ }
+
+ @Test
+ public void setAttributeNullName() {
+ testAndExpectNPE(sc -> sc.setAttribute(null, "value", ScriptContext.GLOBAL_SCOPE));
+ }
+
+ @Test
+ public void getAttributesScopeEmptyName() {
+ testAndExpectIAE(sc -> sc.getAttributesScope(""));
+ }
+
+ @Test
+ public void getAttributesScopeNullName() {
+ testAndExpectNPE(sc -> sc.getAttributesScope(null));
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/xml/crypto/dsig/ErrorHandlerPermissions.java Thu May 21 16:20:20 2015 -0700
@@ -0,0 +1,121 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. 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. Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+import java.io.ByteArrayInputStream;
+import java.io.File;
+import java.security.KeyFactory;
+import java.security.PublicKey;
+import java.security.spec.X509EncodedKeySpec;
+import java.util.Base64;
+import javax.xml.XMLConstants;
+import javax.xml.crypto.Data;
+import javax.xml.crypto.KeySelector;
+import javax.xml.crypto.OctetStreamData;
+import javax.xml.crypto.URIDereferencer;
+import javax.xml.crypto.URIReference;
+import javax.xml.crypto.URIReferenceException;
+import javax.xml.crypto.XMLCryptoContext;
+import javax.xml.crypto.dsig.XMLSignature;
+import javax.xml.crypto.dsig.XMLSignatureFactory;
+import javax.xml.crypto.dsig.dom.DOMValidateContext;
+import javax.xml.parsers.DocumentBuilderFactory;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.w3c.dom.NodeList;
+
+/**
+ * @test
+ * @bug 8079140
+ * @summary Check if IgnoreAllErrorHandler doesn't require additional permission
+ * @run main/othervm/java.security.policy=ErrorHandlerPermissions.policy
+ * ErrorHandlerPermissions
+ */
+public class ErrorHandlerPermissions {
+
+ private final static String FS = System.getProperty("file.separator");
+ private final static String DIR = System.getProperty("test.src", ".");
+ private final static String DATA_DIR = DIR + FS + "data";
+ private final static String SIGNATURE = DATA_DIR + FS +
+ "signature-external-rsa.xml";
+
+ private static final String validationKey =
+ "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCnx4TdvPSA5vcsPi0OJZi9Ox0Z" +
+ "2FRz2oeUCtuWoyEg0kUCeFd+jJZMstDJUiZNSOeuCO3FWSpdJgAwI4zlveHvuU/o" +
+ "qHSa1eYTObOCvxfVYGGflWsSvGXyiANtRWVUrYODBeyL+2pWxDYh+Fi5EKizPfTG" +
+ "wRjBVRSkRZKTnSjnQwIDAQAB";
+
+ private static final URIDereferencer dereferencer =
+ new DummyURIDereferencer();
+
+ public static void main(String[] args) throws Exception {
+ DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
+ dbf.setNamespaceAware(true);
+ dbf.setValidating(false);
+ dbf.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, Boolean.TRUE);
+ Document doc = dbf.newDocumentBuilder().parse(new File(SIGNATURE));
+ NodeList nl = doc.getElementsByTagNameNS(XMLSignature.XMLNS,
+ "Signature");
+ if (nl.getLength() == 0) {
+ throw new RuntimeException("Couldn't find 'Signature' element");
+ }
+ Element element = (Element) nl.item(0);
+
+ byte[] keyBytes = Base64.getDecoder().decode(validationKey);
+ X509EncodedKeySpec spec = new X509EncodedKeySpec(keyBytes);
+ KeyFactory kf = KeyFactory.getInstance("RSA");
+ PublicKey key = kf.generatePublic(spec);
+ KeySelector ks = KeySelector.singletonKeySelector(key);
+
+ DOMValidateContext vc = new DOMValidateContext(ks, element);
+
+ // disable secure validation mode
+ vc.setProperty("org.jcp.xml.dsig.secureValidation", Boolean.FALSE);
+
+ // set a dummy dereferencer to be able to get content by references
+ vc.setURIDereferencer(dereferencer);
+
+ XMLSignatureFactory factory = XMLSignatureFactory.getInstance();
+ XMLSignature signature = factory.unmarshalXMLSignature(vc);
+
+ // run validation
+ signature.validate(vc);
+ }
+
+ /**
+ * This URIDereferencer returns a static XML document.
+ */
+ private static class DummyURIDereferencer implements URIDereferencer {
+
+ @Override
+ public Data dereference(final URIReference ref, XMLCryptoContext ctx)
+ throws URIReferenceException {
+ // return static content
+ return new OctetStreamData(new ByteArrayInputStream(
+ "<test>test</test>".getBytes()), ref.getURI(),
+ ref.getType());
+ }
+ }
+
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/xml/crypto/dsig/ErrorHandlerPermissions.policy Thu May 21 16:20:20 2015 -0700
@@ -0,0 +1,5 @@
+grant {
+ permission java.util.PropertyPermission "test.src", "read";
+ permission java.util.PropertyPermission "file.separator", "read";
+ permission java.io.FilePermission "${test.src}/-", "read";
+};
--- a/jdk/test/javax/xml/crypto/dsig/GenerationTests.java Thu May 21 10:07:38 2015 -0700
+++ b/jdk/test/javax/xml/crypto/dsig/GenerationTests.java Thu May 21 16:20:20 2015 -0700
@@ -24,7 +24,7 @@
/**
* @test
* @bug 4635230 6283345 6303830 6824440 6867348 7094155 8038184 8038349 8046949
- * 8046724
+ * 8046724 8079693
* @summary Basic unit tests for generating XML Signatures with JSR 105
* @compile -XDignore.symbol.file KeySelectors.java SignatureValidator.java
* X509KeySelector.java GenerationTests.java
@@ -92,7 +92,8 @@
rsaSha256, rsaSha384, rsaSha512,
ecdsaSha1;
private static DigestMethod sha1, sha256, sha384, sha512;
- private static KeyInfo dsa1024, dsa2048, rsa, rsa1024, p256ki;
+ private static KeyInfo dsa1024, dsa2048, rsa, rsa1024,
+ p256ki, p384ki, p521ki;
private static KeySelector kvks = new KeySelectors.KeyValueKeySelector();
private static KeySelector sks;
private static Key signingKey;
@@ -131,6 +132,8 @@
test_create_signature_enveloping_hmac_sha512();
test_create_signature_enveloping_rsa();
test_create_signature_enveloping_p256_sha1();
+ test_create_signature_enveloping_p384_sha1();
+ test_create_signature_enveloping_p521_sha1();
test_create_signature_external_b64_dsa();
test_create_signature_external_dsa();
test_create_signature_keyname();
@@ -186,7 +189,11 @@
rsa1024 = kifac.newKeyInfo(Collections.singletonList
(kifac.newKeyValue(getPublicKey("RSA", 1024))));
p256ki = kifac.newKeyInfo(Collections.singletonList
- (kifac.newKeyValue(getECPublicKey())));
+ (kifac.newKeyValue(getECPublicKey("P256"))));
+ p384ki = kifac.newKeyInfo(Collections.singletonList
+ (kifac.newKeyValue(getECPublicKey("P384"))));
+ p521ki = kifac.newKeyInfo(Collections.singletonList
+ (kifac.newKeyValue(getECPublicKey("P521"))));
rsaSha1 = fac.newSignatureMethod(SignatureMethod.RSA_SHA1, null);
rsaSha256 = fac.newSignatureMethod
("http://www.w3.org/2001/04/xmldsig-more#rsa-sha256", null);
@@ -359,7 +366,21 @@
static void test_create_signature_enveloping_p256_sha1() throws Exception {
System.out.println("* Generating signature-enveloping-p256-sha1.xml");
test_create_signature_enveloping(sha1, ecdsaSha1, p256ki,
- getECPrivateKey(), kvks, false);
+ getECPrivateKey("P256"), kvks, false);
+ System.out.println();
+ }
+
+ static void test_create_signature_enveloping_p384_sha1() throws Exception {
+ System.out.println("* Generating signature-enveloping-p384-sha1.xml");
+ test_create_signature_enveloping(sha1, ecdsaSha1, p384ki,
+ getECPrivateKey("P384"), kvks, false);
+ System.out.println();
+ }
+
+ static void test_create_signature_enveloping_p521_sha1() throws Exception {
+ System.out.println("* Generating signature-enveloping-p521-sha1.xml");
+ test_create_signature_enveloping(sha1, ecdsaSha1, p521ki,
+ getECPrivateKey("P521"), kvks, false);
System.out.println();
}
@@ -1189,37 +1210,63 @@
"237008997971129772408397621801631622129297063463868593083106979716" +
"204903524890556839550490384015324575598723478554854070823335021842" +
"210112348400928769";
- private static final String EC_X =
+ private static final String EC_P256_X =
"335863644451761614592446380116804721648611739647823420286081723541" +
"6166183710";
- private static final String EC_Y =
+ private static final String EC_P256_Y =
"951559601159729477487064127150143688502130342917782252098602422796" +
"95457910701";
- private static final String EC_S =
+ private static final String EC_P256_S =
"425976209773168452211813225517384419928639977904006759709292218082" +
"7440083936";
- private static final ECParameterSpec EC_PARAMS;
+ private static final ECParameterSpec EC_P256_PARAMS = initECParams(
+ "FFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF",
+ "FFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFC",
+ "5AC635D8AA3A93E7B3EBBD55769886BC651D06B0CC53B0F63BCE3C3E27D2604B",
+ "6B17D1F2E12C4247F8BCE6E563A440F277037D812DEB33A0F4A13945D898C296",
+ "4FE342E2FE1A7F9B8EE7EB4A7C0F9E162BCE33576B315ECECBB6406837BF51F5",
+ "FFFFFFFF00000000FFFFFFFFFFFFFFFFBCE6FAADA7179E84F3B9CAC2FC632551",
+ 1
+ );
+ private static final String EC_P384_X =
+ "12144058647679082341340699736608428955270957565259459672517275506071643671835484144490620216582303669654008841724053";
+ private static final String EC_P384_Y =
+ "18287745972107701566600963632634101287058332546756092926848497481238534346489545826483592906634896557151987868614320";
+ private static final String EC_P384_S =
+ "10307785759830534742680442271492590599236624208247590184679565032330507874096079979152605984203102224450595283943382";
+ private static final ECParameterSpec EC_P384_PARAMS = initECParams(
+ "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFF0000000000000000FFFFFFFF",
+ "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFF0000000000000000FFFFFFFC",
+ "B3312FA7E23EE7E4988E056BE3F82D19181D9C6EFE8141120314088F5013875AC656398D8A2ED19D2A85C8EDD3EC2AEF",
+ "AA87CA22BE8B05378EB1C71EF320AD746E1D3B628BA79B9859F741E082542A385502F25DBF55296C3A545E3872760AB7",
+ "3617DE4A96262C6F5D9E98BF9292DC29F8F41DBD289A147CE9DA3113B5F0B8C00A60B1CE1D7E819D7A431D7C90EA0E5F",
+ "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC7634D81F4372DDF581A0DB248B0A77AECEC196ACCC52973",
+ 1
+ );
+ private static final String EC_P521_X =
+ "4157918188927862838251799402582135611021257663417126086145819679867926857146776190737187582274664373117054717389603317411991660346043842712448912355335343997";
+ private static final String EC_P521_Y =
+ "4102838062751704796157456866854813794620023146924181568434486703918224542844053923233919899911519054998554969832861957437850996213216829205401947264294066288";
+ private static final String EC_P521_S =
+ "4857798533181496041050215963883119936300918353498701880968530610687256097257307590162398707429640390843595868713096292822034014722985178583665959048714417342";
+ private static final ECParameterSpec EC_P521_PARAMS = initECParams(
+ "01FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF",
+ "01FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC",
+ "0051953EB9618E1C9A1F929A21A0B68540EEA2DA725B99B315F3B8B489918EF109E156193951EC7E937B1652C0BD3BB1BF073573DF883D2C34F1EF451FD46B503F00",
+ "00C6858E06B70404E9CD9E3ECB662395B4429C648139053FB521F828AF606B4D3DBAA14B5E77EFE75928FE1DC127A2FFA8DE3348B3C1856A429BF97E7E31C2E5BD66",
+ "011839296A789A3BC0045C8A5FB42C7D1BD998F54449579B446817AFBD17273E662C97EE72995EF42640C550B9013FAD0761353C7086A272C24088BE94769FD16650",
+ "01FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA51868783BF2F966B7FCC0148F709A5D03BB5C9B8899C47AEBB6FB71E91386409",
+ 1
+ );
- static {
- final String ec_sfield, ec_a, ec_b, ec_gx, ec_gy, ec_n;
- ec_sfield =
- "FFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF";
- ec_a =
- "FFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFC";
- ec_b =
- "5AC635D8AA3A93E7B3EBBD55769886BC651D06B0CC53B0F63BCE3C3E27D2604B";
- ec_gx =
- "6B17D1F2E12C4247F8BCE6E563A440F277037D812DEB33A0F4A13945D898C296";
- ec_gy =
- "4FE342E2FE1A7F9B8EE7EB4A7C0F9E162BCE33576B315ECECBB6406837BF51F5";
- ec_n =
- "FFFFFFFF00000000FFFFFFFFFFFFFFFFBCE6FAADA7179E84F3B9CAC2FC632551";
- final int ec_h = 1;
- final ECField ec_field = new ECFieldFp(bigInt(ec_sfield));
- final EllipticCurve ec_curve = new EllipticCurve(ec_field,
- bigInt(ec_a), bigInt(ec_b));
- final ECPoint ec_g = new ECPoint(bigInt(ec_gx), bigInt(ec_gy));
- EC_PARAMS = new ECParameterSpec(ec_curve, ec_g, bigInt(ec_n), ec_h);
+ private static ECParameterSpec initECParams(
+ String sfield, String a, String b, String gx, String gy,
+ String n, int h) {
+ ECField field = new ECFieldFp(bigInt(sfield));
+ EllipticCurve curve = new EllipticCurve(field,
+ bigInt(a), bigInt(b));
+ ECPoint g = new ECPoint(bigInt(gx), bigInt(gy));
+ return new ECParameterSpec(curve, g, bigInt(n), h);
}
private static BigInteger bigInt(String s) {
@@ -1253,11 +1300,32 @@
return kf.generatePublic(kspec);
}
- private static PublicKey getECPublicKey() throws Exception {
+ private static PublicKey getECPublicKey(String curve) throws Exception {
KeyFactory kf = KeyFactory.getInstance("EC");
- KeySpec kspec = new ECPublicKeySpec(new ECPoint(new BigInteger(EC_X),
- new BigInteger(EC_Y)),
- EC_PARAMS);
+ String x, y;
+ ECParameterSpec params;
+ switch (curve) {
+ case "P256":
+ x = EC_P256_X;
+ y = EC_P256_Y;
+ params = EC_P256_PARAMS;
+ break;
+ case "P384":
+ x = EC_P384_X;
+ y = EC_P384_Y;
+ params = EC_P384_PARAMS;
+ break;
+ case "P521":
+ x = EC_P521_X;
+ y = EC_P521_Y;
+ params = EC_P521_PARAMS;
+ break;
+ default:
+ throw new Exception("Unsupported curve: " + curve);
+ }
+ KeySpec kspec = new ECPublicKeySpec(new ECPoint(new BigInteger(x),
+ new BigInteger(y)),
+ params);
return kf.generatePublic(kspec);
}
@@ -1287,9 +1355,27 @@
return kf.generatePrivate(kspec);
}
- private static PrivateKey getECPrivateKey() throws Exception {
+ private static PrivateKey getECPrivateKey(String curve) throws Exception {
+ String s;
+ ECParameterSpec params;
+ switch (curve) {
+ case "P256":
+ s = EC_P256_S;
+ params = EC_P256_PARAMS;
+ break;
+ case "P384":
+ s = EC_P384_S;
+ params = EC_P384_PARAMS;
+ break;
+ case "P521":
+ s = EC_P521_S;
+ params = EC_P521_PARAMS;
+ break;
+ default:
+ throw new Exception("Unsupported curve: " + curve);
+ }
KeyFactory kf = KeyFactory.getInstance("EC");
- KeySpec kspec = new ECPrivateKeySpec(new BigInteger(EC_S), EC_PARAMS);
+ KeySpec kspec = new ECPrivateKeySpec(new BigInteger(s), params);
return kf.generatePrivate(kspec);
}
--- a/jdk/test/javax/xml/crypto/dsig/ValidationTests.java Thu May 21 10:07:38 2015 -0700
+++ b/jdk/test/javax/xml/crypto/dsig/ValidationTests.java Thu May 21 16:20:20 2015 -0700
@@ -23,7 +23,7 @@
/**
* @test
- * @bug 4635230 6365103 6366054 6824440 7131084 8046724
+ * @bug 4635230 6365103 6366054 6824440 7131084 8046724 8079693
* @summary Basic unit tests for validating XML Signatures with JSR 105
* @compile -XDignore.symbol.file KeySelectors.java SignatureValidator.java
* X509KeySelector.java ValidationTests.java
@@ -35,6 +35,7 @@
import java.security.*;
import javax.xml.crypto.Data;
import javax.xml.crypto.KeySelector;
+import javax.xml.crypto.MarshalException;
import javax.xml.crypto.OctetStreamData;
import javax.xml.crypto.URIDereferencer;
import javax.xml.crypto.URIReference;
@@ -60,9 +61,17 @@
static class Test {
String file;
KeySelector ks;
- Test(String file, KeySelector ks) {
+ Class exception;
+
+ Test(String file, KeySelector ks, Class exception) {
this.file = file;
this.ks = ks;
+ this.exception = exception;
+ }
+
+ // XMLSignatureException is expected by default
+ Test(String file, KeySelector ks) {
+ this(file, ks, XMLSignatureException.class);
}
}
@@ -91,6 +100,8 @@
new Test("signature-enveloping-dsa.xml", KVKS),
new Test("signature-enveloping-rsa.xml", KVKS),
new Test("signature-enveloping-p256-sha1.xml", KVKS),
+ new Test("signature-enveloping-p384-sha1.xml", KVKS),
+ new Test("signature-enveloping-p521-sha1.xml", KVKS),
new Test("signature-enveloping-hmac-sha1.xml", SKKS),
new Test("signature-external-dsa.xml", KVKS),
new Test("signature-external-b64-dsa.xml", KVKS),
@@ -110,7 +121,17 @@
private final static Test[] INVALID_TESTS = {
new Test("signature-enveloping-hmac-sha1-40.xml", SKKS),
new Test("signature-enveloping-hmac-sha1-trunclen-0-attack.xml", SKKS),
- new Test("signature-enveloping-hmac-sha1-trunclen-8-attack.xml", SKKS)
+ new Test("signature-enveloping-hmac-sha1-trunclen-8-attack.xml", SKKS),
+ new Test("signature-extra-text-in-signed-info.xml", SKKS,
+ MarshalException.class),
+ new Test("signature-wrong-canonicalization-method-algorithm.xml", SKKS,
+ MarshalException.class),
+ new Test("signature-wrong-transform-algorithm.xml", SKKS,
+ MarshalException.class),
+ new Test("signature-no-reference-uri.xml", SKKS),
+ new Test("signature-wrong-signature-method-algorithm.xml", SKKS,
+ MarshalException.class),
+ new Test("signature-wrong-tag-names.xml", SKKS, MarshalException.class)
};
public static void main(String args[]) throws Exception {
@@ -143,9 +164,14 @@
test_signature(test);
System.out.println("FAILED");
atLeastOneFailed = true;
- } catch (XMLSignatureException xse) {
- System.out.println(xse.getMessage());
- System.out.println("PASSED");
+ } catch (Exception e) {
+ System.out.println("Exception: " + e);
+ if (e.getClass() != test.exception) {
+ System.out.println("FAILED: unexpected exception");
+ atLeastOneFailed = true;
+ } else {
+ System.out.println("PASSED");
+ }
}
}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/xml/crypto/dsig/data/signature-enveloping-p384-sha1.xml Thu May 21 16:20:20 2015 -0700
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?><Signature xmlns="http://www.w3.org/2000/09/xmldsig#"><SignedInfo><CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"/><SignatureMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#ecdsa-sha1"/><Reference URI="#object"><DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/><DigestValue>7/XTsHaBSOnJ/jXD5v0zL6VKYsk=</DigestValue></Reference></SignedInfo><SignatureValue>s15F4ng4a+TfNHlK+y18igexSe3wRspeyQi8hwhyMUh6I6kyzxO1wcqRulFyBNwh/Dplht+WS9dO
+GwL4xfDfozKss36ZsHACI3EYe0QI6pN7hcKp511muPI+cmoZzIN/</SignatureValue><KeyInfo><KeyValue><ECKeyValue xmlns="http://www.w3.org/2009/xmldsig11#"><NamedCurve URI="urn:oid:1.3.132.0.34"/><PublicKey>BE7my2bSrGpZ3jNFQ1I6baGP9CE4AIMIyN/ugWhbsCQz8ntwXf15NStBt9MBXolglXbRYMqV8vYB
+f7UJ1ixum8hzcEvgShn0L9l1VkWaU4bYr/Ss9ApimDvbF2g6Mw++sA==</PublicKey></ECKeyValue></KeyValue></KeyInfo><Object Id="object">some text</Object></Signature>
\ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/xml/crypto/dsig/data/signature-enveloping-p521-sha1.xml Thu May 21 16:20:20 2015 -0700
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?><Signature xmlns="http://www.w3.org/2000/09/xmldsig#"><SignedInfo><CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"/><SignatureMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#ecdsa-sha1"/><Reference URI="#object"><DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/><DigestValue>7/XTsHaBSOnJ/jXD5v0zL6VKYsk=</DigestValue></Reference></SignedInfo><SignatureValue>AaVkRumHXD0vVtkn2ogcAoByVge1KWGVWE6vph+xr/hcZTqNNaiIyXb7Itu0FBHD9M47T/CuM7y4
+m60zEssaaHl0AUNm7xGpZy7Heqaoibb/gMU1ErrfSNs7yuPG/TCqs8YAd3RGnc6ZbloitWpycGCU
+LS4xxKms0KeRnbVpjk5OeVfK</SignatureValue><KeyInfo><KeyValue><ECKeyValue xmlns="http://www.w3.org/2009/xmldsig11#"><NamedCurve URI="urn:oid:1.3.132.0.35"/><PublicKey>BAE2HJjBQRbl0sdGa1+1cJwxtPJXcnrRdmRXs6TEQmU97US+CK0vsoDQtlnXxDx37mawN7Sh4Atp
+CUeYBbzvBmwPfQEyAO600W9xn4s5wSQvXod8v8brh5ISXhxYPFy3SCcGUxbQYqrVUnBrIXH8WEQX
+K0/T+FdF4CzlQswJY0UZGeQYcA==</PublicKey></ECKeyValue></KeyValue></KeyInfo><Object Id="object">some text</Object></Signature>
\ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/xml/crypto/dsig/data/signature-external-rsa.xml Thu May 21 16:20:20 2015 -0700
@@ -0,0 +1,3 @@
+<test xmlns="http://example.org/envelope">test<Signature xmlns="http://www.w3.org/2000/09/xmldsig#"><SignedInfo xmlns="http://www.w3.org/2000/09/xmldsig#"><CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"></CanonicalizationMethod><SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1"></SignatureMethod><Reference URI="http://oracle.com"><Transforms><Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"></Transform></Transforms><DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"></DigestMethod><DigestValue>1Bq8FsjajUBYPD7stQeJSc66GlM=</DigestValue></Reference></SignedInfo><SignatureValue>f6trDCcPsLLkIV/V4DGFbRf8b9Jwal8xGBDshNzEXwPmym2ChN85rbKIg/cbunf04F89/SXLo2v9
+AYjLcUr3G/Vz5YUmqNhnBvJukXgsIG0ddWl3mFi9Tk+CLINlbgfsaFqU9pQwFjmDyAqIrvZYqW7p
+rTHLetv218mbUVBBAkc=</SignatureValue></Signature></test>
\ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/xml/crypto/dsig/data/signature-extra-text-in-signed-info.xml Thu May 21 16:20:20 2015 -0700
@@ -0,0 +1,3 @@
+<test xmlns="http://example.org/envelope">test<Signature xmlns="http://www.w3.org/2000/09/xmldsig#"><SignedInfo xmlns="http://www.w3.org/2000/09/xmldsig#"><CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"></CanonicalizationMethod><SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1"></SignatureMethod><Reference URI=""><Transforms><Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"></Transform></Transforms><DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"></DigestMethod><DigestValue>1Bq8FsjajUBYPD7stQeJSc66GlM=</DigestValue><test>extra text</test></Reference></SignedInfo><SignatureValue>iTrgJERmYeD5hFwY8/MwJpkF+nd++AAOgf/Kxt9SwdE6BIYq2Vyxq4CQPhD+t2971BGTgvF6ejZd
++/Ko4Zs5Dqf4Lt65Vck0q43rM0PdP1e8gJov0IPYnZ1zeqFpah+N/OjmqTbshaZWRIjf3eqS6en5
+ZKjn+TkCQ1kOX/YUNDc=</SignatureValue></Signature></test>
\ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/xml/crypto/dsig/data/signature-no-reference-uri.xml Thu May 21 16:20:20 2015 -0700
@@ -0,0 +1,3 @@
+<test xmlns="http://example.org/envelope">test<Signature xmlns="http://www.w3.org/2000/09/xmldsig#"><SignedInfo xmlns="http://www.w3.org/2000/09/xmldsig#"><CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"></CanonicalizationMethod><SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1"></SignatureMethod><Reference><Transforms><Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"></Transform></Transforms><DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"></DigestMethod><DigestValue>1Bq8FsjajUBYPD7stQeJSc66GlM=</DigestValue></Reference></SignedInfo><SignatureValue>BNPSYlNcyXcO/Tc1tr9mQ/KAZ40eFybLTDyB/HH1EHHMpc972A+nOX2EWBaLsVgG8apl0Isp1ZqV
+gmoDHNF6xrcJJQVydVJzU08GVV4GiXHMqRYQbted7STQLhlhssvNNdMEoVApsX5ByL66wxKZQXrT
+z1kZtOHAi88DOrmIJu0=</SignatureValue></Signature></test>
\ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/xml/crypto/dsig/data/signature-wrong-canonicalization-method-algorithm.xml Thu May 21 16:20:20 2015 -0700
@@ -0,0 +1,3 @@
+<test xmlns="http://example.org/envelope">test<Signature xmlns="http://www.w3.org/2000/09/xmldsig#"><SignedInfo xmlns="http://www.w3.org/2000/09/xmldsig#"><CanonicalizationMethod Algorithm="http://oracle.com"></CanonicalizationMethod><SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1"></SignatureMethod><Reference URI=""><Transforms><Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"></Transform></Transforms><DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"></DigestMethod><DigestValue>1Bq8FsjajUBYPD7stQeJSc66GlM=</DigestValue></Reference></SignedInfo><SignatureValue>EBbyEV7e+1CTUsyCTyxiN8p+U3/za1oTjK7q+kF8Q87r8e/7C1z4ndGWbk6zyI3w6leT+I2suW9U
+KkdvkrDXX2OyLw0GfgJfLkNn+1pGK6kyWpL95NoWJZhHkUAKKBZ0ikfZ4j33gYxrYK+IYCLeZYzr
+hlZjdXXXCiSH0Sq+weQ=</SignatureValue></Signature></test>
\ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/xml/crypto/dsig/data/signature-wrong-signature-method-algorithm.xml Thu May 21 16:20:20 2015 -0700
@@ -0,0 +1,3 @@
+<test xmlns="http://example.org/envelope">test<Signature xmlns="http://www.w3.org/2000/09/xmldsig#"><SignedInfo xmlns="http://www.w3.org/2000/09/xmldsig#"><CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"></CanonicalizationMethod><SignatureMethod Algorithm="bogus://bogus"></SignatureMethod><Reference URI=""><Transforms><Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"></Transform></Transforms><DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"></DigestMethod><DigestValue>1Bq8FsjajUBYPD7stQeJSc66GlM=</DigestValue></Reference></SignedInfo><SignatureValue>RjL9nfQg9u6+KEFfAlBBH7E7ilFgB7YEQ5MxOIJN/fOdQmc5iDD+YuhiHzNGXGi/UOyo6t8LxTxl
+X4oFE1RNlPVkSAZK4LcTWhVa757WwgW1/EZo8PQYWp5NScLq6PumYaujoovSYBKW2N6+jQpnD/L6
+4cuEVNnwEFqvOLrjogY=</SignatureValue></Signature></test>
\ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/xml/crypto/dsig/data/signature-wrong-tag-names.xml Thu May 21 16:20:20 2015 -0700
@@ -0,0 +1,3 @@
+<test xmlns="http://example.org/envelope">test<Signature xmlns="http://www.w3.org/2000/09/xmldsig#"><aSignedInfo xmlns="http://www.w3.org/2000/09/xmldsig#"><aCanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"></aCanonicalizationMethod><aSignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1"></aSignatureMethod><aReference URI=""><Transforms><aTransform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"></aTransform></Transforms><aDigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"></aDigestMethod><aDigestValue>1Bq8FsjajUBYPD7stQeJSc66GlM=</aDigestValue></aReference></aSignedInfo><aSignatureValue>cbNpPGavhM0BGUtrvLxvy2SCIt+I27BPpVEt0Q9mXrdPYurMqWF/67AdY9m5RqS7+ZZlwUtem083
+MczRYbKoOIq7sMbCqKKdzbSE/U6rfmky/ACQ5wgemZl8jtipwu5LhAUzjhzT8hhTjVqOYpHdkVJz
+l9dnd9eWbLmEr3BI0VA=</aSignatureValue></Signature></test>
\ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/xml/crypto/dsig/data/signature-wrong-transform-algorithm.xml Thu May 21 16:20:20 2015 -0700
@@ -0,0 +1,4 @@
+<!-- This XML signature contains a Transform with wrong algorithm -->
+<test xmlns="http://example.org/envelope">test<Signature xmlns="http://www.w3.org/2000/09/xmldsig#"><SignedInfo xmlns="http://www.w3.org/2000/09/xmldsig#"><CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"></CanonicalizationMethod><SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1"></SignatureMethod><Reference URI=""><Transforms><Transform Algorithm="bogus://bogus"></Transform></Transforms><DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"></DigestMethod><DigestValue>1Bq8FsjajUBYPD7stQeJSc66GlM=</DigestValue></Reference></SignedInfo><SignatureValue>Wzyx3jgEKGwY+pBXBmqWLWhASHQYCCGZVii5sKKKeZUBKxNBthjiSVfzKANuLgX6zAt16XRycrSL
+zFKTPuvGeWVPDvd+KTNKCJxN9ccrG7v23EM7RY2eMJGu2r5DLfKwV7H6YuJPsOuWifVkKAhvq7gd
+6akJshxyAj9Ud+mjo48=</SignatureValue></Signature></test>
\ No newline at end of file
--- a/jdk/test/sun/management/jmxremote/bootstrap/CustomLauncherTest.java Thu May 21 10:07:38 2015 -0700
+++ b/jdk/test/sun/management/jmxremote/bootstrap/CustomLauncherTest.java Thu May 21 16:20:20 2015 -0700
@@ -111,6 +111,8 @@
try {
String[] launcher = getLauncher();
+ if (launcher == null) return; // launcher not available for the tested platform; skip
+
System.out.println("Starting custom launcher:");
System.out.println("=========================");
System.out.println(" launcher : " + launcher[0]);
--- a/jdk/test/sun/nio/cs/FindDecoderBugs.java Thu May 21 10:07:38 2015 -0700
+++ b/jdk/test/sun/nio/cs/FindDecoderBugs.java Thu May 21 16:20:20 2015 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2008, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2008, 2015, Oracle and/or its affiliates. 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
@@ -24,16 +24,19 @@
/*
* @test
* @bug 6380723
- * @summary Decode many byte sequences in many ways
+ * @summary Decode many byte sequences in many ways (use -Dseed=X to set PRNG seed)
+ * @library /lib/testlibrary
+ * @build jdk.testlibrary.*
* @run main/timeout=1800 FindDecoderBugs
* @author Martin Buchholz
- * @key randomness
+ * @key intermittent randomness
*/
import java.util.*;
import java.util.regex.*;
import java.nio.*;
import java.nio.charset.*;
+import jdk.testlibrary.RandomFactory;
public class FindDecoderBugs {
@@ -322,7 +325,7 @@
}
}
- private final static Random rnd = new Random();
+ private final static Random rnd = RandomFactory.getRandom();
private static byte randomByte() {
return (byte) rnd.nextInt(0x100);
}
--- a/jdk/test/sun/nio/cs/FindEncoderBugs.java Thu May 21 10:07:38 2015 -0700
+++ b/jdk/test/sun/nio/cs/FindEncoderBugs.java Thu May 21 16:20:20 2015 -0700
@@ -25,15 +25,18 @@
* @test
* @bug 6233345 6381699 6381702 6381705 6381706
* @summary Encode many char sequences in many ways
+ * @library /lib/testlibrary/
+ * @build jdk.testlibrary.*
* @run main/timeout=1200 FindEncoderBugs
* @author Martin Buchholz
- * @key randomness
+ * @key randomness intermittent
*/
import java.util.*;
import java.util.regex.*;
import java.nio.*;
import java.nio.charset.*;
+import jdk.testlibrary.RandomFactory;
public class FindEncoderBugs {
@@ -456,7 +459,7 @@
}
}
- private final static Random rnd = new Random();
+ private final static Random rnd = RandomFactory.getRandom();
private static char randomChar() {
return (char) rnd.nextInt(Character.MAX_VALUE);
}
--- a/jdk/test/sun/nio/cs/TestStringCoding.java Thu May 21 10:07:38 2015 -0700
+++ b/jdk/test/sun/nio/cs/TestStringCoding.java Thu May 21 16:20:20 2015 -0700
@@ -22,7 +22,7 @@
*/
/* @test
- @bug 6636323 6636319 7040220 7096080 7183053
+ @bug 6636323 6636319 7040220 7096080 7183053 8080248
@summary Test if StringCoding and NIO result have the same de/encoding result
* @run main/othervm/timeout=2000 TestStringCoding
* @key randomness
@@ -200,6 +200,17 @@
*/
}
+ //encode mappable surrogates for hkscs
+ if (cs.name().equals("Big5-HKSCS") || cs.name().equals("x-MS950-HKSCS")) {
+ String str = "ab\uD840\uDD0Ccd";
+ byte[] expected = new byte[] {(byte)'a', (byte)'b',
+ (byte)0x88, (byte)0x45, (byte)'c', (byte)'d' };
+ if (!Arrays.equals(str.getBytes(cs.name()), expected) ||
+ !Arrays.equals(str.getBytes(cs), expected)) {
+ throw new RuntimeException("encode(surrogates) failed -> "
+ + cs.name());
+ }
+ }
}
static class PermissiveSecurityManger extends SecurityManager {
--- a/jdk/test/sun/security/krb5/auto/HttpNegotiateServer.java Thu May 21 10:07:38 2015 -0700
+++ b/jdk/test/sun/security/krb5/auto/HttpNegotiateServer.java Thu May 21 16:20:20 2015 -0700
@@ -40,21 +40,34 @@
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
+import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.InetSocketAddress;
import java.net.PasswordAuthentication;
import java.net.Proxy;
import java.net.URL;
-import java.security.PrivilegedExceptionAction;
+import java.net.URLConnection;
+import java.security.*;
import java.util.HashMap;
import java.util.Map;
import javax.security.auth.Subject;
+import javax.security.auth.callback.Callback;
+import javax.security.auth.callback.CallbackHandler;
+import javax.security.auth.callback.NameCallback;
+import javax.security.auth.callback.PasswordCallback;
+import javax.security.auth.callback.UnsupportedCallbackException;
+import javax.security.auth.login.AppConfigurationEntry;
+import javax.security.auth.login.Configuration;
+import javax.security.auth.login.LoginContext;
+import javax.security.auth.login.LoginException;
+import javax.security.auth.login.AppConfigurationEntry.LoginModuleControlFlag;
import org.ietf.jgss.GSSContext;
import org.ietf.jgss.GSSCredential;
import org.ietf.jgss.GSSManager;
import sun.security.jgss.GSSUtil;
import sun.security.krb5.Config;
+import java.util.Base64;
import sun.util.logging.PlatformLogger;
import java.util.Base64;
@@ -197,7 +210,7 @@
proxyUrl = new URL("http://nosuchplace/a/b/c");
try {
- Exception e1 = null, e2 = null;
+ Exception e1 = null, e2 = null, e3 = null;
try {
test6578647();
} catch (Exception e) {
@@ -210,7 +223,14 @@
e2 = e;
e.printStackTrace();
}
- if (e1 != null || e2 != null) {
+ try {
+ test8077155();
+ } catch (Exception e) {
+ e3 = e;
+ e.printStackTrace();
+ }
+
+ if (e1 != null || e2 != null || e3 != null) {
throw new RuntimeException("Test error");
}
} finally {
@@ -254,6 +274,121 @@
}
}
+ static void testConnect() {
+ InputStream inputStream = null;
+ try {
+ URL url = webUrl;
+
+ URLConnection conn = url.openConnection();
+ conn.connect();
+ inputStream = conn.getInputStream();
+ byte[] b = new byte[inputStream.available()];
+ for (int j = 0; j < b.length; j++) {
+ b[j] = (byte) inputStream.read();
+ }
+ String s = new String(b);
+ System.out.println("Length: " + s.length());
+ System.out.println(s);
+ } catch (Exception ex) {
+ throw new RuntimeException(ex);
+ } finally {
+ if (inputStream != null) {
+ try {
+ inputStream.close();
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+ }
+ }
+
+ static void test8077155() throws Exception {
+ final String username = WEB_USER;
+ final char[] password = WEB_PASS;
+
+ SecurityManager security = new SecurityManager();
+ Policy.setPolicy(new SecurityPolicy());
+ System.setSecurityManager(security);
+
+ CallbackHandler callback = new CallbackHandler() {
+ @Override
+ public void handle(Callback[] pCallbacks) throws IOException, UnsupportedCallbackException {
+ for (Callback cb : pCallbacks) {
+ if (cb instanceof NameCallback) {
+ NameCallback ncb = (NameCallback)cb;
+ ncb.setName(username);
+
+ } else if (cb instanceof PasswordCallback) {
+ PasswordCallback pwdcb = (PasswordCallback) cb;
+ pwdcb.setPassword(password);
+ }
+ }
+ }
+
+ };
+
+ final String jaasConfigName = "oracle.test.kerberos.login";
+ final String krb5LoginModule = "com.sun.security.auth.module.Krb5LoginModule";
+
+ Configuration loginConfig = new Configuration() {
+ @Override
+ public AppConfigurationEntry[] getAppConfigurationEntry(String name) {
+ if (! jaasConfigName.equals(name)) {
+ return new AppConfigurationEntry[0];
+ }
+
+ Map<String, String> options = new HashMap<String, String>();
+ options.put("useTicketCache", Boolean.FALSE.toString());
+ options.put("useKeyTab", Boolean.FALSE.toString());
+
+ return new AppConfigurationEntry[] {
+ new AppConfigurationEntry(krb5LoginModule,
+ LoginModuleControlFlag.REQUIRED,
+ options)
+ };
+ }
+ };
+
+ // oracle context/subject/login
+ LoginContext context = null;
+ try {
+ context = new LoginContext("oracle.test.kerberos.login", null, callback, loginConfig);
+ context.login();
+
+ } catch (LoginException ex) {
+ ex.printStackTrace();
+ throw new RuntimeException(ex);
+ }
+
+
+ Subject subject = context.getSubject();
+
+ final PrivilegedExceptionAction<Object> test_action = new PrivilegedExceptionAction<Object>() {
+ public Object run() throws Exception {
+ testConnect();
+ return null;
+ }
+ };
+
+ System.err.println("\n\nExpecting to succeed when executing with the the logged in subject.");
+
+ try {
+ Subject.doAs(subject, test_action);
+ System.err.println("\n\nConnection succeed when executing with the the logged in subject.");
+ } catch (PrivilegedActionException e) {
+ System.err.println("\n\nFailure unexpected when executing with the the logged in subject.");
+ e.printStackTrace();
+ throw new RuntimeException("Failed to login as subject");
+ }
+
+ try {
+ System.err.println("\n\nExpecting to fail when running with the current user's login.");
+ testConnect();
+ } catch (Exception ex) {
+ System.err.println("\nConnect failed when running with the current user's login:\n" + ex.getMessage());
+ }
+ }
+
/**
* Creates and starts an HTTP or proxy server that requires
* Negotiate authentication.
@@ -366,3 +501,22 @@
}
}
}
+
+class SecurityPolicy extends Policy {
+
+ private static Permissions perms;
+
+ public SecurityPolicy() {
+ super();
+ if (perms == null) {
+ perms = new Permissions();
+ perms.add(new AllPermission());
+ }
+ }
+
+ @Override
+ public PermissionCollection getPermissions(CodeSource codesource) {
+ return perms;
+ }
+
+}
--- a/jdk/test/sun/security/krb5/config/ConfPlusProp.java Thu May 21 10:07:38 2015 -0700
+++ b/jdk/test/sun/security/krb5/config/ConfPlusProp.java Thu May 21 16:20:20 2015 -0700
@@ -35,6 +35,12 @@
public class ConfPlusProp {
Config config;
public static void main(String[] args) throws Exception {
+ if (System.getenv("USERDNSDOMAIN") != null ||
+ System.getenv("LOGONSERVER") != null) {
+ System.out.println(
+ "Looks like a Windows machine in a domain. Skip test.");
+ return;
+ }
new ConfPlusProp().run();
}
@@ -90,23 +96,8 @@
check("R2", "old");
check("R3", null);
- int version = System.getProperty("java.version").charAt(2) - '0';
- System.out.println("JDK version is " + version);
-
- // Zero-config is supported since 1.7
- if (version >= 7) {
- // Point to a non-existing file
- System.setProperty("java.security.krb5.conf", "i-am-not-a file");
- refresh();
-
- // Default realm might come from DNS
- //checkDefaultRealm(null);
- check("R1", null);
- check("R2", null);
- check("R3", null);
- if (config.get("libdefaults", "forwardable") != null) {
- throw new Exception("Extra config error");
- }
+ if (config.get("libdefaults", "forwardable") != null) {
+ throw new Exception("Extra config error");
}
// Add prop
@@ -136,14 +127,6 @@
check("R2", "k2");
check("R3", "k2");
- // Point to a non-existing file
- System.setProperty("java.security.krb5.conf", "i-am-not-a file");
- refresh();
-
- checkDefaultRealm("R2");
- check("R1", "k2");
- check("R2", "k2");
- check("R3", "k2");
if (config.get("libdefaults", "forwardable") != null) {
throw new Exception("Extra config error");
}
--- a/jdk/test/sun/security/krb5/config/DNS.java Thu May 21 10:07:38 2015 -0700
+++ b/jdk/test/sun/security/krb5/config/DNS.java Thu May 21 16:20:20 2015 -0700
@@ -23,12 +23,22 @@
// See dns.sh.
import sun.security.krb5.Config;
+import sun.security.krb5.KrbException;
public class DNS {
public static void main(String[] args) throws Exception {
System.setProperty("java.security.krb5.conf",
- System.getProperty("test.src", ".") +"/nothing.conf");
+ System.getProperty("test.src", ".") +"/no-such-file.conf");
Config config = Config.getInstance();
+ try {
+ String r = config.getDefaultRealm();
+ throw new Exception("What? There is a default realm " + r + "?");
+ } catch (KrbException ke) {
+ ke.printStackTrace();
+ if (ke.getCause() != null) {
+ throw new Exception("There should be no cause. Won't try DNS");
+ }
+ }
String kdcs = config.getKDCList("X");
if (!kdcs.equals("a.com.:88 b.com.:99") &&
!kdcs.equals("a.com. b.com.:99")) {
--- a/jdk/test/sun/security/krb5/config/DnsFallback.java Thu May 21 10:07:38 2015 -0700
+++ b/jdk/test/sun/security/krb5/config/DnsFallback.java Thu May 21 16:20:20 2015 -0700
@@ -22,8 +22,7 @@
*/
/*
* @test
- * @bug 6673164
- * @bug 6552334
+ * @bug 6673164 6552334 8077102
* @run main/othervm DnsFallback
* @summary fix dns_fallback parse error, and use dns by default
*/
@@ -35,47 +34,66 @@
public class DnsFallback {
static Method useDNS_Realm;
+ static Method useDNS_KDC;
public static void main(String[] args) throws Exception {
useDNS_Realm = Config.class.getDeclaredMethod("useDNS_Realm");
useDNS_Realm.setAccessible(true);
+ useDNS_KDC = Config.class.getDeclaredMethod("useDNS_KDC");
+ useDNS_KDC.setAccessible(true);
// for 6673164
- check("true", "true", true);
- check("false", "true", false);
- check("true", "false", true);
- check("false", "false", false);
- check("true", null, true);
- check("false", null, false);
- check(null, "true", true);
- check(null, "false", false);
+ check("true", "true", true, true);
+ check("false", "true", false, false);
+ check("true", "false", true, true);
+ check("false", "false", false, false);
+ check("true", null, true, true);
+ check("false", null, false, false);
+ check(null, "true", true, true);
+ check(null, "false", false, false);
- // for 6552334
- check(null, null, true);
+ // for 6552334, no longer true
+ //check(null, null, true, true);
+
+ // 8077102
+ check(null, null, false, true);
}
- static void check(String realm, String fallback, boolean output)
+ /**
+ * Sets and checks.
+ *
+ * @param u dns_lookup_XXX value set, none if null
+ * @param f dns_fallback value set, none if null
+ * @param r expected useDNS_Realm
+ * @param k expected useDNS_KDC
+ */
+ static void check(String u, String f, boolean r, boolean k)
throws Exception {
try (PrintStream ps =
new PrintStream(new FileOutputStream("dnsfallback.conf"))) {
ps.println("[libdefaults]\n");
- if (realm != null) {
- ps.println("dns_lookup_realm=" + realm);
+ if (u != null) {
+ ps.println("dns_lookup_realm=" + u);
+ ps.println("dns_lookup_kdc=" + u);
}
- if (fallback != null) {
- ps.println("dns_fallback=" + fallback);
+ if (f != null) {
+ ps.println("dns_fallback=" + f);
}
}
System.setProperty("java.security.krb5.conf", "dnsfallback.conf");
Config.refresh();
- System.out.println("Testing " + realm + ", " + fallback + ", " + output);
+ System.out.println("Testing " + u + ", " + f + ", " + r + ", " + k);
- if (!useDNS_Realm.invoke(Config.getInstance()).equals(output)) {
- throw new Exception("Fail");
+ if (!useDNS_Realm.invoke(Config.getInstance()).equals(r)) {
+ throw new Exception("useDNS_Realm Fail");
+ }
+
+ if (!useDNS_KDC.invoke(Config.getInstance()).equals(k)) {
+ throw new Exception("useDNS_KDC Fail");
}
}
}
--- a/jdk/test/sun/security/krb5/config/confplusprop.conf Thu May 21 10:07:38 2015 -0700
+++ b/jdk/test/sun/security/krb5/config/confplusprop.conf Thu May 21 16:20:20 2015 -0700
@@ -1,7 +1,7 @@
[libdefaults]
default_realm = R1
forwardable = well
-dns_lookup_realm = false
+dns_lookup_kdc = false
[realms]
R1 = {
--- a/jdk/test/sun/security/krb5/config/confplusprop2.conf Thu May 21 10:07:38 2015 -0700
+++ b/jdk/test/sun/security/krb5/config/confplusprop2.conf Thu May 21 16:20:20 2015 -0700
@@ -1,5 +1,5 @@
[libdefaults]
-dns_lookup_realm = false
+dns_lookup_kdc = false
[realms]
R1 = {
--- a/jdk/test/sun/tools/common/ApplicationSetup.sh Thu May 21 10:07:38 2015 -0700
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,210 +0,0 @@
-#!/bin/sh
-
-#
-# Copyright (c) 2005, 2012, Oracle and/or its affiliates. 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
-# or visit www.oracle.com if you need additional information or have any
-# questions.
-#
-
-
-# Support functions to start, stop, wait for or kill a given SimpleApplication
-
-# Starts a given app as background process, usage:
-# startApplication <class> port-file [args...]
-#
-# The following variables are set:
-#
-# appJavaPid - application's Java pid
-# appOtherPid - pid associated with the app other than appJavaPid
-# appPidList - all pids associated with the app
-# appOutput - file containing stdout and stderr from the app
-#
-# Waits for at least one line of output from the app to indicate
-# that it is up and running.
-#
-startApplication()
-{
- appOutput="${TESTCLASSES}/Application.out"
-
- ${JAVA} -XX:+UsePerfData -classpath "${TESTCLASSPATH:-${TESTCLASSES}}" "$@" > "$appOutput" 2>&1 &
- appJavaPid="$!"
- appOtherPid=
- appPidList="$appJavaPid"
-
- echo "INFO: waiting for $1 to initialize..."
- _cnt=0
- while true; do
- # if the app doesn't start then the JavaTest/JTREG timeout will
- # kick in so this isn't really a endless loop
- sleep 1
- out=`tail -1 "$appOutput"`
- if [ -n "$out" ]; then
- # we got some output from the app so it's running
- break
- fi
- _cnt=`expr $_cnt + 1`
- echo "INFO: waited $_cnt second(s) ..."
- done
- unset _cnt
-
- if $isWindows; then
- # Windows requires special handling
- appOtherPid="$appJavaPid"
-
- if $isCygwin; then
- appJavaPid=`ps -p "$appOtherPid" \
- | sed -n '
- # See if $appOtherPid is in PID column; there are sometimes
- # non-blanks in column 1 (I and S observed so far)
- /^.'"${PATTERN_WS}${PATTERN_WS}*${appOtherPid}${PATTERN_WS}"'/{
- # strip PID column
- s/^.'"${PATTERN_WS}${PATTERN_WS}*${appOtherPid}${PATTERN_WS}${PATTERN_WS}"'*//
- # strip PPID column
- s/^[1-9][0-9]*'"${PATTERN_WS}${PATTERN_WS}"'*//
- # strip PGID column
- s/^[1-9][0-9]*'"${PATTERN_WS}${PATTERN_WS}"'*//
- # strip everything after WINPID column
- s/'"${PATTERN_WS}"'.*//
- p
- q
- }
- '`
- echo "INFO: Cygwin pid=$appOtherPid maps to Windows pid=$appJavaPid"
- else
- # show PID, PPID and COMM columns only
- appJavaPid=`ps -o pid,ppid,comm \
- | sed -n '
- # see if appOtherPid is in either PID or PPID columns
- /'"${PATTERN_WS}${appOtherPid}${PATTERN_WS}"'/{
- # see if this is a java command
- /java'"${PATTERN_EOL}"'/{
- # strip leading white space
- s/^'"${PATTERN_WS}${PATTERN_WS}"'*//
- # strip everything after the first word
- s/'"${PATTERN_WS}"'.*//
- # print the pid and we are done
- p
- q
- }
- }
- '`
- echo "INFO: MKS shell pid=$appOtherPid; Java pid=$appJavaPid"
- fi
-
- if [ -z "$appJavaPid" ]; then
- echo "ERROR: could not find app's Java pid." >&2
- killApplication
- exit 2
- fi
- appPidList="$appOtherPid $appJavaPid"
- fi
-
- echo "INFO: $1 is process $appJavaPid"
- echo "INFO: $1 output is in $appOutput"
-}
-
-
-# Stops a simple application by invoking ShutdownSimpleApplication
-# class with a specific port-file, usage:
-# stopApplication port-file
-#
-# Note: When this function returns, the SimpleApplication (or a subclass)
-# may still be running because the application has not yet reached the
-# shutdown check.
-#
-stopApplication()
-{
- $JAVA -XX:+UsePerfData -classpath "${TESTCLASSPATH:-${TESTCLASSES}}" ShutdownSimpleApplication $1
-}
-
-
-# Wait for a simple application to stop running.
-#
-waitForApplication() {
- if [ $isWindows = false ]; then
- # non-Windows is easy; just one process
- echo "INFO: waiting for $appJavaPid"
- set +e
- wait "$appJavaPid"
- set -e
-
- elif $isCygwin; then
- # Cygwin pid and not the Windows pid
- echo "INFO: waiting for $appOtherPid"
- set +e
- wait "$appOtherPid"
- set -e
-
- else # implied isMKS
- # MKS has intermediate shell and Java process
- echo "INFO: waiting for $appJavaPid"
-
- # appJavaPid can be empty if pid search in startApplication() failed
- if [ -n "$appJavaPid" ]; then
- # only need to wait for the Java process
- set +e
- wait "$appJavaPid"
- set -e
- fi
- fi
-}
-
-
-# Kills a simple application by sending a SIGTERM to the appropriate
-# process(es); on Windows SIGQUIT (-9) is used.
-#
-killApplication()
-{
- if [ $isWindows = false ]; then
- # non-Windows is easy; just one process
- echo "INFO: killing $appJavaPid"
- set +e
- kill -TERM "$appJavaPid" # try a polite SIGTERM first
- sleep 2
- # send SIGQUIT (-9) just in case SIGTERM didn't do it
- # but don't show any complaints
- kill -QUIT "$appJavaPid" > /dev/null 2>&1
- wait "$appJavaPid"
- set -e
-
- elif $isCygwin; then
- # Cygwin pid and not the Windows pid
- echo "INFO: killing $appOtherPid"
- set +e
- kill -9 "$appOtherPid"
- wait "$appOtherPid"
- set -e
-
- else # implied isMKS
- # MKS has intermediate shell and Java process
- echo "INFO: killing $appPidList"
- set +e
- kill -9 $appPidList
- set -e
-
- # appJavaPid can be empty if pid search in startApplication() failed
- if [ -n "$appJavaPid" ]; then
- # only need to wait for the Java process
- set +e
- wait "$appJavaPid"
- set -e
- fi
- fi
-}
--- a/jdk/test/sun/tools/common/CommonSetup.sh Thu May 21 10:07:38 2015 -0700
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,131 +0,0 @@
-#!/bin/sh
-
-#
-# Copyright (c) 2005, 2012, Oracle and/or its affiliates. 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
-# or visit www.oracle.com if you need additional information or have any
-# questions.
-#
-
-
-# Common setup for tool tests and other tests that use jtools.
-# Checks that TESTJAVA, TESTSRC, and TESTCLASSES environment variables are set.
-#
-# Creates the following constants for use by the caller:
-# JAVA - java launcher
-# JHAT - jhat utility
-# JINFO - jinfo utility
-# JMAP - jmap utility
-# JPS - jps utility
-# JSTACK - jstack utility
-# JCMD - jcmd utility
-# OS - operating system name
-# PATTERN_EOL - grep or sed end-of-line pattern
-# PATTERN_WS - grep or sed whitespace pattern
-# PS - path separator (";" or ":")
-#
-# Sets the following variables:
-#
-# isCygwin - true if environment is Cygwin
-# isMKS - true if environment is MKS
-# isLinux - true if OS is Linux
-# isSolaris - true if OS is Solaris
-# isWindows - true if OS is Windows
-# isMacos - true if OS is Macos X
-# isAIX - true if OS is AIX
-
-
-if [ -z "${TESTJAVA}" ]; then
- echo "ERROR: TESTJAVA not set. Test cannot execute. Failed."
- exit 1
-fi
-
-if [ -z "${TESTSRC}" ]; then
- echo "ERROR: TESTSRC not set. Test cannot execute. Failed."
- exit 1
-fi
-
-if [ -z "${TESTCLASSES}" ]; then
- echo "ERROR: TESTCLASSES not set. Test cannot execute. Failed."
- exit 1
-fi
-
-# only enable these after checking the expected incoming env variables
-set -eu
-
-JAVA="${TESTJAVA}/bin/java"
-JHAT="${TESTJAVA}/bin/jhat"
-JINFO="${TESTJAVA}/bin/jinfo"
-JMAP="${TESTJAVA}/bin/jmap"
-JPS="${TESTJAVA}/bin/jps"
-JSTACK="${TESTJAVA}/bin/jstack"
-JCMD="${TESTJAVA}/bin/jcmd"
-
-isCygwin=false
-isMKS=false
-isLinux=false
-isSolaris=false
-isUnknownOS=false
-isWindows=false
-isMacos=false
-isAIX=false
-
-OS=`uname -s`
-
-# start with some UNIX like defaults
-PATTERN_EOL='$'
-# blank and tab
-PATTERN_WS='[ ]'
-PS=":"
-
-case "$OS" in
- CYGWIN* )
- OS="Windows"
- PATTERN_EOL='[
]*$'
- # blank and tab
- PATTERN_WS='[ \t]'
- isCygwin=true
- isWindows=true
- ;;
- Linux )
- OS="Linux"
- isLinux=true
- ;;
- Darwin )
- OS="Mac OS X"
- isMacos=true
- ;;
- SunOS )
- OS="Solaris"
- isSolaris=true
- ;;
- AIX )
- OS="AIX"
- isAIX=true
- ;;
- Windows* )
- OS="Windows"
- PATTERN_EOL='[
]*$'
- PS=";"
- isWindows=true
- ;;
- * )
- isUnknownOS=true
- ;;
-esac
--- a/jdk/test/sun/tools/common/ShutdownSimpleApplication.java Thu May 21 10:07:38 2015 -0700
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,76 +0,0 @@
-/*
- * Copyright (c) 2005, 2010, Oracle and/or its affiliates. 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-/*
- * Used to shutdown SimpleApplication (or a subclass). The argument to
- * this class is the name of a file that contains the TCP port number
- * on which SimpleApplication (or a subclass) is listening.
- *
- * Note: When this program returns, the SimpleApplication (or a subclass)
- * may still be running because the application has not yet reached the
- * shutdown check.
- */
-import java.net.Socket;
-import java.net.InetSocketAddress;
-import java.io.File;
-import java.io.FileInputStream;
-
-public class ShutdownSimpleApplication {
- public static void main(String args[]) throws Exception {
-
- if (args.length != 1) {
- throw new RuntimeException("Usage: ShutdownSimpleApplication" +
- " port-file");
- }
-
- // read the (TCP) port number from the given file
-
- File f = new File(args[0]);
- FileInputStream fis = new FileInputStream(f);
- byte b[] = new byte[8];
- int n = fis.read(b);
- if (n < 1) {
- throw new RuntimeException("Empty port-file");
- }
- fis.close();
-
- String str = new String(b, 0, n, "UTF-8");
- System.out.println("INFO: Port number of SimpleApplication: " + str);
- int port = Integer.parseInt(str);
-
- // Now connect to the port (which will shutdown application)
-
- System.out.println("INFO: Connecting to port " + port +
- " to shutdown SimpleApplication ...");
- System.out.flush();
-
- Socket s = new Socket();
- s.connect( new InetSocketAddress(port) );
- s.close();
-
- System.out.println("INFO: done connecting to SimpleApplication.");
- System.out.flush();
-
- System.exit(0);
- }
-}
--- a/jdk/test/sun/tools/common/SimpleApplication.java Thu May 21 10:07:38 2015 -0700
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,120 +0,0 @@
-/*
- * Copyright (c) 2005, 2010, Oracle and/or its affiliates. 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-/*
- * A simple application used by unit tests. The first argument to this
- * class is the name of a file to which a TCP port number can be written.
- *
- * By default, this class does nothing other than bind to a TCP port,
- * write the TCP port number to a file, and wait for an incoming connection
- * in order to complete the application shutdown protocol.
- */
-import java.net.Socket;
-import java.net.ServerSocket;
-import java.io.File;
-import java.io.FileOutputStream;
-
-public class SimpleApplication {
- private static SimpleApplication myApp; // simple app or a subclass
- private static String myAppName; // simple app name
- private static int myPort; // coordination port #
- private static ServerSocket mySS; // coordination socket
-
- // protected so a subclass can extend it; not public so creation is
- // limited.
- protected SimpleApplication() {
- // save simple app (or subclass) name for messages
- myAppName = getClass().getName();
- }
-
- // return the simple application (or a subclass)
- final public static SimpleApplication getMyApp() {
- return myApp;
- }
-
- // set the simple application (for use by a subclass)
- final public static void setMyApp(SimpleApplication _myApp) {
- myApp = _myApp;
- }
-
- // execute the application finish protocol
- final public void doMyAppFinish(String[] args) throws Exception {
- System.out.println("INFO: " + myAppName + " is waiting on port: " +
- myPort);
- System.out.flush();
-
- // wait for test harness to connect
- Socket s = mySS.accept();
- s.close();
- mySS.close();
-
- System.out.println("INFO: " + myAppName + " is shutting down.");
- System.out.flush();
- }
-
- // execute the application start protocol
- final public void doMyAppStart(String[] args) throws Exception {
- if (args.length < 1) {
- throw new RuntimeException("Usage: " + myAppName +
- " port-file [arg(s)]");
- }
-
- // bind to a random port
- mySS = new ServerSocket(0);
- myPort = mySS.getLocalPort();
-
- // Write the port number to the given file
- File f = new File(args[0]);
- FileOutputStream fos = new FileOutputStream(f);
- fos.write( Integer.toString(myPort).getBytes("UTF-8") );
- fos.close();
-
- System.out.println("INFO: " + myAppName + " created socket on port: " +
- myPort);
- System.out.flush();
- }
-
- // execute the app work (subclass can override this)
- public void doMyAppWork(String[] args) throws Exception {
- }
-
- public static void main(String[] args) throws Exception {
- if (myApp == null) {
- // create myApp since a subclass hasn't done so
- myApp = new SimpleApplication();
- }
-
- myApp.doMyAppStart(args); // do the app start protocol
-
- System.out.println("INFO: " + myAppName + " is calling doMyAppWork()");
- System.out.flush();
- myApp.doMyAppWork(args); // do the app work
- System.out.println("INFO: " + myAppName + " returned from" +
- " doMyAppWork()");
- System.out.flush();
-
- myApp.doMyAppFinish(args); // do the app finish protocol
-
- System.exit(0);
- }
-}
--- a/jdk/test/sun/tools/common/SleeperApplication.java Thu May 21 10:07:38 2015 -0700
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,59 +0,0 @@
-/*
- * Copyright (c) 2010, Oracle and/or its affiliates. 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-/*
- * An example subclass of SimpleApplication that illustrates how to
- * override the doMyAppWork() method.
- */
-
-public class SleeperApplication extends SimpleApplication {
- public static int DEFAULT_SLEEP_TIME = 60; // time is in seconds
-
- // execute the sleeper app work
- public void doMyAppWork(String[] args) throws Exception {
- int sleep_time = DEFAULT_SLEEP_TIME;
-
- // args[0] is the port-file
- if (args.length < 2) {
- System.out.println("INFO: using default sleep time of "
- + sleep_time + " seconds.");
- } else {
- try {
- sleep_time = Integer.parseInt(args[1]);
- } catch (NumberFormatException nfe) {
- throw new RuntimeException("Error: '" + args[1] +
- "': is not a valid seconds value.");
- }
- }
-
- Thread.sleep(sleep_time * 1000); // our "work" is to sleep
- }
-
- public static void main(String[] args) throws Exception {
- SleeperApplication myApp = new SleeperApplication();
-
- SimpleApplication.setMyApp(myApp);
-
- SimpleApplication.main(args);
- }
-}
--- a/jdk/test/sun/tools/jhat/HatHeapDump1Test.java Thu May 21 10:07:38 2015 -0700
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,89 +0,0 @@
-/*
- * Copyright (c) 2005, 2015, Oracle and/or its affiliates. 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-import java.io.File;
-import java.util.Arrays;
-
-import jdk.testlibrary.Asserts;
-import jdk.testlibrary.JDKToolLauncher;
-import jdk.testlibrary.OutputAnalyzer;
-import jdk.testlibrary.ProcessTools;
-
-/* @test
- * @bug 5102009
- * @summary Sanity test of jhat functionality
- * @library /lib/testlibrary
- * @modules java.management
- * @build jdk.testlibarary.*
- * @compile -g HelloWorld.java
- * @run main HatHeapDump1Test
- */
-public class HatHeapDump1Test {
-
- private static final String TEST_CLASSES = System.getProperty("test.classes", ".");
-
- public static void main(String args[]) throws Exception {
- String className = "HelloWorld";
- File dumpFile = new File(className + ".hdump");
-
- // Generate a heap dump
- ProcessBuilder processBuilder = ProcessTools.createJavaProcessBuilder("-cp",
- TEST_CLASSES,
- "-Xcheck:jni",
- "-Xverify:all",
- "-agentlib:hprof=heap=dump,format=b,file=" + dumpFile.getAbsolutePath(),
- className);
- OutputAnalyzer output = ProcessTools.executeProcess(processBuilder);
- System.out.println(output.getOutput());
- output.shouldHaveExitValue(0);
- output.shouldContain("Dumping Java heap ... done");
- Asserts.assertTrue(dumpFile.exists() && dumpFile.isFile(), "Invalid dump file " + dumpFile.getAbsolutePath());
-
- // Run jhat to analyze the heap dump
- output = jhat("-debug", "2", dumpFile.getAbsolutePath());
- output.shouldHaveExitValue(0);
- output.shouldContain("Snapshot resolved");
- output.shouldContain("-debug 2 was used");
- output.shouldNotContain("ERROR");
-
- dumpFile.delete();
- }
-
- private static OutputAnalyzer jhat(String... toolArgs) throws Exception {
- JDKToolLauncher launcher = JDKToolLauncher.createUsingTestJDK("jhat");
- if (toolArgs != null) {
- for (String toolArg : toolArgs) {
- launcher.addToolArg(toolArg);
- }
- }
-
- ProcessBuilder processBuilder = new ProcessBuilder();
- processBuilder.command(launcher.getCommand());
- System.out.println(Arrays.toString(processBuilder.command().toArray()).replace(",", ""));
- OutputAnalyzer output = ProcessTools.executeProcess(processBuilder);
- System.out.println(output.getOutput());
-
- return output;
- }
-
-}
--- a/jdk/test/sun/tools/jhat/HelloWorld.java Thu May 21 10:07:38 2015 -0700
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,51 +0,0 @@
-/*
- * Copyright (c) 2005, Oracle and/or its affiliates. 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-
-/*
- *
- * Sample target application.
- *
- */
-
-public class HelloWorld {
- public static void main(String args[]) {
-
- /* Use a generic type */
- java.util.List<String> l = new java.util.ArrayList<String>();
- String.format("%s", "");
-
- /* Just some code with branches */
- try {
- if ( args.length == 0 ) {
- System.out.println("No arguments passed in");
- } else {
- System.out.println("Some arguments passed in");
- }
- } catch ( Throwable e ) {
- System.out.println("ERROR: System.out.println() did a throw");
- } finally {
- System.out.println("Hello, world!");
- }
- }
-}
--- a/jdk/test/sun/tools/jhat/ParseTest.sh Thu May 21 10:07:38 2015 -0700
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,69 +0,0 @@
-#!/bin/sh
-
-#
-# Copyright (c) 2006, 2010, Oracle and/or its affiliates. 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
-# or visit www.oracle.com if you need additional information or have any
-# questions.
-#
-
-
-# @test
-# @summary Testing jhat parsing against pre-created dump files.
-# see also: README.TXT
-
-# @library ../common
-# @run shell ParseTest.sh
-
-. ${TESTSRC}/../common/CommonSetup.sh
-
-# all return statuses are checked in this test
-set +e
-
-failed=0
-
-DUMPFILE="minimal.bin"
-
-${JHAT} -parseonly true ${TESTSRC}/${DUMPFILE}
-if [ $? != 0 ]; then failed=1; fi
-
-DUMPFILE="jmap.bin"
-
-${JHAT} -parseonly true ${TESTSRC}/${DUMPFILE}
-if [ $? != 0 ]; then failed=1; fi
-
-DUMPFILE="hprof.bin"
-
-${JHAT} -parseonly true ${TESTSRC}/${DUMPFILE}
-if [ $? != 0 ]; then failed=1; fi
-
-# try something that is not heapdump and expect to fail!
-DUMPFILE="ParseTest.sh"
-
-${JHAT} -parseonly true ${TESTSRC}/${DUMPFILE}
-if [ $? = 0 ]; then failed=1; fi
-
-# try something that does not exist and expect to fail!
-DUMPFILE="FileThatDoesNotExist"
-
-${JHAT} -parseonly true ${TESTSRC}/${DUMPFILE}
-if [ $? = 0 ]; then failed=1; fi
-
-exit $failed
-
--- a/jdk/test/sun/tools/jhat/README.TXT Thu May 21 10:07:38 2015 -0700
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,16 +0,0 @@
-#
-
-jhat heap dump parsing tests:
-
-There are three hprof binary format dump files in this directory.
-These dumps were created by jmap and hprof profiler against a
-simple infinite looping Java program.
-
-1. minimal.bin - minimal dump that has nothing! - not even java.lang.Class!
- - This was created by java -Xrunhprof:format=b,heap=sites MainClass.
-
-2. jmap.bin - created by jmap -dump option
-
-3. hprof.bin - created by java -Xrunhprof:heap=all,format=b MainClass
-
-We can run jhat -parseonly true <dump-file> against these dumps.
--- a/jdk/test/sun/tools/jmap/BasicJMapTest.java Thu May 21 10:07:38 2015 -0700
+++ b/jdk/test/sun/tools/jmap/BasicJMapTest.java Thu May 21 16:20:20 2015 -0700
@@ -21,10 +21,13 @@
* questions.
*/
+import static jdk.testlibrary.Asserts.assertTrue;
+import static jdk.testlibrary.Asserts.fail;
+
import java.io.File;
import java.util.Arrays;
-import static jdk.testlibrary.Asserts.*;
+import jdk.test.lib.hprof.HprofParser;
import jdk.testlibrary.JDKToolLauncher;
import jdk.testlibrary.OutputAnalyzer;
import jdk.testlibrary.ProcessTools;
@@ -34,8 +37,13 @@
* @bug 6321286
* @summary Unit test for jmap utility
* @library /lib/testlibrary
+ * @library /../../test/lib/share/classes
* @modules java.management
* @build jdk.testlibrary.*
+ * @build jdk.test.lib.hprof.*
+ * @build jdk.test.lib.hprof.module.*
+ * @build jdk.test.lib.hprof.parser.*
+ * @build jdk.test.lib.hprof.utils.*
* @run main BasicJMapTest
*/
public class BasicJMapTest {
@@ -60,24 +68,38 @@
}
private static void testDump() throws Exception {
- File dump = new File("java_pid$" + ProcessTools.getProcessId() + ".hprof");
- OutputAnalyzer output = jmap("-dump:format=b,file=" + dump.getName());
- output.shouldHaveExitValue(0);
- output.shouldContain("Heap dump file created");
- verifyDumpFile(dump);
+ dump(false);
}
private static void testDumpLive() throws Exception {
- File dump = new File("java_pid$" + ProcessTools.getProcessId() + ".hprof");
- OutputAnalyzer output = jmap("-dump:live,format=b,file=" + dump.getName());
+ dump(true);
+ }
+
+ private static void dump(boolean live) throws Exception {
+ File dump = new File("jmap.dump." + System.currentTimeMillis() + ".hprof");
+ if (dump.exists()) {
+ dump.delete();
+ }
+ OutputAnalyzer output;
+ if (live) {
+ output = jmap("-dump:live,format=b,file=" + dump.getName());
+ } else {
+ output = jmap("-dump:format=b,file=" + dump.getName());
+ }
output.shouldHaveExitValue(0);
output.shouldContain("Heap dump file created");
verifyDumpFile(dump);
+ dump.delete();
}
private static void verifyDumpFile(File dump) {
- assertTrue(dump.exists() && dump.isFile(), "Could not create dump file");
- dump.delete();
+ assertTrue(dump.exists() && dump.isFile(), "Could not create dump file " + dump.getAbsolutePath());
+ try {
+ HprofParser.parse(dump);
+ } catch (Exception e) {
+ e.printStackTrace();
+ fail("Could not parse dump file " + dump.getAbsolutePath());
+ }
}
private static OutputAnalyzer jmap(String... toolArgs) throws Exception {
--- a/jdk/test/tools/launcher/Arrrghs.java Thu May 21 10:07:38 2015 -0700
+++ b/jdk/test/tools/launcher/Arrrghs.java Thu May 21 16:20:20 2015 -0700
@@ -24,7 +24,7 @@
/**
* @test
* @bug 5030233 6214916 6356475 6571029 6684582 6742159 4459600 6758881 6753938
- * 6894719 6968053 7151434 7146424 8007333
+ * 6894719 6968053 7151434 7146424 8007333 8077822
* @summary Argument parsing validation.
* @compile -XDignore.symbol.file Arrrghs.java
* @run main/othervm Arrrghs
@@ -304,6 +304,16 @@
throw new RuntimeException("Error: compiling java wildcards");
}
+ // test if javac (the command) can compile *.java with a vmoption
+ tr = doExec(javacCmd, "-cp", ".",
+ "-J-showversion", "-J-Dsomeproperty=foo",
+ libDir.getName() + File.separator + "*.java");
+ if (!tr.isOK()) {
+ System.out.println(tr);
+ throw new RuntimeException("Error: compiling java wildcards with vmoptions");
+ }
+
+
// use the jar cmd to create jars using the ? wildcard
File jarFoo = new File(libDir, "Foo.jar");
tr = doExec(jarCmd, "cvf", jarFoo.getAbsolutePath(), "lib" + File.separator + "F?o.class");