Mercurial > hg > openjdk > jdk9 > jdk
changeset 12018:4fbcca8ab812 jdk9-b66
Merge
author | lana |
---|---|
date | Thu, 21 May 2015 16:20:20 -0700 |
parents | b4e21fd93f44 (current diff) 8a244f4932b5 (diff) |
children | 4bdba5e53c9a 148e69936fd1 |
files | src/jdk.dev/share/classes/com/sun/tools/hat/Main.java src/jdk.dev/share/classes/com/sun/tools/hat/internal/model/AbstractJavaHeapObjectVisitor.java src/jdk.dev/share/classes/com/sun/tools/hat/internal/model/ArrayTypeCodes.java src/jdk.dev/share/classes/com/sun/tools/hat/internal/model/HackJavaValue.java src/jdk.dev/share/classes/com/sun/tools/hat/internal/model/JavaBoolean.java src/jdk.dev/share/classes/com/sun/tools/hat/internal/model/JavaByte.java src/jdk.dev/share/classes/com/sun/tools/hat/internal/model/JavaChar.java src/jdk.dev/share/classes/com/sun/tools/hat/internal/model/JavaClass.java src/jdk.dev/share/classes/com/sun/tools/hat/internal/model/JavaDouble.java src/jdk.dev/share/classes/com/sun/tools/hat/internal/model/JavaField.java src/jdk.dev/share/classes/com/sun/tools/hat/internal/model/JavaFloat.java src/jdk.dev/share/classes/com/sun/tools/hat/internal/model/JavaHeapObject.java src/jdk.dev/share/classes/com/sun/tools/hat/internal/model/JavaHeapObjectVisitor.java src/jdk.dev/share/classes/com/sun/tools/hat/internal/model/JavaInt.java src/jdk.dev/share/classes/com/sun/tools/hat/internal/model/JavaLazyReadObject.java src/jdk.dev/share/classes/com/sun/tools/hat/internal/model/JavaLong.java src/jdk.dev/share/classes/com/sun/tools/hat/internal/model/JavaObject.java src/jdk.dev/share/classes/com/sun/tools/hat/internal/model/JavaObjectArray.java src/jdk.dev/share/classes/com/sun/tools/hat/internal/model/JavaObjectRef.java src/jdk.dev/share/classes/com/sun/tools/hat/internal/model/JavaShort.java src/jdk.dev/share/classes/com/sun/tools/hat/internal/model/JavaStatic.java src/jdk.dev/share/classes/com/sun/tools/hat/internal/model/JavaThing.java src/jdk.dev/share/classes/com/sun/tools/hat/internal/model/JavaValue.java src/jdk.dev/share/classes/com/sun/tools/hat/internal/model/JavaValueArray.java src/jdk.dev/share/classes/com/sun/tools/hat/internal/model/ReachableExcludes.java src/jdk.dev/share/classes/com/sun/tools/hat/internal/model/ReachableExcludesImpl.java src/jdk.dev/share/classes/com/sun/tools/hat/internal/model/ReachableObjects.java src/jdk.dev/share/classes/com/sun/tools/hat/internal/model/ReferenceChain.java src/jdk.dev/share/classes/com/sun/tools/hat/internal/model/Root.java src/jdk.dev/share/classes/com/sun/tools/hat/internal/model/Snapshot.java src/jdk.dev/share/classes/com/sun/tools/hat/internal/model/StackFrame.java src/jdk.dev/share/classes/com/sun/tools/hat/internal/model/StackTrace.java src/jdk.dev/share/classes/com/sun/tools/hat/internal/oql/OQLEngine.java src/jdk.dev/share/classes/com/sun/tools/hat/internal/oql/OQLException.java src/jdk.dev/share/classes/com/sun/tools/hat/internal/oql/OQLQuery.java src/jdk.dev/share/classes/com/sun/tools/hat/internal/oql/ObjectVisitor.java src/jdk.dev/share/classes/com/sun/tools/hat/internal/parser/FileReadBuffer.java src/jdk.dev/share/classes/com/sun/tools/hat/internal/parser/HprofReader.java src/jdk.dev/share/classes/com/sun/tools/hat/internal/parser/MappedReadBuffer.java src/jdk.dev/share/classes/com/sun/tools/hat/internal/parser/PositionDataInputStream.java src/jdk.dev/share/classes/com/sun/tools/hat/internal/parser/PositionInputStream.java src/jdk.dev/share/classes/com/sun/tools/hat/internal/parser/ReadBuffer.java src/jdk.dev/share/classes/com/sun/tools/hat/internal/parser/Reader.java src/jdk.dev/share/classes/com/sun/tools/hat/internal/server/AllClassesQuery.java src/jdk.dev/share/classes/com/sun/tools/hat/internal/server/AllRootsQuery.java src/jdk.dev/share/classes/com/sun/tools/hat/internal/server/ClassQuery.java src/jdk.dev/share/classes/com/sun/tools/hat/internal/server/FinalizerObjectsQuery.java src/jdk.dev/share/classes/com/sun/tools/hat/internal/server/FinalizerSummaryQuery.java src/jdk.dev/share/classes/com/sun/tools/hat/internal/server/HistogramQuery.java src/jdk.dev/share/classes/com/sun/tools/hat/internal/server/HttpReader.java src/jdk.dev/share/classes/com/sun/tools/hat/internal/server/InstancesCountQuery.java src/jdk.dev/share/classes/com/sun/tools/hat/internal/server/InstancesQuery.java src/jdk.dev/share/classes/com/sun/tools/hat/internal/server/OQLHelp.java src/jdk.dev/share/classes/com/sun/tools/hat/internal/server/OQLQuery.java src/jdk.dev/share/classes/com/sun/tools/hat/internal/server/ObjectQuery.java src/jdk.dev/share/classes/com/sun/tools/hat/internal/server/PlatformClasses.java src/jdk.dev/share/classes/com/sun/tools/hat/internal/server/QueryHandler.java src/jdk.dev/share/classes/com/sun/tools/hat/internal/server/QueryListener.java src/jdk.dev/share/classes/com/sun/tools/hat/internal/server/ReachableQuery.java src/jdk.dev/share/classes/com/sun/tools/hat/internal/server/RefsByTypeQuery.java src/jdk.dev/share/classes/com/sun/tools/hat/internal/server/RootStackQuery.java src/jdk.dev/share/classes/com/sun/tools/hat/internal/server/RootsQuery.java src/jdk.dev/share/classes/com/sun/tools/hat/internal/util/ArraySorter.java src/jdk.dev/share/classes/com/sun/tools/hat/internal/util/Comparer.java src/jdk.dev/share/classes/com/sun/tools/hat/internal/util/CompositeEnumeration.java src/jdk.dev/share/classes/com/sun/tools/hat/internal/util/Misc.java src/jdk.dev/share/classes/com/sun/tools/hat/internal/util/VectorSorter.java src/jdk.dev/share/classes/com/sun/tools/hat/resources/hat.js src/jdk.dev/share/classes/com/sun/tools/hat/resources/oqlhelp.html src/jdk.dev/share/classes/com/sun/tools/hat/resources/platform_names.txt test/com/sun/management/HotSpotDiagnosticMXBean/DumpHeap.sh test/sun/tools/common/ApplicationSetup.sh test/sun/tools/common/CommonSetup.sh test/sun/tools/common/ShutdownSimpleApplication.java test/sun/tools/common/SimpleApplication.java test/sun/tools/common/SleeperApplication.java test/sun/tools/jhat/HatHeapDump1Test.java test/sun/tools/jhat/HelloWorld.java test/sun/tools/jhat/ParseTest.sh test/sun/tools/jhat/README.TXT |
diffstat | 309 files changed, 3909 insertions(+), 14173 deletions(-) [+] |
line wrap: on
line diff
--- a/make/CompileDemos.gmk Thu May 21 10:07:38 2015 -0700 +++ b/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/make/launcher/Launcher-jdk.dev.gmk Thu May 21 10:07:38 2015 -0700 +++ b/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/make/lib/Lib-jdk.attach.gmk Thu May 21 10:07:38 2015 -0700 +++ b/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/make/lib/Lib-jdk.management.gmk Thu May 21 10:07:38 2015 -0700 +++ b/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/make/src/classes/build/tools/module/boot.modules Thu May 21 10:07:38 2015 -0700 +++ b/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/src/demo/share/applets.html Thu May 21 10:07:38 2015 -0700 +++ b/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/src/demo/share/jvmti/index.html Thu May 21 10:07:38 2015 -0700 +++ b/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/src/java.base/share/classes/java/lang/Boolean.java Thu May 21 10:07:38 2015 -0700 +++ b/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/src/java.base/share/classes/java/lang/Character.java Thu May 21 10:07:38 2015 -0700 +++ b/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/src/java.base/share/classes/java/lang/Long.java Thu May 21 10:07:38 2015 -0700 +++ b/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/src/java.base/share/classes/java/lang/String.java Thu May 21 10:07:38 2015 -0700 +++ b/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/src/java.base/share/classes/java/security/ProtectionDomain.java Thu May 21 10:07:38 2015 -0700 +++ b/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/src/java.base/share/classes/java/text/ChoiceFormat.java Thu May 21 10:07:38 2015 -0700 +++ b/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/src/java.base/share/classes/java/util/ArrayPrefixHelpers.java Thu May 21 10:07:38 2015 -0700 +++ b/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/src/java.base/share/classes/java/util/Calendar.java Thu May 21 10:07:38 2015 -0700 +++ b/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/src/java.base/share/classes/java/util/Collection.java Thu May 21 10:07:38 2015 -0700 +++ b/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/src/java.base/share/classes/java/util/Locale.java Thu May 21 10:07:38 2015 -0700 +++ b/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/src/java.base/share/classes/java/util/TimeZone.java Thu May 21 10:07:38 2015 -0700 +++ b/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/src/java.base/share/classes/java/util/TreeMap.java Thu May 21 10:07:38 2015 -0700 +++ b/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/src/java.base/share/classes/java/util/concurrent/ConcurrentHashMap.java Thu May 21 10:07:38 2015 -0700 +++ b/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/src/java.base/share/classes/java/util/concurrent/ConcurrentSkipListMap.java Thu May 21 10:07:38 2015 -0700 +++ b/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/src/java.base/share/classes/java/util/concurrent/ForkJoinPool.java Thu May 21 10:07:38 2015 -0700 +++ b/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/src/java.base/share/classes/javax/crypto/interfaces/package.html Thu May 21 10:07:38 2015 -0700 +++ b/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/src/java.base/share/classes/javax/crypto/spec/package.html Thu May 21 10:07:38 2015 -0700 +++ b/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/src/java.base/share/classes/javax/net/ssl/package.html Thu May 21 10:07:38 2015 -0700 +++ b/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/src/java.base/share/classes/jdk/internal/util/xml/impl/Parser.java Thu May 21 10:07:38 2015 -0700 +++ b/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/src/java.base/share/classes/jdk/internal/util/xml/impl/ParserSAX.java Thu May 21 10:07:38 2015 -0700 +++ b/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/src/java.base/share/classes/sun/misc/Cache.java Thu May 21 10:07:38 2015 -0700 +++ b/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/src/java.base/share/classes/sun/misc/CharacterDecoder.java Thu May 21 10:07:38 2015 -0700 +++ b/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/src/java.base/share/classes/sun/misc/CharacterEncoder.java Thu May 21 10:07:38 2015 -0700 +++ b/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/src/java.base/share/classes/sun/misc/ConditionLock.java Thu May 21 10:07:38 2015 -0700 +++ b/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/src/java.base/share/classes/sun/misc/ExtensionDependency.java Thu May 21 10:07:38 2015 -0700 +++ b/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/src/java.base/share/classes/sun/misc/ExtensionInfo.java Thu May 21 10:07:38 2015 -0700 +++ b/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/src/java.base/share/classes/sun/misc/FDBigInteger.java Thu May 21 10:07:38 2015 -0700 +++ b/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/src/java.base/share/classes/sun/misc/FloatingDecimal.java Thu May 21 10:07:38 2015 -0700 +++ b/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/src/java.base/share/classes/sun/misc/IOUtils.java Thu May 21 10:07:38 2015 -0700 +++ b/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/src/java.base/share/classes/sun/misc/JarFilter.java Thu May 21 10:07:38 2015 -0700 +++ b/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/src/java.base/share/classes/sun/misc/JavaLangAccess.java Thu May 21 10:07:38 2015 -0700 +++ b/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/src/java.base/share/classes/sun/misc/Perf.java Thu May 21 10:07:38 2015 -0700 +++ b/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/src/java.base/share/classes/sun/misc/PerfCounter.java Thu May 21 10:07:38 2015 -0700 +++ b/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/src/java.base/share/classes/sun/misc/PerformanceLogger.java Thu May 21 10:07:38 2015 -0700 +++ b/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/src/java.base/share/classes/sun/misc/Resource.java Thu May 21 10:07:38 2015 -0700 +++ b/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/src/java.base/share/classes/sun/misc/Signal.java Thu May 21 10:07:38 2015 -0700 +++ b/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/src/java.base/share/classes/sun/misc/Unsafe.java Thu May 21 10:07:38 2015 -0700 +++ b/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/src/java.base/share/classes/sun/misc/VM.java Thu May 21 10:07:38 2015 -0700 +++ b/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/src/java.base/share/classes/sun/misc/resources/Messages.java Thu May 21 10:07:38 2015 -0700 +++ b/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/src/java.base/share/classes/sun/misc/resources/Messages_de.java Thu May 21 10:07:38 2015 -0700 +++ b/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/src/java.base/share/classes/sun/misc/resources/Messages_es.java Thu May 21 10:07:38 2015 -0700 +++ b/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/src/java.base/share/classes/sun/misc/resources/Messages_fr.java Thu May 21 10:07:38 2015 -0700 +++ b/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/src/java.base/share/classes/sun/misc/resources/Messages_it.java Thu May 21 10:07:38 2015 -0700 +++ b/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/src/java.base/share/classes/sun/misc/resources/Messages_ja.java Thu May 21 10:07:38 2015 -0700 +++ b/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/src/java.base/share/classes/sun/misc/resources/Messages_ko.java Thu May 21 10:07:38 2015 -0700 +++ b/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/src/java.base/share/classes/sun/misc/resources/Messages_pt_BR.java Thu May 21 10:07:38 2015 -0700 +++ b/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/src/java.base/share/classes/sun/misc/resources/Messages_sv.java Thu May 21 10:07:38 2015 -0700 +++ b/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/src/java.base/share/classes/sun/misc/resources/Messages_zh_CN.java Thu May 21 10:07:38 2015 -0700 +++ b/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/src/java.base/share/classes/sun/misc/resources/Messages_zh_TW.java Thu May 21 10:07:38 2015 -0700 +++ b/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/src/java.base/share/classes/sun/net/www/protocol/http/HttpURLConnection.java Thu May 21 10:07:38 2015 -0700 +++ b/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/src/java.base/share/classes/sun/nio/cs/HKSCS.java Thu May 21 10:07:38 2015 -0700 +++ b/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/src/java.base/share/classes/sun/nio/cs/Surrogate.java Thu May 21 10:07:38 2015 -0700 +++ b/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/src/java.base/share/classes/sun/security/x509/AVA.java Thu May 21 10:07:38 2015 -0700 +++ b/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/src/java.base/share/classes/sun/security/x509/AuthorityKeyIdentifierExtension.java Thu May 21 10:07:38 2015 -0700 +++ b/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/src/java.base/share/classes/sun/security/x509/BasicConstraintsExtension.java Thu May 21 10:07:38 2015 -0700 +++ b/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/src/java.base/share/classes/sun/security/x509/CRLDistributionPointsExtension.java Thu May 21 10:07:38 2015 -0700 +++ b/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/src/java.base/share/classes/sun/security/x509/CRLNumberExtension.java Thu May 21 10:07:38 2015 -0700 +++ b/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/src/java.base/share/classes/sun/security/x509/CertException.java Thu May 21 10:07:38 2015 -0700 +++ b/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/src/java.base/share/classes/sun/security/x509/CertificatePoliciesExtension.java Thu May 21 10:07:38 2015 -0700 +++ b/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/src/java.base/share/classes/sun/security/x509/CertificateValidity.java Thu May 21 10:07:38 2015 -0700 +++ b/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/src/java.base/share/classes/sun/security/x509/DistributionPoint.java Thu May 21 10:07:38 2015 -0700 +++ b/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/src/java.base/share/classes/sun/security/x509/DistributionPointName.java Thu May 21 10:07:38 2015 -0700 +++ b/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/src/java.base/share/classes/sun/security/x509/EDIPartyName.java Thu May 21 10:07:38 2015 -0700 +++ b/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/src/java.base/share/classes/sun/security/x509/Extension.java Thu May 21 10:07:38 2015 -0700 +++ b/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/src/java.base/share/classes/sun/security/x509/GeneralSubtree.java Thu May 21 10:07:38 2015 -0700 +++ b/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/src/java.base/share/classes/sun/security/x509/GeneralSubtrees.java Thu May 21 10:07:38 2015 -0700 +++ b/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/src/java.base/share/classes/sun/security/x509/IPAddressName.java Thu May 21 10:07:38 2015 -0700 +++ b/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/src/java.base/share/classes/sun/security/x509/IssuerAlternativeNameExtension.java Thu May 21 10:07:38 2015 -0700 +++ b/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/src/java.base/share/classes/sun/security/x509/IssuingDistributionPointExtension.java Thu May 21 10:07:38 2015 -0700 +++ b/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/src/java.base/share/classes/sun/security/x509/NameConstraintsExtension.java Thu May 21 10:07:38 2015 -0700 +++ b/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/src/java.base/share/classes/sun/security/x509/PolicyConstraintsExtension.java Thu May 21 10:07:38 2015 -0700 +++ b/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/src/java.base/share/classes/sun/security/x509/PolicyInformation.java Thu May 21 10:07:38 2015 -0700 +++ b/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/src/java.base/share/classes/sun/security/x509/PrivateKeyUsageExtension.java Thu May 21 10:07:38 2015 -0700 +++ b/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/src/java.base/share/classes/sun/security/x509/RDN.java Thu May 21 10:07:38 2015 -0700 +++ b/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/src/java.base/share/classes/sun/security/x509/SerialNumber.java Thu May 21 10:07:38 2015 -0700 +++ b/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/src/java.base/share/classes/sun/security/x509/SubjectInfoAccessExtension.java Thu May 21 10:07:38 2015 -0700 +++ b/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/src/java.base/share/classes/sun/security/x509/SubjectKeyIdentifierExtension.java Thu May 21 10:07:38 2015 -0700 +++ b/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/src/java.base/share/classes/sun/security/x509/X500Name.java Thu May 21 10:07:38 2015 -0700 +++ b/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/src/java.base/share/classes/sun/security/x509/X509CRLEntryImpl.java Thu May 21 10:07:38 2015 -0700 +++ b/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/src/java.base/share/classes/sun/security/x509/X509CRLImpl.java Thu May 21 10:07:38 2015 -0700 +++ b/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/src/java.base/share/classes/sun/security/x509/X509CertImpl.java Thu May 21 10:07:38 2015 -0700 +++ b/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/src/java.base/share/classes/sun/security/x509/X509CertInfo.java Thu May 21 10:07:38 2015 -0700 +++ b/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/src/java.base/share/classes/sun/text/CompactByteArray.java Thu May 21 10:07:38 2015 -0700 +++ b/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/src/java.base/share/classes/sun/text/ComposedCharIter.java Thu May 21 10:07:38 2015 -0700 +++ b/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/src/java.base/share/classes/sun/text/Normalizer.java Thu May 21 10:07:38 2015 -0700 +++ b/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/src/java.base/share/classes/sun/text/bidi/BidiBase.java Thu May 21 10:07:38 2015 -0700 +++ b/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/src/java.base/share/classes/sun/text/bidi/BidiRun.java Thu May 21 10:07:38 2015 -0700 +++ b/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/src/java.base/share/classes/sun/text/normalizer/ICUBinary.java Thu May 21 10:07:38 2015 -0700 +++ b/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/src/java.base/share/classes/sun/text/normalizer/IntTrie.java Thu May 21 10:07:38 2015 -0700 +++ b/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/src/java.base/share/classes/sun/text/normalizer/NormalizerBase.java Thu May 21 10:07:38 2015 -0700 +++ b/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/src/java.base/share/classes/sun/text/normalizer/RangeValueIterator.java Thu May 21 10:07:38 2015 -0700 +++ b/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/src/java.base/share/classes/sun/text/normalizer/Replaceable.java Thu May 21 10:07:38 2015 -0700 +++ b/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/src/java.base/share/classes/sun/text/normalizer/ReplaceableString.java Thu May 21 10:07:38 2015 -0700 +++ b/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/src/java.base/share/classes/sun/text/normalizer/ReplaceableUCharacterIterator.java Thu May 21 10:07:38 2015 -0700 +++ b/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/src/java.base/share/classes/sun/text/normalizer/RuleCharacterIterator.java Thu May 21 10:07:38 2015 -0700 +++ b/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/src/java.base/share/classes/sun/text/normalizer/SymbolTable.java Thu May 21 10:07:38 2015 -0700 +++ b/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/src/java.base/share/classes/sun/text/normalizer/Trie.java Thu May 21 10:07:38 2015 -0700 +++ b/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/src/java.base/share/classes/sun/text/normalizer/TrieIterator.java Thu May 21 10:07:38 2015 -0700 +++ b/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/src/java.base/share/classes/sun/text/normalizer/UCharacter.java Thu May 21 10:07:38 2015 -0700 +++ b/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/src/java.base/share/classes/sun/text/normalizer/UCharacterIterator.java Thu May 21 10:07:38 2015 -0700 +++ b/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/src/java.base/share/classes/sun/text/normalizer/UTF16.java Thu May 21 10:07:38 2015 -0700 +++ b/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/src/java.base/share/classes/sun/text/normalizer/UnicodeMatcher.java Thu May 21 10:07:38 2015 -0700 +++ b/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/src/java.base/share/classes/sun/text/normalizer/UnicodeSet.java Thu May 21 10:07:38 2015 -0700 +++ b/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/src/java.base/share/classes/sun/text/normalizer/UnicodeSetIterator.java Thu May 21 10:07:38 2015 -0700 +++ b/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/src/java.base/share/classes/sun/text/normalizer/Utility.java Thu May 21 10:07:38 2015 -0700 +++ b/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/src/java.base/share/classes/sun/text/normalizer/VersionInfo.java Thu May 21 10:07:38 2015 -0700 +++ b/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/src/java.base/unix/classes/sun/nio/fs/UnixChannelFactory.java Thu May 21 10:07:38 2015 -0700 +++ b/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/src/java.base/unix/native/libnio/ch/FileDispatcherImpl.c Thu May 21 10:07:38 2015 -0700 +++ b/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/src/java.base/windows/native/libjli/java_md.c Thu May 21 10:07:38 2015 -0700 +++ b/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/src/java.logging/share/classes/java/util/logging/LogManager.java Thu May 21 10:07:38 2015 -0700 +++ b/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/src/java.logging/share/classes/java/util/logging/package.html Thu May 21 10:07:38 2015 -0700 +++ b/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/src/java.management/share/classes/com/sun/jmx/mbeanserver/DefaultMXBeanMappingFactory.java Thu May 21 10:07:38 2015 -0700 +++ b/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/src/java.management/share/classes/com/sun/jmx/remote/internal/ServerCommunicatorAdmin.java Thu May 21 10:07:38 2015 -0700 +++ b/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/src/java.management/share/classes/com/sun/jmx/remote/util/EnvHelp.java Thu May 21 10:07:38 2015 -0700 +++ b/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/src/java.management/share/classes/javax/management/package.html Thu May 21 10:07:38 2015 -0700 +++ b/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/src/java.management/share/classes/javax/management/remote/package.html Thu May 21 10:07:38 2015 -0700 +++ b/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/src/java.management/share/classes/javax/management/remote/rmi/package.html Thu May 21 10:07:38 2015 -0700 +++ b/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/src/java.management/share/classes/sun/management/HotspotRuntimeMBean.java Thu May 21 10:07:38 2015 -0700 +++ b/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/src/java.management/share/classes/sun/management/HotspotThreadMBean.java Thu May 21 10:07:38 2015 -0700 +++ b/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/src/java.management/share/classes/sun/management/MappedMXBeanType.java Thu May 21 10:07:38 2015 -0700 +++ b/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/src/java.management/share/classes/sun/management/Sensor.java Thu May 21 10:07:38 2015 -0700 +++ b/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/src/java.management/share/classes/sun/management/counter/Counter.java Thu May 21 10:07:38 2015 -0700 +++ b/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/src/java.management/share/classes/sun/management/counter/perf/InstrumentationException.java Thu May 21 10:07:38 2015 -0700 +++ b/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/src/java.management/share/classes/sun/management/jdp/JdpController.java Thu May 21 10:07:38 2015 -0700 +++ b/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/src/java.naming/share/classes/com/sun/jndi/ldap/BasicControl.java Thu May 21 10:07:38 2015 -0700 +++ b/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/src/java.naming/share/classes/com/sun/jndi/ldap/BerDecoder.java Thu May 21 10:07:38 2015 -0700 +++ b/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/src/java.naming/share/classes/com/sun/jndi/ldap/EventQueue.java Thu May 21 10:07:38 2015 -0700 +++ b/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/src/java.naming/share/classes/com/sun/jndi/ldap/EventSupport.java Thu May 21 10:07:38 2015 -0700 +++ b/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/src/java.naming/share/classes/com/sun/jndi/ldap/LdapName.java Thu May 21 10:07:38 2015 -0700 +++ b/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/src/java.naming/share/classes/com/sun/jndi/ldap/LdapReferralException.java Thu May 21 10:07:38 2015 -0700 +++ b/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/src/java.naming/share/classes/com/sun/jndi/ldap/UnsolicitedResponseImpl.java Thu May 21 10:07:38 2015 -0700 +++ b/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/src/java.naming/share/classes/com/sun/jndi/ldap/ext/StartTlsResponseImpl.java Thu May 21 10:07:38 2015 -0700 +++ b/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/src/java.naming/share/classes/com/sun/jndi/ldap/sasl/LdapSasl.java Thu May 21 10:07:38 2015 -0700 +++ b/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/src/java.naming/share/classes/com/sun/jndi/toolkit/ctx/Continuation.java Thu May 21 10:07:38 2015 -0700 +++ b/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/src/java.naming/share/classes/com/sun/jndi/toolkit/ctx/PartialCompositeContext.java Thu May 21 10:07:38 2015 -0700 +++ b/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/src/java.naming/share/classes/com/sun/jndi/toolkit/dir/HierMemDirCtx.java Thu May 21 10:07:38 2015 -0700 +++ b/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/src/java.naming/share/classes/com/sun/jndi/toolkit/dir/SearchFilter.java Thu May 21 10:07:38 2015 -0700 +++ b/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/src/java.naming/share/classes/com/sun/jndi/toolkit/url/GenericURLContext.java Thu May 21 10:07:38 2015 -0700 +++ b/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/src/java.naming/share/classes/com/sun/jndi/toolkit/url/Uri.java Thu May 21 10:07:38 2015 -0700 +++ b/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/src/java.naming/share/classes/javax/naming/directory/package.html Thu May 21 10:07:38 2015 -0700 +++ b/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/src/java.naming/share/classes/javax/naming/event/package.html Thu May 21 10:07:38 2015 -0700 +++ b/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/src/java.naming/share/classes/javax/naming/ldap/package.html Thu May 21 10:07:38 2015 -0700 +++ b/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/src/java.naming/share/classes/javax/naming/package.html Thu May 21 10:07:38 2015 -0700 +++ b/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/src/java.naming/share/classes/javax/naming/spi/package.html Thu May 21 10:07:38 2015 -0700 +++ b/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/src/java.prefs/windows/classes/java/util/prefs/WindowsPreferences.java Thu May 21 10:07:38 2015 -0700 +++ b/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/src/java.rmi/share/classes/com/sun/rmi/rmid/ExecOptionPermission.java Thu May 21 10:07:38 2015 -0700 +++ b/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/src/java.rmi/share/classes/com/sun/rmi/rmid/ExecPermission.java Thu May 21 10:07:38 2015 -0700 +++ b/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/src/java.rmi/share/classes/sun/rmi/log/LogInputStream.java Thu May 21 10:07:38 2015 -0700 +++ b/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/src/java.rmi/share/classes/sun/rmi/log/LogOutputStream.java Thu May 21 10:07:38 2015 -0700 +++ b/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/src/java.rmi/share/classes/sun/rmi/log/ReliableLog.java Thu May 21 10:07:38 2015 -0700 +++ b/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/src/java.rmi/share/classes/sun/rmi/registry/RegistryImpl.java Thu May 21 10:07:38 2015 -0700 +++ b/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/src/java.rmi/share/classes/sun/rmi/runtime/Log.java Thu May 21 10:07:38 2015 -0700 +++ b/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/src/java.rmi/share/classes/sun/rmi/server/ActivationGroupImpl.java Thu May 21 10:07:38 2015 -0700 +++ b/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/src/java.rmi/share/classes/sun/rmi/server/ActivationGroupInit.java Thu May 21 10:07:38 2015 -0700 +++ b/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/src/java.rmi/share/classes/sun/rmi/transport/Channel.java Thu May 21 10:07:38 2015 -0700 +++ b/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/src/java.rmi/share/classes/sun/rmi/transport/LiveRef.java Thu May 21 10:07:38 2015 -0700 +++ b/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/src/java.rmi/share/classes/sun/rmi/transport/proxy/CGIHandler.java Thu May 21 10:07:38 2015 -0700 +++ b/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/src/java.scripting/share/classes/javax/script/Compilable.java Thu May 21 10:07:38 2015 -0700 +++ b/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/src/java.scripting/share/classes/javax/script/SimpleScriptContext.java Thu May 21 10:07:38 2015 -0700 +++ b/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/src/java.scripting/share/classes/javax/script/package.html Thu May 21 10:07:38 2015 -0700 +++ b/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/src/java.security.jgss/share/classes/sun/security/krb5/Config.java Thu May 21 10:07:38 2015 -0700 +++ b/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/src/java.sql.rowset/share/classes/com/sun/rowset/FilteredRowSetImpl.java Thu May 21 10:07:38 2015 -0700 +++ b/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/src/java.sql.rowset/share/classes/com/sun/rowset/JoinRowSetImpl.java Thu May 21 10:07:38 2015 -0700 +++ b/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/src/java.sql.rowset/share/classes/com/sun/rowset/providers/RIOptimisticProvider.java Thu May 21 10:07:38 2015 -0700 +++ b/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/src/java.sql.rowset/share/classes/javax/sql/rowset/serial/SerialBlob.java Thu May 21 10:07:38 2015 -0700 +++ b/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/src/java.sql/share/classes/java/sql/package.html Thu May 21 10:07:38 2015 -0700 +++ b/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/src/java.sql/share/classes/javax/sql/package.html Thu May 21 10:07:38 2015 -0700 +++ b/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/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/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/src/java.xml.crypto/share/classes/org/jcp/xml/dsig/internal/dom/DOMKeyValue.java Thu May 21 10:07:38 2015 -0700 +++ b/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/src/jdk.attach/share/classes/com/sun/tools/attach/package-info.java Thu May 21 10:07:38 2015 -0700 +++ b/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/src/jdk.attach/share/classes/com/sun/tools/attach/spi/AttachProvider.java Thu May 21 10:07:38 2015 -0700 +++ b/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/src/jdk.hprof.agent/unix/native/libhprof/hprof_md.c Thu May 21 10:07:38 2015 -0700 +++ b/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/src/jdk.jdi/share/classes/com/sun/jdi/Accessible.java Thu May 21 10:07:38 2015 -0700 +++ b/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/src/jdk.jdi/share/classes/com/sun/jdi/ClassNotLoadedException.java Thu May 21 10:07:38 2015 -0700 +++ b/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/src/jdk.jdi/share/classes/com/sun/jdi/Locatable.java Thu May 21 10:07:38 2015 -0700 +++ b/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/src/jdk.jdi/share/classes/com/sun/jdi/request/AccessWatchpointRequest.java Thu May 21 10:07:38 2015 -0700 +++ b/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/src/jdk.jdi/share/classes/com/sun/jdi/request/ModificationWatchpointRequest.java Thu May 21 10:07:38 2015 -0700 +++ b/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/src/jdk.jdi/share/classes/jdi-overview.html Thu May 21 10:07:38 2015 -0700 +++ b/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/src/jdk.rmic/share/classes/sun/rmi/rmic/RMIGenerator.java Thu May 21 10:07:38 2015 -0700 +++ b/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/src/jdk.rmic/share/classes/sun/rmi/rmic/RemoteClass.java Thu May 21 10:07:38 2015 -0700 +++ b/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/src/sample/share/jmx/jmx-scandir/index.html Thu May 21 10:07:38 2015 -0700 +++ b/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/test/ProblemList.txt Thu May 21 10:07:38 2015 -0700 +++ b/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/test/TEST.groups Thu May 21 10:07:38 2015 -0700 +++ b/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/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/test/com/sun/jdi/BadHandshakeTest.java Thu May 21 10:07:38 2015 -0700 +++ b/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/test/com/sun/jdi/NoLaunchOptionTest.java Thu May 21 10:07:38 2015 -0700 +++ b/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/test/com/sun/management/HotSpotDiagnosticMXBean/DumpHeap.java Thu May 21 10:07:38 2015 -0700 +++ b/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/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/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/test/java/lang/Runtime/exec/LotsOfOutput.java Thu May 21 10:07:38 2015 -0700 +++ b/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/test/java/lang/invoke/MethodHandles/CatchExceptionTest.java Thu May 21 10:07:38 2015 -0700 +++ b/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/test/java/nio/file/Files/SBC.java Thu May 21 10:07:38 2015 -0700 +++ b/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/test/java/security/KeyStore/ProbeKeystores.java Thu May 21 10:07:38 2015 -0700 +++ b/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/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/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/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/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/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/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/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/test/javax/xml/crypto/dsig/GenerationTests.java Thu May 21 10:07:38 2015 -0700 +++ b/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/test/javax/xml/crypto/dsig/ValidationTests.java Thu May 21 10:07:38 2015 -0700 +++ b/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/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/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/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/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/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/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/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/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/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/test/sun/management/jmxremote/bootstrap/CustomLauncherTest.java Thu May 21 10:07:38 2015 -0700 +++ b/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/test/sun/nio/cs/FindDecoderBugs.java Thu May 21 10:07:38 2015 -0700 +++ b/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/test/sun/nio/cs/FindEncoderBugs.java Thu May 21 10:07:38 2015 -0700 +++ b/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/test/sun/nio/cs/TestStringCoding.java Thu May 21 10:07:38 2015 -0700 +++ b/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/test/sun/security/krb5/auto/HttpNegotiateServer.java Thu May 21 10:07:38 2015 -0700 +++ b/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/test/sun/security/krb5/config/ConfPlusProp.java Thu May 21 10:07:38 2015 -0700 +++ b/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/test/sun/security/krb5/config/DNS.java Thu May 21 10:07:38 2015 -0700 +++ b/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/test/sun/security/krb5/config/DnsFallback.java Thu May 21 10:07:38 2015 -0700 +++ b/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/test/sun/security/krb5/config/confplusprop.conf Thu May 21 10:07:38 2015 -0700 +++ b/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/test/sun/security/krb5/config/confplusprop2.conf Thu May 21 10:07:38 2015 -0700 +++ b/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/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/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/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/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/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/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/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/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/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/test/sun/tools/jmap/BasicJMapTest.java Thu May 21 10:07:38 2015 -0700 +++ b/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/test/tools/launcher/Arrrghs.java Thu May 21 10:07:38 2015 -0700 +++ b/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");