Merge
This commit is contained in:
commit
992a3bfb85
1
jdk/make/data/charsetmapping/IBM1166.c2b
Normal file
1
jdk/make/data/charsetmapping/IBM1166.c2b
Normal file
@ -0,0 +1 @@
|
||||
0x15 U+0085
|
256
jdk/make/data/charsetmapping/IBM1166.map
Normal file
256
jdk/make/data/charsetmapping/IBM1166.map
Normal file
@ -0,0 +1,256 @@
|
||||
0x00 U+0000
|
||||
0x01 U+0001
|
||||
0x02 U+0002
|
||||
0x03 U+0003
|
||||
0x04 U+009c
|
||||
0x05 U+0009
|
||||
0x06 U+0086
|
||||
0x07 U+007f
|
||||
0x08 U+0097
|
||||
0x09 U+008d
|
||||
0x0a U+008e
|
||||
0x0b U+000b
|
||||
0x0c U+000c
|
||||
0x0d U+000d
|
||||
0x0e U+000e
|
||||
0x0f U+000f
|
||||
0x10 U+0010
|
||||
0x11 U+0011
|
||||
0x12 U+0012
|
||||
0x13 U+0013
|
||||
0x14 U+009d
|
||||
0x15 U+000a
|
||||
0x16 U+0008
|
||||
0x17 U+0087
|
||||
0x18 U+0018
|
||||
0x19 U+0019
|
||||
0x1a U+0092
|
||||
0x1b U+008f
|
||||
0x1c U+001c
|
||||
0x1d U+001d
|
||||
0x1e U+001e
|
||||
0x1f U+001f
|
||||
0x20 U+0080
|
||||
0x21 U+0081
|
||||
0x22 U+0082
|
||||
0x23 U+0083
|
||||
0x24 U+0084
|
||||
0x25 U+000a
|
||||
0x26 U+0017
|
||||
0x27 U+001b
|
||||
0x28 U+0088
|
||||
0x29 U+0089
|
||||
0x2a U+008a
|
||||
0x2b U+008b
|
||||
0x2c U+008c
|
||||
0x2d U+0005
|
||||
0x2e U+0006
|
||||
0x2f U+0007
|
||||
0x30 U+0090
|
||||
0x31 U+0091
|
||||
0x32 U+0016
|
||||
0x33 U+0093
|
||||
0x34 U+0094
|
||||
0x35 U+0095
|
||||
0x36 U+0096
|
||||
0x37 U+0004
|
||||
0x38 U+0098
|
||||
0x39 U+0099
|
||||
0x3a U+009a
|
||||
0x3b U+009b
|
||||
0x3c U+0014
|
||||
0x3d U+0015
|
||||
0x3e U+009e
|
||||
0x3f U+001a
|
||||
0x40 U+0020
|
||||
0x41 U+00a0
|
||||
0x42 U+04d9
|
||||
0x43 U+0493
|
||||
0x44 U+0451
|
||||
0x45 U+0454
|
||||
0x46 U+0455
|
||||
0x47 U+0456
|
||||
0x48 U+049b
|
||||
0x49 U+0458
|
||||
0x4a U+005b
|
||||
0x4b U+002e
|
||||
0x4c U+003c
|
||||
0x4d U+0028
|
||||
0x4e U+002b
|
||||
0x4f U+0021
|
||||
0x50 U+0026
|
||||
0x51 U+04a3
|
||||
0x52 U+04e9
|
||||
0x53 U+04b1
|
||||
0x54 U+04af
|
||||
0x55 U+045e
|
||||
0x56 U+04bb
|
||||
0x57 U+042a
|
||||
0x58 U+2116
|
||||
0x59 U+04d8
|
||||
0x5a U+005d
|
||||
0x5b U+0024
|
||||
0x5c U+002a
|
||||
0x5d U+0029
|
||||
0x5e U+003b
|
||||
0x5f U+005e
|
||||
0x60 U+002d
|
||||
0x61 U+002f
|
||||
0x62 U+0492
|
||||
0x63 U+0401
|
||||
0x64 U+0404
|
||||
0x65 U+0405
|
||||
0x66 U+0406
|
||||
0x67 U+049a
|
||||
0x68 U+0408
|
||||
0x69 U+04a2
|
||||
0x6a U+007c
|
||||
0x6b U+002c
|
||||
0x6c U+0025
|
||||
0x6d U+005f
|
||||
0x6e U+003e
|
||||
0x6f U+003f
|
||||
0x70 U+04e8
|
||||
0x71 U+04b0
|
||||
0x72 U+04ae
|
||||
0x73 U+00ad
|
||||
0x74 U+040e
|
||||
0x75 U+04ba
|
||||
0x76 U+044e
|
||||
0x77 U+0430
|
||||
0x78 U+0431
|
||||
0x79 U+0060
|
||||
0x7a U+003a
|
||||
0x7b U+0023
|
||||
0x7c U+0040
|
||||
0x7d U+0027
|
||||
0x7e U+003d
|
||||
0x7f U+0022
|
||||
0x80 U+0446
|
||||
0x81 U+0061
|
||||
0x82 U+0062
|
||||
0x83 U+0063
|
||||
0x84 U+0064
|
||||
0x85 U+0065
|
||||
0x86 U+0066
|
||||
0x87 U+0067
|
||||
0x88 U+0068
|
||||
0x89 U+0069
|
||||
0x8a U+0434
|
||||
0x8b U+0435
|
||||
0x8c U+0444
|
||||
0x8d U+0433
|
||||
0x8e U+0445
|
||||
0x8f U+0438
|
||||
0x90 U+0439
|
||||
0x91 U+006a
|
||||
0x92 U+006b
|
||||
0x93 U+006c
|
||||
0x94 U+006d
|
||||
0x95 U+006e
|
||||
0x96 U+006f
|
||||
0x97 U+0070
|
||||
0x98 U+0071
|
||||
0x99 U+0072
|
||||
0x9a U+043a
|
||||
0x9b U+043b
|
||||
0x9c U+043c
|
||||
0x9d U+043d
|
||||
0x9e U+043e
|
||||
0x9f U+043f
|
||||
0xa0 U+044f
|
||||
0xa1 U+007e
|
||||
0xa2 U+0073
|
||||
0xa3 U+0074
|
||||
0xa4 U+0075
|
||||
0xa5 U+0076
|
||||
0xa6 U+0077
|
||||
0xa7 U+0078
|
||||
0xa8 U+0079
|
||||
0xa9 U+007a
|
||||
0xaa U+0440
|
||||
0xab U+0441
|
||||
0xac U+0442
|
||||
0xad U+0443
|
||||
0xae U+0436
|
||||
0xaf U+0432
|
||||
0xb0 U+044c
|
||||
0xb1 U+044b
|
||||
0xb2 U+0437
|
||||
0xb3 U+0448
|
||||
0xb4 U+044d
|
||||
0xb5 U+0449
|
||||
0xb6 U+0447
|
||||
0xb7 U+044a
|
||||
0xb8 U+042e
|
||||
0xb9 U+0410
|
||||
0xba U+0411
|
||||
0xbb U+0426
|
||||
0xbc U+0414
|
||||
0xbd U+0415
|
||||
0xbe U+0424
|
||||
0xbf U+0413
|
||||
0xc0 U+007b
|
||||
0xc1 U+0041
|
||||
0xc2 U+0042
|
||||
0xc3 U+0043
|
||||
0xc4 U+0044
|
||||
0xc5 U+0045
|
||||
0xc6 U+0046
|
||||
0xc7 U+0047
|
||||
0xc8 U+0048
|
||||
0xc9 U+0049
|
||||
0xca U+0425
|
||||
0xcb U+0418
|
||||
0xcc U+0419
|
||||
0xcd U+041a
|
||||
0xce U+041b
|
||||
0xcf U+041c
|
||||
0xd0 U+007d
|
||||
0xd1 U+004a
|
||||
0xd2 U+004b
|
||||
0xd3 U+004c
|
||||
0xd4 U+004d
|
||||
0xd5 U+004e
|
||||
0xd6 U+004f
|
||||
0xd7 U+0050
|
||||
0xd8 U+0051
|
||||
0xd9 U+0052
|
||||
0xda U+041d
|
||||
0xdb U+041e
|
||||
0xdc U+041f
|
||||
0xdd U+042f
|
||||
0xde U+0420
|
||||
0xdf U+0421
|
||||
0xe0 U+005c
|
||||
0xe1 U+20ac
|
||||
0xe2 U+0053
|
||||
0xe3 U+0054
|
||||
0xe4 U+0055
|
||||
0xe5 U+0056
|
||||
0xe6 U+0057
|
||||
0xe7 U+0058
|
||||
0xe8 U+0059
|
||||
0xe9 U+005a
|
||||
0xea U+0422
|
||||
0xeb U+0423
|
||||
0xec U+0416
|
||||
0xed U+0412
|
||||
0xee U+042c
|
||||
0xef U+042b
|
||||
0xf0 U+0030
|
||||
0xf1 U+0031
|
||||
0xf2 U+0032
|
||||
0xf3 U+0033
|
||||
0xf4 U+0034
|
||||
0xf5 U+0035
|
||||
0xf6 U+0036
|
||||
0xf7 U+0037
|
||||
0xf8 U+0038
|
||||
0xf9 U+0039
|
||||
0xfa U+0417
|
||||
0xfb U+0428
|
||||
0xfc U+042d
|
||||
0xfd U+0429
|
||||
0xfe U+0427
|
||||
0xff U+009f
|
1
jdk/make/data/charsetmapping/IBM1166.nr
Normal file
1
jdk/make/data/charsetmapping/IBM1166.nr
Normal file
@ -0,0 +1 @@
|
||||
0x25 U+000a
|
@ -503,7 +503,7 @@ charset x-windows-874 MS874
|
||||
|
||||
charset x-EUC-TW EUC_TW
|
||||
package sun.nio.cs.ext
|
||||
type source
|
||||
type template
|
||||
alias euc_tw # JDK historical
|
||||
alias euctw
|
||||
alias cns11643
|
||||
@ -1660,6 +1660,16 @@ charset IBM290 IBM290
|
||||
alias EBCDIC-JP-kana
|
||||
alias 290
|
||||
|
||||
charset x-IBM1166 IBM1166
|
||||
package sun.nio.cs.ext
|
||||
type sbcs
|
||||
hisname Cp1166
|
||||
ascii false
|
||||
alias cp1166
|
||||
alias ibm1166
|
||||
alias ibm-1166
|
||||
alias 1166
|
||||
|
||||
charset x-IBM300 IBM300
|
||||
package sun.nio.cs.ext
|
||||
type dbcsonly
|
||||
@ -1816,3 +1826,17 @@ charset x-JIS0212_MS5022X JIS_X_0212_MS5022X
|
||||
ascii false
|
||||
minmax 0x21 0x7e 0x21 0x7e
|
||||
internal true # "internal implementation
|
||||
|
||||
########################################################
|
||||
#
|
||||
# platform specific charsets, to be registered into spi
|
||||
##
|
||||
########################################################
|
||||
|
||||
charset x-COMPOUND_TEXT COMPOUND_TEXT
|
||||
package sun.nio.cs.ext
|
||||
type source
|
||||
os unix
|
||||
alias COMPOUND_TEXT # JDK historical
|
||||
alias x11-compound_text
|
||||
alias x-compound-text
|
||||
|
@ -57,6 +57,7 @@ IBM1146 IBM01146 Cp1146 false sun.nio.cs.ext
|
||||
IBM1147 IBM01147 Cp1147 false sun.nio.cs.ext
|
||||
IBM1148 IBM01148 Cp1148 false sun.nio.cs.ext
|
||||
IBM1149 IBM01149 Cp1149 false sun.nio.cs.ext
|
||||
IBM1166 x-IBM1166 Cp1166 false sun.nio.cs.ext
|
||||
IBM273 IBM273 Cp273 false sun.nio.cs.ext
|
||||
IBM277 IBM277 Cp277 false sun.nio.cs.ext
|
||||
IBM278 IBM278 Cp278 false sun.nio.cs.ext
|
||||
|
@ -9,6 +9,7 @@ EUC_KR
|
||||
EUC_JP
|
||||
EUC_JP_LINUX
|
||||
EUC_JP_Open
|
||||
EUC_TW
|
||||
GBK
|
||||
ISO_8859_11
|
||||
ISO_8859_3
|
||||
|
@ -50,7 +50,9 @@ $(CHARSET_DONE_CS)-extcs: $(CHARSET_DATA_DIR)/charsets \
|
||||
$(TOOL_CHARSETMAPPING) $(CHARSET_DATA_DIR) $(CHARSET_GENSRC_JAVA_DIR_CS) \
|
||||
extcs charsets $(CHARSET_STANDARD_OS) \
|
||||
$(CHARSET_EXTENDED_JAVA_TEMPLATES) \
|
||||
$(CHARSET_EXTENDED_JAVA_DIR) $(LOG_INFO)
|
||||
$(CHARSET_EXTENDED_JAVA_DIR) \
|
||||
$(CHARSET_COPYRIGHT_HEADER) \
|
||||
$(LOG_INFO)
|
||||
$(TOUCH) '$@'
|
||||
|
||||
$(CHARSET_DONE_CS)-hkscs: $(CHARSET_COPYRIGHT_HEADER)/HKSCS.java \
|
||||
|
@ -32,6 +32,7 @@ CHARSET_DATA_DIR := $(JDK_TOPDIR)/make/data/charsetmapping
|
||||
CHARSET_EXTSRC_DIR := $(JDK_TOPDIR)/src/jdk.charsets/share/classes/sun/nio/cs/ext
|
||||
CHARSET_GENSRC_JAVA_DIR_BASE := $(SUPPORT_OUTPUTDIR)/gensrc/java.base/sun/nio/cs
|
||||
CHARSET_DONE_BASE := $(CHARSET_GENSRC_JAVA_DIR_BASE)/_the.charsetmapping
|
||||
CHARSET_COPYRIGHT_HEADER := $(JDK_TOPDIR)/make/src/classes/build/tools/charsetmapping
|
||||
CHARSET_TEMPLATES := \
|
||||
$(CHARSET_DATA_DIR)/SingleByte-X.java.template \
|
||||
$(CHARSET_DATA_DIR)/DoubleByte-X.java.template
|
||||
@ -46,7 +47,9 @@ $(CHARSET_DONE_BASE)-stdcs: $(CHARSET_DATA_DIR)/charsets \
|
||||
$(MKDIR) -p $(@D)
|
||||
$(TOOL_CHARSETMAPPING) $(CHARSET_DATA_DIR) $(CHARSET_GENSRC_JAVA_DIR_BASE) \
|
||||
stdcs charsets $(CHARSET_STANDARD_OS) \
|
||||
$(CHARSET_STANDARD_JAVA_TEMPLATES) $(CHARSET_EXTSRC_DIR) $(LOG_INFO)
|
||||
$(CHARSET_STANDARD_JAVA_TEMPLATES) $(CHARSET_EXTSRC_DIR) \
|
||||
$(CHARSET_COPYRIGHT_HEADER) \
|
||||
$(LOG_INFO)
|
||||
$(TOUCH) '$@'
|
||||
|
||||
GENSRC_JAVA_BASE += $(CHARSET_DONE_BASE)-stdcs
|
||||
|
@ -53,15 +53,21 @@ endef
|
||||
# Param 1 - Variable to add targets to, must not contain space
|
||||
# Param 2 - Properties files to process
|
||||
# Param 3 - The super class for the generated classes
|
||||
# Param 4 - Module path root, defaults to $(JDK_TOPDIR)/src
|
||||
define SetupCompileProperties
|
||||
$1_SRCS := $2
|
||||
$1_CLASS := $3
|
||||
$1_MODULE_PATH_ROOT := $4
|
||||
|
||||
ifeq ($$($1_MODULE_PATH_ROOT), )
|
||||
$1_MODULE_PATH_ROOT := $(JDK_TOPDIR)/src
|
||||
endif
|
||||
|
||||
# Convert .../src/<module>/share/classes/com/sun/tools/javac/resources/javac_zh_CN.properties
|
||||
# to .../support/gensrc/<module>/com/sun/tools/javac/resources/javac_zh_CN.java
|
||||
# Strip away prefix and suffix, leaving for example only:
|
||||
# "<module>/share/classes/com/sun/tools/javac/resources/javac_zh_CN"
|
||||
$1_JAVAS := $$(patsubst $(JDK_TOPDIR)/src/%, \
|
||||
$1_JAVAS := $$(patsubst $$($1_MODULE_PATH_ROOT)/%, \
|
||||
$(SUPPORT_OUTPUTDIR)/gensrc/%, \
|
||||
$$(patsubst %.properties, %.java, \
|
||||
$$(subst /$(OPENJDK_TARGET_OS)/classes,, \
|
||||
|
@ -31,6 +31,7 @@ class Charset {
|
||||
String csName;
|
||||
String hisName;
|
||||
String type;
|
||||
String os;
|
||||
boolean isASCII;
|
||||
int b1Min;
|
||||
int b1Max;
|
||||
|
@ -80,12 +80,12 @@ public class EUC_TW {
|
||||
|
||||
private static Pattern euctw = Pattern.compile("(?:8ea)?(\\p{XDigit}++)\\s++(\\p{XDigit}++)?\\s*+.*");
|
||||
|
||||
static void genClass(String args[]) throws Exception
|
||||
static void genClass(String pkg, String args[]) throws Exception
|
||||
{
|
||||
InputStream is = new FileInputStream(new File(args[0], "euc_tw.map"));
|
||||
PrintStream ps = new PrintStream(new File(args[1], "EUC_TWMapping.java"),
|
||||
"ISO-8859-1");
|
||||
String copyright = getCopyright(new File(args[3]));
|
||||
String copyright = getCopyright(new File(args[7], "EUC_TW.java"));
|
||||
|
||||
|
||||
// ranges of byte1 and byte2, something should come from a "config" file
|
||||
@ -128,7 +128,7 @@ public class EUC_TW {
|
||||
|
||||
out.format(copyright);
|
||||
out.format("%n// -- This file was mechanically generated: Do not edit! -- //%n");
|
||||
out.format("package sun.nio.cs.ext;%n%n");
|
||||
out.format("package %s;%n%n", pkg);
|
||||
out.format("class EUC_TWMapping {%n%n");
|
||||
|
||||
// boundaries
|
||||
|
@ -42,7 +42,7 @@ public class HKSCS {
|
||||
private static Pattern hkscs =
|
||||
Pattern.compile("(?:0x)?+(\\p{XDigit}++)\\s++(?:0x|U\\+)?+(\\p{XDigit}++)?\\s*+(?:0x|U\\+)?(\\p{XDigit}++)?\\s*+.*");
|
||||
|
||||
static void genClass2008(String srcDir, String dstDir, String pkgName)
|
||||
static void genClass2008(String srcDir, String dstDir, String pkgName, File copyright)
|
||||
throws Exception
|
||||
{
|
||||
// hkscs2008
|
||||
@ -53,10 +53,11 @@ public class HKSCS {
|
||||
pkgName,
|
||||
"HKSCSMapping",
|
||||
true,
|
||||
"");
|
||||
getCopyright(copyright));
|
||||
|
||||
}
|
||||
|
||||
static void genClassXP(String srcDir, String dstDir, String pkgName)
|
||||
static void genClassXP(String srcDir, String dstDir, String pkgName, File copyright)
|
||||
throws Exception
|
||||
{
|
||||
genClass0(new FileInputStream(new File(srcDir, "HKSCS_XP.map")),
|
||||
@ -66,7 +67,7 @@ public class HKSCS {
|
||||
pkgName,
|
||||
"HKSCS_XPMapping",
|
||||
false,
|
||||
"");
|
||||
getCopyright(copyright));
|
||||
}
|
||||
|
||||
static void genClass2001(String args[]) throws Exception {
|
||||
|
@ -41,6 +41,7 @@ public class Main {
|
||||
int OS = 4;
|
||||
int TEMPLATE = 5;
|
||||
int EXT_SRC = 6;
|
||||
int COPYRIGHT_SRC = 7;
|
||||
|
||||
if (args.length < 3 ) {
|
||||
System.out.println("Usage: java -jar charsetmapping.jar src dst spiType charsets os [template]");
|
||||
@ -54,6 +55,7 @@ public class Main {
|
||||
String[] osStdcs = getOSStdCSList(new File(args[SRC_DIR], args[OS]));
|
||||
boolean hasBig5_HKSCS = false;
|
||||
boolean hasMS950_HKSCS_XP = false;
|
||||
boolean hasEUC_TW = false;
|
||||
for (String name : osStdcs) {
|
||||
Charset cs = charsets.get(name);
|
||||
if (cs != null) {
|
||||
@ -63,6 +65,8 @@ public class Main {
|
||||
hasBig5_HKSCS = true;
|
||||
} else if (name.equals("MS950_HKSCS_XP")) {
|
||||
hasMS950_HKSCS_XP = true;
|
||||
} else if (name.equals("EUC_TW")) {
|
||||
hasEUC_TW = true;
|
||||
}
|
||||
}
|
||||
for (Charset cs : charsets.values()) {
|
||||
@ -89,19 +93,28 @@ public class Main {
|
||||
}
|
||||
}
|
||||
// provider StandardCharsets.java / ExtendedCharsets.java
|
||||
SPI.genClass(args[TYPE], charsets, args[SRC_DIR], args[DST_DIR], args[TEMPLATE]);
|
||||
SPI.genClass(args[TYPE], charsets,
|
||||
args[SRC_DIR], args[DST_DIR],
|
||||
args[TEMPLATE],
|
||||
args[OS].endsWith("windows") ? "windows" : "unix");
|
||||
|
||||
// HKSCSMapping2008/XP.java goes together with Big5/MS950XP_HKSCS
|
||||
if (isStandard && hasBig5_HKSCS || isExtended && !hasBig5_HKSCS) {
|
||||
HKSCS.genClass2008(args[SRC_DIR], args[DST_DIR],
|
||||
isStandard ? "sun.nio.cs" : "sun.nio.cs.ext");
|
||||
isStandard ? "sun.nio.cs" : "sun.nio.cs.ext",
|
||||
new File(args[COPYRIGHT_SRC], "HKSCS.java"));
|
||||
}
|
||||
if (isStandard && hasMS950_HKSCS_XP || isExtended && !hasMS950_HKSCS_XP) {
|
||||
HKSCS.genClassXP(args[SRC_DIR], args[DST_DIR],
|
||||
isStandard ? "sun.nio.cs" : "sun.nio.cs.ext");
|
||||
isStandard ? "sun.nio.cs" : "sun.nio.cs.ext",
|
||||
new File(args[COPYRIGHT_SRC], "HKSCS.java"));
|
||||
}
|
||||
if (isStandard && hasEUC_TW) {
|
||||
EUC_TW.genClass("sun.nio.cs", args);
|
||||
}
|
||||
if (!isStandard && !hasEUC_TW) {
|
||||
EUC_TW.genClass("sun.nio.cs.ext", args);
|
||||
}
|
||||
} else if ("euctw".equals(args[TYPE])) {
|
||||
EUC_TW.genClass(args);
|
||||
} else if ("sjis0213".equals(args[TYPE])) {
|
||||
JIS0213.genClass(args);
|
||||
} else if ("hkscs".equals(args[TYPE])) {
|
||||
@ -157,6 +170,9 @@ public class Main {
|
||||
case "type":
|
||||
cs.type = tokens[2];
|
||||
break;
|
||||
case "os":
|
||||
cs.os = tokens[2];
|
||||
break;
|
||||
case "hisname":
|
||||
cs.hisName = tokens[2];
|
||||
break;
|
||||
|
@ -33,8 +33,10 @@ import java.util.Scanner;
|
||||
|
||||
public class SPI {
|
||||
|
||||
public static void genClass(String type, LinkedHashMap<String, Charset> charsets,
|
||||
String srcDir, String dstDir, String template)
|
||||
public static void genClass(String type,
|
||||
LinkedHashMap<String, Charset> charsets,
|
||||
String srcDir, String dstDir, String template,
|
||||
String os)
|
||||
throws Exception
|
||||
{
|
||||
try (Scanner s = new Scanner(new File(template));
|
||||
@ -50,7 +52,8 @@ public class SPI {
|
||||
charsets.values()
|
||||
.stream()
|
||||
.filter(cs -> cs.pkgName.equals("sun.nio.cs.ext") &&
|
||||
!cs.isInternal)
|
||||
!cs.isInternal &&
|
||||
(cs.os == null || cs.os.equals(os)))
|
||||
.forEach( cs -> {
|
||||
out.printf(" charset(\"%s\", \"%s\",%n", cs.csName, cs.clzName);
|
||||
out.printf(" new String[] {%n");
|
||||
|
@ -1063,16 +1063,24 @@ public final class Class<T> implements java.io.Serializable,
|
||||
parameterClasses[i] = toClass(parameterTypes[i]);
|
||||
|
||||
// Perform access check
|
||||
Class<?> enclosingCandidate = enclosingInfo.getEnclosingClass();
|
||||
final Class<?> enclosingCandidate = enclosingInfo.getEnclosingClass();
|
||||
enclosingCandidate.checkMemberAccess(Member.DECLARED,
|
||||
Reflection.getCallerClass(), true);
|
||||
// Client is ok to access declared methods but j.l.Class might not be.
|
||||
Method[] candidates = AccessController.doPrivileged(
|
||||
new PrivilegedAction<Method[]>() {
|
||||
@Override
|
||||
public Method[] run() {
|
||||
return enclosingCandidate.getDeclaredMethods();
|
||||
}
|
||||
});
|
||||
/*
|
||||
* Loop over all declared methods; match method name,
|
||||
* number of and type of parameters, *and* return
|
||||
* type. Matching return type is also necessary
|
||||
* because of covariant returns, etc.
|
||||
*/
|
||||
for(Method m: enclosingCandidate.getDeclaredMethods()) {
|
||||
for(Method m: candidates) {
|
||||
if (m.getName().equals(enclosingInfo.getName()) ) {
|
||||
Class<?>[] candidateParamClasses = m.getParameterTypes();
|
||||
if (candidateParamClasses.length == parameterClasses.length) {
|
||||
@ -1215,14 +1223,22 @@ public final class Class<T> implements java.io.Serializable,
|
||||
parameterClasses[i] = toClass(parameterTypes[i]);
|
||||
|
||||
// Perform access check
|
||||
Class<?> enclosingCandidate = enclosingInfo.getEnclosingClass();
|
||||
final Class<?> enclosingCandidate = enclosingInfo.getEnclosingClass();
|
||||
enclosingCandidate.checkMemberAccess(Member.DECLARED,
|
||||
Reflection.getCallerClass(), true);
|
||||
// Client is ok to access declared methods but j.l.Class might not be.
|
||||
Constructor<?>[] candidates = AccessController.doPrivileged(
|
||||
new PrivilegedAction<Constructor<?>[]>() {
|
||||
@Override
|
||||
public Constructor<?>[] run() {
|
||||
return enclosingCandidate.getDeclaredConstructors();
|
||||
}
|
||||
});
|
||||
/*
|
||||
* Loop over all declared constructors; match number
|
||||
* of and type of parameters.
|
||||
*/
|
||||
for(Constructor<?> c: enclosingCandidate.getDeclaredConstructors()) {
|
||||
for(Constructor<?> c: candidates) {
|
||||
Class<?>[] candidateParamClasses = c.getParameterTypes();
|
||||
if (candidateParamClasses.length == parameterClasses.length) {
|
||||
boolean matches = true;
|
||||
|
@ -35,6 +35,7 @@ import static java.lang.invoke.MethodTypeForm.*;
|
||||
import static java.lang.invoke.MethodHandleStatics.*;
|
||||
import java.lang.ref.WeakReference;
|
||||
import java.lang.reflect.Field;
|
||||
import java.util.Objects;
|
||||
import sun.invoke.util.ValueConversions;
|
||||
import sun.invoke.util.VerifyType;
|
||||
import sun.invoke.util.Wrapper;
|
||||
@ -439,8 +440,7 @@ class DirectMethodHandle extends MethodHandle {
|
||||
// Therefore, the only remaining check is for null.
|
||||
// Since this check is *not* guaranteed by Unsafe.getInt
|
||||
// and its siblings, we need to make an explicit one here.
|
||||
obj.getClass(); // maybe throw NPE
|
||||
return obj;
|
||||
return Objects.requireNonNull(obj);
|
||||
}
|
||||
|
||||
/** This subclass handles static field references. */
|
||||
@ -468,8 +468,7 @@ class DirectMethodHandle extends MethodHandle {
|
||||
|
||||
@ForceInline
|
||||
/*non-public*/ static Object nullCheck(Object obj) {
|
||||
obj.getClass();
|
||||
return obj;
|
||||
return Objects.requireNonNull(obj);
|
||||
}
|
||||
|
||||
@ForceInline
|
||||
|
@ -521,7 +521,7 @@ import java.util.Objects;
|
||||
}
|
||||
@SuppressWarnings("LeakingThisInConstructor")
|
||||
public MemberName(Method m, boolean wantSpecial) {
|
||||
m.getClass(); // NPE check
|
||||
Objects.requireNonNull(m);
|
||||
// fill in vmtarget, vmindex while we have m in hand:
|
||||
MethodHandleNatives.init(this, m);
|
||||
if (clazz == null) { // MHN.init failed
|
||||
@ -600,7 +600,7 @@ import java.util.Objects;
|
||||
/** Create a name for the given reflected constructor. The resulting name will be in a resolved state. */
|
||||
@SuppressWarnings("LeakingThisInConstructor")
|
||||
public MemberName(Constructor<?> ctor) {
|
||||
ctor.getClass(); // NPE check
|
||||
Objects.requireNonNull(ctor);
|
||||
// fill in vmtarget, vmindex while we have ctor in hand:
|
||||
MethodHandleNatives.init(this, ctor);
|
||||
assert(isResolved() && this.clazz != null);
|
||||
@ -615,7 +615,7 @@ import java.util.Objects;
|
||||
}
|
||||
@SuppressWarnings("LeakingThisInConstructor")
|
||||
public MemberName(Field fld, boolean makeSetter) {
|
||||
fld.getClass(); // NPE check
|
||||
Objects.requireNonNull(fld);
|
||||
// fill in vmtarget, vmindex while we have fld in hand:
|
||||
MethodHandleNatives.init(this, fld);
|
||||
assert(isResolved() && this.clazz != null);
|
||||
|
@ -453,10 +453,8 @@ public abstract class MethodHandle {
|
||||
*/
|
||||
// @param type type (permanently assigned) of the new method handle
|
||||
/*non-public*/ MethodHandle(MethodType type, LambdaForm form) {
|
||||
type.getClass(); // explicit NPE
|
||||
form.getClass(); // explicit NPE
|
||||
this.type = type;
|
||||
this.form = form.uncustomize();
|
||||
this.type = Objects.requireNonNull(type);
|
||||
this.form = Objects.requireNonNull(form).uncustomize();
|
||||
|
||||
this.form.prepare(); // TO DO: Try to delay this step until just before invocation.
|
||||
}
|
||||
@ -1171,7 +1169,7 @@ assertEquals("[three, thee, tee]", Arrays.toString((Object[])ls.get(0)));
|
||||
* @see #asFixedArity
|
||||
*/
|
||||
public MethodHandle asVarargsCollector(Class<?> arrayType) {
|
||||
arrayType.getClass(); // explicit NPE
|
||||
Objects.requireNonNull(arrayType);
|
||||
boolean lastMatch = asCollectorChecks(arrayType, 0);
|
||||
if (isVarargsCollector() && lastMatch)
|
||||
return this;
|
||||
|
@ -29,6 +29,7 @@ import java.lang.reflect.*;
|
||||
import java.util.BitSet;
|
||||
import java.util.List;
|
||||
import java.util.Arrays;
|
||||
import java.util.Objects;
|
||||
|
||||
import sun.invoke.util.ValueConversions;
|
||||
import sun.invoke.util.VerifyAccess;
|
||||
@ -632,7 +633,7 @@ public class MethodHandles {
|
||||
* @throws NullPointerException if the argument is null
|
||||
*/
|
||||
public Lookup in(Class<?> requestedLookupClass) {
|
||||
requestedLookupClass.getClass(); // null check
|
||||
Objects.requireNonNull(requestedLookupClass);
|
||||
if (allowedModes == TRUSTED) // IMPL_LOOKUP can make any lookup at all
|
||||
return new Lookup(requestedLookupClass, ALL_MODES);
|
||||
if (requestedLookupClass == this.lookupClass)
|
||||
@ -1367,16 +1368,16 @@ return mh1;
|
||||
|
||||
MemberName resolveOrFail(byte refKind, Class<?> refc, String name, Class<?> type) throws NoSuchFieldException, IllegalAccessException {
|
||||
checkSymbolicClass(refc); // do this before attempting to resolve
|
||||
name.getClass(); // NPE
|
||||
type.getClass(); // NPE
|
||||
Objects.requireNonNull(name);
|
||||
Objects.requireNonNull(type);
|
||||
return IMPL_NAMES.resolveOrFail(refKind, new MemberName(refc, name, type, refKind), lookupClassOrNull(),
|
||||
NoSuchFieldException.class);
|
||||
}
|
||||
|
||||
MemberName resolveOrFail(byte refKind, Class<?> refc, String name, MethodType type) throws NoSuchMethodException, IllegalAccessException {
|
||||
checkSymbolicClass(refc); // do this before attempting to resolve
|
||||
name.getClass(); // NPE
|
||||
type.getClass(); // NPE
|
||||
Objects.requireNonNull(name);
|
||||
Objects.requireNonNull(type);
|
||||
checkMethodName(refKind, name); // NPE check on name
|
||||
return IMPL_NAMES.resolveOrFail(refKind, new MemberName(refc, name, type, refKind), lookupClassOrNull(),
|
||||
NoSuchMethodException.class);
|
||||
@ -1384,14 +1385,14 @@ return mh1;
|
||||
|
||||
MemberName resolveOrFail(byte refKind, MemberName member) throws ReflectiveOperationException {
|
||||
checkSymbolicClass(member.getDeclaringClass()); // do this before attempting to resolve
|
||||
member.getName().getClass(); // NPE
|
||||
member.getType().getClass(); // NPE
|
||||
Objects.requireNonNull(member.getName());
|
||||
Objects.requireNonNull(member.getType());
|
||||
return IMPL_NAMES.resolveOrFail(refKind, member, lookupClassOrNull(),
|
||||
ReflectiveOperationException.class);
|
||||
}
|
||||
|
||||
void checkSymbolicClass(Class<?> refc) throws IllegalAccessException {
|
||||
refc.getClass(); // NPE
|
||||
Objects.requireNonNull(refc);
|
||||
Class<?> caller = lookupClassOrNull();
|
||||
if (caller != null && !VerifyAccess.isClassAccessible(refc, caller, allowedModes))
|
||||
throw new MemberName(refc).makeAccessException("symbolic reference class is not public", this);
|
||||
|
@ -25,6 +25,7 @@
|
||||
|
||||
package java.lang.invoke;
|
||||
|
||||
import java.util.Objects;
|
||||
import java.util.concurrent.atomic.AtomicInteger;
|
||||
|
||||
/**
|
||||
@ -275,7 +276,7 @@ public class MutableCallSite extends CallSite {
|
||||
if (sites.length == 0) return;
|
||||
STORE_BARRIER.lazySet(0);
|
||||
for (MutableCallSite site : sites) {
|
||||
site.getClass(); // trigger NPE on first null
|
||||
Objects.requireNonNull(site); // trigger NPE on first null
|
||||
}
|
||||
// FIXME: NYI
|
||||
}
|
||||
|
@ -296,7 +296,8 @@ public final class Constructor<T> extends Executable {
|
||||
* constructor has default (package) access.
|
||||
*
|
||||
* @return a string describing this {@code Constructor}
|
||||
* @jls 8.8.3. Constructor Modifiers
|
||||
* @jls 8.8.3 Constructor Modifiers
|
||||
* @jls 8.9.2 Enum Body Declarations
|
||||
*/
|
||||
public String toString() {
|
||||
return sharedToString(Modifier.constructorModifiers(),
|
||||
@ -342,7 +343,8 @@ public final class Constructor<T> extends Executable {
|
||||
* include type parameters
|
||||
*
|
||||
* @since 1.5
|
||||
* @jls 8.8.3. Constructor Modifiers
|
||||
* @jls 8.8.3 Constructor Modifiers
|
||||
* @jls 8.9.2 Enum Body Declarations
|
||||
*/
|
||||
@Override
|
||||
public String toGenericString() {
|
||||
|
@ -356,6 +356,8 @@ public final class Method extends Executable {
|
||||
* @return a string describing this {@code Method}
|
||||
*
|
||||
* @jls 8.4.3 Method Modifiers
|
||||
* @jls 9.4 Method Declarations
|
||||
* @jls 9.6.1 Annotation Type Elements
|
||||
*/
|
||||
public String toString() {
|
||||
return sharedToString(Modifier.methodModifiers(),
|
||||
@ -409,6 +411,8 @@ public final class Method extends Executable {
|
||||
* @since 1.5
|
||||
*
|
||||
* @jls 8.4.3 Method Modifiers
|
||||
* @jls 9.4 Method Declarations
|
||||
* @jls 9.6.1 Annotation Type Elements
|
||||
*/
|
||||
@Override
|
||||
public String toGenericString() {
|
||||
|
@ -388,14 +388,13 @@ class SocksSocketImpl extends PlainSocketImpl implements SocksConsts {
|
||||
}
|
||||
while (iProxy.hasNext()) {
|
||||
p = iProxy.next();
|
||||
if (p == null || p == Proxy.NO_PROXY) {
|
||||
if (p == null || p.type() != Proxy.Type.SOCKS) {
|
||||
super.connect(epoint, remainingMillis(deadlineMillis));
|
||||
return;
|
||||
}
|
||||
if (p.type() != Proxy.Type.SOCKS)
|
||||
throw new SocketException("Unknown proxy type : " + p.type());
|
||||
|
||||
if (!(p.address() instanceof InetSocketAddress))
|
||||
throw new SocketException("Unknow address type for proxy: " + p);
|
||||
throw new SocketException("Unknown address type for proxy: " + p);
|
||||
// Use getHostString() to avoid reverse lookups
|
||||
server = ((InetSocketAddress) p.address()).getHostString();
|
||||
serverPort = ((InetSocketAddress) p.address()).getPort();
|
||||
@ -707,13 +706,12 @@ class SocksSocketImpl extends PlainSocketImpl implements SocksConsts {
|
||||
}
|
||||
while (iProxy.hasNext()) {
|
||||
p = iProxy.next();
|
||||
if (p == null || p == Proxy.NO_PROXY) {
|
||||
if (p == null || p.type() != Proxy.Type.SOCKS) {
|
||||
return;
|
||||
}
|
||||
if (p.type() != Proxy.Type.SOCKS)
|
||||
throw new SocketException("Unknown proxy type : " + p.type());
|
||||
|
||||
if (!(p.address() instanceof InetSocketAddress))
|
||||
throw new SocketException("Unknow address type for proxy: " + p);
|
||||
throw new SocketException("Unknown address type for proxy: " + p);
|
||||
// Use getHostString() to avoid reverse lookups
|
||||
server = ((InetSocketAddress) p.address()).getHostString();
|
||||
serverPort = ((InetSocketAddress) p.address()).getPort();
|
||||
|
@ -27,8 +27,15 @@ package java.net;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.net.spi.URLStreamHandlerProvider;
|
||||
import java.security.AccessController;
|
||||
import java.security.PrivilegedAction;
|
||||
import java.util.Hashtable;
|
||||
import java.util.StringTokenizer;
|
||||
import java.util.Iterator;
|
||||
import java.util.NoSuchElementException;
|
||||
import java.util.ServiceConfigurationError;
|
||||
import java.util.ServiceLoader;
|
||||
|
||||
import sun.security.util.SecurityConstants;
|
||||
|
||||
/**
|
||||
@ -248,23 +255,19 @@ public final class URL implements java.io.Serializable {
|
||||
* stream protocol handler.
|
||||
* <li>If no {@code URLStreamHandlerFactory} has yet been set up,
|
||||
* or if the factory's {@code createURLStreamHandler} method
|
||||
* returns {@code null}, then the constructor finds the
|
||||
* value of the system property:
|
||||
* <blockquote><pre>
|
||||
* java.protocol.handler.pkgs
|
||||
* </pre></blockquote>
|
||||
* If the value of that system property is not {@code null},
|
||||
* it is interpreted as a list of packages separated by a vertical
|
||||
* slash character '{@code |}'. The constructor tries to load
|
||||
* the class named:
|
||||
* <blockquote><pre>
|
||||
* <<i>package</i>>.<<i>protocol</i>>.Handler
|
||||
* </pre></blockquote>
|
||||
* where <<i>package</i>> is replaced by the name of the package
|
||||
* and <<i>protocol</i>> is replaced by the name of the protocol.
|
||||
* If this class does not exist, or if the class exists but it is not
|
||||
* a subclass of {@code URLStreamHandler}, then the next package
|
||||
* in the list is tried.
|
||||
* returns {@code null}, then the {@linkplain java.util.ServiceLoader
|
||||
* ServiceLoader} mechanism is used to locate {@linkplain
|
||||
* java.net.spi.URLStreamHandlerProvider URLStreamHandlerProvider}
|
||||
* implementations using the system class
|
||||
* loader. The order that providers are located is implementation
|
||||
* specific, and an implementation is free to cache the located
|
||||
* providers. A {@linkplain java.util.ServiceConfigurationError
|
||||
* ServiceConfigurationError}, {@code Error} or {@code RuntimeException}
|
||||
* thrown from the {@code createURLStreamHandler}, if encountered, will
|
||||
* be propagated to the calling thread. The {@code
|
||||
* createURLStreamHandler} method of each provider, if instantiated, is
|
||||
* invoked, with the protocol string, until a provider returns non-null,
|
||||
* or all providers have been exhausted.
|
||||
* <li>If the previous step fails to find a protocol handler, then the
|
||||
* constructor tries to load a built-in protocol handler.
|
||||
* If this class does not exist, or if the class exists but it is not a
|
||||
@ -277,8 +280,12 @@ public final class URL implements java.io.Serializable {
|
||||
* <blockquote><pre>
|
||||
* http, https, file, and jar
|
||||
* </pre></blockquote>
|
||||
* Protocol handlers for additional protocols may also be
|
||||
* available.
|
||||
* Protocol handlers for additional protocols may also be available.
|
||||
* Some protocol handlers, for example those used for loading platform
|
||||
* classes or classes on the class path, may not be overridden. The details
|
||||
* of such restrictions, and when those restrictions apply (during
|
||||
* initialization of the runtime for example), are implementation specific
|
||||
* and therefore not specified
|
||||
*
|
||||
* <p>No validation of the inputs is performed by this constructor.
|
||||
*
|
||||
@ -1107,20 +1114,115 @@ public final class URL implements java.io.Serializable {
|
||||
}
|
||||
handlers.clear();
|
||||
|
||||
// ensure the core protocol handlers are loaded before setting
|
||||
// a custom URLStreamHandlerFactory
|
||||
ensureHandlersLoaded("jrt", "jar", "file");
|
||||
|
||||
// safe publication of URLStreamHandlerFactory with volatile write
|
||||
factory = fac;
|
||||
}
|
||||
}
|
||||
|
||||
private static final URLStreamHandlerFactory defaultFactory = new DefaultFactory();
|
||||
|
||||
private static class DefaultFactory implements URLStreamHandlerFactory {
|
||||
private static String PREFIX = "sun.net.www.protocol";
|
||||
|
||||
public URLStreamHandler createURLStreamHandler(String protocol) {
|
||||
String name = PREFIX + "." + protocol + ".Handler";
|
||||
try {
|
||||
Class<?> c = Class.forName(name);
|
||||
return (URLStreamHandler)c.newInstance();
|
||||
} catch (ClassNotFoundException x) {
|
||||
// ignore
|
||||
} catch (Exception e) {
|
||||
// For compatibility, all Exceptions are ignored.
|
||||
// any number of exceptions can get thrown here
|
||||
}
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
private static Iterator<URLStreamHandlerProvider> providers() {
|
||||
return new Iterator<URLStreamHandlerProvider>() {
|
||||
|
||||
ClassLoader cl = ClassLoader.getSystemClassLoader();
|
||||
ServiceLoader<URLStreamHandlerProvider> sl =
|
||||
ServiceLoader.load(URLStreamHandlerProvider.class, cl);
|
||||
Iterator<URLStreamHandlerProvider> i = sl.iterator();
|
||||
|
||||
URLStreamHandlerProvider next = null;
|
||||
|
||||
private boolean getNext() {
|
||||
while (next == null) {
|
||||
try {
|
||||
if (!i.hasNext())
|
||||
return false;
|
||||
next = i.next();
|
||||
} catch (ServiceConfigurationError sce) {
|
||||
if (sce.getCause() instanceof SecurityException) {
|
||||
// Ignore security exceptions
|
||||
continue;
|
||||
}
|
||||
throw sce;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
public boolean hasNext() {
|
||||
return getNext();
|
||||
}
|
||||
|
||||
public URLStreamHandlerProvider next() {
|
||||
if (!getNext())
|
||||
throw new NoSuchElementException();
|
||||
URLStreamHandlerProvider n = next;
|
||||
next = null;
|
||||
return n;
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
// Thread-local gate to prevent recursive provider lookups
|
||||
private static ThreadLocal<Object> gate = new ThreadLocal<>();
|
||||
|
||||
private static URLStreamHandler lookupViaProviders(final String protocol) {
|
||||
if (!sun.misc.VM.isBooted())
|
||||
return null;
|
||||
|
||||
if (gate.get() != null)
|
||||
throw new Error("Circular loading of URL stream handler providers detected");
|
||||
|
||||
gate.set(gate);
|
||||
try {
|
||||
return AccessController.doPrivileged(
|
||||
new PrivilegedAction<URLStreamHandler>() {
|
||||
public URLStreamHandler run() {
|
||||
Iterator<URLStreamHandlerProvider> itr = providers();
|
||||
while (itr.hasNext()) {
|
||||
URLStreamHandlerProvider f = itr.next();
|
||||
URLStreamHandler h = f.createURLStreamHandler(protocol);
|
||||
if (h != null)
|
||||
return h;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
});
|
||||
} finally {
|
||||
gate.set(null);
|
||||
}
|
||||
}
|
||||
|
||||
private static final String[] NON_OVERRIDEABLE_PROTOCOLS = {"file", "jrt"};
|
||||
private static boolean isOverrideable(String protocol) {
|
||||
for (String p : NON_OVERRIDEABLE_PROTOCOLS)
|
||||
if (protocol.equalsIgnoreCase(p))
|
||||
return false;
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* A table of protocol handlers.
|
||||
*/
|
||||
static Hashtable<String,URLStreamHandler> handlers = new Hashtable<>();
|
||||
private static Object streamHandlerLock = new Object();
|
||||
private static final Object streamHandlerLock = new Object();
|
||||
|
||||
/**
|
||||
* Returns the Stream Handler.
|
||||
@ -1129,66 +1231,33 @@ public final class URL implements java.io.Serializable {
|
||||
static URLStreamHandler getURLStreamHandler(String protocol) {
|
||||
|
||||
URLStreamHandler handler = handlers.get(protocol);
|
||||
if (handler == null) {
|
||||
|
||||
boolean checkedWithFactory = false;
|
||||
if (handler != null) {
|
||||
return handler;
|
||||
}
|
||||
|
||||
URLStreamHandlerFactory fac;
|
||||
boolean checkedWithFactory = false;
|
||||
|
||||
if (isOverrideable(protocol)) {
|
||||
// Use the factory (if any). Volatile read makes
|
||||
// URLStreamHandlerFactory appear fully initialized to current thread.
|
||||
URLStreamHandlerFactory fac = factory;
|
||||
fac = factory;
|
||||
if (fac != null) {
|
||||
handler = fac.createURLStreamHandler(protocol);
|
||||
checkedWithFactory = true;
|
||||
}
|
||||
|
||||
// Try java protocol handler
|
||||
if (handler == null) {
|
||||
String packagePrefixList = null;
|
||||
|
||||
packagePrefixList
|
||||
= java.security.AccessController.doPrivileged(
|
||||
new sun.security.action.GetPropertyAction(
|
||||
protocolPathProp,""));
|
||||
if (packagePrefixList != "") {
|
||||
packagePrefixList += "|";
|
||||
}
|
||||
|
||||
// REMIND: decide whether to allow the "null" class prefix
|
||||
// or not.
|
||||
packagePrefixList += "sun.net.www.protocol";
|
||||
|
||||
StringTokenizer packagePrefixIter =
|
||||
new StringTokenizer(packagePrefixList, "|");
|
||||
|
||||
while (handler == null &&
|
||||
packagePrefixIter.hasMoreTokens()) {
|
||||
|
||||
String packagePrefix =
|
||||
packagePrefixIter.nextToken().trim();
|
||||
try {
|
||||
String clsName = packagePrefix + "." + protocol +
|
||||
".Handler";
|
||||
Class<?> cls = null;
|
||||
try {
|
||||
cls = Class.forName(clsName);
|
||||
} catch (ClassNotFoundException e) {
|
||||
ClassLoader cl = ClassLoader.getSystemClassLoader();
|
||||
if (cl != null) {
|
||||
cls = cl.loadClass(clsName);
|
||||
}
|
||||
}
|
||||
if (cls != null) {
|
||||
handler =
|
||||
(URLStreamHandler)cls.newInstance();
|
||||
}
|
||||
} catch (Exception e) {
|
||||
// any number of exceptions can get thrown here
|
||||
}
|
||||
}
|
||||
if (handler == null && !protocol.equalsIgnoreCase("jar")) {
|
||||
handler = lookupViaProviders(protocol);
|
||||
}
|
||||
}
|
||||
|
||||
synchronized (streamHandlerLock) {
|
||||
|
||||
synchronized (streamHandlerLock) {
|
||||
if (handler == null) {
|
||||
// Try the built-in protocol handler
|
||||
handler = defaultFactory.createURLStreamHandler(protocol);
|
||||
} else {
|
||||
URLStreamHandler handler2 = null;
|
||||
|
||||
// Check again with hashtable just in case another
|
||||
@ -1202,7 +1271,7 @@ public final class URL implements java.io.Serializable {
|
||||
// Check with factory if another thread set a
|
||||
// factory since our last check
|
||||
if (!checkedWithFactory && (fac = factory) != null) {
|
||||
handler2 = fac.createURLStreamHandler(protocol);
|
||||
handler2 = fac.createURLStreamHandler(protocol);
|
||||
}
|
||||
|
||||
if (handler2 != null) {
|
||||
@ -1211,29 +1280,17 @@ public final class URL implements java.io.Serializable {
|
||||
// this thread created.
|
||||
handler = handler2;
|
||||
}
|
||||
}
|
||||
|
||||
// Insert this handler into the hashtable
|
||||
if (handler != null) {
|
||||
handlers.put(protocol, handler);
|
||||
}
|
||||
|
||||
// Insert this handler into the hashtable
|
||||
if (handler != null) {
|
||||
handlers.put(protocol, handler);
|
||||
}
|
||||
}
|
||||
|
||||
return handler;
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Ensures that the given protocol handlers are loaded
|
||||
*/
|
||||
private static void ensureHandlersLoaded(String... protocols) {
|
||||
for (String protocol: protocols) {
|
||||
getURLStreamHandler(protocol);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* WriteObject is called to save the state of the URL to an
|
||||
* ObjectOutputStream. The handler is not saved since it is
|
||||
|
@ -44,7 +44,9 @@ public interface URLStreamHandlerFactory {
|
||||
*
|
||||
* @param protocol the protocol ("{@code ftp}",
|
||||
* "{@code http}", "{@code nntp}", etc.).
|
||||
* @return a {@code URLStreamHandler} for the specific protocol.
|
||||
* @return a {@code URLStreamHandler} for the specific protocol, or {@code
|
||||
* null} if this factory cannot create a handler for the specific
|
||||
* protocol
|
||||
* @see java.net.URLStreamHandler
|
||||
*/
|
||||
URLStreamHandler createURLStreamHandler(String protocol);
|
||||
|
@ -143,13 +143,11 @@
|
||||
* a similar URL will try to instantiate the handler for the specified protocol;
|
||||
* if it doesn't exist an exception will be thrown.
|
||||
* <p>By default the protocol handlers are loaded dynamically from the default
|
||||
* location. It is, however, possible to add to the search path by setting
|
||||
* the {@code java.protocol.handler.pkgs} system property. For instance if
|
||||
* it is set to {@code myapp.protocols}, then the URL code will try, in the
|
||||
* case of http, first to load {@code myapp.protocols.http.Handler}, then,
|
||||
* if this fails, {@code http.Handler} from the default location.
|
||||
* <p>Note that the Handler class <b>has to</b> be a subclass of the abstract
|
||||
* class {@link java.net.URLStreamHandler}.</p>
|
||||
* location. It is, however, possible to deploy additional protocols handlers
|
||||
* as {@link java.util.ServiceLoader services}. Service providers of type
|
||||
* {@linkplain java.net.spi.URLStreamHandlerProvider} are located at
|
||||
* runtime, as specified in the {@linkplain
|
||||
* java.net.URL#URL(String,String,int,String) URL constructor}.
|
||||
* <h2>Additional Specification</h2>
|
||||
* <ul>
|
||||
* <li><a href="doc-files/net-properties.html">
|
||||
|
@ -0,0 +1,67 @@
|
||||
/*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
package java.net.spi;
|
||||
|
||||
import java.net.URLStreamHandlerFactory;
|
||||
|
||||
/**
|
||||
* URL stream handler service-provider class.
|
||||
*
|
||||
*<p> A URL stream handler provider is a concrete subclass of this class that
|
||||
* has a zero-argument constructor. URL stream handler providers may be
|
||||
* installed in an instance of the Java platform by adding them to the
|
||||
* application class path.
|
||||
*
|
||||
* <p> A URL stream handler provider identifies itself with a
|
||||
* provider-configuration file named java.net.spi.URLStreamHandlerProvider in
|
||||
* the resource directory META-INF/services. The file should contain a list of
|
||||
* fully-qualified concrete URL stream handler provider class names, one per
|
||||
* line.
|
||||
*
|
||||
* @since 1.9
|
||||
*/
|
||||
public abstract class URLStreamHandlerProvider
|
||||
implements URLStreamHandlerFactory
|
||||
{
|
||||
private static Void checkPermission() {
|
||||
SecurityManager sm = System.getSecurityManager();
|
||||
if (sm != null)
|
||||
sm.checkPermission(new RuntimePermission("setFactory"));
|
||||
return null;
|
||||
}
|
||||
private URLStreamHandlerProvider(Void ignore) { }
|
||||
|
||||
/**
|
||||
* Initializes a new URL stream handler provider.
|
||||
*
|
||||
* @throws SecurityException
|
||||
* If a security manager has been installed and it denies
|
||||
* {@link RuntimePermission}{@code ("setFactory")}.
|
||||
*/
|
||||
protected URLStreamHandlerProvider() {
|
||||
this(checkPermission());
|
||||
}
|
||||
}
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 1996, Oracle and/or its affiliates. All rights reserved.
|
||||
* 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
|
||||
@ -23,26 +23,13 @@
|
||||
* questions.
|
||||
*/
|
||||
|
||||
package sun.security.acl;
|
||||
|
||||
import java.security.*;
|
||||
|
||||
/**
|
||||
* This class implements a group of principals.
|
||||
* @author Satish Dharmaraj
|
||||
* Service-provider classes for the <tt>{@link java.net}</tt> package.
|
||||
*
|
||||
* <p> Only developers who are defining new URL stream handler providers
|
||||
* should need to make direct use of this package.
|
||||
*
|
||||
* @since 1.9
|
||||
*/
|
||||
public class WorldGroupImpl extends GroupImpl {
|
||||
|
||||
public WorldGroupImpl(String s) {
|
||||
super(s);
|
||||
}
|
||||
|
||||
/**
|
||||
* returns true for all passed principals
|
||||
* @param member The principal whose membership must be checked in this Group.
|
||||
* @return true always since this is the "world" group.
|
||||
*/
|
||||
public boolean isMember(Principal member) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
package java.net.spi;
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 1996, 2013, 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
|
||||
@ -68,11 +68,7 @@ import java.security.Principal;
|
||||
*
|
||||
* The {@code java.security.acl } package provides the
|
||||
* interfaces to the ACL and related data structures (ACL entries,
|
||||
* groups, permissions, etc.), and the {@code sun.security.acl }
|
||||
* classes provide a default implementation of the interfaces. For
|
||||
* example, {@code java.security.acl.Acl } provides the
|
||||
* interface to an ACL and the {@code sun.security.acl.AclImpl }
|
||||
* class provides the default implementation of the interface.<p>
|
||||
* groups, permissions, etc.).<p>
|
||||
*
|
||||
* The {@code java.security.acl.Acl } interface extends the
|
||||
* {@code java.security.acl.Owner } interface. The Owner
|
||||
|
@ -155,7 +155,7 @@ public abstract class Clock {
|
||||
* @return a clock that uses the best available system clock in the UTC zone, not null
|
||||
*/
|
||||
public static Clock systemUTC() {
|
||||
return new SystemClock(ZoneOffset.UTC);
|
||||
return SystemClock.UTC;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -198,6 +198,9 @@ public abstract class Clock {
|
||||
*/
|
||||
public static Clock system(ZoneId zone) {
|
||||
Objects.requireNonNull(zone, "zone");
|
||||
if (zone == ZoneOffset.UTC) {
|
||||
return SystemClock.UTC;
|
||||
}
|
||||
return new SystemClock(zone);
|
||||
}
|
||||
|
||||
@ -451,6 +454,8 @@ public abstract class Clock {
|
||||
private static final long serialVersionUID = 6740630888130243051L;
|
||||
private static final long OFFSET_SEED =
|
||||
System.currentTimeMillis()/1000 - 1024; // initial offest
|
||||
static final SystemClock UTC = new SystemClock(ZoneOffset.UTC);
|
||||
|
||||
private final ZoneId zone;
|
||||
// We don't actually need a volatile here.
|
||||
// We don't care if offset is set or read concurrently by multiple
|
||||
|
@ -848,7 +848,7 @@ public interface DoubleStream extends BaseStream<Double, DoubleStream> {
|
||||
* @implNote
|
||||
* Use caution when constructing streams from repeated concatenation.
|
||||
* Accessing an element of a deeply concatenated stream can result in deep
|
||||
* call chains, or even {@code StackOverflowException}.
|
||||
* call chains, or even {@code StackOverflowError}.
|
||||
*
|
||||
* @param a the first stream
|
||||
* @param b the second stream
|
||||
|
@ -837,7 +837,7 @@ public interface IntStream extends BaseStream<Integer, IntStream> {
|
||||
* @implNote
|
||||
* Use caution when constructing streams from repeated concatenation.
|
||||
* Accessing an element of a deeply concatenated stream can result in deep
|
||||
* call chains, or even {@code StackOverflowException}.
|
||||
* call chains, or even {@code StackOverflowError}.
|
||||
*
|
||||
* @param a the first stream
|
||||
* @param b the second stream
|
||||
|
@ -845,7 +845,7 @@ public interface LongStream extends BaseStream<Long, LongStream> {
|
||||
* @implNote
|
||||
* Use caution when constructing streams from repeated concatenation.
|
||||
* Accessing an element of a deeply concatenated stream can result in deep
|
||||
* call chains, or even {@code StackOverflowException}.
|
||||
* call chains, or even {@code StackOverflowError}.
|
||||
*
|
||||
* @param a the first stream
|
||||
* @param b the second stream
|
||||
|
@ -1079,7 +1079,7 @@ public interface Stream<T> extends BaseStream<T, Stream<T>> {
|
||||
* @implNote
|
||||
* Use caution when constructing streams from repeated concatenation.
|
||||
* Accessing an element of a deeply concatenated stream can result in deep
|
||||
* call chains, or even {@code StackOverflowException}.
|
||||
* call chains, or even {@code StackOverflowError}.
|
||||
*
|
||||
* @param <T> The type of stream elements
|
||||
* @param a the first stream
|
||||
|
@ -180,8 +180,7 @@ class ZipEntry implements ZipConstants, Cloneable {
|
||||
* @since 1.8
|
||||
*/
|
||||
public ZipEntry setLastModifiedTime(FileTime time) {
|
||||
Objects.requireNonNull(name, "time");
|
||||
this.mtime = time;
|
||||
this.mtime = Objects.requireNonNull(time, "lastModifiedTime");
|
||||
this.time = time.to(TimeUnit.MILLISECONDS);
|
||||
return this;
|
||||
}
|
||||
@ -227,8 +226,7 @@ class ZipEntry implements ZipConstants, Cloneable {
|
||||
* @since 1.8
|
||||
*/
|
||||
public ZipEntry setLastAccessTime(FileTime time) {
|
||||
Objects.requireNonNull(name, "time");
|
||||
this.atime = time;
|
||||
this.atime = Objects.requireNonNull(time, "lastAccessTime");
|
||||
return this;
|
||||
}
|
||||
|
||||
@ -265,8 +263,7 @@ class ZipEntry implements ZipConstants, Cloneable {
|
||||
* @since 1.8
|
||||
*/
|
||||
public ZipEntry setCreationTime(FileTime time) {
|
||||
Objects.requireNonNull(name, "time");
|
||||
this.ctime = time;
|
||||
this.ctime = Objects.requireNonNull(time, "creationTime");
|
||||
return this;
|
||||
}
|
||||
|
||||
|
@ -1,181 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) 1996, 2011, 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.
|
||||
*/
|
||||
package sun.security.acl;
|
||||
|
||||
import java.util.*;
|
||||
import java.security.Principal;
|
||||
import java.security.acl.*;
|
||||
|
||||
/**
|
||||
* This is a class that describes one entry that associates users
|
||||
* or groups with permissions in the ACL.
|
||||
* The entry may be used as a way of granting or denying permissions.
|
||||
* @author Satish Dharmaraj
|
||||
*/
|
||||
public class AclEntryImpl implements AclEntry {
|
||||
private Principal user = null;
|
||||
private Vector<Permission> permissionSet = new Vector<>(10, 10);
|
||||
private boolean negative = false;
|
||||
|
||||
/**
|
||||
* Construct an ACL entry that associates a user with permissions
|
||||
* in the ACL.
|
||||
* @param user The user that is associated with this entry.
|
||||
*/
|
||||
public AclEntryImpl(Principal user) {
|
||||
this.user = user;
|
||||
}
|
||||
|
||||
/**
|
||||
* Construct a null ACL entry
|
||||
*/
|
||||
public AclEntryImpl() {
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the principal in the entity. If a group or a
|
||||
* principal had already been set, a false value is
|
||||
* returned, otherwise a true value is returned.
|
||||
* @param user The user that is associated with this entry.
|
||||
* @return true if the principal is set, false if there is
|
||||
* one already.
|
||||
*/
|
||||
public boolean setPrincipal(Principal user) {
|
||||
if (this.user != null)
|
||||
return false;
|
||||
this.user = user;
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* This method sets the ACL to have negative permissions.
|
||||
* That is the user or group is denied the permission set
|
||||
* specified in the entry.
|
||||
*/
|
||||
public void setNegativePermissions() {
|
||||
negative = true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns true if this is a negative ACL.
|
||||
*/
|
||||
public boolean isNegative() {
|
||||
return negative;
|
||||
}
|
||||
|
||||
/**
|
||||
* A principal or a group can be associated with multiple
|
||||
* permissions. This method adds a permission to the ACL entry.
|
||||
* @param permission The permission to be associated with
|
||||
* the principal or the group in the entry.
|
||||
* @return true if the permission was added, false if the
|
||||
* permission was already part of the permission set.
|
||||
*/
|
||||
public boolean addPermission(Permission permission) {
|
||||
|
||||
if (permissionSet.contains(permission))
|
||||
return false;
|
||||
|
||||
permissionSet.addElement(permission);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* The method disassociates the permission from the Principal
|
||||
* or the Group in this ACL entry.
|
||||
* @param permission The permission to be disassociated with
|
||||
* the principal or the group in the entry.
|
||||
* @return true if the permission is removed, false if the
|
||||
* permission is not part of the permission set.
|
||||
*/
|
||||
public boolean removePermission(Permission permission) {
|
||||
return permissionSet.removeElement(permission);
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks if the passed permission is part of the allowed
|
||||
* permission set in this entry.
|
||||
* @param permission The permission that has to be part of
|
||||
* the permission set in the entry.
|
||||
* @return true if the permission passed is part of the
|
||||
* permission set in the entry, false otherwise.
|
||||
*/
|
||||
public boolean checkPermission(Permission permission) {
|
||||
return permissionSet.contains(permission);
|
||||
}
|
||||
|
||||
/**
|
||||
* return an enumeration of the permissions in this ACL entry.
|
||||
*/
|
||||
public Enumeration<Permission> permissions() {
|
||||
return permissionSet.elements();
|
||||
}
|
||||
|
||||
/**
|
||||
* Return a string representation of the contents of the ACL entry.
|
||||
*/
|
||||
public String toString() {
|
||||
StringBuffer s = new StringBuffer();
|
||||
if (negative)
|
||||
s.append("-");
|
||||
else
|
||||
s.append("+");
|
||||
if (user instanceof Group)
|
||||
s.append("Group.");
|
||||
else
|
||||
s.append("User.");
|
||||
s.append(user + "=");
|
||||
Enumeration<Permission> e = permissions();
|
||||
while(e.hasMoreElements()) {
|
||||
Permission p = e.nextElement();
|
||||
s.append(p);
|
||||
if (e.hasMoreElements())
|
||||
s.append(",");
|
||||
}
|
||||
return new String(s);
|
||||
}
|
||||
|
||||
/**
|
||||
* Clones an AclEntry.
|
||||
*/
|
||||
@SuppressWarnings("unchecked") // Safe casts assuming clone() works correctly
|
||||
public synchronized Object clone() {
|
||||
AclEntryImpl cloned;
|
||||
cloned = new AclEntryImpl(user);
|
||||
cloned.permissionSet = (Vector<Permission>) permissionSet.clone();
|
||||
cloned.negative = negative;
|
||||
return cloned;
|
||||
}
|
||||
|
||||
/**
|
||||
* Return the Principal associated in this ACL entry.
|
||||
* The method returns null if the entry uses a group
|
||||
* instead of a principal.
|
||||
*/
|
||||
public Principal getPrincipal() {
|
||||
return user;
|
||||
}
|
||||
}
|
@ -1,408 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) 1996, 2011, 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.
|
||||
*/
|
||||
|
||||
package sun.security.acl;
|
||||
|
||||
import java.io.*;
|
||||
import java.util.*;
|
||||
import java.security.Principal;
|
||||
import java.security.acl.*;
|
||||
|
||||
/**
|
||||
* An Access Control List (ACL) is encapsulated by this class.
|
||||
* @author Satish Dharmaraj
|
||||
*/
|
||||
public class AclImpl extends OwnerImpl implements Acl {
|
||||
//
|
||||
// Maintain four tables. one each for positive and negative
|
||||
// ACLs. One each depending on whether the entity is a group
|
||||
// or principal.
|
||||
//
|
||||
private Hashtable<Principal, AclEntry> allowedUsersTable =
|
||||
new Hashtable<>(23);
|
||||
private Hashtable<Principal, AclEntry> allowedGroupsTable =
|
||||
new Hashtable<>(23);
|
||||
private Hashtable<Principal, AclEntry> deniedUsersTable =
|
||||
new Hashtable<>(23);
|
||||
private Hashtable<Principal, AclEntry> deniedGroupsTable =
|
||||
new Hashtable<>(23);
|
||||
private String aclName = null;
|
||||
private Vector<Permission> zeroSet = new Vector<>(1,1);
|
||||
|
||||
|
||||
/**
|
||||
* Constructor for creating an empty ACL.
|
||||
*/
|
||||
public AclImpl(Principal owner, String name) {
|
||||
super(owner);
|
||||
try {
|
||||
setName(owner, name);
|
||||
} catch (Exception e) {}
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the name of the ACL.
|
||||
* @param caller the principal who is invoking this method.
|
||||
* @param name the name of the ACL.
|
||||
* @exception NotOwnerException if the caller principal is
|
||||
* not on the owners list of the Acl.
|
||||
*/
|
||||
public void setName(Principal caller, String name)
|
||||
throws NotOwnerException
|
||||
{
|
||||
if (!isOwner(caller))
|
||||
throw new NotOwnerException();
|
||||
|
||||
aclName = name;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the name of the ACL.
|
||||
* @return the name of the ACL.
|
||||
*/
|
||||
public String getName() {
|
||||
return aclName;
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds an ACL entry to this ACL. An entry associates a
|
||||
* group or a principal with a set of permissions. Each
|
||||
* user or group can have one positive ACL entry and one
|
||||
* negative ACL entry. If there is one of the type (negative
|
||||
* or positive) already in the table, a false value is returned.
|
||||
* The caller principal must be a part of the owners list of
|
||||
* the ACL in order to invoke this method.
|
||||
* @param caller the principal who is invoking this method.
|
||||
* @param entry the ACL entry that must be added to the ACL.
|
||||
* @return true on success, false if the entry is already present.
|
||||
* @exception NotOwnerException if the caller principal
|
||||
* is not on the owners list of the Acl.
|
||||
*/
|
||||
public synchronized boolean addEntry(Principal caller, AclEntry entry)
|
||||
throws NotOwnerException
|
||||
{
|
||||
if (!isOwner(caller))
|
||||
throw new NotOwnerException();
|
||||
|
||||
Hashtable<Principal, AclEntry> aclTable = findTable(entry);
|
||||
Principal key = entry.getPrincipal();
|
||||
|
||||
if (aclTable.get(key) != null)
|
||||
return false;
|
||||
|
||||
aclTable.put(key, entry);
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Removes an ACL entry from this ACL.
|
||||
* The caller principal must be a part of the owners list of the ACL
|
||||
* in order to invoke this method.
|
||||
* @param caller the principal who is invoking this method.
|
||||
* @param entry the ACL entry that must be removed from the ACL.
|
||||
* @return true on success, false if the entry is not part of the ACL.
|
||||
* @exception NotOwnerException if the caller principal is not
|
||||
* the owners list of the Acl.
|
||||
*/
|
||||
public synchronized boolean removeEntry(Principal caller, AclEntry entry)
|
||||
throws NotOwnerException
|
||||
{
|
||||
if (!isOwner(caller))
|
||||
throw new NotOwnerException();
|
||||
|
||||
Hashtable<Principal, AclEntry> aclTable = findTable(entry);
|
||||
Principal key = entry.getPrincipal();
|
||||
|
||||
AclEntry o = aclTable.remove(key);
|
||||
return (o != null);
|
||||
}
|
||||
|
||||
/**
|
||||
* This method returns the set of allowed permissions for the
|
||||
* specified principal. This set of allowed permissions is calculated
|
||||
* as follows:
|
||||
*
|
||||
* If there is no entry for a group or a principal an empty permission
|
||||
* set is assumed.
|
||||
*
|
||||
* The group positive permission set is the union of all
|
||||
* the positive permissions of each group that the individual belongs to.
|
||||
* The group negative permission set is the union of all
|
||||
* the negative permissions of each group that the individual belongs to.
|
||||
* If there is a specific permission that occurs in both
|
||||
* the postive permission set and the negative permission set,
|
||||
* it is removed from both. The group positive and negatoive permission
|
||||
* sets are calculated.
|
||||
*
|
||||
* The individial positive permission set and the individual negative
|
||||
* permission set is then calculated. Again abscence of an entry means
|
||||
* the empty set.
|
||||
*
|
||||
* The set of permissions granted to the principal is then calculated using
|
||||
* the simple rule: Individual permissions always override the Group permissions.
|
||||
* Specifically, individual negative permission set (specific
|
||||
* denial of permissions) overrides the group positive permission set.
|
||||
* And the individual positive permission set override the group negative
|
||||
* permission set.
|
||||
*
|
||||
* @param user the principal for which the ACL entry is returned.
|
||||
* @return The resulting permission set that the principal is allowed.
|
||||
*/
|
||||
public synchronized Enumeration<Permission> getPermissions(Principal user) {
|
||||
|
||||
Enumeration<Permission> individualPositive;
|
||||
Enumeration<Permission> individualNegative;
|
||||
Enumeration<Permission> groupPositive;
|
||||
Enumeration<Permission> groupNegative;
|
||||
|
||||
//
|
||||
// canonicalize the sets. That is remove common permissions from
|
||||
// positive and negative sets.
|
||||
//
|
||||
groupPositive =
|
||||
subtract(getGroupPositive(user), getGroupNegative(user));
|
||||
groupNegative =
|
||||
subtract(getGroupNegative(user), getGroupPositive(user));
|
||||
individualPositive =
|
||||
subtract(getIndividualPositive(user), getIndividualNegative(user));
|
||||
individualNegative =
|
||||
subtract(getIndividualNegative(user), getIndividualPositive(user));
|
||||
|
||||
//
|
||||
// net positive permissions is individual positive permissions
|
||||
// plus (group positive - individual negative).
|
||||
//
|
||||
Enumeration<Permission> temp1 =
|
||||
subtract(groupPositive, individualNegative);
|
||||
Enumeration<Permission> netPositive =
|
||||
union(individualPositive, temp1);
|
||||
|
||||
// recalculate the enumeration since we lost it in performing the
|
||||
// subtraction
|
||||
//
|
||||
individualPositive =
|
||||
subtract(getIndividualPositive(user), getIndividualNegative(user));
|
||||
individualNegative =
|
||||
subtract(getIndividualNegative(user), getIndividualPositive(user));
|
||||
|
||||
//
|
||||
// net negative permissions is individual negative permissions
|
||||
// plus (group negative - individual positive).
|
||||
//
|
||||
temp1 = subtract(groupNegative, individualPositive);
|
||||
Enumeration<Permission> netNegative = union(individualNegative, temp1);
|
||||
|
||||
return subtract(netPositive, netNegative);
|
||||
}
|
||||
|
||||
/**
|
||||
* This method checks whether or not the specified principal
|
||||
* has the required permission. If permission is denied
|
||||
* permission false is returned, a true value is returned otherwise.
|
||||
* This method does not authenticate the principal. It presumes that
|
||||
* the principal is a valid authenticated principal.
|
||||
* @param principal the name of the authenticated principal
|
||||
* @param permission the permission that the principal must have.
|
||||
* @return true of the principal has the permission desired, false
|
||||
* otherwise.
|
||||
*/
|
||||
public boolean checkPermission(Principal principal, Permission permission)
|
||||
{
|
||||
Enumeration<Permission> permSet = getPermissions(principal);
|
||||
while (permSet.hasMoreElements()) {
|
||||
Permission p = permSet.nextElement();
|
||||
if (p.equals(permission))
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* returns an enumeration of the entries in this ACL.
|
||||
*/
|
||||
public synchronized Enumeration<AclEntry> entries() {
|
||||
return new AclEnumerator(this,
|
||||
allowedUsersTable, allowedGroupsTable,
|
||||
deniedUsersTable, deniedGroupsTable);
|
||||
}
|
||||
|
||||
/**
|
||||
* return a stringified version of the
|
||||
* ACL.
|
||||
*/
|
||||
public String toString() {
|
||||
StringBuilder sb = new StringBuilder();
|
||||
Enumeration<AclEntry> entries = entries();
|
||||
while (entries.hasMoreElements()) {
|
||||
AclEntry entry = entries.nextElement();
|
||||
sb.append(entry.toString().trim());
|
||||
sb.append("\n");
|
||||
}
|
||||
|
||||
return sb.toString();
|
||||
}
|
||||
|
||||
//
|
||||
// Find the table that this entry belongs to. There are 4
|
||||
// tables that are maintained. One each for postive and
|
||||
// negative ACLs and one each for groups and users.
|
||||
// This method figures out which
|
||||
// table is the one that this AclEntry belongs to.
|
||||
//
|
||||
private Hashtable<Principal, AclEntry> findTable(AclEntry entry) {
|
||||
Hashtable<Principal, AclEntry> aclTable = null;
|
||||
|
||||
Principal p = entry.getPrincipal();
|
||||
if (p instanceof Group) {
|
||||
if (entry.isNegative())
|
||||
aclTable = deniedGroupsTable;
|
||||
else
|
||||
aclTable = allowedGroupsTable;
|
||||
} else {
|
||||
if (entry.isNegative())
|
||||
aclTable = deniedUsersTable;
|
||||
else
|
||||
aclTable = allowedUsersTable;
|
||||
}
|
||||
return aclTable;
|
||||
}
|
||||
|
||||
//
|
||||
// returns the set e1 U e2.
|
||||
//
|
||||
private static Enumeration<Permission> union(Enumeration<Permission> e1,
|
||||
Enumeration<Permission> e2) {
|
||||
Vector<Permission> v = new Vector<>(20, 20);
|
||||
|
||||
while (e1.hasMoreElements())
|
||||
v.addElement(e1.nextElement());
|
||||
|
||||
while (e2.hasMoreElements()) {
|
||||
Permission o = e2.nextElement();
|
||||
if (!v.contains(o))
|
||||
v.addElement(o);
|
||||
}
|
||||
|
||||
return v.elements();
|
||||
}
|
||||
|
||||
//
|
||||
// returns the set e1 - e2.
|
||||
//
|
||||
private Enumeration<Permission> subtract(Enumeration<Permission> e1,
|
||||
Enumeration<Permission> e2) {
|
||||
Vector<Permission> v = new Vector<>(20, 20);
|
||||
|
||||
while (e1.hasMoreElements())
|
||||
v.addElement(e1.nextElement());
|
||||
|
||||
while (e2.hasMoreElements()) {
|
||||
Permission o = e2.nextElement();
|
||||
if (v.contains(o))
|
||||
v.removeElement(o);
|
||||
}
|
||||
|
||||
return v.elements();
|
||||
}
|
||||
|
||||
private Enumeration<Permission> getGroupPositive(Principal user) {
|
||||
Enumeration<Permission> groupPositive = zeroSet.elements();
|
||||
Enumeration<Principal> e = allowedGroupsTable.keys();
|
||||
while (e.hasMoreElements()) {
|
||||
Group g = (Group)e.nextElement();
|
||||
if (g.isMember(user)) {
|
||||
AclEntry ae = allowedGroupsTable.get(g);
|
||||
groupPositive = union(ae.permissions(), groupPositive);
|
||||
}
|
||||
}
|
||||
return groupPositive;
|
||||
}
|
||||
|
||||
private Enumeration<Permission> getGroupNegative(Principal user) {
|
||||
Enumeration<Permission> groupNegative = zeroSet.elements();
|
||||
Enumeration<Principal> e = deniedGroupsTable.keys();
|
||||
while (e.hasMoreElements()) {
|
||||
Group g = (Group)e.nextElement();
|
||||
if (g.isMember(user)) {
|
||||
AclEntry ae = deniedGroupsTable.get(g);
|
||||
groupNegative = union(ae.permissions(), groupNegative);
|
||||
}
|
||||
}
|
||||
return groupNegative;
|
||||
}
|
||||
|
||||
private Enumeration<Permission> getIndividualPositive(Principal user) {
|
||||
Enumeration<Permission> individualPositive = zeroSet.elements();
|
||||
AclEntry ae = allowedUsersTable.get(user);
|
||||
if (ae != null)
|
||||
individualPositive = ae.permissions();
|
||||
return individualPositive;
|
||||
}
|
||||
|
||||
private Enumeration<Permission> getIndividualNegative(Principal user) {
|
||||
Enumeration<Permission> individualNegative = zeroSet.elements();
|
||||
AclEntry ae = deniedUsersTable.get(user);
|
||||
if (ae != null)
|
||||
individualNegative = ae.permissions();
|
||||
return individualNegative;
|
||||
}
|
||||
}
|
||||
|
||||
final class AclEnumerator implements Enumeration<AclEntry> {
|
||||
Acl acl;
|
||||
Enumeration<AclEntry> u1, u2, g1, g2;
|
||||
|
||||
AclEnumerator(Acl acl, Hashtable<?,AclEntry> u1, Hashtable<?,AclEntry> g1,
|
||||
Hashtable<?,AclEntry> u2, Hashtable<?,AclEntry> g2) {
|
||||
this.acl = acl;
|
||||
this.u1 = u1.elements();
|
||||
this.u2 = u2.elements();
|
||||
this.g1 = g1.elements();
|
||||
this.g2 = g2.elements();
|
||||
}
|
||||
|
||||
public boolean hasMoreElements() {
|
||||
return (u1.hasMoreElements() ||
|
||||
u2.hasMoreElements() ||
|
||||
g1.hasMoreElements() ||
|
||||
g2.hasMoreElements());
|
||||
}
|
||||
|
||||
public AclEntry nextElement()
|
||||
{
|
||||
AclEntry o;
|
||||
synchronized (acl) {
|
||||
if (u1.hasMoreElements())
|
||||
return u1.nextElement();
|
||||
if (u2.hasMoreElements())
|
||||
return u2.nextElement();
|
||||
if (g1.hasMoreElements())
|
||||
return g1.nextElement();
|
||||
if (g2.hasMoreElements())
|
||||
return g2.nextElement();
|
||||
}
|
||||
throw new NoSuchElementException("Acl Enumerator");
|
||||
}
|
||||
}
|
@ -1,186 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) 1996, 2011, 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.
|
||||
*/
|
||||
|
||||
package sun.security.acl;
|
||||
|
||||
import java.util.*;
|
||||
import java.security.*;
|
||||
import java.security.acl.*;
|
||||
|
||||
/**
|
||||
* This class implements a group of principals.
|
||||
* @author Satish Dharmaraj
|
||||
*/
|
||||
public class GroupImpl implements Group {
|
||||
private Vector<Principal> groupMembers = new Vector<>(50, 100);
|
||||
private String group;
|
||||
|
||||
/**
|
||||
* Constructs a Group object with no members.
|
||||
* @param groupName the name of the group
|
||||
*/
|
||||
public GroupImpl(String groupName) {
|
||||
this.group = groupName;
|
||||
}
|
||||
|
||||
/**
|
||||
* adds the specified member to the group.
|
||||
* @param user The principal to add to the group.
|
||||
* @return true if the member was added - false if the
|
||||
* member could not be added.
|
||||
*/
|
||||
public boolean addMember(Principal user) {
|
||||
if (groupMembers.contains(user))
|
||||
return false;
|
||||
|
||||
// do not allow groups to be added to itself.
|
||||
if (group.equals(user.toString()))
|
||||
throw new IllegalArgumentException();
|
||||
|
||||
groupMembers.addElement(user);
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* removes the specified member from the group.
|
||||
* @param user The principal to remove from the group.
|
||||
* @param true if the principal was removed false if
|
||||
* the principal was not a member
|
||||
*/
|
||||
public boolean removeMember(Principal user) {
|
||||
return groupMembers.removeElement(user);
|
||||
}
|
||||
|
||||
/**
|
||||
* returns the enumeration of the members in the group.
|
||||
*/
|
||||
public Enumeration<? extends Principal> members() {
|
||||
return groupMembers.elements();
|
||||
}
|
||||
|
||||
/**
|
||||
* This function returns true if the group passed matches
|
||||
* the group represented in this interface.
|
||||
* @param another The group to compare this group to.
|
||||
*/
|
||||
public boolean equals(Object obj) {
|
||||
if (this == obj) {
|
||||
return true;
|
||||
}
|
||||
if (obj instanceof Group == false) {
|
||||
return false;
|
||||
}
|
||||
Group another = (Group)obj;
|
||||
return group.equals(another.toString());
|
||||
}
|
||||
|
||||
// equals(Group) for compatibility
|
||||
public boolean equals(Group another) {
|
||||
return equals((Object)another);
|
||||
}
|
||||
|
||||
/**
|
||||
* Prints a stringified version of the group.
|
||||
*/
|
||||
public String toString() {
|
||||
return group;
|
||||
}
|
||||
|
||||
/**
|
||||
* return a hashcode for the principal.
|
||||
*/
|
||||
public int hashCode() {
|
||||
return group.hashCode();
|
||||
}
|
||||
|
||||
/**
|
||||
* returns true if the passed principal is a member of the group.
|
||||
* @param member The principal whose membership must be checked for.
|
||||
* @return true if the principal is a member of this group,
|
||||
* false otherwise
|
||||
*/
|
||||
public boolean isMember(Principal member) {
|
||||
|
||||
//
|
||||
// if the member is part of the group (common case), return true.
|
||||
// if not, recursively search depth first in the group looking for the
|
||||
// principal.
|
||||
//
|
||||
if (groupMembers.contains(member)) {
|
||||
return true;
|
||||
} else {
|
||||
Vector<Group> alreadySeen = new Vector<>(10);
|
||||
return isMemberRecurse(member, alreadySeen);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* return the name of the principal.
|
||||
*/
|
||||
public String getName() {
|
||||
return group;
|
||||
}
|
||||
|
||||
//
|
||||
// This function is the recursive search of groups for this
|
||||
// implementation of the Group. The search proceeds building up
|
||||
// a vector of already seen groups. Only new groups are considered,
|
||||
// thereby avoiding loops.
|
||||
//
|
||||
boolean isMemberRecurse(Principal member, Vector<Group> alreadySeen) {
|
||||
Enumeration<? extends Principal> e = members();
|
||||
while (e.hasMoreElements()) {
|
||||
boolean mem = false;
|
||||
Principal p = (Principal) e.nextElement();
|
||||
|
||||
// if the member is in this collection, return true
|
||||
if (p.equals(member)) {
|
||||
return true;
|
||||
} else if (p instanceof GroupImpl) {
|
||||
//
|
||||
// if not recurse if the group has not been checked already.
|
||||
// Can call method in this package only if the object is an
|
||||
// instance of this class. Otherwise call the method defined
|
||||
// in the interface. (This can lead to a loop if a mixture of
|
||||
// implementations form a loop, but we live with this improbable
|
||||
// case rather than clutter the interface by forcing the
|
||||
// implementation of this method.)
|
||||
//
|
||||
GroupImpl g = (GroupImpl) p;
|
||||
alreadySeen.addElement(this);
|
||||
if (!alreadySeen.contains(g))
|
||||
mem = g.isMemberRecurse(member, alreadySeen);
|
||||
} else if (p instanceof Group) {
|
||||
Group g = (Group) p;
|
||||
if (!alreadySeen.contains(g))
|
||||
mem = g.isMember(member);
|
||||
}
|
||||
|
||||
if (mem)
|
||||
return mem;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
}
|
@ -1,108 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) 1996, 2006, 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.
|
||||
*/
|
||||
|
||||
package sun.security.acl;
|
||||
|
||||
import java.util.*;
|
||||
import java.security.*;
|
||||
import java.security.acl.*;
|
||||
|
||||
/**
|
||||
* Class implementing the Owner interface. The
|
||||
* initial owner principal is configured as
|
||||
* part of the constructor.
|
||||
* @author Satish Dharmaraj
|
||||
*/
|
||||
public class OwnerImpl implements Owner {
|
||||
private Group ownerGroup;
|
||||
|
||||
public OwnerImpl(Principal owner) {
|
||||
ownerGroup = new GroupImpl("AclOwners");
|
||||
ownerGroup.addMember(owner);
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds an owner. Owners can modify ACL contents and can disassociate
|
||||
* ACLs from the objects they protect in the AclConfig interface.
|
||||
* The caller principal must be a part of the owners list of the ACL in
|
||||
* order to invoke this method. The initial owner is configured
|
||||
* at ACL construction time.
|
||||
* @param caller the principal who is invoking this method.
|
||||
* @param owner The owner that should be added to the owners list.
|
||||
* @return true if success, false if already an owner.
|
||||
* @exception NotOwnerException if the caller principal is not on
|
||||
* the owners list of the Acl.
|
||||
*/
|
||||
public synchronized boolean addOwner(Principal caller, Principal owner)
|
||||
throws NotOwnerException
|
||||
{
|
||||
if (!isOwner(caller))
|
||||
throw new NotOwnerException();
|
||||
|
||||
ownerGroup.addMember(owner);
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Delete owner. If this is the last owner in the ACL, an exception is
|
||||
* raised.
|
||||
* The caller principal must be a part of the owners list of the ACL in
|
||||
* order to invoke this method.
|
||||
* @param caller the principal who is invoking this method.
|
||||
* @param owner The owner to be removed from the owners list.
|
||||
* @return true if the owner is removed, false if the owner is not part
|
||||
* of the owners list.
|
||||
* @exception NotOwnerException if the caller principal is not on
|
||||
* the owners list of the Acl.
|
||||
* @exception LastOwnerException if there is only one owner left in the group, then
|
||||
* deleteOwner would leave the ACL owner-less. This exception is raised in such a case.
|
||||
*/
|
||||
public synchronized boolean deleteOwner(Principal caller, Principal owner)
|
||||
throws NotOwnerException, LastOwnerException
|
||||
{
|
||||
if (!isOwner(caller))
|
||||
throw new NotOwnerException();
|
||||
|
||||
Enumeration<? extends Principal> e = ownerGroup.members();
|
||||
//
|
||||
// check if there is atleast 2 members left.
|
||||
//
|
||||
Object o = e.nextElement();
|
||||
if (e.hasMoreElements())
|
||||
return ownerGroup.removeMember(owner);
|
||||
else
|
||||
throw new LastOwnerException();
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* returns if the given principal belongs to the owner list.
|
||||
* @param owner The owner to check if part of the owners list
|
||||
* @return true if the passed principal is in the owner list, false if not.
|
||||
*/
|
||||
public synchronized boolean isOwner(Principal owner) {
|
||||
return ownerGroup.isMember(owner);
|
||||
}
|
||||
}
|
@ -1,80 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) 1996, 1999, 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.
|
||||
*/
|
||||
|
||||
package sun.security.acl;
|
||||
|
||||
import java.security.Principal;
|
||||
import java.security.acl.*;
|
||||
|
||||
/**
|
||||
* The PermissionImpl class implements the permission
|
||||
* interface for permissions that are strings.
|
||||
* @author Satish Dharmaraj
|
||||
*/
|
||||
public class PermissionImpl implements Permission {
|
||||
|
||||
private String permission;
|
||||
|
||||
/**
|
||||
* Construct a permission object using a string.
|
||||
* @param permission the stringified version of the permission.
|
||||
*/
|
||||
public PermissionImpl(String permission) {
|
||||
this.permission = permission;
|
||||
}
|
||||
|
||||
/**
|
||||
* This function returns true if the object passed matches the permission
|
||||
* represented in this interface.
|
||||
* @param another The Permission object to compare with.
|
||||
* @return true if the Permission objects are equal, false otherwise
|
||||
*/
|
||||
public boolean equals(Object another) {
|
||||
if (another instanceof Permission) {
|
||||
Permission p = (Permission) another;
|
||||
return permission.equals(p.toString());
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Prints a stringified version of the permission.
|
||||
* @return the string representation of the Permission.
|
||||
*/
|
||||
public String toString() {
|
||||
return permission;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a hashcode for this PermissionImpl.
|
||||
*
|
||||
* @return a hashcode for this PermissionImpl.
|
||||
*/
|
||||
public int hashCode() {
|
||||
return toString().hashCode();
|
||||
}
|
||||
|
||||
}
|
@ -1,83 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) 1996, 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.
|
||||
*/
|
||||
|
||||
package sun.security.acl;
|
||||
|
||||
import java.security.*;
|
||||
|
||||
/**
|
||||
* This class implements the principal interface.
|
||||
*
|
||||
* @author Satish Dharmaraj
|
||||
*/
|
||||
public class PrincipalImpl implements Principal {
|
||||
|
||||
private String user;
|
||||
|
||||
/**
|
||||
* Construct a principal from a string user name.
|
||||
* @param user The string form of the principal name.
|
||||
*/
|
||||
public PrincipalImpl(String user) {
|
||||
this.user = user;
|
||||
}
|
||||
|
||||
/**
|
||||
* This function returns true if the object passed matches
|
||||
* the principal represented in this implementation
|
||||
* @param another the Principal to compare with.
|
||||
* @return true if the Principal passed is the same as that
|
||||
* encapsulated in this object, false otherwise
|
||||
*/
|
||||
public boolean equals(Object another) {
|
||||
if (another instanceof PrincipalImpl) {
|
||||
PrincipalImpl p = (PrincipalImpl) another;
|
||||
return user.equals(p.toString());
|
||||
} else
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Prints a stringified version of the principal.
|
||||
*/
|
||||
public String toString() {
|
||||
return user;
|
||||
}
|
||||
|
||||
/**
|
||||
* return a hashcode for the principal.
|
||||
*/
|
||||
public int hashCode() {
|
||||
return user.hashCode();
|
||||
}
|
||||
|
||||
/**
|
||||
* return the name of the principal.
|
||||
*/
|
||||
public String getName() {
|
||||
return user;
|
||||
}
|
||||
|
||||
}
|
@ -3765,55 +3765,70 @@ public final class Main {
|
||||
}
|
||||
}
|
||||
|
||||
// Add an extension into a CertificateExtensions, always using OID as key
|
||||
private static void setExt(CertificateExtensions result, Extension ex)
|
||||
throws IOException {
|
||||
result.set(ex.getId(), ex);
|
||||
}
|
||||
|
||||
/**
|
||||
* Create X509v3 extensions from a string representation. Note that the
|
||||
* SubjectKeyIdentifierExtension will always be created non-critical besides
|
||||
* the extension requested in the <code>extstr</code> argument.
|
||||
*
|
||||
* @param reqex the requested extensions, can be null, used for -gencert
|
||||
* @param ext the original extensions, can be null, used for -selfcert
|
||||
* @param requestedEx the requested extensions, can be null, used for -gencert
|
||||
* @param existingEx the original extensions, can be null, used for -selfcert
|
||||
* @param extstrs -ext values, Read keytool doc
|
||||
* @param pkey the public key for the certificate
|
||||
* @param akey the public key for the authority (issuer)
|
||||
* @return the created CertificateExtensions
|
||||
*/
|
||||
private CertificateExtensions createV3Extensions(
|
||||
CertificateExtensions reqex,
|
||||
CertificateExtensions ext,
|
||||
CertificateExtensions requestedEx,
|
||||
CertificateExtensions existingEx,
|
||||
List <String> extstrs,
|
||||
PublicKey pkey,
|
||||
PublicKey akey) throws Exception {
|
||||
|
||||
if (ext != null && reqex != null) {
|
||||
if (existingEx != null && requestedEx != null) {
|
||||
// This should not happen
|
||||
throw new Exception("One of request and original should be null.");
|
||||
}
|
||||
if (ext == null) ext = new CertificateExtensions();
|
||||
// A new extensions always using OID as key
|
||||
CertificateExtensions result = new CertificateExtensions();
|
||||
if (existingEx != null) {
|
||||
for (Extension ex: existingEx.getAllExtensions()) {
|
||||
setExt(result, ex);
|
||||
}
|
||||
}
|
||||
try {
|
||||
// name{:critical}{=value}
|
||||
// Honoring requested extensions
|
||||
if (reqex != null) {
|
||||
if (requestedEx != null) {
|
||||
for(String extstr: extstrs) {
|
||||
if (extstr.toLowerCase(Locale.ENGLISH).startsWith("honored=")) {
|
||||
List<String> list = Arrays.asList(
|
||||
extstr.toLowerCase(Locale.ENGLISH).substring(8).split(","));
|
||||
// First check existence of "all"
|
||||
if (list.contains("all")) {
|
||||
ext = reqex; // we know ext was null
|
||||
for (Extension ex: requestedEx.getAllExtensions()) {
|
||||
setExt(result, ex);
|
||||
}
|
||||
}
|
||||
// one by one for others
|
||||
for (String item: list) {
|
||||
if (item.equals("all")) continue;
|
||||
|
||||
// add or remove
|
||||
boolean add = true;
|
||||
// -1, unchanged, 0 crtical, 1 non-critical
|
||||
boolean add;
|
||||
// -1, unchanged, 0 critical, 1 non-critical
|
||||
int action = -1;
|
||||
String type = null;
|
||||
if (item.startsWith("-")) {
|
||||
add = false;
|
||||
type = item.substring(1);
|
||||
} else {
|
||||
add = true;
|
||||
int colonpos = item.indexOf(':');
|
||||
if (colonpos >= 0) {
|
||||
type = item.substring(0, colonpos);
|
||||
@ -3823,21 +3838,23 @@ public final class Main {
|
||||
throw new Exception(rb.getString
|
||||
("Illegal.value.") + item);
|
||||
}
|
||||
} else {
|
||||
type = item;
|
||||
}
|
||||
}
|
||||
String n = reqex.getNameByOid(findOidForExtName(type));
|
||||
String n = findOidForExtName(type).toString();
|
||||
if (add) {
|
||||
Extension e = reqex.get(n);
|
||||
Extension e = requestedEx.get(n);
|
||||
if (!e.isCritical() && action == 0
|
||||
|| e.isCritical() && action == 1) {
|
||||
e = Extension.newExtension(
|
||||
e.getExtensionId(),
|
||||
!e.isCritical(),
|
||||
e.getExtensionValue());
|
||||
ext.set(n, e);
|
||||
}
|
||||
setExt(result, e);
|
||||
} else {
|
||||
ext.delete(n);
|
||||
result.delete(n);
|
||||
}
|
||||
}
|
||||
break;
|
||||
@ -3899,8 +3916,7 @@ public final class Main {
|
||||
}
|
||||
}
|
||||
}
|
||||
ext.set(BasicConstraintsExtension.NAME,
|
||||
new BasicConstraintsExtension(isCritical, isCA,
|
||||
setExt(result, new BasicConstraintsExtension(isCritical, isCA,
|
||||
pathLen));
|
||||
break;
|
||||
case 1: // KU
|
||||
@ -3928,7 +3944,7 @@ public final class Main {
|
||||
KeyUsageExtension kue = new KeyUsageExtension(ok);
|
||||
// The above KeyUsageExtension constructor does not
|
||||
// allow isCritical value, so...
|
||||
ext.set(KeyUsageExtension.NAME, Extension.newExtension(
|
||||
setExt(result, Extension.newExtension(
|
||||
kue.getExtensionId(),
|
||||
isCritical,
|
||||
kue.getExtensionValue()));
|
||||
@ -3966,8 +3982,7 @@ public final class Main {
|
||||
v.add(new ObjectIdentifier("1.3.6.1.5.5.7.3." + p));
|
||||
}
|
||||
}
|
||||
ext.set(ExtendedKeyUsageExtension.NAME,
|
||||
new ExtendedKeyUsageExtension(isCritical, v));
|
||||
setExt(result, new ExtendedKeyUsageExtension(isCritical, v));
|
||||
} else {
|
||||
throw new Exception(rb.getString
|
||||
("Illegal.value.") + extstr);
|
||||
@ -3988,13 +4003,11 @@ public final class Main {
|
||||
gnames.add(createGeneralName(t, v));
|
||||
}
|
||||
if (exttype == 3) {
|
||||
ext.set(SubjectAlternativeNameExtension.NAME,
|
||||
new SubjectAlternativeNameExtension(
|
||||
isCritical, gnames));
|
||||
setExt(result, new SubjectAlternativeNameExtension(
|
||||
isCritical, gnames));
|
||||
} else {
|
||||
ext.set(IssuerAlternativeNameExtension.NAME,
|
||||
new IssuerAlternativeNameExtension(
|
||||
isCritical, gnames));
|
||||
setExt(result, new IssuerAlternativeNameExtension(
|
||||
isCritical, gnames));
|
||||
}
|
||||
} else {
|
||||
throw new Exception(rb.getString
|
||||
@ -4044,11 +4057,9 @@ public final class Main {
|
||||
oid, createGeneralName(t, v)));
|
||||
}
|
||||
if (exttype == 5) {
|
||||
ext.set(SubjectInfoAccessExtension.NAME,
|
||||
new SubjectInfoAccessExtension(accessDescriptions));
|
||||
setExt(result, new SubjectInfoAccessExtension(accessDescriptions));
|
||||
} else {
|
||||
ext.set(AuthorityInfoAccessExtension.NAME,
|
||||
new AuthorityInfoAccessExtension(accessDescriptions));
|
||||
setExt(result, new AuthorityInfoAccessExtension(accessDescriptions));
|
||||
}
|
||||
} else {
|
||||
throw new Exception(rb.getString
|
||||
@ -4068,10 +4079,9 @@ public final class Main {
|
||||
String v = item.substring(colonpos+1);
|
||||
gnames.add(createGeneralName(t, v));
|
||||
}
|
||||
ext.set(CRLDistributionPointsExtension.NAME,
|
||||
new CRLDistributionPointsExtension(
|
||||
isCritical, Collections.singletonList(
|
||||
new DistributionPoint(gnames, null, null))));
|
||||
setExt(result, new CRLDistributionPointsExtension(
|
||||
isCritical, Collections.singletonList(
|
||||
new DistributionPoint(gnames, null, null))));
|
||||
} else {
|
||||
throw new Exception(rb.getString
|
||||
("Illegal.value.") + extstr);
|
||||
@ -4109,7 +4119,7 @@ public final class Main {
|
||||
} else {
|
||||
data = new byte[0];
|
||||
}
|
||||
ext.set(oid.toString(), new Extension(oid, isCritical,
|
||||
setExt(result, new Extension(oid, isCritical,
|
||||
new DerValue(DerValue.tag_OctetString, data)
|
||||
.toByteArray()));
|
||||
break;
|
||||
@ -4119,18 +4129,16 @@ public final class Main {
|
||||
}
|
||||
}
|
||||
// always non-critical
|
||||
ext.set(SubjectKeyIdentifierExtension.NAME,
|
||||
new SubjectKeyIdentifierExtension(
|
||||
new KeyIdentifier(pkey).getIdentifier()));
|
||||
setExt(result, new SubjectKeyIdentifierExtension(
|
||||
new KeyIdentifier(pkey).getIdentifier()));
|
||||
if (akey != null && !pkey.equals(akey)) {
|
||||
ext.set(AuthorityKeyIdentifierExtension.NAME,
|
||||
new AuthorityKeyIdentifierExtension(
|
||||
new KeyIdentifier(akey), null, null));
|
||||
setExt(result, new AuthorityKeyIdentifierExtension(
|
||||
new KeyIdentifier(akey), null, null));
|
||||
}
|
||||
} catch(IOException e) {
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
return ext;
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 1998, 2014, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 1998, 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
|
||||
@ -80,11 +80,13 @@ public class Debug {
|
||||
System.err.println("jar jar verification");
|
||||
System.err.println("logincontext login context results");
|
||||
System.err.println("jca JCA engine class debugging");
|
||||
System.err.println("keystore KeyStore debugging");
|
||||
System.err.println("policy loading and granting");
|
||||
System.err.println("provider security provider debugging");
|
||||
System.err.println("pkcs11 PKCS11 session manager debugging");
|
||||
System.err.println("pkcs11keystore");
|
||||
System.err.println(" PKCS11 KeyStore debugging");
|
||||
System.err.println("pkcs12 PKCS12 KeyStore debugging");
|
||||
System.err.println("sunpkcs11 SunPKCS11 provider debugging");
|
||||
System.err.println("scl permissions SecureClassLoader assigns");
|
||||
System.err.println("ts timestamping");
|
||||
@ -114,6 +116,10 @@ public class Debug {
|
||||
System.err.println(" KeyPairGenerator, KeyStore, Mac,");
|
||||
System.err.println(" MessageDigest, SecureRandom, Signature.");
|
||||
System.err.println();
|
||||
System.err.println("The following can be used with certpath:");
|
||||
System.err.println();
|
||||
System.err.println("ocsp dump the OCSP protocol exchanges");
|
||||
System.err.println();
|
||||
System.err.println("Note: Separate multiple options with a comma");
|
||||
System.exit(0);
|
||||
}
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2009, 2013, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2009, 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
|
||||
@ -29,7 +29,7 @@ package sun.util.logging;
|
||||
import java.lang.reflect.Field;
|
||||
import java.security.AccessController;
|
||||
import java.security.PrivilegedAction;
|
||||
import java.util.Date;
|
||||
import java.time.ZonedDateTime;
|
||||
|
||||
/**
|
||||
* Internal API to support JRE implementation to detect if the java.util.logging
|
||||
@ -145,6 +145,11 @@ public class LoggingSupport {
|
||||
return proxy.getLevelValue(level);
|
||||
}
|
||||
|
||||
// Since JDK 9, logging uses java.time to get more precise time stamps.
|
||||
// It is possible to configure the simple format to print nano seconds (.%1$tN)
|
||||
// by specifying:
|
||||
// java.util.logging.SimpleFormatter.format=%1$tb %1$td, %1$tY %1$tl:%1$tM:%1$tS.%1$tN %1$Tp %2$s%n%4$s: %5$s%6$s%n
|
||||
// in the logging configuration
|
||||
private static final String DEFAULT_FORMAT =
|
||||
"%1$tb %1$td, %1$tY %1$tl:%1$tM:%1$tS %1$Tp %2$s%n%4$s: %5$s%6$s%n";
|
||||
|
||||
@ -171,7 +176,7 @@ public class LoggingSupport {
|
||||
if (format != null) {
|
||||
try {
|
||||
// validate the user-defined format string
|
||||
String.format(format, new Date(), "", "", "", "", "");
|
||||
String.format(format, ZonedDateTime.now(), "", "", "", "", "");
|
||||
} catch (IllegalArgumentException e) {
|
||||
// illegal syntax; fall back to the default format
|
||||
format = DEFAULT_FORMAT;
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2009, 2013, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2009, 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
|
||||
@ -32,8 +32,11 @@ import java.io.PrintWriter;
|
||||
import java.io.StringWriter;
|
||||
import java.security.AccessController;
|
||||
import java.security.PrivilegedAction;
|
||||
import java.time.Clock;
|
||||
import java.time.Instant;
|
||||
import java.time.ZoneId;
|
||||
import java.time.ZonedDateTime;
|
||||
import java.util.Arrays;
|
||||
import java.util.Date;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
import sun.misc.JavaLangAccess;
|
||||
@ -514,11 +517,9 @@ public class PlatformLogger {
|
||||
|
||||
private static final String formatString =
|
||||
LoggingSupport.getSimpleFormat(false); // don't check logging.properties
|
||||
|
||||
// minimize memory allocation
|
||||
private Date date = new Date();
|
||||
private final ZoneId zoneId = ZoneId.systemDefault();
|
||||
private synchronized String format(Level level, String msg, Throwable thrown) {
|
||||
date.setTime(System.currentTimeMillis());
|
||||
ZonedDateTime zdt = ZonedDateTime.now(zoneId);
|
||||
String throwable = "";
|
||||
if (thrown != null) {
|
||||
StringWriter sw = new StringWriter();
|
||||
@ -530,7 +531,7 @@ public class PlatformLogger {
|
||||
}
|
||||
|
||||
return String.format(formatString,
|
||||
date,
|
||||
zdt,
|
||||
getCallerInfo(),
|
||||
name,
|
||||
level.name(),
|
||||
|
@ -651,9 +651,26 @@ static void
|
||||
SetJvmEnvironment(int argc, char **argv) {
|
||||
|
||||
static const char* NMT_Env_Name = "NMT_LEVEL_";
|
||||
|
||||
int i;
|
||||
for (i = 0; i < argc; i++) {
|
||||
char *arg = argv[i];
|
||||
/*
|
||||
* Since this must be a VM flag we stop processing once we see
|
||||
* an argument the launcher would not have processed beyond (such
|
||||
* as -version or -h), or an argument that indicates the following
|
||||
* arguments are for the application (i.e. the main class name, or
|
||||
* the -jar argument).
|
||||
*/
|
||||
if ((i > 0 && *arg != '-')
|
||||
|| JLI_StrCmp(arg, "-version") == 0
|
||||
|| JLI_StrCmp(arg, "-fullversion") == 0
|
||||
|| JLI_StrCmp(arg, "-help") == 0
|
||||
|| JLI_StrCmp(arg, "-?") == 0
|
||||
|| JLI_StrCmp(arg, "-jar") == 0
|
||||
|| JLI_StrCmp(arg, "-X") == 0
|
||||
) {
|
||||
return;
|
||||
}
|
||||
/*
|
||||
* The following case checks for "-XX:NativeMemoryTracking=value".
|
||||
* If value is non null, an environmental variable set to this value
|
||||
@ -661,7 +678,6 @@ SetJvmEnvironment(int argc, char **argv) {
|
||||
* The argument is passed to the JVM, which will check validity.
|
||||
* The JVM is responsible for removing the env variable.
|
||||
*/
|
||||
char *arg = argv[i];
|
||||
if (JLI_StrCCmp(arg, "-XX:NativeMemoryTracking=") == 0) {
|
||||
int retval;
|
||||
// get what follows this parameter, include "="
|
||||
|
@ -88,6 +88,7 @@ JNIEXPORT void JNICALL Java_sun_net_ExtendedOptionsImpl_init
|
||||
/* SocketFlow fields */
|
||||
|
||||
c = (*env)->FindClass(env, "jdk/net/SocketFlow");
|
||||
CHECK_NULL(c);
|
||||
|
||||
/* status */
|
||||
|
||||
|
@ -201,7 +201,7 @@ Java_sun_nio_ch_DatagramChannelImpl_receive0(JNIEnv *env, jobject this,
|
||||
}
|
||||
if (senderAddr == NULL) {
|
||||
jobject isa = NULL;
|
||||
int port;
|
||||
int port = 0;
|
||||
jobject ia = NET_SockaddrToInetAddress(env, (struct sockaddr *)&sa, &port);
|
||||
if (ia != NULL) {
|
||||
isa = (*env)->NewObject(env, isa_class, isa_ctorID, ia, port);
|
||||
|
@ -84,7 +84,7 @@ Java_sun_nio_ch_ServerSocketChannelImpl_accept0(JNIEnv *env, jobject this,
|
||||
int alloc_len;
|
||||
jobject remote_ia = 0;
|
||||
jobject isa;
|
||||
jint remote_port;
|
||||
jint remote_port = 0;
|
||||
|
||||
NET_AllocSockaddr(&sa, &alloc_len);
|
||||
if (sa == NULL) {
|
||||
|
@ -188,6 +188,7 @@ getJavaIDFromLangID(LANGID langID)
|
||||
free(elems[index]);
|
||||
}
|
||||
} else {
|
||||
free(ret);
|
||||
ret = NULL;
|
||||
}
|
||||
|
||||
|
@ -28,7 +28,8 @@ package sun.awt.motif;
|
||||
import java.nio.CharBuffer;
|
||||
import java.nio.ByteBuffer;
|
||||
import java.nio.charset.*;
|
||||
import sun.nio.cs.ext.EUC_TW;
|
||||
import sun.nio.cs.*;
|
||||
import sun.nio.cs.ext.*;
|
||||
|
||||
public abstract class X11CNS11643 extends Charset {
|
||||
private final int plane;
|
||||
|
@ -26,6 +26,7 @@
|
||||
|
||||
package java.util.logging;
|
||||
|
||||
import java.util.Objects;
|
||||
import java.io.UnsupportedEncodingException;
|
||||
import java.security.AccessController;
|
||||
import java.security.PrivilegedAction;
|
||||
@ -165,9 +166,7 @@ public abstract class Handler {
|
||||
*/
|
||||
public synchronized void setFormatter(Formatter newFormatter) throws SecurityException {
|
||||
checkPermission();
|
||||
// Check for a null pointer:
|
||||
newFormatter.getClass();
|
||||
formatter = newFormatter;
|
||||
formatter = Objects.requireNonNull(newFormatter);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -24,10 +24,12 @@
|
||||
*/
|
||||
|
||||
package java.util.logging;
|
||||
import java.time.Instant;
|
||||
import java.util.*;
|
||||
import java.util.concurrent.atomic.AtomicInteger;
|
||||
import java.util.concurrent.atomic.AtomicLong;
|
||||
import java.io.*;
|
||||
import java.time.Clock;
|
||||
|
||||
import sun.misc.JavaLangAccess;
|
||||
import sun.misc.SharedSecrets;
|
||||
@ -88,55 +90,94 @@ public class LogRecord implements java.io.Serializable {
|
||||
private static final ThreadLocal<Integer> threadIds = new ThreadLocal<>();
|
||||
|
||||
/**
|
||||
* @serial Logging message level
|
||||
* Logging message level
|
||||
*/
|
||||
private Level level;
|
||||
|
||||
/**
|
||||
* @serial Sequence number
|
||||
* Sequence number
|
||||
*/
|
||||
private long sequenceNumber;
|
||||
|
||||
/**
|
||||
* @serial Class that issued logging call
|
||||
* Class that issued logging call
|
||||
*/
|
||||
private String sourceClassName;
|
||||
|
||||
/**
|
||||
* @serial Method that issued logging call
|
||||
* Method that issued logging call
|
||||
*/
|
||||
private String sourceMethodName;
|
||||
|
||||
/**
|
||||
* @serial Non-localized raw message text
|
||||
* Non-localized raw message text
|
||||
*/
|
||||
private String message;
|
||||
|
||||
/**
|
||||
* @serial Thread ID for thread that issued logging call.
|
||||
* Thread ID for thread that issued logging call.
|
||||
*/
|
||||
private int threadID;
|
||||
|
||||
/**
|
||||
* @serial Event time in milliseconds since 1970
|
||||
*/
|
||||
private long millis;
|
||||
|
||||
/**
|
||||
* @serial The Throwable (if any) associated with log message
|
||||
* The Throwable (if any) associated with log message
|
||||
*/
|
||||
private Throwable thrown;
|
||||
|
||||
/**
|
||||
* @serial Name of the source Logger.
|
||||
* Name of the source Logger.
|
||||
*/
|
||||
private String loggerName;
|
||||
|
||||
/**
|
||||
* @serial Resource bundle name to localized log message.
|
||||
* Resource bundle name to localized log message.
|
||||
*/
|
||||
private String resourceBundleName;
|
||||
|
||||
/**
|
||||
* Event time.
|
||||
* @since 1.9
|
||||
*/
|
||||
private Instant instant;
|
||||
|
||||
/**
|
||||
* @serialField level Level Logging message level
|
||||
* @serialField sequenceNumber long Sequence number
|
||||
* @serialField sourceClassName String Class that issued logging call
|
||||
* @serialField sourceMethodName String Method that issued logging call
|
||||
* @serialField message String Non-localized raw message text
|
||||
* @serialField threadID int Thread ID for thread that issued logging call
|
||||
* @serialField millis long Truncated event time in milliseconds since 1970
|
||||
* - calculated as getInstant().toEpochMilli().
|
||||
* The event time instant can be reconstructed using
|
||||
* <code>Instant.ofEpochSecond(millis/1000, (millis % 1000) * 1000_000 + nanoAdjustment)</code>
|
||||
* @serialField nanoAdjustment int Nanoseconds adjustment to the millisecond of
|
||||
* event time - calculated as getInstant().getNano() % 1000_000
|
||||
* The event time instant can be reconstructed using
|
||||
* <code>Instant.ofEpochSecond(millis/1000, (millis % 1000) * 1000_000 + nanoAdjustment)</code>
|
||||
* <p>
|
||||
* Since: 1.9
|
||||
* @serialField thrown Throwable The Throwable (if any) associated with log
|
||||
* message
|
||||
* @serialField loggerName String Name of the source Logger
|
||||
* @serialField resourceBundleName String Resource bundle name to localized
|
||||
* log message
|
||||
*/
|
||||
private static final ObjectStreamField[] serialPersistentFields =
|
||||
new ObjectStreamField[] {
|
||||
new ObjectStreamField("level", Level.class),
|
||||
new ObjectStreamField("sequenceNumber", long.class),
|
||||
new ObjectStreamField("sourceClassName", String.class),
|
||||
new ObjectStreamField("sourceMethodName", String.class),
|
||||
new ObjectStreamField("message", String.class),
|
||||
new ObjectStreamField("threadID", int.class),
|
||||
new ObjectStreamField("millis", long.class),
|
||||
new ObjectStreamField("nanoAdjustment", int.class),
|
||||
new ObjectStreamField("thrown", Throwable.class),
|
||||
new ObjectStreamField("loggerName", String.class),
|
||||
new ObjectStreamField("resourceBundleName", String.class),
|
||||
};
|
||||
|
||||
private transient boolean needToInferCaller;
|
||||
private transient Object parameters[];
|
||||
private transient ResourceBundle resourceBundle;
|
||||
@ -164,7 +205,10 @@ public class LogRecord implements java.io.Serializable {
|
||||
* The sequence property will be initialized with a new unique value.
|
||||
* These sequence values are allocated in increasing order within a VM.
|
||||
* <p>
|
||||
* The millis property will be initialized to the current time.
|
||||
* Since JDK 1.9, the event time is represented by an {@link Instant}.
|
||||
* The instant property will be initialized to the {@linkplain
|
||||
* Instant#now() current instant}, using the best available
|
||||
* {@linkplain Clock#systemUTC() clock} on the system.
|
||||
* <p>
|
||||
* The thread ID property will be initialized with a unique ID for
|
||||
* the current thread.
|
||||
@ -173,16 +217,15 @@ public class LogRecord implements java.io.Serializable {
|
||||
*
|
||||
* @param level a logging level value
|
||||
* @param msg the raw non-localized logging message (may be null)
|
||||
* @see java.time.Clock#systemUTC()
|
||||
*/
|
||||
public LogRecord(Level level, String msg) {
|
||||
// Make sure level isn't null, by calling random method.
|
||||
level.getClass();
|
||||
this.level = level;
|
||||
this.level = Objects.requireNonNull(level);
|
||||
message = msg;
|
||||
// Assign a thread ID and a unique sequence number.
|
||||
sequenceNumber = globalSequenceNumber.getAndIncrement();
|
||||
threadID = defaultThreadID();
|
||||
millis = System.currentTimeMillis();
|
||||
instant = Instant.now();
|
||||
needToInferCaller = true;
|
||||
}
|
||||
|
||||
@ -418,21 +461,63 @@ public class LogRecord implements java.io.Serializable {
|
||||
}
|
||||
|
||||
/**
|
||||
* Get event time in milliseconds since 1970.
|
||||
* Get truncated event time in milliseconds since 1970.
|
||||
*
|
||||
* @return event time in millis since 1970
|
||||
* @return truncated event time in millis since 1970
|
||||
*
|
||||
* @implSpec This is equivalent to calling
|
||||
* {@link #getInstant() getInstant().toEpochMilli()}.
|
||||
*
|
||||
* @deprecated To get the full nanosecond resolution event time,
|
||||
* use {@link #getInstant()}.
|
||||
*
|
||||
* @see #getInstant()
|
||||
*/
|
||||
@Deprecated
|
||||
public long getMillis() {
|
||||
return millis;
|
||||
return instant.toEpochMilli();
|
||||
}
|
||||
|
||||
/**
|
||||
* Set event time.
|
||||
*
|
||||
* @param millis event time in millis since 1970
|
||||
* @param millis event time in millis since 1970.
|
||||
*
|
||||
* @implSpec This is equivalent to calling
|
||||
* {@link #setInstant(java.time.Instant)
|
||||
* setInstant(Instant.ofEpochMilli(millis))}.
|
||||
*
|
||||
* @deprecated To set event time with nanosecond resolution,
|
||||
* use {@link #setInstant(java.time.Instant)}.
|
||||
*
|
||||
* @see #setInstant(java.time.Instant)
|
||||
*/
|
||||
@Deprecated
|
||||
public void setMillis(long millis) {
|
||||
this.millis = millis;
|
||||
this.instant = Instant.ofEpochMilli(millis);
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the instant that the event occurred.
|
||||
*
|
||||
* @return the instant that the event occurred.
|
||||
*
|
||||
* @since 1.9
|
||||
*/
|
||||
public Instant getInstant() {
|
||||
return instant;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the instant that the event occurred.
|
||||
*
|
||||
* @param instant the instant that the event occurred.
|
||||
*
|
||||
* @throws NullPointerException if {@code instant} is null.
|
||||
* @since 1.9
|
||||
*/
|
||||
public void setInstant(Instant instant) {
|
||||
this.instant = Objects.requireNonNull(instant);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -459,7 +544,7 @@ public class LogRecord implements java.io.Serializable {
|
||||
private static final long serialVersionUID = 5372048053134512534L;
|
||||
|
||||
/**
|
||||
* @serialData Default fields, followed by a two byte version number
|
||||
* @serialData Serialized fields, followed by a two byte version number
|
||||
* (major byte, followed by minor byte), followed by information on
|
||||
* the log record parameter array. If there is no parameter array,
|
||||
* then -1 is written. If there is a parameter array (possible of zero
|
||||
@ -469,8 +554,20 @@ public class LogRecord implements java.io.Serializable {
|
||||
* is written.
|
||||
*/
|
||||
private void writeObject(ObjectOutputStream out) throws IOException {
|
||||
// We have to call defaultWriteObject first.
|
||||
out.defaultWriteObject();
|
||||
// We have to write serialized fields first.
|
||||
ObjectOutputStream.PutField pf = out.putFields();
|
||||
pf.put("level", level);
|
||||
pf.put("sequenceNumber", sequenceNumber);
|
||||
pf.put("sourceClassName", sourceClassName);
|
||||
pf.put("sourceMethodName", sourceMethodName);
|
||||
pf.put("message", message);
|
||||
pf.put("threadID", threadID);
|
||||
pf.put("millis", instant.toEpochMilli());
|
||||
pf.put("nanoAdjustment", instant.getNano() % 1000_000);
|
||||
pf.put("thrown", thrown);
|
||||
pf.put("loggerName", loggerName);
|
||||
pf.put("resourceBundleName", resourceBundleName);
|
||||
out.writeFields();
|
||||
|
||||
// Write our version number.
|
||||
out.writeByte(1);
|
||||
@ -488,8 +585,21 @@ public class LogRecord implements java.io.Serializable {
|
||||
|
||||
private void readObject(ObjectInputStream in)
|
||||
throws IOException, ClassNotFoundException {
|
||||
// We have to call defaultReadObject first.
|
||||
in.defaultReadObject();
|
||||
// We have to read serialized fields first.
|
||||
ObjectInputStream.GetField gf = in.readFields();
|
||||
level = (Level) gf.get("level", null);
|
||||
sequenceNumber = gf.get("sequenceNumber", 0L);
|
||||
sourceClassName = (String) gf.get("sourceClassName", null);
|
||||
sourceMethodName = (String) gf.get("sourceMethodName", null);
|
||||
message = (String) gf.get("message", null);
|
||||
threadID = gf.get("threadID", 0);
|
||||
long millis = gf.get("millis", 0L);
|
||||
int nanoOfMilli = gf.get("nanoAdjustment", 0);
|
||||
instant = Instant.ofEpochSecond(
|
||||
millis / 1000L, (millis % 1000L) * 1000_000L + nanoOfMilli);
|
||||
thrown = (Throwable) gf.get("thrown", null);
|
||||
loggerName = (String) gf.get("loggerName", null);
|
||||
resourceBundleName = (String) gf.get("resourceBundleName", null);
|
||||
|
||||
// Read version number.
|
||||
byte major = in.readByte();
|
||||
|
@ -33,6 +33,7 @@ import java.util.ArrayList;
|
||||
import java.util.Iterator;
|
||||
import java.util.Locale;
|
||||
import java.util.MissingResourceException;
|
||||
import java.util.Objects;
|
||||
import java.util.ResourceBundle;
|
||||
import java.util.concurrent.CopyOnWriteArrayList;
|
||||
import java.util.function.Supplier;
|
||||
@ -1746,8 +1747,7 @@ public class Logger {
|
||||
* does not have LoggingPermission("control").
|
||||
*/
|
||||
public void addHandler(Handler handler) throws SecurityException {
|
||||
// Check for null handler
|
||||
handler.getClass();
|
||||
Objects.requireNonNull(handler);
|
||||
checkPermission();
|
||||
handlers.add(handler);
|
||||
}
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2000, 2012, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2000, 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
|
||||
@ -27,8 +27,9 @@
|
||||
package java.util.logging;
|
||||
|
||||
import java.io.*;
|
||||
import java.text.*;
|
||||
import java.util.Date;
|
||||
import java.time.LocalDateTime;
|
||||
import java.time.ZoneId;
|
||||
import java.time.ZonedDateTime;
|
||||
import sun.util.logging.LoggingSupport;
|
||||
|
||||
/**
|
||||
@ -59,8 +60,8 @@ import sun.util.logging.LoggingSupport;
|
||||
public class SimpleFormatter extends Formatter {
|
||||
|
||||
// format string for printing the log record
|
||||
private static final String format = LoggingSupport.getSimpleFormat();
|
||||
private final Date dat = new Date();
|
||||
private final String format = LoggingSupport.getSimpleFormat();
|
||||
private final ZoneId zoneId = ZoneId.systemDefault();
|
||||
|
||||
/**
|
||||
* Format the given LogRecord.
|
||||
@ -79,8 +80,9 @@ public class SimpleFormatter extends Formatter {
|
||||
* java.util.Formatter} format string specified in the
|
||||
* {@code java.util.logging.SimpleFormatter.format} property
|
||||
* or the default format.</li>
|
||||
* <li>{@code date} - a {@link Date} object representing
|
||||
* {@linkplain LogRecord#getMillis event time} of the log record.</li>
|
||||
* <li>{@code date} - a {@link ZonedDateTime} object representing
|
||||
* {@linkplain LogRecord#getInstant() event time} of the log record
|
||||
* in the {@link ZoneId#systemDefault()} system time zone.</li>
|
||||
* <li>{@code source} - a string representing the caller, if available;
|
||||
* otherwise, the logger's name.</li>
|
||||
* <li>{@code logger} - the logger's name.</li>
|
||||
@ -129,6 +131,16 @@ public class SimpleFormatter extends Formatter {
|
||||
* Mar 22, 2011 1:11:31 PM MyClass fatal
|
||||
* SEVERE: several message with an exception
|
||||
* </pre></li>
|
||||
* <li> {@code java.util.logging.SimpleFormatter.format="%1$tb %1$td, %1$tY %1$tl:%1$tM:%1$tS.%1$tN %1$Tp %2$s%n%4$s: %5$s%6$s%n"}
|
||||
* <p>Since JDK 1.9, {@code java.util.logging} uses {@link
|
||||
* java.time.Clock#systemUTC() java.time} to create more precise time
|
||||
* stamps.
|
||||
* The format above can be used to add a {@code .%1$tN} to the
|
||||
* date/time formatting so that nanoseconds will also be printed:
|
||||
* <pre>
|
||||
* Feb 06, 2015 5:33:10.279216000 PM example.Main main
|
||||
* INFO: This is a test
|
||||
* </pre></li>
|
||||
* </ul>
|
||||
* <p>This method can also be overridden in a subclass.
|
||||
* It is recommended to use the {@link Formatter#formatMessage}
|
||||
@ -137,8 +149,10 @@ public class SimpleFormatter extends Formatter {
|
||||
* @param record the log record to be formatted.
|
||||
* @return a formatted log record
|
||||
*/
|
||||
@Override
|
||||
public synchronized String format(LogRecord record) {
|
||||
dat.setTime(record.getMillis());
|
||||
ZonedDateTime zdt = ZonedDateTime.ofInstant(
|
||||
record.getInstant(), zoneId);
|
||||
String source;
|
||||
if (record.getSourceClassName() != null) {
|
||||
source = record.getSourceClassName();
|
||||
@ -159,7 +173,7 @@ public class SimpleFormatter extends Formatter {
|
||||
throwable = sw.toString();
|
||||
}
|
||||
return String.format(format,
|
||||
dat,
|
||||
zdt,
|
||||
source,
|
||||
record.getLoggerName(),
|
||||
record.getLevel().getLocalizedLevelName(),
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2000, 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
|
||||
@ -26,8 +26,9 @@
|
||||
|
||||
package java.util.logging;
|
||||
|
||||
import java.io.*;
|
||||
import java.nio.charset.Charset;
|
||||
import java.time.Instant;
|
||||
import java.time.format.DateTimeFormatter;
|
||||
import java.util.*;
|
||||
|
||||
/**
|
||||
@ -40,11 +41,70 @@ import java.util.*;
|
||||
* but it is recommended that it normally be used with UTF-8. The
|
||||
* character encoding can be set on the output Handler.
|
||||
*
|
||||
* @implSpec Since JDK 1.9, instances of {@linkplain LogRecord} contain
|
||||
* an {@link LogRecord#getInstant() Instant} which can have nanoseconds below
|
||||
* the millisecond resolution.
|
||||
* The DTD specification has been updated to allow for an optional
|
||||
* {@code <nanos>} element. By default, the XMLFormatter will compute the
|
||||
* nanosecond adjustment below the millisecond resolution (using
|
||||
* {@code LogRecord.getInstant().getNano() % 1000_000}) - and if this is not 0,
|
||||
* this adjustment value will be printed in the new {@code <nanos>} element.
|
||||
* The event instant can then be reconstructed using
|
||||
* {@code Instant.ofEpochSecond(millis/1000L, (millis % 1000L) * 1000_000L + nanos)}
|
||||
* where {@code millis} and {@code nanos} represent the numbers serialized in
|
||||
* the {@code <millis>} and {@code <nanos>} elements, respectively.
|
||||
* <br>
|
||||
* The {@code <date>} element will now contain the whole instant as formatted
|
||||
* by the {@link DateTimeFormatter#ISO_INSTANT DateTimeFormatter.ISO_INSTANT}
|
||||
* formatter.
|
||||
* <p>
|
||||
* For compatibility with old parsers, XMLFormatters can
|
||||
* be configured to revert to the old format by specifying a
|
||||
* {@code <xml-formatter-fully-qualified-class-name>.useInstant = false}
|
||||
* {@linkplain LogManager#getProperty(java.lang.String) property} in the
|
||||
* logging configuration. When {@code useInstant} is {@code false}, the old
|
||||
* formatting will be preserved. When {@code useInstant} is {@code true}
|
||||
* (the default), the {@code <nanos>} element will be printed and the
|
||||
* {@code <date>} element will contain the {@linkplain
|
||||
* DateTimeFormatter#ISO_INSTANT formatted} instant.
|
||||
* <p>
|
||||
* For instance, in order to configure plain instances of XMLFormatter to omit
|
||||
* the new {@code <nano>} element,
|
||||
* {@code java.util.logging.XMLFormatter.useInstant = false} can be specified
|
||||
* in the logging configuration.
|
||||
*
|
||||
* @since 1.4
|
||||
*/
|
||||
|
||||
public class XMLFormatter extends Formatter {
|
||||
private LogManager manager = LogManager.getLogManager();
|
||||
private final LogManager manager = LogManager.getLogManager();
|
||||
private final boolean useInstant;
|
||||
|
||||
/**
|
||||
* Creates a new instance of XMLFormatter.
|
||||
*
|
||||
* @implSpec
|
||||
* Since JDK 1.9, the XMLFormatter will print out the record {@linkplain
|
||||
* LogRecord#getInstant() event time} as an Instant. This instant
|
||||
* has the best resolution available on the system. The {@code <date>}
|
||||
* element will contain the instant as formatted by the {@link
|
||||
* DateTimeFormatter#ISO_INSTANT}.
|
||||
* In addition, an optional {@code <nanos>} element containing a
|
||||
* nanosecond adjustment will be printed if the instant contains some
|
||||
* nanoseconds below the millisecond resolution.
|
||||
* <p>
|
||||
* This new behavior can be turned off, and the old formatting restored,
|
||||
* by specifying a property in the {@linkplain
|
||||
* LogManager#getProperty(java.lang.String) logging configuration}.
|
||||
* If {@code LogManager.getLogManager().getProperty(
|
||||
* this.getClass().getName()+".useInstant")} is {@code "false"} or
|
||||
* {@code "0"}, the old formatting will be restored.
|
||||
*/
|
||||
public XMLFormatter() {
|
||||
useInstant = (manager == null)
|
||||
|| manager.getBooleanProperty(
|
||||
this.getClass().getName()+".useInstant", true);
|
||||
}
|
||||
|
||||
// Append a two digit number.
|
||||
private void a2(StringBuilder sb, int x) {
|
||||
@ -102,18 +162,35 @@ public class XMLFormatter extends Formatter {
|
||||
* @param record the log record to be formatted.
|
||||
* @return a formatted log record
|
||||
*/
|
||||
@Override
|
||||
public String format(LogRecord record) {
|
||||
StringBuilder sb = new StringBuilder(500);
|
||||
sb.append("<record>\n");
|
||||
|
||||
final Instant instant = record.getInstant();
|
||||
|
||||
sb.append(" <date>");
|
||||
appendISO8601(sb, record.getMillis());
|
||||
if (useInstant) {
|
||||
// If useInstant is true - we will print the instant in the
|
||||
// date field, using the ISO_INSTANT formatter.
|
||||
DateTimeFormatter.ISO_INSTANT.formatTo(instant, sb);
|
||||
} else {
|
||||
// If useInstant is false - we will keep the 'old' formating
|
||||
appendISO8601(sb, instant.toEpochMilli());
|
||||
}
|
||||
sb.append("</date>\n");
|
||||
|
||||
sb.append(" <millis>");
|
||||
sb.append(record.getMillis());
|
||||
sb.append(instant.toEpochMilli());
|
||||
sb.append("</millis>\n");
|
||||
|
||||
final int nanoAdjustment = instant.getNano() % 1000_000;
|
||||
if (useInstant && nanoAdjustment != 0) {
|
||||
sb.append(" <nanos>");
|
||||
sb.append(nanoAdjustment);
|
||||
sb.append("</nanos>\n");
|
||||
}
|
||||
|
||||
sb.append(" <sequence>");
|
||||
sb.append(record.getSequenceNumber());
|
||||
sb.append("</sequence>\n");
|
||||
@ -223,6 +300,7 @@ public class XMLFormatter extends Formatter {
|
||||
* @param h The target handler (can be null)
|
||||
* @return a valid XML string
|
||||
*/
|
||||
@Override
|
||||
public String getHead(Handler h) {
|
||||
StringBuilder sb = new StringBuilder();
|
||||
String encoding;
|
||||
@ -251,6 +329,7 @@ public class XMLFormatter extends Formatter {
|
||||
sb.append(encoding);
|
||||
sb.append("\"");
|
||||
sb.append(" standalone=\"no\"?>\n");
|
||||
|
||||
sb.append("<!DOCTYPE log SYSTEM \"logger.dtd\">\n");
|
||||
sb.append("<log>\n");
|
||||
return sb.toString();
|
||||
@ -262,6 +341,7 @@ public class XMLFormatter extends Formatter {
|
||||
* @param h The target handler (can be null)
|
||||
* @return a valid XML string
|
||||
*/
|
||||
@Override
|
||||
public String getTail(Handler h) {
|
||||
return "</log>\n";
|
||||
}
|
||||
|
@ -45,7 +45,7 @@ import java.lang.management.PlatformManagedObject;
|
||||
* All methods throw a {@code NullPointerException} if any input argument is
|
||||
* {@code null} unless it's stated otherwise.
|
||||
*
|
||||
* @see ManagementFactory#getPlatformMXBeans(Class)
|
||||
* @see java.lang.management.ManagementFactory#getPlatformMXBeans(Class)
|
||||
*/
|
||||
@jdk.Exported
|
||||
public interface HotSpotDiagnosticMXBean extends PlatformManagedObject {
|
||||
|
@ -31,12 +31,13 @@ import sun.management.ThreadInfoCompositeData;
|
||||
import static java.lang.Thread.State.*;
|
||||
|
||||
/**
|
||||
* Thread information. <tt>ThreadInfo</tt> contains the information
|
||||
* Thread information. {@code ThreadInfo} contains the information
|
||||
* about a thread including:
|
||||
* <h3>General thread information</h3>
|
||||
* <ul>
|
||||
* <li>Thread ID.</li>
|
||||
* <li>Name of the thread.</li>
|
||||
* <li>Whether a thread is a daemon thread</li>
|
||||
* </ul>
|
||||
*
|
||||
* <h3>Execution information</h3>
|
||||
@ -57,6 +58,7 @@ import static java.lang.Thread.State.*;
|
||||
* <li>List of object monitors locked by the thread.</li>
|
||||
* <li>List of <a href="LockInfo.html#OwnableSynchronizer">
|
||||
* ownable synchronizers</a> locked by the thread.</li>
|
||||
* <li>Thread priority</li>
|
||||
* </ul>
|
||||
*
|
||||
* <h4><a name="SyncStats">Synchronization Statistics</a></h4>
|
||||
@ -78,7 +80,7 @@ import static java.lang.Thread.State.*;
|
||||
* the system, not for synchronization control.
|
||||
*
|
||||
* <h4>MXBean Mapping</h4>
|
||||
* <tt>ThreadInfo</tt> is mapped to a {@link CompositeData CompositeData}
|
||||
* {@code ThreadInfo} is mapped to a {@link CompositeData CompositeData}
|
||||
* with attributes as specified in
|
||||
* the {@link #from from} method.
|
||||
*
|
||||
@ -100,9 +102,11 @@ public class ThreadInfo {
|
||||
private String lockName;
|
||||
private long lockOwnerId;
|
||||
private String lockOwnerName;
|
||||
private boolean daemon;
|
||||
private boolean inNative;
|
||||
private boolean suspended;
|
||||
private Thread.State threadState;
|
||||
private int priority;
|
||||
private StackTraceElement[] stackTrace;
|
||||
private MonitorInfo[] lockedMonitors;
|
||||
private LockInfo[] lockedSynchronizers;
|
||||
@ -229,6 +233,8 @@ public class ThreadInfo {
|
||||
this.blockedTime = blockedTime;
|
||||
this.waitedCount = waitedCount;
|
||||
this.waitedTime = waitedTime;
|
||||
this.daemon = t.isDaemon();
|
||||
this.priority = t.getPriority();
|
||||
|
||||
if (lockObj == null) {
|
||||
this.lock = null;
|
||||
@ -256,7 +262,7 @@ public class ThreadInfo {
|
||||
}
|
||||
|
||||
/*
|
||||
* Constructs a <tt>ThreadInfo</tt> object from a
|
||||
* Constructs a {@code ThreadInfo} object from a
|
||||
* {@link CompositeData CompositeData}.
|
||||
*/
|
||||
private ThreadInfo(CompositeData cd) {
|
||||
@ -277,7 +283,7 @@ public class ThreadInfo {
|
||||
stackTrace = ticd.stackTrace();
|
||||
|
||||
// 6.0 attributes
|
||||
if (ticd.isCurrentVersion()) {
|
||||
if (ticd.hasV6()) {
|
||||
lock = ticd.lockInfo();
|
||||
lockedMonitors = ticd.lockedMonitors();
|
||||
lockedSynchronizers = ticd.lockedSynchronizers();
|
||||
@ -300,10 +306,20 @@ public class ThreadInfo {
|
||||
lockedMonitors = EMPTY_MONITORS;
|
||||
lockedSynchronizers = EMPTY_SYNCS;
|
||||
}
|
||||
|
||||
// 9.0 attributes
|
||||
if (ticd.isCurrentVersion()) {
|
||||
daemon = ticd.isDaemon();
|
||||
priority = ticd.getPriority();
|
||||
} else {
|
||||
// Not ideal, but unclear what else we can do.
|
||||
daemon = false;
|
||||
priority = Thread.NORM_PRIORITY;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the ID of the thread associated with this <tt>ThreadInfo</tt>.
|
||||
* Returns the ID of the thread associated with this {@code ThreadInfo}.
|
||||
*
|
||||
* @return the ID of the associated thread.
|
||||
*/
|
||||
@ -312,7 +328,7 @@ public class ThreadInfo {
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the name of the thread associated with this <tt>ThreadInfo</tt>.
|
||||
* Returns the name of the thread associated with this {@code ThreadInfo}.
|
||||
*
|
||||
* @return the name of the associated thread.
|
||||
*/
|
||||
@ -321,9 +337,9 @@ public class ThreadInfo {
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the state of the thread associated with this <tt>ThreadInfo</tt>.
|
||||
* Returns the state of the thread associated with this {@code ThreadInfo}.
|
||||
*
|
||||
* @return <tt>Thread.State</tt> of the associated thread.
|
||||
* @return {@code Thread.State} of the associated thread.
|
||||
*/
|
||||
public Thread.State getThreadState() {
|
||||
return threadState;
|
||||
@ -331,13 +347,13 @@ public class ThreadInfo {
|
||||
|
||||
/**
|
||||
* Returns the approximate accumulated elapsed time (in milliseconds)
|
||||
* that the thread associated with this <tt>ThreadInfo</tt>
|
||||
* that the thread associated with this {@code ThreadInfo}
|
||||
* has blocked to enter or reenter a monitor
|
||||
* since thread contention monitoring is enabled.
|
||||
* I.e. the total accumulated time the thread has been in the
|
||||
* {@link java.lang.Thread.State#BLOCKED BLOCKED} state since thread
|
||||
* contention monitoring was last enabled.
|
||||
* This method returns <tt>-1</tt> if thread contention monitoring
|
||||
* This method returns {@code -1} if thread contention monitoring
|
||||
* is disabled.
|
||||
*
|
||||
* <p>The Java virtual machine may measure the time with a high
|
||||
@ -345,8 +361,8 @@ public class ThreadInfo {
|
||||
* the thread contention monitoring is reenabled.
|
||||
*
|
||||
* @return the approximate accumulated elapsed time in milliseconds
|
||||
* that a thread entered the <tt>BLOCKED</tt> state;
|
||||
* <tt>-1</tt> if thread contention monitoring is disabled.
|
||||
* that a thread entered the {@code BLOCKED} state;
|
||||
* {@code -1} if thread contention monitoring is disabled.
|
||||
*
|
||||
* @throws java.lang.UnsupportedOperationException if the Java
|
||||
* virtual machine does not support this operation.
|
||||
@ -360,13 +376,13 @@ public class ThreadInfo {
|
||||
|
||||
/**
|
||||
* Returns the total number of times that
|
||||
* the thread associated with this <tt>ThreadInfo</tt>
|
||||
* the thread associated with this {@code ThreadInfo}
|
||||
* blocked to enter or reenter a monitor.
|
||||
* I.e. the number of times a thread has been in the
|
||||
* {@link java.lang.Thread.State#BLOCKED BLOCKED} state.
|
||||
*
|
||||
* @return the total number of times that the thread
|
||||
* entered the <tt>BLOCKED</tt> state.
|
||||
* entered the {@code BLOCKED} state.
|
||||
*/
|
||||
public long getBlockedCount() {
|
||||
return blockedCount;
|
||||
@ -374,14 +390,14 @@ public class ThreadInfo {
|
||||
|
||||
/**
|
||||
* Returns the approximate accumulated elapsed time (in milliseconds)
|
||||
* that the thread associated with this <tt>ThreadInfo</tt>
|
||||
* that the thread associated with this {@code ThreadInfo}
|
||||
* has waited for notification
|
||||
* since thread contention monitoring is enabled.
|
||||
* I.e. the total accumulated time the thread has been in the
|
||||
* {@link java.lang.Thread.State#WAITING WAITING}
|
||||
* or {@link java.lang.Thread.State#TIMED_WAITING TIMED_WAITING} state
|
||||
* since thread contention monitoring is enabled.
|
||||
* This method returns <tt>-1</tt> if thread contention monitoring
|
||||
* This method returns {@code -1} if thread contention monitoring
|
||||
* is disabled.
|
||||
*
|
||||
* <p>The Java virtual machine may measure the time with a high
|
||||
@ -389,9 +405,9 @@ public class ThreadInfo {
|
||||
* the thread contention monitoring is reenabled.
|
||||
*
|
||||
* @return the approximate accumulated elapsed time in milliseconds
|
||||
* that a thread has been in the <tt>WAITING</tt> or
|
||||
* <tt>TIMED_WAITING</tt> state;
|
||||
* <tt>-1</tt> if thread contention monitoring is disabled.
|
||||
* that a thread has been in the {@code WAITING} or
|
||||
* {@code TIMED_WAITING} state;
|
||||
* {@code -1} if thread contention monitoring is disabled.
|
||||
*
|
||||
* @throws java.lang.UnsupportedOperationException if the Java
|
||||
* virtual machine does not support this operation.
|
||||
@ -405,29 +421,29 @@ public class ThreadInfo {
|
||||
|
||||
/**
|
||||
* Returns the total number of times that
|
||||
* the thread associated with this <tt>ThreadInfo</tt>
|
||||
* the thread associated with this {@code ThreadInfo}
|
||||
* waited for notification.
|
||||
* I.e. the number of times that a thread has been
|
||||
* in the {@link java.lang.Thread.State#WAITING WAITING}
|
||||
* or {@link java.lang.Thread.State#TIMED_WAITING TIMED_WAITING} state.
|
||||
*
|
||||
* @return the total number of times that the thread
|
||||
* was in the <tt>WAITING</tt> or <tt>TIMED_WAITING</tt> state.
|
||||
* was in the {@code WAITING} or {@code TIMED_WAITING} state.
|
||||
*/
|
||||
public long getWaitedCount() {
|
||||
return waitedCount;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the <tt>LockInfo</tt> of an object for which
|
||||
* the thread associated with this <tt>ThreadInfo</tt>
|
||||
* Returns the {@code LockInfo} of an object for which
|
||||
* the thread associated with this {@code ThreadInfo}
|
||||
* is blocked waiting.
|
||||
* A thread can be blocked waiting for one of the following:
|
||||
* <ul>
|
||||
* <li>an object monitor to be acquired for entering or reentering
|
||||
* a synchronization block/method.
|
||||
* <br>The thread is in the {@link java.lang.Thread.State#BLOCKED BLOCKED}
|
||||
* state waiting to enter the <tt>synchronized</tt> statement
|
||||
* state waiting to enter the {@code synchronized} statement
|
||||
* or method.
|
||||
* </li>
|
||||
* <li>an object monitor to be notified by another thread.
|
||||
@ -448,11 +464,11 @@ public class ThreadInfo {
|
||||
* or a {@link java.util.concurrent.locks.Condition Condition}.</li>
|
||||
* </ul>
|
||||
*
|
||||
* <p>This method returns <tt>null</tt> if the thread is not in any of
|
||||
* <p>This method returns {@code null} if the thread is not in any of
|
||||
* the above conditions.
|
||||
*
|
||||
* @return <tt>LockInfo</tt> of an object for which the thread
|
||||
* is blocked waiting if any; <tt>null</tt> otherwise.
|
||||
* @return {@code LockInfo} of an object for which the thread
|
||||
* is blocked waiting if any; {@code null} otherwise.
|
||||
* @since 1.6
|
||||
*/
|
||||
public LockInfo getLockInfo() {
|
||||
@ -462,19 +478,19 @@ public class ThreadInfo {
|
||||
/**
|
||||
* Returns the {@link LockInfo#toString string representation}
|
||||
* of an object for which the thread associated with this
|
||||
* <tt>ThreadInfo</tt> is blocked waiting.
|
||||
* {@code ThreadInfo} is blocked waiting.
|
||||
* This method is equivalent to calling:
|
||||
* <blockquote>
|
||||
* <pre>
|
||||
* getLockInfo().toString()
|
||||
* </pre></blockquote>
|
||||
*
|
||||
* <p>This method will return <tt>null</tt> if this thread is not blocked
|
||||
* <p>This method will return {@code null} if this thread is not blocked
|
||||
* waiting for any object or if the object is not owned by any thread.
|
||||
*
|
||||
* @return the string representation of the object on which
|
||||
* the thread is blocked if any;
|
||||
* <tt>null</tt> otherwise.
|
||||
* {@code null} otherwise.
|
||||
*
|
||||
* @see #getLockInfo
|
||||
*/
|
||||
@ -484,14 +500,14 @@ public class ThreadInfo {
|
||||
|
||||
/**
|
||||
* Returns the ID of the thread which owns the object
|
||||
* for which the thread associated with this <tt>ThreadInfo</tt>
|
||||
* for which the thread associated with this {@code ThreadInfo}
|
||||
* is blocked waiting.
|
||||
* This method will return <tt>-1</tt> if this thread is not blocked
|
||||
* This method will return {@code -1} if this thread is not blocked
|
||||
* waiting for any object or if the object is not owned by any thread.
|
||||
*
|
||||
* @return the thread ID of the owner thread of the object
|
||||
* this thread is blocked on;
|
||||
* <tt>-1</tt> if this thread is not blocked
|
||||
* {@code -1} if this thread is not blocked
|
||||
* or if the object is not owned by any thread.
|
||||
*
|
||||
* @see #getLockInfo
|
||||
@ -502,14 +518,14 @@ public class ThreadInfo {
|
||||
|
||||
/**
|
||||
* Returns the name of the thread which owns the object
|
||||
* for which the thread associated with this <tt>ThreadInfo</tt>
|
||||
* for which the thread associated with this {@code ThreadInfo}
|
||||
* is blocked waiting.
|
||||
* This method will return <tt>null</tt> if this thread is not blocked
|
||||
* This method will return {@code null} if this thread is not blocked
|
||||
* waiting for any object or if the object is not owned by any thread.
|
||||
*
|
||||
* @return the name of the thread that owns the object
|
||||
* this thread is blocked on;
|
||||
* <tt>null</tt> if this thread is not blocked
|
||||
* {@code null} if this thread is not blocked
|
||||
* or if the object is not owned by any thread.
|
||||
*
|
||||
* @see #getLockInfo
|
||||
@ -520,7 +536,7 @@ public class ThreadInfo {
|
||||
|
||||
/**
|
||||
* Returns the stack trace of the thread
|
||||
* associated with this <tt>ThreadInfo</tt>.
|
||||
* associated with this {@code ThreadInfo}.
|
||||
* If no stack trace was requested for this thread info, this method
|
||||
* will return a zero-length array.
|
||||
* If the returned array is of non-zero length then the first element of
|
||||
@ -532,41 +548,66 @@ public class ThreadInfo {
|
||||
* <p>Some Java virtual machines may, under some circumstances, omit one
|
||||
* or more stack frames from the stack trace. In the extreme case,
|
||||
* a virtual machine that has no stack trace information concerning
|
||||
* the thread associated with this <tt>ThreadInfo</tt>
|
||||
* the thread associated with this {@code ThreadInfo}
|
||||
* is permitted to return a zero-length array from this method.
|
||||
*
|
||||
* @return an array of <tt>StackTraceElement</tt> objects of the thread.
|
||||
* @return an array of {@code StackTraceElement} objects of the thread.
|
||||
*/
|
||||
public StackTraceElement[] getStackTrace() {
|
||||
return stackTrace;
|
||||
}
|
||||
|
||||
/**
|
||||
* Tests if the thread associated with this <tt>ThreadInfo</tt>
|
||||
* is suspended. This method returns <tt>true</tt> if
|
||||
* Tests if the thread associated with this {@code ThreadInfo}
|
||||
* is suspended. This method returns {@code true} if
|
||||
* {@link Thread#suspend} has been called.
|
||||
*
|
||||
* @return <tt>true</tt> if the thread is suspended;
|
||||
* <tt>false</tt> otherwise.
|
||||
* @return {@code true} if the thread is suspended;
|
||||
* {@code false} otherwise.
|
||||
*/
|
||||
public boolean isSuspended() {
|
||||
return suspended;
|
||||
}
|
||||
|
||||
/**
|
||||
* Tests if the thread associated with this <tt>ThreadInfo</tt>
|
||||
* Tests if the thread associated with this {@code ThreadInfo}
|
||||
* is executing native code via the Java Native Interface (JNI).
|
||||
* The JNI native code does not include
|
||||
* the virtual machine support code or the compiled native
|
||||
* code generated by the virtual machine.
|
||||
*
|
||||
* @return <tt>true</tt> if the thread is executing native code;
|
||||
* <tt>false</tt> otherwise.
|
||||
* @return {@code true} if the thread is executing native code;
|
||||
* {@code false} otherwise.
|
||||
*/
|
||||
public boolean isInNative() {
|
||||
return inNative;
|
||||
}
|
||||
|
||||
/**
|
||||
* Tests if the thread associated with this {@code ThreadInfo} is
|
||||
* a {@linkplain Thread#isDaemon daemon thread}.
|
||||
*
|
||||
* @return {@code true} if the thread is a daemon thread,
|
||||
* {@code false} otherwise.
|
||||
* @see Thread#isDaemon
|
||||
* @since 1.9
|
||||
*/
|
||||
public boolean isDaemon() {
|
||||
return daemon;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the {@linkplain Thread#getPriority() thread priority} of the
|
||||
* thread associated with this {@code ThreadInfo}.
|
||||
*
|
||||
* @return The priority of the thread associated with this
|
||||
* {@code ThreadInfo}.
|
||||
* @since 1.9
|
||||
*/
|
||||
public int getPriority() {
|
||||
return priority;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a string representation of this thread info.
|
||||
* The format of this string depends on the implementation.
|
||||
@ -580,6 +621,8 @@ public class ThreadInfo {
|
||||
*/
|
||||
public String toString() {
|
||||
StringBuilder sb = new StringBuilder("\"" + getThreadName() + "\"" +
|
||||
(daemon ? " daemon" : "") +
|
||||
" prio=" + priority +
|
||||
" Id=" + getThreadId() + " " +
|
||||
getThreadState());
|
||||
if (getLockName() != null) {
|
||||
@ -647,9 +690,9 @@ public class ThreadInfo {
|
||||
private static final int MAX_FRAMES = 8;
|
||||
|
||||
/**
|
||||
* Returns a <tt>ThreadInfo</tt> object represented by the
|
||||
* given <tt>CompositeData</tt>.
|
||||
* The given <tt>CompositeData</tt> must contain the following attributes
|
||||
* Returns a {@code ThreadInfo} object represented by the
|
||||
* given {@code CompositeData}.
|
||||
* The given {@code CompositeData} must contain the following attributes
|
||||
* unless otherwise specified below:
|
||||
* <blockquote>
|
||||
* <table border summary="The attributes and their types the given CompositeData contains">
|
||||
@ -659,67 +702,67 @@ public class ThreadInfo {
|
||||
* </tr>
|
||||
* <tr>
|
||||
* <td>threadId</td>
|
||||
* <td><tt>java.lang.Long</tt></td>
|
||||
* <td>{@code java.lang.Long}</td>
|
||||
* </tr>
|
||||
* <tr>
|
||||
* <td>threadName</td>
|
||||
* <td><tt>java.lang.String</tt></td>
|
||||
* <td>{@code java.lang.String}</td>
|
||||
* </tr>
|
||||
* <tr>
|
||||
* <td>threadState</td>
|
||||
* <td><tt>java.lang.String</tt></td>
|
||||
* <td>{@code java.lang.String}</td>
|
||||
* </tr>
|
||||
* <tr>
|
||||
* <td>suspended</td>
|
||||
* <td><tt>java.lang.Boolean</tt></td>
|
||||
* <td>{@code java.lang.Boolean}</td>
|
||||
* </tr>
|
||||
* <tr>
|
||||
* <td>inNative</td>
|
||||
* <td><tt>java.lang.Boolean</tt></td>
|
||||
* <td>{@code java.lang.Boolean}</td>
|
||||
* </tr>
|
||||
* <tr>
|
||||
* <td>blockedCount</td>
|
||||
* <td><tt>java.lang.Long</tt></td>
|
||||
* <td>{@code java.lang.Long}</td>
|
||||
* </tr>
|
||||
* <tr>
|
||||
* <td>blockedTime</td>
|
||||
* <td><tt>java.lang.Long</tt></td>
|
||||
* <td>{@code java.lang.Long}</td>
|
||||
* </tr>
|
||||
* <tr>
|
||||
* <td>waitedCount</td>
|
||||
* <td><tt>java.lang.Long</tt></td>
|
||||
* <td>{@code java.lang.Long}</td>
|
||||
* </tr>
|
||||
* <tr>
|
||||
* <td>waitedTime</td>
|
||||
* <td><tt>java.lang.Long</tt></td>
|
||||
* <td>{@code java.lang.Long}</td>
|
||||
* </tr>
|
||||
* <tr>
|
||||
* <td>lockInfo</td>
|
||||
* <td><tt>javax.management.openmbean.CompositeData</tt>
|
||||
* <td>{@code javax.management.openmbean.CompositeData}
|
||||
* - the mapped type for {@link LockInfo} as specified in the
|
||||
* {@link LockInfo#from} method.
|
||||
* <p>
|
||||
* If <tt>cd</tt> does not contain this attribute,
|
||||
* the <tt>LockInfo</tt> object will be constructed from
|
||||
* the value of the <tt>lockName</tt> attribute. </td>
|
||||
* If {@code cd} does not contain this attribute,
|
||||
* the {@code LockInfo} object will be constructed from
|
||||
* the value of the {@code lockName} attribute. </td>
|
||||
* </tr>
|
||||
* <tr>
|
||||
* <td>lockName</td>
|
||||
* <td><tt>java.lang.String</tt></td>
|
||||
* <td>{@code java.lang.String}</td>
|
||||
* </tr>
|
||||
* <tr>
|
||||
* <td>lockOwnerId</td>
|
||||
* <td><tt>java.lang.Long</tt></td>
|
||||
* <td>{@code java.lang.Long}</td>
|
||||
* </tr>
|
||||
* <tr>
|
||||
* <td>lockOwnerName</td>
|
||||
* <td><tt>java.lang.String</tt></td>
|
||||
* <td>{@code java.lang.String}</td>
|
||||
* </tr>
|
||||
* <tr>
|
||||
* <td><a name="StackTrace">stackTrace</a></td>
|
||||
* <td><tt>javax.management.openmbean.CompositeData[]</tt>
|
||||
* <td>{@code javax.management.openmbean.CompositeData[]}
|
||||
* <p>
|
||||
* Each element is a <tt>CompositeData</tt> representing
|
||||
* Each element is a {@code CompositeData} representing
|
||||
* StackTraceElement containing the following attributes:
|
||||
* <blockquote>
|
||||
* <table cellspacing=1 cellpadding=0 summary="The attributes and their types the given CompositeData contains">
|
||||
@ -729,23 +772,23 @@ public class ThreadInfo {
|
||||
* </tr>
|
||||
* <tr>
|
||||
* <td>className</td>
|
||||
* <td><tt>java.lang.String</tt></td>
|
||||
* <td>{@code java.lang.String}</td>
|
||||
* </tr>
|
||||
* <tr>
|
||||
* <td>methodName</td>
|
||||
* <td><tt>java.lang.String</tt></td>
|
||||
* <td>{@code java.lang.String}</td>
|
||||
* </tr>
|
||||
* <tr>
|
||||
* <td>fileName</td>
|
||||
* <td><tt>java.lang.String</tt></td>
|
||||
* <td>{@code java.lang.String}</td>
|
||||
* </tr>
|
||||
* <tr>
|
||||
* <td>lineNumber</td>
|
||||
* <td><tt>java.lang.Integer</tt></td>
|
||||
* <td>{@code java.lang.Integer}</td>
|
||||
* </tr>
|
||||
* <tr>
|
||||
* <td>nativeMethod</td>
|
||||
* <td><tt>java.lang.Boolean</tt></td>
|
||||
* <td>{@code java.lang.Boolean}</td>
|
||||
* </tr>
|
||||
* </table>
|
||||
* </blockquote>
|
||||
@ -753,35 +796,43 @@ public class ThreadInfo {
|
||||
* </tr>
|
||||
* <tr>
|
||||
* <td>lockedMonitors</td>
|
||||
* <td><tt>javax.management.openmbean.CompositeData[]</tt>
|
||||
* <td>{@code javax.management.openmbean.CompositeData[]}
|
||||
* whose element type is the mapped type for
|
||||
* {@link MonitorInfo} as specified in the
|
||||
* {@link MonitorInfo#from Monitor.from} method.
|
||||
* <p>
|
||||
* If <tt>cd</tt> does not contain this attribute,
|
||||
* If {@code cd} does not contain this attribute,
|
||||
* this attribute will be set to an empty array. </td>
|
||||
* </tr>
|
||||
* <tr>
|
||||
* <td>lockedSynchronizers</td>
|
||||
* <td><tt>javax.management.openmbean.CompositeData[]</tt>
|
||||
* <td>{@code javax.management.openmbean.CompositeData[]}
|
||||
* whose element type is the mapped type for
|
||||
* {@link LockInfo} as specified in the {@link LockInfo#from} method.
|
||||
* <p>
|
||||
* If <tt>cd</tt> does not contain this attribute,
|
||||
* If {@code cd} does not contain this attribute,
|
||||
* this attribute will be set to an empty array. </td>
|
||||
* </tr>
|
||||
* <tr>
|
||||
* <td>daemon</td>
|
||||
* <td>{@code java.lang.Boolean}</td>
|
||||
* </tr>
|
||||
* <tr>
|
||||
* <td>priority</td>
|
||||
* <td>{@code java.lang.Integer}</td>
|
||||
* </tr>
|
||||
* </table>
|
||||
* </blockquote>
|
||||
*
|
||||
* @param cd <tt>CompositeData</tt> representing a <tt>ThreadInfo</tt>
|
||||
* @param cd {@code CompositeData} representing a {@code ThreadInfo}
|
||||
*
|
||||
* @throws IllegalArgumentException if <tt>cd</tt> does not
|
||||
* represent a <tt>ThreadInfo</tt> with the attributes described
|
||||
* @throws IllegalArgumentException if {@code cd} does not
|
||||
* represent a {@code ThreadInfo} with the attributes described
|
||||
* above.
|
||||
*
|
||||
* @return a <tt>ThreadInfo</tt> object represented
|
||||
* by <tt>cd</tt> if <tt>cd</tt> is not <tt>null</tt>;
|
||||
* <tt>null</tt> otherwise.
|
||||
* @return a {@code ThreadInfo} object represented
|
||||
* by {@code cd} if {@code cd} is not {@code null};
|
||||
* {@code null} otherwise.
|
||||
*/
|
||||
public static ThreadInfo from(CompositeData cd) {
|
||||
if (cd == null) {
|
||||
@ -798,12 +849,12 @@ public class ThreadInfo {
|
||||
/**
|
||||
* Returns an array of {@link MonitorInfo} objects, each of which
|
||||
* represents an object monitor currently locked by the thread
|
||||
* associated with this <tt>ThreadInfo</tt>.
|
||||
* associated with this {@code ThreadInfo}.
|
||||
* If no locked monitor was requested for this thread info or
|
||||
* no monitor is locked by the thread, this method
|
||||
* will return a zero-length array.
|
||||
*
|
||||
* @return an array of <tt>MonitorInfo</tt> objects representing
|
||||
* @return an array of {@code MonitorInfo} objects representing
|
||||
* the object monitors locked by the thread.
|
||||
*
|
||||
* @since 1.6
|
||||
@ -816,11 +867,11 @@ public class ThreadInfo {
|
||||
* Returns an array of {@link LockInfo} objects, each of which
|
||||
* represents an <a href="LockInfo.html#OwnableSynchronizer">ownable
|
||||
* synchronizer</a> currently locked by the thread associated with
|
||||
* this <tt>ThreadInfo</tt>. If no locked synchronizer was
|
||||
* this {@code ThreadInfo}. If no locked synchronizer was
|
||||
* requested for this thread info or no synchronizer is locked by
|
||||
* the thread, this method will return a zero-length array.
|
||||
*
|
||||
* @return an array of <tt>LockInfo</tt> objects representing
|
||||
* @return an array of {@code LockInfo} objects representing
|
||||
* the ownable synchronizers locked by the thread.
|
||||
*
|
||||
* @since 1.6
|
||||
|
@ -87,26 +87,6 @@ public class AgentConfigurationError extends Error {
|
||||
"agent.err.connector.server.io.error";
|
||||
public static final String INVALID_OPTION =
|
||||
"agent.err.invalid.option";
|
||||
public static final String INVALID_SNMP_PORT =
|
||||
"agent.err.invalid.snmp.port";
|
||||
public static final String INVALID_SNMP_TRAP_PORT =
|
||||
"agent.err.invalid.snmp.trap.port";
|
||||
public static final String UNKNOWN_SNMP_INTERFACE =
|
||||
"agent.err.unknown.snmp.interface";
|
||||
public static final String SNMP_ACL_FILE_NOT_SET =
|
||||
"agent.err.acl.file.notset";
|
||||
public static final String SNMP_ACL_FILE_NOT_FOUND =
|
||||
"agent.err.acl.file.notfound";
|
||||
public static final String SNMP_ACL_FILE_NOT_READABLE =
|
||||
"agent.err.acl.file.not.readable";
|
||||
public static final String SNMP_ACL_FILE_READ_FAILED =
|
||||
"agent.err.acl.file.read.failed";
|
||||
public static final String SNMP_ACL_FILE_ACCESS_NOT_RESTRICTED =
|
||||
"agent.err.acl.file.access.notrestricted";
|
||||
public static final String SNMP_ADAPTOR_START_FAILED =
|
||||
"agent.err.snmp.adaptor.start.failed";
|
||||
public static final String SNMP_MIB_INIT_FAILED =
|
||||
"agent.err.snmp.mib.init.failed";
|
||||
public static final String INVALID_STATE =
|
||||
"agent.err.invalid.state";
|
||||
|
||||
|
@ -43,23 +43,30 @@ public class ThreadInfoCompositeData extends LazyCompositeData {
|
||||
private final ThreadInfo threadInfo;
|
||||
private final CompositeData cdata;
|
||||
private final boolean currentVersion;
|
||||
private final boolean hasV6;
|
||||
|
||||
private ThreadInfoCompositeData(ThreadInfo ti) {
|
||||
this.threadInfo = ti;
|
||||
this.currentVersion = true;
|
||||
this.cdata = null;
|
||||
this.hasV6 = true;
|
||||
}
|
||||
|
||||
private ThreadInfoCompositeData(CompositeData cd) {
|
||||
this.threadInfo = null;
|
||||
this.currentVersion = ThreadInfoCompositeData.isCurrentVersion(cd);
|
||||
this.cdata = cd;
|
||||
this.hasV6 = ThreadInfoCompositeData.hasV6(cd);
|
||||
}
|
||||
|
||||
public ThreadInfo getThreadInfo() {
|
||||
return threadInfo;
|
||||
}
|
||||
|
||||
public boolean hasV6() {
|
||||
return hasV6;
|
||||
}
|
||||
|
||||
public boolean isCurrentVersion() {
|
||||
return currentVersion;
|
||||
}
|
||||
@ -124,6 +131,8 @@ public class ThreadInfoCompositeData extends LazyCompositeData {
|
||||
threadInfo.isInNative(),
|
||||
lockedMonitorsData,
|
||||
lockedSyncsData,
|
||||
threadInfo.isDaemon(),
|
||||
threadInfo.getPriority(),
|
||||
};
|
||||
|
||||
try {
|
||||
@ -151,6 +160,8 @@ public class ThreadInfoCompositeData extends LazyCompositeData {
|
||||
private static final String STACK_TRACE = "stackTrace";
|
||||
private static final String SUSPENDED = "suspended";
|
||||
private static final String IN_NATIVE = "inNative";
|
||||
private static final String DAEMON = "daemon";
|
||||
private static final String PRIORITY = "priority";
|
||||
private static final String LOCKED_MONITORS = "lockedMonitors";
|
||||
private static final String LOCKED_SYNCS = "lockedSynchronizers";
|
||||
|
||||
@ -171,6 +182,8 @@ public class ThreadInfoCompositeData extends LazyCompositeData {
|
||||
IN_NATIVE,
|
||||
LOCKED_MONITORS,
|
||||
LOCKED_SYNCS,
|
||||
DAEMON,
|
||||
PRIORITY,
|
||||
};
|
||||
|
||||
// New attributes added in 6.0 ThreadInfo
|
||||
@ -180,9 +193,16 @@ public class ThreadInfoCompositeData extends LazyCompositeData {
|
||||
LOCKED_SYNCS,
|
||||
};
|
||||
|
||||
private static final String[] threadInfoV9Attributes = {
|
||||
DAEMON,
|
||||
PRIORITY,
|
||||
};
|
||||
|
||||
// Current version of ThreadInfo
|
||||
private static final CompositeType threadInfoCompositeType;
|
||||
// Previous version of ThreadInfo
|
||||
private static final CompositeType threadInfoV6CompositeType;
|
||||
// Previous-previous version of ThreadInfo
|
||||
private static final CompositeType threadInfoV5CompositeType;
|
||||
private static final CompositeType lockInfoCompositeType;
|
||||
static {
|
||||
@ -193,7 +213,7 @@ public class ThreadInfoCompositeData extends LazyCompositeData {
|
||||
String[] itemNames =
|
||||
threadInfoCompositeType.keySet().toArray(new String[0]);
|
||||
int numV5Attributes = threadInfoItemNames.length -
|
||||
threadInfoV6Attributes.length;
|
||||
threadInfoV6Attributes.length - threadInfoV9Attributes.length;
|
||||
String[] v5ItemNames = new String[numV5Attributes];
|
||||
String[] v5ItemDescs = new String[numV5Attributes];
|
||||
OpenType<?>[] v5ItemTypes = new OpenType<?>[numV5Attributes];
|
||||
@ -213,6 +233,31 @@ public class ThreadInfoCompositeData extends LazyCompositeData {
|
||||
v5ItemNames,
|
||||
v5ItemDescs,
|
||||
v5ItemTypes);
|
||||
|
||||
|
||||
// Form a CompositeType for JDK 6.0 ThreadInfo version
|
||||
int numV6Attributes = threadInfoItemNames.length -
|
||||
threadInfoV9Attributes.length;
|
||||
String[] v6ItemNames = new String[numV6Attributes];
|
||||
String[] v6ItemDescs = new String[numV6Attributes];
|
||||
OpenType<?>[] v6ItemTypes = new OpenType<?>[numV6Attributes];
|
||||
i = 0;
|
||||
for (String n : itemNames) {
|
||||
if (isV5Attribute(n) || isV6Attribute(n)) {
|
||||
v6ItemNames[i] = n;
|
||||
v6ItemDescs[i] = threadInfoCompositeType.getDescription(n);
|
||||
v6ItemTypes[i] = threadInfoCompositeType.getType(n);
|
||||
i++;
|
||||
}
|
||||
}
|
||||
|
||||
threadInfoV6CompositeType =
|
||||
new CompositeType("java.lang.management.ThreadInfo",
|
||||
"Java SE 6 java.lang.management.ThreadInfo",
|
||||
v6ItemNames,
|
||||
v6ItemDescs,
|
||||
v6ItemTypes);
|
||||
|
||||
} catch (OpenDataException e) {
|
||||
// Should never reach here
|
||||
throw new AssertionError(e);
|
||||
@ -236,6 +281,20 @@ public class ThreadInfoCompositeData extends LazyCompositeData {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
for (String n : threadInfoV9Attributes) {
|
||||
if (itemName.equals(n)) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
private static boolean isV6Attribute(String itemName) {
|
||||
for (String n : threadInfoV9Attributes) {
|
||||
if (itemName.equals(n)) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
@ -247,6 +306,15 @@ public class ThreadInfoCompositeData extends LazyCompositeData {
|
||||
return isTypeMatched(threadInfoCompositeType, cd.getCompositeType());
|
||||
}
|
||||
|
||||
private static boolean hasV6(CompositeData cd) {
|
||||
if (cd == null) {
|
||||
throw new NullPointerException("Null CompositeData");
|
||||
}
|
||||
|
||||
return isTypeMatched(threadInfoCompositeType, cd.getCompositeType()) ||
|
||||
isTypeMatched(threadInfoV6CompositeType, cd.getCompositeType());
|
||||
}
|
||||
|
||||
public long threadId() {
|
||||
return getLong(cdata, THREAD_ID);
|
||||
}
|
||||
@ -304,6 +372,14 @@ public class ThreadInfoCompositeData extends LazyCompositeData {
|
||||
return getBoolean(cdata, IN_NATIVE);
|
||||
}
|
||||
|
||||
public boolean isDaemon() {
|
||||
return getBoolean(cdata, DAEMON);
|
||||
}
|
||||
|
||||
public int getPriority(){
|
||||
return getInt(cdata, PRIORITY);
|
||||
}
|
||||
|
||||
public StackTraceElement[] stackTrace() {
|
||||
CompositeData[] stackTraceData =
|
||||
(CompositeData[]) cdata.get(STACK_TRACE);
|
||||
@ -368,9 +444,10 @@ public class ThreadInfoCompositeData extends LazyCompositeData {
|
||||
if (!isTypeMatched(threadInfoCompositeType, type)) {
|
||||
currentVersion = false;
|
||||
// check if cd is an older version
|
||||
if (!isTypeMatched(threadInfoV5CompositeType, type)) {
|
||||
throw new IllegalArgumentException(
|
||||
"Unexpected composite type for ThreadInfo");
|
||||
if (!isTypeMatched(threadInfoV5CompositeType, type) &&
|
||||
!isTypeMatched(threadInfoV6CompositeType, type)) {
|
||||
throw new IllegalArgumentException(
|
||||
"Unexpected composite type for ThreadInfo");
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1,5 +1,4 @@
|
||||
#
|
||||
#
|
||||
# Copyright (c) 2004, 2012, Oracle and/or its affiliates. All rights reserved.
|
||||
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
#
|
||||
@ -24,9 +23,6 @@
|
||||
# questions.
|
||||
#
|
||||
|
||||
# Localizations for Level names. For the US locale
|
||||
# these are the same as the non-localized level name.
|
||||
|
||||
agent.err.error = Error
|
||||
agent.err.exception = Exception thrown by the agent
|
||||
agent.err.warning = Warning
|
||||
@ -67,27 +63,9 @@ agent.err.access.file.notfound = Access file not found
|
||||
agent.err.connector.server.io.error = JMX connector server communication error
|
||||
|
||||
agent.err.invalid.option = Invalid option specified
|
||||
agent.err.invalid.snmp.port = Invalid com.sun.management.snmp.port number
|
||||
agent.err.invalid.snmp.trap.port = Invalid com.sun.management.snmp.trap number
|
||||
agent.err.unknown.snmp.interface = Unknown SNMP interface
|
||||
agent.err.acl.file.notset = No SNMP ACL file is specified but com.sun.management.snmp.acl=true
|
||||
agent.err.acl.file.notfound = SNMP ACL file not found
|
||||
agent.err.acl.file.not.readable = SNMP ACL file not readable
|
||||
agent.err.acl.file.read.failed = Failed in reading SNMP ACL file
|
||||
agent.err.acl.file.access.notrestricted = Password file read access must be restricted
|
||||
|
||||
agent.err.snmp.adaptor.start.failed = Failed to start SNMP adaptor with address
|
||||
agent.err.snmp.mib.init.failed = Failed to initialize SNMP MIB with error
|
||||
|
||||
jmxremote.ConnectorBootstrap.starting = Starting JMX Connector Server:
|
||||
jmxremote.ConnectorBootstrap.noAuthentication = No Authentication
|
||||
jmxremote.ConnectorBootstrap.ready = JMX Connector ready at: {0}
|
||||
jmxremote.ConnectorBootstrap.password.readonly = Password file read access must be restricted: {0}
|
||||
jmxremote.ConnectorBootstrap.file.readonly = File read access must be restricted: {0}
|
||||
|
||||
jmxremote.AdaptorBootstrap.getTargetList.processing = Processing ACL
|
||||
jmxremote.AdaptorBootstrap.getTargetList.adding = Adding target: {0}
|
||||
jmxremote.AdaptorBootstrap.getTargetList.starting = Starting Adaptor Server:
|
||||
jmxremote.AdaptorBootstrap.getTargetList.initialize1 = Adaptor ready.
|
||||
jmxremote.AdaptorBootstrap.getTargetList.initialize2 = SNMP Adaptor ready on: {0}:{1}
|
||||
jmxremote.AdaptorBootstrap.getTargetList.terminate = terminate {0}
|
||||
|
@ -46,7 +46,7 @@ public class AttachOperationFailedException extends IOException {
|
||||
* Constructs an <code>AttachOperationFailedException</code> with
|
||||
* the specified detail message.
|
||||
*
|
||||
* @param s the detail message.
|
||||
* @param message the detail message.
|
||||
*/
|
||||
public AttachOperationFailedException(String message) {
|
||||
super(message);
|
||||
|
@ -23,7 +23,7 @@
|
||||
* questions.
|
||||
*/
|
||||
|
||||
package sun.nio.cs.ext;
|
||||
package $PACKAGE$;
|
||||
|
||||
import java.io.*;
|
||||
import java.nio.CharBuffer;
|
||||
@ -79,7 +79,7 @@ public class EUC_TW extends Charset implements HistoricallyNamedCharset
|
||||
*/
|
||||
|
||||
public EUC_TW() {
|
||||
super("x-EUC-TW", ExtendedCharsets.aliasesFor("x-EUC-TW"));
|
||||
super("x-EUC-TW", $ALIASES$);
|
||||
}
|
||||
|
||||
public String historicalName() {
|
@ -222,16 +222,6 @@ public class ExtendedCharsets extends AbstractCharsetProvider {
|
||||
|
||||
}
|
||||
}
|
||||
String osName = getProperty("os.name");
|
||||
if ("SunOS".equals(osName) || "Linux".equals(osName) || "AIX".equals(osName)
|
||||
|| osName.contains("OS X")) {
|
||||
charset("x-COMPOUND_TEXT", "COMPOUND_TEXT",
|
||||
new String[] {
|
||||
"COMPOUND_TEXT", // JDK historical
|
||||
"x11-compound_text",
|
||||
"x-compound-text"
|
||||
});
|
||||
}
|
||||
initialized = true;
|
||||
}
|
||||
|
||||
|
@ -35,6 +35,7 @@ import java.nio.charset.CharsetDecoder;
|
||||
import java.nio.charset.CharsetEncoder;
|
||||
import java.nio.charset.CoderResult;
|
||||
import sun.nio.cs.HistoricallyNamedCharset;
|
||||
import sun.nio.cs.*;
|
||||
|
||||
public class ISO2022_CN_CNS extends ISO2022 implements HistoricallyNamedCharset
|
||||
{
|
||||
|
@ -31,7 +31,6 @@ import java.nio.channels.*;
|
||||
import java.net.*;
|
||||
import javax.net.ssl.*;
|
||||
import java.util.*;
|
||||
import sun.net.www.MessageHeader;
|
||||
|
||||
/**
|
||||
* This class encapsulates a HTTP request received and a
|
||||
|
@ -29,7 +29,6 @@ import com.sun.net.httpserver.*;
|
||||
import java.io.*;
|
||||
import java.nio.*;
|
||||
import java.nio.channels.*;
|
||||
import sun.net.www.MessageHeader;
|
||||
import java.util.*;
|
||||
import javax.security.auth.*;
|
||||
import javax.security.auth.callback.*;
|
||||
|
@ -31,7 +31,6 @@ import java.nio.channels.*;
|
||||
import java.net.*;
|
||||
import javax.net.ssl.*;
|
||||
import java.util.*;
|
||||
import sun.net.www.MessageHeader;
|
||||
import com.sun.net.httpserver.*;
|
||||
import com.sun.net.httpserver.spi.*;
|
||||
|
||||
|
@ -31,7 +31,6 @@ import java.nio.channels.*;
|
||||
import java.net.*;
|
||||
import javax.net.ssl.*;
|
||||
import java.util.*;
|
||||
import sun.net.www.MessageHeader;
|
||||
import com.sun.net.httpserver.*;
|
||||
import com.sun.net.httpserver.spi.*;
|
||||
|
||||
|
@ -145,7 +145,7 @@ public interface InterfaceType extends ReferenceType {
|
||||
* not be done from the client's event handler thread.
|
||||
* <p>
|
||||
* The resumption of other threads during the invocation can be prevented
|
||||
* by specifying the {@link #INVOKE_SINGLE_THREADED}
|
||||
* by specifying the {@link ClassType#INVOKE_SINGLE_THREADED}
|
||||
* bit flag in the <code>options</code> argument; however,
|
||||
* there is no protection against or recovery from the deadlocks
|
||||
* described above, so this option should be used with great caution.
|
||||
|
@ -431,7 +431,7 @@ jobjectArray getRemoteAddresses
|
||||
paddr = addr_buf;
|
||||
for (i=0; i<addrCount; i++) {
|
||||
jobject ia, isa = NULL;
|
||||
int port;
|
||||
int port = 0;
|
||||
sap = (struct sockaddr*)addr_buf;
|
||||
ia = NET_SockaddrToInetAddress(env, sap, &port);
|
||||
if (ia != NULL)
|
||||
@ -543,6 +543,7 @@ JNIEXPORT int JNICALL Java_sun_nio_ch_sctp_SctpNet_getIntOption0
|
||||
void *arg;
|
||||
int arglen;
|
||||
|
||||
memset((char *) &linger, 0, sizeof(linger));
|
||||
if (mapSocketOption(opt, &klevel, &kopt) < 0) {
|
||||
JNU_ThrowByNameWithLastError(env, JNU_JAVANETPKG "SocketException",
|
||||
"Unsupported socket option");
|
||||
@ -600,7 +601,7 @@ JNIEXPORT void JNICALL Java_sun_nio_ch_sctp_SctpNet_setPrimAddrOption0
|
||||
(JNIEnv *env, jclass klass, jint fd, jint assocId, jobject iaObj, jint port) {
|
||||
struct sctp_setprim prim;
|
||||
struct sockaddr* sap = (struct sockaddr*)&prim.ssp_addr;
|
||||
int sap_len;
|
||||
int sap_len = sizeof(sap);
|
||||
|
||||
if (NET_InetAddressToSockaddr(env, iaObj, port, sap,
|
||||
&sap_len, JNI_TRUE) != 0) {
|
||||
@ -625,7 +626,7 @@ JNIEXPORT void JNICALL Java_sun_nio_ch_sctp_SctpNet_setPeerPrimAddrOption0
|
||||
jobject iaObj, jint port, jboolean preferIPv6) {
|
||||
struct sctp_setpeerprim prim;
|
||||
struct sockaddr* sap = (struct sockaddr*)&prim.sspp_addr;
|
||||
int sap_len;
|
||||
int sap_len = sizeof(sap);
|
||||
|
||||
if (NET_InetAddressToSockaddr(env, iaObj, port, sap,
|
||||
&sap_len, preferIPv6) != 0) {
|
||||
|
@ -1,4 +1,4 @@
|
||||
# Copyright (c) 2013, 2014, Oracle and/or its affiliates. All rights reserved.
|
||||
# Copyright (c) 2013, 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
|
||||
@ -567,7 +567,6 @@ needs_compact3 = \
|
||||
javax/smartcardio \
|
||||
javax/sql/rowset \
|
||||
javax/xml/crypto \
|
||||
sun/security/acl \
|
||||
sun/security/jgss \
|
||||
sun/security/krb5 \
|
||||
java/lang/annotation/AnnotationType/AnnotationTypeDeadlockTest.java \
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2003, 2005, 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
|
||||
@ -22,11 +22,16 @@
|
||||
*/
|
||||
|
||||
/*
|
||||
*
|
||||
*
|
||||
* @test
|
||||
* @bug 4858522
|
||||
* @summary Basic unit test of OperatingSystemMXBean.getTotalSwapSpaceSize()
|
||||
*
|
||||
* @library /lib/testlibrary
|
||||
* @build TestTotalSwap jdk.testlibrary.*
|
||||
* @run main TestTotalSwap
|
||||
*
|
||||
* @author Steve Bohne
|
||||
* @author Jaroslav Bachorik
|
||||
*/
|
||||
|
||||
/*
|
||||
@ -50,9 +55,13 @@
|
||||
import com.sun.management.OperatingSystemMXBean;
|
||||
import java.lang.management.*;
|
||||
|
||||
public class GetTotalSwapSpaceSize {
|
||||
import jdk.testlibrary.OSInfo;
|
||||
import jdk.testlibrary.ProcessTools;
|
||||
import jdk.testlibrary.OutputAnalyzer;
|
||||
|
||||
private static OperatingSystemMXBean mbean =
|
||||
public class TestTotalSwap {
|
||||
|
||||
private static final OperatingSystemMXBean mbean =
|
||||
(com.sun.management.OperatingSystemMXBean)
|
||||
ManagementFactory.getOperatingSystemMXBean();
|
||||
|
||||
@ -62,19 +71,9 @@ public class GetTotalSwapSpaceSize {
|
||||
private static long min_size_for_pass = 0;
|
||||
private static final long MAX_SIZE_FOR_PASS = Long.MAX_VALUE;
|
||||
|
||||
private static boolean trace = false;
|
||||
|
||||
public static void main(String args[]) throws Exception {
|
||||
if (args.length > 1 && args[1].equals("trace")) {
|
||||
trace = true;
|
||||
}
|
||||
|
||||
long expected_swap_size = 0;
|
||||
|
||||
if (args.length < 1 || args.length > 2) {
|
||||
throw new IllegalArgumentException("Unexpected number of args " + args.length);
|
||||
}
|
||||
public static void main(String args[]) throws Throwable {
|
||||
|
||||
long expected_swap_size = getSwapSizeFromOs();
|
||||
|
||||
long min_size = mbean.getFreeSwapSpaceSize();
|
||||
if (min_size > 0) {
|
||||
@ -83,12 +82,9 @@ public class GetTotalSwapSpaceSize {
|
||||
|
||||
long size = mbean.getTotalSwapSpaceSize();
|
||||
|
||||
if (trace) {
|
||||
System.out.println("Total swap space size in bytes: " + size);
|
||||
}
|
||||
System.out.println("Total swap space size in bytes: " + size);
|
||||
|
||||
if (!args[0].matches("sanity-only")) {
|
||||
expected_swap_size = Long.parseLong(args[0]);
|
||||
if (expected_swap_size > -1) {
|
||||
if (size != expected_swap_size) {
|
||||
throw new RuntimeException("Expected total swap size : " +
|
||||
expected_swap_size +
|
||||
@ -97,6 +93,7 @@ public class GetTotalSwapSpaceSize {
|
||||
}
|
||||
}
|
||||
|
||||
// sanity check
|
||||
if (size < min_size_for_pass || size > MAX_SIZE_FOR_PASS) {
|
||||
throw new RuntimeException("Total swap space size " +
|
||||
"illegal value: " + size + " bytes " +
|
||||
@ -106,4 +103,60 @@ public class GetTotalSwapSpaceSize {
|
||||
|
||||
System.out.println("Test passed.");
|
||||
}
|
||||
|
||||
private static long getSwapSizeFromOs() throws Throwable {
|
||||
OSInfo.OSType os = OSInfo.getOSType();
|
||||
|
||||
switch (os) {
|
||||
// total used free shared buffers cached
|
||||
// Mem: 16533540864 13638467584 2895073280 534040576 1630248960 6236909568
|
||||
// -/+ buffers/cache: 5771309056 10762231808
|
||||
// Swap: 15999168512 0 15999168512
|
||||
|
||||
case LINUX: {
|
||||
String swapSizeStr = ProcessTools.executeCommand("free", "-b")
|
||||
.firstMatch("Swap:\\s+([0-9]+)\\s+.*", 1);
|
||||
return Long.parseLong(swapSizeStr);
|
||||
}
|
||||
case SOLARIS: {
|
||||
// swapfile dev swaplo blocks free
|
||||
// /dev/dsk/c0t0d0s1 136,1 16 1638608 1600528
|
||||
OutputAnalyzer out= ProcessTools.executeCommand(
|
||||
"/usr/sbin/swap",
|
||||
"-l"
|
||||
);
|
||||
|
||||
long swapSize = 0;
|
||||
|
||||
for (String line : out.asLines()) {
|
||||
if (line.contains("swapfile")) continue;
|
||||
|
||||
String[] vals = line.split("\\s+");
|
||||
if (vals.length == 5) {
|
||||
swapSize += Long.parseLong(vals[3]) * 512; // size is reported in 512b blocks
|
||||
}
|
||||
}
|
||||
|
||||
return swapSize;
|
||||
}
|
||||
case MACOSX: {
|
||||
// total = 8192.00M used = 7471.11M free = 720.89M (encrypted)
|
||||
String swapSizeStr = ProcessTools.executeCommand(
|
||||
"/usr/sbin/sysctl",
|
||||
"-n",
|
||||
"vm.swapusage"
|
||||
).firstMatch("total\\s+=\\s+([0-9]+(\\.[0-9]+)?[Mm]?).*", 1);
|
||||
if (swapSizeStr.toLowerCase().endsWith("m")) {
|
||||
swapSizeStr = swapSizeStr.substring(0, swapSizeStr.length() - 1);
|
||||
return (long)(Double.parseDouble(swapSizeStr) * 1024 * 1024); // size in MB
|
||||
}
|
||||
return (long)(Double.parseDouble(swapSizeStr) * 1024 * 1024);
|
||||
}
|
||||
default: {
|
||||
System.err.println("Unsupported operating system: " + os);
|
||||
}
|
||||
}
|
||||
|
||||
return -1;
|
||||
}
|
||||
}
|
@ -1,99 +0,0 @@
|
||||
#
|
||||
# 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.
|
||||
#
|
||||
|
||||
#
|
||||
# @test
|
||||
# @summary Tests MM getTotalSwapSpaceSize() api.
|
||||
# @author Swamy V
|
||||
# @bug 6252770
|
||||
#
|
||||
# @run build GetTotalSwapSpaceSize
|
||||
# @run shell TestTotalSwap.sh
|
||||
#
|
||||
|
||||
#
|
||||
# This test tests the actual swap size on linux and solaris.
|
||||
# On windows this is just a sanity check and correct size should
|
||||
# be checked manually:
|
||||
#
|
||||
# Windows NT/XP/2000:
|
||||
# 1. Run Start->Accessories->System Tools->System Information.
|
||||
# 2. The value (reported in Kbytes) is in the "Page File Space" entry
|
||||
# Windows 98/ME:
|
||||
# Unknown.
|
||||
#
|
||||
|
||||
|
||||
#set -x
|
||||
|
||||
#Set appropriate jdk
|
||||
#
|
||||
|
||||
if [ ! -z "${TESTJAVA}" ] ; then
|
||||
jdk="$TESTJAVA"
|
||||
else
|
||||
echo "--Error: TESTJAVA must be defined as the pathname of a jdk to test."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
runOne()
|
||||
{
|
||||
echo "runOne $@"
|
||||
$TESTJAVA/bin/java ${TESTVMOPTS} -classpath $TESTCLASSES $@ || exit 3
|
||||
}
|
||||
|
||||
solaris_swap_size()
|
||||
{
|
||||
total_swap=0
|
||||
for i in `/usr/sbin/swap -l | awk '{print $4}' | grep -v blocks`
|
||||
do
|
||||
# swap -l returns size in blocks of 512 bytes.
|
||||
total_swap=`expr $i \* 512 + $total_swap`
|
||||
done
|
||||
}
|
||||
|
||||
# Test GetTotalSwapSpaceSize if we are running on Unix
|
||||
total_swap=0
|
||||
case `uname -s` in
|
||||
SunOS )
|
||||
solaris_swap_size
|
||||
runOne GetTotalSwapSpaceSize $total_swap
|
||||
;;
|
||||
Linux )
|
||||
total_swap=`free -b | grep -i swap | awk '{print $2}'`
|
||||
runOne GetTotalSwapSpaceSize $total_swap
|
||||
;;
|
||||
Darwin )
|
||||
# $ sysctl -n vm.swapusage
|
||||
# total = 8192.00M used = 7471.11M free = 720.89M (encrypted)
|
||||
swap=`/usr/sbin/sysctl -n vm.swapusage | awk '{ print $3 }' | awk -F . '{ print $1 }'` || exit 2
|
||||
total_swap=`expr $swap \* 1024 \* 1024` || exit 2
|
||||
runOne GetTotalSwapSpaceSize $total_swap
|
||||
;;
|
||||
* )
|
||||
runOne GetTotalSwapSpaceSize "sanity-only"
|
||||
;;
|
||||
esac
|
||||
|
||||
exit 0
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 1999, 2007, Oracle and/or its affiliates. All rights reserved.
|
||||
* 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
|
||||
@ -23,29 +23,28 @@
|
||||
|
||||
/*
|
||||
* @test
|
||||
* @author Gary Ellison
|
||||
* @bug 4170635
|
||||
* @summary Verify equals()/hashCode() contract honored
|
||||
* @bug 8014678
|
||||
* @run main EnclosingConstructorWithSecurityManager
|
||||
* @run main/othervm EnclosingConstructorWithSecurityManager "WithSecurityManager"
|
||||
*/
|
||||
|
||||
import java.io.*;
|
||||
public class EnclosingConstructorWithSecurityManager {
|
||||
public static void main(String[] args) {
|
||||
if (args.length == 1) {
|
||||
System.setSecurityManager(new SecurityManager());
|
||||
}
|
||||
|
||||
import sun.security.acl.*;
|
||||
new Inner();
|
||||
Inner.theInner.getEnclosingConstructor();
|
||||
}
|
||||
|
||||
public static class Inner {
|
||||
public static Class<?> theInner;
|
||||
|
||||
public class PermissionEqualsHashCode {
|
||||
|
||||
public static void main(String[] args) throws Exception {
|
||||
|
||||
PermissionImpl p1 = new PermissionImpl("permissionPermission");
|
||||
PermissionImpl p2 = new PermissionImpl("permissionPermission");
|
||||
|
||||
|
||||
// the test
|
||||
if ( (p1.equals(p2)) == (p1.hashCode()==p2.hashCode()) )
|
||||
System.out.println("PASSED");
|
||||
else
|
||||
throw new Exception("Failed equals()/hashCode() contract");
|
||||
|
||||
public Inner() {
|
||||
Object o = new Object() {
|
||||
};
|
||||
Inner.theInner = o.getClass();
|
||||
}
|
||||
}
|
||||
}
|
@ -1,12 +1,10 @@
|
||||
/*
|
||||
* Copyright (c) 1996, 1997, Oracle and/or its affiliates. All rights reserved.
|
||||
* 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.
|
||||
* 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
|
||||
@ -23,28 +21,30 @@
|
||||
* questions.
|
||||
*/
|
||||
|
||||
package sun.security.acl;
|
||||
|
||||
import java.security.Principal;
|
||||
import java.security.acl.*;
|
||||
|
||||
/**
|
||||
* This class implements the principal interface for the set of all permissions.
|
||||
* @author Satish Dharmaraj
|
||||
/*
|
||||
* @test
|
||||
* @bug 8014678
|
||||
* @run main EnclosingMethodWithSecurityManager
|
||||
* @run main/othervm EnclosingMethodWithSecurityManager "WithSecurityManager"
|
||||
*/
|
||||
public class AllPermissionsImpl extends PermissionImpl {
|
||||
|
||||
public AllPermissionsImpl(String s) {
|
||||
super(s);
|
||||
public class EnclosingMethodWithSecurityManager {
|
||||
public static void main(String[] args) {
|
||||
if (args.length == 1) {
|
||||
System.setSecurityManager(new SecurityManager());
|
||||
}
|
||||
|
||||
new Inner().setTheInner();
|
||||
Inner.theInner.getEnclosingMethod();
|
||||
}
|
||||
|
||||
/**
|
||||
* This function returns true if the permission passed matches the permission represented in
|
||||
* this interface.
|
||||
* @param another The Permission object to compare with.
|
||||
* @returns true always
|
||||
*/
|
||||
public boolean equals(Permission another) {
|
||||
return true;
|
||||
public static class Inner {
|
||||
public static Class<?> theInner;
|
||||
|
||||
public void setTheInner() {
|
||||
Object o = new Object() {
|
||||
};
|
||||
Inner.theInner = o.getClass();
|
||||
}
|
||||
}
|
||||
}
|
@ -33,6 +33,7 @@
|
||||
|
||||
import java.lang.invoke.MethodHandle;
|
||||
import java.lang.invoke.MethodHandles;
|
||||
import java.util.Objects;
|
||||
|
||||
interface Intf {
|
||||
static int i = 0;
|
||||
@ -40,9 +41,8 @@ interface Intf {
|
||||
|
||||
public class Test8009222 {
|
||||
public static void main(String[] args) throws Exception {
|
||||
MethodHandles.lookup()
|
||||
.findStaticGetter(Intf.class, "i", int.class)
|
||||
.getClass(); // null check
|
||||
Objects.requireNonNull(MethodHandles.lookup()
|
||||
.findStaticGetter(Intf.class, "i", int.class));
|
||||
|
||||
System.out.println("TEST PASSED");
|
||||
}
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2013, 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
|
||||
@ -32,6 +32,7 @@ import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.function.Predicate;
|
||||
import java.nio.file.Files;
|
||||
import java.nio.file.Path;
|
||||
import java.nio.file.Paths;
|
||||
@ -235,8 +236,23 @@ public class LogGeneratedClassesTest extends LUtils {
|
||||
.filter(s -> s.startsWith("WARNING: Exception"))
|
||||
.count(),
|
||||
2, "show error each capture");
|
||||
// dumpLong/com/example/nosense/nosense
|
||||
assertEquals(Files.walk(Paths.get("dumpLong")).count(), 5, "Two lambda captured failed to log");
|
||||
// dumpLong/com/example/nonsense/nonsense
|
||||
Path dumpPath = Paths.get("dumpLong/com/example/nonsense");
|
||||
Predicate<Path> filter = p -> p.getParent() == null || dumpPath.startsWith(p) || p.startsWith(dumpPath);
|
||||
boolean debug = true;
|
||||
if (debug) {
|
||||
Files.walk(Paths.get("dumpLong"))
|
||||
.forEachOrdered(p -> {
|
||||
if (filter.test(p)) {
|
||||
System.out.println("accepted: " + p.toString());
|
||||
} else {
|
||||
System.out.println("filetered out: " + p.toString());
|
||||
}
|
||||
});
|
||||
}
|
||||
assertEquals(Files.walk(Paths.get("dumpLong"))
|
||||
.filter(filter)
|
||||
.count(), 5, "Two lambda captured failed to log");
|
||||
tr.assertZero("Should still return 0");
|
||||
}
|
||||
}
|
||||
|
@ -147,6 +147,11 @@ public class ThreadInfoCompositeData {
|
||||
info.getLockOwnerName() + " expected = " +
|
||||
values[LOCK_OWNER_NAME]);
|
||||
}
|
||||
if (!values[DAEMON].equals(info.isDaemon())) {
|
||||
throw new RuntimeException("Daemon = " +
|
||||
info.isDaemon() + " expected = " +
|
||||
values[DAEMON]);
|
||||
}
|
||||
|
||||
checkStackTrace(info.getStackTrace());
|
||||
|
||||
@ -258,8 +263,11 @@ public class ThreadInfoCompositeData {
|
||||
private static final int SUSPENDED = 11;
|
||||
private static final int IN_NATIVE = 12;
|
||||
private static final int NUM_V5_ATTS = 13;
|
||||
// JDK 6.0 ThreadInfo attribtues
|
||||
// JDK 6.0 ThreadInfo attributes
|
||||
private static final int LOCK_INFO = 13;
|
||||
// JDK 9.0 ThreadInfo attributes
|
||||
private static final int DAEMON = 14;
|
||||
private static final int PRIORITY = 15;
|
||||
|
||||
private static final String[] validItemNames = {
|
||||
"threadId",
|
||||
@ -276,6 +284,8 @@ public class ThreadInfoCompositeData {
|
||||
"suspended",
|
||||
"inNative",
|
||||
"lockInfo",
|
||||
"daemon",
|
||||
"priority",
|
||||
};
|
||||
|
||||
private static OpenType[] validItemTypes = {
|
||||
@ -293,6 +303,8 @@ public class ThreadInfoCompositeData {
|
||||
SimpleType.BOOLEAN,
|
||||
SimpleType.BOOLEAN,
|
||||
null, // CompositeType for LockInfo
|
||||
SimpleType.BOOLEAN,
|
||||
SimpleType.INTEGER,
|
||||
};
|
||||
|
||||
private static Object[] values = {
|
||||
@ -310,6 +322,8 @@ public class ThreadInfoCompositeData {
|
||||
new Boolean(false),
|
||||
new Boolean(false),
|
||||
null, // To be initialized to lockInfoCD
|
||||
new Boolean(false),
|
||||
Thread.NORM_PRIORITY,
|
||||
};
|
||||
|
||||
private static final String[] steItemNames = {
|
||||
@ -381,6 +395,8 @@ public class ThreadInfoCompositeData {
|
||||
"suspended",
|
||||
"inNative",
|
||||
"lockInfo",
|
||||
"daemon",
|
||||
"priority",
|
||||
};
|
||||
private static final OpenType[] badItemTypes = {
|
||||
SimpleType.LONG,
|
||||
@ -397,6 +413,8 @@ public class ThreadInfoCompositeData {
|
||||
SimpleType.BOOLEAN,
|
||||
SimpleType.BOOLEAN,
|
||||
SimpleType.LONG, // bad type
|
||||
SimpleType.BOOLEAN,
|
||||
SimpleType.INTEGER,
|
||||
};
|
||||
|
||||
}
|
||||
|
@ -0,0 +1,96 @@
|
||||
/*
|
||||
* 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.lang.management.*;
|
||||
import java.util.*;
|
||||
import java.util.concurrent.*;
|
||||
import java.util.concurrent.atomic.*;
|
||||
|
||||
/*
|
||||
* @test
|
||||
* @bug 6588467
|
||||
* @summary Basic test of ThreadInfo.isDaemon
|
||||
* @author Jeremy Manson
|
||||
*/
|
||||
public class ThreadDaemonTest {
|
||||
|
||||
public static void main(String[] args) throws Exception {
|
||||
final int NUM_THREADS = 20;
|
||||
final String THREAD_PREFIX = "ThreadDaemonTest-";
|
||||
|
||||
final CountDownLatch started = new CountDownLatch(NUM_THREADS);
|
||||
final CountDownLatch finished = new CountDownLatch(1);
|
||||
final AtomicReference<Exception> fail = new AtomicReference<>(null);
|
||||
|
||||
Thread[] allThreads = new Thread[NUM_THREADS];
|
||||
ThreadMXBean mbean = ManagementFactory.getThreadMXBean();
|
||||
Random rand = new Random();
|
||||
|
||||
for (int i = 0; i < NUM_THREADS; i++) {
|
||||
allThreads[i] = new Thread(new Runnable() {
|
||||
public void run() {
|
||||
try {
|
||||
started.countDown();
|
||||
finished.await();
|
||||
} catch (InterruptedException e) {
|
||||
fail.set(new Exception(
|
||||
"Unexpected InterruptedException"));
|
||||
}
|
||||
}
|
||||
}, THREAD_PREFIX + i);
|
||||
allThreads[i].setDaemon(rand.nextBoolean());
|
||||
allThreads[i].start();
|
||||
}
|
||||
|
||||
started.await();
|
||||
try {
|
||||
ThreadInfo[] allThreadInfos = mbean.dumpAllThreads(false, false);
|
||||
int count = 0;
|
||||
for (int i = 0; i < allThreadInfos.length; i++) {
|
||||
String threadName = allThreadInfos[i].getThreadName();
|
||||
if (threadName.startsWith(THREAD_PREFIX)) {
|
||||
count++;
|
||||
String[] nameAndNumber = threadName.split("-");
|
||||
int threadNum = Integer.parseInt(nameAndNumber[1]);
|
||||
if (allThreads[threadNum].isDaemon() !=
|
||||
allThreadInfos[i].isDaemon()) {
|
||||
throw new RuntimeException(
|
||||
allThreads[threadNum] + " is not like " +
|
||||
allThreadInfos[i] + ". TEST FAILED.");
|
||||
}
|
||||
}
|
||||
}
|
||||
if (count != NUM_THREADS) {
|
||||
throw new RuntimeException("Wrong number of threads examined");
|
||||
}
|
||||
}
|
||||
finally { finished.countDown(); }
|
||||
|
||||
for (int i = 0; i < NUM_THREADS; i++) {
|
||||
allThreads[i].join();
|
||||
}
|
||||
if (fail.get() != null) {
|
||||
throw fail.get();
|
||||
}
|
||||
}
|
||||
}
|
@ -34,6 +34,7 @@ public class ThreadDump {
|
||||
|
||||
public static void printThreadInfo(ThreadInfo ti) {
|
||||
StringBuilder sb = new StringBuilder("\"" + ti.getThreadName() + "\"" +
|
||||
(ti.isDaemon() ? " daemon" : "") +
|
||||
" Id=" + ti.getThreadId() +
|
||||
" in " + ti.getThreadState());
|
||||
if (ti.getLockName() != null) {
|
||||
|
85
jdk/test/java/net/Socks/BadProxySelector.java
Normal file
85
jdk/test/java/net/Socks/BadProxySelector.java
Normal file
@ -0,0 +1,85 @@
|
||||
/*
|
||||
* 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 7178362
|
||||
* @run main/othervm BadProxySelector
|
||||
*/
|
||||
|
||||
import java.net.InetSocketAddress;
|
||||
import java.net.Proxy;
|
||||
import java.net.ProxySelector;
|
||||
import java.net.Socket;
|
||||
import java.net.SocketAddress;
|
||||
import java.net.ServerSocket;
|
||||
import java.net.URI;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.io.*;
|
||||
|
||||
public class BadProxySelector {
|
||||
public static void main(String[] args) throws Exception {
|
||||
ProxySelector.setDefault(new HTTPProxySelector());
|
||||
try (ServerSocket ss = new ServerSocket(0);
|
||||
Socket s1 = new Socket(ss.getInetAddress(), ss.getLocalPort());
|
||||
Socket s2 = ss.accept()) {
|
||||
}
|
||||
|
||||
ProxySelector.setDefault(new NullHTTPProxySelector());
|
||||
try (ServerSocket ss = new ServerSocket(0);
|
||||
Socket s1 = new Socket(ss.getInetAddress(), ss.getLocalPort());
|
||||
Socket s2 = ss.accept()) {
|
||||
}
|
||||
}
|
||||
|
||||
// always returns bogus HTTP proxies
|
||||
private static class HTTPProxySelector extends ProxySelector {
|
||||
@Override
|
||||
public void connectFailed(URI uri, SocketAddress sa, IOException ioe) {}
|
||||
|
||||
@Override
|
||||
public List<Proxy> select(URI uri) {
|
||||
List<Proxy> proxies = new ArrayList<>();
|
||||
proxies.add(new Proxy(Proxy.Type.HTTP,
|
||||
new InetSocketAddress("localhost", 0)));
|
||||
proxies.add(new Proxy(Proxy.Type.HTTP,
|
||||
new InetSocketAddress("localhost", 0)));
|
||||
return proxies;
|
||||
}
|
||||
}
|
||||
|
||||
private static class NullHTTPProxySelector extends ProxySelector {
|
||||
@Override
|
||||
public void connectFailed(URI uri, SocketAddress sa, IOException ioe) {}
|
||||
|
||||
@Override
|
||||
public List<Proxy> select(URI uri) {
|
||||
List<Proxy> proxies = new ArrayList<>();
|
||||
proxies.add(null);
|
||||
proxies.add(new Proxy(Proxy.Type.HTTP,
|
||||
new InetSocketAddress("localhost", 0)));
|
||||
return proxies;
|
||||
}
|
||||
}
|
||||
}
|
313
jdk/test/java/net/spi/URLStreamHandlerProvider/Basic.java
Normal file
313
jdk/test/java/net/spi/URLStreamHandlerProvider/Basic.java
Normal file
@ -0,0 +1,313 @@
|
||||
/*
|
||||
* 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.*;
|
||||
import java.nio.file.Files;
|
||||
import java.nio.file.Path;
|
||||
import java.nio.file.Paths;
|
||||
import java.util.*;
|
||||
import java.util.Collection;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
import java.util.function.Consumer;
|
||||
import java.util.stream.Collectors;
|
||||
import java.util.stream.Stream;
|
||||
import javax.tools.JavaCompiler;
|
||||
import javax.tools.JavaFileObject;
|
||||
import javax.tools.StandardJavaFileManager;
|
||||
import javax.tools.StandardLocation;
|
||||
import javax.tools.ToolProvider;
|
||||
import jdk.testlibrary.FileUtils;
|
||||
import jdk.testlibrary.JDKToolFinder;
|
||||
import static java.lang.String.format;
|
||||
import static java.util.Arrays.asList;
|
||||
|
||||
/*
|
||||
* @test
|
||||
* @bug 8064924
|
||||
* @summary Basic test for URLStreamHandlerProvider
|
||||
* @library /lib/testlibrary
|
||||
* @build jdk.testlibrary.FileUtils jdk.testlibrary.JDKToolFinder
|
||||
* @compile Basic.java Child.java
|
||||
* @run main Basic
|
||||
*/
|
||||
|
||||
public class Basic {
|
||||
|
||||
static final Path TEST_SRC = Paths.get(System.getProperty("test.src", "."));
|
||||
static final Path TEST_CLASSES = Paths.get(System.getProperty("test.classes", "."));
|
||||
|
||||
public static void main(String[] args) throws Throwable {
|
||||
unknownProtocol("foo", UNKNOWN);
|
||||
unknownProtocol("bar", UNKNOWN);
|
||||
viaProvider("baz", KNOWN);
|
||||
viaProvider("bert", KNOWN);
|
||||
viaProvider("ernie", UNKNOWN, "-Djava.security.manager");
|
||||
viaProvider("curly", UNKNOWN, "-Djava.security.manager");
|
||||
viaProvider("larry", KNOWN, "-Djava.security.manager",
|
||||
"-Djava.security.policy=" + TEST_SRC + File.separator + "basic.policy");
|
||||
viaProvider("moe", KNOWN, "-Djava.security.manager",
|
||||
"-Djava.security.policy=" + TEST_SRC + File.separator + "basic.policy");
|
||||
viaBadProvider("tom", SCE);
|
||||
viaBadProvider("jerry", SCE);
|
||||
}
|
||||
|
||||
static final Consumer<Result> KNOWN = r -> {
|
||||
if (r.exitValue != 0 || !r.output.isEmpty())
|
||||
throw new RuntimeException(r.output);
|
||||
};
|
||||
static final Consumer<Result> UNKNOWN = r -> {
|
||||
if (r.exitValue == 0 ||
|
||||
!r.output.contains("java.net.MalformedURLException: unknown protocol")) {
|
||||
throw new RuntimeException("exitValue: "+ r.exitValue + ", output:[" +r.output +"]");
|
||||
}
|
||||
};
|
||||
static final Consumer<Result> SCE = r -> {
|
||||
if (r.exitValue == 0 ||
|
||||
!r.output.contains("java.util.ServiceConfigurationError")) {
|
||||
throw new RuntimeException("exitValue: "+ r.exitValue + ", output:[" +r.output +"]");
|
||||
}
|
||||
};
|
||||
|
||||
static void unknownProtocol(String protocol, Consumer<Result> resultChecker) {
|
||||
System.out.println("\nTesting " + protocol);
|
||||
Result r = java(Collections.emptyList(), asList(TEST_CLASSES),
|
||||
"Child", protocol);
|
||||
resultChecker.accept(r);
|
||||
}
|
||||
|
||||
static void viaProvider(String protocol, Consumer<Result> resultChecker,
|
||||
String... sysProps)
|
||||
throws Exception
|
||||
{
|
||||
viaProviderWithTemplate(protocol, resultChecker,
|
||||
TEST_SRC.resolve("provider.template"),
|
||||
sysProps);
|
||||
}
|
||||
|
||||
static void viaBadProvider(String protocol, Consumer<Result> resultChecker,
|
||||
String... sysProps)
|
||||
throws Exception
|
||||
{
|
||||
viaProviderWithTemplate(protocol, resultChecker,
|
||||
TEST_SRC.resolve("bad.provider.template"),
|
||||
sysProps);
|
||||
}
|
||||
|
||||
static void viaProviderWithTemplate(String protocol,
|
||||
Consumer<Result> resultChecker,
|
||||
Path template, String... sysProps)
|
||||
throws Exception
|
||||
{
|
||||
System.out.println("\nTesting " + protocol);
|
||||
Path testRoot = Paths.get("URLStreamHandlerProvider-" + protocol);
|
||||
if (Files.exists(testRoot))
|
||||
FileUtils.deleteFileTreeWithRetry(testRoot);
|
||||
Files.createDirectory(testRoot);
|
||||
|
||||
Path srcPath = Files.createDirectory(testRoot.resolve("src"));
|
||||
Path srcClass = createProvider(protocol, template, srcPath);
|
||||
|
||||
Path build = Files.createDirectory(testRoot.resolve("build"));
|
||||
javac(build, srcClass);
|
||||
createServices(build, protocol);
|
||||
Path testJar = testRoot.resolve("test.jar");
|
||||
jar(testJar, build);
|
||||
|
||||
List<String> props = new ArrayList<>();
|
||||
for (String p : sysProps)
|
||||
props.add(p);
|
||||
|
||||
Result r = java(props, asList(testJar, TEST_CLASSES),
|
||||
"Child", protocol);
|
||||
|
||||
resultChecker.accept(r);
|
||||
}
|
||||
|
||||
static String platformPath(String p) { return p.replace("/", File.separator); }
|
||||
static String binaryName(String name) { return name.replace(".", "/"); }
|
||||
|
||||
static final String SERVICE_IMPL_PREFIX = "net.java.openjdk.test";
|
||||
|
||||
static void createServices(Path dst, String protocol) throws IOException {
|
||||
Path services = Files.createDirectories(dst.resolve("META-INF")
|
||||
.resolve("services"));
|
||||
|
||||
final String implName = SERVICE_IMPL_PREFIX + "." + protocol + ".Provider";
|
||||
Path s = services.resolve("java.net.spi.URLStreamHandlerProvider");
|
||||
FileWriter fw = new FileWriter(s.toFile());
|
||||
try {
|
||||
fw.write(implName);
|
||||
} finally {
|
||||
fw.close();
|
||||
}
|
||||
}
|
||||
|
||||
static Path createProvider(String protocol, Path srcTemplate, Path dst)
|
||||
throws IOException
|
||||
{
|
||||
String pkg = SERVICE_IMPL_PREFIX + "." + protocol;
|
||||
Path classDst = dst.resolve(platformPath(binaryName(pkg)));
|
||||
Files.createDirectories(classDst);
|
||||
Path classPath = classDst.resolve("Provider.java");
|
||||
|
||||
List<String> lines = Files.lines(srcTemplate)
|
||||
.map(s -> s.replaceAll("\\$package", pkg))
|
||||
.map(s -> s.replaceAll("\\$protocol", protocol))
|
||||
.collect(Collectors.toList());
|
||||
Files.write(classPath, lines);
|
||||
|
||||
return classPath;
|
||||
}
|
||||
|
||||
static void jar(Path jarName, Path jarRoot) { String jar = getJDKTool("jar");
|
||||
ProcessBuilder p = new ProcessBuilder(jar, "cf", jarName.toString(),
|
||||
"-C", jarRoot.toString(), ".");
|
||||
quickFail(run(p));
|
||||
}
|
||||
|
||||
static void javac(Path dest, Path... sourceFiles) throws IOException {
|
||||
JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
|
||||
try (StandardJavaFileManager fileManager =
|
||||
compiler.getStandardFileManager(null, null, null)) {
|
||||
|
||||
List<File> files = Stream.of(sourceFiles)
|
||||
.map(p -> p.toFile())
|
||||
.collect(Collectors.toList());
|
||||
List<File> dests = Stream.of(dest)
|
||||
.map(p -> p.toFile())
|
||||
.collect(Collectors.toList());
|
||||
Iterable<? extends JavaFileObject> compilationUnits =
|
||||
fileManager.getJavaFileObjectsFromFiles(files);
|
||||
fileManager.setLocation(StandardLocation.CLASS_OUTPUT, dests);
|
||||
JavaCompiler.CompilationTask task =
|
||||
compiler.getTask(null, fileManager, null, null, null, compilationUnits);
|
||||
boolean passed = task.call();
|
||||
if (!passed)
|
||||
throw new RuntimeException("Error compiling " + files);
|
||||
}
|
||||
}
|
||||
|
||||
static void quickFail(Result r) {
|
||||
if (r.exitValue != 0)
|
||||
throw new RuntimeException(r.output);
|
||||
}
|
||||
|
||||
static Result java(List<String> sysProps, Collection<Path> classpath,
|
||||
String classname, String arg) {
|
||||
String java = getJDKTool("java");
|
||||
|
||||
List<String> commands = new ArrayList<>();
|
||||
commands.add(java);
|
||||
for (String prop : sysProps)
|
||||
commands.add(prop);
|
||||
|
||||
String cp = classpath.stream()
|
||||
.map(Path::toString)
|
||||
.collect(Collectors.joining(File.pathSeparator));
|
||||
commands.add("-cp");
|
||||
commands.add(cp);
|
||||
commands.add(classname);
|
||||
commands.add(arg);
|
||||
|
||||
return run(new ProcessBuilder(commands));
|
||||
}
|
||||
|
||||
static Result run(ProcessBuilder pb) {
|
||||
Process p = null;
|
||||
System.out.println("running: " + pb.command());
|
||||
try {
|
||||
p = pb.start();
|
||||
} catch (IOException e) {
|
||||
throw new RuntimeException(
|
||||
format("Couldn't start process '%s'", pb.command()), e);
|
||||
}
|
||||
|
||||
String output;
|
||||
try {
|
||||
output = toString(p.getInputStream(), p.getErrorStream());
|
||||
} catch (IOException e) {
|
||||
throw new RuntimeException(
|
||||
format("Couldn't read process output '%s'", pb.command()), e);
|
||||
}
|
||||
|
||||
try {
|
||||
p.waitFor();
|
||||
} catch (InterruptedException e) {
|
||||
throw new RuntimeException(
|
||||
format("Process hasn't finished '%s'", pb.command()), e);
|
||||
}
|
||||
|
||||
return new Result(p.exitValue(), output);
|
||||
}
|
||||
|
||||
static final String DEFAULT_IMAGE_BIN = System.getProperty("java.home")
|
||||
+ File.separator + "bin" + File.separator;
|
||||
|
||||
static String getJDKTool(String name) {
|
||||
try {
|
||||
return JDKToolFinder.getJDKTool(name);
|
||||
} catch (Exception x) {
|
||||
return DEFAULT_IMAGE_BIN + name;
|
||||
}
|
||||
}
|
||||
|
||||
static String toString(InputStream... src) throws IOException {
|
||||
StringWriter dst = new StringWriter();
|
||||
Reader concatenated =
|
||||
new InputStreamReader(
|
||||
new SequenceInputStream(
|
||||
Collections.enumeration(asList(src))));
|
||||
copy(concatenated, dst);
|
||||
return dst.toString();
|
||||
}
|
||||
|
||||
static void copy(Reader src, Writer dst) throws IOException {
|
||||
int len;
|
||||
char[] buf = new char[1024];
|
||||
try {
|
||||
while ((len = src.read(buf)) != -1)
|
||||
dst.write(buf, 0, len);
|
||||
} finally {
|
||||
try {
|
||||
src.close();
|
||||
} catch (IOException ignored1) {
|
||||
} finally {
|
||||
try {
|
||||
dst.close();
|
||||
} catch (IOException ignored2) {
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static class Result {
|
||||
final int exitValue;
|
||||
final String output;
|
||||
|
||||
private Result(int exitValue, String output) {
|
||||
this.exitValue = exitValue;
|
||||
this.output = output;
|
||||
}
|
||||
}
|
||||
}
|
45
jdk/test/java/net/spi/URLStreamHandlerProvider/Child.java
Normal file
45
jdk/test/java/net/spi/URLStreamHandlerProvider/Child.java
Normal file
@ -0,0 +1,45 @@
|
||||
/*
|
||||
* 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.net.MalformedURLException;
|
||||
import java.net.URL;
|
||||
|
||||
public class Child {
|
||||
|
||||
public static void main(String[] args) throws MalformedURLException {
|
||||
if (args.length != 1) {
|
||||
System.err.println("Usage: java Child <protocol>");
|
||||
return;
|
||||
}
|
||||
String protocol = args[0];
|
||||
URL url = new URL(protocol + "://");
|
||||
|
||||
// toExternalForm should return the protocol string
|
||||
String s = url.toExternalForm();
|
||||
if (!s.equals(protocol)) {
|
||||
System.err.println("Expected url.toExternalForm to return "
|
||||
+ protocol + ", but got: " + s);
|
||||
System.exit(1);
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,41 @@
|
||||
/*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
package $package;
|
||||
|
||||
import java.net.URL;
|
||||
import java.net.URLConnection;
|
||||
import java.net.URLStreamHandler;
|
||||
import java.net.spi.URLStreamHandlerProvider;
|
||||
|
||||
public class Provider extends URLStreamHandlerProvider {
|
||||
|
||||
public Provider(String someRandomArg) { // No no-args constructor
|
||||
super();
|
||||
}
|
||||
|
||||
@Override
|
||||
public URLStreamHandler createURLStreamHandler(String protocol) {
|
||||
return null;
|
||||
}
|
||||
}
|
27
jdk/test/java/net/spi/URLStreamHandlerProvider/basic.policy
Normal file
27
jdk/test/java/net/spi/URLStreamHandlerProvider/basic.policy
Normal file
@ -0,0 +1,27 @@
|
||||
/*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
grant {
|
||||
permission java.lang.RuntimePermission "setFactory";
|
||||
};
|
||||
|
@ -0,0 +1,50 @@
|
||||
/*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
package $package;
|
||||
|
||||
import java.net.URL;
|
||||
import java.net.URLConnection;
|
||||
import java.net.URLStreamHandler;
|
||||
import java.net.spi.URLStreamHandlerProvider;
|
||||
|
||||
public class Provider extends URLStreamHandlerProvider {
|
||||
|
||||
private static final String PROTOCOL = "$protocol";
|
||||
|
||||
@Override
|
||||
public URLStreamHandler createURLStreamHandler(String protocol) {
|
||||
if (!PROTOCOL.equals(protocol))
|
||||
return null;
|
||||
|
||||
return new Handler();
|
||||
}
|
||||
|
||||
static class Handler extends URLStreamHandler {
|
||||
public URLConnection openConnection(URL u) throws java.io.IOException {
|
||||
return null;
|
||||
}
|
||||
|
||||
public String toExternalForm(URL u) { return PROTOCOL; }
|
||||
}
|
||||
}
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2010, 2014, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2010, 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,41 +23,63 @@
|
||||
|
||||
/*
|
||||
* @test
|
||||
* @bug 4777124 6920545 6911753
|
||||
* @bug 4777124 6920545 6911753 8073924
|
||||
* @summary Verify that all Charset subclasses are available through the API
|
||||
*/
|
||||
|
||||
import java.io.File;
|
||||
import java.io.FileInputStream;
|
||||
import java.io.FileNotFoundException;
|
||||
import java.io.IOException;
|
||||
import java.net.URI;
|
||||
import java.nio.charset.Charset;
|
||||
import java.security.AccessController;
|
||||
import java.security.PrivilegedAction;
|
||||
import java.util.Collection;
|
||||
import java.nio.file.FileSystem;
|
||||
import java.nio.file.FileSystems;
|
||||
import java.nio.file.Files;
|
||||
import java.nio.file.Path;
|
||||
import java.util.HashSet;
|
||||
import java.util.Iterator;
|
||||
import java.util.Set;
|
||||
import java.util.Vector;
|
||||
import java.util.zip.ZipEntry;
|
||||
import java.util.zip.ZipInputStream;
|
||||
|
||||
import java.util.stream.Collectors;
|
||||
import java.util.stream.Stream;
|
||||
|
||||
public class NIOCharsetAvailabilityTest {
|
||||
|
||||
public static void main(String[] args) throws Exception {
|
||||
|
||||
// build the set of all Charset subclasses in the
|
||||
// two known charset implementation packages
|
||||
Set charsets = new HashSet();
|
||||
addCharsets(charsets, "sun.nio.cs");
|
||||
addCharsets(charsets, "sun.nio.cs.ext");
|
||||
|
||||
FileSystem fs = FileSystems.getFileSystem(URI.create("jrt:/"));
|
||||
Set<Class> charsets =
|
||||
Stream.concat(Files.walk(fs.getPath("/java.base/sun/nio/cs/")),
|
||||
Files.walk(fs.getPath("/jdk.charsets/sun/nio/cs/ext/")))
|
||||
.map( p -> p.subpath(1, p.getNameCount()).toString())
|
||||
.filter( s -> s.indexOf("$") == -1 && s.endsWith(".class"))
|
||||
.map( s -> {
|
||||
try {
|
||||
return Class.forName(s.substring(0, s.length() - 6)
|
||||
.replace('/', '.'));
|
||||
} catch (Exception x) {
|
||||
throw new RuntimeException(x);
|
||||
}
|
||||
})
|
||||
.filter( clz -> {
|
||||
Class superclazz = clz.getSuperclass();
|
||||
while (superclazz != null && !superclazz.equals(Object.class)) {
|
||||
if (superclazz.equals(Charset.class)) {
|
||||
return true;
|
||||
} else {
|
||||
superclazz = superclazz.getSuperclass();
|
||||
}
|
||||
}
|
||||
return false;
|
||||
})
|
||||
.collect(Collectors.toCollection(HashSet::new));
|
||||
// remove the charsets that the API says are available
|
||||
Collection availableCharsets = Charset.availableCharsets().values();
|
||||
Iterator iter = availableCharsets.iterator();
|
||||
while (iter.hasNext()) {
|
||||
charsets.remove(((Charset) iter.next()).getClass());
|
||||
}
|
||||
Charset.availableCharsets()
|
||||
.values()
|
||||
.stream()
|
||||
.forEach(cs -> {
|
||||
if (!charsets.contains(cs.getClass())) {
|
||||
System.out.println(" missing -> " + cs.getClass());
|
||||
}
|
||||
charsets.remove(cs.getClass());
|
||||
});
|
||||
|
||||
// remove the known pseudo-charsets that serve only to implement
|
||||
// other charsets, but shouldn't be known to the public
|
||||
@ -76,146 +98,12 @@ public class NIOCharsetAvailabilityTest {
|
||||
charsets.remove(Class.forName("sun.nio.cs.JIS_X_0208_Solaris"));
|
||||
charsets.remove(Class.forName("sun.nio.cs.JIS_X_0212_Solaris"));
|
||||
}
|
||||
|
||||
// report the charsets that are implemented but not available
|
||||
iter = charsets.iterator();
|
||||
while (iter.hasNext()) {
|
||||
System.out.println("Unused Charset subclass: " + ((Class) iter.next()).getName());
|
||||
}
|
||||
if (charsets.size() > 0) {
|
||||
charsets.stream()
|
||||
.forEach( clz ->
|
||||
System.out.println("Unused Charset subclass: " + clz));
|
||||
throw new RuntimeException();
|
||||
}
|
||||
}
|
||||
|
||||
private static Vector classPathSegments = new Vector();
|
||||
|
||||
private static void addCharsets(Set charsets, final String packageName)
|
||||
throws Exception {
|
||||
|
||||
String classPath = AccessController.doPrivileged(
|
||||
(PrivilegedAction<String>)() -> System.getProperty("sun.boot.class.path"));
|
||||
String s = AccessController.doPrivileged(
|
||||
(PrivilegedAction<String>)() -> System.getProperty("java.class.path"));
|
||||
|
||||
// Search combined system and application class path
|
||||
if (s != null && s.length() != 0) {
|
||||
classPath += File.pathSeparator + s;
|
||||
}
|
||||
while (classPath != null && classPath.length() != 0) {
|
||||
int i = classPath.lastIndexOf(java.io.File.pathSeparatorChar);
|
||||
String dir = classPath.substring(i + 1);
|
||||
if (i == -1) {
|
||||
classPath = null;
|
||||
} else {
|
||||
classPath = classPath.substring(0, i);
|
||||
}
|
||||
classPathSegments.insertElementAt(dir, 0);
|
||||
}
|
||||
|
||||
String[] classList = (String[])
|
||||
java.security.AccessController.doPrivileged(
|
||||
new java.security.PrivilegedAction() {
|
||||
public Object run() {
|
||||
return getClassList(packageName, "");
|
||||
}
|
||||
});
|
||||
|
||||
for (int i = 0; i < classList.length; i++) {
|
||||
try {
|
||||
Class clazz = Class.forName(packageName + "." + classList[i]);
|
||||
Class superclazz = clazz.getSuperclass();
|
||||
while (superclazz != null && !superclazz.equals(Object.class)) {
|
||||
if (superclazz.equals(Charset.class)) {
|
||||
charsets.add(clazz);
|
||||
break;
|
||||
} else {
|
||||
superclazz = superclazz.getSuperclass();
|
||||
}
|
||||
}
|
||||
} catch (ClassNotFoundException e) {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private static final char ZIPSEPARATOR = '/';
|
||||
|
||||
/**
|
||||
* Walk through CLASSPATH and find class list from a package.
|
||||
* The class names start with prefix string
|
||||
* @param package name, class name prefix
|
||||
* @return class list in an array of String
|
||||
*/
|
||||
private static String[] getClassList(String pkgName, String prefix) {
|
||||
Vector listBuffer = new Vector();
|
||||
String packagePath = pkgName.replace('.', File.separatorChar)
|
||||
+ File.separatorChar;
|
||||
String zipPackagePath = pkgName.replace('.', ZIPSEPARATOR)
|
||||
+ ZIPSEPARATOR;
|
||||
for (int i = 0; i < classPathSegments.size(); i++){
|
||||
String onePath = (String) classPathSegments.elementAt(i);
|
||||
File f = new File(onePath);
|
||||
if (!f.exists())
|
||||
continue;
|
||||
if (f.isFile())
|
||||
scanFile(f, zipPackagePath, listBuffer, prefix);
|
||||
else if (f.isDirectory()) {
|
||||
String fullPath;
|
||||
if (onePath.endsWith(File.separator))
|
||||
fullPath = onePath + packagePath;
|
||||
else
|
||||
fullPath = onePath + File.separatorChar + packagePath;
|
||||
File dir = new File(fullPath);
|
||||
if (dir.exists() && dir.isDirectory())
|
||||
scanDir(dir, listBuffer, prefix);
|
||||
}
|
||||
}
|
||||
String[] classNames = new String[listBuffer.size()];
|
||||
listBuffer.copyInto(classNames);
|
||||
return classNames;
|
||||
}
|
||||
|
||||
private static void addClass (String className, Vector listBuffer, String prefix) {
|
||||
if (className != null && className.startsWith(prefix)
|
||||
&& !listBuffer.contains(className))
|
||||
listBuffer.addElement(className);
|
||||
}
|
||||
|
||||
private static String midString(String str, String pre, String suf) {
|
||||
String midStr;
|
||||
if (str.startsWith(pre) && str.endsWith(suf))
|
||||
midStr = str.substring(pre.length(), str.length() - suf.length());
|
||||
else
|
||||
midStr = null;
|
||||
return midStr;
|
||||
}
|
||||
|
||||
private static void scanDir(File dir, Vector listBuffer, String prefix) {
|
||||
String[] fileList = dir.list();
|
||||
for (int i = 0; i < fileList.length; i++) {
|
||||
addClass(midString(fileList[i], "", ".class"), listBuffer, prefix);
|
||||
}
|
||||
}
|
||||
|
||||
private static void scanFile(File f, String packagePath, Vector listBuffer,
|
||||
String prefix) {
|
||||
try {
|
||||
ZipInputStream zipFile = new ZipInputStream(new FileInputStream(f));
|
||||
ZipEntry entry;
|
||||
while ((entry = zipFile.getNextEntry()) != null) {
|
||||
String eName = entry.getName();
|
||||
if (eName.startsWith(packagePath)) {
|
||||
if (eName.endsWith(".class")) {
|
||||
addClass(midString(eName, packagePath, ".class"),
|
||||
listBuffer, prefix);
|
||||
}
|
||||
}
|
||||
}
|
||||
} catch (FileNotFoundException e) {
|
||||
System.out.println("file not found:" + e);
|
||||
} catch (IOException e) {
|
||||
System.out.println("file IO Exception:" + e);
|
||||
} catch (Exception e) {
|
||||
System.out.println("Exception:" + e);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -22,7 +22,8 @@
|
||||
*/
|
||||
|
||||
/* @test
|
||||
* @bug 4473201 4696726 4652234 4482298 4784385 4966197 4267354 5015668 6911753
|
||||
* @bug 4473201 4696726 4652234 4482298 4784385 4966197 4267354 5015668
|
||||
6911753 8071447
|
||||
* @summary Check that registered charsets are actually registered
|
||||
*/
|
||||
|
||||
@ -135,6 +136,7 @@ public class RegisteredCharsets {
|
||||
"x-IBM1122",
|
||||
"x-IBM1123",
|
||||
"x-IBM1124",
|
||||
"x-IBM1166",
|
||||
"x-IBM875",
|
||||
"x-IBM921",
|
||||
"x-IBM922",
|
||||
@ -863,6 +865,14 @@ public class RegisteredCharsets {
|
||||
"1124"
|
||||
} );
|
||||
|
||||
aliasCheck("x-IBM1166" ,
|
||||
new String[] {
|
||||
"cp1166", // JDK historical
|
||||
"ibm1166",
|
||||
"ibm-1166",
|
||||
"1166"
|
||||
} );
|
||||
|
||||
aliasCheck("IBM273" ,
|
||||
new String[] {
|
||||
"cp273", // JDK historical
|
||||
|
@ -674,6 +674,12 @@ public class SunioAlias {
|
||||
aliasTable.put("cp1124", "Cp1124");
|
||||
aliasTable.put("1124", "Cp1124");
|
||||
|
||||
// MIBenum: ????
|
||||
aliasTable.put("ibm1166", "Cp1166");
|
||||
aliasTable.put("ibm-1166", "Cp1166");
|
||||
aliasTable.put("cp1166", "Cp1166");
|
||||
aliasTable.put("1166", "Cp1166");
|
||||
|
||||
// MIBenum: ????
|
||||
aliasTable.put("ibm1381", "Cp1381"); /* MDA */
|
||||
aliasTable.put("ibm-1381", "Cp1381"); /* MDA */
|
||||
|
@ -66,8 +66,10 @@ import java.lang.reflect.Field;
|
||||
import java.time.Clock;
|
||||
import java.time.Instant;
|
||||
import java.time.ZoneId;
|
||||
import java.time.ZoneOffset;
|
||||
|
||||
import org.testng.annotations.Test;
|
||||
import org.testng.annotations.DataProvider;
|
||||
|
||||
/**
|
||||
* Test system clock.
|
||||
@ -76,6 +78,7 @@ import org.testng.annotations.Test;
|
||||
public class TestClock_System {
|
||||
|
||||
private static final ZoneId PARIS = ZoneId.of("Europe/Paris");
|
||||
private static final Clock systemUTC = Clock.systemUTC();
|
||||
|
||||
public void test_withZone_same() {
|
||||
Clock test = Clock.system(PARIS);
|
||||
@ -89,6 +92,32 @@ public class TestClock_System {
|
||||
assertEquals(test.toString(), "SystemClock[Europe/Paris]");
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------
|
||||
@DataProvider(name="sampleSystemUTC")
|
||||
Object[][] provider_sampleSystemUTC() {
|
||||
return new Object[][] {
|
||||
{"Clock.systemUTC()#1", Clock.systemUTC()},
|
||||
{"Clock.systemUTC()#2", Clock.systemUTC()},
|
||||
{"Clock.system(ZoneOffset.UTC)#1", Clock.system(ZoneOffset.UTC)},
|
||||
{"Clock.system(ZoneOffset.UTC)#2", Clock.system(ZoneOffset.UTC)}
|
||||
};
|
||||
}
|
||||
|
||||
// Test for 8073394
|
||||
@Test(dataProvider="sampleSystemUTC")
|
||||
public void test_systemUTC(String s, Clock clock) {
|
||||
if (clock != systemUTC) {
|
||||
throw new RuntimeException("Unexpected clock instance for " + s + ": "
|
||||
+ "\n\texpected: " + toString(systemUTC)
|
||||
+ "\n\tactual: " + toString(clock));
|
||||
}
|
||||
}
|
||||
|
||||
private static String toString(Clock c) {
|
||||
return c == null ? null :
|
||||
c + " " + c.getClass().getName() + "@" + System.identityHashCode(c);
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------
|
||||
|
||||
private static String formatTime(String prefix, Instant time) {
|
||||
|
@ -24,63 +24,59 @@
|
||||
/*
|
||||
* @test
|
||||
* @bug 8072909
|
||||
* @run main/othervm -Xmx385m TimSortStackSize2 67108864
|
||||
* not for regular execution on all platforms:
|
||||
* @run main/othervm -Xms385m TimSortStackSize2 67108864
|
||||
* @summary Test TimSort stack size on big arrays
|
||||
* big tests not for regular execution on all platforms:
|
||||
* run main/othervm -Xmx8g TimSortStackSize2 1073741824
|
||||
* run main/othervm -Xmx16g TimSortStackSize2 2147483644
|
||||
* @summary Test TimSort stack size on big arrays
|
||||
*/
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.Comparator;
|
||||
import java.util.List;
|
||||
import java.util.function.Consumer;
|
||||
|
||||
public class TimSortStackSize2 {
|
||||
|
||||
public static void main(String[] args) {
|
||||
int lengthOfTest = Integer.parseInt(args[0]);
|
||||
boolean passed = true;
|
||||
try {
|
||||
Integer [] a = new TimSortStackSize2(lengthOfTest).createArray();
|
||||
long begin = System.nanoTime();
|
||||
Arrays.sort(a, new Comparator<Object>() {
|
||||
@SuppressWarnings("unchecked")
|
||||
public int compare(Object first, Object second) {
|
||||
return ((Comparable<Object>)first).compareTo(second);
|
||||
}
|
||||
});
|
||||
long end = System.nanoTime();
|
||||
System.out.println("TimSort: " + (end - begin));
|
||||
a = null;
|
||||
} catch (ArrayIndexOutOfBoundsException e){
|
||||
System.out.println("TimSort broken:");
|
||||
e.printStackTrace();
|
||||
passed = false;
|
||||
}
|
||||
|
||||
try {
|
||||
Integer [] a = new TimSortStackSize2(lengthOfTest).createArray();
|
||||
long begin = System.nanoTime();
|
||||
Arrays.sort(a);
|
||||
long end = System.nanoTime();
|
||||
System.out.println("ComparableTimSort: " + (end - begin));
|
||||
a = null;
|
||||
} catch (ArrayIndexOutOfBoundsException e){
|
||||
System.out.println("ComparableTimSort broken:");
|
||||
e.printStackTrace();
|
||||
passed = false;
|
||||
}
|
||||
boolean passed = doTest("TimSort", lengthOfTest,
|
||||
(Integer [] a) -> Arrays.sort(a));
|
||||
passed = doTest("ComparableTimSort", lengthOfTest, (Integer [] a) ->
|
||||
Arrays.sort(a, (Object first, Object second) -> {
|
||||
return ((Comparable<Object>)first).compareTo(second);
|
||||
}))
|
||||
&& passed;
|
||||
if ( !passed ){
|
||||
throw new RuntimeException();
|
||||
}
|
||||
}
|
||||
|
||||
private static boolean doTest(final String msg, final int lengthOfTest,
|
||||
final Consumer<Integer[]> c){
|
||||
Integer [] a = null;
|
||||
try {
|
||||
a = new TimSortStackSize2(lengthOfTest).createArray();
|
||||
long begin = System.nanoTime();
|
||||
c.accept(a);
|
||||
long end = System.nanoTime();
|
||||
System.out.println(msg + " OK. Time: " + (end - begin) + "ns");
|
||||
} catch (ArrayIndexOutOfBoundsException e){
|
||||
System.out.println(msg + " broken:");
|
||||
e.printStackTrace();
|
||||
return false;
|
||||
} finally {
|
||||
a = null;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
private static final int MIN_MERGE = 32;
|
||||
private final int minRun;
|
||||
private final int length;
|
||||
private final List<Long> runs = new ArrayList<Long>();
|
||||
|
||||
public TimSortStackSize2(int len) {
|
||||
public TimSortStackSize2(final int len) {
|
||||
this.length = len;
|
||||
minRun = minRunLength(len);
|
||||
fillRunsJDKWorstCase();
|
||||
@ -106,24 +102,24 @@ public class TimSortStackSize2 {
|
||||
* @param X The sum of the sequence that should be added to runs.
|
||||
*/
|
||||
private void generateJDKWrongElem(long X) {
|
||||
for(long newTotal; X >= 2*minRun+1; X = newTotal) {
|
||||
for(long newTotal; X >= 2 * minRun + 1; X = newTotal) {
|
||||
//Default strategy
|
||||
newTotal = X/2 + 1;
|
||||
newTotal = X / 2 + 1;
|
||||
//Specialized strategies
|
||||
if(3*minRun+3 <= X && X <= 4*minRun+1) {
|
||||
if(3 * minRun + 3 <= X && X <= 4*minRun+1) {
|
||||
// add x_1=MIN+1, x_2=MIN, x_3=X-newTotal to runs
|
||||
newTotal = 2*minRun+1;
|
||||
} else if(5*minRun+5 <= X && X <= 6*minRun+5) {
|
||||
newTotal = 2 * minRun + 1;
|
||||
} else if (5 * minRun + 5 <= X && X <= 6 * minRun + 5) {
|
||||
// add x_1=MIN+1, x_2=MIN, x_3=MIN+2, x_4=X-newTotal to runs
|
||||
newTotal = 3*minRun+3;
|
||||
} else if(8*minRun+9 <= X && X <= 10*minRun+9) {
|
||||
newTotal = 3 * minRun + 3;
|
||||
} else if (8 * minRun + 9 <= X && X <= 10 * minRun + 9) {
|
||||
// add x_1=MIN+1, x_2=MIN, x_3=MIN+2, x_4=2MIN+2, x_5=X-newTotal to runs
|
||||
newTotal = 5*minRun+5;
|
||||
} else if(13*minRun+15 <= X && X <= 16*minRun+17) {
|
||||
newTotal = 5 * minRun + 5;
|
||||
} else if (13 * minRun + 15 <= X && X <= 16 * minRun + 17) {
|
||||
// add x_1=MIN+1, x_2=MIN, x_3=MIN+2, x_4=2MIN+2, x_5=3MIN+4, x_6=X-newTotal to runs
|
||||
newTotal = 8*minRun+9;
|
||||
newTotal = 8 * minRun + 9;
|
||||
}
|
||||
runs.add(0, X-newTotal);
|
||||
runs.add(0, X - newTotal);
|
||||
}
|
||||
runs.add(0, X);
|
||||
}
|
||||
@ -144,10 +140,10 @@ public class TimSortStackSize2 {
|
||||
long Y = minRun + 4;
|
||||
long X = minRun;
|
||||
|
||||
while(runningTotal+Y+X <= length) {
|
||||
while (runningTotal + Y + X <= length) {
|
||||
runningTotal += X + Y;
|
||||
generateJDKWrongElem(X);
|
||||
runs.add(0,Y);
|
||||
runs.add(0, Y);
|
||||
|
||||
// X_{i+1} = Y_i + x_{i,1} + 1, since runs.get(1) = x_{i,1}
|
||||
X = Y + runs.get(1) + 1;
|
||||
@ -156,21 +152,22 @@ public class TimSortStackSize2 {
|
||||
Y += X + 1;
|
||||
}
|
||||
|
||||
if(runningTotal + X <= length) {
|
||||
if (runningTotal + X <= length) {
|
||||
runningTotal += X;
|
||||
generateJDKWrongElem(X);
|
||||
}
|
||||
|
||||
runs.add(length-runningTotal);
|
||||
runs.add(length - runningTotal);
|
||||
}
|
||||
|
||||
private Integer[] createArray() {
|
||||
Integer[] a = new Integer[length];
|
||||
private Integer [] createArray() {
|
||||
Integer [] a = new Integer[length];
|
||||
Arrays.fill(a, 0);
|
||||
int endRun = -1;
|
||||
for(long len : runs)
|
||||
a[endRun+=len] = 1;
|
||||
a[length-1]=0;
|
||||
for (long len : runs) {
|
||||
a[endRun += len] = 1;
|
||||
}
|
||||
a[length - 1] = 0;
|
||||
return a;
|
||||
}
|
||||
|
||||
|
@ -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
|
||||
@ -346,26 +346,29 @@ public class FileHandlerLongLimit {
|
||||
assertEquals(0, getWritten(metered), "written");
|
||||
|
||||
// now we're going to publish a series of log records
|
||||
// we're using the same log record over and over to make
|
||||
// sure we get the same amount of bytes.
|
||||
String msg = "this is at least 10 chars long";
|
||||
fh.publish(new LogRecord(Level.SEVERE, msg));
|
||||
LogRecord record = new LogRecord(Level.SEVERE, msg);
|
||||
fh.publish(record);
|
||||
fh.flush();
|
||||
long w = getWritten(metered);
|
||||
long offset = getWritten(metered);
|
||||
System.out.println("first offset is: " + offset);
|
||||
|
||||
fh.publish(new LogRecord(Level.SEVERE, msg));
|
||||
fh.publish(record);
|
||||
fh.flush();
|
||||
offset = getWritten(metered) - w;
|
||||
w = getWritten(metered);
|
||||
System.out.println("second offset is: " + offset);
|
||||
|
||||
fh.publish(new LogRecord(Level.SEVERE, msg));
|
||||
fh.publish(record);
|
||||
fh.flush();
|
||||
offset = getWritten(metered) - w;
|
||||
w = getWritten(metered);
|
||||
System.out.println("third offset is: " + offset);
|
||||
|
||||
fh.publish(new LogRecord(Level.SEVERE, msg));
|
||||
fh.publish(record);
|
||||
fh.flush();
|
||||
offset = getWritten(metered) - w;
|
||||
System.out.println("fourth offset is: " + offset);
|
||||
@ -377,7 +380,7 @@ public class FileHandlerLongLimit {
|
||||
|
||||
// publish one more log record. we should still be just beneath
|
||||
// the limit
|
||||
fh.publish(new LogRecord(Level.SEVERE, msg));
|
||||
fh.publish(record);
|
||||
fh.flush();
|
||||
assertEquals(w+offset, getWritten(metered), "written");
|
||||
|
||||
@ -392,9 +395,9 @@ public class FileHandlerLongLimit {
|
||||
// writing the first log record or just before writing the next
|
||||
// one. We publich two - so we're sure that the log must have
|
||||
// rotated.
|
||||
fh.publish(new LogRecord(Level.SEVERE, msg));
|
||||
fh.publish(record);
|
||||
fh.flush();
|
||||
fh.publish(new LogRecord(Level.SEVERE, msg));
|
||||
fh.publish(record);
|
||||
fh.flush();
|
||||
|
||||
// Check that fh.meter is a different instance of MeteredStream.
|
||||
|
@ -0,0 +1,143 @@
|
||||
/*
|
||||
* 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.ByteArrayInputStream;
|
||||
import java.io.ByteArrayOutputStream;
|
||||
import java.io.IOException;
|
||||
import java.io.ObjectInputStream;
|
||||
import java.io.ObjectOutputStream;
|
||||
import java.util.logging.Level;
|
||||
import java.util.logging.LogRecord;
|
||||
import java.util.logging.SimpleFormatter;
|
||||
|
||||
/**
|
||||
* @test
|
||||
* @bug 8072645
|
||||
* @summary tests that LogRecord has nanos...
|
||||
* @run main LogRecordWithNanos
|
||||
* @author danielfuchs
|
||||
*/
|
||||
public class LogRecordWithNanos {
|
||||
|
||||
static final int MILLIS_IN_SECOND = 1000;
|
||||
static final int NANOS_IN_MILLI = 1000_000;
|
||||
static final int NANOS_IN_SECOND = 1000_000_000;
|
||||
|
||||
static final boolean verbose = false;
|
||||
|
||||
static final class TestAssertException extends RuntimeException {
|
||||
TestAssertException(String msg) { super(msg); }
|
||||
}
|
||||
|
||||
private static void assertEquals(long expected, long received, String msg) {
|
||||
if (expected != received) {
|
||||
throw new TestAssertException("Unexpected result for " + msg
|
||||
+ ".\n\texpected: " + expected
|
||||
+ "\n\tactual: " + received);
|
||||
} else if (verbose) {
|
||||
System.out.println("Got expected " + msg + ": " + received);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Serializes a log record, then deserializes it and check that both
|
||||
* records match.
|
||||
* @param record the log record to serialize & deserialize.
|
||||
* @throws IOException Unexpected.
|
||||
* @throws ClassNotFoundException Unexpected.
|
||||
*/
|
||||
public static void test(LogRecord record)
|
||||
throws IOException, ClassNotFoundException {
|
||||
|
||||
// Format the given logRecord using the SimpleFormatter
|
||||
SimpleFormatter formatter = new SimpleFormatter();
|
||||
String str = formatter.format(record);
|
||||
|
||||
// Serialize the given LogRecord
|
||||
final ByteArrayOutputStream baos = new ByteArrayOutputStream();
|
||||
final ObjectOutputStream oos = new ObjectOutputStream(baos);
|
||||
oos.writeObject(record);
|
||||
oos.flush();
|
||||
oos.close();
|
||||
|
||||
// First checks that the log record can be deserialized
|
||||
final ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
|
||||
final ObjectInputStream ois = new ObjectInputStream(bais);
|
||||
final LogRecord record2 = (LogRecord)ois.readObject();
|
||||
|
||||
assertEquals(record.getMillis(), record2.getMillis(), "getMillis()");
|
||||
assertEquals(record.getInstant().getEpochSecond(),
|
||||
record2.getInstant().getEpochSecond(),
|
||||
"getInstant().getEpochSecond()");
|
||||
assertEquals(record.getInstant().getNano(),
|
||||
record2.getInstant().getNano(),
|
||||
"getInstant().getNano()");
|
||||
assertEquals(record.getInstant().toEpochMilli(),
|
||||
record2.getInstant().toEpochMilli(),
|
||||
"getInstant().toEpochMilli()");
|
||||
assertEquals(record.getMillis(),
|
||||
record.getInstant().toEpochMilli(),
|
||||
"getMillis()/getInstant().toEpochMilli()");
|
||||
assertEquals(record2.getMillis(),
|
||||
record2.getInstant().toEpochMilli(),
|
||||
"getMillis()/getInstant().toEpochMilli()");
|
||||
assertEquals((record.getMillis()%MILLIS_IN_SECOND)*NANOS_IN_MILLI
|
||||
+ (record.getInstant().getNano() % NANOS_IN_MILLI),
|
||||
record.getInstant().getNano(),
|
||||
"record.getMillis()%1000)*1000_000"
|
||||
+ " + record.getInstant().getNano()%1000_000 / getInstant().getNano()");
|
||||
assertEquals((record2.getMillis()%MILLIS_IN_SECOND)*NANOS_IN_MILLI
|
||||
+ (record2.getInstant().getNano() % NANOS_IN_MILLI),
|
||||
record2.getInstant().getNano(),
|
||||
"record2.getMillis()%1000)*1000_000"
|
||||
+ " + record2.getInstant().getNano()%1000_000 / getInstant().getNano()");
|
||||
|
||||
// Format the deserialized LogRecord using the SimpleFormatter, and
|
||||
// check that the string representation obtained matches the string
|
||||
// representation of the original LogRecord
|
||||
String str2 = formatter.format(record2);
|
||||
if (!str.equals(str2))
|
||||
throw new RuntimeException("Unexpected values in deserialized object:"
|
||||
+ "\n\tExpected: " + str
|
||||
+ "\n\tRetrieved: "+str);
|
||||
|
||||
}
|
||||
|
||||
|
||||
public static void main(String[] args) throws Exception {
|
||||
int count=0;
|
||||
for (int i=0; i<1000; i++) {
|
||||
LogRecord record = new LogRecord(Level.INFO, "Java Version: {0}");
|
||||
record.setLoggerName("test");
|
||||
record.setParameters(new Object[] {System.getProperty("java.version")});
|
||||
if (record.getInstant().getNano() % 1000_000 != 0) {
|
||||
count++;
|
||||
}
|
||||
test(record);
|
||||
}
|
||||
if (count == 0) {
|
||||
throw new RuntimeException("Expected at least one record to have nanos");
|
||||
}
|
||||
System.out.println(count + "/1000 records had nano adjustment.");
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,308 @@
|
||||
/*
|
||||
* 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.ByteArrayInputStream;
|
||||
import java.io.ByteArrayOutputStream;
|
||||
import java.io.IOException;
|
||||
import java.io.ObjectInputStream;
|
||||
import java.io.ObjectOutputStream;
|
||||
import java.time.Instant;
|
||||
import java.util.Objects;
|
||||
import java.util.logging.Level;
|
||||
import java.util.logging.LogRecord;
|
||||
import java.util.logging.SimpleFormatter;
|
||||
|
||||
/**
|
||||
* @test
|
||||
* @bug 8072645
|
||||
* @summary tests the new methods added to LogRecord.
|
||||
* @run main LogRecordWithNanosAPI
|
||||
* @author danielfuchs
|
||||
*/
|
||||
public class LogRecordWithNanosAPI {
|
||||
|
||||
static final int MILLIS_IN_SECOND = 1000;
|
||||
static final int NANOS_IN_MILLI = 1000_000;
|
||||
static final int NANOS_IN_SECOND = 1000_000_000;
|
||||
|
||||
static final boolean verbose = true;
|
||||
|
||||
static final class TestAssertException extends RuntimeException {
|
||||
TestAssertException(String msg) { super(msg); }
|
||||
}
|
||||
|
||||
private static void assertEquals(long expected, long received, String msg) {
|
||||
if (expected != received) {
|
||||
throw new TestAssertException("Unexpected result for " + msg
|
||||
+ ".\n\texpected: " + expected
|
||||
+ "\n\tactual: " + received);
|
||||
} else if (verbose) {
|
||||
System.out.println("Got expected " + msg + ": " + received);
|
||||
}
|
||||
}
|
||||
|
||||
private static void assertEquals(Object expected, Object received, String msg) {
|
||||
if (!Objects.equals(expected, received)) {
|
||||
throw new TestAssertException("Unexpected result for " + msg
|
||||
+ ".\n\texpected: " + expected
|
||||
+ "\n\tactual: " + received);
|
||||
} else if (verbose) {
|
||||
System.out.println("Got expected " + msg + ": " + received);
|
||||
}
|
||||
}
|
||||
|
||||
// The nano second fractional part of a second, contained in a time expressed
|
||||
// as a number of millisecond from the epoch.
|
||||
private static long nanoInSecondFromEpochMilli(long millis) {
|
||||
return (((millis%MILLIS_IN_SECOND) + MILLIS_IN_SECOND)%MILLIS_IN_SECOND)*NANOS_IN_MILLI;
|
||||
}
|
||||
|
||||
/**
|
||||
* Serializes a log record, then deserializes it and check that both
|
||||
* records match.
|
||||
* @param record the log record to serialize & deserialize.
|
||||
* @param hasExceedingNanos whether the record has a nano adjustment whose
|
||||
* value exceeds 1ms.
|
||||
* @throws IOException Unexpected.
|
||||
* @throws ClassNotFoundException Unexpected.
|
||||
*/
|
||||
public static void test(LogRecord record, boolean hasExceedingNanos)
|
||||
throws IOException, ClassNotFoundException {
|
||||
|
||||
// Format the given logRecord using the SimpleFormatter
|
||||
SimpleFormatter formatter = new SimpleFormatter();
|
||||
String str = formatter.format(record);
|
||||
|
||||
// Serialize the given LogRecord
|
||||
final ByteArrayOutputStream baos = new ByteArrayOutputStream();
|
||||
final ObjectOutputStream oos = new ObjectOutputStream(baos);
|
||||
oos.writeObject(record);
|
||||
oos.flush();
|
||||
oos.close();
|
||||
|
||||
// First checks that the log record can be deserialized
|
||||
final ByteArrayInputStream bais =
|
||||
new ByteArrayInputStream(baos.toByteArray());
|
||||
final ObjectInputStream ois = new ObjectInputStream(bais);
|
||||
final LogRecord record2 = (LogRecord)ois.readObject();
|
||||
|
||||
assertEquals(record.getMillis(), record2.getMillis(), "getMillis()");
|
||||
assertEquals(record.getInstant().getEpochSecond(),
|
||||
record2.getInstant().getEpochSecond(),
|
||||
"getInstant().getEpochSecond()");
|
||||
assertEquals(record.getInstant().getNano(),
|
||||
record2.getInstant().getNano(),
|
||||
"getInstant().getNano()");
|
||||
assertEquals(record.getInstant().toEpochMilli(),
|
||||
record2.getInstant().toEpochMilli(),
|
||||
"getInstant().toEpochMilli()");
|
||||
long millis = record.getMillis();
|
||||
millis = hasExceedingNanos
|
||||
? Instant.ofEpochSecond(millis/MILLIS_IN_SECOND,
|
||||
(millis%MILLIS_IN_SECOND)*NANOS_IN_MILLI
|
||||
+ record.getInstant().getNano() % NANOS_IN_MILLI).toEpochMilli()
|
||||
: millis;
|
||||
assertEquals(millis, record.getInstant().toEpochMilli(),
|
||||
"getMillis()/getInstant().toEpochMilli()");
|
||||
millis = record2.getMillis();
|
||||
millis = hasExceedingNanos
|
||||
? Instant.ofEpochSecond(millis/MILLIS_IN_SECOND,
|
||||
(millis%MILLIS_IN_SECOND)*NANOS_IN_MILLI
|
||||
+ record2.getInstant().getNano() % NANOS_IN_MILLI).toEpochMilli()
|
||||
: millis;
|
||||
assertEquals(millis, record2.getInstant().toEpochMilli(),
|
||||
"getMillis()/getInstant().toEpochMilli()");
|
||||
long nanos = nanoInSecondFromEpochMilli(record.getMillis())
|
||||
+ record.getInstant().getNano() % NANOS_IN_MILLI;
|
||||
assertEquals(nanos, record.getInstant().getNano(),
|
||||
"nanoInSecondFromEpochMilli(record.getMillis())"
|
||||
+ " + record.getInstant().getNano() % NANOS_IN_MILLI /getInstant().getNano()");
|
||||
nanos = nanoInSecondFromEpochMilli(record2.getMillis())
|
||||
+ record2.getInstant().getNano() % NANOS_IN_MILLI;
|
||||
assertEquals(nanos, record2.getInstant().getNano(),
|
||||
"nanoInSecondFromEpochMilli(record2.getMillis())"
|
||||
+ " + record2.getInstant().getNano() % NANOS_IN_MILLI /getInstant().getNano()");
|
||||
|
||||
// Format the deserialized LogRecord using the SimpleFormatter, and
|
||||
// check that the string representation obtained matches the string
|
||||
// representation of the original LogRecord
|
||||
String str2 = formatter.format(record2);
|
||||
if (!str.equals(str2))
|
||||
throw new RuntimeException("Unexpected values in deserialized object:"
|
||||
+ "\n\tExpected: " + str
|
||||
+ "\n\tRetrieved: "+str);
|
||||
|
||||
}
|
||||
|
||||
|
||||
public static void main(String[] args) throws Exception {
|
||||
int count=0;
|
||||
LogRecord record = new LogRecord(Level.INFO, "Java Version: {0}");
|
||||
record.setLoggerName("test");
|
||||
record.setParameters(new Object[] {System.getProperty("java.version")});
|
||||
final int nanos = record.getInstant().getNano() % NANOS_IN_MILLI;
|
||||
final long millis = record.getMillis();
|
||||
final Instant instant = record.getInstant();
|
||||
if (millis != instant.toEpochMilli()) {
|
||||
throw new RuntimeException("Unexpected millis: "
|
||||
+ record.getMillis());
|
||||
}
|
||||
test(record, false);
|
||||
|
||||
// nano adjustment < 1ms (canonical case)
|
||||
int newNanos = (nanos + 111111) % NANOS_IN_MILLI;
|
||||
record.setInstant(Instant.ofEpochSecond(millis/MILLIS_IN_SECOND,
|
||||
(millis % MILLIS_IN_SECOND) * NANOS_IN_MILLI + newNanos));
|
||||
assertEquals(newNanos, record.getInstant().getNano() % NANOS_IN_MILLI,
|
||||
"record.getInstant().getNano() % NANOS_IN_MILLI");
|
||||
assertEquals(millis, record.getMillis(), "record.getMillis()");
|
||||
assertEquals(Instant.ofEpochSecond(millis/MILLIS_IN_SECOND,
|
||||
(millis%MILLIS_IN_SECOND)*NANOS_IN_MILLI + newNanos),
|
||||
record.getInstant(), "record.getInstant()");
|
||||
test(record, false);
|
||||
assertEquals(newNanos, record.getInstant().getNano() % NANOS_IN_MILLI,
|
||||
"record.getInstant().getNano() % NANOS_IN_MILLI");
|
||||
assertEquals(millis, record.getMillis(), "record.getMillis()");
|
||||
assertEquals(Instant.ofEpochSecond(millis/MILLIS_IN_SECOND,
|
||||
(millis%MILLIS_IN_SECOND)*NANOS_IN_MILLI + newNanos),
|
||||
record.getInstant(), "record.getInstant()");
|
||||
|
||||
// nano adjustment > 1ms - non canonical - should still work
|
||||
int newExceedingNanos = 2111_111;
|
||||
record.setInstant(Instant.ofEpochSecond(millis/MILLIS_IN_SECOND,
|
||||
(millis % MILLIS_IN_SECOND) * NANOS_IN_MILLI + newExceedingNanos));
|
||||
assertEquals(newExceedingNanos % NANOS_IN_MILLI,
|
||||
record.getInstant().getNano() % NANOS_IN_MILLI,
|
||||
"record.getInstant().getNano() % NANOS_IN_MILLI");
|
||||
assertEquals(millis + newExceedingNanos / NANOS_IN_MILLI,
|
||||
record.getMillis(), "record.getMillis()");
|
||||
assertEquals(Instant.ofEpochSecond(millis/MILLIS_IN_SECOND,
|
||||
(millis%MILLIS_IN_SECOND)*NANOS_IN_MILLI + newExceedingNanos),
|
||||
record.getInstant(), "record.getInstant()");
|
||||
test(record, true);
|
||||
assertEquals(newExceedingNanos % NANOS_IN_MILLI,
|
||||
record.getInstant().getNano() % NANOS_IN_MILLI,
|
||||
"record.getInstant().getNano() % NANOS_IN_MILLI");
|
||||
assertEquals(millis + newExceedingNanos / NANOS_IN_MILLI,
|
||||
record.getMillis(), "record.getMillis()");
|
||||
assertEquals(Instant.ofEpochSecond(millis/MILLIS_IN_SECOND,
|
||||
(millis%MILLIS_IN_SECOND)*NANOS_IN_MILLI + newExceedingNanos),
|
||||
record.getInstant(), "record.getInstant()");
|
||||
|
||||
// nano adjustement > 1s - non canonical - should still work
|
||||
newExceedingNanos = 1111_111_111;
|
||||
record.setInstant(Instant.ofEpochSecond(millis/MILLIS_IN_SECOND,
|
||||
(millis % MILLIS_IN_SECOND) * NANOS_IN_MILLI + newExceedingNanos));
|
||||
assertEquals(newExceedingNanos % NANOS_IN_MILLI,
|
||||
record.getInstant().getNano() % NANOS_IN_MILLI,
|
||||
"record.getInstant().getNano() % NANOS_IN_MILLI");
|
||||
assertEquals(millis + newExceedingNanos / NANOS_IN_MILLI,
|
||||
record.getMillis(), "record.getMillis()");
|
||||
assertEquals(Instant.ofEpochSecond(millis/MILLIS_IN_SECOND,
|
||||
(millis%MILLIS_IN_SECOND)*NANOS_IN_MILLI + newExceedingNanos),
|
||||
record.getInstant(), "record.getInstant()");
|
||||
test(record, true);
|
||||
assertEquals(newExceedingNanos % NANOS_IN_MILLI,
|
||||
record.getInstant().getNano() % NANOS_IN_MILLI,
|
||||
"record.getInstant().getNano() % NANOS_IN_MILLI");
|
||||
assertEquals(millis + newExceedingNanos / NANOS_IN_MILLI,
|
||||
record.getMillis(), "record.getMillis()");
|
||||
assertEquals(Instant.ofEpochSecond(millis/MILLIS_IN_SECOND,
|
||||
(millis%MILLIS_IN_SECOND)*NANOS_IN_MILLI + newExceedingNanos),
|
||||
record.getInstant(), "record.getInstant()");
|
||||
|
||||
// nano adjustement < 0 - non canonical - should still work
|
||||
newExceedingNanos = -1;
|
||||
record.setInstant(Instant.ofEpochSecond(millis/MILLIS_IN_SECOND,
|
||||
(millis % MILLIS_IN_SECOND) * NANOS_IN_MILLI + newExceedingNanos));
|
||||
assertEquals(newExceedingNanos + NANOS_IN_MILLI,
|
||||
record.getInstant().getNano() % NANOS_IN_MILLI,
|
||||
"record.getInstant().getNano() % NANOS_IN_MILLI");
|
||||
assertEquals(millis -1, record.getMillis(), "record.getMillis()");
|
||||
assertEquals(Instant.ofEpochSecond(millis/MILLIS_IN_SECOND,
|
||||
(millis%MILLIS_IN_SECOND)*NANOS_IN_MILLI + newExceedingNanos),
|
||||
record.getInstant(), "record.getInstant()");
|
||||
test(record, true);
|
||||
record.setInstant(Instant.ofEpochSecond(millis/MILLIS_IN_SECOND,
|
||||
(millis % MILLIS_IN_SECOND) * NANOS_IN_MILLI + newExceedingNanos));
|
||||
assertEquals(millis -1, record.getMillis(), "record.getMillis()");
|
||||
assertEquals(Instant.ofEpochSecond(millis/MILLIS_IN_SECOND,
|
||||
(millis%MILLIS_IN_SECOND)*NANOS_IN_MILLI + newExceedingNanos),
|
||||
record.getInstant(), "record.getInstant()");
|
||||
|
||||
// setMillis
|
||||
record.setMillis(millis-1);
|
||||
assertEquals(millis-1, record.getInstant().toEpochMilli(),
|
||||
"record.getInstant().toEpochMilli()");
|
||||
assertEquals(millis-1, record.getMillis(),
|
||||
"record.getMillis()");
|
||||
assertEquals(0, record.getInstant().getNano() % NANOS_IN_MILLI,
|
||||
"record.getInstant().getNano() % NANOS_IN_MILLI");
|
||||
test(record, false);
|
||||
assertEquals(millis-1, record.getInstant().toEpochMilli(),
|
||||
"record.getInstant().toEpochMilli()");
|
||||
assertEquals(millis-1, record.getMillis(),
|
||||
"record.getMillis()");
|
||||
assertEquals(0, record.getInstant().getNano() % NANOS_IN_MILLI,
|
||||
"record.getInstant().getNano() % NANOS_IN_MILLI");
|
||||
|
||||
// setMillis to 0
|
||||
record.setMillis(0);
|
||||
assertEquals(0, record.getInstant().toEpochMilli(),
|
||||
"record.getInstant().toEpochMilli()");
|
||||
assertEquals(0, record.getMillis(),
|
||||
"record.getMillis()");
|
||||
assertEquals(0, record.getInstant().getNano() % NANOS_IN_MILLI,
|
||||
"record.getInstant().getNano() % NANOS_IN_MILLI");
|
||||
test(record, false);
|
||||
assertEquals(0, record.getInstant().toEpochMilli(),
|
||||
"record.getInstant().toEpochMilli()");
|
||||
assertEquals(0, record.getMillis(),
|
||||
"record.getMillis()");
|
||||
assertEquals(0, record.getInstant().getNano() % NANOS_IN_MILLI,
|
||||
"record.getInstant().getNano() % NANOS_IN_MILLI");
|
||||
|
||||
// setMillis to -1
|
||||
record.setMillis(-1);
|
||||
assertEquals(-1, record.getInstant().toEpochMilli(),
|
||||
"record.getInstant().toEpochMilli()");
|
||||
assertEquals(-1, record.getMillis(),
|
||||
"record.getMillis()");
|
||||
assertEquals(0, record.getInstant().getNano() % NANOS_IN_MILLI,
|
||||
"record.getInstant().getNano() % NANOS_IN_MILLI");
|
||||
test(record, false);
|
||||
assertEquals(-1, record.getInstant().toEpochMilli(),
|
||||
"record.getInstant().toEpochMilli()");
|
||||
assertEquals(-1, record.getMillis(),
|
||||
"record.getMillis()");
|
||||
assertEquals(0, record.getInstant().getNano() % NANOS_IN_MILLI,
|
||||
"record.getInstant().getNano() % NANOS_IN_MILLI");
|
||||
|
||||
try {
|
||||
record.setInstant(null);
|
||||
} catch (NullPointerException x) {
|
||||
System.out.println("Got expected NPE when trying to call record.setInstant(null): " + x);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,363 @@
|
||||
/*
|
||||
* 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.ByteArrayInputStream;
|
||||
import java.io.ByteArrayOutputStream;
|
||||
import java.io.IOException;
|
||||
import java.io.ObjectInputStream;
|
||||
import java.io.ObjectOutputStream;
|
||||
import java.time.ZoneId;
|
||||
import java.util.Base64;
|
||||
import java.util.Locale;
|
||||
import java.util.TimeZone;
|
||||
import java.util.logging.Level;
|
||||
import java.util.logging.LogRecord;
|
||||
import java.util.logging.SimpleFormatter;
|
||||
import java.util.regex.Matcher;
|
||||
import java.util.regex.Pattern;
|
||||
import java.util.stream.Stream;
|
||||
|
||||
/**
|
||||
* @test
|
||||
* @bug 8072645
|
||||
* @summary tests the compatibility of LogRecord serial form between
|
||||
* JDK 8 and JDK 9. Ideally this test should be run on both platforms.
|
||||
* (It is designed to run on both).
|
||||
* @run main/othervm SerializeLogRecord
|
||||
* @author danielfuchs
|
||||
*/
|
||||
public class SerializeLogRecord {
|
||||
|
||||
/**
|
||||
* Serializes a log record, encode the serialized bytes in base 64, and
|
||||
* prints pseudo java code that can be cut and pasted into this test.
|
||||
* @param record the log record to serialize, encode in base 64, and for
|
||||
* which test data will be generated.
|
||||
* @return A string containing the generated pseudo java code.
|
||||
* @throws IOException Unexpected.
|
||||
* @throws ClassNotFoundException Unexpected.
|
||||
*/
|
||||
public static String generate(LogRecord record) throws IOException, ClassNotFoundException {
|
||||
|
||||
// Format the given logRecord using the SimpleFormatter
|
||||
SimpleFormatter formatter = new SimpleFormatter();
|
||||
String str = formatter.format(record);
|
||||
|
||||
// Serialize the given LogRecord
|
||||
final ByteArrayOutputStream baos = new ByteArrayOutputStream();
|
||||
final ObjectOutputStream oos = new ObjectOutputStream(baos);
|
||||
oos.writeObject(record);
|
||||
oos.flush();
|
||||
oos.close();
|
||||
|
||||
// Now we're going to perform a number of smoke tests before
|
||||
// generating the Java pseudo code.
|
||||
//
|
||||
// First checks that the log record can be deserialized
|
||||
final ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
|
||||
final ObjectInputStream ois = new ObjectInputStream(bais);
|
||||
final LogRecord record2 = (LogRecord)ois.readObject();
|
||||
|
||||
// Format the deserialized LogRecord using the SimpleFormatter, and
|
||||
// check that the string representation obtained matches the string
|
||||
// representation of the original LogRecord
|
||||
String str2 = formatter.format(record2);
|
||||
if (!str.equals(str2)) throw new RuntimeException("Unexpected values in deserialized object:"
|
||||
+ "\n\tExpected: " + str
|
||||
+ "\n\tRetrieved: "+str);
|
||||
|
||||
// Now get a Base64 string representation of the serialized bytes.
|
||||
final String base64 = Base64.getEncoder().encodeToString(baos.toByteArray());
|
||||
|
||||
// Check that we can deserialize a log record from the Base64 string
|
||||
// representation we just computed.
|
||||
final ByteArrayInputStream bais2 = new ByteArrayInputStream(Base64.getDecoder().decode(base64));
|
||||
final ObjectInputStream ois2 = new ObjectInputStream(bais2);
|
||||
final LogRecord record3 = (LogRecord)ois2.readObject();
|
||||
|
||||
// Format the new deserialized LogRecord using the SimpleFormatter, and
|
||||
// check that the string representation obtained matches the string
|
||||
// representation of the original LogRecord
|
||||
String str3 = formatter.format(record3);
|
||||
if (!str.equals(str3)) throw new RuntimeException("Unexpected values in deserialized object:"
|
||||
+ "\n\tExpected: " + str
|
||||
+ "\n\tRetrieved: "+str);
|
||||
//System.out.println(base64);
|
||||
//System.out.println();
|
||||
|
||||
// Generates the Java Pseudo code that can be cut & pasted into
|
||||
// this test (see Jdk8SerializedLog and Jdk9SerializedLog below)
|
||||
final StringBuilder sb = new StringBuilder();
|
||||
sb.append(" /**").append('\n');
|
||||
sb.append(" * Base64 encoded string for LogRecord object.").append('\n');
|
||||
sb.append(" * Java version: ").append(System.getProperty("java.version")).append('\n');
|
||||
sb.append(" **/").append('\n');
|
||||
sb.append(" final String base64 = ").append("\n ");
|
||||
final int last = base64.length() - 1;
|
||||
for (int i=0; i<base64.length();i++) {
|
||||
if (i%64 == 0) sb.append("\"");
|
||||
sb.append(base64.charAt(i));
|
||||
if (i%64 == 63 || i == last) {
|
||||
sb.append("\"");
|
||||
if (i == last) sb.append(";\n");
|
||||
else sb.append("\n + ");
|
||||
}
|
||||
}
|
||||
sb.append('\n');
|
||||
sb.append(" /**").append('\n');
|
||||
sb.append(" * SimpleFormatter output for LogRecord object.").append('\n');
|
||||
sb.append(" * Java version: ").append(System.getProperty("java.version")).append('\n');
|
||||
sb.append(" **/").append('\n');
|
||||
sb.append(" final String str = ").append("\n ");
|
||||
sb.append("\"").append(str.replace("\n", "\\n")).append("\";\n");
|
||||
return sb.toString();
|
||||
}
|
||||
|
||||
/**
|
||||
* An abstract class to test that a log record previously serialized on a
|
||||
* different java version can be deserialized in the current java version.
|
||||
* (see Jdk8SerializedLog and Jdk9SerializedLog below)
|
||||
*/
|
||||
public static abstract class SerializedLog {
|
||||
public abstract String getBase64();
|
||||
public abstract String getString();
|
||||
|
||||
/**
|
||||
* Deserializes the Base64 encoded string returned by {@link
|
||||
* #getBase64()}, format the obtained LogRecord using a
|
||||
* SimpleFormatter, and checks that the string representation obtained
|
||||
* matches the original string representation returned by {@link
|
||||
* #getString()}.
|
||||
*/
|
||||
protected void dotest() {
|
||||
try {
|
||||
final String base64 = getBase64();
|
||||
final ByteArrayInputStream bais =
|
||||
new ByteArrayInputStream(Base64.getDecoder().decode(base64));
|
||||
final ObjectInputStream ois = new ObjectInputStream(bais);
|
||||
final LogRecord record = (LogRecord)ois.readObject();
|
||||
final SimpleFormatter formatter = new SimpleFormatter();
|
||||
String expected = getString();
|
||||
String str2 = formatter.format(record);
|
||||
check(expected, str2);
|
||||
System.out.println(str2);
|
||||
System.out.println("PASSED: "+this.getClass().getName()+"\n");
|
||||
} catch (IOException | ClassNotFoundException x) {
|
||||
throw new RuntimeException(x);
|
||||
}
|
||||
}
|
||||
/**
|
||||
* Check that the actual String representation obtained matches the
|
||||
* expected String representation.
|
||||
* @param expected Expected String representation, as returned by
|
||||
* {@link #getString()}.
|
||||
* @param actual Actual String representation obtained by formatting
|
||||
* the LogRecord obtained by the deserialization of the
|
||||
* bytes encoded in {@link #getBase64()}.
|
||||
*/
|
||||
protected void check(String expected, String actual) {
|
||||
if (!expected.equals(actual)) {
|
||||
throw new RuntimeException(this.getClass().getName()
|
||||
+ " - Unexpected values in deserialized object:"
|
||||
+ "\n\tExpected: " + expected
|
||||
+ "\n\tRetrieved: "+ actual);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public static class Jdk8SerializedLog extends SerializedLog {
|
||||
|
||||
// Generated by generate() on JDK 8.
|
||||
// --------------------------------
|
||||
// BEGIN
|
||||
|
||||
/**
|
||||
* Base64 encoded string for LogRecord object.
|
||||
* Java version: 1.8.0_11
|
||||
**/
|
||||
final String base64 =
|
||||
"rO0ABXNyABtqYXZhLnV0aWwubG9nZ2luZy5Mb2dSZWNvcmRKjVk982lRlgMACkoA"
|
||||
+ "Bm1pbGxpc0oADnNlcXVlbmNlTnVtYmVySQAIdGhyZWFkSURMAAVsZXZlbHQAGUxq"
|
||||
+ "YXZhL3V0aWwvbG9nZ2luZy9MZXZlbDtMAApsb2dnZXJOYW1ldAASTGphdmEvbGFu"
|
||||
+ "Zy9TdHJpbmc7TAAHbWVzc2FnZXEAfgACTAAScmVzb3VyY2VCdW5kbGVOYW1lcQB+"
|
||||
+ "AAJMAA9zb3VyY2VDbGFzc05hbWVxAH4AAkwAEHNvdXJjZU1ldGhvZE5hbWVxAH4A"
|
||||
+ "AkwABnRocm93bnQAFUxqYXZhL2xhbmcvVGhyb3dhYmxlO3hwAAABSjUCgo0AAAAA"
|
||||
+ "AAAAAAAAAAFzcgAXamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWyOiHETUXM2kgIAA0kA"
|
||||
+ "BXZhbHVlTAAEbmFtZXEAfgACTAAScmVzb3VyY2VCdW5kbGVOYW1lcQB+AAJ4cAAA"
|
||||
+ "AyB0AARJTkZPdAAic3VuLnV0aWwubG9nZ2luZy5yZXNvdXJjZXMubG9nZ2luZ3QA"
|
||||
+ "BHRlc3R0ABFKYXZhIFZlcnNpb246IHswfXBwcHB3BgEAAAAAAXQACDEuOC4wXzEx"
|
||||
+ "eA==";
|
||||
|
||||
/**
|
||||
* SimpleFormatter output for LogRecord object.
|
||||
* Java version: 1.8.0_11
|
||||
**/
|
||||
final String str =
|
||||
"Dec 10, 2014 4:22:44.621000000 PM test - INFO: Java Version: 1.8.0_11";
|
||||
// ^^^
|
||||
// Notice the milli second resolution above...
|
||||
|
||||
// END
|
||||
// --------------------------------
|
||||
|
||||
@Override
|
||||
public String getBase64() {
|
||||
return base64;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getString() {
|
||||
return str;
|
||||
}
|
||||
|
||||
public static void test() {
|
||||
new Jdk8SerializedLog().dotest();
|
||||
}
|
||||
}
|
||||
|
||||
public static class Jdk9SerializedLog extends SerializedLog {
|
||||
|
||||
// Generated by generate() on JDK 9.
|
||||
// --------------------------------
|
||||
// BEGIN
|
||||
|
||||
/**
|
||||
* Base64 encoded string for LogRecord object.
|
||||
* Java version: 1.9.0-internal
|
||||
**/
|
||||
final String base64 =
|
||||
"rO0ABXNyABtqYXZhLnV0aWwubG9nZ2luZy5Mb2dSZWNvcmRKjVk982lRlgMAC0oA"
|
||||
+ "Bm1pbGxpc0kADm5hbm9BZGp1c3RtZW50SgAOc2VxdWVuY2VOdW1iZXJJAAh0aHJl"
|
||||
+ "YWRJREwABWxldmVsdAAZTGphdmEvdXRpbC9sb2dnaW5nL0xldmVsO0wACmxvZ2dl"
|
||||
+ "ck5hbWV0ABJMamF2YS9sYW5nL1N0cmluZztMAAdtZXNzYWdlcQB+AAJMABJyZXNv"
|
||||
+ "dXJjZUJ1bmRsZU5hbWVxAH4AAkwAD3NvdXJjZUNsYXNzTmFtZXEAfgACTAAQc291"
|
||||
+ "cmNlTWV0aG9kTmFtZXEAfgACTAAGdGhyb3dudAAVTGphdmEvbGFuZy9UaHJvd2Fi"
|
||||
+ "bGU7eHAAAAFLl3u6OAAOU/gAAAAAAAAAAAAAAAFzcgAXamF2YS51dGlsLmxvZ2dp"
|
||||
+ "bmcuTGV2ZWyOiHETUXM2kgIAA0kABXZhbHVlTAAEbmFtZXEAfgACTAAScmVzb3Vy"
|
||||
+ "Y2VCdW5kbGVOYW1lcQB+AAJ4cAAAAyB0AARJTkZPdAAic3VuLnV0aWwubG9nZ2lu"
|
||||
+ "Zy5yZXNvdXJjZXMubG9nZ2luZ3QABHRlc3R0ABFKYXZhIFZlcnNpb246IHswfXBw"
|
||||
+ "cHB3BgEAAAAAAXQADjEuOS4wLWludGVybmFseA==";
|
||||
|
||||
/**
|
||||
* SimpleFormatter output for LogRecord object.
|
||||
* Java version: 1.9.0-internal
|
||||
**/
|
||||
final String str =
|
||||
"Feb 17, 2015 12:20:43.192939000 PM test - INFO: Java Version: 1.9.0-internal";
|
||||
// ^^^
|
||||
// Notice the micro second resolution above...
|
||||
|
||||
// END
|
||||
// --------------------------------
|
||||
|
||||
@Override
|
||||
public String getBase64() {
|
||||
return base64;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getString() {
|
||||
return str;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void check(String expected, String actual) {
|
||||
if (System.getProperty("java.version").startsWith("1.8")) {
|
||||
// If we are in JDK 8 and print a log record serialized in JDK 9,
|
||||
// then we won't be able to print anything below the millisecond
|
||||
// precision, since that hasn't been implemented in JDK 8.
|
||||
// Therefore - we need to replace anything below millseconds by
|
||||
// zeroes in the expected string (which was generated on JDK 9).
|
||||
Pattern pattern = Pattern.compile("^"
|
||||
+ "(.*\\.[0-9][0-9][0-9])" // group1: everything up to milliseconds
|
||||
+ "([0-9][0-9][0-9][0-9][0-9][0-9])" // group 2: micros and nanos
|
||||
+ "(.* - .*)$"); // group three: all the rest...
|
||||
Matcher matcher = pattern.matcher(expected);
|
||||
if (matcher.matches()) {
|
||||
expected = matcher.group(1) + "000000" + matcher.group(3);
|
||||
}
|
||||
}
|
||||
super.check(expected, actual);
|
||||
}
|
||||
|
||||
public static void test() {
|
||||
new Jdk9SerializedLog().dotest();
|
||||
}
|
||||
}
|
||||
|
||||
public static void generate() {
|
||||
try {
|
||||
LogRecord record = new LogRecord(Level.INFO, "Java Version: {0}");
|
||||
record.setLoggerName("test");
|
||||
record.setParameters(new Object[] {System.getProperty("java.version")});
|
||||
System.out.println(generate(record));
|
||||
} catch (IOException | ClassNotFoundException x) {
|
||||
throw new RuntimeException(x);
|
||||
}
|
||||
}
|
||||
|
||||
static enum TestCase { GENERATE, TESTJDK8, TESTJDK9 };
|
||||
|
||||
public static void main(String[] args) {
|
||||
// Set the locale and time zone to make sure we won't depend on the
|
||||
// test env - in particular we don't want to depend on the
|
||||
// time zone in which the test machine might be located.
|
||||
// So we're gong to use Locale English and Time Zone UTC for this test.
|
||||
// (Maybe that should be Locale.ROOT?)
|
||||
Locale.setDefault(Locale.ENGLISH);
|
||||
TimeZone.setDefault(TimeZone.getTimeZone(ZoneId.of("UTC")));
|
||||
|
||||
// Set the format property to make sure we always have the nanos, and
|
||||
// to make sure it's the same format than what we used when
|
||||
// computing the formatted string for Jdk8SerializedLog and
|
||||
// Jdk9SerializedLog above.
|
||||
//
|
||||
// If you change the formatting, then you will need to regenerate
|
||||
// the data for Jdk8SerializedLog and Jdk9SerializedLog.
|
||||
//
|
||||
// To do that - just run this test on JDK 8, and cut & paste the
|
||||
// pseudo code printed by generate() into Jdk8SerializedLog.
|
||||
// Then run this test again on JDK 9, and cut & paste the
|
||||
// pseudo code printed by generate() into Jdk9SerializedLog.
|
||||
// [Note: you can pass GENERATE as single arg to main() to avoid
|
||||
// running the actual test]
|
||||
// Finally run the test again to check that it still passes after
|
||||
// your modifications.
|
||||
//
|
||||
System.setProperty("java.util.logging.SimpleFormatter.format",
|
||||
"%1$tb %1$td, %1$tY %1$tl:%1$tM:%1$tS.%1$tN %1$Tp %2$s - %4$s: %5$s%6$s");
|
||||
|
||||
// If no args, then run everything....
|
||||
if (args == null || args.length == 0) {
|
||||
args = new String[] { "GENERATE", "TESTJDK8", "TESTJDK9" };
|
||||
}
|
||||
|
||||
// Run the specified test case(s)
|
||||
Stream.of(args).map(x -> TestCase.valueOf(x)).forEach((x) -> {
|
||||
switch(x) {
|
||||
case GENERATE: generate(); break;
|
||||
case TESTJDK8: Jdk8SerializedLog.test(); break;
|
||||
case TESTJDK9: Jdk9SerializedLog.test(); break;
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
@ -0,0 +1,155 @@
|
||||
/*
|
||||
* 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.time.Instant;
|
||||
import java.time.ZoneId;
|
||||
import java.time.ZonedDateTime;
|
||||
import java.util.Locale;
|
||||
import java.util.logging.Level;
|
||||
import java.util.logging.LogRecord;
|
||||
import java.util.logging.SimpleFormatter;
|
||||
|
||||
/**
|
||||
* @test
|
||||
* @bug 8072645
|
||||
* @summary tests that SimpleFormatter can print out dates with the new
|
||||
* nanosecond precision.
|
||||
* @run main/othervm SimpleFormatterNanos
|
||||
* @author danielfuchs
|
||||
*/
|
||||
public class SimpleFormatterNanos {
|
||||
|
||||
static final int MILLIS_IN_SECOND = 1000;
|
||||
static final int NANOS_IN_MILLI = 1000_000;
|
||||
static final int NANOS_IN_MICRO = 1000;
|
||||
static final int NANOS_IN_SECOND = 1000_000_000;
|
||||
|
||||
static final boolean verbose = true;
|
||||
|
||||
static final class TestAssertException extends RuntimeException {
|
||||
TestAssertException(String msg) { super(msg); }
|
||||
}
|
||||
|
||||
private static void assertEquals(long expected, long received, String msg) {
|
||||
if (expected != received) {
|
||||
throw new TestAssertException("Unexpected result for " + msg
|
||||
+ ".\n\texpected: " + expected
|
||||
+ "\n\tactual: " + received);
|
||||
} else if (verbose) {
|
||||
System.out.println("Got expected " + msg + ": " + received);
|
||||
}
|
||||
}
|
||||
|
||||
static int getNanoAdjustment(LogRecord record) {
|
||||
return record.getInstant().getNano() % NANOS_IN_MILLI;
|
||||
}
|
||||
static void setNanoAdjustment(LogRecord record, int nanos) {
|
||||
record.setInstant(Instant.ofEpochSecond(record.getInstant().getEpochSecond(),
|
||||
(record.getInstant().getNano() / NANOS_IN_MILLI) * NANOS_IN_MILLI + nanos));
|
||||
}
|
||||
|
||||
public static void main(String[] args) throws Exception {
|
||||
|
||||
Locale.setDefault(Locale.ENGLISH);
|
||||
LogRecord record = new LogRecord(Level.INFO, "Java Version: {0}");
|
||||
record.setLoggerName("test");
|
||||
record.setParameters(new Object[] {System.getProperty("java.version")});
|
||||
int nanos = getNanoAdjustment(record);
|
||||
long millis = record.getMillis();
|
||||
// make sure we don't have leading zeros when printing below
|
||||
// the second precision
|
||||
if (millis % MILLIS_IN_SECOND < 100) millis = millis + 100;
|
||||
// make sure we have some nanos
|
||||
if (nanos % NANOS_IN_MICRO == 0) nanos = nanos + 999;
|
||||
record.setMillis(millis);
|
||||
setNanoAdjustment(record, nanos);
|
||||
final Instant instant = record.getInstant();
|
||||
if (nanos < 0) {
|
||||
throw new RuntimeException("Unexpected negative nano adjustment: "
|
||||
+ getNanoAdjustment(record));
|
||||
}
|
||||
if (nanos >= NANOS_IN_MILLI) {
|
||||
throw new RuntimeException("Nano adjustment exceeds 1ms: "
|
||||
+ getNanoAdjustment(record));
|
||||
}
|
||||
if (millis != record.getMillis()) {
|
||||
throw new RuntimeException("Unexpected millis: " + millis + " != "
|
||||
+ record.getMillis());
|
||||
}
|
||||
if (millis != record.getInstant().toEpochMilli()) {
|
||||
throw new RuntimeException("Unexpected millis: "
|
||||
+ record.getInstant().toEpochMilli());
|
||||
}
|
||||
ZonedDateTime zdt = ZonedDateTime.ofInstant(instant, ZoneId.systemDefault());
|
||||
int zdtNanos = zdt.getNano();
|
||||
long expectedNanos = (millis % MILLIS_IN_SECOND) * NANOS_IN_MILLI + nanos;
|
||||
assertEquals(expectedNanos, instant.getNano(), "Instant.getNano()");
|
||||
assertEquals(expectedNanos, zdtNanos, "ZonedDateTime.getNano()");
|
||||
String match = "."+expectedNanos+" ";
|
||||
|
||||
System.out.println("Testing with default format...");
|
||||
|
||||
SimpleFormatter formatter = new SimpleFormatter();
|
||||
String str = formatter.format(record);
|
||||
if (str.contains(match)) {
|
||||
throw new RuntimeException("SimpleFormatter.format()"
|
||||
+ " string contains unexpected nanos: "
|
||||
+ "\n\tdid not expect match for: '" + match + "'"
|
||||
+ "\n\tin: " + str);
|
||||
}
|
||||
|
||||
System.out.println("Nanos omitted as expected: no '"+match+"' in "+str);
|
||||
|
||||
|
||||
System.out.println("Changing format to print nanos...");
|
||||
System.setProperty("java.util.logging.SimpleFormatter.format",
|
||||
"%1$tb %1$td, %1$tY %1$tl:%1$tM:%1$tS.%1$tN %1$Tp %2$s%n%4$s: %5$s%6$s%n");
|
||||
|
||||
SimpleFormatter formatter2 = new SimpleFormatter();
|
||||
str = formatter2.format(record);
|
||||
if (!str.contains(match)) {
|
||||
throw new RuntimeException("SimpleFormatter.format()"
|
||||
+ " string does not contain expected nanos: "
|
||||
+ "\n\texpected match for: '" + match + "'"
|
||||
+ "\n\tin: " + str);
|
||||
}
|
||||
System.out.println("Found expected match for '"+match+"' in "+str);
|
||||
|
||||
|
||||
System.out.println("Changing format to omit nanos...");
|
||||
System.setProperty("java.util.logging.SimpleFormatter.format",
|
||||
"%1$tb %1$td, %1$tY %1$tl:%1$tM:%1$tS %1$Tp %2$s%n%4$s: %5$s%6$s%n");
|
||||
|
||||
SimpleFormatter formatter3 = new SimpleFormatter();
|
||||
str = formatter3.format(record);
|
||||
String notMatch = match;
|
||||
if (str.contains(notMatch)) {
|
||||
throw new RuntimeException("SimpleFormatter.format()"
|
||||
+ " string contains unexpected nanos: "
|
||||
+ "\n\tdid not expect match for: '" + notMatch + "'"
|
||||
+ "\n\tin: " + str);
|
||||
}
|
||||
System.out.println("Nanos omitted as expected: no '"+notMatch+"' in "+str);
|
||||
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,274 @@
|
||||
/*
|
||||
* 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.ByteArrayInputStream;
|
||||
import java.io.ByteArrayOutputStream;
|
||||
import java.io.IOException;
|
||||
import java.time.Instant;
|
||||
import java.time.ZoneId;
|
||||
import java.time.ZonedDateTime;
|
||||
import java.time.format.DateTimeFormatter;
|
||||
import java.time.temporal.ChronoUnit;
|
||||
import java.util.Arrays;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
import java.util.Locale;
|
||||
import java.util.Objects;
|
||||
import java.util.Properties;
|
||||
import java.util.logging.Level;
|
||||
import java.util.logging.LogManager;
|
||||
import java.util.logging.LogRecord;
|
||||
import java.util.logging.XMLFormatter;
|
||||
|
||||
/**
|
||||
* @test
|
||||
* @bug 8072645
|
||||
* @summary tests that XmlFormatter will print out dates with the new
|
||||
* nanosecond precision.
|
||||
* @run main/othervm XmlFormatterNanos
|
||||
* @author danielfuchs
|
||||
*/
|
||||
public class XmlFormatterNanos {
|
||||
|
||||
static final int MILLIS_IN_SECOND = 1000;
|
||||
static final int NANOS_IN_MILLI = 1000_000;
|
||||
static final int NANOS_IN_MICRO = 1000;
|
||||
static final int NANOS_IN_SECOND = 1000_000_000;
|
||||
|
||||
static final boolean verbose = true;
|
||||
|
||||
static final class TestAssertException extends RuntimeException {
|
||||
TestAssertException(String msg) { super(msg); }
|
||||
}
|
||||
|
||||
private static void assertEquals(long expected, long received, String msg) {
|
||||
if (expected != received) {
|
||||
throw new TestAssertException("Unexpected result for " + msg
|
||||
+ ".\n\texpected: " + expected
|
||||
+ "\n\tactual: " + received);
|
||||
} else if (verbose) {
|
||||
System.out.println("Got expected " + msg + ": " + received);
|
||||
}
|
||||
}
|
||||
|
||||
private static void assertEquals(Object expected, Object received, String msg) {
|
||||
if (!Objects.equals(expected, received)) {
|
||||
throw new TestAssertException("Unexpected result for " + msg
|
||||
+ ".\n\texpected: " + expected
|
||||
+ "\n\tactual: " + received);
|
||||
} else if (verbose) {
|
||||
System.out.println("Got expected " + msg + ": " + received);
|
||||
}
|
||||
}
|
||||
|
||||
static class CustomXMLFormatter extends XMLFormatter {}
|
||||
|
||||
static class Configuration {
|
||||
final Properties propertyFile;
|
||||
private Configuration(Properties properties) {
|
||||
propertyFile = properties;
|
||||
}
|
||||
public Configuration apply() {
|
||||
try {
|
||||
ByteArrayOutputStream bytes = new ByteArrayOutputStream();
|
||||
propertyFile.store(bytes, testName());
|
||||
ByteArrayInputStream bais = new ByteArrayInputStream(bytes.toByteArray());
|
||||
LogManager.getLogManager().readConfiguration(bais);
|
||||
} catch (IOException ex) {
|
||||
throw new RuntimeException(ex);
|
||||
}
|
||||
return this;
|
||||
}
|
||||
|
||||
public static String useInstantProperty(Class<?> type) {
|
||||
return type.getName()+".useInstant";
|
||||
}
|
||||
|
||||
public boolean useInstant(XMLFormatter formatter) {
|
||||
return Boolean.parseBoolean(propertyFile.getProperty(
|
||||
formatter.getClass().getName()+".useInstant", "true"));
|
||||
}
|
||||
|
||||
public String testName() {
|
||||
return propertyFile.getProperty("test.name", "????");
|
||||
}
|
||||
|
||||
public static Configuration of(Properties props) {
|
||||
return new Configuration(props);
|
||||
}
|
||||
|
||||
public static Configuration apply(Properties props) {
|
||||
return of(props).apply();
|
||||
}
|
||||
}
|
||||
|
||||
final static List<Properties> properties;
|
||||
static {
|
||||
Properties props1 = new Properties();
|
||||
props1.setProperty("test.name", "with XML nano element (default)");
|
||||
Properties props2 = new Properties();
|
||||
props2.setProperty("test.name", "with XML nano element (standard=true, custom=false)");
|
||||
props2.setProperty(Configuration.useInstantProperty(XMLFormatter.class), "true");
|
||||
props2.setProperty(Configuration.useInstantProperty(CustomXMLFormatter.class), "false");
|
||||
Properties props3 = new Properties();
|
||||
props3.setProperty("test.name", "with XML nano element (standard=false, custom=true)");
|
||||
props3.setProperty(Configuration.useInstantProperty(XMLFormatter.class), "false");
|
||||
props3.setProperty(Configuration.useInstantProperty(CustomXMLFormatter.class), "true");
|
||||
|
||||
properties = Collections.unmodifiableList(Arrays.asList(
|
||||
props1,
|
||||
props2));
|
||||
}
|
||||
|
||||
public static void main(String[] args) throws Exception {
|
||||
Locale.setDefault(Locale.ENGLISH);
|
||||
properties.stream().forEach(XmlFormatterNanos::test);
|
||||
}
|
||||
|
||||
static int getNanoAdjustment(LogRecord record) {
|
||||
return record.getInstant().getNano() % NANOS_IN_MILLI;
|
||||
}
|
||||
static void setNanoAdjustment(LogRecord record, int nanos) {
|
||||
record.setInstant(Instant.ofEpochSecond(record.getInstant().getEpochSecond(),
|
||||
(record.getInstant().getNano() / NANOS_IN_MILLI) * NANOS_IN_MILLI + nanos));
|
||||
}
|
||||
|
||||
public static void test(Properties props) {
|
||||
Configuration conf = Configuration.apply(props);
|
||||
|
||||
LogRecord record = new LogRecord(Level.INFO, "Test Name: {0}");
|
||||
record.setLoggerName("test");
|
||||
record.setParameters(new Object[] {conf.testName()});
|
||||
int nanos = record.getInstant().getNano() % NANOS_IN_MILLI;
|
||||
long millis = record.getMillis();
|
||||
// make sure we don't have leading zeros when printing below
|
||||
// the second precision
|
||||
if (millis % MILLIS_IN_SECOND < 100) millis = millis + 100;
|
||||
// make sure we some nanos - and make sure we don't have
|
||||
// trailing zeros
|
||||
if (nanos % 10 == 0) nanos = nanos + 7;
|
||||
|
||||
record.setMillis(millis);
|
||||
setNanoAdjustment(record, nanos);
|
||||
final Instant instant = record.getInstant();
|
||||
if (nanos < 0) {
|
||||
throw new RuntimeException("Unexpected negative nano adjustment: "
|
||||
+ getNanoAdjustment(record));
|
||||
}
|
||||
if (nanos >= NANOS_IN_MILLI) {
|
||||
throw new RuntimeException("Nano adjustment exceeds 1ms: "
|
||||
+ getNanoAdjustment(record));
|
||||
}
|
||||
if (millis != record.getMillis()) {
|
||||
throw new RuntimeException("Unexpected millis: " + millis + " != "
|
||||
+ record.getMillis());
|
||||
}
|
||||
if (millis != record.getInstant().toEpochMilli()) {
|
||||
throw new RuntimeException("Unexpected millis: "
|
||||
+ record.getInstant().toEpochMilli());
|
||||
}
|
||||
long expectedNanos = (millis % MILLIS_IN_SECOND) * NANOS_IN_MILLI + nanos;
|
||||
assertEquals(expectedNanos, instant.getNano(), "Instant.getNano()");
|
||||
|
||||
XMLFormatter formatter = new XMLFormatter();
|
||||
testMatching(formatter, record, instant, expectedNanos, conf.useInstant(formatter));
|
||||
|
||||
XMLFormatter custom = new CustomXMLFormatter();
|
||||
testMatching(custom, record, instant, expectedNanos, conf.useInstant(custom));
|
||||
}
|
||||
|
||||
private static void testMatching(XMLFormatter formatter,
|
||||
LogRecord record, Instant instant, long expectedNanos,
|
||||
boolean useInstant) {
|
||||
|
||||
ZonedDateTime zdt = ZonedDateTime.ofInstant(instant, ZoneId.systemDefault());
|
||||
int zdtNanos = zdt.getNano();
|
||||
assertEquals(expectedNanos, zdtNanos, "ZonedDateTime.getNano()");
|
||||
|
||||
String str = formatter.format(record);
|
||||
|
||||
String match = "."+expectedNanos;
|
||||
if (str.contains(match) != useInstant) {
|
||||
throw new RuntimeException(formatter.getClass().getSimpleName()
|
||||
+ ".format()"
|
||||
+ " string does not contain expected nanos: "
|
||||
+ "\n\texpected match for: '" + match + "'"
|
||||
+ "\n\tin: \n" + str);
|
||||
}
|
||||
System.out.println("Found expected match for '"+match+"' in \n"+str);
|
||||
|
||||
match = "<millis>"+instant.toEpochMilli()+"</millis>";
|
||||
if (!str.contains(match)) {
|
||||
throw new RuntimeException(formatter.getClass().getSimpleName()
|
||||
+ ".format()"
|
||||
+ " string does not contain expected millis: "
|
||||
+ "\n\texpected match for: '" + match + "'"
|
||||
+ "\n\tin: \n" + str);
|
||||
}
|
||||
System.out.println("Found expected match for '"+match+"' in \n"+str);
|
||||
|
||||
match = "<nanos>";
|
||||
if (str.contains(match) != useInstant) {
|
||||
throw new RuntimeException(formatter.getClass().getSimpleName()
|
||||
+ ".format()"
|
||||
+ " string "
|
||||
+ (useInstant
|
||||
? "does not contain expected nanos: "
|
||||
: "contains unexpected nanos: ")
|
||||
+ "\n\t" + (useInstant ? "expected" : "unexpected")
|
||||
+ " match for: '" + match + "'"
|
||||
+ "\n\tin: \n" + str);
|
||||
}
|
||||
match = "<nanos>"+getNanoAdjustment(record)+"</nanos>";
|
||||
if (str.contains(match) != useInstant) {
|
||||
throw new RuntimeException(formatter.getClass().getSimpleName()
|
||||
+ ".format()"
|
||||
+ " string "
|
||||
+ (useInstant
|
||||
? "does not contain expected nanos: "
|
||||
: "contains unexpected nanos: ")
|
||||
+ "\n\t" + (useInstant ? "expected" : "unexpected")
|
||||
+ " match for: '" + match + "'"
|
||||
+ "\n\tin: \n" + str);
|
||||
}
|
||||
if (useInstant) {
|
||||
System.out.println("Found expected match for '"+match+"' in \n"+str);
|
||||
} else {
|
||||
System.out.println("As expected '"+match+"' is not present in \n"+str);
|
||||
}
|
||||
|
||||
match = useInstant ? DateTimeFormatter.ISO_INSTANT.format(instant)
|
||||
: zdt.truncatedTo(ChronoUnit.SECONDS)
|
||||
.format(DateTimeFormatter.ISO_LOCAL_DATE_TIME);
|
||||
match = "<date>"+match+"</date>";
|
||||
if (!str.contains(match)) {
|
||||
throw new RuntimeException(formatter.getClass().getSimpleName()
|
||||
+ ".format()"
|
||||
+ " string does not contain expected date: "
|
||||
+ "\n\texpected match for: '" + match + "'"
|
||||
+ "\n\tin: \n" + str);
|
||||
}
|
||||
System.out.println("Found expected match for '"+match+"' in \n"+str);
|
||||
|
||||
}
|
||||
|
||||
}
|
@ -23,7 +23,7 @@
|
||||
|
||||
/**
|
||||
* @test
|
||||
* @bug 4759491 6303183 7012868 8015666 8023713
|
||||
* @bug 4759491 6303183 7012868 8015666 8023713 8068790
|
||||
* @summary Test ZOS and ZIS timestamp in extra field correctly
|
||||
*/
|
||||
|
||||
@ -69,6 +69,8 @@ public class TestExtraTime {
|
||||
test(mtime, atime, ctime, tz, extra);
|
||||
}
|
||||
}
|
||||
|
||||
testNullHandling();
|
||||
}
|
||||
|
||||
static void test(FileTime mtime, FileTime atime, FileTime ctime,
|
||||
@ -154,4 +156,26 @@ public class TestExtraTime {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void testNullHandling() {
|
||||
ZipEntry ze = new ZipEntry("TestExtraTime.java");
|
||||
try {
|
||||
ze.setLastAccessTime(null);
|
||||
throw new RuntimeException("setLastAccessTime(null) should throw NPE");
|
||||
} catch (NullPointerException ignored) {
|
||||
// pass
|
||||
}
|
||||
try {
|
||||
ze.setCreationTime(null);
|
||||
throw new RuntimeException("setCreationTime(null) should throw NPE");
|
||||
} catch (NullPointerException ignored) {
|
||||
// pass
|
||||
}
|
||||
try {
|
||||
ze.setLastModifiedTime(null);
|
||||
throw new RuntimeException("setLastModifiedTime(null) should throw NPE");
|
||||
} catch (NullPointerException ignored) {
|
||||
// pass
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -46,12 +46,23 @@ import com.sun.net.ssl.HostnameVerifier;
|
||||
|
||||
public class ComURLNulls {
|
||||
|
||||
private static class ComSunHTTPSHandlerFactory implements URLStreamHandlerFactory {
|
||||
private static String SUPPORTED_PROTOCOL = "https";
|
||||
|
||||
public URLStreamHandler createURLStreamHandler(String protocol) {
|
||||
if (!protocol.equalsIgnoreCase(SUPPORTED_PROTOCOL))
|
||||
return null;
|
||||
|
||||
return new com.sun.net.ssl.internal.www.protocol.https.Handler();
|
||||
}
|
||||
}
|
||||
|
||||
public static void main(String[] args) throws Exception {
|
||||
HostnameVerifier reservedHV =
|
||||
HttpsURLConnection.getDefaultHostnameVerifier();
|
||||
try {
|
||||
System.setProperty("java.protocol.handler.pkgs",
|
||||
"com.sun.net.ssl.internal.www.protocol");
|
||||
URL.setURLStreamHandlerFactory(new ComSunHTTPSHandlerFactory());
|
||||
|
||||
/**
|
||||
* This test does not establish any connection to the specified
|
||||
* URL, hence a dummy URL is used.
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user